RISC-V updates for v5.3-rc4
A few minor RISC-V updates for v5.3-rc4: - Remove __udivdi3() from the 32-bit Linux port, converting the only upstream user to use do_div(), per Linux policy - Convert the RISC-V standard clocksource away from per-cpu data structures, since only one is used by Linux, even on a multi-CPU system - A set of DT binding updates that remove an obsolete text binding in favor of a YAML binding, fix a bogus compatible string in the schema (thus fixing a "make dtbs_check" warning), and clarifies the future values expected in one of the RISC-V CPU properties -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEElRDoIDdEz9/svf2Kx4+xDQu9KksFAl1PO50ACgkQx4+xDQu9 Kks+aA//d2HVbYpsQT4dnK9HHySTEN8COpxAtXEyprqEqFvhGWiXHf/o5DZJS+KA J0T4tnfajUxNzN+/B+Wvg8QRZyojad1gPQ8WpKGsRjVMtSZJuvo/knW1aVJPFr5S 28AjXyR5XVugvt5mNSNJTrPBeJ/bzNSZOLfat+gCsHBblNipdWwZhOwcM4mi3sQM 9fc8R5Mg0LHwNF0yVoA47WEwWgjXINkOE5ntvgNydiwoTc4noB046gy0ciZF04WS YZMNRmr3BCL30zGZv6Ewu7xvcRYf84wjhIvPFkuaJHfxBzwAd4gulsytqGCQmFIC Na7/5HOtzXpsS27hSev+1SGljv81p3rlKIBVxB2E1OH/eDl1U+yhm/AtM0wbXkpD 2UMHmKoSL/oYIXKOXwpWSKTGxNJbF1c56q4lwDVjq/kvg88GhFXQV/cQV1pS2Aao KkqKl8AfxzoG3KNGKNJD42ztMW+3a3Wp215pGbrVVAwVOD8kFgCiM9RtqH2pTZrA AjD/wpAaH9glGkCcwPovzOJ1XA9VKLy4nWLowv5zB9To1wbbAuYRj/7pUNm6LTWF kcU0E6Yza5b2kKvwSzLdZa4W837XQrf3fRKMTTgH+fcjwma+GlLwx+f6Yk8AmTpP TMSpV9C6M5RKLVqdzNWUT7q4dzTsNPXse5DhhhnMh3cBPHIGlzQ= =DIhv -----END PGP SIGNATURE----- Merge tag 'riscv/for-v5.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V updates from Paul Walmsley: "A few minor RISC-V updates for v5.3-rc4: - Remove __udivdi3() from the 32-bit Linux port, converting the only upstream user to use do_div(), per Linux policy - Convert the RISC-V standard clocksource away from per-cpu data structures, since only one is used by Linux, even on a multi-CPU system - A set of DT binding updates that remove an obsolete text binding in favor of a YAML binding, fix a bogus compatible string in the schema (thus fixing a "make dtbs_check" warning), and clarifies the future values expected in one of the RISC-V CPU properties" * tag 'riscv/for-v5.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: dt-bindings: riscv: fix the schema compatible string for the HiFive Unleashed board dt-bindings: riscv: remove obsolete cpus.txt RISC-V: Remove udivdi3 riscv: delay: use do_div() instead of __udivdi3() dt-bindings: Update the riscv,isa string description RISC-V: Remove per cpu clocksource
This commit is contained in:
Коммит
296d05cb0d
|
@ -1,162 +0,0 @@
|
||||||
===================
|
|
||||||
RISC-V CPU Bindings
|
|
||||||
===================
|
|
||||||
|
|
||||||
The device tree allows to describe the layout of CPUs in a system through
|
|
||||||
the "cpus" node, which in turn contains a number of subnodes (ie "cpu")
|
|
||||||
defining properties for every cpu.
|
|
||||||
|
|
||||||
Bindings for CPU nodes follow the Devicetree Specification, available from:
|
|
||||||
|
|
||||||
https://www.devicetree.org/specifications/
|
|
||||||
|
|
||||||
with updates for 32-bit and 64-bit RISC-V systems provided in this document.
|
|
||||||
|
|
||||||
===========
|
|
||||||
Terminology
|
|
||||||
===========
|
|
||||||
|
|
||||||
This document uses some terminology common to the RISC-V community that is not
|
|
||||||
widely used, the definitions of which are listed here:
|
|
||||||
|
|
||||||
* hart: A hardware execution context, which contains all the state mandated by
|
|
||||||
the RISC-V ISA: a PC and some registers. This terminology is designed to
|
|
||||||
disambiguate software's view of execution contexts from any particular
|
|
||||||
microarchitectural implementation strategy. For example, my Intel laptop is
|
|
||||||
described as having one socket with two cores, each of which has two hyper
|
|
||||||
threads. Therefore this system has four harts.
|
|
||||||
|
|
||||||
=====================================
|
|
||||||
cpus and cpu node bindings definition
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
The RISC-V architecture, in accordance with the Devicetree Specification,
|
|
||||||
requires the cpus and cpu nodes to be present and contain the properties
|
|
||||||
described below.
|
|
||||||
|
|
||||||
- cpus node
|
|
||||||
|
|
||||||
Description: Container of cpu nodes
|
|
||||||
|
|
||||||
The node name must be "cpus".
|
|
||||||
|
|
||||||
A cpus node must define the following properties:
|
|
||||||
|
|
||||||
- #address-cells
|
|
||||||
Usage: required
|
|
||||||
Value type: <u32>
|
|
||||||
Definition: must be set to 1
|
|
||||||
- #size-cells
|
|
||||||
Usage: required
|
|
||||||
Value type: <u32>
|
|
||||||
Definition: must be set to 0
|
|
||||||
|
|
||||||
- cpu node
|
|
||||||
|
|
||||||
Description: Describes a hart context
|
|
||||||
|
|
||||||
PROPERTIES
|
|
||||||
|
|
||||||
- device_type
|
|
||||||
Usage: required
|
|
||||||
Value type: <string>
|
|
||||||
Definition: must be "cpu"
|
|
||||||
- reg
|
|
||||||
Usage: required
|
|
||||||
Value type: <u32>
|
|
||||||
Definition: The hart ID of this CPU node
|
|
||||||
- compatible:
|
|
||||||
Usage: required
|
|
||||||
Value type: <stringlist>
|
|
||||||
Definition: must contain "riscv", may contain one of
|
|
||||||
"sifive,rocket0"
|
|
||||||
- mmu-type:
|
|
||||||
Usage: optional
|
|
||||||
Value type: <string>
|
|
||||||
Definition: Specifies the CPU's MMU type. Possible values are
|
|
||||||
"riscv,sv32"
|
|
||||||
"riscv,sv39"
|
|
||||||
"riscv,sv48"
|
|
||||||
- riscv,isa:
|
|
||||||
Usage: required
|
|
||||||
Value type: <string>
|
|
||||||
Definition: Contains the RISC-V ISA string of this hart. These
|
|
||||||
ISA strings are defined by the RISC-V ISA manual.
|
|
||||||
|
|
||||||
Example: SiFive Freedom U540G Development Kit
|
|
||||||
---------------------------------------------
|
|
||||||
|
|
||||||
This system contains two harts: a hart marked as disabled that's used for
|
|
||||||
low-level system tasks and should be ignored by Linux, and a second hart that
|
|
||||||
Linux is allowed to run on.
|
|
||||||
|
|
||||||
cpus {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
timebase-frequency = <1000000>;
|
|
||||||
cpu@0 {
|
|
||||||
clock-frequency = <1600000000>;
|
|
||||||
compatible = "sifive,rocket0", "riscv";
|
|
||||||
device_type = "cpu";
|
|
||||||
i-cache-block-size = <64>;
|
|
||||||
i-cache-sets = <128>;
|
|
||||||
i-cache-size = <16384>;
|
|
||||||
next-level-cache = <&L15 &L0>;
|
|
||||||
reg = <0>;
|
|
||||||
riscv,isa = "rv64imac";
|
|
||||||
status = "disabled";
|
|
||||||
L10: interrupt-controller {
|
|
||||||
#interrupt-cells = <1>;
|
|
||||||
compatible = "riscv,cpu-intc";
|
|
||||||
interrupt-controller;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
cpu@1 {
|
|
||||||
clock-frequency = <1600000000>;
|
|
||||||
compatible = "sifive,rocket0", "riscv";
|
|
||||||
d-cache-block-size = <64>;
|
|
||||||
d-cache-sets = <64>;
|
|
||||||
d-cache-size = <32768>;
|
|
||||||
d-tlb-sets = <1>;
|
|
||||||
d-tlb-size = <32>;
|
|
||||||
device_type = "cpu";
|
|
||||||
i-cache-block-size = <64>;
|
|
||||||
i-cache-sets = <64>;
|
|
||||||
i-cache-size = <32768>;
|
|
||||||
i-tlb-sets = <1>;
|
|
||||||
i-tlb-size = <32>;
|
|
||||||
mmu-type = "riscv,sv39";
|
|
||||||
next-level-cache = <&L15 &L0>;
|
|
||||||
reg = <1>;
|
|
||||||
riscv,isa = "rv64imafdc";
|
|
||||||
status = "okay";
|
|
||||||
tlb-split;
|
|
||||||
L13: interrupt-controller {
|
|
||||||
#interrupt-cells = <1>;
|
|
||||||
compatible = "riscv,cpu-intc";
|
|
||||||
interrupt-controller;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Example: Spike ISA Simulator with 1 Hart
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
This device tree matches the Spike ISA golden model as run with `spike -p1`.
|
|
||||||
|
|
||||||
cpus {
|
|
||||||
cpu@0 {
|
|
||||||
device_type = "cpu";
|
|
||||||
reg = <0x00000000>;
|
|
||||||
status = "okay";
|
|
||||||
compatible = "riscv";
|
|
||||||
riscv,isa = "rv64imafdc";
|
|
||||||
mmu-type = "riscv,sv48";
|
|
||||||
clock-frequency = <0x3b9aca00>;
|
|
||||||
interrupt-controller {
|
|
||||||
#interrupt-cells = <0x00000001>;
|
|
||||||
interrupt-controller;
|
|
||||||
compatible = "riscv,cpu-intc";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -10,6 +10,18 @@ maintainers:
|
||||||
- Paul Walmsley <paul.walmsley@sifive.com>
|
- Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
- Palmer Dabbelt <palmer@sifive.com>
|
- Palmer Dabbelt <palmer@sifive.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
This document uses some terminology common to the RISC-V community
|
||||||
|
that is not widely used, the definitions of which are listed here:
|
||||||
|
|
||||||
|
hart: A hardware execution context, which contains all the state
|
||||||
|
mandated by the RISC-V ISA: a PC and some registers. This
|
||||||
|
terminology is designed to disambiguate software's view of execution
|
||||||
|
contexts from any particular microarchitectural implementation
|
||||||
|
strategy. For example, an Intel laptop containing one socket with
|
||||||
|
two cores, each of which has two hyperthreads, could be described as
|
||||||
|
having four harts.
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
|
@ -50,6 +62,10 @@ properties:
|
||||||
User-Level ISA document, available from
|
User-Level ISA document, available from
|
||||||
https://riscv.org/specifications/
|
https://riscv.org/specifications/
|
||||||
|
|
||||||
|
While the isa strings in ISA specification are case
|
||||||
|
insensitive, letters in the riscv,isa string must be all
|
||||||
|
lowercase to simplify parsing.
|
||||||
|
|
||||||
timebase-frequency:
|
timebase-frequency:
|
||||||
type: integer
|
type: integer
|
||||||
minimum: 1
|
minimum: 1
|
||||||
|
|
|
@ -19,7 +19,7 @@ properties:
|
||||||
compatible:
|
compatible:
|
||||||
items:
|
items:
|
||||||
- enum:
|
- enum:
|
||||||
- sifive,freedom-unleashed-a00
|
- sifive,hifive-unleashed-a00
|
||||||
- const: sifive,fu540-c000
|
- const: sifive,fu540-c000
|
||||||
- const: sifive,fu540
|
- const: sifive,fu540
|
||||||
...
|
...
|
||||||
|
|
|
@ -5,5 +5,3 @@ lib-y += memset.o
|
||||||
lib-y += uaccess.o
|
lib-y += uaccess.o
|
||||||
|
|
||||||
lib-$(CONFIG_64BIT) += tishift.o
|
lib-$(CONFIG_64BIT) += tishift.o
|
||||||
|
|
||||||
lib-$(CONFIG_32BIT) += udivdi3.o
|
|
||||||
|
|
|
@ -81,9 +81,13 @@ EXPORT_SYMBOL(__delay);
|
||||||
void udelay(unsigned long usecs)
|
void udelay(unsigned long usecs)
|
||||||
{
|
{
|
||||||
u64 ucycles = (u64)usecs * lpj_fine * UDELAY_MULT;
|
u64 ucycles = (u64)usecs * lpj_fine * UDELAY_MULT;
|
||||||
|
u64 n;
|
||||||
|
|
||||||
if (unlikely(usecs > MAX_UDELAY_US)) {
|
if (unlikely(usecs > MAX_UDELAY_US)) {
|
||||||
__delay((u64)usecs * riscv_timebase / 1000000ULL);
|
n = (u64)usecs * riscv_timebase;
|
||||||
|
do_div(n, 1000000);
|
||||||
|
|
||||||
|
__delay(n);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2016-2017 Free Software Foundation, Inc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
|
|
||||||
ENTRY(__udivdi3)
|
|
||||||
mv a2, a1
|
|
||||||
mv a1, a0
|
|
||||||
li a0, -1
|
|
||||||
beqz a2, .L5
|
|
||||||
li a3, 1
|
|
||||||
bgeu a2, a1, .L2
|
|
||||||
.L1:
|
|
||||||
blez a2, .L2
|
|
||||||
slli a2, a2, 1
|
|
||||||
slli a3, a3, 1
|
|
||||||
bgtu a1, a2, .L1
|
|
||||||
.L2:
|
|
||||||
li a0, 0
|
|
||||||
.L3:
|
|
||||||
bltu a1, a2, .L4
|
|
||||||
sub a1, a1, a2
|
|
||||||
or a0, a0, a3
|
|
||||||
.L4:
|
|
||||||
srli a3, a3, 1
|
|
||||||
srli a2, a2, 1
|
|
||||||
bnez a3, .L3
|
|
||||||
.L5:
|
|
||||||
ret
|
|
||||||
ENDPROC(__udivdi3)
|
|
|
@ -55,7 +55,7 @@ static u64 riscv_sched_clock(void)
|
||||||
return get_cycles64();
|
return get_cycles64();
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct clocksource, riscv_clocksource) = {
|
static struct clocksource riscv_clocksource = {
|
||||||
.name = "riscv_clocksource",
|
.name = "riscv_clocksource",
|
||||||
.rating = 300,
|
.rating = 300,
|
||||||
.mask = CLOCKSOURCE_MASK(64),
|
.mask = CLOCKSOURCE_MASK(64),
|
||||||
|
@ -92,7 +92,6 @@ void riscv_timer_interrupt(void)
|
||||||
static int __init riscv_timer_init_dt(struct device_node *n)
|
static int __init riscv_timer_init_dt(struct device_node *n)
|
||||||
{
|
{
|
||||||
int cpuid, hartid, error;
|
int cpuid, hartid, error;
|
||||||
struct clocksource *cs;
|
|
||||||
|
|
||||||
hartid = riscv_of_processor_hartid(n);
|
hartid = riscv_of_processor_hartid(n);
|
||||||
if (hartid < 0) {
|
if (hartid < 0) {
|
||||||
|
@ -112,8 +111,7 @@ static int __init riscv_timer_init_dt(struct device_node *n)
|
||||||
|
|
||||||
pr_info("%s: Registering clocksource cpuid [%d] hartid [%d]\n",
|
pr_info("%s: Registering clocksource cpuid [%d] hartid [%d]\n",
|
||||||
__func__, cpuid, hartid);
|
__func__, cpuid, hartid);
|
||||||
cs = per_cpu_ptr(&riscv_clocksource, cpuid);
|
error = clocksource_register_hz(&riscv_clocksource, riscv_timebase);
|
||||||
error = clocksource_register_hz(cs, riscv_timebase);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
pr_err("RISCV timer register failed [%d] for cpu = [%d]\n",
|
pr_err("RISCV timer register failed [%d] for cpu = [%d]\n",
|
||||||
error, cpuid);
|
error, cpuid);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче