118c2aff7Sartem /***************************************************************************
218c2aff7Sartem  *
318c2aff7Sartem  * devinfo_pci.c : PCI devices
418c2aff7Sartem  *
5*112cd14aSqz  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
618c2aff7Sartem  * Use is subject to license terms.
718c2aff7Sartem  *
818c2aff7Sartem  * Licensed under the Academic Free License version 2.1
918c2aff7Sartem  *
1018c2aff7Sartem  **************************************************************************/
1118c2aff7Sartem 
1200687e57Sartem #ifdef HAVE_CONFIG_H
1300687e57Sartem #  include <config.h>
1400687e57Sartem #endif
1500687e57Sartem 
1618c2aff7Sartem #include <stdio.h>
1718c2aff7Sartem #include <string.h>
1818c2aff7Sartem #include <libdevinfo.h>
1918c2aff7Sartem 
2018c2aff7Sartem #include "../osspec.h"
2118c2aff7Sartem #include "../logger.h"
2218c2aff7Sartem #include "../hald.h"
2318c2aff7Sartem #include "../hald_dbus.h"
2418c2aff7Sartem #include "../device_info.h"
2518c2aff7Sartem #include "../util.h"
2618c2aff7Sartem #include "../ids.h"
2718c2aff7Sartem #include "devinfo_pci.h"
2818c2aff7Sartem 
2918c2aff7Sartem HalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
3018c2aff7Sartem 
3118c2aff7Sartem DevinfoDevHandler devinfo_pci_handler = {
3218c2aff7Sartem         devinfo_pci_add,
3318c2aff7Sartem 	NULL,
3418c2aff7Sartem 	NULL,
3518c2aff7Sartem 	NULL,
3618c2aff7Sartem 	NULL,
3718c2aff7Sartem         NULL
3818c2aff7Sartem };
3918c2aff7Sartem 
devinfo_pci_add(HalDevice * parent,di_node_t node,char * devfs_path,char * device_type)4018c2aff7Sartem HalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
4118c2aff7Sartem {
4218c2aff7Sartem 	HalDevice *d;
4318c2aff7Sartem 	char	*s;
4418c2aff7Sartem 	int	*i;
4518c2aff7Sartem 	int	vid, pid, svid, spid;
4618c2aff7Sartem 
4718c2aff7Sartem 	if ((device_type == NULL) ||
4818c2aff7Sartem 	    ((strcmp (device_type, "pci") != 0) &&
4918c2aff7Sartem 	    (strcmp (device_type, "pci-ide") != 0))) {
5018c2aff7Sartem 		if (parent == NULL) {
5118c2aff7Sartem 			return (NULL);
5218c2aff7Sartem 		} else {
53*112cd14aSqz 			s = (char *)hal_device_property_get_string (parent, "info.subsystem");
5418c2aff7Sartem 			if ((s == NULL) || (strcmp (s, "pci") != 0)) {
5518c2aff7Sartem 				return (NULL);
5618c2aff7Sartem 			}
5718c2aff7Sartem 		}
5818c2aff7Sartem 	}
5918c2aff7Sartem 
6018c2aff7Sartem 	d = hal_device_new ();
6118c2aff7Sartem 	devinfo_set_default_properties (d, parent, node, devfs_path);
6218c2aff7Sartem 
63*112cd14aSqz 	hal_device_property_set_string (d, "info.subsystem", "pci");
6418c2aff7Sartem 
6518c2aff7Sartem 	vid = pid = svid = spid = 0;
6618c2aff7Sartem         if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "vendor-id", &i) > 0) {
6718c2aff7Sartem 		vid = i[0];
6818c2aff7Sartem 	}
6918c2aff7Sartem         if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "device-id", &i) > 0) {
7018c2aff7Sartem 		pid = i[0];
7118c2aff7Sartem 	}
7218c2aff7Sartem         if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-vendor-id", &i) > 0) {
7318c2aff7Sartem 		svid = i[0];
7418c2aff7Sartem 	}
7518c2aff7Sartem         if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-id", &i) > 0) {
7618c2aff7Sartem 		spid = i[0];
7718c2aff7Sartem 	}
7818c2aff7Sartem 	hal_device_property_set_int (d, "pci.vendor_id", vid);
7918c2aff7Sartem 	hal_device_property_set_int (d, "pci.product_id", pid);
8018c2aff7Sartem 	hal_device_property_set_int (d, "pci.subsys_vendor_id", svid);
8118c2aff7Sartem 	hal_device_property_set_int (d, "pci.subsys_product_id", spid);
8218c2aff7Sartem 
8318c2aff7Sartem         {
8418c2aff7Sartem                 char *vendor_name;
8518c2aff7Sartem                 char *product_name;
8618c2aff7Sartem                 char *subsys_vendor_name;
8718c2aff7Sartem                 char *subsys_product_name;
8818c2aff7Sartem 
8918c2aff7Sartem                 ids_find_pci (hal_device_property_get_int (d, "pci.vendor_id"),
9018c2aff7Sartem                               hal_device_property_get_int (d, "pci.product_id"),
9118c2aff7Sartem                               hal_device_property_get_int (d, "pci.subsys_vendor_id"),
9218c2aff7Sartem                               hal_device_property_get_int (d, "pci.subsys_product_id"),
9318c2aff7Sartem                               &vendor_name, &product_name, &subsys_vendor_name,
9418c2aff7Sartem &subsys_product_name);
9518c2aff7Sartem 
9618c2aff7Sartem                 if (vendor_name != NULL) {
9718c2aff7Sartem                         hal_device_property_set_string (d, "pci.vendor", vendor_name);
9818c2aff7Sartem                         hal_device_property_set_string (d, "info.vendor", vendor_name);
9918c2aff7Sartem                 }
10018c2aff7Sartem 
10118c2aff7Sartem                 if (product_name != NULL) {
10218c2aff7Sartem                         hal_device_property_set_string (d, "pci.product", product_name);
10318c2aff7Sartem                         hal_device_property_set_string (d, "info.product", product_name);
10418c2aff7Sartem                 }
10518c2aff7Sartem 
10618c2aff7Sartem                 if (subsys_vendor_name != NULL) {
10718c2aff7Sartem                         hal_device_property_set_string (d, "pci.subsys_vendor",
10818c2aff7Sartem subsys_vendor_name);
10918c2aff7Sartem                 }
11018c2aff7Sartem 
11118c2aff7Sartem                 if (subsys_product_name != NULL) {
11218c2aff7Sartem                         hal_device_property_set_string (d, "pci.subsys_product", subsys_product_name);
11318c2aff7Sartem                 }
11418c2aff7Sartem         }
11518c2aff7Sartem 
11618c2aff7Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_pci_handler);
11718c2aff7Sartem 
11818c2aff7Sartem 	return (d);
11918c2aff7Sartem }
12018c2aff7Sartem 
121