Re: [PATCH 12/12] mm: Remove devmap related functions and page table bits

2024-09-11 Thread Chunyan Zhang
Hi Alistair,

On Tue, 10 Sept 2024 at 12:21, Alistair Popple  wrote:
>
> Now that DAX and all other reference counts to ZONE_DEVICE pages are
> managed normally there is no need for the special devmap PTE/PMD/PUD
> page table bits. So drop all references to these, freeing up a
> software defined page table bit on architectures supporting it.
>
> Signed-off-by: Alistair Popple 
> Acked-by: Will Deacon  # arm64
> ---
>  Documentation/mm/arch_pgtable_helpers.rst |  6 +--
>  arch/arm64/Kconfig|  1 +-
>  arch/arm64/include/asm/pgtable-prot.h |  1 +-
>  arch/arm64/include/asm/pgtable.h  | 24 +
>  arch/powerpc/Kconfig  |  1 +-
>  arch/powerpc/include/asm/book3s/64/hash-4k.h  |  6 +--
>  arch/powerpc/include/asm/book3s/64/hash-64k.h |  7 +--
>  arch/powerpc/include/asm/book3s/64/pgtable.h  | 52 +--
>  arch/powerpc/include/asm/book3s/64/radix.h| 14 +-
>  arch/x86/Kconfig  |  1 +-
>  arch/x86/include/asm/pgtable.h| 50 +-
>  arch/x86/include/asm/pgtable_types.h  |  5 +--

RISC-V's references also need to be cleanup, it simply can be done by
reverting the commit

216e04bf1e4d (riscv: mm: Add support for ZONE_DEVICE)

Thanks,
Chunyan

>  include/linux/mm.h|  7 +--
>  include/linux/pfn_t.h | 20 +---
>  include/linux/pgtable.h   | 19 +--
>  mm/Kconfig|  4 +-
>  mm/debug_vm_pgtable.c | 59 +
>  mm/hmm.c  |  3 +-
>  18 files changed, 11 insertions(+), 269 deletions(-)
>



Re: [PATCH 02/12] pci/p2pdma: Don't initialise page refcount to one

2024-09-11 Thread Bjorn Helgaas
On Wed, Sep 11, 2024 at 11:07:51AM +1000, Alistair Popple wrote:
> 
> >> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> >> index 4f47a13..210b9f4 100644
> >> --- a/drivers/pci/p2pdma.c
> >> +++ b/drivers/pci/p2pdma.c
> >> @@ -129,6 +129,12 @@ static int p2pmem_alloc_mmap(struct file *filp, 
> >> struct kobject *kobj,
> >>}
> >>  
> >>/*
> >> +   * Initialise the refcount for the freshly allocated page. As we have
> >> +   * just allocated the page no one else should be using it.
> >> +   */
> >> +  set_page_count(virt_to_page(kaddr), 1);
> >
> > No doubt the subject line is true in some overall context, but it does
> > seem to say the opposite of what happens here.
> 
> Fair. It made sense to me from the mm context I was coming from (it was
> being initialised to 1 there) but not overall. Something like "move page
> refcount initialisation to p2pdma driver" would make more sense?

Definitely would, thanks.



[PATCH] kernel-docs: Add new section for Rust learning materials

2024-09-11 Thread Carlos Bilbao
Include a new section in the Index of Further Kernel Documentation with
resources to learn Rust. Reference it in the Rust index.

Signed-off-by: Carlos Bilbao 
---
 Documentation/process/kernel-docs.rst | 111 +++---
 Documentation/rust/index.rst  |   3 +
 2 files changed, 103 insertions(+), 11 deletions(-)

diff --git a/Documentation/process/kernel-docs.rst 
b/Documentation/process/kernel-docs.rst
index 2ec4b043..d917accd7fc3 100644
--- a/Documentation/process/kernel-docs.rst
+++ b/Documentation/process/kernel-docs.rst
@@ -72,17 +72,6 @@ On-line docs
 programming. Lots of examples. Currently the new version is being
 actively maintained at https://github.com/sysprog21/lkmpg.
 
-* Title: **Rust for Linux**
-
-  :Author: various
-  :URL: https://rust-for-linux.com/
-  :Date: rolling version
-  :Keywords: glossary, terms, linux-kernel.
-  :Description: From the website: "Rust for Linux is the project adding
-support for the Rust language to the Linux kernel. This website is
-intended as a hub of links, documentation and resources related to
-the project".
-
 Published books
 ---
 
@@ -220,6 +209,106 @@ Miscellaneous
 other original research and content related to Linux and software
 development.
 
+Rust
+
+
+* Title: **Rust for Linux**
+
+  :Author: various
+  :URL: https://rust-for-linux.com/
+  :Date: rolling version
+  :Keywords: glossary, terms, linux-kernel, rust.
+  :Description: From the website: "Rust for Linux is the project adding
+support for the Rust language to the Linux kernel. This website is
+intended as a hub of links, documentation and resources related to
+the project".
+
+* Title: **Learning Rust the Dangerous Way**
+
+  :Author: Cliff L. Biffle
+  :URL: https://cliffle.com/p/dangerust/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, blog.
+  :Description: From the website: "LRtDW is a series of articles
+putting Rust features in context for low-level C programmers who
+maybe don’t have a formal CS background — the sort of people who
+work on firmware, game engines, OS kernels, and the like.
+Basically, people like me.". It illustrates line-by-line
+conversions from C to Rust.
+
+* Title: **The Rust Book**
+
+  :Author: Steve Klabnik and Carol Nichols, with contributions from the
+Rust community
+  :URL: https://doc.rust-lang.org/book/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, book.
+  :Description: From the website: "This book fully embraces the
+potential of Rust to empower its users. It’s a friendly and
+approachable text intended to help you level up not just your
+knowledge of Rust, but also your reach and confidence as a
+programmer in general. So dive in, get ready to learn—and welcome
+to the Rust community!".
+
+* Title: **Rust for the Polyglot Programmer**
+
+  :Author: Ian Jackson
+  :URL: 
https://www.chiark.greenend.org.uk/~ianmdlvl/rust-polyglot/index.html
+  :Date: December 2022
+  :Keywords: rust, blog, tooling.
+  :Description: From the website: "There are many guides and
+introductions to Rust. This one is something different: it is
+intended for the experienced programmer who already knows many
+other programming languages. I try to be comprehensive enough to be
+a starting point for any area of Rust, but to avoid going into too
+much detail except where things are not as you might expect. Also
+this guide is not entirely free of opinion, including
+recommendations of libraries (crates), tooling, etc.".
+
+* Title: **Fasterthanli.me**
+
+  :Author: Amos Wenger
+  :URL: https://fasterthanli.me/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, blog, news.
+  :Description: From the website: "I make articles and videos about how
+computers work. My content is long-form, didactic and exploratory
+— and often an excuse to teach Rust!".
+
+* Title: **You Can't Spell Trust Without Rust**
+
+  :Author: Alexis Beingessner
+  :URL: 
https://repository.library.carleton.ca/downloads/1j92g820w?locale=en
+  :Date: 2015
+  :Keywords: rust, master, thesis.
+  :Description: This thesis focuses on Rust's ownership system, which
+ensures memory safety by controlling data manipulation and
+lifetime, while also highlighting its limitations and comparing it
+to similar systems in Cyclone and C++.
+
+* Name: **Linux Plumbers (LPC) Rust presentations**
+
+  :Title: Rust microconference
+  :URL: https://lpc.events/event/18/sessions/186/#20240918
+  :Title: Rust for Linux
+  :URL: https://lpc.events/event/18/contributions/1912/
+  :Title: Journey of a C kernel engineer starting a Rust driv

Re: [PATCH] kernel-docs: Add new section for Rust learning materials

2024-09-11 Thread Dirk Behme

On 11.09.2024 20:59, Carlos Bilbao wrote:

Include a new section in the Index of Further Kernel Documentation with
resources to learn Rust. Reference it in the Rust index.


Many thanks for creating the patch! Looks nice :)

Whats about adding

https://google.github.io/comprehensive-rust/

https://docs.rust-embedded.org/book/

additionally?

Best regards

Dirk



Signed-off-by: Carlos Bilbao 
---
  Documentation/process/kernel-docs.rst | 111 +++---
  Documentation/rust/index.rst  |   3 +
  2 files changed, 103 insertions(+), 11 deletions(-)

diff --git a/Documentation/process/kernel-docs.rst 
b/Documentation/process/kernel-docs.rst
index 2ec4b043..d917accd7fc3 100644
--- a/Documentation/process/kernel-docs.rst
+++ b/Documentation/process/kernel-docs.rst
@@ -72,17 +72,6 @@ On-line docs
  programming. Lots of examples. Currently the new version is being
  actively maintained at https://github.com/sysprog21/lkmpg.
  
-* Title: **Rust for Linux**

-
-  :Author: various
-  :URL: https://rust-for-linux.com/
-  :Date: rolling version
-  :Keywords: glossary, terms, linux-kernel.
-  :Description: From the website: "Rust for Linux is the project adding
-support for the Rust language to the Linux kernel. This website is
-intended as a hub of links, documentation and resources related to
-the project".
-
  Published books
  ---
  
@@ -220,6 +209,106 @@ Miscellaneous

  other original research and content related to Linux and software
  development.
  
+Rust

+
+
+* Title: **Rust for Linux**
+
+  :Author: various
+  :URL: https://rust-for-linux.com/
+  :Date: rolling version
+  :Keywords: glossary, terms, linux-kernel, rust.
+  :Description: From the website: "Rust for Linux is the project adding
+support for the Rust language to the Linux kernel. This website is
+intended as a hub of links, documentation and resources related to
+the project".
+
+* Title: **Learning Rust the Dangerous Way**
+
+  :Author: Cliff L. Biffle
+  :URL: https://cliffle.com/p/dangerust/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, blog.
+  :Description: From the website: "LRtDW is a series of articles
+putting Rust features in context for low-level C programmers who
+maybe don’t have a formal CS background — the sort of people who
+work on firmware, game engines, OS kernels, and the like.
+Basically, people like me.". It illustrates line-by-line
+conversions from C to Rust.
+
+* Title: **The Rust Book**
+
+  :Author: Steve Klabnik and Carol Nichols, with contributions from the
+Rust community
+  :URL: https://doc.rust-lang.org/book/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, book.
+  :Description: From the website: "This book fully embraces the
+potential of Rust to empower its users. It’s a friendly and
+approachable text intended to help you level up not just your
+knowledge of Rust, but also your reach and confidence as a
+programmer in general. So dive in, get ready to learn—and welcome
+to the Rust community!".
+
+* Title: **Rust for the Polyglot Programmer**
+
+  :Author: Ian Jackson
+  :URL: 
https://www.chiark.greenend.org.uk/~ianmdlvl/rust-polyglot/index.html
+  :Date: December 2022
+  :Keywords: rust, blog, tooling.
+  :Description: From the website: "There are many guides and
+introductions to Rust. This one is something different: it is
+intended for the experienced programmer who already knows many
+other programming languages. I try to be comprehensive enough to be
+a starting point for any area of Rust, but to avoid going into too
+much detail except where things are not as you might expect. Also
+this guide is not entirely free of opinion, including
+recommendations of libraries (crates), tooling, etc.".
+
+* Title: **Fasterthanli.me**
+
+  :Author: Amos Wenger
+  :URL: https://fasterthanli.me/
+  :Date: Accessed Sep 11 2024
+  :Keywords: rust, blog, news.
+  :Description: From the website: "I make articles and videos about how
+computers work. My content is long-form, didactic and exploratory
+— and often an excuse to teach Rust!".
+
+* Title: **You Can't Spell Trust Without Rust**
+
+  :Author: Alexis Beingessner
+  :URL: 
https://repository.library.carleton.ca/downloads/1j92g820w?locale=en
+  :Date: 2015
+  :Keywords: rust, master, thesis.
+  :Description: This thesis focuses on Rust's ownership system, which
+ensures memory safety by controlling data manipulation and
+lifetime, while also highlighting its limitations and comparing it
+to similar systems in Cyclone and C++.
+
+* Name: **Linux Plumbers (LPC) Rust presentations**
+
+

[PATCH v10 00/14] riscv: Add support for xtheadvector

2024-09-11 Thread Charlie Jenkins
xtheadvector is a custom extension that is based upon riscv vector
version 0.7.1 [1]. All of the vector routines have been modified to
support this alternative vector version based upon whether xtheadvector
was determined to be supported at boot.

vlenb is not supported on the existing xtheadvector hardware, so a
devicetree property thead,vlenb is added to provide the vlenb to Linux.

There is a new hwprobe key RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0 that is
used to request which thead vendor extensions are supported on the
current platform. This allows future vendors to allocate hwprobe keys
for their vendor.

Support for xtheadvector is also added to the vector kselftests.

Signed-off-by: Charlie Jenkins 

[1] 
https://github.com/T-head-Semi/thead-extension-spec/blob/95358cb2cca9489361c61d335e03d3134b14133f/xtheadvector.adoc

---
This series is a continuation of a different series that was fragmented
into two other series in an attempt to get part of it merged in the 6.10
merge window. The split-off series did not get merged due to a NAK on
the series that added the generic riscv,vlenb devicetree entry. This
series has converted riscv,vlenb to thead,vlenb to remedy this issue.

The original series is titled "riscv: Support vendor extensions and
xtheadvector" [3].

The series titled "riscv: Extend cpufeature.c to detect vendor
extensions" is still under development and this series is based on that
series! [4]

I have tested this with an Allwinner Nezha board. I used SkiffOS [1] to
manage building the image, but upgraded the U-Boot version to Samuel
Holland's more up-to-date version [2] and changed out the device tree
used by U-Boot with the device trees that are present in upstream linux
and this series. Thank you Samuel for all of the work you did to make
this task possible.

[1] https://github.com/skiffos/SkiffOS/tree/master/configs/allwinner/nezha
[2] 
https://github.com/smaeul/u-boot/commit/2e89b706f5c956a70c989cd31665f1429e9a0b48
[3] 
https://lore.kernel.org/all/20240503-dev-charlie-support_thead_vector_6_9-v6-0-cb7624e65...@rivosinc.com/
[4] 
https://lore.kernel.org/lkml/20240719-support_vendor_extensions-v3-4-0af7587bb...@rivosinc.com/T/

---
Changes in v10:
- In DT probing disable vector with new function to clear vendor
  extension bits for xtheadvector
- Add ghostwrite mitigations for c9xx CPUs. This disables xtheadvector
  unless mitigations=off is set as a kernel boot arg
- Link to v9: 
https://lore.kernel.org/r/20240806-xtheadvector-v9-0-62a56d2da...@rivosinc.com

Changes in v9:
- Rebase onto palmer's for-next
- Fix sparse error in arch/riscv/kernel/vendor_extensions/thead.c
- Fix maybe-uninitialized warning in 
arch/riscv/include/asm/vendor_extensions/vendor_hwprobe.h
- Wrap some long lines
- Link to v8: 
https://lore.kernel.org/r/20240724-xtheadvector-v8-0-cf043168e...@rivosinc.com

Changes in v8:
- Rebase onto palmer's for-next
- Link to v7: 
https://lore.kernel.org/r/20240724-xtheadvector-v7-0-b741910ad...@rivosinc.com

Changes in v7:
- Add defs for has_xtheadvector_no_alternatives() and has_xtheadvector()
  when vector disabled. (Palmer)
- Link to v6: 
https://lore.kernel.org/r/20240722-xtheadvector-v6-0-c9af0130f...@rivosinc.com

Changes in v6:
- Fix return type of is_vector_supported()/is_xthead_supported() to be bool
- Link to v5: 
https://lore.kernel.org/r/20240719-xtheadvector-v5-0-4b485fc7d...@rivosinc.com

Changes in v5:
- Rebase on for-next
- Link to v4: 
https://lore.kernel.org/r/20240702-xtheadvector-v4-0-2bad6820d...@rivosinc.com

Changes in v4:
- Replace inline asm with C (Samuel)
- Rename VCSRs to CSRs (Samuel)
- Replace .insn directives with .4byte directives
- Link to v3: 
https://lore.kernel.org/r/20240619-xtheadvector-v3-0-bff39eb96...@rivosinc.com

Changes in v3:
- Add back Heiko's signed-off-by (Conor)
- Mark RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0 as a bitmask
- Link to v2: 
https://lore.kernel.org/r/20240610-xtheadvector-v2-0-97a48613a...@rivosinc.com

Changes in v2:
- Removed extraneous references to "riscv,vlenb" (Jess)
- Moved declaration of "thead,vlenb" into cpus.yaml and added
  restriction that it's only applicable to thead cores (Conor)
- Check CONFIG_RISCV_ISA_XTHEADVECTOR instead of CONFIG_RISCV_ISA_V for
  thead,vlenb (Jess)
- Fix naming of hwprobe variables (Evan)
- Link to v1: 
https://lore.kernel.org/r/20240609-xtheadvector-v1-0-3fe591d7f...@rivosinc.com

---
Charlie Jenkins (13):
  dt-bindings: riscv: Add xtheadvector ISA extension description
  dt-bindings: cpus: add a thead vlen register length property
  riscv: dts: allwinner: Add xtheadvector to the D1/D1s devicetree
  riscv: Add thead and xtheadvector as a vendor extension
  riscv: vector: Use vlenb from DT for thead
  riscv: csr: Add CSR encodings for CSR_VXRM/CSR_VXSAT
  riscv: Add xtheadvector instruction definitions
  riscv: vector: Support xtheadvector save/restore
  riscv: hwprobe: Add thead vendor extension probing
  riscv: hwprobe: Document thead vendor ex

[PATCH v10 01/14] dt-bindings: riscv: Add xtheadvector ISA extension description

2024-09-11 Thread Charlie Jenkins
The xtheadvector ISA extension is described on the T-Head extension spec
Github page [1] at commit 95358cb2cca9.

Link: 
https://github.com/T-head-Semi/thead-extension-spec/blob/95358cb2cca9489361c61d335e03d3134b14133f/xtheadvector.adoc
 [1]

Signed-off-by: Charlie Jenkins 
Reviewed-by: Conor Dooley 
---
 Documentation/devicetree/bindings/riscv/extensions.yaml | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/riscv/extensions.yaml 
b/Documentation/devicetree/bindings/riscv/extensions.yaml
index a06dbc6b4928..1a3d01aedde6 100644
--- a/Documentation/devicetree/bindings/riscv/extensions.yaml
+++ b/Documentation/devicetree/bindings/riscv/extensions.yaml
@@ -556,6 +556,10 @@ properties:
 latency, as ratified in commit 56ed795 ("Update
 riscv-crypto-spec-vector.adoc") of riscv-crypto.
 
+# vendor extensions, each extension sorted alphanumerically under the
+# vendor they belong to. Vendors are sorted alphanumerically as well.
+
+# Andes
 - const: xandespmu
   description:
 The Andes Technology performance monitor extension for counter 
overflow
@@ -563,6 +567,12 @@ properties:
 Registers in the AX45MP datasheet.
 
https://www.andestech.com/wp-content/uploads/AX45MP-1C-Rev.-5.0.0-Datasheet.pdf
 
+# T-HEAD
+- const: xtheadvector
+  description:
+The T-HEAD specific 0.7.1 vector implementation as written in
+
https://github.com/T-head-Semi/thead-extension-spec/blob/95358cb2cca9489361c61d335e03d3134b14133f/xtheadvector.adoc.
+
 allOf:
   # Zcb depends on Zca
   - if:

-- 
2.45.0




[PATCH v10 02/14] dt-bindings: cpus: add a thead vlen register length property

2024-09-11 Thread Charlie Jenkins
Add a property analogous to the vlenb CSR so that software can detect
the vector length of each CPU prior to it being brought online.
Currently software has to assume that the vector length read from the
boot CPU applies to all possible CPUs. On T-Head CPUs implementing
pre-ratification vector, reading the th.vlenb CSR may produce an illegal
instruction trap, so this property is required on such systems.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Conor Dooley 
---
 Documentation/devicetree/bindings/riscv/cpus.yaml | 19 +++
 1 file changed, 19 insertions(+)

diff --git a/Documentation/devicetree/bindings/riscv/cpus.yaml 
b/Documentation/devicetree/bindings/riscv/cpus.yaml
index 8edc8261241a..c0cf6cf56749 100644
--- a/Documentation/devicetree/bindings/riscv/cpus.yaml
+++ b/Documentation/devicetree/bindings/riscv/cpus.yaml
@@ -26,6 +26,18 @@ description: |
 allOf:
   - $ref: /schemas/cpu.yaml#
   - $ref: extensions.yaml
+  - if:
+  not:
+properties:
+  compatible:
+contains:
+  enum:
+- thead,c906
+- thead,c910
+- thead,c920
+then:
+  properties:
+thead,vlenb: false
 
 properties:
   compatible:
@@ -95,6 +107,13 @@ properties:
 description:
   The blocksize in bytes for the Zicboz cache operations.
 
+  thead,vlenb:
+$ref: /schemas/types.yaml#/definitions/uint32
+description:
+  VLEN/8, the vector register length in bytes. This property is required on
+  thead systems where the vector register length is not identical on all 
harts, or
+  the vlenb CSR is not available.
+
   # RISC-V has multiple properties for cache op block sizes as the sizes
   # differ between individual CBO extensions
   cache-op-block-size: false

-- 
2.45.0




[PATCH v10 03/14] riscv: dts: allwinner: Add xtheadvector to the D1/D1s devicetree

2024-09-11 Thread Charlie Jenkins
The D1/D1s SoCs support xtheadvector so it can be included in the
devicetree. Also include vlenb for the cpu.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Conor Dooley 
---
 arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi 
b/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi
index 64c3c2e6cbe0..6367112e614a 100644
--- a/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi
+++ b/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi
@@ -27,7 +27,8 @@ cpu0: cpu@0 {
riscv,isa = "rv64imafdc";
riscv,isa-base = "rv64i";
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", 
"zicntr", "zicsr",
-  "zifencei", "zihpm";
+  "zifencei", "zihpm", 
"xtheadvector";
+   thead,vlenb = <128>;
#cooling-cells = <2>;
 
cpu0_intc: interrupt-controller {

-- 
2.45.0




[PATCH v10 04/14] riscv: Add thead and xtheadvector as a vendor extension

2024-09-11 Thread Charlie Jenkins
Add support to the kernel for THead vendor extensions with the target of
the new extension xtheadvector.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Conor Dooley 
---
 arch/riscv/Kconfig.vendor| 13 +
 arch/riscv/include/asm/vendor_extensions/thead.h | 16 
 arch/riscv/kernel/cpufeature.c   |  1 +
 arch/riscv/kernel/vendor_extensions.c| 10 ++
 arch/riscv/kernel/vendor_extensions/Makefile |  1 +
 arch/riscv/kernel/vendor_extensions/thead.c  | 18 ++
 6 files changed, 59 insertions(+)

diff --git a/arch/riscv/Kconfig.vendor b/arch/riscv/Kconfig.vendor
index 6f1cdd32ed29..9897442bd44f 100644
--- a/arch/riscv/Kconfig.vendor
+++ b/arch/riscv/Kconfig.vendor
@@ -16,4 +16,17 @@ config RISCV_ISA_VENDOR_EXT_ANDES
  If you don't know what to do here, say Y.
 endmenu
 
+menu "T-Head"
+config RISCV_ISA_VENDOR_EXT_THEAD
+   bool "T-Head vendor extension support"
+   select RISCV_ISA_VENDOR_EXT
+   default y
+   help
+ Say N here to disable detection of and support for all T-Head vendor
+ extensions. Without this option enabled, T-Head vendor extensions will
+ not be detected at boot and their presence not reported to userspace.
+
+ If you don't know what to do here, say Y.
+endmenu
+
 endmenu
diff --git a/arch/riscv/include/asm/vendor_extensions/thead.h 
b/arch/riscv/include/asm/vendor_extensions/thead.h
new file mode 100644
index ..48421d1553ad
--- /dev/null
+++ b/arch/riscv/include/asm/vendor_extensions/thead.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H
+#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H
+
+#include 
+
+#include 
+
+/*
+ * Extension keys must be strictly less than RISCV_ISA_VENDOR_EXT_MAX.
+ */
+#define RISCV_ISA_VENDOR_EXT_XTHEADVECTOR  0
+
+extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead;
+
+#endif
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index 8f20607adb40..46e69b9d66a7 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -25,6 +25,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #define NUM_ALPHA_EXTS ('z' - 'a' + 1)
 
diff --git a/arch/riscv/kernel/vendor_extensions.c 
b/arch/riscv/kernel/vendor_extensions.c
index b6c1e7b5d34b..662ba64a8f93 100644
--- a/arch/riscv/kernel/vendor_extensions.c
+++ b/arch/riscv/kernel/vendor_extensions.c
@@ -6,6 +6,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -14,6 +15,9 @@ struct riscv_isa_vendor_ext_data_list 
*riscv_isa_vendor_ext_list[] = {
 #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES
&riscv_isa_vendor_ext_list_andes,
 #endif
+#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
+   &riscv_isa_vendor_ext_list_thead,
+#endif
 };
 
 const size_t riscv_isa_vendor_ext_list_size = 
ARRAY_SIZE(riscv_isa_vendor_ext_list);
@@ -41,6 +45,12 @@ bool __riscv_isa_vendor_extension_available(int cpu, 
unsigned long vendor, unsig
cpu_bmap = 
&riscv_isa_vendor_ext_list_andes.per_hart_isa_bitmap[cpu];
break;
#endif
+   #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
+   case THEAD_VENDOR_ID:
+   bmap = &riscv_isa_vendor_ext_list_thead.all_harts_isa_bitmap;
+   cpu_bmap = 
&riscv_isa_vendor_ext_list_thead.per_hart_isa_bitmap[cpu];
+   break;
+   #endif
default:
return false;
}
diff --git a/arch/riscv/kernel/vendor_extensions/Makefile 
b/arch/riscv/kernel/vendor_extensions/Makefile
index 6a61aed944f1..353522cb3bf0 100644
--- a/arch/riscv/kernel/vendor_extensions/Makefile
+++ b/arch/riscv/kernel/vendor_extensions/Makefile
@@ -1,3 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
 obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_ANDES)   += andes.o
+obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD)   += thead.o
diff --git a/arch/riscv/kernel/vendor_extensions/thead.c 
b/arch/riscv/kernel/vendor_extensions/thead.c
new file mode 100644
index ..0f27baf8d245
--- /dev/null
+++ b/arch/riscv/kernel/vendor_extensions/thead.c
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+
+#include 
+#include 
+
+/* All T-Head vendor extensions supported in Linux */
+static const struct riscv_isa_ext_data riscv_isa_vendor_ext_thead[] = {
+   __RISCV_ISA_EXT_DATA(xtheadvector, RISCV_ISA_VENDOR_EXT_XTHEADVECTOR),
+};
+
+struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead = {
+   .ext_data_count = ARRAY_SIZE(riscv_isa_vendor_ext_thead),
+   .ext_data = riscv_isa_vendor_ext_thead,
+};

-- 
2.45.0




[PATCH v10 05/14] riscv: vector: Use vlenb from DT for thead

2024-09-11 Thread Charlie Jenkins
If thead,vlenb is provided in the device tree, prefer that over reading
the vlenb csr.

Signed-off-by: Charlie Jenkins 
Acked-by: Conor Dooley 
---
 arch/riscv/Kconfig.vendor| 13 +++
 arch/riscv/include/asm/cpufeature.h  |  2 +
 arch/riscv/include/asm/vendor_extensions/thead.h |  6 +++
 arch/riscv/kernel/cpufeature.c   | 48 
 arch/riscv/kernel/vector.c   | 12 +-
 arch/riscv/kernel/vendor_extensions/thead.c  | 11 ++
 6 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/arch/riscv/Kconfig.vendor b/arch/riscv/Kconfig.vendor
index 9897442bd44f..b096548fe0ff 100644
--- a/arch/riscv/Kconfig.vendor
+++ b/arch/riscv/Kconfig.vendor
@@ -26,6 +26,19 @@ config RISCV_ISA_VENDOR_EXT_THEAD
  extensions. Without this option enabled, T-Head vendor extensions will
  not be detected at boot and their presence not reported to userspace.
 
+ If you don't know what to do here, say Y.
+
+config RISCV_ISA_XTHEADVECTOR
+   bool "xtheadvector extension support"
+   depends on RISCV_ISA_VENDOR_EXT_THEAD
+   depends on RISCV_ISA_V
+   depends on FPU
+   default y
+   help
+ Say N here if you want to disable all xtheadvector related procedures
+ in the kernel. This will disable vector for any T-Head board that
+ contains xtheadvector rather than the standard vector.
+
  If you don't know what to do here, say Y.
 endmenu
 
diff --git a/arch/riscv/include/asm/cpufeature.h 
b/arch/riscv/include/asm/cpufeature.h
index 45f9c1171a48..28bdeb1005e0 100644
--- a/arch/riscv/include/asm/cpufeature.h
+++ b/arch/riscv/include/asm/cpufeature.h
@@ -31,6 +31,8 @@ DECLARE_PER_CPU(struct riscv_cpuinfo, riscv_cpuinfo);
 /* Per-cpu ISA extensions. */
 extern struct riscv_isainfo hart_isa[NR_CPUS];
 
+extern u32 thead_vlenb_of;
+
 void riscv_user_isa_enable(void);
 
 #define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size, 
_validate) {  \
diff --git a/arch/riscv/include/asm/vendor_extensions/thead.h 
b/arch/riscv/include/asm/vendor_extensions/thead.h
index 48421d1553ad..190c91e37e95 100644
--- a/arch/riscv/include/asm/vendor_extensions/thead.h
+++ b/arch/riscv/include/asm/vendor_extensions/thead.h
@@ -13,4 +13,10 @@
 
 extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead;
 
+#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
+void disable_xtheadvector(void);
+#else
+void disable_xtheadvector(void) { }
+#endif
+
 #endif
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
index 46e69b9d66a7..9340efd79af9 100644
--- a/arch/riscv/kernel/cpufeature.c
+++ b/arch/riscv/kernel/cpufeature.c
@@ -37,6 +37,8 @@ static DECLARE_BITMAP(riscv_isa, RISCV_ISA_EXT_MAX) 
__read_mostly;
 /* Per-cpu ISA extensions. */
 struct riscv_isainfo hart_isa[NR_CPUS];
 
+u32 thead_vlenb_of;
+
 /**
  * riscv_isa_extension_base() - Get base extension word
  *
@@ -772,6 +774,46 @@ static void __init riscv_fill_vendor_ext_list(int cpu)
}
 }
 
+static int has_thead_homogeneous_vlenb(void)
+{
+   int cpu;
+   u32 prev_vlenb = 0;
+   u32 vlenb;
+
+   /* Ignore thead,vlenb property if xtheavector is not enabled in the 
kernel */
+   if (!IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
+   return 0;
+
+   for_each_possible_cpu(cpu) {
+   struct device_node *cpu_node;
+
+   cpu_node = of_cpu_device_node_get(cpu);
+   if (!cpu_node) {
+   pr_warn("Unable to find cpu node\n");
+   return -ENOENT;
+   }
+
+   if (of_property_read_u32(cpu_node, "thead,vlenb", &vlenb)) {
+   of_node_put(cpu_node);
+
+   if (prev_vlenb)
+   return -ENOENT;
+   continue;
+   }
+
+   if (prev_vlenb && vlenb != prev_vlenb) {
+   of_node_put(cpu_node);
+   return -ENOENT;
+   }
+
+   prev_vlenb = vlenb;
+   of_node_put(cpu_node);
+   }
+
+   thead_vlenb_of = vlenb;
+   return 0;
+}
+
 static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap)
 {
unsigned int cpu;
@@ -825,6 +867,12 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned 
long *isa2hwcap)
riscv_fill_vendor_ext_list(cpu);
}
 
