Commit 15bc8121 authored by Shinas Rasheed's avatar Shinas Rasheed Committed by David S. Miller

octeon_ep: set backpressure watermark for RX queues

Set backpressure watermark for hardware RX queues. Backpressure
gets triggered when the available buffers of a hardware RX queue
falls below the set watermark. This backpressure will propagate
to packet processing pipeline in the OCTEON card, so that the host
receives fewer packets and prevents packet dropping at host.
Signed-off-by: default avatarShinas Rasheed <srasheed@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0cd523ee
...@@ -258,6 +258,7 @@ static void octep_init_config_cnxk_pf(struct octep_device *oct) ...@@ -258,6 +258,7 @@ static void octep_init_config_cnxk_pf(struct octep_device *oct)
conf->oq.refill_threshold = OCTEP_OQ_REFILL_THRESHOLD; conf->oq.refill_threshold = OCTEP_OQ_REFILL_THRESHOLD;
conf->oq.oq_intr_pkt = OCTEP_OQ_INTR_PKT_THRESHOLD; conf->oq.oq_intr_pkt = OCTEP_OQ_INTR_PKT_THRESHOLD;
conf->oq.oq_intr_time = OCTEP_OQ_INTR_TIME_THRESHOLD; conf->oq.oq_intr_time = OCTEP_OQ_INTR_TIME_THRESHOLD;
conf->oq.wmark = OCTEP_OQ_WMARK_MIN;
conf->msix_cfg.non_ioq_msix = CNXK_NUM_NON_IOQ_INTR; conf->msix_cfg.non_ioq_msix = CNXK_NUM_NON_IOQ_INTR;
conf->msix_cfg.ioq_msix = conf->pf_ring_cfg.active_io_rings; conf->msix_cfg.ioq_msix = conf->pf_ring_cfg.active_io_rings;
...@@ -378,6 +379,12 @@ static void octep_setup_oq_regs_cnxk_pf(struct octep_device *oct, int oq_no) ...@@ -378,6 +379,12 @@ static void octep_setup_oq_regs_cnxk_pf(struct octep_device *oct, int oq_no)
reg_val = ((u64)time_threshold << 32) | reg_val = ((u64)time_threshold << 32) |
CFG_GET_OQ_INTR_PKT(oct->conf); CFG_GET_OQ_INTR_PKT(oct->conf);
octep_write_csr64(oct, CNXK_SDP_R_OUT_INT_LEVELS(oq_no), reg_val); octep_write_csr64(oct, CNXK_SDP_R_OUT_INT_LEVELS(oq_no), reg_val);
/* set watermark for backpressure */
reg_val = octep_read_csr64(oct, CNXK_SDP_R_OUT_WMARK(oq_no));
reg_val &= ~0xFFFFFFFFULL;
reg_val |= CFG_GET_OQ_WMARK(oct->conf);
octep_write_csr64(oct, CNXK_SDP_R_OUT_WMARK(oq_no), reg_val);
} }
/* Setup registers for a PF mailbox */ /* Setup registers for a PF mailbox */
......
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
/* Packet threshold for Tx queue interrupt */ /* Packet threshold for Tx queue interrupt */
#define OCTEP_IQ_INTR_THRESHOLD 0x0 #define OCTEP_IQ_INTR_THRESHOLD 0x0
/* Minimum watermark for backpressure */
#define OCTEP_OQ_WMARK_MIN 256
/* Rx Queue: maximum descriptors per ring */ /* Rx Queue: maximum descriptors per ring */
#define OCTEP_OQ_MAX_DESCRIPTORS 1024 #define OCTEP_OQ_MAX_DESCRIPTORS 1024
...@@ -67,6 +70,7 @@ ...@@ -67,6 +70,7 @@
#define CFG_GET_OQ_REFILL_THRESHOLD(cfg) ((cfg)->oq.refill_threshold) #define CFG_GET_OQ_REFILL_THRESHOLD(cfg) ((cfg)->oq.refill_threshold)
#define CFG_GET_OQ_INTR_PKT(cfg) ((cfg)->oq.oq_intr_pkt) #define CFG_GET_OQ_INTR_PKT(cfg) ((cfg)->oq.oq_intr_pkt)
#define CFG_GET_OQ_INTR_TIME(cfg) ((cfg)->oq.oq_intr_time) #define CFG_GET_OQ_INTR_TIME(cfg) ((cfg)->oq.oq_intr_time)
#define CFG_GET_OQ_WMARK(cfg) ((cfg)->oq.wmark)
#define CFG_GET_PORTS_MAX_IO_RINGS(cfg) ((cfg)->pf_ring_cfg.max_io_rings) #define CFG_GET_PORTS_MAX_IO_RINGS(cfg) ((cfg)->pf_ring_cfg.max_io_rings)
#define CFG_GET_PORTS_ACTIVE_IO_RINGS(cfg) ((cfg)->pf_ring_cfg.active_io_rings) #define CFG_GET_PORTS_ACTIVE_IO_RINGS(cfg) ((cfg)->pf_ring_cfg.active_io_rings)
...@@ -136,6 +140,12 @@ struct octep_oq_config { ...@@ -136,6 +140,12 @@ struct octep_oq_config {
* default. The time is specified in microseconds. * default. The time is specified in microseconds.
*/ */
u32 oq_intr_time; u32 oq_intr_time;
/* Water mark for backpressure.
* Output queue sends backpressure signal to source when
* free buffer count falls below wmark.
*/
u32 wmark;
}; };
/* Tx/Rx configuration */ /* Tx/Rx configuration */
......
...@@ -143,6 +143,9 @@ ...@@ -143,6 +143,9 @@
#define CNXK_SDP_R_OUT_SLIST_DBELL(ring) \ #define CNXK_SDP_R_OUT_SLIST_DBELL(ring) \
(CNXK_SDP_R_OUT_SLIST_DBELL_START + ((ring) * CNXK_RING_OFFSET)) (CNXK_SDP_R_OUT_SLIST_DBELL_START + ((ring) * CNXK_RING_OFFSET))
#define CNXK_SDP_R_OUT_WMARK(ring) \
(CNXK_SDP_R_OUT_WMARK_START + ((ring) * CNXK_RING_OFFSET))
#define CNXK_SDP_R_OUT_CNTS(ring) \ #define CNXK_SDP_R_OUT_CNTS(ring) \
(CNXK_SDP_R_OUT_CNTS_START + ((ring) * CNXK_RING_OFFSET)) (CNXK_SDP_R_OUT_CNTS_START + ((ring) * CNXK_RING_OFFSET))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment