···6565The boot loader must ultimately be able to provide a MACH_TYPE_xxx6666value to the kernel. (see linux/arch/arm/tools/mach-types).67676868-6969-4. Setup the kernel tagged list7070--------------------------------6868+4. Setup boot data6969+------------------71707271Existing boot loaders: OPTIONAL, HIGHLY RECOMMENDED7372New boot loaders: MANDATORY7373+7474+The boot loader must provide either a tagged list or a dtb image for7575+passing configuration data to the kernel. The physical address of the7676+boot data is passed to the kernel in register r2.7777+7878+4a. Setup the kernel tagged list7979+--------------------------------74807581The boot loader must create and initialise the kernel tagged list.7682A valid tagged list starts with ATAG_CORE and ends with ATAG_NONE.···107101the kernel decompressor nor initrd 'bootp' program will overwrite108102it. The recommended placement is in the first 16KiB of RAM.109103104104+4b. Setup the device tree105105+-------------------------106106+107107+The boot loader must load a device tree image (dtb) into system ram108108+at a 64bit aligned address and initialize it with the boot data. The109109+dtb format is documented in Documentation/devicetree/booting-without-of.txt.110110+The kernel will look for the dtb magic value of 0xd00dfeed at the dtb111111+physical address to determine if a dtb has been passed instead of a112112+tagged list.113113+114114+The boot loader must pass at a minimum the size and location of the115115+system memory, and the root filesystem location. The dtb must be116116+placed in a region of memory where the kernel decompressor will not117117+overwrite it. The recommended placement is in the first 16KiB of RAM118118+with the caveat that it may not be located at physical address 0 since119119+the kernel interprets a value of 0 in r2 to mean neither a tagged list120120+nor a dtb were passed.121121+1101225. Calling the kernel image111123---------------------------112124···149125- CPU register settings150126 r0 = 0,151127 r1 = machine type number discovered in (3) above.152152- r2 = physical address of tagged list in system RAM.128128+ r2 = physical address of tagged list in system RAM, or129129+ physical address of device tree block (dtb) in system RAM153130154131- CPU mode155132 All forms of interrupts must be disabled (IRQs and FIQs)
+44-4
Documentation/devicetree/booting-without-of.txt
···1212=================13131414 I - Introduction1515- 1) Entry point for arch/powerpc1616- 2) Entry point for arch/x861515+ 1) Entry point for arch/arm1616+ 2) Entry point for arch/powerpc1717+ 3) Entry point for arch/x8617181819 II - The DT block format1920 1) Header···149148it with special cases.150149151150152152-1) Entry point for arch/powerpc151151+1) Entry point for arch/arm152152+---------------------------153153+154154+ There is one single entry point to the kernel, at the start155155+ of the kernel image. That entry point supports two calling156156+ conventions. A summary of the interface is described here. A full157157+ description of the boot requirements is documented in158158+ Documentation/arm/Booting159159+160160+ a) ATAGS interface. Minimal information is passed from firmware161161+ to the kernel with a tagged list of predefined parameters.162162+163163+ r0 : 0164164+165165+ r1 : Machine type number166166+167167+ r2 : Physical address of tagged list in system RAM168168+169169+ b) Entry with a flattened device-tree block. Firmware loads the170170+ physical address of the flattened device tree block (dtb) into r2,171171+ r1 is not used, but it is considered good practise to use a valid172172+ machine number as described in Documentation/arm/Booting.173173+174174+ r0 : 0175175+176176+ r1 : Valid machine type number. When using a device tree,177177+ a single machine type number will often be assigned to178178+ represent a class or family of SoCs.179179+180180+ r2 : physical pointer to the device-tree block181181+ (defined in chapter II) in RAM. Device tree can be located182182+ anywhere in system RAM, but it should be aligned on a 64 bit183183+ boundary.184184+185185+ The kernel will differentiate between ATAGS and device tree booting by186186+ reading the memory pointed to by r2 and looking for either the flattened187187+ device tree block magic value (0xd00dfeed) or the ATAG_CORE value at188188+ offset 0x4 from r2 (0x54410001).189189+190190+2) Entry point for arch/powerpc153191-------------------------------154192155193 There is one single entry point to the kernel, at the start···266226 cannot support both configurations with Book E and configurations267227 with classic Powerpc architectures.268228269269-2) Entry point for arch/x86229229+3) Entry point for arch/x86270230-------------------------------271231272232 There is one single 32bit entry point to the kernel at code32_start,
+7
arch/arm/Kconfig
···1683168316841684menu "Boot options"1685168516861686+config USE_OF16871687+ bool "Flattened Device Tree support"16881688+ select OF16891689+ select OF_EARLY_FLATTREE16901690+ help16911691+ Include support for flattened device tree machine descriptions.16921692+16861693# Compressed boot loader in ROM. Yes, we really want to ask about16871694# TEXT and BSS so we preserve their values in the config files.16881695config ZBOOT_ROM_TEXT
+9
arch/arm/include/asm/mach/arch.h
···1818 unsigned int nr; /* architecture number */1919 const char *name; /* architecture name */2020 unsigned long boot_params; /* tagged list */2121+ const char **dt_compat; /* array of device tree2222+ * 'compatible' strings */21232224 unsigned int nr_irqs; /* number of IRQs */2325···4846 * Current machine - only accessible during boot.4947 */5048extern struct machine_desc *machine_desc;4949+5050+/*5151+ * Machine type table - also only accessible during boot5252+ */5353+extern struct machine_desc __arch_info_begin[], __arch_info_end[];5454+#define for_each_machine_desc(p) \5555+ for (p = __arch_info_begin; p < __arch_info_end; p++)51565257/*5358 * Set of macros to define architecture features. This is built into
+37
arch/arm/include/asm/prom.h
···11+/*22+ * arch/arm/include/asm/prom.h33+ *44+ * Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.com>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License version 2 as88+ * published by the Free Software Foundation.99+ *1010+ */1111+#ifndef __ASMARM_PROM_H1212+#define __ASMARM_PROM_H1313+1414+#ifdef CONFIG_OF1515+1616+#include <asm/setup.h>1717+#include <asm/irq.h>1818+1919+static inline void irq_dispose_mapping(unsigned int virq)2020+{2121+ return;2222+}2323+2424+extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys);2525+extern void arm_dt_memblock_reserve(void);2626+2727+#else /* CONFIG_OF */2828+2929+static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys)3030+{3131+ return NULL;3232+}3333+3434+static inline void arm_dt_memblock_reserve(void) { }3535+3636+#endif /* CONFIG_OF */3737+#endif /* ASMARM_PROM_H */
···11+/*22+ * linux/arch/arm/kernel/devtree.c33+ *44+ * Copyright (C) 2009 Canonical Ltd. <jeremy.kerr@canonical.com>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License version 2 as88+ * published by the Free Software Foundation.99+ */1010+1111+#include <linux/init.h>1212+#include <linux/module.h>1313+#include <linux/errno.h>1414+#include <linux/types.h>1515+#include <linux/bootmem.h>1616+#include <linux/memblock.h>1717+#include <linux/of.h>1818+#include <linux/of_fdt.h>1919+#include <linux/of_irq.h>2020+#include <linux/of_platform.h>2121+2222+#include <asm/setup.h>2323+#include <asm/page.h>2424+#include <asm/mach/arch.h>2525+#include <asm/mach-types.h>2626+2727+void __init early_init_dt_add_memory_arch(u64 base, u64 size)2828+{2929+ arm_add_memory(base, size);3030+}3131+3232+void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)3333+{3434+ return alloc_bootmem_align(size, align);3535+}3636+3737+void __init arm_dt_memblock_reserve(void)3838+{3939+ u64 *reserve_map, base, size;4040+4141+ if (!initial_boot_params)4242+ return;4343+4444+ /* Reserve the dtb region */4545+ memblock_reserve(virt_to_phys(initial_boot_params),4646+ be32_to_cpu(initial_boot_params->totalsize));4747+4848+ /*4949+ * Process the reserve map. This will probably overlap the initrd5050+ * and dtb locations which are already reserved, but overlaping5151+ * doesn't hurt anything5252+ */5353+ reserve_map = ((void*)initial_boot_params) +5454+ be32_to_cpu(initial_boot_params->off_mem_rsvmap);5555+ while (1) {5656+ base = be64_to_cpup(reserve_map++);5757+ size = be64_to_cpup(reserve_map++);5858+ if (!size)5959+ break;6060+ memblock_reserve(base, size);6161+ }6262+}6363+6464+/**6565+ * setup_machine_fdt - Machine setup when an dtb was passed to the kernel6666+ * @dt_phys: physical address of dt blob6767+ *6868+ * If a dtb was passed to the kernel in r2, then use it to choose the6969+ * correct machine_desc and to setup the system.7070+ */7171+struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)7272+{7373+ struct boot_param_header *devtree;7474+ struct machine_desc *mdesc, *mdesc_best = NULL;7575+ unsigned int score, mdesc_score = ~1;7676+ unsigned long dt_root;7777+ const char *model;7878+7979+ devtree = phys_to_virt(dt_phys);8080+8181+ /* check device tree validity */8282+ if (be32_to_cpu(devtree->magic) != OF_DT_HEADER)8383+ return NULL;8484+8585+ /* Search the mdescs for the 'best' compatible value match */8686+ initial_boot_params = devtree;8787+ dt_root = of_get_flat_dt_root();8888+ for_each_machine_desc(mdesc) {8989+ score = of_flat_dt_match(dt_root, mdesc->dt_compat);9090+ if (score > 0 && score < mdesc_score) {9191+ mdesc_best = mdesc;9292+ mdesc_score = score;9393+ }9494+ }9595+ if (!mdesc_best) {9696+ const char *prop;9797+ long size;9898+9999+ early_print("\nError: unrecognized/unsupported "100100+ "device tree compatible list:\n[ ");101101+102102+ prop = of_get_flat_dt_prop(dt_root, "compatible", &size);103103+ while (size > 0) {104104+ early_print("'%s' ", prop);105105+ size -= strlen(prop) + 1;106106+ prop += strlen(prop) + 1;107107+ }108108+ early_print("]\n\n");109109+110110+ dump_machine_table(); /* does not return */111111+ }112112+113113+ model = of_get_flat_dt_prop(dt_root, "model", NULL);114114+ if (!model)115115+ model = of_get_flat_dt_prop(dt_root, "compatible", NULL);116116+ if (!model)117117+ model = "<unknown>";118118+ pr_info("Machine: %s, model: %s\n", mdesc_best->name, model);119119+120120+ /* Retrieve various information from the /chosen node */121121+ of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);122122+ /* Initialize {size,address}-cells info */123123+ of_scan_flat_dt(early_init_dt_scan_root, NULL);124124+ /* Setup memory, calling early_init_dt_add_memory_arch */125125+ of_scan_flat_dt(early_init_dt_scan_memory, NULL);126126+127127+ /* Change machine number to match the mdesc we're using */128128+ __machine_arch_type = mdesc_best->nr;129129+130130+ return mdesc_best;131131+}132132+133133+/**134134+ * irq_create_of_mapping - Hook to resolve OF irq specifier into a Linux irq#135135+ *136136+ * Currently the mapping mechanism is trivial; simple flat hwirq numbers are137137+ * mapped 1:1 onto Linux irq numbers. Cascaded irq controllers are not138138+ * supported.139139+ */140140+unsigned int irq_create_of_mapping(struct device_node *controller,141141+ const u32 *intspec, unsigned int intsize)142142+{143143+ return intspec[0];144144+}145145+EXPORT_SYMBOL_GPL(irq_create_of_mapping);
+18-6
arch/arm/kernel/head-common.S
···1515#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)1616#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)17171818+#ifdef CONFIG_CPU_BIG_ENDIAN1919+#define OF_DT_MAGIC 0xd00dfeed2020+#else2121+#define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */2222+#endif2323+1824/*1925 * Exception handling. Something went wrong and we can't proceed. We2026 * ought to tell the user, but since we don't have any guarantee that···34283529/* Determine validity of the r2 atags pointer. The heuristic requires3630 * that the pointer be aligned, in the first 16k of physical RAM and3737- * that the ATAG_CORE marker is first and present. Future revisions3131+ * that the ATAG_CORE marker is first and present. If CONFIG_OF_FLATTREE3232+ * is selected, then it will also accept a dtb pointer. Future revisions3833 * of this function may be more lenient with the physical address and3934 * may also be able to move the ATAGS block if necessary.4035 *4136 * Returns:4242- * r2 either valid atags pointer, or zero3737+ * r2 either valid atags pointer, valid dtb pointer, or zero4338 * r5, r6 corrupted4439 */4540__vet_atags:4641 tst r2, #0x3 @ aligned?4742 bne 1f48434949- ldr r5, [r2, #0] @ is first tag ATAG_CORE?5050- cmp r5, #ATAG_CORE_SIZE4444+ ldr r5, [r2, #0]4545+#ifdef CONFIG_OF_FLATTREE4646+ ldr r6, =OF_DT_MAGIC @ is it a DTB?4747+ cmp r5, r64848+ beq 2f4949+#endif5050+ cmp r5, #ATAG_CORE_SIZE @ is first tag ATAG_CORE?5151 cmpne r5, #ATAG_CORE_SIZE_EMPTY5252 bne 1f5353 ldr r5, [r2, #4]···6149 cmp r5, r66250 bne 1f63516464- mov pc, lr @ atag pointer is ok5252+2: mov pc, lr @ atag/dtb pointer is ok655366541: mov r2, #06755 mov pc, lr···7361 *7462 * r0 = cp#15 control register7563 * r1 = machine ID7676- * r2 = atags pointer6464+ * r2 = atags/dtb pointer7765 * r9 = processor ID7866 */7967 __INIT
+4-4
arch/arm/kernel/head.S
···5959 *6060 * This is normally called from the decompressor code. The requirements6161 * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,6262- * r1 = machine nr, r2 = atags pointer.6262+ * r1 = machine nr, r2 = atags or dtb pointer.6363 *6464 * This code is mostly position independent, so if you link the kernel at6565 * 0xc0008000, you call this at __pa(0xc0008000).···9191#endif92929393 /*9494- * r1 = machine no, r2 = atags,9494+ * r1 = machine no, r2 = atags or dtb,9595 * r8 = phys_offset, r9 = cpuid, r10 = procinfo9696 */9797 bl __vet_atags···339339 *340340 * r0 = cp#15 control register341341 * r1 = machine ID342342- * r2 = atags pointer342342+ * r2 = atags or dtb pointer343343 * r4 = page table pointer344344 * r9 = processor ID345345 * r13 = *virtual* address to jump to upon completion···376376 *377377 * r0 = cp#15 control register378378 * r1 = machine ID379379- * r2 = atags pointer379379+ * r2 = atags or dtb pointer380380 * r9 = processor ID381381 * r13 = *virtual* address to jump to upon completion382382 *
+58-32
arch/arm/kernel/setup.c
···2020#include <linux/screen_info.h>2121#include <linux/init.h>2222#include <linux/kexec.h>2323+#include <linux/of_fdt.h>2324#include <linux/crash_dump.h>2425#include <linux/root_dev.h>2526#include <linux/cpu.h>···4342#include <asm/cachetype.h>4443#include <asm/tlbflush.h>45444545+#include <asm/prom.h>4646#include <asm/mach/arch.h>4747#include <asm/mach/irq.h>4848#include <asm/mach/time.h>···311309 */312310extern struct proc_info_list *lookup_processor_type(unsigned int);313311314314-static void __init early_print(const char *str, ...)312312+void __init early_print(const char *str, ...)315313{316314 extern void printascii(const char *);317315 char buf[256];···441439 : "r14");442440}443441444444-static struct machine_desc * __init setup_machine(unsigned int nr)442442+void __init dump_machine_table(void)445443{446446- extern struct machine_desc __arch_info_begin[], __arch_info_end[];447444 struct machine_desc *p;448445449449- /*450450- * locate machine in the list of supported machines.451451- */452452- for (p = __arch_info_begin; p < __arch_info_end; p++)453453- if (nr == p->nr) {454454- printk("Machine: %s\n", p->name);455455- return p;456456- }457457-458458- early_print("\n"459459- "Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n"460460- "Available machine support:\n\nID (hex)\tNAME\n", nr);461461-462462- for (p = __arch_info_begin; p < __arch_info_end; p++)446446+ early_print("Available machine support:\n\nID (hex)\tNAME\n");447447+ for_each_machine_desc(p)463448 early_print("%08x\t%s\n", p->nr, p->name);464449465450 early_print("\nPlease check your kernel config and/or bootloader.\n");···455466 /* can't use cpu_relax() here as it may require MMU setup */;456467}457468458458-static int __init arm_add_memory(phys_addr_t start, unsigned long size)469469+int __init arm_add_memory(phys_addr_t start, unsigned long size)459470{460471 struct membank *bank = &meminfo.bank[meminfo.nr_banks];461472···790801 tag->hdr.tag = ATAG_NONE;791802}792803793793-void __init setup_arch(char **cmdline_p)804804+static struct machine_desc * __init setup_machine_tags(unsigned int nr)794805{795806 struct tag *tags = (struct tag *)&init_tags;796796- struct machine_desc *mdesc;807807+ struct machine_desc *mdesc = NULL, *p;797808 char *from = default_command_line;798809799810 init_tags.mem.start = PHYS_OFFSET;800811801801- unwind_init();812812+ /*813813+ * locate machine in the list of supported machines.814814+ */815815+ for_each_machine_desc(p)816816+ if (nr == p->nr) {817817+ printk("Machine: %s\n", p->name);818818+ mdesc = p;819819+ break;820820+ }802821803803- setup_processor();804804- mdesc = setup_machine(machine_arch_type);805805- machine_desc = mdesc;806806- machine_name = mdesc->name;807807-808808- if (mdesc->soft_reboot)809809- reboot_setup("s");822822+ if (!mdesc) {823823+ early_print("\nError: unrecognized/unsupported machine ID"824824+ " (r1 = 0x%08x).\n\n", nr);825825+ dump_machine_table(); /* does not return */826826+ }810827811828 if (__atags_pointer)812829 tags = phys_to_virt(__atags_pointer);···844849 if (tags->hdr.tag != ATAG_CORE)845850 convert_to_tag_list(tags);846851#endif847847- if (tags->hdr.tag != ATAG_CORE)852852+853853+ if (tags->hdr.tag != ATAG_CORE) {854854+#if defined(CONFIG_OF)855855+ /*856856+ * If CONFIG_OF is set, then assume this is a reasonably857857+ * modern system that should pass boot parameters858858+ */859859+ early_print("Warning: Neither atags nor dtb found\n");860860+#endif848861 tags = (struct tag *)&init_tags;862862+ }849863850864 if (mdesc->fixup)851865 mdesc->fixup(mdesc, tags, &from, &meminfo);···866862 parse_tags(tags);867863 }868864865865+ /* parse_early_param needs a boot_command_line */866866+ strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);867867+868868+ return mdesc;869869+}870870+871871+872872+void __init setup_arch(char **cmdline_p)873873+{874874+ struct machine_desc *mdesc;875875+876876+ unwind_init();877877+878878+ setup_processor();879879+ mdesc = setup_machine_fdt(__atags_pointer);880880+ if (!mdesc)881881+ mdesc = setup_machine_tags(machine_arch_type);882882+ machine_desc = mdesc;883883+ machine_name = mdesc->name;884884+885885+ if (mdesc->soft_reboot)886886+ reboot_setup("s");887887+869888 init_mm.start_code = (unsigned long) _text;870889 init_mm.end_code = (unsigned long) _etext;871890 init_mm.end_data = (unsigned long) _edata;872891 init_mm.brk = (unsigned long) _end;873873-874874- /* parse_early_param needs a boot_command_line */875875- strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);876892877893 /* populate cmd_line too for later use, preserving boot_command_line */878894 strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);···904880905881 paging_init(mdesc);906882 request_standard_resources(mdesc);883883+884884+ unflatten_device_tree();907885908886#ifdef CONFIG_SMP909887 if (is_smp())
+11
arch/arm/mm/init.c
···1515#include <linux/mman.h>1616#include <linux/nodemask.h>1717#include <linux/initrd.h>1818+#include <linux/of_fdt.h>1819#include <linux/highmem.h>1920#include <linux/gfp.h>2021#include <linux/memblock.h>2122#include <linux/sort.h>22232324#include <asm/mach-types.h>2525+#include <asm/prom.h>2426#include <asm/sections.h>2527#include <asm/setup.h>2628#include <asm/sizes.h>···7270}73717472__tagtable(ATAG_INITRD2, parse_tag_initrd2);7373+7474+#ifdef CONFIG_OF_FLATTREE7575+void __init early_init_dt_setup_initrd_arch(unsigned long start, unsigned long end)7676+{7777+ phys_initrd_start = start;7878+ phys_initrd_size = end - start;7979+}8080+#endif /* CONFIG_OF_FLATTREE */75817682/*7783 * This keeps memory configuration data used by a couple memory···344334#endif345335346336 arm_mm_memblock_reserve();337337+ arm_dt_memblock_reserve();347338348339 /* reserve any platform specific memblock areas */349340 if (mdesc->reserve)
+1-1
arch/microblaze/kernel/prom.c
···130130 * device-tree, including the platform type, initrd location and131131 * size, TCE reserve, and more ...132132 */133133- of_scan_flat_dt(early_init_dt_scan_chosen, NULL);133133+ of_scan_flat_dt(early_init_dt_scan_chosen, cmd_line);134134135135 /* Scan memory nodes and rebuild MEMBLOCKs */136136 memblock_init();
-3
arch/mips/include/asm/prom.h
···1414#ifdef CONFIG_OF1515#include <asm/bootinfo.h>16161717-/* which is compatible with the flattened device tree (FDT) */1818-#define cmd_line arcs_cmdline1919-2017extern int early_init_dt_scan_memory_arch(unsigned long node,2118 const char *uname, int depth, void *data);2219
+2-1
arch/mips/kernel/prom.c
···8383 * device-tree, including the platform type, initrd location and8484 * size, and more ...8585 */8686- of_scan_flat_dt(early_init_dt_scan_chosen, NULL);8686+ of_scan_flat_dt(early_init_dt_scan_chosen, arcs_cmdline);8787+87888889 /* Scan memory nodes */8990 of_scan_flat_dt(early_init_dt_scan_root, NULL);
+1-1
arch/powerpc/kernel/prom.c
···694694 * device-tree, including the platform type, initrd location and695695 * size, TCE reserve, and more ...696696 */697697- of_scan_flat_dt(early_init_dt_scan_chosen_ppc, NULL);697697+ of_scan_flat_dt(early_init_dt_scan_chosen_ppc, cmd_line);698698699699 /* Scan memory nodes and rebuild MEMBLOCKs */700700 memblock_init();
+4-4
drivers/of/fdt.c
···670670671671 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);672672673673- if (depth != 1 ||673673+ if (depth != 1 || !data ||674674 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))675675 return 0;676676···679679 /* Retrieve command line */680680 p = of_get_flat_dt_prop(node, "bootargs", &l);681681 if (p != NULL && l > 0)682682- strlcpy(cmd_line, p, min((int)l, COMMAND_LINE_SIZE));682682+ strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE));683683684684#ifdef CONFIG_CMDLINE685685#ifndef CONFIG_CMDLINE_FORCE686686 if (p == NULL || l == 0 || (l == 1 && (*p) == 0))687687#endif688688- strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);688688+ strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);689689#endif /* CONFIG_CMDLINE */690690691691- pr_debug("Command line is: %s\n", cmd_line);691691+ pr_debug("Command line is: %s\n", (char*)data);692692693693 /* break now */694694 return 1;