public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [IGT PATCH 0/2] intel_opregion_decode
@ 2013-10-08 18:18 Jani Nikula
  2013-10-08 18:18 ` [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion Jani Nikula
  2013-10-08 18:18 ` [IGT PATCH 2/2] intel_opregion_decode: decipher bclm table Jani Nikula
  0 siblings, 2 replies; 6+ messages in thread
From: Jani Nikula @ 2013-10-08 18:18 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Finally a tool to decode opregion a bit. This is initially just a
structural dump, no real interpretation of the values. But helps
immensely.

BR,
Jani.



Jani Nikula (2):
  intel_opregion_decode: new tool for decoding graphics opregion
  intel_opregion_decode: decipher bclm table

 tools/Makefile.am             |    1 +
 tools/intel_opregion_decode.c |  448 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 449 insertions(+)
 create mode 100644 tools/intel_opregion_decode.c

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion
  2013-10-08 18:18 [IGT PATCH 0/2] intel_opregion_decode Jani Nikula
@ 2013-10-08 18:18 ` Jani Nikula
  2013-10-17 11:41   ` Rodrigo Vivi
  2013-10-08 18:18 ` [IGT PATCH 2/2] intel_opregion_decode: decipher bclm table Jani Nikula
  1 sibling, 1 reply; 6+ messages in thread
From: Jani Nikula @ 2013-10-08 18:18 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/Makefile.am             |    1 +
 tools/intel_opregion_decode.c |  438 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 439 insertions(+)
 create mode 100644 tools/intel_opregion_decode.c

diff --git a/tools/Makefile.am b/tools/Makefile.am
index 19810cf..59fea97 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -13,6 +13,7 @@ bin_PROGRAMS = 				\
 	intel_gpu_top 			\
 	intel_gpu_time 			\
 	intel_gtt 			\
+	intel_opregion_decode		\
 	intel_perf_counters		\
 	intel_stepping 			\
 	intel_reg_checker 		\
diff --git a/tools/intel_opregion_decode.c b/tools/intel_opregion_decode.c
new file mode 100644
index 0000000..e5f79df
--- /dev/null
+++ b/tools/intel_opregion_decode.c
@@ -0,0 +1,438 @@
+/*
+ * Copyright © 2013 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Jani Nikula <jani.nikula@intel.com>
+ *
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "intel_gpu_tools.h"
+
+#define OPREGION_HEADER_OFFSET		0
+#define OPREGION_ACPI_OFFSET		0x100
+#define OPREGION_SWSCI_OFFSET		0x200
+#define OPREGION_ASLE_OFFSET		0x300
+#define OPREGION_VBT_OFFSET		0x400
+#define OPREGION_ASLE_EXT_OFFSET	0x1C00
+
+#define MBOX_ACPI	(1 << 0)
+#define MBOX_SWSCI	(1 << 1)
+#define MBOX_ASLE	(1 << 2)
+#define MBOX_VBT	(1 << 3)
+#define MBOX_ASLE_EXT	(1 << 4)
+
+struct opregion_header {
+	char sign[16];
+	uint32_t size;
+	uint32_t over;
+	char sver[32];
+	char vver[16];
+	char gver[16];
+	uint32_t mbox;
+	uint32_t dmod;
+	uint32_t pcon;
+	char dver[32];
+	uint8_t rsv1[124];
+} __attribute__((packed));
+
+/* OpRegion mailbox #1: public ACPI methods */
+struct opregion_acpi {
+	uint32_t drdy;		/* driver readiness */
+	uint32_t csts;		/* notification status */
+	uint32_t cevt;		/* current event */
+	uint8_t rsvd1[20];
+	uint32_t didl[8];	/* supported display devices ID list */
+	uint32_t cpdl[8];	/* currently presented display list */
+	uint32_t cadl[8];	/* currently active display list */
+	uint32_t nadl[8];	/* next active devices list */
+	uint32_t aslp;		/* ASL sleep time-out */
+	uint32_t tidx;		/* toggle table index */
+	uint32_t chpd;		/* current hotplug enable indicator */
+	uint32_t clid;		/* current lid state*/
+	uint32_t cdck;		/* current docking state */
+	uint32_t sxsw;		/* Sx state resume */
+	uint32_t evts;		/* ASL supported events */
+	uint32_t cnot;		/* current OS notification */
+	uint32_t nrdy;		/* driver status */
+	uint32_t did2[7];
+	uint32_t cpd2[7];
+	uint8_t rsvd2[4];
+} __attribute__((packed));
+
+/* OpRegion mailbox #2: SWSCI */
+struct opregion_swsci {
+	uint32_t scic;		/* SWSCI command|status|data */
+	uint32_t parm;		/* command parameters */
+	uint32_t dslp;		/* driver sleep time-out */
+	uint8_t rsvd[244];
+} __attribute__((packed));
+
+/* OpRegion mailbox #3: ASLE */
+struct opregion_asle {
+	uint32_t ardy;		/* driver readiness */
+	uint32_t aslc;		/* ASLE interrupt command */
+	uint32_t tche;		/* technology enabled indicator */
+	uint32_t alsi;		/* current ALS illuminance reading */
+	uint32_t bclp;		/* backlight brightness to set */
+	uint32_t pfit;		/* panel fitting state */
+	uint32_t cblv;		/* current brightness level */
+	uint16_t bclm[20];	/* backlight level duty cycle mapping table */
+	uint32_t cpfm;		/* current panel fitting mode */
+	uint32_t epfm;		/* enabled panel fitting modes */
+	uint8_t plut_header;    /* panel LUT and identifier */
+	uint8_t plut_identifier[10];	/* panel LUT and identifier */
+	uint8_t plut[63];	/* panel LUT and identifier */
+	uint32_t pfmb;		/* PWM freq and min brightness */
+	uint32_t ccdv;
+	uint32_t pcft;
+	uint32_t srot;
+	uint32_t iuer;
+	uint8_t fdss[8];
+	uint32_t fdsp;
+	uint32_t stat;
+	uint8_t rsvd[86];
+} __attribute__((packed));
+
+/* OpRegion mailbox #4: VBT */
+struct opregion_vbt {
+	char product_string[20];
+	/* rest ignored */
+} __attribute__((packed));
+
+/* OpRegion mailbox #5: ASLE extension */
+struct opregion_asle_ext {
+	uint32_t phed;
+	uint8_t bddc[256];
+} __attribute__((packed));
+
+static uint32_t decode_header(const void *buffer)
+{
+	const struct opregion_header *header = buffer;
+	char *s;
+
+	if (strncmp("IntelGraphicsMem", header->sign, sizeof(header->sign))) {
+		fprintf(stderr, "invalid opregion signature\n");
+		return 0;
+	}
+
+	printf("OpRegion Header:\n");
+
+	s = strndup(header->sign, sizeof(header->sign));
+	printf("\tsign:\t%s\n", s);
+	free(s);
+
+	printf("\tsize:\t0x%08x\n", header->size);
+	printf("\tover:\t0x%08x\n", header->over);
+
+	s = strndup(header->sver, sizeof(header->sver));
+	printf("\tsver:\t%s\n", s);
+	free(s);
+
+	s = strndup(header->vver, sizeof(header->vver));
+	printf("\tvver:\t%s\n", s);
+	free(s);
+
+	s = strndup(header->gver, sizeof(header->gver));
+	printf("\tgver:\t%s\n", s);
+	free(s);
+
+	printf("\tmbox:\t0x%08x\n", header->mbox);
+
+	printf("\tdmod:\t0x%08x\n", header->dmod);
+	printf("\tpcon:\t0x%08x\n", header->pcon);
+
+	s = strndup(header->dver, sizeof(header->dver));
+	printf("\tdver:\t%s\n", s);
+	free(s);
+
+	printf("\n");
+
+	return header->mbox;
+}
+
+static void decode_acpi(const void *buffer)
+{
+	const struct opregion_acpi *acpi = buffer;
+	int i;
+
+	printf("OpRegion Mailbox 1: Public ACPI Methods:\n");
+
+	printf("\tdrdy:\t0x%08x\n", acpi->drdy);
+	printf("\tcsts:\t0x%08x\n", acpi->csts);
+	printf("\tcevt:\t0x%08x\n", acpi->cevt);
+
+	printf("\tdidl:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->didl); i++)
+		printf("\t\tdidl[%d]:\t0x%08x\n", i, acpi->didl[i]);
+
+	printf("\tcpdl:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->cpdl); i++)
+		printf("\t\tcpdl[%d]:\t0x%08x\n", i, acpi->cpdl[i]);
+
+	printf("\tcadl:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->cadl); i++)
+		printf("\t\tcadl[%d]:\t0x%08x\n", i, acpi->cadl[i]);
+
+	printf("\tnadl:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->nadl); i++)
+		printf("\t\tnadl[%d]:\t0x%08x\n", i, acpi->nadl[i]);
+
+	printf("\taslp:\t0x%08x\n", acpi->aslp);
+	printf("\ttidx:\t0x%08x\n", acpi->tidx);
+	printf("\tchpd:\t0x%08x\n", acpi->chpd);
+	printf("\tclid:\t0x%08x\n", acpi->clid);
+	printf("\tcdck:\t0x%08x\n", acpi->cdck);
+	printf("\tsxsw:\t0x%08x\n", acpi->sxsw);
+	printf("\tevts:\t0x%08x\n", acpi->evts);
+	printf("\tcnot:\t0x%08x\n", acpi->cnot);
+	printf("\tnrdy:\t0x%08x\n", acpi->nrdy);
+
+	printf("\tdid2:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->did2); i++)
+		printf("\t\tdid2[%d]:\t0x%08x\n", i, acpi->did2[i]);
+
+	printf("\tcpd2:\n");
+	for (i = 0; i < ARRAY_SIZE(acpi->cpd2); i++)
+		printf("\t\tcpd2[%d]:\t0x%08x\n", i, acpi->cpd2[i]);
+
+	printf("\n");
+}
+
+static void decode_swsci(const void *buffer)
+{
+	const struct opregion_swsci *swsci = buffer;
+
+	printf("OpRegion Mailbox 2: Software SCI Interface (SWSCI):\n");
+
+	printf("\tscic:\t0x%08x\n", swsci->scic);
+	printf("\tparm:\t0x%08x\n", swsci->parm);
+	printf("\tdslp:\t0x%08x\n", swsci->dslp);
+
+	printf("\n");
+}
+
+static void decode_asle(const void *buffer)
+{
+	const struct opregion_asle *asle = buffer;
+	int i;
+
+	printf("OpRegion Mailbox 3: BIOS to Driver Notification (ASLE):\n");
+
+	printf("\tardy:\t0x%08x\n", asle->ardy);
+	printf("\taslc:\t0x%08x\n", asle->aslc);
+	printf("\ttche:\t0x%08x\n", asle->tche);
+	printf("\talsi:\t0x%08x\n", asle->alsi);
+	printf("\tbclp:\t0x%08x\n", asle->bclp);
+	printf("\tpfit:\t0x%08x\n", asle->pfit);
+	printf("\tcblv:\t0x%08x\n", asle->cblv);
+
+	printf("\tbclm:\n");
+	for (i = 0; i < ARRAY_SIZE(asle->bclm); i++)
+		printf("\t\tbclm[%d]:\t0x%04x\n", i, asle->bclm[i]);
+
+	printf("\tcpfm:\t0x%08x\n", asle->cpfm);
+	printf("\tepfm:\t0x%08x\n", asle->epfm);
+
+	printf("\tplut header:\t0x%02x\n", asle->plut_header);
+
+	printf("\tplut identifier:");
+	for (i = 0; i < ARRAY_SIZE(asle->plut_identifier); i++)
+		printf(" %02x", asle->plut_identifier[i]);
+	printf("\n");
+
+	printf("\tplut:\n");
+	for (i = 0; i < ARRAY_SIZE(asle->plut); i++) {
+		const int COLUMNS = 7;
+
+		if (i % COLUMNS == 0)
+			printf("\t\tplut[%d]:\t", i / COLUMNS);
+
+		printf("%02x ", asle->plut[i]);
+
+		if (i % COLUMNS == COLUMNS - 1)
+			printf("\n");
+	}
+
+	printf("\tpfmb:\t0x%08x\n", asle->pfmb);
+	printf("\tccdv:\t0x%08x\n", asle->ccdv);
+	printf("\tpcft:\t0x%08x\n", asle->pcft);
+	printf("\tsrot:\t0x%08x\n", asle->srot);
+	printf("\tiuer:\t0x%08x\n", asle->iuer);
+
+	printf("\tfdss:\t");
+	for (i = 0; i < ARRAY_SIZE(asle->fdss); i++)
+		printf("%02x ", asle->fdss[i]);
+	printf("\n");
+
+	printf("\tfdsp:\t0x%08x\n", asle->fdsp);
+	printf("\tstat:\t0x%08x\n", asle->stat);
+
+	printf("\n");
+}
+
+static void decode_vbt(const void *buffer)
+{
+	const struct opregion_vbt *vbt = buffer;
+	char *s;
+
+	printf("OpRegion Mailbox 4: Video BIOS Table (VBT):\n");
+
+	s = strndup(vbt->product_string, sizeof(vbt->product_string));
+	printf("\tproduct string:\t%s\n", s);
+	free(s);
+
+	printf("\t(use intel_bios_reader to decode the VBT)\n");
+
+	printf("\n");
+}
+
+static void decode_asle_ext(const void *buffer)
+{
+	const struct opregion_asle_ext *asle_ext = buffer;
+	int i;
+
+	printf("OpRegion Mailbox 5: BIOS to Driver Notification Extension:\n");
+
+	printf("\tphed:\t0x%08x\n", asle_ext->phed);
+
+	printf("\tbddc:\n");
+	for (i = 0; i < ARRAY_SIZE(asle_ext->bddc); i++) {
+		const int COLUMNS = 16;
+
+		if (i % COLUMNS == 0)
+			printf("\t\tbddc[0x%02x]:\t", i);
+
+		printf("%02x ", asle_ext->bddc[i]);
+
+		if (i % COLUMNS == COLUMNS - 1)
+			printf("\n");
+	}
+
+	printf("\n");
+}
+
+static void decode_opregion(const uint8_t *opregion, int size)
+{
+	uint32_t mbox;
+
+	/* XXX: allow decoding up to size */
+	if (OPREGION_ASLE_EXT_OFFSET + sizeof(struct opregion_asle_ext) > size) {
+		fprintf(stderr, "buffer too small\n");
+		return;
+	}
+
+	mbox = decode_header(opregion + OPREGION_HEADER_OFFSET);
+	if (mbox & MBOX_ACPI)
+		decode_acpi(opregion + OPREGION_ACPI_OFFSET);
+	if (mbox & MBOX_SWSCI)
+		decode_swsci(opregion + OPREGION_SWSCI_OFFSET);
+	if (mbox & MBOX_ASLE)
+		decode_asle(opregion + OPREGION_ASLE_OFFSET);
+	if (mbox & MBOX_VBT)
+		decode_vbt(opregion + OPREGION_VBT_OFFSET);
+	if (mbox & MBOX_ASLE_EXT)
+		decode_asle_ext(opregion + OPREGION_ASLE_EXT_OFFSET);
+}
+
+int main(int argc, char *argv[])
+{
+	const char *filename = "/sys/kernel/debug/dri/0/i915_opregion";
+	int fd;
+	struct stat finfo;
+	uint8_t *opregion;
+	int c, option_index = 0;
+
+	static struct option long_options[] = {
+		{ "file", required_argument, 0, 'f' },
+		{ "help", no_argument, 0, 'h' },
+		{ 0 },
+	};
+
+	while ((c = getopt_long(argc, argv, "hf:",
+				long_options, &option_index)) != -1) {
+		switch (c) {
+		case 'h':
+			printf("usage: intel_opregion_decode [-f|--file=<input>]\n");
+			return 0;
+		case 'f':
+			filename = optarg;
+			break;
+		default:
+			fprintf(stderr, "unkown command options\n");
+			return 1;
+		}
+	}
+
+	fd = open(filename, O_RDONLY);
+	if (fd == -1) {
+		printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
+		return 1;
+	}
+
+	if (stat(filename, &finfo)) {
+		printf("failed to stat \"%s\": %s\n", filename, strerror(errno));
+		return 1;
+	}
+
+	if (finfo.st_size == 0) {
+		int len = 0, ret;
+		finfo.st_size = 8192;
+		opregion = malloc(finfo.st_size);
+		while ((ret = read(fd, opregion + len, finfo.st_size - len))) {
+			if (ret < 0) {
+				printf("failed to read \"%s\": %s\n", filename,
+				       strerror(errno));
+				return 1;
+			}
+
+			len += ret;
+			if (len == finfo.st_size) {
+				finfo.st_size *= 2;
+				opregion = realloc(opregion, finfo.st_size);
+			}
+		}
+	} else {
+		opregion = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED,
+				fd, 0);
+		if (opregion == MAP_FAILED) {
+			printf("failed to map \"%s\": %s\n", filename,
+			       strerror(errno));
+			return 1;
+		}
+	}
+
+	decode_opregion(opregion, finfo.st_size);
+
+	return 0;
+}
-- 
1.7.10.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [IGT PATCH 2/2] intel_opregion_decode: decipher bclm table
  2013-10-08 18:18 [IGT PATCH 0/2] intel_opregion_decode Jani Nikula
  2013-10-08 18:18 ` [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion Jani Nikula
@ 2013-10-08 18:18 ` Jani Nikula
  1 sibling, 0 replies; 6+ messages in thread
From: Jani Nikula @ 2013-10-08 18:18 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/intel_opregion_decode.c |   14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/intel_opregion_decode.c b/tools/intel_opregion_decode.c
index e5f79df..8a9ef20 100644
--- a/tools/intel_opregion_decode.c
+++ b/tools/intel_opregion_decode.c
@@ -258,8 +258,18 @@ static void decode_asle(const void *buffer)
 	printf("\tcblv:\t0x%08x\n", asle->cblv);
 
 	printf("\tbclm:\n");
-	for (i = 0; i < ARRAY_SIZE(asle->bclm); i++)
-		printf("\t\tbclm[%d]:\t0x%04x\n", i, asle->bclm[i]);
+	for (i = 0; i < ARRAY_SIZE(asle->bclm); i++) {
+		int valid = asle->bclm[i] & (1 << 15);
+		int percentage = (asle->bclm[i] & 0x7f00) >> 8;
+		int duty_cycle = asle->bclm[i] & 0xff;
+
+		printf("\t\tbclm[%d]:\t0x%04x", i, asle->bclm[i]);
+		if (valid)
+			printf(" (%3d%% -> 0x%02x)\n", percentage, duty_cycle);
+		else
+			printf("\n");
+
+	}
 
 	printf("\tcpfm:\t0x%08x\n", asle->cpfm);
 	printf("\tepfm:\t0x%08x\n", asle->epfm);
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion
  2013-10-08 18:18 ` [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion Jani Nikula
@ 2013-10-17 11:41   ` Rodrigo Vivi
  2013-10-18  9:08     ` Jani Nikula
  0 siblings, 1 reply; 6+ messages in thread
From: Rodrigo Vivi @ 2013-10-17 11:41 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Tue, Oct 8, 2013 at 3:18 PM, Jani Nikula <jani.nikula@intel.com> wrote:
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  tools/Makefile.am             |    1 +
>  tools/intel_opregion_decode.c |  438 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 439 insertions(+)
>  create mode 100644 tools/intel_opregion_decode.c
>
> diff --git a/tools/Makefile.am b/tools/Makefile.am
> index 19810cf..59fea97 100644
> --- a/tools/Makefile.am
> +++ b/tools/Makefile.am
> @@ -13,6 +13,7 @@ bin_PROGRAMS =                                \
>         intel_gpu_top                   \
>         intel_gpu_time                  \
>         intel_gtt                       \
> +       intel_opregion_decode           \
>         intel_perf_counters             \
>         intel_stepping                  \
>         intel_reg_checker               \
> diff --git a/tools/intel_opregion_decode.c b/tools/intel_opregion_decode.c
> new file mode 100644
> index 0000000..e5f79df
> --- /dev/null
> +++ b/tools/intel_opregion_decode.c
> @@ -0,0 +1,438 @@
> +/*
> + * Copyright © 2013 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Authors:
> + *    Jani Nikula <jani.nikula@intel.com>
> + *
> + */
> +
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <getopt.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include <sys/mman.h>
> +#include <sys/stat.h>
> +#include <sys/types.h>
> +
> +#include "intel_gpu_tools.h"
> +
> +#define OPREGION_HEADER_OFFSET         0
> +#define OPREGION_ACPI_OFFSET           0x100
> +#define OPREGION_SWSCI_OFFSET          0x200
> +#define OPREGION_ASLE_OFFSET           0x300
> +#define OPREGION_VBT_OFFSET            0x400
> +#define OPREGION_ASLE_EXT_OFFSET       0x1C00
> +
> +#define MBOX_ACPI      (1 << 0)
> +#define MBOX_SWSCI     (1 << 1)
> +#define MBOX_ASLE      (1 << 2)
> +#define MBOX_VBT       (1 << 3)
> +#define MBOX_ASLE_EXT  (1 << 4)
> +
> +struct opregion_header {
> +       char sign[16];
> +       uint32_t size;
> +       uint32_t over;
> +       char sver[32];
> +       char vver[16];
> +       char gver[16];
> +       uint32_t mbox;
> +       uint32_t dmod;
> +       uint32_t pcon;
> +       char dver[32];
> +       uint8_t rsv1[124];
> +} __attribute__((packed));
> +
> +/* OpRegion mailbox #1: public ACPI methods */
> +struct opregion_acpi {
> +       uint32_t drdy;          /* driver readiness */
> +       uint32_t csts;          /* notification status */
> +       uint32_t cevt;          /* current event */
> +       uint8_t rsvd1[20];
> +       uint32_t didl[8];       /* supported display devices ID list */
> +       uint32_t cpdl[8];       /* currently presented display list */
> +       uint32_t cadl[8];       /* currently active display list */
> +       uint32_t nadl[8];       /* next active devices list */
> +       uint32_t aslp;          /* ASL sleep time-out */
> +       uint32_t tidx;          /* toggle table index */
> +       uint32_t chpd;          /* current hotplug enable indicator */
> +       uint32_t clid;          /* current lid state*/
> +       uint32_t cdck;          /* current docking state */
> +       uint32_t sxsw;          /* Sx state resume */
> +       uint32_t evts;          /* ASL supported events */
> +       uint32_t cnot;          /* current OS notification */
> +       uint32_t nrdy;          /* driver status */
> +       uint32_t did2[7];
> +       uint32_t cpd2[7];
> +       uint8_t rsvd2[4];
> +} __attribute__((packed));
> +
> +/* OpRegion mailbox #2: SWSCI */
> +struct opregion_swsci {
> +       uint32_t scic;          /* SWSCI command|status|data */
> +       uint32_t parm;          /* command parameters */
> +       uint32_t dslp;          /* driver sleep time-out */
> +       uint8_t rsvd[244];

spec that I have here (HSW one) says 240 reserved.

with that fixed or explained I'll add my rv-b tag and merge all 6
patches (including bios reader ones that I already reviewed) upstream.

> +} __attribute__((packed));
> +
> +/* OpRegion mailbox #3: ASLE */
> +struct opregion_asle {
> +       uint32_t ardy;          /* driver readiness */
> +       uint32_t aslc;          /* ASLE interrupt command */
> +       uint32_t tche;          /* technology enabled indicator */
> +       uint32_t alsi;          /* current ALS illuminance reading */
> +       uint32_t bclp;          /* backlight brightness to set */
> +       uint32_t pfit;          /* panel fitting state */
> +       uint32_t cblv;          /* current brightness level */
> +       uint16_t bclm[20];      /* backlight level duty cycle mapping table */
> +       uint32_t cpfm;          /* current panel fitting mode */
> +       uint32_t epfm;          /* enabled panel fitting modes */
> +       uint8_t plut_header;    /* panel LUT and identifier */
> +       uint8_t plut_identifier[10];    /* panel LUT and identifier */
> +       uint8_t plut[63];       /* panel LUT and identifier */
> +       uint32_t pfmb;          /* PWM freq and min brightness */
> +       uint32_t ccdv;
> +       uint32_t pcft;
> +       uint32_t srot;
> +       uint32_t iuer;
> +       uint8_t fdss[8];
> +       uint32_t fdsp;
> +       uint32_t stat;
> +       uint8_t rsvd[86];
> +} __attribute__((packed));
> +
> +/* OpRegion mailbox #4: VBT */
> +struct opregion_vbt {
> +       char product_string[20];
> +       /* rest ignored */
> +} __attribute__((packed));
> +
> +/* OpRegion mailbox #5: ASLE extension */
> +struct opregion_asle_ext {
> +       uint32_t phed;
> +       uint8_t bddc[256];
> +} __attribute__((packed));
> +
> +static uint32_t decode_header(const void *buffer)
> +{
> +       const struct opregion_header *header = buffer;
> +       char *s;
> +
> +       if (strncmp("IntelGraphicsMem", header->sign, sizeof(header->sign))) {
> +               fprintf(stderr, "invalid opregion signature\n");
> +               return 0;
> +       }
> +
> +       printf("OpRegion Header:\n");
> +
> +       s = strndup(header->sign, sizeof(header->sign));
> +       printf("\tsign:\t%s\n", s);
> +       free(s);
> +
> +       printf("\tsize:\t0x%08x\n", header->size);
> +       printf("\tover:\t0x%08x\n", header->over);
> +
> +       s = strndup(header->sver, sizeof(header->sver));
> +       printf("\tsver:\t%s\n", s);
> +       free(s);
> +
> +       s = strndup(header->vver, sizeof(header->vver));
> +       printf("\tvver:\t%s\n", s);
> +       free(s);
> +
> +       s = strndup(header->gver, sizeof(header->gver));
> +       printf("\tgver:\t%s\n", s);
> +       free(s);
> +
> +       printf("\tmbox:\t0x%08x\n", header->mbox);
> +
> +       printf("\tdmod:\t0x%08x\n", header->dmod);
> +       printf("\tpcon:\t0x%08x\n", header->pcon);
> +
> +       s = strndup(header->dver, sizeof(header->dver));
> +       printf("\tdver:\t%s\n", s);
> +       free(s);
> +
> +       printf("\n");
> +
> +       return header->mbox;
> +}
> +
> +static void decode_acpi(const void *buffer)
> +{
> +       const struct opregion_acpi *acpi = buffer;
> +       int i;
> +
> +       printf("OpRegion Mailbox 1: Public ACPI Methods:\n");
> +
> +       printf("\tdrdy:\t0x%08x\n", acpi->drdy);
> +       printf("\tcsts:\t0x%08x\n", acpi->csts);
> +       printf("\tcevt:\t0x%08x\n", acpi->cevt);
> +
> +       printf("\tdidl:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->didl); i++)
> +               printf("\t\tdidl[%d]:\t0x%08x\n", i, acpi->didl[i]);
> +
> +       printf("\tcpdl:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->cpdl); i++)
> +               printf("\t\tcpdl[%d]:\t0x%08x\n", i, acpi->cpdl[i]);
> +
> +       printf("\tcadl:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->cadl); i++)
> +               printf("\t\tcadl[%d]:\t0x%08x\n", i, acpi->cadl[i]);
> +
> +       printf("\tnadl:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->nadl); i++)
> +               printf("\t\tnadl[%d]:\t0x%08x\n", i, acpi->nadl[i]);
> +
> +       printf("\taslp:\t0x%08x\n", acpi->aslp);
> +       printf("\ttidx:\t0x%08x\n", acpi->tidx);
> +       printf("\tchpd:\t0x%08x\n", acpi->chpd);
> +       printf("\tclid:\t0x%08x\n", acpi->clid);
> +       printf("\tcdck:\t0x%08x\n", acpi->cdck);
> +       printf("\tsxsw:\t0x%08x\n", acpi->sxsw);
> +       printf("\tevts:\t0x%08x\n", acpi->evts);
> +       printf("\tcnot:\t0x%08x\n", acpi->cnot);
> +       printf("\tnrdy:\t0x%08x\n", acpi->nrdy);
> +
> +       printf("\tdid2:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->did2); i++)
> +               printf("\t\tdid2[%d]:\t0x%08x\n", i, acpi->did2[i]);
> +
> +       printf("\tcpd2:\n");
> +       for (i = 0; i < ARRAY_SIZE(acpi->cpd2); i++)
> +               printf("\t\tcpd2[%d]:\t0x%08x\n", i, acpi->cpd2[i]);
> +
> +       printf("\n");
> +}
> +
> +static void decode_swsci(const void *buffer)
> +{
> +       const struct opregion_swsci *swsci = buffer;
> +
> +       printf("OpRegion Mailbox 2: Software SCI Interface (SWSCI):\n");
> +
> +       printf("\tscic:\t0x%08x\n", swsci->scic);
> +       printf("\tparm:\t0x%08x\n", swsci->parm);
> +       printf("\tdslp:\t0x%08x\n", swsci->dslp);
> +
> +       printf("\n");
> +}
> +
> +static void decode_asle(const void *buffer)
> +{
> +       const struct opregion_asle *asle = buffer;
> +       int i;
> +
> +       printf("OpRegion Mailbox 3: BIOS to Driver Notification (ASLE):\n");
> +
> +       printf("\tardy:\t0x%08x\n", asle->ardy);
> +       printf("\taslc:\t0x%08x\n", asle->aslc);
> +       printf("\ttche:\t0x%08x\n", asle->tche);
> +       printf("\talsi:\t0x%08x\n", asle->alsi);
> +       printf("\tbclp:\t0x%08x\n", asle->bclp);
> +       printf("\tpfit:\t0x%08x\n", asle->pfit);
> +       printf("\tcblv:\t0x%08x\n", asle->cblv);
> +
> +       printf("\tbclm:\n");
> +       for (i = 0; i < ARRAY_SIZE(asle->bclm); i++)
> +               printf("\t\tbclm[%d]:\t0x%04x\n", i, asle->bclm[i]);
> +
> +       printf("\tcpfm:\t0x%08x\n", asle->cpfm);
> +       printf("\tepfm:\t0x%08x\n", asle->epfm);
> +
> +       printf("\tplut header:\t0x%02x\n", asle->plut_header);
> +
> +       printf("\tplut identifier:");
> +       for (i = 0; i < ARRAY_SIZE(asle->plut_identifier); i++)
> +               printf(" %02x", asle->plut_identifier[i]);
> +       printf("\n");
> +
> +       printf("\tplut:\n");
> +       for (i = 0; i < ARRAY_SIZE(asle->plut); i++) {
> +               const int COLUMNS = 7;
> +
> +               if (i % COLUMNS == 0)
> +                       printf("\t\tplut[%d]:\t", i / COLUMNS);
> +
> +               printf("%02x ", asle->plut[i]);
> +
> +               if (i % COLUMNS == COLUMNS - 1)
> +                       printf("\n");
> +       }
> +
> +       printf("\tpfmb:\t0x%08x\n", asle->pfmb);
> +       printf("\tccdv:\t0x%08x\n", asle->ccdv);
> +       printf("\tpcft:\t0x%08x\n", asle->pcft);
> +       printf("\tsrot:\t0x%08x\n", asle->srot);
> +       printf("\tiuer:\t0x%08x\n", asle->iuer);
> +
> +       printf("\tfdss:\t");
> +       for (i = 0; i < ARRAY_SIZE(asle->fdss); i++)
> +               printf("%02x ", asle->fdss[i]);
> +       printf("\n");
> +
> +       printf("\tfdsp:\t0x%08x\n", asle->fdsp);
> +       printf("\tstat:\t0x%08x\n", asle->stat);
> +
> +       printf("\n");
> +}
> +
> +static void decode_vbt(const void *buffer)
> +{
> +       const struct opregion_vbt *vbt = buffer;
> +       char *s;
> +
> +       printf("OpRegion Mailbox 4: Video BIOS Table (VBT):\n");
> +
> +       s = strndup(vbt->product_string, sizeof(vbt->product_string));
> +       printf("\tproduct string:\t%s\n", s);
> +       free(s);
> +
> +       printf("\t(use intel_bios_reader to decode the VBT)\n");
> +
> +       printf("\n");
> +}
> +
> +static void decode_asle_ext(const void *buffer)
> +{
> +       const struct opregion_asle_ext *asle_ext = buffer;
> +       int i;
> +
> +       printf("OpRegion Mailbox 5: BIOS to Driver Notification Extension:\n");
> +
> +       printf("\tphed:\t0x%08x\n", asle_ext->phed);
> +
> +       printf("\tbddc:\n");
> +       for (i = 0; i < ARRAY_SIZE(asle_ext->bddc); i++) {
> +               const int COLUMNS = 16;
> +
> +               if (i % COLUMNS == 0)
> +                       printf("\t\tbddc[0x%02x]:\t", i);
> +
> +               printf("%02x ", asle_ext->bddc[i]);
> +
> +               if (i % COLUMNS == COLUMNS - 1)
> +                       printf("\n");
> +       }
> +
> +       printf("\n");
> +}
> +
> +static void decode_opregion(const uint8_t *opregion, int size)
> +{
> +       uint32_t mbox;
> +
> +       /* XXX: allow decoding up to size */
> +       if (OPREGION_ASLE_EXT_OFFSET + sizeof(struct opregion_asle_ext) > size) {
> +               fprintf(stderr, "buffer too small\n");
> +               return;
> +       }
> +
> +       mbox = decode_header(opregion + OPREGION_HEADER_OFFSET);
> +       if (mbox & MBOX_ACPI)
> +               decode_acpi(opregion + OPREGION_ACPI_OFFSET);
> +       if (mbox & MBOX_SWSCI)
> +               decode_swsci(opregion + OPREGION_SWSCI_OFFSET);
> +       if (mbox & MBOX_ASLE)
> +               decode_asle(opregion + OPREGION_ASLE_OFFSET);
> +       if (mbox & MBOX_VBT)
> +               decode_vbt(opregion + OPREGION_VBT_OFFSET);
> +       if (mbox & MBOX_ASLE_EXT)
> +               decode_asle_ext(opregion + OPREGION_ASLE_EXT_OFFSET);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +       const char *filename = "/sys/kernel/debug/dri/0/i915_opregion";
> +       int fd;
> +       struct stat finfo;
> +       uint8_t *opregion;
> +       int c, option_index = 0;
> +
> +       static struct option long_options[] = {
> +               { "file", required_argument, 0, 'f' },
> +               { "help", no_argument, 0, 'h' },
> +               { 0 },
> +       };
> +
> +       while ((c = getopt_long(argc, argv, "hf:",
> +                               long_options, &option_index)) != -1) {
> +               switch (c) {
> +               case 'h':
> +                       printf("usage: intel_opregion_decode [-f|--file=<input>]\n");
> +                       return 0;
> +               case 'f':
> +                       filename = optarg;
> +                       break;
> +               default:
> +                       fprintf(stderr, "unkown command options\n");
> +                       return 1;
> +               }
> +       }
> +
> +       fd = open(filename, O_RDONLY);
> +       if (fd == -1) {
> +               printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
> +               return 1;
> +       }
> +
> +       if (stat(filename, &finfo)) {
> +               printf("failed to stat \"%s\": %s\n", filename, strerror(errno));
> +               return 1;
> +       }
> +
> +       if (finfo.st_size == 0) {
> +               int len = 0, ret;
> +               finfo.st_size = 8192;
> +               opregion = malloc(finfo.st_size);
> +               while ((ret = read(fd, opregion + len, finfo.st_size - len))) {
> +                       if (ret < 0) {
> +                               printf("failed to read \"%s\": %s\n", filename,
> +                                      strerror(errno));
> +                               return 1;
> +                       }
> +
> +                       len += ret;
> +                       if (len == finfo.st_size) {
> +                               finfo.st_size *= 2;
> +                               opregion = realloc(opregion, finfo.st_size);
> +                       }
> +               }
> +       } else {
> +               opregion = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED,
> +                               fd, 0);
> +               if (opregion == MAP_FAILED) {
> +                       printf("failed to map \"%s\": %s\n", filename,
> +                              strerror(errno));
> +                       return 1;
> +               }
> +       }
> +
> +       decode_opregion(opregion, finfo.st_size);
> +
> +       return 0;
> +}
> --
> 1.7.10.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Thanks

-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion
  2013-10-17 11:41   ` Rodrigo Vivi
@ 2013-10-18  9:08     ` Jani Nikula
  2013-10-21 11:46       ` Rodrigo Vivi
  0 siblings, 1 reply; 6+ messages in thread
From: Jani Nikula @ 2013-10-18  9:08 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx

On Thu, 17 Oct 2013, Rodrigo Vivi <rodrigo.vivi@gmail.com> wrote:
> On Tue, Oct 8, 2013 at 3:18 PM, Jani Nikula <jani.nikula@intel.com> wrote:
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>  tools/Makefile.am             |    1 +
>>  tools/intel_opregion_decode.c |  438 +++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 439 insertions(+)
>>  create mode 100644 tools/intel_opregion_decode.c
>>
>> diff --git a/tools/Makefile.am b/tools/Makefile.am
>> index 19810cf..59fea97 100644
>> --- a/tools/Makefile.am
>> +++ b/tools/Makefile.am
>> @@ -13,6 +13,7 @@ bin_PROGRAMS =                                \
>>         intel_gpu_top                   \
>>         intel_gpu_time                  \
>>         intel_gtt                       \
>> +       intel_opregion_decode           \
>>         intel_perf_counters             \
>>         intel_stepping                  \
>>         intel_reg_checker               \
>> diff --git a/tools/intel_opregion_decode.c b/tools/intel_opregion_decode.c
>> new file mode 100644
>> index 0000000..e5f79df
>> --- /dev/null
>> +++ b/tools/intel_opregion_decode.c
>> @@ -0,0 +1,438 @@
>> +/*
>> + * Copyright © 2013 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>> + * DEALINGS IN THE SOFTWARE.
>> + *
>> + * Authors:
>> + *    Jani Nikula <jani.nikula@intel.com>
>> + *
>> + */
>> +
>> +#include <errno.h>
>> +#include <fcntl.h>
>> +#include <getopt.h>
>> +#include <stdint.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <unistd.h>
>> +#include <sys/mman.h>
>> +#include <sys/stat.h>
>> +#include <sys/types.h>
>> +
>> +#include "intel_gpu_tools.h"
>> +
>> +#define OPREGION_HEADER_OFFSET         0
>> +#define OPREGION_ACPI_OFFSET           0x100
>> +#define OPREGION_SWSCI_OFFSET          0x200
>> +#define OPREGION_ASLE_OFFSET           0x300
>> +#define OPREGION_VBT_OFFSET            0x400
>> +#define OPREGION_ASLE_EXT_OFFSET       0x1C00
>> +
>> +#define MBOX_ACPI      (1 << 0)
>> +#define MBOX_SWSCI     (1 << 1)
>> +#define MBOX_ASLE      (1 << 2)
>> +#define MBOX_VBT       (1 << 3)
>> +#define MBOX_ASLE_EXT  (1 << 4)
>> +
>> +struct opregion_header {
>> +       char sign[16];
>> +       uint32_t size;
>> +       uint32_t over;
>> +       char sver[32];
>> +       char vver[16];
>> +       char gver[16];
>> +       uint32_t mbox;
>> +       uint32_t dmod;
>> +       uint32_t pcon;
>> +       char dver[32];
>> +       uint8_t rsv1[124];
>> +} __attribute__((packed));
>> +
>> +/* OpRegion mailbox #1: public ACPI methods */
>> +struct opregion_acpi {
>> +       uint32_t drdy;          /* driver readiness */
>> +       uint32_t csts;          /* notification status */
>> +       uint32_t cevt;          /* current event */
>> +       uint8_t rsvd1[20];
>> +       uint32_t didl[8];       /* supported display devices ID list */
>> +       uint32_t cpdl[8];       /* currently presented display list */
>> +       uint32_t cadl[8];       /* currently active display list */
>> +       uint32_t nadl[8];       /* next active devices list */
>> +       uint32_t aslp;          /* ASL sleep time-out */
>> +       uint32_t tidx;          /* toggle table index */
>> +       uint32_t chpd;          /* current hotplug enable indicator */
>> +       uint32_t clid;          /* current lid state*/
>> +       uint32_t cdck;          /* current docking state */
>> +       uint32_t sxsw;          /* Sx state resume */
>> +       uint32_t evts;          /* ASL supported events */
>> +       uint32_t cnot;          /* current OS notification */
>> +       uint32_t nrdy;          /* driver status */
>> +       uint32_t did2[7];
>> +       uint32_t cpd2[7];
>> +       uint8_t rsvd2[4];
>> +} __attribute__((packed));
>> +
>> +/* OpRegion mailbox #2: SWSCI */
>> +struct opregion_swsci {
>> +       uint32_t scic;          /* SWSCI command|status|data */
>> +       uint32_t parm;          /* command parameters */
>> +       uint32_t dslp;          /* driver sleep time-out */
>> +       uint8_t rsvd[244];
>
> spec that I have here (HSW one) says 240 reserved.
>
> with that fixed or explained I'll add my rv-b tag and merge all 6
> patches (including bios reader ones that I already reviewed) upstream.

Mine says 240 reserved too. But the beginning of chapter 3 says the size
of the whole mailbox is 256 bytes. Which equals 3 * 4 + 244. *shrug*.

Jani.



>
>> +} __attribute__((packed));
>> +
>> +/* OpRegion mailbox #3: ASLE */
>> +struct opregion_asle {
>> +       uint32_t ardy;          /* driver readiness */
>> +       uint32_t aslc;          /* ASLE interrupt command */
>> +       uint32_t tche;          /* technology enabled indicator */
>> +       uint32_t alsi;          /* current ALS illuminance reading */
>> +       uint32_t bclp;          /* backlight brightness to set */
>> +       uint32_t pfit;          /* panel fitting state */
>> +       uint32_t cblv;          /* current brightness level */
>> +       uint16_t bclm[20];      /* backlight level duty cycle mapping table */
>> +       uint32_t cpfm;          /* current panel fitting mode */
>> +       uint32_t epfm;          /* enabled panel fitting modes */
>> +       uint8_t plut_header;    /* panel LUT and identifier */
>> +       uint8_t plut_identifier[10];    /* panel LUT and identifier */
>> +       uint8_t plut[63];       /* panel LUT and identifier */
>> +       uint32_t pfmb;          /* PWM freq and min brightness */
>> +       uint32_t ccdv;
>> +       uint32_t pcft;
>> +       uint32_t srot;
>> +       uint32_t iuer;
>> +       uint8_t fdss[8];
>> +       uint32_t fdsp;
>> +       uint32_t stat;
>> +       uint8_t rsvd[86];
>> +} __attribute__((packed));
>> +
>> +/* OpRegion mailbox #4: VBT */
>> +struct opregion_vbt {
>> +       char product_string[20];
>> +       /* rest ignored */
>> +} __attribute__((packed));
>> +
>> +/* OpRegion mailbox #5: ASLE extension */
>> +struct opregion_asle_ext {
>> +       uint32_t phed;
>> +       uint8_t bddc[256];
>> +} __attribute__((packed));
>> +
>> +static uint32_t decode_header(const void *buffer)
>> +{
>> +       const struct opregion_header *header = buffer;
>> +       char *s;
>> +
>> +       if (strncmp("IntelGraphicsMem", header->sign, sizeof(header->sign))) {
>> +               fprintf(stderr, "invalid opregion signature\n");
>> +               return 0;
>> +       }
>> +
>> +       printf("OpRegion Header:\n");
>> +
>> +       s = strndup(header->sign, sizeof(header->sign));
>> +       printf("\tsign:\t%s\n", s);
>> +       free(s);
>> +
>> +       printf("\tsize:\t0x%08x\n", header->size);
>> +       printf("\tover:\t0x%08x\n", header->over);
>> +
>> +       s = strndup(header->sver, sizeof(header->sver));
>> +       printf("\tsver:\t%s\n", s);
>> +       free(s);
>> +
>> +       s = strndup(header->vver, sizeof(header->vver));
>> +       printf("\tvver:\t%s\n", s);
>> +       free(s);
>> +
>> +       s = strndup(header->gver, sizeof(header->gver));
>> +       printf("\tgver:\t%s\n", s);
>> +       free(s);
>> +
>> +       printf("\tmbox:\t0x%08x\n", header->mbox);
>> +
>> +       printf("\tdmod:\t0x%08x\n", header->dmod);
>> +       printf("\tpcon:\t0x%08x\n", header->pcon);
>> +
>> +       s = strndup(header->dver, sizeof(header->dver));
>> +       printf("\tdver:\t%s\n", s);
>> +       free(s);
>> +
>> +       printf("\n");
>> +
>> +       return header->mbox;
>> +}
>> +
>> +static void decode_acpi(const void *buffer)
>> +{
>> +       const struct opregion_acpi *acpi = buffer;
>> +       int i;
>> +
>> +       printf("OpRegion Mailbox 1: Public ACPI Methods:\n");
>> +
>> +       printf("\tdrdy:\t0x%08x\n", acpi->drdy);
>> +       printf("\tcsts:\t0x%08x\n", acpi->csts);
>> +       printf("\tcevt:\t0x%08x\n", acpi->cevt);
>> +
>> +       printf("\tdidl:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->didl); i++)
>> +               printf("\t\tdidl[%d]:\t0x%08x\n", i, acpi->didl[i]);
>> +
>> +       printf("\tcpdl:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->cpdl); i++)
>> +               printf("\t\tcpdl[%d]:\t0x%08x\n", i, acpi->cpdl[i]);
>> +
>> +       printf("\tcadl:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->cadl); i++)
>> +               printf("\t\tcadl[%d]:\t0x%08x\n", i, acpi->cadl[i]);
>> +
>> +       printf("\tnadl:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->nadl); i++)
>> +               printf("\t\tnadl[%d]:\t0x%08x\n", i, acpi->nadl[i]);
>> +
>> +       printf("\taslp:\t0x%08x\n", acpi->aslp);
>> +       printf("\ttidx:\t0x%08x\n", acpi->tidx);
>> +       printf("\tchpd:\t0x%08x\n", acpi->chpd);
>> +       printf("\tclid:\t0x%08x\n", acpi->clid);
>> +       printf("\tcdck:\t0x%08x\n", acpi->cdck);
>> +       printf("\tsxsw:\t0x%08x\n", acpi->sxsw);
>> +       printf("\tevts:\t0x%08x\n", acpi->evts);
>> +       printf("\tcnot:\t0x%08x\n", acpi->cnot);
>> +       printf("\tnrdy:\t0x%08x\n", acpi->nrdy);
>> +
>> +       printf("\tdid2:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->did2); i++)
>> +               printf("\t\tdid2[%d]:\t0x%08x\n", i, acpi->did2[i]);
>> +
>> +       printf("\tcpd2:\n");
>> +       for (i = 0; i < ARRAY_SIZE(acpi->cpd2); i++)
>> +               printf("\t\tcpd2[%d]:\t0x%08x\n", i, acpi->cpd2[i]);
>> +
>> +       printf("\n");
>> +}
>> +
>> +static void decode_swsci(const void *buffer)
>> +{
>> +       const struct opregion_swsci *swsci = buffer;
>> +
>> +       printf("OpRegion Mailbox 2: Software SCI Interface (SWSCI):\n");
>> +
>> +       printf("\tscic:\t0x%08x\n", swsci->scic);
>> +       printf("\tparm:\t0x%08x\n", swsci->parm);
>> +       printf("\tdslp:\t0x%08x\n", swsci->dslp);
>> +
>> +       printf("\n");
>> +}
>> +
>> +static void decode_asle(const void *buffer)
>> +{
>> +       const struct opregion_asle *asle = buffer;
>> +       int i;
>> +
>> +       printf("OpRegion Mailbox 3: BIOS to Driver Notification (ASLE):\n");
>> +
>> +       printf("\tardy:\t0x%08x\n", asle->ardy);
>> +       printf("\taslc:\t0x%08x\n", asle->aslc);
>> +       printf("\ttche:\t0x%08x\n", asle->tche);
>> +       printf("\talsi:\t0x%08x\n", asle->alsi);
>> +       printf("\tbclp:\t0x%08x\n", asle->bclp);
>> +       printf("\tpfit:\t0x%08x\n", asle->pfit);
>> +       printf("\tcblv:\t0x%08x\n", asle->cblv);
>> +
>> +       printf("\tbclm:\n");
>> +       for (i = 0; i < ARRAY_SIZE(asle->bclm); i++)
>> +               printf("\t\tbclm[%d]:\t0x%04x\n", i, asle->bclm[i]);
>> +
>> +       printf("\tcpfm:\t0x%08x\n", asle->cpfm);
>> +       printf("\tepfm:\t0x%08x\n", asle->epfm);
>> +
>> +       printf("\tplut header:\t0x%02x\n", asle->plut_header);
>> +
>> +       printf("\tplut identifier:");
>> +       for (i = 0; i < ARRAY_SIZE(asle->plut_identifier); i++)
>> +               printf(" %02x", asle->plut_identifier[i]);
>> +       printf("\n");
>> +
>> +       printf("\tplut:\n");
>> +       for (i = 0; i < ARRAY_SIZE(asle->plut); i++) {
>> +               const int COLUMNS = 7;
>> +
>> +               if (i % COLUMNS == 0)
>> +                       printf("\t\tplut[%d]:\t", i / COLUMNS);
>> +
>> +               printf("%02x ", asle->plut[i]);
>> +
>> +               if (i % COLUMNS == COLUMNS - 1)
>> +                       printf("\n");
>> +       }
>> +
>> +       printf("\tpfmb:\t0x%08x\n", asle->pfmb);
>> +       printf("\tccdv:\t0x%08x\n", asle->ccdv);
>> +       printf("\tpcft:\t0x%08x\n", asle->pcft);
>> +       printf("\tsrot:\t0x%08x\n", asle->srot);
>> +       printf("\tiuer:\t0x%08x\n", asle->iuer);
>> +
>> +       printf("\tfdss:\t");
>> +       for (i = 0; i < ARRAY_SIZE(asle->fdss); i++)
>> +               printf("%02x ", asle->fdss[i]);
>> +       printf("\n");
>> +
>> +       printf("\tfdsp:\t0x%08x\n", asle->fdsp);
>> +       printf("\tstat:\t0x%08x\n", asle->stat);
>> +
>> +       printf("\n");
>> +}
>> +
>> +static void decode_vbt(const void *buffer)
>> +{
>> +       const struct opregion_vbt *vbt = buffer;
>> +       char *s;
>> +
>> +       printf("OpRegion Mailbox 4: Video BIOS Table (VBT):\n");
>> +
>> +       s = strndup(vbt->product_string, sizeof(vbt->product_string));
>> +       printf("\tproduct string:\t%s\n", s);
>> +       free(s);
>> +
>> +       printf("\t(use intel_bios_reader to decode the VBT)\n");
>> +
>> +       printf("\n");
>> +}
>> +
>> +static void decode_asle_ext(const void *buffer)
>> +{
>> +       const struct opregion_asle_ext *asle_ext = buffer;
>> +       int i;
>> +
>> +       printf("OpRegion Mailbox 5: BIOS to Driver Notification Extension:\n");
>> +
>> +       printf("\tphed:\t0x%08x\n", asle_ext->phed);
>> +
>> +       printf("\tbddc:\n");
>> +       for (i = 0; i < ARRAY_SIZE(asle_ext->bddc); i++) {
>> +               const int COLUMNS = 16;
>> +
>> +               if (i % COLUMNS == 0)
>> +                       printf("\t\tbddc[0x%02x]:\t", i);
>> +
>> +               printf("%02x ", asle_ext->bddc[i]);
>> +
>> +               if (i % COLUMNS == COLUMNS - 1)
>> +                       printf("\n");
>> +       }
>> +
>> +       printf("\n");
>> +}
>> +
>> +static void decode_opregion(const uint8_t *opregion, int size)
>> +{
>> +       uint32_t mbox;
>> +
>> +       /* XXX: allow decoding up to size */
>> +       if (OPREGION_ASLE_EXT_OFFSET + sizeof(struct opregion_asle_ext) > size) {
>> +               fprintf(stderr, "buffer too small\n");
>> +               return;
>> +       }
>> +
>> +       mbox = decode_header(opregion + OPREGION_HEADER_OFFSET);
>> +       if (mbox & MBOX_ACPI)
>> +               decode_acpi(opregion + OPREGION_ACPI_OFFSET);
>> +       if (mbox & MBOX_SWSCI)
>> +               decode_swsci(opregion + OPREGION_SWSCI_OFFSET);
>> +       if (mbox & MBOX_ASLE)
>> +               decode_asle(opregion + OPREGION_ASLE_OFFSET);
>> +       if (mbox & MBOX_VBT)
>> +               decode_vbt(opregion + OPREGION_VBT_OFFSET);
>> +       if (mbox & MBOX_ASLE_EXT)
>> +               decode_asle_ext(opregion + OPREGION_ASLE_EXT_OFFSET);
>> +}
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +       const char *filename = "/sys/kernel/debug/dri/0/i915_opregion";
>> +       int fd;
>> +       struct stat finfo;
>> +       uint8_t *opregion;
>> +       int c, option_index = 0;
>> +
>> +       static struct option long_options[] = {
>> +               { "file", required_argument, 0, 'f' },
>> +               { "help", no_argument, 0, 'h' },
>> +               { 0 },
>> +       };
>> +
>> +       while ((c = getopt_long(argc, argv, "hf:",
>> +                               long_options, &option_index)) != -1) {
>> +               switch (c) {
>> +               case 'h':
>> +                       printf("usage: intel_opregion_decode [-f|--file=<input>]\n");
>> +                       return 0;
>> +               case 'f':
>> +                       filename = optarg;
>> +                       break;
>> +               default:
>> +                       fprintf(stderr, "unkown command options\n");
>> +                       return 1;
>> +               }
>> +       }
>> +
>> +       fd = open(filename, O_RDONLY);
>> +       if (fd == -1) {
>> +               printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
>> +               return 1;
>> +       }
>> +
>> +       if (stat(filename, &finfo)) {
>> +               printf("failed to stat \"%s\": %s\n", filename, strerror(errno));
>> +               return 1;
>> +       }
>> +
>> +       if (finfo.st_size == 0) {
>> +               int len = 0, ret;
>> +               finfo.st_size = 8192;
>> +               opregion = malloc(finfo.st_size);
>> +               while ((ret = read(fd, opregion + len, finfo.st_size - len))) {
>> +                       if (ret < 0) {
>> +                               printf("failed to read \"%s\": %s\n", filename,
>> +                                      strerror(errno));
>> +                               return 1;
>> +                       }
>> +
>> +                       len += ret;
>> +                       if (len == finfo.st_size) {
>> +                               finfo.st_size *= 2;
>> +                               opregion = realloc(opregion, finfo.st_size);
>> +                       }
>> +               }
>> +       } else {
>> +               opregion = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED,
>> +                               fd, 0);
>> +               if (opregion == MAP_FAILED) {
>> +                       printf("failed to map \"%s\": %s\n", filename,
>> +                              strerror(errno));
>> +                       return 1;
>> +               }
>> +       }
>> +
>> +       decode_opregion(opregion, finfo.st_size);
>> +
>> +       return 0;
>> +}
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> Thanks
>
> -- 
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion
  2013-10-18  9:08     ` Jani Nikula
@ 2013-10-21 11:46       ` Rodrigo Vivi
  0 siblings, 0 replies; 6+ messages in thread
From: Rodrigo Vivi @ 2013-10-21 11:46 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

Thanks.

really odd, but if it was wrong you would probably already face other
errors even more odd ;)

So, all reviewed and merged up.

On Fri, Oct 18, 2013 at 6:08 AM, Jani Nikula <jani.nikula@intel.com> wrote:
> On Thu, 17 Oct 2013, Rodrigo Vivi <rodrigo.vivi@gmail.com> wrote:
>> On Tue, Oct 8, 2013 at 3:18 PM, Jani Nikula <jani.nikula@intel.com> wrote:
>>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>>> ---
>>>  tools/Makefile.am             |    1 +
>>>  tools/intel_opregion_decode.c |  438 +++++++++++++++++++++++++++++++++++++++++
>>>  2 files changed, 439 insertions(+)
>>>  create mode 100644 tools/intel_opregion_decode.c
>>>
>>> diff --git a/tools/Makefile.am b/tools/Makefile.am
>>> index 19810cf..59fea97 100644
>>> --- a/tools/Makefile.am
>>> +++ b/tools/Makefile.am
>>> @@ -13,6 +13,7 @@ bin_PROGRAMS =                                \
>>>         intel_gpu_top                   \
>>>         intel_gpu_time                  \
>>>         intel_gtt                       \
>>> +       intel_opregion_decode           \
>>>         intel_perf_counters             \
>>>         intel_stepping                  \
>>>         intel_reg_checker               \
>>> diff --git a/tools/intel_opregion_decode.c b/tools/intel_opregion_decode.c
>>> new file mode 100644
>>> index 0000000..e5f79df
>>> --- /dev/null
>>> +++ b/tools/intel_opregion_decode.c
>>> @@ -0,0 +1,438 @@
>>> +/*
>>> + * Copyright © 2013 Intel Corporation
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining a
>>> + * copy of this software and associated documentation files (the "Software"),
>>> + * to deal in the Software without restriction, including without limitation
>>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>>> + * and/or sell copies of the Software, and to permit persons to whom the
>>> + * Software is furnished to do so, subject to the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice (including the next
>>> + * paragraph) shall be included in all copies or substantial portions of the
>>> + * Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>>> + * DEALINGS IN THE SOFTWARE.
>>> + *
>>> + * Authors:
>>> + *    Jani Nikula <jani.nikula@intel.com>
>>> + *
>>> + */
>>> +
>>> +#include <errno.h>
>>> +#include <fcntl.h>
>>> +#include <getopt.h>
>>> +#include <stdint.h>
>>> +#include <stdio.h>
>>> +#include <stdlib.h>
>>> +#include <string.h>
>>> +#include <unistd.h>
>>> +#include <sys/mman.h>
>>> +#include <sys/stat.h>
>>> +#include <sys/types.h>
>>> +
>>> +#include "intel_gpu_tools.h"
>>> +
>>> +#define OPREGION_HEADER_OFFSET         0
>>> +#define OPREGION_ACPI_OFFSET           0x100
>>> +#define OPREGION_SWSCI_OFFSET          0x200
>>> +#define OPREGION_ASLE_OFFSET           0x300
>>> +#define OPREGION_VBT_OFFSET            0x400
>>> +#define OPREGION_ASLE_EXT_OFFSET       0x1C00
>>> +
>>> +#define MBOX_ACPI      (1 << 0)
>>> +#define MBOX_SWSCI     (1 << 1)
>>> +#define MBOX_ASLE      (1 << 2)
>>> +#define MBOX_VBT       (1 << 3)
>>> +#define MBOX_ASLE_EXT  (1 << 4)
>>> +
>>> +struct opregion_header {
>>> +       char sign[16];
>>> +       uint32_t size;
>>> +       uint32_t over;
>>> +       char sver[32];
>>> +       char vver[16];
>>> +       char gver[16];
>>> +       uint32_t mbox;
>>> +       uint32_t dmod;
>>> +       uint32_t pcon;
>>> +       char dver[32];
>>> +       uint8_t rsv1[124];
>>> +} __attribute__((packed));
>>> +
>>> +/* OpRegion mailbox #1: public ACPI methods */
>>> +struct opregion_acpi {
>>> +       uint32_t drdy;          /* driver readiness */
>>> +       uint32_t csts;          /* notification status */
>>> +       uint32_t cevt;          /* current event */
>>> +       uint8_t rsvd1[20];
>>> +       uint32_t didl[8];       /* supported display devices ID list */
>>> +       uint32_t cpdl[8];       /* currently presented display list */
>>> +       uint32_t cadl[8];       /* currently active display list */
>>> +       uint32_t nadl[8];       /* next active devices list */
>>> +       uint32_t aslp;          /* ASL sleep time-out */
>>> +       uint32_t tidx;          /* toggle table index */
>>> +       uint32_t chpd;          /* current hotplug enable indicator */
>>> +       uint32_t clid;          /* current lid state*/
>>> +       uint32_t cdck;          /* current docking state */
>>> +       uint32_t sxsw;          /* Sx state resume */
>>> +       uint32_t evts;          /* ASL supported events */
>>> +       uint32_t cnot;          /* current OS notification */
>>> +       uint32_t nrdy;          /* driver status */
>>> +       uint32_t did2[7];
>>> +       uint32_t cpd2[7];
>>> +       uint8_t rsvd2[4];
>>> +} __attribute__((packed));
>>> +
>>> +/* OpRegion mailbox #2: SWSCI */
>>> +struct opregion_swsci {
>>> +       uint32_t scic;          /* SWSCI command|status|data */
>>> +       uint32_t parm;          /* command parameters */
>>> +       uint32_t dslp;          /* driver sleep time-out */
>>> +       uint8_t rsvd[244];
>>
>> spec that I have here (HSW one) says 240 reserved.
>>
>> with that fixed or explained I'll add my rv-b tag and merge all 6
>> patches (including bios reader ones that I already reviewed) upstream.
>
> Mine says 240 reserved too. But the beginning of chapter 3 says the size
> of the whole mailbox is 256 bytes. Which equals 3 * 4 + 244. *shrug*.
>
> Jani.
>
>
>
>>
>>> +} __attribute__((packed));
>>> +
>>> +/* OpRegion mailbox #3: ASLE */
>>> +struct opregion_asle {
>>> +       uint32_t ardy;          /* driver readiness */
>>> +       uint32_t aslc;          /* ASLE interrupt command */
>>> +       uint32_t tche;          /* technology enabled indicator */
>>> +       uint32_t alsi;          /* current ALS illuminance reading */
>>> +       uint32_t bclp;          /* backlight brightness to set */
>>> +       uint32_t pfit;          /* panel fitting state */
>>> +       uint32_t cblv;          /* current brightness level */
>>> +       uint16_t bclm[20];      /* backlight level duty cycle mapping table */
>>> +       uint32_t cpfm;          /* current panel fitting mode */
>>> +       uint32_t epfm;          /* enabled panel fitting modes */
>>> +       uint8_t plut_header;    /* panel LUT and identifier */
>>> +       uint8_t plut_identifier[10];    /* panel LUT and identifier */
>>> +       uint8_t plut[63];       /* panel LUT and identifier */
>>> +       uint32_t pfmb;          /* PWM freq and min brightness */
>>> +       uint32_t ccdv;
>>> +       uint32_t pcft;
>>> +       uint32_t srot;
>>> +       uint32_t iuer;
>>> +       uint8_t fdss[8];
>>> +       uint32_t fdsp;
>>> +       uint32_t stat;
>>> +       uint8_t rsvd[86];
>>> +} __attribute__((packed));
>>> +
>>> +/* OpRegion mailbox #4: VBT */
>>> +struct opregion_vbt {
>>> +       char product_string[20];
>>> +       /* rest ignored */
>>> +} __attribute__((packed));
>>> +
>>> +/* OpRegion mailbox #5: ASLE extension */
>>> +struct opregion_asle_ext {
>>> +       uint32_t phed;
>>> +       uint8_t bddc[256];
>>> +} __attribute__((packed));
>>> +
>>> +static uint32_t decode_header(const void *buffer)
>>> +{
>>> +       const struct opregion_header *header = buffer;
>>> +       char *s;
>>> +
>>> +       if (strncmp("IntelGraphicsMem", header->sign, sizeof(header->sign))) {
>>> +               fprintf(stderr, "invalid opregion signature\n");
>>> +               return 0;
>>> +       }
>>> +
>>> +       printf("OpRegion Header:\n");
>>> +
>>> +       s = strndup(header->sign, sizeof(header->sign));
>>> +       printf("\tsign:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       printf("\tsize:\t0x%08x\n", header->size);
>>> +       printf("\tover:\t0x%08x\n", header->over);
>>> +
>>> +       s = strndup(header->sver, sizeof(header->sver));
>>> +       printf("\tsver:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       s = strndup(header->vver, sizeof(header->vver));
>>> +       printf("\tvver:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       s = strndup(header->gver, sizeof(header->gver));
>>> +       printf("\tgver:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       printf("\tmbox:\t0x%08x\n", header->mbox);
>>> +
>>> +       printf("\tdmod:\t0x%08x\n", header->dmod);
>>> +       printf("\tpcon:\t0x%08x\n", header->pcon);
>>> +
>>> +       s = strndup(header->dver, sizeof(header->dver));
>>> +       printf("\tdver:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       printf("\n");
>>> +
>>> +       return header->mbox;
>>> +}
>>> +
>>> +static void decode_acpi(const void *buffer)
>>> +{
>>> +       const struct opregion_acpi *acpi = buffer;
>>> +       int i;
>>> +
>>> +       printf("OpRegion Mailbox 1: Public ACPI Methods:\n");
>>> +
>>> +       printf("\tdrdy:\t0x%08x\n", acpi->drdy);
>>> +       printf("\tcsts:\t0x%08x\n", acpi->csts);
>>> +       printf("\tcevt:\t0x%08x\n", acpi->cevt);
>>> +
>>> +       printf("\tdidl:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->didl); i++)
>>> +               printf("\t\tdidl[%d]:\t0x%08x\n", i, acpi->didl[i]);
>>> +
>>> +       printf("\tcpdl:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->cpdl); i++)
>>> +               printf("\t\tcpdl[%d]:\t0x%08x\n", i, acpi->cpdl[i]);
>>> +
>>> +       printf("\tcadl:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->cadl); i++)
>>> +               printf("\t\tcadl[%d]:\t0x%08x\n", i, acpi->cadl[i]);
>>> +
>>> +       printf("\tnadl:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->nadl); i++)
>>> +               printf("\t\tnadl[%d]:\t0x%08x\n", i, acpi->nadl[i]);
>>> +
>>> +       printf("\taslp:\t0x%08x\n", acpi->aslp);
>>> +       printf("\ttidx:\t0x%08x\n", acpi->tidx);
>>> +       printf("\tchpd:\t0x%08x\n", acpi->chpd);
>>> +       printf("\tclid:\t0x%08x\n", acpi->clid);
>>> +       printf("\tcdck:\t0x%08x\n", acpi->cdck);
>>> +       printf("\tsxsw:\t0x%08x\n", acpi->sxsw);
>>> +       printf("\tevts:\t0x%08x\n", acpi->evts);
>>> +       printf("\tcnot:\t0x%08x\n", acpi->cnot);
>>> +       printf("\tnrdy:\t0x%08x\n", acpi->nrdy);
>>> +
>>> +       printf("\tdid2:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->did2); i++)
>>> +               printf("\t\tdid2[%d]:\t0x%08x\n", i, acpi->did2[i]);
>>> +
>>> +       printf("\tcpd2:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(acpi->cpd2); i++)
>>> +               printf("\t\tcpd2[%d]:\t0x%08x\n", i, acpi->cpd2[i]);
>>> +
>>> +       printf("\n");
>>> +}
>>> +
>>> +static void decode_swsci(const void *buffer)
>>> +{
>>> +       const struct opregion_swsci *swsci = buffer;
>>> +
>>> +       printf("OpRegion Mailbox 2: Software SCI Interface (SWSCI):\n");
>>> +
>>> +       printf("\tscic:\t0x%08x\n", swsci->scic);
>>> +       printf("\tparm:\t0x%08x\n", swsci->parm);
>>> +       printf("\tdslp:\t0x%08x\n", swsci->dslp);
>>> +
>>> +       printf("\n");
>>> +}
>>> +
>>> +static void decode_asle(const void *buffer)
>>> +{
>>> +       const struct opregion_asle *asle = buffer;
>>> +       int i;
>>> +
>>> +       printf("OpRegion Mailbox 3: BIOS to Driver Notification (ASLE):\n");
>>> +
>>> +       printf("\tardy:\t0x%08x\n", asle->ardy);
>>> +       printf("\taslc:\t0x%08x\n", asle->aslc);
>>> +       printf("\ttche:\t0x%08x\n", asle->tche);
>>> +       printf("\talsi:\t0x%08x\n", asle->alsi);
>>> +       printf("\tbclp:\t0x%08x\n", asle->bclp);
>>> +       printf("\tpfit:\t0x%08x\n", asle->pfit);
>>> +       printf("\tcblv:\t0x%08x\n", asle->cblv);
>>> +
>>> +       printf("\tbclm:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(asle->bclm); i++)
>>> +               printf("\t\tbclm[%d]:\t0x%04x\n", i, asle->bclm[i]);
>>> +
>>> +       printf("\tcpfm:\t0x%08x\n", asle->cpfm);
>>> +       printf("\tepfm:\t0x%08x\n", asle->epfm);
>>> +
>>> +       printf("\tplut header:\t0x%02x\n", asle->plut_header);
>>> +
>>> +       printf("\tplut identifier:");
>>> +       for (i = 0; i < ARRAY_SIZE(asle->plut_identifier); i++)
>>> +               printf(" %02x", asle->plut_identifier[i]);
>>> +       printf("\n");
>>> +
>>> +       printf("\tplut:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(asle->plut); i++) {
>>> +               const int COLUMNS = 7;
>>> +
>>> +               if (i % COLUMNS == 0)
>>> +                       printf("\t\tplut[%d]:\t", i / COLUMNS);
>>> +
>>> +               printf("%02x ", asle->plut[i]);
>>> +
>>> +               if (i % COLUMNS == COLUMNS - 1)
>>> +                       printf("\n");
>>> +       }
>>> +
>>> +       printf("\tpfmb:\t0x%08x\n", asle->pfmb);
>>> +       printf("\tccdv:\t0x%08x\n", asle->ccdv);
>>> +       printf("\tpcft:\t0x%08x\n", asle->pcft);
>>> +       printf("\tsrot:\t0x%08x\n", asle->srot);
>>> +       printf("\tiuer:\t0x%08x\n", asle->iuer);
>>> +
>>> +       printf("\tfdss:\t");
>>> +       for (i = 0; i < ARRAY_SIZE(asle->fdss); i++)
>>> +               printf("%02x ", asle->fdss[i]);
>>> +       printf("\n");
>>> +
>>> +       printf("\tfdsp:\t0x%08x\n", asle->fdsp);
>>> +       printf("\tstat:\t0x%08x\n", asle->stat);
>>> +
>>> +       printf("\n");
>>> +}
>>> +
>>> +static void decode_vbt(const void *buffer)
>>> +{
>>> +       const struct opregion_vbt *vbt = buffer;
>>> +       char *s;
>>> +
>>> +       printf("OpRegion Mailbox 4: Video BIOS Table (VBT):\n");
>>> +
>>> +       s = strndup(vbt->product_string, sizeof(vbt->product_string));
>>> +       printf("\tproduct string:\t%s\n", s);
>>> +       free(s);
>>> +
>>> +       printf("\t(use intel_bios_reader to decode the VBT)\n");
>>> +
>>> +       printf("\n");
>>> +}
>>> +
>>> +static void decode_asle_ext(const void *buffer)
>>> +{
>>> +       const struct opregion_asle_ext *asle_ext = buffer;
>>> +       int i;
>>> +
>>> +       printf("OpRegion Mailbox 5: BIOS to Driver Notification Extension:\n");
>>> +
>>> +       printf("\tphed:\t0x%08x\n", asle_ext->phed);
>>> +
>>> +       printf("\tbddc:\n");
>>> +       for (i = 0; i < ARRAY_SIZE(asle_ext->bddc); i++) {
>>> +               const int COLUMNS = 16;
>>> +
>>> +               if (i % COLUMNS == 0)
>>> +                       printf("\t\tbddc[0x%02x]:\t", i);
>>> +
>>> +               printf("%02x ", asle_ext->bddc[i]);
>>> +
>>> +               if (i % COLUMNS == COLUMNS - 1)
>>> +                       printf("\n");
>>> +       }
>>> +
>>> +       printf("\n");
>>> +}
>>> +
>>> +static void decode_opregion(const uint8_t *opregion, int size)
>>> +{
>>> +       uint32_t mbox;
>>> +
>>> +       /* XXX: allow decoding up to size */
>>> +       if (OPREGION_ASLE_EXT_OFFSET + sizeof(struct opregion_asle_ext) > size) {
>>> +               fprintf(stderr, "buffer too small\n");
>>> +               return;
>>> +       }
>>> +
>>> +       mbox = decode_header(opregion + OPREGION_HEADER_OFFSET);
>>> +       if (mbox & MBOX_ACPI)
>>> +               decode_acpi(opregion + OPREGION_ACPI_OFFSET);
>>> +       if (mbox & MBOX_SWSCI)
>>> +               decode_swsci(opregion + OPREGION_SWSCI_OFFSET);
>>> +       if (mbox & MBOX_ASLE)
>>> +               decode_asle(opregion + OPREGION_ASLE_OFFSET);
>>> +       if (mbox & MBOX_VBT)
>>> +               decode_vbt(opregion + OPREGION_VBT_OFFSET);
>>> +       if (mbox & MBOX_ASLE_EXT)
>>> +               decode_asle_ext(opregion + OPREGION_ASLE_EXT_OFFSET);
>>> +}
>>> +
>>> +int main(int argc, char *argv[])
>>> +{
>>> +       const char *filename = "/sys/kernel/debug/dri/0/i915_opregion";
>>> +       int fd;
>>> +       struct stat finfo;
>>> +       uint8_t *opregion;
>>> +       int c, option_index = 0;
>>> +
>>> +       static struct option long_options[] = {
>>> +               { "file", required_argument, 0, 'f' },
>>> +               { "help", no_argument, 0, 'h' },
>>> +               { 0 },
>>> +       };
>>> +
>>> +       while ((c = getopt_long(argc, argv, "hf:",
>>> +                               long_options, &option_index)) != -1) {
>>> +               switch (c) {
>>> +               case 'h':
>>> +                       printf("usage: intel_opregion_decode [-f|--file=<input>]\n");
>>> +                       return 0;
>>> +               case 'f':
>>> +                       filename = optarg;
>>> +                       break;
>>> +               default:
>>> +                       fprintf(stderr, "unkown command options\n");
>>> +                       return 1;
>>> +               }
>>> +       }
>>> +
>>> +       fd = open(filename, O_RDONLY);
>>> +       if (fd == -1) {
>>> +               printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
>>> +               return 1;
>>> +       }
>>> +
>>> +       if (stat(filename, &finfo)) {
>>> +               printf("failed to stat \"%s\": %s\n", filename, strerror(errno));
>>> +               return 1;
>>> +       }
>>> +
>>> +       if (finfo.st_size == 0) {
>>> +               int len = 0, ret;
>>> +               finfo.st_size = 8192;
>>> +               opregion = malloc(finfo.st_size);
>>> +               while ((ret = read(fd, opregion + len, finfo.st_size - len))) {
>>> +                       if (ret < 0) {
>>> +                               printf("failed to read \"%s\": %s\n", filename,
>>> +                                      strerror(errno));
>>> +                               return 1;
>>> +                       }
>>> +
>>> +                       len += ret;
>>> +                       if (len == finfo.st_size) {
>>> +                               finfo.st_size *= 2;
>>> +                               opregion = realloc(opregion, finfo.st_size);
>>> +                       }
>>> +               }
>>> +       } else {
>>> +               opregion = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED,
>>> +                               fd, 0);
>>> +               if (opregion == MAP_FAILED) {
>>> +                       printf("failed to map \"%s\": %s\n", filename,
>>> +                              strerror(errno));
>>> +                       return 1;
>>> +               }
>>> +       }
>>> +
>>> +       decode_opregion(opregion, finfo.st_size);
>>> +
>>> +       return 0;
>>> +}
>>> --
>>> 1.7.10.4
>>>
>>> _______________________________________________
>>> Intel-gfx mailing list
>>> Intel-gfx@lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>>
>> Thanks
>>
>> --
>> Rodrigo Vivi
>> Blog: http://blog.vivi.eng.br
>
> --
> Jani Nikula, Intel Open Source Technology Center



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-10-21 11:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-08 18:18 [IGT PATCH 0/2] intel_opregion_decode Jani Nikula
2013-10-08 18:18 ` [IGT PATCH 1/2] intel_opregion_decode: new tool for decoding graphics opregion Jani Nikula
2013-10-17 11:41   ` Rodrigo Vivi
2013-10-18  9:08     ` Jani Nikula
2013-10-21 11:46       ` Rodrigo Vivi
2013-10-08 18:18 ` [IGT PATCH 2/2] intel_opregion_decode: decipher bclm table Jani Nikula

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox