18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * devinfo_pci.c : PCI devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
92f381329ebf1c2209df9608670666b32b291e05artem#pragma ident "%Z%%M% %I% %E% SMI"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
00687e57f8c568d4f8fb446b6530a2942842292fartem# include <config.h>
00687e57f8c568d4f8fb446b6530a2942842292fartem#endif
00687e57f8c568d4f8fb446b6530a2942842292fartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libdevinfo.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../device_info.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../ids.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_pci.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDevinfoDevHandler devinfo_pci_handler = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_pci_add,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_pci_add (HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int vid, pid, svid, spid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((device_type == NULL) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((strcmp (device_type, "pci") != 0) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (strcmp (device_type, "pci-ide") != 0))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz s = (char *)hal_device_property_get_string (parent, "info.subsystem");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s == NULL) || (strcmp (s, "pci") != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "pci");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem vid = pid = svid = spid = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "vendor-id", &i) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem vid = i[0];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "device-id", &i) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pid = i[0];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-vendor-id", &i) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem svid = i[0];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "subsystem-id", &i) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem spid = i[0];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "pci.vendor_id", vid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "pci.product_id", pid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "pci.subsys_vendor_id", svid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "pci.subsys_product_id", spid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *vendor_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *product_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *subsys_vendor_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *subsys_product_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ids_find_pci (hal_device_property_get_int (d, "pci.vendor_id"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_int (d, "pci.product_id"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_int (d, "pci.subsys_vendor_id"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_int (d, "pci.subsys_product_id"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &vendor_name, &product_name, &subsys_vendor_name,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem&subsys_product_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (vendor_name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "pci.vendor", vendor_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.vendor", vendor_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (product_name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "pci.product", product_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", product_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (subsys_vendor_name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "pci.subsys_vendor",
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsubsys_vendor_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (subsys_product_name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "pci.subsys_product", subsys_product_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_pci_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem