1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
26bf4ca07SHeiko Schocher /*
36bf4ca07SHeiko Schocher * (C) Copyright 2014
46bf4ca07SHeiko Schocher * DENX Software Engineering
56bf4ca07SHeiko Schocher * Heiko Schocher <hs@denx.de>
66bf4ca07SHeiko Schocher *
76bf4ca07SHeiko Schocher * fit_info: print the offset and the len of a property from
86bf4ca07SHeiko Schocher * node in a fit file.
96bf4ca07SHeiko Schocher *
106bf4ca07SHeiko Schocher * Based on:
116bf4ca07SHeiko Schocher * (C) Copyright 2008 Semihalf
126bf4ca07SHeiko Schocher *
136bf4ca07SHeiko Schocher * (C) Copyright 2000-2004
146bf4ca07SHeiko Schocher * DENX Software Engineering
156bf4ca07SHeiko Schocher * Wolfgang Denk, wd@denx.de
166bf4ca07SHeiko Schocher *
176bf4ca07SHeiko Schocher * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
186bf4ca07SHeiko Schocher * FIT image specific code abstracted from mkimage.c
196bf4ca07SHeiko Schocher * some functions added to address abstraction
206bf4ca07SHeiko Schocher *
216bf4ca07SHeiko Schocher * All rights reserved.
226bf4ca07SHeiko Schocher */
236bf4ca07SHeiko Schocher
246bf4ca07SHeiko Schocher #include "mkimage.h"
256bf4ca07SHeiko Schocher #include "fit_common.h"
266bf4ca07SHeiko Schocher #include <image.h>
276bf4ca07SHeiko Schocher #include <u-boot/crc.h>
286bf4ca07SHeiko Schocher
usage(char * cmdname)296bf4ca07SHeiko Schocher void usage(char *cmdname)
306bf4ca07SHeiko Schocher {
316bf4ca07SHeiko Schocher fprintf(stderr, "Usage: %s -f fit file -n node -p property\n"
326bf4ca07SHeiko Schocher " -f ==> set fit file which is used'\n"
336bf4ca07SHeiko Schocher " -n ==> set node name'\n"
346bf4ca07SHeiko Schocher " -p ==> set property name'\n",
356bf4ca07SHeiko Schocher cmdname);
366bf4ca07SHeiko Schocher exit(EXIT_FAILURE);
376bf4ca07SHeiko Schocher }
386bf4ca07SHeiko Schocher
main(int argc,char ** argv)396bf4ca07SHeiko Schocher int main(int argc, char **argv)
406bf4ca07SHeiko Schocher {
416bf4ca07SHeiko Schocher int ffd = -1;
426bf4ca07SHeiko Schocher struct stat fsbuf;
436bf4ca07SHeiko Schocher void *fit_blob;
446bf4ca07SHeiko Schocher int len;
456bf4ca07SHeiko Schocher int nodeoffset; /* node offset from libfdt */
466bf4ca07SHeiko Schocher const void *nodep; /* property node pointer */
476bf4ca07SHeiko Schocher char *fdtfile = NULL;
486bf4ca07SHeiko Schocher char *nodename = NULL;
496bf4ca07SHeiko Schocher char *propertyname = NULL;
50686dca0fSHeiko Schocher char cmdname[256];
516bf4ca07SHeiko Schocher int c;
526bf4ca07SHeiko Schocher
53686dca0fSHeiko Schocher strncpy(cmdname, *argv, sizeof(cmdname) - 1);
54686dca0fSHeiko Schocher cmdname[sizeof(cmdname) - 1] = '\0';
556bf4ca07SHeiko Schocher while ((c = getopt(argc, argv, "f:n:p:")) != -1)
566bf4ca07SHeiko Schocher switch (c) {
576bf4ca07SHeiko Schocher case 'f':
586bf4ca07SHeiko Schocher fdtfile = optarg;
596bf4ca07SHeiko Schocher break;
606bf4ca07SHeiko Schocher case 'n':
616bf4ca07SHeiko Schocher nodename = optarg;
626bf4ca07SHeiko Schocher break;
636bf4ca07SHeiko Schocher case 'p':
646bf4ca07SHeiko Schocher propertyname = optarg;
656bf4ca07SHeiko Schocher break;
666bf4ca07SHeiko Schocher default:
676bf4ca07SHeiko Schocher usage(cmdname);
686bf4ca07SHeiko Schocher break;
696bf4ca07SHeiko Schocher }
706bf4ca07SHeiko Schocher
71ba923cabSSimon Glass if (!fdtfile) {
72ba923cabSSimon Glass fprintf(stderr, "%s: Missing fdt file\n", *argv);
73ba923cabSSimon Glass usage(*argv);
74ba923cabSSimon Glass }
75ba923cabSSimon Glass if (!nodename) {
76ba923cabSSimon Glass fprintf(stderr, "%s: Missing node name\n", *argv);
77ba923cabSSimon Glass usage(*argv);
78ba923cabSSimon Glass }
79ba923cabSSimon Glass if (!propertyname) {
80ba923cabSSimon Glass fprintf(stderr, "%s: Missing property name\n", *argv);
81ba923cabSSimon Glass usage(*argv);
82ba923cabSSimon Glass }
83a9468115SSimon Glass ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false);
846bf4ca07SHeiko Schocher
856bf4ca07SHeiko Schocher if (ffd < 0) {
866bf4ca07SHeiko Schocher printf("Could not open %s\n", fdtfile);
876bf4ca07SHeiko Schocher exit(EXIT_FAILURE);
886bf4ca07SHeiko Schocher }
896bf4ca07SHeiko Schocher
906bf4ca07SHeiko Schocher nodeoffset = fdt_path_offset(fit_blob, nodename);
916bf4ca07SHeiko Schocher if (nodeoffset < 0) {
926bf4ca07SHeiko Schocher printf("%s not found.", nodename);
936bf4ca07SHeiko Schocher exit(EXIT_FAILURE);
946bf4ca07SHeiko Schocher }
956bf4ca07SHeiko Schocher nodep = fdt_getprop(fit_blob, nodeoffset, propertyname, &len);
966bf4ca07SHeiko Schocher if (len == 0) {
976bf4ca07SHeiko Schocher printf("len == 0 %s\n", propertyname);
986bf4ca07SHeiko Schocher exit(EXIT_FAILURE);
996bf4ca07SHeiko Schocher }
1006bf4ca07SHeiko Schocher
1016bf4ca07SHeiko Schocher printf("NAME: %s\n", fit_get_name(fit_blob, nodeoffset, NULL));
1026bf4ca07SHeiko Schocher printf("LEN: %d\n", len);
1036bf4ca07SHeiko Schocher printf("OFF: %d\n", (int)(nodep - fit_blob));
1046bf4ca07SHeiko Schocher (void) munmap((void *)fit_blob, fsbuf.st_size);
1056bf4ca07SHeiko Schocher
1066bf4ca07SHeiko Schocher close(ffd);
1076bf4ca07SHeiko Schocher exit(EXIT_SUCCESS);
1086bf4ca07SHeiko Schocher }
109