+   if (riscv_isa_vendor_extension_available(THEAD_VENDOR_ID, XTHEADVECTOR) 
&&
+   has_thead_homogeneous_vlenb() < 0) {
+   pr_warn("Unsupported heterogeneous vlenb detected, vector 
extension disabled.\n");
+   disable_xtheadvector();
+   }
+
if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX))
return -ENOENT;
 
diff --git a/arch/riscv/kernel/vector.c b/arch/riscv/kernel/vector.c
index 682b3feee451..9775d6a9c8ee 100644
--- a/arch/riscv/kern

[PATCH v10 07/14] riscv: csr: Add CSR encodings for CSR_VXRM/CSR_VXSAT

2024-09-11 Thread Charlie Jenkins
The VXRM vector csr for xtheadvector has an encoding of 0xa and VXSAT
has an encoding of 0x9.

Co-developed-by: Heiko Stuebner 
Signed-off-by: Heiko Stuebner 
Signed-off-by: Charlie Jenkins 
---
 arch/riscv/include/asm/csr.h | 11 ---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index 3eeb07d73065..c0a60c4ed911 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -300,9 +300,14 @@
 #define CSR_STIMECMP   0x14D
 #define CSR_STIMECMPH  0x15D
 
-#define VCSR_VXRM_MASK 3
-#define VCSR_VXRM_SHIFT1
-#define VCSR_VXSAT_MASK1
+/* xtheadvector symbolic CSR names */
+#define CSR_VXSAT  0x9
+#define CSR_VXRM   0xa
+
+/* xtheadvector CSR masks */
+#define CSR_VXRM_MASK  3
+#define CSR_VXRM_SHIFT 1
+#define CSR_VXSAT_MASK 1
 
 /* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
 #define CSR_SISELECT   0x150

-- 
2.45.0




[PATCH v10 08/14] riscv: Add xtheadvector instruction definitions

2024-09-11 Thread Charlie Jenkins
xtheadvector uses different encodings than standard vector for
vsetvli and vector loads/stores. Write the instruction formats to be
used in assembly code.

Co-developed-by: Heiko Stuebner 
Signed-off-by: Heiko Stuebner 
Signed-off-by: Charlie Jenkins 
---
 arch/riscv/include/asm/vendor_extensions/thead.h | 26 
 1 file changed, 26 insertions(+)

diff --git a/arch/riscv/include/asm/vendor_extensions/thead.h 
b/arch/riscv/include/asm/vendor_extensions/thead.h
index 190c91e37e95..118aa0f82c82 100644
--- a/arch/riscv/include/asm/vendor_extensions/thead.h
+++ b/arch/riscv/include/asm/vendor_extensions/thead.h
@@ -19,4 +19,30 @@ void disable_xtheadvector(void);
 void disable_xtheadvector(void) { }
 #endif
 
+/* Extension specific helpers */
+
+/*
+ * Vector 0.7.1 as used for example on T-Head Xuantie cores, uses an older
+ * encoding for vsetvli (ta, ma vs. d1), so provide an instruction for
+ * vsetvli t4, x0, e8, m8, d1
+ */
+#define THEAD_VSETVLI_T4X0E8M8D1   ".long  0x00307ed7\n\t"
+#define THEAD_VSETVLI_X0X0E8M8D1   ".long  0x00307057\n\t"
+
+/*
+ * While in theory, the vector-0.7.1 vsb.v and vlb.v result in the same
+ * encoding as the standard vse8.v and vle8.v, compilers seem to optimize
+ * the call resulting in a different encoding and then using a value for
+ * the "mop" field that is not part of vector-0.7.1
+ * So encode specific variants for vstate_save and _restore.
+ */
+#define THEAD_VSB_V_V0T0   ".long  0x02028027\n\t"
+#define THEAD_VSB_V_V8T0   ".long  0x02028427\n\t"
+#define THEAD_VSB_V_V16T0  ".long  0x02028827\n\t"
+#define THEAD_VSB_V_V24T0  ".long  0x02028c27\n\t"
+#define THEAD_VLB_V_V0T0   ".long  0x012028007\n\t"
+#define THEAD_VLB_V_V8T0   ".long  0x012028407\n\t"
+#define THEAD_VLB_V_V16T0  ".long  0x012028807\n\t"
+#define THEAD_VLB_V_V24T0  ".long  0x012028c07\n\t"
+
 #endif

-- 
2.45.0




[PATCH v10 06/14] RISC-V: define the elements of the VCSR vector CSR

2024-09-11 Thread Charlie Jenkins
From: Heiko Stuebner 

The VCSR CSR contains two elements VXRM[2:1] and VXSAT[0].

Define constants for those to access the elements in a readable way.

Acked-by: Guo Ren 
Reviewed-by: Conor Dooley 
Signed-off-by: Heiko Stuebner 
Signed-off-by: Charlie Jenkins 
---
 arch/riscv/include/asm/csr.h | 4 
 1 file changed, 4 insertions(+)

diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index 25966995da04..3eeb07d73065 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -300,6 +300,10 @@
 #define CSR_STIMECMP   0x14D
 #define CSR_STIMECMPH  0x15D
 
+#define VCSR_VXRM_MASK 3
+#define VCSR_VXRM_SHIFT1
+#define VCSR_VXSAT_MASK1
+
 /* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
 #define CSR_SISELECT   0x150
 #define CSR_SIREG  0x151

-- 
2.45.0




[PATCH v10 09/14] riscv: vector: Support xtheadvector save/restore

2024-09-11 Thread Charlie Jenkins
Use alternatives to add support for xtheadvector vector save/restore
routines.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Conor Dooley 
---
 arch/riscv/include/asm/csr.h   |   6 +
 arch/riscv/include/asm/switch_to.h |   2 +-
 arch/riscv/include/asm/vector.h| 225 +
 arch/riscv/kernel/cpufeature.c |   6 +-
 arch/riscv/kernel/kernel_mode_vector.c |   8 +-
 arch/riscv/kernel/process.c|   4 +-
 arch/riscv/kernel/signal.c |   6 +-
 arch/riscv/kernel/vector.c |  12 +-
 8 files changed, 200 insertions(+), 69 deletions(-)

diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index c0a60c4ed911..b4b3fcb1d142 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -30,6 +30,12 @@
 #define SR_VS_CLEAN_AC(0x0400, UL)
 #define SR_VS_DIRTY_AC(0x0600, UL)
 
+#define SR_VS_THEAD_AC(0x0180, UL) /* xtheadvector Status */
+#define SR_VS_OFF_THEAD_AC(0x, UL)
+#define SR_VS_INITIAL_THEAD_AC(0x0080, UL)
+#define SR_VS_CLEAN_THEAD  _AC(0x0100, UL)
+#define SR_VS_DIRTY_THEAD  _AC(0x0180, UL)
+
 #define SR_XS  _AC(0x00018000, UL) /* Extension Status */
 #define SR_XS_OFF  _AC(0x, UL)
 #define SR_XS_INITIAL  _AC(0x8000, UL)
diff --git a/arch/riscv/include/asm/switch_to.h 
b/arch/riscv/include/asm/switch_to.h
index 7594df37cc9f..f9cbebe372b8 100644
--- a/arch/riscv/include/asm/switch_to.h
+++ b/arch/riscv/include/asm/switch_to.h
@@ -99,7 +99,7 @@ do {  \
__set_prev_cpu(__prev->thread); \
if (has_fpu())  \
__switch_to_fpu(__prev, __next);\
-   if (has_vector())   \
+   if (has_vector() || has_xtheadvector()) \
__switch_to_vector(__prev, __next); \
if (switch_to_should_flush_icache(__next))  \
local_flush_icache_all();   \
diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h
index be7d309cca8a..6fd05efc6837 100644
--- a/arch/riscv/include/asm/vector.h
+++ b/arch/riscv/include/asm/vector.h
@@ -18,6 +18,27 @@
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
+
+#define __riscv_v_vstate_or(_val, TYPE) ({ \
+   typeof(_val) _res = _val;   \
+   if (has_xtheadvector()) \
+   _res = (_res & ~SR_VS_THEAD) | SR_VS_##TYPE##_THEAD;\
+   else\
+   _res = (_res & ~SR_VS) | SR_VS_##TYPE;  \
+   _res;   \
+})
+
+#define __riscv_v_vstate_check(_val, TYPE) ({  \
+   bool _res;  \
+   if (has_xtheadvector()) \
+   _res = ((_val) & SR_VS_THEAD) == SR_VS_##TYPE##_THEAD;  \
+   else\
+   _res = ((_val) & SR_VS) == SR_VS_##TYPE;\
+   _res;   \
+})
 
 extern unsigned long riscv_v_vsize;
 int riscv_v_setup_vsize(void);
@@ -40,39 +61,62 @@ static __always_inline bool has_vector(void)
return riscv_has_extension_unlikely(RISCV_ISA_EXT_ZVE32X);
 }
 
+static __always_inline bool has_xtheadvector_no_alternatives(void)
+{
+   if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
+   return riscv_isa_vendor_extension_available(THEAD_VENDOR_ID, 
XTHEADVECTOR);
+   else
+   return false;
+}
+
+static __always_inline bool has_xtheadvector(void)
+{
+   if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
+   return riscv_has_vendor_extension_unlikely(THEAD_VENDOR_ID,
+  
RISCV_ISA_VENDOR_EXT_XTHEADVECTOR);
+   else
+   return false;
+}
+
 static inline void __riscv_v_vstate_clean(struct pt_regs *regs)
 {
-   regs->status = (regs->status & ~SR_VS) | SR_VS_CLEAN;
+   regs->status = __riscv_v_vstate_or(regs->status, CLEAN);
 }
 
 static inline void __riscv_v_vstate_dirty(struct pt_regs *regs)
 {
-   regs->status = (regs->status & ~SR_VS) | SR_VS_DIRTY;
+   regs->status = __riscv_v_vstate_or(regs->status, DIRTY);
 }
 
 static inline void riscv_v_vstate_off(struct pt_regs *regs)
 {
-   regs->status = (regs->status & ~SR_VS) | SR_VS_OFF;
+   regs->status = __riscv_v_vstate_or(regs->status, OFF);
 }
 
 static inline void riscv_v_vstate_on(struct pt_regs *regs)
 {
-   regs->status = (regs->status & ~SR_VS) | SR_VS_INITIAL;
+   regs->status = __riscv_v_vstate_or(regs->status, INITIAL);
 }
 
 static inline bool riscv_v_vstate_quer

[PATCH v10 10/14] riscv: hwprobe: Add thead vendor extension probing

2024-09-11 Thread Charlie Jenkins
Add a new hwprobe key "RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0" which
allows userspace to probe for the new RISCV_ISA_VENDOR_EXT_XTHEADVECTOR
vendor extension.

This new key will allow userspace code to probe for which thead vendor
extensions are supported. This API is modeled to be consistent with
RISCV_HWPROBE_KEY_IMA_EXT_0. The bitmask returned will have each bit
corresponding to a supported thead vendor extension of the cpumask set.
Just like RISCV_HWPROBE_KEY_IMA_EXT_0, this allows a userspace program
to determine all of the supported thead vendor extensions in one call.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Evan Green 
---
 arch/riscv/include/asm/hwprobe.h   |  3 +-
 .../include/asm/vendor_extensions/thead_hwprobe.h  | 19 +++
 .../include/asm/vendor_extensions/vendor_hwprobe.h | 37 ++
 arch/riscv/include/uapi/asm/hwprobe.h  |  3 +-
 arch/riscv/include/uapi/asm/vendor/thead.h |  3 ++
 arch/riscv/kernel/sys_hwprobe.c|  5 +++
 arch/riscv/kernel/vendor_extensions/Makefile   |  1 +
 .../riscv/kernel/vendor_extensions/thead_hwprobe.c | 19 +++
 8 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwprobe.h
index ef01c182af2b..6148e1eab64c 100644
--- a/arch/riscv/include/asm/hwprobe.h
+++ b/arch/riscv/include/asm/hwprobe.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
- * Copyright 2023 Rivos, Inc
+ * Copyright 2023-2024 Rivos, Inc
  */
 
 #ifndef _ASM_HWPROBE_H
@@ -21,6 +21,7 @@ static inline bool hwprobe_key_is_bitmask(__s64 key)
case RISCV_HWPROBE_KEY_BASE_BEHAVIOR:
case RISCV_HWPROBE_KEY_IMA_EXT_0:
case RISCV_HWPROBE_KEY_CPUPERF_0:
+   case RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0:
return true;
}
 
