aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/greybus/greybus_manifest.h
blob: 6e62fe478712230698422175e55b237047633f0d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Greybus manifest definition
 *
 * See "Greybus Application Protocol" document (version 0.1) for
 * details on these values and structures.
 *
 * Copyright 2014-2015 Google Inc.
 * Copyright 2014-2015 Linaro Ltd.
 *
 * Released under the GPLv2 and BSD licenses.
 */

#ifndef __GREYBUS_MANIFEST_H
#define __GREYBUS_MANIFEST_H

#include <linux/bits.h>
#include <linux/types.h>

enum greybus_descriptor_type {
	GREYBUS_TYPE_INVALID		= 0x00,
	GREYBUS_TYPE_INTERFACE		= 0x01,
	GREYBUS_TYPE_STRING		= 0x02,
	GREYBUS_TYPE_BUNDLE		= 0x03,
	GREYBUS_TYPE_CPORT		= 0x04,
};

enum greybus_protocol {
	GREYBUS_PROTOCOL_CONTROL	= 0x00,
	/* 0x01 is unused */
	GREYBUS_PROTOCOL_GPIO		= 0x02,
	GREYBUS_PROTOCOL_I2C		= 0x03,
	GREYBUS_PROTOCOL_UART		= 0x04,
	GREYBUS_PROTOCOL_HID		= 0x05,
	GREYBUS_PROTOCOL_USB		= 0x06,
	GREYBUS_PROTOCOL_SDIO		= 0x07,
	GREYBUS_PROTOCOL_POWER_SUPPLY	= 0x08,
	GREYBUS_PROTOCOL_PWM		= 0x09,
	/* 0x0a is unused */
	GREYBUS_PROTOCOL_SPI		= 0x0b,
	GREYBUS_PROTOCOL_DISPLAY	= 0x0c,
	GREYBUS_PROTOCOL_CAMERA_MGMT	= 0x0d,
	GREYBUS_PROTOCOL_SENSOR		= 0x0e,
	GREYBUS_PROTOCOL_LIGHTS		= 0x0f,
	GREYBUS_PROTOCOL_VIBRATOR	= 0x10,
	GREYBUS_PROTOCOL_LOOPBACK	= 0x11,
	GREYBUS_PROTOCOL_AUDIO_MGMT	= 0x12,
	GREYBUS_PROTOCOL_AUDIO_DATA	= 0x13,
	GREYBUS_PROTOCOL_SVC            = 0x14,
	GREYBUS_PROTOCOL_BOOTROM	= 0x15,
	GREYBUS_PROTOCOL_CAMERA_DATA	= 0x16,
	GREYBUS_PROTOCOL_FW_DOWNLOAD	= 0x17,
	GREYBUS_PROTOCOL_FW_MANAGEMENT	= 0x18,
	GREYBUS_PROTOCOL_AUTHENTICATION	= 0x19,
	GREYBUS_PROTOCOL_LOG		= 0x1a,
		/* ... */
	GREYBUS_PROTOCOL_RAW		= 0xfe,
	GREYBUS_PROTOCOL_VENDOR		= 0xff,
};

enum greybus_class_type {
	GREYBUS_CLASS_CONTROL		= 0x00,
	/* 0x01 is unused */
	/* 0x02 is unused */
	/* 0x03 is unused */
	/* 0x04 is unused */
	GREYBUS_CLASS_HID		= 0x05,
	/* 0x06 is unused */
	/* 0x07 is unused */
	GREYBUS_CLASS_POWER_SUPPLY	= 0x08,
	/* 0x09 is unused */
	GREYBUS_CLASS_BRIDGED_PHY	= 0x0a,
	/* 0x0b is unused */
	GREYBUS_CLASS_DISPLAY		= 0x0c,
	GREYBUS_CLASS_CAMERA		= 0x0d,
	GREYBUS_CLASS_SENSOR		= 0x0e,
	GREYBUS_CLASS_LIGHTS		= 0x0f,
	GREYBUS_CLASS_VIBRATOR		= 0x10,
	GREYBUS_CLASS_LOOPBACK		= 0x11,
	GREYBUS_CLASS_AUDIO		= 0x12,
	/* 0x13 is unused */
	/* 0x14 is unused */
	GREYBUS_CLASS_BOOTROM		= 0x15,
	GREYBUS_CLASS_FW_MANAGEMENT	= 0x16,
	GREYBUS_CLASS_LOG		= 0x17,
		/* ... */
	GREYBUS_CLASS_RAW		= 0xfe,
	GREYBUS_CLASS_VENDOR		= 0xff,
};

enum {
	GREYBUS_INTERFACE_FEATURE_TIMESYNC = BIT(0),
};

/*
 * The string in a string descriptor is not NUL-terminated.  The
 * size of the descriptor will be rounded up to a multiple of 4
 * bytes, by padding the string with 0x00 bytes if necessary.
 */
struct greybus_descriptor_string {
	__u8	length;
	__u8	id;
	__u8	string[0];
} __packed;

/*
 * An interface descriptor describes information about an interface as a whole,
 * *not* the functions within it.
 */
struct greybus_descriptor_interface {
	__u8	vendor_stringid;
	__u8	product_stringid;
	__u8	features;
	__u8	pad;
} __packed;

/*
 * An bundle descriptor defines an identification number and a class for
 * each bundle.
 *
 * @id: Uniquely identifies a bundle within a interface, its sole purpose is to
 * allow CPort descriptors to specify which bundle they are associated with.
 * The first bundle will have id 0, second will have 1 and so on.
 *
 * The largest CPort id associated with an bundle (defined by a
 * CPort descriptor in the manifest) is used to determine how to
 * encode the device id and module number in UniPro packets
 * that use the bundle.
 *
 * @class: It is used by kernel to know the functionality provided by the
 * bundle and will be matched against drivers functinality while probing greybus
 * driver. It should contain one of the values defined in
 * 'enum greybus_class_type'.
 *
 */
struct greybus_descriptor_bundle {
	__u8	id;	/* interface-relative id (0..) */
	__u8	class;
	__u8	pad[2];
} __packed;

/*
 * A CPort descriptor indicates the id of the bundle within the
 * module it's associated with, along with the CPort id used to
 * address the CPort.  The protocol id defines the format of messages
 * exchanged using the CPort.
 */
struct greybus_descriptor_cport {
	__le16	id;
	__u8	bundle;
	__u8	protocol_id;	/* enum greybus_protocol */
} __packed;

struct greybus_descriptor_header {
	__le16	size;
	__u8	type;		/* enum greybus_descriptor_type */
	__u8	pad;
} __packed;

struct greybus_descriptor {
	struct greybus_descriptor_header		header;
	union {
		struct greybus_descriptor_string	string;
		struct greybus_descriptor_interface	interface;
		struct greybus_descriptor_bundle	bundle;
		struct greybus_descriptor_cport		cport;
	};
} __packed;

struct greybus_manifest_header {
	__le16	size;
	__u8	version_major;
	__u8	version_minor;
} __packed;

struct greybus_manifest {
	struct greybus_manifest_header		header;
	struct greybus_descriptor		descriptors[0];
} __packed;

#endif /* __GREYBUS_MANIFEST_H */