Skip to content

Commit

Permalink
[PATCH] i386/x86-64: PCI: split probing and initialization of type 1 …
Browse files Browse the repository at this point in the history
…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>
  • Loading branch information
Andi Kleen authored and Andi Kleen committed Sep 26, 2006
1 parent a15da49 commit 5e544d6
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 15 deletions.
25 changes: 16 additions & 9 deletions arch/i386/pci/direct.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,16 @@ static int __init pci_check_type2(void)
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;

Expand All @@ -264,30 +273,28 @@ void __init pci_direct_init(void)
if (!region)
goto type2;

if (pci_check_type1()) {
printk(KERN_INFO "PCI: Using configuration type 1\n");
raw_pci_ops = &pci_direct_conf1;
return;
}
if (pci_check_type1())
return 1;
release_resource(region);

type2:
if ((pci_probe & PCI_PROBE_CONF2) == 0)
return;
return 0;
region = request_region(0xCF8, 4, "PCI conf2");
if (!region)
return;
return 0;
region2 = request_region(0xC000, 0x1000, "PCI conf2");
if (!region2)
goto fail2;

if (pci_check_type2()) {
printk(KERN_INFO "PCI: Using configuration type 2\n");
raw_pci_ops = &pci_direct_conf2;
return;
return 2;
}

release_resource(region2);
fail2:
release_resource(region);
return 0;
}
9 changes: 7 additions & 2 deletions arch/i386/pci/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@
in the right sequence from here. */
static __init int pci_access_init(void)
{
int type = 0;

#ifdef CONFIG_PCI_DIRECT
type = pci_direct_probe();
#endif
#ifdef CONFIG_PCI_MMCONFIG
pci_mmcfg_init();
pci_mmcfg_init(type);
#endif
if (raw_pci_ops)
return 0;
Expand All @@ -21,7 +26,7 @@ static __init int pci_access_init(void)
* fails.
*/
#ifdef CONFIG_PCI_DIRECT
pci_direct_init();
pci_direct_init(type);
#endif
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/i386/pci/mmconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
return;
Expand Down
6 changes: 4 additions & 2 deletions arch/i386/pci/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
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_mmcfg_init(void);
extern void pci_mmcfg_init(int type);
extern void pcibios_sort(void);

2 changes: 1 addition & 1 deletion arch/x86_64/pci/mmconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 5e544d6

Please sign in to comment.