Hello Patrick Rudolph,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/32868
to review the following change.
Change subject: device_tree: Make FDT property data non-const
......................................................................
device_tree: Make FDT property data non-const
FDT property data should not be const -- sometimes we need to update it,
for example when fixing up phandles in an overlay. On the other hand
it's occasionally desirable to put a string constant in there without
having to strdup() it all the time... let's just live with the tiny
implicit assumption that the data we'd want to modify (phandle
references, mostly) will never be added from string constants, and put a
cast in dt_add_string_prop().
Change-Id: Ifac103fcff0520cc427ab9a2aa141c65e12507ac
Signed-off-by: Julius Werner <jwerner(a)chromium.org>
---
M src/include/device_tree.h
M src/lib/device_tree.c
2 files changed, 4 insertions(+), 4 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/68/32868/1
diff --git a/src/include/device_tree.h b/src/include/device_tree.h
index e3723c8..d9d9613 100644
--- a/src/include/device_tree.h
+++ b/src/include/device_tree.h
@@ -52,7 +52,7 @@
struct fdt_property
{
const char *name;
- const void *data;
+ void *data;
uint32_t size;
};
@@ -165,7 +165,7 @@
void dt_delete_prop(struct device_tree_node *node, const char *name);
// Add different kinds of properties to a node, or update existing ones.
void dt_add_bin_prop(struct device_tree_node *node, const char *name,
- const void *data, size_t size);
+ void *data, size_t size);
void dt_add_string_prop(struct device_tree_node *node, const char *name,
const char *str);
void dt_add_u32_prop(struct device_tree_node *node, const char *name, u32 val);
diff --git a/src/lib/device_tree.c b/src/lib/device_tree.c
index 3c4bd24..a5021ca 100644
--- a/src/lib/device_tree.c
+++ b/src/lib/device_tree.c
@@ -883,7 +883,7 @@
* @param size The size of data in bytes.
*/
void dt_add_bin_prop(struct device_tree_node *node, const char *name,
- const void *data, size_t size)
+ void *data, size_t size)
{
struct device_tree_property *prop;
@@ -955,7 +955,7 @@
void dt_add_string_prop(struct device_tree_node *node, const char *name,
const char *str)
{
- dt_add_bin_prop(node, name, str, strlen(str) + 1);
+ dt_add_bin_prop(node, name, (char *)str, strlen(str) + 1);
}
/*
--
To view, visit https://review.coreboot.org/c/coreboot/+/32868
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Ifac103fcff0520cc427ab9a2aa141c65e12507ac
Gerrit-Change-Number: 32868
Gerrit-PatchSet: 1
Gerrit-Owner: Julius Werner <jwerner(a)chromium.org>
Gerrit-Reviewer: Patrick Rudolph <patrick.rudolph(a)9elements.com>
Gerrit-MessageType: newchange
Hello Patrick Rudolph,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/32865
to review the following change.
Change subject: device_tree: Have absolute paths start with '/'
......................................................................
device_tree: Have absolute paths start with '/'
Currently DT paths are *not* expected to start with '/'. This is not
what the spec says (see Devicetree Specification v0.2, 2.2.3 Path Names)
and also not what is done by Linux.
Change dt_find_node_by_path() to expect paths to start with '/' and add
a leading '/' to all DT path strings. Besides the compatibility with the
spec this change is also needed to support aliases in the future.
This patch was adapted from depthcharge's http://crosreview.com/1252770
Change-Id: Ibdf59ccbb4ead38c6193b630642fd1f1e847dd89
Signed-off-by: Julius Werner <jwerner(a)chromium.org>
---
M src/lib/device_tree.c
M src/soc/cavium/cn81xx/soc.c
2 files changed, 9 insertions(+), 9 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/65/32865/1
diff --git a/src/lib/device_tree.c b/src/lib/device_tree.c
index 3e1dd35..e26021e 100644
--- a/src/lib/device_tree.c
+++ b/src/lib/device_tree.c
@@ -556,7 +556,7 @@
*
* @param tree The device tree to search.
* @param path A string representing a path in the device tree, with
- * nodes separated by '/'. Example: "soc/firmware/coreboot"
+ * nodes separated by '/'. Example: "/firmware/coreboot"
* @param addrcp Pointer that will be updated with any #address-cells
* value found in the path. May be NULL to ignore.
* @param sizecp Pointer that will be updated with any #size-cells
@@ -565,13 +565,13 @@
* @return The found/created node, or NULL.
*
* It is the caller responsibility to provide the correct path string, namely
- * not starting or ending with a '/', and not having "//" anywhere in it.
+ * starting with a '/', not ending in a '/' and not having "//" anywhere in it.
*/
struct device_tree_node *dt_find_node_by_path(struct device_tree *tree,
const char *path, u32 *addrcp,
u32 *sizecp, int create)
{
- char *dup_path = strdup(path);
+ char *dup_path = strdup(&path[1]); /* remove leading '/' */
/* Hopefully enough depth for any node. */
const char *path_array[15];
int i;
@@ -995,7 +995,7 @@
struct device_tree_node *reserved;
u32 addr = 0, size = 0;
- reserved = dt_find_node_by_path(tree, "reserved-memory", &addr,
+ reserved = dt_find_node_by_path(tree, "/reserved-memory", &addr,
&size, 1);
if (!reserved)
return NULL;
diff --git a/src/soc/cavium/cn81xx/soc.c b/src/soc/cavium/cn81xx/soc.c
index 20542e5..efe7d6d 100644
--- a/src/soc/cavium/cn81xx/soc.c
+++ b/src/soc/cavium/cn81xx/soc.c
@@ -185,7 +185,7 @@
size_t i;
/* Set the sclk clock rate. */
- dt_node = dt_find_node_by_path(tree, "soc@0/sclk", NULL, NULL, 0);
+ dt_node = dt_find_node_by_path(tree, "/soc@0/sclk", NULL, NULL, 0);
if (dt_node) {
const u32 freq = thunderx_get_io_clock();
printk(BIOS_INFO, "%s: Set SCLK to %u Hz\n", __func__, freq);
@@ -195,7 +195,7 @@
__func__);
/* Set refclkuaa clock rate. */
- dt_node = dt_find_node_by_path(tree, "soc@0/refclkuaa", NULL,
+ dt_node = dt_find_node_by_path(tree, "/soc@0/refclkuaa", NULL,
NULL, 0);
if (dt_node) {
const u32 freq = uart_platform_refclk();
@@ -211,7 +211,7 @@
char path[32];
const uint64_t addr = UAAx_PF_BAR0(i);
/* Remove the node */
- snprintf(path, sizeof(path), "soc@0/serial@%llx", addr);
+ snprintf(path, sizeof(path), "/soc@0/serial@%llx", addr);
dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node || uart_is_enabled(i)) {
printk(BIOS_INFO, "%s: ignoring %s\n", __func__, path);
@@ -227,7 +227,7 @@
u32 phandle = 0;
const uint64_t addr = PEM_PEMX_PF_BAR0(i);
/* Remove the node */
- snprintf(path, sizeof(path), "soc@0/pci@%llx", addr);
+ snprintf(path, sizeof(path), "/soc@0/pci@%llx", addr);
dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node || bdk_pcie_is_running(0, i)) {
printk(BIOS_INFO, "%s: ignoring %s\n", __func__, path);
@@ -239,7 +239,7 @@
list_remove(&dt_node->list_node);
/* Remove phandle to non existing nodes */
- snprintf(path, sizeof(path), "soc@0/smmu0@%llx", SMMU_PF_BAR0);
+ snprintf(path, sizeof(path), "/soc@0/smmu0@%llx", SMMU_PF_BAR0);
dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node) {
printk(BIOS_ERR, "%s: SMMU entry not found\n",
--
To view, visit https://review.coreboot.org/c/coreboot/+/32865
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Ibdf59ccbb4ead38c6193b630642fd1f1e847dd89
Gerrit-Change-Number: 32865
Gerrit-PatchSet: 1
Gerrit-Owner: Julius Werner <jwerner(a)chromium.org>
Gerrit-Reviewer: Patrick Rudolph <patrick.rudolph(a)9elements.com>
Gerrit-MessageType: newchange
Hello Patrick Rudolph,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/32864
to review the following change.
Change subject: device_tree: Drop sub-node path lookup from dt_find_node_by_path()
......................................................................
device_tree: Drop sub-node path lookup from dt_find_node_by_path()
Besides looking up a node with an absolute path dt_find_node_by_path()
currently also supports finding a sub-node of a non-root node. All
callers of the function pass the root node though, so it seems there
is no real need for this functionality. Also it is planned to support
DT path names with aliases, which would become messy in combination with
the lookup from a sub-node.
Change the interface of dt_find_node_by_path() to receive the DT tree
object instead of a parent node and adapt all callers accordingly.
This patch was adapted from depthcharge's http://crosreview.com/1252769
Change-Id: Iff56be4da2461ae73a7301dcaa315758d2a8c999
Signed-off-by: Julius Werner <jwerner(a)chromium.org>
---
M src/include/device_tree.h
M src/lib/device_tree.c
M src/soc/cavium/cn81xx/soc.c
3 files changed, 14 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/64/32864/1
diff --git a/src/include/device_tree.h b/src/include/device_tree.h
index 8280dad..6eaeacd 100644
--- a/src/include/device_tree.h
+++ b/src/include/device_tree.h
@@ -142,10 +142,10 @@
u32 *addrcp, u32 *sizecp, int create);
struct device_tree_node *dt_find_node_by_phandle(struct device_tree_node *root,
uint32_t phandle);
-// Look up or create a node relative to a parent node, through its path
+// Look up or create a node in the tree, through its path
// represented as a string of '/' separated node names.
-struct device_tree_node *dt_find_node_by_path(struct device_tree_node *parent, const char *path,
- u32 *addrcp, u32 *sizecp, int create);
+struct device_tree_node *dt_find_node_by_path(struct device_tree *tree,
+ const char *path, u32 *addrcp, u32 *sizecp, int create);
// Look up a node relative to a parent node, through its compatible string.
struct device_tree_node *dt_find_compat(struct device_tree_node *parent, const char *compatible);
// Look up the next child of a parent node, through its compatible string. It
diff --git a/src/lib/device_tree.c b/src/lib/device_tree.c
index 44eca4e..3e1dd35 100644
--- a/src/lib/device_tree.c
+++ b/src/lib/device_tree.c
@@ -552,9 +552,9 @@
}
/*
- * Find a node from a string device tree path, relative to a parent node.
+ * Find a node in the tree from a string device tree path.
*
- * @param parent The node from which to start the relative path lookup.
+ * @param tree The device tree to search.
* @param path A string representing a path in the device tree, with
* nodes separated by '/'. Example: "soc/firmware/coreboot"
* @param addrcp Pointer that will be updated with any #address-cells
@@ -567,7 +567,7 @@
* It is the caller responsibility to provide the correct path string, namely
* not starting or ending with a '/', and not having "//" anywhere in it.
*/
-struct device_tree_node *dt_find_node_by_path(struct device_tree_node *parent,
+struct device_tree_node *dt_find_node_by_path(struct device_tree *tree,
const char *path, u32 *addrcp,
u32 *sizecp, int create)
{
@@ -595,7 +595,7 @@
if (!next_slash) {
path_array[i] = NULL;
- node = dt_find_node(parent, path_array,
+ node = dt_find_node(tree->root, path_array,
addrcp, sizecp, create);
}
@@ -965,7 +965,7 @@
*prop_name++ = '\0'; /* Separate path from the property name. */
- dt_node = dt_find_node_by_path(tree->root, path_copy, NULL,
+ dt_node = dt_find_node_by_path(tree, path_copy, NULL,
NULL, create);
if (!dt_node) {
@@ -995,7 +995,7 @@
struct device_tree_node *reserved;
u32 addr = 0, size = 0;
- reserved = dt_find_node_by_path(tree->root, "reserved-memory", &addr,
+ reserved = dt_find_node_by_path(tree, "reserved-memory", &addr,
&size, 1);
if (!reserved)
return NULL;
diff --git a/src/soc/cavium/cn81xx/soc.c b/src/soc/cavium/cn81xx/soc.c
index 0500749..20542e5 100644
--- a/src/soc/cavium/cn81xx/soc.c
+++ b/src/soc/cavium/cn81xx/soc.c
@@ -185,7 +185,7 @@
size_t i;
/* Set the sclk clock rate. */
- dt_node = dt_find_node_by_path(tree->root, "soc@0/sclk", NULL, NULL, 0);
+ dt_node = dt_find_node_by_path(tree, "soc@0/sclk", NULL, NULL, 0);
if (dt_node) {
const u32 freq = thunderx_get_io_clock();
printk(BIOS_INFO, "%s: Set SCLK to %u Hz\n", __func__, freq);
@@ -195,7 +195,7 @@
__func__);
/* Set refclkuaa clock rate. */
- dt_node = dt_find_node_by_path(tree->root, "soc@0/refclkuaa", NULL,
+ dt_node = dt_find_node_by_path(tree, "soc@0/refclkuaa", NULL,
NULL, 0);
if (dt_node) {
const u32 freq = uart_platform_refclk();
@@ -212,7 +212,7 @@
const uint64_t addr = UAAx_PF_BAR0(i);
/* Remove the node */
snprintf(path, sizeof(path), "soc@0/serial@%llx", addr);
- dt_node = dt_find_node_by_path(tree->root, path, NULL, NULL, 0);
+ dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node || uart_is_enabled(i)) {
printk(BIOS_INFO, "%s: ignoring %s\n", __func__, path);
continue;
@@ -228,7 +228,7 @@
const uint64_t addr = PEM_PEMX_PF_BAR0(i);
/* Remove the node */
snprintf(path, sizeof(path), "soc@0/pci@%llx", addr);
- dt_node = dt_find_node_by_path(tree->root, path, NULL, NULL, 0);
+ dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node || bdk_pcie_is_running(0, i)) {
printk(BIOS_INFO, "%s: ignoring %s\n", __func__, path);
continue;
@@ -240,7 +240,7 @@
/* Remove phandle to non existing nodes */
snprintf(path, sizeof(path), "soc@0/smmu0@%llx", SMMU_PF_BAR0);
- dt_node = dt_find_node_by_path(tree->root, path, NULL, NULL, 0);
+ dt_node = dt_find_node_by_path(tree, path, NULL, NULL, 0);
if (!dt_node) {
printk(BIOS_ERR, "%s: SMMU entry not found\n",
__func__);
--
To view, visit https://review.coreboot.org/c/coreboot/+/32864
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Iff56be4da2461ae73a7301dcaa315758d2a8c999
Gerrit-Change-Number: 32864
Gerrit-PatchSet: 1
Gerrit-Owner: Julius Werner <jwerner(a)chromium.org>
Gerrit-Reviewer: Patrick Rudolph <patrick.rudolph(a)9elements.com>
Gerrit-MessageType: newchange
Paul Menzel has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/32951
Change subject: libpayload: Reset PS/2 keyboard
......................................................................
libpayload: Reset PS/2 keyboard
Loading a libpayload based payload like coreinfo or FILO from SeaBIOS
pressing keys does not give the expected results.
For example, pressing F1 gives the character 24 translated to scan code
6a. ESC for example 43 (111).
The problem is not reproducible using the payload directly, that means
without SeaBIOS. The problem seems to be, that SeaBIOS already
initializes the PS/2 controller and AT keyboard.
Comparing it with coreboot’s PS/2 keyboard code, the keyboard needs to
be reset. That seems to fix the issue, when the keyboard was initialized
before.
TEST=Build coreboot for QEMU Q35 with SeaBIOS, and coreinfo as secondary
payload. Run
qemu-system-i386 -M q35 -L /dev/shm -bios build/coreboot.rom -serial stdio
press 3 to select the coreinfo payload, and verify that the keys F1 and
F2 are working.
Change-Id: I2732292ac316d4bc0029ecb5c95fa7d1e7d68947
Signed-off-by: Paul Menzel <pmenzel(a)molgen.mpg.de>
---
M payloads/libpayload/drivers/i8042/i8042.h
M payloads/libpayload/drivers/i8042/keyboard.c
2 files changed, 8 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/51/32951/1
diff --git a/payloads/libpayload/drivers/i8042/i8042.h b/payloads/libpayload/drivers/i8042/i8042.h
index 643167e..e864ac9 100644
--- a/payloads/libpayload/drivers/i8042/i8042.h
+++ b/payloads/libpayload/drivers/i8042/i8042.h
@@ -63,6 +63,7 @@
#define I8042_KBCMD_EN 0xf4
#define I8042_KBCMD_DEFAULT_DIS 0xf5
#define I8042_KBCMD_SET_DEFAULT 0xf6
+#define I8042_KBCMD_ACK 0xfa
#define I8042_KBCMD_RESEND 0xfe
#define I8042_KBCMD_RESET 0xff
diff --git a/payloads/libpayload/drivers/i8042/keyboard.c b/payloads/libpayload/drivers/i8042/keyboard.c
index cded638..fea9e71 100644
--- a/payloads/libpayload/drivers/i8042/keyboard.c
+++ b/payloads/libpayload/drivers/i8042/keyboard.c
@@ -317,6 +317,13 @@
/* Enable first PS/2 port */
i8042_cmd(I8042_CMD_EN_KB);
+ /* Reset keyboard and self test (keyboard side) */
+ ret = keyboard_cmd(I8042_KBCMD_RESET);
+ if (ret != I8042_KBCMD_ACK) {
+ printf("ERROR: Keyboard reset failed ACK: 0x%x\n", ret);
+ return;
+ }
+
/* Set scancode set 1 */
ret = keyboard_cmd(I8042_KBCMD_SET_SCANCODE);
if (!ret && !CONFIG(LP_PC_KEYBOARD_IGNORE_INIT_FAILURE))
--
To view, visit https://review.coreboot.org/c/coreboot/+/32951
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I2732292ac316d4bc0029ecb5c95fa7d1e7d68947
Gerrit-Change-Number: 32951
Gerrit-PatchSet: 1
Gerrit-Owner: Paul Menzel <paulepanter(a)users.sourceforge.net>
Gerrit-MessageType: newchange