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: 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:
Родитель
edf38465a3
Коммит
f33f748c96
|
@ -132,9 +132,16 @@ static size_t oops_data_sz;
|
|||
static struct z_stream_s stream;
|
||||
|
||||
#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[] = {
|
||||
PSTORE_TYPE_DMESG,
|
||||
PSTORE_TYPE_PPC_RTAS,
|
||||
PSTORE_TYPE_PPC_OF,
|
||||
-1
|
||||
};
|
||||
static int read_type;
|
||||
|
@ -332,11 +339,16 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff,
|
|||
|
||||
tmp_index = part->index;
|
||||
|
||||
rc = ppc_md.nvram_read((char *)&info, sizeof(struct err_log_info), &tmp_index);
|
||||
if (part->os_partition) {
|
||||
rc = ppc_md.nvram_read((char *)&info,
|
||||
sizeof(struct err_log_info),
|
||||
&tmp_index);
|
||||
if (rc <= 0) {
|
||||
pr_err("%s: Failed nvram_read (%d)\n", __FUNCTION__, rc);
|
||||
pr_err("%s: Failed nvram_read (%d)\n", __FUNCTION__,
|
||||
rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
rc = ppc_md.nvram_read(buff, length, &tmp_index);
|
||||
if (rc <= 0) {
|
||||
|
@ -344,8 +356,10 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff,
|
|||
return rc;
|
||||
}
|
||||
|
||||
if (part->os_partition) {
|
||||
*error_log_cnt = info.seq_num;
|
||||
*err_type = info.error_type;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -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 0 if we've been called before.
|
||||
*/
|
||||
|
@ -525,9 +539,11 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
|||
struct pstore_info *psi)
|
||||
{
|
||||
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;
|
||||
char *buff = NULL;
|
||||
int sig = 0;
|
||||
loff_t p;
|
||||
|
||||
read_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_nsec = 0;
|
||||
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:
|
||||
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);
|
||||
|
||||
if (!buff)
|
||||
|
@ -557,6 +592,8 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
|||
}
|
||||
|
||||
*count = 0;
|
||||
|
||||
if (part->os_partition)
|
||||
*id = id_no;
|
||||
|
||||
if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
|
||||
|
|
|
@ -327,6 +327,9 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count,
|
|||
case PSTORE_TYPE_PPC_RTAS:
|
||||
sprintf(name, "rtas-%s-%lld", psname, id);
|
||||
break;
|
||||
case PSTORE_TYPE_PPC_OF:
|
||||
sprintf(name, "powerpc-ofw-%s-%lld", psname, id);
|
||||
break;
|
||||
case PSTORE_TYPE_UNKNOWN:
|
||||
sprintf(name, "unknown-%s-%lld", psname, id);
|
||||
break;
|
||||
|
|
|
@ -37,6 +37,7 @@ enum pstore_type_id {
|
|||
PSTORE_TYPE_FTRACE = 3,
|
||||
/* PPC64 partition types */
|
||||
PSTORE_TYPE_PPC_RTAS = 4,
|
||||
PSTORE_TYPE_PPC_OF = 5,
|
||||
PSTORE_TYPE_UNKNOWN = 255
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче