[coreboot-gerrit] Patch set updated for coreboot: lib/reg_script: Add display support
Leroy P Leahy (leroy.p.leahy@intel.com)
gerrit at coreboot.org
Tue May 3 23:01:19 CEST 2016
Leroy P Leahy (leroy.p.leahy at intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/14553
-gerrit
commit 4532dff6405db85ee822995417b54c607f77ec47
Author: Lee Leahy <leroy.p.leahy at intel.com>
Date: Fri Apr 29 15:07:19 2016 -0700
lib/reg_script: Add display support
Add the ability to enable the display of the script:
* Added REG_SCRIPT_COMMAND_DISPLAY to enable and disable display output
* Added context values to manage display support
* display_state - Updated by the command to enable or disable display
* display_features - May be updated by step routine to control what
the step displays for register and value
* display_prefix - Prefix to display before register data
* Added REG_SCRIPT_DISPLAY_ON and REG_SCRIPT_DISPLAY_OFF macros to
control the display from the register script
* Added REG_SCRIPT_DISPLAY_REGISTER and REG_SCRIPT_DISPLAY_VALUE as
two features of the common display. With these features enabled
the following is output:
* Write: <optional prefix> register <-- value
* Read: <optional prefix> register --> value
TEST=Build and run on Galileo Gen2
Change-Id: If0d4d61ed8ef48ec20082b327f358fd1987e3fb9
Signed-off-by: Lee Leahy <leroy.p.leahy at intel.com>
---
src/include/reg_script.h | 22 +++++++++++
src/lib/reg_script.c | 97 ++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 108 insertions(+), 11 deletions(-)
diff --git a/src/include/reg_script.h b/src/include/reg_script.h
index da01481..d7ed326 100644
--- a/src/include/reg_script.h
+++ b/src/include/reg_script.h
@@ -47,6 +47,10 @@ enum {
REG_SCRIPT_COMMAND_POLL,
REG_SCRIPT_COMMAND_SET_DEV,
REG_SCRIPT_COMMAND_NEXT,
+ REG_SCRIPT_COMMAND_DISPLAY,
+
+ /* Insert new types above this comment */
+
REG_SCRIPT_COMMAND_END,
};
@@ -92,6 +96,9 @@ struct reg_script_context {
device_t dev;
struct resource *res;
const struct reg_script *step;
+ uint8_t display_state; /* Only modified by reg_script_run_step */
+ uint8_t display_features; /* Step routine modifies to control display */
+ const char *display_prefix; /* Prefix tag to display */
};
struct reg_script_bus_entry {
@@ -132,6 +139,21 @@ struct reg_script_bus_entry {
.res_index = res_index_, \
}
+/* Display control */
+#define REG_SCRIPT_DISPLAY_ALL 0xff
+#define REG_SCRIPT_DISPLAY_REGISTER 0x02
+#define REG_SCRIPT_DISPLAY_VALUE 0x01
+#define REG_SCRIPT_DISPLAY_NOTHING 0
+
+#define REG_SCRIPT_DISPLAY_OFF \
+ { .command = REG_SCRIPT_COMMAND_DISPLAY, \
+ .value = REG_SCRIPT_DISPLAY_NOTHING, \
+ }
+#define REG_SCRIPT_DISPLAY_ON \
+ { .command = REG_SCRIPT_COMMAND_DISPLAY, \
+ .value = REG_SCRIPT_DISPLAY_ALL, \
+ }
+
/*
* PCI
*/
diff --git a/src/lib/reg_script.c b/src/lib/reg_script.c
index 9e20134..ee26dc3 100644
--- a/src/lib/reg_script.c
+++ b/src/lib/reg_script.c
@@ -418,21 +418,34 @@ static const struct reg_script_bus_entry
static uint64_t reg_script_read(struct reg_script_context *ctx)
{
const struct reg_script *step = reg_script_get_step(ctx);
+ uint64_t value = 0;
switch (step->type) {
case REG_SCRIPT_TYPE_PCI:
- return reg_script_read_pci(ctx);
+ ctx->display_prefix = "PCI: ";
+ value = reg_script_read_pci(ctx);
+ break;
case REG_SCRIPT_TYPE_IO:
- return reg_script_read_io(ctx);
+ ctx->display_prefix = "IO: ";
+ value = reg_script_read_io(ctx);
+ break;
case REG_SCRIPT_TYPE_MMIO:
- return reg_script_read_mmio(ctx);
+ ctx->display_prefix = "MMIO: ";
+ value = reg_script_read_mmio(ctx);
+ break;
case REG_SCRIPT_TYPE_RES:
- return reg_script_read_res(ctx);
+ ctx->display_prefix = "RES: ";
+ value = reg_script_read_res(ctx);
+ break;
case REG_SCRIPT_TYPE_MSR:
- return reg_script_read_msr(ctx);
+ ctx->display_prefix = "MSR: ";
+ value = reg_script_read_msr(ctx);
+ break;
#if HAS_IOSF
case REG_SCRIPT_TYPE_IOSF:
- return reg_script_read_iosf(ctx);
+ ctx->display_prefix = "IOSF: ";
+ value = reg_script_read_iosf(ctx);
+ break;
#endif /* HAS_IOSF */
default:
{
@@ -441,38 +454,70 @@ static uint64_t reg_script_read(struct reg_script_context *ctx)
/* Read from the platform specific bus */
bus = find_bus(step);
if (NULL != bus)
- return bus->reg_script_read(ctx);
+ value = bus->reg_script_read(ctx);
+ break;
}
printk(BIOS_ERR,
"Unsupported read type (0x%x) for this device!\n",
step->type);
- break;
+ return 0;
}
- return 0;
+
+ /* Display the register address and data */
+ if (ctx->display_features) {
+ if (ctx->display_prefix != NULL)
+ printk(BIOS_INFO, "%s", ctx->display_prefix);
+ if (ctx->display_features & REG_SCRIPT_DISPLAY_REGISTER)
+ printk(BIOS_INFO, "0x%08x --> ", step->reg);
+ if (ctx->display_features & REG_SCRIPT_DISPLAY_VALUE)
+ switch (step->size) {
+ case REG_SCRIPT_SIZE_8:
+ printk(BIOS_INFO, "0x%02x\n", (uint8_t)value);
+ break;
+ case REG_SCRIPT_SIZE_16:
+ printk(BIOS_INFO, "0x%04x\n", (int16_t)value);
+ break;
+ case REG_SCRIPT_SIZE_32:
+ printk(BIOS_INFO, "0x%08x\n", (uint32_t)value);
+ break;
+ default:
+ printk(BIOS_INFO, "0x%016llx\n", value);
+ break;
+ }
+ }
+
+ return value;
}
static void reg_script_write(struct reg_script_context *ctx)
{
const struct reg_script *step = reg_script_get_step(ctx);
+ uint64_t value;
switch (step->type) {
case REG_SCRIPT_TYPE_PCI:
+ ctx->display_prefix = "PCI: ";
reg_script_write_pci(ctx);
break;
case REG_SCRIPT_TYPE_IO:
+ ctx->display_prefix = "IO: ";
reg_script_write_io(ctx);
break;
case REG_SCRIPT_TYPE_MMIO:
+ ctx->display_prefix = "MMIO: ";
reg_script_write_mmio(ctx);
break;
case REG_SCRIPT_TYPE_RES:
+ ctx->display_prefix = "RES: ";
reg_script_write_res(ctx);
break;
case REG_SCRIPT_TYPE_MSR:
+ ctx->display_prefix = "MSR: ";
reg_script_write_msr(ctx);
break;
#if HAS_IOSF
case REG_SCRIPT_TYPE_IOSF:
+ ctx->display_prefix = "IOSF: ";
reg_script_write_iosf(ctx);
break;
#endif /* HAS_IOSF */
@@ -484,13 +529,37 @@ static void reg_script_write(struct reg_script_context *ctx)
bus = find_bus(step);
if (NULL != bus) {
bus->reg_script_write(ctx);
- return;
+ break;
}
}
printk(BIOS_ERR,
"Unsupported write type (0x%x) for this device!\n",
step->type);
- break;
+ return;
+ }
+
+ /* Display the register address and data */
+ if (ctx->display_features) {
+ if (ctx->display_prefix != NULL)
+ printk(BIOS_INFO, "%s", ctx->display_prefix);
+ if (ctx->display_features & REG_SCRIPT_DISPLAY_REGISTER)
+ printk(BIOS_INFO, "0x%08x <-- ", step->reg);
+ value = step->value;
+ if (ctx->display_features & REG_SCRIPT_DISPLAY_VALUE)
+ switch (step->size) {
+ case REG_SCRIPT_SIZE_8:
+ printk(BIOS_INFO, "0x%02x\n", (uint8_t)value);
+ break;
+ case REG_SCRIPT_SIZE_16:
+ printk(BIOS_INFO, "0x%04x\n", (uint16_t)value);
+ break;
+ case REG_SCRIPT_SIZE_32:
+ printk(BIOS_INFO, "0x%08x\n", (uint32_t)value);
+ break;
+ default:
+ printk(BIOS_INFO, "0x%016llx\n", value);
+ break;
+ }
}
}
@@ -557,6 +626,8 @@ static void reg_script_run_step(struct reg_script_context *ctx,
{
uint64_t value = 0, try;
+ ctx->display_features = ctx->display_state;
+ ctx->display_prefix = NULL;
switch (step->command) {
case REG_SCRIPT_COMMAND_READ:
(void)reg_script_read(ctx);
@@ -589,6 +660,10 @@ static void reg_script_run_step(struct reg_script_context *ctx,
case REG_SCRIPT_COMMAND_NEXT:
reg_script_run_next(ctx, step->next);
break;
+ case REG_SCRIPT_COMMAND_DISPLAY:
+ ctx->display_state = step->value;
+ break;
+
default:
printk(BIOS_WARNING, "Invalid command: %08x\n",
step->command);
More information about the coreboot-gerrit
mailing list