blob: 4fd27d3823a1f4156c157153d841a22af81b2f31 [file] [log] [blame]
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -07001/*
Alex Elder908a85d2014-09-24 05:16:16 -05002 * Greybus module 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 Elder908a85d2014-09-24 05:16:16 -05008 *
Greg Kroah-Hartman9b60aa02014-10-06 20:37:53 -07009 * Released under the GPLv2 and BSD licenses.
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070010 */
11
Alex Elder1dd7f582014-09-26 20:55:32 -050012#ifndef __GREYBUS_MANIFEST_H
13#define __GREYBUS_MANIFEST_H
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070014
Greg Kroah-Hartman48123e02014-09-02 10:51:56 -070015#pragma pack(push, 1)
16
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070017enum greybus_descriptor_type {
Alex Elder72b0ffc2014-09-26 20:55:33 -050018 GREYBUS_TYPE_INVALID = 0x00,
19 GREYBUS_TYPE_MODULE = 0x01,
Alex Elder63cc9322014-10-02 12:30:02 -050020 GREYBUS_TYPE_STRING = 0x02,
21 GREYBUS_TYPE_INTERFACE = 0x03,
22 GREYBUS_TYPE_CPORT = 0x04,
23 GREYBUS_TYPE_CLASS = 0x05,
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070024};
25
Alex Elder63cc9322014-10-02 12:30:02 -050026enum greybus_protocol {
27 GREYBUS_PROTOCOL_CONTROL = 0x00,
28 GREYBUS_PROTOCOL_AP = 0x01,
29 GREYBUS_PROTOCOL_GPIO = 0x02,
30 GREYBUS_PROTOCOL_I2C = 0x03,
31 GREYBUS_PROTOCOL_UART = 0x04,
32 GREYBUS_PROTOCOL_HID = 0x05,
33 /* ... */
34 GREYBUS_PROTOCOL_VENDOR = 0xff,
35};
36
37enum greybus_class_type {
Alex Elder063e6ec2014-10-03 14:14:23 -050038 GREYBUS_CLASS_CONTROL = 0x00,
39 GREYBUS_CLASS_USB = 0x01,
40 GREYBUS_CLASS_GPIO = 0x02,
41 GREYBUS_CLASS_SPI = 0x03,
42 GREYBUS_CLASS_UART = 0x04,
43 GREYBUS_CLASS_PWM = 0x05,
44 GREYBUS_CLASS_I2S = 0x06,
45 GREYBUS_CLASS_I2C = 0x07,
46 GREYBUS_CLASS_SDIO = 0x08,
47 GREYBUS_CLASS_HID = 0x09,
48 GREYBUS_CLASS_DISPLAY = 0x0a,
49 GREYBUS_CLASS_CAMERA = 0x0b,
50 GREYBUS_CLASS_SENSOR = 0x0c,
51 GREYBUS_CLASS_VENDOR = 0xff,
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -070052};
53
Alex Elderecf7d572014-10-01 21:54:10 -050054/*
55 * A module descriptor describes information about a module as a
56 * whole, *not* the functions within it.
57 */
Matt Porter6d63ff72014-09-26 20:49:48 -050058struct greybus_descriptor_module {
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070059 __le16 vendor;
60 __le16 product;
61 __le16 version;
62 __u8 vendor_stringid;
63 __u8 product_stringid;
Alex Elder63cc9322014-10-02 12:30:02 -050064 __le64 unique_id;
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070065};
66
Alex Elderecf7d572014-10-01 21:54:10 -050067/*
Alex Elder63cc9322014-10-02 12:30:02 -050068 * The string in a string descriptor is not NUL-terminated. The
69 * size of the descriptor will be rounded up to a multiple of 4
70 * bytes, by padding the string with 0x00 bytes if necessary.
Alex Elderecf7d572014-10-01 21:54:10 -050071 */
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070072struct greybus_descriptor_string {
Matt Portercbd0fd72014-09-26 20:49:51 -050073 __u8 length;
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -070074 __u8 id;
75 __u8 string[0];
76};
77
Alex Elder63cc9322014-10-02 12:30:02 -050078/*
79 * An interface descriptor simply defines a module-unique id for
80 * each interface present on a module. Its sole purpose is to allow
81 * CPort descriptors to specify which interface they are associated
82 * with. Normally there's only one interface, with id 0. The
83 * second one must have id 1, and so on consecutively.
84 *
85 * The largest CPort id associated with an interface (defined by a
86 * CPort descriptor in the manifest) is used to determine how to
87 * encode the device id and module number in UniPro packets
88 * that use the interface.
89 */
90struct greybus_descriptor_interface {
91 __u8 id; /* module-relative id (0..) */
92};
93
94/*
95 * A CPort descriptor indicates the id of the interface within the
96 * module it's associated with, along with the CPort id used to
97 * address the CPort. The protocol defines the format of messages
98 * exchanged using the CPort.
99 */
100struct greybus_descriptor_cport {
101 __u8 interface;
102 __le16 id;
103 __u8 protocol; /* enum greybus_protocol */
104};
105
106/*
107 * A class descriptor defines functionality supplied by a module.
108 * Beyond that, not much else is defined yet...
109 */
110struct greybus_descriptor_class {
111 __u8 class; /* enum greybus_class_type */
112};
113
Alex Elderecf7d572014-10-01 21:54:10 -0500114struct greybus_descriptor_header {
115 __le16 size;
Alex Elder63cc9322014-10-02 12:30:02 -0500116 __u8 type; /* enum greybus_descriptor_type */
Greg Kroah-Hartmand5877802014-09-01 10:59:08 -0700117};
118
Greg Kroah-Hartman6dca7b92014-09-01 13:42:43 -0700119struct greybus_descriptor {
Alex Elder63cc9322014-10-02 12:30:02 -0500120 struct greybus_descriptor_header header;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700121 union {
Matt Porter6d63ff72014-09-26 20:49:48 -0500122 struct greybus_descriptor_module module;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700123 struct greybus_descriptor_string string;
Alex Elderecf7d572014-10-01 21:54:10 -0500124 struct greybus_descriptor_interface interface;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700125 struct greybus_descriptor_cport cport;
Alex Elder63cc9322014-10-02 12:30:02 -0500126 struct greybus_descriptor_class class;
Greg Kroah-Hartman80ebe8a2014-08-31 18:08:52 -0700127 };
128};
129
Alex Elderecf7d572014-10-01 21:54:10 -0500130struct greybus_manifest_header {
131 __le16 size;
132 __u8 version_major;
133 __u8 version_minor;
134};
135
Alex Elderbadad682014-09-09 13:55:04 -0500136struct greybus_manifest {
137 struct greybus_manifest_header header;
138 struct greybus_descriptor descriptors[0];
139};
140
Greg Kroah-Hartman48123e02014-09-02 10:51:56 -0700141#pragma pack(pop)
142
Alex Elder1dd7f582014-09-26 20:55:32 -0500143#endif /* __GREYBUS_MANIFEST_H */