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

pci.h (8215B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __ASM_S390_PCI_H
      3#define __ASM_S390_PCI_H
      4
      5#include <linux/pci.h>
      6#include <linux/mutex.h>
      7#include <linux/iommu.h>
      8#include <linux/pci_hotplug.h>
      9#include <asm-generic/pci.h>
     10#include <asm/pci_clp.h>
     11#include <asm/pci_debug.h>
     12#include <asm/sclp.h>
     13
     14#define PCIBIOS_MIN_IO		0x1000
     15#define PCIBIOS_MIN_MEM		0x10000000
     16
     17#define pcibios_assign_all_busses()	(0)
     18
     19void __iomem *pci_iomap(struct pci_dev *, int, unsigned long);
     20void pci_iounmap(struct pci_dev *, void __iomem *);
     21int pci_domain_nr(struct pci_bus *);
     22int pci_proc_domain(struct pci_bus *);
     23
     24#define ZPCI_BUS_NR			0	/* default bus number */
     25
     26#define ZPCI_NR_DMA_SPACES		1
     27#define ZPCI_NR_DEVICES			CONFIG_PCI_NR_FUNCTIONS
     28#define ZPCI_DOMAIN_BITMAP_SIZE		(1 << 16)
     29
     30#ifdef PCI
     31#if (ZPCI_NR_DEVICES > ZPCI_DOMAIN_BITMAP_SIZE)
     32# error ZPCI_NR_DEVICES can not be bigger than ZPCI_DOMAIN_BITMAP_SIZE
     33#endif
     34#endif /* PCI */
     35
     36/* PCI Function Controls */
     37#define ZPCI_FC_FN_ENABLED		0x80
     38#define ZPCI_FC_ERROR			0x40
     39#define ZPCI_FC_BLOCKED			0x20
     40#define ZPCI_FC_DMA_ENABLED		0x10
     41
     42#define ZPCI_FMB_DMA_COUNTER_VALID	(1 << 23)
     43
     44struct zpci_fmb_fmt0 {
     45	u64 dma_rbytes;
     46	u64 dma_wbytes;
     47};
     48
     49struct zpci_fmb_fmt1 {
     50	u64 rx_bytes;
     51	u64 rx_packets;
     52	u64 tx_bytes;
     53	u64 tx_packets;
     54};
     55
     56struct zpci_fmb_fmt2 {
     57	u64 consumed_work_units;
     58	u64 max_work_units;
     59};
     60
     61struct zpci_fmb_fmt3 {
     62	u64 tx_bytes;
     63};
     64
     65struct zpci_fmb {
     66	u32 format	: 8;
     67	u32 fmt_ind	: 24;
     68	u32 samples;
     69	u64 last_update;
     70	/* common counters */
     71	u64 ld_ops;
     72	u64 st_ops;
     73	u64 stb_ops;
     74	u64 rpcit_ops;
     75	/* format specific counters */
     76	union {
     77		struct zpci_fmb_fmt0 fmt0;
     78		struct zpci_fmb_fmt1 fmt1;
     79		struct zpci_fmb_fmt2 fmt2;
     80		struct zpci_fmb_fmt3 fmt3;
     81	};
     82} __packed __aligned(128);
     83
     84enum zpci_state {
     85	ZPCI_FN_STATE_STANDBY = 0,
     86	ZPCI_FN_STATE_CONFIGURED = 1,
     87	ZPCI_FN_STATE_RESERVED = 2,
     88};
     89
     90struct zpci_bar_struct {
     91	struct resource *res;		/* bus resource */
     92	void __iomem	*mio_wb;
     93	void __iomem	*mio_wt;
     94	u32		val;		/* bar start & 3 flag bits */
     95	u16		map_idx;	/* index into bar mapping array */
     96	u8		size;		/* order 2 exponent */
     97};
     98
     99struct s390_domain;
    100
    101#define ZPCI_FUNCTIONS_PER_BUS 256
    102struct zpci_bus {
    103	struct kref		kref;
    104	struct pci_bus		*bus;
    105	struct zpci_dev		*function[ZPCI_FUNCTIONS_PER_BUS];
    106	struct list_head	resources;
    107	struct list_head	bus_next;
    108	struct resource		bus_resource;
    109	int			pchid;
    110	int			domain_nr;
    111	bool			multifunction;
    112	enum pci_bus_speed	max_bus_speed;
    113};
    114
    115/* Private data per function */
    116struct zpci_dev {
    117	struct zpci_bus *zbus;
    118	struct list_head entry;		/* list of all zpci_devices, needed for hotplug, etc. */
    119	struct list_head bus_next;
    120	struct kref kref;
    121	struct hotplug_slot hotplug_slot;
    122
    123	enum zpci_state state;
    124	u32		fid;		/* function ID, used by sclp */
    125	u32		fh;		/* function handle, used by insn's */
    126	u16		vfn;		/* virtual function number */
    127	u16		pchid;		/* physical channel ID */
    128	u8		pfgid;		/* function group ID */
    129	u8		pft;		/* pci function type */
    130	u8		port;
    131	u8		rid_available	: 1;
    132	u8		has_hp_slot	: 1;
    133	u8		has_resources	: 1;
    134	u8		is_physfn	: 1;
    135	u8		util_str_avail	: 1;
    136	u8		irqs_registered	: 1;
    137	u8		reserved	: 2;
    138	unsigned int	devfn;		/* DEVFN part of the RID*/
    139
    140	struct mutex lock;
    141	u8 pfip[CLP_PFIP_NR_SEGMENTS];	/* pci function internal path */
    142	u32 uid;			/* user defined id */
    143	u8 util_str[CLP_UTIL_STR_LEN];	/* utility string */
    144
    145	/* IRQ stuff */
    146	u64		msi_addr;	/* MSI address */
    147	unsigned int	max_msi;	/* maximum number of MSI's */
    148	unsigned int	msi_first_bit;
    149	unsigned int	msi_nr_irqs;
    150	struct airq_iv *aibv;		/* adapter interrupt bit vector */
    151	unsigned long	aisb;		/* number of the summary bit */
    152
    153	/* DMA stuff */
    154	unsigned long	*dma_table;
    155	spinlock_t	dma_table_lock;
    156	int		tlb_refresh;
    157
    158	spinlock_t	iommu_bitmap_lock;
    159	unsigned long	*iommu_bitmap;
    160	unsigned long	*lazy_bitmap;
    161	unsigned long	iommu_size;
    162	unsigned long	iommu_pages;
    163	unsigned int	next_bit;
    164
    165	struct iommu_device iommu_dev;  /* IOMMU core handle */
    166
    167	char res_name[16];
    168	bool mio_capable;
    169	struct zpci_bar_struct bars[PCI_STD_NUM_BARS];
    170
    171	u64		start_dma;	/* Start of available DMA addresses */
    172	u64		end_dma;	/* End of available DMA addresses */
    173	u64		dma_mask;	/* DMA address space mask */
    174
    175	/* Function measurement block */
    176	struct zpci_fmb *fmb;
    177	u16		fmb_update;	/* update interval */
    178	u16		fmb_length;
    179	/* software counters */
    180	atomic64_t allocated_pages;
    181	atomic64_t mapped_pages;
    182	atomic64_t unmapped_pages;
    183
    184	u8		version;
    185	enum pci_bus_speed max_bus_speed;
    186
    187	struct dentry	*debugfs_dev;
    188
    189	struct s390_domain *s390_domain; /* s390 IOMMU domain data */
    190};
    191
    192static inline bool zdev_enabled(struct zpci_dev *zdev)
    193{
    194	return (zdev->fh & (1UL << 31)) ? true : false;
    195}
    196
    197extern const struct attribute_group *zpci_attr_groups[];
    198extern unsigned int s390_pci_force_floating __initdata;
    199extern unsigned int s390_pci_no_rid;
    200
    201/* -----------------------------------------------------------------------------
    202  Prototypes
    203----------------------------------------------------------------------------- */
    204/* Base stuff */
    205struct zpci_dev *zpci_create_device(u32 fid, u32 fh, enum zpci_state state);
    206int zpci_enable_device(struct zpci_dev *);
    207int zpci_disable_device(struct zpci_dev *);
    208int zpci_scan_configured_device(struct zpci_dev *zdev, u32 fh);
    209int zpci_deconfigure_device(struct zpci_dev *zdev);
    210void zpci_device_reserved(struct zpci_dev *zdev);
    211bool zpci_is_device_configured(struct zpci_dev *zdev);
    212
    213int zpci_hot_reset_device(struct zpci_dev *zdev);
    214int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
    215int zpci_unregister_ioat(struct zpci_dev *, u8);
    216void zpci_remove_reserved_devices(void);
    217void zpci_update_fh(struct zpci_dev *zdev, u32 fh);
    218
    219/* CLP */
    220int clp_setup_writeback_mio(void);
    221int clp_scan_pci_devices(void);
    222int clp_query_pci_fn(struct zpci_dev *zdev);
    223int clp_enable_fh(struct zpci_dev *zdev, u32 *fh, u8 nr_dma_as);
    224int clp_disable_fh(struct zpci_dev *zdev, u32 *fh);
    225int clp_get_state(u32 fid, enum zpci_state *state);
    226int clp_refresh_fh(u32 fid, u32 *fh);
    227
    228/* UID */
    229void update_uid_checking(bool new);
    230
    231/* IOMMU Interface */
    232int zpci_init_iommu(struct zpci_dev *zdev);
    233void zpci_destroy_iommu(struct zpci_dev *zdev);
    234
    235#ifdef CONFIG_PCI
    236static inline bool zpci_use_mio(struct zpci_dev *zdev)
    237{
    238	return static_branch_likely(&have_mio) && zdev->mio_capable;
    239}
    240
    241/* Error handling and recovery */
    242void zpci_event_error(void *);
    243void zpci_event_availability(void *);
    244bool zpci_is_enabled(void);
    245#else /* CONFIG_PCI */
    246static inline void zpci_event_error(void *e) {}
    247static inline void zpci_event_availability(void *e) {}
    248#endif /* CONFIG_PCI */
    249
    250#ifdef CONFIG_HOTPLUG_PCI_S390
    251int zpci_init_slot(struct zpci_dev *);
    252void zpci_exit_slot(struct zpci_dev *);
    253#else /* CONFIG_HOTPLUG_PCI_S390 */
    254static inline int zpci_init_slot(struct zpci_dev *zdev)
    255{
    256	return 0;
    257}
    258static inline void zpci_exit_slot(struct zpci_dev *zdev) {}
    259#endif /* CONFIG_HOTPLUG_PCI_S390 */
    260
    261/* Helpers */
    262static inline struct zpci_dev *to_zpci(struct pci_dev *pdev)
    263{
    264	struct zpci_bus *zbus = pdev->sysdata;
    265
    266	return zbus->function[pdev->devfn];
    267}
    268
    269static inline struct zpci_dev *to_zpci_dev(struct device *dev)
    270{
    271	return to_zpci(to_pci_dev(dev));
    272}
    273
    274struct zpci_dev *get_zdev_by_fid(u32);
    275
    276/* DMA */
    277int zpci_dma_init(void);
    278void zpci_dma_exit(void);
    279int zpci_dma_init_device(struct zpci_dev *zdev);
    280int zpci_dma_exit_device(struct zpci_dev *zdev);
    281
    282/* IRQ */
    283int __init zpci_irq_init(void);
    284void __init zpci_irq_exit(void);
    285
    286/* FMB */
    287int zpci_fmb_enable_device(struct zpci_dev *);
    288int zpci_fmb_disable_device(struct zpci_dev *);
    289
    290/* Debug */
    291int zpci_debug_init(void);
    292void zpci_debug_exit(void);
    293void zpci_debug_init_device(struct zpci_dev *, const char *);
    294void zpci_debug_exit_device(struct zpci_dev *);
    295
    296/* Error handling */
    297int zpci_report_error(struct pci_dev *, struct zpci_report_error_header *);
    298int zpci_clear_error_state(struct zpci_dev *zdev);
    299int zpci_reset_load_store_blocked(struct zpci_dev *zdev);
    300
    301#ifdef CONFIG_NUMA
    302
    303/* Returns the node based on PCI bus */
    304static inline int __pcibus_to_node(const struct pci_bus *bus)
    305{
    306	return NUMA_NO_NODE;
    307}
    308
    309static inline const struct cpumask *
    310cpumask_of_pcibus(const struct pci_bus *bus)
    311{
    312	return cpu_online_mask;
    313}
    314
    315#endif /* CONFIG_NUMA */
    316
    317#endif