pci_x86.h 4.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 *	Low-Level PCI Access for i386 machines.
 *
 *	(c) 1999 Martin Mares <mj@ucw.cz>
 */

#undef DEBUG

#ifdef DEBUG
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif

#define PCI_PROBE_BIOS		0x0001
#define PCI_PROBE_CONF1		0x0002
#define PCI_PROBE_CONF2		0x0004
#define PCI_PROBE_MMCONF	0x0008
19
#define PCI_PROBE_MASK		0x000f
20
#define PCI_PROBE_NOEARLY	0x0010
L
Linus Torvalds 已提交
21 22 23 24 25 26

#define PCI_NO_CHECKS		0x0400
#define PCI_USE_PIRQ_MASK	0x0800
#define PCI_ASSIGN_ROMS		0x1000
#define PCI_BIOS_IRQ_SCAN	0x2000
#define PCI_ASSIGN_ALL_BUSSES	0x4000
27
#define PCI_CAN_SKIP_ISA_ALIGN	0x8000
28
#define PCI_USE__CRS		0x10000
29
#define PCI_CHECK_ENABLE_AMD_MMCONF	0x20000
30
#define PCI_HAS_IO_ECS		0x40000
31
#define PCI_NOASSIGN_ROMS	0x80000
L
Linus Torvalds 已提交
32 33

extern unsigned int pci_probe;
34
extern unsigned long pirq_table_addr;
L
Linus Torvalds 已提交
35

36 37 38 39 40 41 42
enum pci_bf_sort_state {
	pci_bf_sort_default,
	pci_force_nobf,
	pci_force_bf,
	pci_dmi_bf,
};

L
Linus Torvalds 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
/* pci-i386.c */

extern unsigned int pcibios_max_latency;

void pcibios_resource_survey(void);

/* pci-pc.c */

extern int pcibios_last_bus;
extern struct pci_bus *pci_root_bus;
extern struct pci_ops pci_root_ops;

/* pci-irq.c */

struct irq_info {
	u8 bus, devfn;			/* Bus, device and function */
	struct {
60 61
		u8 link;		/* IRQ line ID, chipset dependent,
					   0 = not routed */
L
Linus Torvalds 已提交
62 63 64 65 66 67 68 69 70 71 72
		u16 bitmap;		/* Available IRQs */
	} __attribute__((packed)) irq[4];
	u8 slot;			/* Slot number, 0=onboard */
	u8 rfu;
} __attribute__((packed));

struct irq_routing_table {
	u32 signature;			/* PIRQ_SIGNATURE should be here */
	u16 version;			/* PIRQ_VERSION */
	u16 size;			/* Table size in bytes */
	u8 rtr_bus, rtr_devfn;		/* Where the interrupt router lies */
73 74 75 76
	u16 exclusive_irqs;		/* IRQs devoted exclusively to
					   PCI usage */
	u16 rtr_vendor, rtr_device;	/* Vendor and device ID of
					   interrupt router */
L
Linus Torvalds 已提交
77 78
	u32 miniport_data;		/* Crap */
	u8 rfu[11];
79
	u8 checksum;			/* Modulo 256 checksum must give 0 */
L
Linus Torvalds 已提交
80 81 82 83 84 85 86 87 88
	struct irq_info slots[0];
} __attribute__((packed));

extern unsigned int pcibios_irq_mask;

extern int pcibios_scanned;
extern spinlock_t pci_config_lock;

extern int (*pcibios_enable_irq)(struct pci_dev *dev);
89
extern void (*pcibios_disable_irq)(struct pci_dev *dev);
90

91 92 93 94 95 96 97 98 99 100 101
struct pci_raw_ops {
	int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn,
						int reg, int len, u32 *val);
	int (*write)(unsigned int domain, unsigned int bus, unsigned int devfn,
						int reg, int len, u32 val);
};

extern struct pci_raw_ops *raw_pci_ops;
extern struct pci_raw_ops *raw_pci_ext_ops;

extern struct pci_raw_ops pci_direct_conf1;
102
extern bool port_cf9_safe;
103

104
/* arch_initcall level */
105 106
extern int pci_direct_probe(void);
extern void pci_direct_init(int type);
107
extern void pci_pcbios_init(void);
108
extern int pci_olpc_init(void);
109 110 111 112 113 114
extern void __init dmi_check_pciprobe(void);
extern void __init dmi_check_skip_isa_align(void);

/* some common used subsys_initcalls */
extern int __init pci_acpi_init(void);
extern int __init pcibios_irq_init(void);
115
extern int __init pci_visws_init(void);
116
extern int __init pci_numaq_init(void);
117
extern int __init pcibios_init(void);
118

119 120
/* pci-mmconfig.c */

121
extern int __init pci_mmcfg_arch_init(void);
122
extern void __init pci_mmcfg_arch_free(void);
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

/*
 * AMD Fam10h CPUs are buggy, and cannot access MMIO config space
 * on their northbrige except through the * %eax register. As such, you MUST
 * NOT use normal IOMEM accesses, you need to only use the magic mmio-config
 * accessor functions.
 * In fact just use pci_config_*, nothing else please.
 */
static inline unsigned char mmio_config_readb(void __iomem *pos)
{
	u8 val;
	asm volatile("movb (%1),%%al" : "=a" (val) : "r" (pos));
	return val;
}

static inline unsigned short mmio_config_readw(void __iomem *pos)
{
	u16 val;
	asm volatile("movw (%1),%%ax" : "=a" (val) : "r" (pos));
	return val;
}

static inline unsigned int mmio_config_readl(void __iomem *pos)
{
	u32 val;
	asm volatile("movl (%1),%%eax" : "=a" (val) : "r" (pos));
	return val;
}

static inline void mmio_config_writeb(void __iomem *pos, u8 val)
{
154
	asm volatile("movb %%al,(%1)" : : "a" (val), "r" (pos) : "memory");
155 156 157 158
}

static inline void mmio_config_writew(void __iomem *pos, u16 val)
{
159
	asm volatile("movw %%ax,(%1)" : : "a" (val), "r" (pos) : "memory");
160 161 162 163
}

static inline void mmio_config_writel(void __iomem *pos, u32 val)
{
164
	asm volatile("movl %%eax,(%1)" : : "a" (val), "r" (pos) : "memory");
165
}