cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hwif.h (29813B)


      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
      8#include <linux/netdevice.h>
      9#include <linux/stmmac.h>
     10
     11#define stmmac_do_void_callback(__priv, __module, __cname,  __arg0, __args...) \
     12({ \
     13	int __result = -EINVAL; \
     14	if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) { \
     15		(__priv)->hw->__module->__cname((__arg0), ##__args); \
     16		__result = 0; \
     17	} \
     18	__result; \
     19})
     20#define stmmac_do_callback(__priv, __module, __cname,  __arg0, __args...) \
     21({ \
     22	int __result = -EINVAL; \
     23	if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) \
     24		__result = (__priv)->hw->__module->__cname((__arg0), ##__args); \
     25	__result; \
     26})
     27
     28struct stmmac_extra_stats;
     29struct stmmac_safety_stats;
     30struct dma_desc;
     31struct dma_extended_desc;
     32struct dma_edesc;
     33
     34/* Descriptors helpers */
     35struct stmmac_desc_ops {
     36	/* DMA RX descriptor ring initialization */
     37	void (*init_rx_desc)(struct dma_desc *p, int disable_rx_ic, int mode,
     38			int end, int bfsize);
     39	/* DMA TX descriptor ring initialization */
     40	void (*init_tx_desc)(struct dma_desc *p, int mode, int end);
     41	/* Invoked by the xmit function to prepare the tx descriptor */
     42	void (*prepare_tx_desc)(struct dma_desc *p, int is_fs, int len,
     43			bool csum_flag, int mode, bool tx_own, bool ls,
     44			unsigned int tot_pkt_len);
     45	void (*prepare_tso_tx_desc)(struct dma_desc *p, int is_fs, int len1,
     46			int len2, bool tx_own, bool ls, unsigned int tcphdrlen,
     47			unsigned int tcppayloadlen);
     48	/* Set/get the owner of the descriptor */
     49	void (*set_tx_owner)(struct dma_desc *p);
     50	int (*get_tx_owner)(struct dma_desc *p);
     51	/* Clean the tx descriptor as soon as the tx irq is received */
     52	void (*release_tx_desc)(struct dma_desc *p, int mode);
     53	/* Clear interrupt on tx frame completion. When this bit is
     54	 * set an interrupt happens as soon as the frame is transmitted */
     55	void (*set_tx_ic)(struct dma_desc *p);
     56	/* Last tx segment reports the transmit status */
     57	int (*get_tx_ls)(struct dma_desc *p);
     58	/* Return the transmit status looking at the TDES1 */
     59	int (*tx_status)(void *data, struct stmmac_extra_stats *x,
     60			struct dma_desc *p, void __iomem *ioaddr);
     61	/* Get the buffer size from the descriptor */
     62	int (*get_tx_len)(struct dma_desc *p);
     63	/* Handle extra events on specific interrupts hw dependent */
     64	void (*set_rx_owner)(struct dma_desc *p, int disable_rx_ic);
     65	/* Get the receive frame size */
     66	int (*get_rx_frame_len)(struct dma_desc *p, int rx_coe_type);
     67	/* Return the reception status looking at the RDES1 */
     68	int (*rx_status)(void *data, struct stmmac_extra_stats *x,
     69			struct dma_desc *p);
     70	void (*rx_extended_status)(void *data, struct stmmac_extra_stats *x,
     71			struct dma_extended_desc *p);
     72	/* Set tx timestamp enable bit */
     73	void (*enable_tx_timestamp) (struct dma_desc *p);
     74	/* get tx timestamp status */
     75	int (*get_tx_timestamp_status) (struct dma_desc *p);
     76	/* get timestamp value */
     77	void (*get_timestamp)(void *desc, u32 ats, u64 *ts);
     78	/* get rx timestamp status */
     79	int (*get_rx_timestamp_status)(void *desc, void *next_desc, u32 ats);
     80	/* Display ring */
     81	void (*display_ring)(void *head, unsigned int size, bool rx,
     82			     dma_addr_t dma_rx_phy, unsigned int desc_size);
     83	/* set MSS via context descriptor */
     84	void (*set_mss)(struct dma_desc *p, unsigned int mss);
     85	/* set descriptor skbuff address */
     86	void (*set_addr)(struct dma_desc *p, dma_addr_t addr);
     87	/* clear descriptor */
     88	void (*clear)(struct dma_desc *p);
     89	/* RSS */
     90	int (*get_rx_hash)(struct dma_desc *p, u32 *hash,
     91			   enum pkt_hash_types *type);
     92	void (*get_rx_header_len)(struct dma_desc *p, unsigned int *len);
     93	void (*set_sec_addr)(struct dma_desc *p, dma_addr_t addr, bool buf2_valid);
     94	void (*set_sarc)(struct dma_desc *p, u32 sarc_type);
     95	void (*set_vlan_tag)(struct dma_desc *p, u16 tag, u16 inner_tag,
     96			     u32 inner_type);
     97	void (*set_vlan)(struct dma_desc *p, u32 type);
     98	void (*set_tbs)(struct dma_edesc *p, u32 sec, u32 nsec);
     99};
    100
    101#define stmmac_init_rx_desc(__priv, __args...) \
    102	stmmac_do_void_callback(__priv, desc, init_rx_desc, __args)
    103#define stmmac_init_tx_desc(__priv, __args...) \
    104	stmmac_do_void_callback(__priv, desc, init_tx_desc, __args)
    105#define stmmac_prepare_tx_desc(__priv, __args...) \
    106	stmmac_do_void_callback(__priv, desc, prepare_tx_desc, __args)
    107#define stmmac_prepare_tso_tx_desc(__priv, __args...) \
    108	stmmac_do_void_callback(__priv, desc, prepare_tso_tx_desc, __args)
    109#define stmmac_set_tx_owner(__priv, __args...) \
    110	stmmac_do_void_callback(__priv, desc, set_tx_owner, __args)
    111#define stmmac_get_tx_owner(__priv, __args...) \
    112	stmmac_do_callback(__priv, desc, get_tx_owner, __args)
    113#define stmmac_release_tx_desc(__priv, __args...) \
    114	stmmac_do_void_callback(__priv, desc, release_tx_desc, __args)
    115#define stmmac_set_tx_ic(__priv, __args...) \
    116	stmmac_do_void_callback(__priv, desc, set_tx_ic, __args)
    117#define stmmac_get_tx_ls(__priv, __args...) \
    118	stmmac_do_callback(__priv, desc, get_tx_ls, __args)
    119#define stmmac_tx_status(__priv, __args...) \
    120	stmmac_do_callback(__priv, desc, tx_status, __args)
    121#define stmmac_get_tx_len(__priv, __args...) \
    122	stmmac_do_callback(__priv, desc, get_tx_len, __args)
    123#define stmmac_set_rx_owner(__priv, __args...) \
    124	stmmac_do_void_callback(__priv, desc, set_rx_owner, __args)
    125#define stmmac_get_rx_frame_len(__priv, __args...) \
    126	stmmac_do_callback(__priv, desc, get_rx_frame_len, __args)
    127#define stmmac_rx_status(__priv, __args...) \
    128	stmmac_do_callback(__priv, desc, rx_status, __args)
    129#define stmmac_rx_extended_status(__priv, __args...) \
    130	stmmac_do_void_callback(__priv, desc, rx_extended_status, __args)
    131#define stmmac_enable_tx_timestamp(__priv, __args...) \
    132	stmmac_do_void_callback(__priv, desc, enable_tx_timestamp, __args)
    133#define stmmac_get_tx_timestamp_status(__priv, __args...) \
    134	stmmac_do_callback(__priv, desc, get_tx_timestamp_status, __args)
    135#define stmmac_get_timestamp(__priv, __args...) \
    136	stmmac_do_void_callback(__priv, desc, get_timestamp, __args)
    137#define stmmac_get_rx_timestamp_status(__priv, __args...) \
    138	stmmac_do_callback(__priv, desc, get_rx_timestamp_status, __args)
    139#define stmmac_display_ring(__priv, __args...) \
    140	stmmac_do_void_callback(__priv, desc, display_ring, __args)
    141#define stmmac_set_mss(__priv, __args...) \
    142	stmmac_do_void_callback(__priv, desc, set_mss, __args)
    143#define stmmac_set_desc_addr(__priv, __args...) \
    144	stmmac_do_void_callback(__priv, desc, set_addr, __args)
    145#define stmmac_clear_desc(__priv, __args...) \
    146	stmmac_do_void_callback(__priv, desc, clear, __args)
    147#define stmmac_get_rx_hash(__priv, __args...) \
    148	stmmac_do_callback(__priv, desc, get_rx_hash, __args)
    149#define stmmac_get_rx_header_len(__priv, __args...) \
    150	stmmac_do_void_callback(__priv, desc, get_rx_header_len, __args)
    151#define stmmac_set_desc_sec_addr(__priv, __args...) \
    152	stmmac_do_void_callback(__priv, desc, set_sec_addr, __args)
    153#define stmmac_set_desc_sarc(__priv, __args...) \
    154	stmmac_do_void_callback(__priv, desc, set_sarc, __args)
    155#define stmmac_set_desc_vlan_tag(__priv, __args...) \
    156	stmmac_do_void_callback(__priv, desc, set_vlan_tag, __args)
    157#define stmmac_set_desc_vlan(__priv, __args...) \
    158	stmmac_do_void_callback(__priv, desc, set_vlan, __args)
    159#define stmmac_set_desc_tbs(__priv, __args...) \
    160	stmmac_do_void_callback(__priv, desc, set_tbs, __args)
    161
    162struct stmmac_dma_cfg;
    163struct dma_features;
    164
    165/* Specific DMA helpers */
    166struct stmmac_dma_ops {
    167	/* DMA core initialization */
    168	int (*reset)(void __iomem *ioaddr);
    169	void (*init)(void __iomem *ioaddr, struct stmmac_dma_cfg *dma_cfg,
    170		     int atds);
    171	void (*init_chan)(void __iomem *ioaddr,
    172			  struct stmmac_dma_cfg *dma_cfg, u32 chan);
    173	void (*init_rx_chan)(void __iomem *ioaddr,
    174			     struct stmmac_dma_cfg *dma_cfg,
    175			     dma_addr_t phy, u32 chan);
    176	void (*init_tx_chan)(void __iomem *ioaddr,
    177			     struct stmmac_dma_cfg *dma_cfg,
    178			     dma_addr_t phy, u32 chan);
    179	/* Configure the AXI Bus Mode Register */
    180	void (*axi)(void __iomem *ioaddr, struct stmmac_axi *axi);
    181	/* Dump DMA registers */
    182	void (*dump_regs)(void __iomem *ioaddr, u32 *reg_space);
    183	void (*dma_rx_mode)(void __iomem *ioaddr, int mode, u32 channel,
    184			    int fifosz, u8 qmode);
    185	void (*dma_tx_mode)(void __iomem *ioaddr, int mode, u32 channel,
    186			    int fifosz, u8 qmode);
    187	/* To track extra statistic (if supported) */
    188	void (*dma_diagnostic_fr) (void *data, struct stmmac_extra_stats *x,
    189				   void __iomem *ioaddr);
    190	void (*enable_dma_transmission) (void __iomem *ioaddr);
    191	void (*enable_dma_irq)(void __iomem *ioaddr, u32 chan,
    192			       bool rx, bool tx);
    193	void (*disable_dma_irq)(void __iomem *ioaddr, u32 chan,
    194				bool rx, bool tx);
    195	void (*start_tx)(void __iomem *ioaddr, u32 chan);
    196	void (*stop_tx)(void __iomem *ioaddr, u32 chan);
    197	void (*start_rx)(void __iomem *ioaddr, u32 chan);
    198	void (*stop_rx)(void __iomem *ioaddr, u32 chan);
    199	int (*dma_interrupt) (void __iomem *ioaddr,
    200			      struct stmmac_extra_stats *x, u32 chan, u32 dir);
    201	/* If supported then get the optional core features */
    202	int (*get_hw_feature)(void __iomem *ioaddr,
    203			      struct dma_features *dma_cap);
    204	/* Program the HW RX Watchdog */
    205	void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt, u32 queue);
    206	void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
    207	void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
    208	void (*set_rx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
    209	void (*set_tx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
    210	void (*enable_tso)(void __iomem *ioaddr, bool en, u32 chan);
    211	void (*qmode)(void __iomem *ioaddr, u32 channel, u8 qmode);
    212	void (*set_bfsize)(void __iomem *ioaddr, int bfsize, u32 chan);
    213	void (*enable_sph)(void __iomem *ioaddr, bool en, u32 chan);
    214	int (*enable_tbs)(void __iomem *ioaddr, bool en, u32 chan);
    215};
    216
    217#define stmmac_reset(__priv, __args...) \
    218	stmmac_do_callback(__priv, dma, reset, __args)
    219#define stmmac_dma_init(__priv, __args...) \
    220	stmmac_do_void_callback(__priv, dma, init, __args)
    221#define stmmac_init_chan(__priv, __args...) \
    222	stmmac_do_void_callback(__priv, dma, init_chan, __args)
    223#define stmmac_init_rx_chan(__priv, __args...) \
    224	stmmac_do_void_callback(__priv, dma, init_rx_chan, __args)
    225#define stmmac_init_tx_chan(__priv, __args...) \
    226	stmmac_do_void_callback(__priv, dma, init_tx_chan, __args)
    227#define stmmac_axi(__priv, __args...) \
    228	stmmac_do_void_callback(__priv, dma, axi, __args)
    229#define stmmac_dump_dma_regs(__priv, __args...) \
    230	stmmac_do_void_callback(__priv, dma, dump_regs, __args)
    231#define stmmac_dma_rx_mode(__priv, __args...) \
    232	stmmac_do_void_callback(__priv, dma, dma_rx_mode, __args)
    233#define stmmac_dma_tx_mode(__priv, __args...) \
    234	stmmac_do_void_callback(__priv, dma, dma_tx_mode, __args)
    235#define stmmac_dma_diagnostic_fr(__priv, __args...) \
    236	stmmac_do_void_callback(__priv, dma, dma_diagnostic_fr, __args)
    237#define stmmac_enable_dma_transmission(__priv, __args...) \
    238	stmmac_do_void_callback(__priv, dma, enable_dma_transmission, __args)
    239#define stmmac_enable_dma_irq(__priv, __args...) \
    240	stmmac_do_void_callback(__priv, dma, enable_dma_irq, __args)
    241#define stmmac_disable_dma_irq(__priv, __args...) \
    242	stmmac_do_void_callback(__priv, dma, disable_dma_irq, __args)
    243#define stmmac_start_tx(__priv, __args...) \
    244	stmmac_do_void_callback(__priv, dma, start_tx, __args)
    245#define stmmac_stop_tx(__priv, __args...) \
    246	stmmac_do_void_callback(__priv, dma, stop_tx, __args)
    247#define stmmac_start_rx(__priv, __args...) \
    248	stmmac_do_void_callback(__priv, dma, start_rx, __args)
    249#define stmmac_stop_rx(__priv, __args...) \
    250	stmmac_do_void_callback(__priv, dma, stop_rx, __args)
    251#define stmmac_dma_interrupt_status(__priv, __args...) \
    252	stmmac_do_callback(__priv, dma, dma_interrupt, __args)
    253#define stmmac_get_hw_feature(__priv, __args...) \
    254	stmmac_do_callback(__priv, dma, get_hw_feature, __args)
    255#define stmmac_rx_watchdog(__priv, __args...) \
    256	stmmac_do_void_callback(__priv, dma, rx_watchdog, __args)
    257#define stmmac_set_tx_ring_len(__priv, __args...) \
    258	stmmac_do_void_callback(__priv, dma, set_tx_ring_len, __args)
    259#define stmmac_set_rx_ring_len(__priv, __args...) \
    260	stmmac_do_void_callback(__priv, dma, set_rx_ring_len, __args)
    261#define stmmac_set_rx_tail_ptr(__priv, __args...) \
    262	stmmac_do_void_callback(__priv, dma, set_rx_tail_ptr, __args)
    263#define stmmac_set_tx_tail_ptr(__priv, __args...) \
    264	stmmac_do_void_callback(__priv, dma, set_tx_tail_ptr, __args)
    265#define stmmac_enable_tso(__priv, __args...) \
    266	stmmac_do_void_callback(__priv, dma, enable_tso, __args)
    267#define stmmac_dma_qmode(__priv, __args...) \
    268	stmmac_do_void_callback(__priv, dma, qmode, __args)
    269#define stmmac_set_dma_bfsize(__priv, __args...) \
    270	stmmac_do_void_callback(__priv, dma, set_bfsize, __args)
    271#define stmmac_enable_sph(__priv, __args...) \
    272	stmmac_do_void_callback(__priv, dma, enable_sph, __args)
    273#define stmmac_enable_tbs(__priv, __args...) \
    274	stmmac_do_callback(__priv, dma, enable_tbs, __args)
    275
    276struct mac_device_info;
    277struct net_device;
    278struct rgmii_adv;
    279struct stmmac_tc_entry;
    280struct stmmac_pps_cfg;
    281struct stmmac_rss;
    282struct stmmac_est;
    283
    284/* Helpers to program the MAC core */
    285struct stmmac_ops {
    286	/* MAC core initialization */
    287	void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
    288	/* Enable the MAC RX/TX */
    289	void (*set_mac)(void __iomem *ioaddr, bool enable);
    290	/* Enable and verify that the IPC module is supported */
    291	int (*rx_ipc)(struct mac_device_info *hw);
    292	/* Enable RX Queues */
    293	void (*rx_queue_enable)(struct mac_device_info *hw, u8 mode, u32 queue);
    294	/* RX Queues Priority */
    295	void (*rx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
    296	/* TX Queues Priority */
    297	void (*tx_queue_prio)(struct mac_device_info *hw, u32 prio, u32 queue);
    298	/* RX Queues Routing */
    299	void (*rx_queue_routing)(struct mac_device_info *hw, u8 packet,
    300				 u32 queue);
    301	/* Program RX Algorithms */
    302	void (*prog_mtl_rx_algorithms)(struct mac_device_info *hw, u32 rx_alg);
    303	/* Program TX Algorithms */
    304	void (*prog_mtl_tx_algorithms)(struct mac_device_info *hw, u32 tx_alg);
    305	/* Set MTL TX queues weight */
    306	void (*set_mtl_tx_queue_weight)(struct mac_device_info *hw,
    307					u32 weight, u32 queue);
    308	/* RX MTL queue to RX dma mapping */
    309	void (*map_mtl_to_dma)(struct mac_device_info *hw, u32 queue, u32 chan);
    310	/* Configure AV Algorithm */
    311	void (*config_cbs)(struct mac_device_info *hw, u32 send_slope,
    312			   u32 idle_slope, u32 high_credit, u32 low_credit,
    313			   u32 queue);
    314	/* Dump MAC registers */
    315	void (*dump_regs)(struct mac_device_info *hw, u32 *reg_space);
    316	/* Handle extra events on specific interrupts hw dependent */
    317	int (*host_irq_status)(struct mac_device_info *hw,
    318			       struct stmmac_extra_stats *x);
    319	/* Handle MTL interrupts */
    320	int (*host_mtl_irq_status)(struct mac_device_info *hw, u32 chan);
    321	/* Multicast filter setting */
    322	void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
    323	/* Flow control setting */
    324	void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
    325			  unsigned int fc, unsigned int pause_time, u32 tx_cnt);
    326	/* Set power management mode (e.g. magic frame) */
    327	void (*pmt)(struct mac_device_info *hw, unsigned long mode);
    328	/* Set/Get Unicast MAC addresses */
    329	void (*set_umac_addr)(struct mac_device_info *hw,
    330			      const unsigned char *addr,
    331			      unsigned int reg_n);
    332	void (*get_umac_addr)(struct mac_device_info *hw, unsigned char *addr,
    333			      unsigned int reg_n);
    334	void (*set_eee_mode)(struct mac_device_info *hw,
    335			     bool en_tx_lpi_clockgating);
    336	void (*reset_eee_mode)(struct mac_device_info *hw);
    337	void (*set_eee_lpi_entry_timer)(struct mac_device_info *hw, int et);
    338	void (*set_eee_timer)(struct mac_device_info *hw, int ls, int tw);
    339	void (*set_eee_pls)(struct mac_device_info *hw, int link);
    340	void (*debug)(void __iomem *ioaddr, struct stmmac_extra_stats *x,
    341		      u32 rx_queues, u32 tx_queues);
    342	/* PCS calls */
    343	void (*pcs_ctrl_ane)(void __iomem *ioaddr, bool ane, bool srgmi_ral,
    344			     bool loopback);
    345	void (*pcs_rane)(void __iomem *ioaddr, bool restart);
    346	void (*pcs_get_adv_lp)(void __iomem *ioaddr, struct rgmii_adv *adv);
    347	/* Safety Features */
    348	int (*safety_feat_config)(void __iomem *ioaddr, unsigned int asp,
    349				  struct stmmac_safety_feature_cfg *safety_cfg);
    350	int (*safety_feat_irq_status)(struct net_device *ndev,
    351			void __iomem *ioaddr, unsigned int asp,
    352			struct stmmac_safety_stats *stats);
    353	int (*safety_feat_dump)(struct stmmac_safety_stats *stats,
    354			int index, unsigned long *count, const char **desc);
    355	/* Flexible RX Parser */
    356	int (*rxp_config)(void __iomem *ioaddr, struct stmmac_tc_entry *entries,
    357			  unsigned int count);
    358	/* Flexible PPS */
    359	int (*flex_pps_config)(void __iomem *ioaddr, int index,
    360			       struct stmmac_pps_cfg *cfg, bool enable,
    361			       u32 sub_second_inc, u32 systime_flags);
    362	/* Loopback for selftests */
    363	void (*set_mac_loopback)(void __iomem *ioaddr, bool enable);
    364	/* RSS */
    365	int (*rss_configure)(struct mac_device_info *hw,
    366			     struct stmmac_rss *cfg, u32 num_rxq);
    367	/* VLAN */
    368	void (*update_vlan_hash)(struct mac_device_info *hw, u32 hash,
    369				 __le16 perfect_match, bool is_double);
    370	void (*enable_vlan)(struct mac_device_info *hw, u32 type);
    371	int (*add_hw_vlan_rx_fltr)(struct net_device *dev,
    372				   struct mac_device_info *hw,
    373				   __be16 proto, u16 vid);
    374	int (*del_hw_vlan_rx_fltr)(struct net_device *dev,
    375				   struct mac_device_info *hw,
    376				   __be16 proto, u16 vid);
    377	void (*restore_hw_vlan_rx_fltr)(struct net_device *dev,
    378					struct mac_device_info *hw);
    379	/* TX Timestamp */
    380	int (*get_mac_tx_timestamp)(struct mac_device_info *hw, u64 *ts);
    381	/* Source Address Insertion / Replacement */
    382	void (*sarc_configure)(void __iomem *ioaddr, int val);
    383	/* Filtering */
    384	int (*config_l3_filter)(struct mac_device_info *hw, u32 filter_no,
    385				bool en, bool ipv6, bool sa, bool inv,
    386				u32 match);
    387	int (*config_l4_filter)(struct mac_device_info *hw, u32 filter_no,
    388				bool en, bool udp, bool sa, bool inv,
    389				u32 match);
    390	void (*set_arp_offload)(struct mac_device_info *hw, bool en, u32 addr);
    391	int (*est_configure)(void __iomem *ioaddr, struct stmmac_est *cfg,
    392			     unsigned int ptp_rate);
    393	void (*est_irq_status)(void __iomem *ioaddr, struct net_device *dev,
    394			       struct stmmac_extra_stats *x, u32 txqcnt);
    395	void (*fpe_configure)(void __iomem *ioaddr, u32 num_txq, u32 num_rxq,
    396			      bool enable);
    397	void (*fpe_send_mpacket)(void __iomem *ioaddr,
    398				 enum stmmac_mpacket_type type);
    399	int (*fpe_irq_status)(void __iomem *ioaddr, struct net_device *dev);
    400};
    401
    402#define stmmac_core_init(__priv, __args...) \
    403	stmmac_do_void_callback(__priv, mac, core_init, __args)
    404#define stmmac_mac_set(__priv, __args...) \
    405	stmmac_do_void_callback(__priv, mac, set_mac, __args)
    406#define stmmac_rx_ipc(__priv, __args...) \
    407	stmmac_do_callback(__priv, mac, rx_ipc, __args)
    408#define stmmac_rx_queue_enable(__priv, __args...) \
    409	stmmac_do_void_callback(__priv, mac, rx_queue_enable, __args)
    410#define stmmac_rx_queue_prio(__priv, __args...) \
    411	stmmac_do_void_callback(__priv, mac, rx_queue_prio, __args)
    412#define stmmac_tx_queue_prio(__priv, __args...) \
    413	stmmac_do_void_callback(__priv, mac, tx_queue_prio, __args)
    414#define stmmac_rx_queue_routing(__priv, __args...) \
    415	stmmac_do_void_callback(__priv, mac, rx_queue_routing, __args)
    416#define stmmac_prog_mtl_rx_algorithms(__priv, __args...) \
    417	stmmac_do_void_callback(__priv, mac, prog_mtl_rx_algorithms, __args)
    418#define stmmac_prog_mtl_tx_algorithms(__priv, __args...) \
    419	stmmac_do_void_callback(__priv, mac, prog_mtl_tx_algorithms, __args)
    420#define stmmac_set_mtl_tx_queue_weight(__priv, __args...) \
    421	stmmac_do_void_callback(__priv, mac, set_mtl_tx_queue_weight, __args)
    422#define stmmac_map_mtl_to_dma(__priv, __args...) \
    423	stmmac_do_void_callback(__priv, mac, map_mtl_to_dma, __args)
    424#define stmmac_config_cbs(__priv, __args...) \
    425	stmmac_do_void_callback(__priv, mac, config_cbs, __args)
    426#define stmmac_dump_mac_regs(__priv, __args...) \
    427	stmmac_do_void_callback(__priv, mac, dump_regs, __args)
    428#define stmmac_host_irq_status(__priv, __args...) \
    429	stmmac_do_callback(__priv, mac, host_irq_status, __args)
    430#define stmmac_host_mtl_irq_status(__priv, __args...) \
    431	stmmac_do_callback(__priv, mac, host_mtl_irq_status, __args)
    432#define stmmac_set_filter(__priv, __args...) \
    433	stmmac_do_void_callback(__priv, mac, set_filter, __args)
    434#define stmmac_flow_ctrl(__priv, __args...) \
    435	stmmac_do_void_callback(__priv, mac, flow_ctrl, __args)
    436#define stmmac_pmt(__priv, __args...) \
    437	stmmac_do_void_callback(__priv, mac, pmt, __args)
    438#define stmmac_set_umac_addr(__priv, __args...) \
    439	stmmac_do_void_callback(__priv, mac, set_umac_addr, __args)
    440#define stmmac_get_umac_addr(__priv, __args...) \
    441	stmmac_do_void_callback(__priv, mac, get_umac_addr, __args)
    442#define stmmac_set_eee_mode(__priv, __args...) \
    443	stmmac_do_void_callback(__priv, mac, set_eee_mode, __args)
    444#define stmmac_reset_eee_mode(__priv, __args...) \
    445	stmmac_do_void_callback(__priv, mac, reset_eee_mode, __args)
    446#define stmmac_set_eee_lpi_timer(__priv, __args...) \
    447	stmmac_do_void_callback(__priv, mac, set_eee_lpi_entry_timer, __args)
    448#define stmmac_set_eee_timer(__priv, __args...) \
    449	stmmac_do_void_callback(__priv, mac, set_eee_timer, __args)
    450#define stmmac_set_eee_pls(__priv, __args...) \
    451	stmmac_do_void_callback(__priv, mac, set_eee_pls, __args)
    452#define stmmac_mac_debug(__priv, __args...) \
    453	stmmac_do_void_callback(__priv, mac, debug, __args)
    454#define stmmac_pcs_ctrl_ane(__priv, __args...) \
    455	stmmac_do_void_callback(__priv, mac, pcs_ctrl_ane, __args)
    456#define stmmac_pcs_rane(__priv, __args...) \
    457	stmmac_do_void_callback(__priv, mac, pcs_rane, __args)
    458#define stmmac_pcs_get_adv_lp(__priv, __args...) \
    459	stmmac_do_void_callback(__priv, mac, pcs_get_adv_lp, __args)
    460#define stmmac_safety_feat_config(__priv, __args...) \
    461	stmmac_do_callback(__priv, mac, safety_feat_config, __args)
    462#define stmmac_safety_feat_irq_status(__priv, __args...) \
    463	stmmac_do_callback(__priv, mac, safety_feat_irq_status, __args)
    464#define stmmac_safety_feat_dump(__priv, __args...) \
    465	stmmac_do_callback(__priv, mac, safety_feat_dump, __args)
    466#define stmmac_rxp_config(__priv, __args...) \
    467	stmmac_do_callback(__priv, mac, rxp_config, __args)
    468#define stmmac_flex_pps_config(__priv, __args...) \
    469	stmmac_do_callback(__priv, mac, flex_pps_config, __args)
    470#define stmmac_set_mac_loopback(__priv, __args...) \
    471	stmmac_do_void_callback(__priv, mac, set_mac_loopback, __args)
    472#define stmmac_rss_configure(__priv, __args...) \
    473	stmmac_do_callback(__priv, mac, rss_configure, __args)
    474#define stmmac_update_vlan_hash(__priv, __args...) \
    475	stmmac_do_void_callback(__priv, mac, update_vlan_hash, __args)
    476#define stmmac_enable_vlan(__priv, __args...) \
    477	stmmac_do_void_callback(__priv, mac, enable_vlan, __args)
    478#define stmmac_add_hw_vlan_rx_fltr(__priv, __args...) \
    479	stmmac_do_callback(__priv, mac, add_hw_vlan_rx_fltr, __args)
    480#define stmmac_del_hw_vlan_rx_fltr(__priv, __args...) \
    481	stmmac_do_callback(__priv, mac, del_hw_vlan_rx_fltr, __args)
    482#define stmmac_restore_hw_vlan_rx_fltr(__priv, __args...) \
    483	stmmac_do_void_callback(__priv, mac, restore_hw_vlan_rx_fltr, __args)
    484#define stmmac_get_mac_tx_timestamp(__priv, __args...) \
    485	stmmac_do_callback(__priv, mac, get_mac_tx_timestamp, __args)
    486#define stmmac_sarc_configure(__priv, __args...) \
    487	stmmac_do_void_callback(__priv, mac, sarc_configure, __args)
    488#define stmmac_config_l3_filter(__priv, __args...) \
    489	stmmac_do_callback(__priv, mac, config_l3_filter, __args)
    490#define stmmac_config_l4_filter(__priv, __args...) \
    491	stmmac_do_callback(__priv, mac, config_l4_filter, __args)
    492#define stmmac_set_arp_offload(__priv, __args...) \
    493	stmmac_do_void_callback(__priv, mac, set_arp_offload, __args)
    494#define stmmac_est_configure(__priv, __args...) \
    495	stmmac_do_callback(__priv, mac, est_configure, __args)
    496#define stmmac_est_irq_status(__priv, __args...) \
    497	stmmac_do_void_callback(__priv, mac, est_irq_status, __args)
    498#define stmmac_fpe_configure(__priv, __args...) \
    499	stmmac_do_void_callback(__priv, mac, fpe_configure, __args)
    500#define stmmac_fpe_send_mpacket(__priv, __args...) \
    501	stmmac_do_void_callback(__priv, mac, fpe_send_mpacket, __args)
    502#define stmmac_fpe_irq_status(__priv, __args...) \
    503	stmmac_do_callback(__priv, mac, fpe_irq_status, __args)
    504
    505struct stmmac_priv;
    506
    507/* PTP and HW Timer helpers */
    508struct stmmac_hwtimestamp {
    509	void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
    510	void (*config_sub_second_increment)(void __iomem *ioaddr, u32 ptp_clock,
    511					   int gmac4, u32 *ssinc);
    512	int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec);
    513	int (*config_addend) (void __iomem *ioaddr, u32 addend);
    514	int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec,
    515			       int add_sub, int gmac4);
    516	void (*get_systime) (void __iomem *ioaddr, u64 *systime);
    517	void (*get_ptptime)(void __iomem *ioaddr, u64 *ptp_time);
    518	void (*timestamp_interrupt)(struct stmmac_priv *priv);
    519};
    520
    521#define stmmac_config_hw_tstamping(__priv, __args...) \
    522	stmmac_do_void_callback(__priv, ptp, config_hw_tstamping, __args)
    523#define stmmac_config_sub_second_increment(__priv, __args...) \
    524	stmmac_do_void_callback(__priv, ptp, config_sub_second_increment, __args)
    525#define stmmac_init_systime(__priv, __args...) \
    526	stmmac_do_callback(__priv, ptp, init_systime, __args)
    527#define stmmac_config_addend(__priv, __args...) \
    528	stmmac_do_callback(__priv, ptp, config_addend, __args)
    529#define stmmac_adjust_systime(__priv, __args...) \
    530	stmmac_do_callback(__priv, ptp, adjust_systime, __args)
    531#define stmmac_get_systime(__priv, __args...) \
    532	stmmac_do_void_callback(__priv, ptp, get_systime, __args)
    533#define stmmac_get_ptptime(__priv, __args...) \
    534	stmmac_do_void_callback(__priv, ptp, get_ptptime, __args)
    535#define stmmac_timestamp_interrupt(__priv, __args...) \
    536	stmmac_do_void_callback(__priv, ptp, timestamp_interrupt, __args)
    537
    538/* Helpers to manage the descriptors for chain and ring modes */
    539struct stmmac_mode_ops {
    540	void (*init) (void *des, dma_addr_t phy_addr, unsigned int size,
    541		      unsigned int extend_desc);
    542	unsigned int (*is_jumbo_frm) (int len, int ehn_desc);
    543	int (*jumbo_frm)(void *priv, struct sk_buff *skb, int csum);
    544	int (*set_16kib_bfsize)(int mtu);
    545	void (*init_desc3)(struct dma_desc *p);
    546	void (*refill_desc3) (void *priv, struct dma_desc *p);
    547	void (*clean_desc3) (void *priv, struct dma_desc *p);
    548};
    549
    550#define stmmac_mode_init(__priv, __args...) \
    551	stmmac_do_void_callback(__priv, mode, init, __args)
    552#define stmmac_is_jumbo_frm(__priv, __args...) \
    553	stmmac_do_callback(__priv, mode, is_jumbo_frm, __args)
    554#define stmmac_jumbo_frm(__priv, __args...) \
    555	stmmac_do_callback(__priv, mode, jumbo_frm, __args)
    556#define stmmac_set_16kib_bfsize(__priv, __args...) \
    557	stmmac_do_callback(__priv, mode, set_16kib_bfsize, __args)
    558#define stmmac_init_desc3(__priv, __args...) \
    559	stmmac_do_void_callback(__priv, mode, init_desc3, __args)
    560#define stmmac_refill_desc3(__priv, __args...) \
    561	stmmac_do_void_callback(__priv, mode, refill_desc3, __args)
    562#define stmmac_clean_desc3(__priv, __args...) \
    563	stmmac_do_void_callback(__priv, mode, clean_desc3, __args)
    564
    565struct tc_cls_u32_offload;
    566struct tc_cbs_qopt_offload;
    567struct flow_cls_offload;
    568struct tc_taprio_qopt_offload;
    569struct tc_etf_qopt_offload;
    570
    571struct stmmac_tc_ops {
    572	int (*init)(struct stmmac_priv *priv);
    573	int (*setup_cls_u32)(struct stmmac_priv *priv,
    574			     struct tc_cls_u32_offload *cls);
    575	int (*setup_cbs)(struct stmmac_priv *priv,
    576			 struct tc_cbs_qopt_offload *qopt);
    577	int (*setup_cls)(struct stmmac_priv *priv,
    578			 struct flow_cls_offload *cls);
    579	int (*setup_taprio)(struct stmmac_priv *priv,
    580			    struct tc_taprio_qopt_offload *qopt);
    581	int (*setup_etf)(struct stmmac_priv *priv,
    582			 struct tc_etf_qopt_offload *qopt);
    583};
    584
    585#define stmmac_tc_init(__priv, __args...) \
    586	stmmac_do_callback(__priv, tc, init, __args)
    587#define stmmac_tc_setup_cls_u32(__priv, __args...) \
    588	stmmac_do_callback(__priv, tc, setup_cls_u32, __args)
    589#define stmmac_tc_setup_cbs(__priv, __args...) \
    590	stmmac_do_callback(__priv, tc, setup_cbs, __args)
    591#define stmmac_tc_setup_cls(__priv, __args...) \
    592	stmmac_do_callback(__priv, tc, setup_cls, __args)
    593#define stmmac_tc_setup_taprio(__priv, __args...) \
    594	stmmac_do_callback(__priv, tc, setup_taprio, __args)
    595#define stmmac_tc_setup_etf(__priv, __args...) \
    596	stmmac_do_callback(__priv, tc, setup_etf, __args)
    597
    598struct stmmac_counters;
    599
    600struct stmmac_mmc_ops {
    601	void (*ctrl)(void __iomem *ioaddr, unsigned int mode);
    602	void (*intr_all_mask)(void __iomem *ioaddr);
    603	void (*read)(void __iomem *ioaddr, struct stmmac_counters *mmc);
    604};
    605
    606#define stmmac_mmc_ctrl(__priv, __args...) \
    607	stmmac_do_void_callback(__priv, mmc, ctrl, __args)
    608#define stmmac_mmc_intr_all_mask(__priv, __args...) \
    609	stmmac_do_void_callback(__priv, mmc, intr_all_mask, __args)
    610#define stmmac_mmc_read(__priv, __args...) \
    611	stmmac_do_void_callback(__priv, mmc, read, __args)
    612
    613struct stmmac_regs_off {
    614	u32 ptp_off;
    615	u32 mmc_off;
    616};
    617
    618extern const struct stmmac_ops dwmac100_ops;
    619extern const struct stmmac_dma_ops dwmac100_dma_ops;
    620extern const struct stmmac_ops dwmac1000_ops;
    621extern const struct stmmac_dma_ops dwmac1000_dma_ops;
    622extern const struct stmmac_ops dwmac4_ops;
    623extern const struct stmmac_dma_ops dwmac4_dma_ops;
    624extern const struct stmmac_ops dwmac410_ops;
    625extern const struct stmmac_dma_ops dwmac410_dma_ops;
    626extern const struct stmmac_ops dwmac510_ops;
    627extern const struct stmmac_tc_ops dwmac510_tc_ops;
    628extern const struct stmmac_ops dwxgmac210_ops;
    629extern const struct stmmac_ops dwxlgmac2_ops;
    630extern const struct stmmac_dma_ops dwxgmac210_dma_ops;
    631extern const struct stmmac_desc_ops dwxgmac210_desc_ops;
    632extern const struct stmmac_mmc_ops dwmac_mmc_ops;
    633extern const struct stmmac_mmc_ops dwxgmac_mmc_ops;
    634
    635#define GMAC_VERSION		0x00000020	/* GMAC CORE Version */
    636#define GMAC4_VERSION		0x00000110	/* GMAC4+ CORE Version */
    637
    638int stmmac_hwif_init(struct stmmac_priv *priv);
    639
    640#endif /* __STMMAC_HWIF_H__ */