Commit 69020eea authored by Aruna Balakrishnaiah's avatar Aruna Balakrishnaiah Committed by Benjamin Herrenschmidt

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: default avatarAruna Balakrishnaiah <aruna@linux.vnet.ibm.com>
Reviewed-by: default avatarJim Keniston <jkenisto@us.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent d7563c94
...@@ -131,9 +131,11 @@ static struct z_stream_s stream; ...@@ -131,9 +131,11 @@ static struct z_stream_s stream;
#ifdef CONFIG_PSTORE #ifdef CONFIG_PSTORE
static enum pstore_type_id nvram_type_ids[] = { static enum pstore_type_id nvram_type_ids[] = {
PSTORE_TYPE_DMESG, PSTORE_TYPE_DMESG,
PSTORE_TYPE_PPC_RTAS,
-1 -1
}; };
static int read_type; static int read_type;
static unsigned long last_rtas_event;
#endif #endif
static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index) 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, ...@@ -297,8 +299,13 @@ int nvram_write_error_log(char * buff, int length,
{ {
int rc = nvram_write_os_partition(&rtas_log_partition, buff, length, int rc = nvram_write_os_partition(&rtas_log_partition, buff, length,
err_type, error_log_cnt); err_type, error_log_cnt);
if (!rc) if (!rc) {
last_unread_rtas_event = get_seconds(); last_unread_rtas_event = get_seconds();
#ifdef CONFIG_PSTORE
last_rtas_event = get_seconds();
#endif
}
return rc; return rc;
} }
...@@ -506,7 +513,7 @@ static int nvram_pstore_write(enum pstore_type_id type, ...@@ -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 the length of the data we read from each partition.
* Returns 0 if we've been called before. * 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, ...@@ -526,6 +533,12 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
part = &oops_log_partition; part = &oops_log_partition;
*type = PSTORE_TYPE_DMESG; *type = PSTORE_TYPE_DMESG;
break; 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: default:
return 0; return 0;
} }
...@@ -542,11 +555,17 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, ...@@ -542,11 +555,17 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
*count = 0; *count = 0;
*id = id_no; *id = id_no;
if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
oops_hdr = (struct oops_log_info *)buff; oops_hdr = (struct oops_log_info *)buff;
*buf = buff + sizeof(*oops_hdr); *buf = buff + sizeof(*oops_hdr);
time->tv_sec = oops_hdr->timestamp; time->tv_sec = oops_hdr->timestamp;
time->tv_nsec = 0; time->tv_nsec = 0;
return oops_hdr->report_length; return oops_hdr->report_length;
}
*buf = buff;
return part->size;
} }
static struct pstore_info nvram_pstore_info = { 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, ...@@ -324,6 +324,9 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count,
case PSTORE_TYPE_MCE: case PSTORE_TYPE_MCE:
sprintf(name, "mce-%s-%lld", psname, id); sprintf(name, "mce-%s-%lld", psname, id);
break; break;
case PSTORE_TYPE_PPC_RTAS:
sprintf(name, "rtas-%s-%lld", psname, id);
break;
case PSTORE_TYPE_UNKNOWN: case PSTORE_TYPE_UNKNOWN:
sprintf(name, "unknown-%s-%lld", psname, id); sprintf(name, "unknown-%s-%lld", psname, id);
break; break;
......
...@@ -35,6 +35,8 @@ enum pstore_type_id { ...@@ -35,6 +35,8 @@ enum pstore_type_id {
PSTORE_TYPE_MCE = 1, PSTORE_TYPE_MCE = 1,
PSTORE_TYPE_CONSOLE = 2, PSTORE_TYPE_CONSOLE = 2,
PSTORE_TYPE_FTRACE = 3, PSTORE_TYPE_FTRACE = 3,
/* PPC64 partition types */
PSTORE_TYPE_PPC_RTAS = 4,
PSTORE_TYPE_UNKNOWN = 255 PSTORE_TYPE_UNKNOWN = 255
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment