powerpc/pseries: Read rtas partition via pstore
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> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
d7563c94f7
commit
69020eea97
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue