12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2511e6bc0Shuangdaode /* 3511e6bc0Shuangdaode * Copyright (c) 2014-2015 Hisilicon Limited. 4511e6bc0Shuangdaode */ 5511e6bc0Shuangdaode 6511e6bc0Shuangdaode #include <linux/module.h> 7511e6bc0Shuangdaode #include <linux/kernel.h> 8511e6bc0Shuangdaode #include <linux/init.h> 9511e6bc0Shuangdaode #include <linux/netdevice.h> 10511e6bc0Shuangdaode #include <linux/etherdevice.h> 11511e6bc0Shuangdaode #include <linux/platform_device.h> 12511e6bc0Shuangdaode #include <linux/of.h> 13511e6bc0Shuangdaode #include <linux/of_address.h> 14511e6bc0Shuangdaode #include <linux/of_platform.h> 15511e6bc0Shuangdaode 16511e6bc0Shuangdaode #include "hns_dsaf_ppe.h" 17511e6bc0Shuangdaode 1864353af6SSalil void hns_ppe_set_tso_enable(struct hns_ppe_cb *ppe_cb, u32 value) 1964353af6SSalil { 2064353af6SSalil dsaf_set_dev_bit(ppe_cb, PPEV2_CFG_TSO_EN_REG, 0, !!value); 2164353af6SSalil } 2264353af6SSalil 236bc0ce7dSSalil void hns_ppe_set_rss_key(struct hns_ppe_cb *ppe_cb, 246bc0ce7dSSalil const u32 rss_key[HNS_PPEV2_RSS_KEY_NUM]) 256bc0ce7dSSalil { 26beecfe9eSKejian Yan u32 key_item; 276bc0ce7dSSalil 286bc0ce7dSSalil for (key_item = 0; key_item < HNS_PPEV2_RSS_KEY_NUM; key_item++) 296bc0ce7dSSalil dsaf_write_dev(ppe_cb, PPEV2_RSS_KEY_REG + key_item * 0x4, 306bc0ce7dSSalil rss_key[key_item]); 316bc0ce7dSSalil } 326bc0ce7dSSalil 336bc0ce7dSSalil void hns_ppe_set_indir_table(struct hns_ppe_cb *ppe_cb, 346bc0ce7dSSalil const u32 rss_tab[HNS_PPEV2_RSS_IND_TBL_SIZE]) 356bc0ce7dSSalil { 366bc0ce7dSSalil int i; 376bc0ce7dSSalil int reg_value; 386bc0ce7dSSalil 396bc0ce7dSSalil for (i = 0; i < (HNS_PPEV2_RSS_IND_TBL_SIZE / 4); i++) { 406bc0ce7dSSalil reg_value = dsaf_read_dev(ppe_cb, 416bc0ce7dSSalil PPEV2_INDRECTION_TBL_REG + i * 0x4); 426bc0ce7dSSalil 436bc0ce7dSSalil dsaf_set_field(reg_value, PPEV2_CFG_RSS_TBL_4N0_M, 446bc0ce7dSSalil PPEV2_CFG_RSS_TBL_4N0_S, 456bc0ce7dSSalil rss_tab[i * 4 + 0] & 0x1F); 466bc0ce7dSSalil dsaf_set_field(reg_value, PPEV2_CFG_RSS_TBL_4N1_M, 476bc0ce7dSSalil PPEV2_CFG_RSS_TBL_4N1_S, 486bc0ce7dSSalil rss_tab[i * 4 + 1] & 0x1F); 496bc0ce7dSSalil dsaf_set_field(reg_value, PPEV2_CFG_RSS_TBL_4N2_M, 506bc0ce7dSSalil PPEV2_CFG_RSS_TBL_4N2_S, 516bc0ce7dSSalil rss_tab[i * 4 + 2] & 0x1F); 526bc0ce7dSSalil dsaf_set_field(reg_value, PPEV2_CFG_RSS_TBL_4N3_M, 536bc0ce7dSSalil PPEV2_CFG_RSS_TBL_4N3_S, 546bc0ce7dSSalil rss_tab[i * 4 + 3] & 0x1F); 556bc0ce7dSSalil dsaf_write_dev( 566bc0ce7dSSalil ppe_cb, PPEV2_INDRECTION_TBL_REG + i * 0x4, reg_value); 576bc0ce7dSSalil } 586bc0ce7dSSalil } 596bc0ce7dSSalil 6015400663SYonglong Liu static u8 __iomem * 61831d828bSYisen.Zhuang\(Zhuangyuzeng\) hns_ppe_common_get_ioaddr(struct ppe_common_cb *ppe_common) 62511e6bc0Shuangdaode { 63831d828bSYisen.Zhuang\(Zhuangyuzeng\) return ppe_common->dsaf_dev->ppe_base + PPE_COMMON_REG_OFFSET; 64511e6bc0Shuangdaode } 65511e6bc0Shuangdaode 66511e6bc0Shuangdaode /** 67511e6bc0Shuangdaode * hns_ppe_common_get_cfg - get ppe common config 68511e6bc0Shuangdaode * @dsaf_dev: dasf device 69d0ea5cbdSJesse Brandeburg * @comm_index: common index 70d0ea5cbdSJesse Brandeburg * return 0 - success , negative --fail 71511e6bc0Shuangdaode */ 72336a443bSYueHaibing static int hns_ppe_common_get_cfg(struct dsaf_device *dsaf_dev, int comm_index) 73511e6bc0Shuangdaode { 74511e6bc0Shuangdaode struct ppe_common_cb *ppe_common; 75511e6bc0Shuangdaode int ppe_num; 76511e6bc0Shuangdaode 7789a44093SYisen.Zhuang\(Zhuangyuzeng\) if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) 78511e6bc0Shuangdaode ppe_num = HNS_PPE_SERVICE_NW_ENGINE_NUM; 79511e6bc0Shuangdaode else 80511e6bc0Shuangdaode ppe_num = HNS_PPE_DEBUG_NW_ENGINE_NUM; 81511e6bc0Shuangdaode 82d89ea4acSGustavo A. R. Silva ppe_common = devm_kzalloc(dsaf_dev->dev, 83d89ea4acSGustavo A. R. Silva struct_size(ppe_common, ppe_cb, ppe_num), 84d89ea4acSGustavo A. R. Silva GFP_KERNEL); 85511e6bc0Shuangdaode if (!ppe_common) 86511e6bc0Shuangdaode return -ENOMEM; 87511e6bc0Shuangdaode 88511e6bc0Shuangdaode ppe_common->ppe_num = ppe_num; 89511e6bc0Shuangdaode ppe_common->dsaf_dev = dsaf_dev; 90511e6bc0Shuangdaode ppe_common->comm_index = comm_index; 9189a44093SYisen.Zhuang\(Zhuangyuzeng\) if (!HNS_DSAF_IS_DEBUG(dsaf_dev)) 92511e6bc0Shuangdaode ppe_common->ppe_mode = PPE_COMMON_MODE_SERVICE; 93511e6bc0Shuangdaode else 94511e6bc0Shuangdaode ppe_common->ppe_mode = PPE_COMMON_MODE_DEBUG; 95511e6bc0Shuangdaode ppe_common->dev = dsaf_dev->dev; 96511e6bc0Shuangdaode 97511e6bc0Shuangdaode ppe_common->io_base = hns_ppe_common_get_ioaddr(ppe_common); 98511e6bc0Shuangdaode 99511e6bc0Shuangdaode dsaf_dev->ppe_common[comm_index] = ppe_common; 100511e6bc0Shuangdaode 101511e6bc0Shuangdaode return 0; 102511e6bc0Shuangdaode } 103511e6bc0Shuangdaode 104336a443bSYueHaibing static void 105336a443bSYueHaibing hns_ppe_common_free_cfg(struct dsaf_device *dsaf_dev, u32 comm_index) 106511e6bc0Shuangdaode { 107511e6bc0Shuangdaode dsaf_dev->ppe_common[comm_index] = NULL; 108511e6bc0Shuangdaode } 109511e6bc0Shuangdaode 11015400663SYonglong Liu static u8 __iomem *hns_ppe_get_iobase(struct ppe_common_cb *ppe_common, 111511e6bc0Shuangdaode int ppe_idx) 112511e6bc0Shuangdaode { 113831d828bSYisen.Zhuang\(Zhuangyuzeng\) return ppe_common->dsaf_dev->ppe_base + ppe_idx * PPE_REG_OFFSET; 114511e6bc0Shuangdaode } 115511e6bc0Shuangdaode 116511e6bc0Shuangdaode static void hns_ppe_get_cfg(struct ppe_common_cb *ppe_common) 117511e6bc0Shuangdaode { 118511e6bc0Shuangdaode u32 i; 119511e6bc0Shuangdaode struct hns_ppe_cb *ppe_cb; 120511e6bc0Shuangdaode u32 ppe_num = ppe_common->ppe_num; 121511e6bc0Shuangdaode 122511e6bc0Shuangdaode for (i = 0; i < ppe_num; i++) { 123511e6bc0Shuangdaode ppe_cb = &ppe_common->ppe_cb[i]; 124511e6bc0Shuangdaode ppe_cb->dev = ppe_common->dev; 125511e6bc0Shuangdaode ppe_cb->next = NULL; 126511e6bc0Shuangdaode ppe_cb->ppe_common_cb = ppe_common; 127511e6bc0Shuangdaode ppe_cb->index = i; 128511e6bc0Shuangdaode ppe_cb->io_base = hns_ppe_get_iobase(ppe_common, i); 129511e6bc0Shuangdaode ppe_cb->virq = 0; 130511e6bc0Shuangdaode } 131511e6bc0Shuangdaode } 132511e6bc0Shuangdaode 133511e6bc0Shuangdaode static void hns_ppe_cnt_clr_ce(struct hns_ppe_cb *ppe_cb) 134511e6bc0Shuangdaode { 135511e6bc0Shuangdaode dsaf_set_dev_bit(ppe_cb, PPE_TNL_0_5_CNT_CLR_CE_REG, 136511e6bc0Shuangdaode PPE_CNT_CLR_CE_B, 1); 137511e6bc0Shuangdaode } 138511e6bc0Shuangdaode 1398044f97eSSalil static void hns_ppe_set_vlan_strip(struct hns_ppe_cb *ppe_cb, int en) 1408044f97eSSalil { 1418044f97eSSalil dsaf_write_dev(ppe_cb, PPEV2_VLAN_STRIP_EN_REG, en); 1428044f97eSSalil } 1438044f97eSSalil 144511e6bc0Shuangdaode /** 145511e6bc0Shuangdaode * hns_ppe_checksum_hw - set ppe checksum caculate 146d0ea5cbdSJesse Brandeburg * @ppe_cb: ppe device 147511e6bc0Shuangdaode * @value: value 148511e6bc0Shuangdaode */ 149511e6bc0Shuangdaode static void hns_ppe_checksum_hw(struct hns_ppe_cb *ppe_cb, u32 value) 150511e6bc0Shuangdaode { 151511e6bc0Shuangdaode dsaf_set_dev_field(ppe_cb, PPE_CFG_PRO_CHECK_EN_REG, 152511e6bc0Shuangdaode 0xfffffff, 0, value); 153511e6bc0Shuangdaode } 154511e6bc0Shuangdaode 155511e6bc0Shuangdaode static void hns_ppe_set_qid_mode(struct ppe_common_cb *ppe_common, 156511e6bc0Shuangdaode enum ppe_qid_mode qid_mdoe) 157511e6bc0Shuangdaode { 158511e6bc0Shuangdaode dsaf_set_dev_field(ppe_common, PPE_COM_CFG_QID_MODE_REG, 159511e6bc0Shuangdaode PPE_CFG_QID_MODE_CF_QID_MODE_M, 160511e6bc0Shuangdaode PPE_CFG_QID_MODE_CF_QID_MODE_S, qid_mdoe); 161511e6bc0Shuangdaode } 162511e6bc0Shuangdaode 163511e6bc0Shuangdaode /** 164511e6bc0Shuangdaode * hns_ppe_set_qid - set ppe qid 165511e6bc0Shuangdaode * @ppe_common: ppe common device 166511e6bc0Shuangdaode * @qid: queue id 167511e6bc0Shuangdaode */ 168511e6bc0Shuangdaode static void hns_ppe_set_qid(struct ppe_common_cb *ppe_common, u32 qid) 169511e6bc0Shuangdaode { 170511e6bc0Shuangdaode u32 qid_mod = dsaf_read_dev(ppe_common, PPE_COM_CFG_QID_MODE_REG); 171511e6bc0Shuangdaode 172511e6bc0Shuangdaode if (!dsaf_get_field(qid_mod, PPE_CFG_QID_MODE_DEF_QID_M, 173511e6bc0Shuangdaode PPE_CFG_QID_MODE_DEF_QID_S)) { 174511e6bc0Shuangdaode dsaf_set_field(qid_mod, PPE_CFG_QID_MODE_DEF_QID_M, 175511e6bc0Shuangdaode PPE_CFG_QID_MODE_DEF_QID_S, qid); 176511e6bc0Shuangdaode dsaf_write_dev(ppe_common, PPE_COM_CFG_QID_MODE_REG, qid_mod); 177511e6bc0Shuangdaode } 178511e6bc0Shuangdaode } 179511e6bc0Shuangdaode 180511e6bc0Shuangdaode /** 181511e6bc0Shuangdaode * hns_ppe_set_port_mode - set port mode 182d0ea5cbdSJesse Brandeburg * @ppe_cb: ppe device 183511e6bc0Shuangdaode * @mode: port mode 184511e6bc0Shuangdaode */ 185511e6bc0Shuangdaode static void hns_ppe_set_port_mode(struct hns_ppe_cb *ppe_cb, 186511e6bc0Shuangdaode enum ppe_port_mode mode) 187511e6bc0Shuangdaode { 188511e6bc0Shuangdaode dsaf_write_dev(ppe_cb, PPE_CFG_XGE_MODE_REG, mode); 189511e6bc0Shuangdaode } 190511e6bc0Shuangdaode 191511e6bc0Shuangdaode /** 192511e6bc0Shuangdaode * hns_ppe_common_init_hw - init ppe common device 193511e6bc0Shuangdaode * @ppe_common: ppe common device 194511e6bc0Shuangdaode * 195511e6bc0Shuangdaode * Return 0 on success, negative on failure 196511e6bc0Shuangdaode */ 197511e6bc0Shuangdaode static int hns_ppe_common_init_hw(struct ppe_common_cb *ppe_common) 198511e6bc0Shuangdaode { 199511e6bc0Shuangdaode enum ppe_qid_mode qid_mode; 200a24274aaSKejian Yan struct dsaf_device *dsaf_dev = ppe_common->dsaf_dev; 201a24274aaSKejian Yan enum dsaf_mode dsaf_mode = dsaf_dev->dsaf_mode; 202511e6bc0Shuangdaode 203a24274aaSKejian Yan dsaf_dev->misc_op->ppe_comm_srst(dsaf_dev, 0); 20489036f23SJia-Ju Bai msleep(100); 205a24274aaSKejian Yan dsaf_dev->misc_op->ppe_comm_srst(dsaf_dev, 1); 20689036f23SJia-Ju Bai msleep(100); 207511e6bc0Shuangdaode 208511e6bc0Shuangdaode if (ppe_common->ppe_mode == PPE_COMMON_MODE_SERVICE) { 209511e6bc0Shuangdaode switch (dsaf_mode) { 210511e6bc0Shuangdaode case DSAF_MODE_ENABLE_FIX: 211511e6bc0Shuangdaode case DSAF_MODE_DISABLE_FIX: 212511e6bc0Shuangdaode qid_mode = PPE_QID_MODE0; 213511e6bc0Shuangdaode hns_ppe_set_qid(ppe_common, 0); 214511e6bc0Shuangdaode break; 215511e6bc0Shuangdaode case DSAF_MODE_ENABLE_0VM: 216511e6bc0Shuangdaode case DSAF_MODE_DISABLE_2PORT_64VM: 217511e6bc0Shuangdaode qid_mode = PPE_QID_MODE3; 218511e6bc0Shuangdaode break; 219511e6bc0Shuangdaode case DSAF_MODE_ENABLE_8VM: 220511e6bc0Shuangdaode case DSAF_MODE_DISABLE_2PORT_16VM: 221511e6bc0Shuangdaode qid_mode = PPE_QID_MODE4; 222511e6bc0Shuangdaode break; 223511e6bc0Shuangdaode case DSAF_MODE_ENABLE_16VM: 224511e6bc0Shuangdaode case DSAF_MODE_DISABLE_6PORT_0VM: 225511e6bc0Shuangdaode qid_mode = PPE_QID_MODE5; 226511e6bc0Shuangdaode break; 227511e6bc0Shuangdaode case DSAF_MODE_ENABLE_32VM: 228511e6bc0Shuangdaode case DSAF_MODE_DISABLE_6PORT_16VM: 229511e6bc0Shuangdaode qid_mode = PPE_QID_MODE2; 230511e6bc0Shuangdaode break; 231511e6bc0Shuangdaode case DSAF_MODE_ENABLE_128VM: 232511e6bc0Shuangdaode case DSAF_MODE_DISABLE_6PORT_4VM: 233511e6bc0Shuangdaode qid_mode = PPE_QID_MODE1; 234511e6bc0Shuangdaode break; 235511e6bc0Shuangdaode case DSAF_MODE_DISABLE_2PORT_8VM: 236511e6bc0Shuangdaode qid_mode = PPE_QID_MODE7; 237511e6bc0Shuangdaode break; 238511e6bc0Shuangdaode case DSAF_MODE_DISABLE_6PORT_2VM: 239511e6bc0Shuangdaode qid_mode = PPE_QID_MODE6; 240511e6bc0Shuangdaode break; 241511e6bc0Shuangdaode default: 242511e6bc0Shuangdaode dev_err(ppe_common->dev, 243511e6bc0Shuangdaode "get ppe queue mode failed! dsaf_mode=%d\n", 244511e6bc0Shuangdaode dsaf_mode); 245511e6bc0Shuangdaode return -EINVAL; 246511e6bc0Shuangdaode } 247511e6bc0Shuangdaode hns_ppe_set_qid_mode(ppe_common, qid_mode); 248511e6bc0Shuangdaode } 249511e6bc0Shuangdaode 250511e6bc0Shuangdaode dsaf_set_dev_bit(ppe_common, PPE_COM_COMMON_CNT_CLR_CE_REG, 251511e6bc0Shuangdaode PPE_COMMON_CNT_CLR_CE_B, 1); 252511e6bc0Shuangdaode 253511e6bc0Shuangdaode return 0; 254511e6bc0Shuangdaode } 255511e6bc0Shuangdaode 256511e6bc0Shuangdaode /*clr ppe exception irq*/ 257511e6bc0Shuangdaode static void hns_ppe_exc_irq_en(struct hns_ppe_cb *ppe_cb, int en) 258511e6bc0Shuangdaode { 259511e6bc0Shuangdaode u32 clr_vlue = 0xfffffffful; 260511e6bc0Shuangdaode u32 msk_vlue = en ? 0xfffffffful : 0; /*1 is en, 0 is dis*/ 261511e6bc0Shuangdaode u32 vld_msk = 0; 262511e6bc0Shuangdaode 263511e6bc0Shuangdaode /*only care bit 0,1,7*/ 264511e6bc0Shuangdaode dsaf_set_bit(vld_msk, 0, 1); 265511e6bc0Shuangdaode dsaf_set_bit(vld_msk, 1, 1); 266511e6bc0Shuangdaode dsaf_set_bit(vld_msk, 7, 1); 267511e6bc0Shuangdaode 268511e6bc0Shuangdaode /*clr sts**/ 269511e6bc0Shuangdaode dsaf_write_dev(ppe_cb, PPE_RINT_REG, clr_vlue); 270511e6bc0Shuangdaode 271511e6bc0Shuangdaode /*for some reserved bits, so set 0**/ 272511e6bc0Shuangdaode dsaf_write_dev(ppe_cb, PPE_INTEN_REG, msk_vlue & vld_msk); 273511e6bc0Shuangdaode } 274511e6bc0Shuangdaode 27531fabbeeSPeng Li int hns_ppe_wait_tx_fifo_clean(struct hns_ppe_cb *ppe_cb) 27631fabbeeSPeng Li { 27731fabbeeSPeng Li int wait_cnt; 27831fabbeeSPeng Li u32 val; 27931fabbeeSPeng Li 28031fabbeeSPeng Li wait_cnt = 0; 28131fabbeeSPeng Li while (wait_cnt++ < HNS_MAX_WAIT_CNT) { 28231fabbeeSPeng Li val = dsaf_read_dev(ppe_cb, PPE_CURR_TX_FIFO0_REG) & 0x3ffU; 28331fabbeeSPeng Li if (!val) 28431fabbeeSPeng Li break; 28531fabbeeSPeng Li 28631fabbeeSPeng Li usleep_range(100, 200); 28731fabbeeSPeng Li } 28831fabbeeSPeng Li 28931fabbeeSPeng Li if (wait_cnt >= HNS_MAX_WAIT_CNT) { 29031fabbeeSPeng Li dev_err(ppe_cb->dev, "hns ppe tx fifo clean wait timeout, still has %u pkt.\n", 29131fabbeeSPeng Li val); 29231fabbeeSPeng Li return -EBUSY; 29331fabbeeSPeng Li } 29431fabbeeSPeng Li 29531fabbeeSPeng Li return 0; 29631fabbeeSPeng Li } 29731fabbeeSPeng Li 298511e6bc0Shuangdaode /** 299511e6bc0Shuangdaode * ppe_init_hw - init ppe 3006bc0ce7dSSalil * @ppe_cb: ppe device 301511e6bc0Shuangdaode */ 302511e6bc0Shuangdaode static void hns_ppe_init_hw(struct hns_ppe_cb *ppe_cb) 303511e6bc0Shuangdaode { 304511e6bc0Shuangdaode struct ppe_common_cb *ppe_common_cb = ppe_cb->ppe_common_cb; 305831d828bSYisen.Zhuang\(Zhuangyuzeng\) u32 port = ppe_cb->index; 306511e6bc0Shuangdaode struct dsaf_device *dsaf_dev = ppe_common_cb->dsaf_dev; 3076bc0ce7dSSalil int i; 3086bc0ce7dSSalil 3096bc0ce7dSSalil /* get default RSS key */ 3106bc0ce7dSSalil netdev_rss_key_fill(ppe_cb->rss_key, HNS_PPEV2_RSS_KEY_SIZE); 311511e6bc0Shuangdaode 312a24274aaSKejian Yan dsaf_dev->misc_op->ppe_srst(dsaf_dev, port, 0); 313511e6bc0Shuangdaode mdelay(10); 314a24274aaSKejian Yan dsaf_dev->misc_op->ppe_srst(dsaf_dev, port, 1); 315511e6bc0Shuangdaode 316511e6bc0Shuangdaode /* clr and msk except irq*/ 317511e6bc0Shuangdaode hns_ppe_exc_irq_en(ppe_cb, 0); 318511e6bc0Shuangdaode 3195ada37b5SLisheng if (ppe_common_cb->ppe_mode == PPE_COMMON_MODE_DEBUG) { 320511e6bc0Shuangdaode hns_ppe_set_port_mode(ppe_cb, PPE_MODE_GE); 3215ada37b5SLisheng dsaf_write_dev(ppe_cb, PPE_CFG_PAUSE_IDLE_CNT_REG, 0); 3225ada37b5SLisheng } else { 323511e6bc0Shuangdaode hns_ppe_set_port_mode(ppe_cb, PPE_MODE_XGE); 3245ada37b5SLisheng } 3256bc0ce7dSSalil 326511e6bc0Shuangdaode hns_ppe_checksum_hw(ppe_cb, 0xffffffff); 327511e6bc0Shuangdaode hns_ppe_cnt_clr_ce(ppe_cb); 3286bc0ce7dSSalil 3296bc0ce7dSSalil if (!AE_IS_VER1(dsaf_dev->dsaf_ver)) { 3308044f97eSSalil hns_ppe_set_vlan_strip(ppe_cb, 0); 3318044f97eSSalil 332da3488bbSKejian Yan dsaf_write_dev(ppe_cb, PPE_CFG_MAX_FRAME_LEN_REG, 333da3488bbSKejian Yan HNS_PPEV2_MAX_FRAME_LEN); 334da3488bbSKejian Yan 3356bc0ce7dSSalil /* set default RSS key in h/w */ 3366bc0ce7dSSalil hns_ppe_set_rss_key(ppe_cb, ppe_cb->rss_key); 3376bc0ce7dSSalil 3386bc0ce7dSSalil /* Set default indrection table in h/w */ 3396bc0ce7dSSalil for (i = 0; i < HNS_PPEV2_RSS_IND_TBL_SIZE; i++) 3406bc0ce7dSSalil ppe_cb->rss_indir_table[i] = i; 3416bc0ce7dSSalil hns_ppe_set_indir_table(ppe_cb, ppe_cb->rss_indir_table); 3426bc0ce7dSSalil } 343511e6bc0Shuangdaode } 344511e6bc0Shuangdaode 345511e6bc0Shuangdaode /** 346511e6bc0Shuangdaode * ppe_uninit_hw - uninit ppe 347d0ea5cbdSJesse Brandeburg * @ppe_cb: ppe device 348511e6bc0Shuangdaode */ 349511e6bc0Shuangdaode static void hns_ppe_uninit_hw(struct hns_ppe_cb *ppe_cb) 350511e6bc0Shuangdaode { 351511e6bc0Shuangdaode u32 port; 352511e6bc0Shuangdaode 353511e6bc0Shuangdaode if (ppe_cb->ppe_common_cb) { 354c234af58SColin Ian King struct dsaf_device *dsaf_dev = ppe_cb->ppe_common_cb->dsaf_dev; 355c234af58SColin Ian King 356511e6bc0Shuangdaode port = ppe_cb->index; 357a24274aaSKejian Yan dsaf_dev->misc_op->ppe_srst(dsaf_dev, port, 0); 358511e6bc0Shuangdaode } 359511e6bc0Shuangdaode } 360511e6bc0Shuangdaode 361336a443bSYueHaibing static void hns_ppe_uninit_ex(struct ppe_common_cb *ppe_common) 362511e6bc0Shuangdaode { 363511e6bc0Shuangdaode u32 i; 364511e6bc0Shuangdaode 365511e6bc0Shuangdaode for (i = 0; i < ppe_common->ppe_num; i++) { 366831d828bSYisen.Zhuang\(Zhuangyuzeng\) if (ppe_common->dsaf_dev->mac_cb[i]) 367511e6bc0Shuangdaode hns_ppe_uninit_hw(&ppe_common->ppe_cb[i]); 368511e6bc0Shuangdaode memset(&ppe_common->ppe_cb[i], 0, sizeof(struct hns_ppe_cb)); 369511e6bc0Shuangdaode } 370511e6bc0Shuangdaode } 371511e6bc0Shuangdaode 372511e6bc0Shuangdaode void hns_ppe_uninit(struct dsaf_device *dsaf_dev) 373511e6bc0Shuangdaode { 374511e6bc0Shuangdaode u32 i; 375511e6bc0Shuangdaode 376511e6bc0Shuangdaode for (i = 0; i < HNS_PPE_COM_NUM; i++) { 377511e6bc0Shuangdaode if (dsaf_dev->ppe_common[i]) 378511e6bc0Shuangdaode hns_ppe_uninit_ex(dsaf_dev->ppe_common[i]); 379511e6bc0Shuangdaode hns_rcb_common_free_cfg(dsaf_dev, i); 380511e6bc0Shuangdaode hns_ppe_common_free_cfg(dsaf_dev, i); 381511e6bc0Shuangdaode } 382511e6bc0Shuangdaode } 383511e6bc0Shuangdaode 384511e6bc0Shuangdaode /** 385511e6bc0Shuangdaode * hns_ppe_reset - reinit ppe/rcb hw 386511e6bc0Shuangdaode * @dsaf_dev: dasf device 387d0ea5cbdSJesse Brandeburg * @ppe_common_index: the index 388d0ea5cbdSJesse Brandeburg * return void 389511e6bc0Shuangdaode */ 390511e6bc0Shuangdaode void hns_ppe_reset_common(struct dsaf_device *dsaf_dev, u8 ppe_common_index) 391511e6bc0Shuangdaode { 392511e6bc0Shuangdaode u32 i; 393511e6bc0Shuangdaode int ret; 394511e6bc0Shuangdaode struct ppe_common_cb *ppe_common; 395511e6bc0Shuangdaode 396511e6bc0Shuangdaode ppe_common = dsaf_dev->ppe_common[ppe_common_index]; 397511e6bc0Shuangdaode ret = hns_ppe_common_init_hw(ppe_common); 398511e6bc0Shuangdaode if (ret) 399511e6bc0Shuangdaode return; 400511e6bc0Shuangdaode 401831d828bSYisen.Zhuang\(Zhuangyuzeng\) for (i = 0; i < ppe_common->ppe_num; i++) { 402831d828bSYisen.Zhuang\(Zhuangyuzeng\) /* We only need to initiate ppe when the port exists */ 403831d828bSYisen.Zhuang\(Zhuangyuzeng\) if (dsaf_dev->mac_cb[i]) 40413ac695eSSalil hns_ppe_init_hw(&ppe_common->ppe_cb[i]); 405831d828bSYisen.Zhuang\(Zhuangyuzeng\) } 40613ac695eSSalil 407511e6bc0Shuangdaode ret = hns_rcb_common_init_hw(dsaf_dev->rcb_common[ppe_common_index]); 408511e6bc0Shuangdaode if (ret) 409511e6bc0Shuangdaode return; 410511e6bc0Shuangdaode 411511e6bc0Shuangdaode hns_rcb_common_init_commit_hw(dsaf_dev->rcb_common[ppe_common_index]); 412511e6bc0Shuangdaode } 413511e6bc0Shuangdaode 414511e6bc0Shuangdaode void hns_ppe_update_stats(struct hns_ppe_cb *ppe_cb) 415511e6bc0Shuangdaode { 416511e6bc0Shuangdaode struct hns_ppe_hw_stats *hw_stats = &ppe_cb->hw_stats; 417511e6bc0Shuangdaode 418511e6bc0Shuangdaode hw_stats->rx_pkts_from_sw 419511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_SW_PKT_CNT_REG); 420511e6bc0Shuangdaode hw_stats->rx_pkts 421511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_WR_BD_OK_PKT_CNT_REG); 422511e6bc0Shuangdaode hw_stats->rx_drop_no_bd 423511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_NO_BUF_CNT_REG); 424511e6bc0Shuangdaode hw_stats->rx_alloc_buf_fail 425511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_APP_BUF_FAIL_CNT_REG); 426511e6bc0Shuangdaode hw_stats->rx_alloc_buf_wait 427511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_APP_BUF_WAIT_CNT_REG); 428511e6bc0Shuangdaode hw_stats->rx_drop_no_buf 429511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_DROP_FUL_CNT_REG); 430511e6bc0Shuangdaode hw_stats->rx_err_fifo_full 431511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_DROP_PRT_CNT_REG); 432511e6bc0Shuangdaode 433511e6bc0Shuangdaode hw_stats->tx_bd_form_rcb 434511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_TX_BD_CNT_REG); 435511e6bc0Shuangdaode hw_stats->tx_pkts_from_rcb 436511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_CNT_REG); 437511e6bc0Shuangdaode hw_stats->tx_pkts 438511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_OK_CNT_REG); 439511e6bc0Shuangdaode hw_stats->tx_err_fifo_empty 440511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_EPT_CNT_REG); 441511e6bc0Shuangdaode hw_stats->tx_err_checksum 442511e6bc0Shuangdaode += dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_CS_FAIL_CNT_REG); 443511e6bc0Shuangdaode } 444511e6bc0Shuangdaode 445511e6bc0Shuangdaode int hns_ppe_get_sset_count(int stringset) 446511e6bc0Shuangdaode { 447d61d263cSMatthias Brugger if (stringset == ETH_SS_STATS) 448511e6bc0Shuangdaode return ETH_PPE_STATIC_NUM; 449511e6bc0Shuangdaode return 0; 450511e6bc0Shuangdaode } 451511e6bc0Shuangdaode 452511e6bc0Shuangdaode int hns_ppe_get_regs_count(void) 453511e6bc0Shuangdaode { 454511e6bc0Shuangdaode return ETH_PPE_DUMP_NUM; 455511e6bc0Shuangdaode } 456511e6bc0Shuangdaode 457511e6bc0Shuangdaode /** 458511e6bc0Shuangdaode * ppe_get_strings - get ppe srting 459d0ea5cbdSJesse Brandeburg * @ppe_cb: ppe device 460511e6bc0Shuangdaode * @stringset: string set type 461511e6bc0Shuangdaode * @data: output string 462511e6bc0Shuangdaode */ 463511e6bc0Shuangdaode void hns_ppe_get_strings(struct hns_ppe_cb *ppe_cb, int stringset, u8 *data) 464511e6bc0Shuangdaode { 465511e6bc0Shuangdaode char *buff = (char *)data; 466511e6bc0Shuangdaode int index = ppe_cb->index; 467511e6bc0Shuangdaode 468511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_sw_pkt", index); 469511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 470511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_pkt_ok", index); 471511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 472511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_drop_pkt_no_bd", index); 473511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 474511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_alloc_buf_fail", index); 475511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 476511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_alloc_buf_wait", index); 477511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 478511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_pkt_drop_no_buf", index); 479511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 480511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_rx_pkt_err_fifo_full", index); 481511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 482511e6bc0Shuangdaode 483511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_tx_bd", index); 484511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 485511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_tx_pkt", index); 486511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 487511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_tx_pkt_ok", index); 488511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 489511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_tx_pkt_err_fifo_empty", index); 490511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 491511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, "ppe%d_tx_pkt_err_csum_fail", index); 492511e6bc0Shuangdaode } 493511e6bc0Shuangdaode 494511e6bc0Shuangdaode void hns_ppe_get_stats(struct hns_ppe_cb *ppe_cb, u64 *data) 495511e6bc0Shuangdaode { 496511e6bc0Shuangdaode u64 *regs_buff = data; 497511e6bc0Shuangdaode struct hns_ppe_hw_stats *hw_stats = &ppe_cb->hw_stats; 498511e6bc0Shuangdaode 499511e6bc0Shuangdaode regs_buff[0] = hw_stats->rx_pkts_from_sw; 500511e6bc0Shuangdaode regs_buff[1] = hw_stats->rx_pkts; 501511e6bc0Shuangdaode regs_buff[2] = hw_stats->rx_drop_no_bd; 502511e6bc0Shuangdaode regs_buff[3] = hw_stats->rx_alloc_buf_fail; 503511e6bc0Shuangdaode regs_buff[4] = hw_stats->rx_alloc_buf_wait; 504511e6bc0Shuangdaode regs_buff[5] = hw_stats->rx_drop_no_buf; 505511e6bc0Shuangdaode regs_buff[6] = hw_stats->rx_err_fifo_full; 506511e6bc0Shuangdaode 507511e6bc0Shuangdaode regs_buff[7] = hw_stats->tx_bd_form_rcb; 508511e6bc0Shuangdaode regs_buff[8] = hw_stats->tx_pkts_from_rcb; 509511e6bc0Shuangdaode regs_buff[9] = hw_stats->tx_pkts; 510511e6bc0Shuangdaode regs_buff[10] = hw_stats->tx_err_fifo_empty; 511511e6bc0Shuangdaode regs_buff[11] = hw_stats->tx_err_checksum; 512511e6bc0Shuangdaode } 513511e6bc0Shuangdaode 514511e6bc0Shuangdaode /** 515511e6bc0Shuangdaode * hns_ppe_init - init ppe device 516511e6bc0Shuangdaode * @dsaf_dev: dasf device 517d0ea5cbdSJesse Brandeburg * return 0 - success , negative --fail 518511e6bc0Shuangdaode */ 519511e6bc0Shuangdaode int hns_ppe_init(struct dsaf_device *dsaf_dev) 520511e6bc0Shuangdaode { 521511e6bc0Shuangdaode int ret; 522a2185587SKejian Yan int i; 523511e6bc0Shuangdaode 524511e6bc0Shuangdaode for (i = 0; i < HNS_PPE_COM_NUM; i++) { 525511e6bc0Shuangdaode ret = hns_ppe_common_get_cfg(dsaf_dev, i); 526511e6bc0Shuangdaode if (ret) 527a2185587SKejian Yan goto get_cfg_fail; 528511e6bc0Shuangdaode 529511e6bc0Shuangdaode ret = hns_rcb_common_get_cfg(dsaf_dev, i); 530511e6bc0Shuangdaode if (ret) 531a2185587SKejian Yan goto get_cfg_fail; 532511e6bc0Shuangdaode 533511e6bc0Shuangdaode hns_ppe_get_cfg(dsaf_dev->ppe_common[i]); 534511e6bc0Shuangdaode 5352fdd6bafSlipeng ret = hns_rcb_get_cfg(dsaf_dev->rcb_common[i]); 5362fdd6bafSlipeng if (ret) 5372fdd6bafSlipeng goto get_cfg_fail; 538511e6bc0Shuangdaode } 539511e6bc0Shuangdaode 540511e6bc0Shuangdaode for (i = 0; i < HNS_PPE_COM_NUM; i++) 541511e6bc0Shuangdaode hns_ppe_reset_common(dsaf_dev, i); 542511e6bc0Shuangdaode 543511e6bc0Shuangdaode return 0; 544511e6bc0Shuangdaode 545a2185587SKejian Yan get_cfg_fail: 546a2185587SKejian Yan for (i = 0; i < HNS_PPE_COM_NUM; i++) { 547a2185587SKejian Yan hns_rcb_common_free_cfg(dsaf_dev, i); 548511e6bc0Shuangdaode hns_ppe_common_free_cfg(dsaf_dev, i); 549511e6bc0Shuangdaode } 550a2185587SKejian Yan 551511e6bc0Shuangdaode return ret; 552511e6bc0Shuangdaode } 553511e6bc0Shuangdaode 554511e6bc0Shuangdaode void hns_ppe_get_regs(struct hns_ppe_cb *ppe_cb, void *data) 555511e6bc0Shuangdaode { 556511e6bc0Shuangdaode struct ppe_common_cb *ppe_common = ppe_cb->ppe_common_cb; 557511e6bc0Shuangdaode u32 *regs = data; 558511e6bc0Shuangdaode u32 i; 559511e6bc0Shuangdaode u32 offset; 560511e6bc0Shuangdaode 561511e6bc0Shuangdaode /* ppe common registers */ 562511e6bc0Shuangdaode regs[0] = dsaf_read_dev(ppe_common, PPE_COM_CFG_QID_MODE_REG); 563511e6bc0Shuangdaode regs[1] = dsaf_read_dev(ppe_common, PPE_COM_INTEN_REG); 564511e6bc0Shuangdaode regs[2] = dsaf_read_dev(ppe_common, PPE_COM_RINT_REG); 565511e6bc0Shuangdaode regs[3] = dsaf_read_dev(ppe_common, PPE_COM_INTSTS_REG); 566511e6bc0Shuangdaode regs[4] = dsaf_read_dev(ppe_common, PPE_COM_COMMON_CNT_CLR_CE_REG); 567511e6bc0Shuangdaode 568511e6bc0Shuangdaode for (i = 0; i < DSAF_TOTAL_QUEUE_NUM; i++) { 569511e6bc0Shuangdaode offset = PPE_COM_HIS_RX_PKT_QID_DROP_CNT_REG + 0x4 * i; 570511e6bc0Shuangdaode regs[5 + i] = dsaf_read_dev(ppe_common, offset); 571511e6bc0Shuangdaode offset = PPE_COM_HIS_RX_PKT_QID_OK_CNT_REG + 0x4 * i; 572511e6bc0Shuangdaode regs[5 + i + DSAF_TOTAL_QUEUE_NUM] 573511e6bc0Shuangdaode = dsaf_read_dev(ppe_common, offset); 574511e6bc0Shuangdaode offset = PPE_COM_HIS_TX_PKT_QID_ERR_CNT_REG + 0x4 * i; 575511e6bc0Shuangdaode regs[5 + i + DSAF_TOTAL_QUEUE_NUM * 2] 576511e6bc0Shuangdaode = dsaf_read_dev(ppe_common, offset); 577511e6bc0Shuangdaode offset = PPE_COM_HIS_TX_PKT_QID_OK_CNT_REG + 0x4 * i; 578511e6bc0Shuangdaode regs[5 + i + DSAF_TOTAL_QUEUE_NUM * 3] 579511e6bc0Shuangdaode = dsaf_read_dev(ppe_common, offset); 580511e6bc0Shuangdaode } 581511e6bc0Shuangdaode 582511e6bc0Shuangdaode /* mark end of ppe regs */ 583511e6bc0Shuangdaode for (i = 521; i < 524; i++) 584511e6bc0Shuangdaode regs[i] = 0xeeeeeeee; 585511e6bc0Shuangdaode 586511e6bc0Shuangdaode /* ppe channel registers */ 587511e6bc0Shuangdaode regs[525] = dsaf_read_dev(ppe_cb, PPE_CFG_TX_FIFO_THRSLD_REG); 588511e6bc0Shuangdaode regs[526] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_FIFO_THRSLD_REG); 589511e6bc0Shuangdaode regs[527] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_FIFO_PAUSE_THRSLD_REG); 590511e6bc0Shuangdaode regs[528] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_FIFO_SW_BP_THRSLD_REG); 591511e6bc0Shuangdaode regs[529] = dsaf_read_dev(ppe_cb, PPE_CFG_PAUSE_IDLE_CNT_REG); 592511e6bc0Shuangdaode regs[530] = dsaf_read_dev(ppe_cb, PPE_CFG_BUS_CTRL_REG); 593511e6bc0Shuangdaode regs[531] = dsaf_read_dev(ppe_cb, PPE_CFG_TNL_TO_BE_RST_REG); 594511e6bc0Shuangdaode regs[532] = dsaf_read_dev(ppe_cb, PPE_CURR_TNL_CAN_RST_REG); 595511e6bc0Shuangdaode 596511e6bc0Shuangdaode regs[533] = dsaf_read_dev(ppe_cb, PPE_CFG_XGE_MODE_REG); 597511e6bc0Shuangdaode regs[534] = dsaf_read_dev(ppe_cb, PPE_CFG_MAX_FRAME_LEN_REG); 598511e6bc0Shuangdaode regs[535] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_PKT_MODE_REG); 599511e6bc0Shuangdaode regs[536] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_VLAN_TAG_REG); 600511e6bc0Shuangdaode regs[537] = dsaf_read_dev(ppe_cb, PPE_CFG_TAG_GEN_REG); 601511e6bc0Shuangdaode regs[538] = dsaf_read_dev(ppe_cb, PPE_CFG_PARSE_TAG_REG); 602511e6bc0Shuangdaode regs[539] = dsaf_read_dev(ppe_cb, PPE_CFG_PRO_CHECK_EN_REG); 603511e6bc0Shuangdaode 604511e6bc0Shuangdaode regs[540] = dsaf_read_dev(ppe_cb, PPE_INTEN_REG); 605511e6bc0Shuangdaode regs[541] = dsaf_read_dev(ppe_cb, PPE_RINT_REG); 606511e6bc0Shuangdaode regs[542] = dsaf_read_dev(ppe_cb, PPE_INTSTS_REG); 607511e6bc0Shuangdaode regs[543] = dsaf_read_dev(ppe_cb, PPE_CFG_RX_PKT_INT_REG); 608511e6bc0Shuangdaode 609511e6bc0Shuangdaode regs[544] = dsaf_read_dev(ppe_cb, PPE_CFG_HEAT_DECT_TIME0_REG); 610511e6bc0Shuangdaode regs[545] = dsaf_read_dev(ppe_cb, PPE_CFG_HEAT_DECT_TIME1_REG); 611511e6bc0Shuangdaode 612511e6bc0Shuangdaode /* ppe static */ 613511e6bc0Shuangdaode regs[546] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_SW_PKT_CNT_REG); 614511e6bc0Shuangdaode regs[547] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_WR_BD_OK_PKT_CNT_REG); 615511e6bc0Shuangdaode regs[548] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_NO_BUF_CNT_REG); 616511e6bc0Shuangdaode regs[549] = dsaf_read_dev(ppe_cb, PPE_HIS_TX_BD_CNT_REG); 617511e6bc0Shuangdaode regs[550] = dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_CNT_REG); 618511e6bc0Shuangdaode regs[551] = dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_OK_CNT_REG); 619511e6bc0Shuangdaode regs[552] = dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_EPT_CNT_REG); 620511e6bc0Shuangdaode regs[553] = dsaf_read_dev(ppe_cb, PPE_HIS_TX_PKT_CS_FAIL_CNT_REG); 621511e6bc0Shuangdaode regs[554] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_APP_BUF_FAIL_CNT_REG); 622511e6bc0Shuangdaode regs[555] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_APP_BUF_WAIT_CNT_REG); 623511e6bc0Shuangdaode regs[556] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_DROP_FUL_CNT_REG); 624511e6bc0Shuangdaode regs[557] = dsaf_read_dev(ppe_cb, PPE_HIS_RX_PKT_DROP_PRT_CNT_REG); 625511e6bc0Shuangdaode 626511e6bc0Shuangdaode regs[558] = dsaf_read_dev(ppe_cb, PPE_TNL_0_5_CNT_CLR_CE_REG); 627511e6bc0Shuangdaode regs[559] = dsaf_read_dev(ppe_cb, PPE_CFG_AXI_DBG_REG); 628511e6bc0Shuangdaode regs[560] = dsaf_read_dev(ppe_cb, PPE_HIS_PRO_ERR_REG); 629511e6bc0Shuangdaode regs[561] = dsaf_read_dev(ppe_cb, PPE_HIS_TNL_FIFO_ERR_REG); 630511e6bc0Shuangdaode regs[562] = dsaf_read_dev(ppe_cb, PPE_CURR_CFF_DATA_NUM_REG); 631511e6bc0Shuangdaode regs[563] = dsaf_read_dev(ppe_cb, PPE_CURR_RX_ST_REG); 632511e6bc0Shuangdaode regs[564] = dsaf_read_dev(ppe_cb, PPE_CURR_TX_ST_REG); 633511e6bc0Shuangdaode regs[565] = dsaf_read_dev(ppe_cb, PPE_CURR_RX_FIFO0_REG); 634511e6bc0Shuangdaode regs[566] = dsaf_read_dev(ppe_cb, PPE_CURR_RX_FIFO1_REG); 635511e6bc0Shuangdaode regs[567] = dsaf_read_dev(ppe_cb, PPE_CURR_TX_FIFO0_REG); 636511e6bc0Shuangdaode regs[568] = dsaf_read_dev(ppe_cb, PPE_CURR_TX_FIFO1_REG); 637511e6bc0Shuangdaode regs[569] = dsaf_read_dev(ppe_cb, PPE_ECO0_REG); 638511e6bc0Shuangdaode regs[570] = dsaf_read_dev(ppe_cb, PPE_ECO1_REG); 639511e6bc0Shuangdaode regs[571] = dsaf_read_dev(ppe_cb, PPE_ECO2_REG); 640511e6bc0Shuangdaode 641511e6bc0Shuangdaode /* mark end of ppe regs */ 642511e6bc0Shuangdaode for (i = 572; i < 576; i++) 643511e6bc0Shuangdaode regs[i] = 0xeeeeeeee; 644511e6bc0Shuangdaode } 645