dm: core: Update ofnode to read binman-style flash entry

At present ofnode_read_fmap_entry() reads a flash map entry in a format
which is not supported by binman. To allow use to use binman-format
descriptions, update this function.

Also add a simple test.

Signed-off-by: Simon Glass <sjg@chromium.org>
lime2-spi
Simon Glass 6 years ago
parent cdb6aa0afb
commit e6c5c94a79
  1. 20
      arch/sandbox/dts/sandbox.dts
  2. 20
      arch/sandbox/dts/sandbox64.dts
  3. 29
      arch/sandbox/dts/test.dts
  4. 27
      drivers/core/of_extra.c
  5. 11
      drivers/misc/cros_ec.c
  6. 3
      include/dm/of_extra.h
  7. 16
      test/dm/ofnode.c

@ -18,7 +18,7 @@
stdout-path = "/serial";
};
cros_ec: cros-ec@0 {
cros_ec: cros-ec {
reg = <0 0>;
compatible = "google,cros-ec-sandbox";
@ -26,23 +26,23 @@
* This describes the flash memory within the EC. Note
* that the STM32L flash erases to 0, not 0xff.
*/
#address-cells = <1>;
#size-cells = <1>;
flash@8000000 {
reg = <0x08000000 0x20000>;
flash {
image-pos = <0x08000000>;
size = <0x20000>;
erase-value = <0>;
#address-cells = <1>;
#size-cells = <1>;
/* Information for sandbox */
ro {
reg = <0 0xf000>;
image-pos = <0>;
size = <0xf000>;
};
wp-ro {
reg = <0xf000 0x1000>;
image-pos = <0xf000>;
size = <0x1000>;
};
rw {
reg = <0x10000 0x10000>;
image-pos = <0x10000>;
size = <0x10000>;
};
};
};

@ -17,7 +17,7 @@
stdout-path = "/serial";
};
cros_ec: cros-ec@0 {
cros_ec: cros-ec {
reg = <0 0 0 0>;
compatible = "google,cros-ec-sandbox";
@ -25,23 +25,23 @@
* This describes the flash memory within the EC. Note
* that the STM32L flash erases to 0, not 0xff.
*/
#address-cells = <1>;
#size-cells = <1>;
flash@8000000 {
reg = <0x08000000 0x20000>;
flash {
image-pos = <0x08000000>;
size = <0x20000>;
erase-value = <0>;
#address-cells = <1>;
#size-cells = <1>;
/* Information for sandbox */
ro {
reg = <0 0xf000>;
image-pos = <0>;
size = <0xf000>;
};
wp-ro {
reg = <0xf000 0x1000>;
image-pos = <0xf000>;
size = <0x1000>;
};
rw {
reg = <0x10000 0x10000>;
image-pos = <0x10000>;
size = <0x10000>;
};
};
};

@ -40,6 +40,35 @@
osd0 = "/osd";
};
cros_ec: cros-ec {
reg = <0 0>;
compatible = "google,cros-ec-sandbox";
/*
* This describes the flash memory within the EC. Note
* that the STM32L flash erases to 0, not 0xff.
*/
flash {
image-pos = <0x08000000>;
size = <0x20000>;
erase-value = <0>;
/* Information for sandbox */
ro {
image-pos = <0>;
size = <0xf000>;
};
wp-ro {
image-pos = <0xf000>;
size = <0x1000>;
};
rw {
image-pos = <0x10000>;
size = <0x10000>;
};
};
};
a-test {
reg = <0 1>;
compatible = "denx,u-boot-fdt-test";

@ -13,19 +13,30 @@
int ofnode_read_fmap_entry(ofnode node, struct fmap_entry *entry)
{
const char *prop;
u32 reg[2];
if (ofnode_read_u32_array(node, "reg", reg, 2)) {
debug("Node '%s' has bad/missing 'reg' property\n",
if (ofnode_read_u32(node, "image-pos", &entry->offset)) {
debug("Node '%s' has bad/missing 'image-pos' property\n",
ofnode_get_name(node));
return -log_ret(ENOENT);
return log_ret(-ENOENT);
}
if (ofnode_read_u32(node, "size", &entry->length)) {
debug("Node '%s' has bad/missing 'size' property\n",
ofnode_get_name(node));
return log_ret(-ENOENT);
}
entry->offset = reg[0];
entry->length = reg[1];
entry->used = ofnode_read_s32_default(node, "used", entry->length);
prop = ofnode_read_string(node, "compress");
entry->compress_algo = prop && !strcmp(prop, "lzo") ?
FMAP_COMPRESS_LZO : FMAP_COMPRESS_NONE;
if (prop) {
if (!strcmp(prop, "lz4"))
entry->compress_algo = FMAP_COMPRESS_LZ4;
else
return log_msg_ret("Unknown compression algo",
-EINVAL);
} else {
entry->compress_algo = FMAP_COMPRESS_NONE;
}
entry->unc_length = ofnode_read_s32_default(node, "uncomp-size",
entry->length);
prop = ofnode_read_string(node, "hash");
if (prop)
entry->hash_size = strlen(prop);

@ -263,8 +263,8 @@ static int send_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
* @return number of bytes in response, or -ve on error
*/
static int ec_command_inptr(struct cros_ec_dev *dev, uint8_t cmd,
int cmd_version, const void *dout, int dout_len, uint8_t **dinp,
int din_len)
int cmd_version, const void *dout, int dout_len,
uint8_t **dinp, int din_len)
{
uint8_t *din = NULL;
int len;
@ -742,7 +742,8 @@ int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset, uint32_t size)
* @return 0 if ok, -1 on error
*/
static int cros_ec_flash_write_block(struct cros_ec_dev *dev,
const uint8_t *data, uint32_t offset, uint32_t size)
const uint8_t *data, uint32_t offset,
uint32_t size)
{
struct ec_params_flash_write *p;
int ret;
@ -888,8 +889,8 @@ int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset,
return 0;
}
int cros_ec_flash_update_rw(struct cros_ec_dev *dev,
const uint8_t *image, int image_size)
int cros_ec_flash_update_rw(struct cros_ec_dev *dev, const uint8_t *image,
int image_size)
{
uint32_t rw_offset, rw_size;
int ret;

@ -11,7 +11,7 @@
enum fmap_compress_t {
FMAP_COMPRESS_NONE,
FMAP_COMPRESS_LZO,
FMAP_COMPRESS_LZ4,
};
enum fmap_hash_t {
@ -26,6 +26,7 @@ struct fmap_entry {
uint32_t length;
uint32_t used; /* Number of bytes used in region */
enum fmap_compress_t compress_algo; /* Compression type */
uint32_t unc_length; /* Uncompressed length */
enum fmap_hash_t hash_algo; /* Hash algorithm */
const uint8_t *hash; /* Hash value */
int hash_size; /* Hash size */

@ -2,6 +2,7 @@
#include <common.h>
#include <dm.h>
#include <dm/of_extra.h>
#include <dm/test.h>
#include <test/ut.h>
@ -42,3 +43,18 @@ static int dm_test_ofnode_by_prop_value(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_ofnode_by_prop_value, DM_TESTF_SCAN_FDT);
static int dm_test_ofnode_fmap(struct unit_test_state *uts)
{
struct fmap_entry entry;
ofnode node;
node = ofnode_path("/cros-ec/flash");
ut_assert(ofnode_valid(node));
ut_assertok(ofnode_read_fmap_entry(node, &entry));
ut_asserteq(0x08000000, entry.offset);
ut_asserteq(0x20000, entry.length);
return 0;
}
DM_TEST(dm_test_ofnode_fmap, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);

Loading…
Cancel
Save