• Ivan Khoronzhuk's avatar
    ethernet: ti: am65-cpsw-qos: add TAPRIO offload support · 8127224c
    Ivan Khoronzhuk authored
    AM65 CPSW h/w supports Enhanced Scheduled Traffic (EST – defined
    in P802.1Qbv/D2.2 that later got included in IEEE 802.1Q-2018)
    configuration. EST allows express queue traffic to be scheduled
    (placed) on the wire at specific repeatable time intervals. In
    Linux kernel, EST configuration is done through tc command and
    the taprio scheduler in the net core implements a software only
    scheduler (SCH_TAPRIO). If the NIC is capable of EST configuration,
    user indicate "flag 2" in the command which is then parsed by
    taprio scheduler in net core and indicate that the command is to
    be offloaded to h/w. taprio then offloads the command to the
    driver by calling ndo_setup_tc() ndo ops. This patch implements
    ndo_setup_tc() to offload EST configuration to CPSW h/w.
    
    Currently driver supports only SetGateStates operation. EST
    operates on a repeating time interval generated by the CPTS EST
    function generator. Each Ethernet port has a global EST fetch
    RAM that can be configured as 2 buffers, each of 64 locations
    or one large buffer of 128 locations. In 2 buffer configuration,
    a ping pong mechanism is used to hold the active schedule (oper)
    in one buffer and new (admin) command in the other. Each 22-bit
    fetch command consists of a 14-bit fetch count (14 MSB’s) and an
    8-bit priority fetch allow (8 LSB’s) that will be applied for the
    fetch count time in wireside clocks. Driver process each of the
    sched-entry in the offload command and update the fetch RAM.
    Driver configures duration in sched-entry into the fetch count
    and Gate mask into the priority fetch bits of the RAM. Then
    configures the CPTS EST function generator to activate the
    schedule. Currently driver supports only 2 buffer configuration
    which means driver supports a max cycle time of ~8 msec.
    
    CPSW supports a configurable number of priority queues (up to 8)
    and needs to be switched to this mode from the default round
    robin mode before EST can be offloaded. User configures
    these through ethtool commands (-L for changing number of
    queues and --set-priv-flags to disable round robin mode).
    Driver doesn't enable EST if pf_p0_rx_ptype_rrobin privat flag
    is set. The flag is common for all ports, and so can't be just
    overridden by taprio configuration w/o user involvement.
    Command fails if pf_p0_rx_ptype_rrobin is already set in the
    driver.
    
    Scheds (commands) configuration depends on interface speed so
    driver translates the duration to the fetch count based on
    link speed. Each schedule can be constructed with several
    command entries in fetch RAM  depending on interval. For example
    if each sched has timer interval < ~130us on 1000 Mb link then
    each sched consumes one command and have 1:1 mapping. When
    Ethernet link goes down, driver purge the configuration if link
    is down for more than 1 second.
    
    The patch allows to update the timer and scheds memory only if it's
    really needed, and skip cases required the user to stop timer by
    configuring only shceds memory.
    Signed-off-by: default avatarIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>
    Signed-off-by: default avatarMurali Karicheri <m-karicheri2@ti.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8127224c
am65-cpsw-nuss.c 57.6 KB