Message ID | 20130425101851.21017.90041.stgit@aruna-ThinkPad-T420 (mailing list archive) |
---|---|
State | Accepted, archived |
Commit | 69020eea973d95766e905ee0ce7773e0027377a3 |
Delegated to: | Benjamin Herrenschmidt |
Headers | show |
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.
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 --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 };