@@ -502,15 +502,15 @@ const char* fdt_get_name(const void *fdt, int nodeoffset, int *len)
502502{
503503 int err ;
504504 const struct fdt_node_header * nh = fdt_offset_ptr_ (fdt , nodeoffset );
505- int namelen = 0 ;
505+ size_t namelen = 0 ;
506506 const char * name = NULL ;
507507
508508 err = fdt_check_header (fdt );
509509 if (err == 0 ) {
510510 err = fdt_check_node_offset_ (fdt , nodeoffset );
511511 if (err >= 0 ) {
512512 name = nh -> name ;
513- namelen = strlen (nh -> name );
513+ namelen = ( int ) strlen (nh -> name );
514514 }
515515 }
516516 if (err < 0 )
@@ -524,7 +524,7 @@ const char* fdt_get_string(const void *fdt, int stroffset, int *lenp)
524524{
525525 const char * s = (const char * )fdt + fdt_off_dt_strings (fdt ) + stroffset ;
526526 if (lenp ) {
527- * lenp = strlen (s );
527+ * lenp = ( int ) strlen (s );
528528 }
529529 return s ;
530530}
@@ -560,7 +560,7 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, const void *val,
560560 return err ;
561561}
562562
563- const void * fdt_getprop (const void * fdt , int nodeoffset , const char * name ,
563+ const void * fdt_getprop (const void * fdt , int nodeoffset , const char * name ,
564564 int * lenp )
565565{
566566 int poffset ;
@@ -577,19 +577,39 @@ const void *fdt_getprop(const void *fdt, int nodeoffset, const char *name,
577577 return NULL ;
578578}
579579
580- int fdt_find_node_offset ( void * fdt , int startoff , const char * node )
580+ void * fdt_getprop_address ( const void * fdt , int nodeoffset , const char * name )
581581{
582- int off ;
583- int nodelen = strlen (node );
584- int nlen ;
582+ void * ret = NULL ;
583+ int len = 0 ;
584+ void * val = (void * )fdt_getprop (fdt , nodeoffset , name , & len );
585+ if (val != NULL && len > 0 ) {
586+ if (len == 8 ) {
587+ uint64_t * val64 = (uint64_t * )val ;
588+ ret = (void * )((uintptr_t )fdt64_to_cpu (* val64 ));
589+ }
590+ else if (len == 4 ) {
591+ uint32_t * val32 = (uint32_t * )val ;
592+ ret = (void * )((uintptr_t )fdt32_to_cpu (* val32 ));
593+ }
594+ }
595+ return ret ;
596+ }
597+
598+ int fdt_find_node_offset (void * fdt , int startoff , const char * nodename )
599+ {
600+ int off , nlen , fnlen ;
585601 const char * nstr = NULL ;
586602
603+ if (nodename == NULL )
604+ return -1 ;
605+
606+ fnlen = (int )strlen (nodename );
587607 for (off = fdt_next_node (fdt , startoff , NULL );
588608 off >= 0 ;
589609 off = fdt_next_node (fdt , off , NULL ))
590610 {
591611 nstr = fdt_get_name (fdt , off , & nlen );
592- if ((nlen == nodelen ) && (memcmp (nstr , node , nodelen ) == 0 )) {
612+ if ((nlen == fnlen ) && (memcmp (nstr , nodename , fnlen ) == 0 )) {
593613 break ;
594614 }
595615 }
@@ -599,16 +619,19 @@ int fdt_find_node_offset(void* fdt, int startoff, const char* node)
599619int fdt_find_prop_offset (void * fdt , int startoff , const char * propname ,
600620 const char * propval )
601621{
602- int len , off ;
622+ int len , off , pvallen ;
603623 const void * val ;
604- int nodelen = strlen (propval )+ 1 ;
605624
625+ if (propname == NULL || propval == NULL )
626+ return -1 ;
627+
628+ pvallen = (int )strlen (propval )+ 1 ;
606629 for (off = fdt_next_node (fdt , startoff , NULL );
607630 off >= 0 ;
608631 off = fdt_next_node (fdt , off , NULL ))
609632 {
610633 val = fdt_getprop (fdt , off , propname , & len );
611- if (val && (len == nodelen ) && (memcmp (val , propval , len ) == 0 )) {
634+ if (val && (len == pvallen ) && (memcmp (val , propval , len ) == 0 )) {
612635 break ;
613636 }
614637 }
@@ -745,4 +768,87 @@ int fdt_fixup_val64(void* fdt, int off, const char* node, const char* name,
745768 return fdt_setprop (fdt , off , name , & val , sizeof (val ));
746769}
747770
771+
772+ /* FIT Specific */
773+ const char * fit_find_images (void * fdt , const char * * pkernel , const char * * pflat_dt )
774+ {
775+ const void * val ;
776+ const char * conf = NULL , * kernel = NULL , * flat_dt = NULL ;
777+ int off , len = 0 ;
778+
779+ /* Find the default configuration (optional) */
780+ off = fdt_find_node_offset (fdt , -1 , "configurations" );
781+ if (off > 0 ) {
782+ val = fdt_getprop (fdt , off , "default" , & len );
783+ if (val != NULL && len > 0 ) {
784+ conf = (const char * )val ;
785+ }
786+ }
787+ if (conf != NULL ) {
788+ off = fdt_find_node_offset (fdt , -1 , conf );
789+ if (off > 0 ) {
790+ kernel = fdt_getprop (fdt , off , "kernel" , & len );
791+ flat_dt = fdt_getprop (fdt , off , "fdt" , & len );
792+ }
793+ }
794+ if (kernel == NULL ) {
795+ /* find node with "type" == kernel */
796+ off = fdt_find_prop_offset (fdt , -1 , "type" , "kernel" );
797+ if (off > 0 ) {
798+ val = fdt_get_name (fdt , off , & len );
799+ if (val != NULL && len > 0 ) {
800+ kernel = (const char * )val ;
801+ }
802+ }
803+ }
804+ if (flat_dt == NULL ) {
805+ /* find node with "type" == flat_dt */
806+ off = fdt_find_prop_offset (fdt , -1 , "type" , "flat_dt" );
807+ if (off > 0 ) {
808+ val = fdt_get_name (fdt , off , & len );
809+ if (val != NULL && len > 0 ) {
810+ flat_dt = (const char * )val ;
811+ }
812+ }
813+ }
814+
815+ if (pkernel )
816+ * pkernel = kernel ;
817+ if (pflat_dt )
818+ * pflat_dt = flat_dt ;
819+
820+ return conf ;
821+ }
822+
823+ void * fit_load_image (void * fdt , const char * image , int * lenp )
824+ {
825+ void * load , * entry , * data = NULL ;
826+ int off , len = 0 ;
827+
828+ off = fdt_find_node_offset (fdt , -1 , image );
829+ if (off > 0 ) {
830+ /* get load and entry */
831+ data = (void * )fdt_getprop (fdt , off , "data" , & len );
832+ load = fdt_getprop_address (fdt , off , "load" );
833+ entry = fdt_getprop_address (fdt , off , "entry" );
834+ if (data != NULL && load != NULL && data != load ) {
835+ wolfBoot_printf ("Loading Image %s: %p -> %p (%d bytes)\n" ,
836+ image , data , load , len );
837+ memcpy (load , data , len );
838+
839+ /* load should always have entry, but if not use load adress */
840+ data = (entry != NULL ) ? entry : load ;
841+ }
842+ wolfBoot_printf ("Image %s: %p (%d bytes)\n" , image , data , len );
843+ }
844+ else {
845+ wolfBoot_printf ("Image %s: Not found!\n" , image );
846+ }
847+ if (lenp != NULL ) {
848+ * lenp = len ;
849+ }
850+ return data ;
851+
852+ }
853+
748854#endif /* MMU && !BUILD_LOADER_STAGE1 */
0 commit comments