Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 234921
b: refs/heads/master
c: da6b737
h: refs/heads/master
i:
  234919: 9d0d4d3
v: v3
  • Loading branch information
Sebastian Andrzej Siewior authored and Thomas Gleixner committed Feb 23, 2011
1 parent cbd7556 commit c03b2cc
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f1c2b357148ec27fcc6ce0992211209a0ea20d8f
refs/heads/master: da6b737b9ab768dd06bb4b0395131d10e524cf83
20 changes: 20 additions & 0 deletions trunk/Documentation/devicetree/booting-without-of.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Table of Contents

I - Introduction
1) Entry point for arch/powerpc
2) Entry point for arch/x86

II - The DT block format
1) Header
Expand Down Expand Up @@ -225,6 +226,25 @@ it with special cases.
cannot support both configurations with Book E and configurations
with classic Powerpc architectures.

2) Entry point for arch/x86
-------------------------------

There is one single 32bit entry point to the kernel at code32_start,
the decompressor (the real mode entry point goes to the same 32bit
entry point once it switched into protected mode). That entry point
supports one calling convention which is documented in
Documentation/x86/boot.txt
The physical pointer to the device-tree block (defined in chapter II)
is passed via setup_data which requires at least boot protocol 2.09.
The type filed is defined as

#define SETUP_DTB 2

This device-tree is used as an extension to the "boot page". As such it
does not parse / consider data which is already covered by the boot
page. This includes memory size, reserved ranges, command line arguments
or initrd address. It simply holds information which can not be retrieved
otherwise like interrupt routing or a list of devices behind an I2C bus.

II - The DT block format
========================
Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,8 @@ config X86_INTEL_CE
depends on X86_32
depends on X86_EXTENDED_PLATFORM
select X86_REBOOTFIXUPS
select OF
select OF_EARLY_FLATTREE
---help---
Select for the Intel CE media processor (CE4100) SOC.
This option compiles in support for the CE4100 SOC for settop
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/x86/include/asm/bootparam.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
/* setup data types */
#define SETUP_NONE 0
#define SETUP_E820_EXT 1
#define SETUP_DTB 2

/* extensible setup data list node */
struct setup_data {
Expand Down
3 changes: 0 additions & 3 deletions trunk/arch/x86/include/asm/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
#include <asm/apicdef.h>
#include <asm/irq_vectors.h>

/* Even though we don't support this, supply it to appease OF */
static inline void irq_dispose_mapping(unsigned int virq) { }

static inline int irq_canonicalize(int irq)
{
return ((irq == 2) ? 9 : irq);
Expand Down
48 changes: 47 additions & 1 deletion trunk/arch/x86/include/asm/prom.h
Original file line number Diff line number Diff line change
@@ -1 +1,47 @@
/* dummy prom.h; here to make linux/of.h's #includes happy */
/*
* Definitions for Device tree / OpenFirmware handling on X86
*
* based on arch/powerpc/include/asm/prom.h which is
* Copyright (C) 1996-2005 Paul Mackerras.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/

#ifndef _ASM_X86_PROM_H
#define _ASM_X86_PROM_H
#ifndef __ASSEMBLY__

#include <linux/of.h>
#include <linux/types.h>

#include <asm/irq.h>
#include <asm/atomic.h>
#include <asm/setup.h>

#ifdef CONFIG_OF
extern void add_dtb(u64 data);
#else
static inline void add_dtb(u64 data) { }
#endif

extern char cmd_line[COMMAND_LINE_SIZE];

#define pci_address_to_pio pci_address_to_pio
unsigned long pci_address_to_pio(phys_addr_t addr);

/**
* irq_dispose_mapping - Unmap an interrupt
* @virq: linux virq number of the interrupt to unmap
*
* FIXME: We really should implement proper virq handling like power,
* but that's going to be major surgery.
*/
static inline void irq_dispose_mapping(unsigned int virq) { }

#define HAVE_ARCH_DEVTREE_FIXUPS

#endif /* __ASSEMBLY__ */
#endif
1 change: 1 addition & 0 deletions trunk/arch/x86/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ obj-$(CONFIG_MICROCODE) += microcode.o
obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o

obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o
obj-$(CONFIG_OF) += devicetree.o

###
# 64 bit specific files
Expand Down
51 changes: 51 additions & 0 deletions trunk/arch/x86/kernel/devicetree.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Architecture specific OF callbacks.
*/
#include <linux/bootmem.h>
#include <linux/io.h>
#include <linux/list.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
#include <linux/of_platform.h>
#include <linux/slab.h>

char __initdata cmd_line[COMMAND_LINE_SIZE];

unsigned int irq_create_of_mapping(struct device_node *controller,
const u32 *intspec, unsigned int intsize)
{
return intspec[0];

}
EXPORT_SYMBOL_GPL(irq_create_of_mapping);

unsigned long pci_address_to_pio(phys_addr_t address)
{
/*
* The ioport address can be directly used by inX / outX
*/
BUG_ON(address >= (1 << 16));
return (unsigned long)address;
}
EXPORT_SYMBOL_GPL(pci_address_to_pio);

void __init early_init_dt_scan_chosen_arch(unsigned long node)
{
BUG();
}

void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{
BUG();
}

void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
{
return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS));
}

void __init add_dtb(u64 data)
{
initial_boot_params = phys_to_virt((u64) (u32) data +
offsetof(struct setup_data, data));
}
9 changes: 0 additions & 9 deletions trunk/arch/x86/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,15 +276,6 @@ void smp_x86_platform_ipi(struct pt_regs *regs)

EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq);

#ifdef CONFIG_OF
unsigned int irq_create_of_mapping(struct device_node *controller,
const u32 *intspec, unsigned int intsize)
{
return intspec[0];
}
EXPORT_SYMBOL_GPL(irq_create_of_mapping);
#endif

#ifdef CONFIG_HOTPLUG_CPU
/* A cpu has been removed from cpu_online_mask. Reset irq affinities. */
void fixup_irqs(void)
Expand Down
4 changes: 4 additions & 0 deletions trunk/arch/x86/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
#endif
#include <asm/mce.h>
#include <asm/alternative.h>
#include <asm/prom.h>

/*
* end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
Expand Down Expand Up @@ -445,6 +446,9 @@ static void __init parse_setup_data(void)
case SETUP_E820_EXT:
parse_e820_ext(data);
break;
case SETUP_DTB:
add_dtb(pa_data);
break;
default:
break;
}
Expand Down

0 comments on commit c03b2cc

Please sign in to comment.