• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __ACPI_ACPI_PLD_H__
4 #define __ACPI_ACPI_PLD_H__
5 
6 #include <acpi/acpi.h>
7 #include <stdint.h>
8 
9 enum acpi_pld_panel {
10 	PLD_PANEL_TOP,
11 	PLD_PANEL_BOTTOM,
12 	PLD_PANEL_LEFT,
13 	PLD_PANEL_RIGHT,
14 	PLD_PANEL_FRONT,
15 	PLD_PANEL_BACK,
16 	PLD_PANEL_UNKNOWN
17 };
18 
19 enum acpi_pld_vertical_position {
20 	PLD_VERTICAL_POSITION_UPPER,
21 	PLD_VERTICAL_POSITION_CENTER,
22 	PLD_VERTICAL_POSITION_LOWER
23 };
24 
25 enum acpi_pld_horizontal_position {
26 	PLD_HORIZONTAL_POSITION_LEFT,
27 	PLD_HORIZONTAL_POSITION_CENTER,
28 	PLD_HORIZONTAL_POSITION_RIGHT
29 };
30 
31 enum acpi_pld_shape {
32 	PLD_SHAPE_ROUND,
33 	PLD_SHAPE_OVAL,
34 	PLD_SHAPE_SQUARE,
35 	PLD_SHAPE_VERTICAL_RECTANGLE,
36 	PLD_SHAPE_HORIZONTAL_RECTANGLE,
37 	PLD_SHAPE_VERTICAL_TRAPEZOID,
38 	PLD_SHAPE_HORIZONTAL_TRAPEZOID,
39 	PLD_SHAPE_UNKNOWN,
40 	PLD_SHAPE_CHAMFERED
41 };
42 
43 enum acpi_pld_orientation {
44 	PLD_ORIENTATION_HORIZONTAL,
45 	PLD_ORIENTATION_VERTICAL,
46 };
47 
48 enum acpi_pld_rotate {
49 	PLD_ROTATE_0,
50 	PLD_ROTATE_45,
51 	PLD_ROTATE_90,
52 	PLD_ROTATE_135,
53 	PLD_ROTATE_180,
54 	PLD_ROTATE_225,
55 	PLD_ROTATE_270,
56 	PLD_ROTATE_315
57 };
58 
59 #define ACPI_PLD_GROUP(__token, __position)	\
60 	{					\
61 		.token = __token,		\
62 		.position = __position,		\
63 	}
64 
65 /*
66  * ACPI specification 6.3 third paragraph of section 6.1.8:
67  * All Panel references (Top, Bottom, Right, Left, etc.) are interpreted
68  * as though the user is facing the front of the system.
69  *
70  * A `_PLD` describes the offset and rotation of a single device connection point
71  * from an `origin` that resides in the lower left hand corner of its Panel.
72  */
73 
74 #define ACPI_PLD_TYPE_A(__panel, __horiz, __grp)				\
75 	{									\
76 		.visible = true,						\
77 		.panel = PLD_PANEL_##__panel,					\
78 		.shape = PLD_SHAPE_HORIZONTAL_RECTANGLE,			\
79 		.horizontal_position = PLD_HORIZONTAL_POSITION_##__horiz,	\
80 		.group = __grp,							\
81 	}
82 
83 #define ACPI_PLD_TYPE_C(__panel, __horiz, __grp)				\
84 	{									\
85 		.visible = true,						\
86 		.panel = PLD_PANEL_##__panel,					\
87 		.shape = PLD_SHAPE_OVAL,					\
88 		.horizontal_position = PLD_HORIZONTAL_POSITION_##__horiz,	\
89 		.group = __grp,							\
90 	}
91 
92 struct acpi_pld_group {
93 	uint8_t token;
94 	uint8_t position;
95 };
96 
97 struct acpi_pld {
98 	/* Color field can be explicitly ignored */
99 	bool ignore_color;
100 	uint8_t color_red;
101 	uint8_t color_blue;
102 	uint8_t color_green;
103 
104 	/* Port characteristics */
105 	bool visible;		/* Can be seen by the user */
106 	bool lid;		/* Port is on lid of device */
107 	bool dock;		/* Port is in a docking station */
108 	bool bay;		/* Port is in a bay */
109 	bool ejectable;		/* Device is ejectable, has _EJx objects */
110 	bool ejectable_ospm;	/* Device needs OSPM to eject */
111 	uint16_t width;		/* Width in mm */
112 	uint16_t height;	/* Height in mm */
113 	uint16_t vertical_offset;
114 	uint16_t horizontal_offset;
115 	enum acpi_pld_panel panel;
116 	enum acpi_pld_horizontal_position horizontal_position;
117 	enum acpi_pld_vertical_position vertical_position;
118 	enum acpi_pld_shape shape;
119 	enum acpi_pld_rotate rotation;
120 
121 	/* Port grouping */
122 	enum acpi_pld_orientation orientation;
123 	struct acpi_pld_group group;
124 	uint8_t draw_order;
125 	uint8_t cabinet_number;
126 	uint8_t card_cage_number;
127 
128 	/* Set if this PLD defines a reference shape */
129 	bool reference_shape;
130 };
131 
132 /* Fill out PLD structure with defaults based on USB port type */
133 int acpi_pld_fill_usb(struct acpi_pld *pld, enum acpi_upc_type type,
134 		      struct acpi_pld_group *group);
135 
136 /* Turn PLD structure into a 20 byte ACPI buffer */
137 int acpi_pld_to_buffer(const struct acpi_pld *pld, uint8_t *buf, int buf_len);
138 
139 #endif /* __ACPI_ACPI_PLD_H__ */
140