[U-Boot] [PATCH 08/12] riscv: Add a helper routine to print CPU information

Auer, Lukas lukas.auer at aisec.fraunhofer.de
Thu Sep 6 21:29:41 UTC 2018


Hi Bin,

On Thu, 2018-09-06 at 11:03 +0800, Bin Meng wrote:
> Hi Lukas,
> 
> On Tue, Sep 4, 2018 at 5:42 AM Auer, Lukas
> <lukas.auer at aisec.fraunhofer.de> wrote:
> > 
> > On Thu, 2018-08-30 at 00:54 -0700, Bin Meng wrote:
> > > This adds a helper routine to print CPU information. Currently
> > > it prints all the instruction set extensions that the processor
> > > core supports.
> > > 
> > > Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> > > ---
> > > 
> > >  arch/riscv/Makefile          |   1 +
> > >  arch/riscv/cpu/Makefile      |   5 ++
> > >  arch/riscv/cpu/cpu.c         |  49 +++++++++++++++++
> > >  arch/riscv/include/asm/csr.h | 124
> > > +++++++++++++++++++++++++++++++++++++++++++
> > >  4 files changed, 179 insertions(+)
> > >  create mode 100644 arch/riscv/cpu/Makefile
> > >  create mode 100644 arch/riscv/cpu/cpu.c
> > >  create mode 100644 arch/riscv/include/asm/csr.h
> > > 
> > > diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
> > > index 084888a..af432e1 100644
> > > --- a/arch/riscv/Makefile
> > > +++ b/arch/riscv/Makefile
> > > @@ -5,5 +5,6 @@
> > > 
> > >  head-y := arch/riscv/cpu/$(CPU)/start.o
> > > 
> > > +libs-y += arch/riscv/cpu/
> > >  libs-y += arch/riscv/cpu/$(CPU)/
> > >  libs-y += arch/riscv/lib/
> > > diff --git a/arch/riscv/cpu/Makefile b/arch/riscv/cpu/Makefile
> > > new file mode 100644
> > > index 0000000..63de163
> > > --- /dev/null
> > > +++ b/arch/riscv/cpu/Makefile
> > > @@ -0,0 +1,5 @@
> > > +# SPDX-License-Identifier: GPL-2.0+
> > > +#
> > > +# Copyright (C) 2018, Bin Meng <bmeng.cn at gmail.com>
> > > +
> > > +obj-y += cpu.o
> > > diff --git a/arch/riscv/cpu/cpu.c b/arch/riscv/cpu/cpu.c
> > > new file mode 100644
> > > index 0000000..ae57fb8
> > > --- /dev/null
> > > +++ b/arch/riscv/cpu/cpu.c
> > > @@ -0,0 +1,49 @@
> > > +// SPDX-License-Identifier: GPL-2.0+
> > > +/*
> > > + * Copyright (C) 2018, Bin Meng <bmeng.cn at gmail.com>
> > > + */
> > > +
> > > +#include <common.h>
> > > +#include <asm/csr.h>
> > > +
> > > +enum {
> > > +     ISA_INVALID = 0,
> > > +     ISA_32BIT,
> > > +     ISA_64BIT,
> > > +     ISA_128BIT
> > > +};
> > > +
> > > +static const char * const isa_bits[] = {
> > > +     [ISA_INVALID] = NULL,
> > > +     [ISA_32BIT]   = "32",
> > > +     [ISA_64BIT]   = "64",
> > > +     [ISA_128BIT]  = "128"
> > > +};
> > > +
> > > +static inline bool supports_extension(char ext)
> > > +{
> > > +     return csr_read(misa) & (1 << (ext - 'a'));
> > > +}
> > > +
> > > +int print_cpuinfo(void)
> > > +{
> > > +     char name[32];
> > > +     char *s = name;
> > > +     int bit;
> > > +
> > > +     s += sprintf(name, "rv");
> > > +     bit = csr_read(misa) >> (sizeof(long) * 8 - 2);
> > > +     s += sprintf(s, isa_bits[bit]);
> > > +
> > > +     supports_extension('i') ? *s++ = 'i' : 'r';
> > > +     supports_extension('m') ? *s++ = 'm' : 'i';
> > > +     supports_extension('a') ? *s++ = 'a' : 's';
> > > +     supports_extension('f') ? *s++ = 'f' : 'c';
> > > +     supports_extension('d') ? *s++ = 'd' : '-';
> > > +     supports_extension('c') ? *s++ = 'c' : 'v';
> > > +     *s++ = '\0';
> > > +
> > > +     printf("CPU:   %s\n", name);
> > > +
> > > +     return 0;
> > > +}
> > > diff --git a/arch/riscv/include/asm/csr.h
> > > b/arch/riscv/include/asm/csr.h
> > > new file mode 100644
> > > index 0000000..50fccea
> > > --- /dev/null
> > > +++ b/arch/riscv/include/asm/csr.h
> > > @@ -0,0 +1,124 @@
> > > +/* SPDX-License-Identifier: GPL-2.0 */
> > > +/*
> > > + * Copyright (C) 2015 Regents of the University of California
> > > + *
> > > + * Taken from Linux arch/riscv/include/asm/csr.h
> > > + */
> > > +
> > > +#ifndef _ASM_RISCV_CSR_H
> > > +#define _ASM_RISCV_CSR_H
> > > +
> > > +/* Status register flags */
> > > +#define SR_SIE               _AC(0x00000002, UL) /* Supervisor
> > > Interrupt Enable */
> > > +#define SR_SPIE              _AC(0x00000020, UL) /* Previous
> > > Supervisor IE */
> > > +#define SR_SPP               _AC(0x00000100, UL) /* Previously
> > > Supervisor */
> > > +#define SR_SUM               _AC(0x00040000, UL) /* Supervisor
> > > access User Memory */
> > > +
> > > +#define SR_FS                _AC(0x00006000, UL) /* Floating-
> > > point
> > > Status */
> > > +#define SR_FS_OFF    _AC(0x00000000, UL)
> > > +#define SR_FS_INITIAL        _AC(0x00002000, UL)
> > > +#define SR_FS_CLEAN  _AC(0x00004000, UL)
> > > +#define SR_FS_DIRTY  _AC(0x00006000, UL)
> > > +
> > > +#define SR_XS                _AC(0x00018000, UL) /* Extension
> > > Status
> > > */
> > > +#define SR_XS_OFF    _AC(0x00000000, UL)
> > > +#define SR_XS_INITIAL        _AC(0x00008000, UL)
> > > +#define SR_XS_CLEAN  _AC(0x00010000, UL)
> > > +#define SR_XS_DIRTY  _AC(0x00018000, UL)
> > > +
> > > +#ifndef CONFIG_64BIT
> > > +#define SR_SD                _AC(0x80000000, UL) /* FS/XS dirty
> > > */
> > > +#else
> > > +#define SR_SD                _AC(0x8000000000000000, UL) /*
> > > FS/XS
> > > dirty */
> > > +#endif
> > > +
> > > +/* SATP flags */
> > > +#if __riscv_xlen == 32
> > > +#define SATP_PPN     _AC(0x003FFFFF, UL)
> > > +#define SATP_MODE_32 _AC(0x80000000, UL)
> > > +#define SATP_MODE    SATP_MODE_32
> > > +#else
> > > +#define SATP_PPN     _AC(0x00000FFFFFFFFFFF, UL)
> > > +#define SATP_MODE_39 _AC(0x8000000000000000, UL)
> > > +#define SATP_MODE    SATP_MODE_39
> > > +#endif
> > > +
> > > +/* Interrupt Enable and Interrupt Pending flags */
> > > +#define SIE_SSIE     _AC(0x00000002, UL) /* Software Interrupt
> > > Enable */
> > > +#define SIE_STIE     _AC(0x00000020, UL) /* Timer Interrupt
> > > Enable
> > > */
> > > +
> > > +#define EXC_INST_MISALIGNED  0
> > > +#define EXC_INST_ACCESS              1
> > > +#define EXC_BREAKPOINT               3
> > > +#define EXC_LOAD_ACCESS              5
> > > +#define EXC_STORE_ACCESS     7
> > > +#define EXC_SYSCALL          8
> > > +#define EXC_INST_PAGE_FAULT  12
> > > +#define EXC_LOAD_PAGE_FAULT  13
> > > +#define EXC_STORE_PAGE_FAULT 15
> > > +
> > > +#ifndef __ASSEMBLY__
> > > +
> > > +#define csr_swap(csr, val)                                   \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrrw %0, " #csr ", %1"          \
> > > +                           : "=r" (__v) : "rK" (__v)         \
> > > +                           : "memory");                      \
> > > +     __v;                                                    \
> > > +})
> > > +
> > > +#define csr_read(csr)
> > > \
> > > +({                                                           \
> > > +     register unsigned long __v;                             \
> > > +     __asm__ __volatile__ ("csrr %0, " #csr                  \
> > > +                           : "=r" (__v) :                    \
> > > +                           : "memory");                      \
> > > +     __v;                                                    \
> > > +})
> > > +
> > > +#define csr_write(csr, val)                                  \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrw " #csr ", %0"               \
> > > +                           : : "rK" (__v)                    \
> > > +                           : "memory");                      \
> > > +})
> > > +
> > > +#define csr_read_set(csr, val)
> > > \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrrs %0, " #csr ", %1"          \
> > > +                           : "=r" (__v) : "rK" (__v)         \
> > > +                           : "memory");                      \
> > > +     __v;                                                    \
> > > +})
> > > +
> > > +#define csr_set(csr, val)                                    \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrs " #csr ", %0"               \
> > > +                           : : "rK" (__v)                    \
> > > +                           : "memory");                      \
> > > +})
> > > +
> > > +#define csr_read_clear(csr, val)                             \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrrc %0, " #csr ", %1"          \
> > > +                           : "=r" (__v) : "rK" (__v)         \
> > > +                           : "memory");                      \
> > > +     __v;                                                    \
> > > +})
> > > +
> > > +#define csr_clear(csr, val)                                  \
> > > +({                                                           \
> > > +     unsigned long __v = (unsigned long)(val);               \
> > > +     __asm__ __volatile__ ("csrc " #csr ", %0"               \
> > > +                           : : "rK" (__v)                    \
> > > +                           : "memory");                      \
> > > +})
> > > +
> > > +#endif /* __ASSEMBLY__ */
> > > +
> > > +#endif /* _ASM_RISCV_CSR_H */
> > 
> > The RISC-V arch already has functions for accessing CSRs in
> > encoding.h.
> > I don't think it makes sense to keep both versions. I would tend
> > towards keeping this version since this allows us to just sync with
> > the
> > Linux kernel if there are any changes.
> 
> Thanks for pointing out. But I checked current Linux tree, and there
> is no encoding.h. Maybe encoding.h was from some old kernel tree? I
> can clean this up and leaving only csr.h in v2.
> 
> Regards,
> Bin

Sorry, I meant that encoding.h is in the u-boot RISC-V arch (
arch/riscv/include/asm/encoding.h). I think it's from bbl.

Thanks,
Lukas


More information about the U-Boot mailing list