1c6557e7fSMartin Schwidefsky #ifndef __ASM_S390_PCI_H 2c6557e7fSMartin Schwidefsky #define __ASM_S390_PCI_H 3c6557e7fSMartin Schwidefsky 4cd248341SJan Glauber /* must be set before including asm-generic/pci.h */ 5c6557e7fSMartin Schwidefsky #define PCI_DMA_BUS_IS_PHYS (0) 6cd248341SJan Glauber /* must be set before including pci_clp.h */ 7cd248341SJan Glauber #define PCI_BAR_COUNT 6 8c6557e7fSMartin Schwidefsky 9cd248341SJan Glauber #include <asm-generic/pci.h> 10cd248341SJan Glauber #include <asm-generic/pci-dma-compat.h> 11a755a45dSJan Glauber #include <asm/pci_clp.h> 12d0b08853SJan Glauber #include <asm/pci_debug.h> 13c6557e7fSMartin Schwidefsky 14cd248341SJan Glauber #define PCIBIOS_MIN_IO 0x1000 15cd248341SJan Glauber #define PCIBIOS_MIN_MEM 0x10000000 16cd248341SJan Glauber 17cd248341SJan Glauber #define pcibios_assign_all_busses() (0) 18cd248341SJan Glauber 19cd248341SJan Glauber void __iomem *pci_iomap(struct pci_dev *, int, unsigned long); 20cd248341SJan Glauber void pci_iounmap(struct pci_dev *, void __iomem *); 21cd248341SJan Glauber int pci_domain_nr(struct pci_bus *); 22cd248341SJan Glauber int pci_proc_domain(struct pci_bus *); 23cd248341SJan Glauber 249a4da8a5SJan Glauber /* MSI arch hooks */ 259a4da8a5SJan Glauber #define arch_setup_msi_irqs arch_setup_msi_irqs 269a4da8a5SJan Glauber #define arch_teardown_msi_irqs arch_teardown_msi_irqs 279a4da8a5SJan Glauber 28cd248341SJan Glauber #define ZPCI_BUS_NR 0 /* default bus number */ 29cd248341SJan Glauber #define ZPCI_DEVFN 0 /* default device number */ 30cd248341SJan Glauber 31cd248341SJan Glauber /* PCI Function Controls */ 32cd248341SJan Glauber #define ZPCI_FC_FN_ENABLED 0x80 33cd248341SJan Glauber #define ZPCI_FC_ERROR 0x40 34cd248341SJan Glauber #define ZPCI_FC_BLOCKED 0x20 35cd248341SJan Glauber #define ZPCI_FC_DMA_ENABLED 0x10 36cd248341SJan Glauber 37d0b08853SJan Glauber struct zpci_fmb { 38d0b08853SJan Glauber u32 format : 8; 39d0b08853SJan Glauber u32 dma_valid : 1; 40d0b08853SJan Glauber u32 : 23; 41d0b08853SJan Glauber u32 samples; 42d0b08853SJan Glauber u64 last_update; 43d0b08853SJan Glauber /* hardware counters */ 44d0b08853SJan Glauber u64 ld_ops; 45d0b08853SJan Glauber u64 st_ops; 46d0b08853SJan Glauber u64 stb_ops; 47d0b08853SJan Glauber u64 rpcit_ops; 48d0b08853SJan Glauber u64 dma_rbytes; 49d0b08853SJan Glauber u64 dma_wbytes; 50d0b08853SJan Glauber /* software counters */ 51d0b08853SJan Glauber atomic64_t allocated_pages; 52d0b08853SJan Glauber atomic64_t mapped_pages; 53d0b08853SJan Glauber atomic64_t unmapped_pages; 54d0b08853SJan Glauber } __packed __aligned(16); 55d0b08853SJan Glauber 569a4da8a5SJan Glauber struct msi_map { 579a4da8a5SJan Glauber unsigned long irq; 589a4da8a5SJan Glauber struct msi_desc *msi; 599a4da8a5SJan Glauber struct hlist_node msi_chain; 609a4da8a5SJan Glauber }; 619a4da8a5SJan Glauber 629a4da8a5SJan Glauber #define ZPCI_NR_MSI_VECS 64 639a4da8a5SJan Glauber #define ZPCI_MSI_MASK (ZPCI_NR_MSI_VECS - 1) 649a4da8a5SJan Glauber 65cd248341SJan Glauber enum zpci_state { 66cd248341SJan Glauber ZPCI_FN_STATE_RESERVED, 67cd248341SJan Glauber ZPCI_FN_STATE_STANDBY, 68cd248341SJan Glauber ZPCI_FN_STATE_CONFIGURED, 69cd248341SJan Glauber ZPCI_FN_STATE_ONLINE, 70cd248341SJan Glauber NR_ZPCI_FN_STATES, 71cd248341SJan Glauber }; 72cd248341SJan Glauber 73cd248341SJan Glauber struct zpci_bar_struct { 74cd248341SJan Glauber u32 val; /* bar start & 3 flag bits */ 75cd248341SJan Glauber u8 size; /* order 2 exponent */ 76cd248341SJan Glauber u16 map_idx; /* index into bar mapping array */ 77cd248341SJan Glauber }; 78cd248341SJan Glauber 79cd248341SJan Glauber /* Private data per function */ 80cd248341SJan Glauber struct zpci_dev { 81cd248341SJan Glauber struct pci_dev *pdev; 82cd248341SJan Glauber struct pci_bus *bus; 83cd248341SJan Glauber struct list_head entry; /* list of all zpci_devices, needed for hotplug, etc. */ 84cd248341SJan Glauber 85cd248341SJan Glauber enum zpci_state state; 86cd248341SJan Glauber u32 fid; /* function ID, used by sclp */ 87cd248341SJan Glauber u32 fh; /* function handle, used by insn's */ 88cd248341SJan Glauber u16 pchid; /* physical channel ID */ 89cd248341SJan Glauber u8 pfgid; /* function group ID */ 90cd248341SJan Glauber u16 domain; 91cd248341SJan Glauber 929a4da8a5SJan Glauber /* IRQ stuff */ 939a4da8a5SJan Glauber u64 msi_addr; /* MSI address */ 949a4da8a5SJan Glauber struct zdev_irq_map *irq_map; 959a4da8a5SJan Glauber struct msi_map *msi_map[ZPCI_NR_MSI_VECS]; 969a4da8a5SJan Glauber unsigned int aisb; /* number of the summary bit */ 979a4da8a5SJan Glauber 98828b35f6SJan Glauber /* DMA stuff */ 99828b35f6SJan Glauber unsigned long *dma_table; 100828b35f6SJan Glauber spinlock_t dma_table_lock; 101828b35f6SJan Glauber int tlb_refresh; 102828b35f6SJan Glauber 103828b35f6SJan Glauber spinlock_t iommu_bitmap_lock; 104828b35f6SJan Glauber unsigned long *iommu_bitmap; 105828b35f6SJan Glauber unsigned long iommu_size; 106828b35f6SJan Glauber unsigned long iommu_pages; 107828b35f6SJan Glauber unsigned int next_bit; 108828b35f6SJan Glauber 109cd248341SJan Glauber struct zpci_bar_struct bars[PCI_BAR_COUNT]; 110cd248341SJan Glauber 111828b35f6SJan Glauber u64 start_dma; /* Start of available DMA addresses */ 112828b35f6SJan Glauber u64 end_dma; /* End of available DMA addresses */ 113828b35f6SJan Glauber u64 dma_mask; /* DMA address space mask */ 114828b35f6SJan Glauber 115d0b08853SJan Glauber /* Function measurement block */ 116d0b08853SJan Glauber struct zpci_fmb *fmb; 117d0b08853SJan Glauber u16 fmb_update; /* update interval */ 118d0b08853SJan Glauber 119cd248341SJan Glauber enum pci_bus_speed max_bus_speed; 120d0b08853SJan Glauber 121d0b08853SJan Glauber struct dentry *debugfs_dev; 122d0b08853SJan Glauber struct dentry *debugfs_perf; 123d0b08853SJan Glauber struct dentry *debugfs_debug; 124cd248341SJan Glauber }; 125cd248341SJan Glauber 1267441b062SJan Glauber struct pci_hp_callback_ops { 1277441b062SJan Glauber int (*create_slot) (struct zpci_dev *zdev); 1287441b062SJan Glauber void (*remove_slot) (struct zpci_dev *zdev); 1297441b062SJan Glauber }; 1307441b062SJan Glauber 131cd248341SJan Glauber static inline bool zdev_enabled(struct zpci_dev *zdev) 132cd248341SJan Glauber { 133cd248341SJan Glauber return (zdev->fh & (1UL << 31)) ? true : false; 134cd248341SJan Glauber } 135cd248341SJan Glauber 136cd248341SJan Glauber /* ----------------------------------------------------------------------------- 137cd248341SJan Glauber Prototypes 138cd248341SJan Glauber ----------------------------------------------------------------------------- */ 139cd248341SJan Glauber /* Base stuff */ 140cd248341SJan Glauber struct zpci_dev *zpci_alloc_device(void); 141cd248341SJan Glauber int zpci_create_device(struct zpci_dev *); 142cd248341SJan Glauber int zpci_enable_device(struct zpci_dev *); 143cb65a669SSebastian Ott int zpci_disable_device(struct zpci_dev *); 144cd248341SJan Glauber void zpci_stop_device(struct zpci_dev *); 145cd248341SJan Glauber void zpci_free_device(struct zpci_dev *); 146cd248341SJan Glauber int zpci_scan_device(struct zpci_dev *); 147828b35f6SJan Glauber int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64); 148828b35f6SJan Glauber int zpci_unregister_ioat(struct zpci_dev *, u8); 149cd248341SJan Glauber 150a755a45dSJan Glauber /* CLP */ 151a755a45dSJan Glauber int clp_find_pci_devices(void); 152a755a45dSJan Glauber int clp_add_pci_device(u32, u32, int); 153a755a45dSJan Glauber int clp_enable_fh(struct zpci_dev *, u8); 154a755a45dSJan Glauber int clp_disable_fh(struct zpci_dev *); 155a755a45dSJan Glauber 1569a4da8a5SJan Glauber /* MSI */ 1579a4da8a5SJan Glauber struct msi_desc *__irq_get_msi_desc(unsigned int); 1589a4da8a5SJan Glauber int zpci_msi_set_mask_bits(struct msi_desc *, u32, u32); 1599a4da8a5SJan Glauber int zpci_setup_msi_irq(struct zpci_dev *, struct msi_desc *, unsigned int, int); 1609a4da8a5SJan Glauber void zpci_teardown_msi_irq(struct zpci_dev *, struct msi_desc *); 1619a4da8a5SJan Glauber int zpci_msihash_init(void); 1629a4da8a5SJan Glauber void zpci_msihash_exit(void); 1639a4da8a5SJan Glauber 1649a17e972SSebastian Ott #ifdef CONFIG_PCI 165cbc0dd1fSJan Glauber /* Error handling and recovery */ 166cbc0dd1fSJan Glauber void zpci_event_error(void *); 167cbc0dd1fSJan Glauber void zpci_event_availability(void *); 1689a17e972SSebastian Ott #else /* CONFIG_PCI */ 1699a17e972SSebastian Ott static inline void zpci_event_error(void *e) {} 1709a17e972SSebastian Ott static inline void zpci_event_availability(void *e) {} 1719a17e972SSebastian Ott #endif /* CONFIG_PCI */ 172cbc0dd1fSJan Glauber 173cd248341SJan Glauber /* Helpers */ 174cd248341SJan Glauber struct zpci_dev *get_zdev(struct pci_dev *); 175cd248341SJan Glauber struct zpci_dev *get_zdev_by_fid(u32); 176cd248341SJan Glauber bool zpci_fid_present(u32); 177cd248341SJan Glauber 1781e8da956SJan Glauber /* sysfs */ 1791e8da956SJan Glauber int zpci_sysfs_add_device(struct device *); 1801e8da956SJan Glauber void zpci_sysfs_remove_device(struct device *); 1811e8da956SJan Glauber 182828b35f6SJan Glauber /* DMA */ 183828b35f6SJan Glauber int zpci_dma_init(void); 184828b35f6SJan Glauber void zpci_dma_exit(void); 185828b35f6SJan Glauber 1867441b062SJan Glauber /* Hotplug */ 1877441b062SJan Glauber extern struct mutex zpci_list_lock; 1887441b062SJan Glauber extern struct list_head zpci_list; 1891e5635d1SHeiko Carstens extern unsigned int s390_pci_probe; 1907441b062SJan Glauber 19153923354SSebastian Ott void zpci_register_hp_ops(struct pci_hp_callback_ops *); 19253923354SSebastian Ott void zpci_deregister_hp_ops(void); 19353923354SSebastian Ott 194d0b08853SJan Glauber /* FMB */ 195d0b08853SJan Glauber int zpci_fmb_enable_device(struct zpci_dev *); 196d0b08853SJan Glauber int zpci_fmb_disable_device(struct zpci_dev *); 197d0b08853SJan Glauber 198d0b08853SJan Glauber /* Debug */ 199d0b08853SJan Glauber int zpci_debug_init(void); 200d0b08853SJan Glauber void zpci_debug_exit(void); 201d0b08853SJan Glauber void zpci_debug_init_device(struct zpci_dev *); 202d0b08853SJan Glauber void zpci_debug_exit_device(struct zpci_dev *); 203d0b08853SJan Glauber void zpci_debug_info(struct zpci_dev *, struct seq_file *); 204d0b08853SJan Glauber 205cd248341SJan Glauber #endif 206