* [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
@ 2005-04-21 13:39 Kenji Kaneshige
2005-04-21 17:22 ` [ACPI] " Bjorn Helgaas
0 siblings, 1 reply; 6+ messages in thread
From: Kenji Kaneshige @ 2005-04-21 13:39 UTC (permalink / raw)
To: Andrew Morton, Len Brown, Luck, Tony, Greg KH, acpi-devel,
linux-ia64, pcihpd-discuss
This patch adds PCI based I/O xAPIC hot-add support to ACPIPHP
driver. When PCI root bridge is hot-added, all PCI based I/O xAPICs
under the root bridge are hot-added by this patch. Hot-remove support
is TBD.
Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
---
linux-2.6.12-rc2-mm3-kanesige/drivers/pci/hotplug/acpiphp_glue.c | 120 ++++++++++
1 files changed, 120 insertions(+)
diff -puN drivers/pci/hotplug/acpiphp_glue.c~acpiphp_ioapic_add drivers/pci/hotplug/acpiphp_glue.c
--- linux-2.6.12-rc2-mm3/drivers/pci/hotplug/acpiphp_glue.c~acpiphp_ioapic_add 2005-04-20 10:51:56.000000000 +0900
+++ linux-2.6.12-rc2-mm3-kanesige/drivers/pci/hotplug/acpiphp_glue.c 2005-04-21 19:18:05.000000000 +0900
@@ -552,6 +552,125 @@ static void remove_bridge(acpi_handle ha
}
}
+static struct pci_dev *get_apic_pci_info(acpi_handle handle)
+{
+ struct acpi_pci_id id;
+ struct pci_bus *bus;
+ struct pci_dev *dev;
+
+ if (ACPI_FAILURE(acpi_get_pci_id(handle, &id)))
+ return NULL;
+
+ bus = pci_find_bus(id.segment, id.bus);
+ if (!bus)
+ return NULL;
+
+ list_for_each_entry(dev, &bus->devices, bus_list) {
+ if (dev->devfn != PCI_DEVFN(id.device, id.function))
+ continue;
+ if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
+ continue;
+ if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
+ return dev;
+ }
+ return NULL;
+}
+
+static int get_gsi_base(acpi_handle handle, u32 *gsi_base)
+{
+ acpi_status status;
+ int result = -1;
+ unsigned long gsb;
+ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+ union acpi_object *obj;
+ void *table;
+
+ status = acpi_evaluate_integer(handle, "_GSB", NULL, &gsb);
+ if (ACPI_SUCCESS(status)) {
+ *gsi_base = (u32)gsb;
+ return 0;
+ }
+
+ status = acpi_evaluate_object(handle, "_MAT", NULL, &buffer);
+ if (ACPI_FAILURE(status) || !buffer.length || !buffer.pointer)
+ return result;
+
+ obj = buffer.pointer;
+ if (obj->type != ACPI_TYPE_BUFFER)
+ goto out;
+
+ table = obj->buffer.pointer;
+ switch (((acpi_table_entry_header *)table)->type) {
+ case ACPI_MADT_IOSAPIC:
+ *gsi_base = ((struct acpi_table_iosapic *)table)->global_irq_base;
+ result = 0;
+ break;
+ case ACPI_MADT_IOAPIC:
+ *gsi_base = ((struct acpi_table_ioapic *)table)->global_irq_base;
+ result = 0;
+ break;
+ default:
+ break;
+ }
+ out:
+ acpi_os_free(buffer.pointer);
+ return result;
+}
+
+static acpi_status
+ioapic_add(acpi_handle handle, u32 lvl, void *context, void **rv)
+{
+ acpi_status status;
+ unsigned long sta;
+ acpi_handle tmp;
+ struct pci_dev *pdev;
+ u32 gsi_base;
+ u64 phys_addr;
+
+ /* Evaluate _STA if present */
+ status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
+ if (ACPI_SUCCESS(status) && sta != ACPI_STA_ALL)
+ return AE_CTRL_DEPTH;
+
+ /* Scan only PCI bus scope */
+ status = acpi_get_handle(handle, "_HID", &tmp);
+ if (ACPI_SUCCESS(status))
+ return AE_CTRL_DEPTH;
+
+ pdev = get_apic_pci_info(handle);
+ if (!pdev)
+ return AE_OK;
+
+ if (get_gsi_base(handle, &gsi_base))
+ return AE_OK;
+
+ if (pci_enable_device(pdev))
+ return AE_OK;
+
+ pci_set_master(pdev);
+
+ if (pci_request_region(pdev, 0, "I/O APIC(acpiphp)")) {
+ pci_disable_device(pdev);
+ return AE_OK;
+ }
+
+ phys_addr = pci_resource_start(pdev, 0);
+ if (acpi_register_ioapic(handle, phys_addr, gsi_base)) {
+ pci_release_region(pdev, 0);
+ pci_disable_device(pdev);
+ return AE_OK;
+ }
+
+ return AE_OK;
+}
+
+static int acpiphp_configure_ioapics(acpi_handle handle)
+{
+ acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
+ ACPI_UINT32_MAX, ioapic_add, NULL, NULL);
+ return 0;
+}
+
static int power_on_slot(struct acpiphp_slot *slot)
{
acpi_status status;
@@ -942,6 +1061,7 @@ static int acpiphp_configure_bridge (acp
acpiphp_sanitize_bus(bus);
acpiphp_set_hpp_values(handle, bus);
pci_enable_bridges(bus);
+ acpiphp_configure_ioapics(handle);
return 0;
}
_
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ACPI] [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
2005-04-21 13:39 [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug Kenji Kaneshige
@ 2005-04-21 17:22 ` Bjorn Helgaas
2005-04-22 6:38 ` Kenji Kaneshige
0 siblings, 1 reply; 6+ messages in thread
From: Bjorn Helgaas @ 2005-04-21 17:22 UTC (permalink / raw)
To: Kenji Kaneshige
Cc: Andrew Morton, Len Brown, Luck, Tony, Greg KH, acpi-devel,
linux-ia64, pcihpd-discuss
> +static struct pci_dev *get_apic_pci_info(acpi_handle handle)
Nitpick: follow function declaration style of file.
> + struct acpi_pci_id id;
> + struct pci_bus *bus;
> + struct pci_dev *dev;
> +
> + if (ACPI_FAILURE(acpi_get_pci_id(handle, &id)))
> + return NULL;
> +
> + bus = pci_find_bus(id.segment, id.bus);
> + if (!bus)
> + return NULL;
> +
> + list_for_each_entry(dev, &bus->devices, bus_list) {
> + if (dev->devfn != PCI_DEVFN(id.device, id.function))
> + continue;
Use pci_get_slot() here rather than walking bus->devices yourself.
> + if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
> + continue;
> + if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
What are 0x10 and 0x20? Looks like they should be #defines in
include/linux/pci_ids.h.
> +static int get_gsi_base(acpi_handle handle, u32 *gsi_base)
> +{
> + acpi_status status;
> + int result = -1;
> + unsigned long gsb;
> + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
> + union acpi_object *obj;
> + void *table;
> +
> + status = acpi_evaluate_integer(handle, "_GSB", NULL, &gsb);
> + if (ACPI_SUCCESS(status)) {
> + *gsi_base = (u32)gsb;
> + return 0;
> + }
> +
> + status = acpi_evaluate_object(handle, "_MAT", NULL, &buffer);
> + if (ACPI_FAILURE(status) || !buffer.length || !buffer.pointer)
> + return result;
Nothing can modify result before this point, so it'd be clearer
to just "return -1" here.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ACPI] [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
2005-04-21 17:22 ` [ACPI] " Bjorn Helgaas
@ 2005-04-22 6:38 ` Kenji Kaneshige
2005-04-22 14:58 ` Bjorn Helgaas
0 siblings, 1 reply; 6+ messages in thread
From: Kenji Kaneshige @ 2005-04-22 6:38 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Andrew Morton, Len Brown, Luck, Tony, Greg KH, acpi-devel,
linux-ia64, pcihpd-discuss
Bjorn Helgaas wrote:
>
>>+ if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
>>+ continue;
>>+ if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
>
>
> What are 0x10 and 0x20? Looks like they should be #defines in
> include/linux/pci_ids.h.
0x10 and 0x20 are programing interfaces for I/O APIC and I/O xAPIC
respectively. #define for these values looks good. But I don't know
if I can put new #defines into pci_ids.h and how to name them because
I could not find the header file (including pci_ids.h) that #defines
the values for programming interfaces. So I want to add the comments
to explain these values (0x10, 0x20) instead of adding new #defines into
pci_ids.h for now.
Thanks,
Kenji Kaneshige
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ACPI] [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
2005-04-22 6:38 ` Kenji Kaneshige
@ 2005-04-22 14:58 ` Bjorn Helgaas
2005-04-22 15:15 ` Greg KH
2005-04-25 9:16 ` [ACPI] " Kenji Kaneshige
0 siblings, 2 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2005-04-22 14:58 UTC (permalink / raw)
To: Kenji Kaneshige
Cc: Andrew Morton, Len Brown, Luck, Tony, Greg KH, acpi-devel,
linux-ia64, pcihpd-discuss
On Fri, 2005-04-22 at 15:38 +0900, Kenji Kaneshige wrote:
> Bjorn Helgaas wrote:
> >
> >>+ if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
> >>+ continue;
> >>+ if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
> >
> >
> > What are 0x10 and 0x20? Looks like they should be #defines in
> > include/linux/pci_ids.h.
>
> 0x10 and 0x20 are programing interfaces for I/O APIC and I/O xAPIC
> respectively. #define for these values looks good. But I don't know
> if I can put new #defines into pci_ids.h and how to name them because
> I could not find the header file (including pci_ids.h) that #defines
> the values for programming interfaces. So I want to add the comments
> to explain these values (0x10, 0x20) instead of adding new #defines into
> pci_ids.h for now.
I think your patch should just add the values to pci_ids.h. If
somebody doesn't like that, he or she will complain and you can fall
back to just using 0x10 and 0x20. But I suspect it will be fine.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
2005-04-22 14:58 ` Bjorn Helgaas
@ 2005-04-22 15:15 ` Greg KH
2005-04-25 9:16 ` [ACPI] " Kenji Kaneshige
1 sibling, 0 replies; 6+ messages in thread
From: Greg KH @ 2005-04-22 15:15 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Kenji Kaneshige, Andrew Morton, Len Brown, Luck, Tony,
acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
linux-ia64-u79uwXL29TY76Z2rM5mHXA,
pcihpd-discuss-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
On Fri, Apr 22, 2005 at 08:58:01AM -0600, Bjorn Helgaas wrote:
> On Fri, 2005-04-22 at 15:38 +0900, Kenji Kaneshige wrote:
> > Bjorn Helgaas wrote:
> > >
> > >>+ if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
> > >>+ continue;
> > >>+ if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
> > >
> > >
> > > What are 0x10 and 0x20? Looks like they should be #defines in
> > > include/linux/pci_ids.h.
> >
> > 0x10 and 0x20 are programing interfaces for I/O APIC and I/O xAPIC
> > respectively. #define for these values looks good. But I don't know
> > if I can put new #defines into pci_ids.h and how to name them because
> > I could not find the header file (including pci_ids.h) that #defines
> > the values for programming interfaces. So I want to add the comments
> > to explain these values (0x10, 0x20) instead of adding new #defines into
> > pci_ids.h for now.
>
> I think your patch should just add the values to pci_ids.h. If
> somebody doesn't like that, he or she will complain and you can fall
> back to just using 0x10 and 0x20. But I suspect it will be fine.
Yes, I have no problem with that.
thanks,
greg k-h
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [ACPI] [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug
2005-04-22 14:58 ` Bjorn Helgaas
2005-04-22 15:15 ` Greg KH
@ 2005-04-25 9:16 ` Kenji Kaneshige
1 sibling, 0 replies; 6+ messages in thread
From: Kenji Kaneshige @ 2005-04-25 9:16 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Andrew Morton, Len Brown, Luck, Tony, Greg KH, acpi-devel,
linux-ia64, pcihpd-discuss
Bjorn Helgaas wrote:
> On Fri, 2005-04-22 at 15:38 +0900, Kenji Kaneshige wrote:
>
>>Bjorn Helgaas wrote:
>>
>>>>+ if ((dev->class >> 8) != PCI_CLASS_SYSTEM_PIC)
>>>>+ continue;
>>>>+ if ((dev->class & 0xff) == 0x10 || (dev->class & 0xff) == 0x20)
>>>
>>>
>>>What are 0x10 and 0x20? Looks like they should be #defines in
>>>include/linux/pci_ids.h.
>>
>>0x10 and 0x20 are programing interfaces for I/O APIC and I/O xAPIC
>>respectively. #define for these values looks good. But I don't know
>>if I can put new #defines into pci_ids.h and how to name them because
>>I could not find the header file (including pci_ids.h) that #defines
>>the values for programming interfaces. So I want to add the comments
>>to explain these values (0x10, 0x20) instead of adding new #defines into
>>pci_ids.h for now.
>
>
> I think your patch should just add the values to pci_ids.h. If
> somebody doesn't like that, he or she will complain and you can fall
> back to just using 0x10 and 0x20. But I suspect it will be fine.
>
>
Thank you for advice. I'll try to add new #defines for I/O APIC
and I/O xAPIC to pci_ids.h.
Thanks,
Kenji Kaneshige
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2005-04-25 9:16 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-21 13:39 [RFC/PATCH 3/3] ACPI based I/O APIC hot-plug Kenji Kaneshige
2005-04-21 17:22 ` [ACPI] " Bjorn Helgaas
2005-04-22 6:38 ` Kenji Kaneshige
2005-04-22 14:58 ` Bjorn Helgaas
2005-04-22 15:15 ` Greg KH
2005-04-25 9:16 ` [ACPI] " Kenji Kaneshige
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox