Parent repository is bk://kernel.bkbits.net/gregkh/linux/pci-2.6 ======== ChangeSet 1.1592 ======== D 1.1592 04/02/25 11:59:25-08:00 akpm@mnm.(none) 37516 37515 0/0/1 P ChangeSet C Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 C into mnm.(none):/usr/src/bk-pci ------------------------------------------------ diff -Nru a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig --- a/drivers/pci/hotplug/Kconfig Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/Kconfig Wed Feb 25 12:00:47 2004 @@ -191,7 +191,7 @@ config HOTPLUG_PCI_RPA tristate "RPA PCI Hotplug driver" - depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 + depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE help Say Y here if you have a a RPA system that supports PCI Hotplug. diff -Nru a/drivers/pci/hotplug/Makefile b/drivers/pci/hotplug/Makefile --- a/drivers/pci/hotplug/Makefile Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/Makefile Wed Feb 25 12:00:47 2004 @@ -25,6 +25,8 @@ cpqphp_ctrl.o \ cpqphp_sysfs.o \ cpqphp_pci.o +cpqphp-$(CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM) += cpqphp_nvram.o +cpqphp-objs += $(cpqphp-y) ibmphp-objs := ibmphp_core.o \ ibmphp_ebda.o \ @@ -49,37 +51,24 @@ pciehp_sysfs.o \ pciehp_hpc.o -shpchp-objs := shpchp_core.o \ - shpchp_ctrl.o \ - shpchp_pci.o \ - shpchp_sysfs.o \ - shpchp_hpc.o - -ifdef CONFIG_HOTPLUG_PCI_ACPI - EXTRA_CFLAGS += -D_LINUX -I$(TOPDIR)/drivers/acpi - ifdef CONFIG_ACPI_DEBUG - EXTRA_CFLAGS += -DACPI_DEBUG_OUTPUT - endif -endif - -ifeq ($(CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM),y) - cpqphp-objs += cpqphp_nvram.o -endif - ifeq ($(CONFIG_HOTPLUG_PCI_PCIE_PHPRM_NONACPI),y) pciehp-objs += pciehprm_nonacpi.o else pciehp-objs += pciehprm_acpi.o - EXTRA_CFLAGS += -D_LINUX -I$(TOPDIR)/drivers/acpi -I$(TOPDIR)/drivers/acpi/include endif +shpchp-objs := shpchp_core.o \ + shpchp_ctrl.o \ + shpchp_pci.o \ + shpchp_sysfs.o \ + shpchp_hpc.o + ifeq ($(CONFIG_HOTPLUG_PCI_SHPC_PHPRM_LEGACY),y) shpchp-objs += shpchprm_legacy.o else - ifeq ($(CONFIG_HOTPLUG_PCI_SHPC_PHPRM_NONACPI),y) - shpchp-objs += shpchprm_nonacpi.o - else - shpchp-objs += shpchprm_acpi.o - EXTRA_CFLAGS += -D_LINUX -I$(TOPDIR)/drivers/acpi - endif + ifeq ($(CONFIG_HOTPLUG_PCI_SHPC_PHPRM_NONACPI),y) + shpchp-objs += shpchprm_nonacpi.o + else + shpchp-objs += shpchprm_acpi.o + endif endif diff -Nru a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c --- a/drivers/pci/hotplug/pciehp_ctrl.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/pciehp_ctrl.c Wed Feb 25 12:00:47 2004 @@ -188,11 +188,13 @@ /* * Card Present */ + info("Card present on Slot(%d)\n", ctrl->first_slot + hp_slot); taskInfo->event_type = INT_PRESENCE_ON; } else { /* * Not Present */ + info("Card not present on Slot(%d)\n", ctrl->first_slot + hp_slot); taskInfo->event_type = INT_PRESENCE_OFF; } diff -Nru a/drivers/pci/hotplug/rpaphp.h b/drivers/pci/hotplug/rpaphp.h --- a/drivers/pci/hotplug/rpaphp.h Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/rpaphp.h Wed Feb 25 12:00:47 2004 @@ -54,7 +54,7 @@ #define dbg(format, arg...) \ do { \ - if (rpaphp_debug) \ + if (debug) \ printk(KERN_DEBUG "%s: " format, \ MY_NAME , ## arg); \ } while (0) diff -Nru a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c --- a/drivers/pci/hotplug/rpaphp_core.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/rpaphp_core.c Wed Feb 25 12:00:47 2004 @@ -39,7 +39,7 @@ #include "pci_hotplug.h" -static int debug = 1; +static int debug; static struct semaphore rpaphp_sem; static LIST_HEAD (rpaphp_slot_head); static int num_slots; @@ -837,8 +837,6 @@ int retval = 0; info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); - - rpaphp_debug = debug; /* read all the PRA info from the system */ retval = init_rpa(); diff -Nru a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h --- a/drivers/pci/hotplug/shpchp.h Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/shpchp.h Wed Feb 25 12:00:47 2004 @@ -390,8 +390,8 @@ /* Sleep for up to 1 second */ schedule_timeout(1*HZ); } else { - /* Sleep for up to 1.5 second */ - schedule_timeout(1.5*HZ); + /* Sleep for up to 2 seconds */ + schedule_timeout(2*HZ); } set_current_state(TASK_RUNNING); remove_wait_queue(&ctrl->queue, &wait); diff -Nru a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c --- a/drivers/pci/hotplug/shpchp_ctrl.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/shpchp_ctrl.c Wed Feb 25 12:00:47 2004 @@ -192,11 +192,13 @@ /* * Card Present */ + info("Card present on Slot(%d)\n", ctrl->first_slot + hp_slot); taskInfo->event_type = INT_PRESENCE_ON; } else { /* * Not Present */ + info("Card not present on Slot(%d)\n", ctrl->first_slot + hp_slot); taskInfo->event_type = INT_PRESENCE_OFF; } diff -Nru a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c --- a/drivers/pci/hotplug/shpchp_hpc.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/hotplug/shpchp_hpc.c Wed Feb 25 12:00:47 2004 @@ -1071,9 +1071,14 @@ if (!shpchp_poll_mode) { ctrl = (struct controller *)dev_id; php_ctlr = ctrl->hpc_ctlr_handle; - } else + } else { php_ctlr = (struct php_ctlr_state_s *) dev_id; + ctrl = (struct controller *)php_ctlr->callback_instance_id; + } + if (!ctrl) + return IRQ_NONE; + if (!php_ctlr || !php_ctlr->creg) return IRQ_NONE; @@ -1085,18 +1090,20 @@ dbg("%s: shpc_isr proceeds\n", __FUNCTION__); dbg("%s: intr_loc = %x\n",__FUNCTION__, intr_loc); - /* Mask Global Interrupt Mask - see implementation note on p. 139 */ - /* of SHPC spec rev 1.0*/ - temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - dbg("%s: Before masking global interrupt, temp_dword = %x\n", - __FUNCTION__, temp_dword); - temp_dword |= 0x00000001; - dbg("%s: After masking global interrupt, temp_dword = %x\n", - __FUNCTION__, temp_dword); - writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + if(!shpchp_poll_mode) { + /* Mask Global Interrupt Mask - see implementation note on p. 139 */ + /* of SHPC spec rev 1.0*/ + temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + dbg("%s: Before masking global interrupt, temp_dword = %x\n", + __FUNCTION__, temp_dword); + temp_dword |= 0x00000001; + dbg("%s: After masking global interrupt, temp_dword = %x\n", + __FUNCTION__, temp_dword); + writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); - intr_loc2 = readl(php_ctlr->creg + INTR_LOC); - dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); + intr_loc2 = readl(php_ctlr->creg + INTR_LOC); + dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); + } if (intr_loc & 0x0001) { /* @@ -1159,14 +1166,16 @@ dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); } } - /* Unmask Global Interrupt Mask */ - temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - dbg("%s: 2-Before unmasking global interrupt, temp_dword = %x\n", - __FUNCTION__, temp_dword); - temp_dword &= 0xfffffffe; - dbg("%s: 2-After unmasking global interrupt, temp_dword = %x\n", - __FUNCTION__, temp_dword); - writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + if (!shpchp_poll_mode) { + /* Unmask Global Interrupt Mask */ + temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + dbg("%s: 2-Before unmasking global interrupt, temp_dword = %x\n", + __FUNCTION__, temp_dword); + temp_dword &= 0xfffffffe; + dbg("%s: 2-After unmasking global interrupt, temp_dword = %x\n", + __FUNCTION__, temp_dword); + writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + } return IRQ_HANDLED; } diff -Nru a/drivers/pci/pci.c b/drivers/pci/pci.c --- a/drivers/pci/pci.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/pci.c Wed Feb 25 12:00:47 2004 @@ -535,11 +535,6 @@ return 0; err_out: - printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", - pci_resource_flags(pdev, i) & IORESOURCE_IO ? "I/O" : "mem", - i + 1, /* PCI BAR # */ - pci_resource_len(pdev, i), pci_resource_start(pdev, i), - pci_name(pdev)); while(--i >= 0) pci_release_region(pdev, i); diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c --- a/drivers/pci/probe.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/probe.c Wed Feb 25 12:00:47 2004 @@ -366,6 +366,8 @@ child = pci_alloc_child_bus(bus, dev, busnr); child->primary = buses & 0xFF; child->subordinate = (buses >> 16) & 0xFF; + child->bridge_ctl = bctl; + cmax = pci_scan_child_bus(child); if (cmax > max) max = cmax; } else { @@ -400,6 +402,8 @@ pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses); if (!is_cardbus) { + child->bridge_ctl = PCI_BRIDGE_CTL_NO_ISA; + /* Now we can scan all subordinate buses... */ max = pci_scan_child_bus(child); } else { diff -Nru a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c --- a/drivers/pci/setup-bus.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/setup-bus.c Wed Feb 25 12:00:47 2004 @@ -43,13 +43,15 @@ #define CARDBUS_IO_SIZE (4096) #define CARDBUS_MEM_SIZE (32*1024*1024) -static int __devinit +static void __devinit pbus_assign_resources_sorted(struct pci_bus *bus) { struct pci_dev *dev; struct resource *res; struct resource_list head, *list, *tmp; - int idx, found_vga = 0; + int idx; + + bus->bridge_ctl &= ~PCI_BRIDGE_CTL_VGA; head.next = NULL; list_for_each_entry(dev, &bus->devices, bus_list) { @@ -57,7 +59,7 @@ if (class == PCI_CLASS_DISPLAY_VGA || class == PCI_CLASS_NOT_DEFINED_VGA) - found_vga = 1; + bus->bridge_ctl |= PCI_BRIDGE_CTL_VGA; pdev_sort_resources(dev, &head); } @@ -70,8 +72,6 @@ list = list->next; kfree(tmp); } - - return found_vga; } static void __devinit @@ -211,10 +211,7 @@ /* Clear out the upper 32 bits of PREF base. */ pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 0); - /* Check if we have VGA behind the bridge. - Enable ISA in either case (FIXME!). */ - l = (bus->resource[0]->flags & IORESOURCE_BUS_HAS_VGA) ? 0x0c : 0x04; - pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, l); + pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); } /* Check whether the bridge supports optional I/O and @@ -498,13 +495,14 @@ pci_bus_assign_resources(struct pci_bus *bus) { struct pci_bus *b; - int found_vga = pbus_assign_resources_sorted(bus); struct pci_dev *dev; - if (found_vga) { + pbus_assign_resources_sorted(bus); + + if (bus->bridge_ctl & PCI_BRIDGE_CTL_VGA) { /* Propagate presence of the VGA to upstream bridges */ for (b = bus; b->parent; b = b->parent) { - b->resource[0]->flags |= IORESOURCE_BUS_HAS_VGA; + b->bridge_ctl |= PCI_BRIDGE_CTL_VGA; } } list_for_each_entry(dev, &bus->devices, bus_list) { diff -Nru a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c --- a/drivers/pci/setup-res.c Wed Feb 25 12:00:47 2004 +++ b/drivers/pci/setup-res.c Wed Feb 25 12:00:47 2004 @@ -143,8 +143,9 @@ } if (ret) { - printk(KERN_ERR "PCI: Failed to allocate resource %d(%lx-%lx) for %s\n", - resno, res->start, res->end, pci_name(dev)); + printk(KERN_ERR "PCI: Failed to allocate %s resource #%d:%lx@%lx for %s\n", + res->flags & IORESOURCE_IO ? "I/O" : "mem", + resno, size, res->start, pci_name(dev)); } else if (resno < PCI_BRIDGE_RESOURCES) { pci_update_resource(dev, res, resno); } diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Wed Feb 25 12:00:47 2004 +++ b/include/linux/pci.h Wed Feb 25 12:00:47 2004 @@ -468,6 +468,8 @@ char name[48]; + unsigned short bridge_ctl; /* manage NO_ISA/FBB/et al behaviors */ + unsigned short pad2; struct device *bridge; struct class_device class_dev; };