File Index
Files and directories
Sign in
FILE

gve_dqo.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/google/gve/gve_dqo.h C
  1/* SPDX-License-Identifier: (GPL-2.0 OR MIT)
  2 * Google virtual Ethernet (gve) driver
  3 *
  4 * Copyright (C) 2015-2021 Google, Inc.
  5 */
  6
  7#ifndef _GVE_DQO_H_
  8#define _GVE_DQO_H_
  9
 10#include "gve_adminq.h"
 11
 12#define GVE_ITR_ENABLE_BIT_DQO BIT(0)
 13#define GVE_ITR_CLEAR_PBA_BIT_DQO BIT(1)
 14#define GVE_ITR_NO_UPDATE_DQO (3 << 3)
 15
 16#define GVE_ITR_INTERVAL_DQO_SHIFT 5
 17#define GVE_ITR_INTERVAL_DQO_MASK ((1 << 12) - 1)
 18
 19#define GVE_TX_IRQ_RATELIMIT_US_DQO 50
 20#define GVE_RX_IRQ_RATELIMIT_US_DQO 20
 21#define GVE_MAX_ITR_INTERVAL_DQO (GVE_ITR_INTERVAL_DQO_MASK * 2)
 22
 23/* Timeout in seconds to wait for a reinjection completion after receiving
 24 * its corresponding miss completion.
 25 */
 26#define GVE_REINJECT_COMPL_TIMEOUT 1
 27
 28/* Timeout in seconds to deallocate the completion tag for a packet that was
 29 * prematurely freed for not receiving a valid completion. This should be large
 30 * enough to rule out the possibility of receiving the corresponding valid
 31 * completion after this interval.
 32 */
 33#define GVE_DEALLOCATE_COMPL_TIMEOUT 60
 34
 35netdev_tx_t gve_tx_dqo(struct sk_buff *skb, struct net_device *dev);
 36netdev_features_t gve_features_check_dqo(struct sk_buff *skb,
 37					 struct net_device *dev,
 38					 netdev_features_t features);
 39int gve_xdp_rx_timestamp(const struct xdp_md *_ctx, u64 *timestamp);
 40bool gve_tx_poll_dqo(struct gve_notify_block *block, bool do_clean);
 41bool gve_xdp_poll_dqo(struct gve_notify_block *block);
 42bool gve_xsk_tx_poll_dqo(struct gve_notify_block *block, int budget);
 43int gve_rx_poll_dqo(struct gve_notify_block *block, int budget);
 44int gve_tx_alloc_rings_dqo(struct gve_priv *priv,
 45			   struct gve_tx_alloc_rings_cfg *cfg);
 46void gve_tx_free_rings_dqo(struct gve_priv *priv,
 47			   struct gve_tx_alloc_rings_cfg *cfg);
 48void gve_tx_start_ring_dqo(struct gve_priv *priv, int idx);
 49void gve_tx_stop_ring_dqo(struct gve_priv *priv, int idx);
 50int gve_rx_alloc_ring_dqo(struct gve_priv *priv,
 51			  struct gve_rx_alloc_rings_cfg *cfg,
 52			  struct gve_rx_ring *rx,
 53			  int idx);
 54void gve_rx_free_ring_dqo(struct gve_priv *priv, struct gve_rx_ring *rx,
 55			  struct gve_rx_alloc_rings_cfg *cfg);
 56int gve_rx_alloc_rings_dqo(struct gve_priv *priv,
 57			   struct gve_rx_alloc_rings_cfg *cfg);
 58void gve_rx_free_rings_dqo(struct gve_priv *priv,
 59			   struct gve_rx_alloc_rings_cfg *cfg);
 60void gve_rx_start_ring_dqo(struct gve_priv *priv, int idx);
 61void gve_rx_stop_ring_dqo(struct gve_priv *priv, int idx);
 62int gve_clean_tx_done_dqo(struct gve_priv *priv, struct gve_tx_ring *tx,
 63			  struct napi_struct *napi);
 64void gve_rx_post_buffers_dqo(struct gve_rx_ring *rx);
 65void gve_rx_write_doorbell_dqo(const struct gve_priv *priv, int queue_idx);
 66void gve_xdp_tx_flush_dqo(struct gve_priv *priv, u32 xdp_qid);
 67
 68static inline void
 69gve_tx_put_doorbell_dqo(const struct gve_priv *priv,
 70			const struct gve_queue_resources *q_resources, u32 val)
 71{
 72	u64 index;
 73
 74	index = be32_to_cpu(q_resources->db_index);
 75	iowrite32(val, &priv->db_bar2[index]);
 76}
 77
 78/* Builds register value to write to DQO IRQ doorbell to enable with specified
 79 * ITR interval.
 80 */
 81static inline u32 gve_setup_itr_interval_dqo(u32 interval_us)
 82{
 83	u32 result = GVE_ITR_ENABLE_BIT_DQO;
 84
 85	/* Interval has 2us granularity. */
 86	interval_us >>= 1;
 87
 88	interval_us &= GVE_ITR_INTERVAL_DQO_MASK;
 89	result |= (interval_us << GVE_ITR_INTERVAL_DQO_SHIFT);
 90
 91	return result;
 92}
 93
 94static inline void
 95gve_write_irq_doorbell_dqo(const struct gve_priv *priv,
 96			   const struct gve_notify_block *block, u32 val)
 97{
 98	u32 index = be32_to_cpu(*block->irq_db_index);
 99
100	iowrite32(val, &priv->db_bar2[index]);
101}
102
103/* Sets interrupt throttling interval and enables interrupt
104 * by writing to IRQ doorbell.
105 */
106static inline void
107gve_set_itr_coalesce_usecs_dqo(struct gve_priv *priv,
108			       struct gve_notify_block *block,
109			       u32 usecs)
110{
111	gve_write_irq_doorbell_dqo(priv, block,
112				   gve_setup_itr_interval_dqo(usecs));
113}
114
115int gve_napi_poll_dqo(struct napi_struct *napi, int budget);
116#endif /* _GVE_DQO_H_ */
~/ Read-only file preview.