2022-09-12 13:35:44

by George Pee

[permalink] [raw]
Subject: [PATCH v2] ARM : Support for optional ARMv8.2 half-precision floating point extension

Report feature /proc/cpuinfo as fphp to be consistent with arm64

Signed-off-by: george pee <[email protected]>
---
arch/arm/include/uapi/asm/hwcap.h | 1 +
arch/arm/kernel/entry-armv.S | 3 ++-
arch/arm/kernel/setup.c | 1 +
arch/arm/vfp/vfpmodule.c | 2 ++
4 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
index 990199d8b7c6..5d635dce8853 100644
--- a/arch/arm/include/uapi/asm/hwcap.h
+++ b/arch/arm/include/uapi/asm/hwcap.h
@@ -37,5 +37,6 @@
#define HWCAP2_SHA1 (1 << 2)
#define HWCAP2_SHA2 (1 << 3)
#define HWCAP2_CRC32 (1 << 4)
+#define HWCAP2_FPHP (1 << 5)

#endif /* _UAPI__ASMARM_HWCAP_H */
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index c39303e5c234..161f8df852e1 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -625,11 +625,12 @@ call_fpe:
ret.w lr @ CP#6
ret.w lr @ CP#7
ret.w lr @ CP#8
- ret.w lr @ CP#9
#ifdef CONFIG_VFP
+ W(b) do_vfp @ CP#9 (VFP/FP16)
W(b) do_vfp @ CP#10 (VFP)
W(b) do_vfp @ CP#11 (VFP)
#else
+ ret.w lr @ CP#9
ret.w lr @ CP#10 (VFP)
ret.w lr @ CP#11 (VFP)
#endif
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 1e8a50a97edf..8887d0f447d6 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -1258,6 +1258,7 @@ static const char *hwcap2_str[] = {
"sha1",
"sha2",
"crc32",
+ "fphp",
NULL
};

diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 2cb355c1b5b7..0806b0b1f2c7 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -831,6 +831,8 @@ static int __init vfp_init(void)

if ((fmrx(MVFR1) & 0xf0000000) == 0x10000000)
elf_hwcap |= HWCAP_VFPv4;
+ if ((fmrx(MVFR1) & 0x0f000000) == 0x03000000)
+ elf_hwcap2 |= HWCAP2_FPHP;
}
/* Extract the architecture version on pre-cpuid scheme */
} else {
--
2.37.3


2022-11-03 14:01:59

by George Pee

[permalink] [raw]
Subject: Re: [PATCH v2] ARM : Support for optional ARMv8.2 half-precision floating point extension

On Mon, Sep 12, 2022 at 8:25 AM george pee <[email protected]> wrote:
>
> Report feature /proc/cpuinfo as fphp to be consistent with arm64
>
> Signed-off-by: george pee <[email protected]>
> ---
> arch/arm/include/uapi/asm/hwcap.h | 1 +
> arch/arm/kernel/entry-armv.S | 3 ++-
> arch/arm/kernel/setup.c | 1 +
> arch/arm/vfp/vfpmodule.c | 2 ++
> 4 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
> index 990199d8b7c6..5d635dce8853 100644
> --- a/arch/arm/include/uapi/asm/hwcap.h
> +++ b/arch/arm/include/uapi/asm/hwcap.h
> @@ -37,5 +37,6 @@
> #define HWCAP2_SHA1 (1 << 2)
> #define HWCAP2_SHA2 (1 << 3)
> #define HWCAP2_CRC32 (1 << 4)
> +#define HWCAP2_FPHP (1 << 5)
>
> #endif /* _UAPI__ASMARM_HWCAP_H */
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index c39303e5c234..161f8df852e1 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -625,11 +625,12 @@ call_fpe:
> ret.w lr @ CP#6
> ret.w lr @ CP#7
> ret.w lr @ CP#8
> - ret.w lr @ CP#9
> #ifdef CONFIG_VFP
> + W(b) do_vfp @ CP#9 (VFP/FP16)
> W(b) do_vfp @ CP#10 (VFP)
> W(b) do_vfp @ CP#11 (VFP)
> #else
> + ret.w lr @ CP#9
> ret.w lr @ CP#10 (VFP)
> ret.w lr @ CP#11 (VFP)
> #endif
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 1e8a50a97edf..8887d0f447d6 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -1258,6 +1258,7 @@ static const char *hwcap2_str[] = {
> "sha1",
> "sha2",
> "crc32",
> + "fphp",
> NULL
> };
>
> diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
> index 2cb355c1b5b7..0806b0b1f2c7 100644
> --- a/arch/arm/vfp/vfpmodule.c
> +++ b/arch/arm/vfp/vfpmodule.c
> @@ -831,6 +831,8 @@ static int __init vfp_init(void)
>
> if ((fmrx(MVFR1) & 0xf0000000) == 0x10000000)
> elf_hwcap |= HWCAP_VFPv4;
> + if ((fmrx(MVFR1) & 0x0f000000) == 0x03000000)
> + elf_hwcap2 |= HWCAP2_FPHP;
> }
> /* Extract the architecture version on pre-cpuid scheme */
> } else {
> --
> 2.37.3
>

Any concerns with this?

2022-11-03 16:47:29

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH v2] ARM : Support for optional ARMv8.2 half-precision floating point extension

