xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_chamelium.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat Inc.
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors: Lyude Paul <[email protected]>
24*d83cc019SAndroid Build Coastguard Worker  */
25*d83cc019SAndroid Build Coastguard Worker 
26*d83cc019SAndroid Build Coastguard Worker #ifndef IGT_CHAMELIUM_H
27*d83cc019SAndroid Build Coastguard Worker #define IGT_CHAMELIUM_H
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include "config.h"
30*d83cc019SAndroid Build Coastguard Worker 
31*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
32*d83cc019SAndroid Build Coastguard Worker #include <xf86drmMode.h>
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker struct igt_fb;
37*d83cc019SAndroid Build Coastguard Worker struct edid;
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker struct chamelium;
40*d83cc019SAndroid Build Coastguard Worker struct chamelium_port;
41*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump;
42*d83cc019SAndroid Build Coastguard Worker struct chamelium_fb_crc_async_data;
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker /**
45*d83cc019SAndroid Build Coastguard Worker  * chamelium_check:
46*d83cc019SAndroid Build Coastguard Worker  * @CHAMELIUM_CHECK_ANALOG: Fuzzy checking method for analog interfaces
47*d83cc019SAndroid Build Coastguard Worker  * @CHAMELIUM_CHECK_CRC: CRC-based checking method for pixel-perfect interfaces
48*d83cc019SAndroid Build Coastguard Worker  *
49*d83cc019SAndroid Build Coastguard Worker  * Checking method for comparing between reference and captured frames.
50*d83cc019SAndroid Build Coastguard Worker  */
51*d83cc019SAndroid Build Coastguard Worker enum chamelium_check {
52*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_CHECK_ANALOG,
53*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_CHECK_CHECKERBOARD,
54*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_CHECK_CRC,
55*d83cc019SAndroid Build Coastguard Worker };
56*d83cc019SAndroid Build Coastguard Worker 
57*d83cc019SAndroid Build Coastguard Worker struct chamelium_video_params {
58*d83cc019SAndroid Build Coastguard Worker 	double clock;
59*d83cc019SAndroid Build Coastguard Worker 	int htotal, hactive, hsync_offset, hsync_width, hsync_polarity;
60*d83cc019SAndroid Build Coastguard Worker 	int vtotal, vactive, vsync_offset, vsync_width, vsync_polarity;
61*d83cc019SAndroid Build Coastguard Worker };
62*d83cc019SAndroid Build Coastguard Worker 
63*d83cc019SAndroid Build Coastguard Worker struct chamelium_audio_file {
64*d83cc019SAndroid Build Coastguard Worker 	char *path;
65*d83cc019SAndroid Build Coastguard Worker 	int rate; /* Hz */
66*d83cc019SAndroid Build Coastguard Worker 	int channels;
67*d83cc019SAndroid Build Coastguard Worker };
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker enum chamelium_infoframe_type {
70*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_INFOFRAME_AVI,
71*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_INFOFRAME_AUDIO,
72*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_INFOFRAME_MPEG,
73*d83cc019SAndroid Build Coastguard Worker 	CHAMELIUM_INFOFRAME_VENDOR,
74*d83cc019SAndroid Build Coastguard Worker };
75*d83cc019SAndroid Build Coastguard Worker 
76*d83cc019SAndroid Build Coastguard Worker struct chamelium_infoframe {
77*d83cc019SAndroid Build Coastguard Worker 	int version;
78*d83cc019SAndroid Build Coastguard Worker 	size_t payload_size;
79*d83cc019SAndroid Build Coastguard Worker 	uint8_t *payload;
80*d83cc019SAndroid Build Coastguard Worker };
81*d83cc019SAndroid Build Coastguard Worker 
82*d83cc019SAndroid Build Coastguard Worker struct chamelium_edid;
83*d83cc019SAndroid Build Coastguard Worker 
84*d83cc019SAndroid Build Coastguard Worker /**
85*d83cc019SAndroid Build Coastguard Worker  * CHAMELIUM_MAX_PORTS: the maximum number of ports supported by igt_chamelium.
86*d83cc019SAndroid Build Coastguard Worker  *
87*d83cc019SAndroid Build Coastguard Worker  * For now, we have 1 VGA, 1 HDMI and 2 DisplayPort ports.
88*d83cc019SAndroid Build Coastguard Worker  */
89*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_MAX_PORTS 4
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker /**
92*d83cc019SAndroid Build Coastguard Worker  * CHAMELIUM_DEFAULT_EDID: provide this ID to #chamelium_port_set_edid to use
93*d83cc019SAndroid Build Coastguard Worker  * the default EDID.
94*d83cc019SAndroid Build Coastguard Worker  */
95*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_DEFAULT_EDID 0
96*d83cc019SAndroid Build Coastguard Worker 
97*d83cc019SAndroid Build Coastguard Worker /**
98*d83cc019SAndroid Build Coastguard Worker  * CHAMELIUM_MAX_AUDIO_CHANNELS: the maximum number of audio capture channels
99*d83cc019SAndroid Build Coastguard Worker  * supported by Chamelium.
100*d83cc019SAndroid Build Coastguard Worker  */
101*d83cc019SAndroid Build Coastguard Worker #define CHAMELIUM_MAX_AUDIO_CHANNELS 8
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker struct chamelium *chamelium_init(int drm_fd);
104*d83cc019SAndroid Build Coastguard Worker void chamelium_deinit(struct chamelium *chamelium);
105*d83cc019SAndroid Build Coastguard Worker void chamelium_reset(struct chamelium *chamelium);
106*d83cc019SAndroid Build Coastguard Worker 
107*d83cc019SAndroid Build Coastguard Worker struct chamelium_port **chamelium_get_ports(struct chamelium *chamelium,
108*d83cc019SAndroid Build Coastguard Worker 					    int *count);
109*d83cc019SAndroid Build Coastguard Worker unsigned int chamelium_port_get_type(const struct chamelium_port *port);
110*d83cc019SAndroid Build Coastguard Worker drmModeConnector *chamelium_port_get_connector(struct chamelium *chamelium,
111*d83cc019SAndroid Build Coastguard Worker 					       struct chamelium_port *port,
112*d83cc019SAndroid Build Coastguard Worker 					       bool reprobe);
113*d83cc019SAndroid Build Coastguard Worker const char *chamelium_port_get_name(struct chamelium_port *port);
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker void chamelium_wait_reachable(struct chamelium *chamelium, int timeout);
116*d83cc019SAndroid Build Coastguard Worker void chamelium_plug(struct chamelium *chamelium, struct chamelium_port *port);
117*d83cc019SAndroid Build Coastguard Worker void chamelium_unplug(struct chamelium *chamelium, struct chamelium_port *port);
118*d83cc019SAndroid Build Coastguard Worker bool chamelium_is_plugged(struct chamelium *chamelium,
119*d83cc019SAndroid Build Coastguard Worker 			  struct chamelium_port *port);
120*d83cc019SAndroid Build Coastguard Worker bool chamelium_port_wait_video_input_stable(struct chamelium *chamelium,
121*d83cc019SAndroid Build Coastguard Worker 					    struct chamelium_port *port,
122*d83cc019SAndroid Build Coastguard Worker 					    int timeout_secs);
123*d83cc019SAndroid Build Coastguard Worker void chamelium_fire_mixed_hpd_pulses(struct chamelium *chamelium,
124*d83cc019SAndroid Build Coastguard Worker 				     struct chamelium_port *port, ...);
125*d83cc019SAndroid Build Coastguard Worker void chamelium_fire_hpd_pulses(struct chamelium *chamelium,
126*d83cc019SAndroid Build Coastguard Worker 			       struct chamelium_port *port,
127*d83cc019SAndroid Build Coastguard Worker 			       int width_msec, int count);
128*d83cc019SAndroid Build Coastguard Worker void chamelium_schedule_hpd_toggle(struct chamelium *chamelium,
129*d83cc019SAndroid Build Coastguard Worker 				   struct chamelium_port *port, int delay_ms,
130*d83cc019SAndroid Build Coastguard Worker 				   bool rising_edge);
131*d83cc019SAndroid Build Coastguard Worker struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium,
132*d83cc019SAndroid Build Coastguard Worker 					  const struct edid *edid);
133*d83cc019SAndroid Build Coastguard Worker const struct edid *chamelium_edid_get_raw(struct chamelium_edid *edid,
134*d83cc019SAndroid Build Coastguard Worker 					  struct chamelium_port *port);
135*d83cc019SAndroid Build Coastguard Worker void chamelium_port_set_edid(struct chamelium *chamelium,
136*d83cc019SAndroid Build Coastguard Worker 			     struct chamelium_port *port,
137*d83cc019SAndroid Build Coastguard Worker 			     struct chamelium_edid *edid);
138*d83cc019SAndroid Build Coastguard Worker bool chamelium_port_get_ddc_state(struct chamelium *chamelium,
139*d83cc019SAndroid Build Coastguard Worker 				  struct chamelium_port *port);
140*d83cc019SAndroid Build Coastguard Worker void chamelium_port_set_ddc_state(struct chamelium *chamelium,
141*d83cc019SAndroid Build Coastguard Worker 				  struct chamelium_port *port,
142*d83cc019SAndroid Build Coastguard Worker 				  bool enabled);
143*d83cc019SAndroid Build Coastguard Worker void chamelium_port_get_resolution(struct chamelium *chamelium,
144*d83cc019SAndroid Build Coastguard Worker 				   struct chamelium_port *port,
145*d83cc019SAndroid Build Coastguard Worker 				   int *x, int *y);
146*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_get_video_params(struct chamelium *chamelium);
147*d83cc019SAndroid Build Coastguard Worker void chamelium_port_get_video_params(struct chamelium *chamelium,
148*d83cc019SAndroid Build Coastguard Worker 				     struct chamelium_port *port,
149*d83cc019SAndroid Build Coastguard Worker 				     struct chamelium_video_params *params);
150*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_get_crc_for_area(struct chamelium *chamelium,
151*d83cc019SAndroid Build Coastguard Worker 				      struct chamelium_port *port,
152*d83cc019SAndroid Build Coastguard Worker 				      int x, int y, int w, int h);
153*d83cc019SAndroid Build Coastguard Worker void chamelium_start_capture(struct chamelium *chamelium,
154*d83cc019SAndroid Build Coastguard Worker 			     struct chamelium_port *port,
155*d83cc019SAndroid Build Coastguard Worker 			     int x, int y, int w, int h);
156*d83cc019SAndroid Build Coastguard Worker void chamelium_stop_capture(struct chamelium *chamelium, int frame_count);
157*d83cc019SAndroid Build Coastguard Worker void chamelium_capture(struct chamelium *chamelium, struct chamelium_port *port,
158*d83cc019SAndroid Build Coastguard Worker 		       int x, int y, int w, int h, int frame_count);
159*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_get_last_infoframe(struct chamelium *chamelium);
160*d83cc019SAndroid Build Coastguard Worker struct chamelium_infoframe *
161*d83cc019SAndroid Build Coastguard Worker chamelium_get_last_infoframe(struct chamelium *chamelium,
162*d83cc019SAndroid Build Coastguard Worker 			     struct chamelium_port *port,
163*d83cc019SAndroid Build Coastguard Worker 			     enum chamelium_infoframe_type type);
164*d83cc019SAndroid Build Coastguard Worker bool chamelium_supports_trigger_link_failure(struct chamelium *chamelium);
165*d83cc019SAndroid Build Coastguard Worker void chamelium_trigger_link_failure(struct chamelium *chamelium,
166*d83cc019SAndroid Build Coastguard Worker 				    struct chamelium_port *port);
167*d83cc019SAndroid Build Coastguard Worker bool chamelium_has_audio_support(struct chamelium *chamelium,
168*d83cc019SAndroid Build Coastguard Worker 				 struct chamelium_port *port);
169*d83cc019SAndroid Build Coastguard Worker void chamelium_get_audio_channel_mapping(struct chamelium *chamelium,
170*d83cc019SAndroid Build Coastguard Worker 					 struct chamelium_port *port,
171*d83cc019SAndroid Build Coastguard Worker 					 int mapping[static CHAMELIUM_MAX_AUDIO_CHANNELS]);
172*d83cc019SAndroid Build Coastguard Worker void chamelium_get_audio_format(struct chamelium *chamelium,
173*d83cc019SAndroid Build Coastguard Worker 				struct chamelium_port *port,
174*d83cc019SAndroid Build Coastguard Worker 				int *rate, int *channels);
175*d83cc019SAndroid Build Coastguard Worker void chamelium_start_capturing_audio(struct chamelium *chamelium,
176*d83cc019SAndroid Build Coastguard Worker 				    struct chamelium_port *port, bool save_to_file);
177*d83cc019SAndroid Build Coastguard Worker struct chamelium_audio_file *chamelium_stop_capturing_audio(struct chamelium *chamelium,
178*d83cc019SAndroid Build Coastguard Worker 							    struct chamelium_port *port);
179*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_read_captured_crcs(struct chamelium *chamelium,
180*d83cc019SAndroid Build Coastguard Worker 					int *frame_count);
181*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump *chamelium_read_captured_frame(struct chamelium *chamelium,
182*d83cc019SAndroid Build Coastguard Worker 							   unsigned int index);
183*d83cc019SAndroid Build Coastguard Worker struct chamelium_frame_dump *chamelium_port_dump_pixels(struct chamelium *chamelium,
184*d83cc019SAndroid Build Coastguard Worker 							struct chamelium_port *port,
185*d83cc019SAndroid Build Coastguard Worker 							int x, int y,
186*d83cc019SAndroid Build Coastguard Worker 							int w, int h);
187*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_calculate_fb_crc(int fd, struct igt_fb *fb);
188*d83cc019SAndroid Build Coastguard Worker struct chamelium_fb_crc_async_data *chamelium_calculate_fb_crc_async_start(int fd,
189*d83cc019SAndroid Build Coastguard Worker 									   struct igt_fb *fb);
190*d83cc019SAndroid Build Coastguard Worker igt_crc_t *chamelium_calculate_fb_crc_async_finish(struct chamelium_fb_crc_async_data *fb_crc);
191*d83cc019SAndroid Build Coastguard Worker int chamelium_get_captured_frame_count(struct chamelium *chamelium);
192*d83cc019SAndroid Build Coastguard Worker int chamelium_get_frame_limit(struct chamelium *chamelium,
193*d83cc019SAndroid Build Coastguard Worker 			      struct chamelium_port *port,
194*d83cc019SAndroid Build Coastguard Worker 			      int w, int h);
195*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_frame_eq(const struct chamelium *chamelium,
196*d83cc019SAndroid Build Coastguard Worker 			       const struct chamelium_frame_dump *dump,
197*d83cc019SAndroid Build Coastguard Worker 			       struct igt_fb *fb);
198*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_crc_eq_or_dump(struct chamelium *chamelium,
199*d83cc019SAndroid Build Coastguard Worker 				     igt_crc_t *reference_crc,
200*d83cc019SAndroid Build Coastguard Worker 				     igt_crc_t *capture_crc, struct igt_fb *fb,
201*d83cc019SAndroid Build Coastguard Worker 				     int index);
202*d83cc019SAndroid Build Coastguard Worker void chamelium_assert_frame_match_or_dump(struct chamelium *chamelium,
203*d83cc019SAndroid Build Coastguard Worker 					  struct chamelium_port *port,
204*d83cc019SAndroid Build Coastguard Worker 					  const struct chamelium_frame_dump *frame,
205*d83cc019SAndroid Build Coastguard Worker 					  struct igt_fb *fb,
206*d83cc019SAndroid Build Coastguard Worker 					  enum chamelium_check check);
207*d83cc019SAndroid Build Coastguard Worker void chamelium_crop_analog_frame(struct chamelium_frame_dump *dump, int width,
208*d83cc019SAndroid Build Coastguard Worker 				 int height);
209*d83cc019SAndroid Build Coastguard Worker void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump);
210*d83cc019SAndroid Build Coastguard Worker void chamelium_destroy_audio_file(struct chamelium_audio_file *audio_file);
211*d83cc019SAndroid Build Coastguard Worker void chamelium_infoframe_destroy(struct chamelium_infoframe *infoframe);
212*d83cc019SAndroid Build Coastguard Worker 
213*d83cc019SAndroid Build Coastguard Worker #endif /* IGT_CHAMELIUM_H */
214