From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> To: linux-kernel@vger.kernel.org Cc: sodaville@linutronix.de, x86@kernel.org, devicetree-discuss@lists.ozlabs.org, Sebastian Andrzej Siewior <bigeasy@linutronix.de>, Dirk Brandewie <dirk.brandewie@gmail.com> Subject: [PATCH TIP 05/14] x86/dtb: add early parsing of APIC and IO APIC Date: Mon, 24 Jan 2011 09:58:53 +0530 [thread overview] Message-ID: <1295843342-1122-6-git-send-email-bigeasy@linutronix.de> (raw) In-Reply-To: <1295843342-1122-1-git-send-email-bigeasy@linutronix.de> The apic & ioapic have to be added to system early because native_init_IRQ() requires it. In order to obtain the address of the ioapic the device tree has to be unflattened because of_address_to_resource() has to work. The device tree is relocated to ensure it is always covered by the kernel and the boot loader does not have to make assumptions about kernel's memory layout. Cc: devicetree-discuss@lists.ozlabs.org Cc: Dirk Brandewie <dirk.brandewie@gmail.com> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- arch/x86/include/asm/prom.h | 7 +++ arch/x86/kernel/irqinit.c | 2 +- arch/x86/kernel/prom.c | 112 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 117 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h index ed7bb62..bd67ab2 100644 --- a/arch/x86/include/asm/prom.h +++ b/arch/x86/include/asm/prom.h @@ -22,10 +22,17 @@ #include <asm/irq_controller.h> #ifdef CONFIG_OF +extern int of_ioapic; +extern u64 initial_dtb; extern void add_dtb(u64 data); +void x86_dtb_find_config(void); +void x86_dtb_get_config(unsigned int unused); void add_interrupt_host(struct irq_domain *ih); #else static inline void add_dtb(u64 data) { } +#define x86_dtb_find_config x86_init_noop +#define x86_dtb_get_config x86_init_uint_noop +#define of_ioapic 0 #endif extern char cmd_line[COMMAND_LINE_SIZE]; diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index 149c87f..4cadf86 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c @@ -244,7 +244,7 @@ void __init native_init_IRQ(void) set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]); } - if (!acpi_ioapic) + if (!acpi_ioapic && !of_ioapic) setup_irq(2, &irq2); #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/prom.c b/arch/x86/kernel/prom.c index 95f9551..e4d53bf 100644 --- a/arch/x86/kernel/prom.c +++ b/arch/x86/kernel/prom.c @@ -6,15 +6,20 @@ #include <linux/interrupt.h> #include <linux/list.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/of_platform.h> #include <linux/slab.h> #include <asm/irq_controller.h> +#include <asm/io_apic.h> +__initdata u64 initial_dtb; char __initdata cmd_line[COMMAND_LINE_SIZE]; static LIST_HEAD(irq_domains); static DEFINE_RAW_SPINLOCK(big_irq_lock); +int __initdata of_ioapic; + void add_interrupt_host(struct irq_domain *ih) { unsigned long flags; @@ -90,7 +95,108 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) void __init add_dtb(u64 data) { - initial_boot_params = (struct boot_param_header *) - phys_to_virt((u64) (u32) data + - offsetof(struct setup_data, data)); + initial_dtb = data + offsetof(struct setup_data, data); +} + +static void __init dtb_lapic_setup(void) +{ +#ifdef CONFIG_X86_LOCAL_APIC + if (apic_force_enable()) + return; + + smp_found_config = 1; + pic_mode = 1; + /* Required for ioapic registration */ + set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr); + if (boot_cpu_physical_apicid == -1U) + boot_cpu_physical_apicid = read_apic_id(); + + generic_processor_info(boot_cpu_physical_apicid, + GET_APIC_VERSION(apic_read(APIC_LVR))); +#endif +} + +#ifdef CONFIG_X86_IO_APIC +static unsigned int ioapic_id; + +static void __init dtb_add_ioapic(struct device_node *dn) +{ + struct resource r; + int ret; + + ret = of_address_to_resource(dn, 0, &r); + if (ret) { + printk(KERN_ERR "Can't obtain address from node %s.\n", + dn->full_name); + return; + } + mp_register_ioapic(++ioapic_id, r.start, gsi_top); +} + +static void __init dtb_ioapic_setup(void) +{ + struct device_node *dn; + + if (!smp_found_config) + return; + + for_each_compatible_node(dn, NULL, "intel,ioapic") + dtb_add_ioapic(dn); + + if (nr_ioapics) { + of_ioapic = 1; + return; + } + printk(KERN_ERR "Error: No information about IO-APIC in OF.\n"); + smp_found_config = 0; +} +#else +static void __init dtb_ioapic_setup(void) {} +#endif + +static void __init dtb_apic_setup(void) +{ + dtb_lapic_setup(); + dtb_ioapic_setup(); +} + +void __init x86_dtb_find_config(void) +{ + if (initial_dtb) + smp_found_config = 1; + else + printk(KERN_ERR "Missing device tree!.\n"); +} + +void __init x86_dtb_get_config(unsigned int unused) +{ + u32 size; + u32 map_len; + void *new_dtb; + + if (!initial_dtb) + return; + + map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), + (u64)sizeof(struct boot_param_header)); + + initial_boot_params = early_memremap(initial_dtb, map_len); + size = be32_to_cpu(initial_boot_params->totalsize); + if (map_len < size) { + early_iounmap(initial_boot_params, map_len); + initial_boot_params = early_memremap(initial_dtb, size); + map_len = size; + } + + new_dtb = alloc_bootmem(size); + memcpy(new_dtb, initial_boot_params, size); + early_iounmap(initial_boot_params, map_len); + + initial_boot_params = new_dtb; + + /* root level address cells */ + of_scan_flat_dt(early_init_dt_scan_root, NULL); + + unflatten_device_tree(); + dtb_apic_setup(); } -- 1.7.3.2
WARNING: multiple messages have this Message-ID (diff)
From: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: sodaville-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> Subject: [PATCH TIP 05/14] x86/dtb: add early parsing of APIC and IO APIC Date: Mon, 24 Jan 2011 09:58:53 +0530 [thread overview] Message-ID: <1295843342-1122-6-git-send-email-bigeasy@linutronix.de> (raw) In-Reply-To: <1295843342-1122-1-git-send-email-bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> The apic & ioapic have to be added to system early because native_init_IRQ() requires it. In order to obtain the address of the ioapic the device tree has to be unflattened because of_address_to_resource() has to work. The device tree is relocated to ensure it is always covered by the kernel and the boot loader does not have to make assumptions about kernel's memory layout. Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Cc: Dirk Brandewie <dirk.brandewie-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> --- arch/x86/include/asm/prom.h | 7 +++ arch/x86/kernel/irqinit.c | 2 +- arch/x86/kernel/prom.c | 112 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 117 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h index ed7bb62..bd67ab2 100644 --- a/arch/x86/include/asm/prom.h +++ b/arch/x86/include/asm/prom.h @@ -22,10 +22,17 @@ #include <asm/irq_controller.h> #ifdef CONFIG_OF +extern int of_ioapic; +extern u64 initial_dtb; extern void add_dtb(u64 data); +void x86_dtb_find_config(void); +void x86_dtb_get_config(unsigned int unused); void add_interrupt_host(struct irq_domain *ih); #else static inline void add_dtb(u64 data) { } +#define x86_dtb_find_config x86_init_noop +#define x86_dtb_get_config x86_init_uint_noop +#define of_ioapic 0 #endif extern char cmd_line[COMMAND_LINE_SIZE]; diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index 149c87f..4cadf86 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c @@ -244,7 +244,7 @@ void __init native_init_IRQ(void) set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]); } - if (!acpi_ioapic) + if (!acpi_ioapic && !of_ioapic) setup_irq(2, &irq2); #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/prom.c b/arch/x86/kernel/prom.c index 95f9551..e4d53bf 100644 --- a/arch/x86/kernel/prom.c +++ b/arch/x86/kernel/prom.c @@ -6,15 +6,20 @@ #include <linux/interrupt.h> #include <linux/list.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/of_platform.h> #include <linux/slab.h> #include <asm/irq_controller.h> +#include <asm/io_apic.h> +__initdata u64 initial_dtb; char __initdata cmd_line[COMMAND_LINE_SIZE]; static LIST_HEAD(irq_domains); static DEFINE_RAW_SPINLOCK(big_irq_lock); +int __initdata of_ioapic; + void add_interrupt_host(struct irq_domain *ih) { unsigned long flags; @@ -90,7 +95,108 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) void __init add_dtb(u64 data) { - initial_boot_params = (struct boot_param_header *) - phys_to_virt((u64) (u32) data + - offsetof(struct setup_data, data)); + initial_dtb = data + offsetof(struct setup_data, data); +} + +static void __init dtb_lapic_setup(void) +{ +#ifdef CONFIG_X86_LOCAL_APIC + if (apic_force_enable()) + return; + + smp_found_config = 1; + pic_mode = 1; + /* Required for ioapic registration */ + set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr); + if (boot_cpu_physical_apicid == -1U) + boot_cpu_physical_apicid = read_apic_id(); + + generic_processor_info(boot_cpu_physical_apicid, + GET_APIC_VERSION(apic_read(APIC_LVR))); +#endif +} + +#ifdef CONFIG_X86_IO_APIC +static unsigned int ioapic_id; + +static void __init dtb_add_ioapic(struct device_node *dn) +{ + struct resource r; + int ret; + + ret = of_address_to_resource(dn, 0, &r); + if (ret) { + printk(KERN_ERR "Can't obtain address from node %s.\n", + dn->full_name); + return; + } + mp_register_ioapic(++ioapic_id, r.start, gsi_top); +} + +static void __init dtb_ioapic_setup(void) +{ + struct device_node *dn; + + if (!smp_found_config) + return; + + for_each_compatible_node(dn, NULL, "intel,ioapic") + dtb_add_ioapic(dn); + + if (nr_ioapics) { + of_ioapic = 1; + return; + } + printk(KERN_ERR "Error: No information about IO-APIC in OF.\n"); + smp_found_config = 0; +} +#else +static void __init dtb_ioapic_setup(void) {} +#endif + +static void __init dtb_apic_setup(void) +{ + dtb_lapic_setup(); + dtb_ioapic_setup(); +} + +void __init x86_dtb_find_config(void) +{ + if (initial_dtb) + smp_found_config = 1; + else + printk(KERN_ERR "Missing device tree!.\n"); +} + +void __init x86_dtb_get_config(unsigned int unused) +{ + u32 size; + u32 map_len; + void *new_dtb; + + if (!initial_dtb) + return; + + map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), + (u64)sizeof(struct boot_param_header)); + + initial_boot_params = early_memremap(initial_dtb, map_len); + size = be32_to_cpu(initial_boot_params->totalsize); + if (map_len < size) { + early_iounmap(initial_boot_params, map_len); + initial_boot_params = early_memremap(initial_dtb, size); + map_len = size; + } + + new_dtb = alloc_bootmem(size); + memcpy(new_dtb, initial_boot_params, size); + early_iounmap(initial_boot_params, map_len); + + initial_boot_params = new_dtb; + + /* root level address cells */ + of_scan_flat_dt(early_init_dt_scan_root, NULL); + + unflatten_device_tree(); + dtb_apic_setup(); } -- 1.7.3.2
next prev parent reply other threads:[~2011-01-24 4:32 UTC|newest] Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-01-24 4:28 Device tree on x86, part v3 Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-24 4:28 ` [PATCH TIP 01/14] x86/e820: remove conditional early mapping in parse_e820_ext Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-02-03 20:57 ` Grant Likely 2011-01-24 4:28 ` [PATCH TIP 02/14] x86: Add device tree support Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-24 4:34 ` Sebastian Andrzej Siewior 2011-01-24 4:34 ` Sebastian Andrzej Siewior 2011-02-16 21:27 ` Grant Likely 2011-02-16 21:27 ` Grant Likely 2011-02-17 11:05 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-17 11:05 ` Sebastian Andrzej Siewior 2011-02-16 21:26 ` Grant Likely 2011-02-17 11:03 ` Sebastian Andrzej Siewior 2011-02-17 11:03 ` Sebastian Andrzej Siewior 2011-02-16 21:31 ` Grant Likely 2011-02-16 21:31 ` Grant Likely 2011-02-17 11:31 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-17 11:31 ` Sebastian Andrzej Siewior 2011-02-17 17:02 ` Grant Likely 2011-01-24 4:28 ` [PATCH TIP 03/14] x86/dtb: Add a device tree for CE4100 Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-27 5:00 ` David Gibson 2011-01-27 5:00 ` David Gibson 2011-01-27 9:11 ` Sebastian Andrzej Siewior 2011-01-27 9:11 ` Sebastian Andrzej Siewior 2011-02-03 20:59 ` Grant Likely 2011-02-03 21:32 ` Mitch Bradley 2011-02-03 21:32 ` Mitch Bradley 2011-02-04 9:40 ` Sebastian Andrzej Siewior 2011-02-04 9:40 ` Sebastian Andrzej Siewior 2011-02-02 18:58 ` [PATCH TIP v2 " Sebastian Andrzej Siewior 2011-02-02 18:58 ` Sebastian Andrzej Siewior 2011-02-03 21:07 ` Grant Likely 2011-02-03 21:07 ` Grant Likely 2011-02-04 10:06 ` Sebastian Andrzej Siewior 2011-02-04 10:06 ` Sebastian Andrzej Siewior 2011-02-16 21:44 ` Grant Likely 2011-02-16 21:44 ` Grant Likely 2011-02-22 11:21 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-22 11:21 ` Sebastian Andrzej Siewior 2011-01-24 4:28 ` [PATCH TIP 04/14] x86/dtb: add irq domain abstraction Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior [this message] 2011-01-24 4:28 ` [PATCH TIP 05/14] x86/dtb: add early parsing of APIC and IO APIC Sebastian Andrzej Siewior 2011-02-16 21:47 ` Grant Likely 2011-02-16 21:47 ` Grant Likely 2011-01-24 4:28 ` [PATCH TIP 06/14] x86/dtb: add support hpet Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-24 4:28 ` [PATCH OF 07/14] of: move of_irq_map_pci() into generic code Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-02-10 13:57 ` Michal Simek 2011-02-16 21:53 ` Grant Likely 2011-02-16 21:53 ` Grant Likely 2011-02-17 7:49 ` Michal Simek 2011-02-17 7:49 ` Michal Simek 2011-02-17 7:49 ` Michal Simek 2011-01-24 4:28 ` [PATCH TIP 08/14] x86/dtb: add support for PCI devices backed by dtb nodes Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-02-16 21:59 ` Grant Likely 2011-02-16 21:59 ` Grant Likely 2011-02-22 11:21 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-22 11:21 ` Sebastian Andrzej Siewior 2011-01-24 4:28 ` [PATCH TIP 09/14] x86/dtb: Add generic bus probe Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-02-04 10:21 ` [PATCH v2 " Sebastian Andrzej Siewior 2011-02-04 10:21 ` Sebastian Andrzej Siewior 2011-02-16 22:04 ` Grant Likely 2011-02-16 22:04 ` Grant Likely 2011-01-24 4:28 ` [PATCH TIP 10/14] x86/ioapic: Add OF bindings for IO-APIC Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-02-16 22:04 ` Grant Likely 2011-01-24 4:28 ` [PATCH TIP 11/14] x86/ce4100: use OF for ioapic Sebastian Andrzej Siewior 2011-01-24 4:28 ` Sebastian Andrzej Siewior 2011-01-24 4:29 ` [PATCH OF 12/14] x86/rtc: don't register rtc if we the DT blob Sebastian Andrzej Siewior 2011-01-24 4:29 ` Sebastian Andrzej Siewior 2011-02-16 22:08 ` Grant Likely 2011-02-16 22:08 ` Grant Likely 2011-02-16 22:09 ` Grant Likely 2011-02-16 22:09 ` Grant Likely 2011-02-17 13:13 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-17 13:13 ` Sebastian Andrzej Siewior 2011-01-24 4:29 ` [PATCH OF 13/14] rtc/cmos: add OF bindings Sebastian Andrzej Siewior 2011-01-24 4:29 ` Sebastian Andrzej Siewior 2011-01-24 4:38 ` Sebastian Andrzej Siewior 2011-01-24 4:38 ` Sebastian Andrzej Siewior 2011-02-16 22:11 ` Grant Likely 2011-02-16 22:11 ` Grant Likely 2011-02-17 13:26 ` [sodaville] " Sebastian Andrzej Siewior 2011-02-17 13:26 ` Sebastian Andrzej Siewior 2011-02-17 16:46 ` Grant Likely 2011-01-24 4:29 ` [PATCH TIP 14/14] x86/pci: remove warning Sebastian Andrzej Siewior 2011-01-24 4:29 ` Sebastian Andrzej Siewior
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=1295843342-1122-6-git-send-email-bigeasy@linutronix.de \ --to=bigeasy@linutronix.de \ --cc=devicetree-discuss@lists.ozlabs.org \ --cc=dirk.brandewie@gmail.com \ --cc=linux-kernel@vger.kernel.org \ --cc=sodaville@linutronix.de \ --cc=x86@kernel.org \ /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: linkBe 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.