Commit acda701b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'riscv-for-linus-5.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux

Pull RISC-V fixes from Palmer Dabbelt:
 "There are a few more fixes than a normal rc4, largely due to the
  bubble introduced by the holiday break:

   - return -ENOSYS for syscall number -1, which previously returned an
     uninitialized value.

   - ensure of_clk_init() has been called in time_init(), without which
     clock drivers may not be initialized.

   - fix sifive,uart0 driver to properly display the baud rate. A fix to
     initialize MPIE that allows interrupts to be processed during
     system calls.

   - avoid erronously begin tracing IRQs when interrupts are disabled,
     which at least triggers suprious lockdep failures.

   - workaround for a warning related to calling smp_processor_id()
     while preemptible. The warning itself is suprious on currently
     availiable systems.

   - properly include the generic time VDSO calls. A fix to our kasan
     address mapping. A fix to the HiFive Unleashed device tree, which
     allows the Ethernet PHY to be properly initialized by Linux (as
     opposed to relying on the bootloader).

   - defconfig update to include SiFive's GPIO driver, which is present
     on the HiFive Unleashed and necessary to initialize the PHY.

   - avoid allocating memory while initializing reserved memory.

   - avoid allocating the last 4K of memory, as pointers there alias
     with syscall errors.

  There are also two cleanups that should have no functional effect but
  do fix build warnings:

   - drop a duplicated definition of PAGE_KERNEL_EXEC.

   - properly declare the asm register SP shim.

   - cleanup the rv32 memory size Kconfig entry, to reflect the actual
     size of memory availiable"

* tag 'riscv-for-linus-5.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  RISC-V: Fix maximum allowed phsyical memory for RV32
  RISC-V: Set current memblock limit
  RISC-V: Do not allocate memblock while iterating reserved memblocks
  riscv: stacktrace: Move register keyword to beginning of declaration
  riscv: defconfig: enable gpio support for HiFive Unleashed
  dts: phy: add GPIO number and active state used for phy reset
  dts: phy: fix missing mdio device and probe failure of vsc8541-01 device
  riscv: Fix KASAN memory mapping.
  riscv: Fixup CONFIG_GENERIC_TIME_VSYSCALL
  riscv: cacheinfo: Fix using smp_processor_id() in preemptible
  riscv: Trace irq on only interrupt is enabled
  riscv: Drop a duplicated PAGE_KERNEL_EXEC
  riscv: Enable interrupts during syscalls with M-Mode
  riscv: Fix sifive serial driver
  riscv: Fix kernel time_init()
  riscv: return -ENOSYS for syscall -1
