Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/* Marvell CN10K RPM driver
  3 *
  4 * Copyright (C) 2020 Marvell.
  5 *
  6 */
  7
  8#ifndef LMAC_COMMON_H
  9#define LMAC_COMMON_H
 10
 11#include "rvu.h"
 12#include "cgx.h"
 13/**
 14 * struct lmac - per lmac locks and properties
 15 * @wq_cmd_cmplt:	waitq to keep the process blocked until cmd completion
 16 * @cmd_lock:		Lock to serialize the command interface
 17 * @resp:		command response
 18 * @link_info:		link related information
 19 * @mac_to_index_bmap:	Mac address to CGX table index mapping
 20 * @rx_fc_pfvf_bmap:    Receive flow control enabled netdev mapping
 21 * @tx_fc_pfvf_bmap:    Transmit flow control enabled netdev mapping
 22 * @event_cb:		callback for linkchange events
 23 * @event_cb_lock:	lock for serializing callback with unregister
 24 * @cgx:		parent cgx port
 25 * @mcast_filters_count:  Number of multicast filters installed
 26 * @lmac_id:		lmac port id
 27 * @lmac_type:	        lmac type like SGMII/XAUI
 28 * @cmd_pend:		flag set before new command is started
 29 *			flag cleared after command response is received
 30 * @name:		lmac port name
 31 */
 32struct lmac {
 33	wait_queue_head_t wq_cmd_cmplt;
 34	/* Lock to serialize the command interface */
 35	struct mutex cmd_lock;
 36	u64 resp;
 37	struct cgx_link_user_info link_info;
 38	struct rsrc_bmap mac_to_index_bmap;
 39	struct rsrc_bmap rx_fc_pfvf_bmap;
 40	struct rsrc_bmap tx_fc_pfvf_bmap;
 41	struct cgx_event_cb event_cb;
 42	/* lock for serializing callback with unregister */
 43	spinlock_t event_cb_lock;
 44	struct cgx *cgx;
 45	u8 mcast_filters_count;
 46	u8 lmac_id;
 47	u8 lmac_type;
 48	bool cmd_pend;
 49	char *name;
 50};
 51
 52/* CGX & RPM has different feature set
 53 * update the structure fields with different one
 54 */
 55struct mac_ops {
 56	char		       *name;
 57	/* Features like RXSTAT, TXSTAT, DMAC FILTER csrs differs by fixed
 58	 * bar offset for example
 59	 * CGX DMAC_CTL0  0x1f8
 60	 * RPM DMAC_CTL0  0x4ff8
 61	 */
 62	u64			csr_offset;
 63	/* For ATF to send events to kernel, there is no dedicated interrupt
 64	 * defined hence CGX uses OVERFLOW bit in CMR_INT. RPM block supports
 65	 * SW_INT so that ATF triggers this interrupt after processing of
 66	 * requested command
 67	 */
 68	u64			int_register;
 69	u64			int_set_reg;
 70	/* lmac offset is different is RPM */
 71	u8			lmac_offset;
 72	u8			irq_offset;
 73	u8			int_ena_bit;
 74	u8			lmac_fwi;
 75	u32			fifo_len;
 76	bool			non_contiguous_serdes_lane;
 77	/* RPM & CGX differs in number of Receive/transmit stats */
 78	u8			rx_stats_cnt;
 79	u8			tx_stats_cnt;
 80	/* Unlike CN10K which shares same CSR offset with CGX
 81	 * CNF10KB has different csr offset
 82	 */
 83	u64			rxid_map_offset;
 84	u8			dmac_filter_count;
 85	/* Incase of RPM get number of lmacs from RPMX_CMR_RX_LMACS[LMAC_EXIST]
 86	 * number of setbits in lmac_exist tells number of lmacs
 87	 */
 88	int			(*get_nr_lmacs)(void *cgx);
 89	u8                      (*get_lmac_type)(void *cgx, int lmac_id);
 90	u32                     (*lmac_fifo_len)(void *cgx, int lmac_id);
 91	int                     (*mac_lmac_intl_lbk)(void *cgx, int lmac_id,
 92						     bool enable);
 93	/* Register Stats related functions */
 94	int			(*mac_get_rx_stats)(void *cgx, int lmac_id,
 95						    int idx, u64 *rx_stat);
 96	int			(*mac_get_tx_stats)(void *cgx, int lmac_id,
 97						    int idx, u64 *tx_stat);
 98
 99	/* Enable LMAC Pause Frame Configuration */
100	void			(*mac_enadis_rx_pause_fwding)(void *cgxd,
101							      int lmac_id,
102							      bool enable);
103
104	int			(*mac_get_pause_frm_status)(void *cgxd,
105							    int lmac_id,
106							    u8 *tx_pause,
107							    u8 *rx_pause);
108
109	int			(*mac_enadis_pause_frm)(void *cgxd,
110							int lmac_id,
111							u8 tx_pause,
112							u8 rx_pause);
113
114	void			(*mac_pause_frm_config)(void  *cgxd,
115							int lmac_id,
116							bool enable);
117
118	/* Enable/Disable Inbound PTP */
119	void			(*mac_enadis_ptp_config)(void  *cgxd,
120							 int lmac_id,
121							 bool enable);
122
123	int			(*mac_rx_tx_enable)(void *cgxd, int lmac_id, bool enable);
124	int			(*mac_tx_enable)(void *cgxd, int lmac_id, bool enable);
125	int                     (*pfc_config)(void *cgxd, int lmac_id,
126					      u8 tx_pause, u8 rx_pause, u16 pfc_en);
127
128	int                     (*mac_get_pfc_frm_cfg)(void *cgxd, int lmac_id,
129						       u8 *tx_pause, u8 *rx_pause);
130	int			(*mac_reset)(void *cgxd, int lmac_id, u8 pf_req_flr);
131
132	/* FEC stats */
133	int			(*get_fec_stats)(void *cgxd, int lmac_id,
134						 struct cgx_fec_stats_rsp *rsp);
135};
136
137struct cgx {
138	void __iomem		*reg_base;
139	struct pci_dev		*pdev;
140	u8			cgx_id;
141	u8			lmac_count;
142	/* number of LMACs per MAC could be 4 or 8 */
143	u8			max_lmac_per_mac;
144#define MAX_LMAC_COUNT		8
145	struct lmac             *lmac_idmap[MAX_LMAC_COUNT];
146	struct			work_struct cgx_cmd_work;
147	struct			workqueue_struct *cgx_cmd_workq;
148	struct list_head	cgx_list;
149	u64			hw_features;
150	struct mac_ops		*mac_ops;
151	unsigned long		lmac_bmap; /* bitmap of enabled lmacs */
152	/* Lock to serialize read/write of global csrs like
153	 * RPMX_MTI_STAT_DATA_HI_CDC etc
154	 */
155	struct mutex		lock;
156};
157
158typedef struct cgx rpm_t;
159
160/* Function Declarations */
161void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val);
162u64 cgx_read(struct cgx *cgx, u64 lmac, u64 offset);
163struct lmac *lmac_pdata(u8 lmac_id, struct cgx *cgx);
164int cgx_fwi_cmd_send(u64 req, u64 *resp, struct lmac *lmac);
165int cgx_fwi_cmd_generic(u64 req, u64 *resp, struct cgx *cgx, int lmac_id);
166bool is_lmac_valid(struct cgx *cgx, int lmac_id);
167struct mac_ops *rpm_get_mac_ops(struct cgx *cgx);
168
169#endif /* LMAC_COMMON_H */