x86: unify using pci_mmcfg_insert_resource
PATCH 1/1 x86: unify using pci_mmcfg_insert_resource
even with known_bridge insert them late too.
arch/x86/pci/mmconfig-shared.c +5 -7
@@ -209,7 +209,7 @@ static int __init pci_mmcfg_check_hostbrreturn name !=NULL ; } -static void __init pci_mmcfg_insert_resources (unsigned long resource_flags) +static void __init pci_mmcfg_insert_resources (void ) {#define PCI_MMCFG_RESOURCE_NAME_LEN 19int i;
@@ -233,7 +233,7 @@ static void __init pci_mmcfg_insert_reso cfg->pci_segment); res->start = cfg->address; res->end = res->start + (num_buses <<20 ) -1 ; - res->flags =IORESOURCE_MEM | resource_flags; + res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ;insert_resource (&iomem_resource, res); names +=PCI_MMCFG_RESOURCE_NAME_LEN ; }
@@ -434,11 +434,9 @@ static void __init __pci_mmcfg_init(int (pci_mmcfg_config[0].address == 0))return ; -if (pci_mmcfg_arch_init ()) { -if (known_bridge) -pci_mmcfg_insert_resources (IORESOURCE_BUSY ); +if (pci_mmcfg_arch_init ()) pci_probe = (pci_probe & ~PCI_PROBE_MASK ) |PCI_PROBE_MMCONF ; - }else { +else {/* * Signal not to attempt to insert mmcfg resources because * the architecture mmcfg setup could not initialize.
@@ -475,7 +473,7 @@ static int __init pci_mmcfg_late_insert_* marked so it won't cause request errors when __request_region is * called. */ -pci_mmcfg_insert_resources (0 ); +pci_mmcfg_insert_resources ();return 0 ; }
PATCH 1/1 pci: fix merging left out for BAR print out
print out for Device BAR address before kernel try to update them.
also change it to KERN_DEBUG instead...
drivers/pci/probe.c +9 -3
@@ -304,6 +304,8 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, }else { res->start = l64; res->end = l64 + sz64; +printk (KERN_DEBUG "PCI: %s reg %x 64bit mmio: [%llx, %llx]\n" , +pci_name (dev), pos, res->start, res->end); } }else { sz =pci_size (l, sz, mask);
@@ -313,6 +315,10 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, res->start = l; res->end = l + sz; +printk (KERN_DEBUG "PCI: %s reg %x %s: [%llx, %llx]\n" ,pci_name (dev), + pos, (res->flags &IORESOURCE_IO ) ?"io port" :"32bit mmio" , + res->start, res->end); + } out:
@@ -383,7 +389,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) res->start = base;if (!res->end) res->end = limit +0xfff ; -printk (KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n" ,pci_name (dev), res->start, res->end); +printk (KERN_DEBUG "PCI: bridge %s io port: [%llx, %llx]\n" ,pci_name (dev), res->start, res->end); } res = child->resource[1 ];
@@ -395,7 +401,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) res->flags = (mem_base_lo &PCI_MEMORY_RANGE_TYPE_MASK ) |IORESOURCE_MEM ; res->start = base; res->end = limit +0xfffff ; -printk (KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n" ,pci_name (dev), res->start, res->end); +printk (KERN_DEBUG "PCI: bridge %s 32bit mmio: [%llx, %llx]\n" ,pci_name (dev), res->start, res->end); } res = child->resource[2 ];
@@ -431,7 +437,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) res->flags = (mem_base_lo &PCI_MEMORY_RANGE_TYPE_MASK ) |IORESOURCE_MEM |IORESOURCE_PREFETCH ; res->start = base; res->end = limit +0xfffff ; -printk (KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n" ,pci_name (dev), (res->flags &PCI_PREF_RANGE_TYPE_64 )?"64" :"32" ,res->start, res->end); +printk (KERN_DEBUG "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n" ,pci_name (dev), (res->flags &PCI_PREF_RANGE_TYPE_64 )?"64" :"32" ,res->start, res->end); } }
PATCH 1/1 x86: split e820 reserved entries record to late v4
In reply to Yinghai LuLinus said we should register some entries in e820 later, so could let BAR res register at first, or even pnp?
this one replace
| commit a2bd7274b47124d2fc4dfdb8c0591f545ba749dd | Author: Yinghai Lu <[email protected]> | Date: Mon Aug 25 00:56:08 2008 -0700 | | x86: fix HPET regression in 2.6.26 versus 2.6.25, check hpet against BAR, v3
v2: insert e820 reserve resources before pnp_system_init
v3: fix merging problem in tip/x86/core
please drop the one in tip/x86/core use this one instead
v4: address Linus's review about comments and condition in _late()
--- arch/x86/kernel/e820.c | 24 +++++++++++++++++++++++- arch/x86/pci/i386.c | 3 +++ include/asm-x86/e820.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-)
arch/x86/kernel/e820.c +23 -1
@@ -1271,6 +1271,7 @@ static inline const char *e820_type_to_s/* * Mark e820 reserved areas as busy for the resource manager. */ +static struct resource __initdata *e820_res;void __init e820_reserve_resources (void ) {int i;
@@ -1278,6 +1279,7 @@ void __init e820_reserve_resources(void)u64 end; res =alloc_bootmem_low (sizeof (struct resource ) * e820.nr_map); + e820_res = res;for (i =0 ; i < e820.nr_map; i++) { end = e820.map[i].addr + e820.map[i].size -1 ;#ifndef CONFIG_RESOURCES_64BIT
@@ -1291,7 +1293,14 @@ void __init e820_reserve_resources(void) res->end = end; res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; -insert_resource (&iomem_resource, res); + +/* +* don't register the region that could be conflicted with +* pci device BAR resource and insert them later in +* pcibios_resource_survey() +*/ +if (e820.map[i].type !=E820_RESERVED || res->start < (1ULL <<20 )) +insert_resource (&iomem_resource, res); res++; }
@@ -1303,6 +1312,19 @@ void __init e820_reserve_resources(void) } } +void __init e820_reserve_resources_late (void ) +{ +int i; +struct resource *res; + + res = e820_res; +for (i =0 ; i < e820.nr_map; i++) { +if (!res->parent && res->end) +insert_resource (&iomem_resource, res); + res++; + } +} +char *__init default_machine_specific_memory_setup (void ) {char *who ="BIOS-e820" ;
arch/x86/pci/i386.c +3 -0
@@ -33,6 +33,7 @@#include <linux/bootmem.h> #include <asm/pat.h> +#include <asm/e820.h> #include "pci.h"
@@ -230,6 +231,8 @@ void __init pcibios_resource_survey(voidpcibios_allocate_bus_resources (&pci_root_buses);pcibios_allocate_resources (0 );pcibios_allocate_resources (1 ); + +e820_reserve_resources_late (); }/**
include/asm-x86/e820.h +1 -0
@@ -122,6 +122,7 @@ extern void e820_register_active_regionsextern u64 e820_hole_size (u64 start,u64 end);extern void finish_e820_parsing (void );extern void e820_reserve_resources (void ); +extern void e820_reserve_resources_late (void );extern void setup_memory_map (void );extern char *default_machine_specific_memory_setup (void );extern char *machine_specific_memory_setup (void );
PATCH 1/1 x86: split e820 reserved entries record to late v4 - fix v3
In reply to Yinghai Lutry to insert_resource second time, by expand the resource...
for case: e820 reserved entry is partially overlapped with bar res...
hope it will never happen
v2: according to Linus, add insert_resource_expand_to_fit, and change
__insert_resource to static without lock
v3: use reserve_region_with_split() instead to hand overlapping
with test case by extend 0xe0000000 - 0xeffffff to 0xdd800000 - get e0000000-efffffff : PCI MMCONFIG 0 e0000000-efffffff : reserved in /proc/iomem get found conflict for reserved [dd800000, efffffff], try to reserve with split __reserve_region_with_split: (PCI Bus #80) [dd000000, ddffffff], res: (reserved) [dd800000, efffffff] __reserve_region_with_split: (PCI Bus #00) [de000000, dfffffff], res: (reserved) [de000000, efffffff] initcall pci_subsys_init+0x0/0x121 returned 0 after 381 msecs in dmesg
--- arch/x86/kernel/e820.c | 8 +++- include/linux/ioport.h | 3 + kernel/resource.c | 95 ++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 92 insertions(+), 14 deletions(-)
arch/x86/kernel/e820.c +6 -2
@@ -1319,8 +1319,12 @@ void __init e820_reserve_resources_late( res = e820_res;for (i =0 ; i < e820.nr_map; i++) { -if (!res->parent && res->end) -insert_resource (&iomem_resource, res); +if (!res->parent && res->end &&insert_resource (&iomem_resource, res)) { +printk (KERN_WARNING "found conflict for %s [%08llx, %08llx], try to reserve with split\n" , + res->name, res->start, res->end); + +reserve_region_with_split (&iomem_resource, res->start, res->end, res->name); + } res++; } }
include/linux/ioport.h +3 -0
@@ -108,6 +108,9 @@ extern struct resource iomem_resource;extern int request_resource (struct resource *root,struct resource *new);extern int release_resource (struct resource *new); +extern void reserve_region_with_split (struct resource *root, +resource_size_t start,resource_size_t end, +char *name);extern int insert_resource (struct resource *parent,struct resource *new); extern int allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min,
kernel/resource.c +83 -12
138 lines not on this page · raw message
Ingo, is this stuff in the same branch with the BAR debugging fix?
Thanks,
Jesse
Quoted 49 lines · Yinghai Lu
even with
known_bridgeinsert them late too.Signed-off-by Yinghai Lu <[email protected]>Index:
linux-2.6/arch/x86/pci/mmconfig-shared.c
===================================================================arch/x86/pci/mmconfig-shared.c +4
-7@@ -209,7 +209,7 @@ static int __init pci_mmcfg_check_hostbrreturn name !=NULL ; } -static void __init pci_mmcfg_insert_resources (unsigned long resource_flags) +static void __init pci_mmcfg_insert_resources(void) {#define PCI_MMCFG_RESOURCE_NAME_LEN 19int i;@@ -233,7 +233,7 @@ static void __init pci_mmcfg_insert_reso cfg->pci_segment); res->start = cfg->address; res->end = res->start + (num_buses <<20 ) -1 ; - res->flags =IORESOURCE_MEM | resource_flags; + res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ;insert_resource (&iomem_resource, res); names +=PCI_MMCFG_RESOURCE_NAME_LEN ; }@@ -434,11 +434,9 @@ static void __init __pci_mmcfg_init(int (pci_mmcfg_config[0].address == 0))return ; -if (pci_mmcfg_arch_init ()) { -if (known_bridge) -pci_mmcfg_insert_resources (IORESOURCE_BUSY ); +if (pci_mmcfg_arch_init ()) pci_probe = (pci_probe & ~PCI_PROBE_MASK ) |PCI_PROBE_MMCONF ; - }else { +else {/* * Signal not to attempt to insert mmcfg resources because * the architecture mmcfg setup could not initialize. @@ -475,7 +473,7 @@ static int __init pci_mmcfg_late_insert_* marked so it won't cause request errors when __request_region is * called. */ -pci_mmcfg_insert_resources (0 ); +pci_mmcfg_insert_resources ();return 0 ; }
Quoted 1 line · Jesse Barnes
Ingo, is this stuff in the same branch with the BAR debugging fix?
it's in x86/core:
# x86/core: ebd60cd: x86: unify using pci_mmcfg_insert_resource
and has spread to other topics as well:
# irq/sparseirq: ebd60cd: x86: unify using pci_mmcfg_insert_resource # timers/hpet-percpu: ebd60cd: x86: unify using pci_mmcfg_insert_resource # x86/mm-debug: ebd60cd: x86: unify using pci_mmcfg_insert_resource # x86/spinlocks: ebd60cd: x86: unify using pci_mmcfg_insert_resource # x86/unify-cpu-detect: ebd60cd: x86: unify using pci_mmcfg_insert_resource
i.e. it's quite intervoven. You should be able to cherry pick it cleanly into your tree without any other -tip changes if you track -tip as a remote:
git cherry-pick ebd60cd
if it's not that simple then please let me know and i'll separate it out into a separate, -git based topic.
Ingo