Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 1 | // SPDX-License-Identifier: (GPL-2.0 OR MIT) |
| 2 | // Copyright (c) 2018 Synopsys, Inc. and/or its affiliates. |
| 3 | // stmmac HW Interface Callbacks |
| 4 | |
| 5 | #ifndef __STMMAC_HWIF_H__ |
| 6 | #define __STMMAC_HWIF_H__ |
| 7 | |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 8 | #include <linux/netdevice.h> |
| 9 | |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 10 | #define stmmac_do_void_callback(__priv, __module, __cname, __arg0, __args...) \ |
| 11 | ({ \ |
| 12 | int __result = -EINVAL; \ |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 13 | if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) { \ |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 14 | (__priv)->hw->__module->__cname((__arg0), ##__args); \ |
| 15 | __result = 0; \ |
| 16 | } \ |
| 17 | __result; \ |
| 18 | }) |
| 19 | #define stmmac_do_callback(__priv, __module, __cname, __arg0, __args...) \ |
| 20 | ({ \ |
| 21 | int __result = -EINVAL; \ |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 22 | if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) \ |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 23 | __result = (__priv)->hw->__module->__cname((__arg0), ##__args); \ |
| 24 | __result; \ |
| 25 | }) |
| 26 | |
| 27 | struct stmmac_extra_stats; |
| 28 | struct stmmac_safety_stats; |
| 29 | struct dma_desc; |
| 30 | struct dma_extended_desc; |
| 31 | |
| 32 | /* Descriptors helpers */ |
| 33 | struct stmmac_desc_ops { |
| 34 | /* DMA RX descriptor ring initialization */ |
| 35 | void (*init_rx_desc)(struct dma_desc *p, int disable_rx_ic, int mode, |
| 36 | int end); |
| 37 | /* DMA TX descriptor ring initialization */ |
| 38 | void (*init_tx_desc)(struct dma_desc *p, int mode, int end); |
| 39 | /* Invoked by the xmit function to prepare the tx descriptor */ |
| 40 | void (*prepare_tx_desc)(struct dma_desc *p, int is_fs, int len, |
| 41 | bool csum_flag, int mode, bool tx_own, bool ls, |
| 42 | unsigned int tot_pkt_len); |
| 43 | void (*prepare_tso_tx_desc)(struct dma_desc *p, int is_fs, int len1, |
| 44 | int len2, bool tx_own, bool ls, unsigned int tcphdrlen, |
| 45 | unsigned int tcppayloadlen); |
| 46 | /* Set/get the owner of the descriptor */ |
| 47 | void (*set_tx_owner)(struct dma_desc *p); |
| 48 | int (*get_tx_owner)(struct dma_desc *p); |
| 49 | /* Clean the tx descriptor as soon as the tx irq is received */ |
| 50 | void (*release_tx_desc)(struct dma_desc *p, int mode); |
| 51 | /* Clear interrupt on tx frame completion. When this bit is |
| 52 | * set an interrupt happens as soon as the frame is transmitted */ |
| 53 | void (*set_tx_ic)(struct dma_desc *p); |
| 54 | /* Last tx segment reports the transmit status */ |
| 55 | int (*get_tx_ls)(struct dma_desc *p); |
| 56 | /* Return the transmit status looking at the TDES1 */ |
| 57 | int (*tx_status)(void *data, struct stmmac_extra_stats *x, |
| 58 | struct dma_desc *p, void __iomem *ioaddr); |
| 59 | /* Get the buffer size from the descriptor */ |
| 60 | int (*get_tx_len)(struct dma_desc *p); |
| 61 | /* Handle extra events on specific interrupts hw dependent */ |
Jose Abreu | 357951c | 2018-05-18 14:56:07 +0100 | [diff] [blame] | 62 | void (*set_rx_owner)(struct dma_desc *p, int disable_rx_ic); |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 63 | /* Get the receive frame size */ |
| 64 | int (*get_rx_frame_len)(struct dma_desc *p, int rx_coe_type); |
| 65 | /* Return the reception status looking at the RDES1 */ |
| 66 | int (*rx_status)(void *data, struct stmmac_extra_stats *x, |
| 67 | struct dma_desc *p); |
| 68 | void (*rx_extended_status)(void *data, struct stmmac_extra_stats *x, |
| 69 | struct dma_extended_desc *p); |
| 70 | /* Set tx timestamp enable bit */ |
| 71 | void (*enable_tx_timestamp) (struct dma_desc *p); |
| 72 | /* get tx timestamp status */ |
| 73 | int (*get_tx_timestamp_status) (struct dma_desc *p); |
| 74 | /* get timestamp value */ |
| 75 | void (*get_timestamp)(void *desc, u32 ats, u64 *ts); |
| 76 | /* get rx timestamp status */ |
| 77 | int (*get_rx_timestamp_status)(void *desc, void *next_desc, u32 ats); |
| 78 | /* Display ring */ |
| 79 | void (*display_ring)(void *head, unsigned int size, bool rx); |
| 80 | /* set MSS via context descriptor */ |
| 81 | void (*set_mss)(struct dma_desc *p, unsigned int mss); |
Jose Abreu | d2df9ea | 2018-05-18 14:56:08 +0100 | [diff] [blame] | 82 | /* get descriptor skbuff address */ |
| 83 | void (*get_addr)(struct dma_desc *p, unsigned int *addr); |
Jose Abreu | 6844171 | 2018-05-18 14:56:00 +0100 | [diff] [blame] | 84 | /* set descriptor skbuff address */ |
| 85 | void (*set_addr)(struct dma_desc *p, dma_addr_t addr); |
Jose Abreu | 44c67f8 | 2018-05-18 14:56:01 +0100 | [diff] [blame] | 86 | /* clear descriptor */ |
| 87 | void (*clear)(struct dma_desc *p); |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 88 | }; |
| 89 | |
| 90 | #define stmmac_init_rx_desc(__priv, __args...) \ |
| 91 | stmmac_do_void_callback(__priv, desc, init_rx_desc, __args) |
| 92 | #define stmmac_init_tx_desc(__priv, __args...) \ |
| 93 | stmmac_do_void_callback(__priv, desc, init_tx_desc, __args) |
| 94 | #define stmmac_prepare_tx_desc(__priv, __args...) \ |
| 95 | stmmac_do_void_callback(__priv, desc, prepare_tx_desc, __args) |
| 96 | #define stmmac_prepare_tso_tx_desc(__priv, __args...) \ |
| 97 | stmmac_do_void_callback(__priv, desc, prepare_tso_tx_desc, __args) |
| 98 | #define stmmac_set_tx_owner(__priv, __args...) \ |
| 99 | stmmac_do_void_callback(__priv, desc, set_tx_owner, __args) |
| 100 | #define stmmac_get_tx_owner(__priv, __args...) \ |
| 101 | stmmac_do_callback(__priv, desc, get_tx_owner, __args) |
| 102 | #define stmmac_release_tx_desc(__priv, __args...) \ |
| 103 | stmmac_do_void_callback(__priv, desc, release_tx_desc, __args) |
| 104 | #define stmmac_set_tx_ic(__priv, __args...) \ |
| 105 | stmmac_do_void_callback(__priv, desc, set_tx_ic, __args) |
| 106 | #define stmmac_get_tx_ls(__priv, __args...) \ |
| 107 | stmmac_do_callback(__priv, desc, get_tx_ls, __args) |
| 108 | #define stmmac_tx_status(__priv, __args...) \ |
| 109 | stmmac_do_callback(__priv, desc, tx_status, __args) |
| 110 | #define stmmac_get_tx_len(__priv, __args...) \ |
| 111 | stmmac_do_callback(__priv, desc, get_tx_len, __args) |
| 112 | #define stmmac_set_rx_owner(__priv, __args...) \ |
| 113 | stmmac_do_void_callback(__priv, desc, set_rx_owner, __args) |
| 114 | #define stmmac_get_rx_frame_len(__priv, __args...) \ |
| 115 | stmmac_do_callback(__priv, desc, get_rx_frame_len, __args) |
| 116 | #define stmmac_rx_status(__priv, __args...) \ |
| 117 | stmmac_do_callback(__priv, desc, rx_status, __args) |
| 118 | #define stmmac_rx_extended_status(__priv, __args...) \ |
| 119 | stmmac_do_void_callback(__priv, desc, rx_extended_status, __args) |
| 120 | #define stmmac_enable_tx_timestamp(__priv, __args...) \ |
| 121 | stmmac_do_void_callback(__priv, desc, enable_tx_timestamp, __args) |
| 122 | #define stmmac_get_tx_timestamp_status(__priv, __args...) \ |
| 123 | stmmac_do_callback(__priv, desc, get_tx_timestamp_status, __args) |
| 124 | #define stmmac_get_timestamp(__priv, __args...) \ |
| 125 | stmmac_do_void_callback(__priv, desc, get_timestamp, __args) |
| 126 | #define stmmac_get_rx_timestamp_status(__priv, __args...) \ |
| 127 | stmmac_do_callback(__priv, desc, get_rx_timestamp_status, __args) |
| 128 | #define stmmac_display_ring(__priv, __args...) \ |
| 129 | stmmac_do_void_callback(__priv, desc, display_ring, __args) |
| 130 | #define stmmac_set_mss(__priv, __args...) \ |
| 131 | stmmac_do_void_callback(__priv, desc, set_mss, __args) |
Jose Abreu | d2df9ea | 2018-05-18 14:56:08 +0100 | [diff] [blame] | 132 | #define stmmac_get_desc_addr(__priv, __args...) \ |
| 133 | stmmac_do_void_callback(__priv, desc, get_addr, __args) |
Jose Abreu | 6844171 | 2018-05-18 14:56:00 +0100 | [diff] [blame] | 134 | #define stmmac_set_desc_addr(__priv, __args...) \ |
| 135 | stmmac_do_void_callback(__priv, desc, set_addr, __args) |
Jose Abreu | 44c67f8 | 2018-05-18 14:56:01 +0100 | [diff] [blame] | 136 | #define stmmac_clear_desc(__priv, __args...) \ |
| 137 | stmmac_do_void_callback(__priv, desc, clear, __args) |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 138 | |
Jose Abreu | a4e887f | 2018-04-16 16:08:13 +0100 | [diff] [blame] | 139 | struct stmmac_dma_cfg; |
| 140 | struct dma_features; |
| 141 | |
| 142 | /* Specific DMA helpers */ |
| 143 | struct stmmac_dma_ops { |
| 144 | /* DMA core initialization */ |
| 145 | int (*reset)(void __iomem *ioaddr); |
| 146 | void (*init)(void __iomem *ioaddr, struct stmmac_dma_cfg *dma_cfg, |
Jose Abreu | 24aaed0 | 2018-05-18 14:56:05 +0100 | [diff] [blame] | 147 | int atds); |
Jose Abreu | a4e887f | 2018-04-16 16:08:13 +0100 | [diff] [blame] | 148 | void (*init_chan)(void __iomem *ioaddr, |
| 149 | struct stmmac_dma_cfg *dma_cfg, u32 chan); |
| 150 | void (*init_rx_chan)(void __iomem *ioaddr, |
| 151 | struct stmmac_dma_cfg *dma_cfg, |
| 152 | u32 dma_rx_phy, u32 chan); |
| 153 | void (*init_tx_chan)(void __iomem *ioaddr, |
| 154 | struct stmmac_dma_cfg *dma_cfg, |
| 155 | u32 dma_tx_phy, u32 chan); |
| 156 | /* Configure the AXI Bus Mode Register */ |
| 157 | void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi); |
| 158 | /* Dump DMA registers */ |
| 159 | void (*dump_regs)(void __iomem *ioaddr, u32 *reg_space); |
Jose Abreu | a4e887f | 2018-04-16 16:08:13 +0100 | [diff] [blame] | 160 | void (*dma_rx_mode)(void __iomem *ioaddr, int mode, u32 channel, |
| 161 | int fifosz, u8 qmode); |
| 162 | void (*dma_tx_mode)(void __iomem *ioaddr, int mode, u32 channel, |
| 163 | int fifosz, u8 qmode); |
| 164 | /* To track extra statistic (if supported) */ |
| 165 | void (*dma_diagnostic_fr) (void *data, struct stmmac_extra_stats *x, |
| 166 | void __iomem *ioaddr); |
| 167 | void (*enable_dma_transmission) (void __iomem *ioaddr); |
| 168 | void (*enable_dma_irq)(void __iomem *ioaddr, u32 chan); |
| 169 | void (*disable_dma_irq)(void __iomem *ioaddr, u32 chan); |
| 170 | void (*start_tx)(void __iomem *ioaddr, u32 chan); |
| 171 | void (*stop_tx)(void __iomem *ioaddr, u32 chan); |
| 172 | void (*start_rx)(void __iomem *ioaddr, u32 chan); |
| 173 | void (*stop_rx)(void __iomem *ioaddr, u32 chan); |
| 174 | int (*dma_interrupt) (void __iomem *ioaddr, |
| 175 | struct stmmac_extra_stats *x, u32 chan); |
| 176 | /* If supported then get the optional core features */ |
| 177 | void (*get_hw_feature)(void __iomem *ioaddr, |
| 178 | struct dma_features *dma_cap); |
| 179 | /* Program the HW RX Watchdog */ |
| 180 | void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt, u32 number_chan); |
| 181 | void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan); |
| 182 | void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan); |
| 183 | void (*set_rx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan); |
| 184 | void (*set_tx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan); |
| 185 | void (*enable_tso)(void __iomem *ioaddr, bool en, u32 chan); |
| 186 | }; |
| 187 | |
| 188 | #define stmmac_reset(__priv, __args...) \ |
| 189 | stmmac_do_callback(__priv, dma, reset, __args) |
| 190 | #define stmmac_dma_init(__priv, __args...) \ |
| 191 | stmmac_do_void_callback(__priv, dma, init, __args) |
| 192 | #define stmmac_init_chan(__priv, __args...) \ |
| 193 | stmmac_do_void_callback(__priv, dma, init_chan, __args) |
| 194 | #define stmmac_init_rx_chan(__priv, __args...) \ |
| 195 | stmmac_do_void_callback(__priv, dma, init_rx_chan, __args) |
| 196 | #define stmmac_init_tx_chan(__priv, __args...) \ |
| 197 | stmmac_do_void_callback(__priv, dma, init_tx_chan, __args) |
| 198 | #define stmmac_axi(__priv, __args...) \ |
| 199 | stmmac_do_void_callback(__priv, dma, axi, __args) |
| 200 | #define stmmac_dump_dma_regs(__priv, __args...) \ |
| 201 | stmmac_do_void_callback(__priv, dma, dump_regs, __args) |
Jose Abreu | a4e887f | 2018-04-16 16:08:13 +0100 | [diff] [blame] | 202 | #define stmmac_dma_rx_mode(__priv, __args...) \ |
| 203 | stmmac_do_void_callback(__priv, dma, dma_rx_mode, __args) |
| 204 | #define stmmac_dma_tx_mode(__priv, __args...) \ |
| 205 | stmmac_do_void_callback(__priv, dma, dma_tx_mode, __args) |
| 206 | #define stmmac_dma_diagnostic_fr(__priv, __args...) \ |
| 207 | stmmac_do_void_callback(__priv, dma, dma_diagnostic_fr, __args) |
| 208 | #define stmmac_enable_dma_transmission(__priv, __args...) \ |
| 209 | stmmac_do_void_callback(__priv, dma, enable_dma_transmission, __args) |
| 210 | #define stmmac_enable_dma_irq(__priv, __args...) \ |
| 211 | stmmac_do_void_callback(__priv, dma, enable_dma_irq, __args) |
| 212 | #define stmmac_disable_dma_irq(__priv, __args...) \ |
| 213 | stmmac_do_void_callback(__priv, dma, disable_dma_irq, __args) |
| 214 | #define stmmac_start_tx(__priv, __args...) \ |
| 215 | stmmac_do_void_callback(__priv, dma, start_tx, __args) |
| 216 | #define stmmac_stop_tx(__priv, __args...) \ |
| 217 | stmmac_do_void_callback(__priv, dma, stop_tx, __args) |
| 218 | #define stmmac_start_rx(__priv, __args...) \ |
| 219 | stmmac_do_void_callback(__priv, dma, start_rx, __args) |
| 220 | #define stmmac_stop_rx(__priv, __args...) \ |
| 221 | stmmac_do_void_callback(__priv, dma, stop_rx, __args) |
| 222 | #define stmmac_dma_interrupt_status(__priv, __args...) \ |
| 223 | stmmac_do_callback(__priv, dma, dma_interrupt, __args) |
| 224 | #define stmmac_get_hw_feature(__priv, __args...) \ |
| 225 | stmmac_do_void_callback(__priv, dma, get_hw_feature, __args) |
| 226 | #define stmmac_rx_watchdog(__priv, __args...) \ |
| 227 | stmmac_do_void_callback(__priv, dma, rx_watchdog, __args) |
| 228 | #define stmmac_set_tx_ring_len(__priv, __args...) \ |
| 229 | stmmac_do_void_callback(__priv, dma, set_tx_ring_len, __args) |
| 230 | #define stmmac_set_rx_ring_len(__priv, __args...) \ |
| 231 | stmmac_do_void_callback(__priv, dma, set_rx_ring_len, __args) |
| 232 | #define stmmac_set_rx_tail_ptr(__priv, __args...) \ |
| 233 | stmmac_do_void_callback(__priv, dma, set_rx_tail_ptr, __args) |
| 234 | #define stmmac_set_tx_tail_ptr(__priv, __args...) \ |
| 235 | stmmac_do_void_callback(__priv, dma, set_tx_tail_ptr, __args) |
| 236 | #define stmmac_enable_tso(__priv, __args...) \ |
| 237 | stmmac_do_void_callback(__priv, dma, enable_tso, __args) |
| 238 | |
Jose Abreu | c10d4c8 | 2018-04-16 16:08:14 +0100 | [diff] [blame] | 239 | struct mac_device_info; |
| 240 | struct net_device; |
| 241 | struct rgmii_adv; |
| 242 | struct stmmac_safety_stats; |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 243 | struct stmmac_tc_entry; |
Jose Abreu | 9a8a02c | 2018-05-31 18:01:27 +0100 | [diff] [blame] | 244 | struct stmmac_pps_cfg; |
Jose Abreu | c10d4c8 | 2018-04-16 16:08:14 +0100 | [diff] [blame] | 245 | |
| 246 | /* Helpers to program the MAC core */ |
| 247 | struct stmmac_ops { |
| 248 | /* MAC core initialization */ |
| 249 | void (*core_init)(struct mac_device_info *hw, struct net_device *dev); |
| 250 | /* Enable the MAC RX/TX */ |
| 251 | void (*set_mac)(void __iomem *ioaddr, bool enable); |
| 252 | /* Enable and verify that the IPC module is supported */ |
| 253 | int (*rx_ipc)(struct mac_device_info *hw); |
| 254 | /* Enable RX Queues */ |
| 255 | void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue); |
| 256 | /* RX Queues Priority */ |
| 257 | void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue); |
| 258 | /* TX Queues Priority */ |
| 259 | void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue); |
| 260 | /* RX Queues Routing */ |
| 261 | void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet, |
| 262 | u32 queue); |
| 263 | /* Program RX Algorithms */ |
| 264 | void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg); |
| 265 | /* Program TX Algorithms */ |
| 266 | void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg); |
| 267 | /* Set MTL TX queues weight */ |
| 268 | void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw, |
| 269 | u32 weight, u32 queue); |
| 270 | /* RX MTL queue to RX dma mapping */ |
| 271 | void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan); |
| 272 | /* Configure AV Algorithm */ |
| 273 | void (*config_cbs)(struct mac_device_info *hw, u32 send_slope, |
| 274 | u32 idle_slope, u32 high_credit, u32 low_credit, |
| 275 | u32 queue); |
| 276 | /* Dump MAC registers */ |
| 277 | void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space); |
| 278 | /* Handle extra events on specific interrupts hw dependent */ |
| 279 | int (*host_irq_status)(struct mac_device_info *hw, |
| 280 | struct stmmac_extra_stats *x); |
| 281 | /* Handle MTL interrupts */ |
| 282 | int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan); |
| 283 | /* Multicast filter setting */ |
| 284 | void (*set_filter)(struct mac_device_info *hw, struct net_device *dev); |
| 285 | /* Flow control setting */ |
| 286 | void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex, |
| 287 | unsigned int fc, unsigned int pause_time, u32 tx_cnt); |
| 288 | /* Set power management mode (e.g. magic frame) */ |
| 289 | void (*pmt)(struct mac_device_info *hw, unsigned long mode); |
| 290 | /* Set/Get Unicast MAC addresses */ |
| 291 | void (*set_umac_addr)(struct mac_device_info *hw, unsigned char *addr, |
| 292 | unsigned int reg_n); |
| 293 | void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr, |
| 294 | unsigned int reg_n); |
| 295 | void (*set_eee_mode)(struct mac_device_info *hw, |
| 296 | bool en_tx_lpi_clockgating); |
| 297 | void (*reset_eee_mode)(struct mac_device_info *hw); |
| 298 | void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw); |
| 299 | void (*set_eee_pls)(struct mac_device_info *hw, int link); |
| 300 | void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x, |
| 301 | u32 rx_queues, u32 tx_queues); |
| 302 | /* PCS calls */ |
| 303 | void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral, |
| 304 | bool loopback); |
| 305 | void (*pcs_rane)(void __iomem *ioaddr, bool restart); |
| 306 | void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv); |
| 307 | /* Safety Features */ |
| 308 | int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp); |
| 309 | int (*safety_feat_irq_status)(struct net_device *ndev, |
| 310 | void __iomem *ioaddr, unsigned int asp, |
| 311 | struct stmmac_safety_stats *stats); |
| 312 | int (*safety_feat_dump)(struct stmmac_safety_stats *stats, |
| 313 | int index, unsigned long *count, const char **desc); |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 314 | /* Flexible RX Parser */ |
| 315 | int (*rxp_config)(void __iomem *ioaddr, struct stmmac_tc_entry *entries, |
| 316 | unsigned int count); |
Jose Abreu | 9a8a02c | 2018-05-31 18:01:27 +0100 | [diff] [blame] | 317 | /* Flexible PPS */ |
| 318 | int (*flex_pps_config)(void __iomem *ioaddr, int index, |
| 319 | struct stmmac_pps_cfg *cfg, bool enable, |
| 320 | u32 sub_second_inc, u32 systime_flags); |
Jose Abreu | c10d4c8 | 2018-04-16 16:08:14 +0100 | [diff] [blame] | 321 | }; |
| 322 | |
| 323 | #define stmmac_core_init(__priv, __args...) \ |
| 324 | stmmac_do_void_callback(__priv, mac, core_init, __args) |
| 325 | #define stmmac_mac_set(__priv, __args...) \ |
| 326 | stmmac_do_void_callback(__priv, mac, set_mac, __args) |
| 327 | #define stmmac_rx_ipc(__priv, __args...) \ |
| 328 | stmmac_do_callback(__priv, mac, rx_ipc, __args) |
| 329 | #define stmmac_rx_queue_enable(__priv, __args...) \ |
| 330 | stmmac_do_void_callback(__priv, mac, rx_queue_enable, __args) |
| 331 | #define stmmac_rx_queue_prio(__priv, __args...) \ |
| 332 | stmmac_do_void_callback(__priv, mac, rx_queue_prio, __args) |
| 333 | #define stmmac_tx_queue_prio(__priv, __args...) \ |
| 334 | stmmac_do_void_callback(__priv, mac, tx_queue_prio, __args) |
| 335 | #define stmmac_rx_queue_routing(__priv, __args...) \ |
| 336 | stmmac_do_void_callback(__priv, mac, rx_queue_routing, __args) |
| 337 | #define stmmac_prog_mtl_rx_algorithms(__priv, __args...) \ |
| 338 | stmmac_do_void_callback(__priv, mac, prog_mtl_rx_algorithms, __args) |
| 339 | #define stmmac_prog_mtl_tx_algorithms(__priv, __args...) \ |
| 340 | stmmac_do_void_callback(__priv, mac, prog_mtl_tx_algorithms, __args) |
| 341 | #define stmmac_set_mtl_tx_queue_weight(__priv, __args...) \ |
| 342 | stmmac_do_void_callback(__priv, mac, set_mtl_tx_queue_weight, __args) |
| 343 | #define stmmac_map_mtl_to_dma(__priv, __args...) \ |
| 344 | stmmac_do_void_callback(__priv, mac, map_mtl_to_dma, __args) |
| 345 | #define stmmac_config_cbs(__priv, __args...) \ |
| 346 | stmmac_do_void_callback(__priv, mac, config_cbs, __args) |
| 347 | #define stmmac_dump_mac_regs(__priv, __args...) \ |
| 348 | stmmac_do_void_callback(__priv, mac, dump_regs, __args) |
| 349 | #define stmmac_host_irq_status(__priv, __args...) \ |
| 350 | stmmac_do_callback(__priv, mac, host_irq_status, __args) |
| 351 | #define stmmac_host_mtl_irq_status(__priv, __args...) \ |
| 352 | stmmac_do_callback(__priv, mac, host_mtl_irq_status, __args) |
| 353 | #define stmmac_set_filter(__priv, __args...) \ |
| 354 | stmmac_do_void_callback(__priv, mac, set_filter, __args) |
| 355 | #define stmmac_flow_ctrl(__priv, __args...) \ |
| 356 | stmmac_do_void_callback(__priv, mac, flow_ctrl, __args) |
| 357 | #define stmmac_pmt(__priv, __args...) \ |
| 358 | stmmac_do_void_callback(__priv, mac, pmt, __args) |
| 359 | #define stmmac_set_umac_addr(__priv, __args...) \ |
| 360 | stmmac_do_void_callback(__priv, mac, set_umac_addr, __args) |
| 361 | #define stmmac_get_umac_addr(__priv, __args...) \ |
| 362 | stmmac_do_void_callback(__priv, mac, get_umac_addr, __args) |
| 363 | #define stmmac_set_eee_mode(__priv, __args...) \ |
| 364 | stmmac_do_void_callback(__priv, mac, set_eee_mode, __args) |
| 365 | #define stmmac_reset_eee_mode(__priv, __args...) \ |
| 366 | stmmac_do_void_callback(__priv, mac, reset_eee_mode, __args) |
| 367 | #define stmmac_set_eee_timer(__priv, __args...) \ |
| 368 | stmmac_do_void_callback(__priv, mac, set_eee_timer, __args) |
| 369 | #define stmmac_set_eee_pls(__priv, __args...) \ |
| 370 | stmmac_do_void_callback(__priv, mac, set_eee_pls, __args) |
| 371 | #define stmmac_mac_debug(__priv, __args...) \ |
| 372 | stmmac_do_void_callback(__priv, mac, debug, __args) |
| 373 | #define stmmac_pcs_ctrl_ane(__priv, __args...) \ |
| 374 | stmmac_do_void_callback(__priv, mac, pcs_ctrl_ane, __args) |
| 375 | #define stmmac_pcs_rane(__priv, __args...) \ |
| 376 | stmmac_do_void_callback(__priv, mac, pcs_rane, __args) |
| 377 | #define stmmac_pcs_get_adv_lp(__priv, __args...) \ |
| 378 | stmmac_do_void_callback(__priv, mac, pcs_get_adv_lp, __args) |
| 379 | #define stmmac_safety_feat_config(__priv, __args...) \ |
| 380 | stmmac_do_callback(__priv, mac, safety_feat_config, __args) |
| 381 | #define stmmac_safety_feat_irq_status(__priv, __args...) \ |
| 382 | stmmac_do_callback(__priv, mac, safety_feat_irq_status, __args) |
| 383 | #define stmmac_safety_feat_dump(__priv, __args...) \ |
| 384 | stmmac_do_callback(__priv, mac, safety_feat_dump, __args) |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 385 | #define stmmac_rxp_config(__priv, __args...) \ |
| 386 | stmmac_do_callback(__priv, mac, rxp_config, __args) |
Jose Abreu | 9a8a02c | 2018-05-31 18:01:27 +0100 | [diff] [blame] | 387 | #define stmmac_flex_pps_config(__priv, __args...) \ |
| 388 | stmmac_do_callback(__priv, mac, flex_pps_config, __args) |
Jose Abreu | c10d4c8 | 2018-04-16 16:08:14 +0100 | [diff] [blame] | 389 | |
Jose Abreu | cc4c900 | 2018-04-16 16:08:15 +0100 | [diff] [blame] | 390 | /* PTP and HW Timer helpers */ |
| 391 | struct stmmac_hwtimestamp { |
| 392 | void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data); |
| 393 | void (*config_sub_second_increment)(void __iomem *ioaddr, u32 ptp_clock, |
| 394 | int gmac4, u32 *ssinc); |
| 395 | int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec); |
| 396 | int (*config_addend) (void __iomem *ioaddr, u32 addend); |
| 397 | int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec, |
| 398 | int add_sub, int gmac4); |
| 399 | void (*get_systime) (void __iomem *ioaddr, u64 *systime); |
| 400 | }; |
| 401 | |
| 402 | #define stmmac_config_hw_tstamping(__priv, __args...) \ |
| 403 | stmmac_do_void_callback(__priv, ptp, config_hw_tstamping, __args) |
| 404 | #define stmmac_config_sub_second_increment(__priv, __args...) \ |
| 405 | stmmac_do_void_callback(__priv, ptp, config_sub_second_increment, __args) |
| 406 | #define stmmac_init_systime(__priv, __args...) \ |
| 407 | stmmac_do_callback(__priv, ptp, init_systime, __args) |
| 408 | #define stmmac_config_addend(__priv, __args...) \ |
| 409 | stmmac_do_callback(__priv, ptp, config_addend, __args) |
| 410 | #define stmmac_adjust_systime(__priv, __args...) \ |
| 411 | stmmac_do_callback(__priv, ptp, adjust_systime, __args) |
| 412 | #define stmmac_get_systime(__priv, __args...) \ |
| 413 | stmmac_do_void_callback(__priv, ptp, get_systime, __args) |
| 414 | |
Jose Abreu | 2c520b1 | 2018-04-16 16:08:16 +0100 | [diff] [blame] | 415 | /* Helpers to manage the descriptors for chain and ring modes */ |
| 416 | struct stmmac_mode_ops { |
| 417 | void (*init) (void *des, dma_addr_t phy_addr, unsigned int size, |
| 418 | unsigned int extend_desc); |
| 419 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); |
| 420 | int (*jumbo_frm)(void *priv, struct sk_buff *skb, int csum); |
| 421 | int (*set_16kib_bfsize)(int mtu); |
| 422 | void (*init_desc3)(struct dma_desc *p); |
| 423 | void (*refill_desc3) (void *priv, struct dma_desc *p); |
| 424 | void (*clean_desc3) (void *priv, struct dma_desc *p); |
| 425 | }; |
| 426 | |
| 427 | #define stmmac_mode_init(__priv, __args...) \ |
| 428 | stmmac_do_void_callback(__priv, mode, init, __args) |
| 429 | #define stmmac_is_jumbo_frm(__priv, __args...) \ |
| 430 | stmmac_do_callback(__priv, mode, is_jumbo_frm, __args) |
| 431 | #define stmmac_jumbo_frm(__priv, __args...) \ |
| 432 | stmmac_do_callback(__priv, mode, jumbo_frm, __args) |
| 433 | #define stmmac_set_16kib_bfsize(__priv, __args...) \ |
| 434 | stmmac_do_callback(__priv, mode, set_16kib_bfsize, __args) |
| 435 | #define stmmac_init_desc3(__priv, __args...) \ |
| 436 | stmmac_do_void_callback(__priv, mode, init_desc3, __args) |
| 437 | #define stmmac_refill_desc3(__priv, __args...) \ |
| 438 | stmmac_do_void_callback(__priv, mode, refill_desc3, __args) |
| 439 | #define stmmac_clean_desc3(__priv, __args...) \ |
| 440 | stmmac_do_void_callback(__priv, mode, clean_desc3, __args) |
| 441 | |
Jose Abreu | 5f0456b | 2018-04-23 09:05:15 +0100 | [diff] [blame] | 442 | struct stmmac_priv; |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 443 | struct tc_cls_u32_offload; |
| 444 | |
| 445 | struct stmmac_tc_ops { |
| 446 | int (*init)(struct stmmac_priv *priv); |
| 447 | int (*setup_cls_u32)(struct stmmac_priv *priv, |
| 448 | struct tc_cls_u32_offload *cls); |
| 449 | }; |
| 450 | |
| 451 | #define stmmac_tc_init(__priv, __args...) \ |
| 452 | stmmac_do_callback(__priv, tc, init, __args) |
| 453 | #define stmmac_tc_setup_cls_u32(__priv, __args...) \ |
| 454 | stmmac_do_callback(__priv, tc, setup_cls_u32, __args) |
Jose Abreu | 5f0456b | 2018-04-23 09:05:15 +0100 | [diff] [blame] | 455 | |
Jose Abreu | 758d5c7 | 2018-05-18 14:56:04 +0100 | [diff] [blame] | 456 | struct stmmac_regs_off { |
| 457 | u32 ptp_off; |
| 458 | u32 mmc_off; |
| 459 | }; |
| 460 | |
Jose Abreu | 5f0456b | 2018-04-23 09:05:15 +0100 | [diff] [blame] | 461 | extern const struct stmmac_ops dwmac100_ops; |
| 462 | extern const struct stmmac_dma_ops dwmac100_dma_ops; |
| 463 | extern const struct stmmac_ops dwmac1000_ops; |
| 464 | extern const struct stmmac_dma_ops dwmac1000_dma_ops; |
| 465 | extern const struct stmmac_ops dwmac4_ops; |
| 466 | extern const struct stmmac_dma_ops dwmac4_dma_ops; |
| 467 | extern const struct stmmac_ops dwmac410_ops; |
| 468 | extern const struct stmmac_dma_ops dwmac410_dma_ops; |
| 469 | extern const struct stmmac_ops dwmac510_ops; |
Jose Abreu | 4dbbe8d | 2018-05-04 10:01:38 +0100 | [diff] [blame] | 470 | extern const struct stmmac_tc_ops dwmac510_tc_ops; |
Jose Abreu | 5f0456b | 2018-04-23 09:05:15 +0100 | [diff] [blame] | 471 | |
| 472 | #define GMAC_VERSION 0x00000020 /* GMAC CORE Version */ |
| 473 | #define GMAC4_VERSION 0x00000110 /* GMAC4+ CORE Version */ |
| 474 | |
| 475 | int stmmac_hwif_init(struct stmmac_priv *priv); |
| 476 | |
Jose Abreu | 42de047 | 2018-04-16 16:08:12 +0100 | [diff] [blame] | 477 | #endif /* __STMMAC_HWIF_H__ */ |