arch: riscv: introduce CONFIG_RISCV_GP_PURPOSE choice

Introduce `CONFIG_RISCV_GP_PURPOSE` choice to make sure that only
one of `CONFIG_RISCV_GP` or `CONFIG_RISCV_CURRENT_VIA_GP` can be
enabled, instead of relying of dependencies.

To do that, introduce a new
`CONFIG_RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING` that can be selected
by SoC when it implemented global pointer (GP) initialization for
relative addressing in its linker.

`CONFIG_RISCV_GP` will be the default choice when
`CONFIG_RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING=y`

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
Signed-off-by: Yong Cong Sin <yongcong.sin@gmail.com>
This commit is contained in:
Yong Cong Sin 2024-11-25 12:54:01 +08:00 committed by Benjamin Cabé
commit e6dd68ec89
37 changed files with 33 additions and 56 deletions

View file

@ -16,9 +16,13 @@ config FLOAT_HARD
help help
This option enables the hard-float calling convention. This option enables the hard-float calling convention.
choice RISCV_GP_PURPOSE
prompt "Purpose of the global pointer (GP) register"
default RISCV_GP if RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
config RISCV_GP config RISCV_GP
bool "RISC-V global pointer relative addressing" bool "RISC-V global pointer relative addressing"
default n depends on RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
help help
Use global pointer relative addressing for small globals declared Use global pointer relative addressing for small globals declared
anywhere in the executable. It can benefit performance and reduce anywhere in the executable. It can benefit performance and reduce
@ -30,7 +34,6 @@ config RISCV_GP
config RISCV_CURRENT_VIA_GP config RISCV_CURRENT_VIA_GP
bool "Store current thread into the global pointer (GP) register" bool "Store current thread into the global pointer (GP) register"
depends on !RISCV_GP
depends on MP_MAX_NUM_CPUS > 1 depends on MP_MAX_NUM_CPUS > 1
select ARCH_HAS_CUSTOM_CURRENT_IMPL select ARCH_HAS_CUSTOM_CURRENT_IMPL
help help
@ -38,6 +41,8 @@ config RISCV_CURRENT_VIA_GP
When is enabled, calls to `arch_current_thread()` & `k_sched_current_thread_query()` will When is enabled, calls to `arch_current_thread()` & `k_sched_current_thread_query()` will
be reduced to a single register read. be reduced to a single register read.
endchoice # RISCV_GP_PURPOSE
config RISCV_ALWAYS_SWITCH_THROUGH_ECALL config RISCV_ALWAYS_SWITCH_THROUGH_ECALL
bool "Do not use mret outside a trap handler context" bool "Do not use mret outside a trap handler context"
depends on MULTITHREADING depends on MULTITHREADING
@ -148,6 +153,12 @@ config RISCV_SOC_HAS_CUSTOM_SYS_IO
the RISC-V SoC needs to do something different and more than reading and the RISC-V SoC needs to do something different and more than reading and
writing the registers. writing the registers.
config RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
bool
help
Selected when SoC has implemented the initialization of global pointer (GP)
at program start, or earlier than any instruction using GP relative addressing.
config RISCV_SOC_CONTEXT_SAVE config RISCV_SOC_CONTEXT_SAVE
bool "SOC-based context saving in IRQ handlers" bool "SOC-based context saving in IRQ handlers"
select RISCV_SOC_OFFSETS select RISCV_SOC_OFFSETS

View file

@ -5,6 +5,7 @@ config SOC_SERIES_ANDES_AE350
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
config SOC_ANDES_AE350 config SOC_ANDES_AE350

View file

@ -21,9 +21,6 @@ config RISCV_GENERIC_TOOLCHAIN
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -3,7 +3,7 @@
config SOC_SERIES_ESP32C2 config SOC_SERIES_ESP32C2
select RISCV select RISCV
select RISCV_GP select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select DYNAMIC_INTERRUPTS select DYNAMIC_INTERRUPTS
select CLOCK_CONTROL select CLOCK_CONTROL
select PINCTRL select PINCTRL

View file

@ -3,7 +3,7 @@
config SOC_SERIES_ESP32C3 config SOC_SERIES_ESP32C3
select RISCV select RISCV
select RISCV_GP select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select DYNAMIC_INTERRUPTS select DYNAMIC_INTERRUPTS
select CLOCK_CONTROL select CLOCK_CONTROL
select PINCTRL select PINCTRL

View file

@ -3,7 +3,7 @@
config SOC_SERIES_ESP32C6 config SOC_SERIES_ESP32C6
select RISCV select RISCV
select RISCV_GP select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select DYNAMIC_INTERRUPTS select DYNAMIC_INTERRUPTS
select CLOCK_CONTROL select CLOCK_CONTROL
select PINCTRL select PINCTRL

View file

@ -13,6 +13,7 @@ config SOC_SERIES_GD32VF103
select RISCV_ISA_EXT_ZICSR select RISCV_ISA_EXT_ZICSR
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_HAS_CLIC select RISCV_HAS_CLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select ATOMIC_OPERATIONS_C select ATOMIC_OPERATIONS_C
select INCLUDE_RESET_VECTOR select INCLUDE_RESET_VECTOR
select GD32_HAS_AFIO_PINMUX select GD32_HAS_AFIO_PINMUX

View file

@ -17,9 +17,6 @@ config RISCV_MCAUSE_EXCEPTION_MASK
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config NUM_IRQS config NUM_IRQS
default 87 if NUCLEI_ECLIC default 87 if NUCLEI_ECLIC
default 16 if !NUCLEI_ECLIC default 16 if !NUCLEI_ECLIC

View file

@ -11,6 +11,7 @@ config SOC_SERIES_NIOSV
select RISCV_ISA_EXT_A select RISCV_ISA_EXT_A
select RISCV_ISA_EXT_ZICSR select RISCV_ISA_EXT_ZICSR
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
config SOC_NIOSV_M config SOC_NIOSV_M

View file

@ -10,9 +10,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config NUM_IRQS # Platform interrupts IRQs index start from index 16 config NUM_IRQS # Platform interrupts IRQs index start from index 16
default 32 default 32
config RISCV_GP
default y
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y

View file

@ -6,6 +6,7 @@ config SOC_SERIES_IT8XXX2
select HAS_PM select HAS_PM
select ARCH_HAS_CUSTOM_CPU_IDLE select ARCH_HAS_CUSTOM_CPU_IDLE
select ARCH_HAS_CUSTOM_CPU_ATOMIC_IDLE select ARCH_HAS_CUSTOM_CPU_ATOMIC_IDLE
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
if SOC_SERIES_IT8XXX2 if SOC_SERIES_IT8XXX2

View file

@ -3,9 +3,6 @@
if SOC_SERIES_IT8XXX2 if SOC_SERIES_IT8XXX2
config RISCV_GP
default y
config ARCH_HAS_CUSTOM_BUSY_WAIT config ARCH_HAS_CUSTOM_BUSY_WAIT
default y default y

View file

@ -16,6 +16,7 @@ config SOC_OPENTITAN
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
# OpenTitan Ibex core mtvec mode is read-only / forced to vectored mode. # OpenTitan Ibex core mtvec mode is read-only / forced to vectored mode.
select RISCV_VECTORED_MODE select RISCV_VECTORED_MODE
select GEN_IRQ_VECTOR_TABLE select GEN_IRQ_VECTOR_TABLE

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 32 default 32

View file

@ -7,6 +7,7 @@ config SOC_SERIES_MIV
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
config SOC_MIV config SOC_MIV

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -7,13 +7,14 @@ config SOC_SERIES_POLARFIRE
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
config SOC_POLARFIRE config SOC_POLARFIRE
select 64BIT select 64BIT
select SCHED_IPI_SUPPORTED select SCHED_IPI_SUPPORTED
select ATOMIC_OPERATIONS_BUILTIN select ATOMIC_OPERATIONS_BUILTIN
select RISCV_GP select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select USE_SWITCH_SUPPORTED select USE_SWITCH_SUPPORTED
select USE_SWITCH select USE_SWITCH

View file

@ -13,9 +13,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 13 default 13

View file

@ -9,6 +9,7 @@ config SOC_NEORV32
select RISCV_ISA_EXT_ZICSR select RISCV_ISA_EXT_ZICSR
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
if SOC_NEORV32 if SOC_NEORV32

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config NUM_IRQS config NUM_IRQS
default 32 default 32
config RISCV_GP
default y
config SYSCON config SYSCON
default y default y

