1*11596SJason.Beloro@Sun.COM /*
2*11596SJason.Beloro@Sun.COM * CDDL HEADER START
3*11596SJason.Beloro@Sun.COM *
4*11596SJason.Beloro@Sun.COM * The contents of this file are subject to the terms of the
5*11596SJason.Beloro@Sun.COM * Common Development and Distribution License (the "License").
6*11596SJason.Beloro@Sun.COM * You may not use this file except in compliance with the License.
7*11596SJason.Beloro@Sun.COM *
8*11596SJason.Beloro@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11596SJason.Beloro@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*11596SJason.Beloro@Sun.COM * See the License for the specific language governing permissions
11*11596SJason.Beloro@Sun.COM * and limitations under the License.
12*11596SJason.Beloro@Sun.COM *
13*11596SJason.Beloro@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*11596SJason.Beloro@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11596SJason.Beloro@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*11596SJason.Beloro@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*11596SJason.Beloro@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*11596SJason.Beloro@Sun.COM *
19*11596SJason.Beloro@Sun.COM * CDDL HEADER END
20*11596SJason.Beloro@Sun.COM */
21*11596SJason.Beloro@Sun.COM /*
22*11596SJason.Beloro@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23*11596SJason.Beloro@Sun.COM * Use is subject to license terms.
24*11596SJason.Beloro@Sun.COM */
25*11596SJason.Beloro@Sun.COM
26*11596SJason.Beloro@Sun.COM #include <sys/types.h>
27*11596SJason.Beloro@Sun.COM #include <sys/ddi.h>
28*11596SJason.Beloro@Sun.COM #include <sys/dditypes.h>
29*11596SJason.Beloro@Sun.COM #include <sys/ddifm.h>
30*11596SJason.Beloro@Sun.COM #include <sys/sunndi.h>
31*11596SJason.Beloro@Sun.COM #include <sys/devops.h>
32*11596SJason.Beloro@Sun.COM #include <sys/pcie.h>
33*11596SJason.Beloro@Sun.COM #include <sys/pci_cap.h>
34*11596SJason.Beloro@Sun.COM #include <sys/pcie_impl.h>
35*11596SJason.Beloro@Sun.COM #include <sys/pathname.h>
36*11596SJason.Beloro@Sun.COM
37*11596SJason.Beloro@Sun.COM /*
38*11596SJason.Beloro@Sun.COM * The below 2 global variables are for PCIe IOV Error Handling. They must only
39*11596SJason.Beloro@Sun.COM * be accessed during error handling under the protection of a error mutex.
40*11596SJason.Beloro@Sun.COM */
41*11596SJason.Beloro@Sun.COM static pcie_domains_t *pcie_faulty_domains = NULL;
42*11596SJason.Beloro@Sun.COM static boolean_t pcie_faulty_all = B_FALSE;
43*11596SJason.Beloro@Sun.COM
44*11596SJason.Beloro@Sun.COM static void pcie_domain_list_destroy(pcie_domains_t *domain_ids);
45*11596SJason.Beloro@Sun.COM static void pcie_bdf_list_add(pcie_req_id_t bdf,
46*11596SJason.Beloro@Sun.COM pcie_req_id_list_t **rlist_p);
47*11596SJason.Beloro@Sun.COM static void pcie_bdf_list_remove(pcie_req_id_t bdf,
48*11596SJason.Beloro@Sun.COM pcie_req_id_list_t **rlist_p);
49*11596SJason.Beloro@Sun.COM static void pcie_cache_domain_info(pcie_bus_t *bus_p);
50*11596SJason.Beloro@Sun.COM static void pcie_uncache_domain_info(pcie_bus_t *bus_p);
51*11596SJason.Beloro@Sun.COM
52*11596SJason.Beloro@Sun.COM static void pcie_faulty_list_clear();
53*11596SJason.Beloro@Sun.COM static void pcie_faulty_list_update(pcie_domains_t *pd,
54*11596SJason.Beloro@Sun.COM pcie_domains_t **headp);
55*11596SJason.Beloro@Sun.COM
56*11596SJason.Beloro@Sun.COM dev_info_t *
pcie_find_dip_by_bdf(dev_info_t * rootp,pcie_req_id_t bdf)57*11596SJason.Beloro@Sun.COM pcie_find_dip_by_bdf(dev_info_t *rootp, pcie_req_id_t bdf)
58*11596SJason.Beloro@Sun.COM {
59*11596SJason.Beloro@Sun.COM dev_info_t *dip;
60*11596SJason.Beloro@Sun.COM pcie_bus_t *bus_p;
61*11596SJason.Beloro@Sun.COM int bus_num;
62*11596SJason.Beloro@Sun.COM
63*11596SJason.Beloro@Sun.COM dip = ddi_get_child(rootp);
64*11596SJason.Beloro@Sun.COM while (dip) {
65*11596SJason.Beloro@Sun.COM bus_p = PCIE_DIP2BUS(dip);
66*11596SJason.Beloro@Sun.COM if (bus_p && (bus_p->bus_bdf == bdf))
67*11596SJason.Beloro@Sun.COM return (dip);
68*11596SJason.Beloro@Sun.COM if (bus_p) {
69*11596SJason.Beloro@Sun.COM bus_num = (bdf >> 8) & 0xff;
70*11596SJason.Beloro@Sun.COM if ((bus_num >= bus_p->bus_bus_range.lo &&
71*11596SJason.Beloro@Sun.COM bus_num <= bus_p->bus_bus_range.hi) ||
72*11596SJason.Beloro@Sun.COM bus_p->bus_bus_range.hi == 0)
73*11596SJason.Beloro@Sun.COM return (pcie_find_dip_by_bdf(dip, bdf));
74*11596SJason.Beloro@Sun.COM }
75*11596SJason.Beloro@Sun.COM dip = ddi_get_next_sibling(dip);
76*11596SJason.Beloro@Sun.COM }
77*11596SJason.Beloro@Sun.COM return (NULL);
78*11596SJason.Beloro@Sun.COM }
79*11596SJason.Beloro@Sun.COM
80*11596SJason.Beloro@Sun.COM /*
81*11596SJason.Beloro@Sun.COM * Add a device bdf to the bdf list.
82*11596SJason.Beloro@Sun.COM */
83*11596SJason.Beloro@Sun.COM static void
pcie_bdf_list_add(pcie_req_id_t bdf,pcie_req_id_list_t ** rlist_p)84*11596SJason.Beloro@Sun.COM pcie_bdf_list_add(pcie_req_id_t bdf, pcie_req_id_list_t **rlist_p)
85*11596SJason.Beloro@Sun.COM {
86*11596SJason.Beloro@Sun.COM pcie_req_id_list_t *rl = PCIE_ZALLOC(pcie_req_id_list_t);
87*11596SJason.Beloro@Sun.COM
88*11596SJason.Beloro@Sun.COM rl->bdf = bdf;
89*11596SJason.Beloro@Sun.COM rl->next = *rlist_p;
90*11596SJason.Beloro@Sun.COM *rlist_p = rl;
91*11596SJason.Beloro@Sun.COM }
92*11596SJason.Beloro@Sun.COM
93*11596SJason.Beloro@Sun.COM /*
94*11596SJason.Beloro@Sun.COM * Remove a bdf from the bdf list.
95*11596SJason.Beloro@Sun.COM */
96*11596SJason.Beloro@Sun.COM static void
pcie_bdf_list_remove(pcie_req_id_t bdf,pcie_req_id_list_t ** rlist_p)97*11596SJason.Beloro@Sun.COM pcie_bdf_list_remove(pcie_req_id_t bdf, pcie_req_id_list_t **rlist_p)
98*11596SJason.Beloro@Sun.COM {
99*11596SJason.Beloro@Sun.COM pcie_req_id_list_t *rl_pre, *rl_next;
100*11596SJason.Beloro@Sun.COM
101*11596SJason.Beloro@Sun.COM rl_pre = *rlist_p;
102*11596SJason.Beloro@Sun.COM if (rl_pre->bdf == bdf) {
103*11596SJason.Beloro@Sun.COM *rlist_p = rl_pre->next;
104*11596SJason.Beloro@Sun.COM kmem_free(rl_pre, sizeof (pcie_req_id_list_t));
105*11596SJason.Beloro@Sun.COM return;
106*11596SJason.Beloro@Sun.COM }
107*11596SJason.Beloro@Sun.COM
108*11596SJason.Beloro@Sun.COM while (rl_pre->next) {
109*11596SJason.Beloro@Sun.COM rl_next = rl_pre->next;
110*11596SJason.Beloro@Sun.COM if (rl_next->bdf == bdf) {
111*11596SJason.Beloro@Sun.COM rl_pre->next = rl_next->next;
112*11596SJason.Beloro@Sun.COM kmem_free(rl_next, sizeof (pcie_req_id_list_t));
113*11596SJason.Beloro@Sun.COM break;
114*11596SJason.Beloro@Sun.COM } else
115*11596SJason.Beloro@Sun.COM rl_pre = rl_next;
116*11596SJason.Beloro@Sun.COM }
117*11596SJason.Beloro@Sun.COM }
118*11596SJason.Beloro@Sun.COM
119*11596SJason.Beloro@Sun.COM /*
120*11596SJason.Beloro@Sun.COM * Cache IOV domain info in all it's parent's pcie_domain_t
121*11596SJason.Beloro@Sun.COM *
122*11596SJason.Beloro@Sun.COM * The leaf devices's domain info must be set before calling this function.
123*11596SJason.Beloro@Sun.COM */
124*11596SJason.Beloro@Sun.COM void
pcie_cache_domain_info(pcie_bus_t * bus_p)125*11596SJason.Beloro@Sun.COM pcie_cache_domain_info(pcie_bus_t *bus_p)
126*11596SJason.Beloro@Sun.COM {
127*11596SJason.Beloro@Sun.COM boolean_t assigned = PCIE_IS_ASSIGNED(bus_p);
128*11596SJason.Beloro@Sun.COM boolean_t fma_dom = PCIE_ASSIGNED_TO_FMA_DOM(bus_p);
129*11596SJason.Beloro@Sun.COM uint_t domain_id = PCIE_DOMAIN_ID_GET(bus_p);
130*11596SJason.Beloro@Sun.COM pcie_req_id_t bdf = bus_p->bus_bdf;
131*11596SJason.Beloro@Sun.COM dev_info_t *pdip;
132*11596SJason.Beloro@Sun.COM pcie_bus_t *pbus_p;
133*11596SJason.Beloro@Sun.COM pcie_domain_t *pdom_p;
134*11596SJason.Beloro@Sun.COM
135*11596SJason.Beloro@Sun.COM ASSERT(!PCIE_IS_BDG(bus_p));
136*11596SJason.Beloro@Sun.COM
137*11596SJason.Beloro@Sun.COM for (pdip = ddi_get_parent(PCIE_BUS2DIP(bus_p)); PCIE_DIP2BUS(pdip);
138*11596SJason.Beloro@Sun.COM pdip = ddi_get_parent(pdip)) {
139*11596SJason.Beloro@Sun.COM pbus_p = PCIE_DIP2BUS(pdip);
140*11596SJason.Beloro@Sun.COM pdom_p = PCIE_BUS2DOM(pbus_p);
141*11596SJason.Beloro@Sun.COM
142*11596SJason.Beloro@Sun.COM if (assigned) {
143*11596SJason.Beloro@Sun.COM if (domain_id)
144*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_LIST_ADD(pbus_p, domain_id);
145*11596SJason.Beloro@Sun.COM
146*11596SJason.Beloro@Sun.COM if (fma_dom)
147*11596SJason.Beloro@Sun.COM pdom_p->fmadom_count++;
148*11596SJason.Beloro@Sun.COM else {
149*11596SJason.Beloro@Sun.COM PCIE_BDF_LIST_ADD(pbus_p, bdf);
150*11596SJason.Beloro@Sun.COM pdom_p->nfmadom_count++;
151*11596SJason.Beloro@Sun.COM }
152*11596SJason.Beloro@Sun.COM } else
153*11596SJason.Beloro@Sun.COM pdom_p->rootdom_count++;
154*11596SJason.Beloro@Sun.COM }
155*11596SJason.Beloro@Sun.COM }
156*11596SJason.Beloro@Sun.COM
157*11596SJason.Beloro@Sun.COM /*
158*11596SJason.Beloro@Sun.COM * Clear the leaf device's domain info and uncache IOV domain info in all it's
159*11596SJason.Beloro@Sun.COM * parent's pcie_domain_t
160*11596SJason.Beloro@Sun.COM *
161*11596SJason.Beloro@Sun.COM * The leaf devices's domain info is also cleared by calling this function.
162*11596SJason.Beloro@Sun.COM */
163*11596SJason.Beloro@Sun.COM void
pcie_uncache_domain_info(pcie_bus_t * bus_p)164*11596SJason.Beloro@Sun.COM pcie_uncache_domain_info(pcie_bus_t *bus_p)
165*11596SJason.Beloro@Sun.COM {
166*11596SJason.Beloro@Sun.COM boolean_t assigned = PCIE_IS_ASSIGNED(bus_p);
167*11596SJason.Beloro@Sun.COM boolean_t fma_dom = PCIE_ASSIGNED_TO_FMA_DOM(bus_p);
168*11596SJason.Beloro@Sun.COM uint_t domain_id = PCIE_DOMAIN_ID_GET(bus_p);
169*11596SJason.Beloro@Sun.COM pcie_domain_t *dom_p = PCIE_BUS2DOM(bus_p), *pdom_p;
170*11596SJason.Beloro@Sun.COM pcie_bus_t *pbus_p;
171*11596SJason.Beloro@Sun.COM dev_info_t *pdip;
172*11596SJason.Beloro@Sun.COM
173*11596SJason.Beloro@Sun.COM ASSERT(!PCIE_IS_BDG(bus_p));
174*11596SJason.Beloro@Sun.COM ASSERT((dom_p->fmadom_count + dom_p->nfmadom_count +
175*11596SJason.Beloro@Sun.COM dom_p->rootdom_count) == 1);
176*11596SJason.Beloro@Sun.COM
177*11596SJason.Beloro@Sun.COM /* Clear the domain information */
178*11596SJason.Beloro@Sun.COM if (domain_id) {
179*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_ID_SET(bus_p, NULL);
180*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_ID_DECR_REF_COUNT(bus_p);
181*11596SJason.Beloro@Sun.COM }
182*11596SJason.Beloro@Sun.COM
183*11596SJason.Beloro@Sun.COM dom_p->fmadom_count = 0;
184*11596SJason.Beloro@Sun.COM dom_p->nfmadom_count = 0;
185*11596SJason.Beloro@Sun.COM dom_p->rootdom_count = 0;
186*11596SJason.Beloro@Sun.COM
187*11596SJason.Beloro@Sun.COM for (pdip = ddi_get_parent(PCIE_BUS2DIP(bus_p)); PCIE_DIP2BUS(pdip);
188*11596SJason.Beloro@Sun.COM pdip = ddi_get_parent(pdip)) {
189*11596SJason.Beloro@Sun.COM pbus_p = PCIE_DIP2BUS(pdip);
190*11596SJason.Beloro@Sun.COM pdom_p = PCIE_BUS2DOM(pbus_p);
191*11596SJason.Beloro@Sun.COM
192*11596SJason.Beloro@Sun.COM if (assigned) {
193*11596SJason.Beloro@Sun.COM if (domain_id)
194*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_LIST_REMOVE(pbus_p, domain_id);
195*11596SJason.Beloro@Sun.COM
196*11596SJason.Beloro@Sun.COM if (fma_dom)
197*11596SJason.Beloro@Sun.COM pdom_p->fmadom_count--;
198*11596SJason.Beloro@Sun.COM else {
199*11596SJason.Beloro@Sun.COM pdom_p->nfmadom_count--;
200*11596SJason.Beloro@Sun.COM PCIE_BDF_LIST_REMOVE(pbus_p, bus_p->bus_bdf);
201*11596SJason.Beloro@Sun.COM }
202*11596SJason.Beloro@Sun.COM } else
203*11596SJason.Beloro@Sun.COM pdom_p->rootdom_count--;
204*11596SJason.Beloro@Sun.COM }
205*11596SJason.Beloro@Sun.COM }
206*11596SJason.Beloro@Sun.COM
207*11596SJason.Beloro@Sun.COM
208*11596SJason.Beloro@Sun.COM /*
209*11596SJason.Beloro@Sun.COM * Initialize private data structure for IOV environments.
210*11596SJason.Beloro@Sun.COM * o Allocate memory for iov data
211*11596SJason.Beloro@Sun.COM * o Cache Domain ids.
212*11596SJason.Beloro@Sun.COM */
213*11596SJason.Beloro@Sun.COM void
pcie_init_dom(dev_info_t * dip)214*11596SJason.Beloro@Sun.COM pcie_init_dom(dev_info_t *dip)
215*11596SJason.Beloro@Sun.COM {
216*11596SJason.Beloro@Sun.COM pcie_domain_t *dom_p = PCIE_ZALLOC(pcie_domain_t);
217*11596SJason.Beloro@Sun.COM pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
218*11596SJason.Beloro@Sun.COM
219*11596SJason.Beloro@Sun.COM PCIE_BUS2DOM(bus_p) = dom_p;
220*11596SJason.Beloro@Sun.COM
221*11596SJason.Beloro@Sun.COM /* Only leaf devices are assignable to IO Domains */
222*11596SJason.Beloro@Sun.COM if (PCIE_IS_BDG(bus_p))
223*11596SJason.Beloro@Sun.COM return;
224*11596SJason.Beloro@Sun.COM
225*11596SJason.Beloro@Sun.COM /*
226*11596SJason.Beloro@Sun.COM * At the time of init_dom in the root domain a device may or may not
227*11596SJason.Beloro@Sun.COM * have been assigned to an IO Domain.
228*11596SJason.Beloro@Sun.COM *
229*11596SJason.Beloro@Sun.COM * LDOMS: the property "ddi-assigned" will be set for devices that is
230*11596SJason.Beloro@Sun.COM * assignable to an IO domain and unusable in the root domain. If the
231*11596SJason.Beloro@Sun.COM * property exist assume it has been assigned to a non-fma domain until
232*11596SJason.Beloro@Sun.COM * otherwise notified. The domain id is unknown on LDOMS.
233*11596SJason.Beloro@Sun.COM *
234*11596SJason.Beloro@Sun.COM * Xen: the "ddi-assigned" property won't be set until Xen store calls
235*11596SJason.Beloro@Sun.COM * pcie_loan_device is called. In this function this will always look
236*11596SJason.Beloro@Sun.COM * like the device is assigned to the root domain. Domain ID caching
237*11596SJason.Beloro@Sun.COM * will occur in pcie_loan_device function.
238*11596SJason.Beloro@Sun.COM */
239*11596SJason.Beloro@Sun.COM if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
240*11596SJason.Beloro@Sun.COM "ddi-assigned", -1) != -1) {
241*11596SJason.Beloro@Sun.COM dom_p->nfmadom_count = 1;
242*11596SJason.Beloro@Sun.COM
243*11596SJason.Beloro@Sun.COM /* Prevent "assigned" device from detaching */
244*11596SJason.Beloro@Sun.COM ndi_hold_devi(dip);
245*11596SJason.Beloro@Sun.COM } else
246*11596SJason.Beloro@Sun.COM dom_p->rootdom_count = 1;
247*11596SJason.Beloro@Sun.COM (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "ddi-assigned");
248*11596SJason.Beloro@Sun.COM
249*11596SJason.Beloro@Sun.COM pcie_cache_domain_info(bus_p);
250*11596SJason.Beloro@Sun.COM }
251*11596SJason.Beloro@Sun.COM
252*11596SJason.Beloro@Sun.COM void
pcie_fini_dom(dev_info_t * dip)253*11596SJason.Beloro@Sun.COM pcie_fini_dom(dev_info_t *dip)
254*11596SJason.Beloro@Sun.COM {
255*11596SJason.Beloro@Sun.COM pcie_domain_t *dom_p = PCIE_DIP2DOM(dip);
256*11596SJason.Beloro@Sun.COM pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
257*11596SJason.Beloro@Sun.COM
258*11596SJason.Beloro@Sun.COM if (PCIE_IS_BDG(bus_p))
259*11596SJason.Beloro@Sun.COM pcie_domain_list_destroy(PCIE_DOMAIN_LIST_GET(bus_p));
260*11596SJason.Beloro@Sun.COM else
261*11596SJason.Beloro@Sun.COM pcie_uncache_domain_info(bus_p);
262*11596SJason.Beloro@Sun.COM
263*11596SJason.Beloro@Sun.COM kmem_free(dom_p, sizeof (pcie_domain_t));
264*11596SJason.Beloro@Sun.COM }
265*11596SJason.Beloro@Sun.COM
266*11596SJason.Beloro@Sun.COM /*
267*11596SJason.Beloro@Sun.COM * PCIe Severity:
268*11596SJason.Beloro@Sun.COM *
269*11596SJason.Beloro@Sun.COM * PF_ERR_NO_ERROR : no IOV Action
270*11596SJason.Beloro@Sun.COM * PF_ERR_CE : no IOV Action
271*11596SJason.Beloro@Sun.COM * PF_ERR_NO_PANIC : contains error telemetry, log domain info
272*11596SJason.Beloro@Sun.COM * PF_ERR_MATCHED_DEVICE: contains error telemetry, log domain info
273*11596SJason.Beloro@Sun.COM * PF_ERR_MATCHED_RC : Error already taken care of, no further IOV Action
274*11596SJason.Beloro@Sun.COM * PF_ERR_MATCHED_PARENT: Error already taken care of, no further IOV Action
275*11596SJason.Beloro@Sun.COM * PF_ERR_PANIC : contains error telemetry, log domain info
276*11596SJason.Beloro@Sun.COM *
277*11596SJason.Beloro@Sun.COM * For NO_PANIC, MATCHED_DEVICE and PANIC, IOV wants to look at the affected
278*11596SJason.Beloro@Sun.COM * devices and find the domains involved.
279*11596SJason.Beloro@Sun.COM *
280*11596SJason.Beloro@Sun.COM * If root domain does not own an affected device, IOV EH should change
281*11596SJason.Beloro@Sun.COM * PF_ERR_PANIC to PF_ERR_MATCH_DOM.
282*11596SJason.Beloro@Sun.COM */
283*11596SJason.Beloro@Sun.COM int
pciev_eh(pf_data_t * pfd_p,pf_impl_t * impl)284*11596SJason.Beloro@Sun.COM pciev_eh(pf_data_t *pfd_p, pf_impl_t *impl)
285*11596SJason.Beloro@Sun.COM {
286*11596SJason.Beloro@Sun.COM int severity = pfd_p->pe_severity_flags;
287*11596SJason.Beloro@Sun.COM int iov_severity = severity;
288*11596SJason.Beloro@Sun.COM pcie_bus_t *a_bus_p; /* Affected device's pcie_bus_t */
289*11596SJason.Beloro@Sun.COM pf_data_t *root_pfd_p = impl->pf_dq_head_p;
290*11596SJason.Beloro@Sun.COM pcie_bus_t *root_bus_p;
291*11596SJason.Beloro@Sun.COM
292*11596SJason.Beloro@Sun.COM /*
293*11596SJason.Beloro@Sun.COM * check if all devices under the root device are unassigned.
294*11596SJason.Beloro@Sun.COM * this function should quickly return in non-IOV environment.
295*11596SJason.Beloro@Sun.COM */
296*11596SJason.Beloro@Sun.COM ASSERT(root_pfd_p != NULL);
297*11596SJason.Beloro@Sun.COM root_bus_p = PCIE_PFD2BUS(root_pfd_p);
298*11596SJason.Beloro@Sun.COM if (PCIE_BDG_IS_UNASSIGNED(root_bus_p))
299*11596SJason.Beloro@Sun.COM return (severity);
300*11596SJason.Beloro@Sun.COM
301*11596SJason.Beloro@Sun.COM if (severity & PF_ERR_PANIC_DEADLOCK) {
302*11596SJason.Beloro@Sun.COM pcie_faulty_all = B_TRUE;
303*11596SJason.Beloro@Sun.COM
304*11596SJason.Beloro@Sun.COM } else if (severity & (PF_ERR_NO_PANIC | PF_ERR_MATCHED_DEVICE |
305*11596SJason.Beloro@Sun.COM PF_ERR_PANIC | PF_ERR_PANIC_BAD_RESPONSE)) {
306*11596SJason.Beloro@Sun.COM
307*11596SJason.Beloro@Sun.COM uint16_t affected_flag, dev_affected_flags;
308*11596SJason.Beloro@Sun.COM uint_t is_panic = 0, is_aff_dev_found = 0;
309*11596SJason.Beloro@Sun.COM
310*11596SJason.Beloro@Sun.COM dev_affected_flags = PFD_AFFECTED_DEV(pfd_p)->pe_affected_flags;
311*11596SJason.Beloro@Sun.COM /* adjust affected flags to leverage cached domain ids */
312*11596SJason.Beloro@Sun.COM if (dev_affected_flags & PF_AFFECTED_CHILDREN) {
313*11596SJason.Beloro@Sun.COM dev_affected_flags |= PF_AFFECTED_SELF;
314*11596SJason.Beloro@Sun.COM dev_affected_flags &= ~PF_AFFECTED_CHILDREN;
315*11596SJason.Beloro@Sun.COM }
316*11596SJason.Beloro@Sun.COM
317*11596SJason.Beloro@Sun.COM for (affected_flag = 1;
318*11596SJason.Beloro@Sun.COM affected_flag <= PF_MAX_AFFECTED_FLAG;
319*11596SJason.Beloro@Sun.COM affected_flag <<= 1) {
320*11596SJason.Beloro@Sun.COM a_bus_p = pciev_get_affected_dev(impl, pfd_p,
321*11596SJason.Beloro@Sun.COM affected_flag, dev_affected_flags);
322*11596SJason.Beloro@Sun.COM
323*11596SJason.Beloro@Sun.COM if (a_bus_p == NULL)
324*11596SJason.Beloro@Sun.COM continue;
325*11596SJason.Beloro@Sun.COM
326*11596SJason.Beloro@Sun.COM is_aff_dev_found++;
327*11596SJason.Beloro@Sun.COM PFD_AFFECTED_DEV(pfd_p)->pe_affected_bdf =
328*11596SJason.Beloro@Sun.COM a_bus_p->bus_bdf;
329*11596SJason.Beloro@Sun.COM
330*11596SJason.Beloro@Sun.COM /*
331*11596SJason.Beloro@Sun.COM * If a leaf device is assigned to the root domain or if
332*11596SJason.Beloro@Sun.COM * a bridge has children assigned to a root domain
333*11596SJason.Beloro@Sun.COM * panic.
334*11596SJason.Beloro@Sun.COM *
335*11596SJason.Beloro@Sun.COM * If a leaf device or a child of a bridge is assigned
336*11596SJason.Beloro@Sun.COM * to NFMA domain mark it for panic. If assigned to FMA
337*11596SJason.Beloro@Sun.COM * domain save the domain id.
338*11596SJason.Beloro@Sun.COM */
339*11596SJason.Beloro@Sun.COM if (!PCIE_IS_BDG(a_bus_p) &&
340*11596SJason.Beloro@Sun.COM !PCIE_IS_ASSIGNED(a_bus_p)) {
341*11596SJason.Beloro@Sun.COM if (severity & PF_ERR_FATAL_FLAGS)
342*11596SJason.Beloro@Sun.COM is_panic++;
343*11596SJason.Beloro@Sun.COM continue;
344*11596SJason.Beloro@Sun.COM }
345*11596SJason.Beloro@Sun.COM
346*11596SJason.Beloro@Sun.COM if (PCIE_BDG_HAS_CHILDREN_ROOT_DOM(a_bus_p)) {
347*11596SJason.Beloro@Sun.COM if (severity & PF_ERR_FATAL_FLAGS)
348*11596SJason.Beloro@Sun.COM is_panic++;
349*11596SJason.Beloro@Sun.COM }
350*11596SJason.Beloro@Sun.COM
351*11596SJason.Beloro@Sun.COM if ((PCIE_ASSIGNED_TO_NFMA_DOM(a_bus_p) ||
352*11596SJason.Beloro@Sun.COM PCIE_BDG_HAS_CHILDREN_NFMA_DOM(a_bus_p)) &&
353*11596SJason.Beloro@Sun.COM (severity & PF_ERR_FATAL_FLAGS)) {
354*11596SJason.Beloro@Sun.COM PCIE_BUS2DOM(a_bus_p)->nfma_panic = B_TRUE;
355*11596SJason.Beloro@Sun.COM iov_severity |= PF_ERR_MATCH_DOM;
356*11596SJason.Beloro@Sun.COM }
357*11596SJason.Beloro@Sun.COM
358*11596SJason.Beloro@Sun.COM if (PCIE_ASSIGNED_TO_FMA_DOM(a_bus_p)) {
359*11596SJason.Beloro@Sun.COM pcie_save_domain_id(
360*11596SJason.Beloro@Sun.COM &PCIE_BUS2DOM(a_bus_p)->domain.id);
361*11596SJason.Beloro@Sun.COM iov_severity |= PF_ERR_MATCH_DOM;
362*11596SJason.Beloro@Sun.COM }
363*11596SJason.Beloro@Sun.COM
364*11596SJason.Beloro@Sun.COM if (PCIE_BDG_HAS_CHILDREN_FMA_DOM(a_bus_p)) {
365*11596SJason.Beloro@Sun.COM pcie_save_domain_id(
366*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_LIST_GET(a_bus_p));
367*11596SJason.Beloro@Sun.COM iov_severity |= PF_ERR_MATCH_DOM;
368*11596SJason.Beloro@Sun.COM }
369*11596SJason.Beloro@Sun.COM }
370*11596SJason.Beloro@Sun.COM
371*11596SJason.Beloro@Sun.COM /*
372*11596SJason.Beloro@Sun.COM * Overwrite the severity only if affected device can be
373*11596SJason.Beloro@Sun.COM * identified and root domain does not need to panic.
374*11596SJason.Beloro@Sun.COM */
375*11596SJason.Beloro@Sun.COM if ((!is_panic) && is_aff_dev_found) {
376*11596SJason.Beloro@Sun.COM iov_severity &= ~PF_ERR_FATAL_FLAGS;
377*11596SJason.Beloro@Sun.COM }
378*11596SJason.Beloro@Sun.COM }
379*11596SJason.Beloro@Sun.COM
380*11596SJason.Beloro@Sun.COM return (iov_severity);
381*11596SJason.Beloro@Sun.COM }
382*11596SJason.Beloro@Sun.COM
383*11596SJason.Beloro@Sun.COM /* ARGSUSED */
384*11596SJason.Beloro@Sun.COM void
pciev_eh_exit(pf_data_t * root_pfd_p,uint_t intr_type)385*11596SJason.Beloro@Sun.COM pciev_eh_exit(pf_data_t *root_pfd_p, uint_t intr_type)
386*11596SJason.Beloro@Sun.COM {
387*11596SJason.Beloro@Sun.COM pcie_bus_t *root_bus_p;
388*11596SJason.Beloro@Sun.COM
389*11596SJason.Beloro@Sun.COM /*
390*11596SJason.Beloro@Sun.COM * check if all devices under the root device are unassigned.
391*11596SJason.Beloro@Sun.COM * this function should quickly return in non-IOV environment.
392*11596SJason.Beloro@Sun.COM */
393*11596SJason.Beloro@Sun.COM root_bus_p = PCIE_PFD2BUS(root_pfd_p);
394*11596SJason.Beloro@Sun.COM if (PCIE_BDG_IS_UNASSIGNED(root_bus_p))
395*11596SJason.Beloro@Sun.COM return;
396*11596SJason.Beloro@Sun.COM
397*11596SJason.Beloro@Sun.COM pcie_faulty_list_clear();
398*11596SJason.Beloro@Sun.COM }
399*11596SJason.Beloro@Sun.COM
400*11596SJason.Beloro@Sun.COM pcie_bus_t *
pciev_get_affected_dev(pf_impl_t * impl,pf_data_t * pfd_p,uint16_t affected_flag,uint16_t dev_affected_flags)401*11596SJason.Beloro@Sun.COM pciev_get_affected_dev(pf_impl_t *impl, pf_data_t *pfd_p,
402*11596SJason.Beloro@Sun.COM uint16_t affected_flag, uint16_t dev_affected_flags)
403*11596SJason.Beloro@Sun.COM {
404*11596SJason.Beloro@Sun.COM pcie_bus_t *bus_p = PCIE_PFD2BUS(pfd_p);
405*11596SJason.Beloro@Sun.COM uint16_t flag = affected_flag & dev_affected_flags;
406*11596SJason.Beloro@Sun.COM pcie_bus_t *temp_bus_p;
407*11596SJason.Beloro@Sun.COM pcie_req_id_t a_bdf;
408*11596SJason.Beloro@Sun.COM uint64_t a_addr;
409*11596SJason.Beloro@Sun.COM uint16_t cmd;
410*11596SJason.Beloro@Sun.COM
411*11596SJason.Beloro@Sun.COM if (!flag)
412*11596SJason.Beloro@Sun.COM return (NULL);
413*11596SJason.Beloro@Sun.COM
414*11596SJason.Beloro@Sun.COM switch (flag) {
415*11596SJason.Beloro@Sun.COM case PF_AFFECTED_ROOT:
416*11596SJason.Beloro@Sun.COM return (PCIE_DIP2BUS(bus_p->bus_rp_dip));
417*11596SJason.Beloro@Sun.COM case PF_AFFECTED_SELF:
418*11596SJason.Beloro@Sun.COM return (bus_p);
419*11596SJason.Beloro@Sun.COM case PF_AFFECTED_PARENT:
420*11596SJason.Beloro@Sun.COM return (PCIE_DIP2BUS(ddi_get_parent(PCIE_BUS2DIP(bus_p))));
421*11596SJason.Beloro@Sun.COM case PF_AFFECTED_BDF: /* may only be used for RC */
422*11596SJason.Beloro@Sun.COM a_bdf = PFD_AFFECTED_DEV(pfd_p)->pe_affected_bdf;
423*11596SJason.Beloro@Sun.COM if (!PCIE_CHECK_VALID_BDF(a_bdf))
424*11596SJason.Beloro@Sun.COM return (NULL);
425*11596SJason.Beloro@Sun.COM
426*11596SJason.Beloro@Sun.COM temp_bus_p = pf_find_busp_by_bdf(impl, a_bdf);
427*11596SJason.Beloro@Sun.COM return (temp_bus_p);
428*11596SJason.Beloro@Sun.COM case PF_AFFECTED_AER:
429*11596SJason.Beloro@Sun.COM if (pf_tlp_decode(bus_p, PCIE_ADV_REG(pfd_p)) == DDI_SUCCESS) {
430*11596SJason.Beloro@Sun.COM temp_bus_p = pf_find_busp_by_aer(impl, pfd_p);
431*11596SJason.Beloro@Sun.COM return (temp_bus_p);
432*11596SJason.Beloro@Sun.COM }
433*11596SJason.Beloro@Sun.COM break;
434*11596SJason.Beloro@Sun.COM case PF_AFFECTED_SAER:
435*11596SJason.Beloro@Sun.COM if (pf_pci_decode(pfd_p, &cmd) == DDI_SUCCESS) {
436*11596SJason.Beloro@Sun.COM temp_bus_p = pf_find_busp_by_saer(impl, pfd_p);
437*11596SJason.Beloro@Sun.COM return (temp_bus_p);
438*11596SJason.Beloro@Sun.COM }
439*11596SJason.Beloro@Sun.COM break;
440*11596SJason.Beloro@Sun.COM case PF_AFFECTED_ADDR: /* ROOT only */
441*11596SJason.Beloro@Sun.COM a_addr = PCIE_ROOT_FAULT(pfd_p)->scan_addr;
442*11596SJason.Beloro@Sun.COM temp_bus_p = pf_find_busp_by_addr(impl, a_addr);
443*11596SJason.Beloro@Sun.COM return (temp_bus_p);
444*11596SJason.Beloro@Sun.COM }
445*11596SJason.Beloro@Sun.COM
446*11596SJason.Beloro@Sun.COM return (NULL);
447*11596SJason.Beloro@Sun.COM }
448*11596SJason.Beloro@Sun.COM
449*11596SJason.Beloro@Sun.COM /* type used for pcie_domain_list_find() function */
450*11596SJason.Beloro@Sun.COM typedef enum {
451*11596SJason.Beloro@Sun.COM PCIE_DOM_LIST_TYPE_CACHE = 1,
452*11596SJason.Beloro@Sun.COM PCIE_DOM_LIST_TYPE_FAULT = 2
453*11596SJason.Beloro@Sun.COM } pcie_dom_list_type_t;
454*11596SJason.Beloro@Sun.COM
455*11596SJason.Beloro@Sun.COM /*
456*11596SJason.Beloro@Sun.COM * Check if a domain id is already in the linked list
457*11596SJason.Beloro@Sun.COM */
458*11596SJason.Beloro@Sun.COM static pcie_domains_t *
pcie_domain_list_find(uint_t domain_id,pcie_domains_t * pd_list_p,pcie_dom_list_type_t type)459*11596SJason.Beloro@Sun.COM pcie_domain_list_find(uint_t domain_id, pcie_domains_t *pd_list_p,
460*11596SJason.Beloro@Sun.COM pcie_dom_list_type_t type)
461*11596SJason.Beloro@Sun.COM {
462*11596SJason.Beloro@Sun.COM while (pd_list_p) {
463*11596SJason.Beloro@Sun.COM if (pd_list_p->domain_id == domain_id)
464*11596SJason.Beloro@Sun.COM return (pd_list_p);
465*11596SJason.Beloro@Sun.COM
466*11596SJason.Beloro@Sun.COM if (type == PCIE_DOM_LIST_TYPE_CACHE) {
467*11596SJason.Beloro@Sun.COM pd_list_p = pd_list_p->cached_next;
468*11596SJason.Beloro@Sun.COM } else if (type == PCIE_DOM_LIST_TYPE_FAULT) {
469*11596SJason.Beloro@Sun.COM pd_list_p = pd_list_p->faulty_next;
470*11596SJason.Beloro@Sun.COM } else {
471*11596SJason.Beloro@Sun.COM return (NULL);
472*11596SJason.Beloro@Sun.COM }
473*11596SJason.Beloro@Sun.COM }
474*11596SJason.Beloro@Sun.COM
475*11596SJason.Beloro@Sun.COM return (NULL);
476*11596SJason.Beloro@Sun.COM }
477*11596SJason.Beloro@Sun.COM
478*11596SJason.Beloro@Sun.COM /*
479*11596SJason.Beloro@Sun.COM * Return true if a leaf device is assigned to a domain or a bridge device
480*11596SJason.Beloro@Sun.COM * has children assigned to the domain
481*11596SJason.Beloro@Sun.COM */
482*11596SJason.Beloro@Sun.COM boolean_t
pcie_in_domain(pcie_bus_t * bus_p,uint_t domain_id)483*11596SJason.Beloro@Sun.COM pcie_in_domain(pcie_bus_t *bus_p, uint_t domain_id)
484*11596SJason.Beloro@Sun.COM {
485*11596SJason.Beloro@Sun.COM if (PCIE_IS_BDG(bus_p)) {
486*11596SJason.Beloro@Sun.COM pcie_domains_t *pd;
487*11596SJason.Beloro@Sun.COM pd = pcie_domain_list_find(domain_id,
488*11596SJason.Beloro@Sun.COM PCIE_DOMAIN_LIST_GET(bus_p), PCIE_DOM_LIST_TYPE_CACHE);
489*11596SJason.Beloro@Sun.COM if (pd && pd->cached_count)
490*11596SJason.Beloro@Sun.COM return (B_TRUE);
491*11596SJason.Beloro@Sun.COM return (B_FALSE);
492*11596SJason.Beloro@Sun.COM } else {
493*11596SJason.Beloro@Sun.COM return (PCIE_DOMAIN_ID_GET(bus_p) == domain_id);
494*11596SJason.Beloro@Sun.COM }
495*11596SJason.Beloro@Sun.COM }
496*11596SJason.Beloro@Sun.COM
497*11596SJason.Beloro@Sun.COM /*
498*11596SJason.Beloro@Sun.COM * Add a domain id to a cached domain id list.
499*11596SJason.Beloro@Sun.COM * If the domain already exists in the list, increment the reference count.
500*11596SJason.Beloro@Sun.COM */
501*11596SJason.Beloro@Sun.COM void
pcie_domain_list_add(uint_t domain_id,pcie_domains_t ** pd_list_p)502*11596SJason.Beloro@Sun.COM pcie_domain_list_add(uint_t domain_id, pcie_domains_t **pd_list_p)
503*11596SJason.Beloro@Sun.COM {
504*11596SJason.Beloro@Sun.COM pcie_domains_t *pd;
505*11596SJason.Beloro@Sun.COM
506*11596SJason.Beloro@Sun.COM pd = pcie_domain_list_find(domain_id, *pd_list_p,
507*11596SJason.Beloro@Sun.COM PCIE_DOM_LIST_TYPE_CACHE);
508*11596SJason.Beloro@Sun.COM
509*11596SJason.Beloro@Sun.COM if (pd == NULL) {
510*11596SJason.Beloro@Sun.COM pd = PCIE_ZALLOC(pcie_domains_t);
511*11596SJason.Beloro@Sun.COM pd->domain_id = domain_id;
512*11596SJason.Beloro@Sun.COM pd->cached_count = 1;
513*11596SJason.Beloro@Sun.COM pd->cached_next = *pd_list_p;
514*11596SJason.Beloro@Sun.COM *pd_list_p = pd;
515*11596SJason.Beloro@Sun.COM } else
516*11596SJason.Beloro@Sun.COM pd->cached_count++;
517*11596SJason.Beloro@Sun.COM }
518*11596SJason.Beloro@Sun.COM
519*11596SJason.Beloro@Sun.COM /*
520*11596SJason.Beloro@Sun.COM * Remove a domain id from a cached domain id list.
521*11596SJason.Beloro@Sun.COM * Decrement the reference count.
522*11596SJason.Beloro@Sun.COM */
523*11596SJason.Beloro@Sun.COM void
pcie_domain_list_remove(uint_t domain_id,pcie_domains_t * pd_list_p)524*11596SJason.Beloro@Sun.COM pcie_domain_list_remove(uint_t domain_id, pcie_domains_t *pd_list_p)
525*11596SJason.Beloro@Sun.COM {
526*11596SJason.Beloro@Sun.COM pcie_domains_t *pd;
527*11596SJason.Beloro@Sun.COM
528*11596SJason.Beloro@Sun.COM pd = pcie_domain_list_find(domain_id, pd_list_p,
529*11596SJason.Beloro@Sun.COM PCIE_DOM_LIST_TYPE_CACHE);
530*11596SJason.Beloro@Sun.COM
531*11596SJason.Beloro@Sun.COM if (pd) {
532*11596SJason.Beloro@Sun.COM ASSERT((pd->cached_count)--);
533*11596SJason.Beloro@Sun.COM }
534*11596SJason.Beloro@Sun.COM }
535*11596SJason.Beloro@Sun.COM
536*11596SJason.Beloro@Sun.COM /* destroy cached domain id list */
537*11596SJason.Beloro@Sun.COM static void
pcie_domain_list_destroy(pcie_domains_t * domain_ids)538*11596SJason.Beloro@Sun.COM pcie_domain_list_destroy(pcie_domains_t *domain_ids)
539*11596SJason.Beloro@Sun.COM {
540*11596SJason.Beloro@Sun.COM pcie_domains_t *p = domain_ids;
541*11596SJason.Beloro@Sun.COM pcie_domains_t *next;
542*11596SJason.Beloro@Sun.COM
543*11596SJason.Beloro@Sun.COM while (p) {
544*11596SJason.Beloro@Sun.COM next = p->cached_next;
545*11596SJason.Beloro@Sun.COM kmem_free(p, sizeof (pcie_domains_t));
546*11596SJason.Beloro@Sun.COM p = next;
547*11596SJason.Beloro@Sun.COM }
548*11596SJason.Beloro@Sun.COM }
549*11596SJason.Beloro@Sun.COM
550*11596SJason.Beloro@Sun.COM static void
pcie_faulty_list_update(pcie_domains_t * pd,pcie_domains_t ** headp)551*11596SJason.Beloro@Sun.COM pcie_faulty_list_update(pcie_domains_t *pd,
552*11596SJason.Beloro@Sun.COM pcie_domains_t **headp)
553*11596SJason.Beloro@Sun.COM {
554*11596SJason.Beloro@Sun.COM if (pd == NULL)
555*11596SJason.Beloro@Sun.COM return;
556*11596SJason.Beloro@Sun.COM
557*11596SJason.Beloro@Sun.COM if (*headp == NULL) {
558*11596SJason.Beloro@Sun.COM *headp = pd;
559*11596SJason.Beloro@Sun.COM pd->faulty_prev = NULL;
560*11596SJason.Beloro@Sun.COM pd->faulty_next = NULL;
561*11596SJason.Beloro@Sun.COM pd->faulty_count = 1;
562*11596SJason.Beloro@Sun.COM } else {
563*11596SJason.Beloro@Sun.COM pd->faulty_next = *headp;
564*11596SJason.Beloro@Sun.COM (*headp)->faulty_prev = pd;
565*11596SJason.Beloro@Sun.COM pd->faulty_prev = NULL;
566*11596SJason.Beloro@Sun.COM pd->faulty_count = 1;
567*11596SJason.Beloro@Sun.COM *headp = pd;
568*11596SJason.Beloro@Sun.COM }
569*11596SJason.Beloro@Sun.COM }
570*11596SJason.Beloro@Sun.COM
571*11596SJason.Beloro@Sun.COM static void
pcie_faulty_list_clear()572*11596SJason.Beloro@Sun.COM pcie_faulty_list_clear()
573*11596SJason.Beloro@Sun.COM {
574*11596SJason.Beloro@Sun.COM pcie_domains_t *pd = pcie_faulty_domains;
575*11596SJason.Beloro@Sun.COM pcie_domains_t *next;
576*11596SJason.Beloro@Sun.COM
577*11596SJason.Beloro@Sun.COM /* unlink all domain structures from the faulty list */
578*11596SJason.Beloro@Sun.COM while (pd) {
579*11596SJason.Beloro@Sun.COM next = pd->faulty_next;
580*11596SJason.Beloro@Sun.COM pd->faulty_prev = NULL;
581*11596SJason.Beloro@Sun.COM pd->faulty_next = NULL;
582*11596SJason.Beloro@Sun.COM pd->faulty_count = 0;
583*11596SJason.Beloro@Sun.COM pd = next;
584*11596SJason.Beloro@Sun.COM }
585*11596SJason.Beloro@Sun.COM pcie_faulty_domains = NULL;
586*11596SJason.Beloro@Sun.COM pcie_faulty_all = B_FALSE;
587*11596SJason.Beloro@Sun.COM }
588*11596SJason.Beloro@Sun.COM
589*11596SJason.Beloro@Sun.COM void
pcie_save_domain_id(pcie_domains_t * domain_ids)590*11596SJason.Beloro@Sun.COM pcie_save_domain_id(pcie_domains_t *domain_ids)
591*11596SJason.Beloro@Sun.COM {
592*11596SJason.Beloro@Sun.COM pcie_domains_t *old_list_p, *new_list_p, *pd;
593*11596SJason.Beloro@Sun.COM
594*11596SJason.Beloro@Sun.COM if (pcie_faulty_all)
595*11596SJason.Beloro@Sun.COM return;
596*11596SJason.Beloro@Sun.COM
597*11596SJason.Beloro@Sun.COM if (domain_ids == NULL)
598*11596SJason.Beloro@Sun.COM return;
599*11596SJason.Beloro@Sun.COM
600*11596SJason.Beloro@Sun.COM old_list_p = pcie_faulty_domains;
601*11596SJason.Beloro@Sun.COM for (new_list_p = domain_ids; new_list_p;
602*11596SJason.Beloro@Sun.COM new_list_p = new_list_p->cached_next) {
603*11596SJason.Beloro@Sun.COM if (!new_list_p->cached_count)
604*11596SJason.Beloro@Sun.COM continue;
605*11596SJason.Beloro@Sun.COM
606*11596SJason.Beloro@Sun.COM /* search domain id in the faulty domain list */
607*11596SJason.Beloro@Sun.COM pd = pcie_domain_list_find(new_list_p->domain_id,
608*11596SJason.Beloro@Sun.COM old_list_p, PCIE_DOM_LIST_TYPE_FAULT);
609*11596SJason.Beloro@Sun.COM if (pd)
610*11596SJason.Beloro@Sun.COM pd->faulty_count++;
611*11596SJason.Beloro@Sun.COM else
612*11596SJason.Beloro@Sun.COM pcie_faulty_list_update(new_list_p,
613*11596SJason.Beloro@Sun.COM &pcie_faulty_domains);
614*11596SJason.Beloro@Sun.COM }
615*11596SJason.Beloro@Sun.COM }
616