scripts: imx: support set_bits/clear_bits
The i.MX SoCs support setting bits and clearing bits in their DCD table. This adds commands for these in the imx-image tool. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
76007a8ed4
commit
f1d34c2738
|
@ -30,6 +30,8 @@ check <width> <cond> <addr> <mask> Poll until condition becomes true.
|
|||
while_all_bits_set,
|
||||
while_any_bit_clear,
|
||||
while_any_bit_set
|
||||
set_bits <width> <addr> <bits> set <bits> in register <addr>
|
||||
clear_bits <width> <addr> <bits> clear <bits> in register <addr>
|
||||
|
||||
the i.MX SoCs support a wide range of fancy things doing with the flash header.
|
||||
We limit ourselves to a very simple case, that is the flash header has a fixed
|
||||
|
|
|
@ -252,8 +252,13 @@ static int add_header_v1(struct config_data *data, void *buf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int write_mem_v1(uint32_t addr, uint32_t val, int width)
|
||||
static int write_mem_v1(uint32_t addr, uint32_t val, int width, int set_bits, int clear_bits)
|
||||
{
|
||||
if (set_bits || clear_bits) {
|
||||
fprintf(stderr, "This SoC does not support setting/clearing bits\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (curdcd > MAX_DCD - 3) {
|
||||
fprintf(stderr, "At maximum %d dcd entried are allowed\n", MAX_DCD);
|
||||
return -ENOMEM;
|
||||
|
@ -362,12 +367,20 @@ static void check_last_dcd(uint32_t cmd)
|
|||
}
|
||||
}
|
||||
|
||||
static int write_mem_v2(uint32_t addr, uint32_t val, int width)
|
||||
static int write_mem_v2(uint32_t addr, uint32_t val, int width, int set_bits, int clear_bits)
|
||||
{
|
||||
uint32_t cmd;
|
||||
|
||||
cmd = (TAG_WRITE << 24) | width;
|
||||
|
||||
if (set_bits && clear_bits)
|
||||
return -EINVAL;
|
||||
|
||||
if (set_bits)
|
||||
cmd |= 3 << 3;
|
||||
if (clear_bits)
|
||||
cmd |= 2 << 3;
|
||||
|
||||
if (curdcd > MAX_DCD - 3) {
|
||||
fprintf(stderr, "At maximum %d dcd entried are allowed\n", MAX_DCD);
|
||||
return -ENOMEM;
|
||||
|
@ -449,13 +462,14 @@ static int check(struct config_data *data, uint32_t cmd, uint32_t addr, uint32_t
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int write_mem(struct config_data *data, uint32_t addr, uint32_t val, int width)
|
||||
static int write_mem(struct config_data *data, uint32_t addr, uint32_t val, int width,
|
||||
int set_bits, int clear_bits)
|
||||
{
|
||||
switch (data->header_version) {
|
||||
case 1:
|
||||
return write_mem_v1(addr, val, width);
|
||||
return write_mem_v1(addr, val, width, set_bits, clear_bits);
|
||||
case 2:
|
||||
return write_mem_v2(addr, val, width);
|
||||
return write_mem_v2(addr, val, width, set_bits, clear_bits);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -1203,7 +1203,8 @@ cleanup:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int write_mem(struct config_data *data, uint32_t addr, uint32_t val, int width)
|
||||
static int write_mem(struct config_data *data, uint32_t addr, uint32_t val, int width,
|
||||
int set_bits, int clear_bits)
|
||||
{
|
||||
printf("wr 0x%08x 0x%08x\n", addr, val);
|
||||
|
||||
|
|
|
@ -130,7 +130,8 @@ static int do_cmd_check(struct config_data *data, int argc, char *argv[])
|
|||
return data->check(data, cmd, addr, mask);
|
||||
}
|
||||
|
||||
static int do_cmd_write_mem(struct config_data *data, int argc, char *argv[])
|
||||
static int write_mem(struct config_data *data, int argc, char *argv[],
|
||||
int set_bits, int clear_bits)
|
||||
{
|
||||
uint32_t addr, val, width;
|
||||
char *end;
|
||||
|
@ -170,7 +171,22 @@ static int do_cmd_write_mem(struct config_data *data, int argc, char *argv[])
|
|||
return -EINVAL;
|
||||
};
|
||||
|
||||
return data->write_mem(data, addr, val, width);
|
||||
return data->write_mem(data, addr, val, width, set_bits, clear_bits);
|
||||
}
|
||||
|
||||
static int do_cmd_write_mem(struct config_data *data, int argc, char *argv[])
|
||||
{
|
||||
return write_mem(data, argc, argv, 0, 0);
|
||||
}
|
||||
|
||||
static int do_cmd_set_bits(struct config_data *data, int argc, char *argv[])
|
||||
{
|
||||
return write_mem(data, argc, argv, 1, 0);
|
||||
}
|
||||
|
||||
static int do_cmd_clear_bits(struct config_data *data, int argc, char *argv[])
|
||||
{
|
||||
return write_mem(data, argc, argv, 0, 1);
|
||||
}
|
||||
|
||||
static int do_loadaddr(struct config_data *data, int argc, char *argv[])
|
||||
|
@ -336,6 +352,12 @@ struct command cmds[] = {
|
|||
{
|
||||
.name = "wm",
|
||||
.parse = do_cmd_write_mem,
|
||||
}, {
|
||||
.name = "set_bits",
|
||||
.parse = do_cmd_set_bits,
|
||||
}, {
|
||||
.name = "clear_bits",
|
||||
.parse = do_cmd_clear_bits,
|
||||
}, {
|
||||
.name = "check",
|
||||
.parse = do_cmd_check,
|
||||
|
|
|
@ -31,6 +31,8 @@ struct imx_boot_data {
|
|||
#define TAG_DCD_HEADER 0xd2
|
||||
#define DCD_VERSION 0x40
|
||||
#define TAG_WRITE 0xcc
|
||||
#define PARAMETER_FLAG_MASK (1 << 3)
|
||||
#define PARAMETER_FLAG_SET (1 << 4)
|
||||
#define TAG_CHECK 0xcf
|
||||
|
||||
struct imx_ivt_header {
|
||||
|
@ -64,7 +66,8 @@ struct config_data {
|
|||
int header_version;
|
||||
int cpu_type;
|
||||
int (*check)(struct config_data *data, uint32_t cmd, uint32_t addr, uint32_t mask);
|
||||
int (*write_mem)(struct config_data *data, uint32_t addr, uint32_t val, int width);
|
||||
int (*write_mem)(struct config_data *data, uint32_t addr, uint32_t val, int width,
|
||||
int set_bits, int clear_bits);
|
||||
int csf_space;
|
||||
char *csf;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue