Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -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,6 +555,8 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,

	*count = 0;
	*id = id_no;

	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;
@@ -549,6 +564,10 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
		return oops_hdr->report_length;
	}

	*buf = buff;
	return part->size;
}

static struct pstore_info nvram_pstore_info = {
	.owner = THIS_MODULE,
	.name = "nvram",
+3 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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
};