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