pci.h 7.0 KB
Newer Older
P
Paul Mackerras 已提交
1 2
#ifndef __ASM_POWERPC_PCI_H
#define __ASM_POWERPC_PCI_H
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#ifdef __KERNEL__

/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/types.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/dma-mapping.h>

#include <asm/machdep.h>
#include <asm/scatterlist.h>
#include <asm/io.h>
#include <asm/prom.h>
P
Paul Mackerras 已提交
21
#include <asm/pci-bridge.h>
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29

#include <asm-generic/pci-dma-compat.h>

#define PCIBIOS_MIN_IO		0x1000
#define PCIBIOS_MIN_MEM		0x10000000

struct pci_dev;

P
Paul Mackerras 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43
/* Values for the `which' argument to sys_pciconfig_iobase syscall.  */
#define IOBASE_BRIDGE_NUMBER	0
#define IOBASE_MEMORY		1
#define IOBASE_IO		2
#define IOBASE_ISA_IO		3
#define IOBASE_ISA_MEM		4

/*
 * Set this to 1 if you want the kernel to re-assign all PCI
 * bus numbers
 */
extern int pci_assign_all_buses;
#define pcibios_assign_all_busses()	(pci_assign_all_buses)

L
Linus Torvalds 已提交
44 45 46 47 48 49 50
#define pcibios_scan_all_fns(a, b)	0

static inline void pcibios_set_master(struct pci_dev *dev)
{
	/* No special bus mastering setup handling */
}

D
David Shaohua Li 已提交
51
static inline void pcibios_penalize_isa_irq(int irq, int active)
L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60 61 62 63
{
	/* We don't do dynamic PCI IRQ allocation */
}

#define HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
{
	if (ppc_md.pci_get_legacy_ide_irq)
		return ppc_md.pci_get_legacy_ide_irq(dev, channel);
	return channel ? 15 : 14;
}

P
Paul Mackerras 已提交
64
#ifdef CONFIG_PPC64
65 66 67 68 69 70 71

/*
 * We want to avoid touching the cacheline size or MWI bit.
 * pSeries firmware sets the cacheline size (which is not the cpu cacheline
 * size in all cases) and hardware treats MWI the same as memory write.
 */
#define PCI_DISABLE_MWI
L
Linus Torvalds 已提交
72

73 74
#ifdef CONFIG_PCI
extern void set_pci_dma_ops(struct dma_mapping_ops *dma_ops);
75
extern struct dma_mapping_ops *get_pci_dma_ops(void);
76

L
Linus Torvalds 已提交
77
/* For DAC DMA, we currently don't support it by default, but
P
Paul Mackerras 已提交
78
 * we let 64-bit platforms override this.
L
Linus Torvalds 已提交
79 80 81
 */
static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
{
82 83 84 85
	struct dma_mapping_ops *d = get_pci_dma_ops();

	if (d && d->dac_dma_supported)
		return d->dac_dma_supported(&hwdev->dev, mask);
L
Linus Torvalds 已提交
86 87 88
	return 0;
}

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
static inline void pci_dma_burst_advice(struct pci_dev *pdev,
					enum pci_dma_burst_strategy *strat,
					unsigned long *strategy_parameter)
{
	unsigned long cacheline_size;
	u8 byte;

	pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &byte);
	if (byte == 0)
		cacheline_size = 1024;
	else
		cacheline_size = (int) byte * 4;

	*strat = PCI_DMA_BURST_MULTIPLE;
	*strategy_parameter = cacheline_size;
}
105 106
#else	/* CONFIG_PCI */
#define set_pci_dma_ops(d)
107
#define get_pci_dma_ops()	NULL
108
#endif
109

L
Linus Torvalds 已提交
110 111 112 113 114
extern int pci_domain_nr(struct pci_bus *bus);

/* Decide whether to display the domain number in /proc */
extern int pci_proc_domain(struct pci_bus *bus);

P
Paul Mackerras 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
#else /* 32-bit */

#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

/*
 * At present there are very few 32-bit PPC machines that can have
 * memory above the 4GB point, and we don't support that.
 */
#define pci_dac_dma_supported(pci_dev, mask)	(0)