diff --git a/arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h 
b/arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h
new file mode 100644
index ..65a9c5612466
--- /dev/null
+++ b/arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H
+#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H
+
+#include 
+
+#include 
+
+#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
+void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const struct 
cpumask *cpus);
+#else
+static inline void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair,
+ const struct cpumask *cpus)
+{
+   pair->value = 0;
+}
+#endif
+
+#endif
diff --git a/arch/riscv/include/asm/vendor_extensions/vendor_hwprobe.h 
b/arch/riscv/include/asm/vendor_extensions/vendor_hwprobe.h
new file mode 100644
index ..6b9293e984a9
--- /dev/null
+++ b/arch/riscv/include/asm/vendor_extensions/vendor_hwprobe.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2024 Rivos, Inc
+ */
+
+#ifndef _ASM_RISCV_SYS_HWPROBE_H
+#define _ASM_RISCV_SYS_HWPROBE_H
+
+#include 
+
+#define VENDOR_EXT_KEY(ext)
\
+   do {
\
+   if (__riscv_isa_extension_available(isainfo->isa, 
RISCV_ISA_VENDOR_EXT_##ext)) \
+   pair->value |= RISCV_HWPROBE_VENDOR_EXT_##ext;  
\
+   else
\
+   missing |= RISCV_HWPROBE_VENDOR_EXT_##ext;  
\
+   } while (false)
+
+/*
+ * Loop through and record extensions that 1) anyone has, and 2) anyone
+ * doesn't have.
+ *
+ * _extension_checks is an arbitrary C block to set the values of pair->value
+ * and missing. It should be filled with VENDOR_EXT_KEY expressions.
+ */
+#define VENDOR_EXTENSION_SUPPORTED(pair, cpus, per_hart_vendor_bitmap, 
_extension_checks)  \
+   do {
\
+   int cpu;
\
+   u64 missing = 0;
\
+   for_each_cpu(cpu, (cpus)) { 
\
+   struct riscv_isavendorinfo *isainfo = 
&(per_hart_vendor_bitmap)[cpu];   \
+   _extension_checks   
\
+   }   
\
+   (pair)->value &= ~missing;  
\
+   } while (false) 
\
+
+#endif /* _ASM_RISCV_SYS_HWPROBE_H */
dif

[PATCH v10 11/14] riscv: hwprobe: Document thead vendor extensions and xtheadvector extension

2024-09-11 Thread Charlie Jenkins
Document support for thead vendor extensions using the key
RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0 and xtheadvector extension using
the key RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR.

Signed-off-by: Charlie Jenkins 
Reviewed-by: Evan Green 
---
 Documentation/arch/riscv/hwprobe.rst | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/arch/riscv/hwprobe.rst 
b/Documentation/arch/riscv/hwprobe.rst
index 3db60a0911df..400753d166ee 100644
--- a/Documentation/arch/riscv/hwprobe.rst
+++ b/Documentation/arch/riscv/hwprobe.rst
@@ -266,3 +266,13 @@ The following keys are defined:
   represent the highest userspace virtual address usable.
 
 * :c:macro:`RISCV_HWPROBE_KEY_TIME_CSR_FREQ`: Frequency (in Hz) of `time CSR`.
+
+* :c:macro:`RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0`: A bitmask containing the
+  thead vendor extensions that are compatible with the
+  :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`: base system behavior.
+
+  * T-HEAD
+
+* :c:macro:`RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR`: The xtheadvector vendor
+extension is supported in the T-Head ISA extensions spec starting from
+   commit a18c801634 ("Add T-Head VECTOR vendor extension. ").

-- 
2.45.0




[PATCH v10 13/14] selftests: riscv: Support xtheadvector in vector tests

2024-09-11 Thread Charlie Jenkins
Extend existing vector tests to be compatible with the xtheadvector
instructions.

Signed-off-by: Charlie Jenkins 
---
 .../selftests/riscv/vector/v_exec_initval_nolibc.c | 23 --
 tools/testing/selftests/riscv/vector/v_helpers.c   | 17 -
 tools/testing/selftests/riscv/vector/v_helpers.h   |  4 +-
 tools/testing/selftests/riscv/vector/v_initval.c   | 12 ++-
 .../selftests/riscv/vector/vstate_exec_nolibc.c| 20 +++--
 .../testing/selftests/riscv/vector/vstate_prctl.c  | 89 ++
 6 files changed, 113 insertions(+), 52 deletions(-)

diff --git a/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c 
b/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c
index 4a39cab29c34..35c0812e32de 100644
--- a/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c
+++ b/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c
@@ -18,13 +18,22 @@ int main(int argc, char **argv)
unsigned long vl;
int first = 1;
 
-   asm volatile (
-   ".option push\n\t"
-   ".option arch, +v\n\t"
-   "vsetvli%[vl], x0, e8, m1, ta, ma\n\t"
-   ".option pop\n\t"
-   : [vl] "=r" (vl)
-   );
+   if (argc > 2 && strcmp(argv[2], "x"))
+   asm volatile (
+   // 0 | zimm[10:0] | rs1 | 1 1 1 | rd |1010111| vsetvli
+   // vsetvli  t4, x0, e8, m1, d1
+   ".4byte 0b011011010111\n\t"
+   "mv %[vl], t4\n\t"
+   : [vl] "=r" (vl) : : "t4"
+   );
+   else
+   asm volatile (
+   ".option push\n\t"
+   ".option arch, +v\n\t"
+   "vsetvli%[vl], x0, e8, m1, ta, ma\n\t"
+   ".option pop\n\t"
+   : [vl] "=r" (vl)
+   );
 
 #define CHECK_VECTOR_REGISTER(register) ({ 
\
for (int i = 0; i < vl; i++) {  
\
diff --git a/tools/testing/selftests/riscv/vector/v_helpers.c 
b/tools/testing/selftests/riscv/vector/v_helpers.c
index d50f4dfbf9e5..01a8799dcb78 100644
--- a/tools/testing/selftests/riscv/vector/v_helpers.c
+++ b/tools/testing/selftests/riscv/vector/v_helpers.c
@@ -1,12 +1,22 @@
 // SPDX-License-Identifier: GPL-2.0-only
 
 #include "../hwprobe/hwprobe.h"
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 
+bool is_xtheadvector_supported(void)
+{
+   struct riscv_hwprobe pair;
+
+   pair.key = RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0;
+   riscv_hwprobe(&pair, 1, 0, NULL, 0);
+   return pair.value & RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR;
+}
+
 bool is_vector_supported(void)
 {
struct riscv_hwprobe pair;
@@ -16,9 +26,9 @@ bool is_vector_supported(void)
return pair.value & RISCV_HWPROBE_EXT_ZVE32X;
 }
 
-int launch_test(char *next_program, int test_inherit)
+int launch_test(char *next_program, int test_inherit, int xtheadvector)
 {
-   char *exec_argv[3], *exec_envp[1];
+   char *exec_argv[4], *exec_envp[1];
int rc, pid, status;
 
pid = fork();
@@ -30,7 +40,8 @@ int launch_test(char *next_program, int test_inherit)
if (!pid) {
exec_argv[0] = next_program;
exec_argv[1] = test_inherit != 0 ? "x" : NULL;
-   exec_argv[2] = NULL;
+   exec_argv[2] = xtheadvector != 0 ? "x" : NULL;
+   exec_argv[3] = NULL;
exec_envp[0] = NULL;
/* launch the program again to check inherit */
rc = execve(next_program, exec_argv, exec_envp);
diff --git a/tools/testing/selftests/riscv/vector/v_helpers.h 
b/tools/testing/selftests/riscv/vector/v_helpers.h
index faeeeb625b6e..763cddfe26da 100644
--- a/tools/testing/selftests/riscv/vector/v_helpers.h
+++ b/tools/testing/selftests/riscv/vector/v_helpers.h
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 #include 
 
+bool is_xtheadvector_supported(void);
+
 bool is_vector_supported(void);
 
-int launch_test(char *next_program, int test_inherit);
+int launch_test(char *next_program, int test_inherit, int xtheadvector);
diff --git a/tools/testing/selftests/riscv/vector/v_initval.c 
b/tools/testing/selftests/riscv/vector/v_initval.c
index f38b5797fa31..be9e1d18ad29 100644
--- a/tools/testing/selftests/riscv/vector/v_initval.c
+++ b/tools/testing/selftests/riscv/vector/v_initval.c
@@ -7,10 +7,16 @@
 
 TEST(v_initval)
 {
-   if (!is_vector_supported())
-   SKIP(return, "Vector not supported");
+   int xtheadvector = 0;
 
-   ASSERT_EQ(0, launch_test(NEXT_PROGRAM, 0));
+   if (!is_vector_supported()) {
+   if (is_xtheadvector_supported())
+   xtheadvector = 1;
+   else
+   SKIP(return, "Vector not supported");
+   }
+
+   ASSE

[PATCH v10 14/14] riscv: Add ghostwrite vulnerability

2024-09-11 Thread Charlie Jenkins
Follow the patterns of the other architectures that use
GENERIC_CPU_VULNERABILITIES for riscv to introduce the ghostwrite
vulnerability and mitigation. The mitigation is to disable all vector
which is accomplished by clearing the bit from the cpufeature field.

Ghostwrite only affects thead c9xx CPUs that impelment xtheadvector, so
the vulerability will only be mitigated on these CPUs.

Signed-off-by: Charlie Jenkins 
---
 arch/riscv/Kconfig.errata| 11 
 arch/riscv/errata/thead/errata.c | 28 ++
 arch/riscv/include/asm/bugs.h| 22 +++
 arch/riscv/include/asm/errata_list.h |  3 +-
 arch/riscv/kernel/Makefile   |  2 ++
 arch/riscv/kernel/bugs.c | 55 
 arch/riscv/kernel/cpufeature.c   |  9 +-
 drivers/base/cpu.c   |  3 ++
 include/linux/cpu.h  |  1 +
 9 files changed, 132 insertions(+), 2 deletions(-)

diff --git a/arch/riscv/Kconfig.errata b/arch/riscv/Kconfig.errata
index 2acc7d876e1f..e318119d570d 100644
--- a/arch/riscv/Kconfig.errata
+++ b/arch/riscv/Kconfig.errata
@@ -119,4 +119,15 @@ config ERRATA_THEAD_PMU
 
  If you don't know what to do here, say "Y".
 
+config ERRATA_THEAD_GHOSTWRITE
+   bool "Apply T-Head Ghostwrite errata"
+   depends on ERRATA_THEAD && RISCV_ISA_XTHEADVECTOR
+   default y
+   help
+ The T-Head C9xx cores have a vulnerability in the xtheadvector
+ instruction set. When this errata is enabled, the CPUs will be probed
+ to determine if they are vulnerable and disable xtheadvector.
+
+ If you don't know what to do here, say "Y".
+
 endmenu # "CPU errata selection"
diff --git a/arch/riscv/errata/thead/errata.c b/arch/riscv/errata/thead/errata.c
index f5120e07c318..5cc008ab41a8 100644
--- a/arch/riscv/errata/thead/errata.c
+++ b/arch/riscv/errata/thead/errata.c
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -142,6 +143,31 @@ static bool errata_probe_pmu(unsigned int stage,
return true;
 }
 
+static bool errata_probe_ghostwrite(unsigned int stage,
+   unsigned long arch_id, unsigned long impid)
+{
+   if (!IS_ENABLED(CONFIG_ERRATA_THEAD_GHOSTWRITE))
+   return false;
+
+   /*
+* target-c9xx cores report arch_id and impid as 0
+*
+* While ghostwrite may not affect all c9xx cores that implement
+* xtheadvector, there is no futher granularity than c9xx. Assume
+* vulnerable for this entire class of processors when xtheadvector is
+* enabled.
+*/
+   if (arch_id != 0 || impid != 0)
+   return false;
+
+   if (stage != RISCV_ALTERNATIVES_EARLY_BOOT)
+   return false;
+
+   ghostwrite_set_vulnerable();
+
+   return true;
+}
+
 static u32 thead_errata_probe(unsigned int stage,
  unsigned long archid, unsigned long impid)
 {
@@ -155,6 +181,8 @@ static u32 thead_errata_probe(unsigned int stage,
if (errata_probe_pmu(stage, archid, impid))
cpu_req_errata |= BIT(ERRATA_THEAD_PMU);
 
+   errata_probe_ghostwrite(stage, archid, impid);
+
return cpu_req_errata;
 }
 
diff --git a/arch/riscv/include/asm/bugs.h b/arch/riscv/include/asm/bugs.h
new file mode 100644
index ..e294b15bf78e
--- /dev/null
+++ b/arch/riscv/include/asm/bugs.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Interface for managing mitigations for riscv vulnerabilities.
+ *
+ * Copyright (C) 2024 Rivos Inc.
+ */
+
+#ifndef __ASM_BUGS_H
+#define __ASM_BUGS_H
+
+/* Watch out, ordering is important here. */
+enum mitigation_state {
+   UNAFFECTED,
+   MITIGATED,
+   VULNERABLE,
+};
+
+void ghostwrite_set_vulnerable(void);
+void ghostwrite_enable_mitigation(void);
+enum mitigation_state ghostwrite_get_state(void);
+
+#endif /* __ASM_BUGS_H */
diff --git a/arch/riscv/include/asm/errata_list.h 
b/arch/riscv/include/asm/errata_list.h
index 7c8a71a526a3..6e426ed7919a 100644
--- a/arch/riscv/include/asm/errata_list.h
+++ b/arch/riscv/include/asm/errata_list.h
@@ -25,7 +25,8 @@
 #ifdef CONFIG_ERRATA_THEAD
 #defineERRATA_THEAD_MAE 0
 #defineERRATA_THEAD_PMU 1
-#defineERRATA_THEAD_NUMBER 2
+#defineERRATA_THEAD_GHOSTWRITE 2
+#defineERRATA_THEAD_NUMBER 3
 #endif
 
 #ifdef __ASSEMBLY__
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 06d407f1b30b..d7a54e34178e 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -113,3 +113,5 @@ obj-$(CONFIG_COMPAT)+= compat_vdso/
 obj-$(CONFIG_64BIT)+= pi/
 obj-$(CONFIG_ACPI) += acpi.o
 obj-$(CONFIG_ACPI_NUMA)+= acpi_numa.o
+
+obj-$(CONFIG_GENERIC_CPU_VULNERABILITIES) += bugs.o
diff --git a/arch/riscv/kernel/bugs.c b/arch/riscv/kernel/bugs.c
new file mode 100644

[PATCH v10 12/14] selftests: riscv: Fix vector tests

2024-09-11 Thread Charlie Jenkins
Overhaul the riscv vector tests to use kselftest_harness to help the
test cases correctly report the results and decouple the individual test
cases from each other. With this refactoring, only run the test cases if
vector is reported and properly report the test case as skipped
otherwise. The v_initval_nolibc test was previously not checking if
vector was supported and used a function (malloc) which invalidates
the state of the vector registers.

Signed-off-by: Charlie Jenkins 
---
 tools/testing/selftests/riscv/vector/.gitignore|   3 +-
 tools/testing/selftests/riscv/vector/Makefile  |  17 +-
 .../selftests/riscv/vector/v_exec_initval_nolibc.c |  85 +++
 tools/testing/selftests/riscv/vector/v_helpers.c   |  57 +
 tools/testing/selftests/riscv/vector/v_helpers.h   |   6 +
 tools/testing/selftests/riscv/vector/v_initval.c   |  16 ++
 .../selftests/riscv/vector/v_initval_nolibc.c  |  68 -
 .../testing/selftests/riscv/vector/vstate_prctl.c  | 278 -
 8 files changed, 337 insertions(+), 193 deletions(-)

diff --git a/tools/testing/selftests/riscv/vector/.gitignore 
b/tools/testing/selftests/riscv/vector/.gitignore
index 9ae7964491d5..7d9c87cd0649 100644
--- a/tools/testing/selftests/riscv/vector/.gitignore
+++ b/tools/testing/selftests/riscv/vector/.gitignore
@@ -1,3 +1,4 @@
 vstate_exec_nolibc
 vstate_prctl
-v_initval_nolibc
+v_initval
+v_exec_initval_nolibc
diff --git a/tools/testing/selftests/riscv/vector/Makefile 
b/tools/testing/selftests/riscv/vector/Makefile
index bfff0ff4f3be..995746359477 100644
--- a/tools/testing/selftests/riscv/vector/Makefile
+++ b/tools/testing/selftests/riscv/vector/Makefile
@@ -2,18 +2,27 @@
 # Copyright (C) 2021 ARM Limited
 # Originally tools/testing/arm64/abi/Makefile
 
-TEST_GEN_PROGS := vstate_prctl v_initval_nolibc
-TEST_GEN_PROGS_EXTENDED := vstate_exec_nolibc
+TEST_GEN_PROGS := v_initval vstate_prctl
+TEST_GEN_PROGS_EXTENDED := vstate_exec_nolibc v_exec_initval_nolibc 
sys_hwprobe.o v_helpers.o
 
 include ../../lib.mk
 
-$(OUTPUT)/vstate_prctl: vstate_prctl.c ../hwprobe/sys_hwprobe.S
+$(OUTPUT)/sys_hwprobe.o: ../hwprobe/sys_hwprobe.S
+   $(CC) -static -c -o$@ $(CFLAGS) $^
+
+$(OUTPUT)/v_helpers.o: v_helpers.c
+   $(CC) -static -c -o$@ $(CFLAGS) $^
+
+$(OUTPUT)/vstate_prctl: vstate_prctl.c $(OUTPUT)/sys_hwprobe.o 
$(OUTPUT)/v_helpers.o
$(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
 
 $(OUTPUT)/vstate_exec_nolibc: vstate_exec_nolibc.c
$(CC) -nostdlib -static -include ../../../../include/nolibc/nolibc.h \
-Wall $(CFLAGS) $(LDFLAGS) $^ -o $@ -lgcc
 
-$(OUTPUT)/v_initval_nolibc: v_initval_nolibc.c
+$(OUTPUT)/v_initval: v_initval.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)/v_helpers.o
+   $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+
+$(OUTPUT)/v_exec_initval_nolibc: v_exec_initval_nolibc.c
$(CC) -nostdlib -static -include ../../../../include/nolibc/nolibc.h \
-Wall $(CFLAGS) $(LDFLAGS) $^ -o $@ -lgcc
diff --git a/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c 
b/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c
new file mode 100644
index ..4a39cab29c34
--- /dev/null
+++ b/tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Get values of vector registers as soon as the program starts to test if
+ * is properly cleaning the values before starting a new program. Vector
+ * registers are caller saved, so no function calls may happen before reading
+ * the values. To further ensure consistency, this file is compiled without
+ * libc and without auto-vectorization.
+ *
+ * To be "clean" all values must be either all ones or all zeroes.
+ */
+
+#define __stringify_1(x...)#x
+#define __stringify(x...)  __stringify_1(x)
+
+int main(int argc, char **argv)
+{
+   char prev_value = 0, value;
+   unsigned long vl;
+   int first = 1;
+
+   asm volatile (
+   ".option push\n\t"
+   ".option arch, +v\n\t"
+   "vsetvli%[vl], x0, e8, m1, ta, ma\n\t"
+   ".option pop\n\t"
+   : [vl] "=r" (vl)
+   );
+
+#define CHECK_VECTOR_REGISTER(register) ({ 
\
+   for (int i = 0; i < vl; i++) {  
\
+   asm volatile (  
\
+   ".option push\n\t"  
\
+   ".option arch, +v\n\t"  
\
+   "vmv.x.s %0, " __stringify(register) "\n\t" 
\
+   "vsrl.vi " __stringify(register) ", " 
__stringify(register) ", 8\n\t" \
+   ".option pop\n\t"   
\
+   : "=r" (value));
\
+   if (first) {