mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-21 20:22:13 +08:00
0bfbc914d9
* Support for byte/half-word compare-and-exchange, emulated via LR/SC loops. * Support for Rust. * Support for Zihintpause in hwprobe. * Support for the PR_RISCV_SET_ICACHE_FLUSH_CTX prctl(). * Support for lockless lockrefs. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmZN/hcTHHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYiVrGEACUT3gsbTx1q7fa11iQNxOjVkpl66Qn 7+kI+V9xt5+GuH2EjJk6AsSNHPKeQ8totbSTA8AZjINFvgVjXslN+DPpcjCFKvnh NN5/Lyd64X0PZMsxGWlN9SHTFWf2b7lalCnY51BlX/IpBbHWc/no9XUsPSVixx6u 9q+JoS3D1DDV92nGcA/UK9ICCsDcf4omWgZW7KbjnVWnuY9jt4ctTy11jtF2RM9R Z9KAWh0RqPzjz0vNbBBf9Iw7E4jt/Px6HDYPfZAiE2dVsCTHjdsC7TcGRYXzKt6F 4q9zg8kzwvUG5GaBl7/XprXO1vaeOUmPcTVoE7qlRkSdkknRH/iBz1P4hk+r0fze f+h5ZUV/oJP7vDb+vHm/BExtGufgLuJ2oMA2Bp9qI17EMcMsGiRMt7DsBMEafWDk bNrFcJdqqYBz6HxfTwzNH5ErxfS/59PuwYl913BTSOH//raCZCFXOfyrSICH7qXd UFOLLmBpMuApLa8ayFeI9Mp3flWfbdQHR52zLRLiUvlpWNEDKrNQN417juVwTXF0 DYkjJDhFPLfFOr/sJBboftOMOUdA9c/CJepY9o4kPvBXUvPtRHN1jdXDNSCVDZRb nErnsJ9rv0PzfxQU7Xjhd2QmCMeMlbCQDpXAKKETyyimpTbgF33rovN0i5ixX3m4 KG6RvKDubOzZdA== =YLoD -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-6.10-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V updates from Palmer Dabbelt: - Add byte/half-word compare-and-exchange, emulated via LR/SC loops - Support for Rust - Support for Zihintpause in hwprobe - Add PR_RISCV_SET_ICACHE_FLUSH_CTX prctl() - Support lockless lockrefs * tag 'riscv-for-linus-6.10-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: (42 commits) riscv: defconfig: Enable CONFIG_CLK_SOPHGO_CV1800 riscv: select ARCH_HAS_FAST_MULTIPLIER riscv: mm: still create swiotlb buffer for kmalloc() bouncing if required riscv: Annotate pgtable_l{4,5}_enabled with __ro_after_init riscv: Remove redundant CONFIG_64BIT from pgtable_l{4,5}_enabled riscv: mm: Always use an ASID to flush mm contexts riscv: mm: Preserve global TLB entries when switching contexts riscv: mm: Make asid_bits a local variable riscv: mm: Use a fixed layout for the MM context ID riscv: mm: Introduce cntx2asid/cntx2version helper macros riscv: Avoid TLB flush loops when affected by SiFive CIP-1200 riscv: Apply SiFive CIP-1200 workaround to single-ASID sfence.vma riscv: mm: Combine the SMP and UP TLB flush code riscv: Only send remote fences when some other CPU is online riscv: mm: Broadcast kernel TLB flushes only when needed riscv: Use IPIs for remote cache/TLB flushes by default riscv: Factor out page table TLB synchronization riscv: Flush the instruction cache during SMP bringup riscv: hwprobe: export Zihintpause ISA extension riscv: misaligned: remove CONFIG_RISCV_M_MODE specific code ...
128 lines
3.7 KiB
C
128 lines
3.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2021 Sifive.
|
|
*/
|
|
#ifndef ASM_ERRATA_LIST_H
|
|
#define ASM_ERRATA_LIST_H
|
|
|
|
#include <asm/alternative.h>
|
|
#include <asm/csr.h>
|
|
#include <asm/insn-def.h>
|
|
#include <asm/hwcap.h>
|
|
#include <asm/vendorid_list.h>
|
|
|
|
#ifdef CONFIG_ERRATA_ANDES
|
|
#define ERRATA_ANDES_NO_IOCP 0
|
|
#define ERRATA_ANDES_NUMBER 1
|
|
#endif
|
|
|
|
#ifdef CONFIG_ERRATA_SIFIVE
|
|
#define ERRATA_SIFIVE_CIP_453 0
|
|
#define ERRATA_SIFIVE_CIP_1200 1
|
|
#define ERRATA_SIFIVE_NUMBER 2
|
|
#endif
|
|
|
|
#ifdef CONFIG_ERRATA_THEAD
|
|
#define ERRATA_THEAD_MAE 0
|
|
#define ERRATA_THEAD_PMU 1
|
|
#define ERRATA_THEAD_NUMBER 2
|
|
#endif
|
|
|
|
#ifdef __ASSEMBLY__
|
|
|
|
#define ALT_INSN_FAULT(x) \
|
|
ALTERNATIVE(__stringify(RISCV_PTR do_trap_insn_fault), \
|
|
__stringify(RISCV_PTR sifive_cip_453_insn_fault_trp), \
|
|
SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \
|
|
CONFIG_ERRATA_SIFIVE_CIP_453)
|
|
|
|
#define ALT_PAGE_FAULT(x) \
|
|
ALTERNATIVE(__stringify(RISCV_PTR do_page_fault), \
|
|
__stringify(RISCV_PTR sifive_cip_453_page_fault_trp), \
|
|
SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \
|
|
CONFIG_ERRATA_SIFIVE_CIP_453)
|
|
#else /* !__ASSEMBLY__ */
|
|
|
|
#define ALT_SFENCE_VMA_ASID(asid) \
|
|
asm(ALTERNATIVE("sfence.vma x0, %0", "sfence.vma", SIFIVE_VENDOR_ID, \
|
|
ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \
|
|
: : "r" (asid) : "memory")
|
|
|
|
#define ALT_SFENCE_VMA_ADDR(addr) \
|
|
asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \
|
|
ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \
|
|
: : "r" (addr) : "memory")
|
|
|
|
#define ALT_SFENCE_VMA_ADDR_ASID(addr, asid) \
|
|
asm(ALTERNATIVE("sfence.vma %0, %1", "sfence.vma", SIFIVE_VENDOR_ID, \
|
|
ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \
|
|
: : "r" (addr), "r" (asid) : "memory")
|
|
|
|
/*
|
|
* _val is marked as "will be overwritten", so need to set it to 0
|
|
* in the default case.
|
|
*/
|
|
#define ALT_SVPBMT_SHIFT 61
|
|
#define ALT_THEAD_MAE_SHIFT 59
|
|
#define ALT_SVPBMT(_val, prot) \
|
|
asm(ALTERNATIVE_2("li %0, 0\t\nnop", \
|
|
"li %0, %1\t\nslli %0,%0,%3", 0, \
|
|
RISCV_ISA_EXT_SVPBMT, CONFIG_RISCV_ISA_SVPBMT, \
|
|
"li %0, %2\t\nslli %0,%0,%4", THEAD_VENDOR_ID, \
|
|
ERRATA_THEAD_MAE, CONFIG_ERRATA_THEAD_MAE) \
|
|
: "=r"(_val) \
|
|
: "I"(prot##_SVPBMT >> ALT_SVPBMT_SHIFT), \
|
|
"I"(prot##_THEAD >> ALT_THEAD_MAE_SHIFT), \
|
|
"I"(ALT_SVPBMT_SHIFT), \
|
|
"I"(ALT_THEAD_MAE_SHIFT))
|
|
|
|
#ifdef CONFIG_ERRATA_THEAD_MAE
|
|
/*
|
|
* IO/NOCACHE memory types are handled together with svpbmt,
|
|
* so on T-Head chips, check if no other memory type is set,
|
|
* and set the non-0 PMA type if applicable.
|
|
*/
|
|
#define ALT_THEAD_PMA(_val) \
|
|
asm volatile(ALTERNATIVE( \
|
|
__nops(7), \
|
|
"li t3, %1\n\t" \
|
|
"slli t3, t3, %3\n\t" \
|
|
"and t3, %0, t3\n\t" \
|
|
"bne t3, zero, 2f\n\t" \
|
|
"li t3, %2\n\t" \
|
|
"slli t3, t3, %3\n\t" \
|
|
"or %0, %0, t3\n\t" \
|
|
"2:", THEAD_VENDOR_ID, \
|
|
ERRATA_THEAD_MAE, CONFIG_ERRATA_THEAD_MAE) \
|
|
: "+r"(_val) \
|
|
: "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_MAE_SHIFT), \
|
|
"I"(_PAGE_PMA_THEAD >> ALT_THEAD_MAE_SHIFT), \
|
|
"I"(ALT_THEAD_MAE_SHIFT) \
|
|
: "t3")
|
|
#else
|
|
#define ALT_THEAD_PMA(_val)
|
|
#endif
|
|
|
|
#define ALT_CMO_OP(_op, _start, _size, _cachesize) \
|
|
asm volatile(ALTERNATIVE( \
|
|
__nops(5), \
|
|
"mv a0, %1\n\t" \
|
|
"j 2f\n\t" \
|
|
"3:\n\t" \
|
|
CBO_##_op(a0) \
|
|
"add a0, a0, %0\n\t" \
|
|
"2:\n\t" \
|
|
"bltu a0, %2, 3b\n\t", \
|
|
0, RISCV_ISA_EXT_ZICBOM, CONFIG_RISCV_ISA_ZICBOM) \
|
|
: : "r"(_cachesize), \
|
|
"r"((unsigned long)(_start) & ~((_cachesize) - 1UL)), \
|
|
"r"((unsigned long)(_start) + (_size)) \
|
|
: "a0")
|
|
|
|
#define THEAD_C9XX_RV_IRQ_PMU 17
|
|
#define THEAD_C9XX_CSR_SCOUNTEROF 0x5c5
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif
|