1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2013, 2015 Freescale Semiconductor, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Driver for the Vitesse VSC9953 L2 Switch 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _VSC9953_H_ 10*4882a593Smuzhiyun #define _VSC9953_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <config.h> 13*4882a593Smuzhiyun #include <miiphy.h> 14*4882a593Smuzhiyun #include <asm/types.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define VSC9953_OFFSET (CONFIG_SYS_CCSRBAR_DEFAULT + 0x800000) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define VSC9953_SYS_OFFSET 0x010000 19*4882a593Smuzhiyun #define VSC9953_REW_OFFSET 0x030000 20*4882a593Smuzhiyun #define VSC9953_DEV_GMII_OFFSET 0x100000 21*4882a593Smuzhiyun #define VSC9953_QSYS_OFFSET 0x200000 22*4882a593Smuzhiyun #define VSC9953_ANA_OFFSET 0x280000 23*4882a593Smuzhiyun #define VSC9953_DEVCPU_GCB 0x070000 24*4882a593Smuzhiyun #define VSC9953_ES0 0x040000 25*4882a593Smuzhiyun #define VSC9953_IS1 0x050000 26*4882a593Smuzhiyun #define VSC9953_IS2 0x060000 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define T1040_SWITCH_GMII_DEV_OFFSET 0x010000 29*4882a593Smuzhiyun #define VSC9953_PHY_REGS_OFFST 0x0000AC 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Macros for vsc9953_chip_regs.soft_rst register */ 32*4882a593Smuzhiyun #define VSC9953_SOFT_SWC_RST_ENA 0x00000001 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Macros for vsc9953_sys_sys.reset_cfg register */ 35*4882a593Smuzhiyun #define VSC9953_CORE_ENABLE 0x80 36*4882a593Smuzhiyun #define VSC9953_MEM_ENABLE 0x40 37*4882a593Smuzhiyun #define VSC9953_MEM_INIT 0x20 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_mac_cfg_status.mac_ena_cfg register */ 40*4882a593Smuzhiyun #define VSC9953_MAC_ENA_CFG 0x00000011 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_mac_cfg_status.mac_mode_cfg register */ 43*4882a593Smuzhiyun #define VSC9953_MAC_MODE_CFG 0x00000011 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_mac_cfg_status.mac_ifg_cfg register */ 46*4882a593Smuzhiyun #define VSC9953_MAC_IFG_CFG 0x00000515 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_mac_cfg_status.mac_hdx_cfg register */ 49*4882a593Smuzhiyun #define VSC9953_MAC_HDX_CFG 0x00001043 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_mac_cfg_status.mac_maxlen_cfg register */ 52*4882a593Smuzhiyun #define VSC9953_MAC_MAX_LEN 0x000005ee 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Macros for vsc9953_dev_gmii_port_mode.clock_cfg register */ 55*4882a593Smuzhiyun #define VSC9953_CLOCK_CFG 0x00000001 56*4882a593Smuzhiyun #define VSC9953_CLOCK_CFG_1000M 0x00000001 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Macros for vsc9953_sys_sys.front_port_mode register */ 59*4882a593Smuzhiyun #define VSC9953_FRONT_PORT_MODE 0x00000000 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Macros for vsc9953_ana_pfc.pfc_cfg register */ 62*4882a593Smuzhiyun #define VSC9953_PFC_FC 0x00000001 63*4882a593Smuzhiyun #define VSC9953_PFC_FC_QSGMII 0x00000000 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Macros for vsc9953_sys_pause_cfg.mac_fc_cfg register */ 66*4882a593Smuzhiyun #define VSC9953_MAC_FC_CFG 0x04700000 67*4882a593Smuzhiyun #define VSC9953_MAC_FC_CFG_QSGMII 0x00700000 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* Macros for vsc9953_sys_pause_cfg.pause_cfg register */ 70*4882a593Smuzhiyun #define VSC9953_PAUSE_CFG 0x001ffffe 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* Macros for vsc9953_sys_pause_cfgtot_tail_drop_lvl register */ 73*4882a593Smuzhiyun #define VSC9953_TOT_TAIL_DROP_LVL 0x000003ff 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Macros for vsc9953_sys_sys.stat_cfg register */ 76*4882a593Smuzhiyun #define VSC9953_STAT_CLEAR_RX 0x00000400 77*4882a593Smuzhiyun #define VSC9953_STAT_CLEAR_TX 0x00000800 78*4882a593Smuzhiyun #define VSC9953_STAT_CLEAR_DR 0x00001000 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* Macros for vsc9953_vcap_core_cfg.vcap_mv_cfg register */ 81*4882a593Smuzhiyun #define VSC9953_VCAP_MV_CFG 0x0000ffff 82*4882a593Smuzhiyun #define VSC9953_VCAP_UPDATE_CTRL 0x01000004 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Macros for register vsc9953_ana_ana_tables.mac_access register */ 85*4882a593Smuzhiyun #define VSC9953_MAC_CMD_IDLE 0x00000000 86*4882a593Smuzhiyun #define VSC9953_MAC_CMD_LEARN 0x00000001 87*4882a593Smuzhiyun #define VSC9953_MAC_CMD_FORGET 0x00000002 88*4882a593Smuzhiyun #define VSC9953_MAC_CMD_AGE 0x00000003 89*4882a593Smuzhiyun #define VSC9953_MAC_CMD_NEXT 0x00000004 90*4882a593Smuzhiyun #define VSC9953_MAC_CMD_READ 0x00000006 91*4882a593Smuzhiyun #define VSC9953_MAC_CMD_WRITE 0x00000007 92*4882a593Smuzhiyun #define VSC9953_MAC_CMD_MASK 0x00000007 93*4882a593Smuzhiyun #define VSC9953_MAC_CMD_VALID 0x00000800 94*4882a593Smuzhiyun #define VSC9953_MAC_ENTRYTYPE_NORMAL 0x00000000 95*4882a593Smuzhiyun #define VSC9953_MAC_ENTRYTYPE_LOCKED 0x00000200 96*4882a593Smuzhiyun #define VSC9953_MAC_ENTRYTYPE_IPV4MCAST 0x00000400 97*4882a593Smuzhiyun #define VSC9953_MAC_ENTRYTYPE_IPV6MCAST 0x00000600 98*4882a593Smuzhiyun #define VSC9953_MAC_ENTRYTYPE_MASK 0x00000600 99*4882a593Smuzhiyun #define VSC9953_MAC_DESTIDX_MASK 0x000001f8 100*4882a593Smuzhiyun #define VSC9953_MAC_VID_MASK 0x1fff0000 101*4882a593Smuzhiyun #define VSC9953_MAC_MACH_MASK 0x0000ffff 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* Macros for vsc9953_ana_port.vlan_cfg register */ 104*4882a593Smuzhiyun #define VSC9953_VLAN_CFG_AWARE_ENA 0x00100000 105*4882a593Smuzhiyun #define VSC9953_VLAN_CFG_POP_CNT_MASK 0x000c0000 106*4882a593Smuzhiyun #define VSC9953_VLAN_CFG_POP_CNT_NONE 0x00000000 107*4882a593Smuzhiyun #define VSC9953_VLAN_CFG_POP_CNT_ONE 0x00040000 108*4882a593Smuzhiyun #define VSC9953_VLAN_CFG_VID_MASK 0x00000fff 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* Macros for vsc9953_rew_port.port_vlan_cfg register */ 111*4882a593Smuzhiyun #define VSC9953_PORT_VLAN_CFG_VID_MASK 0x00000fff 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana_tables.vlan_tidx register */ 114*4882a593Smuzhiyun #define VSC9953_ANA_TBL_VID_MASK 0x00000fff 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana_tables.vlan_access register */ 117*4882a593Smuzhiyun #define VSC9953_VLAN_PORT_MASK 0x00001ffc 118*4882a593Smuzhiyun #define VSC9953_VLAN_CMD_MASK 0x00000003 119*4882a593Smuzhiyun #define VSC9953_VLAN_CMD_IDLE 0x00000000 120*4882a593Smuzhiyun #define VSC9953_VLAN_CMD_READ 0x00000001 121*4882a593Smuzhiyun #define VSC9953_VLAN_CMD_WRITE 0x00000002 122*4882a593Smuzhiyun #define VSC9953_VLAN_CMD_INIT 0x00000003 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* Macros for vsc9953_ana_port.port_cfg register */ 125*4882a593Smuzhiyun #define VSC9953_PORT_CFG_LEARN_ENA 0x00000080 126*4882a593Smuzhiyun #define VSC9953_PORT_CFG_LEARN_AUTO 0x00000100 127*4882a593Smuzhiyun #define VSC9953_PORT_CFG_LEARN_CPU 0x00000200 128*4882a593Smuzhiyun #define VSC9953_PORT_CFG_LEARN_DROP 0x00000400 129*4882a593Smuzhiyun #define VSC9953_PORT_CFG_PORTID_MASK 0x0000003c 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* Macros for vsc9953_qsys_sys.switch_port_mode register */ 132*4882a593Smuzhiyun #define VSC9953_PORT_ENA 0x00002000 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana.agen_ctrl register */ 135*4882a593Smuzhiyun #define VSC9953_FID_MASK_ALL 0x00fff000 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana.adv_learn register */ 138*4882a593Smuzhiyun #define VSC9953_VLAN_CHK 0x00000400 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana.auto_age register */ 141*4882a593Smuzhiyun #define VSC9953_AUTOAGE_PERIOD_MASK 0x001ffffe 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* Macros for vsc9953_rew_port.port_tag_cfg register */ 144*4882a593Smuzhiyun #define VSC9953_TAG_CFG_MASK 0x00000180 145*4882a593Smuzhiyun #define VSC9953_TAG_CFG_NONE 0x00000000 146*4882a593Smuzhiyun #define VSC9953_TAG_CFG_ALL_BUT_PVID_ZERO 0x00000080 147*4882a593Smuzhiyun #define VSC9953_TAG_CFG_ALL_BUT_ZERO 0x00000100 148*4882a593Smuzhiyun #define VSC9953_TAG_CFG_ALL 0x00000180 149*4882a593Smuzhiyun #define VSC9953_TAG_VID_PVID 0x00000010 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana.anag_efil register */ 152*4882a593Smuzhiyun #define VSC9953_AGE_PORT_EN 0x00080000 153*4882a593Smuzhiyun #define VSC9953_AGE_PORT_MASK 0x0007c000 154*4882a593Smuzhiyun #define VSC9953_AGE_VID_EN 0x00002000 155*4882a593Smuzhiyun #define VSC9953_AGE_VID_MASK 0x00001fff 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Macros for vsc9953_ana_ana_tables.mach_data register */ 158*4882a593Smuzhiyun #define VSC9953_MACHDATA_VID_MASK 0x1fff0000 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Macros for vsc9953_ana_common.aggr_cfg register */ 161*4882a593Smuzhiyun #define VSC9953_AC_RND_ENA 0x00000080 162*4882a593Smuzhiyun #define VSC9953_AC_DMAC_ENA 0x00000040 163*4882a593Smuzhiyun #define VSC9953_AC_SMAC_ENA 0x00000020 164*4882a593Smuzhiyun #define VSC9953_AC_IP6_LBL_ENA 0x00000010 165*4882a593Smuzhiyun #define VSC9953_AC_IP6_TCPUDP_ENA 0x00000008 166*4882a593Smuzhiyun #define VSC9953_AC_IP4_SIPDIP_ENA 0x00000004 167*4882a593Smuzhiyun #define VSC9953_AC_IP4_TCPUDP_ENA 0x00000002 168*4882a593Smuzhiyun #define VSC9953_AC_MASK 0x000000fe 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* Macros for vsc9953_ana_pgid.port_grp_id[] registers */ 171*4882a593Smuzhiyun #define VSC9953_PGID_PORT_MASK 0x000003ff 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define VSC9953_MAX_PORTS 10 174*4882a593Smuzhiyun #define VSC9953_PORT_CHECK(port) \ 175*4882a593Smuzhiyun (((port) < 0 || (port) >= VSC9953_MAX_PORTS) ? 0 : 1) 176*4882a593Smuzhiyun #define VSC9953_INTERNAL_PORT_CHECK(port) ( \ 177*4882a593Smuzhiyun ( \ 178*4882a593Smuzhiyun (port) < VSC9953_MAX_PORTS - 2 || (port) >= VSC9953_MAX_PORTS \ 179*4882a593Smuzhiyun ) ? 0 : 1 \ 180*4882a593Smuzhiyun ) 181*4882a593Smuzhiyun #define VSC9953_MAX_VLAN 4096 182*4882a593Smuzhiyun #define VSC9953_VLAN_CHECK(vid) \ 183*4882a593Smuzhiyun (((vid) < 0 || (vid) >= VSC9953_MAX_VLAN) ? 0 : 1) 184*4882a593Smuzhiyun #define VSC9953_DEFAULT_AGE_TIME 300 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define DEFAULT_VSC9953_MDIO_NAME "VSC9953_MDIO0" 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define MIIMIND_OPR_PEND 0x00000004 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct vsc9953_mdio_info { 191*4882a593Smuzhiyun struct vsc9953_mii_mng *regs; 192*4882a593Smuzhiyun char *name; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* VSC9953 ANA structure */ 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct vsc9953_ana_port { 198*4882a593Smuzhiyun u32 vlan_cfg; 199*4882a593Smuzhiyun u32 drop_cfg; 200*4882a593Smuzhiyun u32 qos_cfg; 201*4882a593Smuzhiyun u32 vcap_cfg; 202*4882a593Smuzhiyun u32 vcap_s1_key_cfg[3]; 203*4882a593Smuzhiyun u32 vcap_s2_cfg; 204*4882a593Smuzhiyun u32 qos_pcp_dei_map_cfg[16]; 205*4882a593Smuzhiyun u32 cpu_fwd_cfg; 206*4882a593Smuzhiyun u32 cpu_fwd_bpdu_cfg; 207*4882a593Smuzhiyun u32 cpu_fwd_garp_cfg; 208*4882a593Smuzhiyun u32 cpu_fwd_ccm_cfg; 209*4882a593Smuzhiyun u32 port_cfg; 210*4882a593Smuzhiyun u32 pol_cfg; 211*4882a593Smuzhiyun u32 reserved[34]; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct vsc9953_ana_pol { 215*4882a593Smuzhiyun u32 pol_pir_cfg; 216*4882a593Smuzhiyun u32 pol_cir_cfg; 217*4882a593Smuzhiyun u32 pol_mode_cfg; 218*4882a593Smuzhiyun u32 pol_pir_state; 219*4882a593Smuzhiyun u32 pol_cir_state; 220*4882a593Smuzhiyun u32 reserved1[3]; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun struct vsc9953_ana_ana_tables { 224*4882a593Smuzhiyun u32 entry_lim[11]; 225*4882a593Smuzhiyun u32 an_moved; 226*4882a593Smuzhiyun u32 mach_data; 227*4882a593Smuzhiyun u32 macl_data; 228*4882a593Smuzhiyun u32 mac_access; 229*4882a593Smuzhiyun u32 mact_indx; 230*4882a593Smuzhiyun u32 vlan_access; 231*4882a593Smuzhiyun u32 vlan_tidx; 232*4882a593Smuzhiyun }; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun struct vsc9953_ana_ana { 235*4882a593Smuzhiyun u32 adv_learn; 236*4882a593Smuzhiyun u32 vlan_mask; 237*4882a593Smuzhiyun u32 reserved; 238*4882a593Smuzhiyun u32 anag_efil; 239*4882a593Smuzhiyun u32 an_events; 240*4882a593Smuzhiyun u32 storm_limit_burst; 241*4882a593Smuzhiyun u32 storm_limit_cfg[4]; 242*4882a593Smuzhiyun u32 isolated_prts; 243*4882a593Smuzhiyun u32 community_ports; 244*4882a593Smuzhiyun u32 auto_age; 245*4882a593Smuzhiyun u32 mac_options; 246*4882a593Smuzhiyun u32 learn_disc; 247*4882a593Smuzhiyun u32 agen_ctrl; 248*4882a593Smuzhiyun u32 mirror_ports; 249*4882a593Smuzhiyun u32 emirror_ports; 250*4882a593Smuzhiyun u32 flooding; 251*4882a593Smuzhiyun u32 flooding_ipmc; 252*4882a593Smuzhiyun u32 sflow_cfg[11]; 253*4882a593Smuzhiyun u32 port_mode[12]; 254*4882a593Smuzhiyun }; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun #define PGID_DST_START 0 257*4882a593Smuzhiyun #define PGID_AGGR_START 64 258*4882a593Smuzhiyun #define PGID_SRC_START 80 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun struct vsc9953_ana_pgid { 261*4882a593Smuzhiyun u32 port_grp_id[91]; 262*4882a593Smuzhiyun }; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun struct vsc9953_ana_pfc { 265*4882a593Smuzhiyun u32 pfc_cfg; 266*4882a593Smuzhiyun u32 reserved1[15]; 267*4882a593Smuzhiyun }; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct vsc9953_ana_pol_misc { 270*4882a593Smuzhiyun u32 pol_flowc[10]; 271*4882a593Smuzhiyun u32 reserved1[17]; 272*4882a593Smuzhiyun u32 pol_hyst; 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun struct vsc9953_ana_common { 276*4882a593Smuzhiyun u32 aggr_cfg; 277*4882a593Smuzhiyun u32 cpuq_cfg; 278*4882a593Smuzhiyun u32 cpuq_8021_cfg; 279*4882a593Smuzhiyun u32 dscp_cfg; 280*4882a593Smuzhiyun u32 dscp_rewr_cfg; 281*4882a593Smuzhiyun u32 vcap_rng_type_cfg; 282*4882a593Smuzhiyun u32 vcap_rng_val_cfg; 283*4882a593Smuzhiyun u32 discard_cfg; 284*4882a593Smuzhiyun u32 fid_cfg; 285*4882a593Smuzhiyun }; 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun struct vsc9953_analyzer { 288*4882a593Smuzhiyun struct vsc9953_ana_port port[11]; 289*4882a593Smuzhiyun u32 reserved1[9536]; 290*4882a593Smuzhiyun struct vsc9953_ana_pol pol[164]; 291*4882a593Smuzhiyun struct vsc9953_ana_ana_tables ana_tables; 292*4882a593Smuzhiyun u32 reserved2[14]; 293*4882a593Smuzhiyun struct vsc9953_ana_ana ana; 294*4882a593Smuzhiyun u32 reserved3[21]; 295*4882a593Smuzhiyun struct vsc9953_ana_pgid port_id_tbl; 296*4882a593Smuzhiyun u32 reserved4[549]; 297*4882a593Smuzhiyun struct vsc9953_ana_pfc pfc[10]; 298*4882a593Smuzhiyun struct vsc9953_ana_pol_misc pol_misc; 299*4882a593Smuzhiyun u32 reserved5[196]; 300*4882a593Smuzhiyun struct vsc9953_ana_common common; 301*4882a593Smuzhiyun }; 302*4882a593Smuzhiyun /* END VSC9953 ANA structure t*/ 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* VSC9953 DEV_GMII structure */ 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun struct vsc9953_dev_gmii_port_mode { 307*4882a593Smuzhiyun u32 clock_cfg; 308*4882a593Smuzhiyun u32 port_misc; 309*4882a593Smuzhiyun u32 reserved1; 310*4882a593Smuzhiyun u32 eee_cfg; 311*4882a593Smuzhiyun }; 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun struct vsc9953_dev_gmii_mac_cfg_status { 314*4882a593Smuzhiyun u32 mac_ena_cfg; 315*4882a593Smuzhiyun u32 mac_mode_cfg; 316*4882a593Smuzhiyun u32 mac_maxlen_cfg; 317*4882a593Smuzhiyun u32 mac_tags_cfg; 318*4882a593Smuzhiyun u32 mac_adv_chk_cfg; 319*4882a593Smuzhiyun u32 mac_ifg_cfg; 320*4882a593Smuzhiyun u32 mac_hdx_cfg; 321*4882a593Smuzhiyun u32 mac_fc_mac_low_cfg; 322*4882a593Smuzhiyun u32 mac_fc_mac_high_cfg; 323*4882a593Smuzhiyun u32 mac_sticky; 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun struct vsc9953_dev_gmii { 327*4882a593Smuzhiyun struct vsc9953_dev_gmii_port_mode port_mode; 328*4882a593Smuzhiyun struct vsc9953_dev_gmii_mac_cfg_status mac_cfg_status; 329*4882a593Smuzhiyun }; 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun /* END VSC9953 DEV_GMII structure */ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* VSC9953 QSYS structure */ 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun struct vsc9953_qsys_hsch { 336*4882a593Smuzhiyun u32 cir_cfg; 337*4882a593Smuzhiyun u32 reserved1; 338*4882a593Smuzhiyun u32 se_cfg; 339*4882a593Smuzhiyun u32 se_dwrr_cfg[8]; 340*4882a593Smuzhiyun u32 cir_state; 341*4882a593Smuzhiyun u32 reserved2[20]; 342*4882a593Smuzhiyun }; 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun struct vsc9953_qsys_sys { 345*4882a593Smuzhiyun u32 port_mode[12]; 346*4882a593Smuzhiyun u32 switch_port_mode[11]; 347*4882a593Smuzhiyun u32 stat_cnt_cfg; 348*4882a593Smuzhiyun u32 eee_cfg[10]; 349*4882a593Smuzhiyun u32 eee_thrs; 350*4882a593Smuzhiyun u32 igr_no_sharing; 351*4882a593Smuzhiyun u32 egr_no_sharing; 352*4882a593Smuzhiyun u32 sw_status[11]; 353*4882a593Smuzhiyun u32 ext_cpu_cfg; 354*4882a593Smuzhiyun u32 cpu_group_map; 355*4882a593Smuzhiyun u32 reserved1[23]; 356*4882a593Smuzhiyun }; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun struct vsc9953_qsys_qos_cfg { 359*4882a593Smuzhiyun u32 red_profile[16]; 360*4882a593Smuzhiyun u32 res_qos_mode; 361*4882a593Smuzhiyun }; 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun struct vsc9953_qsys_drop_cfg { 364*4882a593Smuzhiyun u32 egr_drop_mode; 365*4882a593Smuzhiyun }; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun struct vsc9953_qsys_mmgt { 368*4882a593Smuzhiyun u32 eq_cntrl; 369*4882a593Smuzhiyun u32 reserved1; 370*4882a593Smuzhiyun }; 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun struct vsc9953_qsys_hsch_misc { 373*4882a593Smuzhiyun u32 hsch_misc_cfg; 374*4882a593Smuzhiyun u32 reserved1[546]; 375*4882a593Smuzhiyun }; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun struct vsc9953_qsys_res_ctrl { 378*4882a593Smuzhiyun u32 res_cfg; 379*4882a593Smuzhiyun u32 res_stat; 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun }; 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun struct vsc9953_qsys_reg { 384*4882a593Smuzhiyun struct vsc9953_qsys_hsch hsch[108]; 385*4882a593Smuzhiyun struct vsc9953_qsys_sys sys; 386*4882a593Smuzhiyun struct vsc9953_qsys_qos_cfg qos_cfg; 387*4882a593Smuzhiyun struct vsc9953_qsys_drop_cfg drop_cfg; 388*4882a593Smuzhiyun struct vsc9953_qsys_mmgt mmgt; 389*4882a593Smuzhiyun struct vsc9953_qsys_hsch_misc hsch_misc; 390*4882a593Smuzhiyun struct vsc9953_qsys_res_ctrl res_ctrl[1024]; 391*4882a593Smuzhiyun }; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun /* END VSC9953 QSYS structure */ 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* VSC9953 SYS structure */ 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun struct vsc9953_rx_cntrs { 398*4882a593Smuzhiyun u32 c_rx_oct; 399*4882a593Smuzhiyun u32 c_rx_uc; 400*4882a593Smuzhiyun u32 c_rx_mc; 401*4882a593Smuzhiyun u32 c_rx_bc; 402*4882a593Smuzhiyun u32 c_rx_short; 403*4882a593Smuzhiyun u32 c_rx_frag; 404*4882a593Smuzhiyun u32 c_rx_jabber; 405*4882a593Smuzhiyun u32 c_rx_crc; 406*4882a593Smuzhiyun u32 c_rx_symbol_err; 407*4882a593Smuzhiyun u32 c_rx_sz_64; 408*4882a593Smuzhiyun u32 c_rx_sz_65_127; 409*4882a593Smuzhiyun u32 c_rx_sz_128_255; 410*4882a593Smuzhiyun u32 c_rx_sz_256_511; 411*4882a593Smuzhiyun u32 c_rx_sz_512_1023; 412*4882a593Smuzhiyun u32 c_rx_sz_1024_1526; 413*4882a593Smuzhiyun u32 c_rx_sz_jumbo; 414*4882a593Smuzhiyun u32 c_rx_pause; 415*4882a593Smuzhiyun u32 c_rx_control; 416*4882a593Smuzhiyun u32 c_rx_long; 417*4882a593Smuzhiyun u32 c_rx_cat_drop; 418*4882a593Smuzhiyun u32 c_rx_red_prio_0; 419*4882a593Smuzhiyun u32 c_rx_red_prio_1; 420*4882a593Smuzhiyun u32 c_rx_red_prio_2; 421*4882a593Smuzhiyun u32 c_rx_red_prio_3; 422*4882a593Smuzhiyun u32 c_rx_red_prio_4; 423*4882a593Smuzhiyun u32 c_rx_red_prio_5; 424*4882a593Smuzhiyun u32 c_rx_red_prio_6; 425*4882a593Smuzhiyun u32 c_rx_red_prio_7; 426*4882a593Smuzhiyun u32 c_rx_yellow_prio_0; 427*4882a593Smuzhiyun u32 c_rx_yellow_prio_1; 428*4882a593Smuzhiyun u32 c_rx_yellow_prio_2; 429*4882a593Smuzhiyun u32 c_rx_yellow_prio_3; 430*4882a593Smuzhiyun u32 c_rx_yellow_prio_4; 431*4882a593Smuzhiyun u32 c_rx_yellow_prio_5; 432*4882a593Smuzhiyun u32 c_rx_yellow_prio_6; 433*4882a593Smuzhiyun u32 c_rx_yellow_prio_7; 434*4882a593Smuzhiyun u32 c_rx_green_prio_0; 435*4882a593Smuzhiyun u32 c_rx_green_prio_1; 436*4882a593Smuzhiyun u32 c_rx_green_prio_2; 437*4882a593Smuzhiyun u32 c_rx_green_prio_3; 438*4882a593Smuzhiyun u32 c_rx_green_prio_4; 439*4882a593Smuzhiyun u32 c_rx_green_prio_5; 440*4882a593Smuzhiyun u32 c_rx_green_prio_6; 441*4882a593Smuzhiyun u32 c_rx_green_prio_7; 442*4882a593Smuzhiyun u32 reserved[20]; 443*4882a593Smuzhiyun }; 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun struct vsc9953_tx_cntrs { 446*4882a593Smuzhiyun u32 c_tx_oct; 447*4882a593Smuzhiyun u32 c_tx_uc; 448*4882a593Smuzhiyun u32 c_tx_mc; 449*4882a593Smuzhiyun u32 c_tx_bc; 450*4882a593Smuzhiyun u32 c_tx_col; 451*4882a593Smuzhiyun u32 c_tx_drop; 452*4882a593Smuzhiyun u32 c_tx_pause; 453*4882a593Smuzhiyun u32 c_tx_sz_64; 454*4882a593Smuzhiyun u32 c_tx_sz_65_127; 455*4882a593Smuzhiyun u32 c_tx_sz_128_255; 456*4882a593Smuzhiyun u32 c_tx_sz_256_511; 457*4882a593Smuzhiyun u32 c_tx_sz_512_1023; 458*4882a593Smuzhiyun u32 c_tx_sz_1024_1526; 459*4882a593Smuzhiyun u32 c_tx_sz_jumbo; 460*4882a593Smuzhiyun u32 c_tx_yellow_prio_0; 461*4882a593Smuzhiyun u32 c_tx_yellow_prio_1; 462*4882a593Smuzhiyun u32 c_tx_yellow_prio_2; 463*4882a593Smuzhiyun u32 c_tx_yellow_prio_3; 464*4882a593Smuzhiyun u32 c_tx_yellow_prio_4; 465*4882a593Smuzhiyun u32 c_tx_yellow_prio_5; 466*4882a593Smuzhiyun u32 c_tx_yellow_prio_6; 467*4882a593Smuzhiyun u32 c_tx_yellow_prio_7; 468*4882a593Smuzhiyun u32 c_tx_green_prio_0; 469*4882a593Smuzhiyun u32 c_tx_green_prio_1; 470*4882a593Smuzhiyun u32 c_tx_green_prio_2; 471*4882a593Smuzhiyun u32 c_tx_green_prio_3; 472*4882a593Smuzhiyun u32 c_tx_green_prio_4; 473*4882a593Smuzhiyun u32 c_tx_green_prio_5; 474*4882a593Smuzhiyun u32 c_tx_green_prio_6; 475*4882a593Smuzhiyun u32 c_tx_green_prio_7; 476*4882a593Smuzhiyun u32 c_tx_aged; 477*4882a593Smuzhiyun u32 reserved[33]; 478*4882a593Smuzhiyun }; 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun struct vsc9953_drop_cntrs { 481*4882a593Smuzhiyun u32 c_dr_local; 482*4882a593Smuzhiyun u32 c_dr_tail; 483*4882a593Smuzhiyun u32 c_dr_yellow_prio_0; 484*4882a593Smuzhiyun u32 c_dr_yellow_prio_1; 485*4882a593Smuzhiyun u32 c_dr_yellow_prio_2; 486*4882a593Smuzhiyun u32 c_dr_yellow_prio_3; 487*4882a593Smuzhiyun u32 c_dr_yellow_prio_4; 488*4882a593Smuzhiyun u32 c_dr_yellow_prio_5; 489*4882a593Smuzhiyun u32 c_dr_yellow_prio_6; 490*4882a593Smuzhiyun u32 c_dr_yellow_prio_7; 491*4882a593Smuzhiyun u32 c_dr_green_prio_0; 492*4882a593Smuzhiyun u32 c_dr_green_prio_1; 493*4882a593Smuzhiyun u32 c_dr_green_prio_2; 494*4882a593Smuzhiyun u32 c_dr_green_prio_3; 495*4882a593Smuzhiyun u32 c_dr_green_prio_4; 496*4882a593Smuzhiyun u32 c_dr_green_prio_5; 497*4882a593Smuzhiyun u32 c_dr_green_prio_6; 498*4882a593Smuzhiyun u32 c_dr_green_prio_7; 499*4882a593Smuzhiyun u32 reserved[46]; 500*4882a593Smuzhiyun }; 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun struct vsc9953_sys_stat { 503*4882a593Smuzhiyun struct vsc9953_rx_cntrs rx_cntrs; 504*4882a593Smuzhiyun struct vsc9953_tx_cntrs tx_cntrs; 505*4882a593Smuzhiyun struct vsc9953_drop_cntrs drop_cntrs; 506*4882a593Smuzhiyun u32 reserved1[6]; 507*4882a593Smuzhiyun }; 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun struct vsc9953_sys_sys { 510*4882a593Smuzhiyun u32 reset_cfg; 511*4882a593Smuzhiyun u32 reserved1; 512*4882a593Smuzhiyun u32 vlan_etype_cfg; 513*4882a593Smuzhiyun u32 port_mode[12]; 514*4882a593Smuzhiyun u32 front_port_mode[10]; 515*4882a593Smuzhiyun u32 frame_aging; 516*4882a593Smuzhiyun u32 stat_cfg; 517*4882a593Smuzhiyun u32 reserved2[50]; 518*4882a593Smuzhiyun }; 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun struct vsc9953_sys_pause_cfg { 521*4882a593Smuzhiyun u32 pause_cfg[11]; 522*4882a593Smuzhiyun u32 pause_tot_cfg; 523*4882a593Smuzhiyun u32 tail_drop_level[11]; 524*4882a593Smuzhiyun u32 tot_tail_drop_lvl; 525*4882a593Smuzhiyun u32 mac_fc_cfg[10]; 526*4882a593Smuzhiyun }; 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun struct vsc9953_sys_mmgt { 529*4882a593Smuzhiyun u16 free_cnt; 530*4882a593Smuzhiyun }; 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun struct vsc9953_system_reg { 533*4882a593Smuzhiyun struct vsc9953_sys_stat stat; 534*4882a593Smuzhiyun struct vsc9953_sys_sys sys; 535*4882a593Smuzhiyun struct vsc9953_sys_pause_cfg pause_cfg; 536*4882a593Smuzhiyun struct vsc9953_sys_mmgt mmgt; 537*4882a593Smuzhiyun }; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun /* END VSC9953 SYS structure */ 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun /* VSC9953 REW structure */ 542*4882a593Smuzhiyun 543*4882a593Smuzhiyun struct vsc9953_rew_port { 544*4882a593Smuzhiyun u32 port_vlan_cfg; 545*4882a593Smuzhiyun u32 port_tag_cfg; 546*4882a593Smuzhiyun u32 port_port_cfg; 547*4882a593Smuzhiyun u32 port_dscp_cfg; 548*4882a593Smuzhiyun u32 port_pcp_dei_qos_map_cfg[16]; 549*4882a593Smuzhiyun u32 reserved[12]; 550*4882a593Smuzhiyun }; 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun struct vsc9953_rew_common { 553*4882a593Smuzhiyun u32 reserve[4]; 554*4882a593Smuzhiyun u32 dscp_remap_dp1_cfg[64]; 555*4882a593Smuzhiyun u32 dscp_remap_cfg[64]; 556*4882a593Smuzhiyun }; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun struct vsc9953_rew_reg { 559*4882a593Smuzhiyun struct vsc9953_rew_port port[12]; 560*4882a593Smuzhiyun struct vsc9953_rew_common common; 561*4882a593Smuzhiyun }; 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun /* END VSC9953 REW structure */ 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun /* VSC9953 DEVCPU_GCB structure */ 566*4882a593Smuzhiyun 567*4882a593Smuzhiyun struct vsc9953_chip_regs { 568*4882a593Smuzhiyun u32 chipd_id; 569*4882a593Smuzhiyun u32 gpr; 570*4882a593Smuzhiyun u32 soft_rst; 571*4882a593Smuzhiyun }; 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun struct vsc9953_gpio { 574*4882a593Smuzhiyun u32 gpio_out_set[10]; 575*4882a593Smuzhiyun u32 gpio_out_clr[10]; 576*4882a593Smuzhiyun u32 gpio_out[10]; 577*4882a593Smuzhiyun u32 gpio_in[10]; 578*4882a593Smuzhiyun }; 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun struct vsc9953_mii_mng { 581*4882a593Smuzhiyun u32 miimstatus; 582*4882a593Smuzhiyun u32 reserved1; 583*4882a593Smuzhiyun u32 miimcmd; 584*4882a593Smuzhiyun u32 miimdata; 585*4882a593Smuzhiyun u32 miimcfg; 586*4882a593Smuzhiyun u32 miimscan_0; 587*4882a593Smuzhiyun u32 miimscan_1; 588*4882a593Smuzhiyun u32 miiscan_lst_rslts; 589*4882a593Smuzhiyun u32 miiscan_lst_rslts_valid; 590*4882a593Smuzhiyun }; 591*4882a593Smuzhiyun 592*4882a593Smuzhiyun struct vsc9953_mii_read_scan { 593*4882a593Smuzhiyun u32 mii_scan_results_sticky[2]; 594*4882a593Smuzhiyun }; 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun struct vsc9953_devcpu_gcb { 597*4882a593Smuzhiyun struct vsc9953_chip_regs chip_regs; 598*4882a593Smuzhiyun struct vsc9953_gpio gpio; 599*4882a593Smuzhiyun struct vsc9953_mii_mng mii_mng[2]; 600*4882a593Smuzhiyun struct vsc9953_mii_read_scan mii_read_scan; 601*4882a593Smuzhiyun }; 602*4882a593Smuzhiyun 603*4882a593Smuzhiyun /* END VSC9953 DEVCPU_GCB structure */ 604*4882a593Smuzhiyun 605*4882a593Smuzhiyun /* VSC9953 IS* structure */ 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun struct vsc9953_vcap_core_cfg { 608*4882a593Smuzhiyun u32 vcap_update_ctrl; 609*4882a593Smuzhiyun u32 vcap_mv_cfg; 610*4882a593Smuzhiyun }; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun struct vsc9953_vcap { 613*4882a593Smuzhiyun struct vsc9953_vcap_core_cfg vcap_core_cfg; 614*4882a593Smuzhiyun }; 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun /* END VSC9953 IS* structure */ 617*4882a593Smuzhiyun 618*4882a593Smuzhiyun #define VSC9953_PORT_INFO_INITIALIZER(idx) \ 619*4882a593Smuzhiyun { \ 620*4882a593Smuzhiyun .enabled = 0, \ 621*4882a593Smuzhiyun .phyaddr = 0, \ 622*4882a593Smuzhiyun .index = idx, \ 623*4882a593Smuzhiyun .phy_regs = NULL, \ 624*4882a593Smuzhiyun .enet_if = PHY_INTERFACE_MODE_NONE, \ 625*4882a593Smuzhiyun .bus = NULL, \ 626*4882a593Smuzhiyun .phydev = NULL, \ 627*4882a593Smuzhiyun } 628*4882a593Smuzhiyun 629*4882a593Smuzhiyun /* Structure to describe a VSC9953 port */ 630*4882a593Smuzhiyun struct vsc9953_port_info { 631*4882a593Smuzhiyun u8 enabled; 632*4882a593Smuzhiyun u8 phyaddr; 633*4882a593Smuzhiyun int index; 634*4882a593Smuzhiyun void *phy_regs; 635*4882a593Smuzhiyun phy_interface_t enet_if; 636*4882a593Smuzhiyun struct mii_dev *bus; 637*4882a593Smuzhiyun struct phy_device *phydev; 638*4882a593Smuzhiyun }; 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun /* Structure to describe a VSC9953 switch */ 641*4882a593Smuzhiyun struct vsc9953_info { 642*4882a593Smuzhiyun struct vsc9953_port_info port[VSC9953_MAX_PORTS]; 643*4882a593Smuzhiyun }; 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun void vsc9953_init(bd_t *bis); 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun void vsc9953_port_info_set_mdio(int port_no, struct mii_dev *bus); 648*4882a593Smuzhiyun void vsc9953_port_info_set_phy_address(int port_no, int address); 649*4882a593Smuzhiyun void vsc9953_port_enable(int port_no); 650*4882a593Smuzhiyun void vsc9953_port_disable(int port_no); 651*4882a593Smuzhiyun void vsc9953_port_info_set_phy_int(int port_no, phy_interface_t phy_int); 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun #endif /* _VSC9953_H_ */ 654