* [PATCH v2] powerpc/powernv: Cache OPAL check_token() results
@ 2026-06-26 12:35 Shivang Upadhyay
2026-06-30 13:50 ` Sourabh Jain
2026-09-22 5:36 ` Aditya Gupta
0 siblings, 2 replies; 5+ messages in thread
From: Shivang Upadhyay @ 2026-06-26 12:35 UTC (permalink / raw)
To: shivangu
Cc: adityag, chleroy, linux-kernel, linuxppc-dev, maddy, mahesh, mpe,
npiggin, sourabhjain, thuth
`opal_check_token()` function is used to determine if a specific
OPAL firmware call is supported on the current platform. This check
is performed frequently during boot and runtime, resulting in
unnecessary firmware calls for the same token values.
Add a caching layer for the opal_check_token() OPAL call to avoid
repeated firmware calls for token availability checks. This reduces
firmware call overhead during boot.
Testing with buildroot images shows OPAL calls reduced from
35578 to 28983, before console bring-up.
Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>
---
Changelog:
* v1: https://lore.kernel.org/all/20260601112520.161605-1-shivangu@linux.ibm.com/
- implemented tri-state check as suggestd by Sourabh.
- made the implementation more clear.
---
arch/powerpc/include/asm/opal.h | 1 +
arch/powerpc/platforms/powernv/opal-call.c | 2 +-
arch/powerpc/platforms/powernv/opal.c | 30 ++++++++++++++++++++++
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index 0a398265ba04..e7e11479122b 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -156,6 +156,7 @@ int64_t opal_pci_next_error(uint64_t phb_id, __be64 *first_frozen_pe,
int64_t opal_pci_poll(uint64_t id);
int64_t opal_return_cpu(void);
int64_t opal_check_token(uint64_t token);
+int64_t opal_check_token_call(uint64_t token);
int64_t opal_reinit_cpus(uint64_t flags);
int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val);
diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c
index 021b0ec29e24..00325c189e69 100644
--- a/arch/powerpc/platforms/powernv/opal-call.c
+++ b/arch/powerpc/platforms/powernv/opal-call.c
@@ -207,7 +207,7 @@ OPAL_CALL(opal_validate_flash, OPAL_FLASH_VALIDATE);
OPAL_CALL(opal_manage_flash, OPAL_FLASH_MANAGE);
OPAL_CALL(opal_update_flash, OPAL_FLASH_UPDATE);
OPAL_CALL(opal_resync_timebase, OPAL_RESYNC_TIMEBASE);
-OPAL_CALL(opal_check_token, OPAL_CHECK_TOKEN);
+OPAL_CALL(opal_check_token_call, OPAL_CHECK_TOKEN);
OPAL_CALL(opal_dump_init, OPAL_DUMP_INIT);
OPAL_CALL(opal_dump_info, OPAL_DUMP_INFO);
OPAL_CALL(opal_dump_info2, OPAL_DUMP_INFO2);
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
index 1946dbdc9fa1..1e9cb5271ee7 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -1125,6 +1125,36 @@ EXPORT_SYMBOL_GPL(opal_flash_read);
EXPORT_SYMBOL_GPL(opal_flash_write);
EXPORT_SYMBOL_GPL(opal_flash_erase);
EXPORT_SYMBOL_GPL(opal_prd_msg);
+
+/**
+ * opal_check_token - Check if an OPAL call token is supported
+ * @token: OPAL token number to check
+ *
+ * Returns 1 if supported, 0 if not.
+ */
+int64_t opal_check_token(uint64_t token)
+{
+ static u8 token_cache[OPAL_LAST];
+ enum {
+ SUPP_UNKNOWN = 0,
+ PRESENT,
+ ABSENT
+ };
+
+ if (token > OPAL_LAST)
+ return 0;
+
+ if (token_cache[token] == SUPP_UNKNOWN) {
+ /* Do the actual opal_call here */
+ if (opal_check_token_call(token)) {
+ token_cache[token] = PRESENT;
+ } else {
+ token_cache[token] = ABSENT;
+ }
+ }
+
+ return (token_cache[token] == PRESENT);
+}
EXPORT_SYMBOL_GPL(opal_check_token);
/* Convert a region of vmalloc memory to an opal sg list */
--
2.54.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] powerpc/powernv: Cache OPAL check_token() results
2026-06-26 12:35 [PATCH v2] powerpc/powernv: Cache OPAL check_token() results Shivang Upadhyay
@ 2026-06-30 13:50 ` Sourabh Jain
2026-09-22 5:36 ` Aditya Gupta
1 sibling, 0 replies; 5+ messages in thread
From: Sourabh Jain @ 2026-06-30 13:50 UTC (permalink / raw)
To: Shivang Upadhyay
Cc: adityag, chleroy, linux-kernel, linuxppc-dev, maddy, mahesh, mpe,
npiggin, thuth
On 26/06/26 18:05, Shivang Upadhyay wrote:
> `opal_check_token()` function is used to determine if a specific
> OPAL firmware call is supported on the current platform. This check
> is performed frequently during boot and runtime, resulting in
> unnecessary firmware calls for the same token values.
>
> Add a caching layer for the opal_check_token() OPAL call to avoid
> repeated firmware calls for token availability checks. This reduces
> firmware call overhead during boot.
>
> Testing with buildroot images shows OPAL calls reduced from
> 35578 to 28983, before console bring-up.
My testing shows similar statistics.
As per my testing, the upstream kernel (without this patch) at commit
840ef6c78e6a2f694b578, compiled with powernv_defconfig, shows ~7K
CHECK_TOKEN OPAL calls to boot the kernel and reach the console.
With this patch included, there are only 8 CHECK_TOKEN opal calls.
There is a significant reduction in CHECK_TOKEN OPAL calls
with this patch. Thanks for working on this improvement.
The changes look good to me. Feel free to add:
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
>
> Signed-off-by: Shivang Upadhyay <shivangu@linux.ibm.com>
> ---
> Changelog:
> * v1: https://lore.kernel.org/all/20260601112520.161605-1-shivangu@linux.ibm.com/
> - implemented tri-state check as suggestd by Sourabh.
> - made the implementation more clear.
>
> ---
> arch/powerpc/include/asm/opal.h | 1 +
> arch/powerpc/platforms/powernv/opal-call.c | 2 +-
> arch/powerpc/platforms/powernv/opal.c | 30 ++++++++++++++++++++++
> 3 files changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
> index 0a398265ba04..e7e11479122b 100644
> --- a/arch/powerpc/include/asm/opal.h
> +++ b/arch/powerpc/include/asm/opal.h
> @@ -156,6 +156,7 @@ int64_t opal_pci_next_error(uint64_t phb_id, __be64 *first_frozen_pe,
> int64_t opal_pci_poll(uint64_t id);
> int64_t opal_return_cpu(void);
> int64_t opal_check_token(uint64_t token);
> +int64_t opal_check_token_call(uint64_t token);
> int64_t opal_reinit_cpus(uint64_t flags);
>
> int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val);
> diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c
> index 021b0ec29e24..00325c189e69 100644
> --- a/arch/powerpc/platforms/powernv/opal-call.c
> +++ b/arch/powerpc/platforms/powernv/opal-call.c
> @@ -207,7 +207,7 @@ OPAL_CALL(opal_validate_flash, OPAL_FLASH_VALIDATE);
> OPAL_CALL(opal_manage_flash, OPAL_FLASH_MANAGE);
> OPAL_CALL(opal_update_flash, OPAL_FLASH_UPDATE);
> OPAL_CALL(opal_resync_timebase, OPAL_RESYNC_TIMEBASE);
> -OPAL_CALL(opal_check_token, OPAL_CHECK_TOKEN);
> +OPAL_CALL(opal_check_token_call, OPAL_CHECK_TOKEN);
> OPAL_CALL(opal_dump_init, OPAL_DUMP_INIT);
> OPAL_CALL(opal_dump_info, OPAL_DUMP_INFO);
> OPAL_CALL(opal_dump_info2, OPAL_DUMP_INFO2);
> diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
> index 1946dbdc9fa1..1e9cb5271ee7 100644
> --- a/arch/powerpc/platforms/powernv/opal.c
> +++ b/arch/powerpc/platforms/powernv/opal.c
> @@ -1125,6 +1125,36 @@ EXPORT_SYMBOL_GPL(opal_flash_read);
> EXPORT_SYMBOL_GPL(opal_flash_write);
> EXPORT_SYMBOL_GPL(opal_flash_erase);
> EXPORT_SYMBOL_GPL(opal_prd_msg);
> +
> +/**
> + * opal_check_token - Check if an OPAL call token is supported
> + * @token: OPAL token number to check
> + *
> + * Returns 1 if supported, 0 if not.
> + */
> +int64_t opal_check_token(uint64_t token)
> +{
> + static u8 token_cache[OPAL_LAST];
> + enum {
> + SUPP_UNKNOWN = 0,
> + PRESENT,
> + ABSENT
> + };
> +
> + if (token > OPAL_LAST)
> + return 0;
> +
> + if (token_cache[token] == SUPP_UNKNOWN) {
> + /* Do the actual opal_call here */
> + if (opal_check_token_call(token)) {
> + token_cache[token] = PRESENT;
> + } else {
> + token_cache[token] = ABSENT;
> + }
> + }
> +
> + return (token_cache[token] == PRESENT);
> +}
> EXPORT_SYMBOL_GPL(opal_check_token);
>
> /* Convert a region of vmalloc memory to an opal sg list */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] powerpc/powernv: Cache OPAL check_token() results
2026-06-26 12:35 [PATCH v2] powerpc/powernv: Cache OPAL check_token() results Shivang Upadhyay
2026-06-30 13:50 ` Sourabh Jain
@ 2026-09-22 5:36 ` Aditya Gupta
2026-09-23 6:13 ` Shivang Upadhyay
1 sibling, 1 reply; 5+ messages in thread
From: Aditya Gupta @ 2026-09-22 5:36 UTC (permalink / raw)
To: Shivang Upadhyay
Cc: chleroy, linux-kernel, linuxppc-dev, maddy, mahesh, mpe, npiggin,
sourabhjain, thuth
On 26/06/26 06:05PM, Shivang Upadhyay wrote:
> `opal_check_token()` function is used to determine if a specific
> OPAL firmware call is supported on the current platform. This check
> is performed frequently during boot and runtime, resulting in
> unnecessary firmware calls for the same token values.
>
> Add a caching layer for the opal_check_token() OPAL call to avoid
> repeated firmware calls for token availability checks. This reduces
> firmware call overhead during boot.
>
> Testing with buildroot images shows OPAL calls reduced from
> 35578 to 28983, before console bring-up.
nice optimisation !
>
> <...snip...>
> int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val);
> diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c
> index 021b0ec29e24..00325c189e69 100644
> --- a/arch/powerpc/platforms/powernv/opal-call.c
> +++ b/arch/powerpc/platforms/powernv/opal-call.c
> @@ -207,7 +207,7 @@ OPAL_CALL(opal_validate_flash, OPAL_FLASH_VALIDATE);
> OPAL_CALL(opal_manage_flash, OPAL_FLASH_MANAGE);
> OPAL_CALL(opal_update_flash, OPAL_FLASH_UPDATE);
> OPAL_CALL(opal_resync_timebase, OPAL_RESYNC_TIMEBASE);
> -OPAL_CALL(opal_check_token, OPAL_CHECK_TOKEN);
> +OPAL_CALL(opal_check_token_call, OPAL_CHECK_TOKEN);
> OPAL_CALL(opal_dump_init, OPAL_DUMP_INIT);
> OPAL_CALL(opal_dump_info, OPAL_DUMP_INFO);
> OPAL_CALL(opal_dump_info2, OPAL_DUMP_INFO2);
> diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
> index 1946dbdc9fa1..1e9cb5271ee7 100644
> --- a/arch/powerpc/platforms/powernv/opal.c
> +++ b/arch/powerpc/platforms/powernv/opal.c
> @@ -1125,6 +1125,36 @@ EXPORT_SYMBOL_GPL(opal_flash_read);
> EXPORT_SYMBOL_GPL(opal_flash_write);
> EXPORT_SYMBOL_GPL(opal_flash_erase);
> EXPORT_SYMBOL_GPL(opal_prd_msg);
> +
> +/**
> + * opal_check_token - Check if an OPAL call token is supported
> + * @token: OPAL token number to check
> + *
> + * Returns 1 if supported, 0 if not.
> + */
> +int64_t opal_check_token(uint64_t token)
> +{
> + static u8 token_cache[OPAL_LAST];
not a suggestion to change anything, just an observation:
based on this in skiboot:
```
void __opal_register(uint64_t token, void *func, unsigned int nargs)
{
assert(token <= OPAL_LAST);
...
static int64_t opal_check_token(uint64_t token)
{
if (token > OPAL_LAST)
return OPAL_TOKEN_ABSENT;
```
along with other usages of OPAL_LAST in skiboot, OPAL_LAST is being
treated as a valid token.
there are no handlers for OPAL_LAST and kernel doesn't do
opal_check_token for this
I feel the logic should better be fixed in opal to not consider
OPAL_LAST
at the same time it maybe safer to have length as OPAL_LAST+1 here,
though it is not necessary, so the patch looks good to me
Reviewed-by: Aditya Gupta <adityag@linux.ibm.com>
Thanks,
- Aditya G
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] powerpc/powernv: Cache OPAL check_token() results
2026-09-22 5:36 ` Aditya Gupta
@ 2026-09-23 6:13 ` Shivang Upadhyay
2026-09-23 6:14 ` Aditya Gupta
0 siblings, 1 reply; 5+ messages in thread
From: Shivang Upadhyay @ 2026-09-23 6:13 UTC (permalink / raw)
To: Aditya Gupta
Cc: chleroy, linux-kernel, linuxppc-dev, maddy, mahesh, mpe, npiggin,
sourabhjain, thuth
Hi Aditya,
Thanks for the review.
On Tue, 2026-09-22 at 11:06 +0530, Aditya Gupta wrote:
> not a suggestion to change anything, just an observation:
>
> based on this in skiboot:
> ```
> void __opal_register(uint64_t token, void *func, unsigned int nargs)
> {
> assert(token <= OPAL_LAST);
> ...
>
> static int64_t opal_check_token(uint64_t token)
> {
> if (token > OPAL_LAST)
> return OPAL_TOKEN_ABSENT;
> ```
>
> along with other usages of OPAL_LAST in skiboot, OPAL_LAST is being
> treated as a valid token.
>
> there are no handlers for OPAL_LAST and kernel doesn't do
> opal_check_token for this
>
> I feel the logic should better be fixed in opal to not consider
> OPAL_LAST
>
As per my current understanding, I assume OPAL_LAST is meant to be the
length of all valid opal tokens, Not a valid call itself.
> at the same time it maybe safer to have length as OPAL_LAST+1 here,
> though it is not necessary, so the patch looks good to me
>
> Reviewed-by: Aditya Gupta <adityag@linux.ibm.com>
>
Thanks.
~Shivang.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] powerpc/powernv: Cache OPAL check_token() results
2026-09-23 6:13 ` Shivang Upadhyay
@ 2026-09-23 6:14 ` Aditya Gupta
0 siblings, 0 replies; 5+ messages in thread
From: Aditya Gupta @ 2026-09-23 6:14 UTC (permalink / raw)
To: Shivang Upadhyay
Cc: chleroy, linux-kernel, linuxppc-dev, maddy, mahesh, mpe, npiggin,
sourabhjain, thuth
On 23/09/26 11:43, Shivang Upadhyay wrote:
> Hi Aditya,
>
> Thanks for the review.
>
> On Tue, 2026-09-22 at 11:06 +0530, Aditya Gupta wrote:
>> not a suggestion to change anything, just an observation:
>>
>> based on this in skiboot:
>> ```
>> void __opal_register(uint64_t token, void *func, unsigned int nargs)
>> {
>> assert(token <= OPAL_LAST);
>> ...
>>
>> static int64_t opal_check_token(uint64_t token)
>> {
>> if (token > OPAL_LAST)
>> return OPAL_TOKEN_ABSENT;
>> ```
>>
>> along with other usages of OPAL_LAST in skiboot, OPAL_LAST is being
>> treated as a valid token.
>>
>> there are no handlers for OPAL_LAST and kernel doesn't do
>> opal_check_token for this
>>
>> I feel the logic should better be fixed in opal to not consider
>> OPAL_LAST
>>
> As per my current understanding, I assume OPAL_LAST is meant to be the
> length of all valid opal tokens, Not a valid call itself.
I agree, hence the current implementation looks good to me.
Thanks,
- Aditya G
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-23 6:15 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-26 12:35 [PATCH v2] powerpc/powernv: Cache OPAL check_token() results Shivang Upadhyay
2026-06-30 13:50 ` Sourabh Jain
2026-09-22 5:36 ` Aditya Gupta
2026-09-23 6:13 ` Shivang Upadhyay
2026-09-23 6:14 ` Aditya Gupta
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®