open-src/lib/libpciaccess/probe_improve.patch
author henryzh <henry.zhao@oracle.com>
Wed, 23 Jan 2013 12:31:19 -0800
changeset 1349 b1016e88dcd0
permissions -rw-r--r--
15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1349
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     1
--- a/src/solx_devfs.c	Thu Jan 10 14:15:59 2013
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     2
+++ b/src/solx_devfs.c	Thu Jan 10 16:22:52 2013
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     3
@@ -1,6 +1,6 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     4
 /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     5
  * (C) Copyright IBM Corporation 2006
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     6
- * Copyright (c) 2007, 2009, 2011, 2012, Oracle and/or its affiliates.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     7
+ * Copyright (c) 2007, 2009, 2011, 2012, 2013 Oracle and/or its affiliates.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     8
  * All Rights Reserved.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
     9
  *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    10
  * Permission is hereby granted, free of charge, to any person obtaining a
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    11
@@ -51,11 +51,6 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    12
 #define	INITIAL_NUM_DEVICES	256
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    13
 #define	CELL_NUMS_1275	(sizeof(pci_regspec_t) / sizeof(uint_t))
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    14
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    15
-typedef union {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    16
-    uint8_t bytes[16 * sizeof (uint32_t)];
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    17
-    uint32_t dwords[16];
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    18
-} pci_conf_hdr_t;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    19
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    20
 typedef struct i_devnode {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    21
     uint8_t bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    22
     uint8_t dev;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    23
@@ -79,14 +74,17 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    24
     struct pci_device_private * volatile devices;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    25
 } probe_info_t;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    26
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    27
-#ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    28
-typedef struct bdf_table_info {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    29
-    int bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    30
-    int dev;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    31
-    int func;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    32
-} bdf_table_info_t;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    33
-#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    34
+typedef struct probe_args {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    35
+    probe_info_t *pinfo;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    36
+    nexus_t *nexus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    37
+    int ret;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    38
+} probe_args_t;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    39
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    40
+typedef struct property_info {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    41
+    char *name;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    42
+    int value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    43
+} property_info_t;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    44
+
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    45
 static nexus_t *nexus_list = NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    46
 #if !defined(__sparc)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    47
 static int xsvc_fd = -1;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    48
@@ -94,9 +92,6 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    49
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    50
 #ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    51
 static di_prom_handle_t di_phdl;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    52
