pci.h 3.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#ifndef _ASM_PCI_H
#define _ASM_PCI_H

#include <linux/mm.h>

#ifdef __KERNEL__

/*
 * This file essentially defines the interface between board
R
Ralf Baechle 已提交
15
 * specific PCI code and MIPS common PCI code.	Should potentially put
L
Linus Torvalds 已提交
16 17 18 19
 * into include/asm/pci.h file.
 */

#include <linux/ioport.h>
20
#include <linux/list.h>
21
#include <linux/of.h>
L
Linus Torvalds 已提交
22

23 24
#ifdef CONFIG_PCI_DRIVERS_LEGACY

L
Linus Torvalds 已提交
25
/*
R
Ralf Baechle 已提交
26
 * Each pci channel is a top-level PCI bus seem by CPU.	 A machine  with
L
Linus Torvalds 已提交
27 28 29 30
 * multiple PCI channels may have multiple PCI host controllers or a
 * single controller supporting multiple channels.
 */
struct pci_controller {
31
	struct list_head list;
L
Linus Torvalds 已提交
32
	struct pci_bus *bus;
33
	struct device_node *of_node;
L
Linus Torvalds 已提交
34 35 36 37 38 39

	struct pci_ops *pci_ops;
	struct resource *mem_resource;
	unsigned long mem_offset;
	struct resource *io_resource;
	unsigned long io_offset;
R
Ralf Baechle 已提交
40
	unsigned long io_map_base;
L
Linus Torvalds 已提交
41

42
#ifndef CONFIG_PCI_DOMAINS_GENERIC
L
Linus Torvalds 已提交
43 44 45 46
	unsigned int index;
	/* For compatibility with current (as of July 2003) pciutils
	   and XFree86. Eventually will be removed. */
	unsigned int need_domain_info;
47
#endif
L
Linus Torvalds 已提交
48

A
Andrew Isaacson 已提交
49 50 51 52
	/* Optional access methods for reading/writing the bus number
	   of the PCI controller */
	int (*get_busno)(void);
	void (*set_busno)(int busno);
L
Linus Torvalds 已提交
53 54 55 56 57 58 59 60 61 62
};

/*
 * Used by boards to register their PCI busses before the actual scanning.
 */
extern void register_pci_controller(struct pci_controller *hose);

/*
 * board supplied pci irq fixup routine
 */
63
extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
L
Linus Torvalds 已提交
64

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
/* Do platform specific device initialization at pci_enable_device() time */
extern int pcibios_plat_dev_init(struct pci_dev *dev);

extern char * (*pcibios_plat_setup)(char *str);

#ifdef CONFIG_OF
/* this function parses memory ranges from a device node */
extern void pci_load_of_ranges(struct pci_controller *hose,
			       struct device_node *node);
#else
static inline void pci_load_of_ranges(struct pci_controller *hose,
				      struct device_node *node) {}
#endif

#ifdef CONFIG_PCI_DOMAINS_GENERIC
static inline void set_pci_need_domain_info(struct pci_controller *hose,
					    int need_domain_info)
{
	/* nothing to do */
}
#elif defined(CONFIG_PCI_DOMAINS)
static inline void set_pci_need_domain_info(struct pci_controller *hose,
					    int need_domain_info)
{
	hose->need_domain_info = need_domain_info;
}
#endif /* CONFIG_PCI_DOMAINS */

#endif
L
Linus Torvalds 已提交
94 95 96 97

/* 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 */
98 99 100 101
static inline unsigned int pcibios_assign_all_busses(void)
{
	return 1;
}
L
Linus Torvalds 已提交
102 103 104 105 106 107

extern unsigned long PCIBIOS_MIN_IO;
extern unsigned long PCIBIOS_MIN_MEM;

#define PCIBIOS_MIN_CARDBUS_IO	0x4000

108
#define HAVE_PCI_MMAP
109
#define ARCH_GENERIC_PCI_MMAP_RESOURCE
110

L
Linus Torvalds 已提交
111 112 113 114 115 116 117
/*
 * Dynamic DMA mapping stuff.
 * MIPS has everything mapped statically.
 */

#include <linux/types.h>
#include <linux/slab.h>
C
Christoph Hellwig 已提交
118
#include <linux/scatterlist.h>
L
Linus Torvalds 已提交
119 120 121
#include <linux/string.h>
#include <asm/io.h>

122 123 124 125 126 127
#ifdef CONFIG_PCI_DOMAINS_GENERIC
static inline int pci_proc_domain(struct pci_bus *bus)
{
	return pci_domain_nr(bus);
}
#elif defined(CONFIG_PCI_DOMAINS)
L
Linus Torvalds 已提交
128 129 130 131 132 133 134
#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index

static inline int pci_proc_domain(struct pci_bus *bus)
{
	struct pci_controller *hose = bus->sysdata;
	return hose->need_domain_info;
}
135
#endif /* CONFIG_PCI_DOMAINS */
L
Linus Torvalds 已提交
136 137 138 139 140 141

#endif /* __KERNEL__ */

/* Do platform specific device initialization at pci_enable_device() time */
extern int pcibios_plat_dev_init(struct pci_dev *dev);

142 143 144 145 146 147
/* Chances are this interrupt is wired PC-style ...  */
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
{
	return channel ? 15 : 14;
}

L
Linus Torvalds 已提交
148
#endif /* _ASM_PCI_H */