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

tsnep.h (3994B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */
      3
      4#ifndef _TSNEP_H
      5#define _TSNEP_H
      6
      7#include "tsnep_hw.h"
      8
      9#include <linux/platform_device.h>
     10#include <linux/dma-mapping.h>
     11#include <linux/etherdevice.h>
     12#include <linux/phy.h>
     13#include <linux/ethtool.h>
     14#include <linux/net_tstamp.h>
     15#include <linux/ptp_clock_kernel.h>
     16#include <linux/miscdevice.h>
     17
     18#define TSNEP "tsnep"
     19
     20#define TSNEP_RING_SIZE 256
     21#define TSNEP_RING_ENTRIES_PER_PAGE (PAGE_SIZE / TSNEP_DESC_SIZE)
     22#define TSNEP_RING_PAGE_COUNT (TSNEP_RING_SIZE / TSNEP_RING_ENTRIES_PER_PAGE)
     23
     24#define TSNEP_QUEUES 1
     25
     26struct tsnep_gcl {
     27	void __iomem *addr;
     28
     29	u64 base_time;
     30	u64 cycle_time;
     31	u64 cycle_time_extension;
     32
     33	struct tsnep_gcl_operation operation[TSNEP_GCL_COUNT];
     34	int count;
     35
     36	u64 change_limit;
     37
     38	u64 start_time;
     39	bool change;
     40};
     41
     42struct tsnep_tx_entry {
     43	struct tsnep_tx_desc *desc;
     44	struct tsnep_tx_desc_wb *desc_wb;
     45	dma_addr_t desc_dma;
     46	bool owner_user_flag;
     47
     48	u32 properties;
     49
     50	struct sk_buff *skb;
     51	size_t len;
     52	DEFINE_DMA_UNMAP_ADDR(dma);
     53};
     54
     55struct tsnep_tx {
     56	struct tsnep_adapter *adapter;
     57	void __iomem *addr;
     58
     59	void *page[TSNEP_RING_PAGE_COUNT];
     60	dma_addr_t page_dma[TSNEP_RING_PAGE_COUNT];
     61
     62	/* TX ring lock */
     63	spinlock_t lock;
     64	struct tsnep_tx_entry entry[TSNEP_RING_SIZE];
     65	int write;
     66	int read;
     67	u32 owner_counter;
     68	int increment_owner_counter;
     69
     70	u32 packets;
     71	u32 bytes;
     72	u32 dropped;
     73};
     74
     75struct tsnep_rx_entry {
     76	struct tsnep_rx_desc *desc;
     77	struct tsnep_rx_desc_wb *desc_wb;
     78	dma_addr_t desc_dma;
     79
     80	u32 properties;
     81
     82	struct sk_buff *skb;
     83	size_t len;
     84	DEFINE_DMA_UNMAP_ADDR(dma);
     85};
     86
     87struct tsnep_rx {
     88	struct tsnep_adapter *adapter;
     89	void __iomem *addr;
     90
     91	void *page[TSNEP_RING_PAGE_COUNT];
     92	dma_addr_t page_dma[TSNEP_RING_PAGE_COUNT];
     93
     94	struct tsnep_rx_entry entry[TSNEP_RING_SIZE];
     95	int read;
     96	u32 owner_counter;
     97	int increment_owner_counter;
     98
     99	u32 packets;
    100	u32 bytes;
    101	u32 dropped;
    102	u32 multicast;
    103};
    104
    105struct tsnep_queue {
    106	struct tsnep_adapter *adapter;
    107
    108	struct tsnep_tx *tx;
    109	struct tsnep_rx *rx;
    110
    111	struct napi_struct napi;
    112
    113	u32 irq_mask;
    114};
    115
    116struct tsnep_adapter {
    117	struct net_device *netdev;
    118	u8 mac_address[ETH_ALEN];
    119	struct mii_bus *mdiobus;
    120	bool suppress_preamble;
    121	phy_interface_t phy_mode;
    122	struct phy_device *phydev;
    123	int msg_enable;
    124
    125	struct platform_device *pdev;
    126	struct device *dmadev;
    127	void __iomem *addr;
    128	int irq;
    129
    130	bool gate_control;
    131	/* gate control lock */
    132	struct mutex gate_control_lock;
    133	bool gate_control_active;
    134	struct tsnep_gcl gcl[2];
    135	int next_gcl;
    136
    137	struct hwtstamp_config hwtstamp_config;
    138	struct ptp_clock *ptp_clock;
    139	struct ptp_clock_info ptp_clock_info;
    140	/* ptp clock lock */
    141	spinlock_t ptp_lock;
    142
    143	int num_tx_queues;
    144	struct tsnep_tx tx[TSNEP_MAX_QUEUES];
    145	int num_rx_queues;
    146	struct tsnep_rx rx[TSNEP_MAX_QUEUES];
    147
    148	int num_queues;
    149	struct tsnep_queue queue[TSNEP_MAX_QUEUES];
    150};
    151
    152extern const struct ethtool_ops tsnep_ethtool_ops;
    153
    154int tsnep_ptp_init(struct tsnep_adapter *adapter);
    155void tsnep_ptp_cleanup(struct tsnep_adapter *adapter);
    156int tsnep_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
    157
    158int tsnep_tc_init(struct tsnep_adapter *adapter);
    159void tsnep_tc_cleanup(struct tsnep_adapter *adapter);
    160int tsnep_tc_setup(struct net_device *netdev, enum tc_setup_type type,
    161		   void *type_data);
    162
    163#if IS_ENABLED(CONFIG_TSNEP_SELFTESTS)
    164int tsnep_ethtool_get_test_count(void);
    165void tsnep_ethtool_get_test_strings(u8 *data);
    166void tsnep_ethtool_self_test(struct net_device *netdev,
    167			     struct ethtool_test *eth_test, u64 *data);
    168#else
    169static inline int tsnep_ethtool_get_test_count(void)
    170{
    171	return -EOPNOTSUPP;
    172}
    173
    174static inline void tsnep_ethtool_get_test_strings(u8 *data)
    175{
    176	/* not enabled */
    177}
    178
    179static inline void tsnep_ethtool_self_test(struct net_device *dev,
    180					   struct ethtool_test *eth_test,
    181					   u64 *data)
    182{
    183	/* not enabled */
    184}
    185#endif /* CONFIG_TSNEP_SELFTESTS */
    186
    187void tsnep_get_system_time(struct tsnep_adapter *adapter, u64 *time);
    188
    189#endif /* _TSNEP_H */