From: Charlie Paul <cpaul.windri...@gmail.com> These changes are changes to the kernel that are needed to support the AXXIA 5500 board.
Signed-off-by: Charlie Paul <cpaul.windri...@gmail.com> --- arch/arm/Kconfig | 87 ++++++++++++++++++++++++++++++++++++- arch/arm/Kconfig.debug | 4 ++ arch/arm/Makefile | 2 + arch/arm/include/asm/futex.h | 39 +++++++++++++---- arch/arm/include/asm/kmap_types.h | 5 +++ arch/arm/include/asm/spinlock.h | 5 +++ arch/arm/kernel/head.S | 8 ++++ arch/arm/kernel/irq.c | 8 ++-- arch/arm/kernel/perf_event_v7.c | 21 ++++----- arch/arm/mm/mmap.c | 4 +- arch/arm/tools/mach-types | 1 + init/Kconfig | 3 ++ init/do_mounts.c | 55 +++++++++++------------ init/main.c | 19 ++++++-- 14 files changed, 204 insertions(+), 57 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 751747e..99ff039 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -373,6 +373,29 @@ config ARCH_VERSATILE help This enables support for ARM Ltd Versatile board. +config ARCH_AXXIA + bool "LSI Axxia family" + select ARCH_PHYS_ADDR_T_64BIT + select ARCH_DMA_ADDR_T_64BIT + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_AMBA + select COMMON_CLK + select CLKDEV_LOOKUP + select CLKSRC_MMIO + select GENERIC_CLOCKEVENTS + select HAVE_CLK + select HAVE_PATA_PLATFORM + select ARM_TIMER_SP804 + select ICST + select NEED_MACH_IO_H + select ZONE_DMA + select PCI + select PCI_DOMAINS if PCI + select ARCH_SUPPORTS_MSI if PCI + select HAS_RAPIDIO + help + This enables support for the LSI Axxia boards. + config ARCH_AT91 bool "Atmel AT91" select ARCH_REQUIRE_GPIOLIB @@ -1051,6 +1074,8 @@ source "arch/arm/mach-ux500/Kconfig" source "arch/arm/mach-versatile/Kconfig" +source "arch/arm/mach-axxia/Kconfig" + source "arch/arm/mach-vexpress/Kconfig" source "arch/arm/plat-versatile/Kconfig" @@ -1455,6 +1480,19 @@ source "drivers/pci/pcie/Kconfig" source "drivers/pcmcia/Kconfig" +config HAS_RAPIDIO + bool + default n + +config RAPIDIO + bool "RapidIO support" + depends on HAS_RAPIDIO || PCI + help + If you say Y here, the kernel will include drivers and + infrastructure code to support RapidIO interconnect devices. + +source "drivers/rapidio/Kconfig" + endmenu menu "Kernel Features" @@ -1613,13 +1651,50 @@ config NR_CPUS depends on SMP default "4" +menu "Support for hot-pluggable CPUs" + config HOTPLUG_CPU bool "Support for hot-pluggable CPUs" - depends on SMP + depends on SMP && HOTPLUG help Say Y here to experiment with turning CPUs off and on. CPUs can be controlled through /sys/devices/system/cpu. +choice + prompt "CPU Power Down Mode" + default HOTPLUG_CPU_COMPLETE_POWER_DOWN + help + This is used to select how the CPU is going to be powered down. If LOW POWER + is selected then the CPU enters a WFI state and waits for an interrupt to + wake up. If COMPLETE POWER down is selected the CPU power is turned off. The only + way to power on the CPU is to execute a command. + +config HOTPLUG_CPU_COMPLETE_POWER_DOWN + bool "Power off the CPU" + help + This will power off the CPU completely. The irqs are migrated + to another CPU. + +config HOTPLUG_CPU_LOW_POWER + bool "Low Power CPU (wfi)" + help + This will put the CPU into a low power mode wfi mode. When an interrupt + is received the CPU will power on again. + +endchoice + +config HOTPLUG_CPU_L2_POWER_DOWN + bool "Power Off L2 Cache" + depends on HOTPLUG_CPU_COMPLETE_POWER_DOWN + default n if HOTPLUG_CPU_LOW_POWER + help + Select this if you want to power down the L2 cache when + all CPUS of a cluster have been powered off. + +endmenu + + + config ARM_PSCI bool "Support for the ARM Power State Coordination Interface (PSCI)" depends on CPU_V7 @@ -1630,6 +1705,16 @@ config ARM_PSCI 0022A ("Power State Coordination Interface System Software on ARM processors"). +config LOCAL_TIMERS + bool "Use local timer interrupts" + depends on SMP + default y + help + Enable support for local timers on SMP platforms, rather then the + legacy IPI broadcast method. Local timers allows the system + accounting to be spread across the timer interval, preventing a + "thundering herd" at every timer tick. + # The GPIO number here must be sorted by descending number. In case of # a multiplatform kernel, we just want the highest value required by the # selected platforms. diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 0531da8..21667a3 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -101,6 +101,10 @@ choice bool "Kernel low-level debugging on 9263 and 9g45" depends on HAVE_AT91_DBGU1 + config DEBUG_LL_AXXIA_UART0 + bool "Kernel low-level debugging via UART0" + depends on ARCH_AXXIA + config DEBUG_BCM2835 bool "Kernel low-level debugging on BCM2835 PL011 UART" depends on ARCH_BCM2835 diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 9b247a1..3e28fe9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -138,6 +138,7 @@ endif textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000 textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000 textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000 +textofs-$(CONFIG_ARCH_AXXIA) := 0x00408000 # Machine directory name. This list is sorted alphanumerically # by CONFIG_* macro name. @@ -199,6 +200,7 @@ machine-$(CONFIG_ARCH_U300) += u300 machine-$(CONFIG_ARCH_U8500) += ux500 machine-$(CONFIG_ARCH_VERSATILE) += versatile machine-$(CONFIG_ARCH_VEXPRESS) += vexpress +machine-$(CONFIG_ARCH_AXXIA) := axxia machine-$(CONFIG_ARCH_VIRT) += virt machine-$(CONFIG_ARCH_VT8500) += vt8500 machine-$(CONFIG_ARCH_W90X900) += w90x900 diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 2aff798..cf5a6ea 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h @@ -3,6 +3,12 @@ #ifdef __KERNEL__ +#if defined(CONFIG_CPU_USE_DOMAINS) && defined(CONFIG_SMP) +/* ARM doesn't provide unprivileged exclusive memory accessors */ +#include <asm-generic/futex.h> +#else + + #include <linux/futex.h> #include <linux/uaccess.h> #include <asm/errno.h> @@ -44,7 +50,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) return -EFAULT; - + /* Setup memory barrier */ smp_mb(); __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" "1: ldrex %1, [%4]\n" @@ -58,6 +64,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, : "=&r" (ret), "=&r" (val) : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) : "cc", "memory"); + /* Setup memory barrier */ smp_mb(); *uval = val; @@ -107,7 +114,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, #endif /* !SMP */ static inline int -futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) +futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) { int op = (encoded_op >> 28) & 7; int cmp = (encoded_op >> 24) & 15; @@ -147,17 +154,31 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) if (!ret) { switch (cmp) { - case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; - case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; - case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; - case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; - case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; - case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; - default: ret = -ENOSYS; + case FUTEX_OP_CMP_EQ: + ret = (oldval == cmparg); + break; + case FUTEX_OP_CMP_NE: + ret = (oldval != cmparg); + break; + case FUTEX_OP_CMP_LT: + ret = (oldval < cmparg); + break; + case FUTEX_OP_CMP_GE: + ret = (oldval >= cmparg); + break; + case FUTEX_OP_CMP_LE: + ret = (oldval <= cmparg); + break; + case FUTEX_OP_CMP_GT: + ret = (oldval > cmparg); + break; + default: + ret = -ENOSYS; } } return ret; } +#endif /* !(CPU_USE_DOMAINS && SMP) */ #endif /* __KERNEL__ */ #endif /* _ASM_ARM_FUTEX_H */ diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h index 83eb2f7..3e527f9 100644 --- a/arch/arm/include/asm/kmap_types.h +++ b/arch/arm/include/asm/kmap_types.h @@ -4,6 +4,11 @@ /* * This is the "bare minimum". AIO seems to require this. */ +#if (NR_CPUS > 15) +/* Prevent overlap between fixmap mapping and CPU vector page for 16th core */ +#define KM_TYPE_NR 15 +#else #define KM_TYPE_NR 16 +#endif #endif diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index ac4bfae..08cca7e 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h @@ -73,7 +73,12 @@ static inline void arch_spin_lock(arch_spinlock_t *lock) : "cc"); while (lockval.tickets.next != lockval.tickets.owner) { +#ifdef CONFIG_ARCH_AXXIA + extern void __axxia_arch_wfe(void); + __axxia_arch_wfe(); +#else wfe(); +#endif lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner); } diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index f5f381d..9864a0f 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -52,8 +52,13 @@ .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE .macro pgtbl, rd, phys +#ifdef CONFIG_ARCH_AXXIA + ldr \rd, =(TEXT_OFFSET - PG_DIR_SIZE) + add \rd, \rd, \phys +#else add \rd, \phys, #TEXT_OFFSET sub \rd, \rd, #PG_DIR_SIZE +#endif .endm /* @@ -301,6 +306,9 @@ __create_page_tables: #endif #else orr r3, r3, #PMD_SECT_XN +#ifdef CONFIG_ARCH_AXXIA + orr r7, r7, #0x20 +#endif str r3, [r0], #4 #endif diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 1e782bd..f394eed 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -74,7 +74,7 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) */ if (unlikely(irq >= nr_irqs)) { if (printk_ratelimit()) - printk(KERN_WARNING "Bad IRQ%u\n", irq); + pr_warn("Bad IRQ%u\n", irq); ack_bad_irq(irq); } else { generic_handle_irq(irq); @@ -98,7 +98,7 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; if (irq >= nr_irqs) { - printk(KERN_ERR "Trying to set irq flags for IRQ%d\n", irq); + pr_err("Trying to set irq flags for IRQ%d\n", irq); return; } @@ -163,7 +163,7 @@ static bool migrate_one_irq(struct irq_desc *desc) c = irq_data_get_irq_chip(d); if (!c->irq_set_affinity) pr_debug("IRQ%u: unable to set affinity\n", d->irq); - else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) + else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret) cpumask_copy(d->affinity, affinity); return ret; @@ -193,7 +193,7 @@ void migrate_irqs(void) raw_spin_unlock(&desc->lock); if (affinity_broken && printk_ratelimit()) - pr_warning("IRQ%u no longer affine to CPU%u\n", i, + pr_warn("IRQ%u no longer affine to CPU%u\n", i, smp_processor_id()); } diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 039cffb..68738b5 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -93,6 +93,7 @@ enum armv7_a5_perf_types { /* ARMv7 Cortex-A15 specific event types */ enum armv7_a15_perf_types { + ARMV7_A15_PERFCTR_CPU_CYCLES = 0x11, ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40, ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41, ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42, @@ -487,7 +488,7 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] * Cortex-A15 HW events mapping */ static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { - [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, + [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_A15_PERFCTR_CPU_CYCLES, [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, @@ -917,34 +918,34 @@ static void armv7_pmnc_dump_regs(struct arm_pmu *cpu_pmu) u32 val; unsigned int cnt; - printk(KERN_INFO "PMNC registers dump:\n"); + pr_info("PMNC registers dump:\n"); asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r" (val)); - printk(KERN_INFO "PMNC =0x%08x\n", val); + pr_info("PMNC =0x%08x\n", val); asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r" (val)); - printk(KERN_INFO "CNTENS=0x%08x\n", val); + pr_info("CNTENS=0x%08x\n", val); asm volatile("mrc p15, 0, %0, c9, c14, 1" : "=r" (val)); - printk(KERN_INFO "INTENS=0x%08x\n", val); + pr_info("INTENS=0x%08x\n", val); asm volatile("mrc p15, 0, %0, c9, c12, 3" : "=r" (val)); - printk(KERN_INFO "FLAGS =0x%08x\n", val); + pr_info("FLAGS =0x%08x\n", val); asm volatile("mrc p15, 0, %0, c9, c12, 5" : "=r" (val)); - printk(KERN_INFO "SELECT=0x%08x\n", val); + pr_info("SELECT=0x%08x\n", val); asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (val)); - printk(KERN_INFO "CCNT =0x%08x\n", val); + pr_info("CCNT =0x%08x\n", val); for (cnt = ARMV7_IDX_COUNTER0; cnt <= ARMV7_IDX_COUNTER_LAST(cpu_pmu); cnt++) { armv7_pmnc_select_counter(cnt); asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r" (val)); - printk(KERN_INFO "CNT[%d] count =0x%08x\n", + pr_info("CNT[%d] count =0x%08x\n", ARMV7_IDX_TO_COUNTER(cnt), val); asm volatile("mrc p15, 0, %0, c9, c13, 1" : "=r" (val)); - printk(KERN_INFO "CNT[%d] evtsel=0x%08x\n", + pr_info("CNT[%d] evtsel=0x%08x\n", ARMV7_IDX_TO_COUNTER(cnt), val); } } diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 5e85ed3..d5bb480 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -11,7 +11,7 @@ #include <linux/random.h> #include <asm/cachetype.h> -#define COLOUR_ALIGN(addr,pgoff) \ +#define COLOUR_ALIGN(addr, pgoff) \ ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \ (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1))) @@ -146,7 +146,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; - info.low_limit = FIRST_USER_ADDRESS; + info.low_limit = PAGE_SIZE; info.high_limit = mm->mmap_base; info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; info.align_offset = pgoff << PAGE_SHIFT; diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index a10297d..1794ad4 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -1007,3 +1007,4 @@ eco5_bx2 MACH_ECO5_BX2 ECO5_BX2 4572 eukrea_cpuimx28sd MACH_EUKREA_CPUIMX28SD EUKREA_CPUIMX28SD 4573 domotab MACH_DOMOTAB DOMOTAB 4574 pfla03 MACH_PFLA03 PFLA03 4575 +axxia MACH_AXXIA AXXIA 4173 diff --git a/init/Kconfig b/init/Kconfig index a62b42d..8a3a4a4 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1281,6 +1281,9 @@ config SYSCTL_ARCH_UNALIGN_ALLOW the unaligned access emulation. see arch/parisc/kernel/unaligned.c for reference +config HOTPLUG + def_bool y + config HAVE_PCSPKR_PLATFORM bool diff --git a/init/do_mounts.c b/init/do_mounts.c index 91e5a21..57c5fbb 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -46,7 +46,7 @@ dev_t ROOT_DEV; static int __init load_ramdisk(char *str) { - rd_doload = simple_strtol(str,NULL,0) & 3; + rd_doload = simple_strtol(str, NULL, 0) & 3; return 1; } __setup("load_ramdisk=", load_ramdisk); @@ -366,7 +366,7 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data) sys_chdir("/root"); s = current->fs->pwd.dentry->d_sb; ROOT_DEV = s->s_dev; - printk(KERN_INFO + pr_info( "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n", s->s_type->name, s->s_flags & MS_RDONLY ? " readonly" : "", @@ -391,15 +391,15 @@ retry: for (p = fs_names; *p; p += strlen(p)+1) { int err = do_mount_root(name, p, flags, root_mount_data); switch (err) { - case 0: - goto out; - case -EACCES: - flags |= MS_RDONLY; - goto retry; - case -EINVAL: - continue; + case 0: + goto out; + case -EACCES: + flags |= MS_RDONLY; + goto retry; + case -EINVAL: + continue; } - /* + /* * Allow the user to distinguish between failed sys_open * and bad superblock on root device. * and give them a list of the available devices @@ -407,36 +407,36 @@ retry: #ifdef CONFIG_BLOCK __bdevname(ROOT_DEV, b); #endif - printk("VFS: Cannot open root device \"%s\" or %s: error %d\n", + pr_info("VFS: Cannot open root device \"%s\" or %s: error %d\n", root_device_name, b, err); - printk("Please append a correct \"root=\" boot option; here are the available partitions:\n"); + pr_info("Please append a correct \"root=\" boot option; here are the available partitions:\n"); printk_all_partitions(); #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT - printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify " + pr_info("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify " "explicit textual name for \"root=\" boot option.\n"); #endif - printk(KERN_EMERG "VFS: Unable to mount root fs on %s\n", b); - printk(KERN_EMERG "User configuration error - no valid root filesystem found\n"); + pr_emerg("VFS: Unable to mount root fs on %s\n", b); + pr_emerg("User configuration error - no valid root filesystem found\n"); panic("Invalid configuration from end user prevents continuing"); } - printk("List of all partitions:\n"); + pr_info("List of all partitions:\n"); printk_all_partitions(); - printk("No filesystem could mount root, tried: "); + pr_info("No filesystem could mount root, tried: "); for (p = fs_names; *p; p += strlen(p)+1) - printk(" %s", p); - printk("\n"); + pr_info(" %s", p); + pr_info("\n"); #ifdef CONFIG_BLOCK __bdevname(ROOT_DEV, b); #endif - printk(KERN_EMERG "VFS: Unable to mount root fs on %s\n", b); - printk(KERN_EMERG "User configuration error - no valid root filesystem found\n"); + pr_emerg("VFS: Unable to mount root fs on %s\n", b); + pr_emerg("User configuration error - no valid root filesystem found\n"); panic("Invalid configuration from end user prevents continuing"); out: put_page(page); } - + #ifdef CONFIG_ROOT_NFS #define NFSROOT_TIMEOUT_MIN 5 @@ -493,7 +493,7 @@ void __init change_floppy(char *fmt, ...) sys_ioctl(fd, FDEJECT, 0); sys_close(fd); } - printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf); + pr_notice("VFS: Insert %s and press ENTER\n", buf); fd = sys_open("/dev/console", O_RDWR, 0); if (fd >= 0) { sys_ioctl(fd, TCGETS, (long)&termios); @@ -514,14 +514,14 @@ void __init mount_root(void) if (mount_nfs_root()) return; - printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n"); + pr_err("VFS: Unable to mount root fs via NFS, trying floppy.\n"); ROOT_DEV = Root_FD0; } #endif #ifdef CONFIG_BLK_DEV_FD if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) { /* rd_doload is 2 for a dual initrd/ramload setup */ - if (rd_doload==2) { + if (rd_doload == 2) { if (rd_load_disk(1)) { ROOT_DEV = Root_RAM1; root_device_name = NULL; @@ -544,7 +544,7 @@ void __init prepare_namespace(void) int is_floppy; if (root_delay) { - printk(KERN_INFO "Waiting %d sec before mounting root device...\n", + pr_info("Waiting %d sec before mounting root device...\n", root_delay); ssleep(root_delay); } @@ -577,7 +577,7 @@ void __init prepare_namespace(void) /* wait for any asynchronous scanning to complete */ if ((ROOT_DEV == 0) && root_wait) { - printk(KERN_INFO "Waiting for root device %s...\n", + pr_info("Waiting for root device %s...\n", saved_root_name); while (driver_probe_done() != 0 || (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0) @@ -637,5 +637,6 @@ int __init init_rootfs(void) if (err) unregister_filesystem(&rootfs_fs_type); + return err; } diff --git a/init/main.c b/init/main.c index a8f9911..0ea5865 100644 --- a/init/main.c +++ b/init/main.c @@ -354,8 +354,8 @@ static void __init setup_command_line(char *command_line) initcall_command_line = memblock_virt_alloc(strlen(boot_command_line) + 1, 0); static_command_line = memblock_virt_alloc(strlen(command_line) + 1, 0); - strcpy (saved_command_line, boot_command_line); - strcpy (static_command_line, command_line); + strcpy(saved_command_line, boot_command_line); + strcpy(static_command_line, command_line); } /* @@ -423,7 +423,7 @@ void __init parse_early_options(char *cmdline) /* Arch code calls this early on, or if not, just before other parsing. */ void __init parse_early_param(void) { - static __initdata int done = 0; + static __initdata int done; static __initdata char tmp_cmdline[COMMAND_LINE_SIZE]; if (done) @@ -478,9 +478,20 @@ static void __init mm_init(void) asmlinkage void __init start_kernel(void) { - char * command_line; + char *command_line; extern const struct kernel_param __start___param[], __stop___param[]; +#if defined(CONFIG_ARCH_AXXIA) && defined(DEBUG_LL) + { + *(unsigned long *)(0xf0080000 + 0x24) = 13; + *(unsigned long *)(0xf0080000 + 0x28) = 1; + *(unsigned long *)(0xf0080000 + 0x2c) = 0x70; + *(unsigned long *)(0xf0080000 + 0x30) = 0x301; + *(unsigned long *)(0xf0080000 + 0x34) = 0; + *(unsigned long *)(0xf0080000 + 0x38) = 0x700; + } +#endif /* CONFIG_ARCH_AXXIA && DEBUG_LL */ + /* * Need to run as early as possible, to initialize the * lockdep hash: -- 1.7.9.5 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto