mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
intel/dev: Bail when INTEL_DEVID_OVERRIDE is not valid
Avoids surprises where you set an OVERRIDE but it gets ignored and the system PCI ID is used. Also fixes the bug that the error of invalid platform name being printed too early, even when the passed platform was a PCI ID (which is also supported). For the case where euid != uid, a warning was added but the behavior wasn't changed: it is still going to fallback to system PCI ID. Reviewed-by: Matt Turner <mattst88@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4841>
This commit is contained in:
parent
65b05ebdda
commit
2a05ba5414
1 changed files with 52 additions and 55 deletions
|
|
@ -35,6 +35,34 @@
|
|||
|
||||
#include "drm-uapi/i915_drm.h"
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
int pci_id;
|
||||
} name_map[] = {
|
||||
{ "brw", 0x2a02 },
|
||||
{ "g4x", 0x2a42 },
|
||||
{ "ilk", 0x0042 },
|
||||
{ "snb", 0x0126 },
|
||||
{ "ivb", 0x016a },
|
||||
{ "hsw", 0x0d2e },
|
||||
{ "byt", 0x0f33 },
|
||||
{ "bdw", 0x162e },
|
||||
{ "chv", 0x22B3 },
|
||||
{ "skl", 0x1912 },
|
||||
{ "bxt", 0x5A85 },
|
||||
{ "kbl", 0x5912 },
|
||||
{ "aml", 0x591C },
|
||||
{ "glk", 0x3185 },
|
||||
{ "cfl", 0x3E9B },
|
||||
{ "whl", 0x3EA1 },
|
||||
{ "cml", 0x9b41 },
|
||||
{ "cnl", 0x5a52 },
|
||||
{ "icl", 0x8a52 },
|
||||
{ "ehl", 0x4500 },
|
||||
{ "jsl", 0x4E71 },
|
||||
{ "tgl", 0x9a49 },
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the PCI ID for the device name.
|
||||
*
|
||||
|
|
@ -43,65 +71,11 @@
|
|||
int
|
||||
gen_device_name_to_pci_device_id(const char *name)
|
||||
{
|
||||
static const struct {
|
||||
const char *name;
|
||||
int pci_id;
|
||||
} name_map[] = {
|
||||
{ "brw", 0x2a02 },
|
||||
{ "g4x", 0x2a42 },
|
||||
{ "ilk", 0x0042 },
|
||||
{ "snb", 0x0126 },
|
||||
{ "ivb", 0x016a },
|
||||
{ "hsw", 0x0d2e },
|
||||
{ "byt", 0x0f33 },
|
||||
{ "bdw", 0x162e },
|
||||
{ "chv", 0x22B3 },
|
||||
{ "skl", 0x1912 },
|
||||
{ "bxt", 0x5A85 },
|
||||
{ "kbl", 0x5912 },
|
||||
{ "aml", 0x591C },
|
||||
{ "glk", 0x3185 },
|
||||
{ "cfl", 0x3E9B },
|
||||
{ "whl", 0x3EA1 },
|
||||
{ "cml", 0x9b41 },
|
||||
{ "cnl", 0x5a52 },
|
||||
{ "icl", 0x8a52 },
|
||||
{ "ehl", 0x4500 },
|
||||
{ "jsl", 0x4E71 },
|
||||
{ "tgl", 0x9a49 },
|
||||
};
|
||||
|
||||
for (unsigned i = 0; i < ARRAY_SIZE(name_map); i++) {
|
||||
if (!strcmp(name_map[i].name, name))
|
||||
return name_map[i].pci_id;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Unknown platform '%s'. Supported names: %s",
|
||||
name, name_map[0].name);
|
||||
for (unsigned i = 1; i < ARRAY_SIZE(name_map); i++)
|
||||
fprintf(stderr, ", %s", name_map[i].name);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the overridden PCI ID for the device. This is set with the
|
||||
* INTEL_DEVID_OVERRIDE environment variable.
|
||||
*
|
||||
* Returns -1 if the override is not set.
|
||||
*/
|
||||
static int
|
||||
get_pci_device_id_override(void)
|
||||
{
|
||||
if (geteuid() == getuid()) {
|
||||
const char *devid_override = getenv("INTEL_DEVID_OVERRIDE");
|
||||
if (devid_override) {
|
||||
const int id = gen_device_name_to_pci_device_id(devid_override);
|
||||
return id >= 0 ? id : strtol(devid_override, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1437,7 +1411,30 @@ query_topology(struct gen_device_info *devinfo, int fd)
|
|||
bool
|
||||
gen_get_device_info_from_fd(int fd, struct gen_device_info *devinfo)
|
||||
{
|
||||
int devid = get_pci_device_id_override();
|
||||
int devid = 0;
|
||||
|
||||
const char *devid_override = getenv("INTEL_DEVID_OVERRIDE");
|
||||
if (devid_override && strlen(devid_override) > 0) {
|
||||
if (geteuid() == getuid()) {
|
||||
devid = gen_device_name_to_pci_device_id(devid_override);
|
||||
/* Fallback to PCI ID. */
|
||||
if (devid <= 0)
|
||||
devid = strtol(devid_override, NULL, 0);
|
||||
if (devid <= 0) {
|
||||
fprintf(stderr, "Invalid INTEL_DEVID_OVERRIDE=\"%s\". "
|
||||
"Use a valid numeric PCI ID or one of the supported "
|
||||
"platform names: %s", devid_override, name_map[0].name);
|
||||
for (unsigned i = 1; i < ARRAY_SIZE(name_map); i++)
|
||||
fprintf(stderr, ", %s", name_map[i].name);
|
||||
fprintf(stderr, "\n");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Ignoring INTEL_DEVID_OVERRIDE=\"%s\" because "
|
||||
"real and effective user ID don't match.\n", devid_override);
|
||||
}
|
||||
}
|
||||
|
||||
if (devid > 0) {
|
||||
if (!gen_get_device_info_from_pci_id(devid, devinfo))
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue