summaryrefslogtreecommitdiff
path: root/src/loader
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>2022-06-29 10:21:24 +0200
committerMarge Bot <emma+marge@anholt.net>2022-08-08 16:52:44 +0000
commit4005ba3ed4256ad398298542c92c765503520b60 (patch)
tree5725e9d74f94f704898b60a829343c787f638f8c /src/loader
parent6d50e4cdc1bb78c62575b4941c8c914de783e075 (diff)
downloadmesa-4005ba3ed4256ad398298542c92c765503520b60.tar.gz
loader: allow DRI_PRIME=vendor_id:device_id syntax
This syntax allows to select a specific GPU without depending on the pci bus information. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17298>
Diffstat (limited to 'src/loader')
-rw-r--r--src/loader/loader.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/loader/loader.c b/src/loader/loader.c
index 7cef1d49f60..4ebd5429ec0 100644
--- a/src/loader/loader.c
+++ b/src/loader/loader.c
@@ -328,6 +328,8 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
char *default_tag, *prime = NULL;
drmDevicePtr devices[MAX_DRM_DEVICES];
int i, num_devices, fd = -1;
+ bool prime_is_vid_did;
+ uint16_t vendor_id, device_id;
if (dri_prime)
prime = strdup(dri_prime);
@@ -339,6 +341,8 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
if (prime == NULL) {
*different_device = false;
return default_fd;
+ } else {
+ prime_is_vid_did = sscanf(prime, "%hx:%hx", &vendor_id, &device_id) == 2;
}
default_tag = drm_get_id_path_tag_for_fd(default_fd);
@@ -353,17 +357,27 @@ int loader_get_user_preferred_fd(int default_fd, bool *different_device)
if (!(devices[i]->available_nodes & 1 << DRM_NODE_RENDER))
continue;
- /* two formats of DRI_PRIME are supported:
+ /* three formats of DRI_PRIME are supported:
* "1": choose any other card than the card used by default.
* id_path_tag: (for example "pci-0000_02_00_0") choose the card
* with this id_path_tag.
+ * vendor_id:device_id
*/
if (!strcmp(prime,"1")) {
if (drm_device_matches_tag(devices[i], default_tag))
continue;
} else {
- if (!drm_device_matches_tag(devices[i], prime))
- continue;
+ if (prime_is_vid_did && devices[i]->bustype == DRM_BUS_PCI &&
+ devices[i]->deviceinfo.pci->vendor_id == vendor_id &&
+ devices[i]->deviceinfo.pci->device_id == device_id) {
+ /* Update prime for the "different_device"
+ * determination below. */
+ free(prime);
+ prime = drm_construct_id_path_tag(devices[i]);
+ } else {
+ if (!drm_device_matches_tag(devices[i], prime))
+ continue;
+ }
}
fd = loader_open_device(devices[i]->nodes[DRM_NODE_RENDER]);