fdtgrep: Allow propagating properties up to supernodes

The existing bootph binding is defined such that properties in a
subnode are also implied in the supernode also, as in this example:

   buttons {
      /* bootph,pre-ram is implied by btn1 */
      compatible = "gpio-keys";

      btn1 {
         bootph,pre-ram;
         gpios = <&gpio_a 3 0>;
         label = "button1";
         linux,code = <BTN_1>;
      };

Provide an option to implement this in fdtgrep.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2023-12-17 09:36:22 -07:00
parent 0b2e47be2c
commit 7a06cc2027

View file

@ -63,6 +63,7 @@ struct display_info {
int types_inc; /* Mask of types that we include (FDT_IS...) */ int types_inc; /* Mask of types that we include (FDT_IS...) */
int types_exc; /* Mask of types that we exclude (FDT_IS...) */ int types_exc; /* Mask of types that we exclude (FDT_IS...) */
int invert; /* Invert polarity of match */ int invert; /* Invert polarity of match */
int props_up; /* Imply properties up to supernodes */
struct value_node *value_head; /* List of values to match */ struct value_node *value_head; /* List of values to match */
const char *output_fname; /* Output filename */ const char *output_fname; /* Output filename */
FILE *fout; /* File to write dts/dtb output */ FILE *fout; /* File to write dts/dtb output */
@ -606,6 +607,16 @@ static int check_props(struct display_info *disp, const void *fdt, int node,
strlen(str)); strlen(str));
} }
/* if requested, check all subnodes for this property too */
if (inc != 1 && disp->props_up) {
int subnode;
for (subnode = fdt_first_subnode(fdt, node);
subnode > 0 && inc != 1;
subnode = fdt_next_subnode(fdt, subnode))
inc = check_props(disp, fdt, subnode, inc);
}
return inc; return inc;
} }
@ -955,7 +966,7 @@ static const char usage_synopsis[] =
case '?': usage("unknown option"); case '?': usage("unknown option");
static const char usage_short_opts[] = static const char usage_short_opts[] =
"haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTv" "haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTuv"
USAGE_COMMON_SHORT_OPTS; USAGE_COMMON_SHORT_OPTS;
static const struct option usage_long_opts[] = { static const struct option usage_long_opts[] = {
{"show-address", no_argument, NULL, 'a'}, {"show-address", no_argument, NULL, 'a'},
@ -985,6 +996,7 @@ static const struct option usage_long_opts[] = {
{"skip-supernodes", no_argument, NULL, 'S'}, {"skip-supernodes", no_argument, NULL, 'S'},
{"show-stringtab", no_argument, NULL, 't'}, {"show-stringtab", no_argument, NULL, 't'},
{"show-aliases", no_argument, NULL, 'T'}, {"show-aliases", no_argument, NULL, 'T'},
{"props-up-to-supernode", no_argument, NULL, 'u'},
{"invert-match", no_argument, NULL, 'v'}, {"invert-match", no_argument, NULL, 'v'},
USAGE_COMMON_LONG_OPTS, USAGE_COMMON_LONG_OPTS,
}; };
@ -1016,6 +1028,7 @@ static const char * const usage_opts_help[] = {
"Don't include supernodes of matching nodes", "Don't include supernodes of matching nodes",
"Include string table in binary output", "Include string table in binary output",
"Include matching aliases in output", "Include matching aliases in output",
"Add -p properties to supernodes too",
"Invert the sense of matching (select non-matching lines)", "Invert the sense of matching (select non-matching lines)",
USAGE_COMMON_OPTS_HELP USAGE_COMMON_OPTS_HELP
}; };
@ -1202,6 +1215,9 @@ static void scan_args(struct display_info *disp, int argc, char *argv[])
case 'T': case 'T':
disp->add_aliases = 1; disp->add_aliases = 1;
break; break;
case 'u':
disp->props_up = 1;
break;
case 'v': case 'v':
disp->invert = 1; disp->invert = 1;
break; break;