12ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke/* 22ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Copyright © 2011 Intel Corporation 32ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 42ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a 52ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * copy of this software and associated documentation files (the "Software"), 62ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * to deal in the Software without restriction, including without limitation 72ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the 92ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Software is furnished to do so, subject to the following conditions: 102ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 112ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * The above copyright notice and this permission notice (including the next 122ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * paragraph) shall be included in all copies or substantial portions of the 132ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Software. 142ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 152ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 162ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 172ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 182ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 192ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 202ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 212ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 222ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * DEALINGS IN THE SOFTWARE. 232ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * 242ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Authors: 252ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Kristian Høgsberg <krh@bitplanet.net> 262ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke * Benjamin Franzke <benjaminfranzke@googlemail.com> 272ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke */ 282ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 292ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <stdio.h> 302ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <string.h> 312ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 322ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include <libudev.h> 332ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 342ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include "gbm_driint.h" 352ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#define DRIVER_MAP_DRI2_ONLY 362ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke#include "pci_ids/pci_id_driver_map.h" 372ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 382ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkechar * 392ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkedri_fd_get_driver_name(int fd) 402ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke{ 412ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct udev *udev; 422ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke struct udev_device *device, *parent; 432ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke const char *pci_id; 442ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke char *driver = NULL; 452ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke int vendor_id, chip_id, i, j; 462ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 472ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke udev = udev_new(); 482ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke device = _gbm_udev_device_new_from_fd(udev, fd); 492ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (device == NULL) 502ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return NULL; 512ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 522ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke parent = udev_device_get_parent(device); 532ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (parent == NULL) { 542ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "gbm: could not get parent device"); 552ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke goto out; 562ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 572ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 582ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke pci_id = udev_device_get_property_value(parent, "PCI_ID"); 592ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (pci_id == NULL || 602ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke sscanf(pci_id, "%x:%x", &vendor_id, &chip_id) != 2) { 612ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fprintf(stderr, "gbm: malformed or no PCI ID"); 622ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke goto out; 632ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 642ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 652ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (i = 0; driver_map[i].driver; i++) { 662ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (vendor_id != driver_map[i].vendor_id) 672ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke continue; 682ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (driver_map[i].num_chips_ids == -1) { 692ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke driver = strdup(driver_map[i].driver); 702ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke _gbm_log("pci id for %d: %04x:%04x, driver %s", 712ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fd, vendor_id, chip_id, driver); 722ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke goto out; 732ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 742ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 752ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke for (j = 0; j < driver_map[i].num_chips_ids; j++) 762ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke if (driver_map[i].chip_ids[j] == chip_id) { 772ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke driver = strdup(driver_map[i].driver); 782ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke _gbm_log("pci id for %d: %04x:%04x, driver %s", 792ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke fd, vendor_id, chip_id, driver); 802ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke goto out; 812ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 822ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke } 832ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 842ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzkeout: 852ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke udev_device_unref(device); 862ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke udev_unref(udev); 872ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke 882ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke return driver; 892ff797060d4ffbe1c1bf5b605ea5d4f9e588da41Benjamin Franzke} 90