blob: 143e28451e7b8076a86ce35515c965c40ddbdf70 [file] [log] [blame]
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -07001/*
Viresh Kumara93db2d2015-04-01 20:32:02 +05302 * Greybus manifest definition
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -07003 *
Alex Eldercb705e02014-09-24 05:16:17 -05004 * See "Greybus Application Protocol" document (version 0.1) for
Alex Elder908a85d2014-09-24 05:16:16 -05005 * details on these values and structures.
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -07006 *
7 * Copyright 2014 Google Inc.
Alex Eldera46e9672014-12-12 12:08:42 -06008 * Copyright 2014 Linaro Ltd.
Alex Elder908a85d2014-09-24 05:16:16 -05009 *
Greg Kroah-Hartman9b60aa02014-10-06 20:37:53 -070010 * Released under the GPLv2 and BSD licenses.
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070011 */
12
Alex Elder1dd7f582014-09-26 20:55:32 -050013#ifndef __GREYBUS_MANIFEST_H
14#define __GREYBUS_MANIFEST_H
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070015
Greg Kroah-Hartman48123e02014-09-02 10:51:56 -070016#pragma pack(push, 1)
17
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070018enum greybus_descriptor_type {
Alex Elder72b0ffc2014-09-26 20:55:33 -050019 GREYBUS_TYPE_INVALID = 0x00,
Viresh Kumar83a0cb52015-04-01 20:31:59 +053020 GREYBUS_TYPE_INTERFACE = 0x01,
Alex Elder63cc9322014-10-02 12:30:02 -050021 GREYBUS_TYPE_STRING = 0x02,
Viresh Kumar83a0cb52015-04-01 20:31:59 +053022 GREYBUS_TYPE_BUNDLE = 0x03,
Alex Elder63cc9322014-10-02 12:30:02 -050023 GREYBUS_TYPE_CPORT = 0x04,
24 GREYBUS_TYPE_CLASS = 0x05,
Viresh Kumar83a0cb52015-04-01 20:31:59 +053025 GREYBUS_TYPE_MODULE = 0x06,
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070026};
27
Alex Elder63cc9322014-10-02 12:30:02 -050028enum greybus_protocol {
29 GREYBUS_PROTOCOL_CONTROL = 0x00,
30 GREYBUS_PROTOCOL_AP = 0x01,
31 GREYBUS_PROTOCOL_GPIO = 0x02,
32 GREYBUS_PROTOCOL_I2C = 0x03,
33 GREYBUS_PROTOCOL_UART = 0x04,
34 GREYBUS_PROTOCOL_HID = 0x05,
Greg Kroah-Hartman68190672014-11-17 15:19:14 -080035 GREYBUS_PROTOCOL_USB = 0x06,
36 GREYBUS_PROTOCOL_SDIO = 0x07,
Greg Kroah-Hartman2bb7eae2014-10-20 15:24:57 +080037 GREYBUS_PROTOCOL_BATTERY = 0x08,
Matt Porter34c65072014-11-13 09:14:13 -050038 GREYBUS_PROTOCOL_PWM = 0x09,
Mark Greer045235f2015-03-31 16:49:56 -070039 GREYBUS_PROTOCOL_I2S_MGMT = 0x0a,
Greg Kroah-Hartman68190672014-11-17 15:19:14 -080040 GREYBUS_PROTOCOL_SPI = 0x0b,
41 GREYBUS_PROTOCOL_DISPLAY = 0x0c,
42 GREYBUS_PROTOCOL_CAMERA = 0x0d,
43 GREYBUS_PROTOCOL_SENSOR = 0x0e,
44 GREYBUS_PROTOCOL_LED = 0x0f,
45 GREYBUS_PROTOCOL_VIBRATOR = 0x10,
Alexandre Bailon355a7052015-03-31 09:51:59 +020046 GREYBUS_PROTOCOL_LOOPBACK = 0x11,
Mark Greer045235f2015-03-31 16:49:56 -070047 GREYBUS_PROTOCOL_I2S_RECEIVER = 0x12,
48 GREYBUS_PROTOCOL_I2S_TRANSMITTER = 0x13,
Alex Elder63cc9322014-10-02 12:30:02 -050049 /* ... */
50 GREYBUS_PROTOCOL_VENDOR = 0xff,
51};
52
53enum greybus_class_type {
Alex Elder063e6ec2014-10-03 14:14:23 -050054 GREYBUS_CLASS_CONTROL = 0x00,
Greg Kroah-Hartman6ce3e032014-10-20 13:27:42 +080055 GREYBUS_CLASS_AP = 0x01,
Alex Elder063e6ec2014-10-03 14:14:23 -050056 GREYBUS_CLASS_GPIO = 0x02,
Greg Kroah-Hartman6ce3e032014-10-20 13:27:42 +080057 GREYBUS_CLASS_I2C = 0x03,
Alex Elder063e6ec2014-10-03 14:14:23 -050058 GREYBUS_CLASS_UART = 0x04,
Greg Kroah-Hartman6ce3e032014-10-20 13:27:42 +080059 GREYBUS_CLASS_HID = 0x05,
60 GREYBUS_CLASS_USB = 0x06,
61 GREYBUS_CLASS_SDIO = 0x07,
62 GREYBUS_CLASS_BATTERY = 0x08,
63 GREYBUS_CLASS_PWM = 0x09,
64 GREYBUS_CLASS_I2S = 0x0a,
65 GREYBUS_CLASS_SPI = 0x0b,
66 GREYBUS_CLASS_DISPLAY = 0x0c,
67 GREYBUS_CLASS_CAMERA = 0x0d,
68 GREYBUS_CLASS_SENSOR = 0x0e,
Alex Elder063e6ec2014-10-03 14:14:23 -050069 GREYBUS_CLASS_VENDOR = 0xff,
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070070};
71
Alex Elderecf7d572014-10-01 21:54:10 -050072/*
73 * A module descriptor describes information about a module as a
74 * whole, *not* the functions within it.
75 */
Matt Porter6d63ff72014-09-26 20:49:48 -050076struct greybus_descriptor_module {
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070077 __le16 vendor;
78 __le16 product;
Greg Kroah-Hartman5f474d42014-12-09 14:57:04 -050079 __le16 version; // TODO - remove after Dec demo.
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070080 __u8 vendor_stringid;
81 __u8 product_stringid;
Alex Elder63cc9322014-10-02 12:30:02 -050082 __le64 unique_id;
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070083};
84
Alex Elderecf7d572014-10-01 21:54:10 -050085/*
Alex Elder63cc9322014-10-02 12:30:02 -050086 * The string in a string descriptor is not NUL-terminated. The
87 * size of the descriptor will be rounded up to a multiple of 4
88 * bytes, by padding the string with 0x00 bytes if necessary.
Alex Elderecf7d572014-10-01 21:54:10 -050089 */
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070090struct greybus_descriptor_string {
Matt Portercbd0fd72014-09-26 20:49:51 -050091 __u8 length;
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070092 __u8 id;
93 __u8 string[0];
94};
95
Alex Elder63cc9322014-10-02 12:30:02 -050096/*
Viresh Kumara93db2d2015-04-01 20:32:02 +053097 * An interface descriptor describes information about an interface as a whole,
98 * *not* the functions within it.
Alex Elder63cc9322014-10-02 12:30:02 -050099 */
100struct greybus_descriptor_interface {
Viresh Kumara93db2d2015-04-01 20:32:02 +0530101 __le16 vendor;
102 __le16 product;
103 __le16 version; // TODO - remove after Dec demo.
104 __u8 vendor_stringid;
105 __u8 product_stringid;
106 __le64 unique_id;
Alex Elder63cc9322014-10-02 12:30:02 -0500107};
108
109/*
Viresh Kumar83a0cb52015-04-01 20:31:59 +0530110 * An bundle descriptor defines an identification number and a class type for
111 * each bundle.
112 *
113 * @id: Uniquely identifies a bundle within a interface, its sole purpose is to
114 * allow CPort descriptors to specify which bundle they are associated with.
115 * The first bundle will have id 0, second will have 1 and so on.
116 *
117 * The largest CPort id associated with an bundle (defined by a
118 * CPort descriptor in the manifest) is used to determine how to
119 * encode the device id and module number in UniPro packets
120 * that use the bundle.
121 *
122 * @class_type: It is used by kernel to know the functionality provided by the
123 * bundle and will be matched against drivers functinality while probing greybus
124 * driver. It should contain one of the values defined in
125 * 'enum greybus_class_type'.
126 *
127 */
128struct greybus_descriptor_bundle {
129 __u8 id; /* interface-relative id (0..) */
130 __u8 class_type;
131};
132
133/*
Greg Kroah-Hartman1db0a5f2014-12-12 17:10:17 -0500134 * A CPort descriptor indicates the id of the bundle within the
Alex Elder63cc9322014-10-02 12:30:02 -0500135 * module it's associated with, along with the CPort id used to
Alex Elder7fba0072014-10-28 19:35:59 -0500136 * address the CPort. The protocol id defines the format of messages
Alex Elder63cc9322014-10-02 12:30:02 -0500137 * exchanged using the CPort.
138 */
139struct greybus_descriptor_cport {
Greg Kroah-Hartman1db0a5f2014-12-12 17:10:17 -0500140 __u8 bundle;
Alex Elder63cc9322014-10-02 12:30:02 -0500141 __le16 id;
Alex Elder7fba0072014-10-28 19:35:59 -0500142 __u8 protocol_id; /* enum greybus_protocol */
Alex Elder63cc9322014-10-02 12:30:02 -0500143};
144
145/*
146 * A class descriptor defines functionality supplied by a module.
147 * Beyond that, not much else is defined yet...
148 */
149struct greybus_descriptor_class {
150 __u8 class; /* enum greybus_class_type */
151};
152
Alex Elderecf7d572014-10-01 21:54:10 -0500153struct greybus_descriptor_header {
154 __le16 size;
Alex Elder63cc9322014-10-02 12:30:02 -0500155 __u8 type; /* enum greybus_descriptor_type */
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -0700156};
157
Greg Kroah-Hartman6dca7b92014-09-01 13:42:43 -0700158struct greybus_descriptor {
Alex Elder63cc9322014-10-02 12:30:02 -0500159 struct greybus_descriptor_header header;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700160 union {
Matt Porter6d63ff72014-09-26 20:49:48 -0500161 struct greybus_descriptor_module module;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700162 struct greybus_descriptor_string string;
Alex Elderecf7d572014-10-01 21:54:10 -0500163 struct greybus_descriptor_interface interface;
Viresh Kumar83a0cb52015-04-01 20:31:59 +0530164 struct greybus_descriptor_bundle bundle;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700165 struct greybus_descriptor_cport cport;
Alex Elder63cc9322014-10-02 12:30:02 -0500166 struct greybus_descriptor_class class;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700167 };
168};
169
Alex Elderecf7d572014-10-01 21:54:10 -0500170struct greybus_manifest_header {
171 __le16 size;
172 __u8 version_major;
173 __u8 version_minor;
174};
175
Alex Elderbadad682014-09-09 13:55:04 -0500176struct greybus_manifest {
177 struct greybus_manifest_header header;
178 struct greybus_descriptor descriptors[0];
179};
180
Greg Kroah-Hartman48123e02014-09-02 10:51:56 -0700181#pragma pack(pop)
182
Alex Elder1dd7f582014-09-26 20:55:32 -0500183#endif /* __GREYBUS_MANIFEST_H */