Browse Source

dtc: Add data_append_integer function

This function deals with appending integers of various sizes (8, 16
32, and 64 bit currently).  It handles endianess conversions.  If the
integer will not fit in the requested number of bits of storage it
will have it's high bits ignored.

This patch also rewrites data_append_cell and data_append_addr to use
data_append_integer.

Signed-off-by: Anton Staaf <robotboy@chromium.org>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
main
Anton Staaf 13 years ago committed by Jon Loeliger
parent
commit
a4b515c038
  1. 39
      data.c
  2. 1
      dtc.h

39
data.c

@ -168,11 +168,33 @@ struct data data_merge(struct data d1, struct data d2)
return d; return d;
} }


struct data data_append_cell(struct data d, cell_t word) struct data data_append_integer(struct data d, uint64_t value, int bits)
{ {
cell_t beword = cpu_to_fdt32(word); uint8_t value_8;

uint16_t value_16;
return data_append_data(d, &beword, sizeof(beword)); uint32_t value_32;
uint64_t value_64;

switch (bits) {
case 8:
value_8 = value;
return data_append_data(d, &value_8, 1);

case 16:
value_16 = cpu_to_fdt16(value);
return data_append_data(d, &value_16, 2);

case 32:
value_32 = cpu_to_fdt32(value);
return data_append_data(d, &value_32, 4);

case 64:
value_64 = cpu_to_fdt64(value);
return data_append_data(d, &value_64, 8);

default:
die("Invalid literal size (%d)\n", bits);
}
} }


struct data data_append_re(struct data d, const struct fdt_reserve_entry *re) struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
@ -185,11 +207,14 @@ struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
return data_append_data(d, &bere, sizeof(bere)); return data_append_data(d, &bere, sizeof(bere));
} }


struct data data_append_addr(struct data d, uint64_t addr) struct data data_append_cell(struct data d, cell_t word)
{ {
uint64_t beaddr = cpu_to_fdt64(addr); return data_append_integer(d, word, sizeof(word) * 8);
}


return data_append_data(d, &beaddr, sizeof(beaddr)); struct data data_append_addr(struct data d, uint64_t addr)
{
return data_append_integer(d, addr, sizeof(addr) * 8);
} }


struct data data_append_byte(struct data d, uint8_t byte) struct data data_append_byte(struct data d, uint8_t byte)

1
dtc.h

@ -109,6 +109,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,
const void *p, int len); const void *p, int len);
struct data data_merge(struct data d1, struct data d2); struct data data_merge(struct data d1, struct data d2);
struct data data_append_cell(struct data d, cell_t word); struct data data_append_cell(struct data d, cell_t word);
struct data data_append_integer(struct data d, uint64_t word, int bits);
struct data data_append_re(struct data d, const struct fdt_reserve_entry *re); struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
struct data data_append_addr(struct data d, uint64_t addr); struct data data_append_addr(struct data d, uint64_t addr);
struct data data_append_byte(struct data d, uint8_t byte); struct data data_append_byte(struct data d, uint8_t byte);

Loading…
Cancel
Save