Merge tag 'pm+acpi-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[firefly-linux-kernel-4.4.55.git] / include / linux / sdb.h
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__ */