1 /*************************************************************************** 2 * 3 * devinfo_pci.c : PCI devices 4 * 5 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 6 * Use is subject to license terms. 7 * 8 * Licensed under the Academic Free License version 2.1 9 * 10 **************************************************************************/ 11 12 #pragma ident "%Z%%M% %I% %E% SMI" 13 14 #ifdef HAVE_CONFIG_H 15 # include <config.h> 16 #endif 17 18 #include <stdio.h> 19 #include <string.h> 20 #include <libdevinfo.h> 21 22 #include "../osspec.h" 23 #include "../logger.h" 24 #include "../hald.h" 25 #include "../hald_dbus.h" 26 #include "../device_info.h" 27 #include "../util.h" 28 #include "../ids.h" 29 #include "devinfo_pci.h" 30 31 HalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type); 32 33 DevinfoDevHandler devinfo_pci_handler = { 34 devinfo_pci_add, 35 NULL, 36 NULL, 37 NULL, 38 NULL, 39 NULL 40 }; 41 42 HalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type) 43 { 44 HalDevice *d; 45 char *s; 46 int *i; 47 int vid, pid, svid, spid; 48 49 if ((device_type == NULL) || 50 ((strcmp (device_type, "pci") != 0) && 51 (strcmp (device_type, "pci-ide") != 0))) { 52 if (parent == NULL) { 53 return (NULL); 54 } else { 55 s = (char *)hal_device_property_get_string (parent, "info.subsystem"); 56 if ((s == NULL) || (strcmp (s, "pci") != 0)) { 57 return (NULL); 58 } 59 } 60 } 61 62 d = hal_device_new (); 63 devinfo_set_default_properties (d, parent, node, devfs_path); 64 65 hal_device_property_set_string (d, "info.subsystem", "pci"); 66 67 vid = pid = svid = spid = 0; 68 if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "vendor-id", &i) > 0) { 69 vid = i[0]; 70 } 71 if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "device-id", &i) > 0) { 72 pid = i[0]; 73 } 74 if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-vendor-id", &i) > 0) { 75 svid = i[0]; 76 } 77 if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-id", &i) > 0) { 78 spid = i[0]; 79 } 80 hal_device_property_set_int (d, "pci.vendor_id", vid); 81 hal_device_property_set_int (d, "pci.product_id", pid); 82 hal_device_property_set_int (d, "pci.subsys_vendor_id", svid); 83 hal_device_property_set_int (d, "pci.subsys_product_id", spid); 84 85 { 86 char *vendor_name; 87 char *product_name; 88 char *subsys_vendor_name; 89 char *subsys_product_name; 90 91 ids_find_pci (hal_device_property_get_int (d, "pci.vendor_id"), 92 hal_device_property_get_int (d, "pci.product_id"), 93 hal_device_property_get_int (d, "pci.subsys_vendor_id"), 94 hal_device_property_get_int (d, "pci.subsys_product_id"), 95 &vendor_name, &product_name, &subsys_vendor_name, 96 &subsys_product_name); 97 98 if (vendor_name != NULL) { 99 hal_device_property_set_string (d, "pci.vendor", vendor_name); 100 hal_device_property_set_string (d, "info.vendor", vendor_name); 101 } 102 103 if (product_name != NULL) { 104 hal_device_property_set_string (d, "pci.product", product_name); 105 hal_device_property_set_string (d, "info.product", product_name); 106 } 107 108 if (subsys_vendor_name != NULL) { 109 hal_device_property_set_string (d, "pci.subsys_vendor", 110 subsys_vendor_name); 111 } 112 113 if (subsys_product_name != NULL) { 114 hal_device_property_set_string (d, "pci.subsys_product", subsys_product_name); 115 } 116 } 117 118 devinfo_add_enqueue (d, devfs_path, &devinfo_pci_handler); 119 120 return (d); 121 } 122 123