diff options
-rw-r--r-- | Documentation/devicetree/booting-without-of.txt | 20 | ||||
-rw-r--r-- | arch/x86/Kconfig | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/bootparam.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/irq.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/prom.h | 48 | ||||
-rw-r--r-- | arch/x86/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/x86/kernel/devicetree.c | 51 | ||||
-rw-r--r-- | arch/x86/kernel/irq.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 4 |
9 files changed, 126 insertions, 13 deletions
diff --git a/Documentation/devicetree/booting-without-of.txt b/Documentation/devicetree/booting-without-of.txt index 28b1c9d3d351..55fd2623445b 100644 --- a/Documentation/devicetree/booting-without-of.txt +++ b/Documentation/devicetree/booting-without-of.txt | |||
@@ -13,6 +13,7 @@ Table of Contents | |||
13 | 13 | ||
14 | I - Introduction | 14 | I - Introduction |
15 | 1) Entry point for arch/powerpc | 15 | 1) Entry point for arch/powerpc |
16 | 2) Entry point for arch/x86 | ||
16 | 17 | ||
17 | II - The DT block format | 18 | II - The DT block format |
18 | 1) Header | 19 | 1) Header |
@@ -225,6 +226,25 @@ it with special cases. | |||
225 | cannot support both configurations with Book E and configurations | 226 | cannot support both configurations with Book E and configurations |
226 | with classic Powerpc architectures. | 227 | with classic Powerpc architectures. |
227 | 228 | ||
229 | 2) Entry point for arch/x86 | ||
230 | ------------------------------- | ||
231 | |||
232 | There is one single 32bit entry point to the kernel at code32_start, | ||
233 | the decompressor (the real mode entry point goes to the same 32bit | ||
234 | entry point once it switched into protected mode). That entry point | ||
235 | supports one calling convention which is documented in | ||
236 | Documentation/x86/boot.txt | ||
237 | The physical pointer to the device-tree block (defined in chapter II) | ||
238 | is passed via setup_data which requires at least boot protocol 2.09. | ||
239 | The type filed is defined as | ||
240 | |||
241 | #define SETUP_DTB 2 | ||
242 | |||
243 | This device-tree is used as an extension to the "boot page". As such it | ||
244 | does not parse / consider data which is already covered by the boot | ||
245 | page. This includes memory size, reserved ranges, command line arguments | ||
246 | or initrd address. It simply holds information which can not be retrieved | ||
247 | otherwise like interrupt routing or a list of devices behind an I2C bus. | ||
228 | 248 | ||
229 | II - The DT block format | 249 | II - The DT block format |
230 | ======================== | 250 | ======================== |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index efbae0c7521f..b4c2e9c67623 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -382,6 +382,8 @@ config X86_INTEL_CE | |||
382 | depends on X86_32 | 382 | depends on X86_32 |
383 | depends on X86_EXTENDED_PLATFORM | 383 | depends on X86_EXTENDED_PLATFORM |
384 | select X86_REBOOTFIXUPS | 384 | select X86_REBOOTFIXUPS |
385 | select OF | ||
386 | select OF_EARLY_FLATTREE | ||
385 | ---help--- | 387 | ---help--- |
386 | Select for the Intel CE media processor (CE4100) SOC. | 388 | Select for the Intel CE media processor (CE4100) SOC. |
387 | This option compiles in support for the CE4100 SOC for settop | 389 | This option compiles in support for the CE4100 SOC for settop |
diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h index c8bfe63a06de..e020d88ec02d 100644 --- a/arch/x86/include/asm/bootparam.h +++ b/arch/x86/include/asm/bootparam.h | |||
@@ -12,6 +12,7 @@ | |||
12 | /* setup data types */ | 12 | /* setup data types */ |
13 | #define SETUP_NONE 0 | 13 | #define SETUP_NONE 0 |
14 | #define SETUP_E820_EXT 1 | 14 | #define SETUP_E820_EXT 1 |
15 | #define SETUP_DTB 2 | ||
15 | 16 | ||
16 | /* extensible setup data list node */ | 17 | /* extensible setup data list node */ |
17 | struct setup_data { | 18 | struct setup_data { |
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index c704b38c57a2..ba870bb6dd8e 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
@@ -10,9 +10,6 @@ | |||
10 | #include <asm/apicdef.h> | 10 | #include <asm/apicdef.h> |
11 | #include <asm/irq_vectors.h> | 11 | #include <asm/irq_vectors.h> |
12 | 12 | ||
13 | /* Even though we don't support this, supply it to appease OF */ | ||
14 | static inline void irq_dispose_mapping(unsigned int virq) { } | ||
15 | |||
16 | static inline int irq_canonicalize(int irq) | 13 | static inline int irq_canonicalize(int irq) |
17 | { | 14 | { |
18 | return ((irq == 2) ? 9 : irq); | 15 | return ((irq == 2) ? 9 : irq); |
diff --git a/arch/x86/include/asm/prom.h b/arch/x86/include/asm/prom.h index b4ec95f07518..e46f2a2b57a1 100644 --- a/arch/x86/include/asm/prom.h +++ b/arch/x86/include/asm/prom.h | |||
@@ -1 +1,47 @@ | |||
1 | /* dummy prom.h; here to make linux/of.h's #includes happy */ | 1 | /* |
2 | * Definitions for Device tree / OpenFirmware handling on X86 | ||
3 | * | ||
4 | * based on arch/powerpc/include/asm/prom.h which is | ||
5 | * Copyright (C) 1996-2005 Paul Mackerras. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _ASM_X86_PROM_H | ||
14 | #define _ASM_X86_PROM_H | ||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <linux/of.h> | ||
18 | #include <linux/types.h> | ||
19 | |||
20 | #include <asm/irq.h> | ||
21 | #include <asm/atomic.h> | ||
22 | #include <asm/setup.h> | ||
23 | |||
24 | #ifdef CONFIG_OF | ||
25 | extern void add_dtb(u64 data); | ||
26 | #else | ||
27 | static inline void add_dtb(u64 data) { } | ||
28 | #endif | ||
29 | |||
30 | extern char cmd_line[COMMAND_LINE_SIZE]; | ||
31 | |||
32 | #define pci_address_to_pio pci_address_to_pio | ||
33 | unsigned long pci_address_to_pio(phys_addr_t addr); | ||
34 | |||
35 | /** | ||
36 | * irq_dispose_mapping - Unmap an interrupt | ||
37 | * @virq: linux virq number of the interrupt to unmap | ||
38 | * | ||
39 | * FIXME: We really should implement proper virq handling like power, | ||
40 | * but that's going to be major surgery. | ||
41 | */ | ||
42 | static inline void irq_dispose_mapping(unsigned int virq) { } | ||
43 | |||
44 | #define HAVE_ARCH_DEVTREE_FIXUPS | ||
45 | |||
46 | #endif /* __ASSEMBLY__ */ | ||
47 | #endif | ||
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 34244b2cd880..6ac5036adf42 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -109,6 +109,7 @@ obj-$(CONFIG_MICROCODE) += microcode.o | |||
109 | obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o | 109 | obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o |
110 | 110 | ||
111 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o | 111 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o |
112 | obj-$(CONFIG_OF) += devicetree.o | ||
112 | 113 | ||
113 | ### | 114 | ### |
114 | # 64 bit specific files | 115 | # 64 bit specific files |
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c new file mode 100644 index 000000000000..0b8f0daef933 --- /dev/null +++ b/arch/x86/kernel/devicetree.c | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * Architecture specific OF callbacks. | ||
3 | */ | ||
4 | #include <linux/bootmem.h> | ||
5 | #include <linux/io.h> | ||
6 | #include <linux/list.h> | ||
7 | #include <linux/of.h> | ||
8 | #include <linux/of_fdt.h> | ||
9 | #include <linux/of_platform.h> | ||
10 | #include <linux/slab.h> | ||
11 | |||
12 | char __initdata cmd_line[COMMAND_LINE_SIZE]; | ||
13 | |||
14 | unsigned int irq_create_of_mapping(struct device_node *controller, | ||
15 | const u32 *intspec, unsigned int intsize) | ||
16 | { | ||
17 | return intspec[0]; | ||
18 | |||
19 | } | ||
20 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | ||
21 | |||
22 | unsigned long pci_address_to_pio(phys_addr_t address) | ||
23 | { | ||
24 | /* | ||
25 | * The ioport address can be directly used by inX / outX | ||
26 | */ | ||
27 | BUG_ON(address >= (1 << 16)); | ||
28 | return (unsigned long)address; | ||
29 | } | ||
30 | EXPORT_SYMBOL_GPL(pci_address_to_pio); | ||
31 | |||
32 | void __init early_init_dt_scan_chosen_arch(unsigned long node) | ||
33 | { | ||
34 | BUG(); | ||
35 | } | ||
36 | |||
37 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) | ||
38 | { | ||
39 | BUG(); | ||
40 | } | ||
41 | |||
42 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | ||
43 | { | ||
44 | return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); | ||
45 | } | ||
46 | |||
47 | void __init add_dtb(u64 data) | ||
48 | { | ||
49 | initial_boot_params = phys_to_virt((u64) (u32) data + | ||
50 | offsetof(struct setup_data, data)); | ||
51 | } | ||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 387b6a0c9e81..753136003af1 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -276,15 +276,6 @@ void smp_x86_platform_ipi(struct pt_regs *regs) | |||
276 | 276 | ||
277 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); | 277 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); |
278 | 278 | ||
279 | #ifdef CONFIG_OF | ||
280 | unsigned int irq_create_of_mapping(struct device_node *controller, | ||
281 | const u32 *intspec, unsigned int intsize) | ||
282 | { | ||
283 | return intspec[0]; | ||
284 | } | ||
285 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | ||
286 | #endif | ||
287 | |||
288 | #ifdef CONFIG_HOTPLUG_CPU | 279 | #ifdef CONFIG_HOTPLUG_CPU |
289 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ | 280 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ |
290 | void fixup_irqs(void) | 281 | void fixup_irqs(void) |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 9521483ce58c..33dcbce1ab0f 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -113,6 +113,7 @@ | |||
113 | #endif | 113 | #endif |
114 | #include <asm/mce.h> | 114 | #include <asm/mce.h> |
115 | #include <asm/alternative.h> | 115 | #include <asm/alternative.h> |
116 | #include <asm/prom.h> | ||
116 | 117 | ||
117 | /* | 118 | /* |
118 | * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. | 119 | * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. |
@@ -445,6 +446,9 @@ static void __init parse_setup_data(void) | |||
445 | case SETUP_E820_EXT: | 446 | case SETUP_E820_EXT: |
446 | parse_e820_ext(data); | 447 | parse_e820_ext(data); |
447 | break; | 448 | break; |
449 | case SETUP_DTB: | ||
450 | add_dtb(pa_data); | ||
451 | break; | ||
448 | default: | 452 | default: |
449 | break; | 453 | break; |
450 | } | 454 | } |