aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew@wil.cx>2008-02-10 09:45:28 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-10 15:52:46 -0500
commitb6ce068a1285a24185b01be8a49021827516b3e1 (patch)
treeea1420fefff86f2e2ee4ed83f08ec2dd99a86dc5 /arch
parenta0ca9909609470ad779b9b9cc68ce96e975afff7 (diff)
Change pci_raw_ops to pci_raw_read/write
We want to allow different implementations of pci_raw_ops for standard and extended config space on x86. Rather than clutter generic code with knowledge of this, we make pci_raw_ops private to x86 and use it to implement the new raw interface -- raw_pci_read() and raw_pci_write(). Signed-off-by: Matthew Wilcox <willy@linux.intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/pci/pci.c25
-rw-r--r--arch/ia64/sn/pci/tioce_provider.c16
-rw-r--r--arch/x86/kernel/quirks.c2
-rw-r--r--arch/x86/pci/common.c25
-rw-r--r--arch/x86/pci/direct.c4
-rw-r--r--arch/x86/pci/fixup.c6
-rw-r--r--arch/x86/pci/legacy.c2
-rw-r--r--arch/x86/pci/mmconfig-shared.c6
-rw-r--r--arch/x86/pci/mmconfig_32.c10
-rw-r--r--arch/x86/pci/mmconfig_64.c8
-rw-r--r--arch/x86/pci/pci.h15
-rw-r--r--arch/x86/pci/visws.c3
12 files changed, 64 insertions, 58 deletions
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 488e48a5deea..8fd7e825192b 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -43,8 +43,7 @@
43#define PCI_SAL_EXT_ADDRESS(seg, bus, devfn, reg) \ 43#define PCI_SAL_EXT_ADDRESS(seg, bus, devfn, reg) \
44 (((u64) seg << 28) | (bus << 20) | (devfn << 12) | (reg)) 44 (((u64) seg << 28) | (bus << 20) | (devfn << 12) | (reg))
45 45
46static int 46int raw_pci_read(unsigned int seg, unsigned int bus, unsigned int devfn,
47pci_sal_read (unsigned int seg, unsigned int bus, unsigned int devfn,
48 int reg, int len, u32 *value) 47 int reg, int len, u32 *value)
49{ 48{
50 u64 addr, data = 0; 49 u64 addr, data = 0;
@@ -68,8 +67,7 @@ pci_sal_read (unsigned int seg, unsigned int bus, unsigned int devfn,
68 return 0; 67 return 0;
69} 68}
70 69
71static int 70int raw_pci_write(unsigned int seg, unsigned int bus, unsigned int devfn,
72pci_sal_write (unsigned int seg, unsigned int bus, unsigned int devfn,
73 int reg, int len, u32 value) 71 int reg, int len, u32 value)
74{ 72{
75 u64 addr; 73 u64 addr;
@@ -91,24 +89,17 @@ pci_sal_write (unsigned int seg, unsigned int bus, unsigned int devfn,
91 return 0; 89 return 0;
92} 90}
93 91
94static struct pci_raw_ops pci_sal_ops = { 92static int pci_read(struct pci_bus *bus, unsigned int devfn, int where,
95 .read = pci_sal_read, 93 int size, u32 *value)
96 .write = pci_sal_write
97};
98
99struct pci_raw_ops *raw_pci_ops = &pci_sal_ops;
100
101static int
102pci_read (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
103{ 94{
104 return raw_pci_ops->read(pci_domain_nr(bus), bus->number, 95 return raw_pci_read(pci_domain_nr(bus), bus->number,
105 devfn, where, size, value); 96 devfn, where, size, value);
106} 97}
107 98
108static int 99static int pci_write(struct pci_bus *bus, unsigned int devfn, int where,
109pci_write (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) 100 int size, u32 value)
110{ 101{
111 return raw_pci_ops->write(pci_domain_nr(bus), bus->number, 102 return raw_pci_write(pci_domain_nr(bus), bus->number,
112 devfn, where, size, value); 103 devfn, where, size, value);
113} 104}
114 105
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c
index e1a3e19d3d9c..999f14f986e2 100644
--- a/arch/ia64/sn/pci/tioce_provider.c
+++ b/arch/ia64/sn/pci/tioce_provider.c
@@ -752,13 +752,13 @@ tioce_kern_init(struct tioce_common *tioce_common)
752 * Determine the secondary bus number of the port2 logical PPB. 752 * Determine the secondary bus number of the port2 logical PPB.
753 * This is used to decide whether a given pci device resides on 753 * This is used to decide whether a given pci device resides on
754 * port1 or port2. Note: We don't have enough plumbing set up 754 * port1 or port2. Note: We don't have enough plumbing set up
755 * here to use pci_read_config_xxx() so use the raw_pci_ops vector. 755 * here to use pci_read_config_xxx() so use raw_pci_read().
756 */ 756 */
757 757
758 seg = tioce_common->ce_pcibus.bs_persist_segment; 758 seg = tioce_common->ce_pcibus.bs_persist_segment;
759 bus = tioce_common->ce_pcibus.bs_persist_busnum; 759 bus = tioce_common->ce_pcibus.bs_persist_busnum;
760 760
761 raw_pci_ops->read(seg, bus, PCI_DEVFN(2, 0), PCI_SECONDARY_BUS, 1,&tmp); 761 raw_pci_read(seg, bus, PCI_DEVFN(2, 0), PCI_SECONDARY_BUS, 1,&tmp);
762 tioce_kern->ce_port1_secondary = (u8) tmp; 762 tioce_kern->ce_port1_secondary = (u8) tmp;
763 763
764 /* 764 /*
@@ -799,11 +799,11 @@ tioce_kern_init(struct tioce_common *tioce_common)
799 799
800 /* mem base/limit */ 800 /* mem base/limit */
801 801
802 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 802 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
803 PCI_MEMORY_BASE, 2, &tmp); 803 PCI_MEMORY_BASE, 2, &tmp);
804 base = (u64)tmp << 16; 804 base = (u64)tmp << 16;
805 805
806 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 806 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
807 PCI_MEMORY_LIMIT, 2, &tmp); 807 PCI_MEMORY_LIMIT, 2, &tmp);
808 limit = (u64)tmp << 16; 808 limit = (u64)tmp << 16;
809 limit |= 0xfffffUL; 809 limit |= 0xfffffUL;
@@ -817,21 +817,21 @@ tioce_kern_init(struct tioce_common *tioce_common)
817 * attributes. 817 * attributes.
818 */ 818 */
819 819
820 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 820 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
821 PCI_PREF_MEMORY_BASE, 2, &tmp); 821 PCI_PREF_MEMORY_BASE, 2, &tmp);
822 base = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16; 822 base = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16;
823 823
824 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 824 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
825 PCI_PREF_BASE_UPPER32, 4, &tmp); 825 PCI_PREF_BASE_UPPER32, 4, &tmp);
826 base |= (u64)tmp << 32; 826 base |= (u64)tmp << 32;
827 827
828 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 828 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
829 PCI_PREF_MEMORY_LIMIT, 2, &tmp); 829 PCI_PREF_MEMORY_LIMIT, 2, &tmp);
830 830
831 limit = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16; 831 limit = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16;
832 limit |= 0xfffffUL; 832 limit |= 0xfffffUL;
833 833
834 raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 834 raw_pci_read(seg, bus, PCI_DEVFN(dev, 0),
835 PCI_PREF_LIMIT_UPPER32, 4, &tmp); 835 PCI_PREF_LIMIT_UPPER32, 4, &tmp);
836 limit |= (u64)tmp << 32; 836 limit |= (u64)tmp << 32;
837 837
diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c
index 6ba33ca8715a..1941482d4ca3 100644
--- a/arch/x86/kernel/quirks.c
+++ b/arch/x86/kernel/quirks.c
@@ -27,7 +27,7 @@ static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
27 pci_write_config_byte(dev, 0xf4, config|0x2); 27 pci_write_config_byte(dev, 0xf4, config|0x2);
28 28
29 /* read xTPR register */ 29 /* read xTPR register */
30 raw_pci_ops->read(0, 0, 0x40, 0x4c, 2, &word); 30 raw_pci_read(0, 0, 0x40, 0x4c, 2, &word);
31 31
32 if (!(word & (1 << 13))) { 32 if (!(word & (1 << 13))) {
33 dev_info(&dev->dev, "Intel E7520/7320/7525 detected; " 33 dev_info(&dev->dev, "Intel E7520/7320/7525 detected; "
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 52deabc72a6f..b7c67a187b6b 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -26,16 +26,37 @@ int pcibios_last_bus = -1;
26unsigned long pirq_table_addr; 26unsigned long pirq_table_addr;
27struct pci_bus *pci_root_bus; 27struct pci_bus *pci_root_bus;
28struct pci_raw_ops *raw_pci_ops; 28struct pci_raw_ops *raw_pci_ops;
29struct pci_raw_ops *raw_pci_ext_ops;
30
31int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn,
32 int reg, int len, u32 *val)
33{
34 if (reg < 256 && raw_pci_ops)
35 return raw_pci_ops->read(domain, bus, devfn, reg, len, val);
36 if (raw_pci_ext_ops)
37 return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val);
38 return -EINVAL;
39}
40
41int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn,
42 int reg, int len, u32 val)
43{
44 if (reg < 256 && raw_pci_ops)
45 return raw_pci_ops->write(domain, bus, devfn, reg, len, val);
46 if (raw_pci_ext_ops)
47 return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val);
48 return -EINVAL;
49}
29 50
30static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) 51static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
31{ 52{
32 return raw_pci_ops->read(pci_domain_nr(bus), bus->number, 53 return raw_pci_read(pci_domain_nr(bus), bus->number,
33 devfn, where, size, value); 54 devfn, where, size, value);
34} 55}
35 56
36static int pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) 57static int pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
37{ 58{
38 return raw_pci_ops->write(pci_domain_nr(bus), bus->number, 59 return raw_pci_write(pci_domain_nr(bus), bus->number,
39 devfn, where, size, value); 60 devfn, where, size, value);
40} 61}
41 62
diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c
index 431c9a51b157..42f3e4cad179 100644
--- a/arch/x86/pci/direct.c
+++ b/arch/x86/pci/direct.c
@@ -14,7 +14,7 @@
14#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ 14#define PCI_CONF1_ADDRESS(bus, devfn, reg) \
15 (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) 15 (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3))
16 16
17int pci_conf1_read(unsigned int seg, unsigned int bus, 17static int pci_conf1_read(unsigned int seg, unsigned int bus,
18 unsigned int devfn, int reg, int len, u32 *value) 18 unsigned int devfn, int reg, int len, u32 *value)
19{ 19{
20 unsigned long flags; 20 unsigned long flags;
@@ -45,7 +45,7 @@ int pci_conf1_read(unsigned int seg, unsigned int bus,
45 return 0; 45 return 0;
46} 46}
47 47
48int pci_conf1_write(unsigned int seg, unsigned int bus, 48static int pci_conf1_write(unsigned int seg, unsigned int bus,
49 unsigned int devfn, int reg, int len, u32 value) 49 unsigned int devfn, int reg, int len, u32 value)
50{ 50{
51 unsigned long flags; 51 unsigned long flags;
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index 74d30ff33c49..a5ef5f551373 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -215,7 +215,8 @@ static int quirk_aspm_offset[MAX_PCIEROOT << 3];
215 215
216static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) 216static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
217{ 217{
218 return raw_pci_ops->read(0, bus->number, devfn, where, size, value); 218 return raw_pci_read(pci_domain_nr(bus), bus->number,
219 devfn, where, size, value);
219} 220}
220 221
221/* 222/*
@@ -231,7 +232,8 @@ static int quirk_pcie_aspm_write(struct pci_bus *bus, unsigned int devfn, int wh
231 if ((offset) && (where == offset)) 232 if ((offset) && (where == offset))
232 value = value & 0xfffffffc; 233 value = value & 0xfffffffc;
233 234
234 return raw_pci_ops->write(0, bus->number, devfn, where, size, value); 235 return raw_pci_write(pci_domain_nr(bus), bus->number,
236 devfn, where, size, value);
235} 237}
236 238
237static struct pci_ops quirk_pcie_aspm_ops = { 239static struct pci_ops quirk_pcie_aspm_ops = {
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c
index 5565d7016b75..e041ced0ce13 100644
--- a/arch/x86/pci/legacy.c
+++ b/arch/x86/pci/legacy.c
@@ -22,7 +22,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
22 if (pci_find_bus(0, n)) 22 if (pci_find_bus(0, n))
23 continue; 23 continue;
24 for (devfn = 0; devfn < 256; devfn += 8) { 24 for (devfn = 0; devfn < 256; devfn += 8) {
25 if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) && 25 if (!raw_pci_read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
26 l != 0x0000 && l != 0xffff) { 26 l != 0x0000 && l != 0xffff) {
27 DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l); 27 DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
28 printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n); 28 printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
index 6b521d389327..8d54df4dfaad 100644
--- a/arch/x86/pci/mmconfig-shared.c
+++ b/arch/x86/pci/mmconfig-shared.c
@@ -28,7 +28,7 @@ static int __initdata pci_mmcfg_resources_inserted;
28static const char __init *pci_mmcfg_e7520(void) 28static const char __init *pci_mmcfg_e7520(void)
29{ 29{
30 u32 win; 30 u32 win;
31 pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0xce, 2, &win); 31 pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0xce, 2, &win);
32 32
33 win = win & 0xf000; 33 win = win & 0xf000;
34 if(win == 0x0000 || win == 0xf000) 34 if(win == 0x0000 || win == 0xf000)
@@ -53,7 +53,7 @@ static const char __init *pci_mmcfg_intel_945(void)
53 53
54 pci_mmcfg_config_num = 1; 54 pci_mmcfg_config_num = 1;
55 55
56 pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0x48, 4, &pciexbar); 56 pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0x48, 4, &pciexbar);
57 57
58 /* Enable bit */ 58 /* Enable bit */
59 if (!(pciexbar & 1)) 59 if (!(pciexbar & 1))
@@ -118,7 +118,7 @@ static int __init pci_mmcfg_check_hostbridge(void)
118 int i; 118 int i;
119 const char *name; 119 const char *name;
120 120
121 pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0, 4, &l); 121 pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0, 4, &l);
122 vendor = l & 0xffff; 122 vendor = l & 0xffff;
123 device = (l >> 16) & 0xffff; 123 device = (l >> 16) & 0xffff;
124 124
diff --git a/arch/x86/pci/mmconfig_32.c b/arch/x86/pci/mmconfig_32.c
index 7b75e6513436..081816ada057 100644
--- a/arch/x86/pci/mmconfig_32.c
+++ b/arch/x86/pci/mmconfig_32.c
@@ -68,9 +68,6 @@ err: *value = -1;
68 return -EINVAL; 68 return -EINVAL;
69 } 69 }
70 70
71 if (reg < 256)
72 return pci_conf1_read(seg,bus,devfn,reg,len,value);
73
74 base = get_base_addr(seg, bus, devfn); 71 base = get_base_addr(seg, bus, devfn);
75 if (!base) 72 if (!base)
76 goto err; 73 goto err;
@@ -104,9 +101,6 @@ static int pci_mmcfg_write(unsigned int seg, unsigned int bus,
104 if ((bus > 255) || (devfn > 255) || (reg > 4095)) 101 if ((bus > 255) || (devfn > 255) || (reg > 4095))
105 return -EINVAL; 102 return -EINVAL;
106 103
107 if (reg < 256)
108 return pci_conf1_write(seg,bus,devfn,reg,len,value);
109
110 base = get_base_addr(seg, bus, devfn); 104 base = get_base_addr(seg, bus, devfn);
111 if (!base) 105 if (!base)
112 return -EINVAL; 106 return -EINVAL;
@@ -138,7 +132,7 @@ static struct pci_raw_ops pci_mmcfg = {
138 132
139int __init pci_mmcfg_arch_init(void) 133int __init pci_mmcfg_arch_init(void)
140{ 134{
141 printk(KERN_INFO "PCI: Using MMCONFIG\n"); 135 printk(KERN_INFO "PCI: Using MMCONFIG for extended config space\n");
142 raw_pci_ops = &pci_mmcfg; 136 raw_pci_ext_ops = &pci_mmcfg;
143 return 1; 137 return 1;
144} 138}
diff --git a/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c
index c4cf318e44a9..9207fd49233c 100644
--- a/arch/x86/pci/mmconfig_64.c
+++ b/arch/x86/pci/mmconfig_64.c
@@ -58,9 +58,6 @@ err: *value = -1;
58 return -EINVAL; 58 return -EINVAL;
59 } 59 }
60 60
61 if (reg < 256)
62 return pci_conf1_read(seg,bus,devfn,reg,len,value);
63
64 addr = pci_dev_base(seg, bus, devfn); 61 addr = pci_dev_base(seg, bus, devfn);
65 if (!addr) 62 if (!addr)
66 goto err; 63 goto err;
@@ -89,9 +86,6 @@ static int pci_mmcfg_write(unsigned int seg, unsigned int bus,
89 if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095))) 86 if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095)))
90 return -EINVAL; 87 return -EINVAL;
91 88
92 if (reg < 256)
93 return pci_conf1_write(seg,bus,devfn,reg,len,value);
94
95 addr = pci_dev_base(seg, bus, devfn); 89 addr = pci_dev_base(seg, bus, devfn);
96 if (!addr) 90 if (!addr)
97 return -EINVAL; 91 return -EINVAL;
@@ -150,6 +144,6 @@ int __init pci_mmcfg_arch_init(void)
150 return 0; 144 return 0;
151 } 145 }
152 } 146 }
153 raw_pci_ops = &pci_mmcfg; 147 raw_pci_ext_ops = &pci_mmcfg;
154 return 1; 148 return 1;
155} 149}
diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h
index 36cb44c397c3..3431518d921a 100644
--- a/arch/x86/pci/pci.h
+++ b/arch/x86/pci/pci.h
@@ -85,10 +85,17 @@ extern spinlock_t pci_config_lock;
85extern int (*pcibios_enable_irq)(struct pci_dev *dev); 85extern int (*pcibios_enable_irq)(struct pci_dev *dev);
86extern void (*pcibios_disable_irq)(struct pci_dev *dev); 86extern void (*pcibios_disable_irq)(struct pci_dev *dev);
87 87
88extern int pci_conf1_write(unsigned int seg, unsigned int bus, 88struct pci_raw_ops {
89 unsigned int devfn, int reg, int len, u32 value); 89 int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn,
90extern int pci_conf1_read(unsigned int seg, unsigned int bus, 90 int reg, int len, u32 *val);
91 unsigned int devfn, int reg, int len, u32 *value); 91 int (*write)(unsigned int domain, unsigned int bus, unsigned int devfn,
92 int reg, int len, u32 val);
93};
94
95extern struct pci_raw_ops *raw_pci_ops;
96extern struct pci_raw_ops *raw_pci_ext_ops;
97
98extern struct pci_raw_ops pci_direct_conf1;
92 99
93extern int pci_direct_probe(void); 100extern int pci_direct_probe(void);
94extern void pci_direct_init(int type); 101extern void pci_direct_init(int type);
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c
index 8ecb1c722594..c2df4e97eed6 100644
--- a/arch/x86/pci/visws.c
+++ b/arch/x86/pci/visws.c
@@ -13,9 +13,6 @@
13 13
14#include "pci.h" 14#include "pci.h"
15 15
16
17extern struct pci_raw_ops pci_direct_conf1;
18
19static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; } 16static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
20static void pci_visws_disable_irq(struct pci_dev *dev) { } 17static void pci_visws_disable_irq(struct pci_dev *dev) { }
21 18