xref: /aosp_15_r20/external/libdrm/tests/drmdevice.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright (c) 2015 Emil Velikov <[email protected]>
3*7688df22SAndroid Build Coastguard Worker  *
4*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker  *
11*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker  *
14*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17*7688df22SAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*7688df22SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*7688df22SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20*7688df22SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker  *
22*7688df22SAndroid Build Coastguard Worker  */
23*7688df22SAndroid Build Coastguard Worker 
24*7688df22SAndroid Build Coastguard Worker #include <errno.h>
25*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
26*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
27*7688df22SAndroid Build Coastguard Worker #include <stdbool.h>
28*7688df22SAndroid Build Coastguard Worker #include <string.h>
29*7688df22SAndroid Build Coastguard Worker #include <sys/stat.h>
30*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
31*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
32*7688df22SAndroid Build Coastguard Worker #include <xf86drm.h>
33*7688df22SAndroid Build Coastguard Worker 
34*7688df22SAndroid Build Coastguard Worker 
35*7688df22SAndroid Build Coastguard Worker static void
print_device_info(drmDevicePtr device,int i,bool print_revision)36*7688df22SAndroid Build Coastguard Worker print_device_info(drmDevicePtr device, int i, bool print_revision)
37*7688df22SAndroid Build Coastguard Worker {
38*7688df22SAndroid Build Coastguard Worker     printf("device[%i]\n", i);
39*7688df22SAndroid Build Coastguard Worker     printf("+-> available_nodes %#04x\n", device->available_nodes);
40*7688df22SAndroid Build Coastguard Worker     printf("+-> nodes\n");
41*7688df22SAndroid Build Coastguard Worker     for (int j = 0; j < DRM_NODE_MAX; j++)
42*7688df22SAndroid Build Coastguard Worker         if (device->available_nodes & 1 << j)
43*7688df22SAndroid Build Coastguard Worker             printf("|   +-> nodes[%d] %s\n", j, device->nodes[j]);
44*7688df22SAndroid Build Coastguard Worker 
45*7688df22SAndroid Build Coastguard Worker     printf("+-> bustype %04x\n", device->bustype);
46*7688df22SAndroid Build Coastguard Worker     if (device->bustype == DRM_BUS_PCI) {
47*7688df22SAndroid Build Coastguard Worker         printf("|   +-> pci\n");
48*7688df22SAndroid Build Coastguard Worker         printf("|       +-> domain %04x\n",device->businfo.pci->domain);
49*7688df22SAndroid Build Coastguard Worker         printf("|       +-> bus    %02x\n", device->businfo.pci->bus);
50*7688df22SAndroid Build Coastguard Worker         printf("|       +-> dev    %02x\n", device->businfo.pci->dev);
51*7688df22SAndroid Build Coastguard Worker         printf("|       +-> func   %1u\n", device->businfo.pci->func);
52*7688df22SAndroid Build Coastguard Worker 
53*7688df22SAndroid Build Coastguard Worker         printf("+-> deviceinfo\n");
54*7688df22SAndroid Build Coastguard Worker         printf("    +-> pci\n");
55*7688df22SAndroid Build Coastguard Worker         printf("        +-> vendor_id     %04x\n", device->deviceinfo.pci->vendor_id);
56*7688df22SAndroid Build Coastguard Worker         printf("        +-> device_id     %04x\n", device->deviceinfo.pci->device_id);
57*7688df22SAndroid Build Coastguard Worker         printf("        +-> subvendor_id  %04x\n", device->deviceinfo.pci->subvendor_id);
58*7688df22SAndroid Build Coastguard Worker         printf("        +-> subdevice_id  %04x\n", device->deviceinfo.pci->subdevice_id);
59*7688df22SAndroid Build Coastguard Worker         if (print_revision)
60*7688df22SAndroid Build Coastguard Worker             printf("        +-> revision_id   %02x\n", device->deviceinfo.pci->revision_id);
61*7688df22SAndroid Build Coastguard Worker         else
62*7688df22SAndroid Build Coastguard Worker             printf("        +-> revision_id   IGNORED\n");
63*7688df22SAndroid Build Coastguard Worker 
64*7688df22SAndroid Build Coastguard Worker     } else if (device->bustype == DRM_BUS_USB) {
65*7688df22SAndroid Build Coastguard Worker         printf("|   +-> usb\n");
66*7688df22SAndroid Build Coastguard Worker         printf("|       +-> bus %03u\n", device->businfo.usb->bus);
67*7688df22SAndroid Build Coastguard Worker         printf("|       +-> dev %03u\n", device->businfo.usb->dev);
68*7688df22SAndroid Build Coastguard Worker 
69*7688df22SAndroid Build Coastguard Worker         printf("+-> deviceinfo\n");
70*7688df22SAndroid Build Coastguard Worker         printf("    +-> usb\n");
71*7688df22SAndroid Build Coastguard Worker         printf("        +-> vendor  %04x\n", device->deviceinfo.usb->vendor);
72*7688df22SAndroid Build Coastguard Worker         printf("        +-> product %04x\n", device->deviceinfo.usb->product);
73*7688df22SAndroid Build Coastguard Worker     } else if (device->bustype == DRM_BUS_PLATFORM) {
74*7688df22SAndroid Build Coastguard Worker         char **compatible = device->deviceinfo.platform->compatible;
75*7688df22SAndroid Build Coastguard Worker 
76*7688df22SAndroid Build Coastguard Worker         printf("|   +-> platform\n");
77*7688df22SAndroid Build Coastguard Worker         printf("|       +-> fullname\t%s\n", device->businfo.platform->fullname);
78*7688df22SAndroid Build Coastguard Worker 
79*7688df22SAndroid Build Coastguard Worker         printf("+-> deviceinfo\n");
80*7688df22SAndroid Build Coastguard Worker         printf("    +-> platform\n");
81*7688df22SAndroid Build Coastguard Worker         printf("        +-> compatible\n");
82*7688df22SAndroid Build Coastguard Worker 
83*7688df22SAndroid Build Coastguard Worker         while (*compatible) {
84*7688df22SAndroid Build Coastguard Worker             printf("                    %s\n", *compatible);
85*7688df22SAndroid Build Coastguard Worker             compatible++;
86*7688df22SAndroid Build Coastguard Worker         }
87*7688df22SAndroid Build Coastguard Worker     } else if (device->bustype == DRM_BUS_HOST1X) {
88*7688df22SAndroid Build Coastguard Worker         char **compatible = device->deviceinfo.host1x->compatible;
89*7688df22SAndroid Build Coastguard Worker 
90*7688df22SAndroid Build Coastguard Worker         printf("|   +-> host1x\n");
91*7688df22SAndroid Build Coastguard Worker         printf("|       +-> fullname\t%s\n", device->businfo.host1x->fullname);
92*7688df22SAndroid Build Coastguard Worker 
93*7688df22SAndroid Build Coastguard Worker         printf("+-> deviceinfo\n");
94*7688df22SAndroid Build Coastguard Worker         printf("    +-> host1x\n");
95*7688df22SAndroid Build Coastguard Worker         printf("        +-> compatible\n");
96*7688df22SAndroid Build Coastguard Worker 
97*7688df22SAndroid Build Coastguard Worker         while (*compatible) {
98*7688df22SAndroid Build Coastguard Worker             printf("                    %s\n", *compatible);
99*7688df22SAndroid Build Coastguard Worker             compatible++;
100*7688df22SAndroid Build Coastguard Worker         }
101*7688df22SAndroid Build Coastguard Worker     } else {
102*7688df22SAndroid Build Coastguard Worker         printf("Unknown/unhandled bustype\n");
103*7688df22SAndroid Build Coastguard Worker     }
104*7688df22SAndroid Build Coastguard Worker     printf("\n");
105*7688df22SAndroid Build Coastguard Worker }
106*7688df22SAndroid Build Coastguard Worker 
107*7688df22SAndroid Build Coastguard Worker int
main(void)108*7688df22SAndroid Build Coastguard Worker main(void)
109*7688df22SAndroid Build Coastguard Worker {
110*7688df22SAndroid Build Coastguard Worker     drmDevicePtr *devices;
111*7688df22SAndroid Build Coastguard Worker     drmDevicePtr device;
112*7688df22SAndroid Build Coastguard Worker     int fd, ret, max_devices;
113*7688df22SAndroid Build Coastguard Worker 
114*7688df22SAndroid Build Coastguard Worker     printf("--- Checking the number of DRM device available ---\n");
115*7688df22SAndroid Build Coastguard Worker     max_devices = drmGetDevices2(0, NULL, 0);
116*7688df22SAndroid Build Coastguard Worker 
117*7688df22SAndroid Build Coastguard Worker     if (max_devices <= 0) {
118*7688df22SAndroid Build Coastguard Worker         printf("drmGetDevices2() has not found any devices (errno=%d)\n",
119*7688df22SAndroid Build Coastguard Worker                -max_devices);
120*7688df22SAndroid Build Coastguard Worker         return 77;
121*7688df22SAndroid Build Coastguard Worker     }
122*7688df22SAndroid Build Coastguard Worker     printf("--- Devices reported %d ---\n", max_devices);
123*7688df22SAndroid Build Coastguard Worker 
124*7688df22SAndroid Build Coastguard Worker 
125*7688df22SAndroid Build Coastguard Worker     devices = calloc(max_devices, sizeof(drmDevicePtr));
126*7688df22SAndroid Build Coastguard Worker     if (devices == NULL) {
127*7688df22SAndroid Build Coastguard Worker         printf("Failed to allocate memory for the drmDevicePtr array\n");
128*7688df22SAndroid Build Coastguard Worker         return -1;
129*7688df22SAndroid Build Coastguard Worker     }
130*7688df22SAndroid Build Coastguard Worker 
131*7688df22SAndroid Build Coastguard Worker     printf("--- Retrieving devices information (PCI device revision is ignored) ---\n");
132*7688df22SAndroid Build Coastguard Worker     ret = drmGetDevices2(0, devices, max_devices);
133*7688df22SAndroid Build Coastguard Worker     if (ret < 0) {
134*7688df22SAndroid Build Coastguard Worker         printf("drmGetDevices2() returned an error %d\n", ret);
135*7688df22SAndroid Build Coastguard Worker         free(devices);
136*7688df22SAndroid Build Coastguard Worker         return -1;
137*7688df22SAndroid Build Coastguard Worker     }
138*7688df22SAndroid Build Coastguard Worker 
139*7688df22SAndroid Build Coastguard Worker     for (int i = 0; i < ret; i++) {
140*7688df22SAndroid Build Coastguard Worker         print_device_info(devices[i], i, false);
141*7688df22SAndroid Build Coastguard Worker 
142*7688df22SAndroid Build Coastguard Worker         for (int j = 0; j < DRM_NODE_MAX; j++) {
143*7688df22SAndroid Build Coastguard Worker             if (devices[i]->available_nodes & 1 << j) {
144*7688df22SAndroid Build Coastguard Worker                 printf("--- Opening device node %s ---\n", devices[i]->nodes[j]);
145*7688df22SAndroid Build Coastguard Worker                 fd = open(devices[i]->nodes[j], O_RDONLY | O_CLOEXEC);
146*7688df22SAndroid Build Coastguard Worker                 if (fd < 0) {
147*7688df22SAndroid Build Coastguard Worker                     printf("Failed - %s (%d)\n", strerror(errno), errno);
148*7688df22SAndroid Build Coastguard Worker                     continue;
149*7688df22SAndroid Build Coastguard Worker                 }
150*7688df22SAndroid Build Coastguard Worker 
151*7688df22SAndroid Build Coastguard Worker                 printf("--- Retrieving device info, for node %s ---\n", devices[i]->nodes[j]);
152*7688df22SAndroid Build Coastguard Worker                 if (drmGetDevice2(fd, DRM_DEVICE_GET_PCI_REVISION, &device) == 0) {
153*7688df22SAndroid Build Coastguard Worker                     print_device_info(device, i, true);
154*7688df22SAndroid Build Coastguard Worker                     drmFreeDevice(&device);
155*7688df22SAndroid Build Coastguard Worker                 }
156*7688df22SAndroid Build Coastguard Worker                 close(fd);
157*7688df22SAndroid Build Coastguard Worker             }
158*7688df22SAndroid Build Coastguard Worker         }
159*7688df22SAndroid Build Coastguard Worker     }
160*7688df22SAndroid Build Coastguard Worker 
161*7688df22SAndroid Build Coastguard Worker     drmFreeDevices(devices, ret);
162*7688df22SAndroid Build Coastguard Worker     free(devices);
163*7688df22SAndroid Build Coastguard Worker     return 0;
164*7688df22SAndroid Build Coastguard Worker }
165