Sorry for top-posting but provding context.

Please CC Mark Brown om FP extensions, he is looking after these.
Now add on To:

Yours,
Linus Walleij

On Mon, Sep 12, 2022 at 3:25 PM george pee <[email protected]> wrote:

> Report feature /proc/cpuinfo as fphp to be consistent with arm64
>
> Signed-off-by: george pee <[email protected]>
> ---
> arch/arm/include/uapi/asm/hwcap.h | 1 +
> arch/arm/kernel/entry-armv.S | 3 ++-
> arch/arm/kernel/setup.c | 1 +
> arch/arm/vfp/vfpmodule.c | 2 ++
> 4 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
> index 990199d8b7c6..5d635dce8853 100644
> --- a/arch/arm/include/uapi/asm/hwcap.h
> +++ b/arch/arm/include/uapi/asm/hwcap.h
> @@ -37,5 +37,6 @@
> #define HWCAP2_SHA1 (1 << 2)
> #define HWCAP2_SHA2 (1 << 3)
> #define HWCAP2_CRC32 (1 << 4)
> +#define HWCAP2_FPHP (1 << 5)
>
> #endif /* _UAPI__ASMARM_HWCAP_H */
> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
> index c39303e5c234..161f8df852e1 100644
> --- a/arch/arm/kernel/entry-armv.S
> +++ b/arch/arm/kernel/entry-armv.S
> @@ -625,11 +625,12 @@ call_fpe:
> ret.w lr @ CP#6
> ret.w lr @ CP#7
> ret.w lr @ CP#8
> - ret.w lr @ CP#9
> #ifdef CONFIG_VFP
> + W(b) do_vfp @ CP#9 (VFP/FP16)
> W(b) do_vfp @ CP#10 (VFP)
> W(b) do_vfp @ CP#11 (VFP)
> #else
> + ret.w lr @ CP#9
> ret.w lr @ CP#10 (VFP)
> ret.w lr @ CP#11 (VFP)
> #endif
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 1e8a50a97edf..8887d0f447d6 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -1258,6 +1258,7 @@ static const char *hwcap2_str[] = {
> "sha1",
> "sha2",
> "crc32",
> + "fphp",
> NULL
> };
>
> diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
> index 2cb355c1b5b7..0806b0b1f2c7 100644
> --- a/arch/arm/vfp/vfpmodule.c
> +++ b/arch/arm/vfp/vfpmodule.c
> @@ -831,6 +831,8 @@ static int __init vfp_init(void)
>
> if ((fmrx(MVFR1) & 0xf0000000) == 0x10000000)
> elf_hwcap |= HWCAP_VFPv4;
> + if ((fmrx(MVFR1) & 0x0f000000) == 0x03000000)
> + elf_hwcap2 |= HWCAP2_FPHP;
> }
> /* Extract the architecture version on pre-cpuid scheme */
> } else {
> --
> 2.37.3
>

2022-11-03 17:08:30

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v2] ARM : Support for optional ARMv8.2 half-precision floating point extension

On Thu, Nov 03, 2022 at 05:18:21PM +0100, Linus Walleij wrote:

> Please CC Mark Brown om FP extensions, he is looking after these.

For arm64 anyway, though this is targetted at 32 bit kernels running on
v8 hardware so still somewhere around my wheelhouse.

> On Mon, Sep 12, 2022 at 3:25 PM george pee <[email protected]> wrote:

> > Report feature /proc/cpuinfo as fphp to be consistent with arm64

Well, more so that applications can discover and use this feature when
running on a system that has it in a way that's consistent with how they
might do this when running on arm64 kernels. It's also adding a hwcap
as well as updating /proc/cpuinfo.

> > index 990199d8b7c6..5d635dce8853 100644
> > --- a/arch/arm/include/uapi/asm/hwcap.h
> > +++ b/arch/arm/include/uapi/asm/hwcap.h
> > @@ -37,5 +37,6 @@
> > #define HWCAP2_SHA1 (1 << 2)
> > #define HWCAP2_SHA2 (1 << 3)
> > #define HWCAP2_CRC32 (1 << 4)
> > +#define HWCAP2_FPHP (1 << 5)

This is adding a hwcap for the feature in arm, if we're addding this we
should also do so for compat mode for arm64 (as a second patch in the
series probably). That will ensure that everything is consistent no
matter if the kernel is 32 or 64 bit.

> > + if ((fmrx(MVFR1) & 0x0f000000) == 0x03000000)
> > + elf_hwcap2 |= HWCAP2_FPHP;

I'm not super familiar with the 32 bit code here but the change looks
reasonable and seems to match up with how DDI0487I.a describes things,
arm64 checks ID_AA64PFR0_EL1.FPHP but there's also requirements which
mean that the 32 bit ID register MVFR1 be in sync with that.


Attachments:
(No filename) (1.62 kB)
signature.asc (499.00 B)
Download all attachments