View file

@ -10,6 +10,7 @@ config SOC_FAMILY_QEMU_VIRT_RISCV
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
if SOC_FAMILY_QEMU_VIRT_RISCV if SOC_FAMILY_QEMU_VIRT_RISCV

View file

@ -10,9 +10,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -13,4 +13,5 @@ config SOC_RISCV_VIRTUAL_RENODE
select RISCV_ISA_EXT_ZICSR select RISCV_ISA_EXT_ZICSR
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 1ST_LEVEL_INTERRUPT_BITS config 1ST_LEVEL_INTERRUPT_BITS
default 4 default 4

View file

@ -10,6 +10,7 @@ config SOC_SERIES_SIFIVE_FREEDOM_FE300
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_PMP select RISCV_PMP
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select RISCV_ISA_RV32I select RISCV_ISA_RV32I
select RISCV_ISA_EXT_M select RISCV_ISA_EXT_M

View file

@ -10,9 +10,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -12,6 +12,7 @@ config SOC_SERIES_SIFIVE_FREEDOM_FU500
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_PMP select RISCV_PMP
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select RISCV_ISA_RV64I select RISCV_ISA_RV64I
select RISCV_ISA_EXT_M select RISCV_ISA_EXT_M

View file

@ -10,9 +10,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -11,6 +11,7 @@ config SOC_SERIES_SIFIVE_FREEDOM_FU700
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_PMP select RISCV_PMP
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select RISCV_ISA_RV64I select RISCV_ISA_RV64I
select RISCV_ISA_EXT_M select RISCV_ISA_EXT_M

View file

@ -10,9 +10,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -12,6 +12,7 @@ config SOC_SERIES_RMX
select RISCV_ISA_EXT_C select RISCV_ISA_EXT_C
select RISCV_ISA_EXT_ZICSR select RISCV_ISA_EXT_ZICSR
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select INCLUDE_RESET_VECTOR select INCLUDE_RESET_VECTOR
select ATOMIC_OPERATIONS_BUILTIN select ATOMIC_OPERATIONS_BUILTIN
imply XIP imply XIP

View file

@ -6,9 +6,6 @@ if SOC_SERIES_RMX
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config MULTI_LEVEL_INTERRUPTS config MULTI_LEVEL_INTERRUPTS
default n default n

View file

@ -5,6 +5,7 @@ config SOC_SERIES_STARFIVE_JH71XX
select RISCV select RISCV
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
imply XIP imply XIP
config SOC_JH7100 config SOC_JH7100

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config 2ND_LVL_ISR_TBL_OFFSET config 2ND_LVL_ISR_TBL_OFFSET
default 12 default 12

View file

@ -12,6 +12,7 @@ config SOC_SERIES_TLSR951X
select RISCV_ISA_EXT_ZIFENCEI select RISCV_ISA_EXT_ZIFENCEI
select RISCV_PRIVILEGED select RISCV_PRIVILEGED
select RISCV_HAS_PLIC select RISCV_HAS_PLIC
select RISCV_SOC_HAS_GP_RELATIVE_ADDRESSING
select HAS_TELINK_DRIVERS select HAS_TELINK_DRIVERS
select ATOMIC_OPERATIONS_BUILTIN select ATOMIC_OPERATIONS_BUILTIN
select CPU_HAS_FPU select CPU_HAS_FPU

View file

@ -9,9 +9,6 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC
config RISCV_SOC_INTERRUPT_INIT config RISCV_SOC_INTERRUPT_INIT
default y default y
config RISCV_GP
default y
config NUM_IRQS config NUM_IRQS
default 64 default 64

View file

@ -8,8 +8,6 @@ tests:
arch.riscv64.riscv_gp.relative_addressing: arch.riscv64.riscv_gp.relative_addressing:
extra_configs: extra_configs:
- CONFIG_RISCV_GP=y - CONFIG_RISCV_GP=y
- CONFIG_RISCV_CURRENT_VIA_GP=n
arch.riscv64.riscv_gp.thread_pointer: arch.riscv64.riscv_gp.thread_pointer:
extra_configs: extra_configs:
- CONFIG_RISCV_CURRENT_VIA_GP=y - CONFIG_RISCV_CURRENT_VIA_GP=y
- CONFIG_RISCV_GP=n