Branch data Line data Source code
1 : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2 : : /* Copyright 2013-2017 IBM Corp. */ 3 : : 4 : : #ifndef __HDIF_H 5 : : #define __HDIF_H 6 : : 7 : : #include <skiboot.h> 8 : : #include <types.h> 9 : : #include <ccan/endian/endian.h> 10 : : 11 : : struct HDIF_common_hdr { 12 : : __be16 d1f0; /* 0xd1f0 */ 13 : : char id[6]; /* eye catcher string */ 14 : : __be16 instnum; /* instance number */ 15 : : __be16 version; /* version */ 16 : : __be32 total_len; /* total structure length */ 17 : : __be32 hdr_len; /* header length (currently 0x20) */ 18 : : __be32 idptr_off; /* offset to idata pointers */ 19 : : __be16 idptr_count; /* number of idata pointers */ 20 : : __be16 child_count; /* number of child structures */ 21 : : __be32 child_off; /* offset to child structures array */ 22 : : } __packed __align(0x10); 23 : : 24 : : struct HDIF_idata_ptr { 25 : : __be32 offset; 26 : : __be32 size; 27 : : } __packed __align(0x8); 28 : : 29 : : struct HDIF_array_hdr { 30 : : __be32 offset; 31 : : __be32 ecnt; 32 : : __be32 esize; 33 : : __be32 eactsz; 34 : : } __packed __align(0x4); 35 : : 36 : : struct HDIF_child_ptr { 37 : : __be32 offset; 38 : : __be32 size; 39 : : __be32 count; 40 : : } __packed; 41 : : 42 : : #define HDIF_HDR_LEN (sizeof(struct HDIF_common_hdr)) 43 : : #define HDIF_ARRAY_OFFSET (sizeof(struct HDIF_array_hdr)) 44 : : 45 : : #define HDIF_ID(_id) .d1f0 = CPU_TO_BE16(0xd1f0), .id = _id 46 : : 47 : : #define HDIF_SIMPLE_HDR(id, vers, type) \ 48 : : { \ 49 : : HDIF_ID(id), \ 50 : : .instnum = CPU_TO_BE16(0), \ 51 : : .version = CPU_TO_BE16(vers), \ 52 : : .total_len = CPU_TO_BE32(sizeof(type)), \ 53 : : .hdr_len = CPU_TO_BE32(HDIF_HDR_LEN), \ 54 : : .idptr_off = CPU_TO_BE32(HDIF_HDR_LEN), \ 55 : : .idptr_count = CPU_TO_BE16(1), \ 56 : : .child_count = CPU_TO_BE16(0), \ 57 : : .child_off = CPU_TO_BE32(0), \ 58 : : } 59 : : 60 : : #define HDIF_IDATA_PTR(_offset, _size) \ 61 : : { \ 62 : : .offset = CPU_TO_BE32(_offset), \ 63 : : .size = CPU_TO_BE32(_size), \ 64 : : } 65 : : 66 : 1300 : static inline bool HDIF_check(const void *hdif, const char *id) 67 : : { 68 : 1300 : const struct HDIF_common_hdr *hdr = hdif; 69 : : 70 : 1300 : if (hdr->d1f0 != CPU_TO_BE16(0xd1f0)) 71 : 0 : return false; 72 : 1300 : if (id && memcmp(hdr->id, id, sizeof(hdr->id)) != 0) 73 : 0 : return false; 74 : : 75 : 1300 : return true; 76 : : } 77 : : 78 : : /* HDIF_get_idata - Get a pointer to internal data block 79 : : * 80 : : * @hdif : HDIF structure pointer 81 : : * @di : Index of the idata pointer 82 : : * @size : Return the data size (or NULL if ignored) 83 : : */ 84 : : extern const void *HDIF_get_idata(const struct HDIF_common_hdr *hdif, 85 : : unsigned int di, 86 : : unsigned int *size); 87 : : 88 : : /* HDIF_get_iarray - Get a pointer to an elemnt of an internal data array 89 : : * 90 : : * @hdif : HDIF structure pointer 91 : : * @di : Index of the idata pointer 92 : : * @ai : Index in the resulting array 93 : : * @size : Return the entry actual size (or NULL if ignored) 94 : : */ 95 : : extern const void *HDIF_get_iarray_item(const struct HDIF_common_hdr *hdif, 96 : : unsigned int di, 97 : : unsigned int ai, unsigned int *size); 98 : : 99 : : /* HDIF_get_iarray - Get a pointer to an internal array header 100 : : * 101 : : * @hdif : HDIF structure pointer 102 : : * @di : Index of the idata pointer 103 : : * @ai : Index in the resulting array 104 : : * @size : Return the entry actual size (or NULL if ignored) 105 : : */ 106 : : extern const struct HDIF_array_hdr *HDIF_get_iarray( 107 : : const struct HDIF_common_hdr *hdif, unsigned int di, 108 : : unsigned int *items); 109 : : 110 : : extern const void *HDIF_iarray_item(const struct HDIF_array_hdr *hdif, 111 : : unsigned int index); 112 : : 113 : : #define HDIF_iarray_for_each(arr, idx, ptr) \ 114 : : for (idx = 0, ptr = HDIF_iarray_item(arr, idx); \ 115 : : ptr; idx++, ptr = HDIF_iarray_item(arr, idx)) 116 : : 117 : : /* HDIF_get_iarray_size - Get the number of elements of an internal data array 118 : : * 119 : : * @hdif : HDIF structure pointer 120 : : * @di : Index of the idata pointer 121 : : * 122 : : * A negative result means an error 123 : : */ 124 : : extern int HDIF_get_iarray_size(const struct HDIF_common_hdr *hdif, 125 : : unsigned int di); 126 : : 127 : : /* HDIF_child_arr - Get a child array from this HDIF. 128 : : * 129 : : * @hdif : HDIF structure pointer 130 : : * @idx : the child to get 131 : : * 132 : : * NULL means an error (not that many children). 133 : : */ 134 : : extern struct HDIF_child_ptr * 135 : : HDIF_child_arr(const struct HDIF_common_hdr *hdif, unsigned int idx); 136 : : 137 : : /* HDIF_child - Deref a child_ptr entry. 138 : : * 139 : : * @hdif : HDIF structure pointer 140 : : * @child : the child returned from HDIF_child_arr 141 : : * @idx : the index of the child to get (< child->count). 142 : : * @eyecatcher: the 6-char ID expected for this child. 143 : : * 144 : : * NULL means an error. 145 : : */ 146 : : extern struct HDIF_common_hdr *HDIF_child(const struct HDIF_common_hdr *hdif, 147 : : const struct HDIF_child_ptr *child, 148 : : unsigned int idx, 149 : : const char *eyecatcher); 150 : : #endif /* __HDIF_H */