From: Baoquan He <bhe@redhat.com>
To: kbuild test robot <lkp@intel.com>
Cc: nicolas.pitre@linaro.org, "Brijesh Singh" <brijesh.singh@amd.com>,
"Tom Lendacky" <thomas.lendacky@amd.com>,
"David Airlie" <airlied@linux.ie>,
linux-pci@vger.kernel.org, "Wei Yang" <richard.weiyang@gmail.com>,
"Keith Busch" <keith.busch@intel.com>,
"Yaowei Bai" <baiyaowei@cmss.chinamobile.com>,
"Frank Rowand" <frowand.list@gmail.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
"Stephen Hemminger" <sthemmin@microsoft.com>,
linux-nvdimm@lists.01.org,
"Patrik Jakobsson" <patrik.r.jakobsson@gmail.com>,
linux-input@vger.kernel.org, "Borislav Petkov" <bp@suse.de>,
devicetree@vger.kernel.org,
"Haiyang Zhang" <haiyangz@microsoft.com>,
josh@joshtriplett.org, "Jérôme Glisse" <jglisse@redhat.com>,
robh+dt@kernel.org, "Bjorn Helgaas" <bhelgaas@google.com>,
"Jonathan Derrick" <jonathan.derrick@intel.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
linux-kernel@vger.kernel.org, kbuild-all@01.org,
devel@linuxdriverproject.org, akpm@linux-foundation.org
Subject: Re: [PATCH v3 1/3] resource: Use list_head to link sibling resource
Date: Sun, 6 May 2018 14:31:32 +0800 [thread overview]
Message-ID: <20180506063132.GH19030@localhost.localdomain> (raw)
In-Reply-To: <201804261045.v9iHAD1T%fengguang.wu@intel.com>
On 04/26/18 at 11:01am, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc2 next-20180424]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180419-223752
> config: microblaze-mmu_defconfig (attached as .config)
> compiler: microblaze-linux-gcc (GCC) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=microblaze
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it. Will repost including the fix.
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
>
> arch/microblaze/pci/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/microblaze/pci/pci-common.c:536:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
> ^
> arch/microblaze/pci/pci-common.c: In function 'reparent_resources':
> >> arch/microblaze/pci/pci-common.c:631:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:631:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/microblaze/pci/pci-common.c:644:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/microblaze/pci/pci-common.c:645:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/microblaze/pci/pci-common.c:648:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:648:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: some warnings being treated as errors
>
> vim +536 arch/microblaze/pci/pci-common.c
>
> d3afa58c Michal Simek 2010-01-18 387
> d3afa58c Michal Simek 2010-01-18 388 /**
> d3afa58c Michal Simek 2010-01-18 389 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> d3afa58c Michal Simek 2010-01-18 390 * @hose: newly allocated pci_controller to be setup
> d3afa58c Michal Simek 2010-01-18 391 * @dev: device node of the host bridge
> d3afa58c Michal Simek 2010-01-18 392 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> d3afa58c Michal Simek 2010-01-18 393 *
> d3afa58c Michal Simek 2010-01-18 394 * This function will parse the "ranges" property of a PCI host bridge device
> d3afa58c Michal Simek 2010-01-18 395 * node and setup the resource mapping of a pci controller based on its
> d3afa58c Michal Simek 2010-01-18 396 * content.
> d3afa58c Michal Simek 2010-01-18 397 *
> d3afa58c Michal Simek 2010-01-18 398 * Life would be boring if it wasn't for a few issues that we have to deal
> d3afa58c Michal Simek 2010-01-18 399 * with here:
> d3afa58c Michal Simek 2010-01-18 400 *
> d3afa58c Michal Simek 2010-01-18 401 * - We can only cope with one IO space range and up to 3 Memory space
> d3afa58c Michal Simek 2010-01-18 402 * ranges. However, some machines (thanks Apple !) tend to split their
> d3afa58c Michal Simek 2010-01-18 403 * space into lots of small contiguous ranges. So we have to coalesce.
> d3afa58c Michal Simek 2010-01-18 404 *
> d3afa58c Michal Simek 2010-01-18 405 * - We can only cope with all memory ranges having the same offset
> d3afa58c Michal Simek 2010-01-18 406 * between CPU addresses and PCI addresses. Unfortunately, some bridges
> d3afa58c Michal Simek 2010-01-18 407 * are setup for a large 1:1 mapping along with a small "window" which
> d3afa58c Michal Simek 2010-01-18 408 * maps PCI address 0 to some arbitrary high address of the CPU space in
> d3afa58c Michal Simek 2010-01-18 409 * order to give access to the ISA memory hole.
> d3afa58c Michal Simek 2010-01-18 410 * The way out of here that I've chosen for now is to always set the
> d3afa58c Michal Simek 2010-01-18 411 * offset based on the first resource found, then override it if we
> d3afa58c Michal Simek 2010-01-18 412 * have a different offset and the previous was set by an ISA hole.
> d3afa58c Michal Simek 2010-01-18 413 *
> d3afa58c Michal Simek 2010-01-18 414 * - Some busses have IO space not starting at 0, which causes trouble with
> d3afa58c Michal Simek 2010-01-18 415 * the way we do our IO resource renumbering. The code somewhat deals with
> d3afa58c Michal Simek 2010-01-18 416 * it for 64 bits but I would expect problems on 32 bits.
> d3afa58c Michal Simek 2010-01-18 417 *
> d3afa58c Michal Simek 2010-01-18 418 * - Some 32 bits platforms such as 4xx can have physical space larger than
> d3afa58c Michal Simek 2010-01-18 419 * 32 bits so we need to use 64 bits values for the parsing
> d3afa58c Michal Simek 2010-01-18 420 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 421 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> b881bc46 Greg Kroah-Hartman 2012-12-21 422 struct device_node *dev, int primary)
> d3afa58c Michal Simek 2010-01-18 423 {
> d3afa58c Michal Simek 2010-01-18 424 int memno = 0, isa_hole = -1;
> d3afa58c Michal Simek 2010-01-18 425 unsigned long long isa_mb = 0;
> d3afa58c Michal Simek 2010-01-18 426 struct resource *res;
> 4f7b6de4 Andrew Murray 2013-07-27 427 struct of_pci_range range;
> 4f7b6de4 Andrew Murray 2013-07-27 428 struct of_pci_range_parser parser;
> d3afa58c Michal Simek 2010-01-18 429
> f2b8ae0e Rob Herring 2017-06-06 430 pr_info("PCI host bridge %pOF %s ranges:\n",
> f2b8ae0e Rob Herring 2017-06-06 431 dev, primary ? "(primary)" : "");
> d3afa58c Michal Simek 2010-01-18 432
> 4f7b6de4 Andrew Murray 2013-07-27 433 /* Check for ranges property */
> 4f7b6de4 Andrew Murray 2013-07-27 434 if (of_pci_range_parser_init(&parser, dev))
> d3afa58c Michal Simek 2010-01-18 435 return;
> d3afa58c Michal Simek 2010-01-18 436
> d3afa58c Michal Simek 2010-01-18 437 pr_debug("Parsing ranges property...\n");
> 4f7b6de4 Andrew Murray 2013-07-27 438 for_each_of_pci_range(&parser, &range) {
> d3afa58c Michal Simek 2010-01-18 439 /* Read next ranges element */
> 6bd55f0b Michal Simek 2012-12-27 440 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ",
> 4f7b6de4 Andrew Murray 2013-07-27 441 range.pci_space, range.pci_addr);
> 6bd55f0b Michal Simek 2012-12-27 442 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 443 range.cpu_addr, range.size);
> d3afa58c Michal Simek 2010-01-18 444
> d3afa58c Michal Simek 2010-01-18 445 /* If we failed translation or got a zero-sized region
> d3afa58c Michal Simek 2010-01-18 446 * (some FW try to feed us with non sensical zero sized regions
> d3afa58c Michal Simek 2010-01-18 447 * such as power3 which look like some kind of attempt
> d3afa58c Michal Simek 2010-01-18 448 * at exposing the VGA memory hole)
> d3afa58c Michal Simek 2010-01-18 449 */
> 4f7b6de4 Andrew Murray 2013-07-27 450 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> d3afa58c Michal Simek 2010-01-18 451 continue;
> d3afa58c Michal Simek 2010-01-18 452
> d3afa58c Michal Simek 2010-01-18 453 /* Act based on address space type */
> d3afa58c Michal Simek 2010-01-18 454 res = NULL;
> 4f7b6de4 Andrew Murray 2013-07-27 455 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 4f7b6de4 Andrew Murray 2013-07-27 456 case IORESOURCE_IO:
> 6bd55f0b Michal Simek 2012-12-27 457 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 458 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 459 range.pci_addr);
> d3afa58c Michal Simek 2010-01-18 460
> d3afa58c Michal Simek 2010-01-18 461 /* We support only one IO range */
> d3afa58c Michal Simek 2010-01-18 462 if (hose->pci_io_size) {
> 6bd55f0b Michal Simek 2012-12-27 463 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 464 continue;
> d3afa58c Michal Simek 2010-01-18 465 }
> d3afa58c Michal Simek 2010-01-18 466 /* On 32 bits, limit I/O space to 16MB */
> 4f7b6de4 Andrew Murray 2013-07-27 467 if (range.size > 0x01000000)
> 4f7b6de4 Andrew Murray 2013-07-27 468 range.size = 0x01000000;
> d3afa58c Michal Simek 2010-01-18 469
> d3afa58c Michal Simek 2010-01-18 470 /* 32 bits needs to map IOs here */
> 4f7b6de4 Andrew Murray 2013-07-27 471 hose->io_base_virt = ioremap(range.cpu_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 472 range.size);
> d3afa58c Michal Simek 2010-01-18 473
> d3afa58c Michal Simek 2010-01-18 474 /* Expect trouble if pci_addr is not 0 */
> d3afa58c Michal Simek 2010-01-18 475 if (primary)
> d3afa58c Michal Simek 2010-01-18 476 isa_io_base =
> d3afa58c Michal Simek 2010-01-18 477 (unsigned long)hose->io_base_virt;
> d3afa58c Michal Simek 2010-01-18 478 /* pci_io_size and io_base_phys always represent IO
> d3afa58c Michal Simek 2010-01-18 479 * space starting at 0 so we factor in pci_addr
> d3afa58c Michal Simek 2010-01-18 480 */
> 4f7b6de4 Andrew Murray 2013-07-27 481 hose->pci_io_size = range.pci_addr + range.size;
> 4f7b6de4 Andrew Murray 2013-07-27 482 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> d3afa58c Michal Simek 2010-01-18 483
> d3afa58c Michal Simek 2010-01-18 484 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 485 res = &hose->io_resource;
> 4f7b6de4 Andrew Murray 2013-07-27 486 range.cpu_addr = range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 487
> d3afa58c Michal Simek 2010-01-18 488 break;
> 4f7b6de4 Andrew Murray 2013-07-27 489 case IORESOURCE_MEM:
> 6bd55f0b Michal Simek 2012-12-27 490 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 4f7b6de4 Andrew Murray 2013-07-27 491 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 492 range.pci_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 493 (range.pci_space & 0x40000000) ?
> 4f7b6de4 Andrew Murray 2013-07-27 494 "Prefetch" : "");
> d3afa58c Michal Simek 2010-01-18 495
> d3afa58c Michal Simek 2010-01-18 496 /* We support only 3 memory ranges */
> d3afa58c Michal Simek 2010-01-18 497 if (memno >= 3) {
> 6bd55f0b Michal Simek 2012-12-27 498 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 499 continue;
> d3afa58c Michal Simek 2010-01-18 500 }
> d3afa58c Michal Simek 2010-01-18 501 /* Handles ISA memory hole space here */
> 4f7b6de4 Andrew Murray 2013-07-27 502 if (range.pci_addr == 0) {
> 4f7b6de4 Andrew Murray 2013-07-27 503 isa_mb = range.cpu_addr;
> d3afa58c Michal Simek 2010-01-18 504 isa_hole = memno;
> d3afa58c Michal Simek 2010-01-18 505 if (primary || isa_mem_base == 0)
> 4f7b6de4 Andrew Murray 2013-07-27 506 isa_mem_base = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 507 hose->isa_mem_phys = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 508 hose->isa_mem_size = range.size;
> d3afa58c Michal Simek 2010-01-18 509 }
> d3afa58c Michal Simek 2010-01-18 510
> d3afa58c Michal Simek 2010-01-18 511 /* We get the PCI/Mem offset from the first range or
> d3afa58c Michal Simek 2010-01-18 512 * the, current one if the offset came from an ISA
> d3afa58c Michal Simek 2010-01-18 513 * hole. If they don't match, bugger.
> d3afa58c Michal Simek 2010-01-18 514 */
> d3afa58c Michal Simek 2010-01-18 515 if (memno == 0 ||
> 4f7b6de4 Andrew Murray 2013-07-27 516 (isa_hole >= 0 && range.pci_addr != 0 &&
> d3afa58c Michal Simek 2010-01-18 517 hose->pci_mem_offset == isa_mb))
> 4f7b6de4 Andrew Murray 2013-07-27 518 hose->pci_mem_offset = range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 519 range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 520 else if (range.pci_addr != 0 &&
> 4f7b6de4 Andrew Murray 2013-07-27 521 hose->pci_mem_offset != range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 522 range.pci_addr) {
> 6bd55f0b Michal Simek 2012-12-27 523 pr_info(" \\--> Skipped (offset mismatch) !\n");
> d3afa58c Michal Simek 2010-01-18 524 continue;
> d3afa58c Michal Simek 2010-01-18 525 }
> d3afa58c Michal Simek 2010-01-18 526
> d3afa58c Michal Simek 2010-01-18 527 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 528 res = &hose->mem_resources[memno++];
> d3afa58c Michal Simek 2010-01-18 529 break;
> d3afa58c Michal Simek 2010-01-18 530 }
> 70dcd942 Michal Simek 2014-10-27 531 if (res != NULL) {
> 70dcd942 Michal Simek 2014-10-27 532 res->name = dev->full_name;
> 70dcd942 Michal Simek 2014-10-27 533 res->flags = range.flags;
> 70dcd942 Michal Simek 2014-10-27 534 res->start = range.cpu_addr;
> 70dcd942 Michal Simek 2014-10-27 535 res->end = range.cpu_addr + range.size - 1;
> 70dcd942 Michal Simek 2014-10-27 @536 res->parent = res->child = res->sibling = NULL;
> 70dcd942 Michal Simek 2014-10-27 537 }
> d3afa58c Michal Simek 2010-01-18 538 }
> d3afa58c Michal Simek 2010-01-18 539
> d3afa58c Michal Simek 2010-01-18 540 /* If there's an ISA hole and the pci_mem_offset is -not- matching
> d3afa58c Michal Simek 2010-01-18 541 * the ISA hole offset, then we need to remove the ISA hole from
> d3afa58c Michal Simek 2010-01-18 542 * the resource list for that brige
> d3afa58c Michal Simek 2010-01-18 543 */
> d3afa58c Michal Simek 2010-01-18 544 if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) {
> d3afa58c Michal Simek 2010-01-18 545 unsigned int next = isa_hole + 1;
> 6bd55f0b Michal Simek 2012-12-27 546 pr_info(" Removing ISA hole at 0x%016llx\n", isa_mb);
> d3afa58c Michal Simek 2010-01-18 547 if (next < memno)
> d3afa58c Michal Simek 2010-01-18 548 memmove(&hose->mem_resources[isa_hole],
> d3afa58c Michal Simek 2010-01-18 549 &hose->mem_resources[next],
> d3afa58c Michal Simek 2010-01-18 550 sizeof(struct resource) * (memno - next));
> d3afa58c Michal Simek 2010-01-18 551 hose->mem_resources[--memno].flags = 0;
> d3afa58c Michal Simek 2010-01-18 552 }
> d3afa58c Michal Simek 2010-01-18 553 }
> d3afa58c Michal Simek 2010-01-18 554
> 9413d968 Bharat Kumar Gogada 2016-09-01 555 /* Display the domain number in /proc */
> d3afa58c Michal Simek 2010-01-18 556 int pci_proc_domain(struct pci_bus *bus)
> d3afa58c Michal Simek 2010-01-18 557 {
> 9413d968 Bharat Kumar Gogada 2016-09-01 558 return pci_domain_nr(bus);
> d3afa58c Michal Simek 2010-01-18 559 }
> d3afa58c Michal Simek 2010-01-18 560
> d3afa58c Michal Simek 2010-01-18 561 /* This header fixup will do the resource fixup for all devices as they are
> d3afa58c Michal Simek 2010-01-18 562 * probed, but not for bridge ranges
> d3afa58c Michal Simek 2010-01-18 563 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 564 static void pcibios_fixup_resources(struct pci_dev *dev)
> d3afa58c Michal Simek 2010-01-18 565 {
> d3afa58c Michal Simek 2010-01-18 566 struct pci_controller *hose = pci_bus_to_host(dev->bus);
> d3afa58c Michal Simek 2010-01-18 567 int i;
> d3afa58c Michal Simek 2010-01-18 568
> d3afa58c Michal Simek 2010-01-18 569 if (!hose) {
> 6bd55f0b Michal Simek 2012-12-27 570 pr_err("No host bridge for PCI dev %s !\n",
> d3afa58c Michal Simek 2010-01-18 571 pci_name(dev));
> d3afa58c Michal Simek 2010-01-18 572 return;
> d3afa58c Michal Simek 2010-01-18 573 }
> d3afa58c Michal Simek 2010-01-18 574 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
> d3afa58c Michal Simek 2010-01-18 575 struct resource *res = dev->resource + i;
> d3afa58c Michal Simek 2010-01-18 576 if (!res->flags)
> d3afa58c Michal Simek 2010-01-18 577 continue;
> e5b36841 Bjorn Helgaas 2012-02-23 578 if (res->start == 0) {
> 6bd55f0b Michal Simek 2012-12-27 579 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]",
> d3afa58c Michal Simek 2010-01-18 580 pci_name(dev), i,
> d3afa58c Michal Simek 2010-01-18 581 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 582 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 583 (unsigned int)res->flags);
> 6bd55f0b Michal Simek 2012-12-27 584 pr_debug("is unassigned\n");
> d3afa58c Michal Simek 2010-01-18 585 res->end -= res->start;
> d3afa58c Michal Simek 2010-01-18 586 res->start = 0;
> d3afa58c Michal Simek 2010-01-18 587 res->flags |= IORESOURCE_UNSET;
> d3afa58c Michal Simek 2010-01-18 588 continue;
> d3afa58c Michal Simek 2010-01-18 589 }
> d3afa58c Michal Simek 2010-01-18 590
> aa23bdc0 Bjorn Helgaas 2012-02-23 591 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n",
> d3afa58c Michal Simek 2010-01-18 592 pci_name(dev), i,
> 6bd55f0b Michal Simek 2012-12-27 593 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 594 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 595 (unsigned int)res->flags);
> d3afa58c Michal Simek 2010-01-18 596 }
> d3afa58c Michal Simek 2010-01-18 597 }
> d3afa58c Michal Simek 2010-01-18 598 DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
> d3afa58c Michal Simek 2010-01-18 599
> d3afa58c Michal Simek 2010-01-18 600 /*
> d3afa58c Michal Simek 2010-01-18 601 * We need to avoid collisions with `mirrored' VGA ports
> d3afa58c Michal Simek 2010-01-18 602 * and other strange ISA hardware, so we always want the
> d3afa58c Michal Simek 2010-01-18 603 * addresses to be allocated in the 0x000-0x0ff region
> d3afa58c Michal Simek 2010-01-18 604 * modulo 0x400.
> d3afa58c Michal Simek 2010-01-18 605 *
> d3afa58c Michal Simek 2010-01-18 606 * Why? Because some silly external IO cards only decode
> d3afa58c Michal Simek 2010-01-18 607 * the low 10 bits of the IO address. The 0x00-0xff region
> d3afa58c Michal Simek 2010-01-18 608 * is reserved for motherboard devices that decode all 16
> d3afa58c Michal Simek 2010-01-18 609 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
> d3afa58c Michal Simek 2010-01-18 610 * but we want to try to avoid allocating at 0x2900-0x2bff
> d3afa58c Michal Simek 2010-01-18 611 * which might have be mirrored at 0x0100-0x03ff..
> d3afa58c Michal Simek 2010-01-18 612 */
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 613 int pcibios_add_device(struct pci_dev *dev)
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 614 {
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 615 dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
> c86fac43 Michal Simek 2010-04-16 616
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 617 return 0;
> d3afa58c Michal Simek 2010-01-18 618 }
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 619 EXPORT_SYMBOL(pcibios_add_device);
> d3afa58c Michal Simek 2010-01-18 620
> d3afa58c Michal Simek 2010-01-18 621 /*
> d3afa58c Michal Simek 2010-01-18 622 * Reparent resource children of pr that conflict with res
> d3afa58c Michal Simek 2010-01-18 623 * under res, and make res replace those children.
> d3afa58c Michal Simek 2010-01-18 624 */
> d3afa58c Michal Simek 2010-01-18 625 static int __init reparent_resources(struct resource *parent,
> d3afa58c Michal Simek 2010-01-18 626 struct resource *res)
> d3afa58c Michal Simek 2010-01-18 627 {
> d3afa58c Michal Simek 2010-01-18 628 struct resource *p, **pp;
> d3afa58c Michal Simek 2010-01-18 629 struct resource **firstpp = NULL;
> d3afa58c Michal Simek 2010-01-18 630
> d3afa58c Michal Simek 2010-01-18 @631 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> d3afa58c Michal Simek 2010-01-18 632 if (p->end < res->start)
> d3afa58c Michal Simek 2010-01-18 633 continue;
> d3afa58c Michal Simek 2010-01-18 634 if (res->end < p->start)
> d3afa58c Michal Simek 2010-01-18 635 break;
> d3afa58c Michal Simek 2010-01-18 636 if (p->start < res->start || p->end > res->end)
> d3afa58c Michal Simek 2010-01-18 637 return -1; /* not completely contained */
> d3afa58c Michal Simek 2010-01-18 638 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 639 firstpp = pp;
> d3afa58c Michal Simek 2010-01-18 640 }
> d3afa58c Michal Simek 2010-01-18 641 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 642 return -1; /* didn't find any conflicting entries? */
> d3afa58c Michal Simek 2010-01-18 643 res->parent = parent;
> d3afa58c Michal Simek 2010-01-18 @644 res->child = *firstpp;
> d3afa58c Michal Simek 2010-01-18 645 res->sibling = *pp;
> d3afa58c Michal Simek 2010-01-18 646 *firstpp = res;
> d3afa58c Michal Simek 2010-01-18 647 *pp = NULL;
> d3afa58c Michal Simek 2010-01-18 @648 for (p = res->child; p != NULL; p = p->sibling) {
> d3afa58c Michal Simek 2010-01-18 649 p->parent = res;
> d3afa58c Michal Simek 2010-01-18 650 pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
> d3afa58c Michal Simek 2010-01-18 651 p->name,
> d3afa58c Michal Simek 2010-01-18 652 (unsigned long long)p->start,
> d3afa58c Michal Simek 2010-01-18 653 (unsigned long long)p->end, res->name);
> d3afa58c Michal Simek 2010-01-18 654 }
> d3afa58c Michal Simek 2010-01-18 655 return 0;
> d3afa58c Michal Simek 2010-01-18 656 }
> d3afa58c Michal Simek 2010-01-18 657
>
> :::::: The code at line 536 was first introduced by commit
> :::::: 70dcd942dc4af3cc6c3dcc2ba499cd841c7f65a7 microblaze: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michal Simek <michal.simek@xilinx.com>
> :::::: CC: Michal Simek <michal.simek@xilinx.com>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
WARNING: multiple messages have this Message-ID (diff)
From: Baoquan He <bhe@redhat.com>
To: kbuild test robot <lkp@intel.com>
Cc: nicolas.pitre@linaro.org, "Brijesh Singh" <brijesh.singh@amd.com>,
"Tom Lendacky" <thomas.lendacky@amd.com>,
"David Airlie" <airlied@linux.ie>,
linux-pci@vger.kernel.org, "Wei Yang" <richard.weiyang@gmail.com>,
"Keith Busch" <keith.busch@intel.com>,
"Yaowei Bai" <baiyaowei@cmss.chinamobile.com>,
"Frank Rowand" <frowand.list@gmail.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
"Stephen Hemminger" <sthemmin@microsoft.com>,
linux-nvdimm@lists.01.org,
"Patrik Jakobsson" <patrik.r.jakobsson@gmail.com>,
linux-input@vger.kernel.org, "Borislav Petkov" <bp@suse.de>,
devicetree@vger.kernel.org,
"Haiyang Zhang" <haiyangz@microsoft.com>,
josh@joshtriplett.org, "Jérôme Glisse" <jglisse@redhat.com>,
robh+dt@kernel.org, "Bjorn Helgaas" <bhelgaas@google.com>,
dan.j.williams@intel.com,
"Jonathan Derrick" <jonathan.derrick@intel.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
linux-kernel@vger.kernel.org, kbuild-all@01.org,
devel@linuxdriverproject.org, akpm@linux-foundation.org
Subject: Re: [PATCH v3 1/3] resource: Use list_head to link sibling resource
Date: Sun, 6 May 2018 14:31:32 +0800 [thread overview]
Message-ID: <20180506063132.GH19030@localhost.localdomain> (raw)
In-Reply-To: <201804261045.v9iHAD1T%fengguang.wu@intel.com>
On 04/26/18 at 11:01am, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc2 next-20180424]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180419-223752
> config: microblaze-mmu_defconfig (attached as .config)
> compiler: microblaze-linux-gcc (GCC) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=microblaze
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it. Will repost including the fix.
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
>
> arch/microblaze/pci/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/microblaze/pci/pci-common.c:536:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
> ^
> arch/microblaze/pci/pci-common.c: In function 'reparent_resources':
> >> arch/microblaze/pci/pci-common.c:631:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:631:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/microblaze/pci/pci-common.c:644:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/microblaze/pci/pci-common.c:645:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/microblaze/pci/pci-common.c:648:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:648:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: some warnings being treated as errors
>
> vim +536 arch/microblaze/pci/pci-common.c
>
> d3afa58c Michal Simek 2010-01-18 387
> d3afa58c Michal Simek 2010-01-18 388 /**
> d3afa58c Michal Simek 2010-01-18 389 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> d3afa58c Michal Simek 2010-01-18 390 * @hose: newly allocated pci_controller to be setup
> d3afa58c Michal Simek 2010-01-18 391 * @dev: device node of the host bridge
> d3afa58c Michal Simek 2010-01-18 392 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> d3afa58c Michal Simek 2010-01-18 393 *
> d3afa58c Michal Simek 2010-01-18 394 * This function will parse the "ranges" property of a PCI host bridge device
> d3afa58c Michal Simek 2010-01-18 395 * node and setup the resource mapping of a pci controller based on its
> d3afa58c Michal Simek 2010-01-18 396 * content.
> d3afa58c Michal Simek 2010-01-18 397 *
> d3afa58c Michal Simek 2010-01-18 398 * Life would be boring if it wasn't for a few issues that we have to deal
> d3afa58c Michal Simek 2010-01-18 399 * with here:
> d3afa58c Michal Simek 2010-01-18 400 *
> d3afa58c Michal Simek 2010-01-18 401 * - We can only cope with one IO space range and up to 3 Memory space
> d3afa58c Michal Simek 2010-01-18 402 * ranges. However, some machines (thanks Apple !) tend to split their
> d3afa58c Michal Simek 2010-01-18 403 * space into lots of small contiguous ranges. So we have to coalesce.
> d3afa58c Michal Simek 2010-01-18 404 *
> d3afa58c Michal Simek 2010-01-18 405 * - We can only cope with all memory ranges having the same offset
> d3afa58c Michal Simek 2010-01-18 406 * between CPU addresses and PCI addresses. Unfortunately, some bridges
> d3afa58c Michal Simek 2010-01-18 407 * are setup for a large 1:1 mapping along with a small "window" which
> d3afa58c Michal Simek 2010-01-18 408 * maps PCI address 0 to some arbitrary high address of the CPU space in
> d3afa58c Michal Simek 2010-01-18 409 * order to give access to the ISA memory hole.
> d3afa58c Michal Simek 2010-01-18 410 * The way out of here that I've chosen for now is to always set the
> d3afa58c Michal Simek 2010-01-18 411 * offset based on the first resource found, then override it if we
> d3afa58c Michal Simek 2010-01-18 412 * have a different offset and the previous was set by an ISA hole.
> d3afa58c Michal Simek 2010-01-18 413 *
> d3afa58c Michal Simek 2010-01-18 414 * - Some busses have IO space not starting at 0, which causes trouble with
> d3afa58c Michal Simek 2010-01-18 415 * the way we do our IO resource renumbering. The code somewhat deals with
> d3afa58c Michal Simek 2010-01-18 416 * it for 64 bits but I would expect problems on 32 bits.
> d3afa58c Michal Simek 2010-01-18 417 *
> d3afa58c Michal Simek 2010-01-18 418 * - Some 32 bits platforms such as 4xx can have physical space larger than
> d3afa58c Michal Simek 2010-01-18 419 * 32 bits so we need to use 64 bits values for the parsing
> d3afa58c Michal Simek 2010-01-18 420 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 421 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> b881bc46 Greg Kroah-Hartman 2012-12-21 422 struct device_node *dev, int primary)
> d3afa58c Michal Simek 2010-01-18 423 {
> d3afa58c Michal Simek 2010-01-18 424 int memno = 0, isa_hole = -1;
> d3afa58c Michal Simek 2010-01-18 425 unsigned long long isa_mb = 0;
> d3afa58c Michal Simek 2010-01-18 426 struct resource *res;
> 4f7b6de4 Andrew Murray 2013-07-27 427 struct of_pci_range range;
> 4f7b6de4 Andrew Murray 2013-07-27 428 struct of_pci_range_parser parser;
> d3afa58c Michal Simek 2010-01-18 429
> f2b8ae0e Rob Herring 2017-06-06 430 pr_info("PCI host bridge %pOF %s ranges:\n",
> f2b8ae0e Rob Herring 2017-06-06 431 dev, primary ? "(primary)" : "");
> d3afa58c Michal Simek 2010-01-18 432
> 4f7b6de4 Andrew Murray 2013-07-27 433 /* Check for ranges property */
> 4f7b6de4 Andrew Murray 2013-07-27 434 if (of_pci_range_parser_init(&parser, dev))
> d3afa58c Michal Simek 2010-01-18 435 return;
> d3afa58c Michal Simek 2010-01-18 436
> d3afa58c Michal Simek 2010-01-18 437 pr_debug("Parsing ranges property...\n");
> 4f7b6de4 Andrew Murray 2013-07-27 438 for_each_of_pci_range(&parser, &range) {
> d3afa58c Michal Simek 2010-01-18 439 /* Read next ranges element */
> 6bd55f0b Michal Simek 2012-12-27 440 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ",
> 4f7b6de4 Andrew Murray 2013-07-27 441 range.pci_space, range.pci_addr);
> 6bd55f0b Michal Simek 2012-12-27 442 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 443 range.cpu_addr, range.size);
> d3afa58c Michal Simek 2010-01-18 444
> d3afa58c Michal Simek 2010-01-18 445 /* If we failed translation or got a zero-sized region
> d3afa58c Michal Simek 2010-01-18 446 * (some FW try to feed us with non sensical zero sized regions
> d3afa58c Michal Simek 2010-01-18 447 * such as power3 which look like some kind of attempt
> d3afa58c Michal Simek 2010-01-18 448 * at exposing the VGA memory hole)
> d3afa58c Michal Simek 2010-01-18 449 */
> 4f7b6de4 Andrew Murray 2013-07-27 450 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> d3afa58c Michal Simek 2010-01-18 451 continue;
> d3afa58c Michal Simek 2010-01-18 452
> d3afa58c Michal Simek 2010-01-18 453 /* Act based on address space type */
> d3afa58c Michal Simek 2010-01-18 454 res = NULL;
> 4f7b6de4 Andrew Murray 2013-07-27 455 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 4f7b6de4 Andrew Murray 2013-07-27 456 case IORESOURCE_IO:
> 6bd55f0b Michal Simek 2012-12-27 457 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 458 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 459 range.pci_addr);
> d3afa58c Michal Simek 2010-01-18 460
> d3afa58c Michal Simek 2010-01-18 461 /* We support only one IO range */
> d3afa58c Michal Simek 2010-01-18 462 if (hose->pci_io_size) {
> 6bd55f0b Michal Simek 2012-12-27 463 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 464 continue;
> d3afa58c Michal Simek 2010-01-18 465 }
> d3afa58c Michal Simek 2010-01-18 466 /* On 32 bits, limit I/O space to 16MB */
> 4f7b6de4 Andrew Murray 2013-07-27 467 if (range.size > 0x01000000)
> 4f7b6de4 Andrew Murray 2013-07-27 468 range.size = 0x01000000;
> d3afa58c Michal Simek 2010-01-18 469
> d3afa58c Michal Simek 2010-01-18 470 /* 32 bits needs to map IOs here */
> 4f7b6de4 Andrew Murray 2013-07-27 471 hose->io_base_virt = ioremap(range.cpu_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 472 range.size);
> d3afa58c Michal Simek 2010-01-18 473
> d3afa58c Michal Simek 2010-01-18 474 /* Expect trouble if pci_addr is not 0 */
> d3afa58c Michal Simek 2010-01-18 475 if (primary)
> d3afa58c Michal Simek 2010-01-18 476 isa_io_base =
> d3afa58c Michal Simek 2010-01-18 477 (unsigned long)hose->io_base_virt;
> d3afa58c Michal Simek 2010-01-18 478 /* pci_io_size and io_base_phys always represent IO
> d3afa58c Michal Simek 2010-01-18 479 * space starting at 0 so we factor in pci_addr
> d3afa58c Michal Simek 2010-01-18 480 */
> 4f7b6de4 Andrew Murray 2013-07-27 481 hose->pci_io_size = range.pci_addr + range.size;
> 4f7b6de4 Andrew Murray 2013-07-27 482 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> d3afa58c Michal Simek 2010-01-18 483
> d3afa58c Michal Simek 2010-01-18 484 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 485 res = &hose->io_resource;
> 4f7b6de4 Andrew Murray 2013-07-27 486 range.cpu_addr = range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 487
> d3afa58c Michal Simek 2010-01-18 488 break;
> 4f7b6de4 Andrew Murray 2013-07-27 489 case IORESOURCE_MEM:
> 6bd55f0b Michal Simek 2012-12-27 490 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 4f7b6de4 Andrew Murray 2013-07-27 491 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 492 range.pci_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 493 (range.pci_space & 0x40000000) ?
> 4f7b6de4 Andrew Murray 2013-07-27 494 "Prefetch" : "");
> d3afa58c Michal Simek 2010-01-18 495
> d3afa58c Michal Simek 2010-01-18 496 /* We support only 3 memory ranges */
> d3afa58c Michal Simek 2010-01-18 497 if (memno >= 3) {
> 6bd55f0b Michal Simek 2012-12-27 498 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 499 continue;
> d3afa58c Michal Simek 2010-01-18 500 }
> d3afa58c Michal Simek 2010-01-18 501 /* Handles ISA memory hole space here */
> 4f7b6de4 Andrew Murray 2013-07-27 502 if (range.pci_addr == 0) {
> 4f7b6de4 Andrew Murray 2013-07-27 503 isa_mb = range.cpu_addr;
> d3afa58c Michal Simek 2010-01-18 504 isa_hole = memno;
> d3afa58c Michal Simek 2010-01-18 505 if (primary || isa_mem_base == 0)
> 4f7b6de4 Andrew Murray 2013-07-27 506 isa_mem_base = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 507 hose->isa_mem_phys = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 508 hose->isa_mem_size = range.size;
> d3afa58c Michal Simek 2010-01-18 509 }
> d3afa58c Michal Simek 2010-01-18 510
> d3afa58c Michal Simek 2010-01-18 511 /* We get the PCI/Mem offset from the first range or
> d3afa58c Michal Simek 2010-01-18 512 * the, current one if the offset came from an ISA
> d3afa58c Michal Simek 2010-01-18 513 * hole. If they don't match, bugger.
> d3afa58c Michal Simek 2010-01-18 514 */
> d3afa58c Michal Simek 2010-01-18 515 if (memno == 0 ||
> 4f7b6de4 Andrew Murray 2013-07-27 516 (isa_hole >= 0 && range.pci_addr != 0 &&
> d3afa58c Michal Simek 2010-01-18 517 hose->pci_mem_offset == isa_mb))
> 4f7b6de4 Andrew Murray 2013-07-27 518 hose->pci_mem_offset = range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 519 range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 520 else if (range.pci_addr != 0 &&
> 4f7b6de4 Andrew Murray 2013-07-27 521 hose->pci_mem_offset != range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 522 range.pci_addr) {
> 6bd55f0b Michal Simek 2012-12-27 523 pr_info(" \\--> Skipped (offset mismatch) !\n");
> d3afa58c Michal Simek 2010-01-18 524 continue;
> d3afa58c Michal Simek 2010-01-18 525 }
> d3afa58c Michal Simek 2010-01-18 526
> d3afa58c Michal Simek 2010-01-18 527 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 528 res = &hose->mem_resources[memno++];
> d3afa58c Michal Simek 2010-01-18 529 break;
> d3afa58c Michal Simek 2010-01-18 530 }
> 70dcd942 Michal Simek 2014-10-27 531 if (res != NULL) {
> 70dcd942 Michal Simek 2014-10-27 532 res->name = dev->full_name;
> 70dcd942 Michal Simek 2014-10-27 533 res->flags = range.flags;
> 70dcd942 Michal Simek 2014-10-27 534 res->start = range.cpu_addr;
> 70dcd942 Michal Simek 2014-10-27 535 res->end = range.cpu_addr + range.size - 1;
> 70dcd942 Michal Simek 2014-10-27 @536 res->parent = res->child = res->sibling = NULL;
> 70dcd942 Michal Simek 2014-10-27 537 }
> d3afa58c Michal Simek 2010-01-18 538 }
> d3afa58c Michal Simek 2010-01-18 539
> d3afa58c Michal Simek 2010-01-18 540 /* If there's an ISA hole and the pci_mem_offset is -not- matching
> d3afa58c Michal Simek 2010-01-18 541 * the ISA hole offset, then we need to remove the ISA hole from
> d3afa58c Michal Simek 2010-01-18 542 * the resource list for that brige
> d3afa58c Michal Simek 2010-01-18 543 */
> d3afa58c Michal Simek 2010-01-18 544 if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) {
> d3afa58c Michal Simek 2010-01-18 545 unsigned int next = isa_hole + 1;
> 6bd55f0b Michal Simek 2012-12-27 546 pr_info(" Removing ISA hole at 0x%016llx\n", isa_mb);
> d3afa58c Michal Simek 2010-01-18 547 if (next < memno)
> d3afa58c Michal Simek 2010-01-18 548 memmove(&hose->mem_resources[isa_hole],
> d3afa58c Michal Simek 2010-01-18 549 &hose->mem_resources[next],
> d3afa58c Michal Simek 2010-01-18 550 sizeof(struct resource) * (memno - next));
> d3afa58c Michal Simek 2010-01-18 551 hose->mem_resources[--memno].flags = 0;
> d3afa58c Michal Simek 2010-01-18 552 }
> d3afa58c Michal Simek 2010-01-18 553 }
> d3afa58c Michal Simek 2010-01-18 554
> 9413d968 Bharat Kumar Gogada 2016-09-01 555 /* Display the domain number in /proc */
> d3afa58c Michal Simek 2010-01-18 556 int pci_proc_domain(struct pci_bus *bus)
> d3afa58c Michal Simek 2010-01-18 557 {
> 9413d968 Bharat Kumar Gogada 2016-09-01 558 return pci_domain_nr(bus);
> d3afa58c Michal Simek 2010-01-18 559 }
> d3afa58c Michal Simek 2010-01-18 560
> d3afa58c Michal Simek 2010-01-18 561 /* This header fixup will do the resource fixup for all devices as they are
> d3afa58c Michal Simek 2010-01-18 562 * probed, but not for bridge ranges
> d3afa58c Michal Simek 2010-01-18 563 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 564 static void pcibios_fixup_resources(struct pci_dev *dev)
> d3afa58c Michal Simek 2010-01-18 565 {
> d3afa58c Michal Simek 2010-01-18 566 struct pci_controller *hose = pci_bus_to_host(dev->bus);
> d3afa58c Michal Simek 2010-01-18 567 int i;
> d3afa58c Michal Simek 2010-01-18 568
> d3afa58c Michal Simek 2010-01-18 569 if (!hose) {
> 6bd55f0b Michal Simek 2012-12-27 570 pr_err("No host bridge for PCI dev %s !\n",
> d3afa58c Michal Simek 2010-01-18 571 pci_name(dev));
> d3afa58c Michal Simek 2010-01-18 572 return;
> d3afa58c Michal Simek 2010-01-18 573 }
> d3afa58c Michal Simek 2010-01-18 574 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
> d3afa58c Michal Simek 2010-01-18 575 struct resource *res = dev->resource + i;
> d3afa58c Michal Simek 2010-01-18 576 if (!res->flags)
> d3afa58c Michal Simek 2010-01-18 577 continue;
> e5b36841 Bjorn Helgaas 2012-02-23 578 if (res->start == 0) {
> 6bd55f0b Michal Simek 2012-12-27 579 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]",
> d3afa58c Michal Simek 2010-01-18 580 pci_name(dev), i,
> d3afa58c Michal Simek 2010-01-18 581 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 582 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 583 (unsigned int)res->flags);
> 6bd55f0b Michal Simek 2012-12-27 584 pr_debug("is unassigned\n");
> d3afa58c Michal Simek 2010-01-18 585 res->end -= res->start;
> d3afa58c Michal Simek 2010-01-18 586 res->start = 0;
> d3afa58c Michal Simek 2010-01-18 587 res->flags |= IORESOURCE_UNSET;
> d3afa58c Michal Simek 2010-01-18 588 continue;
> d3afa58c Michal Simek 2010-01-18 589 }
> d3afa58c Michal Simek 2010-01-18 590
> aa23bdc0 Bjorn Helgaas 2012-02-23 591 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n",
> d3afa58c Michal Simek 2010-01-18 592 pci_name(dev), i,
> 6bd55f0b Michal Simek 2012-12-27 593 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 594 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 595 (unsigned int)res->flags);
> d3afa58c Michal Simek 2010-01-18 596 }
> d3afa58c Michal Simek 2010-01-18 597 }
> d3afa58c Michal Simek 2010-01-18 598 DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
> d3afa58c Michal Simek 2010-01-18 599
> d3afa58c Michal Simek 2010-01-18 600 /*
> d3afa58c Michal Simek 2010-01-18 601 * We need to avoid collisions with `mirrored' VGA ports
> d3afa58c Michal Simek 2010-01-18 602 * and other strange ISA hardware, so we always want the
> d3afa58c Michal Simek 2010-01-18 603 * addresses to be allocated in the 0x000-0x0ff region
> d3afa58c Michal Simek 2010-01-18 604 * modulo 0x400.
> d3afa58c Michal Simek 2010-01-18 605 *
> d3afa58c Michal Simek 2010-01-18 606 * Why? Because some silly external IO cards only decode
> d3afa58c Michal Simek 2010-01-18 607 * the low 10 bits of the IO address. The 0x00-0xff region
> d3afa58c Michal Simek 2010-01-18 608 * is reserved for motherboard devices that decode all 16
> d3afa58c Michal Simek 2010-01-18 609 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
> d3afa58c Michal Simek 2010-01-18 610 * but we want to try to avoid allocating at 0x2900-0x2bff
> d3afa58c Michal Simek 2010-01-18 611 * which might have be mirrored at 0x0100-0x03ff..
> d3afa58c Michal Simek 2010-01-18 612 */
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 613 int pcibios_add_device(struct pci_dev *dev)
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 614 {
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 615 dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
> c86fac43 Michal Simek 2010-04-16 616
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 617 return 0;
> d3afa58c Michal Simek 2010-01-18 618 }
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 619 EXPORT_SYMBOL(pcibios_add_device);
> d3afa58c Michal Simek 2010-01-18 620
> d3afa58c Michal Simek 2010-01-18 621 /*
> d3afa58c Michal Simek 2010-01-18 622 * Reparent resource children of pr that conflict with res
> d3afa58c Michal Simek 2010-01-18 623 * under res, and make res replace those children.
> d3afa58c Michal Simek 2010-01-18 624 */
> d3afa58c Michal Simek 2010-01-18 625 static int __init reparent_resources(struct resource *parent,
> d3afa58c Michal Simek 2010-01-18 626 struct resource *res)
> d3afa58c Michal Simek 2010-01-18 627 {
> d3afa58c Michal Simek 2010-01-18 628 struct resource *p, **pp;
> d3afa58c Michal Simek 2010-01-18 629 struct resource **firstpp = NULL;
> d3afa58c Michal Simek 2010-01-18 630
> d3afa58c Michal Simek 2010-01-18 @631 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> d3afa58c Michal Simek 2010-01-18 632 if (p->end < res->start)
> d3afa58c Michal Simek 2010-01-18 633 continue;
> d3afa58c Michal Simek 2010-01-18 634 if (res->end < p->start)
> d3afa58c Michal Simek 2010-01-18 635 break;
> d3afa58c Michal Simek 2010-01-18 636 if (p->start < res->start || p->end > res->end)
> d3afa58c Michal Simek 2010-01-18 637 return -1; /* not completely contained */
> d3afa58c Michal Simek 2010-01-18 638 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 639 firstpp = pp;
> d3afa58c Michal Simek 2010-01-18 640 }
> d3afa58c Michal Simek 2010-01-18 641 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 642 return -1; /* didn't find any conflicting entries? */
> d3afa58c Michal Simek 2010-01-18 643 res->parent = parent;
> d3afa58c Michal Simek 2010-01-18 @644 res->child = *firstpp;
> d3afa58c Michal Simek 2010-01-18 645 res->sibling = *pp;
> d3afa58c Michal Simek 2010-01-18 646 *firstpp = res;
> d3afa58c Michal Simek 2010-01-18 647 *pp = NULL;
> d3afa58c Michal Simek 2010-01-18 @648 for (p = res->child; p != NULL; p = p->sibling) {
> d3afa58c Michal Simek 2010-01-18 649 p->parent = res;
> d3afa58c Michal Simek 2010-01-18 650 pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
> d3afa58c Michal Simek 2010-01-18 651 p->name,
> d3afa58c Michal Simek 2010-01-18 652 (unsigned long long)p->start,
> d3afa58c Michal Simek 2010-01-18 653 (unsigned long long)p->end, res->name);
> d3afa58c Michal Simek 2010-01-18 654 }
> d3afa58c Michal Simek 2010-01-18 655 return 0;
> d3afa58c Michal Simek 2010-01-18 656 }
> d3afa58c Michal Simek 2010-01-18 657
>
> :::::: The code at line 536 was first introduced by commit
> :::::: 70dcd942dc4af3cc6c3dcc2ba499cd841c7f65a7 microblaze: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michal Simek <michal.simek@xilinx.com>
> :::::: CC: Michal Simek <michal.simek@xilinx.com>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
WARNING: multiple messages have this Message-ID (diff)
From: Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: kbuild test robot <lkp-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
"Brijesh Singh" <brijesh.singh-5C7GfCeVMHo@public.gmane.org>,
"Tom Lendacky" <thomas.lendacky-5C7GfCeVMHo@public.gmane.org>,
"David Airlie" <airlied-cv59FeDIM0c@public.gmane.org>,
linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Wei Yang"
<richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"Keith Busch"
<keith.busch-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
"Yaowei Bai"
<baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/@public.gmane.org>,
"Frank Rowand"
<frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"Thomas Gleixner" <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>,
"Lorenzo Pieralisi"
<lorenzo.pieralisi-5wv7dgnIgG8@public.gmane.org>,
"Stephen Hemminger"
<sthemmin-0li6OtcxBFHby3iVrkZq2A@public.gmane.org>,
linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org,
"Patrik Jakobsson"
<patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Borislav Petkov" <bp-l3A5Bk7waGM@public.gmane.org>,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Haiyang Zhang"
<haiyangz-0li6OtcxBFHby3iVrkZq2A@public.gmane.org>,
josh-iaAMLnmF4UmaiuxdJuQwMA@public.gmane.org,
"Jérôme Glisse" <jglisse-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
"Bjorn Helgaas"
<bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
"Jonathan Derrick"
<jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.o>
Subject: Re: [PATCH v3 1/3] resource: Use list_head to link sibling resource
Date: Sun, 6 May 2018 14:31:32 +0800 [thread overview]
Message-ID: <20180506063132.GH19030@localhost.localdomain> (raw)
In-Reply-To: <201804261045.v9iHAD1T%fengguang.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
On 04/26/18 at 11:01am, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc2 next-20180424]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180419-223752
> config: microblaze-mmu_defconfig (attached as .config)
> compiler: microblaze-linux-gcc (GCC) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=microblaze
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it. Will repost including the fix.
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
>
> arch/microblaze/pci/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/microblaze/pci/pci-common.c:536:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
> ^
> arch/microblaze/pci/pci-common.c: In function 'reparent_resources':
> >> arch/microblaze/pci/pci-common.c:631:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:631:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/microblaze/pci/pci-common.c:644:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/microblaze/pci/pci-common.c:645:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/microblaze/pci/pci-common.c:648:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:648:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: some warnings being treated as errors
>
> vim +536 arch/microblaze/pci/pci-common.c
>
> d3afa58c Michal Simek 2010-01-18 387
> d3afa58c Michal Simek 2010-01-18 388 /**
> d3afa58c Michal Simek 2010-01-18 389 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> d3afa58c Michal Simek 2010-01-18 390 * @hose: newly allocated pci_controller to be setup
> d3afa58c Michal Simek 2010-01-18 391 * @dev: device node of the host bridge
> d3afa58c Michal Simek 2010-01-18 392 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> d3afa58c Michal Simek 2010-01-18 393 *
> d3afa58c Michal Simek 2010-01-18 394 * This function will parse the "ranges" property of a PCI host bridge device
> d3afa58c Michal Simek 2010-01-18 395 * node and setup the resource mapping of a pci controller based on its
> d3afa58c Michal Simek 2010-01-18 396 * content.
> d3afa58c Michal Simek 2010-01-18 397 *
> d3afa58c Michal Simek 2010-01-18 398 * Life would be boring if it wasn't for a few issues that we have to deal
> d3afa58c Michal Simek 2010-01-18 399 * with here:
> d3afa58c Michal Simek 2010-01-18 400 *
> d3afa58c Michal Simek 2010-01-18 401 * - We can only cope with one IO space range and up to 3 Memory space
> d3afa58c Michal Simek 2010-01-18 402 * ranges. However, some machines (thanks Apple !) tend to split their
> d3afa58c Michal Simek 2010-01-18 403 * space into lots of small contiguous ranges. So we have to coalesce.
> d3afa58c Michal Simek 2010-01-18 404 *
> d3afa58c Michal Simek 2010-01-18 405 * - We can only cope with all memory ranges having the same offset
> d3afa58c Michal Simek 2010-01-18 406 * between CPU addresses and PCI addresses. Unfortunately, some bridges
> d3afa58c Michal Simek 2010-01-18 407 * are setup for a large 1:1 mapping along with a small "window" which
> d3afa58c Michal Simek 2010-01-18 408 * maps PCI address 0 to some arbitrary high address of the CPU space in
> d3afa58c Michal Simek 2010-01-18 409 * order to give access to the ISA memory hole.
> d3afa58c Michal Simek 2010-01-18 410 * The way out of here that I've chosen for now is to always set the
> d3afa58c Michal Simek 2010-01-18 411 * offset based on the first resource found, then override it if we
> d3afa58c Michal Simek 2010-01-18 412 * have a different offset and the previous was set by an ISA hole.
> d3afa58c Michal Simek 2010-01-18 413 *
> d3afa58c Michal Simek 2010-01-18 414 * - Some busses have IO space not starting at 0, which causes trouble with
> d3afa58c Michal Simek 2010-01-18 415 * the way we do our IO resource renumbering. The code somewhat deals with
> d3afa58c Michal Simek 2010-01-18 416 * it for 64 bits but I would expect problems on 32 bits.
> d3afa58c Michal Simek 2010-01-18 417 *
> d3afa58c Michal Simek 2010-01-18 418 * - Some 32 bits platforms such as 4xx can have physical space larger than
> d3afa58c Michal Simek 2010-01-18 419 * 32 bits so we need to use 64 bits values for the parsing
> d3afa58c Michal Simek 2010-01-18 420 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 421 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> b881bc46 Greg Kroah-Hartman 2012-12-21 422 struct device_node *dev, int primary)
> d3afa58c Michal Simek 2010-01-18 423 {
> d3afa58c Michal Simek 2010-01-18 424 int memno = 0, isa_hole = -1;
> d3afa58c Michal Simek 2010-01-18 425 unsigned long long isa_mb = 0;
> d3afa58c Michal Simek 2010-01-18 426 struct resource *res;
> 4f7b6de4 Andrew Murray 2013-07-27 427 struct of_pci_range range;
> 4f7b6de4 Andrew Murray 2013-07-27 428 struct of_pci_range_parser parser;
> d3afa58c Michal Simek 2010-01-18 429
> f2b8ae0e Rob Herring 2017-06-06 430 pr_info("PCI host bridge %pOF %s ranges:\n",
> f2b8ae0e Rob Herring 2017-06-06 431 dev, primary ? "(primary)" : "");
> d3afa58c Michal Simek 2010-01-18 432
> 4f7b6de4 Andrew Murray 2013-07-27 433 /* Check for ranges property */
> 4f7b6de4 Andrew Murray 2013-07-27 434 if (of_pci_range_parser_init(&parser, dev))
> d3afa58c Michal Simek 2010-01-18 435 return;
> d3afa58c Michal Simek 2010-01-18 436
> d3afa58c Michal Simek 2010-01-18 437 pr_debug("Parsing ranges property...\n");
> 4f7b6de4 Andrew Murray 2013-07-27 438 for_each_of_pci_range(&parser, &range) {
> d3afa58c Michal Simek 2010-01-18 439 /* Read next ranges element */
> 6bd55f0b Michal Simek 2012-12-27 440 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ",
> 4f7b6de4 Andrew Murray 2013-07-27 441 range.pci_space, range.pci_addr);
> 6bd55f0b Michal Simek 2012-12-27 442 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 443 range.cpu_addr, range.size);
> d3afa58c Michal Simek 2010-01-18 444
> d3afa58c Michal Simek 2010-01-18 445 /* If we failed translation or got a zero-sized region
> d3afa58c Michal Simek 2010-01-18 446 * (some FW try to feed us with non sensical zero sized regions
> d3afa58c Michal Simek 2010-01-18 447 * such as power3 which look like some kind of attempt
> d3afa58c Michal Simek 2010-01-18 448 * at exposing the VGA memory hole)
> d3afa58c Michal Simek 2010-01-18 449 */
> 4f7b6de4 Andrew Murray 2013-07-27 450 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> d3afa58c Michal Simek 2010-01-18 451 continue;
> d3afa58c Michal Simek 2010-01-18 452
> d3afa58c Michal Simek 2010-01-18 453 /* Act based on address space type */
> d3afa58c Michal Simek 2010-01-18 454 res = NULL;
> 4f7b6de4 Andrew Murray 2013-07-27 455 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 4f7b6de4 Andrew Murray 2013-07-27 456 case IORESOURCE_IO:
> 6bd55f0b Michal Simek 2012-12-27 457 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 458 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 459 range.pci_addr);
> d3afa58c Michal Simek 2010-01-18 460
> d3afa58c Michal Simek 2010-01-18 461 /* We support only one IO range */
> d3afa58c Michal Simek 2010-01-18 462 if (hose->pci_io_size) {
> 6bd55f0b Michal Simek 2012-12-27 463 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 464 continue;
> d3afa58c Michal Simek 2010-01-18 465 }
> d3afa58c Michal Simek 2010-01-18 466 /* On 32 bits, limit I/O space to 16MB */
> 4f7b6de4 Andrew Murray 2013-07-27 467 if (range.size > 0x01000000)
> 4f7b6de4 Andrew Murray 2013-07-27 468 range.size = 0x01000000;
> d3afa58c Michal Simek 2010-01-18 469
> d3afa58c Michal Simek 2010-01-18 470 /* 32 bits needs to map IOs here */
> 4f7b6de4 Andrew Murray 2013-07-27 471 hose->io_base_virt = ioremap(range.cpu_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 472 range.size);
> d3afa58c Michal Simek 2010-01-18 473
> d3afa58c Michal Simek 2010-01-18 474 /* Expect trouble if pci_addr is not 0 */
> d3afa58c Michal Simek 2010-01-18 475 if (primary)
> d3afa58c Michal Simek 2010-01-18 476 isa_io_base =
> d3afa58c Michal Simek 2010-01-18 477 (unsigned long)hose->io_base_virt;
> d3afa58c Michal Simek 2010-01-18 478 /* pci_io_size and io_base_phys always represent IO
> d3afa58c Michal Simek 2010-01-18 479 * space starting at 0 so we factor in pci_addr
> d3afa58c Michal Simek 2010-01-18 480 */
> 4f7b6de4 Andrew Murray 2013-07-27 481 hose->pci_io_size = range.pci_addr + range.size;
> 4f7b6de4 Andrew Murray 2013-07-27 482 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> d3afa58c Michal Simek 2010-01-18 483
> d3afa58c Michal Simek 2010-01-18 484 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 485 res = &hose->io_resource;
> 4f7b6de4 Andrew Murray 2013-07-27 486 range.cpu_addr = range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 487
> d3afa58c Michal Simek 2010-01-18 488 break;
> 4f7b6de4 Andrew Murray 2013-07-27 489 case IORESOURCE_MEM:
> 6bd55f0b Michal Simek 2012-12-27 490 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 4f7b6de4 Andrew Murray 2013-07-27 491 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 492 range.pci_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 493 (range.pci_space & 0x40000000) ?
> 4f7b6de4 Andrew Murray 2013-07-27 494 "Prefetch" : "");
> d3afa58c Michal Simek 2010-01-18 495
> d3afa58c Michal Simek 2010-01-18 496 /* We support only 3 memory ranges */
> d3afa58c Michal Simek 2010-01-18 497 if (memno >= 3) {
> 6bd55f0b Michal Simek 2012-12-27 498 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 499 continue;
> d3afa58c Michal Simek 2010-01-18 500 }
> d3afa58c Michal Simek 2010-01-18 501 /* Handles ISA memory hole space here */
> 4f7b6de4 Andrew Murray 2013-07-27 502 if (range.pci_addr == 0) {
> 4f7b6de4 Andrew Murray 2013-07-27 503 isa_mb = range.cpu_addr;
> d3afa58c Michal Simek 2010-01-18 504 isa_hole = memno;
> d3afa58c Michal Simek 2010-01-18 505 if (primary || isa_mem_base == 0)
> 4f7b6de4 Andrew Murray 2013-07-27 506 isa_mem_base = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 507 hose->isa_mem_phys = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 508 hose->isa_mem_size = range.size;
> d3afa58c Michal Simek 2010-01-18 509 }
> d3afa58c Michal Simek 2010-01-18 510
> d3afa58c Michal Simek 2010-01-18 511 /* We get the PCI/Mem offset from the first range or
> d3afa58c Michal Simek 2010-01-18 512 * the, current one if the offset came from an ISA
> d3afa58c Michal Simek 2010-01-18 513 * hole. If they don't match, bugger.
> d3afa58c Michal Simek 2010-01-18 514 */
> d3afa58c Michal Simek 2010-01-18 515 if (memno == 0 ||
> 4f7b6de4 Andrew Murray 2013-07-27 516 (isa_hole >= 0 && range.pci_addr != 0 &&
> d3afa58c Michal Simek 2010-01-18 517 hose->pci_mem_offset == isa_mb))
> 4f7b6de4 Andrew Murray 2013-07-27 518 hose->pci_mem_offset = range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 519 range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 520 else if (range.pci_addr != 0 &&
> 4f7b6de4 Andrew Murray 2013-07-27 521 hose->pci_mem_offset != range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 522 range.pci_addr) {
> 6bd55f0b Michal Simek 2012-12-27 523 pr_info(" \\--> Skipped (offset mismatch) !\n");
> d3afa58c Michal Simek 2010-01-18 524 continue;
> d3afa58c Michal Simek 2010-01-18 525 }
> d3afa58c Michal Simek 2010-01-18 526
> d3afa58c Michal Simek 2010-01-18 527 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 528 res = &hose->mem_resources[memno++];
> d3afa58c Michal Simek 2010-01-18 529 break;
> d3afa58c Michal Simek 2010-01-18 530 }
> 70dcd942 Michal Simek 2014-10-27 531 if (res != NULL) {
> 70dcd942 Michal Simek 2014-10-27 532 res->name = dev->full_name;
> 70dcd942 Michal Simek 2014-10-27 533 res->flags = range.flags;
> 70dcd942 Michal Simek 2014-10-27 534 res->start = range.cpu_addr;
> 70dcd942 Michal Simek 2014-10-27 535 res->end = range.cpu_addr + range.size - 1;
> 70dcd942 Michal Simek 2014-10-27 @536 res->parent = res->child = res->sibling = NULL;
> 70dcd942 Michal Simek 2014-10-27 537 }
> d3afa58c Michal Simek 2010-01-18 538 }
> d3afa58c Michal Simek 2010-01-18 539
> d3afa58c Michal Simek 2010-01-18 540 /* If there's an ISA hole and the pci_mem_offset is -not- matching
> d3afa58c Michal Simek 2010-01-18 541 * the ISA hole offset, then we need to remove the ISA hole from
> d3afa58c Michal Simek 2010-01-18 542 * the resource list for that brige
> d3afa58c Michal Simek 2010-01-18 543 */
> d3afa58c Michal Simek 2010-01-18 544 if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) {
> d3afa58c Michal Simek 2010-01-18 545 unsigned int next = isa_hole + 1;
> 6bd55f0b Michal Simek 2012-12-27 546 pr_info(" Removing ISA hole at 0x%016llx\n", isa_mb);
> d3afa58c Michal Simek 2010-01-18 547 if (next < memno)
> d3afa58c Michal Simek 2010-01-18 548 memmove(&hose->mem_resources[isa_hole],
> d3afa58c Michal Simek 2010-01-18 549 &hose->mem_resources[next],
> d3afa58c Michal Simek 2010-01-18 550 sizeof(struct resource) * (memno - next));
> d3afa58c Michal Simek 2010-01-18 551 hose->mem_resources[--memno].flags = 0;
> d3afa58c Michal Simek 2010-01-18 552 }
> d3afa58c Michal Simek 2010-01-18 553 }
> d3afa58c Michal Simek 2010-01-18 554
> 9413d968 Bharat Kumar Gogada 2016-09-01 555 /* Display the domain number in /proc */
> d3afa58c Michal Simek 2010-01-18 556 int pci_proc_domain(struct pci_bus *bus)
> d3afa58c Michal Simek 2010-01-18 557 {
> 9413d968 Bharat Kumar Gogada 2016-09-01 558 return pci_domain_nr(bus);
> d3afa58c Michal Simek 2010-01-18 559 }
> d3afa58c Michal Simek 2010-01-18 560
> d3afa58c Michal Simek 2010-01-18 561 /* This header fixup will do the resource fixup for all devices as they are
> d3afa58c Michal Simek 2010-01-18 562 * probed, but not for bridge ranges
> d3afa58c Michal Simek 2010-01-18 563 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 564 static void pcibios_fixup_resources(struct pci_dev *dev)
> d3afa58c Michal Simek 2010-01-18 565 {
> d3afa58c Michal Simek 2010-01-18 566 struct pci_controller *hose = pci_bus_to_host(dev->bus);
> d3afa58c Michal Simek 2010-01-18 567 int i;
> d3afa58c Michal Simek 2010-01-18 568
> d3afa58c Michal Simek 2010-01-18 569 if (!hose) {
> 6bd55f0b Michal Simek 2012-12-27 570 pr_err("No host bridge for PCI dev %s !\n",
> d3afa58c Michal Simek 2010-01-18 571 pci_name(dev));
> d3afa58c Michal Simek 2010-01-18 572 return;
> d3afa58c Michal Simek 2010-01-18 573 }
> d3afa58c Michal Simek 2010-01-18 574 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
> d3afa58c Michal Simek 2010-01-18 575 struct resource *res = dev->resource + i;
> d3afa58c Michal Simek 2010-01-18 576 if (!res->flags)
> d3afa58c Michal Simek 2010-01-18 577 continue;
> e5b36841 Bjorn Helgaas 2012-02-23 578 if (res->start == 0) {
> 6bd55f0b Michal Simek 2012-12-27 579 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]",
> d3afa58c Michal Simek 2010-01-18 580 pci_name(dev), i,
> d3afa58c Michal Simek 2010-01-18 581 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 582 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 583 (unsigned int)res->flags);
> 6bd55f0b Michal Simek 2012-12-27 584 pr_debug("is unassigned\n");
> d3afa58c Michal Simek 2010-01-18 585 res->end -= res->start;
> d3afa58c Michal Simek 2010-01-18 586 res->start = 0;
> d3afa58c Michal Simek 2010-01-18 587 res->flags |= IORESOURCE_UNSET;
> d3afa58c Michal Simek 2010-01-18 588 continue;
> d3afa58c Michal Simek 2010-01-18 589 }
> d3afa58c Michal Simek 2010-01-18 590
> aa23bdc0 Bjorn Helgaas 2012-02-23 591 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n",
> d3afa58c Michal Simek 2010-01-18 592 pci_name(dev), i,
> 6bd55f0b Michal Simek 2012-12-27 593 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 594 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 595 (unsigned int)res->flags);
> d3afa58c Michal Simek 2010-01-18 596 }
> d3afa58c Michal Simek 2010-01-18 597 }
> d3afa58c Michal Simek 2010-01-18 598 DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
> d3afa58c Michal Simek 2010-01-18 599
> d3afa58c Michal Simek 2010-01-18 600 /*
> d3afa58c Michal Simek 2010-01-18 601 * We need to avoid collisions with `mirrored' VGA ports
> d3afa58c Michal Simek 2010-01-18 602 * and other strange ISA hardware, so we always want the
> d3afa58c Michal Simek 2010-01-18 603 * addresses to be allocated in the 0x000-0x0ff region
> d3afa58c Michal Simek 2010-01-18 604 * modulo 0x400.
> d3afa58c Michal Simek 2010-01-18 605 *
> d3afa58c Michal Simek 2010-01-18 606 * Why? Because some silly external IO cards only decode
> d3afa58c Michal Simek 2010-01-18 607 * the low 10 bits of the IO address. The 0x00-0xff region
> d3afa58c Michal Simek 2010-01-18 608 * is reserved for motherboard devices that decode all 16
> d3afa58c Michal Simek 2010-01-18 609 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
> d3afa58c Michal Simek 2010-01-18 610 * but we want to try to avoid allocating at 0x2900-0x2bff
> d3afa58c Michal Simek 2010-01-18 611 * which might have be mirrored at 0x0100-0x03ff..
> d3afa58c Michal Simek 2010-01-18 612 */
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 613 int pcibios_add_device(struct pci_dev *dev)
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 614 {
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 615 dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
> c86fac43 Michal Simek 2010-04-16 616
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 617 return 0;
> d3afa58c Michal Simek 2010-01-18 618 }
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 619 EXPORT_SYMBOL(pcibios_add_device);
> d3afa58c Michal Simek 2010-01-18 620
> d3afa58c Michal Simek 2010-01-18 621 /*
> d3afa58c Michal Simek 2010-01-18 622 * Reparent resource children of pr that conflict with res
> d3afa58c Michal Simek 2010-01-18 623 * under res, and make res replace those children.
> d3afa58c Michal Simek 2010-01-18 624 */
> d3afa58c Michal Simek 2010-01-18 625 static int __init reparent_resources(struct resource *parent,
> d3afa58c Michal Simek 2010-01-18 626 struct resource *res)
> d3afa58c Michal Simek 2010-01-18 627 {
> d3afa58c Michal Simek 2010-01-18 628 struct resource *p, **pp;
> d3afa58c Michal Simek 2010-01-18 629 struct resource **firstpp = NULL;
> d3afa58c Michal Simek 2010-01-18 630
> d3afa58c Michal Simek 2010-01-18 @631 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> d3afa58c Michal Simek 2010-01-18 632 if (p->end < res->start)
> d3afa58c Michal Simek 2010-01-18 633 continue;
> d3afa58c Michal Simek 2010-01-18 634 if (res->end < p->start)
> d3afa58c Michal Simek 2010-01-18 635 break;
> d3afa58c Michal Simek 2010-01-18 636 if (p->start < res->start || p->end > res->end)
> d3afa58c Michal Simek 2010-01-18 637 return -1; /* not completely contained */
> d3afa58c Michal Simek 2010-01-18 638 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 639 firstpp = pp;
> d3afa58c Michal Simek 2010-01-18 640 }
> d3afa58c Michal Simek 2010-01-18 641 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 642 return -1; /* didn't find any conflicting entries? */
> d3afa58c Michal Simek 2010-01-18 643 res->parent = parent;
> d3afa58c Michal Simek 2010-01-18 @644 res->child = *firstpp;
> d3afa58c Michal Simek 2010-01-18 645 res->sibling = *pp;
> d3afa58c Michal Simek 2010-01-18 646 *firstpp = res;
> d3afa58c Michal Simek 2010-01-18 647 *pp = NULL;
> d3afa58c Michal Simek 2010-01-18 @648 for (p = res->child; p != NULL; p = p->sibling) {
> d3afa58c Michal Simek 2010-01-18 649 p->parent = res;
> d3afa58c Michal Simek 2010-01-18 650 pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
> d3afa58c Michal Simek 2010-01-18 651 p->name,
> d3afa58c Michal Simek 2010-01-18 652 (unsigned long long)p->start,
> d3afa58c Michal Simek 2010-01-18 653 (unsigned long long)p->end, res->name);
> d3afa58c Michal Simek 2010-01-18 654 }
> d3afa58c Michal Simek 2010-01-18 655 return 0;
> d3afa58c Michal Simek 2010-01-18 656 }
> d3afa58c Michal Simek 2010-01-18 657
>
> :::::: The code at line 536 was first introduced by commit
> :::::: 70dcd942dc4af3cc6c3dcc2ba499cd841c7f65a7 microblaze: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michal Simek <michal.simek-gjFFaj9aHVfQT0dZR+AlfA@public.gmane.org>
> :::::: CC: Michal Simek <michal.simek-gjFFaj9aHVfQT0dZR+AlfA@public.gmane.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
WARNING: multiple messages have this Message-ID (diff)
From: Baoquan He <bhe@redhat.com>
To: kbuild test robot <lkp@intel.com>
Cc: kbuild-all@01.org, linux-kernel@vger.kernel.org,
akpm@linux-foundation.org, robh+dt@kernel.org,
dan.j.williams@intel.com, nicolas.pitre@linaro.org,
josh@joshtriplett.org, "Brijesh Singh" <brijesh.singh@amd.com>,
devicetree@vger.kernel.org, "David Airlie" <airlied@linux.ie>,
linux-pci@vger.kernel.org, "Wei Yang" <richard.weiyang@gmail.com>,
"Keith Busch" <keith.busch@intel.com>,
"Yaowei Bai" <baiyaowei@cmss.chinamobile.com>,
"Frank Rowand" <frowand.list@gmail.com>,
"Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
"Stephen Hemminger" <sthemmin@microsoft.com>,
linux-nvdimm@lists.01.org,
"Patrik Jakobsson" <patrik.r.jakobsson@gmail.com>,
linux-input@vger.kernel.org, "Borislav Petkov" <bp@suse.de>,
"Tom Lendacky" <thomas.lendacky@amd.com>,
"Haiyang Zhang" <haiyangz@microsoft.com>,
"Jérôme Glisse" <jglisse@redhat.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Jonathan Derrick" <jonathan.derrick@intel.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
devel@linuxdriverproject.org
Subject: Re: [PATCH v3 1/3] resource: Use list_head to link sibling resource
Date: Sun, 6 May 2018 14:31:32 +0800 [thread overview]
Message-ID: <20180506063132.GH19030@localhost.localdomain> (raw)
In-Reply-To: <201804261045.v9iHAD1T%fengguang.wu@intel.com>
On 04/26/18 at 11:01am, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc2 next-20180424]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180419-223752
> config: microblaze-mmu_defconfig (attached as .config)
> compiler: microblaze-linux-gcc (GCC) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=microblaze
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it. Will repost including the fix.
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
>
> arch/microblaze/pci/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/microblaze/pci/pci-common.c:536:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
> ^
> arch/microblaze/pci/pci-common.c: In function 'reparent_resources':
> >> arch/microblaze/pci/pci-common.c:631:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:631:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/microblaze/pci/pci-common.c:644:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/microblaze/pci/pci-common.c:645:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/microblaze/pci/pci-common.c:648:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/microblaze/pci/pci-common.c:648:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: some warnings being treated as errors
>
> vim +536 arch/microblaze/pci/pci-common.c
>
> d3afa58c Michal Simek 2010-01-18 387
> d3afa58c Michal Simek 2010-01-18 388 /**
> d3afa58c Michal Simek 2010-01-18 389 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> d3afa58c Michal Simek 2010-01-18 390 * @hose: newly allocated pci_controller to be setup
> d3afa58c Michal Simek 2010-01-18 391 * @dev: device node of the host bridge
> d3afa58c Michal Simek 2010-01-18 392 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> d3afa58c Michal Simek 2010-01-18 393 *
> d3afa58c Michal Simek 2010-01-18 394 * This function will parse the "ranges" property of a PCI host bridge device
> d3afa58c Michal Simek 2010-01-18 395 * node and setup the resource mapping of a pci controller based on its
> d3afa58c Michal Simek 2010-01-18 396 * content.
> d3afa58c Michal Simek 2010-01-18 397 *
> d3afa58c Michal Simek 2010-01-18 398 * Life would be boring if it wasn't for a few issues that we have to deal
> d3afa58c Michal Simek 2010-01-18 399 * with here:
> d3afa58c Michal Simek 2010-01-18 400 *
> d3afa58c Michal Simek 2010-01-18 401 * - We can only cope with one IO space range and up to 3 Memory space
> d3afa58c Michal Simek 2010-01-18 402 * ranges. However, some machines (thanks Apple !) tend to split their
> d3afa58c Michal Simek 2010-01-18 403 * space into lots of small contiguous ranges. So we have to coalesce.
> d3afa58c Michal Simek 2010-01-18 404 *
> d3afa58c Michal Simek 2010-01-18 405 * - We can only cope with all memory ranges having the same offset
> d3afa58c Michal Simek 2010-01-18 406 * between CPU addresses and PCI addresses. Unfortunately, some bridges
> d3afa58c Michal Simek 2010-01-18 407 * are setup for a large 1:1 mapping along with a small "window" which
> d3afa58c Michal Simek 2010-01-18 408 * maps PCI address 0 to some arbitrary high address of the CPU space in
> d3afa58c Michal Simek 2010-01-18 409 * order to give access to the ISA memory hole.
> d3afa58c Michal Simek 2010-01-18 410 * The way out of here that I've chosen for now is to always set the
> d3afa58c Michal Simek 2010-01-18 411 * offset based on the first resource found, then override it if we
> d3afa58c Michal Simek 2010-01-18 412 * have a different offset and the previous was set by an ISA hole.
> d3afa58c Michal Simek 2010-01-18 413 *
> d3afa58c Michal Simek 2010-01-18 414 * - Some busses have IO space not starting at 0, which causes trouble with
> d3afa58c Michal Simek 2010-01-18 415 * the way we do our IO resource renumbering. The code somewhat deals with
> d3afa58c Michal Simek 2010-01-18 416 * it for 64 bits but I would expect problems on 32 bits.
> d3afa58c Michal Simek 2010-01-18 417 *
> d3afa58c Michal Simek 2010-01-18 418 * - Some 32 bits platforms such as 4xx can have physical space larger than
> d3afa58c Michal Simek 2010-01-18 419 * 32 bits so we need to use 64 bits values for the parsing
> d3afa58c Michal Simek 2010-01-18 420 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 421 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> b881bc46 Greg Kroah-Hartman 2012-12-21 422 struct device_node *dev, int primary)
> d3afa58c Michal Simek 2010-01-18 423 {
> d3afa58c Michal Simek 2010-01-18 424 int memno = 0, isa_hole = -1;
> d3afa58c Michal Simek 2010-01-18 425 unsigned long long isa_mb = 0;
> d3afa58c Michal Simek 2010-01-18 426 struct resource *res;
> 4f7b6de4 Andrew Murray 2013-07-27 427 struct of_pci_range range;
> 4f7b6de4 Andrew Murray 2013-07-27 428 struct of_pci_range_parser parser;
> d3afa58c Michal Simek 2010-01-18 429
> f2b8ae0e Rob Herring 2017-06-06 430 pr_info("PCI host bridge %pOF %s ranges:\n",
> f2b8ae0e Rob Herring 2017-06-06 431 dev, primary ? "(primary)" : "");
> d3afa58c Michal Simek 2010-01-18 432
> 4f7b6de4 Andrew Murray 2013-07-27 433 /* Check for ranges property */
> 4f7b6de4 Andrew Murray 2013-07-27 434 if (of_pci_range_parser_init(&parser, dev))
> d3afa58c Michal Simek 2010-01-18 435 return;
> d3afa58c Michal Simek 2010-01-18 436
> d3afa58c Michal Simek 2010-01-18 437 pr_debug("Parsing ranges property...\n");
> 4f7b6de4 Andrew Murray 2013-07-27 438 for_each_of_pci_range(&parser, &range) {
> d3afa58c Michal Simek 2010-01-18 439 /* Read next ranges element */
> 6bd55f0b Michal Simek 2012-12-27 440 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ",
> 4f7b6de4 Andrew Murray 2013-07-27 441 range.pci_space, range.pci_addr);
> 6bd55f0b Michal Simek 2012-12-27 442 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 443 range.cpu_addr, range.size);
> d3afa58c Michal Simek 2010-01-18 444
> d3afa58c Michal Simek 2010-01-18 445 /* If we failed translation or got a zero-sized region
> d3afa58c Michal Simek 2010-01-18 446 * (some FW try to feed us with non sensical zero sized regions
> d3afa58c Michal Simek 2010-01-18 447 * such as power3 which look like some kind of attempt
> d3afa58c Michal Simek 2010-01-18 448 * at exposing the VGA memory hole)
> d3afa58c Michal Simek 2010-01-18 449 */
> 4f7b6de4 Andrew Murray 2013-07-27 450 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> d3afa58c Michal Simek 2010-01-18 451 continue;
> d3afa58c Michal Simek 2010-01-18 452
> d3afa58c Michal Simek 2010-01-18 453 /* Act based on address space type */
> d3afa58c Michal Simek 2010-01-18 454 res = NULL;
> 4f7b6de4 Andrew Murray 2013-07-27 455 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 4f7b6de4 Andrew Murray 2013-07-27 456 case IORESOURCE_IO:
> 6bd55f0b Michal Simek 2012-12-27 457 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 4f7b6de4 Andrew Murray 2013-07-27 458 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 459 range.pci_addr);
> d3afa58c Michal Simek 2010-01-18 460
> d3afa58c Michal Simek 2010-01-18 461 /* We support only one IO range */
> d3afa58c Michal Simek 2010-01-18 462 if (hose->pci_io_size) {
> 6bd55f0b Michal Simek 2012-12-27 463 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 464 continue;
> d3afa58c Michal Simek 2010-01-18 465 }
> d3afa58c Michal Simek 2010-01-18 466 /* On 32 bits, limit I/O space to 16MB */
> 4f7b6de4 Andrew Murray 2013-07-27 467 if (range.size > 0x01000000)
> 4f7b6de4 Andrew Murray 2013-07-27 468 range.size = 0x01000000;
> d3afa58c Michal Simek 2010-01-18 469
> d3afa58c Michal Simek 2010-01-18 470 /* 32 bits needs to map IOs here */
> 4f7b6de4 Andrew Murray 2013-07-27 471 hose->io_base_virt = ioremap(range.cpu_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 472 range.size);
> d3afa58c Michal Simek 2010-01-18 473
> d3afa58c Michal Simek 2010-01-18 474 /* Expect trouble if pci_addr is not 0 */
> d3afa58c Michal Simek 2010-01-18 475 if (primary)
> d3afa58c Michal Simek 2010-01-18 476 isa_io_base =
> d3afa58c Michal Simek 2010-01-18 477 (unsigned long)hose->io_base_virt;
> d3afa58c Michal Simek 2010-01-18 478 /* pci_io_size and io_base_phys always represent IO
> d3afa58c Michal Simek 2010-01-18 479 * space starting at 0 so we factor in pci_addr
> d3afa58c Michal Simek 2010-01-18 480 */
> 4f7b6de4 Andrew Murray 2013-07-27 481 hose->pci_io_size = range.pci_addr + range.size;
> 4f7b6de4 Andrew Murray 2013-07-27 482 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> d3afa58c Michal Simek 2010-01-18 483
> d3afa58c Michal Simek 2010-01-18 484 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 485 res = &hose->io_resource;
> 4f7b6de4 Andrew Murray 2013-07-27 486 range.cpu_addr = range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 487
> d3afa58c Michal Simek 2010-01-18 488 break;
> 4f7b6de4 Andrew Murray 2013-07-27 489 case IORESOURCE_MEM:
> 6bd55f0b Michal Simek 2012-12-27 490 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 4f7b6de4 Andrew Murray 2013-07-27 491 range.cpu_addr, range.cpu_addr + range.size - 1,
> 4f7b6de4 Andrew Murray 2013-07-27 492 range.pci_addr,
> 4f7b6de4 Andrew Murray 2013-07-27 493 (range.pci_space & 0x40000000) ?
> 4f7b6de4 Andrew Murray 2013-07-27 494 "Prefetch" : "");
> d3afa58c Michal Simek 2010-01-18 495
> d3afa58c Michal Simek 2010-01-18 496 /* We support only 3 memory ranges */
> d3afa58c Michal Simek 2010-01-18 497 if (memno >= 3) {
> 6bd55f0b Michal Simek 2012-12-27 498 pr_info(" \\--> Skipped (too many) !\n");
> d3afa58c Michal Simek 2010-01-18 499 continue;
> d3afa58c Michal Simek 2010-01-18 500 }
> d3afa58c Michal Simek 2010-01-18 501 /* Handles ISA memory hole space here */
> 4f7b6de4 Andrew Murray 2013-07-27 502 if (range.pci_addr == 0) {
> 4f7b6de4 Andrew Murray 2013-07-27 503 isa_mb = range.cpu_addr;
> d3afa58c Michal Simek 2010-01-18 504 isa_hole = memno;
> d3afa58c Michal Simek 2010-01-18 505 if (primary || isa_mem_base == 0)
> 4f7b6de4 Andrew Murray 2013-07-27 506 isa_mem_base = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 507 hose->isa_mem_phys = range.cpu_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 508 hose->isa_mem_size = range.size;
> d3afa58c Michal Simek 2010-01-18 509 }
> d3afa58c Michal Simek 2010-01-18 510
> d3afa58c Michal Simek 2010-01-18 511 /* We get the PCI/Mem offset from the first range or
> d3afa58c Michal Simek 2010-01-18 512 * the, current one if the offset came from an ISA
> d3afa58c Michal Simek 2010-01-18 513 * hole. If they don't match, bugger.
> d3afa58c Michal Simek 2010-01-18 514 */
> d3afa58c Michal Simek 2010-01-18 515 if (memno == 0 ||
> 4f7b6de4 Andrew Murray 2013-07-27 516 (isa_hole >= 0 && range.pci_addr != 0 &&
> d3afa58c Michal Simek 2010-01-18 517 hose->pci_mem_offset == isa_mb))
> 4f7b6de4 Andrew Murray 2013-07-27 518 hose->pci_mem_offset = range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 519 range.pci_addr;
> 4f7b6de4 Andrew Murray 2013-07-27 520 else if (range.pci_addr != 0 &&
> 4f7b6de4 Andrew Murray 2013-07-27 521 hose->pci_mem_offset != range.cpu_addr -
> 4f7b6de4 Andrew Murray 2013-07-27 522 range.pci_addr) {
> 6bd55f0b Michal Simek 2012-12-27 523 pr_info(" \\--> Skipped (offset mismatch) !\n");
> d3afa58c Michal Simek 2010-01-18 524 continue;
> d3afa58c Michal Simek 2010-01-18 525 }
> d3afa58c Michal Simek 2010-01-18 526
> d3afa58c Michal Simek 2010-01-18 527 /* Build resource */
> d3afa58c Michal Simek 2010-01-18 528 res = &hose->mem_resources[memno++];
> d3afa58c Michal Simek 2010-01-18 529 break;
> d3afa58c Michal Simek 2010-01-18 530 }
> 70dcd942 Michal Simek 2014-10-27 531 if (res != NULL) {
> 70dcd942 Michal Simek 2014-10-27 532 res->name = dev->full_name;
> 70dcd942 Michal Simek 2014-10-27 533 res->flags = range.flags;
> 70dcd942 Michal Simek 2014-10-27 534 res->start = range.cpu_addr;
> 70dcd942 Michal Simek 2014-10-27 535 res->end = range.cpu_addr + range.size - 1;
> 70dcd942 Michal Simek 2014-10-27 @536 res->parent = res->child = res->sibling = NULL;
> 70dcd942 Michal Simek 2014-10-27 537 }
> d3afa58c Michal Simek 2010-01-18 538 }
> d3afa58c Michal Simek 2010-01-18 539
> d3afa58c Michal Simek 2010-01-18 540 /* If there's an ISA hole and the pci_mem_offset is -not- matching
> d3afa58c Michal Simek 2010-01-18 541 * the ISA hole offset, then we need to remove the ISA hole from
> d3afa58c Michal Simek 2010-01-18 542 * the resource list for that brige
> d3afa58c Michal Simek 2010-01-18 543 */
> d3afa58c Michal Simek 2010-01-18 544 if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) {
> d3afa58c Michal Simek 2010-01-18 545 unsigned int next = isa_hole + 1;
> 6bd55f0b Michal Simek 2012-12-27 546 pr_info(" Removing ISA hole at 0x%016llx\n", isa_mb);
> d3afa58c Michal Simek 2010-01-18 547 if (next < memno)
> d3afa58c Michal Simek 2010-01-18 548 memmove(&hose->mem_resources[isa_hole],
> d3afa58c Michal Simek 2010-01-18 549 &hose->mem_resources[next],
> d3afa58c Michal Simek 2010-01-18 550 sizeof(struct resource) * (memno - next));
> d3afa58c Michal Simek 2010-01-18 551 hose->mem_resources[--memno].flags = 0;
> d3afa58c Michal Simek 2010-01-18 552 }
> d3afa58c Michal Simek 2010-01-18 553 }
> d3afa58c Michal Simek 2010-01-18 554
> 9413d968 Bharat Kumar Gogada 2016-09-01 555 /* Display the domain number in /proc */
> d3afa58c Michal Simek 2010-01-18 556 int pci_proc_domain(struct pci_bus *bus)
> d3afa58c Michal Simek 2010-01-18 557 {
> 9413d968 Bharat Kumar Gogada 2016-09-01 558 return pci_domain_nr(bus);
> d3afa58c Michal Simek 2010-01-18 559 }
> d3afa58c Michal Simek 2010-01-18 560
> d3afa58c Michal Simek 2010-01-18 561 /* This header fixup will do the resource fixup for all devices as they are
> d3afa58c Michal Simek 2010-01-18 562 * probed, but not for bridge ranges
> d3afa58c Michal Simek 2010-01-18 563 */
> b881bc46 Greg Kroah-Hartman 2012-12-21 564 static void pcibios_fixup_resources(struct pci_dev *dev)
> d3afa58c Michal Simek 2010-01-18 565 {
> d3afa58c Michal Simek 2010-01-18 566 struct pci_controller *hose = pci_bus_to_host(dev->bus);
> d3afa58c Michal Simek 2010-01-18 567 int i;
> d3afa58c Michal Simek 2010-01-18 568
> d3afa58c Michal Simek 2010-01-18 569 if (!hose) {
> 6bd55f0b Michal Simek 2012-12-27 570 pr_err("No host bridge for PCI dev %s !\n",
> d3afa58c Michal Simek 2010-01-18 571 pci_name(dev));
> d3afa58c Michal Simek 2010-01-18 572 return;
> d3afa58c Michal Simek 2010-01-18 573 }
> d3afa58c Michal Simek 2010-01-18 574 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
> d3afa58c Michal Simek 2010-01-18 575 struct resource *res = dev->resource + i;
> d3afa58c Michal Simek 2010-01-18 576 if (!res->flags)
> d3afa58c Michal Simek 2010-01-18 577 continue;
> e5b36841 Bjorn Helgaas 2012-02-23 578 if (res->start == 0) {
> 6bd55f0b Michal Simek 2012-12-27 579 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]",
> d3afa58c Michal Simek 2010-01-18 580 pci_name(dev), i,
> d3afa58c Michal Simek 2010-01-18 581 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 582 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 583 (unsigned int)res->flags);
> 6bd55f0b Michal Simek 2012-12-27 584 pr_debug("is unassigned\n");
> d3afa58c Michal Simek 2010-01-18 585 res->end -= res->start;
> d3afa58c Michal Simek 2010-01-18 586 res->start = 0;
> d3afa58c Michal Simek 2010-01-18 587 res->flags |= IORESOURCE_UNSET;
> d3afa58c Michal Simek 2010-01-18 588 continue;
> d3afa58c Michal Simek 2010-01-18 589 }
> d3afa58c Michal Simek 2010-01-18 590
> aa23bdc0 Bjorn Helgaas 2012-02-23 591 pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n",
> d3afa58c Michal Simek 2010-01-18 592 pci_name(dev), i,
> 6bd55f0b Michal Simek 2012-12-27 593 (unsigned long long)res->start,
> d3afa58c Michal Simek 2010-01-18 594 (unsigned long long)res->end,
> d3afa58c Michal Simek 2010-01-18 595 (unsigned int)res->flags);
> d3afa58c Michal Simek 2010-01-18 596 }
> d3afa58c Michal Simek 2010-01-18 597 }
> d3afa58c Michal Simek 2010-01-18 598 DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
> d3afa58c Michal Simek 2010-01-18 599
> d3afa58c Michal Simek 2010-01-18 600 /*
> d3afa58c Michal Simek 2010-01-18 601 * We need to avoid collisions with `mirrored' VGA ports
> d3afa58c Michal Simek 2010-01-18 602 * and other strange ISA hardware, so we always want the
> d3afa58c Michal Simek 2010-01-18 603 * addresses to be allocated in the 0x000-0x0ff region
> d3afa58c Michal Simek 2010-01-18 604 * modulo 0x400.
> d3afa58c Michal Simek 2010-01-18 605 *
> d3afa58c Michal Simek 2010-01-18 606 * Why? Because some silly external IO cards only decode
> d3afa58c Michal Simek 2010-01-18 607 * the low 10 bits of the IO address. The 0x00-0xff region
> d3afa58c Michal Simek 2010-01-18 608 * is reserved for motherboard devices that decode all 16
> d3afa58c Michal Simek 2010-01-18 609 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
> d3afa58c Michal Simek 2010-01-18 610 * but we want to try to avoid allocating at 0x2900-0x2bff
> d3afa58c Michal Simek 2010-01-18 611 * which might have be mirrored at 0x0100-0x03ff..
> d3afa58c Michal Simek 2010-01-18 612 */
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 613 int pcibios_add_device(struct pci_dev *dev)
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 614 {
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 615 dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
> c86fac43 Michal Simek 2010-04-16 616
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 617 return 0;
> d3afa58c Michal Simek 2010-01-18 618 }
> 01cf9d52 Bharat Kumar Gogada 2016-02-11 619 EXPORT_SYMBOL(pcibios_add_device);
> d3afa58c Michal Simek 2010-01-18 620
> d3afa58c Michal Simek 2010-01-18 621 /*
> d3afa58c Michal Simek 2010-01-18 622 * Reparent resource children of pr that conflict with res
> d3afa58c Michal Simek 2010-01-18 623 * under res, and make res replace those children.
> d3afa58c Michal Simek 2010-01-18 624 */
> d3afa58c Michal Simek 2010-01-18 625 static int __init reparent_resources(struct resource *parent,
> d3afa58c Michal Simek 2010-01-18 626 struct resource *res)
> d3afa58c Michal Simek 2010-01-18 627 {
> d3afa58c Michal Simek 2010-01-18 628 struct resource *p, **pp;
> d3afa58c Michal Simek 2010-01-18 629 struct resource **firstpp = NULL;
> d3afa58c Michal Simek 2010-01-18 630
> d3afa58c Michal Simek 2010-01-18 @631 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> d3afa58c Michal Simek 2010-01-18 632 if (p->end < res->start)
> d3afa58c Michal Simek 2010-01-18 633 continue;
> d3afa58c Michal Simek 2010-01-18 634 if (res->end < p->start)
> d3afa58c Michal Simek 2010-01-18 635 break;
> d3afa58c Michal Simek 2010-01-18 636 if (p->start < res->start || p->end > res->end)
> d3afa58c Michal Simek 2010-01-18 637 return -1; /* not completely contained */
> d3afa58c Michal Simek 2010-01-18 638 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 639 firstpp = pp;
> d3afa58c Michal Simek 2010-01-18 640 }
> d3afa58c Michal Simek 2010-01-18 641 if (firstpp == NULL)
> d3afa58c Michal Simek 2010-01-18 642 return -1; /* didn't find any conflicting entries? */
> d3afa58c Michal Simek 2010-01-18 643 res->parent = parent;
> d3afa58c Michal Simek 2010-01-18 @644 res->child = *firstpp;
> d3afa58c Michal Simek 2010-01-18 645 res->sibling = *pp;
> d3afa58c Michal Simek 2010-01-18 646 *firstpp = res;
> d3afa58c Michal Simek 2010-01-18 647 *pp = NULL;
> d3afa58c Michal Simek 2010-01-18 @648 for (p = res->child; p != NULL; p = p->sibling) {
> d3afa58c Michal Simek 2010-01-18 649 p->parent = res;
> d3afa58c Michal Simek 2010-01-18 650 pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
> d3afa58c Michal Simek 2010-01-18 651 p->name,
> d3afa58c Michal Simek 2010-01-18 652 (unsigned long long)p->start,
> d3afa58c Michal Simek 2010-01-18 653 (unsigned long long)p->end, res->name);
> d3afa58c Michal Simek 2010-01-18 654 }
> d3afa58c Michal Simek 2010-01-18 655 return 0;
> d3afa58c Michal Simek 2010-01-18 656 }
> d3afa58c Michal Simek 2010-01-18 657
>
> :::::: The code at line 536 was first introduced by commit
> :::::: 70dcd942dc4af3cc6c3dcc2ba499cd841c7f65a7 microblaze: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michal Simek <michal.simek@xilinx.com>
> :::::: CC: Michal Simek <michal.simek@xilinx.com>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
next prev parent reply other threads:[~2018-05-06 6:31 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-19 0:18 [PATCH v3 0/3] resource: Use list_head to link sibling resource Baoquan He
2018-04-19 0:18 ` [PATCH v3 1/3] " Baoquan He
2018-04-19 0:18 ` Baoquan He
2018-04-19 0:18 ` Baoquan He
2018-04-19 0:18 ` Baoquan He
2018-04-26 1:18 ` Wei Yang
2018-04-26 1:18 ` Wei Yang
2018-04-26 1:18 ` Wei Yang
2018-04-26 1:18 ` Wei Yang
2018-05-07 1:14 ` Baoquan He
2018-05-07 1:14 ` Baoquan He
2018-05-07 1:14 ` Baoquan He
2018-05-07 1:14 ` Baoquan He
2018-05-08 11:48 ` Wei Yang
2018-05-08 11:48 ` Wei Yang
2018-05-08 11:48 ` Wei Yang
2018-05-08 11:48 ` Wei Yang
2018-05-08 12:11 ` Baoquan He
2018-05-08 12:11 ` Baoquan He
2018-05-08 12:11 ` Baoquan He
2018-05-08 23:41 ` Wei Yang
2018-05-08 23:41 ` Wei Yang
2018-05-08 23:41 ` Wei Yang
2018-05-08 23:41 ` Wei Yang
2018-04-26 3:01 ` kbuild test robot
2018-04-26 3:01 ` kbuild test robot
2018-04-26 3:01 ` kbuild test robot
2018-05-06 6:31 ` Baoquan He [this message]
2018-05-06 6:31 ` Baoquan He
2018-05-06 6:31 ` Baoquan He
2018-05-06 6:31 ` Baoquan He
2018-04-26 3:23 ` kbuild test robot
2018-04-26 3:23 ` kbuild test robot
2018-04-26 3:23 ` kbuild test robot
2018-05-06 6:30 ` Baoquan He
2018-05-06 6:30 ` Baoquan He
2018-05-06 6:30 ` Baoquan He
2018-05-06 6:30 ` Baoquan He
2018-04-19 0:18 ` [PATCH v3 2/3] resource: add walk_system_ram_res_rev() Baoquan He
2018-04-19 10:07 ` Borislav Petkov
2018-04-26 8:56 ` Baoquan He
2018-04-26 11:09 ` Borislav Petkov
2018-04-26 13:22 ` Baoquan He
2018-05-04 10:16 ` Borislav Petkov
2018-05-06 6:19 ` Baoquan He
2018-04-19 0:18 ` [PATCH v3 3/3] kexec_file: Load kernel at top of system RAM if required Baoquan He
2018-04-19 0:18 ` Baoquan He
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180506063132.GH19030@localhost.localdomain \
--to=bhe@redhat.com \
--cc=airlied@linux.ie \
--cc=akpm@linux-foundation.org \
--cc=baiyaowei@cmss.chinamobile.com \
--cc=bhelgaas@google.com \
--cc=bp@suse.de \
--cc=brijesh.singh@amd.com \
--cc=devel@linuxdriverproject.org \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=frowand.list@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=haiyangz@microsoft.com \
--cc=jglisse@redhat.com \
--cc=jonathan.derrick@intel.com \
--cc=josh@joshtriplett.org \
--cc=kbuild-all@01.org \
--cc=keith.busch@intel.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvdimm@lists.01.org \
--cc=linux-pci@vger.kernel.org \
--cc=lkp@intel.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=nicolas.pitre@linaro.org \
--cc=patrik.r.jakobsson@gmail.com \
--cc=richard.weiyang@gmail.com \
--cc=robh+dt@kernel.org \
--cc=sthemmin@microsoft.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.