 300459d558
			
		
	
	
	300459d558
	
	
	
		
			
			IPI registers of Loongson-3 include IPI_SET, IPI_CLEAR, IPI_STATUS,
IPI_EN and IPI_MAILBOX_BUF. Each bit of IPI_STATUS indicate a type of
IPI and IPI_EN indicate whether the IPI is enabled. The sender write 1
to IPI_SET bits generate IPIs in IPI_STATUS, and receiver write 1 to
bits of IPI_CLEAR to clear IPIs. IPI_MAILBOX_BUF are used to deliver
more information about IPIs.
Why we change code in arch/mips/loongson/common/setup.c?
If without this change, when SMP configured, system cannot boot since
it hang at printk() in cgroup_init_early(). The root cause is:
console_trylock()
  \-->down_trylock(&console_sem)
    \-->raw_spin_unlock_irqrestore(&sem->lock, flags)
      \-->_raw_spin_unlock_irqrestore()(SMP/UP have different versions)
        \-->__raw_spin_unlock_irqrestore()  (following is the SMP case)
          \-->do_raw_spin_unlock()
            \-->arch_spin_unlock()
              \-->nudge_writes()
                \-->mb()
                  \-->wbflush()
                    \-->__wbflush()
In previous code __wbflush() is initialized in plat_mem_setup(), but
cgroup_init_early() is called before plat_mem_setup(). Therefore, In
this patch we make changes to avoid boot failure.
Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Hongliang Tao <taohl@lemote.com>
Signed-off-by: Hua Yan <yanh@lemote.com>
Tested-by: Alex Smith <alex.smith@imgtec.com>
Reviewed-by: Alex Smith <alex.smith@imgtec.com>
Cc: John Crispin <john@phrozen.org>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: linux-mips@linux-mips.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Patchwork: https://patchwork.linux-mips.org/patch/6638
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
		
	
			
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
 | |
|  * Author: Fuxin Zhang, zhangfx@lemote.com
 | |
|  *
 | |
|  *  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.
 | |
|  */
 | |
| #include <linux/module.h>
 | |
| 
 | |
| #include <asm/wbflush.h>
 | |
| 
 | |
| #include <loongson.h>
 | |
| 
 | |
| #ifdef CONFIG_VT
 | |
| #include <linux/console.h>
 | |
| #include <linux/screen_info.h>
 | |
| #endif
 | |
| 
 | |
| static void wbflush_loongson(void)
 | |
| {
 | |
| 	asm(".set\tpush\n\t"
 | |
| 	    ".set\tnoreorder\n\t"
 | |
| 	    ".set mips3\n\t"
 | |
| 	    "sync\n\t"
 | |
| 	    "nop\n\t"
 | |
| 	    ".set\tpop\n\t"
 | |
| 	    ".set mips0\n\t");
 | |
| }
 | |
| 
 | |
| void (*__wbflush)(void) = wbflush_loongson;
 | |
| EXPORT_SYMBOL(__wbflush);
 | |
| 
 | |
| void __init plat_mem_setup(void)
 | |
| {
 | |
| #ifdef CONFIG_VT
 | |
| #if defined(CONFIG_VGA_CONSOLE)
 | |
| 	conswitchp = &vga_con;
 | |
| 
 | |
| 	screen_info = (struct screen_info) {
 | |
| 		.orig_x			= 0,
 | |
| 		.orig_y			= 25,
 | |
| 		.orig_video_cols	= 80,
 | |
| 		.orig_video_lines	= 25,
 | |
| 		.orig_video_isVGA	= VIDEO_TYPE_VGAC,
 | |
| 		.orig_video_points	= 16,
 | |
| 	};
 | |
| #elif defined(CONFIG_DUMMY_CONSOLE)
 | |
| 	conswitchp = &dummy_con;
 | |
| #endif
 | |
| #endif
 | |
| }
 |