]> git.sur5r.net Git - u-boot/blobdiff - libfdt/fdt_ro.c
Makefile permissions
[u-boot] / libfdt / fdt_ro.c
index f8840839502b94ea3d17bd240c474fc662f0be9f..4e2c325b4d5590615b1aa329d89d2cf86da09079 100644 (file)
 
 #include "libfdt_internal.h"
 
-#define CHECK_HEADER(fdt) \
-       { \
-               int err; \
-               if ((err = _fdt_check_header(fdt)) != 0) \
-                       return err; \
-       }
+#define CHECK_HEADER(fdt)      { \
+       int err; \
+       if ((err = fdt_check_header(fdt)) != 0) \
+               return err; \
+}
 
 static int offset_streq(const void *fdt, int offset,
                        const char *s, int len)
@@ -171,7 +170,7 @@ int fdt_path_offset(const void *fdt, const char *path)
                p = q;
        }
 
-       return offset;  
+       return offset;
 }
 
 /*
@@ -189,7 +188,7 @@ struct fdt_property *fdt_get_property(const void *fdt,
        int offset, nextoffset;
        int err;
 
-       if ((err = _fdt_check_header(fdt)) != 0)
+       if ((err = fdt_check_header(fdt)) != 0)
                goto fail;
 
        err = -FDT_ERR_BADOFFSET;
@@ -240,7 +239,7 @@ struct fdt_property *fdt_get_property(const void *fdt,
 
                                if (lenp)
                                        *lenp = len;
-                               
+
                                return prop;
                        }
                        break;
@@ -255,7 +254,7 @@ struct fdt_property *fdt_get_property(const void *fdt,
        } while (level >= 0);
 
        err = -FDT_ERR_NOTFOUND;
- fail:
+fail:
        if (lenp)
                *lenp = err;
        return NULL;
@@ -331,3 +330,73 @@ uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset, char **namep
        return tag;
 }
 
+/*
+ * Return the number of used reserve map entries and total slots available.
+ */
+int fdt_num_reservemap(void *fdt, int *used, int *total)
+{
+       struct fdt_reserve_entry *re;
+       int  start;
+       int  end;
+       int  err = fdt_check_header(fdt);
+
+       if (err != 0)
+               return err;
+
+       start = fdt_off_mem_rsvmap(fdt);
+
+       /*
+        * Convention is that the reserve map is before the dt_struct,
+        * but it does not have to be.
+        */
+       end = fdt_totalsize(fdt);
+       if (end > fdt_off_dt_struct(fdt))
+               end = fdt_off_dt_struct(fdt);
+       if (end > fdt_off_dt_strings(fdt))
+               end = fdt_off_dt_strings(fdt);
+
+       /*
+        * Since the reserved area list is zero terminated, you get one fewer.
+        */
+       if (total)
+               *total = ((end - start) / sizeof(struct fdt_reserve_entry)) - 1;
+
+       if (used) {
+               *used = 0;
+               while (start < end) {
+                       re = (struct fdt_reserve_entry *)(fdt + start);
+                       if (re->size == 0)
+                               return 0;       /* zero size terminates the list */
+
+                       *used += 1;
+                       start += sizeof(struct fdt_reserve_entry);
+               }
+               /*
+                * If we get here, there was no zero size termination.
+                */
+               return -FDT_ERR_BADLAYOUT;
+       }
+       return 0;
+}
+
+/*
+ * Return the nth reserve map entry.
+ */
+int fdt_get_reservemap(void *fdt, int n, struct fdt_reserve_entry *re)
+{
+       int  used;
+       int  total;
+       int  err;
+
+       err = fdt_num_reservemap(fdt, &used, &total);
+       if (err != 0)
+               return err;
+
+       if (n >= total)
+               return -FDT_ERR_NOSPACE;
+       if (re) {
+               *re = *(struct fdt_reserve_entry *)
+                       _fdt_offset_ptr(fdt, n * sizeof(struct fdt_reserve_entry));
+       }
+       return 0;
+}