-static bdf_table_info_t *bdf_table = NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    53
-static size_t  num_bdfs = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    54
-static size_t  num_allocated_bdfs = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    55
 static size_t  nexus_count = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    56
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    57
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    58
@@ -152,15 +147,6 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    59
     return NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    60
 }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    61
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    62
-#define GET_CONFIG_VAL_8(offset) (config_hdr.bytes[offset])
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    63
-#define GET_CONFIG_VAL_16(offset) \
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    64
-    (uint16_t) (GET_CONFIG_VAL_8(offset) + (GET_CONFIG_VAL_8(offset+1) << 8))
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    65
-#define GET_CONFIG_VAL_32(offset) \
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    66
-    (uint32_t) (GET_CONFIG_VAL_8(offset) + 		\
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    67
-		(GET_CONFIG_VAL_8(offset+1) << 8) +	\
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    68
-		(GET_CONFIG_VAL_8(offset+2) << 16) +	\
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    69
-		(GET_CONFIG_VAL_8(offset+3) << 24))
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    70
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    71
 /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    72
  * Release all the resources
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    73
  * Solaris version
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    74
@@ -209,358 +195,111 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    75
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    76
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    77
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    78
-/*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    79
- * Retrieve first 16 dwords of device's config header, except for the first
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    80
- * dword.  First 16 dwords are defined by the PCI specification.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    81
- */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    82
 static int
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    83
-get_config_header(int fd, uint8_t bus_no, uint8_t dev_no, uint8_t func_no,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    84
-		  pci_conf_hdr_t *config_hdr_p)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    85
+probe_device_node(di_node_t node, void *arg)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    86
 {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    87
-    pcitool_reg_t cfg_prg;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    88
-    int i;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    89
-    int rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    90
+    int *retbuf = NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    91
+    int len = 0, i;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    92
+    struct pci_device	*pci_base;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    93
+    probe_info_t *pinfo = ((probe_args_t *)arg)->pinfo;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    94
+    nexus_t *nexus = ((probe_args_t *)arg)->nexus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    95
+    property_info_t property_list[] = {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    96
+				"class-code", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    97
+    				"device-id", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    98
+    				"vendor-id", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
    99
+    				"revision-id", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   100
+    				"subsystem-vendor-id", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   101
+    				"subsystem-id", 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   102
+			    	};
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   103
+#define NUM_PROPERTIES		sizeof(property_list)/sizeof(property_info_t)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   104
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   105
-    /* Prepare a local pcitool_reg_t so as to not disturb the caller's. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   106
-    cfg_prg.offset = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   107
-    cfg_prg.acc_attr = PCITOOL_ACC_ATTR_SIZE_4 + NATIVE_ENDIAN;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   108
-    cfg_prg.bus_no = bus_no;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   109
-    cfg_prg.dev_no = dev_no;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   110
-    cfg_prg.func_no = func_no;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   111
-    cfg_prg.barnum = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   112
-    cfg_prg.user_version = PCITOOL_USER_VERSION;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   113
+    len = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &retbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   114
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   115
-    /* Get dwords 1-15 of config space. They must be read as uint32_t. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   116
-    for (i = 1; i < (sizeof (pci_conf_hdr_t) / sizeof (uint32_t)); i++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   117
-	cfg_prg.offset += sizeof (uint32_t);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   118
-	if ((rval = ioctl(fd, PCITOOL_DEVICE_GET_REG, &cfg_prg)) != 0) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   119
-	    break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   120
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   121
-	config_hdr_p->dwords[i] = (uint32_t)cfg_prg.data;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   122
-    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   123
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   124
-    return (rval);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   125
-}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   126
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   127
 #ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   128
-static int
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   129
-create_bdf_table(di_node_t node, void *arg)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   130
-{
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   131
-    int *regbuf = NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   132
-    int len = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   133
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   134
-    len = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &regbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   135
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   136
     if ((len <= 0) && di_phdl)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   137
-	len = di_prom_prop_lookup_ints(di_phdl, node, "reg", &regbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   138
+	len = di_prom_prop_lookup_ints(di_phdl, node, "reg", &retbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   139
+#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   140
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   141
     /* Exclude usb devices */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   142
     if (len < 5) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   143
-    	return (DI_WALK_CONTINUE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   144
+    	return DI_WALK_CONTINUE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   145
     }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   146
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   147
-    bdf_table[num_bdfs].bus = PCI_REG_BUS_G(regbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   148
-    bdf_table[num_bdfs].dev = PCI_REG_DEV_G(regbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   149
-    bdf_table[num_bdfs].func  = PCI_REG_FUNC_G(regbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   150
+    pci_base = &pinfo->devices[pinfo->num_devices].base;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   151
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   152
-    if (++num_bdfs == num_allocated_bdfs) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   153
-	bdf_table_info_t  *new_bdfs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   154
-	size_t new_num_bdfs = num_allocated_bdfs * 2;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   155
+    pci_base->domain = nexus->domain;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   156
+    pci_base->bus = PCI_REG_BUS_G(retbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   157
+    pci_base->dev = PCI_REG_DEV_G(retbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   158
+    pci_base->func  = PCI_REG_FUNC_G(retbuf[0]);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   159
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   160
-	new_bdfs = realloc (bdf_table,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   161
-                   new_num_bdfs * sizeof (bdf_table_info_t));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   162
-	if (new_bdfs == NULL)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   163
-	    return (DI_WALK_TERMINATE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   164
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   165
-	(void) memset(&new_bdfs[num_bdfs], 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   166
-                   num_allocated_bdfs *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   167
-                   sizeof (bdf_table_info_t));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   168
-	num_allocated_bdfs = new_num_bdfs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   169
-	bdf_table = new_bdfs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   170
-    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   171
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   172
-    return (DI_WALK_CONTINUE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   173
-}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   174
-#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   175
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   176
-/*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   177
- * Probe device's functions.  Modifies many fields in the prg_p.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   178
- */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   179
-static int
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   180
-probe_dev(nexus_t *nexus, pcitool_reg_t *prg_p, probe_info_t *pinfo)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   181
-{
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   182
-    pci_conf_hdr_t	config_hdr;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   183
-    boolean_t		multi_function_device;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   184
-    int8_t		func;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   185
-    int8_t		first_func = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   186
-    int8_t		last_func = PCI_REG_FUNC_M >> PCI_REG_FUNC_SHIFT;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   187
-    int			rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   188
-    struct pci_device *	pci_base;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   189
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   190
-    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   191
-     * Loop through at least func=first_func.  Continue looping through
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   192
-     * functions if there are no errors and the device is a multi-function
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   193
-     * device.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   194
-     *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   195
-     * (Note, if first_func == 0, header will show whether multifunction
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   196
-     * device and set multi_function_device.  If first_func != 0, then we
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   197
-     * will force the loop as the user wants a specific function to be
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   198
-     * checked.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   199
-     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   200
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   201
-    for (func = first_func, multi_function_device = B_FALSE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   202
-	 ((func <= last_func) &&
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   203
-	  ((func == first_func) || (multi_function_device)));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   204
-	 func++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   205
+    /* Get property values */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   206
+    for (i = 0; i < NUM_PROPERTIES; i++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   207
+	len = di_prop_lookup_ints(DDI_DEV_T_ANY, node, 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   208
+		property_list[i].name, &retbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   209
 #ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   210
-	int i;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   211
+	if ((len <= 0) && di_phdl)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   212
+	    len = di_prom_prop_lookup_ints(di_phdl, node, 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   213
+		property_list[i].name, &retbuf);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   214
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   215
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   216
-	prg_p->func_no = func;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   217
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   218
-#ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   219
-	/* Check validity of bdf */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   220
-	for (i = 0; i < num_bdfs; i++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   221
-	    if ((bdf_table[i].bus == prg_p->bus_no) && 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   222
-		(bdf_table[i].dev == prg_p->dev_no) &&
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   223
-		(bdf_table[i].func == prg_p->func_no))
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   224
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   225
+	if (len > 0)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   226
+	    property_list[i].value = retbuf[0];
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   227
+	else {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   228
+	    /* a device must have property "class-code", "device-id", "vendor-id" */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   229
+	    if (i < 3)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   230
+		return DI_WALK_CONTINUE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   231
+#ifdef DEBUG
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   232
+	    fprintf(stderr, "cannot get property \"%s\" for nexus = %s :\n", 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   233
+		property_list[i].name, nexus->path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   234
+	    fprintf(stderr, "	domain = %x, busno = %x, devno = %x, funcno = %x\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   235
+		pci_base->domain, pci_base->bus, pci_base->dev, pci_base->func);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   236
+#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   237
 	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   238
+    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   239
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   240
-	/* Skipping if bdf device not on devinfo tree */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   241
-	if (i == num_bdfs) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   242
-	    continue;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   243
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   244
-#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   245
-	    
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   246
-	/*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   247
-	 * Four things can happen here:
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   248
-	 *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   249
-	 * 1) ioctl comes back as EFAULT and prg_p->status is
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   250
-	 *    PCITOOL_INVALID_ADDRESS.  There is no device at this location.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   251
-	 *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   252
-	 * 2) ioctl comes back successful and the data comes back as
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   253
-	 *    zero.  Config space is mapped but no device responded.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   254
-	 *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   255
-	 * 3) ioctl comes back successful and the data comes back as
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   256
-	 *    non-zero.  We've found a device.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   257
-	 *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   258
-	 * 4) Some other error occurs in an ioctl.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   259
-	 */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   260
+    if ((property_list[1].value == 0) && (property_list[2].value == 0))
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   261
+	return DI_WALK_CONTINUE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   262
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   263
-	prg_p->status = PCITOOL_SUCCESS;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   264
-	prg_p->offset = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   265
-	prg_p->data = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   266
-	prg_p->user_version = PCITOOL_USER_VERSION;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   267
+    pci_base->device_class = property_list[0].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   268
+    pci_base->device_id = property_list[1].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   269
+    pci_base->vendor_id = property_list[2].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   270
+    pci_base->revision = property_list[3].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   271
+    pci_base->subvendor_id = property_list[4].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   272
+    pci_base->subdevice_id = property_list[5].value;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   273
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   274
-	errno = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   275
-	if (((rval = ioctl(nexus->fd, PCITOOL_DEVICE_GET_REG, prg_p)) != 0) ||
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   276
-	    (prg_p->data == 0xffffffff)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   277
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   278
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   279
-	     * Accept errno == EINVAL along with status of
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   280
-	     * PCITOOL_OUT_OF_RANGE because some systems
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   281
-	     * don't implement the full range of config space.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   282
-	     * Leave the loop quietly in this case.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   283
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   284
-	    if ((errno == EINVAL) ||
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   285
-		(prg_p->status == PCITOOL_OUT_OF_RANGE)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   286
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   287
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   288
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   289
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   290
-	     * Exit silently with ENXIO as this means that there are
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   291
-	     * no devices under the pci root nexus.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   292
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   293
-	    else if ((errno == ENXIO) &&
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   294
-		     (prg_p->status == PCITOOL_IO_ERROR)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   295
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   296
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   297
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   298
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   299
-	     * Expect errno == EFAULT along with status of
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   300
-	     * PCITOOL_INVALID_ADDRESS because there won't be
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   301
-	     * devices at each stop.  Quit on any other error.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   302
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   303
-	    else if (((errno != EFAULT) ||
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   304
-		      (prg_p->status != PCITOOL_INVALID_ADDRESS)) &&
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   305
-		     (prg_p->data != 0xffffffff)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   306
-#ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   307
-/* on sparc, devices can be enumerated discontiguously. Do not quit */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   308
-		rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   309
-#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   310
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   311
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   312
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   313
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   314
-	     * If no function at this location,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   315
-	     * just advance to the next function.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   316
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   317
-	    else {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   318
-		rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   319
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   320
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   321
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   322
-	     * Data came back as 0.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   323
-	     * Treat as unresponsive device and check next device.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   324
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   325
-	} else if (prg_p->data == 0) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   326
-	    rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   327
-	    break;	/* Func loop. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   328
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   329
-	    /* Found something. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   330
-	} else {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   331
-	    config_hdr.dwords[0] = (uint32_t)prg_p->data;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   332
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   333
-	    /* Get the rest of the PCI header. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   334
-	    if ((rval = get_config_header(nexus->fd, prg_p->bus_no,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   335
-					  prg_p->dev_no, prg_p->func_no,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   336
-					  &config_hdr)) != 0) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   337
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   338
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   339
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   340
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   341
-	     * Special case for the type of Southbridge found on
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   342
-	     * Ultra-45 and other sun4u fire workstations.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   343
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   344
-	    if ((config_hdr.dwords[0] == U45_SB_DEVID_VID) &&
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   345
-		(config_hdr.dwords[2] == U45_SB_CLASS_RID)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   346
-		rval = ECANCELED;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   347
-		break;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   348
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   349
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   350
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   351
-	     * Found one device with bus number, device number and
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   352
-	     * function number.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   353
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   354
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   355
-	    pci_base = &pinfo->devices[pinfo->num_devices].base;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   356
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   357
-	    pci_base->domain = nexus->domain;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   358
-	    pci_base->bus = prg_p->bus_no;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   359
-	    pci_base->dev = prg_p->dev_no;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   360
-	    pci_base->func = func;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   361
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   362
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   363
-	     * for the format of device_class, see struct pci_device;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   364
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   365
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   366
-	    pci_base->device_class =
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   367
-		(GET_CONFIG_VAL_8(PCI_CONF_BASCLASS) << 16) |
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   368
-		(GET_CONFIG_VAL_8(PCI_CONF_SUBCLASS) << 8) |
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   369
-		GET_CONFIG_VAL_8(PCI_CONF_PROGCLASS);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   370
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   371
-	    pci_base->revision		= GET_CONFIG_VAL_8(PCI_CONF_REVID);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   372
-	    pci_base->vendor_id		= GET_CONFIG_VAL_16(PCI_CONF_VENID);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   373
-	    pci_base->device_id		= GET_CONFIG_VAL_16(PCI_CONF_DEVID);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   374
-	    pci_base->subvendor_id 	= GET_CONFIG_VAL_16(PCI_CONF_SUBVENID);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   375
-	    pci_base->subdevice_id 	= GET_CONFIG_VAL_16(PCI_CONF_SUBSYSID);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   376
-	    pci_base->irq		= GET_CONFIG_VAL_8(PCI_CONF_ILINE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   377
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   378
-	    pinfo->devices[pinfo->num_devices].header_type
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   379
-					= GET_CONFIG_VAL_8(PCI_CONF_HEADER);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   380
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   381
 #ifdef DEBUG
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   382
-	    fprintf(stderr,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   383
-		    "nexus = %s, busno = %x, devno = %x, funcno = %x\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   384
-		    nexus->path, prg_p->bus_no, prg_p->dev_no, func);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   385
+    fprintf(stderr,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   386
+	    "nexus = %s, domain = %x, busno = %x, devno = %x, funcno = %x\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   387
+	    nexus->path, pci_base->domain, pci_base->bus, pci_base->dev, pci_base->func);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   388
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   389
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   390
-	    pinfo->num_devices++;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   391
-	    if (pinfo->num_devices == pinfo->num_allocated_elems) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   392
-		struct pci_device_private *new_devs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   393
-		size_t new_num_elems = pinfo->num_allocated_elems * 2;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   394
+    pinfo->num_devices++;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   395
+    if (pinfo->num_devices == pinfo->num_allocated_elems) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   396
+	struct pci_device_private *new_devs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   397
+	size_t new_num_elems = pinfo->num_allocated_elems * 2;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   398
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   399
-		new_devs = realloc(pinfo->devices,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   400
-			new_num_elems * sizeof (struct pci_device_private));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   401
-		if (new_devs == NULL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   402
-		    (void) fprintf(stderr,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   403
-			           "Error allocating memory for PCI devices:"
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   404
-				   " %s\n discarding additional devices\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   405
-				   strerror(errno));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   406
-		    return (rval);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   407
-		}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   408
-		(void) memset(&new_devs[pinfo->num_devices], 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   409
-			pinfo->num_allocated_elems *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   410
-			sizeof (struct pci_device_private));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   411
-		pinfo->num_allocated_elems = new_num_elems;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   412
-		pinfo->devices = new_devs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   413
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   414
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   415
-	    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   416
-	     * Accommodate devices which state their
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   417
-	     * multi-functionality only in their function 0 config
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   418
-	     * space.  Note multi-functionality throughout probing
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   419
-	     * of all of this device's functions.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   420
-	     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   421
-	    if (config_hdr.bytes[PCI_CONF_HEADER] & PCI_HEADER_MULTI) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   422
-		multi_function_device = B_TRUE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   423
-	    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   424
+	new_devs = realloc(pinfo->devices,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   425
+	new_num_elems * sizeof (struct pci_device_private));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   426
+	if (new_devs == NULL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   427
+	    (void) fprintf(stderr,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   428
+	           "Error allocating memory for PCI devices:"
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   429
+		   " %s\n discarding additional devices\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   430
+		   strerror(errno));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   431
+	    ((probe_args_t *)arg)->ret = 1;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   432
+	    return (DI_WALK_TERMINATE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   433
 	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   434
+	(void) memset(&new_devs[pinfo->num_devices], 0,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   435
+		pinfo->num_allocated_elems *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   436
+		sizeof (struct pci_device_private));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   437
+	pinfo->num_allocated_elems = new_num_elems;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   438
+	pinfo->devices = new_devs;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   439
     }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   440
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   441
-    return (rval);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   442
+    return (DI_WALK_CONTINUE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   443
 }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   444
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   445
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   446
 /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   447
- * Solaris version
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   448
- * Probe a given nexus config space for devices.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   449
- *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   450
- * fd is the file descriptor of the nexus.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   451
- * input_args contains commandline options as specified by the user.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   452
- */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   453
-static int
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   454
-do_probe(nexus_t *nexus, probe_info_t *pinfo)
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   455
-{
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   456
-    pcitool_reg_t prg;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   457
-    uint32_t bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   458
-    uint8_t dev;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   459
-    uint32_t last_bus = nexus->last_bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   460
-    uint8_t last_dev = PCI_REG_DEV_M >> PCI_REG_DEV_SHIFT;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   461
-    uint8_t first_bus = nexus->first_bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   462
-    uint8_t first_dev = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   463
-    int rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   464
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   465
-    prg.barnum = 0;	/* Config space. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   466
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   467
-    /* Must read in 4-byte quantities. */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   468
-    prg.acc_attr = PCITOOL_ACC_ATTR_SIZE_4 + NATIVE_ENDIAN;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   469
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   470
-    prg.data = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   471
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   472
-    /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   473
-     * Loop through all valid bus / dev / func combinations to check for
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   474
-     * all devices, with the following exceptions:
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   475
-     *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   476
-     * When nothing is found at function 0 of a bus / dev combination, skip
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   477
-     * the other functions of that bus / dev combination.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   478
-     *
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   479
-     * When a found device's function 0 is probed and it is determined that
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   480
-     * it is not a multifunction device, skip probing of that device's
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   481
-     * other functions.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   482
-     */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   483
-    for (bus = first_bus; ((bus <= last_bus) && (rval == 0)); bus++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   484
-	prg.bus_no = (uint8_t)bus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   485
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   486
-	for (dev = first_dev; ((dev <= last_dev) && (rval == 0)); dev++) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   487
-	    prg.dev_no = dev;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   488
-	    rval = probe_dev(nexus, &prg, pinfo);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   489
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   490
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   491
-	/*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   492
-	 * Ultra-45 southbridge workaround:
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   493
-	 * ECANCELED tells to skip to the next bus.
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   494
-	 */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   495
-	if (rval == ECANCELED) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   496
-	    rval = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   497
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   498
-    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   499
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   500
-    return (rval);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   501
-}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   502
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   503
-/*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   504
  * This function is called from di_walk_minor() when any PROBE is processed
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   505
  */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   506
 static int
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   507
@@ -579,11 +318,11 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   508
     int pci_node = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   509
     int first_bus = 0, last_bus = PCI_REG_BUS_G(PCI_REG_BUS_M);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   510
     int domain = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   511
+    di_node_t rnode =  DI_NODE_NIL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   512
 #ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   513
     int bus_range_found = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   514
     int device_type_found = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   515
     di_prom_prop_t prom_prop;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   516
-    di_node_t rnode =  DI_NODE_NIL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   517
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   518
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   519
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   520
@@ -590,6 +329,7 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   521
 #ifdef DEBUG
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   522
     nexus_name = di_devfs_minor_path(minor);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   523
     fprintf(stderr, "-- device name: %s\n", nexus_name);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   524
+    di_devfs_path_free(nexus_name);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   525
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   526
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   527
     for (prop = di_prop_next(di_node, NULL); prop != NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   528
@@ -698,6 +438,8 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   529
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   530
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   531
     if ((fd = open(nexus_path, O_RDWR | O_CLOEXEC)) >= 0) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   532
+	probe_args_t args;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   533
+
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   534
 	nexus->fd = fd;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   535
 	nexus->path = strdup(nexus_path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   536
 	nexus_dev_path = di_devfs_path(di_node);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   537
@@ -704,44 +446,32 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   538
 	nexus->dev_path = strdup(nexus_dev_path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   539
 	di_devfs_path_free(nexus_dev_path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   540
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   541
-#ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   542
 	if ((rnode = di_init(nexus->dev_path, DINFOCPYALL)) == DI_NODE_NIL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   543
 	    (void) fprintf(stderr, "di_init failed: %s\n", strerror(errno));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   544
+	    close(nexus->fd);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   545
+	    free(nexus->path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   546
+	    free(nexus->dev_path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   547
+	    free(nexus);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   548
 	    return (DI_WALK_TERMINATE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   549
 	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   550
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   551
-	if ((bdf_table = calloc(INITIAL_NUM_DEVICES,
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   552
-			sizeof (bdf_table_info_t))) == NULL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   553
-	    di_fini(rnode);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   554
-	    return (DI_WALK_TERMINATE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   555
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   556
-	num_bdfs = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   557
-	num_allocated_bdfs = INITIAL_NUM_DEVICES;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   558
+	/* Walk through devices under the rnode */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   559
+	args.pinfo = pinfo;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   560
+	args.nexus = nexus; 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   561
+	args.ret = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   562
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   563
-	/* Create a bdf table for the nexus node */
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   564
-	(void) di_walk_node(rnode, DI_WALK_CLDFIRST, (void *)NULL, create_bdf_table);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   565
-#endif 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   566
-
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   567
-	if ((do_probe(nexus, pinfo) != 0) && (errno != ENXIO)) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   568
-	    (void) fprintf(stderr, "Error probing node %s: %s\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   569
-			   nexus_path, strerror(errno));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   570
-	    (void) close(fd);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   571
+	(void) di_walk_node(rnode, DI_WALK_CLDFIRST, (void *)&args, probe_device_node);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   572
+	if (args.ret) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   573
+	    close(nexus->fd);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   574
 	    free(nexus->path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   575
 	    free(nexus->dev_path);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   576
 	    free(nexus);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   577
-	} else {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   578
-	    nexus->next = nexus_list;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   579
-	    nexus_list = nexus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   580
+	    di_fini(rnode);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   581
+	    return (DI_WALK_TERMINATE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   582
 	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   583
-#ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   584
-	if (bdf_table) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   585
-	    free (bdf_table);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   586
-	    bdf_table = NULL;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   587
-	    num_bdfs = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   588
-	    num_allocated_bdfs = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   589
-	}
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   590
-	di_fini(rnode);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   591
-#endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   592
+
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   593
+	nexus->next = nexus_list;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   594
+	nexus_list = nexus;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   595
     } else {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   596
 	(void) fprintf(stderr, "Error opening %s: %s\n",
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   597
 		       nexus_path, strerror(errno));
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   598
@@ -748,6 +478,10 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   599
 	free(nexus);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   600
     }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   601
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   602
+    if (rnode != DI_NODE_NIL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   603
+	di_fini(rnode);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   604
+    }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   605
+
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   606
     return DI_WALK_CONTINUE;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   607
 }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   608
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   609
@@ -832,6 +566,10 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   610
     if ( (nexus = find_nexus_for_bus(dev->domain, dev->bus)) == NULL )
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   611
 	return ENODEV;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   612
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   613
+    pci_device_cfg_read_u8(dev, &priv->header_type, PCI_CONF_HEADER);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   614
+
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   615
+    pci_device_cfg_read_u8(dev, (uint8_t *)&dev->irq, PCI_CONF_ILINE);
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   616
+       
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   617
     /*
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   618
      * starting to find if it is MEM/MEM64/IO
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   619
      * using libdevinfo
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   620
@@ -848,10 +586,10 @@
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   621
     }
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   622
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   623
     if (args.node != DI_NODE_NIL) {
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   624
+	int *prop;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   625
 #ifdef __sparc
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   626
 	di_minor_t minor;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   627
 #endif
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   628
-	int *prop;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   629
 
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   630
 	priv->is_primary = 0;
b1016e88dcd0 15825345 SUNBT7206701 libpciaccess: remove pcitool dependency in probing phase
henryzh <henry.zhao@oracle.com>
parents:
diff changeset
   631