author | henryzh <henry.zhao@oracle.com> |
Wed, 23 Jan 2013 12:31:19 -0800 | |
changeset 1349 | b1016e88dcd0 |
permissions | -rw-r--r-- |
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", ®buf); |
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", ®buf); |
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 |