228 lines
7.8 KiB
C
228 lines
7.8 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||
|
/* Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
|
||
|
*/
|
||
|
|
||
|
#ifndef AM65_CPSW_QOS_H_
|
||
|
#define AM65_CPSW_QOS_H_
|
||
|
|
||
|
#include <linux/netdevice.h>
|
||
|
#include <net/pkt_sched.h>
|
||
|
|
||
|
struct am65_cpsw_common;
|
||
|
struct am65_cpsw_port;
|
||
|
|
||
|
struct am65_cpsw_est {
|
||
|
int buf;
|
||
|
/* has to be the last one */
|
||
|
struct tc_taprio_qopt_offload taprio;
|
||
|
};
|
||
|
|
||
|
struct am65_cpsw_mqprio {
|
||
|
struct tc_mqprio_qopt_offload mqprio_hw;
|
||
|
u64 max_rate_total;
|
||
|
bool shaper_en;
|
||
|
};
|
||
|
|
||
|
struct am65_cpsw_iet {
|
||
|
u8 preemptible_tcs;
|
||
|
u32 original_max_blks;
|
||
|
int verify_time_ms;
|
||
|
};
|
||
|
|
||
|
struct am65_cpsw_ale_ratelimit {
|
||
|
unsigned long cookie;
|
||
|
u64 rate_packet_ps;
|
||
|
};
|
||
|
|
||
|
struct am65_cpsw_qos {
|
||
|
struct am65_cpsw_est *est_admin;
|
||
|
struct am65_cpsw_est *est_oper;
|
||
|
ktime_t link_down_time;
|
||
|
int link_speed;
|
||
|
struct am65_cpsw_mqprio mqprio;
|
||
|
struct am65_cpsw_iet iet;
|
||
|
|
||
|
struct am65_cpsw_ale_ratelimit ale_bc_ratelimit;
|
||
|
struct am65_cpsw_ale_ratelimit ale_mc_ratelimit;
|
||
|
};
|
||
|
|
||
|
#define AM65_CPSW_REG_CTL 0x004
|
||
|
#define AM65_CPSW_PN_REG_CTL 0x004
|
||
|
#define AM65_CPSW_PN_REG_FIFO_STATUS 0x050
|
||
|
#define AM65_CPSW_PN_REG_EST_CTL 0x060
|
||
|
#define AM65_CPSW_PN_REG_PRI_CIR(pri) (0x140 + 4 * (pri))
|
||
|
#define AM65_CPSW_P0_REG_PRI_EIR(pri) (0x160 + 4 * (pri))
|
||
|
|
||
|
#define AM65_CPSW_PN_REG_CTL 0x004
|
||
|
#define AM65_CPSW_PN_REG_TX_PRI_MAP 0x018
|
||
|
#define AM65_CPSW_PN_REG_RX_PRI_MAP 0x020
|
||
|
#define AM65_CPSW_PN_REG_FIFO_STATUS 0x050
|
||
|
#define AM65_CPSW_PN_REG_EST_CTL 0x060
|
||
|
#define AM65_CPSW_PN_REG_PRI_CIR(pri) (0x140 + 4 * (pri))
|
||
|
#define AM65_CPSW_PN_REG_PRI_EIR(pri) (0x160 + 4 * (pri))
|
||
|
|
||
|
/* AM65_CPSW_REG_CTL register fields */
|
||
|
#define AM65_CPSW_CTL_EST_EN BIT(18)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_CTL register fields */
|
||
|
#define AM65_CPSW_PN_CTL_EST_PORT_EN BIT(17)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_EST_CTL register fields */
|
||
|
#define AM65_CPSW_PN_EST_ONEBUF BIT(0)
|
||
|
#define AM65_CPSW_PN_EST_BUFSEL BIT(1)
|
||
|
#define AM65_CPSW_PN_EST_TS_EN BIT(2)
|
||
|
#define AM65_CPSW_PN_EST_TS_FIRST BIT(3)
|
||
|
#define AM65_CPSW_PN_EST_ONEPRI BIT(4)
|
||
|
#define AM65_CPSW_PN_EST_TS_PRI_MSK GENMASK(7, 5)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_FIFO_STATUS register fields */
|
||
|
#define AM65_CPSW_PN_FST_TX_PRI_ACTIVE_MSK GENMASK(7, 0)
|
||
|
#define AM65_CPSW_PN_FST_TX_E_MAC_ALLOW_MSK GENMASK(15, 8)
|
||
|
#define AM65_CPSW_PN_FST_EST_CNT_ERR BIT(16)
|
||
|
#define AM65_CPSW_PN_FST_EST_ADD_ERR BIT(17)
|
||
|
#define AM65_CPSW_PN_FST_EST_BUFACT BIT(18)
|
||
|
|
||
|
/* EST FETCH COMMAND RAM */
|
||
|
#define AM65_CPSW_FETCH_RAM_CMD_NUM 0x80
|
||
|
#define AM65_CPSW_FETCH_CNT_MSK GENMASK(21, 8)
|
||
|
#define AM65_CPSW_FETCH_CNT_MAX (AM65_CPSW_FETCH_CNT_MSK >> 8)
|
||
|
#define AM65_CPSW_FETCH_CNT_OFFSET 8
|
||
|
#define AM65_CPSW_FETCH_ALLOW_MSK GENMASK(7, 0)
|
||
|
#define AM65_CPSW_FETCH_ALLOW_MAX AM65_CPSW_FETCH_ALLOW_MSK
|
||
|
|
||
|
/* number of priority queues per port FIFO */
|
||
|
#define AM65_CPSW_PN_FIFO_PRIO_NUM 8
|
||
|
|
||
|
#if IS_ENABLED(CONFIG_TI_AM65_CPSW_QOS)
|
||
|
int am65_cpsw_qos_ndo_setup_tc(struct net_device *ndev, enum tc_setup_type type,
|
||
|
void *type_data);
|
||
|
void am65_cpsw_qos_link_up(struct net_device *ndev, int link_speed);
|
||
|
void am65_cpsw_qos_link_down(struct net_device *ndev);
|
||
|
int am65_cpsw_qos_ndo_tx_p0_set_maxrate(struct net_device *ndev, int queue, u32 rate_mbps);
|
||
|
void am65_cpsw_qos_tx_p0_rate_init(struct am65_cpsw_common *common);
|
||
|
void am65_cpsw_iet_commit_preemptible_tcs(struct am65_cpsw_port *port);
|
||
|
void am65_cpsw_iet_common_enable(struct am65_cpsw_common *common);
|
||
|
#else
|
||
|
static inline int am65_cpsw_qos_ndo_setup_tc(struct net_device *ndev,
|
||
|
enum tc_setup_type type,
|
||
|
void *type_data)
|
||
|
{
|
||
|
return -EOPNOTSUPP;
|
||
|
}
|
||
|
|
||
|
static inline void am65_cpsw_qos_link_up(struct net_device *ndev,
|
||
|
int link_speed)
|
||
|
{ }
|
||
|
|
||
|
static inline void am65_cpsw_qos_link_down(struct net_device *ndev)
|
||
|
{ }
|
||
|
|
||
|
static inline int am65_cpsw_qos_ndo_tx_p0_set_maxrate(struct net_device *ndev,
|
||
|
int queue,
|
||
|
u32 rate_mbps)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static inline void am65_cpsw_qos_tx_p0_rate_init(struct am65_cpsw_common *common)
|
||
|
{ }
|
||
|
static inline void am65_cpsw_iet_commit_preemptible_tcs(struct am65_cpsw_port *port)
|
||
|
{ }
|
||
|
static inline void am65_cpsw_iet_common_enable(struct am65_cpsw_common *common)
|
||
|
{ }
|
||
|
#endif
|
||
|
|
||
|
#define AM65_CPSW_REG_CTL 0x004
|
||
|
#define AM65_CPSW_PN_REG_CTL 0x004
|
||
|
#define AM65_CPSW_PN_REG_MAX_BLKS 0x008
|
||
|
#define AM65_CPSW_PN_REG_TX_PRI_MAP 0x018
|
||
|
#define AM65_CPSW_PN_REG_RX_PRI_MAP 0x020
|
||
|
#define AM65_CPSW_PN_REG_IET_CTRL 0x040
|
||
|
#define AM65_CPSW_PN_REG_IET_STATUS 0x044
|
||
|
#define AM65_CPSW_PN_REG_IET_VERIFY 0x048
|
||
|
#define AM65_CPSW_PN_REG_FIFO_STATUS 0x050
|
||
|
#define AM65_CPSW_PN_REG_EST_CTL 0x060
|
||
|
#define AM65_CPSW_PN_REG_PRI_CIR(pri) (0x140 + 4 * (pri))
|
||
|
#define AM65_CPSW_PN_REG_PRI_EIR(pri) (0x160 + 4 * (pri))
|
||
|
|
||
|
/* AM65_CPSW_REG_CTL register fields */
|
||
|
#define AM65_CPSW_CTL_IET_EN BIT(17)
|
||
|
#define AM65_CPSW_CTL_EST_EN BIT(18)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_CTL register fields */
|
||
|
#define AM65_CPSW_PN_CTL_IET_PORT_EN BIT(16)
|
||
|
#define AM65_CPSW_PN_CTL_EST_PORT_EN BIT(17)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_EST_CTL register fields */
|
||
|
#define AM65_CPSW_PN_EST_ONEBUF BIT(0)
|
||
|
#define AM65_CPSW_PN_EST_BUFSEL BIT(1)
|
||
|
#define AM65_CPSW_PN_EST_TS_EN BIT(2)
|
||
|
#define AM65_CPSW_PN_EST_TS_FIRST BIT(3)
|
||
|
#define AM65_CPSW_PN_EST_ONEPRI BIT(4)
|
||
|
#define AM65_CPSW_PN_EST_TS_PRI_MSK GENMASK(7, 5)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_IET_CTRL register fields */
|
||
|
#define AM65_CPSW_PN_IET_MAC_PENABLE BIT(0)
|
||
|
#define AM65_CPSW_PN_IET_MAC_DISABLEVERIFY BIT(2)
|
||
|
#define AM65_CPSW_PN_IET_MAC_LINKFAIL BIT(3)
|
||
|
#define AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_MASK GENMASK(10, 8)
|
||
|
#define AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_OFFSET 8
|
||
|
#define AM65_CPSW_PN_IET_MAC_PREMPT_MASK GENMASK(23, 16)
|
||
|
#define AM65_CPSW_PN_IET_MAC_PREMPT_OFFSET 16
|
||
|
|
||
|
#define AM65_CPSW_PN_IET_MAC_SET_ADDFRAGSIZE(n) (((n) << AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_OFFSET) & \
|
||
|
AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_MASK)
|
||
|
#define AM65_CPSW_PN_IET_MAC_GET_ADDFRAGSIZE(n) (((n) & AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_MASK) >> \
|
||
|
AM65_CPSW_PN_IET_MAC_MAC_ADDFRAGSIZE_OFFSET)
|
||
|
#define AM65_CPSW_PN_IET_MAC_SET_PREEMPT(n) (((n) << AM65_CPSW_PN_IET_MAC_PREMPT_OFFSET) & \
|
||
|
AM65_CPSW_PN_IET_MAC_PREMPT_MASK)
|
||
|
#define AM65_CPSW_PN_IET_MAC_GET_PREEMPT(n) (((n) & AM65_CPSW_PN_IET_MAC_PREMPT_MASK) >> \
|
||
|
AM65_CPSW_PN_IET_MAC_PREMPT_OFFSET)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_IET_STATUS register fields */
|
||
|
#define AM65_CPSW_PN_MAC_STATUS GENMASK(3, 0)
|
||
|
#define AM65_CPSW_PN_MAC_VERIFIED BIT(0)
|
||
|
#define AM65_CPSW_PN_MAC_VERIFY_FAIL BIT(1)
|
||
|
#define AM65_CPSW_PN_MAC_RESPOND_ERR BIT(2)
|
||
|
#define AM65_CPSW_PN_MAC_VERIFY_ERR BIT(3)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_IET_VERIFY register fields */
|
||
|
#define AM65_CPSW_PN_MAC_VERIFY_CNT_MASK GENMASK(23, 0)
|
||
|
#define AM65_CPSW_PN_MAC_GET_VERIFY_CNT(n) ((n) & AM65_CPSW_PN_MAC_VERIFY_CNT_MASK)
|
||
|
/* 10 msec converted to NSEC */
|
||
|
#define AM65_CPSW_IET_VERIFY_CNT_MS (10)
|
||
|
#define AM65_CPSW_IET_VERIFY_CNT_NS (AM65_CPSW_IET_VERIFY_CNT_MS * \
|
||
|
NSEC_PER_MSEC)
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_FIFO_STATUS register fields */
|
||
|
#define AM65_CPSW_PN_FST_TX_PRI_ACTIVE_MSK GENMASK(7, 0)
|
||
|
#define AM65_CPSW_PN_FST_TX_E_MAC_ALLOW_MSK GENMASK(15, 8)
|
||
|
#define AM65_CPSW_PN_FST_EST_CNT_ERR BIT(16)
|
||
|
#define AM65_CPSW_PN_FST_EST_ADD_ERR BIT(17)
|
||
|
#define AM65_CPSW_PN_FST_EST_BUFACT BIT(18)
|
||
|
|
||
|
/* EST FETCH COMMAND RAM */
|
||
|
#define AM65_CPSW_FETCH_RAM_CMD_NUM 0x80
|
||
|
#define AM65_CPSW_FETCH_CNT_MSK GENMASK(21, 8)
|
||
|
#define AM65_CPSW_FETCH_CNT_MAX (AM65_CPSW_FETCH_CNT_MSK >> 8)
|
||
|
#define AM65_CPSW_FETCH_CNT_OFFSET 8
|
||
|
#define AM65_CPSW_FETCH_ALLOW_MSK GENMASK(7, 0)
|
||
|
#define AM65_CPSW_FETCH_ALLOW_MAX AM65_CPSW_FETCH_ALLOW_MSK
|
||
|
|
||
|
/* AM65_CPSW_PN_REG_MAX_BLKS fields for IET and No IET cases */
|
||
|
/* 7 blocks for pn_rx_max_blks, 13 for pn_tx_max_blks*/
|
||
|
#define AM65_CPSW_PN_TX_RX_MAX_BLKS_IET 0xD07
|
||
|
|
||
|
/* Slave IET Stats. register offsets */
|
||
|
#define AM65_CPSW_STATN_IET_RX_ASSEMBLY_ERROR 0x140
|
||
|
#define AM65_CPSW_STATN_IET_RX_ASSEMBLY_OK 0x144
|
||
|
#define AM65_CPSW_STATN_IET_RX_SMD_ERROR 0x148
|
||
|
#define AM65_CPSW_STATN_IET_RX_FRAG 0x14c
|
||
|
#define AM65_CPSW_STATN_IET_TX_HOLD 0x150
|
||
|
#define AM65_CPSW_STATN_IET_TX_FRAG 0x154
|
||
|
|
||
|
/* number of priority queues per port FIFO */
|
||
|
#define AM65_CPSW_PN_FIFO_PRIO_NUM 8
|
||
|
|
||
|
#endif /* AM65_CPSW_QOS_H_ */
|