Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e544d61 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen
Browse files

[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: default avatarAndi Kleen <ak@suse.de>
parent a15da49d
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -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;

@@ -264,19 +273,16 @@ 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;
@@ -284,10 +290,11 @@ void __init pci_direct_init(void)
	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;
}
+7 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
}
+1 −1
Original line number Diff line number Diff line
@@ -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;
+4 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;