blob: c2484600675b4b00fa5aa1a9352ec0b5b28e3129 [file] [log] [blame]
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -06001/*
2 * XGL 3-D graphics library
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
Chia-I Wu44e42362014-09-02 08:32:09 +080025 * Courtney Goeltzenleuchter <courtney@lunarg.com>
26 * Chia-I Wu <olv@lunarg.com>
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060027 */
28
Chia-I Wu023ef682014-09-15 11:06:50 +080029#include "icd-enumerate-drm.h"
Chia-I Wua6e33492014-08-05 13:35:08 +080030#include "gpu.h"
31#include "intel.h"
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060032
Chia-I Wu73019ad2014-08-29 12:01:13 +080033static int intel_devid_override;
Chia-I Wu1c527012014-08-23 14:57:35 +080034int intel_debug = -1;
35
36static void intel_debug_init(void)
37{
38 const char *env;
39
40 if (intel_debug >= 0)
41 return;
42
43 intel_debug = 0;
44
45 /* parse comma-separated debug options */
46 env = getenv("INTEL_DEBUG");
47 while (env) {
48 const char *p = strchr(env, ',');
49 size_t len;
50
51 if (p)
52 len = p - env;
53 else
54 len = strlen(env);
55
Chia-I Wu73019ad2014-08-29 12:01:13 +080056 if (strncmp(env, "batch", len) == 0) {
Chia-I Wu1c527012014-08-23 14:57:35 +080057 intel_debug |= INTEL_DEBUG_BATCH;
Chia-I Wu73019ad2014-08-29 12:01:13 +080058 } else if (strncmp(env, "nohw", len) == 0) {
Chia-I Wu93ada312014-08-23 15:02:25 +080059 intel_debug |= INTEL_DEBUG_NOHW;
Chia-I Wu73019ad2014-08-29 12:01:13 +080060 } else if (strncmp(env, "0x", 2) == 0) {
61 intel_debug |= INTEL_DEBUG_NOHW;
62 intel_devid_override = strtol(env, NULL, 16);
63 }
Chia-I Wu1c527012014-08-23 14:57:35 +080064
65 if (!p)
66 break;
67
68 env = p + 1;
69 }
70}
71
Chia-I Wu023ef682014-09-15 11:06:50 +080072ICD_EXPORT XGL_RESULT XGLAPI xglInitAndEnumerateGpus(
73 const XGL_APPLICATION_INFO* pAppInfo,
74 const XGL_ALLOC_CALLBACKS* pAllocCb,
75 XGL_UINT maxGpus,
76 XGL_UINT* pGpuCount,
77 XGL_PHYSICAL_GPU* pGpus)
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060078{
Chia-I Wu023ef682014-09-15 11:06:50 +080079 struct icd_drm_device *devices, *dev;
Chia-I Wu3065c9c2014-08-04 06:28:31 +080080 XGL_RESULT ret;
Chia-I Wu023ef682014-09-15 11:06:50 +080081 XGL_UINT count;
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060082
Chia-I Wu1c527012014-08-23 14:57:35 +080083 intel_debug_init();
84
Chia-I Wuc217f802014-08-05 10:17:50 +080085 ret = icd_set_allocator(pAllocCb);
Chia-I Wu3065c9c2014-08-04 06:28:31 +080086 if (ret != XGL_SUCCESS)
87 return ret;
88
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060089 /*
Chia-I Wu023ef682014-09-15 11:06:50 +080090 * xglInitAndEnumerateGpus() can be called multiple times. Calling it more
91 * than once forces driver reinitialization.
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060092 */
Chia-I Wua6e33492014-08-05 13:35:08 +080093 intel_gpu_remove_all();
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -060094
Chia-I Wuc7bff532014-08-06 12:14:54 +080095 if (!maxGpus) {
96 *pGpuCount = 0;
Chia-I Wua6e33492014-08-05 13:35:08 +080097 return XGL_SUCCESS;
Chia-I Wuc7bff532014-08-06 12:14:54 +080098 }
Chia-I Wua6e33492014-08-05 13:35:08 +080099
Chia-I Wu023ef682014-09-15 11:06:50 +0800100 devices = icd_drm_enumerate(0x8086);
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600101
Chia-I Wu023ef682014-09-15 11:06:50 +0800102 count = 0;
103 dev = devices;
104 while (dev) {
Chia-I Wuf07865e2014-09-15 13:52:21 +0800105 const char *primary_node, *render_node;
Chia-I Wua6e33492014-08-05 13:35:08 +0800106 struct intel_gpu *gpu;
107
Chia-I Wuf07865e2014-09-15 13:52:21 +0800108 primary_node = icd_drm_get_devnode(dev, ICD_DRM_MINOR_LEGACY);
109 render_node = icd_drm_get_devnode(dev, ICD_DRM_MINOR_RENDER);
110 if (!primary_node || !render_node)
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600111 continue;
Chia-I Wua6e33492014-08-05 13:35:08 +0800112
Chia-I Wuf07865e2014-09-15 13:52:21 +0800113 ret = intel_gpu_add(dev->devid, primary_node, render_node, &gpu);
Chia-I Wua6e33492014-08-05 13:35:08 +0800114 if (ret == XGL_SUCCESS) {
115 pGpus[count++] = (XGL_PHYSICAL_GPU) gpu;
116 if (count >= maxGpus)
117 break;
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600118 }
Chia-I Wu023ef682014-09-15 11:06:50 +0800119
120 dev = dev->next;
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600121 }
Chia-I Wua6e33492014-08-05 13:35:08 +0800122
Chia-I Wu023ef682014-09-15 11:06:50 +0800123 icd_drm_release(devices);
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600124
Chia-I Wua6e33492014-08-05 13:35:08 +0800125 *pGpuCount = count;
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600126
Chia-I Wua6e33492014-08-05 13:35:08 +0800127 return (count > 0) ? XGL_SUCCESS : XGL_ERROR_UNAVAILABLE;
Courtney Goeltzenleuchtere06e72d2014-08-01 12:44:23 -0600128}