]> git.sur5r.net Git - u-boot/commitdiff
x86: Simplify the fsp hob access functions
authorBin Meng <bmeng.cn@gmail.com>
Tue, 30 Dec 2014 08:02:05 +0000 (16:02 +0800)
committerSimon Glass <sjg@chromium.org>
Tue, 13 Jan 2015 01:03:41 +0000 (17:03 -0800)
Remove the troublesome union hob_pointers so that some annoying casts
are no longer needed in those hob access routines. This also improves
the readability.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/queensbay/fsp_support.c
arch/x86/cpu/queensbay/tnc_dram.c
arch/x86/include/asm/arch-queensbay/fsp/fsp_hob.h
arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
arch/x86/lib/cmd_hob.c

index ef1916b2e72c3df046584622f47ba96752069e3c..4764e3c62f8928038a9450ec2ff5e915782ef6fb 100644 (file)
@@ -231,26 +231,28 @@ u32 fsp_notify(struct fsp_header *fsp_hdr, u32 phase)
 
 u32 fsp_get_usable_lowmem_top(const void *hob_list)
 {
-       union hob_pointers hob;
+       const struct hob_header *hdr;
+       struct hob_res_desc *res_desc;
        phys_addr_t phys_start;
        u32 top;
 
        /* Get the HOB list for processing */
-       hob.raw = (void *)hob_list;
+       hdr = hob_list;
 
        /* * Collect memory ranges */
        top = FSP_LOWMEM_BASE;
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == HOB_TYPE_RES_DESC) {
-                       if (hob.res_desc->type == RES_SYS_MEM) {
-                               phys_start = hob.res_desc->phys_start;
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == HOB_TYPE_RES_DESC) {
+                       res_desc = (struct hob_res_desc *)hdr;
+                       if (res_desc->type == RES_SYS_MEM) {
+                               phys_start = res_desc->phys_start;
                                /* Need memory above 1MB to be collected here */
                                if (phys_start >= FSP_LOWMEM_BASE &&
                                    phys_start < (phys_addr_t)FSP_HIGHMEM_BASE)
-                                       top += (u32)(hob.res_desc->len);
+                                       top += (u32)(res_desc->len);
                        }
                }
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
        return top;
@@ -258,25 +260,27 @@ u32 fsp_get_usable_lowmem_top(const void *hob_list)
 
 u64 fsp_get_usable_highmem_top(const void *hob_list)
 {
-       union hob_pointers hob;
+       const struct hob_header *hdr;
+       struct hob_res_desc *res_desc;
        phys_addr_t phys_start;
        u64 top;
 
        /* Get the HOB list for processing */
-       hob.raw = (void *)hob_list;
+       hdr = hob_list;
 
        /* Collect memory ranges */
        top = FSP_HIGHMEM_BASE;
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == HOB_TYPE_RES_DESC) {
-                       if (hob.res_desc->type == RES_SYS_MEM) {
-                               phys_start = hob.res_desc->phys_start;
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == HOB_TYPE_RES_DESC) {
+                       res_desc = (struct hob_res_desc *)hdr;
+                       if (res_desc->type == RES_SYS_MEM) {
+                               phys_start = res_desc->phys_start;
                                /* Need memory above 1MB to be collected here */
                                if (phys_start >= (phys_addr_t)FSP_HIGHMEM_BASE)
-                                       top += (u32)(hob.res_desc->len);
+                                       top += (u32)(res_desc->len);
                        }
                }
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
        return top;
@@ -285,24 +289,26 @@ u64 fsp_get_usable_highmem_top(const void *hob_list)
 u64 fsp_get_reserved_mem_from_guid(const void *hob_list, u64 *len,
                                   struct efi_guid *guid)
 {
-       union hob_pointers hob;
+       const struct hob_header *hdr;
+       struct hob_res_desc *res_desc;
 
        /* Get the HOB list for processing */
-       hob.raw = (void *)hob_list;
+       hdr = hob_list;
 
        /* Collect memory ranges */
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == HOB_TYPE_RES_DESC) {
-                       if (hob.res_desc->type == RES_MEM_RESERVED) {
-                               if (compare_guid(&hob.res_desc->owner, guid)) {
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == HOB_TYPE_RES_DESC) {
+                       res_desc = (struct hob_res_desc *)hdr;
+                       if (res_desc->type == RES_MEM_RESERVED) {
+                               if (compare_guid(&res_desc->owner, guid)) {
                                        if (len)
-                                               *len = (u32)(hob.res_desc->len);
+                                               *len = (u32)(res_desc->len);
 
-                                       return (u64)(hob.res_desc->phys_start);
+                                       return (u64)(res_desc->phys_start);
                                }
                        }
                }
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
        return 0;
@@ -336,44 +342,45 @@ u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len)
        return base;
 }
 
-void *fsp_get_next_hob(u16 type, const void *hob_list)
+const struct hob_header *fsp_get_next_hob(u16 type, const void *hob_list)
 {
-       union hob_pointers hob;
+       const struct hob_header *hdr;
 
-       assert(hob_list != NULL);
-
-       hob.raw = (u8 *)hob_list;
+       hdr = hob_list;
 
        /* Parse the HOB list until end of list or matching type is found */
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == type)
-                       return hob.raw;
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == type)
+                       return hdr;
 
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
        return NULL;
 }
 
-void *fsp_get_next_guid_hob(const struct efi_guid *guid, const void *hob_list)
+const struct hob_header *fsp_get_next_guid_hob(const struct efi_guid *guid,
+                                              const void *hob_list)
 {
-       union hob_pointers hob;
-
-       hob.raw = (u8 *)hob_list;
-       while ((hob.raw = fsp_get_next_hob(HOB_TYPE_GUID_EXT,
-                       hob.raw)) != NULL) {
-               if (compare_guid(guid, &hob.guid->name))
+       const struct hob_header *hdr;
+       struct hob_guid *guid_hob;
+
+       hdr = hob_list;
+       while ((hdr = fsp_get_next_hob(HOB_TYPE_GUID_EXT,
+                       hdr)) != NULL) {
+               guid_hob = (struct hob_guid *)hdr;
+               if (compare_guid(guid, &(guid_hob->name)))
                        break;
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
-       return hob.raw;
+       return hdr;
 }
 
 void *fsp_get_guid_hob_data(const void *hob_list, u32 *len,
                            struct efi_guid *guid)
 {
-       u8 *guid_hob;
+       const struct hob_header *guid_hob;
 
        guid_hob = fsp_get_next_guid_hob(guid, hob_list);
        if (guid_hob == NULL) {
index 8e97c9b82a5254ef4e1e71472d6333d952ccece5..b669dbc98b4d83a456b59fbe5859fdec3c3f4ba9 100644 (file)
@@ -14,17 +14,19 @@ DECLARE_GLOBAL_DATA_PTR;
 int dram_init(void)
 {
        phys_size_t ram_size = 0;
-       union hob_pointers hob;
+       const struct hob_header *hdr;
+       struct hob_res_desc *res_desc;
 
-       hob.raw = gd->arch.hob_list;
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == HOB_TYPE_RES_DESC) {
-                       if (hob.res_desc->type == RES_SYS_MEM ||
-                           hob.res_desc->type == RES_MEM_RESERVED) {
-                               ram_size += hob.res_desc->len;
+       hdr = gd->arch.hob_list;
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == HOB_TYPE_RES_DESC) {
+                       res_desc = (struct hob_res_desc *)hdr;
+                       if (res_desc->type == RES_SYS_MEM ||
+                           res_desc->type == RES_MEM_RESERVED) {
+                               ram_size += res_desc->len;
                        }
                }
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
        }
 
        gd->ram_size = ram_size;
@@ -55,22 +57,23 @@ ulong board_get_usable_ram_top(ulong total_size)
 unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
 {
        unsigned num_entries = 0;
+       const struct hob_header *hdr;
+       struct hob_res_desc *res_desc;
 
-       union hob_pointers hob;
+       hdr = gd->arch.hob_list;
 
-       hob.raw = gd->arch.hob_list;
+       while (!end_of_hob(hdr)) {
+               if (get_hob_type(hdr) == HOB_TYPE_RES_DESC) {
+                       res_desc = (struct hob_res_desc *)hdr;
+                       entries[num_entries].addr = res_desc->phys_start;
+                       entries[num_entries].size = res_desc->len;
 
-       while (!end_of_hob(hob)) {
-               if (get_hob_type(hob) == HOB_TYPE_RES_DESC) {
-                       entries[num_entries].addr = hob.res_desc->phys_start;
-                       entries[num_entries].size = hob.res_desc->len;
-
-                       if (hob.res_desc->type == RES_SYS_MEM)
+                       if (res_desc->type == RES_SYS_MEM)
                                entries[num_entries].type = E820_RAM;
-                       else if (hob.res_desc->type == RES_MEM_RESERVED)
+                       else if (res_desc->type == RES_MEM_RESERVED)
                                entries[num_entries].type = E820_RESERVED;
                }
-               hob.raw = get_next_hob(hob);
+               hdr = get_next_hob(hdr);
                num_entries++;
        }
 
index 380b64efaa553fa52b221f143bde708308b7075a..51103617b098d397b3138835ee4c0b67e4318193 100644 (file)
@@ -182,15 +182,6 @@ struct hob_guid {
        /* GUID specific data goes here */
 };
 
-/* Union of all the possible HOB Types */
-union hob_pointers {
-       struct hob_header       *hdr;
-       struct hob_mem_alloc    *mem_alloc;
-       struct hob_res_desc     *res_desc;
-       struct hob_guid         *guid;
-       u8                      *raw;
-};
-
 /**
  * get_hob_type() - return the type of a HOB
  *
@@ -201,9 +192,9 @@ union hob_pointers {
  *
  * @return: HOB type.
  */
-static inline u16 get_hob_type(union hob_pointers hob)
+static inline u16 get_hob_type(const struct hob_header *hdr)
 {
-       return hob.hdr->type;
+       return hdr->type;
 }
 
 /**
@@ -216,9 +207,9 @@ static inline u16 get_hob_type(union hob_pointers hob)
  *
  * @return: HOB length.
  */
-static inline u16 get_hob_length(union hob_pointers hob)
+static inline u16 get_hob_length(const struct hob_header *hdr)
 {
-       return hob.hdr->len;
+       return hdr->len;
 }
 
 /**
@@ -227,13 +218,13 @@ static inline u16 get_hob_length(union hob_pointers hob)
  * This macro returns a pointer to HOB that follows the HOB specified by hob
  * in the HOB List.
  *
- * @hob:    A pointer to a HOB.
+ * @hdr:    A pointer to a HOB.
  *
  * @return: A pointer to the next HOB in the HOB list.
  */
-static inline void *get_next_hob(union hob_pointers hob)
+static inline const struct hob_header *get_next_hob(const struct hob_header *hdr)
 {
-       return (void *)(*(u8 **)&(hob) + get_hob_length(hob));
+       return (const struct hob_header *)((u32)hdr + get_hob_length(hdr));
 }
 
 /**
@@ -243,14 +234,14 @@ static inline void *get_next_hob(union hob_pointers hob)
  * HOB list.  If hob is last HOB in the HOB list, then true is returned.
  * Otherwise, false is returned.
  *
- * @hob:          A pointer to a HOB.
+ * @hdr:          A pointer to a HOB.
  *
- * @retval true:  The HOB specified by hob is the last HOB in the HOB list.
- * @retval false: The HOB specified by hob is not the last HOB in the HOB list.
+ * @retval true:  The HOB specified by hdr is the last HOB in the HOB list.
+ * @retval false: The HOB specified by hdr is not the last HOB in the HOB list.
  */
-static inline bool end_of_hob(union hob_pointers hob)
+static inline bool end_of_hob(const struct hob_header *hdr)
 {
-       return get_hob_type(hob) == HOB_TYPE_EOH;
+       return get_hob_type(hdr) == HOB_TYPE_EOH;
 }
 
 /**
@@ -260,13 +251,13 @@ static inline bool end_of_hob(union hob_pointers hob)
  * This macro returns a pointer to the data buffer in a HOB specified by hob.
  * hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
  *
- * @hob:    A pointer to a HOB.
+ * @hdr:    A pointer to a HOB.
  *
  * @return: A pointer to the data buffer in a HOB.
  */
-static inline void *get_guid_hob_data(u8 *hob)
+static inline void *get_guid_hob_data(const struct hob_header *hdr)
 {
-       return (void *)(hob + sizeof(struct hob_guid));
+       return (void *)((u32)hdr + sizeof(struct hob_guid));
 }
 
 /**
@@ -276,14 +267,13 @@ static inline void *get_guid_hob_data(u8 *hob)
  * This macro returns the size, in bytes, of the data buffer in a HOB
  * specified by hob. hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
  *
- * @hob:    A pointer to a HOB.
+ * @hdr:    A pointer to a HOB.
  *
  * @return: The size of the data buffer.
  */
-static inline u16 get_guid_hob_data_size(u8 *hob)
+static inline u16 get_guid_hob_data_size(const struct hob_header *hdr)
 {
-       union hob_pointers hob_p = *(union hob_pointers *)hob;
-       return get_hob_length(hob_p) - sizeof(struct hob_guid);
+       return get_hob_length(hdr) - sizeof(struct hob_guid);
 }
 
 /* FSP specific GUID HOB definitions */
index 3ae1b663b981aa641629b4db438a10f163e09f4c..2a3e987ebb045323aa5a6f1658de98c95f2815ac 100644 (file)
@@ -145,7 +145,7 @@ u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len);
  *
  * @retval:   A HOB object with matching type; Otherwise NULL.
  */
-void *fsp_get_next_hob(u16 type, const void *hob_list);
+const struct hob_header *fsp_get_next_hob(u16 type, const void *hob_list);
 
 /**
  * Returns the next instance of the matched GUID HOB from the starting HOB.
@@ -155,7 +155,8 @@ void *fsp_get_next_hob(u16 type, const void *hob_list);
  *
  * @retval:   A HOB object with matching GUID; Otherwise NULL.
  */
-void *fsp_get_next_guid_hob(const struct efi_guid *guid, const void *hob_list);
+const struct hob_header *fsp_get_next_guid_hob(const struct efi_guid *guid,
+                                              const void *hob_list);
 
 /**
  * This function retrieves a GUID HOB data buffer and size.
index b552fe6c1b5d114ec85e8f7b8154ad9830d6e117..8d1f038527d8e7a477faef25c130753dbbea8996 100644 (file)
@@ -28,20 +28,20 @@ static char *hob_type[] = {
 
 int do_hob(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       union hob_pointers hob;
+       const struct hob_header *hdr;
        u16 type;
        char *desc;
        int i = 0;
 
-       hob.raw = (u8 *)gd->arch.hob_list;
+       hdr = gd->arch.hob_list;
 
-       printf("HOB list address: 0x%08x\n\n", (unsigned int)hob.raw);
+       printf("HOB list address: 0x%08x\n\n", (unsigned int)hdr);
 
        printf("No. | Address  | Type                | Length in Bytes\n");
        printf("----|----------|---------------------|----------------\n");
-       while (!end_of_hob(hob)) {
-               printf("%-3d | %08x | ", i, (unsigned int)hob.raw);
-               type = get_hob_type(hob);
+       while (!end_of_hob(hdr)) {
+               printf("%-3d | %08x | ", i, (unsigned int)hdr);
+               type = get_hob_type(hdr);
                if (type == HOB_TYPE_UNUSED)
                        desc = "*Unused*";
                else if (type == HOB_TYPE_EOH)
@@ -50,8 +50,8 @@ int do_hob(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        desc = hob_type[type];
                else
                        desc = "*Invalid Type*";
-               printf("%-19s | %-15d\n", desc, get_hob_length(hob));
-               hob.raw = get_next_hob(hob);
+               printf("%-19s | %-15d\n", desc, get_hob_length(hdr));
+               hdr = get_next_hob(hdr);
                i++;
        }