[PATCH 1/4] powerpc/powernv: Add OPAL check token call

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE4323d

9 messages, 4 authors, 2014-10-07 · open the first message on its own page

[PATCH 1/4] powerpc/powernv: Add OPAL check token call

From: Michael Neuling <hidden>
Date: 2014-08-19 04:48:04

Currently there is no way to generically check if an OPAL call exists or not
from the host kernel.

This adds an OPAL call opal_check_token() which tells you if the given token is
present in OPAL or not.

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/include/asm/opal.h                | 7 +++++++
 arch/powerpc/platforms/powernv/opal-wrappers.S | 1 +
 2 files changed, 8 insertions(+)
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index 86055e5..4593a93 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -135,6 +135,7 @@ struct opal_sg_list {
 #define OPAL_FLASH_MANAGE			77
 #define OPAL_FLASH_UPDATE			78
 #define OPAL_RESYNC_TIMEBASE			79
+#define OPAL_CHECK_TOKEN			80
 #define OPAL_DUMP_INIT				81
 #define OPAL_DUMP_INFO				82
 #define OPAL_DUMP_READ				83
@@ -417,6 +418,11 @@ struct opal_msg {
 	__be64 params[8];
 };
 
+enum OpalCheckTokenStatus {
+       OPAL_TOKEN_ABSENT = 0,
+       OPAL_TOKEN_PRESENT = 1
+};
+
 struct opal_machine_check_event {
 	enum OpalMCE_Version	version:8;	/* 0x00 */
 	uint8_t			in_use;		/* 0x01 */
@@ -887,6 +893,7 @@ int64_t opal_pci_next_error(uint64_t phb_id, __be64 *first_frozen_pe,
 			    __be16 *pci_error_type, __be16 *severity);
 int64_t opal_pci_poll(uint64_t phb_id);
 int64_t opal_return_cpu(void);
+int64_t opal_check_token(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-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S
index 2e6ce1b..5718855 100644
--- a/arch/powerpc/platforms/powernv/opal-wrappers.S
+++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
@@ -232,6 +232,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_dump_init,			OPAL_DUMP_INIT);
 OPAL_CALL(opal_dump_info,			OPAL_DUMP_INFO);
 OPAL_CALL(opal_dump_info2,			OPAL_DUMP_INFO2);
-- 
1.9.1

[PATCH 2/4] powerpc/powernv: Check OPAL RTC calls exists before using

From: Michael Neuling <hidden>
Date: 2014-08-19 04:48:05

Check that the OPAL_RTC_READ token exists before we use the OPAL RTC.

Refactors the code a little to merge error paths.

This avoids littering the OPAL console with:
  "OPAL: Called with bad token 3".

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/platforms/powernv/opal-rtc.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/arch/powerpc/platforms/powernv/opal-rtc.c b/arch/powerpc/platforms/powernv/opal-rtc.c
index b1885db..499707d 100644
--- a/arch/powerpc/platforms/powernv/opal-rtc.c
+++ b/arch/powerpc/platforms/powernv/opal-rtc.c
@@ -42,6 +42,9 @@ unsigned long __init opal_get_boot_time(void)
 	__be64 __h_m_s_ms;
 	long rc = OPAL_BUSY;
 
+	if (!opal_check_token(OPAL_RTC_READ))
+		goto out;
+
 	while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {
 		rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms);
 		if (rc == OPAL_BUSY_EVENT)
@@ -49,16 +52,18 @@ unsigned long __init opal_get_boot_time(void)
 		else
 			mdelay(10);
 	}
-	if (rc != OPAL_SUCCESS) {
-		ppc_md.get_rtc_time = NULL;
-		ppc_md.set_rtc_time = NULL;
-		return 0;
-	}
+	if (rc != OPAL_SUCCESS)
+		goto out;
+
 	y_m_d = be32_to_cpu(__y_m_d);
 	h_m_s_ms = be64_to_cpu(__h_m_s_ms);
 	opal_to_tm(y_m_d, h_m_s_ms, &tm);
 	return mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
 		      tm.tm_hour, tm.tm_min, tm.tm_sec);
+out:
+	ppc_md.get_rtc_time = NULL;
+	ppc_md.set_rtc_time = NULL;
+	return 0;
 }
 
 void opal_get_rtc_time(struct rtc_time *tm)
-- 
1.9.1

[PATCH 3/4] powerpc/powernv: Check OPAL elog calls exist before using

From: Michael Neuling <hidden>
Date: 2014-08-19 04:48:06

Check that the OPAL_ELOG_READ token exists before initalising the elog
infrastructure.

This avoids littering the OPAL console with:
  "OPAL: Called with bad token 74"

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/platforms/powernv/opal-elog.c | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c
index bbdb3ff..518fe95 100644
--- a/arch/powerpc/platforms/powernv/opal-elog.c
+++ b/arch/powerpc/platforms/powernv/opal-elog.c
@@ -295,6 +295,10 @@ int __init opal_elog_init(void)
 {
 	int rc = 0;
 
+	/* ELOG not supported by firmware */
+	if (!opal_check_token(OPAL_ELOG_READ))
+		return -1;
+
 	elog_kset = kset_create_and_add("elog", NULL, opal_kobj);
 	if (!elog_kset) {
 		pr_warn("%s: failed to create elog kset\n", __func__);
-- 
1.9.1

[PATCH 4/4] powerpc/powernv: Check OPAL dump calls exist before using

From: Michael Neuling <hidden>
Date: 2014-08-19 04:48:07

Check that the OPAL_DUMP_READ token exists before initalising the elog
infrastructure.

This avoids littering the OPAL console with:
  "OPAL: Called with bad token 91"

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/platforms/powernv/opal-dump.c | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/opal-dump.c b/arch/powerpc/platforms/powernv/opal-dump.c
index 85bb8ff..c7577f9 100644
--- a/arch/powerpc/platforms/powernv/opal-dump.c
+++ b/arch/powerpc/platforms/powernv/opal-dump.c
@@ -423,6 +423,10 @@ void __init opal_platform_dump_init(void)
 {
 	int rc;
 
+	/* ELOG not supported by firmware */
+	if (!opal_check_token(OPAL_DUMP_READ))
+		return;
+
 	dump_kset = kset_create_and_add("dump", NULL, opal_kobj);
 	if (!dump_kset) {
 		pr_warn("%s: Failed to create dump kset\n", __func__);
-- 
1.9.1

Re: [PATCH 1/4] powerpc/powernv: Add OPAL check token call

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2014-09-15 03:10:24

On Tue, 2014-08-19 at 14:47 +1000, Michael Neuling wrote:
quoted hunk
Currently there is no way to generically check if an OPAL call exists or not
from the host kernel.

This adds an OPAL call opal_check_token() which tells you if the given token is
present in OPAL or not.

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/include/asm/opal.h                | 7 +++++++
 arch/powerpc/platforms/powernv/opal-wrappers.S | 1 +
 2 files changed, 8 insertions(+)
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index 86055e5..4593a93 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -135,6 +135,7 @@ struct opal_sg_list {
 #define OPAL_FLASH_MANAGE			77
 #define OPAL_FLASH_UPDATE			78
 #define OPAL_RESYNC_TIMEBASE			79
+#define OPAL_CHECK_TOKEN			80
 #define OPAL_DUMP_INIT				81
 #define OPAL_DUMP_INFO				82
 #define OPAL_DUMP_READ				83
@@ -417,6 +418,11 @@ struct opal_msg {
 	__be64 params[8];
 };
 
+enum OpalCheckTokenStatus {
+       OPAL_TOKEN_ABSENT = 0,
+       OPAL_TOKEN_PRESENT = 1
+};
I don't see this used anywhere?

And NoCamelCase !

Yes I know there's lots in that file, but I didn't merge that :)

cheers

Re: [PATCH 3/4] powerpc/powernv: Check OPAL elog calls exist before using

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2014-09-15 03:13:22

On Tue, 2014-08-19 at 14:48 +1000, Michael Neuling wrote:
quoted hunk
Check that the OPAL_ELOG_READ token exists before initalising the elog
infrastructure.

This avoids littering the OPAL console with:
  "OPAL: Called with bad token 74"

Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/platforms/powernv/opal-elog.c | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c
index bbdb3ff..518fe95 100644
--- a/arch/powerpc/platforms/powernv/opal-elog.c
+++ b/arch/powerpc/platforms/powernv/opal-elog.c
@@ -295,6 +295,10 @@ int __init opal_elog_init(void)
 {
 	int rc = 0;
 
+	/* ELOG not supported by firmware */
+	if (!opal_check_token(OPAL_ELOG_READ))
+		return -1;
+
The only caller does:

			/* Setup error log interface */
			rc = opal_elog_init();
			/* Setup code update interface */
			opal_flash_init();
			/* Setup platform dump extract interface */
			opal_platform_dump_init();
			/* Setup system parameters interface */
			opal_sys_param_init();
			/* Setup message log interface. */
			opal_msglog_init();
		}
	
		return 0;
	}


So we may as well have it return void. Wanna send a follow-up patch for that.

cheers

Re: [PATCH 1/4] powerpc/powernv: Add OPAL check token call

From: Michael Neuling <hidden>
Date: 2014-09-15 03:19:19

On Mon, 2014-09-15 at 13:10 +1000, Michael Ellerman wrote:
On Tue, 2014-08-19 at 14:47 +1000, Michael Neuling wrote:
quoted
Currently there is no way to generically check if an OPAL call exists o=
r not
quoted
from the host kernel.
=20
This adds an OPAL call opal_check_token() which tells you if the given =
token is
quoted
present in OPAL or not.
=20
Signed-off-by: Michael Neuling <redacted>
---
 arch/powerpc/include/asm/opal.h                | 7 +++++++
 arch/powerpc/platforms/powernv/opal-wrappers.S | 1 +
 2 files changed, 8 insertions(+)
=20
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm=
/opal.h
quoted
index 86055e5..4593a93 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -135,6 +135,7 @@ struct opal_sg_list {
 #define OPAL_FLASH_MANAGE			77
 #define OPAL_FLASH_UPDATE			78
 #define OPAL_RESYNC_TIMEBASE			79
+#define OPAL_CHECK_TOKEN			80
 #define OPAL_DUMP_INIT				81
 #define OPAL_DUMP_INFO				82
 #define OPAL_DUMP_READ				83
@@ -417,6 +418,11 @@ struct opal_msg {
 	__be64 params[8];
 };
=20
+enum OpalCheckTokenStatus {
+       OPAL_TOKEN_ABSENT =3D 0,
+       OPAL_TOKEN_PRESENT =3D 1
+};
=20
I don't see this used anywhere?
=20
And NoCamelCase !
We can probably just delete the enum since we are just doing this in
code anyway:

       if (!opal_check_token(OPAL_RTC_READ))
               goto out;

OK?  Or would you prefer the usage to read:

       if (opal_check_token(OPAL_RTC_READ) =3D=3D OPAL_TOKEN_ABSENT)
               goto out;

Yes I know there's lots in that file, but I didn't merge that :)
Fickle bloody maintainers.  I thought I never say this but... I want our
crazy Frenchman back! :-P

Mikey

Re: [PATCH 1/4] powerpc/powernv: Add OPAL check token call

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2014-09-15 12:25:04

On Mon, 2014-09-15 at 13:10 +1000, Michael Ellerman wrote:
quoted
+enum OpalCheckTokenStatus {
+       OPAL_TOKEN_ABSENT = 0,
+       OPAL_TOKEN_PRESENT = 1
+};
I don't see this used anywhere?

And NoCamelCase !

Yes I know there's lots in that file, but I didn't merge that :)
The original OPAL APIs were like that and I chose to not "fix" them
because I've been aiming at reconciling the Linux and the FW versions
of the file, which I haven't had a chance to do yet (Cyril & Sam have
some WIP in that area afaik).

We could de-camelify them both but I'd rather do the reunification
first.

Cheers,
Ben.

Re: [PATCH 1/4] powerpc/powernv: Add OPAL check token call

From: Stewart Smith <hidden>
Date: 2014-10-07 04:37:01

Michael Neuling [off-list ref] writes:
Currently there is no way to generically check if an OPAL call exists or not
from the host kernel.

This adds an OPAL call opal_check_token() which tells you if the given token is
present in OPAL or not.

Signed-off-by: Michael Neuling <redacted>
(checked the firmware code)

Reviewed-by: Stewart Smith <redacted>

(although should we be checking if the call returns OPAL_PARAMETER?
The opal call will return that if booting on firmware without
OPAL_CHECK_TOKEN.. which granted, is pretty old firmware that I don't
*think* we had leave the lab... or at least not to too many places)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help