1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2017 Intel Corporation
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 * Displayport Compliance Testing Application
24*d83cc019SAndroid Build Coastguard Worker *
25*d83cc019SAndroid Build Coastguard Worker * This is the userspace component of the Displayport Compliance testing
26*d83cc019SAndroid Build Coastguard Worker * software required for compliance testing of the I915 Display Port driver.
27*d83cc019SAndroid Build Coastguard Worker * This must be running in order to successfully complete Display Port
28*d83cc019SAndroid Build Coastguard Worker * compliance testing. This app and the kernel code that accompanies it has been
29*d83cc019SAndroid Build Coastguard Worker * written to satify the requirements of the Displayport Link CTS 1.2 rev1.1
30*d83cc019SAndroid Build Coastguard Worker * specification from VESA. Note that this application does not support eDP
31*d83cc019SAndroid Build Coastguard Worker * compliance testing.
32*d83cc019SAndroid Build Coastguard Worker *
33*d83cc019SAndroid Build Coastguard Worker * Compliance Testing requires several components:
34*d83cc019SAndroid Build Coastguard Worker * - A kernel build that contains the patch set for DP compliance support
35*d83cc019SAndroid Build Coastguard Worker * - A Displayport Compliance Testing appliance such as Unigraf-DPR120
36*d83cc019SAndroid Build Coastguard Worker * - This user application
37*d83cc019SAndroid Build Coastguard Worker * - A windows host machine to run the DPR test software
38*d83cc019SAndroid Build Coastguard Worker * - Root access on the DUT due to the use of sysfs utility
39*d83cc019SAndroid Build Coastguard Worker *
40*d83cc019SAndroid Build Coastguard Worker * Test Setup:
41*d83cc019SAndroid Build Coastguard Worker * It is strongly recommended that the windows host, test appliance and DUT
42*d83cc019SAndroid Build Coastguard Worker * be freshly restarted before any testing begins to ensure that any previous
43*d83cc019SAndroid Build Coastguard Worker * configurations and settings will not interfere with test process. Refer to
44*d83cc019SAndroid Build Coastguard Worker * the test appliance documentation for setup, software installation and
45*d83cc019SAndroid Build Coastguard Worker * operation specific to that device.
46*d83cc019SAndroid Build Coastguard Worker *
47*d83cc019SAndroid Build Coastguard Worker * The Linux DUT must be in text (console) mode and cannot have any other
48*d83cc019SAndroid Build Coastguard Worker * display manager running. You must be logged in as root to run this user app.
49*d83cc019SAndroid Build Coastguard Worker * Once the user application is up and running, waiting for test requests, the
50*d83cc019SAndroid Build Coastguard Worker * software on the windows host can now be used to execute the compliance tests.
51*d83cc019SAndroid Build Coastguard Worker *
52*d83cc019SAndroid Build Coastguard Worker * This userspace application supports following tests from the DP CTS Spec
53*d83cc019SAndroid Build Coastguard Worker * Rev 1.1:
54*d83cc019SAndroid Build Coastguard Worker * - Link Training Tests: Supports tests 4.3.1.1 to 4.3.2.3
55*d83cc019SAndroid Build Coastguard Worker * - EDID Tests: Supports EDID read (4.2.2.3),EDID Read failure and corruption
56*d83cc019SAndroid Build Coastguard Worker * detection tests (4.2.2.4, 4.2.2.5, 4.2.2.6)
57*d83cc019SAndroid Build Coastguard Worker * - Video Pattern generation tests: This supports only the 24 and 18bpp color
58*d83cc019SAndroid Build Coastguard Worker * ramp test pattern (4.3.3.1).
59*d83cc019SAndroid Build Coastguard Worker *
60*d83cc019SAndroid Build Coastguard Worker * Connections (required):
61*d83cc019SAndroid Build Coastguard Worker * - Test Appliance connected to the external Displayport connector on the DUT
62*d83cc019SAndroid Build Coastguard Worker * - Test Appliance Monitor Out connected to Displayport connector on the
63*d83cc019SAndroid Build Coastguard Worker * monitor
64*d83cc019SAndroid Build Coastguard Worker * - Test appliance connected to the Windows Host via USB
65*d83cc019SAndroid Build Coastguard Worker *
66*d83cc019SAndroid Build Coastguard Worker * Debugfs Files:
67*d83cc019SAndroid Build Coastguard Worker * The file root for all the debugfs file:
68*d83cc019SAndroid Build Coastguard Worker * /sys/kernel/debug/dri/0/
69*d83cc019SAndroid Build Coastguard Worker *
70*d83cc019SAndroid Build Coastguard Worker * The specific files are as follows:
71*d83cc019SAndroid Build Coastguard Worker *
72*d83cc019SAndroid Build Coastguard Worker * i915_dp_test_active
73*d83cc019SAndroid Build Coastguard Worker * A simple flag that indicates whether or not compliance testing is currently
74*d83cc019SAndroid Build Coastguard Worker * active in the kernel. This flag is polled by userspace and once set, invokes
75*d83cc019SAndroid Build Coastguard Worker * the test handler in the user app. This flag is set by the test handler in the
76*d83cc019SAndroid Build Coastguard Worker * kernel after reading the registers requested by the test appliance.
77*d83cc019SAndroid Build Coastguard Worker *
78*d83cc019SAndroid Build Coastguard Worker * i915_dp_test_data
79*d83cc019SAndroid Build Coastguard Worker * Test data is used by the kernel to pass parameters to the user app. Eg: In
80*d83cc019SAndroid Build Coastguard Worker * case of EDID tests, the data that is delivered to the userspace is the video
81*d83cc019SAndroid Build Coastguard Worker * mode to be set for the test.
82*d83cc019SAndroid Build Coastguard Worker * In case of video pattern test, the data that is delivered to the userspace is
83*d83cc019SAndroid Build Coastguard Worker * the width and height of the test pattern and the bits per color value.
84*d83cc019SAndroid Build Coastguard Worker *
85*d83cc019SAndroid Build Coastguard Worker * i915_dp_test_type
86*d83cc019SAndroid Build Coastguard Worker * The test type variable instructs the user app as to what the requested test
87*d83cc019SAndroid Build Coastguard Worker * was from the sink device. These values defined at the top of the application's
88*d83cc019SAndroid Build Coastguard Worker * main implementation file must be kept in sync with the values defined in the
89*d83cc019SAndroid Build Coastguard Worker * kernel's drm_dp_helper.h file.
90*d83cc019SAndroid Build Coastguard Worker * This app is based on some prior work submitted in April 2015 by Todd Previte
91*d83cc019SAndroid Build Coastguard Worker * (<[email protected]>)
92*d83cc019SAndroid Build Coastguard Worker *
93*d83cc019SAndroid Build Coastguard Worker *
94*d83cc019SAndroid Build Coastguard Worker * This tool can be run as:
95*d83cc019SAndroid Build Coastguard Worker * ./intel_dp_compliance It will wait till you start compliance suite from
96*d83cc019SAndroid Build Coastguard Worker * DPR 120.
97*d83cc019SAndroid Build Coastguard Worker * ./intel_dp_compliance -h This will open the help
98*d83cc019SAndroid Build Coastguard Worker * ./intel_dp_compliance -i This will provide information about current
99*d83cc019SAndroid Build Coastguard Worker * connectors/CRTCs. This can be used for debugging purpose.
100*d83cc019SAndroid Build Coastguard Worker *
101*d83cc019SAndroid Build Coastguard Worker * Authors:
102*d83cc019SAndroid Build Coastguard Worker * Manasi Navare <[email protected]>
103*d83cc019SAndroid Build Coastguard Worker *
104*d83cc019SAndroid Build Coastguard Worker * Elements of the modeset code adapted from David Herrmann's
105*d83cc019SAndroid Build Coastguard Worker * DRM modeset example
106*d83cc019SAndroid Build Coastguard Worker *
107*d83cc019SAndroid Build Coastguard Worker */
108*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
109*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
110*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
111*d83cc019SAndroid Build Coastguard Worker #include <math.h>
112*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
113*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
114*d83cc019SAndroid Build Coastguard Worker #include <strings.h>
115*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
116*d83cc019SAndroid Build Coastguard Worker #include <termios.h>
117*d83cc019SAndroid Build Coastguard Worker #include <sys/poll.h>
118*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
119*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
120*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
121*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
122*d83cc019SAndroid Build Coastguard Worker #include <sys/select.h>
123*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
124*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
125*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
126*d83cc019SAndroid Build Coastguard Worker #include <time.h>
127*d83cc019SAndroid Build Coastguard Worker
128*d83cc019SAndroid Build Coastguard Worker #include "intel_dp_compliance.h"
129*d83cc019SAndroid Build Coastguard Worker
130*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
131*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
132*d83cc019SAndroid Build Coastguard Worker
133*d83cc019SAndroid Build Coastguard Worker /* User Input definitions */
134*d83cc019SAndroid Build Coastguard Worker #define HELP_DESCRIPTION 1
135*d83cc019SAndroid Build Coastguard Worker
136*d83cc019SAndroid Build Coastguard Worker /* Debugfs file definitions */
137*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_TEST_TYPE_FILE "i915_dp_test_type"
138*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_TEST_ACTIVE_FILE "i915_dp_test_active"
139*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_TEST_DATA_FILE "i915_dp_test_data"
140*d83cc019SAndroid Build Coastguard Worker
141*d83cc019SAndroid Build Coastguard Worker /* DRM definitions - must be kept in sync with the DRM header */
142*d83cc019SAndroid Build Coastguard Worker #define DP_TEST_LINK_TRAINING (1 << 0)
143*d83cc019SAndroid Build Coastguard Worker #define DP_TEST_LINK_VIDEO_PATTERN (1 << 1)
144*d83cc019SAndroid Build Coastguard Worker #define DP_TEST_LINK_EDID_READ (1 << 2)
145*d83cc019SAndroid Build Coastguard Worker #define DP_TEST_LINK_PHY_TEST_PATTERN (1 << 3) /* DPCD >= 1.1 */
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker #define DP_COMPLIANCE_TEST_TYPE_MASK (DP_TEST_LINK_TRAINING | \
148*d83cc019SAndroid Build Coastguard Worker DP_TEST_LINK_VIDEO_PATTERN | \
149*d83cc019SAndroid Build Coastguard Worker DP_TEST_LINK_EDID_READ | \
150*d83cc019SAndroid Build Coastguard Worker DP_TEST_LINK_PHY_TEST_PATTERN)
151*d83cc019SAndroid Build Coastguard Worker
152*d83cc019SAndroid Build Coastguard Worker /* NOTE: These must be kept in sync with the definitions in intel_dp.c */
153*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_EDID_SHIFT_MASK 0
154*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_EDID_OK (0 << INTEL_DP_EDID_SHIFT_MASK)
155*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_EDID_CORRUPT (1 << INTEL_DP_EDID_SHIFT_MASK)
156*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_RESOLUTION_SHIFT_MASK 0
157*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_RESOLUTION_PREFERRED (1 << INTEL_DP_RESOLUTION_SHIFT_MASK)
158*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_RESOLUTION_STANDARD (2 << INTEL_DP_RESOLUTION_SHIFT_MASK)
159*d83cc019SAndroid Build Coastguard Worker #define INTEL_DP_RESOLUTION_FAILSAFE (3 << INTEL_DP_RESOLUTION_SHIFT_MASK)
160*d83cc019SAndroid Build Coastguard Worker #define DP_COMPLIANCE_VIDEO_MODE_MASK (INTEL_DP_RESOLUTION_PREFERRED |\
161*d83cc019SAndroid Build Coastguard Worker INTEL_DP_RESOLUTION_STANDARD |\
162*d83cc019SAndroid Build Coastguard Worker INTEL_DP_RESOLUTION_FAILSAFE)
163*d83cc019SAndroid Build Coastguard Worker
164*d83cc019SAndroid Build Coastguard Worker /* Global file pointers for the sysfs files */
165*d83cc019SAndroid Build Coastguard Worker FILE *test_active_fp, *test_data_fp, *test_type_fp;
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker bool video_pattern_flag;
168*d83cc019SAndroid Build Coastguard Worker
169*d83cc019SAndroid Build Coastguard Worker /* Video pattern test globals */
170*d83cc019SAndroid Build Coastguard Worker uint16_t hdisplay;
171*d83cc019SAndroid Build Coastguard Worker uint16_t vdisplay;
172*d83cc019SAndroid Build Coastguard Worker uint8_t bitdepth;
173*d83cc019SAndroid Build Coastguard Worker
174*d83cc019SAndroid Build Coastguard Worker static int tio_fd;
175*d83cc019SAndroid Build Coastguard Worker struct termios saved_tio;
176*d83cc019SAndroid Build Coastguard Worker
177*d83cc019SAndroid Build Coastguard Worker drmModeRes *resources;
178*d83cc019SAndroid Build Coastguard Worker int drm_fd, modes, gen;
179*d83cc019SAndroid Build Coastguard Worker uint64_t tiling = LOCAL_DRM_FORMAT_MOD_NONE;
180*d83cc019SAndroid Build Coastguard Worker uint32_t depth = 24, stride, bpp;
181*d83cc019SAndroid Build Coastguard Worker int specified_mode_num = -1, specified_disp_id = -1;
182*d83cc019SAndroid Build Coastguard Worker int width, height;
183*d83cc019SAndroid Build Coastguard Worker uint32_t test_crtc;
184*d83cc019SAndroid Build Coastguard Worker uint32_t test_connector_id;
185*d83cc019SAndroid Build Coastguard Worker enum {
186*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_INVALID = -1,
187*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_NONE = 0,
188*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_PREFERRED,
189*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_STANDARD,
190*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_FAILSAFE,
191*d83cc019SAndroid Build Coastguard Worker INTEL_MODE_VIDEO_PATTERN_TEST
192*d83cc019SAndroid Build Coastguard Worker } intel_display_mode;
193*d83cc019SAndroid Build Coastguard Worker
194*d83cc019SAndroid Build Coastguard Worker struct test_video_pattern {
195*d83cc019SAndroid Build Coastguard Worker uint16_t hdisplay;
196*d83cc019SAndroid Build Coastguard Worker uint16_t vdisplay;
197*d83cc019SAndroid Build Coastguard Worker uint8_t bitdepth;
198*d83cc019SAndroid Build Coastguard Worker uint32_t fb;
199*d83cc019SAndroid Build Coastguard Worker uint32_t size;
200*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb_pattern;
201*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo mode;
202*d83cc019SAndroid Build Coastguard Worker uint32_t *pixmap;
203*d83cc019SAndroid Build Coastguard Worker };
204*d83cc019SAndroid Build Coastguard Worker
205*d83cc019SAndroid Build Coastguard Worker struct connector {
206*d83cc019SAndroid Build Coastguard Worker uint32_t id;
207*d83cc019SAndroid Build Coastguard Worker int mode_valid;
208*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo mode, mode_standard, mode_preferred, mode_failsafe;
209*d83cc019SAndroid Build Coastguard Worker drmModeConnector *connector;
210*d83cc019SAndroid Build Coastguard Worker int crtc;
211*d83cc019SAndroid Build Coastguard Worker /* Standard and preferred frame buffer*/
212*d83cc019SAndroid Build Coastguard Worker uint32_t fb, fb_width, fb_height, fb_size;
213*d83cc019SAndroid Build Coastguard Worker uint8_t *pixmap;
214*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb_video_pattern;
215*d83cc019SAndroid Build Coastguard Worker /* Failsafe framebuffer - note this is a 16-bit buffer */
216*d83cc019SAndroid Build Coastguard Worker uint32_t failsafe_fb, failsafe_width, failsafe_height;
217*d83cc019SAndroid Build Coastguard Worker uint32_t failsafe_size;
218*d83cc019SAndroid Build Coastguard Worker uint8_t *failsafe_pixmap;
219*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb_failsafe_pattern;
220*d83cc019SAndroid Build Coastguard Worker struct test_video_pattern test_pattern;
221*d83cc019SAndroid Build Coastguard Worker };
222*d83cc019SAndroid Build Coastguard Worker
clear_test_active(void)223*d83cc019SAndroid Build Coastguard Worker static void clear_test_active(void)
224*d83cc019SAndroid Build Coastguard Worker {
225*d83cc019SAndroid Build Coastguard Worker rewind(test_active_fp);
226*d83cc019SAndroid Build Coastguard Worker fprintf(test_active_fp, "%d", 0);
227*d83cc019SAndroid Build Coastguard Worker fflush(test_active_fp);
228*d83cc019SAndroid Build Coastguard Worker }
229*d83cc019SAndroid Build Coastguard Worker
fopenat(int dir,const char * name,const char * mode)230*d83cc019SAndroid Build Coastguard Worker static FILE *fopenat(int dir, const char *name, const char *mode)
231*d83cc019SAndroid Build Coastguard Worker {
232*d83cc019SAndroid Build Coastguard Worker int fd = openat(dir, name, O_RDWR);
233*d83cc019SAndroid Build Coastguard Worker return fdopen(fd, mode);
234*d83cc019SAndroid Build Coastguard Worker }
235*d83cc019SAndroid Build Coastguard Worker
setup_debugfs_files(void)236*d83cc019SAndroid Build Coastguard Worker static void setup_debugfs_files(void)
237*d83cc019SAndroid Build Coastguard Worker {
238*d83cc019SAndroid Build Coastguard Worker int dir = igt_debugfs_dir(drm_fd);
239*d83cc019SAndroid Build Coastguard Worker
240*d83cc019SAndroid Build Coastguard Worker test_type_fp = fopenat(dir, INTEL_DP_TEST_TYPE_FILE, "r");
241*d83cc019SAndroid Build Coastguard Worker igt_require(test_type_fp);
242*d83cc019SAndroid Build Coastguard Worker
243*d83cc019SAndroid Build Coastguard Worker test_data_fp = fopenat(dir, INTEL_DP_TEST_DATA_FILE, "r");
244*d83cc019SAndroid Build Coastguard Worker igt_require(test_data_fp);
245*d83cc019SAndroid Build Coastguard Worker
246*d83cc019SAndroid Build Coastguard Worker test_active_fp = fopenat(dir, INTEL_DP_TEST_ACTIVE_FILE, "w+");
247*d83cc019SAndroid Build Coastguard Worker igt_require(test_active_fp);
248*d83cc019SAndroid Build Coastguard Worker
249*d83cc019SAndroid Build Coastguard Worker close(dir);
250*d83cc019SAndroid Build Coastguard Worker
251*d83cc019SAndroid Build Coastguard Worker /* Reset the active flag for safety */
252*d83cc019SAndroid Build Coastguard Worker clear_test_active();
253*d83cc019SAndroid Build Coastguard Worker }
254*d83cc019SAndroid Build Coastguard Worker
get_test_type(void)255*d83cc019SAndroid Build Coastguard Worker static unsigned long get_test_type(void)
256*d83cc019SAndroid Build Coastguard Worker {
257*d83cc019SAndroid Build Coastguard Worker unsigned long test_type;
258*d83cc019SAndroid Build Coastguard Worker int ret;
259*d83cc019SAndroid Build Coastguard Worker
260*d83cc019SAndroid Build Coastguard Worker if (!test_type_fp)
261*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid test_type file\n");
262*d83cc019SAndroid Build Coastguard Worker rewind(test_type_fp);
263*d83cc019SAndroid Build Coastguard Worker ret = fscanf(test_type_fp, "%lx", &test_type);
264*d83cc019SAndroid Build Coastguard Worker if (ret < 1 || test_type <= 0) {
265*d83cc019SAndroid Build Coastguard Worker igt_warn("test_type read failed - %lx\n", test_type);
266*d83cc019SAndroid Build Coastguard Worker return 0;
267*d83cc019SAndroid Build Coastguard Worker }
268*d83cc019SAndroid Build Coastguard Worker
269*d83cc019SAndroid Build Coastguard Worker return test_type;
270*d83cc019SAndroid Build Coastguard Worker }
271*d83cc019SAndroid Build Coastguard Worker
get_test_edid_data(void)272*d83cc019SAndroid Build Coastguard Worker static unsigned long get_test_edid_data(void)
273*d83cc019SAndroid Build Coastguard Worker {
274*d83cc019SAndroid Build Coastguard Worker unsigned long test_data;
275*d83cc019SAndroid Build Coastguard Worker int ret;
276*d83cc019SAndroid Build Coastguard Worker
277*d83cc019SAndroid Build Coastguard Worker if (!test_data_fp)
278*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid test_data file\r\n");
279*d83cc019SAndroid Build Coastguard Worker
280*d83cc019SAndroid Build Coastguard Worker rewind(test_data_fp);
281*d83cc019SAndroid Build Coastguard Worker ret = fscanf(test_data_fp, "%lx", &test_data);
282*d83cc019SAndroid Build Coastguard Worker if (ret < 1 || test_data <= 0) {
283*d83cc019SAndroid Build Coastguard Worker igt_warn("test_data read failed - %lx\r\n", test_data);
284*d83cc019SAndroid Build Coastguard Worker return 0;
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker
287*d83cc019SAndroid Build Coastguard Worker return test_data;
288*d83cc019SAndroid Build Coastguard Worker }
289*d83cc019SAndroid Build Coastguard Worker
get_test_videopattern_data(void)290*d83cc019SAndroid Build Coastguard Worker static void get_test_videopattern_data(void)
291*d83cc019SAndroid Build Coastguard Worker {
292*d83cc019SAndroid Build Coastguard Worker int count = 0;
293*d83cc019SAndroid Build Coastguard Worker uint16_t video_pattern_value[3];
294*d83cc019SAndroid Build Coastguard Worker char video_pattern_attribute[15];
295*d83cc019SAndroid Build Coastguard Worker int ret;
296*d83cc019SAndroid Build Coastguard Worker
297*d83cc019SAndroid Build Coastguard Worker if (!test_data_fp)
298*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid test_data file\n");
299*d83cc019SAndroid Build Coastguard Worker
300*d83cc019SAndroid Build Coastguard Worker rewind(test_data_fp);
301*d83cc019SAndroid Build Coastguard Worker while (!feof(test_data_fp) && count < 3) {
302*d83cc019SAndroid Build Coastguard Worker ret = fscanf(test_data_fp, "%s %u\n", video_pattern_attribute,
303*d83cc019SAndroid Build Coastguard Worker (unsigned int *)&video_pattern_value[count++]);
304*d83cc019SAndroid Build Coastguard Worker if (ret < 2) {
305*d83cc019SAndroid Build Coastguard Worker igt_warn("test_data read failed\n");
306*d83cc019SAndroid Build Coastguard Worker return;
307*d83cc019SAndroid Build Coastguard Worker }
308*d83cc019SAndroid Build Coastguard Worker }
309*d83cc019SAndroid Build Coastguard Worker
310*d83cc019SAndroid Build Coastguard Worker hdisplay = video_pattern_value[0];
311*d83cc019SAndroid Build Coastguard Worker vdisplay = video_pattern_value[1];
312*d83cc019SAndroid Build Coastguard Worker bitdepth = video_pattern_value[2];
313*d83cc019SAndroid Build Coastguard Worker igt_info("Hdisplay = %d\n", hdisplay);
314*d83cc019SAndroid Build Coastguard Worker igt_info("Vdisplay = %d\n", vdisplay);
315*d83cc019SAndroid Build Coastguard Worker igt_info("BitDepth = %u\n", bitdepth);
316*d83cc019SAndroid Build Coastguard Worker
317*d83cc019SAndroid Build Coastguard Worker }
318*d83cc019SAndroid Build Coastguard Worker
process_test_request(int test_type)319*d83cc019SAndroid Build Coastguard Worker static int process_test_request(int test_type)
320*d83cc019SAndroid Build Coastguard Worker {
321*d83cc019SAndroid Build Coastguard Worker int mode;
322*d83cc019SAndroid Build Coastguard Worker unsigned long test_data_edid;
323*d83cc019SAndroid Build Coastguard Worker bool valid = false;
324*d83cc019SAndroid Build Coastguard Worker switch (test_type) {
325*d83cc019SAndroid Build Coastguard Worker case DP_TEST_LINK_VIDEO_PATTERN:
326*d83cc019SAndroid Build Coastguard Worker video_pattern_flag = true;
327*d83cc019SAndroid Build Coastguard Worker get_test_videopattern_data();
328*d83cc019SAndroid Build Coastguard Worker mode = INTEL_MODE_VIDEO_PATTERN_TEST;
329*d83cc019SAndroid Build Coastguard Worker valid = true;
330*d83cc019SAndroid Build Coastguard Worker break;
331*d83cc019SAndroid Build Coastguard Worker case DP_TEST_LINK_EDID_READ:
332*d83cc019SAndroid Build Coastguard Worker test_data_edid = get_test_edid_data();
333*d83cc019SAndroid Build Coastguard Worker mode = (test_data_edid & DP_COMPLIANCE_VIDEO_MODE_MASK) >>
334*d83cc019SAndroid Build Coastguard Worker INTEL_DP_RESOLUTION_SHIFT_MASK;
335*d83cc019SAndroid Build Coastguard Worker valid = true;
336*d83cc019SAndroid Build Coastguard Worker break;
337*d83cc019SAndroid Build Coastguard Worker default:
338*d83cc019SAndroid Build Coastguard Worker /* Unknown test type */
339*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid test request, ignored.\n");
340*d83cc019SAndroid Build Coastguard Worker break;
341*d83cc019SAndroid Build Coastguard Worker }
342*d83cc019SAndroid Build Coastguard Worker
343*d83cc019SAndroid Build Coastguard Worker if (valid)
344*d83cc019SAndroid Build Coastguard Worker return update_display(mode, true);
345*d83cc019SAndroid Build Coastguard Worker
346*d83cc019SAndroid Build Coastguard Worker return -1;
347*d83cc019SAndroid Build Coastguard Worker }
348*d83cc019SAndroid Build Coastguard Worker
dump_connectors_fd(int drmfd)349*d83cc019SAndroid Build Coastguard Worker static void dump_connectors_fd(int drmfd)
350*d83cc019SAndroid Build Coastguard Worker {
351*d83cc019SAndroid Build Coastguard Worker int i, j;
352*d83cc019SAndroid Build Coastguard Worker
353*d83cc019SAndroid Build Coastguard Worker drmModeRes *mode_resources = drmModeGetResources(drmfd);
354*d83cc019SAndroid Build Coastguard Worker
355*d83cc019SAndroid Build Coastguard Worker if (!mode_resources) {
356*d83cc019SAndroid Build Coastguard Worker igt_warn("drmModeGetResources failed: %s\n", strerror(errno));
357*d83cc019SAndroid Build Coastguard Worker return;
358*d83cc019SAndroid Build Coastguard Worker }
359*d83cc019SAndroid Build Coastguard Worker
360*d83cc019SAndroid Build Coastguard Worker igt_info("Connectors:\n");
361*d83cc019SAndroid Build Coastguard Worker igt_info("id\tencoder\tstatus\t\ttype\tsize (mm)\tmodes\n");
362*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < mode_resources->count_connectors; i++) {
363*d83cc019SAndroid Build Coastguard Worker drmModeConnector *connector;
364*d83cc019SAndroid Build Coastguard Worker
365*d83cc019SAndroid Build Coastguard Worker connector = drmModeGetConnectorCurrent(drmfd,
366*d83cc019SAndroid Build Coastguard Worker mode_resources->connectors[i]);
367*d83cc019SAndroid Build Coastguard Worker if (!connector) {
368*d83cc019SAndroid Build Coastguard Worker igt_warn("Could not get connector %i: %s\n",
369*d83cc019SAndroid Build Coastguard Worker mode_resources->connectors[i], strerror(errno));
370*d83cc019SAndroid Build Coastguard Worker continue;
371*d83cc019SAndroid Build Coastguard Worker }
372*d83cc019SAndroid Build Coastguard Worker
373*d83cc019SAndroid Build Coastguard Worker igt_info("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n",
374*d83cc019SAndroid Build Coastguard Worker connector->connector_id,
375*d83cc019SAndroid Build Coastguard Worker connector->encoder_id,
376*d83cc019SAndroid Build Coastguard Worker kmstest_connector_status_str(connector->connection),
377*d83cc019SAndroid Build Coastguard Worker kmstest_connector_type_str(connector->connector_type),
378*d83cc019SAndroid Build Coastguard Worker connector->mmWidth,
379*d83cc019SAndroid Build Coastguard Worker connector->mmHeight,
380*d83cc019SAndroid Build Coastguard Worker connector->count_modes);
381*d83cc019SAndroid Build Coastguard Worker
382*d83cc019SAndroid Build Coastguard Worker if (!connector->count_modes)
383*d83cc019SAndroid Build Coastguard Worker continue;
384*d83cc019SAndroid Build Coastguard Worker
385*d83cc019SAndroid Build Coastguard Worker igt_info(" Modes:\n");
386*d83cc019SAndroid Build Coastguard Worker igt_info(" name refresh (Hz) hdisp hss hse htot vdisp ""vss vse vtot flags type clock\n");
387*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < connector->count_modes; j++) {
388*d83cc019SAndroid Build Coastguard Worker igt_info("[%d]", j);
389*d83cc019SAndroid Build Coastguard Worker kmstest_dump_mode(&connector->modes[j]);
390*d83cc019SAndroid Build Coastguard Worker }
391*d83cc019SAndroid Build Coastguard Worker
392*d83cc019SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
393*d83cc019SAndroid Build Coastguard Worker }
394*d83cc019SAndroid Build Coastguard Worker igt_info("\n");
395*d83cc019SAndroid Build Coastguard Worker
396*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(mode_resources);
397*d83cc019SAndroid Build Coastguard Worker }
398*d83cc019SAndroid Build Coastguard Worker
dump_crtcs_fd(int drmfd)399*d83cc019SAndroid Build Coastguard Worker static void dump_crtcs_fd(int drmfd)
400*d83cc019SAndroid Build Coastguard Worker {
401*d83cc019SAndroid Build Coastguard Worker int i;
402*d83cc019SAndroid Build Coastguard Worker drmModeRes *mode_resources;
403*d83cc019SAndroid Build Coastguard Worker
404*d83cc019SAndroid Build Coastguard Worker mode_resources = drmModeGetResources(drmfd);
405*d83cc019SAndroid Build Coastguard Worker if (!mode_resources) {
406*d83cc019SAndroid Build Coastguard Worker igt_warn("drmModeGetResources failed: %s\n", strerror(errno));
407*d83cc019SAndroid Build Coastguard Worker return;
408*d83cc019SAndroid Build Coastguard Worker }
409*d83cc019SAndroid Build Coastguard Worker
410*d83cc019SAndroid Build Coastguard Worker igt_info("CRTCs:\n");
411*d83cc019SAndroid Build Coastguard Worker igt_info("id\tfb\tpos\tsize\n");
412*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < mode_resources->count_crtcs; i++) {
413*d83cc019SAndroid Build Coastguard Worker drmModeCrtc *crtc;
414*d83cc019SAndroid Build Coastguard Worker
415*d83cc019SAndroid Build Coastguard Worker crtc = drmModeGetCrtc(drmfd, mode_resources->crtcs[i]);
416*d83cc019SAndroid Build Coastguard Worker if (!crtc) {
417*d83cc019SAndroid Build Coastguard Worker igt_warn("Could not get crtc %i: %s\n", mode_resources->crtcs[i], strerror(errno));
418*d83cc019SAndroid Build Coastguard Worker continue;
419*d83cc019SAndroid Build Coastguard Worker }
420*d83cc019SAndroid Build Coastguard Worker igt_info("%d\t%d\t(%d,%d)\t(%dx%d)\n",
421*d83cc019SAndroid Build Coastguard Worker crtc->crtc_id,
422*d83cc019SAndroid Build Coastguard Worker crtc->buffer_id,
423*d83cc019SAndroid Build Coastguard Worker crtc->x,
424*d83cc019SAndroid Build Coastguard Worker crtc->y,
425*d83cc019SAndroid Build Coastguard Worker crtc->width,
426*d83cc019SAndroid Build Coastguard Worker crtc->height);
427*d83cc019SAndroid Build Coastguard Worker
428*d83cc019SAndroid Build Coastguard Worker kmstest_dump_mode(&crtc->mode);
429*d83cc019SAndroid Build Coastguard Worker
430*d83cc019SAndroid Build Coastguard Worker drmModeFreeCrtc(crtc);
431*d83cc019SAndroid Build Coastguard Worker }
432*d83cc019SAndroid Build Coastguard Worker igt_info("\n");
433*d83cc019SAndroid Build Coastguard Worker
434*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(mode_resources);
435*d83cc019SAndroid Build Coastguard Worker }
436*d83cc019SAndroid Build Coastguard Worker
dump_info(void)437*d83cc019SAndroid Build Coastguard Worker static void dump_info(void)
438*d83cc019SAndroid Build Coastguard Worker {
439*d83cc019SAndroid Build Coastguard Worker dump_connectors_fd(drm_fd);
440*d83cc019SAndroid Build Coastguard Worker dump_crtcs_fd(drm_fd);
441*d83cc019SAndroid Build Coastguard Worker }
442*d83cc019SAndroid Build Coastguard Worker
setup_framebuffers(struct connector * dp_conn)443*d83cc019SAndroid Build Coastguard Worker static int setup_framebuffers(struct connector *dp_conn)
444*d83cc019SAndroid Build Coastguard Worker {
445*d83cc019SAndroid Build Coastguard Worker
446*d83cc019SAndroid Build Coastguard Worker dp_conn->fb = igt_create_fb(drm_fd,
447*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_width, dp_conn->fb_height,
448*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
449*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
450*d83cc019SAndroid Build Coastguard Worker &dp_conn->fb_video_pattern);
451*d83cc019SAndroid Build Coastguard Worker igt_assert(dp_conn->fb);
452*d83cc019SAndroid Build Coastguard Worker
453*d83cc019SAndroid Build Coastguard Worker /* Map the mapping of GEM object into the virtual address space */
454*d83cc019SAndroid Build Coastguard Worker dp_conn->pixmap = gem_mmap__gtt(drm_fd,
455*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_video_pattern.gem_handle,
456*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_video_pattern.size,
457*d83cc019SAndroid Build Coastguard Worker PROT_READ | PROT_WRITE);
458*d83cc019SAndroid Build Coastguard Worker if (dp_conn->pixmap == NULL)
459*d83cc019SAndroid Build Coastguard Worker return -1;
460*d83cc019SAndroid Build Coastguard Worker
461*d83cc019SAndroid Build Coastguard Worker gem_set_domain(drm_fd, dp_conn->fb_video_pattern.gem_handle,
462*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
463*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_size = dp_conn->fb_video_pattern.size;
464*d83cc019SAndroid Build Coastguard Worker
465*d83cc019SAndroid Build Coastguard Worker /* After filling the device memory with 0s it needs to be unmapped */
466*d83cc019SAndroid Build Coastguard Worker memset(dp_conn->pixmap, 0, dp_conn->fb_size);
467*d83cc019SAndroid Build Coastguard Worker munmap(dp_conn->pixmap, dp_conn->fb_size);
468*d83cc019SAndroid Build Coastguard Worker
469*d83cc019SAndroid Build Coastguard Worker return 0;
470*d83cc019SAndroid Build Coastguard Worker }
471*d83cc019SAndroid Build Coastguard Worker
setup_failsafe_framebuffer(struct connector * dp_conn)472*d83cc019SAndroid Build Coastguard Worker static int setup_failsafe_framebuffer(struct connector *dp_conn)
473*d83cc019SAndroid Build Coastguard Worker {
474*d83cc019SAndroid Build Coastguard Worker
475*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_fb = igt_create_fb(drm_fd,
476*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_width,
477*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_height,
478*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
479*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
480*d83cc019SAndroid Build Coastguard Worker &dp_conn->fb_failsafe_pattern);
481*d83cc019SAndroid Build Coastguard Worker igt_assert(dp_conn->failsafe_fb);
482*d83cc019SAndroid Build Coastguard Worker
483*d83cc019SAndroid Build Coastguard Worker /* Map the mapping of GEM object into the virtual address space */
484*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_pixmap = gem_mmap__gtt(drm_fd,
485*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_failsafe_pattern.gem_handle,
486*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_failsafe_pattern.size,
487*d83cc019SAndroid Build Coastguard Worker PROT_READ | PROT_WRITE);
488*d83cc019SAndroid Build Coastguard Worker if (dp_conn->failsafe_pixmap == NULL)
489*d83cc019SAndroid Build Coastguard Worker return -1;
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker gem_set_domain(drm_fd, dp_conn->fb_failsafe_pattern.gem_handle,
492*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
493*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_size = dp_conn->fb_failsafe_pattern.size;
494*d83cc019SAndroid Build Coastguard Worker
495*d83cc019SAndroid Build Coastguard Worker /* After filling the device framebuffer the mapped memory needs to be freed */
496*d83cc019SAndroid Build Coastguard Worker memset(dp_conn->failsafe_pixmap, 0, dp_conn->failsafe_size);
497*d83cc019SAndroid Build Coastguard Worker munmap(dp_conn->failsafe_pixmap, dp_conn->failsafe_size);
498*d83cc019SAndroid Build Coastguard Worker
499*d83cc019SAndroid Build Coastguard Worker return 0;
500*d83cc019SAndroid Build Coastguard Worker
501*d83cc019SAndroid Build Coastguard Worker }
502*d83cc019SAndroid Build Coastguard Worker
setup_video_pattern_framebuffer(struct connector * dp_conn)503*d83cc019SAndroid Build Coastguard Worker static int setup_video_pattern_framebuffer(struct connector *dp_conn)
504*d83cc019SAndroid Build Coastguard Worker {
505*d83cc019SAndroid Build Coastguard Worker uint32_t video_width, video_height;
506*d83cc019SAndroid Build Coastguard Worker
507*d83cc019SAndroid Build Coastguard Worker video_width = dp_conn->test_pattern.hdisplay;
508*d83cc019SAndroid Build Coastguard Worker video_height = dp_conn->test_pattern.vdisplay;
509*d83cc019SAndroid Build Coastguard Worker /*
510*d83cc019SAndroid Build Coastguard Worker * Display WA1172: Gen10 To pass the color data unaffected set either
511*d83cc019SAndroid Build Coastguard Worker * per-pixel alpha or Plane alpha to 0xff. Use ARGB8888 and set alpha to 0xff.
512*d83cc019SAndroid Build Coastguard Worker */
513*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.fb = igt_create_fb(drm_fd,
514*d83cc019SAndroid Build Coastguard Worker video_width, video_height,
515*d83cc019SAndroid Build Coastguard Worker gen == 10 ? DRM_FORMAT_ARGB8888 : DRM_FORMAT_XRGB8888,
516*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
517*d83cc019SAndroid Build Coastguard Worker &dp_conn->test_pattern.fb_pattern);
518*d83cc019SAndroid Build Coastguard Worker igt_assert(dp_conn->test_pattern.fb);
519*d83cc019SAndroid Build Coastguard Worker
520*d83cc019SAndroid Build Coastguard Worker /* Map the mapping of GEM object into the virtual address space */
521*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.pixmap = gem_mmap__gtt(drm_fd,
522*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.fb_pattern.gem_handle,
523*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.fb_pattern.size,
524*d83cc019SAndroid Build Coastguard Worker PROT_READ | PROT_WRITE);
525*d83cc019SAndroid Build Coastguard Worker if (dp_conn->test_pattern.pixmap == NULL)
526*d83cc019SAndroid Build Coastguard Worker return -1;
527*d83cc019SAndroid Build Coastguard Worker
528*d83cc019SAndroid Build Coastguard Worker gem_set_domain(drm_fd, dp_conn->test_pattern.fb_pattern.gem_handle,
529*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
530*d83cc019SAndroid Build Coastguard Worker
531*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.size = dp_conn->test_pattern.fb_pattern.size;
532*d83cc019SAndroid Build Coastguard Worker
533*d83cc019SAndroid Build Coastguard Worker memset(dp_conn->test_pattern.pixmap, 0, dp_conn->test_pattern.size);
534*d83cc019SAndroid Build Coastguard Worker return 0;
535*d83cc019SAndroid Build Coastguard Worker
536*d83cc019SAndroid Build Coastguard Worker }
537*d83cc019SAndroid Build Coastguard Worker
fill_framebuffer(struct connector * dp_conn)538*d83cc019SAndroid Build Coastguard Worker static int fill_framebuffer(struct connector *dp_conn)
539*d83cc019SAndroid Build Coastguard Worker {
540*d83cc019SAndroid Build Coastguard Worker uint32_t tile_height, tile_width, video_width, video_height;
541*d83cc019SAndroid Build Coastguard Worker uint32_t *red_ptr, *green_ptr, *blue_ptr, *white_ptr, *src_ptr, *dst_ptr;
542*d83cc019SAndroid Build Coastguard Worker int x, y;
543*d83cc019SAndroid Build Coastguard Worker int32_t pixel_val;
544*d83cc019SAndroid Build Coastguard Worker uint8_t alpha;
545*d83cc019SAndroid Build Coastguard Worker
546*d83cc019SAndroid Build Coastguard Worker video_width = dp_conn->test_pattern.hdisplay;
547*d83cc019SAndroid Build Coastguard Worker video_height = dp_conn->test_pattern.vdisplay;
548*d83cc019SAndroid Build Coastguard Worker
549*d83cc019SAndroid Build Coastguard Worker tile_height = 64;
550*d83cc019SAndroid Build Coastguard Worker tile_width = 1 << (dp_conn->test_pattern.bitdepth);
551*d83cc019SAndroid Build Coastguard Worker
552*d83cc019SAndroid Build Coastguard Worker red_ptr = dp_conn->test_pattern.pixmap;
553*d83cc019SAndroid Build Coastguard Worker green_ptr = red_ptr + (video_width * tile_height);
554*d83cc019SAndroid Build Coastguard Worker blue_ptr = green_ptr + (video_width * tile_height);
555*d83cc019SAndroid Build Coastguard Worker white_ptr = blue_ptr + (video_width * tile_height);
556*d83cc019SAndroid Build Coastguard Worker x = 0;
557*d83cc019SAndroid Build Coastguard Worker
558*d83cc019SAndroid Build Coastguard Worker /* Fill the frame buffer with video pattern from CTS 3.1.5 */
559*d83cc019SAndroid Build Coastguard Worker while (x < video_width) {
560*d83cc019SAndroid Build Coastguard Worker for (pixel_val = 0; pixel_val < 256;
561*d83cc019SAndroid Build Coastguard Worker pixel_val = pixel_val + (256 / tile_width)) {
562*d83cc019SAndroid Build Coastguard Worker alpha = gen == 10 ? 0xff : 0;
563*d83cc019SAndroid Build Coastguard Worker red_ptr[x] = alpha << 24 | pixel_val << 16;
564*d83cc019SAndroid Build Coastguard Worker green_ptr[x] = alpha << 24 | pixel_val << 8;
565*d83cc019SAndroid Build Coastguard Worker blue_ptr[x] = alpha << 24 | pixel_val << 0;
566*d83cc019SAndroid Build Coastguard Worker white_ptr[x] = alpha << 24 | red_ptr[x] | green_ptr[x] |
567*d83cc019SAndroid Build Coastguard Worker blue_ptr[x];
568*d83cc019SAndroid Build Coastguard Worker if (++x >= video_width)
569*d83cc019SAndroid Build Coastguard Worker break;
570*d83cc019SAndroid Build Coastguard Worker }
571*d83cc019SAndroid Build Coastguard Worker }
572*d83cc019SAndroid Build Coastguard Worker for (y = 0; y < video_height; y++) {
573*d83cc019SAndroid Build Coastguard Worker if (y == 0 || y == 64 || y == 128 || y == 192)
574*d83cc019SAndroid Build Coastguard Worker continue;
575*d83cc019SAndroid Build Coastguard Worker switch ((y / tile_height) % 4) {
576*d83cc019SAndroid Build Coastguard Worker case 0:
577*d83cc019SAndroid Build Coastguard Worker src_ptr = red_ptr;
578*d83cc019SAndroid Build Coastguard Worker break;
579*d83cc019SAndroid Build Coastguard Worker case 1:
580*d83cc019SAndroid Build Coastguard Worker src_ptr = green_ptr;
581*d83cc019SAndroid Build Coastguard Worker break;
582*d83cc019SAndroid Build Coastguard Worker case 2:
583*d83cc019SAndroid Build Coastguard Worker src_ptr = blue_ptr;
584*d83cc019SAndroid Build Coastguard Worker break;
585*d83cc019SAndroid Build Coastguard Worker case 3:
586*d83cc019SAndroid Build Coastguard Worker src_ptr = white_ptr;
587*d83cc019SAndroid Build Coastguard Worker break;
588*d83cc019SAndroid Build Coastguard Worker }
589*d83cc019SAndroid Build Coastguard Worker dst_ptr = dp_conn->test_pattern.pixmap + (y * video_width);
590*d83cc019SAndroid Build Coastguard Worker memcpy(dst_ptr, src_ptr, (video_width * 4));
591*d83cc019SAndroid Build Coastguard Worker }
592*d83cc019SAndroid Build Coastguard Worker munmap(dp_conn->test_pattern.pixmap,
593*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.size);
594*d83cc019SAndroid Build Coastguard Worker return 0;
595*d83cc019SAndroid Build Coastguard Worker }
596*d83cc019SAndroid Build Coastguard Worker
set_test_mode(struct connector * dp_conn)597*d83cc019SAndroid Build Coastguard Worker static int set_test_mode(struct connector *dp_conn)
598*d83cc019SAndroid Build Coastguard Worker {
599*d83cc019SAndroid Build Coastguard Worker int ret = 0;
600*d83cc019SAndroid Build Coastguard Worker int i;
601*d83cc019SAndroid Build Coastguard Worker bool found_std = false, found_fs = false;
602*d83cc019SAndroid Build Coastguard Worker drmModeConnector *c = dp_conn->connector;
603*d83cc019SAndroid Build Coastguard Worker
604*d83cc019SAndroid Build Coastguard Worker /* Ignore any disconnected devices */
605*d83cc019SAndroid Build Coastguard Worker if (c->connection != DRM_MODE_CONNECTED) {
606*d83cc019SAndroid Build Coastguard Worker igt_warn("Connector %u disconnected\n", c->connector_id);
607*d83cc019SAndroid Build Coastguard Worker return -ENOENT;
608*d83cc019SAndroid Build Coastguard Worker }
609*d83cc019SAndroid Build Coastguard Worker igt_info("Connector setup:\n");
610*d83cc019SAndroid Build Coastguard Worker /* Setup preferred mode - should be mode[0] in the list */
611*d83cc019SAndroid Build Coastguard Worker dp_conn->mode_preferred = c->modes[0];
612*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_width = c->modes[0].hdisplay;
613*d83cc019SAndroid Build Coastguard Worker dp_conn->fb_height = c->modes[0].vdisplay;
614*d83cc019SAndroid Build Coastguard Worker
615*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.mode = c->modes[0];
616*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.mode.hdisplay = c->modes[0].hdisplay;
617*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.mode.vdisplay = c->modes[0].vdisplay;
618*d83cc019SAndroid Build Coastguard Worker
619*d83cc019SAndroid Build Coastguard Worker igt_info("Preferred mode (mode 0) for connector %u is %ux%u\n",
620*d83cc019SAndroid Build Coastguard Worker dp_conn->id, c->modes[0].hdisplay, c->modes[0].vdisplay);
621*d83cc019SAndroid Build Coastguard Worker fflush(stdin);
622*d83cc019SAndroid Build Coastguard Worker
623*d83cc019SAndroid Build Coastguard Worker for (i = 1; i < c->count_modes; i++) {
624*d83cc019SAndroid Build Coastguard Worker /* Standard mode is 800x600@60 */
625*d83cc019SAndroid Build Coastguard Worker if (c->modes[i].hdisplay == 800 &&
626*d83cc019SAndroid Build Coastguard Worker c->modes[i].vdisplay == 600 &&
627*d83cc019SAndroid Build Coastguard Worker c->modes[i].vrefresh == 60 &&
628*d83cc019SAndroid Build Coastguard Worker found_std == false) {
629*d83cc019SAndroid Build Coastguard Worker dp_conn->mode_standard = c->modes[i];
630*d83cc019SAndroid Build Coastguard Worker igt_info("Standard mode (%d) for connector %u is %ux%u\n",
631*d83cc019SAndroid Build Coastguard Worker i,
632*d83cc019SAndroid Build Coastguard Worker c->connector_id,
633*d83cc019SAndroid Build Coastguard Worker c->modes[i].hdisplay,
634*d83cc019SAndroid Build Coastguard Worker c->modes[i].vdisplay);
635*d83cc019SAndroid Build Coastguard Worker found_std = true;
636*d83cc019SAndroid Build Coastguard Worker }
637*d83cc019SAndroid Build Coastguard Worker /* Failsafe mode is 640x480@60 */
638*d83cc019SAndroid Build Coastguard Worker if (c->modes[i].hdisplay == 640 &&
639*d83cc019SAndroid Build Coastguard Worker c->modes[i].vdisplay == 480 &&
640*d83cc019SAndroid Build Coastguard Worker c->modes[i].vrefresh == 60 &&
641*d83cc019SAndroid Build Coastguard Worker found_fs == false) {
642*d83cc019SAndroid Build Coastguard Worker dp_conn->mode_failsafe = c->modes[i];
643*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_width = c->modes[i].hdisplay;
644*d83cc019SAndroid Build Coastguard Worker dp_conn->failsafe_height = c->modes[i].vdisplay;
645*d83cc019SAndroid Build Coastguard Worker igt_info("Failsafe mode (%d) for connector %u is %ux%u\n",
646*d83cc019SAndroid Build Coastguard Worker i,
647*d83cc019SAndroid Build Coastguard Worker c->connector_id,
648*d83cc019SAndroid Build Coastguard Worker c->modes[i].hdisplay,
649*d83cc019SAndroid Build Coastguard Worker c->modes[i].vdisplay);
650*d83cc019SAndroid Build Coastguard Worker found_fs = true;
651*d83cc019SAndroid Build Coastguard Worker }
652*d83cc019SAndroid Build Coastguard Worker }
653*d83cc019SAndroid Build Coastguard Worker
654*d83cc019SAndroid Build Coastguard Worker ret = setup_framebuffers(dp_conn);
655*d83cc019SAndroid Build Coastguard Worker if (ret) {
656*d83cc019SAndroid Build Coastguard Worker igt_warn("Creating framebuffer for connector %u failed (%d)\n",
657*d83cc019SAndroid Build Coastguard Worker c->connector_id, ret);
658*d83cc019SAndroid Build Coastguard Worker return ret;
659*d83cc019SAndroid Build Coastguard Worker }
660*d83cc019SAndroid Build Coastguard Worker
661*d83cc019SAndroid Build Coastguard Worker if (found_fs) {
662*d83cc019SAndroid Build Coastguard Worker ret = setup_failsafe_framebuffer(dp_conn);
663*d83cc019SAndroid Build Coastguard Worker if (ret) {
664*d83cc019SAndroid Build Coastguard Worker igt_warn("Creating failsafe framebuffer for connector %u failed (%d)\n",
665*d83cc019SAndroid Build Coastguard Worker c->connector_id, ret);
666*d83cc019SAndroid Build Coastguard Worker return ret;
667*d83cc019SAndroid Build Coastguard Worker }
668*d83cc019SAndroid Build Coastguard Worker }
669*d83cc019SAndroid Build Coastguard Worker
670*d83cc019SAndroid Build Coastguard Worker if (video_pattern_flag) {
671*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.hdisplay = hdisplay;
672*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.vdisplay = vdisplay;
673*d83cc019SAndroid Build Coastguard Worker dp_conn->test_pattern.bitdepth = bitdepth;
674*d83cc019SAndroid Build Coastguard Worker
675*d83cc019SAndroid Build Coastguard Worker ret = setup_video_pattern_framebuffer(dp_conn);
676*d83cc019SAndroid Build Coastguard Worker if (ret) {
677*d83cc019SAndroid Build Coastguard Worker igt_warn("Creating framebuffer for connector %u failed (%d)\n",
678*d83cc019SAndroid Build Coastguard Worker c->connector_id, ret);
679*d83cc019SAndroid Build Coastguard Worker return ret;
680*d83cc019SAndroid Build Coastguard Worker }
681*d83cc019SAndroid Build Coastguard Worker
682*d83cc019SAndroid Build Coastguard Worker ret = fill_framebuffer(dp_conn);
683*d83cc019SAndroid Build Coastguard Worker if (ret) {
684*d83cc019SAndroid Build Coastguard Worker igt_warn("Filling framebuffer for connector %u failed (%d)\n",
685*d83cc019SAndroid Build Coastguard Worker c->connector_id, ret);
686*d83cc019SAndroid Build Coastguard Worker return ret;
687*d83cc019SAndroid Build Coastguard Worker }
688*d83cc019SAndroid Build Coastguard Worker }
689*d83cc019SAndroid Build Coastguard Worker
690*d83cc019SAndroid Build Coastguard Worker return ret;
691*d83cc019SAndroid Build Coastguard Worker }
692*d83cc019SAndroid Build Coastguard Worker
set_video(int mode,struct connector * test_connector)693*d83cc019SAndroid Build Coastguard Worker static int set_video(int mode, struct connector *test_connector)
694*d83cc019SAndroid Build Coastguard Worker {
695*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *requested_mode;
696*d83cc019SAndroid Build Coastguard Worker uint32_t required_fb_id;
697*d83cc019SAndroid Build Coastguard Worker struct igt_fb required_fb;
698*d83cc019SAndroid Build Coastguard Worker int ret = 0;
699*d83cc019SAndroid Build Coastguard Worker
700*d83cc019SAndroid Build Coastguard Worker switch (mode) {
701*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_NONE:
702*d83cc019SAndroid Build Coastguard Worker igt_info("NONE\n");
703*d83cc019SAndroid Build Coastguard Worker ret = drmModeSetCrtc(drm_fd, test_connector->crtc,
704*d83cc019SAndroid Build Coastguard Worker -1, 0, 0, NULL, 0, NULL);
705*d83cc019SAndroid Build Coastguard Worker goto out;
706*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_PREFERRED:
707*d83cc019SAndroid Build Coastguard Worker igt_info("PREFERRED\n");
708*d83cc019SAndroid Build Coastguard Worker requested_mode = &test_connector->mode_preferred;
709*d83cc019SAndroid Build Coastguard Worker required_fb_id = test_connector->fb;
710*d83cc019SAndroid Build Coastguard Worker required_fb = test_connector->fb_video_pattern;
711*d83cc019SAndroid Build Coastguard Worker break;
712*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_STANDARD:
713*d83cc019SAndroid Build Coastguard Worker igt_info("STANDARD\n");
714*d83cc019SAndroid Build Coastguard Worker requested_mode = &test_connector->mode_standard;
715*d83cc019SAndroid Build Coastguard Worker required_fb_id = test_connector->fb;
716*d83cc019SAndroid Build Coastguard Worker required_fb = test_connector->fb_video_pattern;
717*d83cc019SAndroid Build Coastguard Worker break;
718*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_FAILSAFE:
719*d83cc019SAndroid Build Coastguard Worker igt_info("FAILSAFE\n");
720*d83cc019SAndroid Build Coastguard Worker requested_mode = &test_connector->mode_failsafe;
721*d83cc019SAndroid Build Coastguard Worker required_fb_id = test_connector->failsafe_fb;
722*d83cc019SAndroid Build Coastguard Worker required_fb = test_connector->fb_failsafe_pattern;
723*d83cc019SAndroid Build Coastguard Worker break;
724*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_VIDEO_PATTERN_TEST:
725*d83cc019SAndroid Build Coastguard Worker igt_info("VIDEO PATTERN TEST\n");
726*d83cc019SAndroid Build Coastguard Worker requested_mode = &test_connector->test_pattern.mode;
727*d83cc019SAndroid Build Coastguard Worker required_fb_id = test_connector->test_pattern.fb;
728*d83cc019SAndroid Build Coastguard Worker required_fb = test_connector->test_pattern.fb_pattern;
729*d83cc019SAndroid Build Coastguard Worker break;
730*d83cc019SAndroid Build Coastguard Worker case INTEL_MODE_INVALID:
731*d83cc019SAndroid Build Coastguard Worker default:
732*d83cc019SAndroid Build Coastguard Worker igt_warn("INVALID! (%08x) Mode set aborted!\n", mode);
733*d83cc019SAndroid Build Coastguard Worker return -1;
734*d83cc019SAndroid Build Coastguard Worker }
735*d83cc019SAndroid Build Coastguard Worker
736*d83cc019SAndroid Build Coastguard Worker igt_info("CRTC(%u):", test_connector->crtc);
737*d83cc019SAndroid Build Coastguard Worker kmstest_dump_mode(requested_mode);
738*d83cc019SAndroid Build Coastguard Worker ret = drmModeSetCrtc(drm_fd, test_connector->crtc, required_fb_id, 0, 0,
739*d83cc019SAndroid Build Coastguard Worker &test_connector->id, 1, requested_mode);
740*d83cc019SAndroid Build Coastguard Worker if (ret) {
741*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to set mode (%dx%d@%dHz): %s\n",
742*d83cc019SAndroid Build Coastguard Worker requested_mode->hdisplay, requested_mode->vdisplay,
743*d83cc019SAndroid Build Coastguard Worker requested_mode->vrefresh, strerror(errno));
744*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm_fd, &required_fb);
745*d83cc019SAndroid Build Coastguard Worker
746*d83cc019SAndroid Build Coastguard Worker }
747*d83cc019SAndroid Build Coastguard Worker /* Keep the pattern on output lines for 1 sec for DPR-120 to detect it */
748*d83cc019SAndroid Build Coastguard Worker sleep(1);
749*d83cc019SAndroid Build Coastguard Worker
750*d83cc019SAndroid Build Coastguard Worker out:
751*d83cc019SAndroid Build Coastguard Worker if (ret) {
752*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to set CRTC for connector %u\n",
753*d83cc019SAndroid Build Coastguard Worker test_connector->id);
754*d83cc019SAndroid Build Coastguard Worker }
755*d83cc019SAndroid Build Coastguard Worker
756*d83cc019SAndroid Build Coastguard Worker return ret;
757*d83cc019SAndroid Build Coastguard Worker }
758*d83cc019SAndroid Build Coastguard Worker
759*d83cc019SAndroid Build Coastguard Worker static int
set_default_mode(struct connector * c,bool set_mode)760*d83cc019SAndroid Build Coastguard Worker set_default_mode(struct connector *c, bool set_mode)
761*d83cc019SAndroid Build Coastguard Worker {
762*d83cc019SAndroid Build Coastguard Worker unsigned int fb_id = 0;
763*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb_info;
764*d83cc019SAndroid Build Coastguard Worker int ret = 0;
765*d83cc019SAndroid Build Coastguard Worker
766*d83cc019SAndroid Build Coastguard Worker if (!set_mode) {
767*d83cc019SAndroid Build Coastguard Worker ret = drmModeSetCrtc(drm_fd, c->crtc, 0, 0, 0,
768*d83cc019SAndroid Build Coastguard Worker NULL, 0, NULL);
769*d83cc019SAndroid Build Coastguard Worker if (ret)
770*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to unset mode");
771*d83cc019SAndroid Build Coastguard Worker return ret;
772*d83cc019SAndroid Build Coastguard Worker }
773*d83cc019SAndroid Build Coastguard Worker
774*d83cc019SAndroid Build Coastguard Worker c->mode = c->connector->modes[0];
775*d83cc019SAndroid Build Coastguard Worker
776*d83cc019SAndroid Build Coastguard Worker width = c->mode.hdisplay;
777*d83cc019SAndroid Build Coastguard Worker height = c->mode.vdisplay;
778*d83cc019SAndroid Build Coastguard Worker
779*d83cc019SAndroid Build Coastguard Worker fb_id = igt_create_pattern_fb(drm_fd, width, height,
780*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
781*d83cc019SAndroid Build Coastguard Worker tiling, &fb_info);
782*d83cc019SAndroid Build Coastguard Worker
783*d83cc019SAndroid Build Coastguard Worker igt_info("CRTC(%u):[%d]", c->crtc, 0);
784*d83cc019SAndroid Build Coastguard Worker kmstest_dump_mode(&c->mode);
785*d83cc019SAndroid Build Coastguard Worker drmModeSetCrtc(drm_fd, c->crtc, -1, 0, 0, NULL, 0, NULL);
786*d83cc019SAndroid Build Coastguard Worker ret = drmModeSetCrtc(drm_fd, c->crtc, fb_id, 0, 0,
787*d83cc019SAndroid Build Coastguard Worker &c->id, 1, &c->mode);
788*d83cc019SAndroid Build Coastguard Worker if (ret) {
789*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to set mode (%dx%d@%dHz): %s\n",
790*d83cc019SAndroid Build Coastguard Worker width, height, c->mode.vrefresh, strerror(errno));
791*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm_fd, &fb_info);
792*d83cc019SAndroid Build Coastguard Worker
793*d83cc019SAndroid Build Coastguard Worker }
794*d83cc019SAndroid Build Coastguard Worker
795*d83cc019SAndroid Build Coastguard Worker return ret;
796*d83cc019SAndroid Build Coastguard Worker }
797*d83cc019SAndroid Build Coastguard Worker
find_crtc_for_connector(drmModeConnector * c)798*d83cc019SAndroid Build Coastguard Worker static uint32_t find_crtc_for_connector(drmModeConnector *c)
799*d83cc019SAndroid Build Coastguard Worker {
800*d83cc019SAndroid Build Coastguard Worker drmModeEncoder *e;
801*d83cc019SAndroid Build Coastguard Worker uint32_t possible_crtcs;
802*d83cc019SAndroid Build Coastguard Worker int i, j;
803*d83cc019SAndroid Build Coastguard Worker
804*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < c->count_encoders; i++) {
805*d83cc019SAndroid Build Coastguard Worker e = drmModeGetEncoder(drm_fd, c->encoders[i]);
806*d83cc019SAndroid Build Coastguard Worker possible_crtcs = e->possible_crtcs;
807*d83cc019SAndroid Build Coastguard Worker drmModeFreeEncoder(e);
808*d83cc019SAndroid Build Coastguard Worker
809*d83cc019SAndroid Build Coastguard Worker for (j = 0; possible_crtcs >> j; j++)
810*d83cc019SAndroid Build Coastguard Worker if (possible_crtcs & (1 << j))
811*d83cc019SAndroid Build Coastguard Worker return resources->crtcs[j];
812*d83cc019SAndroid Build Coastguard Worker }
813*d83cc019SAndroid Build Coastguard Worker return 0;
814*d83cc019SAndroid Build Coastguard Worker }
815*d83cc019SAndroid Build Coastguard Worker
816*d83cc019SAndroid Build Coastguard Worker /*
817*d83cc019SAndroid Build Coastguard Worker * Re-probe connectors and do a modeset based on test request or
818*d83cc019SAndroid Build Coastguard Worker * in case of a hotplug uevent.
819*d83cc019SAndroid Build Coastguard Worker *
820*d83cc019SAndroid Build Coastguard Worker * @mode: Video mode requested by the test
821*d83cc019SAndroid Build Coastguard Worker * @is_compliance_test: 1: If it is a compliance test
822*d83cc019SAndroid Build Coastguard Worker * 0: If it is a hotplug event
823*d83cc019SAndroid Build Coastguard Worker *
824*d83cc019SAndroid Build Coastguard Worker * Returns:
825*d83cc019SAndroid Build Coastguard Worker * 0: On Success
826*d83cc019SAndroid Build Coastguard Worker * -1: On failure
827*d83cc019SAndroid Build Coastguard Worker */
update_display(int mode,bool is_compliance_test)828*d83cc019SAndroid Build Coastguard Worker int update_display(int mode, bool is_compliance_test)
829*d83cc019SAndroid Build Coastguard Worker {
830*d83cc019SAndroid Build Coastguard Worker struct connector *connectors, *conn;
831*d83cc019SAndroid Build Coastguard Worker int cnt, ret = 0;
832*d83cc019SAndroid Build Coastguard Worker bool set_mode;
833*d83cc019SAndroid Build Coastguard Worker
834*d83cc019SAndroid Build Coastguard Worker resources = drmModeGetResources(drm_fd);
835*d83cc019SAndroid Build Coastguard Worker if (!resources) {
836*d83cc019SAndroid Build Coastguard Worker igt_warn("drmModeGetResources failed: %s\n", strerror(errno));
837*d83cc019SAndroid Build Coastguard Worker return -1;
838*d83cc019SAndroid Build Coastguard Worker }
839*d83cc019SAndroid Build Coastguard Worker
840*d83cc019SAndroid Build Coastguard Worker connectors = calloc(resources->count_connectors,
841*d83cc019SAndroid Build Coastguard Worker sizeof(struct connector));
842*d83cc019SAndroid Build Coastguard Worker if (!connectors)
843*d83cc019SAndroid Build Coastguard Worker return -1;
844*d83cc019SAndroid Build Coastguard Worker
845*d83cc019SAndroid Build Coastguard Worker /* Find any connected displays */
846*d83cc019SAndroid Build Coastguard Worker for (cnt = 0; cnt < resources->count_connectors; cnt++) {
847*d83cc019SAndroid Build Coastguard Worker drmModeConnector *c;
848*d83cc019SAndroid Build Coastguard Worker
849*d83cc019SAndroid Build Coastguard Worker conn = &connectors[cnt];
850*d83cc019SAndroid Build Coastguard Worker conn->id = resources->connectors[cnt];
851*d83cc019SAndroid Build Coastguard Worker c = drmModeGetConnector(drm_fd, conn->id);
852*d83cc019SAndroid Build Coastguard Worker if (c->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
853*d83cc019SAndroid Build Coastguard Worker c->connection == DRM_MODE_CONNECTED) {
854*d83cc019SAndroid Build Coastguard Worker test_connector_id = c->connector_id;
855*d83cc019SAndroid Build Coastguard Worker conn->connector = c;
856*d83cc019SAndroid Build Coastguard Worker conn->crtc = find_crtc_for_connector(c);
857*d83cc019SAndroid Build Coastguard Worker test_crtc = conn->crtc;
858*d83cc019SAndroid Build Coastguard Worker set_mode = true;
859*d83cc019SAndroid Build Coastguard Worker break;
860*d83cc019SAndroid Build Coastguard Worker } else if (c->connector_id == test_connector_id &&
861*d83cc019SAndroid Build Coastguard Worker c->connection == DRM_MODE_DISCONNECTED) {
862*d83cc019SAndroid Build Coastguard Worker conn->connector = c;
863*d83cc019SAndroid Build Coastguard Worker conn->crtc = test_crtc;
864*d83cc019SAndroid Build Coastguard Worker set_mode = false;
865*d83cc019SAndroid Build Coastguard Worker break;
866*d83cc019SAndroid Build Coastguard Worker }
867*d83cc019SAndroid Build Coastguard Worker }
868*d83cc019SAndroid Build Coastguard Worker
869*d83cc019SAndroid Build Coastguard Worker if (cnt == resources->count_connectors) {
870*d83cc019SAndroid Build Coastguard Worker ret = -1;
871*d83cc019SAndroid Build Coastguard Worker goto err;
872*d83cc019SAndroid Build Coastguard Worker }
873*d83cc019SAndroid Build Coastguard Worker
874*d83cc019SAndroid Build Coastguard Worker if (is_compliance_test) {
875*d83cc019SAndroid Build Coastguard Worker set_test_mode(conn);
876*d83cc019SAndroid Build Coastguard Worker ret = set_video(INTEL_MODE_NONE, conn);
877*d83cc019SAndroid Build Coastguard Worker ret = set_video(mode, conn);
878*d83cc019SAndroid Build Coastguard Worker
879*d83cc019SAndroid Build Coastguard Worker } else
880*d83cc019SAndroid Build Coastguard Worker ret = set_default_mode(conn, set_mode);
881*d83cc019SAndroid Build Coastguard Worker
882*d83cc019SAndroid Build Coastguard Worker err:
883*d83cc019SAndroid Build Coastguard Worker drmModeFreeConnector(conn->connector);
884*d83cc019SAndroid Build Coastguard Worker /* Error condition if no connected displays */
885*d83cc019SAndroid Build Coastguard Worker free(connectors);
886*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(resources);
887*d83cc019SAndroid Build Coastguard Worker return ret;
888*d83cc019SAndroid Build Coastguard Worker }
889*d83cc019SAndroid Build Coastguard Worker
890*d83cc019SAndroid Build Coastguard Worker static const char optstr[] = "hi";
891*d83cc019SAndroid Build Coastguard Worker
usage(char * name,char opt)892*d83cc019SAndroid Build Coastguard Worker static void __attribute__((noreturn)) usage(char *name, char opt)
893*d83cc019SAndroid Build Coastguard Worker {
894*d83cc019SAndroid Build Coastguard Worker igt_info("usage: %s [-hi]\n", name);
895*d83cc019SAndroid Build Coastguard Worker igt_info("\t-i\tdump info\n");
896*d83cc019SAndroid Build Coastguard Worker igt_info("\tDefault is to respond to DPR-120 tests\n");
897*d83cc019SAndroid Build Coastguard Worker exit((opt != 'h') ? -1 : 0);
898*d83cc019SAndroid Build Coastguard Worker }
899*d83cc019SAndroid Build Coastguard Worker
cleanup_debugfs(void)900*d83cc019SAndroid Build Coastguard Worker static void cleanup_debugfs(void)
901*d83cc019SAndroid Build Coastguard Worker {
902*d83cc019SAndroid Build Coastguard Worker fclose(test_active_fp);
903*d83cc019SAndroid Build Coastguard Worker fclose(test_data_fp);
904*d83cc019SAndroid Build Coastguard Worker fclose(test_type_fp);
905*d83cc019SAndroid Build Coastguard Worker }
906*d83cc019SAndroid Build Coastguard Worker
cleanup_and_exit(int ret)907*d83cc019SAndroid Build Coastguard Worker static void __attribute__((noreturn)) cleanup_and_exit(int ret)
908*d83cc019SAndroid Build Coastguard Worker {
909*d83cc019SAndroid Build Coastguard Worker cleanup_debugfs();
910*d83cc019SAndroid Build Coastguard Worker close(drm_fd);
911*d83cc019SAndroid Build Coastguard Worker igt_info("Compliance testing application exiting\n");
912*d83cc019SAndroid Build Coastguard Worker exit(ret);
913*d83cc019SAndroid Build Coastguard Worker }
914*d83cc019SAndroid Build Coastguard Worker
cleanup_test(void)915*d83cc019SAndroid Build Coastguard Worker static void cleanup_test(void)
916*d83cc019SAndroid Build Coastguard Worker {
917*d83cc019SAndroid Build Coastguard Worker video_pattern_flag = false;
918*d83cc019SAndroid Build Coastguard Worker hdisplay = 0;
919*d83cc019SAndroid Build Coastguard Worker vdisplay = 0;
920*d83cc019SAndroid Build Coastguard Worker bitdepth = 0;
921*d83cc019SAndroid Build Coastguard Worker }
922*d83cc019SAndroid Build Coastguard Worker
read_test_request(void)923*d83cc019SAndroid Build Coastguard Worker static void read_test_request(void)
924*d83cc019SAndroid Build Coastguard Worker {
925*d83cc019SAndroid Build Coastguard Worker unsigned long test_type;
926*d83cc019SAndroid Build Coastguard Worker
927*d83cc019SAndroid Build Coastguard Worker test_type = get_test_type();
928*d83cc019SAndroid Build Coastguard Worker process_test_request(test_type);
929*d83cc019SAndroid Build Coastguard Worker cleanup_test();
930*d83cc019SAndroid Build Coastguard Worker clear_test_active();
931*d83cc019SAndroid Build Coastguard Worker }
932*d83cc019SAndroid Build Coastguard Worker
test_handler(GIOChannel * source,GIOCondition condition,gpointer data)933*d83cc019SAndroid Build Coastguard Worker static gboolean test_handler(GIOChannel *source, GIOCondition condition,
934*d83cc019SAndroid Build Coastguard Worker gpointer data)
935*d83cc019SAndroid Build Coastguard Worker {
936*d83cc019SAndroid Build Coastguard Worker unsigned long test_active;
937*d83cc019SAndroid Build Coastguard Worker int ret;
938*d83cc019SAndroid Build Coastguard Worker
939*d83cc019SAndroid Build Coastguard Worker rewind(test_active_fp);
940*d83cc019SAndroid Build Coastguard Worker
941*d83cc019SAndroid Build Coastguard Worker ret = fscanf(test_active_fp, "%lx", &test_active);
942*d83cc019SAndroid Build Coastguard Worker if (ret < 1)
943*d83cc019SAndroid Build Coastguard Worker return FALSE;
944*d83cc019SAndroid Build Coastguard Worker
945*d83cc019SAndroid Build Coastguard Worker if (test_active)
946*d83cc019SAndroid Build Coastguard Worker read_test_request();
947*d83cc019SAndroid Build Coastguard Worker return TRUE;
948*d83cc019SAndroid Build Coastguard Worker }
949*d83cc019SAndroid Build Coastguard Worker
input_event(GIOChannel * source,GIOCondition condition,gpointer data)950*d83cc019SAndroid Build Coastguard Worker static gboolean input_event(GIOChannel *source, GIOCondition condition,
951*d83cc019SAndroid Build Coastguard Worker gpointer data)
952*d83cc019SAndroid Build Coastguard Worker {
953*d83cc019SAndroid Build Coastguard Worker gchar buf[2];
954*d83cc019SAndroid Build Coastguard Worker gsize count;
955*d83cc019SAndroid Build Coastguard Worker
956*d83cc019SAndroid Build Coastguard Worker count = read(g_io_channel_unix_get_fd(source), buf, sizeof(buf));
957*d83cc019SAndroid Build Coastguard Worker if (buf[0] == 'q' && (count == 1 || buf[1] == '\n')) {
958*d83cc019SAndroid Build Coastguard Worker cleanup_and_exit(0);
959*d83cc019SAndroid Build Coastguard Worker }
960*d83cc019SAndroid Build Coastguard Worker
961*d83cc019SAndroid Build Coastguard Worker return TRUE;
962*d83cc019SAndroid Build Coastguard Worker }
963*d83cc019SAndroid Build Coastguard Worker
enter_exec_path(char ** argv)964*d83cc019SAndroid Build Coastguard Worker static void enter_exec_path(char **argv)
965*d83cc019SAndroid Build Coastguard Worker {
966*d83cc019SAndroid Build Coastguard Worker char *exec_path = NULL;
967*d83cc019SAndroid Build Coastguard Worker char *pos = NULL;
968*d83cc019SAndroid Build Coastguard Worker short len_path = 0;
969*d83cc019SAndroid Build Coastguard Worker int ret;
970*d83cc019SAndroid Build Coastguard Worker
971*d83cc019SAndroid Build Coastguard Worker len_path = strlen(argv[0]);
972*d83cc019SAndroid Build Coastguard Worker exec_path = (char *) malloc(len_path);
973*d83cc019SAndroid Build Coastguard Worker
974*d83cc019SAndroid Build Coastguard Worker memcpy(exec_path, argv[0], len_path);
975*d83cc019SAndroid Build Coastguard Worker pos = strrchr(exec_path, '/');
976*d83cc019SAndroid Build Coastguard Worker if (pos != NULL)
977*d83cc019SAndroid Build Coastguard Worker *(pos+1) = '\0';
978*d83cc019SAndroid Build Coastguard Worker
979*d83cc019SAndroid Build Coastguard Worker ret = chdir(exec_path);
980*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ret, 0);
981*d83cc019SAndroid Build Coastguard Worker free(exec_path);
982*d83cc019SAndroid Build Coastguard Worker }
983*d83cc019SAndroid Build Coastguard Worker
restore_termio_mode(int sig)984*d83cc019SAndroid Build Coastguard Worker static void restore_termio_mode(int sig)
985*d83cc019SAndroid Build Coastguard Worker {
986*d83cc019SAndroid Build Coastguard Worker tcsetattr(tio_fd, TCSANOW, &saved_tio);
987*d83cc019SAndroid Build Coastguard Worker close(tio_fd);
988*d83cc019SAndroid Build Coastguard Worker }
989*d83cc019SAndroid Build Coastguard Worker
set_termio_mode(void)990*d83cc019SAndroid Build Coastguard Worker static void set_termio_mode(void)
991*d83cc019SAndroid Build Coastguard Worker {
992*d83cc019SAndroid Build Coastguard Worker struct termios tio;
993*d83cc019SAndroid Build Coastguard Worker
994*d83cc019SAndroid Build Coastguard Worker /* don't attempt to set terminal attributes if not in the foreground
995*d83cc019SAndroid Build Coastguard Worker * process group
996*d83cc019SAndroid Build Coastguard Worker */
997*d83cc019SAndroid Build Coastguard Worker if (getpgrp() != tcgetpgrp(STDOUT_FILENO))
998*d83cc019SAndroid Build Coastguard Worker return;
999*d83cc019SAndroid Build Coastguard Worker
1000*d83cc019SAndroid Build Coastguard Worker tio_fd = dup(STDIN_FILENO);
1001*d83cc019SAndroid Build Coastguard Worker tcgetattr(tio_fd, &saved_tio);
1002*d83cc019SAndroid Build Coastguard Worker igt_install_exit_handler(restore_termio_mode);
1003*d83cc019SAndroid Build Coastguard Worker tio = saved_tio;
1004*d83cc019SAndroid Build Coastguard Worker tio.c_lflag &= ~(ICANON | ECHO);
1005*d83cc019SAndroid Build Coastguard Worker tcsetattr(tio_fd, TCSANOW, &tio);
1006*d83cc019SAndroid Build Coastguard Worker }
1007*d83cc019SAndroid Build Coastguard Worker
main(int argc,char ** argv)1008*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
1009*d83cc019SAndroid Build Coastguard Worker {
1010*d83cc019SAndroid Build Coastguard Worker int c;
1011*d83cc019SAndroid Build Coastguard Worker int ret = 0;
1012*d83cc019SAndroid Build Coastguard Worker GIOChannel *stdinchannel, *testactive_channel;
1013*d83cc019SAndroid Build Coastguard Worker GMainLoop *mainloop;
1014*d83cc019SAndroid Build Coastguard Worker bool opt_dump_info = false;
1015*d83cc019SAndroid Build Coastguard Worker struct option long_opts[] = {
1016*d83cc019SAndroid Build Coastguard Worker {"help-description", 0, 0, HELP_DESCRIPTION},
1017*d83cc019SAndroid Build Coastguard Worker {"help", 0, 0, 'h'},
1018*d83cc019SAndroid Build Coastguard Worker };
1019*d83cc019SAndroid Build Coastguard Worker
1020*d83cc019SAndroid Build Coastguard Worker igt_skip_on_simulation();
1021*d83cc019SAndroid Build Coastguard Worker
1022*d83cc019SAndroid Build Coastguard Worker enter_exec_path(argv);
1023*d83cc019SAndroid Build Coastguard Worker
1024*d83cc019SAndroid Build Coastguard Worker while ((c = getopt_long(argc, argv, optstr, long_opts, NULL)) != -1) {
1025*d83cc019SAndroid Build Coastguard Worker switch (c) {
1026*d83cc019SAndroid Build Coastguard Worker case 'i':
1027*d83cc019SAndroid Build Coastguard Worker opt_dump_info = true;
1028*d83cc019SAndroid Build Coastguard Worker break;
1029*d83cc019SAndroid Build Coastguard Worker case HELP_DESCRIPTION:
1030*d83cc019SAndroid Build Coastguard Worker igt_info("DP Compliance Test Suite using DPR-120\n");
1031*d83cc019SAndroid Build Coastguard Worker igt_info("EDID tests\n");
1032*d83cc019SAndroid Build Coastguard Worker igt_info("Video Pattern Generation tests\n");
1033*d83cc019SAndroid Build Coastguard Worker exit(0);
1034*d83cc019SAndroid Build Coastguard Worker break;
1035*d83cc019SAndroid Build Coastguard Worker default:
1036*d83cc019SAndroid Build Coastguard Worker /* fall through */
1037*d83cc019SAndroid Build Coastguard Worker case 'h':
1038*d83cc019SAndroid Build Coastguard Worker usage(argv[0], c);
1039*d83cc019SAndroid Build Coastguard Worker break;
1040*d83cc019SAndroid Build Coastguard Worker }
1041*d83cc019SAndroid Build Coastguard Worker }
1042*d83cc019SAndroid Build Coastguard Worker
1043*d83cc019SAndroid Build Coastguard Worker set_termio_mode();
1044*d83cc019SAndroid Build Coastguard Worker
1045*d83cc019SAndroid Build Coastguard Worker drm_fd = drm_open_driver(DRIVER_ANY);
1046*d83cc019SAndroid Build Coastguard Worker gen = intel_gen(intel_get_drm_devid(drm_fd));
1047*d83cc019SAndroid Build Coastguard Worker
1048*d83cc019SAndroid Build Coastguard Worker kmstest_set_vt_graphics_mode();
1049*d83cc019SAndroid Build Coastguard Worker setup_debugfs_files();
1050*d83cc019SAndroid Build Coastguard Worker cleanup_test();
1051*d83cc019SAndroid Build Coastguard Worker
1052*d83cc019SAndroid Build Coastguard Worker if (opt_dump_info) {
1053*d83cc019SAndroid Build Coastguard Worker dump_info();
1054*d83cc019SAndroid Build Coastguard Worker goto out_close;
1055*d83cc019SAndroid Build Coastguard Worker }
1056*d83cc019SAndroid Build Coastguard Worker
1057*d83cc019SAndroid Build Coastguard Worker /* Get the DP connector ID and CRTC */
1058*d83cc019SAndroid Build Coastguard Worker if (update_display(0, false)) {
1059*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to set default mode\n");
1060*d83cc019SAndroid Build Coastguard Worker ret = -1;
1061*d83cc019SAndroid Build Coastguard Worker goto out_close;
1062*d83cc019SAndroid Build Coastguard Worker }
1063*d83cc019SAndroid Build Coastguard Worker
1064*d83cc019SAndroid Build Coastguard Worker mainloop = g_main_loop_new(NULL, FALSE);
1065*d83cc019SAndroid Build Coastguard Worker if (!mainloop) {
1066*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to create GMainLoop\n");
1067*d83cc019SAndroid Build Coastguard Worker ret = -1;
1068*d83cc019SAndroid Build Coastguard Worker goto out_close;
1069*d83cc019SAndroid Build Coastguard Worker }
1070*d83cc019SAndroid Build Coastguard Worker
1071*d83cc019SAndroid Build Coastguard Worker if (!intel_dp_compliance_setup_hotplug()) {
1072*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to initialize hotplug support\n");
1073*d83cc019SAndroid Build Coastguard Worker goto out_mainloop;
1074*d83cc019SAndroid Build Coastguard Worker }
1075*d83cc019SAndroid Build Coastguard Worker
1076*d83cc019SAndroid Build Coastguard Worker testactive_channel = g_io_channel_unix_new(fileno(test_active_fp));
1077*d83cc019SAndroid Build Coastguard Worker if (!testactive_channel) {
1078*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to create test_active GIOChannel\n");
1079*d83cc019SAndroid Build Coastguard Worker goto out_close;
1080*d83cc019SAndroid Build Coastguard Worker }
1081*d83cc019SAndroid Build Coastguard Worker
1082*d83cc019SAndroid Build Coastguard Worker ret = g_io_add_watch(testactive_channel, G_IO_IN | G_IO_ERR,
1083*d83cc019SAndroid Build Coastguard Worker test_handler, NULL);
1084*d83cc019SAndroid Build Coastguard Worker if (ret < 0) {
1085*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to add watch on udev GIOChannel\n");
1086*d83cc019SAndroid Build Coastguard Worker goto out_close;
1087*d83cc019SAndroid Build Coastguard Worker }
1088*d83cc019SAndroid Build Coastguard Worker
1089*d83cc019SAndroid Build Coastguard Worker stdinchannel = g_io_channel_unix_new(0);
1090*d83cc019SAndroid Build Coastguard Worker if (!stdinchannel) {
1091*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to create stdin GIOChannel\n");
1092*d83cc019SAndroid Build Coastguard Worker goto out_hotplug;
1093*d83cc019SAndroid Build Coastguard Worker }
1094*d83cc019SAndroid Build Coastguard Worker
1095*d83cc019SAndroid Build Coastguard Worker ret = g_io_add_watch(stdinchannel, G_IO_IN | G_IO_ERR, input_event,
1096*d83cc019SAndroid Build Coastguard Worker NULL);
1097*d83cc019SAndroid Build Coastguard Worker if (ret < 0) {
1098*d83cc019SAndroid Build Coastguard Worker igt_warn("Failed to add watch on stdin GIOChannel\n");
1099*d83cc019SAndroid Build Coastguard Worker goto out_stdio;
1100*d83cc019SAndroid Build Coastguard Worker }
1101*d83cc019SAndroid Build Coastguard Worker
1102*d83cc019SAndroid Build Coastguard Worker ret = 0;
1103*d83cc019SAndroid Build Coastguard Worker
1104*d83cc019SAndroid Build Coastguard Worker igt_info("*************DP Compliance Testing using DPR-120*************\n");
1105*d83cc019SAndroid Build Coastguard Worker igt_info("Waiting for test request......\n");
1106*d83cc019SAndroid Build Coastguard Worker
1107*d83cc019SAndroid Build Coastguard Worker g_main_loop_run(mainloop);
1108*d83cc019SAndroid Build Coastguard Worker
1109*d83cc019SAndroid Build Coastguard Worker out_stdio:
1110*d83cc019SAndroid Build Coastguard Worker g_io_channel_shutdown(stdinchannel, TRUE, NULL);
1111*d83cc019SAndroid Build Coastguard Worker out_hotplug:
1112*d83cc019SAndroid Build Coastguard Worker intel_dp_compliance_cleanup_hotplug();
1113*d83cc019SAndroid Build Coastguard Worker out_mainloop:
1114*d83cc019SAndroid Build Coastguard Worker g_main_loop_unref(mainloop);
1115*d83cc019SAndroid Build Coastguard Worker out_close:
1116*d83cc019SAndroid Build Coastguard Worker cleanup_debugfs();
1117*d83cc019SAndroid Build Coastguard Worker close(drm_fd);
1118*d83cc019SAndroid Build Coastguard Worker
1119*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ret, 0);
1120*d83cc019SAndroid Build Coastguard Worker
1121*d83cc019SAndroid Build Coastguard Worker igt_info("Compliance testing application exiting\n");
1122*d83cc019SAndroid Build Coastguard Worker igt_exit();
1123*d83cc019SAndroid Build Coastguard Worker }
1124