/* Return the index of the PCI controller for device PDEV. */
#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index

/* Set the name of the bus as it appears in /proc/bus/pci */
static inline int pci_proc_domain(struct pci_bus *bus)
{
	return 0;
}

#endif /* CONFIG_PPC64 */

L
Linus Torvalds 已提交
144 145 146 147 148 149 150 151
struct vm_area_struct;
/* Map a range of PCI memory or I/O space for a device into user space */
int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
			enum pci_mmap_state mmap_state, int write_combine);

/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */
#define HAVE_PCI_MMAP	1

152 153 154 155 156 157 158
#if defined(CONFIG_PPC64) || defined(CONFIG_NOT_COHERENT_CACHE)
/*
 * For 64-bit kernels, pci_unmap_{single,page} is not a nop.
 * For 32-bit non-coherent kernels, pci_dma_sync_single_for_cpu() and
 * so on are not nops.
 * and thus...
 */
L
Linus Torvalds 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171
#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))

172 173 174 175 176 177 178 179 180 181 182 183 184 185
#else /* 32-bit && coherent */

/* pci_unmap_{page,single} is a nop so... */
#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 /* CONFIG_PPC64 || CONFIG_NOT_COHERENT_CACHE */

#ifdef CONFIG_PPC64

P
Paul Mackerras 已提交
186 187
/* The PCI address space does not equal the physical memory address
 * space (we have an IOMMU).  The IDE and SCSI device layers use
L
Linus Torvalds 已提交
188 189 190
 * this boolean for bounce buffer decisions.
 */
#define PCI_DMA_BUS_IS_PHYS	(0)
P
Paul Mackerras 已提交
191 192 193 194 195 196 197 198 199 200

#else /* 32-bit */

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

#endif /* CONFIG_PPC64 */
201

P
Paul Mackerras 已提交
202 203
extern void pcibios_resource_to_bus(struct pci_dev *dev,
			struct pci_bus_region *region,
L
Linus Torvalds 已提交
204 205
			struct resource *res);

P
Paul Mackerras 已提交
206 207
extern void pcibios_bus_to_resource(struct pci_dev *dev,
			struct resource *res,
208 209
			struct pci_bus_region *region);

P
Paul Mackerras 已提交
210 211
static inline struct resource *pcibios_select_root(struct pci_dev *pdev,
			struct resource *res)
212 213 214 215 216 217 218 219 220 221 222
{
	struct resource *root = NULL;

	if (res->flags & IORESOURCE_IO)
		root = &ioport_resource;
	if (res->flags & IORESOURCE_MEM)
		root = &iomem_resource;

	return root;
}

P
Paul Mackerras 已提交
223 224
extern void pcibios_fixup_device_resources(struct pci_dev *dev,
			struct pci_bus *bus);
L
Linus Torvalds 已提交
225

226 227
extern void pcibios_setup_new_device(struct pci_dev *dev);

228 229
extern void pcibios_claim_one_bus(struct pci_bus *b);

L
Linus Torvalds 已提交
230 231
extern struct pci_controller *init_phb_dynamic(struct device_node *dn);

J
John Rose 已提交
232 233 234 235 236 237 238 239
extern struct pci_dev *of_create_pci_dev(struct device_node *node,
					struct pci_bus *bus, int devfn);

extern void of_scan_pci_bridge(struct device_node *node,
				struct pci_dev *dev);

extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);

L
Linus Torvalds 已提交
240 241 242 243 244 245
extern int pci_read_irq_line(struct pci_dev *dev);

extern void pcibios_add_platform_entries(struct pci_dev *dev);

struct file;
extern pgprot_t	pci_phys_mem_access_prot(struct file *file,
246
					 unsigned long pfn,
L
Linus Torvalds 已提交
247 248 249
					 unsigned long size,
					 pgprot_t prot);

250 251 252
#define HAVE_ARCH_PCI_RESOURCE_TO_USER
extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
				 const struct resource *rsrc,
253
				 resource_size_t *start, resource_size_t *end);
L
Linus Torvalds 已提交
254 255

#endif	/* __KERNEL__ */
P
Paul Mackerras 已提交
256
#endif /* __ASM_POWERPC_PCI_H */