mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-04 21:31:51 +00:00
[PATCH] i386/x86-64: PCI: split probing and initialization of type 1 config space access
First probe if type1/2 accesses work, but then only initialize them at the end. This is useful for a later patch that needs this information inbetween. Signed-off-by: Andi Kleen <ak@suse.de>
This commit is contained in:
parent
a15da49deb
commit
5e544d618f
5 changed files with 29 additions and 15 deletions
|
@ -254,7 +254,16 @@ static int __init pci_check_type2(void)
|
||||||
return works;
|
return works;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init pci_direct_init(void)
|
void __init pci_direct_init(int type)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "PCI: Using configuration type %d\n", type);
|
||||||
|
if (type == 1)
|
||||||
|
raw_pci_ops = &pci_direct_conf1;
|
||||||
|
else
|
||||||
|
raw_pci_ops = &pci_direct_conf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __init pci_direct_probe(void)
|
||||||
{
|
{
|
||||||
struct resource *region, *region2;
|
struct resource *region, *region2;
|
||||||
|
|
||||||
|
@ -264,19 +273,16 @@ void __init pci_direct_init(void)
|
||||||
if (!region)
|
if (!region)
|
||||||
goto type2;
|
goto type2;
|
||||||
|
|
||||||
if (pci_check_type1()) {
|
if (pci_check_type1())
|
||||||
printk(KERN_INFO "PCI: Using configuration type 1\n");
|
return 1;
|
||||||
raw_pci_ops = &pci_direct_conf1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
release_resource(region);
|
release_resource(region);
|
||||||
|
|
||||||
type2:
|
type2:
|
||||||
if ((pci_probe & PCI_PROBE_CONF2) == 0)
|
if ((pci_probe & PCI_PROBE_CONF2) == 0)
|
||||||
return;
|
return 0;
|
||||||
region = request_region(0xCF8, 4, "PCI conf2");
|
region = request_region(0xCF8, 4, "PCI conf2");
|
||||||
if (!region)
|
if (!region)
|
||||||
return;
|
return 0;
|
||||||
region2 = request_region(0xC000, 0x1000, "PCI conf2");
|
region2 = request_region(0xC000, 0x1000, "PCI conf2");
|
||||||
if (!region2)
|
if (!region2)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
|
@ -284,10 +290,11 @@ void __init pci_direct_init(void)
|
||||||
if (pci_check_type2()) {
|
if (pci_check_type2()) {
|
||||||
printk(KERN_INFO "PCI: Using configuration type 2\n");
|
printk(KERN_INFO "PCI: Using configuration type 2\n");
|
||||||
raw_pci_ops = &pci_direct_conf2;
|
raw_pci_ops = &pci_direct_conf2;
|
||||||
return;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
release_resource(region2);
|
release_resource(region2);
|
||||||
fail2:
|
fail2:
|
||||||
release_resource(region);
|
release_resource(region);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,13 @@
|
||||||
in the right sequence from here. */
|
in the right sequence from here. */
|
||||||
static __init int pci_access_init(void)
|
static __init int pci_access_init(void)
|
||||||
{
|
{
|
||||||
|
int type = 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_DIRECT
|
||||||
|
type = pci_direct_probe();
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_PCI_MMCONFIG
|
#ifdef CONFIG_PCI_MMCONFIG
|
||||||
pci_mmcfg_init();
|
pci_mmcfg_init(type);
|
||||||
#endif
|
#endif
|
||||||
if (raw_pci_ops)
|
if (raw_pci_ops)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -21,7 +26,7 @@ static __init int pci_access_init(void)
|
||||||
* fails.
|
* fails.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_PCI_DIRECT
|
#ifdef CONFIG_PCI_DIRECT
|
||||||
pci_direct_init();
|
pci_direct_init(type);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,7 @@ static __init void unreachable_devices(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init pci_mmcfg_init(void)
|
void __init pci_mmcfg_init(int type)
|
||||||
{
|
{
|
||||||
if ((pci_probe & PCI_PROBE_MMCONF) == 0)
|
if ((pci_probe & PCI_PROBE_MMCONF) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -81,7 +81,9 @@ extern int pci_conf1_write(unsigned int seg, unsigned int bus,
|
||||||
extern int pci_conf1_read(unsigned int seg, unsigned int bus,
|
extern int pci_conf1_read(unsigned int seg, unsigned int bus,
|
||||||
unsigned int devfn, int reg, int len, u32 *value);
|
unsigned int devfn, int reg, int len, u32 *value);
|
||||||
|
|
||||||
extern void pci_direct_init(void);
|
extern int pci_direct_probe(void);
|
||||||
|
extern void pci_direct_init(int type);
|
||||||
extern void pci_pcbios_init(void);
|
extern void pci_pcbios_init(void);
|
||||||
extern void pci_mmcfg_init(void);
|
extern void pci_mmcfg_init(int type);
|
||||||
extern void pcibios_sort(void);
|
extern void pcibios_sort(void);
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ static __init void unreachable_devices(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init pci_mmcfg_init(void)
|
void __init pci_mmcfg_init(int type)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue