diff mbox

[v3,5/8] powerpc/pseries: Read rtas partition via pstore

Message ID 20130425101851.21017.90041.stgit@aruna-ThinkPad-T420 (mailing list archive)
State Accepted, archived
Commit 69020eea973d95766e905ee0ce7773e0027377a3
Delegated to: Benjamin Herrenschmidt
Headers show

Commit Message

Aruna Balakrishnaiah April 25, 2013, 10:18 a.m. UTC
This patch set exploits the pstore subsystem to read details of rtas partition
in NVRAM to a separate file in /dev/pstore. For instance, rtas details will be
stored in a file named [rtas-nvram-4].

Signed-off-by: Aruna Balakrishnaiah <aruna@linux.vnet.ibm.com>
Reviewed-by: Jim Keniston <jkenisto@us.ibm.com>
---
 arch/powerpc/platforms/pseries/nvram.c |   33 +++++++++++++++++++++++++-------
 fs/pstore/inode.c                      |    3 +++
 include/linux/pstore.h                 |    2 ++
 3 files changed, 31 insertions(+), 7 deletions(-)

Comments

Benjamin Herrenschmidt June 1, 2013, 4:49 a.m. UTC | #1
On Thu, 2013-04-25 at 15:48 +0530, Aruna Balakrishnaiah wrote:
> This patch set exploits the pstore subsystem to read details of rtas partition
> in NVRAM to a separate file in /dev/pstore. For instance, rtas details will be
> stored in a file named [rtas-nvram-4].
> 
 .../...

> diff --git a/include/linux/pstore.h b/include/linux/pstore.h
> index 75d0176..d7a8fe9 100644
> --- a/include/linux/pstore.h
> +++ b/include/linux/pstore.h
> @@ -35,6 +35,8 @@ enum pstore_type_id {
>  	PSTORE_TYPE_MCE		= 1,
>  	PSTORE_TYPE_CONSOLE	= 2,
>  	PSTORE_TYPE_FTRACE	= 3,
> +	/* PPC64 partition types */
> +	PSTORE_TYPE_PPC_RTAS	= 4,
>  	PSTORE_TYPE_UNKNOWN	= 255
>  };
>  

Not sure about that list...

What do you mean by "RTAS" ? The error logs ? What about our "common"
partition (firmware settings ?). We should probably at least define
a generic PSTORE_TYPE_FIRMWARE for firmware private stuff...

Cheers,
Ben.
Benjamin Herrenschmidt June 1, 2013, 4:50 a.m. UTC | #2
On Sat, 2013-06-01 at 14:49 +1000, Benjamin Herrenschmidt wrote:
> On Thu, 2013-04-25 at 15:48 +0530, Aruna Balakrishnaiah wrote:
> > This patch set exploits the pstore subsystem to read details of rtas partition
> > in NVRAM to a separate file in /dev/pstore. For instance, rtas details will be
> > stored in a file named [rtas-nvram-4].
> > 
>  .../...
> 
> > diff --git a/include/linux/pstore.h b/include/linux/pstore.h
> > index 75d0176..d7a8fe9 100644
> > --- a/include/linux/pstore.h
> > +++ b/include/linux/pstore.h
> > @@ -35,6 +35,8 @@ enum pstore_type_id {
> >  	PSTORE_TYPE_MCE		= 1,
> >  	PSTORE_TYPE_CONSOLE	= 2,
> >  	PSTORE_TYPE_FTRACE	= 3,
> > +	/* PPC64 partition types */
> > +	PSTORE_TYPE_PPC_RTAS	= 4,
> >  	PSTORE_TYPE_UNKNOWN	= 255
> >  };
> >  
> 
> Not sure about that list...
> 
> What do you mean by "RTAS" ? The error logs ? What about our "common"
> partition (firmware settings ?). We should probably at least define
> a generic PSTORE_TYPE_FIRMWARE for firmware private stuff...

Scrap it, I just noticed your next patch doing that,... see comment
there.

Cheers,
Ben.
diff mbox

Patch

diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c
index 9edec8e..78d72f0 100644
--- a/arch/powerpc/platforms/pseries/nvram.c
+++ b/arch/powerpc/platforms/pseries/nvram.c
@@ -131,9 +131,11 @@  static struct z_stream_s stream;
 #ifdef CONFIG_PSTORE
 static enum pstore_type_id nvram_type_ids[] = {
 	PSTORE_TYPE_DMESG,
+	PSTORE_TYPE_PPC_RTAS,
 	-1
 };
 static int read_type;
+static unsigned long last_rtas_event;
 #endif
 
 static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index)
@@ -297,8 +299,13 @@  int nvram_write_error_log(char * buff, int length,
 {
 	int rc = nvram_write_os_partition(&rtas_log_partition, buff, length,
 						err_type, error_log_cnt);
-	if (!rc)
+	if (!rc) {
 		last_unread_rtas_event = get_seconds();
+#ifdef CONFIG_PSTORE
+		last_rtas_event = get_seconds();
+#endif
+	}
+
 	return rc;
 }
 
@@ -506,7 +513,7 @@  static int nvram_pstore_write(enum pstore_type_id type,
 }
 
 /*
- * Reads the oops/panic report.
+ * Reads the oops/panic report and ibm,rtas-log partition.
  * Returns the length of the data we read from each partition.
  * Returns 0 if we've been called before.
  */
@@ -526,6 +533,12 @@  static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
 		part = &oops_log_partition;
 		*type = PSTORE_TYPE_DMESG;
 		break;
+	case PSTORE_TYPE_PPC_RTAS:
+		part = &rtas_log_partition;
+		*type = PSTORE_TYPE_PPC_RTAS;
+		time->tv_sec = last_rtas_event;
+		time->tv_nsec = 0;
+		break;
 	default:
 		return 0;
 	}
@@ -542,11 +555,17 @@  static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
 
 	*count = 0;
 	*id = id_no;
-	oops_hdr = (struct oops_log_info *)buff;
-	*buf = buff + sizeof(*oops_hdr);
-	time->tv_sec = oops_hdr->timestamp;
-	time->tv_nsec = 0;
-	return oops_hdr->report_length;
+
+	if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
+		oops_hdr = (struct oops_log_info *)buff;
+		*buf = buff + sizeof(*oops_hdr);
+		time->tv_sec = oops_hdr->timestamp;
+		time->tv_nsec = 0;
+		return oops_hdr->report_length;
+	}
+
+	*buf = buff;
+	return part->size;
 }
 
 static struct pstore_info nvram_pstore_info = {
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index e4bcb2c..ec24f9c 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -324,6 +324,9 @@  int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count,
 	case PSTORE_TYPE_MCE:
 		sprintf(name, "mce-%s-%lld", psname, id);
 		break;
+	case PSTORE_TYPE_PPC_RTAS:
+		sprintf(name, "rtas-%s-%lld", psname, id);
+		break;
 	case PSTORE_TYPE_UNKNOWN:
 		sprintf(name, "unknown-%s-%lld", psname, id);
 		break;
diff --git a/include/linux/pstore.h b/include/linux/pstore.h
index 75d0176..d7a8fe9 100644
--- a/include/linux/pstore.h
+++ b/include/linux/pstore.h
@@ -35,6 +35,8 @@  enum pstore_type_id {
 	PSTORE_TYPE_MCE		= 1,
 	PSTORE_TYPE_CONSOLE	= 2,
 	PSTORE_TYPE_FTRACE	= 3,
+	/* PPC64 partition types */
+	PSTORE_TYPE_PPC_RTAS	= 4,
 	PSTORE_TYPE_UNKNOWN	= 255
 };