1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*  Marvell OcteonTx2 RPM driver
3  *
4  * Copyright (C) 2020 Marvell.
5  */
6 
7 #ifndef LMAC_COMMON_H
8 #define LMAC_COMMON_H
9 
10 #include "rvu.h"
11 #include "cgx.h"
12 /**
13  * struct lmac
14  * @wq_cmd_cmplt:	waitq to keep the process blocked until cmd completion
15  * @cmd_lock:		Lock to serialize the command interface
16  * @resp:		command response
17  * @link_info:		link related information
18  * @event_cb:		callback for linkchange events
19  * @event_cb_lock:	lock for serializing callback with unregister
20  * @cmd_pend:		flag set before new command is started
21  *			flag cleared after command response is received
22  * @cgx:		parent cgx port
23  * @lmac_id:		lmac port id
24  * @name:		lmac port name
25  */
26 struct lmac {
27 	wait_queue_head_t wq_cmd_cmplt;
28 	/* Lock to serialize the command interface */
29 	struct mutex cmd_lock;
30 	u64 resp;
31 	struct cgx_link_user_info link_info;
32 	struct cgx_event_cb event_cb;
33 	/* lock for serializing callback with unregister */
34 	spinlock_t event_cb_lock;
35 	bool cmd_pend;
36 	struct cgx *cgx;
37 	u8 lmac_id;
38 	char *name;
39 };
40 
41 /* CGX & RPM has different feature set
42  * update the structure fields with different one
43  */
44 struct mac_ops {
45 	char		       *name;
46 	/* Features like RXSTAT, TXSTAT, DMAC FILTER csrs differs by fixed
47 	 * bar offset for example
48 	 * CGX DMAC_CTL0  0x1f8
49 	 * RPM DMAC_CTL0  0x4ff8
50 	 */
51 	u64			csr_offset;
52 	/* For ATF to send events to kernel, there is no dedicated interrupt
53 	 * defined hence CGX uses OVERFLOW bit in CMR_INT. RPM block supports
54 	 * SW_INT so that ATF triggers this interrupt after processing of
55 	 * requested command
56 	 */
57 	u64			int_register;
58 	u64			int_set_reg;
59 	/* lmac offset is different is RPM */
60 	u8			lmac_offset;
61 	u8			irq_offset;
62 	u8			int_ena_bit;
63 	u8			lmac_fwi;
64 	u32			fifo_len;
65 	bool			non_contiguous_serdes_lane;
66 	/* RPM & CGX differs in number of Receive/transmit stats */
67 	u8			rx_stats_cnt;
68 	u8			tx_stats_cnt;
69 	/* Incase of RPM get number of lmacs from RPMX_CMR_RX_LMACS[LMAC_EXIST]
70 	 * number of setbits in lmac_exist tells number of lmacs
71 	 */
72 	int			(*get_nr_lmacs)(void *cgx);
73 
74 	/* Register Stats related functions */
75 	int			(*mac_get_rx_stats)(void *cgx, int lmac_id,
76 						    int idx, u64 *rx_stat);
77 	int			(*mac_get_tx_stats)(void *cgx, int lmac_id,
78 						    int idx, u64 *tx_stat);
79 
80 	/* Enable LMAC Pause Frame Configuration */
81 	void			(*mac_enadis_rx_pause_fwding)(void *cgxd,
82 							      int lmac_id,
83 							      bool enable);
84 
85 	int			(*mac_get_pause_frm_status)(void *cgxd,
86 							    int lmac_id,
87 							    u8 *tx_pause,
88 							    u8 *rx_pause);
89 
90 	int			(*mac_enadis_pause_frm)(void *cgxd,
91 							int lmac_id,
92 							u8 tx_pause,
93 							u8 rx_pause);
94 
95 	void			(*mac_pause_frm_config)(void  *cgxd,
96 							int lmac_id,
97 							bool enable);
98 };
99 
100 struct cgx {
101 	void __iomem		*reg_base;
102 	struct pci_dev		*pdev;
103 	u8			cgx_id;
104 	u8			lmac_count;
105 	struct lmac		*lmac_idmap[MAX_LMAC_PER_CGX];
106 	struct			work_struct cgx_cmd_work;
107 	struct			workqueue_struct *cgx_cmd_workq;
108 	struct list_head	cgx_list;
109 	u64			hw_features;
110 	struct mac_ops		*mac_ops;
111 	unsigned long		lmac_bmap; /* bitmap of enabled lmacs */
112 	/* Lock to serialize read/write of global csrs like
113 	 * RPMX_MTI_STAT_DATA_HI_CDC etc
114 	 */
115 	struct mutex		lock;
116 };
117 
118 typedef struct cgx rpm_t;
119 
120 /* Function Declarations */
121 void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val);
122 u64 cgx_read(struct cgx *cgx, u64 lmac, u64 offset);
123 struct lmac *lmac_pdata(u8 lmac_id, struct cgx *cgx);
124 int cgx_fwi_cmd_send(u64 req, u64 *resp, struct lmac *lmac);
125 int cgx_fwi_cmd_generic(u64 req, u64 *resp, struct cgx *cgx, int lmac_id);
126 bool is_lmac_valid(struct cgx *cgx, int lmac_id);
127 struct mac_ops *rpm_get_mac_ops(void);
128 
129 #endif /* LMAC_COMMON_H */
130