1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2a88b5ba8SSam Ravnborg /* pci_impl.h: Helper definitions for PCI controller support. 3a88b5ba8SSam Ravnborg * 4a88b5ba8SSam Ravnborg * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net) 5a88b5ba8SSam Ravnborg */ 6a88b5ba8SSam Ravnborg 7a88b5ba8SSam Ravnborg #ifndef PCI_IMPL_H 8a88b5ba8SSam Ravnborg #define PCI_IMPL_H 9a88b5ba8SSam Ravnborg 10a88b5ba8SSam Ravnborg #include <linux/types.h> 11a88b5ba8SSam Ravnborg #include <linux/spinlock.h> 12a88b5ba8SSam Ravnborg #include <linux/pci.h> 13a88b5ba8SSam Ravnborg #include <linux/msi.h> 14a88b5ba8SSam Ravnborg #include <asm/io.h> 15a88b5ba8SSam Ravnborg #include <asm/prom.h> 16a88b5ba8SSam Ravnborg #include <asm/iommu.h> 17a88b5ba8SSam Ravnborg 18a88b5ba8SSam Ravnborg /* The abstraction used here is that there are PCI controllers, 19a88b5ba8SSam Ravnborg * each with one (Sabre) or two (PSYCHO/SCHIZO) PCI bus modules 20a88b5ba8SSam Ravnborg * underneath. Each PCI bus module uses an IOMMU (shared by both 21a88b5ba8SSam Ravnborg * PBMs of a controller, or per-PBM), and if a streaming buffer 22a88b5ba8SSam Ravnborg * is present, each PCI bus module has it's own. (ie. the IOMMU 23a88b5ba8SSam Ravnborg * might be shared between PBMs, the STC is never shared) 24a88b5ba8SSam Ravnborg * Furthermore, each PCI bus module controls it's own autonomous 25a88b5ba8SSam Ravnborg * PCI bus. 26a88b5ba8SSam Ravnborg */ 27a88b5ba8SSam Ravnborg 28a88b5ba8SSam Ravnborg #define PCI_STC_FLUSHFLAG_INIT(STC) \ 29a88b5ba8SSam Ravnborg (*((STC)->strbuf_flushflag) = 0UL) 30a88b5ba8SSam Ravnborg #define PCI_STC_FLUSHFLAG_SET(STC) \ 31a88b5ba8SSam Ravnborg (*((STC)->strbuf_flushflag) != 0UL) 32a88b5ba8SSam Ravnborg 33a88b5ba8SSam Ravnborg #ifdef CONFIG_PCI_MSI 34a88b5ba8SSam Ravnborg struct pci_pbm_info; 35a88b5ba8SSam Ravnborg struct sparc64_msiq_ops { 36a88b5ba8SSam Ravnborg int (*get_head)(struct pci_pbm_info *pbm, unsigned long msiqid, 37a88b5ba8SSam Ravnborg unsigned long *head); 38a88b5ba8SSam Ravnborg int (*dequeue_msi)(struct pci_pbm_info *pbm, unsigned long msiqid, 39a88b5ba8SSam Ravnborg unsigned long *head, unsigned long *msi); 40a88b5ba8SSam Ravnborg int (*set_head)(struct pci_pbm_info *pbm, unsigned long msiqid, 41a88b5ba8SSam Ravnborg unsigned long head); 42a88b5ba8SSam Ravnborg int (*msi_setup)(struct pci_pbm_info *pbm, unsigned long msiqid, 43a88b5ba8SSam Ravnborg unsigned long msi, int is_msi64); 44a88b5ba8SSam Ravnborg int (*msi_teardown)(struct pci_pbm_info *pbm, unsigned long msi); 45a88b5ba8SSam Ravnborg int (*msiq_alloc)(struct pci_pbm_info *pbm); 46a88b5ba8SSam Ravnborg void (*msiq_free)(struct pci_pbm_info *pbm); 47a88b5ba8SSam Ravnborg int (*msiq_build_irq)(struct pci_pbm_info *pbm, unsigned long msiqid, 48a88b5ba8SSam Ravnborg unsigned long devino); 49a88b5ba8SSam Ravnborg }; 50a88b5ba8SSam Ravnborg 512e74a74fSSam Ravnborg void sparc64_pbm_msi_init(struct pci_pbm_info *pbm, 52a88b5ba8SSam Ravnborg const struct sparc64_msiq_ops *ops); 53a88b5ba8SSam Ravnborg 54a88b5ba8SSam Ravnborg struct sparc64_msiq_cookie { 55a88b5ba8SSam Ravnborg struct pci_pbm_info *pbm; 56a88b5ba8SSam Ravnborg unsigned long msiqid; 57a88b5ba8SSam Ravnborg }; 58a88b5ba8SSam Ravnborg #endif 59a88b5ba8SSam Ravnborg 60a88b5ba8SSam Ravnborg struct pci_pbm_info { 61a88b5ba8SSam Ravnborg struct pci_pbm_info *next; 62a88b5ba8SSam Ravnborg struct pci_pbm_info *sibling; 63a88b5ba8SSam Ravnborg int index; 64a88b5ba8SSam Ravnborg 65a88b5ba8SSam Ravnborg /* Physical address base of controller registers. */ 66a88b5ba8SSam Ravnborg unsigned long controller_regs; 67a88b5ba8SSam Ravnborg 68a88b5ba8SSam Ravnborg /* Physical address base of PBM registers. */ 69a88b5ba8SSam Ravnborg unsigned long pbm_regs; 70a88b5ba8SSam Ravnborg 71a88b5ba8SSam Ravnborg /* Physical address of DMA sync register, if any. */ 72a88b5ba8SSam Ravnborg unsigned long sync_reg; 73a88b5ba8SSam Ravnborg 74a88b5ba8SSam Ravnborg /* Opaque 32-bit system bus Port ID. */ 75a88b5ba8SSam Ravnborg u32 portid; 76a88b5ba8SSam Ravnborg 77a88b5ba8SSam Ravnborg /* Opaque 32-bit handle used for hypervisor calls. */ 78a88b5ba8SSam Ravnborg u32 devhandle; 79a88b5ba8SSam Ravnborg 80a88b5ba8SSam Ravnborg /* Chipset version information. */ 81a88b5ba8SSam Ravnborg int chip_type; 82a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SABRE 1 83a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_PSYCHO 2 84a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SCHIZO 3 85a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SCHIZO_PLUS 4 86a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_TOMATILLO 5 87a88b5ba8SSam Ravnborg int chip_version; 88a88b5ba8SSam Ravnborg int chip_revision; 89a88b5ba8SSam Ravnborg 90a88b5ba8SSam Ravnborg /* Name used for top-level resources. */ 91c22618a1SGrant Likely const char *name; 92a88b5ba8SSam Ravnborg 93a88b5ba8SSam Ravnborg /* OBP specific information. */ 94cd4cd730SGrant Likely struct platform_device *op; 95a88b5ba8SSam Ravnborg u64 ino_bitmap; 96a88b5ba8SSam Ravnborg 97a88b5ba8SSam Ravnborg /* PBM I/O and Memory space resources. */ 98a88b5ba8SSam Ravnborg struct resource io_space; 99a88b5ba8SSam Ravnborg struct resource mem_space; 100af86fa40SYinghai Lu struct resource mem64_space; 1013f1b540dSYinghai Lu struct resource busn; 102*b4a30448SYinghai Lu /* offset */ 103*b4a30448SYinghai Lu resource_size_t io_offset; 104*b4a30448SYinghai Lu resource_size_t mem_offset; 105*b4a30448SYinghai Lu resource_size_t mem64_offset; 106a88b5ba8SSam Ravnborg 107a88b5ba8SSam Ravnborg /* Base of PCI Config space, can be per-PBM or shared. */ 108a88b5ba8SSam Ravnborg unsigned long config_space; 109a88b5ba8SSam Ravnborg 110a88b5ba8SSam Ravnborg /* This will be 12 on PCI-E controllers, 8 elsewhere. */ 111a88b5ba8SSam Ravnborg unsigned long config_space_reg_bits; 112a88b5ba8SSam Ravnborg 113a88b5ba8SSam Ravnborg unsigned long pci_afsr; 114a88b5ba8SSam Ravnborg unsigned long pci_afar; 115a88b5ba8SSam Ravnborg unsigned long pci_csr; 116a88b5ba8SSam Ravnborg 117a88b5ba8SSam Ravnborg /* State of 66MHz capabilities on this PBM. */ 118a88b5ba8SSam Ravnborg int is_66mhz_capable; 119a88b5ba8SSam Ravnborg int all_devs_66mhz; 120a88b5ba8SSam Ravnborg 121a88b5ba8SSam Ravnborg #ifdef CONFIG_PCI_MSI 122a88b5ba8SSam Ravnborg /* MSI info. */ 123a88b5ba8SSam Ravnborg u32 msiq_num; 124a88b5ba8SSam Ravnborg u32 msiq_ent_count; 125a88b5ba8SSam Ravnborg u32 msiq_first; 126a88b5ba8SSam Ravnborg u32 msiq_first_devino; 127a88b5ba8SSam Ravnborg u32 msiq_rotor; 128a88b5ba8SSam Ravnborg struct sparc64_msiq_cookie *msiq_irq_cookies; 129a88b5ba8SSam Ravnborg u32 msi_num; 130a88b5ba8SSam Ravnborg u32 msi_first; 131a88b5ba8SSam Ravnborg u32 msi_data_mask; 132a88b5ba8SSam Ravnborg u32 msix_data_width; 133a88b5ba8SSam Ravnborg u64 msi32_start; 134a88b5ba8SSam Ravnborg u64 msi64_start; 135a88b5ba8SSam Ravnborg u32 msi32_len; 136a88b5ba8SSam Ravnborg u32 msi64_len; 137a88b5ba8SSam Ravnborg void *msi_queues; 138a88b5ba8SSam Ravnborg unsigned long *msi_bitmap; 139a88b5ba8SSam Ravnborg unsigned int *msi_irq_table; 14044ed3c0cSSam Ravnborg int (*setup_msi_irq)(unsigned int *irq_p, struct pci_dev *pdev, 141a88b5ba8SSam Ravnborg struct msi_desc *entry); 14244ed3c0cSSam Ravnborg void (*teardown_msi_irq)(unsigned int irq, struct pci_dev *pdev); 143a88b5ba8SSam Ravnborg const struct sparc64_msiq_ops *msi_ops; 144a88b5ba8SSam Ravnborg #endif /* !(CONFIG_PCI_MSI) */ 145a88b5ba8SSam Ravnborg 146a88b5ba8SSam Ravnborg /* This PBM's streaming buffer. */ 147a88b5ba8SSam Ravnborg struct strbuf stc; 148a88b5ba8SSam Ravnborg 149a88b5ba8SSam Ravnborg /* IOMMU state, potentially shared by both PBM segments. */ 150a88b5ba8SSam Ravnborg struct iommu *iommu; 151a88b5ba8SSam Ravnborg 152a88b5ba8SSam Ravnborg /* Now things for the actual PCI bus probes. */ 153a88b5ba8SSam Ravnborg unsigned int pci_first_busno; 154a88b5ba8SSam Ravnborg unsigned int pci_last_busno; 155a88b5ba8SSam Ravnborg struct pci_bus *pci_bus; 156a88b5ba8SSam Ravnborg struct pci_ops *pci_ops; 157a88b5ba8SSam Ravnborg 158a88b5ba8SSam Ravnborg int numa_node; 159a88b5ba8SSam Ravnborg }; 160a88b5ba8SSam Ravnborg 161a88b5ba8SSam Ravnborg extern struct pci_pbm_info *pci_pbm_root; 162a88b5ba8SSam Ravnborg 163a88b5ba8SSam Ravnborg extern int pci_num_pbms; 164a88b5ba8SSam Ravnborg 165a88b5ba8SSam Ravnborg /* PCI bus scanning and fixup support. */ 1662e74a74fSSam Ravnborg void pci_get_pbm_props(struct pci_pbm_info *pbm); 1672e74a74fSSam Ravnborg struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, 168a88b5ba8SSam Ravnborg struct device *parent); 1692e74a74fSSam Ravnborg void pci_determine_mem_io_space(struct pci_pbm_info *pbm); 170a88b5ba8SSam Ravnborg 171a88b5ba8SSam Ravnborg /* Error reporting support. */ 1722e74a74fSSam Ravnborg void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); 1732e74a74fSSam Ravnborg void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); 1742e74a74fSSam Ravnborg void pci_scan_for_parity_error(struct pci_pbm_info *, struct pci_bus *); 175a88b5ba8SSam Ravnborg 176a88b5ba8SSam Ravnborg /* Configuration space access. */ 1772e74a74fSSam Ravnborg void pci_config_read8(u8 *addr, u8 *ret); 1782e74a74fSSam Ravnborg void pci_config_read16(u16 *addr, u16 *ret); 1792e74a74fSSam Ravnborg void pci_config_read32(u32 *addr, u32 *ret); 1802e74a74fSSam Ravnborg void pci_config_write8(u8 *addr, u8 val); 1812e74a74fSSam Ravnborg void pci_config_write16(u16 *addr, u16 val); 1822e74a74fSSam Ravnborg void pci_config_write32(u32 *addr, u32 val); 183a88b5ba8SSam Ravnborg 184a88b5ba8SSam Ravnborg extern struct pci_ops sun4u_pci_ops; 185a88b5ba8SSam Ravnborg extern struct pci_ops sun4v_pci_ops; 186a88b5ba8SSam Ravnborg 187a88b5ba8SSam Ravnborg extern volatile int pci_poke_in_progress; 188a88b5ba8SSam Ravnborg extern volatile int pci_poke_cpu; 189a88b5ba8SSam Ravnborg extern volatile int pci_poke_faulted; 190a88b5ba8SSam Ravnborg 191a88b5ba8SSam Ravnborg #endif /* !(PCI_IMPL_H) */ 192