* [PATCH 2/2] acpi based pci gap caluculation v2
@ 2008-06-24 18:48 Alok Kataria
2008-06-25 2:49 ` Zhao Yakui
0 siblings, 1 reply; 10+ messages in thread
From: Alok Kataria @ 2008-06-24 18:48 UTC (permalink / raw)
To: lenb, Ingo Molnar; +Cc: linux-acpi, LKML
Evaluates the _CRS object under PCI0 looking for producer resources.
Then searches the e820 memory space for a gap within these producer resources.
Allows us to find a gap for the unclaimed pci resources or MMIO resources
for hotplug devices within the BIOS allowed pci regions.
v1->v2: Some changes in the print strings.
Also note the prototype for e820_search_gap has changes in this
iteration, but the return value is ignored while calling it over here.
Signed-off-by: Alok N Kataria <akataria@vmware.com>
Index: linux-x86-tree.git/arch/x86/pci/acpi.c
===================================================================
--- linux-x86-tree.git.orig/arch/x86/pci/acpi.c 2008-06-23 17:24:07.000000000 -0700
+++ linux-x86-tree.git/arch/x86/pci/acpi.c 2008-06-24 10:57:43.000000000 -0700
@@ -4,6 +4,7 @@
#include <linux/irq.h>
#include <linux/dmi.h>
#include <asm/numa.h>
+#include <asm/e820.h>
#include "pci.h"
struct pci_root_info {
@@ -14,6 +15,11 @@
int busnum;
};
+struct gap_info {
+ unsigned long gapstart;
+ unsigned long gapsize;
+};
+
static acpi_status
resource_to_addr(struct acpi_resource *resource,
struct acpi_resource_address64 *addr)
@@ -110,6 +116,70 @@
}
}
+static acpi_status search_gap(struct acpi_resource *resource, void *data)
+{
+ struct acpi_resource_address64 addr;
+ acpi_status status;
+ struct gap_info *gap = data;
+
+ status = resource_to_addr(resource, &addr);
+ if (ACPI_SUCCESS(status) &&
+ addr.resource_type == ACPI_MEMORY_RANGE &&
+ addr.address_length > gap->gapsize) {
+ e820_search_gap(&gap->gapstart, &gap->gapsize,
+ (addr.minimum + addr.translation_offset));
+ }
+
+ return AE_OK;
+}
+
+/*
+ * Search for a hole in the 32 bit address space for PCI to assign MMIO
+ * resources for hotplug or unconfigured resources.
+ * We query the CRS object of the PCI root device to look for possible producer
+ * resources in the tree and consider these while calulating the start address
+ * for this hole.
+ */
+static void pci_setup_gap(acpi_handle *handle)
+{
+ struct gap_info gap;
+ acpi_status status;
+
+ gap.gapstart = 0;
+ gap.gapsize = 0x400000;
+
+ status = acpi_walk_resources(handle, METHOD_NAME__CRS,
+ search_gap, &gap);
+
+ if (ACPI_SUCCESS(status)) {
+ unsigned long round;
+
+ if (!gap.gapstart) {
+ printk(KERN_ERR "ACPI: Warning: Cannot find a gap "
+ "in the 32bit address range for PCI\n"
+ "ACPI: PCI devices may collide with "
+ "hotpluggable memory address range\n");
+ }
+ /*
+ * Round the gapstart, uses the same logic as in
+ * e820_gap_setup
+ */
+ round = 0x100000;
+ while ((gap.gapsize >> 4) > round)
+ round += round;
+ /* Fun with two's complement */
+ pci_mem_start = (gap.gapstart + round) & -round;
+
+ printk(KERN_INFO "ACPI: PCI resources should "
+ "start at %lx (gap: %lx:%lx)\n",
+ pci_mem_start, gap.gapstart, gap.gapsize);
+ } else {
+ printk(KERN_ERR "ACPI: Error while searching for gap in "
+ "the 32bit address range for PCI\n");
+ }
+}
+
+
static void
get_current_resources(struct acpi_device *device, int busnum,
int domain, struct pci_bus *bus)
@@ -220,6 +290,8 @@
if (bus && (pci_probe & PCI_USE__CRS))
get_current_resources(device, busnum, domain, bus);
+
+ pci_setup_gap(device->handle);
return bus;
}
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-24 18:48 [PATCH 2/2] acpi based pci gap caluculation v2 Alok Kataria @ 2008-06-25 2:49 ` Zhao Yakui 2008-06-25 4:17 ` Alok kataria 0 siblings, 1 reply; 10+ messages in thread From: Zhao Yakui @ 2008-06-25 2:49 UTC (permalink / raw) To: akataria; +Cc: lenb, Ingo Molnar, linux-acpi, LKML On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: > Evaluates the _CRS object under PCI0 looking for producer resources. > Then searches the e820 memory space for a gap within these producer resources. > > Allows us to find a gap for the unclaimed pci resources or MMIO resources > for hotplug devices within the BIOS allowed pci regions. > > v1->v2: Some changes in the print strings. > Also note the prototype for e820_search_gap has changes in this > iteration, but the return value is ignored while calling it over here. > > Signed-off-by: Alok N Kataria <akataria@vmware.com> > > Index: linux-x86-tree.git/arch/x86/pci/acpi.c > =================================================================== > --- linux-x86-tree.git.orig/arch/x86/pci/acpi.c 2008-06-23 17:24:07.000000000 -0700 > +++ linux-x86-tree.git/arch/x86/pci/acpi.c 2008-06-24 10:57:43.000000000 -0700 > @@ -4,6 +4,7 @@ > #include <linux/irq.h> > #include <linux/dmi.h> > #include <asm/numa.h> > +#include <asm/e820.h> > #include "pci.h" > > struct pci_root_info { > @@ -14,6 +15,11 @@ > int busnum; > }; > > +struct gap_info { > + unsigned long gapstart; > + unsigned long gapsize; > +}; > + > static acpi_status > resource_to_addr(struct acpi_resource *resource, > struct acpi_resource_address64 *addr) > @@ -110,6 +116,70 @@ > } > } > > +static acpi_status search_gap(struct acpi_resource *resource, void *data) > +{ > + struct acpi_resource_address64 addr; > + acpi_status status; > + struct gap_info *gap = data; > + > + status = resource_to_addr(resource, &addr); > + if (ACPI_SUCCESS(status) && > + addr.resource_type == ACPI_MEMORY_RANGE && > + addr.address_length > gap->gapsize) { > + e820_search_gap(&gap->gapstart, &gap->gapsize, > + (addr.minimum + addr.translation_offset)); > + } > + > + return AE_OK; > +} > + > +/* > + * Search for a hole in the 32 bit address space for PCI to assign MMIO > + * resources for hotplug or unconfigured resources. > + * We query the CRS object of the PCI root device to look for possible producer > + * resources in the tree and consider these while calulating the start address > + * for this hole. > + */ > +static void pci_setup_gap(acpi_handle *handle) > +{ > + struct gap_info gap; > + acpi_status status; > + > + gap.gapstart = 0; > + gap.gapsize = 0x400000; > + > + status = acpi_walk_resources(handle, METHOD_NAME__CRS, > + search_gap, &gap); > + > + if (ACPI_SUCCESS(status)) { > + unsigned long round; > + > + if (!gap.gapstart) { > + printk(KERN_ERR "ACPI: Warning: Cannot find a gap " > + "in the 32bit address range for PCI\n" > + "ACPI: PCI devices may collide with " > + "hotpluggable memory address range\n"); > + } > + /* > + * Round the gapstart, uses the same logic as in > + * e820_gap_setup > + */ > + round = 0x100000; > + while ((gap.gapsize >> 4) > round) > + round += round; > + /* Fun with two's complement */ > + pci_mem_start = (gap.gapstart + round) & -round; > + > + printk(KERN_INFO "ACPI: PCI resources should " > + "start at %lx (gap: %lx:%lx)\n", > + pci_mem_start, gap.gapstart, gap.gapsize); > + } else { > + printk(KERN_ERR "ACPI: Error while searching for gap in " > + "the 32bit address range for PCI\n"); > + } > +} > + > + > static void > get_current_resources(struct acpi_device *device, int busnum, > int domain, struct pci_bus *bus) > @@ -220,6 +290,8 @@ > > if (bus && (pci_probe & PCI_USE__CRS)) > get_current_resources(device, busnum, domain, bus); > + > + pci_setup_gap(device->handle); > return bus; > } It seems reasonable. But if the resource obtained from the PCI0 _CRS method is incorrect, we will get the incorrect pci_mem_start. At the same time after the patch is applied, pci_mem_start will be parsed in two different ways. If the result is different, maybe the incorrect pci_mem_start will be used. Best regards. Yakui > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 2:49 ` Zhao Yakui @ 2008-06-25 4:17 ` Alok kataria 2008-06-25 5:39 ` Zhao Yakui 0 siblings, 1 reply; 10+ messages in thread From: Alok kataria @ 2008-06-25 4:17 UTC (permalink / raw) To: Zhao Yakui; +Cc: akataria, lenb, Ingo Molnar, linux-acpi, LKML On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: >> Evaluates the _CRS object under PCI0 looking for producer resources. >> Then searches the e820 memory space for a gap within these producer resources. >> >> Allows us to find a gap for the unclaimed pci resources or MMIO resources >> for hotplug devices within the BIOS allowed pci regions. >> > It seems reasonable. > But if the resource obtained from the PCI0 _CRS method is incorrect, we > will get the incorrect pci_mem_start. Hi Yakui, What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS give a incorrect _CRS object ? Also we don't just take the value given from the _CRS method, we still read the e820_map to search for an unallocated resource. So even if (by chance) the _CRS method returns incorrect value we would still figure out if there is a collision with an already allocated resource. > > At the same time after the patch is applied, pci_mem_start will be > parsed in two different ways. Yes pci_mem_start would be initialized in 2 different ways but we still have to parse the e820_map the old way because there could be systems without ACPI. > If the result is different, maybe the > incorrect pci_mem_start will be used. Yeah, The result is different in my case. Though my BIOS reserves hotpluggable memory region, kernel doesn't respect that right now and just parses the e820_map to calculate the gap and pci_mem_start value. I have explained the problem in this mail. http://marc.info/?l=linux-acpi&m=121391675711763&w=2 Maybe nobody has seen this problem yet, because there are no systems out there with less than 4GB memory to start with and which allow memory hotplug. But still i don't understand what do you mean by, we can get incorrect pci_mem_start, in which case ? Thanks, Alok > > Best regards. > Yakui >> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 4:17 ` Alok kataria @ 2008-06-25 5:39 ` Zhao Yakui 2008-06-25 6:04 ` Alok kataria 0 siblings, 1 reply; 10+ messages in thread From: Zhao Yakui @ 2008-06-25 5:39 UTC (permalink / raw) To: Alok kataria; +Cc: akataria, lenb, Ingo Molnar, linux-acpi, LKML On Tue, 2008-06-24 at 21:17 -0700, Alok kataria wrote: > On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: > >> Evaluates the _CRS object under PCI0 looking for producer resources. > >> Then searches the e820 memory space for a gap within these producer resources. > >> > >> Allows us to find a gap for the unclaimed pci resources or MMIO resources > >> for hotplug devices within the BIOS allowed pci regions. > >> > > It seems reasonable. > > But if the resource obtained from the PCI0 _CRS method is incorrect, we > > will get the incorrect pci_mem_start. > > Hi Yakui, > > What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS > give a incorrect _CRS object ? > Also we don't just take the value given from the _CRS method, we still > read the e820_map to search for an unallocated resource. So even if > (by chance) the _CRS method returns incorrect value we would still > figure out if there is a collision with an already allocated resource. In the patch the address obtained from the _CRS object will be passed into the function of e820_search_gap. In such case maybe we will get the pci_mem_start different with the e820_setup_gap. > > > > At the same time after the patch is applied, pci_mem_start will be > > parsed in two different ways. > > Yes pci_mem_start would be initialized in 2 different ways but we > still have to parse the e820_map the old way because there could be > systems without ACPI. > > > If the result is different, maybe the > > incorrect pci_mem_start will be used. > > Yeah, The result is different in my case. Though my BIOS reserves > hotpluggable memory region, kernel doesn't respect that right now and > just parses the e820_map to calculate the gap and pci_mem_start value. > I have explained the problem in this mail. > > http://marc.info/?l=linux-acpi&m=121391675711763&w=2 > > Maybe nobody has seen this problem yet, because there are no systems > out there with less than 4GB memory to start with and which allow > memory hotplug. > > But still i don't understand what do you mean by, we can get incorrect > pci_mem_start, in which case ? In the function of setup_arch the pci_mem_start will be parsed by searching the e820 table. After the patch is applied, we will parse the pci_mem_start again in the function of pci_acpi_scan_init and it will override the value parsed in the function of setup_arch. If the pci_mem_start is incorrect in the second case, maybe it will have side effect. Thanks. Yakui. > Thanks, > Alok > > > > Best regards. > > Yakui > >> > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > Please read the FAQ at http://www.tux.org/lkml/ > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 5:39 ` Zhao Yakui @ 2008-06-25 6:04 ` Alok kataria 2008-06-25 8:38 ` Zhao Yakui 0 siblings, 1 reply; 10+ messages in thread From: Alok kataria @ 2008-06-25 6:04 UTC (permalink / raw) To: Zhao Yakui; +Cc: akataria, lenb, Ingo Molnar, linux-acpi, LKML Hi Yakui, On Tue, Jun 24, 2008 at 10:39 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > On Tue, 2008-06-24 at 21:17 -0700, Alok kataria wrote: >> On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: >> > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: >> >> Evaluates the _CRS object under PCI0 looking for producer resources. >> >> Then searches the e820 memory space for a gap within these producer resources. >> >> >> >> Allows us to find a gap for the unclaimed pci resources or MMIO resources >> >> for hotplug devices within the BIOS allowed pci regions. >> >> >> > It seems reasonable. >> > But if the resource obtained from the PCI0 _CRS method is incorrect, we >> > will get the incorrect pci_mem_start. >> >> Hi Yakui, >> >> What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS >> give a incorrect _CRS object ? >> Also we don't just take the value given from the _CRS method, we still >> read the e820_map to search for an unallocated resource. So even if >> (by chance) the _CRS method returns incorrect value we would still >> figure out if there is a collision with an already allocated resource. > In the patch the address obtained from the _CRS object will be passed > into the function of e820_search_gap. In such case maybe we will get the > pci_mem_start different with the e820_setup_gap. True..the whole idea behind doing this patch was to get a correct (different) value for pci_mem_start. We read the _CRS object over here to make sure that we assign the pci_mem_start from the address range which is reserved by the BIOS for PCI devices. Also this reading of _CRS object would be done before we start initializing the pci devices, i.e. before we start using the value of pci_mem_start, so the original value assigned by pci_setup_gap is just overwritten by this function. So that should be fine IMHO. Also we would still want the call for e820_setup_gap because there can be systems with no acpi support or acpi disabled > >> > >> > At the same time after the patch is applied, pci_mem_start will be >> > parsed in two different ways. >> >> Yes pci_mem_start would be initialized in 2 different ways but we >> still have to parse the e820_map the old way because there could be >> systems without ACPI. >> >> > If the result is different, maybe the >> > incorrect pci_mem_start will be used. >> >> Yeah, The result is different in my case. Though my BIOS reserves >> hotpluggable memory region, kernel doesn't respect that right now and >> just parses the e820_map to calculate the gap and pci_mem_start value. >> I have explained the problem in this mail. >> >> http://marc.info/?l=linux-acpi&m=121391675711763&w=2 >> >> Maybe nobody has seen this problem yet, because there are no systems >> out there with less than 4GB memory to start with and which allow >> memory hotplug. >> >> But still i don't understand what do you mean by, we can get incorrect >> pci_mem_start, in which case ? > > In the function of setup_arch the pci_mem_start will be parsed by > searching the e820 table. After the patch is applied, we will parse the > pci_mem_start again in the function of pci_acpi_scan_init and it will > override the value parsed in the function of setup_arch. If the > pci_mem_start is incorrect in the second case, maybe it will have side > effect. Yes it will override. But how can the value be incorrect in the second case. As explained in my previous mail we still parse the e820_map to check if we have unclaimed resources between start_address (that read from _CRS) to 2^32. So even if this start_address is wrong we would catch that during parsing e820_map. But again why would the _CRS return incorrect values, are you talking about errors in BIOS ? Thanks, Alok ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 6:04 ` Alok kataria @ 2008-06-25 8:38 ` Zhao Yakui 2008-06-25 16:57 ` Alok Kataria 0 siblings, 1 reply; 10+ messages in thread From: Zhao Yakui @ 2008-06-25 8:38 UTC (permalink / raw) To: Alok kataria; +Cc: akataria, lenb, Ingo Molnar, linux-acpi, LKML On Tue, 2008-06-24 at 23:04 -0700, Alok kataria wrote: > Hi Yakui, > > On Tue, Jun 24, 2008 at 10:39 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > On Tue, 2008-06-24 at 21:17 -0700, Alok kataria wrote: > >> On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > >> > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: > >> >> Evaluates the _CRS object under PCI0 looking for producer resources. > >> >> Then searches the e820 memory space for a gap within these producer resources. > >> >> > >> >> Allows us to find a gap for the unclaimed pci resources or MMIO resources > >> >> for hotplug devices within the BIOS allowed pci regions. > >> >> > >> > It seems reasonable. > >> > But if the resource obtained from the PCI0 _CRS method is incorrect, we > >> > will get the incorrect pci_mem_start. > >> > >> Hi Yakui, > >> > >> What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS > >> give a incorrect _CRS object ? > >> Also we don't just take the value given from the _CRS method, we still > >> read the e820_map to search for an unallocated resource. So even if > >> (by chance) the _CRS method returns incorrect value we would still > >> figure out if there is a collision with an already allocated resource. > > In the patch the address obtained from the _CRS object will be passed > > into the function of e820_search_gap. In such case maybe we will get the > > pci_mem_start different with the e820_setup_gap. > > True..the whole idea behind doing this patch was to get a correct > (different) value for pci_mem_start. > We read the _CRS object over here to make sure that we assign the > pci_mem_start from the address range which is reserved by the BIOS for > PCI devices. > > Also this reading of _CRS object would be done before we start > initializing the pci devices, i.e. before we start using the value of > pci_mem_start, so the original value assigned by pci_setup_gap is just > overwritten by this function. So that should be fine IMHO. > Also we would still want the call for e820_setup_gap because there can > be systems with no acpi support or acpi disabled > > > > > >> > > >> > At the same time after the patch is applied, pci_mem_start will be > >> > parsed in two different ways. > >> > >> Yes pci_mem_start would be initialized in 2 different ways but we > >> still have to parse the e820_map the old way because there could be > >> systems without ACPI. > >> > >> > If the result is different, maybe the > >> > incorrect pci_mem_start will be used. > >> > >> Yeah, The result is different in my case. Though my BIOS reserves > >> hotpluggable memory region, kernel doesn't respect that right now and > >> just parses the e820_map to calculate the gap and pci_mem_start value. > >> I have explained the problem in this mail. > >> > >> http://marc.info/?l=linux-acpi&m=121391675711763&w=2 > >> > >> Maybe nobody has seen this problem yet, because there are no systems > >> out there with less than 4GB memory to start with and which allow > >> memory hotplug. > >> > >> But still i don't understand what do you mean by, we can get incorrect > >> pci_mem_start, in which case ? > > > > In the function of setup_arch the pci_mem_start will be parsed by > > searching the e820 table. After the patch is applied, we will parse the > > pci_mem_start again in the function of pci_acpi_scan_init and it will > > override the value parsed in the function of setup_arch. If the > > pci_mem_start is incorrect in the second case, maybe it will have side > > effect. > > Yes it will override. But how can the value be incorrect in the second > case. As explained in my previous mail we still parse the e820_map to > check if we have unclaimed resources between start_address (that read > from _CRS) to 2^32. So even if this start_address is wrong we would > catch that during parsing e820_map. But again why would the _CRS > return incorrect values, are you talking about errors in BIOS ? The pci_mem_start is still gotten by parsing the E820 table.But the input parameter start_addr will be used in the function of e820_search_gap. If the following is the resource start address returned by the PCI0 _CRS object , maybe the different pci_mem_start will be gotten. 0xE0000000 0xE4000000 At the same time if several start address is returned by the _CRS object, the e820 table will be parsed several times. Thanks. Yakui > Thanks, > Alok ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 8:38 ` Zhao Yakui @ 2008-06-25 16:57 ` Alok Kataria 2008-06-25 18:22 ` Alok Kataria 2008-06-26 1:00 ` Zhao Yakui 0 siblings, 2 replies; 10+ messages in thread From: Alok Kataria @ 2008-06-25 16:57 UTC (permalink / raw) To: Zhao Yakui; +Cc: Alok kataria, lenb, Ingo Molnar, linux-acpi, LKML On Wed, 2008-06-25 at 01:38 -0700, Zhao Yakui wrote: > On Tue, 2008-06-24 at 23:04 -0700, Alok kataria wrote: > > Hi Yakui, > > > > On Tue, Jun 24, 2008 at 10:39 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > > On Tue, 2008-06-24 at 21:17 -0700, Alok kataria wrote: > > >> On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > >> > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: > > >> >> Evaluates the _CRS object under PCI0 looking for producer resources. > > >> >> Then searches the e820 memory space for a gap within these producer resources. > > >> >> > > >> >> Allows us to find a gap for the unclaimed pci resources or MMIO resources > > >> >> for hotplug devices within the BIOS allowed pci regions. > > >> >> > > >> > It seems reasonable. > > >> > But if the resource obtained from the PCI0 _CRS method is incorrect, we > > >> > will get the incorrect pci_mem_start. > > >> > > >> Hi Yakui, > > >> > > >> What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS > > >> give a incorrect _CRS object ? > > >> Also we don't just take the value given from the _CRS method, we still > > >> read the e820_map to search for an unallocated resource. So even if > > >> (by chance) the _CRS method returns incorrect value we would still > > >> figure out if there is a collision with an already allocated resource. > > > In the patch the address obtained from the _CRS object will be passed > > > into the function of e820_search_gap. In such case maybe we will get the > > > pci_mem_start different with the e820_setup_gap. > > > > True..the whole idea behind doing this patch was to get a correct > > (different) value for pci_mem_start. > > We read the _CRS object over here to make sure that we assign the > > pci_mem_start from the address range which is reserved by the BIOS for > > PCI devices. > > > > Also this reading of _CRS object would be done before we start > > initializing the pci devices, i.e. before we start using the value of > > pci_mem_start, so the original value assigned by pci_setup_gap is just > > overwritten by this function. So that should be fine IMHO. > > Also we would still want the call for e820_setup_gap because there can > > be systems with no acpi support or acpi disabled > > > > > > > > > >> > > > >> > At the same time after the patch is applied, pci_mem_start will be > > >> > parsed in two different ways. > > >> > > >> Yes pci_mem_start would be initialized in 2 different ways but we > > >> still have to parse the e820_map the old way because there could be > > >> systems without ACPI. > > >> > > >> > If the result is different, maybe the > > >> > incorrect pci_mem_start will be used. > > >> > > >> Yeah, The result is different in my case. Though my BIOS reserves > > >> hotpluggable memory region, kernel doesn't respect that right now and > > >> just parses the e820_map to calculate the gap and pci_mem_start value. > > >> I have explained the problem in this mail. > > >> > > >> http://marc.info/?l=linux-acpi&m=121391675711763&w=2 > > >> > > >> Maybe nobody has seen this problem yet, because there are no systems > > >> out there with less than 4GB memory to start with and which allow > > >> memory hotplug. > > >> > > >> But still i don't understand what do you mean by, we can get incorrect > > >> pci_mem_start, in which case ? > > > > > > In the function of setup_arch the pci_mem_start will be parsed by > > > searching the e820 table. After the patch is applied, we will parse the > > > pci_mem_start again in the function of pci_acpi_scan_init and it will > > > override the value parsed in the function of setup_arch. If the > > > pci_mem_start is incorrect in the second case, maybe it will have side > > > effect. > > > > Yes it will override. But how can the value be incorrect in the second > > case. As explained in my previous mail we still parse the e820_map to > > check if we have unclaimed resources between start_address (that read > > from _CRS) to 2^32. So even if this start_address is wrong we would > > catch that during parsing e820_map. But again why would the _CRS > > return incorrect values, are you talking about errors in BIOS ? > The pci_mem_start is still gotten by parsing the E820 table.But the > input parameter start_addr will be used in the function of > e820_search_gap. > If the following is the resource start address returned by the PCI0 > _CRS object , maybe the different pci_mem_start will be gotten. > 0xE0000000 > 0xE4000000 > > At the same time if several start address is returned by the _CRS > object, the e820 table will be parsed several times. Yes we will parse e820 several times, but we don't initialize pci_mem_start in every pass. It will be initialized only twice once via the e820_setup_gap code path and once via pci_setup_gap. And i think you agree that both of these are required ? During the gap calculation the previous code or the code now in e820_setup_gap does this... calculates a gap in e820_map from 0 to 2^32. Initializes pci_mem_start. And now with this patch, the code in pci_setup_gap does this... for each _CRS under PCI0 search gap from start_addr of _CRS to 2^32 *[1]. Initialize pci_mem_start with the biggest gap that we could find. Essentially, what we are doing is just limiting the gap calculation to a smaller address space depending on the ACPI information we get. Now then, what problem do you see with this approach ? *[1] While writing this mail i figured out that, instead of searching from start_addr of _CRS to 2^32 we should just search till *end_addr* of _CRS resource. I will send a patch to that effect. Thanks, Alok > > Thanks. > Yakui > > > Thanks, > > Alok > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 16:57 ` Alok Kataria @ 2008-06-25 18:22 ` Alok Kataria 2008-06-26 1:00 ` Zhao Yakui 1 sibling, 0 replies; 10+ messages in thread From: Alok Kataria @ 2008-06-25 18:22 UTC (permalink / raw) To: Zhao Yakui, Ingo Molnar, lenb; +Cc: linux-acpi, LKML On Wed, 2008-06-25 at 09:57 -0700, Alok Kataria wrote: > While writing this mail i figured out that, instead of searching from > start_addr of _CRS to 2^32 we should just search till *end_addr* of _CRS resource. > I will send a patch to that effect. > > Thanks, > Alok > Ingo, Please also apply this patch to the tip/out-of-tree -- Incremental patch . This patch passes the pci producer resources end_addr (got from _CRS) to the e820_search_gap function. Without this patch the code will always search from the producer regions start_address to 2^32, even though the producer region may be smaller. Now , we limit the search only within the producer region's address space. Also we put a condition to check if the resource lies in the 32bit address range. Signed-off-by: Alok N Kataria <akataria@vmware.com> Index: linux-x86-tree.git/arch/x86/pci/acpi.c =================================================================== --- linux-x86-tree.git.orig/arch/x86/pci/acpi.c 2008-06-25 10:11:35.000000000 -0700 +++ linux-x86-tree.git/arch/x86/pci/acpi.c 2008-06-25 11:17:31.000000000 -0700 @@ -121,13 +121,21 @@ struct acpi_resource_address64 addr; acpi_status status; struct gap_info *gap = data; + unsigned long long start_addr, end_addr; status = resource_to_addr(resource, &addr); if (ACPI_SUCCESS(status) && addr.resource_type == ACPI_MEMORY_RANGE && addr.address_length > gap->gapsize) { - e820_search_gap(&gap->gapstart, &gap->gapsize, - (addr.minimum + addr.translation_offset)); + start_addr = addr.minimum + addr.translation_offset; + /* + * We want space only in the 32bit address range + */ + if (start_addr < UINT_MAX) { + end_addr = start_addr + addr.address_length; + e820_search_gap(&gap->gapstart, &gap->gapsize, + start_addr, end_addr); + } } return AE_OK; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-25 16:57 ` Alok Kataria 2008-06-25 18:22 ` Alok Kataria @ 2008-06-26 1:00 ` Zhao Yakui 2008-06-26 1:18 ` Alok Kataria 1 sibling, 1 reply; 10+ messages in thread From: Zhao Yakui @ 2008-06-26 1:00 UTC (permalink / raw) To: akataria; +Cc: Alok kataria, lenb, Ingo Molnar, linux-acpi, LKML On Wed, 2008-06-25 at 09:57 -0700, Alok Kataria wrote: > On Wed, 2008-06-25 at 01:38 -0700, Zhao Yakui wrote: > > On Tue, 2008-06-24 at 23:04 -0700, Alok kataria wrote: > > > Hi Yakui, > > > > > > On Tue, Jun 24, 2008 at 10:39 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > > > On Tue, 2008-06-24 at 21:17 -0700, Alok kataria wrote: > > > >> On Tue, Jun 24, 2008 at 7:49 PM, Zhao Yakui <yakui.zhao@intel.com> wrote: > > > >> > On Tue, 2008-06-24 at 11:48 -0700, Alok Kataria wrote: > > > >> >> Evaluates the _CRS object under PCI0 looking for producer resources. > > > >> >> Then searches the e820 memory space for a gap within these producer resources. > > > >> >> > > > >> >> Allows us to find a gap for the unclaimed pci resources or MMIO resources > > > >> >> for hotplug devices within the BIOS allowed pci regions. > > > >> >> > > > >> > It seems reasonable. > > > >> > But if the resource obtained from the PCI0 _CRS method is incorrect, we > > > >> > will get the incorrect pci_mem_start. > > > >> > > > >> Hi Yakui, > > > >> > > > >> What do you mean by the PCI0 _CRS being incorrect ? Why would the BIOS > > > >> give a incorrect _CRS object ? > > > >> Also we don't just take the value given from the _CRS method, we still > > > >> read the e820_map to search for an unallocated resource. So even if > > > >> (by chance) the _CRS method returns incorrect value we would still > > > >> figure out if there is a collision with an already allocated resource. > > > > In the patch the address obtained from the _CRS object will be passed > > > > into the function of e820_search_gap. In such case maybe we will get the > > > > pci_mem_start different with the e820_setup_gap. > > > > > > True..the whole idea behind doing this patch was to get a correct > > > (different) value for pci_mem_start. > > > We read the _CRS object over here to make sure that we assign the > > > pci_mem_start from the address range which is reserved by the BIOS for > > > PCI devices. > > > > > > Also this reading of _CRS object would be done before we start > > > initializing the pci devices, i.e. before we start using the value of > > > pci_mem_start, so the original value assigned by pci_setup_gap is just > > > overwritten by this function. So that should be fine IMHO. > > > Also we would still want the call for e820_setup_gap because there can > > > be systems with no acpi support or acpi disabled > > > > > > > > > > > > > >> > > > > >> > At the same time after the patch is applied, pci_mem_start will be > > > >> > parsed in two different ways. > > > >> > > > >> Yes pci_mem_start would be initialized in 2 different ways but we > > > >> still have to parse the e820_map the old way because there could be > > > >> systems without ACPI. > > > >> > > > >> > If the result is different, maybe the > > > >> > incorrect pci_mem_start will be used. > > > >> > > > >> Yeah, The result is different in my case. Though my BIOS reserves > > > >> hotpluggable memory region, kernel doesn't respect that right now and > > > >> just parses the e820_map to calculate the gap and pci_mem_start value. > > > >> I have explained the problem in this mail. > > > >> > > > >> http://marc.info/?l=linux-acpi&m=121391675711763&w=2 > > > >> > > > >> Maybe nobody has seen this problem yet, because there are no systems > > > >> out there with less than 4GB memory to start with and which allow > > > >> memory hotplug. > > > >> > > > >> But still i don't understand what do you mean by, we can get incorrect > > > >> pci_mem_start, in which case ? > > > > > > > > In the function of setup_arch the pci_mem_start will be parsed by > > > > searching the e820 table. After the patch is applied, we will parse the > > > > pci_mem_start again in the function of pci_acpi_scan_init and it will > > > > override the value parsed in the function of setup_arch. If the > > > > pci_mem_start is incorrect in the second case, maybe it will have side > > > > effect. > > > > > > Yes it will override. But how can the value be incorrect in the second > > > case. As explained in my previous mail we still parse the e820_map to > > > check if we have unclaimed resources between start_address (that read > > > from _CRS) to 2^32. So even if this start_address is wrong we would > > > catch that during parsing e820_map. But again why would the _CRS > > > return incorrect values, are you talking about errors in BIOS ? > > The pci_mem_start is still gotten by parsing the E820 table.But the > > input parameter start_addr will be used in the function of > > e820_search_gap. > > If the following is the resource start address returned by the PCI0 > > _CRS object , maybe the different pci_mem_start will be gotten. > > 0xE0000000 > > 0xE4000000 > > > > At the same time if several start address is returned by the _CRS > > object, the e820 table will be parsed several times. > > Yes we will parse e820 several times, but we don't initialize > pci_mem_start in every pass. > It will be initialized only twice once via the e820_setup_gap code path > and once via pci_setup_gap. > And i think you agree that both of these are required ? Agree with what you said and IMO it is OK. > > During the gap calculation the previous code or the code now in > e820_setup_gap does this... > calculates a gap in e820_map from 0 to 2^32. > Initializes pci_mem_start. > > And now with this patch, the code in pci_setup_gap > does this... > for each _CRS under PCI0 > search gap from start_addr of _CRS to 2^32 *[1]. > Initialize pci_mem_start with the biggest gap that we could > find. Yes. But maybe the pci_mem_start obtained in pci_setup_gap will be different with that obtained in e820_setup_gap on some bogus BIOS. If the pci_mem_start obtained in pci_setup_gap can meet the requirement, it is also reasonable. > Essentially, what we are doing is just limiting the gap calculation to a > smaller address space depending on the ACPI information we get. > > Now then, what problem do you see with this approach ? > *[1] > While writing this mail i figured out that, instead of searching from > start_addr of _CRS to 2^32 we should just search till *end_addr* of _CRS resource. > I will send a patch to that effect. If this, IMO it will be OK. > Thanks, > Alok > > > > > > Thanks. > > Yakui > > > > > Thanks, > > > Alok > > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] acpi based pci gap caluculation v2 2008-06-26 1:00 ` Zhao Yakui @ 2008-06-26 1:18 ` Alok Kataria 0 siblings, 0 replies; 10+ messages in thread From: Alok Kataria @ 2008-06-26 1:18 UTC (permalink / raw) To: Zhao Yakui; +Cc: Alok kataria, lenb, Ingo Molnar, linux-acpi, LKML On Wed, 2008-06-25 at 18:00 -0700, Zhao Yakui wrote: > On Wed, 2008-06-25 at 09:57 -0700, Alok Kataria wrote: > > On Wed, 2008-06-25 at 01:38 -0700, Zhao Yakui wrote: > > > On Tue, 2008-06-24 at 23:04 -0700, Alok kataria wrote: > > > The pci_mem_start is still gotten by parsing the E820 table.But the > > > input parameter start_addr will be used in the function of > > > e820_search_gap. > > > If the following is the resource start address returned by the PCI0 > > > _CRS object , maybe the different pci_mem_start will be gotten. > > > 0xE0000000 > > > 0xE4000000 > > > > > > At the same time if several start address is returned by the _CRS > > > object, the e820 table will be parsed several times. > > > > Yes we will parse e820 several times, but we don't initialize > > pci_mem_start in every pass. > > It will be initialized only twice once via the e820_setup_gap code path > > and once via pci_setup_gap. > > And i think you agree that both of these are required ? > Agree with what you said and IMO it is OK. > > > > During the gap calculation the previous code or the code now in > > e820_setup_gap does this... > > calculates a gap in e820_map from 0 to 2^32. > > Initializes pci_mem_start. > > > > And now with this patch, the code in pci_setup_gap > > does this... > > for each _CRS under PCI0 > > search gap from start_addr of _CRS to 2^32 *[1]. > > Initialize pci_mem_start with the biggest gap that we could > > find. > Yes. But maybe the pci_mem_start obtained in pci_setup_gap will be > different with that obtained in e820_setup_gap on some bogus BIOS. > If the pci_mem_start obtained in pci_setup_gap can meet the requirement, > it is also reasonable. Ok, so the whole problem crops up from what if the BIOS itself is bogus. Ok in that case too we take proper care that pci_mem_start is within the expected limits, i.e. we make sure that 1. pci_mem_start is not initialized to an already allocated resource address and.. 2. pci_mem_start is within the lower 32bit of address space. I assume you also agree that all the checks are in place. Also it would be great if you could ACK both the patches as well. Thanks for the review. Alok > > Essentially, what we are doing is just limiting the gap calculation to a > > smaller address space depending on the ACPI information we get. > > > > Now then, what problem do you see with this approach ? > > *[1] > > While writing this mail i figured out that, instead of searching from > > start_addr of _CRS to 2^32 we should just search till *end_addr* of _CRS resource. > > I will send a patch to that effect. > If this, IMO it will be OK. > > Thanks, > > Alok > > > > > > > > > > Thanks. > > > Yakui > > > > > > > Thanks, > > > > Alok > > > > > > ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-06-26 1:18 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-06-24 18:48 [PATCH 2/2] acpi based pci gap caluculation v2 Alok Kataria 2008-06-25 2:49 ` Zhao Yakui 2008-06-25 4:17 ` Alok kataria 2008-06-25 5:39 ` Zhao Yakui 2008-06-25 6:04 ` Alok kataria 2008-06-25 8:38 ` Zhao Yakui 2008-06-25 16:57 ` Alok Kataria 2008-06-25 18:22 ` Alok Kataria 2008-06-26 1:00 ` Zhao Yakui 2008-06-26 1:18 ` Alok Kataria
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®