08f1c192c3
This patch introduces struct pci_sysdata to x86 and x86-64, and converts the existing two users (NUMA, Calgary) to use it. This lays the groundwork for having other users of sysdata, such as the PCI domains work. The Calgary bits are tested, the NUMA bits just look ok. Signed-off-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: Muli Ben-Yehuda <muli@il.ibm.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
125 lines
3.4 KiB
C
125 lines
3.4 KiB
C
#ifndef __x8664_PCI_H
|
|
#define __x8664_PCI_H
|
|
|
|
#include <asm/io.h>
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
struct pci_sysdata {
|
|
int node; /* NUMA node */
|
|
void* iommu; /* IOMMU private data */
|
|
};
|
|
|
|
#ifdef CONFIG_CALGARY_IOMMU
|
|
static inline void* pci_iommu(struct pci_bus *bus)
|
|
{
|
|
struct pci_sysdata *sd = bus->sysdata;
|
|
return sd->iommu;
|
|
}
|
|
|
|
static inline void set_pci_iommu(struct pci_bus *bus, void *val)
|
|
{
|
|
struct pci_sysdata *sd = bus->sysdata;
|
|
sd->iommu = val;
|
|
}
|
|
#endif /* CONFIG_CALGARY_IOMMU */
|
|
|
|
#include <linux/mm.h> /* for struct page */
|
|
|
|
/* Can be used to override the logic in pci_scan_bus for skipping
|
|
already-configured bus numbers - to be used for buggy BIOSes
|
|
or architectures with incomplete PCI setup by the loader */
|
|
|
|
#ifdef CONFIG_PCI
|
|
extern unsigned int pcibios_assign_all_busses(void);
|
|
#else
|
|
#define pcibios_assign_all_busses() 0
|
|
#endif
|
|
#define pcibios_scan_all_fns(a, b) 0
|
|
|
|
extern unsigned long pci_mem_start;
|
|
#define PCIBIOS_MIN_IO 0x1000
|
|
#define PCIBIOS_MIN_MEM (pci_mem_start)
|
|
|
|
#define PCIBIOS_MIN_CARDBUS_IO 0x4000
|
|
|
|
void pcibios_config_init(void);
|
|
struct pci_bus * pcibios_scan_root(int bus);
|
|
extern int (*pci_config_read)(int seg, int bus, int dev, int fn, int reg, int len, u32 *value);
|
|
extern int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int len, u32 value);
|
|
|
|
void pcibios_set_master(struct pci_dev *dev);
|
|
void pcibios_penalize_isa_irq(int irq, int active);
|
|
struct irq_routing_table *pcibios_get_irq_routing_table(void);
|
|
int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/slab.h>
|
|
#include <asm/scatterlist.h>
|
|
#include <linux/string.h>
|
|
#include <asm/page.h>
|
|
|
|
extern void pci_iommu_alloc(void);
|
|
extern int iommu_setup(char *opt);
|
|
|
|
/* The PCI address space does equal the physical memory
|
|
* address space. The networking and block device layers use
|
|
* this boolean for bounce buffer decisions
|
|
*
|
|
* On AMD64 it mostly equals, but we set it to zero if a hardware
|
|
* IOMMU (gart) of sotware IOMMU (swiotlb) is available.
|
|
*/
|
|
#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
|
|
|
|
#if defined(CONFIG_IOMMU) || defined(CONFIG_CALGARY_IOMMU)
|
|
|
|
#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \
|
|
dma_addr_t ADDR_NAME;
|
|
#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \
|
|
__u32 LEN_NAME;
|
|
#define pci_unmap_addr(PTR, ADDR_NAME) \
|
|
((PTR)->ADDR_NAME)
|
|
#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \
|
|
(((PTR)->ADDR_NAME) = (VAL))
|
|
#define pci_unmap_len(PTR, LEN_NAME) \
|
|
((PTR)->LEN_NAME)
|
|
#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \
|
|
(((PTR)->LEN_NAME) = (VAL))
|
|
|
|
#else
|
|
/* No IOMMU */
|
|
|
|
#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
|
|
#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
|
|
#define pci_unmap_addr(PTR, ADDR_NAME) (0)
|
|
#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
|
|
#define pci_unmap_len(PTR, LEN_NAME) (0)
|
|
#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
|
|
|
|
#endif
|
|
|
|
#include <asm-generic/pci-dma-compat.h>
|
|
|
|
#ifdef CONFIG_PCI
|
|
static inline void pci_dma_burst_advice(struct pci_dev *pdev,
|
|
enum pci_dma_burst_strategy *strat,
|
|
unsigned long *strategy_parameter)
|
|
{
|
|
*strat = PCI_DMA_BURST_INFINITY;
|
|
*strategy_parameter = ~0UL;
|
|
}
|
|
#endif
|
|
|
|
#define HAVE_PCI_MMAP
|
|
extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
|
enum pci_mmap_state mmap_state, int write_combine);
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
/* generic pci stuff */
|
|
#ifdef CONFIG_PCI
|
|
#include <asm-generic/pci.h>
|
|
#endif
|
|
|
|
#endif /* __x8664_PCI_H */
|