Commit f33f748c authored by Aruna Balakrishnaiah's avatar Aruna Balakrishnaiah Committed by Benjamin Herrenschmidt

powerpc/pseries: Read of-config partition via pstore

This patch set exploits the pstore subsystem to read details of
of-config partition in NVRAM to a separate file in /dev/pstore.
For instance, of-config partition details will be stored in a
file named [of-nvram-5].
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 edf38465
...@@ -132,9 +132,16 @@ static size_t oops_data_sz; ...@@ -132,9 +132,16 @@ static size_t oops_data_sz;
static struct z_stream_s stream; static struct z_stream_s stream;
#ifdef CONFIG_PSTORE #ifdef CONFIG_PSTORE
static struct nvram_os_partition of_config_partition = {
.name = "of-config",
.index = -1,
.os_partition = false
};
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, PSTORE_TYPE_PPC_RTAS,
PSTORE_TYPE_PPC_OF,
-1 -1
}; };
static int read_type; static int read_type;
...@@ -332,10 +339,15 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff, ...@@ -332,10 +339,15 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff,
tmp_index = part->index; tmp_index = part->index;
rc = ppc_md.nvram_read((char *)&info, sizeof(struct err_log_info), &tmp_index); if (part->os_partition) {
if (rc <= 0) { rc = ppc_md.nvram_read((char *)&info,
pr_err("%s: Failed nvram_read (%d)\n", __FUNCTION__, rc); sizeof(struct err_log_info),
return rc; &tmp_index);
if (rc <= 0) {
pr_err("%s: Failed nvram_read (%d)\n", __FUNCTION__,
rc);
return rc;
}
} }
rc = ppc_md.nvram_read(buff, length, &tmp_index); rc = ppc_md.nvram_read(buff, length, &tmp_index);
...@@ -344,8 +356,10 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff, ...@@ -344,8 +356,10 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff,
return rc; return rc;
} }
*error_log_cnt = info.seq_num; if (part->os_partition) {
*err_type = info.error_type; *error_log_cnt = info.seq_num;
*err_type = info.error_type;
}
return 0; return 0;
} }
...@@ -516,7 +530,7 @@ static int nvram_pstore_write(enum pstore_type_id type, ...@@ -516,7 +530,7 @@ static int nvram_pstore_write(enum pstore_type_id type,
} }
/* /*
* Reads the oops/panic report and ibm,rtas-log partition. * Reads the oops/panic report, rtas and of-config 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.
*/ */
...@@ -525,9 +539,11 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, ...@@ -525,9 +539,11 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
struct pstore_info *psi) struct pstore_info *psi)
{ {
struct oops_log_info *oops_hdr; struct oops_log_info *oops_hdr;
unsigned int err_type, id_no; unsigned int err_type, id_no, size = 0;
struct nvram_os_partition *part = NULL; struct nvram_os_partition *part = NULL;
char *buff = NULL; char *buff = NULL;
int sig = 0;
loff_t p;
read_type++; read_type++;
...@@ -542,10 +558,29 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, ...@@ -542,10 +558,29 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
time->tv_sec = last_rtas_event; time->tv_sec = last_rtas_event;
time->tv_nsec = 0; time->tv_nsec = 0;
break; break;
case PSTORE_TYPE_PPC_OF:
sig = NVRAM_SIG_OF;
part = &of_config_partition;
*type = PSTORE_TYPE_PPC_OF;
*id = PSTORE_TYPE_PPC_OF;
time->tv_sec = 0;
time->tv_nsec = 0;
break;
default: default:
return 0; return 0;
} }
if (!part->os_partition) {
p = nvram_find_partition(part->name, sig, &size);
if (p <= 0) {
pr_err("nvram: Failed to find partition %s, "
"err %d\n", part->name, (int)p);
return 0;
}
part->index = p;
part->size = size;
}
buff = kmalloc(part->size, GFP_KERNEL); buff = kmalloc(part->size, GFP_KERNEL);
if (!buff) if (!buff)
...@@ -557,7 +592,9 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, ...@@ -557,7 +592,9 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
} }
*count = 0; *count = 0;
*id = id_no;
if (part->os_partition)
*id = id_no;
if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) { if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
oops_hdr = (struct oops_log_info *)buff; oops_hdr = (struct oops_log_info *)buff;
......
...@@ -327,6 +327,9 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count, ...@@ -327,6 +327,9 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count,
case PSTORE_TYPE_PPC_RTAS: case PSTORE_TYPE_PPC_RTAS:
sprintf(name, "rtas-%s-%lld", psname, id); sprintf(name, "rtas-%s-%lld", psname, id);
break; break;
case PSTORE_TYPE_PPC_OF:
sprintf(name, "powerpc-ofw-%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;
......
...@@ -37,6 +37,7 @@ enum pstore_type_id { ...@@ -37,6 +37,7 @@ enum pstore_type_id {
PSTORE_TYPE_FTRACE = 3, PSTORE_TYPE_FTRACE = 3,
/* PPC64 partition types */ /* PPC64 partition types */
PSTORE_TYPE_PPC_RTAS = 4, PSTORE_TYPE_PPC_RTAS = 4,
PSTORE_TYPE_PPC_OF = 5,
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