1 /* 2 * This is the official version 1.1 of sdb.h 3 */ 4 #ifndef __SDB_H__ 5 #define __SDB_H__ 6 #ifdef __KERNEL__ 7 #include <linux/types.h> 8 #else 9 #include <stdint.h> 10 #endif 11 12 /* 13 * All structures are 64 bytes long and are expected 14 * to live in an array, one for each interconnect. 15 * Most fields of the structures are shared among the 16 * various types, and most-specific fields are at the 17 * beginning (for alignment reasons, and to keep the 18 * magic number at the head of the interconnect record 19 */ 20 21 /* Product, 40 bytes at offset 24, 8-byte aligned 22 * 23 * device_id is vendor-assigned; version is device-specific, 24 * date is hex (e.g 0x20120501), name is UTF-8, blank-filled 25 * and not terminated with a 0 byte. 26 */ 27 struct sdb_product { 28 uint64_t vendor_id; /* 0x18..0x1f */ 29 uint32_t device_id; /* 0x20..0x23 */ 30 uint32_t version; /* 0x24..0x27 */ 31 uint32_t date; /* 0x28..0x2b */ 32 uint8_t name[19]; /* 0x2c..0x3e */ 33 uint8_t record_type; /* 0x3f */ 34 }; 35 36 /* 37 * Component, 56 bytes at offset 8, 8-byte aligned 38 * 39 * The address range is first to last, inclusive 40 * (for example 0x100000 - 0x10ffff) 41 */ 42 struct sdb_component { 43 uint64_t addr_first; /* 0x08..0x0f */ 44 uint64_t addr_last; /* 0x10..0x17 */ 45 struct sdb_product product; /* 0x18..0x3f */ 46 }; 47 48 /* Type of the SDB record */ 49 enum sdb_record_type { 50 sdb_type_interconnect = 0x00, 51 sdb_type_device = 0x01, 52 sdb_type_bridge = 0x02, 53 sdb_type_integration = 0x80, 54 sdb_type_repo_url = 0x81, 55 sdb_type_synthesis = 0x82, 56 sdb_type_empty = 0xFF, 57 }; 58 59 /* Type 0: interconnect (first of the array) 60 * 61 * sdb_records is the length of the table including this first 62 * record, version is 1. The bus type is enumerated later. 63 */ 64 #define SDB_MAGIC 0x5344422d /* "SDB-" */ 65 struct sdb_interconnect { 66 uint32_t sdb_magic; /* 0x00-0x03 */ 67 uint16_t sdb_records; /* 0x04-0x05 */ 68 uint8_t sdb_version; /* 0x06 */ 69 uint8_t sdb_bus_type; /* 0x07 */ 70 struct sdb_component sdb_component; /* 0x08-0x3f */ 71 }; 72 73 /* Type 1: device 74 * 75 * class is 0 for "custom device", other values are 76 * to be standardized; ABI version is for the driver, 77 * bus-specific bits are defined by each bus (see below) 78 */ 79 struct sdb_device { 80 uint16_t abi_class; /* 0x00-0x01 */ 81 uint8_t abi_ver_major; /* 0x02 */ 82 uint8_t abi_ver_minor; /* 0x03 */ 83 uint32_t bus_specific; /* 0x04-0x07 */ 84 struct sdb_component sdb_component; /* 0x08-0x3f */ 85 }; 86 87 /* Type 2: bridge 88 * 89 * child is the address of the nested SDB table 90 */ 91 struct sdb_bridge { 92 uint64_t sdb_child; /* 0x00-0x07 */ 93 struct sdb_component sdb_component; /* 0x08-0x3f */ 94 }; 95 96 /* Type 0x80: integration 97 * 98 * all types with bit 7 set are meta-information, so 99 * software can ignore the types it doesn't know. Here we 100 * just provide product information for an aggregate device 101 */ 102 struct sdb_integration { 103 uint8_t reserved[24]; /* 0x00-0x17 */ 104 struct sdb_product product; /* 0x08-0x3f */ 105 }; 106 107 /* Type 0x81: Top module repository url 108 * 109 * again, an informative field that software can ignore 110 */ 111 struct sdb_repo_url { 112 uint8_t repo_url[63]; /* 0x00-0x3e */ 113 uint8_t record_type; /* 0x3f */ 114 }; 115 116 /* Type 0x82: Synthesis tool information 117 * 118 * this informative record 119 */ 120 struct sdb_synthesis { 121 uint8_t syn_name[16]; /* 0x00-0x0f */ 122 uint8_t commit_id[16]; /* 0x10-0x1f */ 123 uint8_t tool_name[8]; /* 0x20-0x27 */ 124 uint32_t tool_version; /* 0x28-0x2b */ 125 uint32_t date; /* 0x2c-0x2f */ 126 uint8_t user_name[15]; /* 0x30-0x3e */ 127 uint8_t record_type; /* 0x3f */ 128 }; 129 130 /* Type 0xff: empty 131 * 132 * this allows keeping empty slots during development, 133 * so they can be filled later with minimal efforts and 134 * no misleading description is ever shipped -- hopefully. 135 * It can also be used to pad a table to a desired length. 136 */ 137 struct sdb_empty { 138 uint8_t reserved[63]; /* 0x00-0x3e */ 139 uint8_t record_type; /* 0x3f */ 140 }; 141 142 /* The type of bus, for bus-specific flags */ 143 enum sdb_bus_type { 144 sdb_wishbone = 0x00, 145 sdb_data = 0x01, 146 }; 147 148 #define SDB_WB_WIDTH_MASK 0x0f 149 #define SDB_WB_ACCESS8 0x01 150 #define SDB_WB_ACCESS16 0x02 151 #define SDB_WB_ACCESS32 0x04 152 #define SDB_WB_ACCESS64 0x08 153 #define SDB_WB_LITTLE_ENDIAN 0x80 154 155 #define SDB_DATA_READ 0x04 156 #define SDB_DATA_WRITE 0x02 157 #define SDB_DATA_EXEC 0x01 158 159 #endif /* __SDB_H__ */ 160