-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
riscv: hwprobe: Add thead vendor extension probing
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 <charlie@rivosinc.com> Reviewed-by: Evan Green <evan@rivosinc.com> Tested-by: Yangyu Chen <cyy@cyyself.name> Link: https://lore.kernel.org/r/20241113-xtheadvector-v11-10-236c22791ef9@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
- Loading branch information
Charlie Jenkins
authored and
Palmer Dabbelt
committed
Jan 18, 2025
1 parent
d863910
commit a5ea53d
Showing
8 changed files
with
89 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <linux/cpumask.h> | ||
|
||
#include <uapi/asm/hwprobe.h> | ||
|
||
#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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <asm/cpufeature.h> | ||
|
||
#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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
|
||
#define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
|
||
#include <asm/vendor_extensions/thead.h> | ||
#include <asm/vendor_extensions/thead_hwprobe.h> | ||
#include <asm/vendor_extensions/vendor_hwprobe.h> | ||
|
||
#include <linux/cpumask.h> | ||
#include <linux/types.h> | ||
|
||
#include <uapi/asm/hwprobe.h> | ||
#include <uapi/asm/vendor/thead.h> | ||
|
||
void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const struct cpumask *cpus) | ||
{ | ||
VENDOR_EXTENSION_SUPPORTED(pair, cpus, | ||
riscv_isa_vendor_ext_list_thead.per_hart_isa_bitmap, { | ||
VENDOR_EXT_KEY(XTHEADVECTOR); | ||
}); | ||
} |