Unverified Commit 3e5cc39a authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!476 LoongArch: fix failed to boot

Merge Pull Request from: @Hongchen_Zhang 
 
1. commit ad404010 ("entry: Add support for TIF_NOTIFY_SIGNAL")
changed the signal handler name to arch_do_signal_or_restart,so
change the signal handler name for LoongArch too.
2. fix virtual machine startup error
3. fix failed boot when using old firmware 

After apply this PR,the following test case passed:
  - boot Loongson-3C5000LL+7A1000 machine with firmware
     Loongson-UDK2018-V2.0.04163-beta6
  - success boot to login
 
 
Link:https://gitee.com/openeuler/kernel/pulls/476

 

Reviewed-by: default avatarGuo Dongtai <guodongtai@kylinos.cn>
Reviewed-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parents 5e652296 9626a778
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ struct acpi_vector_group {
extern struct acpi_vector_group pch_group[MAX_IO_PICS];
extern struct acpi_vector_group msi_group[MAX_IO_PICS];

#define MAX_CORES_PER_EIO_NODE	256
#define CORES_PER_EIO_NODE	4

#define LOONGSON_CPU_UART0_VEC		10 /* CPU UART0 */
+5 −0
Original line number Diff line number Diff line
@@ -275,6 +275,11 @@ static __always_inline u64 iocsr_read64(u32 reg)
	return __iocsrrd_d(reg);
}

static __always_inline void iocsr_write8(u8 val, u32 reg)
{
	__iocsrwr_b(val, reg);
}

static __always_inline void iocsr_write32(u32 val, u32 reg)
{
	__iocsrwr_w(val, reg);
+22 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <asm/loongson.h>
#include "legacy_boot.h"

static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR;
static __initdata unsigned long new_memmap = EFI_INVALID_TABLE_ADDR;
static __initdata unsigned long initrd = EFI_INVALID_TABLE_ADDR;

@@ -36,12 +37,32 @@ static unsigned long efi_config_table;

static efi_system_table_t *efi_systab;
static efi_config_table_type_t arch_tables[] __initdata = {
	{LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table, NULL},
	{LINUX_EFI_NEW_MEMMAP_GUID, &new_memmap, "NEWMEM"},
	{LINUX_EFI_INITRD_MEDIA_GUID, &initrd, "INITRD"},
	{},
};
static __initdata pgd_t *pgd_efi;

static void __init init_screen_info(void)
{
	struct screen_info *si;

	if (screen_info_table != EFI_INVALID_TABLE_ADDR) {
		si = early_memremap_ro(screen_info_table, sizeof(*si));
		if (!si) {
			pr_err("Could not map screen_info config table\n");
			return;
		}
		screen_info = *si;
		memset(si, 0, sizeof(*si));
		early_memunmap(si, sizeof(*si));
	}

	if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI)
		memblock_reserve(screen_info.lfb_base, screen_info.lfb_size);
}

static int __init efimap_populate_hugepages(
		unsigned long start, unsigned long end,
		pgprot_t prot)
@@ -290,6 +311,5 @@ void __init loongson_efi_init(void)

	init_new_memmap();

	if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI)
		memblock_reserve(screen_info.lfb_base, screen_info.lfb_size);
	init_screen_info();
}
+28 −10
Original line number Diff line number Diff line
@@ -113,13 +113,15 @@ static int bad_pch_pic(unsigned long address)

void register_default_pic(int id, u32 address, u32 irq_base)
{
	int idx, entries;
	int j, idx, entries, cores;
	unsigned long addr;
	u64 node_map = 0;

	if (bad_pch_pic(address))
		return;

	idx = nr_io_pics;
	cores = (cpu_has_hypervisor ? MAX_CORES_PER_EIO_NODE : CORES_PER_EIO_NODE);

	pchpic_default[idx].address = address;
	if (idx)
@@ -138,14 +140,27 @@ void register_default_pic(int id, u32 address, u32 irq_base)
	pchmsi_default[idx].start = entries;
	pchmsi_default[idx].count = MSI_MSG_DEFAULT_COUNT;

	eiointc_default[idx].cascade = 3;
	for_each_possible_cpu(j) {
		int node = cpu_logical_map(j) / cores;
		node_map |= (1 << node);
	}
	eiointc_default[idx].cascade = 3 + idx;
	eiointc_default[idx].node = id;
	eiointc_default[idx].node_map = 1;
	eiointc_default[idx].node_map = node_map;

	if (idx) {
		eiointc_default[idx].cascade = 0x4;
		eiointc_default[0].node_map = 0x1DF;
		eiointc_default[idx].node_map = 0xFE20;
		int i;

		for (i = 0; i < idx + 1; i++) {
			node_map = 0;

			for_each_possible_cpu(j) {
				int node = cpu_logical_map(j) / cores;
				if (((node & 7) < 4) ? !i : i)
					node_map |= (1 << node);
			}
			eiointc_default[i].node_map = node_map;
		}
	}

	acpi_pchpic[idx] = &pchpic_default[idx];
@@ -278,7 +293,7 @@ int setup_legacy_IRQ(void)
		printk("Pic domain error!\n");
		return -1;
	}
	if (pic_domain)
	if (pic_domain && !cpu_has_hypervisor)
		pch_lpc_acpi_init(pic_domain, acpi_pchlpc);

	return 0;
@@ -530,9 +545,12 @@ unsigned long legacy_boot_init(unsigned long argc, unsigned long cmdptr, unsigne
	efi_bp = (struct boot_params *)bpi;
	bpi_version = get_bpi_version(&efi_bp->signature);
	pr_info("BPI%d with boot flags %llx.\n", bpi_version, efi_bp->flags);
	if (bpi_version == BPI_VERSION_NONE)
	if (bpi_version == BPI_VERSION_NONE) {
		if (cpu_has_hypervisor)
			pr_err("Fatal error, bpi ver BONE!\n");
		else
			panic("Fatal error, bpi ver BONE!\n");
	else if (bpi_version == BPI_VERSION_V2)
	} else if (bpi_version == BPI_VERSION_V2)
		parse_bpi_flags();

	fw_init_cmdline(argc, cmdptr);
+2 −2
Original line number Diff line number Diff line
@@ -853,11 +853,11 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
	signal_setup_done(ret, ksig, 0);
}

void arch_do_signal(struct pt_regs *regs)
void arch_do_signal_or_restart(struct pt_regs *regs, bool has_signal)
{
	struct ksignal ksig;

	if (get_signal(&ksig)) {
	if (has_signal && get_signal(&ksig)) {
		/* Whee!  Actually deliver the signal.	*/
		handle_signal(&ksig, regs);
		return;
Loading