parents 9348b73c e5577937
...@@ -137,7 +137,7 @@ config PA_BITS ...@@ -137,7 +137,7 @@ config PA_BITS
config PAGE_OFFSET config PAGE_OFFSET
hex hex
default 0xC0000000 if 32BIT && MAXPHYSMEM_2GB default 0xC0000000 if 32BIT && MAXPHYSMEM_1GB
default 0x80000000 if 64BIT && !MMU default 0x80000000 if 64BIT && !MMU
default 0xffffffff80000000 if 64BIT && MAXPHYSMEM_2GB default 0xffffffff80000000 if 64BIT && MAXPHYSMEM_2GB
default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB
...@@ -247,10 +247,12 @@ config MODULE_SECTIONS ...@@ -247,10 +247,12 @@ config MODULE_SECTIONS
choice choice
prompt "Maximum Physical Memory" prompt "Maximum Physical Memory"
default MAXPHYSMEM_2GB if 32BIT default MAXPHYSMEM_1GB if 32BIT
default MAXPHYSMEM_2GB if 64BIT && CMODEL_MEDLOW default MAXPHYSMEM_2GB if 64BIT && CMODEL_MEDLOW
default MAXPHYSMEM_128GB if 64BIT && CMODEL_MEDANY default MAXPHYSMEM_128GB if 64BIT && CMODEL_MEDANY
config MAXPHYSMEM_1GB
bool "1GiB"
config MAXPHYSMEM_2GB config MAXPHYSMEM_2GB
bool "2GiB" bool "2GiB"
config MAXPHYSMEM_128GB config MAXPHYSMEM_128GB
......
...@@ -88,7 +88,9 @@ &eth0 { ...@@ -88,7 +88,9 @@ &eth0 {
phy-mode = "gmii"; phy-mode = "gmii";
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy0: ethernet-phy@0 { phy0: ethernet-phy@0 {
compatible = "ethernet-phy-id0007.0771";
reg = <0>; reg = <0>;
reset-gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
}; };
}; };
......
...@@ -64,6 +64,8 @@ CONFIG_HW_RANDOM=y ...@@ -64,6 +64,8 @@ CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_VIRTIO=y CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_SIFIVE=y CONFIG_SPI_SIFIVE=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SIFIVE=y
# CONFIG_PTP_1588_CLOCK is not set # CONFIG_PTP_1588_CLOCK is not set
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_DRM=y CONFIG_DRM=y
......
...@@ -99,7 +99,6 @@ ...@@ -99,7 +99,6 @@
| _PAGE_DIRTY) | _PAGE_DIRTY)
#define PAGE_KERNEL __pgprot(_PAGE_KERNEL) #define PAGE_KERNEL __pgprot(_PAGE_KERNEL)
#define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL | _PAGE_EXEC)
#define PAGE_KERNEL_READ __pgprot(_PAGE_KERNEL & ~_PAGE_WRITE) #define PAGE_KERNEL_READ __pgprot(_PAGE_KERNEL & ~_PAGE_WRITE)
#define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL | _PAGE_EXEC) #define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL | _PAGE_EXEC)
#define PAGE_KERNEL_READ_EXEC __pgprot((_PAGE_KERNEL & ~_PAGE_WRITE) \ #define PAGE_KERNEL_READ_EXEC __pgprot((_PAGE_KERNEL & ~_PAGE_WRITE) \
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <linux/types.h> #include <linux/types.h>
#ifndef GENERIC_TIME_VSYSCALL #ifndef CONFIG_GENERIC_TIME_VSYSCALL
struct vdso_data { struct vdso_data {
}; };
#endif #endif
......
...@@ -26,7 +26,16 @@ cache_get_priv_group(struct cacheinfo *this_leaf) ...@@ -26,7 +26,16 @@ cache_get_priv_group(struct cacheinfo *this_leaf)
static struct cacheinfo *get_cacheinfo(u32 level, enum cache_type type) static struct cacheinfo *get_cacheinfo(u32 level, enum cache_type type)
{ {
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(smp_processor_id()); /*
* Using raw_smp_processor_id() elides a preemptability check, but this
* is really indicative of a larger problem: the cacheinfo UABI assumes
* that cores have a homonogenous view of the cache hierarchy. That
* happens to be the case for the current set of RISC-V systems, but
* likely won't be true in general. Since there's no way to provide
* correct information for these systems via the current UABI we're
* just eliding the check for now.
*/
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(raw_smp_processor_id());
struct cacheinfo *this_leaf; struct cacheinfo *this_leaf;
int index; int index;
......
...@@ -124,15 +124,15 @@ skip_context_tracking: ...@@ -124,15 +124,15 @@ skip_context_tracking:
REG_L a1, (a1) REG_L a1, (a1)
jr a1 jr a1
1: 1:
#ifdef CONFIG_TRACE_IRQFLAGS
call trace_hardirqs_on
#endif
/* /*
* Exceptions run with interrupts enabled or disabled depending on the * Exceptions run with interrupts enabled or disabled depending on the
* state of SR_PIE in m/sstatus. * state of SR_PIE in m/sstatus.
*/ */
andi t0, s1, SR_PIE andi t0, s1, SR_PIE
beqz t0, 1f beqz t0, 1f
#ifdef CONFIG_TRACE_IRQFLAGS
call trace_hardirqs_on
#endif
csrs CSR_STATUS, SR_IE csrs CSR_STATUS, SR_IE
1: 1:
...@@ -155,6 +155,15 @@ skip_context_tracking: ...@@ -155,6 +155,15 @@ skip_context_tracking:
tail do_trap_unknown tail do_trap_unknown
handle_syscall: handle_syscall:
#ifdef CONFIG_RISCV_M_MODE
/*
* When running is M-Mode (no MMU config), MPIE does not get set.
* As a result, we need to force enable interrupts here because
* handle_exception did not do set SR_IE as it always sees SR_PIE
* being cleared.
*/
csrs CSR_STATUS, SR_IE
#endif
#if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING)
/* Recover a0 - a7 for system calls */ /* Recover a0 - a7 for system calls */
REG_L a0, PT_A0(sp) REG_L a0, PT_A0(sp)
...@@ -186,14 +195,7 @@ check_syscall_nr: ...@@ -186,14 +195,7 @@ check_syscall_nr:
* Syscall number held in a7. * Syscall number held in a7.
* If syscall number is above allowed value, redirect to ni_syscall. * If syscall number is above allowed value, redirect to ni_syscall.
*/ */
bge a7, t0, 1f bgeu a7, t0, 1f
/*
* Check if syscall is rejected by tracer, i.e., a7 == -1.
* If yes, we pretend it was executed.
*/
li t1, -1
beq a7, t1, ret_from_syscall_rejected
blt a7, t1, 1f
/* Call syscall */ /* Call syscall */
la s0, sys_call_table la s0, sys_call_table
slli t0, a7, RISCV_LGPTR slli t0, a7, RISCV_LGPTR
......
...@@ -127,7 +127,9 @@ static void __init init_resources(void) ...@@ -127,7 +127,9 @@ static void __init init_resources(void)
{ {
struct memblock_region *region = NULL; struct memblock_region *region = NULL;
struct resource *res = NULL; struct resource *res = NULL;
int ret = 0; struct resource *mem_res = NULL;
size_t mem_res_sz = 0;
int ret = 0, i = 0;
code_res.start = __pa_symbol(_text); code_res.start = __pa_symbol(_text);
code_res.end = __pa_symbol(_etext) - 1; code_res.end = __pa_symbol(_etext) - 1;
...@@ -145,16 +147,17 @@ static void __init init_resources(void) ...@@ -145,16 +147,17 @@ static void __init init_resources(void)
bss_res.end = __pa_symbol(__bss_stop) - 1; bss_res.end = __pa_symbol(__bss_stop) - 1;
bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
mem_res_sz = (memblock.memory.cnt + memblock.reserved.cnt) * sizeof(*mem_res);
mem_res = memblock_alloc(mem_res_sz, SMP_CACHE_BYTES);
if (!mem_res)
panic("%s: Failed to allocate %zu bytes\n", __func__, mem_res_sz);
/* /*
* Start by adding the reserved regions, if they overlap * Start by adding the reserved regions, if they overlap
* with /memory regions, insert_resource later on will take * with /memory regions, insert_resource later on will take
* care of it. * care of it.
*/ */
for_each_reserved_mem_region(region) { for_each_reserved_mem_region(region) {
res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES); res = &mem_res[i++];
if (!res)
panic("%s: Failed to allocate %zu bytes\n", __func__,
sizeof(struct resource));
res->name = "Reserved"; res->name = "Reserved";
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
...@@ -171,8 +174,10 @@ static void __init init_resources(void) ...@@ -171,8 +174,10 @@ static void __init init_resources(void)
* Ignore any other reserved regions within * Ignore any other reserved regions within
* system memory. * system memory.
*/ */
if (memblock_is_memory(res->start)) if (memblock_is_memory(res->start)) {
memblock_free((phys_addr_t) res, sizeof(struct resource));
continue; continue;
}
ret = add_resource(&iomem_resource, res); ret = add_resource(&iomem_resource, res);
if (ret < 0) if (ret < 0)
...@@ -181,10 +186,7 @@ static void __init init_resources(void) ...@@ -181,10 +186,7 @@ static void __init init_resources(void)
/* Add /memory regions to the resource tree */ /* Add /memory regions to the resource tree */
for_each_mem_region(region) { for_each_mem_region(region) {
res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES); res = &mem_res[i++];
if (!res)
panic("%s: Failed to allocate %zu bytes\n", __func__,
sizeof(struct resource));
if (unlikely(memblock_is_nomap(region))) { if (unlikely(memblock_is_nomap(region))) {
res->name = "Reserved"; res->name = "Reserved";
...@@ -205,9 +207,9 @@ static void __init init_resources(void) ...@@ -205,9 +207,9 @@ static void __init init_resources(void)
return; return;
error: error:
memblock_free((phys_addr_t) res, sizeof(struct resource));
/* Better an empty resource tree than an inconsistent one */ /* Better an empty resource tree than an inconsistent one */
release_child_resources(&iomem_resource); release_child_resources(&iomem_resource);
memblock_free((phys_addr_t) mem_res, mem_res_sz);
} }
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
register unsigned long sp_in_global __asm__("sp"); register const unsigned long sp_in_global __asm__("sp");
#ifdef CONFIG_FRAME_POINTER #ifdef CONFIG_FRAME_POINTER
...@@ -28,9 +28,8 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, ...@@ -28,9 +28,8 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
sp = user_stack_pointer(regs); sp = user_stack_pointer(regs);
pc = instruction_pointer(regs); pc = instruction_pointer(regs);
} else if (task == NULL || task == current) { } else if (task == NULL || task == current) {
const register unsigned long current_sp = sp_in_global;
fp = (unsigned long)__builtin_frame_address(0); fp = (unsigned long)__builtin_frame_address(0);
sp = current_sp; sp = sp_in_global;
pc = (unsigned long)walk_stackframe; pc = (unsigned long)walk_stackframe;
} else { } else {
/* task blocked in __switch_to */ /* task blocked in __switch_to */
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* Copyright (C) 2017 SiFive * Copyright (C) 2017 SiFive
*/ */
#include <linux/of_clk.h>
#include <linux/clocksource.h> #include <linux/clocksource.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <asm/sbi.h> #include <asm/sbi.h>
...@@ -24,6 +25,8 @@ void __init time_init(void) ...@@ -24,6 +25,8 @@ void __init time_init(void)
riscv_timebase = prop; riscv_timebase = prop;
lpj_fine = riscv_timebase / HZ; lpj_fine = riscv_timebase / HZ;
of_clk_init(NULL);
timer_probe(); timer_probe();
} }
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <linux/binfmts.h> #include <linux/binfmts.h>
#include <linux/err.h> #include <linux/err.h>
#include <asm/page.h> #include <asm/page.h>
#ifdef GENERIC_TIME_VSYSCALL #ifdef CONFIG_GENERIC_TIME_VSYSCALL
#include <vdso/datapage.h> #include <vdso/datapage.h>
#else #else
#include <asm/vdso.h> #include <asm/vdso.h>
......
...@@ -157,9 +157,10 @@ static void __init setup_initrd(void) ...@@ -157,9 +157,10 @@ static void __init setup_initrd(void)
void __init setup_bootmem(void) void __init setup_bootmem(void)
{ {
phys_addr_t mem_start = 0; phys_addr_t mem_start = 0;
phys_addr_t start, end = 0; phys_addr_t start, dram_end, end = 0;
phys_addr_t vmlinux_end = __pa_symbol(&_end); phys_addr_t vmlinux_end = __pa_symbol(&_end);
phys_addr_t vmlinux_start = __pa_symbol(&_start); phys_addr_t vmlinux_start = __pa_symbol(&_start);
phys_addr_t max_mapped_addr = __pa(~(ulong)0);
u64 i; u64 i;
/* Find the memory region containing the kernel */ /* Find the memory region containing the kernel */
...@@ -181,7 +182,18 @@ void __init setup_bootmem(void) ...@@ -181,7 +182,18 @@ void __init setup_bootmem(void)
/* Reserve from the start of the kernel to the end of the kernel */ /* Reserve from the start of the kernel to the end of the kernel */
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
max_pfn = PFN_DOWN(memblock_end_of_DRAM()); dram_end = memblock_end_of_DRAM();
/*
* memblock allocator is not aware of the fact that last 4K bytes of
* the addressable memory can not be mapped because of IS_ERR_VALUE
* macro. Make sure that last 4k bytes are not usable by memblock
* if end of dram is equal to maximum addressable memory.
*/
if (max_mapped_addr == (dram_end - 1))
memblock_set_current_limit(max_mapped_addr - 4096);
max_pfn = PFN_DOWN(dram_end);
max_low_pfn = max_pfn; max_low_pfn = max_pfn;
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn)); dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
set_max_mapnr(max_low_pfn); set_max_mapnr(max_low_pfn);
......
...@@ -93,8 +93,8 @@ void __init kasan_init(void) ...@@ -93,8 +93,8 @@ void __init kasan_init(void)
VMALLOC_END)); VMALLOC_END));
for_each_mem_range(i, &_start, &_end) { for_each_mem_range(i, &_start, &_end) {
void *start = (void *)_start; void *start = (void *)__va(_start);
void *end = (void *)_end; void *end = (void *)__va(_end);
if (start >= end) if (start >= end)
break; break;
......
...@@ -1000,6 +1000,7 @@ static int sifive_serial_probe(struct platform_device *pdev) ...@@ -1000,6 +1000,7 @@ static int sifive_serial_probe(struct platform_device *pdev)
/* Set up clock divider */ /* Set up clock divider */
ssp->clkin_rate = clk_get_rate(ssp->clk); ssp->clkin_rate = clk_get_rate(ssp->clk);
ssp->baud_rate = SIFIVE_DEFAULT_BAUD_RATE; ssp->baud_rate = SIFIVE_DEFAULT_BAUD_RATE;
ssp->port.uartclk = ssp->baud_rate * 16;
__ssp_update_div(ssp); __ssp_update_div(ssp);
platform_set_drvdata(pdev, ssp); platform_set_drvdata(pdev, ssp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment