pci.h 4.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#ifndef __ASM_SH_PCI_H
#define __ASM_SH_PCI_H

#ifdef __KERNEL__

#include <linux/dma-mapping.h>

/* 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 */

#define pcibios_assign_all_busses()	1
#define pcibios_scan_all_fns(a, b)	0

/*
 * A board can define one or more PCI channels that represent built-in (or
 * external) PCI controllers.
 */
struct pci_channel {
20
	int (*init)(struct pci_channel *chan);
L
Linus Torvalds 已提交
21 22 23 24 25
	struct pci_ops *pci_ops;
	struct resource *io_resource;
	struct resource *mem_resource;
	int first_devfn;
	int last_devfn;
26
	int enabled;
27
	unsigned long reg_base;
28
	unsigned long io_base;
29 30

	unsigned long io_map_base;
L
Linus Torvalds 已提交
31 32 33 34 35 36 37
};

/*
 * Each board initializes this array and terminates it with a NULL entry.
 */
extern struct pci_channel board_pci_channels[];

38
extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;
L
Linus Torvalds 已提交
39 40 41

struct pci_dev;

P
Paul Mundt 已提交
42 43 44
#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);
L
Linus Torvalds 已提交
45 46
extern void pcibios_set_master(struct pci_dev *dev);

D
David Shaohua Li 已提交
47
static inline void pcibios_penalize_isa_irq(int irq, int active)
L
Linus Torvalds 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 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
{
	/* We don't do dynamic PCI IRQ allocation */
}

/* Dynamic DMA mapping stuff.
 * SuperH has everything mapped statically like x86.
 */

/* The PCI address space does equal the physical memory
 * address space.  The networking and block device layers use
 * this boolean for bounce buffer decisions.
 */
#define PCI_DMA_BUS_IS_PHYS	(1)

#include <linux/types.h>
#include <linux/slab.h>
#include <asm/scatterlist.h>
#include <linux/string.h>
#include <asm/io.h>

/* pci_unmap_{single,page} being a nop depends upon the
 * configuration.
 */
#ifdef CONFIG_SH_PCIDMA_NONCOHERENT
#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
#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

93 94 95 96 97 98 99
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;
}
M
Magnus Damm 已提交
100

101 102 103 104 105 106 107 108 109 110
#ifdef CONFIG_SUPERH32
/*
 * If we're on an SH7751 or SH7780 PCI controller, PCI memory is mapped
 * at the end of the address space in a special non-translatable area.
 */
#define PCI_MEM_FIXED_START	0xfd000000
#define PCI_MEM_FIXED_END	(PCI_MEM_FIXED_START + 0x01000000)

#define is_pci_memory_fixed_range(s, e)	\
	((s) >= PCI_MEM_FIXED_START && (e) < PCI_MEM_FIXED_END)
M
Magnus Damm 已提交
111
#else
112
#define is_pci_memory_fixed_range(s, e)	(0)
113
#endif
114

L
Linus Torvalds 已提交
115
/* Board-specific fixup routines. */
116 117
int pcibios_init_platform(void);
int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin);
L
Linus Torvalds 已提交
118 119

#ifdef CONFIG_PCI_AUTO
120
int pciauto_assign_resources(int busno, struct pci_channel *hose);
L
Linus Torvalds 已提交
121 122
#endif

123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
extern void pcibios_resource_to_bus(struct pci_dev *dev,
	struct pci_bus_region *region, struct resource *res);

extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
				    struct pci_bus_region *region);

static inline struct resource *
pcibios_select_root(struct pci_dev *pdev, struct resource *res)
{
	struct resource *root = NULL;

	if (res->flags & IORESOURCE_IO)
		root = &ioport_resource;
	if (res->flags & IORESOURCE_MEM)
		root = &iomem_resource;
L
Linus Torvalds 已提交
138

139 140 141 142 143 144 145 146
	return root;
}

/* 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 已提交
147 148 149 150

/* generic DMA-mapping stuff */
#include <asm-generic/pci-dma-compat.h>

151
#endif /* __KERNEL__ */
L
Linus Torvalds 已提交
152 153
#endif /* __ASM_SH_PCI_H */