xref: /titanic_44/usr/src/uts/common/io/pciex/pcie.c (revision 1e4c938b57d1656808e4112127ff1dce3eba5314)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #include <sys/sysmacros.h>
27 #include <sys/types.h>
28 #include <sys/kmem.h>
29 #include <sys/modctl.h>
30 #include <sys/ddi.h>
31 #include <sys/sunddi.h>
32 #include <sys/sunndi.h>
33 #include <sys/fm/protocol.h>
34 #include <sys/fm/util.h>
35 #include <sys/promif.h>
36 #include <sys/disp.h>
37 #include <sys/stat.h>
38 #include <sys/file.h>
39 #include <sys/pci_cap.h>
40 #include <sys/pci_impl.h>
41 #include <sys/pcie_impl.h>
42 #include <sys/hotplug/pci/pcie_hp.h>
43 #include <sys/hotplug/pci/pciehpc.h>
44 #include <sys/hotplug/pci/pcishpc.h>
45 #include <sys/hotplug/pci/pcicfg.h>
46 #include <sys/pci_cfgacc.h>
47 
48 /* Local functions prototypes */
49 static void pcie_init_pfd(dev_info_t *);
50 static void pcie_fini_pfd(dev_info_t *);
51 
52 #if defined(__i386) || defined(__amd64)
53 static void pcie_check_io_mem_range(ddi_acc_handle_t, boolean_t *, boolean_t *);
54 #endif /* defined(__i386) || defined(__amd64) */
55 
56 #ifdef DEBUG
57 uint_t pcie_debug_flags = 0;
58 static void pcie_print_bus(pcie_bus_t *bus_p);
59 void pcie_dbg(char *fmt, ...);
60 #endif /* DEBUG */
61 
62 /* Variable to control default PCI-Express config settings */
63 ushort_t pcie_command_default =
64     PCI_COMM_SERR_ENABLE |
65     PCI_COMM_WAIT_CYC_ENAB |
66     PCI_COMM_PARITY_DETECT |
67     PCI_COMM_ME |
68     PCI_COMM_MAE |
69     PCI_COMM_IO;
70 
71 /* xxx_fw are bits that are controlled by FW and should not be modified */
72 ushort_t pcie_command_default_fw =
73     PCI_COMM_SPEC_CYC |
74     PCI_COMM_MEMWR_INVAL |
75     PCI_COMM_PALETTE_SNOOP |
76     PCI_COMM_WAIT_CYC_ENAB |
77     0xF800; /* Reserved Bits */
78 
79 ushort_t pcie_bdg_command_default_fw =
80     PCI_BCNF_BCNTRL_ISA_ENABLE |
81     PCI_BCNF_BCNTRL_VGA_ENABLE |
82     0xF000; /* Reserved Bits */
83 
84 /* PCI-Express Base error defaults */
85 ushort_t pcie_base_err_default =
86     PCIE_DEVCTL_CE_REPORTING_EN |
87     PCIE_DEVCTL_NFE_REPORTING_EN |
88     PCIE_DEVCTL_FE_REPORTING_EN |
89     PCIE_DEVCTL_UR_REPORTING_EN;
90 
91 /* PCI-Express Device Control Register */
92 uint16_t pcie_devctl_default = PCIE_DEVCTL_RO_EN |
93     PCIE_DEVCTL_MAX_READ_REQ_512;
94 
95 /* PCI-Express AER Root Control Register */
96 #define	PCIE_ROOT_SYS_ERR	(PCIE_ROOTCTL_SYS_ERR_ON_CE_EN | \
97 				PCIE_ROOTCTL_SYS_ERR_ON_NFE_EN | \
98 				PCIE_ROOTCTL_SYS_ERR_ON_FE_EN)
99 
100 ushort_t pcie_root_ctrl_default =
101     PCIE_ROOTCTL_SYS_ERR_ON_CE_EN |
102     PCIE_ROOTCTL_SYS_ERR_ON_NFE_EN |
103     PCIE_ROOTCTL_SYS_ERR_ON_FE_EN;
104 
105 /* PCI-Express Root Error Command Register */
106 ushort_t pcie_root_error_cmd_default =
107     PCIE_AER_RE_CMD_CE_REP_EN |
108     PCIE_AER_RE_CMD_NFE_REP_EN |
109     PCIE_AER_RE_CMD_FE_REP_EN;
110 
111 /* ECRC settings in the PCIe AER Control Register */
112 uint32_t pcie_ecrc_value =
113     PCIE_AER_CTL_ECRC_GEN_ENA |
114     PCIE_AER_CTL_ECRC_CHECK_ENA;
115 
116 /*
117  * If a particular platform wants to disable certain errors such as UR/MA,
118  * instead of using #defines have the platform's PCIe Root Complex driver set
119  * these masks using the pcie_get_XXX_mask and pcie_set_XXX_mask functions.  For
120  * x86 the closest thing to a PCIe root complex driver is NPE.	For SPARC the
121  * closest PCIe root complex driver is PX.
122  *
123  * pcie_serr_disable_flag : disable SERR only (in RCR and command reg) x86
124  * systems may want to disable SERR in general.  For root ports, enabling SERR
125  * causes NMIs which are not handled and results in a watchdog timeout error.
126  */
127 uint32_t pcie_aer_uce_mask = 0;		/* AER UE Mask */
128 uint32_t pcie_aer_ce_mask = 0;		/* AER CE Mask */
129 uint32_t pcie_aer_suce_mask = 0;	/* AER Secondary UE Mask */
130 uint32_t pcie_serr_disable_flag = 0;	/* Disable SERR */
131 
132 /* Default severities needed for eversholt.  Error handling doesn't care */
133 uint32_t pcie_aer_uce_severity = PCIE_AER_UCE_MTLP | PCIE_AER_UCE_RO | \
134     PCIE_AER_UCE_FCP | PCIE_AER_UCE_SD | PCIE_AER_UCE_DLP | \
135     PCIE_AER_UCE_TRAINING;
136 uint32_t pcie_aer_suce_severity = PCIE_AER_SUCE_SERR_ASSERT | \
137     PCIE_AER_SUCE_UC_ADDR_ERR | PCIE_AER_SUCE_UC_ATTR_ERR | \
138     PCIE_AER_SUCE_USC_MSG_DATA_ERR;
139 
140 int pcie_max_mps = PCIE_DEVCTL_MAX_PAYLOAD_4096 >> 5;
141 int pcie_disable_ari = 0;
142 
143 static void pcie_scan_mps(dev_info_t *rc_dip, dev_info_t *dip,
144 	int *max_supported);
145 static int pcie_get_max_supported(dev_info_t *dip, void *arg);
146 static int pcie_map_phys(dev_info_t *dip, pci_regspec_t *phys_spec,
147     caddr_t *addrp, ddi_acc_handle_t *handlep);
148 static void pcie_unmap_phys(ddi_acc_handle_t *handlep,	pci_regspec_t *ph);
149 
150 dev_info_t *pcie_get_rc_dip(dev_info_t *dip);
151 
152 /*
153  * modload support
154  */
155 
156 static struct modlmisc modlmisc	= {
157 	&mod_miscops,	/* Type	of module */
158 	"PCI Express Framework Module"
159 };
160 
161 static struct modlinkage modlinkage = {
162 	MODREV_1,
163 	(void	*)&modlmisc,
164 	NULL
165 };
166 
167 /*
168  * Global Variables needed for a non-atomic version of ddi_fm_ereport_post.
169  * Currently used to send the pci.fabric ereports whose payload depends on the
170  * type of PCI device it is being sent for.
171  */
172 char		*pcie_nv_buf;
173 nv_alloc_t	*pcie_nvap;
174 nvlist_t	*pcie_nvl;
175 
176 int
177 _init(void)
178 {
179 	int rval;
180 
181 	pcie_nv_buf = kmem_alloc(ERPT_DATA_SZ, KM_SLEEP);
182 	pcie_nvap = fm_nva_xcreate(pcie_nv_buf, ERPT_DATA_SZ);
183 	pcie_nvl = fm_nvlist_create(pcie_nvap);
184 
185 	if ((rval = mod_install(&modlinkage)) != 0) {
186 		fm_nvlist_destroy(pcie_nvl, FM_NVA_RETAIN);
187 		fm_nva_xdestroy(pcie_nvap);
188 		kmem_free(pcie_nv_buf, ERPT_DATA_SZ);
189 	}
190 	return (rval);
191 }
192 
193 int
194 _fini()
195 {
196 	int		rval;
197 
198 	if ((rval = mod_remove(&modlinkage)) == 0) {
199 		fm_nvlist_destroy(pcie_nvl, FM_NVA_RETAIN);
200 		fm_nva_xdestroy(pcie_nvap);
201 		kmem_free(pcie_nv_buf, ERPT_DATA_SZ);
202 	}
203 	return (rval);
204 }
205 
206 int
207 _info(struct modinfo *modinfop)
208 {
209 	return (mod_info(&modlinkage, modinfop));
210 }
211 
212 /* ARGSUSED */
213 int
214 pcie_init(dev_info_t *dip, caddr_t arg)
215 {
216 	int	ret = DDI_SUCCESS;
217 
218 	/*
219 	 * Create a "devctl" minor node to support DEVCTL_DEVICE_*
220 	 * and DEVCTL_BUS_* ioctls to this bus.
221 	 */
222 	if ((ret = ddi_create_minor_node(dip, "devctl", S_IFCHR,
223 	    PCI_MINOR_NUM(ddi_get_instance(dip), PCI_DEVCTL_MINOR),
224 	    DDI_NT_NEXUS, 0)) != DDI_SUCCESS) {
225 		PCIE_DBG("Failed to create devctl minor node for %s%d\n",
226 		    ddi_driver_name(dip), ddi_get_instance(dip));
227 
228 		return (ret);
229 	}
230 
231 	if ((ret = pcie_hp_init(dip, arg)) != DDI_SUCCESS) {
232 		/*
233 		 * On some x86 platforms, we observed unexpected hotplug
234 		 * initialization failures in recent years. The known cause
235 		 * is a hardware issue: while the problem PCI bridges have
236 		 * the Hotplug Capable registers set, the machine actually
237 		 * does not implement the expected ACPI object.
238 		 *
239 		 * We don't want to stop PCI driver attach and system boot
240 		 * just because of this hotplug initialization failure.
241 		 * Continue with a debug message printed.
242 		 */
243 		PCIE_DBG("%s%d: Failed setting hotplug framework\n",
244 		    ddi_driver_name(dip), ddi_get_instance(dip));
245 
246 #if defined(__sparc)
247 		ddi_remove_minor_node(dip, "devctl");
248 
249 		return (ret);
250 #endif /* defined(__sparc) */
251 	}
252 
253 	return (DDI_SUCCESS);
254 }
255 
256 /* ARGSUSED */
257 int
258 pcie_uninit(dev_info_t *dip)
259 {
260 	int	ret = DDI_SUCCESS;
261 
262 	if (pcie_ari_is_enabled(dip) == PCIE_ARI_FORW_ENABLED)
263 		(void) pcie_ari_disable(dip);
264 
265 	if ((ret = pcie_hp_uninit(dip)) != DDI_SUCCESS) {
266 		PCIE_DBG("Failed to uninitialize hotplug for %s%d\n",
267 		    ddi_driver_name(dip), ddi_get_instance(dip));
268 
269 		return (ret);
270 	}
271 
272 	ddi_remove_minor_node(dip, "devctl");
273 
274 	return (ret);
275 }
276 
277 /*
278  * PCIe module interface for enabling hotplug interrupt.
279  *
280  * It should be called after pcie_init() is done and bus driver's
281  * interrupt handlers have being attached.
282  */
283 int
284 pcie_hpintr_enable(dev_info_t *dip)
285 {
286 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
287 	pcie_hp_ctrl_t	*ctrl_p = PCIE_GET_HP_CTRL(dip);
288 
289 	if (PCIE_IS_PCIE_HOTPLUG_ENABLED(bus_p)) {
290 		(void) (ctrl_p->hc_ops.enable_hpc_intr)(ctrl_p);
291 	} else if (PCIE_IS_PCI_HOTPLUG_ENABLED(bus_p)) {
292 		(void) pcishpc_enable_irqs(ctrl_p);
293 	}
294 	return (DDI_SUCCESS);
295 }
296 
297 /*
298  * PCIe module interface for disabling hotplug interrupt.
299  *
300  * It should be called before pcie_uninit() is called and bus driver's
301  * interrupt handlers is dettached.
302  */
303 int
304 pcie_hpintr_disable(dev_info_t *dip)
305 {
306 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
307 	pcie_hp_ctrl_t	*ctrl_p = PCIE_GET_HP_CTRL(dip);
308 
309 	if (PCIE_IS_PCIE_HOTPLUG_ENABLED(bus_p)) {
310 		(void) (ctrl_p->hc_ops.disable_hpc_intr)(ctrl_p);
311 	} else if (PCIE_IS_PCI_HOTPLUG_ENABLED(bus_p)) {
312 		(void) pcishpc_disable_irqs(ctrl_p);
313 	}
314 	return (DDI_SUCCESS);
315 }
316 
317 /* ARGSUSED */
318 int
319 pcie_intr(dev_info_t *dip)
320 {
321 	return (pcie_hp_intr(dip));
322 }
323 
324 /* ARGSUSED */
325 int
326 pcie_open(dev_info_t *dip, dev_t *devp, int flags, int otyp, cred_t *credp)
327 {
328 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
329 
330 	/*
331 	 * Make sure the open is for the right file type.
332 	 */
333 	if (otyp != OTYP_CHR)
334 		return (EINVAL);
335 
336 	/*
337 	 * Handle the open by tracking the device state.
338 	 */
339 	if ((bus_p->bus_soft_state == PCI_SOFT_STATE_OPEN_EXCL) ||
340 	    ((flags & FEXCL) &&
341 	    (bus_p->bus_soft_state != PCI_SOFT_STATE_CLOSED))) {
342 		return (EBUSY);
343 	}
344 
345 	if (flags & FEXCL)
346 		bus_p->bus_soft_state = PCI_SOFT_STATE_OPEN_EXCL;
347 	else
348 		bus_p->bus_soft_state = PCI_SOFT_STATE_OPEN;
349 
350 	return (0);
351 }
352 
353 /* ARGSUSED */
354 int
355 pcie_close(dev_info_t *dip, dev_t dev, int flags, int otyp, cred_t *credp)
356 {
357 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
358 
359 	if (otyp != OTYP_CHR)
360 		return (EINVAL);
361 
362 	bus_p->bus_soft_state = PCI_SOFT_STATE_CLOSED;
363 
364 	return (0);
365 }
366 
367 /* ARGSUSED */
368 int
369 pcie_ioctl(dev_info_t *dip, dev_t dev, int cmd, intptr_t arg, int mode,
370     cred_t *credp, int *rvalp)
371 {
372 	struct devctl_iocdata	*dcp;
373 	uint_t			bus_state;
374 	int			rv = DDI_SUCCESS;
375 
376 	/*
377 	 * We can use the generic implementation for devctl ioctl
378 	 */
379 	switch (cmd) {
380 	case DEVCTL_DEVICE_GETSTATE:
381 	case DEVCTL_DEVICE_ONLINE:
382 	case DEVCTL_DEVICE_OFFLINE:
383 	case DEVCTL_BUS_GETSTATE:
384 		return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
385 	default:
386 		break;
387 	}
388 
389 	/*
390 	 * read devctl ioctl data
391 	 */
392 	if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
393 		return (EFAULT);
394 
395 	switch (cmd) {
396 	case DEVCTL_BUS_QUIESCE:
397 		if (ndi_get_bus_state(dip, &bus_state) == NDI_SUCCESS)
398 			if (bus_state == BUS_QUIESCED)
399 				break;
400 		(void) ndi_set_bus_state(dip, BUS_QUIESCED);
401 		break;
402 	case DEVCTL_BUS_UNQUIESCE:
403 		if (ndi_get_bus_state(dip, &bus_state) == NDI_SUCCESS)
404 			if (bus_state == BUS_ACTIVE)
405 				break;
406 		(void) ndi_set_bus_state(dip, BUS_ACTIVE);
407 		break;
408 	case DEVCTL_BUS_RESET:
409 	case DEVCTL_BUS_RESETALL:
410 	case DEVCTL_DEVICE_RESET:
411 		rv = ENOTSUP;
412 		break;
413 	default:
414 		rv = ENOTTY;
415 	}
416 
417 	ndi_dc_freehdl(dcp);
418 	return (rv);
419 }
420 
421 /* ARGSUSED */
422 int
423 pcie_prop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op,
424     int flags, char *name, caddr_t valuep, int *lengthp)
425 {
426 	if (dev == DDI_DEV_T_ANY)
427 		goto skip;
428 
429 	if (PCIE_IS_HOTPLUG_CAPABLE(dip) &&
430 	    strcmp(name, "pci-occupant") == 0) {
431 		int	pci_dev = PCI_MINOR_NUM_TO_PCI_DEVNUM(getminor(dev));
432 
433 		pcie_hp_create_occupant_props(dip, dev, pci_dev);
434 	}
435 
436 skip:
437 	return (ddi_prop_op(dev, dip, prop_op, flags, name, valuep, lengthp));
438 }
439 
440 int
441 pcie_init_cfghdl(dev_info_t *cdip)
442 {
443 	pcie_bus_t		*bus_p;
444 	ddi_acc_handle_t	eh = NULL;
445 
446 	bus_p = PCIE_DIP2BUS(cdip);
447 	if (bus_p == NULL)
448 		return (DDI_FAILURE);
449 
450 	/* Create an config access special to error handling */
451 	if (pci_config_setup(cdip, &eh) != DDI_SUCCESS) {
452 		cmn_err(CE_WARN, "Cannot setup config access"
453 		    " for BDF 0x%x\n", bus_p->bus_bdf);
454 		return (DDI_FAILURE);
455 	}
456 
457 	bus_p->bus_cfg_hdl = eh;
458 	return (DDI_SUCCESS);
459 }
460 
461 void
462 pcie_fini_cfghdl(dev_info_t *cdip)
463 {
464 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(cdip);
465 
466 	pci_config_teardown(&bus_p->bus_cfg_hdl);
467 }
468 
469 /*
470  * PCI-Express child device initialization.
471  * This function enables generic pci-express interrupts and error
472  * handling.
473  *
474  * @param pdip		root dip (root nexus's dip)
475  * @param cdip		child's dip (device's dip)
476  * @return		DDI_SUCCESS or DDI_FAILURE
477  */
478 /* ARGSUSED */
479 int
480 pcie_initchild(dev_info_t *cdip)
481 {
482 	uint16_t		tmp16, reg16;
483 	pcie_bus_t		*bus_p;
484 	uint32_t		devid, venid;
485 
486 	bus_p = PCIE_DIP2BUS(cdip);
487 	if (bus_p == NULL) {
488 		PCIE_DBG("%s: BUS not found.\n",
489 		    ddi_driver_name(cdip));
490 
491 		return (DDI_FAILURE);
492 	}
493 
494 	if (pcie_init_cfghdl(cdip) != DDI_SUCCESS)
495 		return (DDI_FAILURE);
496 
497 	/*
498 	 * Update pcie_bus_t with real Vendor Id Device Id.
499 	 *
500 	 * For assigned devices in IOV environment, the OBP will return
501 	 * faked device id/vendor id on configration read and for both
502 	 * properties in root domain. translate_devid() function will
503 	 * update the properties with real device-id/vendor-id on such
504 	 * platforms, so that we can utilize the properties here to get
505 	 * real device-id/vendor-id and overwrite the faked ids.
506 	 *
507 	 * For unassigned devices or devices in non-IOV environment, the
508 	 * operation below won't make a difference.
509 	 *
510 	 * The IOV implementation only supports assignment of PCIE
511 	 * endpoint devices. Devices under pci-pci bridges don't need
512 	 * operation like this.
513 	 */
514 	devid = ddi_prop_get_int(DDI_DEV_T_ANY, cdip, DDI_PROP_DONTPASS,
515 	    "device-id", -1);
516 	venid = ddi_prop_get_int(DDI_DEV_T_ANY, cdip, DDI_PROP_DONTPASS,
517 	    "vendor-id", -1);
518 	bus_p->bus_dev_ven_id = (devid << 16) | (venid & 0xffff);
519 
520 	/* Clear the device's status register */
521 	reg16 = PCIE_GET(16, bus_p, PCI_CONF_STAT);
522 	PCIE_PUT(16, bus_p, PCI_CONF_STAT, reg16);
523 
524 	/* Setup the device's command register */
525 	reg16 = PCIE_GET(16, bus_p, PCI_CONF_COMM);
526 	tmp16 = (reg16 & pcie_command_default_fw) | pcie_command_default;
527 
528 #if defined(__i386) || defined(__amd64)
529 	boolean_t empty_io_range = B_FALSE;
530 	boolean_t empty_mem_range = B_FALSE;
531 	/*
532 	 * Check for empty IO and Mem ranges on bridges. If so disable IO/Mem
533 	 * access as it can cause a hang if enabled.
534 	 */
535 	pcie_check_io_mem_range(bus_p->bus_cfg_hdl, &empty_io_range,
536 	    &empty_mem_range);
537 	if ((empty_io_range == B_TRUE) &&
538 	    (pcie_command_default & PCI_COMM_IO)) {
539 		tmp16 &= ~PCI_COMM_IO;
540 		PCIE_DBG("No I/O range found for %s, bdf 0x%x\n",
541 		    ddi_driver_name(cdip), bus_p->bus_bdf);
542 	}
543 	if ((empty_mem_range == B_TRUE) &&
544 	    (pcie_command_default & PCI_COMM_MAE)) {
545 		tmp16 &= ~PCI_COMM_MAE;
546 		PCIE_DBG("No Mem range found for %s, bdf 0x%x\n",
547 		    ddi_driver_name(cdip), bus_p->bus_bdf);
548 	}
549 #endif /* defined(__i386) || defined(__amd64) */
550 
551 	if (pcie_serr_disable_flag && PCIE_IS_PCIE(bus_p))
552 		tmp16 &= ~PCI_COMM_SERR_ENABLE;
553 
554 	PCIE_PUT(16, bus_p, PCI_CONF_COMM, tmp16);
555 	PCIE_DBG_CFG(cdip, bus_p, "COMMAND", 16, PCI_CONF_COMM, reg16);
556 
557 	/*
558 	 * If the device has a bus control register then program it
559 	 * based on the settings in the command register.
560 	 */
561 	if (PCIE_IS_BDG(bus_p)) {
562 		/* Clear the device's secondary status register */
563 		reg16 = PCIE_GET(16, bus_p, PCI_BCNF_SEC_STATUS);
564 		PCIE_PUT(16, bus_p, PCI_BCNF_SEC_STATUS, reg16);
565 
566 		/* Setup the device's secondary command register */
567 		reg16 = PCIE_GET(16, bus_p, PCI_BCNF_BCNTRL);
568 		tmp16 = (reg16 & pcie_bdg_command_default_fw);
569 
570 		tmp16 |= PCI_BCNF_BCNTRL_SERR_ENABLE;
571 		/*
572 		 * Workaround for this Nvidia bridge. Don't enable the SERR
573 		 * enable bit in the bridge control register as it could lead to
574 		 * bogus NMIs.
575 		 */
576 		if (bus_p->bus_dev_ven_id == 0x037010DE)
577 			tmp16 &= ~PCI_BCNF_BCNTRL_SERR_ENABLE;
578 
579 		if (pcie_command_default & PCI_COMM_PARITY_DETECT)
580 			tmp16 |= PCI_BCNF_BCNTRL_PARITY_ENABLE;
581 
582 		/*
583 		 * Enable Master Abort Mode only if URs have not been masked.
584 		 * For PCI and PCIe-PCI bridges, enabling this bit causes a
585 		 * Master Aborts/UR to be forwarded as a UR/TA or SERR.  If this
586 		 * bit is masked, posted requests are dropped and non-posted
587 		 * requests are returned with -1.
588 		 */
589 		if (pcie_aer_uce_mask & PCIE_AER_UCE_UR)
590 			tmp16 &= ~PCI_BCNF_BCNTRL_MAST_AB_MODE;
591 		else
592 			tmp16 |= PCI_BCNF_BCNTRL_MAST_AB_MODE;
593 		PCIE_PUT(16, bus_p, PCI_BCNF_BCNTRL, tmp16);
594 		PCIE_DBG_CFG(cdip, bus_p, "SEC CMD", 16, PCI_BCNF_BCNTRL,
595 		    reg16);
596 	}
597 
598 	if (PCIE_IS_PCIE(bus_p)) {
599 		/* Setup PCIe device control register */
600 		reg16 = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL);
601 		/* note: MPS/MRRS are initialized in pcie_initchild_mps() */
602 		tmp16 = (reg16 & (PCIE_DEVCTL_MAX_READ_REQ_MASK |
603 		    PCIE_DEVCTL_MAX_PAYLOAD_MASK)) |
604 		    (pcie_devctl_default & ~(PCIE_DEVCTL_MAX_READ_REQ_MASK |
605 		    PCIE_DEVCTL_MAX_PAYLOAD_MASK));
606 		PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL, tmp16);
607 		PCIE_DBG_CAP(cdip, bus_p, "DEVCTL", 16, PCIE_DEVCTL, reg16);
608 
609 		/* Enable PCIe errors */
610 		pcie_enable_errors(cdip);
611 	}
612 
613 	bus_p->bus_ari = B_FALSE;
614 	if ((pcie_ari_is_enabled(ddi_get_parent(cdip))
615 	    == PCIE_ARI_FORW_ENABLED) && (pcie_ari_device(cdip)
616 	    == PCIE_ARI_DEVICE)) {
617 		bus_p->bus_ari = B_TRUE;
618 	}
619 
620 	if (pcie_initchild_mps(cdip) == DDI_FAILURE) {
621 		pcie_fini_cfghdl(cdip);
622 		return (DDI_FAILURE);
623 	}
624 
625 	return (DDI_SUCCESS);
626 }
627 
628 static void
629 pcie_init_pfd(dev_info_t *dip)
630 {
631 	pf_data_t	*pfd_p = PCIE_ZALLOC(pf_data_t);
632 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
633 
634 	PCIE_DIP2PFD(dip) = pfd_p;
635 
636 	pfd_p->pe_bus_p = bus_p;
637 	pfd_p->pe_severity_flags = 0;
638 	pfd_p->pe_orig_severity_flags = 0;
639 	pfd_p->pe_lock = B_FALSE;
640 	pfd_p->pe_valid = B_FALSE;
641 
642 	/* Allocate the root fault struct for both RC and RP */
643 	if (PCIE_IS_ROOT(bus_p)) {
644 		PCIE_ROOT_FAULT(pfd_p) = PCIE_ZALLOC(pf_root_fault_t);
645 		PCIE_ROOT_FAULT(pfd_p)->scan_bdf = PCIE_INVALID_BDF;
646 		PCIE_ROOT_EH_SRC(pfd_p) = PCIE_ZALLOC(pf_root_eh_src_t);
647 	}
648 
649 	PCI_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pci_err_regs_t);
650 	PFD_AFFECTED_DEV(pfd_p) = PCIE_ZALLOC(pf_affected_dev_t);
651 	PFD_AFFECTED_DEV(pfd_p)->pe_affected_bdf = PCIE_INVALID_BDF;
652 
653 	if (PCIE_IS_BDG(bus_p))
654 		PCI_BDG_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pci_bdg_err_regs_t);
655 
656 	if (PCIE_IS_PCIE(bus_p)) {
657 		PCIE_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_err_regs_t);
658 
659 		if (PCIE_IS_RP(bus_p))
660 			PCIE_RP_REG(pfd_p) =
661 			    PCIE_ZALLOC(pf_pcie_rp_err_regs_t);
662 
663 		PCIE_ADV_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_adv_err_regs_t);
664 		PCIE_ADV_REG(pfd_p)->pcie_ue_tgt_bdf = PCIE_INVALID_BDF;
665 
666 		if (PCIE_IS_RP(bus_p)) {
667 			PCIE_ADV_RP_REG(pfd_p) =
668 			    PCIE_ZALLOC(pf_pcie_adv_rp_err_regs_t);
669 			PCIE_ADV_RP_REG(pfd_p)->pcie_rp_ce_src_id =
670 			    PCIE_INVALID_BDF;
671 			PCIE_ADV_RP_REG(pfd_p)->pcie_rp_ue_src_id =
672 			    PCIE_INVALID_BDF;
673 		} else if (PCIE_IS_PCIE_BDG(bus_p)) {
674 			PCIE_ADV_BDG_REG(pfd_p) =
675 			    PCIE_ZALLOC(pf_pcie_adv_bdg_err_regs_t);
676 			PCIE_ADV_BDG_REG(pfd_p)->pcie_sue_tgt_bdf =
677 			    PCIE_INVALID_BDF;
678 		}
679 
680 		if (PCIE_IS_PCIE_BDG(bus_p) && PCIE_IS_PCIX(bus_p)) {
681 			PCIX_BDG_ERR_REG(pfd_p) =
682 			    PCIE_ZALLOC(pf_pcix_bdg_err_regs_t);
683 
684 			if (PCIX_ECC_VERSION_CHECK(bus_p)) {
685 				PCIX_BDG_ECC_REG(pfd_p, 0) =
686 				    PCIE_ZALLOC(pf_pcix_ecc_regs_t);
687 				PCIX_BDG_ECC_REG(pfd_p, 1) =
688 				    PCIE_ZALLOC(pf_pcix_ecc_regs_t);
689 			}
690 		}
691 	} else if (PCIE_IS_PCIX(bus_p)) {
692 		if (PCIE_IS_BDG(bus_p)) {
693 			PCIX_BDG_ERR_REG(pfd_p) =
694 			    PCIE_ZALLOC(pf_pcix_bdg_err_regs_t);
695 
696 			if (PCIX_ECC_VERSION_CHECK(bus_p)) {
697 				PCIX_BDG_ECC_REG(pfd_p, 0) =
698 				    PCIE_ZALLOC(pf_pcix_ecc_regs_t);
699 				PCIX_BDG_ECC_REG(pfd_p, 1) =
700 				    PCIE_ZALLOC(pf_pcix_ecc_regs_t);
701 			}
702 		} else {
703 			PCIX_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pcix_err_regs_t);
704 
705 			if (PCIX_ECC_VERSION_CHECK(bus_p))
706 				PCIX_ECC_REG(pfd_p) =
707 				    PCIE_ZALLOC(pf_pcix_ecc_regs_t);
708 		}
709 	}
710 }
711 
712 static void
713 pcie_fini_pfd(dev_info_t *dip)
714 {
715 	pf_data_t	*pfd_p = PCIE_DIP2PFD(dip);
716 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
717 
718 	if (PCIE_IS_PCIE(bus_p)) {
719 		if (PCIE_IS_PCIE_BDG(bus_p) && PCIE_IS_PCIX(bus_p)) {
720 			if (PCIX_ECC_VERSION_CHECK(bus_p)) {
721 				kmem_free(PCIX_BDG_ECC_REG(pfd_p, 0),
722 				    sizeof (pf_pcix_ecc_regs_t));
723 				kmem_free(PCIX_BDG_ECC_REG(pfd_p, 1),
724 				    sizeof (pf_pcix_ecc_regs_t));
725 			}
726 
727 			kmem_free(PCIX_BDG_ERR_REG(pfd_p),
728 			    sizeof (pf_pcix_bdg_err_regs_t));
729 		}
730 
731 		if (PCIE_IS_RP(bus_p))
732 			kmem_free(PCIE_ADV_RP_REG(pfd_p),
733 			    sizeof (pf_pcie_adv_rp_err_regs_t));
734 		else if (PCIE_IS_PCIE_BDG(bus_p))
735 			kmem_free(PCIE_ADV_BDG_REG(pfd_p),
736 			    sizeof (pf_pcie_adv_bdg_err_regs_t));
737 
738 		kmem_free(PCIE_ADV_REG(pfd_p),
739 		    sizeof (pf_pcie_adv_err_regs_t));
740 
741 		if (PCIE_IS_RP(bus_p))
742 			kmem_free(PCIE_RP_REG(pfd_p),
743 			    sizeof (pf_pcie_rp_err_regs_t));
744 
745 		kmem_free(PCIE_ERR_REG(pfd_p), sizeof (pf_pcie_err_regs_t));
746 	} else if (PCIE_IS_PCIX(bus_p)) {
747 		if (PCIE_IS_BDG(bus_p)) {
748 			if (PCIX_ECC_VERSION_CHECK(bus_p)) {
749 				kmem_free(PCIX_BDG_ECC_REG(pfd_p, 0),
750 				    sizeof (pf_pcix_ecc_regs_t));
751 				kmem_free(PCIX_BDG_ECC_REG(pfd_p, 1),
752 				    sizeof (pf_pcix_ecc_regs_t));
753 			}
754 
755 			kmem_free(PCIX_BDG_ERR_REG(pfd_p),
756 			    sizeof (pf_pcix_bdg_err_regs_t));
757 		} else {
758 			if (PCIX_ECC_VERSION_CHECK(bus_p))
759 				kmem_free(PCIX_ECC_REG(pfd_p),
760 				    sizeof (pf_pcix_ecc_regs_t));
761 
762 			kmem_free(PCIX_ERR_REG(pfd_p),
763 			    sizeof (pf_pcix_err_regs_t));
764 		}
765 	}
766 
767 	if (PCIE_IS_BDG(bus_p))
768 		kmem_free(PCI_BDG_ERR_REG(pfd_p),
769 		    sizeof (pf_pci_bdg_err_regs_t));
770 
771 	kmem_free(PFD_AFFECTED_DEV(pfd_p), sizeof (pf_affected_dev_t));
772 	kmem_free(PCI_ERR_REG(pfd_p), sizeof (pf_pci_err_regs_t));
773 
774 	if (PCIE_IS_ROOT(bus_p)) {
775 		kmem_free(PCIE_ROOT_FAULT(pfd_p), sizeof (pf_root_fault_t));
776 		kmem_free(PCIE_ROOT_EH_SRC(pfd_p), sizeof (pf_root_eh_src_t));
777 	}
778 
779 	kmem_free(PCIE_DIP2PFD(dip), sizeof (pf_data_t));
780 
781 	PCIE_DIP2PFD(dip) = NULL;
782 }
783 
784 
785 /*
786  * Special functions to allocate pf_data_t's for PCIe root complexes.
787  * Note: Root Complex not Root Port
788  */
789 void
790 pcie_rc_init_pfd(dev_info_t *dip, pf_data_t *pfd_p)
791 {
792 	pfd_p->pe_bus_p = PCIE_DIP2DOWNBUS(dip);
793 	pfd_p->pe_severity_flags = 0;
794 	pfd_p->pe_orig_severity_flags = 0;
795 	pfd_p->pe_lock = B_FALSE;
796 	pfd_p->pe_valid = B_FALSE;
797 
798 	PCIE_ROOT_FAULT(pfd_p) = PCIE_ZALLOC(pf_root_fault_t);
799 	PCIE_ROOT_FAULT(pfd_p)->scan_bdf = PCIE_INVALID_BDF;
800 	PCIE_ROOT_EH_SRC(pfd_p) = PCIE_ZALLOC(pf_root_eh_src_t);
801 	PCI_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pci_err_regs_t);
802 	PFD_AFFECTED_DEV(pfd_p) = PCIE_ZALLOC(pf_affected_dev_t);
803 	PFD_AFFECTED_DEV(pfd_p)->pe_affected_bdf = PCIE_INVALID_BDF;
804 	PCI_BDG_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pci_bdg_err_regs_t);
805 	PCIE_ERR_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_err_regs_t);
806 	PCIE_RP_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_rp_err_regs_t);
807 	PCIE_ADV_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_adv_err_regs_t);
808 	PCIE_ADV_RP_REG(pfd_p) = PCIE_ZALLOC(pf_pcie_adv_rp_err_regs_t);
809 	PCIE_ADV_RP_REG(pfd_p)->pcie_rp_ce_src_id = PCIE_INVALID_BDF;
810 	PCIE_ADV_RP_REG(pfd_p)->pcie_rp_ue_src_id = PCIE_INVALID_BDF;
811 
812 	PCIE_ADV_REG(pfd_p)->pcie_ue_sev = pcie_aer_uce_severity;
813 }
814 
815 void
816 pcie_rc_fini_pfd(pf_data_t *pfd_p)
817 {
818 	kmem_free(PCIE_ADV_RP_REG(pfd_p), sizeof (pf_pcie_adv_rp_err_regs_t));
819 	kmem_free(PCIE_ADV_REG(pfd_p), sizeof (pf_pcie_adv_err_regs_t));
820 	kmem_free(PCIE_RP_REG(pfd_p), sizeof (pf_pcie_rp_err_regs_t));
821 	kmem_free(PCIE_ERR_REG(pfd_p), sizeof (pf_pcie_err_regs_t));
822 	kmem_free(PCI_BDG_ERR_REG(pfd_p), sizeof (pf_pci_bdg_err_regs_t));
823 	kmem_free(PFD_AFFECTED_DEV(pfd_p), sizeof (pf_affected_dev_t));
824 	kmem_free(PCI_ERR_REG(pfd_p), sizeof (pf_pci_err_regs_t));
825 	kmem_free(PCIE_ROOT_FAULT(pfd_p), sizeof (pf_root_fault_t));
826 	kmem_free(PCIE_ROOT_EH_SRC(pfd_p), sizeof (pf_root_eh_src_t));
827 }
828 
829 /*
830  * init pcie_bus_t for root complex
831  *
832  * Only a few of the fields in bus_t is valid for root complex.
833  * The fields that are bracketed are initialized in this routine:
834  *
835  * dev_info_t *		<bus_dip>
836  * dev_info_t *		bus_rp_dip
837  * ddi_acc_handle_t	bus_cfg_hdl
838  * uint_t		<bus_fm_flags>
839  * pcie_req_id_t	bus_bdf
840  * pcie_req_id_t	bus_rp_bdf
841  * uint32_t		bus_dev_ven_id
842  * uint8_t		bus_rev_id
843  * uint8_t		<bus_hdr_type>
844  * uint16_t		<bus_dev_type>
845  * uint8_t		bus_bdg_secbus
846  * uint16_t		bus_pcie_off
847  * uint16_t		<bus_aer_off>
848  * uint16_t		bus_pcix_off
849  * uint16_t		bus_ecc_ver
850  * pci_bus_range_t	bus_bus_range
851  * ppb_ranges_t	*	bus_addr_ranges
852  * int			bus_addr_entries
853  * pci_regspec_t *	bus_assigned_addr
854  * int			bus_assigned_entries
855  * pf_data_t *		bus_pfd
856  * pcie_domain_t *	<bus_dom>
857  * int			bus_mps
858  * uint64_t		bus_cfgacc_base
859  * void	*		bus_plat_private
860  */
861 void
862 pcie_rc_init_bus(dev_info_t *dip)
863 {
864 	pcie_bus_t *bus_p;
865 
866 	bus_p = (pcie_bus_t *)kmem_zalloc(sizeof (pcie_bus_t), KM_SLEEP);
867 	bus_p->bus_dip = dip;
868 	bus_p->bus_dev_type = PCIE_PCIECAP_DEV_TYPE_RC_PSEUDO;
869 	bus_p->bus_hdr_type = PCI_HEADER_ONE;
870 
871 	/* Fake that there are AER logs */
872 	bus_p->bus_aer_off = (uint16_t)-1;
873 
874 	/* Needed only for handle lookup */
875 	bus_p->bus_fm_flags |= PF_FM_READY;
876 
877 	ndi_set_bus_private(dip, B_FALSE, DEVI_PORT_TYPE_PCI, bus_p);
878 
879 	PCIE_BUS2DOM(bus_p) = PCIE_ZALLOC(pcie_domain_t);
880 }
881 
882 void
883 pcie_rc_fini_bus(dev_info_t *dip)
884 {
885 	pcie_bus_t *bus_p = PCIE_DIP2DOWNBUS(dip);
886 	ndi_set_bus_private(dip, B_FALSE, NULL, NULL);
887 	kmem_free(PCIE_BUS2DOM(bus_p), sizeof (pcie_domain_t));
888 	kmem_free(bus_p, sizeof (pcie_bus_t));
889 }
890 
891 /*
892  * partially init pcie_bus_t for device (dip,bdf) for accessing pci
893  * config space
894  *
895  * This routine is invoked during boot, either after creating a devinfo node
896  * (x86 case) or during px driver attach (sparc case); it is also invoked
897  * in hotplug context after a devinfo node is created.
898  *
899  * The fields that are bracketed are initialized if flag PCIE_BUS_INITIAL
900  * is set:
901  *
902  * dev_info_t *		<bus_dip>
903  * dev_info_t *		<bus_rp_dip>
904  * ddi_acc_handle_t	bus_cfg_hdl
905  * uint_t		bus_fm_flags
906  * pcie_req_id_t	<bus_bdf>
907  * pcie_req_id_t	<bus_rp_bdf>
908  * uint32_t		<bus_dev_ven_id>
909  * uint8_t		<bus_rev_id>
910  * uint8_t		<bus_hdr_type>
911  * uint16_t		<bus_dev_type>
912  * uint8_t		<bus_bdg_secbus
913  * uint16_t		<bus_pcie_off>
914  * uint16_t		<bus_aer_off>
915  * uint16_t		<bus_pcix_off>
916  * uint16_t		<bus_ecc_ver>
917  * pci_bus_range_t	bus_bus_range
918  * ppb_ranges_t	*	bus_addr_ranges
919  * int			bus_addr_entries
920  * pci_regspec_t *	bus_assigned_addr
921  * int			bus_assigned_entries
922  * pf_data_t *		bus_pfd
923  * pcie_domain_t *	bus_dom
924  * int			bus_mps
925  * uint64_t		bus_cfgacc_base
926  * void	*		bus_plat_private
927  *
928  * The fields that are bracketed are initialized if flag PCIE_BUS_FINAL
929  * is set:
930  *
931  * dev_info_t *		bus_dip
932  * dev_info_t *		bus_rp_dip
933  * ddi_acc_handle_t	bus_cfg_hdl
934  * uint_t		bus_fm_flags
935  * pcie_req_id_t	bus_bdf
936  * pcie_req_id_t	bus_rp_bdf
937  * uint32_t		bus_dev_ven_id
938  * uint8_t		bus_rev_id
939  * uint8_t		bus_hdr_type
940  * uint16_t		bus_dev_type
941  * uint8_t		<bus_bdg_secbus>
942  * uint16_t		bus_pcie_off
943  * uint16_t		bus_aer_off
944  * uint16_t		bus_pcix_off
945  * uint16_t		bus_ecc_ver
946  * pci_bus_range_t	<bus_bus_range>
947  * ppb_ranges_t	*	<bus_addr_ranges>
948  * int			<bus_addr_entries>
949  * pci_regspec_t *	<bus_assigned_addr>
950  * int			<bus_assigned_entries>
951  * pf_data_t *		<bus_pfd>
952  * pcie_domain_t *	bus_dom
953  * int			bus_mps
954  * uint64_t		bus_cfgacc_base
955  * void	*		<bus_plat_private>
956  */
957 
958 pcie_bus_t *
959 pcie_init_bus(dev_info_t *dip, pcie_req_id_t bdf, uint8_t flags)
960 {
961 	uint16_t	status, base, baseptr, num_cap;
962 	uint32_t	capid;
963 	int		range_size;
964 	pcie_bus_t	*bus_p;
965 	dev_info_t	*rcdip;
966 	dev_info_t	*pdip;
967 	const char	*errstr = NULL;
968 
969 	if (!(flags & PCIE_BUS_INITIAL))
970 		goto initial_done;
971 
972 	bus_p = kmem_zalloc(sizeof (pcie_bus_t), KM_SLEEP);
973 
974 	bus_p->bus_dip = dip;
975 	bus_p->bus_bdf = bdf;
976 
977 	rcdip = pcie_get_rc_dip(dip);
978 	ASSERT(rcdip != NULL);
979 
980 	/* Save the Vendor ID, Device ID and revision ID */
981 	bus_p->bus_dev_ven_id = pci_cfgacc_get32(rcdip, bdf, PCI_CONF_VENID);
982 	bus_p->bus_rev_id = pci_cfgacc_get8(rcdip, bdf, PCI_CONF_REVID);
983 	/* Save the Header Type */
984 	bus_p->bus_hdr_type = pci_cfgacc_get8(rcdip, bdf, PCI_CONF_HEADER);
985 	bus_p->bus_hdr_type &= PCI_HEADER_TYPE_M;
986 
987 	/*
988 	 * Figure out the device type and all the relavant capability offsets
989 	 */
990 	/* set default value */
991 	bus_p->bus_dev_type = PCIE_PCIECAP_DEV_TYPE_PCI_PSEUDO;
992 
993 	status = pci_cfgacc_get16(rcdip, bdf, PCI_CONF_STAT);
994 	if (status == PCI_CAP_EINVAL16 || !(status & PCI_STAT_CAP))
995 		goto caps_done; /* capability not supported */
996 
997 	/* Relevant conventional capabilities first */
998 
999 	/* Conventional caps: PCI_CAP_ID_PCI_E, PCI_CAP_ID_PCIX */
1000 	num_cap = 2;
1001 
1002 	switch (bus_p->bus_hdr_type) {
1003 	case PCI_HEADER_ZERO:
1004 		baseptr = PCI_CONF_CAP_PTR;
1005 		break;
1006 	case PCI_HEADER_PPB:
1007 		baseptr = PCI_BCNF_CAP_PTR;
1008 		break;
1009 	case PCI_HEADER_CARDBUS:
1010 		baseptr = PCI_CBUS_CAP_PTR;
1011 		break;
1012 	default:
1013 		cmn_err(CE_WARN, "%s: unexpected pci header type:%x",
1014 		    __func__, bus_p->bus_hdr_type);
1015 		goto caps_done;
1016 	}
1017 
1018 	base = baseptr;
1019 	for (base = pci_cfgacc_get8(rcdip, bdf, base); base && num_cap;
1020 	    base = pci_cfgacc_get8(rcdip, bdf, base + PCI_CAP_NEXT_PTR)) {
1021 		capid = pci_cfgacc_get8(rcdip, bdf, base);
1022 		switch (capid) {
1023 		case PCI_CAP_ID_PCI_E:
1024 			bus_p->bus_pcie_off = base;
1025 			bus_p->bus_dev_type = pci_cfgacc_get16(rcdip, bdf,
1026 			    base + PCIE_PCIECAP) & PCIE_PCIECAP_DEV_TYPE_MASK;
1027 
1028 			/* Check and save PCIe hotplug capability information */
1029 			if ((PCIE_IS_RP(bus_p) || PCIE_IS_SWD(bus_p)) &&
1030 			    (pci_cfgacc_get16(rcdip, bdf, base + PCIE_PCIECAP)
1031 			    & PCIE_PCIECAP_SLOT_IMPL) &&
1032 			    (pci_cfgacc_get32(rcdip, bdf, base + PCIE_SLOTCAP)
1033 			    & PCIE_SLOTCAP_HP_CAPABLE))
1034 				bus_p->bus_hp_sup_modes |= PCIE_NATIVE_HP_MODE;
1035 
1036 			num_cap--;
1037 			break;
1038 		case PCI_CAP_ID_PCIX:
1039 			bus_p->bus_pcix_off = base;
1040 			if (PCIE_IS_BDG(bus_p))
1041 				bus_p->bus_ecc_ver =
1042 				    pci_cfgacc_get16(rcdip, bdf, base +
1043 				    PCI_PCIX_SEC_STATUS) & PCI_PCIX_VER_MASK;
1044 			else
1045 				bus_p->bus_ecc_ver =
1046 				    pci_cfgacc_get16(rcdip, bdf, base +
1047 				    PCI_PCIX_COMMAND) & PCI_PCIX_VER_MASK;
1048 			num_cap--;
1049 			break;
1050 		default:
1051 			break;
1052 		}
1053 	}
1054 
1055 	/* Check and save PCI hotplug (SHPC) capability information */
1056 	if (PCIE_IS_BDG(bus_p)) {
1057 		base = baseptr;
1058 		for (base = pci_cfgacc_get8(rcdip, bdf, base);
1059 		    base; base = pci_cfgacc_get8(rcdip, bdf,
1060 		    base + PCI_CAP_NEXT_PTR)) {
1061 			capid = pci_cfgacc_get8(rcdip, bdf, base);
1062 			if (capid == PCI_CAP_ID_PCI_HOTPLUG) {
1063 				bus_p->bus_pci_hp_off = base;
1064 				bus_p->bus_hp_sup_modes |= PCIE_PCI_HP_MODE;
1065 				break;
1066 			}
1067 		}
1068 	}
1069 
1070 	/* Then, relevant extended capabilities */
1071 
1072 	if (!PCIE_IS_PCIE(bus_p))
1073 		goto caps_done;
1074 
1075 	/* Extended caps: PCIE_EXT_CAP_ID_AER */
1076 	for (base = PCIE_EXT_CAP; base; base = (capid >>
1077 	    PCIE_EXT_CAP_NEXT_PTR_SHIFT) & PCIE_EXT_CAP_NEXT_PTR_MASK) {
1078 		capid = pci_cfgacc_get32(rcdip, bdf, base);
1079 		if (capid == PCI_CAP_EINVAL32)
1080 			break;
1081 		if (((capid >> PCIE_EXT_CAP_ID_SHIFT) & PCIE_EXT_CAP_ID_MASK)
1082 		    == PCIE_EXT_CAP_ID_AER) {
1083 			bus_p->bus_aer_off = base;
1084 			break;
1085 		}
1086 	}
1087 
1088 caps_done:
1089 	/* save RP dip and RP bdf */
1090 	if (PCIE_IS_RP(bus_p)) {
1091 		bus_p->bus_rp_dip = dip;
1092 		bus_p->bus_rp_bdf = bus_p->bus_bdf;
1093 	} else {
1094 		for (pdip = ddi_get_parent(dip); pdip;
1095 		    pdip = ddi_get_parent(pdip)) {
1096 			pcie_bus_t *parent_bus_p = PCIE_DIP2BUS(pdip);
1097 
1098 			/*
1099 			 * If RP dip and RP bdf in parent's bus_t have
1100 			 * been initialized, simply use these instead of
1101 			 * continuing up to the RC.
1102 			 */
1103 			if (parent_bus_p->bus_rp_dip != NULL) {
1104 				bus_p->bus_rp_dip = parent_bus_p->bus_rp_dip;
1105 				bus_p->bus_rp_bdf = parent_bus_p->bus_rp_bdf;
1106 				break;
1107 			}
1108 
1109 			/*
1110 			 * When debugging be aware that some NVIDIA x86
1111 			 * architectures have 2 nodes for each RP, One at Bus
1112 			 * 0x0 and one at Bus 0x80.  The requester is from Bus
1113 			 * 0x80
1114 			 */
1115 			if (PCIE_IS_ROOT(parent_bus_p)) {
1116 				bus_p->bus_rp_dip = pdip;
1117 				bus_p->bus_rp_bdf = parent_bus_p->bus_bdf;
1118 				break;
1119 			}
1120 		}
1121 	}
1122 
1123 	bus_p->bus_soft_state = PCI_SOFT_STATE_CLOSED;
1124 	bus_p->bus_fm_flags = 0;
1125 	bus_p->bus_mps = 0;
1126 
1127 	ndi_set_bus_private(dip, B_TRUE, DEVI_PORT_TYPE_PCI, (void *)bus_p);
1128 
1129 	if (PCIE_IS_HOTPLUG_CAPABLE(dip))
1130 		(void) ndi_prop_create_boolean(DDI_DEV_T_NONE, dip,
1131 		    "hotplug-capable");
1132 
1133 initial_done:
1134 	if (!(flags & PCIE_BUS_FINAL))
1135 		goto final_done;
1136 
1137 	/* already initialized? */
1138 	bus_p = PCIE_DIP2BUS(dip);
1139 
1140 	/* Save the Range information if device is a switch/bridge */
1141 	if (PCIE_IS_BDG(bus_p)) {
1142 		/* get "bus_range" property */
1143 		range_size = sizeof (pci_bus_range_t);
1144 		if (ddi_getlongprop_buf(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1145 		    "bus-range", (caddr_t)&bus_p->bus_bus_range, &range_size)
1146 		    != DDI_PROP_SUCCESS) {
1147 			errstr = "Cannot find \"bus-range\" property";
1148 			cmn_err(CE_WARN,
1149 			    "PCIE init err info failed BDF 0x%x:%s\n",
1150 			    bus_p->bus_bdf, errstr);
1151 		}
1152 
1153 		/* get secondary bus number */
1154 		rcdip = pcie_get_rc_dip(dip);
1155 		ASSERT(rcdip != NULL);
1156 
1157 		bus_p->bus_bdg_secbus = pci_cfgacc_get8(rcdip,
1158 		    bus_p->bus_bdf, PCI_BCNF_SECBUS);
1159 
1160 		/* Get "ranges" property */
1161 		if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1162 		    "ranges", (caddr_t)&bus_p->bus_addr_ranges,
1163 		    &bus_p->bus_addr_entries) != DDI_PROP_SUCCESS)
1164 			bus_p->bus_addr_entries = 0;
1165 		bus_p->bus_addr_entries /= sizeof (ppb_ranges_t);
1166 	}
1167 
1168 	/* save "assigned-addresses" property array, ignore failues */
1169 	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1170 	    "assigned-addresses", (caddr_t)&bus_p->bus_assigned_addr,
1171 	    &bus_p->bus_assigned_entries) == DDI_PROP_SUCCESS)
1172 		bus_p->bus_assigned_entries /= sizeof (pci_regspec_t);
1173 	else
1174 		bus_p->bus_assigned_entries = 0;
1175 
1176 	pcie_init_pfd(dip);
1177 
1178 	pcie_init_plat(dip);
1179 
1180 final_done:
1181 
1182 	PCIE_DBG("Add %s(dip 0x%p, bdf 0x%x, secbus 0x%x)\n",
1183 	    ddi_driver_name(dip), (void *)dip, bus_p->bus_bdf,
1184 	    bus_p->bus_bdg_secbus);
1185 #ifdef DEBUG
1186 	pcie_print_bus(bus_p);
1187 #endif
1188 
1189 	return (bus_p);
1190 }
1191 
1192 /*
1193  * Invoked before destroying devinfo node, mostly during hotplug
1194  * operation to free pcie_bus_t data structure
1195  */
1196 /* ARGSUSED */
1197 void
1198 pcie_fini_bus(dev_info_t *dip, uint8_t flags)
1199 {
1200 	pcie_bus_t *bus_p = PCIE_DIP2UPBUS(dip);
1201 	ASSERT(bus_p);
1202 
1203 	if (flags & PCIE_BUS_INITIAL) {
1204 		pcie_fini_plat(dip);
1205 		pcie_fini_pfd(dip);
1206 
1207 		kmem_free(bus_p->bus_assigned_addr,
1208 		    (sizeof (pci_regspec_t) * bus_p->bus_assigned_entries));
1209 		kmem_free(bus_p->bus_addr_ranges,
1210 		    (sizeof (ppb_ranges_t) * bus_p->bus_addr_entries));
1211 		/* zero out the fields that have been destroyed */
1212 		bus_p->bus_assigned_addr = NULL;
1213 		bus_p->bus_addr_ranges = NULL;
1214 		bus_p->bus_assigned_entries = 0;
1215 		bus_p->bus_addr_entries = 0;
1216 	}
1217 
1218 	if (flags & PCIE_BUS_FINAL) {
1219 		if (PCIE_IS_HOTPLUG_CAPABLE(dip)) {
1220 			(void) ndi_prop_remove(DDI_DEV_T_NONE, dip,
1221 			    "hotplug-capable");
1222 		}
1223 
1224 		ndi_set_bus_private(dip, B_TRUE, NULL, NULL);
1225 		kmem_free(bus_p, sizeof (pcie_bus_t));
1226 	}
1227 }
1228 
1229 int
1230 pcie_postattach_child(dev_info_t *cdip)
1231 {
1232 	pcie_bus_t *bus_p = PCIE_DIP2BUS(cdip);
1233 
1234 	if (!bus_p)
1235 		return (DDI_FAILURE);
1236 
1237 	return (pcie_enable_ce(cdip));
1238 }
1239 
1240 /*
1241  * PCI-Express child device de-initialization.
1242  * This function disables generic pci-express interrupts and error
1243  * handling.
1244  */
1245 void
1246 pcie_uninitchild(dev_info_t *cdip)
1247 {
1248 	pcie_disable_errors(cdip);
1249 	pcie_fini_cfghdl(cdip);
1250 	pcie_fini_dom(cdip);
1251 }
1252 
1253 /*
1254  * find the root complex dip
1255  */
1256 dev_info_t *
1257 pcie_get_rc_dip(dev_info_t *dip)
1258 {
1259 	dev_info_t *rcdip;
1260 	pcie_bus_t *rc_bus_p;
1261 
1262 	for (rcdip = ddi_get_parent(dip); rcdip;
1263 	    rcdip = ddi_get_parent(rcdip)) {
1264 		rc_bus_p = PCIE_DIP2BUS(rcdip);
1265 		if (rc_bus_p && PCIE_IS_RC(rc_bus_p))
1266 			break;
1267 	}
1268 
1269 	return (rcdip);
1270 }
1271 
1272 static boolean_t
1273 pcie_is_pci_device(dev_info_t *dip)
1274 {
1275 	dev_info_t	*pdip;
1276 	char		*device_type;
1277 
1278 	pdip = ddi_get_parent(dip);
1279 	ASSERT(pdip);
1280 
1281 	if (ddi_prop_lookup_string(DDI_DEV_T_ANY, pdip, DDI_PROP_DONTPASS,
1282 	    "device_type", &device_type) != DDI_PROP_SUCCESS)
1283 		return (B_FALSE);
1284 
1285 	if (strcmp(device_type, "pciex") != 0 &&
1286 	    strcmp(device_type, "pci") != 0) {
1287 		ddi_prop_free(device_type);
1288 		return (B_FALSE);
1289 	}
1290 
1291 	ddi_prop_free(device_type);
1292 	return (B_TRUE);
1293 }
1294 
1295 typedef struct {
1296 	boolean_t	init;
1297 	uint8_t		flags;
1298 } pcie_bus_arg_t;
1299 
1300 /*ARGSUSED*/
1301 static int
1302 pcie_fab_do_init_fini(dev_info_t *dip, void *arg)
1303 {
1304 	pcie_req_id_t	bdf;
1305 	pcie_bus_arg_t	*bus_arg = (pcie_bus_arg_t *)arg;
1306 
1307 	if (!pcie_is_pci_device(dip))
1308 		goto out;
1309 
1310 	if (bus_arg->init) {
1311 		if (pcie_get_bdf_from_dip(dip, &bdf) != DDI_SUCCESS)
1312 			goto out;
1313 
1314 		(void) pcie_init_bus(dip, bdf, bus_arg->flags);
1315 	} else {
1316 		(void) pcie_fini_bus(dip, bus_arg->flags);
1317 	}
1318 
1319 	return (DDI_WALK_CONTINUE);
1320 
1321 out:
1322 	return (DDI_WALK_PRUNECHILD);
1323 }
1324 
1325 void
1326 pcie_fab_init_bus(dev_info_t *rcdip, uint8_t flags)
1327 {
1328 	int		circular_count;
1329 	dev_info_t	*dip = ddi_get_child(rcdip);
1330 	pcie_bus_arg_t	arg;
1331 
1332 	arg.init = B_TRUE;
1333 	arg.flags = flags;
1334 
1335 	ndi_devi_enter(rcdip, &circular_count);
1336 	ddi_walk_devs(dip, pcie_fab_do_init_fini, &arg);
1337 	ndi_devi_exit(rcdip, circular_count);
1338 }
1339 
1340 void
1341 pcie_fab_fini_bus(dev_info_t *rcdip, uint8_t flags)
1342 {
1343 	int		circular_count;
1344 	dev_info_t	*dip = ddi_get_child(rcdip);
1345 	pcie_bus_arg_t	arg;
1346 
1347 	arg.init = B_FALSE;
1348 	arg.flags = flags;
1349 
1350 	ndi_devi_enter(rcdip, &circular_count);
1351 	ddi_walk_devs(dip, pcie_fab_do_init_fini, &arg);
1352 	ndi_devi_exit(rcdip, circular_count);
1353 }
1354 
1355 void
1356 pcie_enable_errors(dev_info_t *dip)
1357 {
1358 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
1359 	uint16_t	reg16, tmp16;
1360 	uint32_t	reg32, tmp32;
1361 
1362 	ASSERT(bus_p);
1363 
1364 	/*
1365 	 * Clear any pending errors
1366 	 */
1367 	pcie_clear_errors(dip);
1368 
1369 	if (!PCIE_IS_PCIE(bus_p))
1370 		return;
1371 
1372 	/*
1373 	 * Enable Baseline Error Handling but leave CE reporting off (poweron
1374 	 * default).
1375 	 */
1376 	if ((reg16 = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL)) !=
1377 	    PCI_CAP_EINVAL16) {
1378 		tmp16 = (reg16 & (PCIE_DEVCTL_MAX_READ_REQ_MASK |
1379 		    PCIE_DEVCTL_MAX_PAYLOAD_MASK)) |
1380 		    (pcie_devctl_default & ~(PCIE_DEVCTL_MAX_READ_REQ_MASK |
1381 		    PCIE_DEVCTL_MAX_PAYLOAD_MASK)) |
1382 		    (pcie_base_err_default & (~PCIE_DEVCTL_CE_REPORTING_EN));
1383 
1384 		PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL, tmp16);
1385 		PCIE_DBG_CAP(dip, bus_p, "DEVCTL", 16, PCIE_DEVCTL, reg16);
1386 	}
1387 
1388 	/* Enable Root Port Baseline Error Receiving */
1389 	if (PCIE_IS_ROOT(bus_p) &&
1390 	    (reg16 = PCIE_CAP_GET(16, bus_p, PCIE_ROOTCTL)) !=
1391 	    PCI_CAP_EINVAL16) {
1392 
1393 		tmp16 = pcie_serr_disable_flag ?
1394 		    (pcie_root_ctrl_default & ~PCIE_ROOT_SYS_ERR) :
1395 		    pcie_root_ctrl_default;
1396 		PCIE_CAP_PUT(16, bus_p, PCIE_ROOTCTL, tmp16);
1397 		PCIE_DBG_CAP(dip, bus_p, "ROOT DEVCTL", 16, PCIE_ROOTCTL,
1398 		    reg16);
1399 	}
1400 
1401 	/*
1402 	 * Enable PCI-Express Advanced Error Handling if Exists
1403 	 */
1404 	if (!PCIE_HAS_AER(bus_p))
1405 		return;
1406 
1407 	/* Set Uncorrectable Severity */
1408 	if ((reg32 = PCIE_AER_GET(32, bus_p, PCIE_AER_UCE_SERV)) !=
1409 	    PCI_CAP_EINVAL32) {
1410 		tmp32 = pcie_aer_uce_severity;
1411 
1412 		PCIE_AER_PUT(32, bus_p, PCIE_AER_UCE_SERV, tmp32);
1413 		PCIE_DBG_AER(dip, bus_p, "AER UCE SEV", 32, PCIE_AER_UCE_SERV,
1414 		    reg32);
1415 	}
1416 
1417 	/* Enable Uncorrectable errors */
1418 	if ((reg32 = PCIE_AER_GET(32, bus_p, PCIE_AER_UCE_MASK)) !=
1419 	    PCI_CAP_EINVAL32) {
1420 		tmp32 = pcie_aer_uce_mask;
1421 
1422 		PCIE_AER_PUT(32, bus_p, PCIE_AER_UCE_MASK, tmp32);
1423 		PCIE_DBG_AER(dip, bus_p, "AER UCE MASK", 32, PCIE_AER_UCE_MASK,
1424 		    reg32);
1425 	}
1426 
1427 	/* Enable ECRC generation and checking */
1428 	if ((reg32 = PCIE_AER_GET(32, bus_p, PCIE_AER_CTL)) !=
1429 	    PCI_CAP_EINVAL32) {
1430 		tmp32 = reg32 | pcie_ecrc_value;
1431 		PCIE_AER_PUT(32, bus_p, PCIE_AER_CTL, tmp32);
1432 		PCIE_DBG_AER(dip, bus_p, "AER CTL", 32, PCIE_AER_CTL, reg32);
1433 	}
1434 
1435 	/* Enable Secondary Uncorrectable errors if this is a bridge */
1436 	if (!PCIE_IS_PCIE_BDG(bus_p))
1437 		goto root;
1438 
1439 	/* Set Uncorrectable Severity */
1440 	if ((reg32 = PCIE_AER_GET(32, bus_p, PCIE_AER_SUCE_SERV)) !=
1441 	    PCI_CAP_EINVAL32) {
1442 		tmp32 = pcie_aer_suce_severity;
1443 
1444 		PCIE_AER_PUT(32, bus_p, PCIE_AER_SUCE_SERV, tmp32);
1445 		PCIE_DBG_AER(dip, bus_p, "AER SUCE SEV", 32, PCIE_AER_SUCE_SERV,
1446 		    reg32);
1447 	}
1448 
1449 	if ((reg32 = PCIE_AER_GET(32, bus_p, PCIE_AER_SUCE_MASK)) !=
1450 	    PCI_CAP_EINVAL32) {
1451 		PCIE_AER_PUT(32, bus_p, PCIE_AER_SUCE_MASK, pcie_aer_suce_mask);
1452 		PCIE_DBG_AER(dip, bus_p, "AER SUCE MASK", 32,
1453 		    PCIE_AER_SUCE_MASK, reg32);
1454 	}
1455 
1456 root:
1457 	/*
1458 	 * Enable Root Control this is a Root device
1459 	 */
1460 	if (!PCIE_IS_ROOT(bus_p))
1461 		return;
1462 
1463 	if ((reg16 = PCIE_AER_GET(16, bus_p, PCIE_AER_RE_CMD)) !=
1464 	    PCI_CAP_EINVAL16) {
1465 		PCIE_AER_PUT(16, bus_p, PCIE_AER_RE_CMD,
1466 		    pcie_root_error_cmd_default);
1467 		PCIE_DBG_AER(dip, bus_p, "AER Root Err Cmd", 16,
1468 		    PCIE_AER_RE_CMD, reg16);
1469 	}
1470 }
1471 
1472 /*
1473  * This function is used for enabling CE reporting and setting the AER CE mask.
1474  * When called from outside the pcie module it should always be preceded by
1475  * a call to pcie_enable_errors.
1476  */
1477 int
1478 pcie_enable_ce(dev_info_t *dip)
1479 {
1480 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
1481 	uint16_t	device_sts, device_ctl;
1482 	uint32_t	tmp_pcie_aer_ce_mask;
1483 
1484 	if (!PCIE_IS_PCIE(bus_p))
1485 		return (DDI_SUCCESS);
1486 
1487 	/*
1488 	 * The "pcie_ce_mask" property is used to control both the CE reporting
1489 	 * enable field in the device control register and the AER CE mask. We
1490 	 * leave CE reporting disabled if pcie_ce_mask is set to -1.
1491 	 */
1492 
1493 	tmp_pcie_aer_ce_mask = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY, dip,
1494 	    DDI_PROP_DONTPASS, "pcie_ce_mask", pcie_aer_ce_mask);
1495 
1496 	if (tmp_pcie_aer_ce_mask == (uint32_t)-1) {
1497 		/*
1498 		 * Nothing to do since CE reporting has already been disabled.
1499 		 */
1500 		return (DDI_SUCCESS);
1501 	}
1502 
1503 	if (PCIE_HAS_AER(bus_p)) {
1504 		/* Enable AER CE */
1505 		PCIE_AER_PUT(32, bus_p, PCIE_AER_CE_MASK, tmp_pcie_aer_ce_mask);
1506 		PCIE_DBG_AER(dip, bus_p, "AER CE MASK", 32, PCIE_AER_CE_MASK,
1507 		    0);
1508 
1509 		/* Clear any pending AER CE errors */
1510 		PCIE_AER_PUT(32, bus_p, PCIE_AER_CE_STS, -1);
1511 	}
1512 
1513 	/* clear any pending CE errors */
1514 	if ((device_sts = PCIE_CAP_GET(16, bus_p, PCIE_DEVSTS)) !=
1515 	    PCI_CAP_EINVAL16)
1516 		PCIE_CAP_PUT(16, bus_p, PCIE_DEVSTS,
1517 		    device_sts & (~PCIE_DEVSTS_CE_DETECTED));
1518 
1519 	/* Enable CE reporting */
1520 	device_ctl = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL);
1521 	PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL,
1522 	    (device_ctl & (~PCIE_DEVCTL_ERR_MASK)) | pcie_base_err_default);
1523 	PCIE_DBG_CAP(dip, bus_p, "DEVCTL", 16, PCIE_DEVCTL, device_ctl);
1524 
1525 	return (DDI_SUCCESS);
1526 }
1527 
1528 /* ARGSUSED */
1529 void
1530 pcie_disable_errors(dev_info_t *dip)
1531 {
1532 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
1533 	uint16_t	device_ctl;
1534 	uint32_t	aer_reg;
1535 
1536 	if (!PCIE_IS_PCIE(bus_p))
1537 		return;
1538 
1539 	/*
1540 	 * Disable PCI-Express Baseline Error Handling
1541 	 */
1542 	device_ctl = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL);
1543 	device_ctl &= ~PCIE_DEVCTL_ERR_MASK;
1544 	PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL, device_ctl);
1545 
1546 	/*
1547 	 * Disable PCI-Express Advanced Error Handling if Exists
1548 	 */
1549 	if (!PCIE_HAS_AER(bus_p))
1550 		goto root;
1551 
1552 	/* Disable Uncorrectable errors */
1553 	PCIE_AER_PUT(32, bus_p, PCIE_AER_UCE_MASK, PCIE_AER_UCE_BITS);
1554 
1555 	/* Disable Correctable errors */
1556 	PCIE_AER_PUT(32, bus_p, PCIE_AER_CE_MASK, PCIE_AER_CE_BITS);
1557 
1558 	/* Disable ECRC generation and checking */
1559 	if ((aer_reg = PCIE_AER_GET(32, bus_p, PCIE_AER_CTL)) !=
1560 	    PCI_CAP_EINVAL32) {
1561 		aer_reg &= ~(PCIE_AER_CTL_ECRC_GEN_ENA |
1562 		    PCIE_AER_CTL_ECRC_CHECK_ENA);
1563 
1564 		PCIE_AER_PUT(32, bus_p, PCIE_AER_CTL, aer_reg);
1565 	}
1566 	/*
1567 	 * Disable Secondary Uncorrectable errors if this is a bridge
1568 	 */
1569 	if (!PCIE_IS_PCIE_BDG(bus_p))
1570 		goto root;
1571 
1572 	PCIE_AER_PUT(32, bus_p, PCIE_AER_SUCE_MASK, PCIE_AER_SUCE_BITS);
1573 
1574 root:
1575 	/*
1576 	 * disable Root Control this is a Root device
1577 	 */
1578 	if (!PCIE_IS_ROOT(bus_p))
1579 		return;
1580 
1581 	if (!pcie_serr_disable_flag) {
1582 		device_ctl = PCIE_CAP_GET(16, bus_p, PCIE_ROOTCTL);
1583 		device_ctl &= ~PCIE_ROOT_SYS_ERR;
1584 		PCIE_CAP_PUT(16, bus_p, PCIE_ROOTCTL, device_ctl);
1585 	}
1586 
1587 	if (!PCIE_HAS_AER(bus_p))
1588 		return;
1589 
1590 	if ((device_ctl = PCIE_CAP_GET(16, bus_p, PCIE_AER_RE_CMD)) !=
1591 	    PCI_CAP_EINVAL16) {
1592 		device_ctl &= ~pcie_root_error_cmd_default;
1593 		PCIE_CAP_PUT(16, bus_p, PCIE_AER_RE_CMD, device_ctl);
1594 	}
1595 }
1596 
1597 /*
1598  * Extract bdf from "reg" property.
1599  */
1600 int
1601 pcie_get_bdf_from_dip(dev_info_t *dip, pcie_req_id_t *bdf)
1602 {
1603 	pci_regspec_t	*regspec;
1604 	int		reglen;
1605 
1606 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1607 	    "reg", (int **)&regspec, (uint_t *)&reglen) != DDI_SUCCESS)
1608 		return (DDI_FAILURE);
1609 
1610 	if (reglen < (sizeof (pci_regspec_t) / sizeof (int))) {
1611 		ddi_prop_free(regspec);
1612 		return (DDI_FAILURE);
1613 	}
1614 
1615 	/* Get phys_hi from first element.  All have same bdf. */
1616 	*bdf = (regspec->pci_phys_hi & (PCI_REG_BDFR_M ^ PCI_REG_REG_M)) >> 8;
1617 
1618 	ddi_prop_free(regspec);
1619 	return (DDI_SUCCESS);
1620 }
1621 
1622 dev_info_t *
1623 pcie_get_my_childs_dip(dev_info_t *dip, dev_info_t *rdip)
1624 {
1625 	dev_info_t *cdip = rdip;
1626 
1627 	for (; ddi_get_parent(cdip) != dip; cdip = ddi_get_parent(cdip))
1628 		;
1629 
1630 	return (cdip);
1631 }
1632 
1633 uint32_t
1634 pcie_get_bdf_for_dma_xfer(dev_info_t *dip, dev_info_t *rdip)
1635 {
1636 	dev_info_t *cdip;
1637 
1638 	/*
1639 	 * As part of the probing, the PCI fcode interpreter may setup a DMA
1640 	 * request if a given card has a fcode on it using dip and rdip of the
1641 	 * hotplug connector i.e, dip and rdip of px/pcieb driver. In this
1642 	 * case, return a invalid value for the bdf since we cannot get to the
1643 	 * bdf value of the actual device which will be initiating this DMA.
1644 	 */
1645 	if (rdip == dip)
1646 		return (PCIE_INVALID_BDF);
1647 
1648 	cdip = pcie_get_my_childs_dip(dip, rdip);
1649 
1650 	/*
1651 	 * For a given rdip, return the bdf value of dip's (px or pcieb)
1652 	 * immediate child or secondary bus-id if dip is a PCIe2PCI bridge.
1653 	 *
1654 	 * XXX - For now, return a invalid bdf value for all PCI and PCI-X
1655 	 * devices since this needs more work.
1656 	 */
1657 	return (PCI_GET_PCIE2PCI_SECBUS(cdip) ?
1658 	    PCIE_INVALID_BDF : PCI_GET_BDF(cdip));
1659 }
1660 
1661 uint32_t
1662 pcie_get_aer_uce_mask() {
1663 	return (pcie_aer_uce_mask);
1664 }
1665 uint32_t
1666 pcie_get_aer_ce_mask() {
1667 	return (pcie_aer_ce_mask);
1668 }
1669 uint32_t
1670 pcie_get_aer_suce_mask() {
1671 	return (pcie_aer_suce_mask);
1672 }
1673 uint32_t
1674 pcie_get_serr_mask() {
1675 	return (pcie_serr_disable_flag);
1676 }
1677 
1678 void
1679 pcie_set_aer_uce_mask(uint32_t mask) {
1680 	pcie_aer_uce_mask = mask;
1681 	if (mask & PCIE_AER_UCE_UR)
1682 		pcie_base_err_default &= ~PCIE_DEVCTL_UR_REPORTING_EN;
1683 	else
1684 		pcie_base_err_default |= PCIE_DEVCTL_UR_REPORTING_EN;
1685 
1686 	if (mask & PCIE_AER_UCE_ECRC)
1687 		pcie_ecrc_value = 0;
1688 }
1689 
1690 void
1691 pcie_set_aer_ce_mask(uint32_t mask) {
1692 	pcie_aer_ce_mask = mask;
1693 }
1694 void
1695 pcie_set_aer_suce_mask(uint32_t mask) {
1696 	pcie_aer_suce_mask = mask;
1697 }
1698 void
1699 pcie_set_serr_mask(uint32_t mask) {
1700 	pcie_serr_disable_flag = mask;
1701 }
1702 
1703 /*
1704  * Is the rdip a child of dip.	Used for checking certain CTLOPS from bubbling
1705  * up erronously.  Ex.	ISA ctlops to a PCI-PCI Bridge.
1706  */
1707 boolean_t
1708 pcie_is_child(dev_info_t *dip, dev_info_t *rdip)
1709 {
1710 	dev_info_t	*cdip = ddi_get_child(dip);
1711 	for (; cdip; cdip = ddi_get_next_sibling(cdip))
1712 		if (cdip == rdip)
1713 			break;
1714 	return (cdip != NULL);
1715 }
1716 
1717 boolean_t
1718 pcie_is_link_disabled(dev_info_t *dip)
1719 {
1720 	pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
1721 
1722 	if (PCIE_IS_PCIE(bus_p)) {
1723 		if (PCIE_CAP_GET(16, bus_p, PCIE_LINKCTL) &
1724 		    PCIE_LINKCTL_LINK_DISABLE)
1725 			return (B_TRUE);
1726 	}
1727 	return (B_FALSE);
1728 }
1729 
1730 /*
1731  * Initialize the MPS for a root port.
1732  *
1733  * dip - dip of root port device.
1734  */
1735 void
1736 pcie_init_root_port_mps(dev_info_t *dip)
1737 {
1738 	pcie_bus_t	*bus_p = PCIE_DIP2BUS(dip);
1739 	int rp_cap, max_supported = pcie_max_mps;
1740 
1741 	(void) pcie_get_fabric_mps(ddi_get_parent(dip),
1742 	    ddi_get_child(dip), &max_supported);
1743 
1744 	rp_cap = PCI_CAP_GET16(bus_p->bus_cfg_hdl, NULL,
1745 	    bus_p->bus_pcie_off, PCIE_DEVCAP) &
1746 	    PCIE_DEVCAP_MAX_PAYLOAD_MASK;
1747 
1748 	if (rp_cap < max_supported)
1749 		max_supported = rp_cap;
1750 
1751 	bus_p->bus_mps = max_supported;
1752 	(void) pcie_initchild_mps(dip);
1753 }
1754 
1755 /*
1756  * Initialize the Maximum Payload Size of a device.
1757  *
1758  * cdip - dip of device.
1759  *
1760  * returns - DDI_SUCCESS or DDI_FAILURE
1761  */
1762 int
1763 pcie_initchild_mps(dev_info_t *cdip)
1764 {
1765 	pcie_bus_t	*bus_p;
1766 	dev_info_t	*pdip = ddi_get_parent(cdip);
1767 	uint8_t		dev_type;
1768 
1769 	bus_p = PCIE_DIP2BUS(cdip);
1770 	if (bus_p == NULL) {
1771 		PCIE_DBG("%s: BUS not found.\n",
1772 		    ddi_driver_name(cdip));
1773 		return (DDI_FAILURE);
1774 	}
1775 
1776 	dev_type = bus_p->bus_dev_type;
1777 
1778 	/*
1779 	 * For ARI Devices, only function zero's MPS needs to be set.
1780 	 */
1781 	if ((dev_type == PCIE_PCIECAP_DEV_TYPE_PCIE_DEV) &&
1782 	    (pcie_ari_is_enabled(pdip) == PCIE_ARI_FORW_ENABLED)) {
1783 		pcie_req_id_t child_bdf;
1784 
1785 		if (pcie_get_bdf_from_dip(cdip, &child_bdf) == DDI_FAILURE)
1786 			return (DDI_FAILURE);
1787 		if ((child_bdf & PCIE_REQ_ID_ARI_FUNC_MASK) != 0)
1788 			return (DDI_SUCCESS);
1789 	}
1790 
1791 	if (PCIE_IS_PCIE(bus_p)) {
1792 		int suggested_mrrs, fabric_mps;
1793 		uint16_t device_mps, device_mps_cap, device_mrrs, dev_ctrl;
1794 
1795 		dev_ctrl = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL);
1796 		if ((fabric_mps = (PCIE_IS_RP(bus_p) ? bus_p :
1797 		    PCIE_DIP2BUS(pdip))->bus_mps) < 0) {
1798 			dev_ctrl = (dev_ctrl & ~(PCIE_DEVCTL_MAX_READ_REQ_MASK |
1799 			    PCIE_DEVCTL_MAX_PAYLOAD_MASK)) |
1800 			    (pcie_devctl_default &
1801 			    (PCIE_DEVCTL_MAX_READ_REQ_MASK |
1802 			    PCIE_DEVCTL_MAX_PAYLOAD_MASK));
1803 
1804 			PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL, dev_ctrl);
1805 			return (DDI_SUCCESS);
1806 		}
1807 
1808 		device_mps_cap = PCIE_CAP_GET(16, bus_p, PCIE_DEVCAP) &
1809 		    PCIE_DEVCAP_MAX_PAYLOAD_MASK;
1810 
1811 		device_mrrs = (dev_ctrl & PCIE_DEVCTL_MAX_READ_REQ_MASK) >>
1812 		    PCIE_DEVCTL_MAX_READ_REQ_SHIFT;
1813 
1814 		if (device_mps_cap < fabric_mps)
1815 			device_mrrs = device_mps = device_mps_cap;
1816 		else
1817 			device_mps = (uint16_t)fabric_mps;
1818 
1819 		suggested_mrrs = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY,
1820 		    cdip, DDI_PROP_DONTPASS, "suggested-mrrs", device_mrrs);
1821 
1822 		if ((device_mps == fabric_mps) ||
1823 		    (suggested_mrrs < device_mrrs))
1824 			device_mrrs = (uint16_t)suggested_mrrs;
1825 
1826 		/*
1827 		 * Replace MPS and MRRS settings.
1828 		 */
1829 		dev_ctrl &= ~(PCIE_DEVCTL_MAX_READ_REQ_MASK |
1830 		    PCIE_DEVCTL_MAX_PAYLOAD_MASK);
1831 
1832 		dev_ctrl |= ((device_mrrs << PCIE_DEVCTL_MAX_READ_REQ_SHIFT) |
1833 		    device_mps << PCIE_DEVCTL_MAX_PAYLOAD_SHIFT);
1834 
1835 		PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL, dev_ctrl);
1836 
1837 		bus_p->bus_mps = device_mps;
1838 	}
1839 
1840 	return (DDI_SUCCESS);
1841 }
1842 
1843 /*
1844  * Scans a device tree/branch for a maximum payload size capabilities.
1845  *
1846  * rc_dip - dip of Root Complex.
1847  * dip - dip of device where scan will begin.
1848  * max_supported (IN) - maximum allowable MPS.
1849  * max_supported (OUT) - maximum payload size capability of fabric.
1850  */
1851 void
1852 pcie_get_fabric_mps(dev_info_t *rc_dip, dev_info_t *dip, int *max_supported)
1853 {
1854 	if (dip == NULL)
1855 		return;
1856 
1857 	/*
1858 	 * Perform a fabric scan to obtain Maximum Payload Capabilities
1859 	 */
1860 	(void) pcie_scan_mps(rc_dip, dip, max_supported);
1861 
1862 	PCIE_DBG("MPS: Highest Common MPS= %x\n", max_supported);
1863 }
1864 
1865 /*
1866  * Scans fabric and determines Maximum Payload Size based on
1867  * highest common denominator alogorithm
1868  */
1869 static void
1870 pcie_scan_mps(dev_info_t *rc_dip, dev_info_t *dip, int *max_supported)
1871 {
1872 	int circular_count;
1873 	pcie_max_supported_t max_pay_load_supported;
1874 
1875 	max_pay_load_supported.dip = rc_dip;
1876 	max_pay_load_supported.highest_common_mps = *max_supported;
1877 
1878 	ndi_devi_enter(ddi_get_parent(dip), &circular_count);
1879 	ddi_walk_devs(dip, pcie_get_max_supported,
1880 	    (void *)&max_pay_load_supported);
1881 	ndi_devi_exit(ddi_get_parent(dip), circular_count);
1882 
1883 	*max_supported = max_pay_load_supported.highest_common_mps;
1884 }
1885 
1886 /*
1887  * Called as part of the Maximum Payload Size scan.
1888  */
1889 static int
1890 pcie_get_max_supported(dev_info_t *dip, void *arg)
1891 {
1892 	uint32_t max_supported;
1893 	uint16_t cap_ptr;
1894 	pcie_max_supported_t *current = (pcie_max_supported_t *)arg;
1895 	pci_regspec_t *reg;
1896 	int rlen;
1897 	caddr_t virt;
1898 	ddi_acc_handle_t config_handle;
1899 
1900 	if (ddi_get_child(current->dip) == NULL) {
1901 		goto fail1;
1902 	}
1903 
1904 	if (pcie_dev(dip) == DDI_FAILURE) {
1905 		PCIE_DBG("MPS: pcie_get_max_supported: %s:  "
1906 		    "Not a PCIe dev\n", ddi_driver_name(dip));
1907 		goto fail1;
1908 	}
1909 
1910 	/*
1911 	 * If the suggested-mrrs property exists, then don't include this
1912 	 * device in the MPS capabilities scan.
1913 	 */
1914 	if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1915 	    "suggested-mrrs") != 0)
1916 		goto fail1;
1917 
1918 	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "reg",
1919 	    (caddr_t)&reg, &rlen) != DDI_PROP_SUCCESS) {
1920 		PCIE_DBG("MPS: pcie_get_max_supported: %s:  "
1921 		    "Can not read reg\n", ddi_driver_name(dip));
1922 		goto fail1;
1923 	}
1924 
1925 	if (pcie_map_phys(ddi_get_child(current->dip), reg, &virt,
1926 	    &config_handle) != DDI_SUCCESS) {
1927 		PCIE_DBG("MPS: pcie_get_max_supported: %s:  pcie_map_phys "
1928 		    "failed\n", ddi_driver_name(dip));
1929 		goto fail2;
1930 	}
1931 
1932 	if ((PCI_CAP_LOCATE(config_handle, PCI_CAP_ID_PCI_E, &cap_ptr)) ==
1933 	    DDI_FAILURE) {
1934 		goto fail3;
1935 	}
1936 
1937 	max_supported = PCI_CAP_GET16(config_handle, NULL, cap_ptr,
1938 	    PCIE_DEVCAP) & PCIE_DEVCAP_MAX_PAYLOAD_MASK;
1939 
1940 	PCIE_DBG("PCIE MPS: %s: MPS Capabilities %x\n", ddi_driver_name(dip),
1941 	    max_supported);
1942 
1943 	if (max_supported < current->highest_common_mps)
1944 		current->highest_common_mps = max_supported;
1945 
1946 fail3:
1947 	pcie_unmap_phys(&config_handle, reg);
1948 fail2:
1949 	kmem_free(reg, rlen);
1950 fail1:
1951 	return (DDI_WALK_CONTINUE);
1952 }
1953 
1954 /*
1955  * Determines if there are any root ports attached to a root complex.
1956  *
1957  * dip - dip of root complex
1958  *
1959  * Returns - DDI_SUCCESS if there is at least one root port otherwise
1960  *	     DDI_FAILURE.
1961  */
1962 int
1963 pcie_root_port(dev_info_t *dip)
1964 {
1965 	int port_type;
1966 	uint16_t cap_ptr;
1967 	ddi_acc_handle_t config_handle;
1968 	dev_info_t *cdip = ddi_get_child(dip);
1969 
1970 	/*
1971 	 * Determine if any of the children of the passed in dip
1972 	 * are root ports.
1973 	 */
1974 	for (; cdip; cdip = ddi_get_next_sibling(cdip)) {
1975 
1976 		if (pci_config_setup(cdip, &config_handle) != DDI_SUCCESS)
1977 			continue;
1978 
1979 		if ((PCI_CAP_LOCATE(config_handle, PCI_CAP_ID_PCI_E,
1980 		    &cap_ptr)) == DDI_FAILURE) {
1981 			pci_config_teardown(&config_handle);
1982 			continue;
1983 		}
1984 
1985 		port_type = PCI_CAP_GET16(config_handle, NULL, cap_ptr,
1986 		    PCIE_PCIECAP) & PCIE_PCIECAP_DEV_TYPE_MASK;
1987 
1988 		pci_config_teardown(&config_handle);
1989 
1990 		if (port_type == PCIE_PCIECAP_DEV_TYPE_ROOT)
1991 			return (DDI_SUCCESS);
1992 	}
1993 
1994 	/* No root ports were found */
1995 
1996 	return (DDI_FAILURE);
1997 }
1998 
1999 /*
2000  * Function that determines if a device a PCIe device.
2001  *
2002  * dip - dip of device.
2003  *
2004  * returns - DDI_SUCCESS if device is a PCIe device, otherwise DDI_FAILURE.
2005  */
2006 int
2007 pcie_dev(dev_info_t *dip)
2008 {
2009 	/* get parent device's device_type property */
2010 	char *device_type;
2011 	int rc = DDI_FAILURE;
2012 	dev_info_t *pdip = ddi_get_parent(dip);
2013 
2014 	if (ddi_prop_lookup_string(DDI_DEV_T_ANY, pdip,
2015 	    DDI_PROP_DONTPASS, "device_type", &device_type)
2016 	    != DDI_PROP_SUCCESS) {
2017 		return (DDI_FAILURE);
2018 	}
2019 
2020 	if (strcmp(device_type, "pciex") == 0)
2021 		rc = DDI_SUCCESS;
2022 	else
2023 		rc = DDI_FAILURE;
2024 
2025 	ddi_prop_free(device_type);
2026 	return (rc);
2027 }
2028 
2029 /*
2030  * Function to map in a device's memory space.
2031  */
2032 static int
2033 pcie_map_phys(dev_info_t *dip, pci_regspec_t *phys_spec,
2034     caddr_t *addrp, ddi_acc_handle_t *handlep)
2035 {
2036 	ddi_map_req_t mr;
2037 	ddi_acc_hdl_t *hp;
2038 	int result;
2039 	ddi_device_acc_attr_t attr;
2040 
2041 	attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
2042 	attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
2043 	attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
2044 	attr.devacc_attr_access = DDI_CAUTIOUS_ACC;
2045 
2046 	*handlep = impl_acc_hdl_alloc(KM_SLEEP, NULL);
2047 	hp = impl_acc_hdl_get(*handlep);
2048 	hp->ah_vers = VERS_ACCHDL;
2049 	hp->ah_dip = dip;
2050 	hp->ah_rnumber = 0;
2051 	hp->ah_offset = 0;
2052 	hp->ah_len = 0;
2053 	hp->ah_acc = attr;
2054 
2055 	mr.map_op = DDI_MO_MAP_LOCKED;
2056 	mr.map_type = DDI_MT_REGSPEC;
2057 	mr.map_obj.rp = (struct regspec *)phys_spec;
2058 	mr.map_prot = PROT_READ | PROT_WRITE;
2059 	mr.map_flags = DDI_MF_KERNEL_MAPPING;
2060 	mr.map_handlep = hp;
2061 	mr.map_vers = DDI_MAP_VERSION;
2062 
2063 	result = ddi_map(dip, &mr, 0, 0, addrp);
2064 
2065 	if (result != DDI_SUCCESS) {
2066 		impl_acc_hdl_free(*handlep);
2067 		*handlep = (ddi_acc_handle_t)NULL;
2068 	} else {
2069 		hp->ah_addr = *addrp;
2070 	}
2071 
2072 	return (result);
2073 }
2074 
2075 /*
2076  * Map out memory that was mapped in with pcie_map_phys();
2077  */
2078 static void
2079 pcie_unmap_phys(ddi_acc_handle_t *handlep,  pci_regspec_t *ph)
2080 {
2081 	ddi_map_req_t mr;
2082 	ddi_acc_hdl_t *hp;
2083 
2084 	hp = impl_acc_hdl_get(*handlep);
2085 	ASSERT(hp);
2086 
2087 	mr.map_op = DDI_MO_UNMAP;
2088 	mr.map_type = DDI_MT_REGSPEC;
2089 	mr.map_obj.rp = (struct regspec *)ph;
2090 	mr.map_prot = PROT_READ | PROT_WRITE;
2091 	mr.map_flags = DDI_MF_KERNEL_MAPPING;
2092 	mr.map_handlep = hp;
2093 	mr.map_vers = DDI_MAP_VERSION;
2094 
2095 	(void) ddi_map(hp->ah_dip, &mr, hp->ah_offset,
2096 	    hp->ah_len, &hp->ah_addr);
2097 
2098 	impl_acc_hdl_free(*handlep);
2099 	*handlep = (ddi_acc_handle_t)NULL;
2100 }
2101 
2102 void
2103 pcie_set_rber_fatal(dev_info_t *dip, boolean_t val)
2104 {
2105 	pcie_bus_t *bus_p = PCIE_DIP2UPBUS(dip);
2106 	bus_p->bus_pfd->pe_rber_fatal = val;
2107 }
2108 
2109 /*
2110  * Return parent Root Port's pe_rber_fatal value.
2111  */
2112 boolean_t
2113 pcie_get_rber_fatal(dev_info_t *dip)
2114 {
2115 	pcie_bus_t *bus_p = PCIE_DIP2UPBUS(dip);
2116 	pcie_bus_t *rp_bus_p = PCIE_DIP2UPBUS(bus_p->bus_rp_dip);
2117 	return (rp_bus_p->bus_pfd->pe_rber_fatal);
2118 }
2119 
2120 int
2121 pcie_ari_supported(dev_info_t *dip)
2122 {
2123 	uint32_t devcap2;
2124 	uint16_t pciecap;
2125 	pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
2126 	uint8_t dev_type;
2127 
2128 	PCIE_DBG("pcie_ari_supported: dip=%p\n", dip);
2129 
2130 	if (bus_p == NULL)
2131 		return (PCIE_ARI_FORW_NOT_SUPPORTED);
2132 
2133 	dev_type = bus_p->bus_dev_type;
2134 
2135 	if ((dev_type != PCIE_PCIECAP_DEV_TYPE_DOWN) &&
2136 	    (dev_type != PCIE_PCIECAP_DEV_TYPE_ROOT))
2137 		return (PCIE_ARI_FORW_NOT_SUPPORTED);
2138 
2139 	if (pcie_disable_ari) {
2140 		PCIE_DBG("pcie_ari_supported: dip=%p: ARI Disabled\n", dip);
2141 		return (PCIE_ARI_FORW_NOT_SUPPORTED);
2142 	}
2143 
2144 	pciecap = PCIE_CAP_GET(16, bus_p, PCIE_PCIECAP);
2145 
2146 	if ((pciecap & PCIE_PCIECAP_VER_MASK) < PCIE_PCIECAP_VER_2_0) {
2147 		PCIE_DBG("pcie_ari_supported: dip=%p: Not 2.0\n", dip);
2148 		return (PCIE_ARI_FORW_NOT_SUPPORTED);
2149 	}
2150 
2151 	devcap2 = PCIE_CAP_GET(32, bus_p, PCIE_DEVCAP2);
2152 
2153 	PCIE_DBG("pcie_ari_supported: dip=%p: DevCap2=0x%x\n",
2154 	    dip, devcap2);
2155 
2156 	if (devcap2 & PCIE_DEVCAP2_ARI_FORWARD) {
2157 		PCIE_DBG("pcie_ari_supported: "
2158 		    "dip=%p: ARI Forwarding is supported\n", dip);
2159 		return (PCIE_ARI_FORW_SUPPORTED);
2160 	}
2161 	return (PCIE_ARI_FORW_NOT_SUPPORTED);
2162 }
2163 
2164 int
2165 pcie_ari_enable(dev_info_t *dip)
2166 {
2167 	uint16_t devctl2;
2168 	pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
2169 
2170 	PCIE_DBG("pcie_ari_enable: dip=%p\n", dip);
2171 
2172 	if (pcie_ari_supported(dip) == PCIE_ARI_FORW_NOT_SUPPORTED)
2173 		return (DDI_FAILURE);
2174 
2175 	devctl2 = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL2);
2176 	devctl2 |= PCIE_DEVCTL2_ARI_FORWARD_EN;
2177 	PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL2, devctl2);
2178 
2179 	PCIE_DBG("pcie_ari_enable: dip=%p: writing 0x%x to DevCtl2\n",
2180 	    dip, devctl2);
2181 
2182 	return (DDI_SUCCESS);
2183 }
2184 
2185 int
2186 pcie_ari_disable(dev_info_t *dip)
2187 {
2188 	uint16_t devctl2;
2189 	pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
2190 
2191 	PCIE_DBG("pcie_ari_disable: dip=%p\n", dip);
2192 
2193 	if (pcie_ari_supported(dip) == PCIE_ARI_FORW_NOT_SUPPORTED)
2194 		return (DDI_FAILURE);
2195 
2196 	devctl2 = PCIE_CAP_GET(16, bus_p, PCIE_DEVCTL2);
2197 	devctl2 &= ~PCIE_DEVCTL2_ARI_FORWARD_EN;
2198 	PCIE_CAP_PUT(16, bus_p, PCIE_DEVCTL2, devctl2);
2199 
2200 	PCIE_DBG("pcie_ari_disable: dip=%p: writing 0x%x to DevCtl2\n",
2201 	    dip, devctl2);
2202 
2203 	return (DDI_SUCCESS);
2204 }
2205 
2206 int
2207 pcie_ari_is_enabled(dev_info_t *dip)
2208 {
2209 	uint16_t devctl2;
2210 	pcie_bus_t *bus_p = PCIE_DIP2BUS(dip);
2211 
2212 	PCIE_DBG("pcie_ari_is_enabled: dip=%p\n", dip);
2213 
2214 	if (pcie_ari_supported(dip) == PCIE_ARI_FORW_NOT_SUPPORTED)
2215 		return (PCIE_ARI_FORW_DISABLED);
2216 
2217 	devctl2 = PCIE_CAP_GET(32, bus_p, PCIE_DEVCTL2);
2218 
2219 	PCIE_DBG("pcie_ari_is_enabled: dip=%p: DevCtl2=0x%x\n",
2220 	    dip, devctl2);
2221 
2222 	if (devctl2 & PCIE_DEVCTL2_ARI_FORWARD_EN) {
2223 		PCIE_DBG("pcie_ari_is_enabled: "
2224 		    "dip=%p: ARI Forwarding is enabled\n", dip);
2225 		return (PCIE_ARI_FORW_ENABLED);
2226 	}
2227 
2228 	return (PCIE_ARI_FORW_DISABLED);
2229 }
2230 
2231 int
2232 pcie_ari_device(dev_info_t *dip)
2233 {
2234 	ddi_acc_handle_t handle;
2235 	uint16_t cap_ptr;
2236 
2237 	PCIE_DBG("pcie_ari_device: dip=%p\n", dip);
2238 
2239 	/*
2240 	 * XXX - This function may be called before the bus_p structure
2241 	 * has been populated.  This code can be changed to remove
2242 	 * pci_config_setup()/pci_config_teardown() when the RFE
2243 	 * to populate the bus_p structures early in boot is putback.
2244 	 */
2245 
2246 	/* First make sure it is a PCIe device */
2247 
2248 	if (pci_config_setup(dip, &handle) != DDI_SUCCESS)
2249 		return (PCIE_NOT_ARI_DEVICE);
2250 
2251 	if ((PCI_CAP_LOCATE(handle, PCI_CAP_ID_PCI_E, &cap_ptr))
2252 	    != DDI_SUCCESS) {
2253 		pci_config_teardown(&handle);
2254 		return (PCIE_NOT_ARI_DEVICE);
2255 	}
2256 
2257 	/* Locate the ARI Capability */
2258 
2259 	if ((PCI_CAP_LOCATE(handle, PCI_CAP_XCFG_SPC(PCIE_EXT_CAP_ID_ARI),
2260 	    &cap_ptr)) == DDI_FAILURE) {
2261 		pci_config_teardown(&handle);
2262 		return (PCIE_NOT_ARI_DEVICE);
2263 	}
2264 
2265 	/* ARI Capability was found so it must be a ARI device */
2266 	PCIE_DBG("pcie_ari_device: ARI Device dip=%p\n", dip);
2267 
2268 	pci_config_teardown(&handle);
2269 	return (PCIE_ARI_DEVICE);
2270 }
2271 
2272 int
2273 pcie_ari_get_next_function(dev_info_t *dip, int *func)
2274 {
2275 	uint32_t val;
2276 	uint16_t cap_ptr, next_function;
2277 	ddi_acc_handle_t handle;
2278 
2279 	/*
2280 	 * XXX - This function may be called before the bus_p structure
2281 	 * has been populated.  This code can be changed to remove
2282 	 * pci_config_setup()/pci_config_teardown() when the RFE
2283 	 * to populate the bus_p structures early in boot is putback.
2284 	 */
2285 
2286 	if (pci_config_setup(dip, &handle) != DDI_SUCCESS)
2287 		return (DDI_FAILURE);
2288 
2289 	if ((PCI_CAP_LOCATE(handle,
2290 	    PCI_CAP_XCFG_SPC(PCIE_EXT_CAP_ID_ARI), &cap_ptr)) == DDI_FAILURE) {
2291 		pci_config_teardown(&handle);
2292 		return (DDI_FAILURE);
2293 	}
2294 
2295 	val = PCI_CAP_GET32(handle, NULL, cap_ptr, PCIE_ARI_CAP);
2296 
2297 	next_function = (val >> PCIE_ARI_CAP_NEXT_FUNC_SHIFT) &
2298 	    PCIE_ARI_CAP_NEXT_FUNC_MASK;
2299 
2300 	pci_config_teardown(&handle);
2301 
2302 	*func = next_function;
2303 
2304 	return (DDI_SUCCESS);
2305 }
2306 
2307 dev_info_t *
2308 pcie_func_to_dip(dev_info_t *dip, pcie_req_id_t function)
2309 {
2310 	pcie_req_id_t child_bdf;
2311 	dev_info_t *cdip;
2312 
2313 	for (cdip = ddi_get_child(dip); cdip;
2314 	    cdip = ddi_get_next_sibling(cdip)) {
2315 
2316 		if (pcie_get_bdf_from_dip(cdip, &child_bdf) == DDI_FAILURE)
2317 			return (NULL);
2318 
2319 		if ((child_bdf & PCIE_REQ_ID_ARI_FUNC_MASK) == function)
2320 			return (cdip);
2321 	}
2322 	return (NULL);
2323 }
2324 
2325 #ifdef	DEBUG
2326 
2327 static void
2328 pcie_print_bus(pcie_bus_t *bus_p)
2329 {
2330 	pcie_dbg("\tbus_dip = 0x%p\n", bus_p->bus_dip);
2331 	pcie_dbg("\tbus_fm_flags = 0x%x\n", bus_p->bus_fm_flags);
2332 
2333 	pcie_dbg("\tbus_bdf = 0x%x\n", bus_p->bus_bdf);
2334 	pcie_dbg("\tbus_dev_ven_id = 0x%x\n", bus_p->bus_dev_ven_id);
2335 	pcie_dbg("\tbus_rev_id = 0x%x\n", bus_p->bus_rev_id);
2336 	pcie_dbg("\tbus_hdr_type = 0x%x\n", bus_p->bus_hdr_type);
2337 	pcie_dbg("\tbus_dev_type = 0x%x\n", bus_p->bus_dev_type);
2338 	pcie_dbg("\tbus_bdg_secbus = 0x%x\n", bus_p->bus_bdg_secbus);
2339 	pcie_dbg("\tbus_pcie_off = 0x%x\n", bus_p->bus_pcie_off);
2340 	pcie_dbg("\tbus_aer_off = 0x%x\n", bus_p->bus_aer_off);
2341 	pcie_dbg("\tbus_pcix_off = 0x%x\n", bus_p->bus_pcix_off);
2342 	pcie_dbg("\tbus_ecc_ver = 0x%x\n", bus_p->bus_ecc_ver);
2343 }
2344 
2345 /*
2346  * For debugging purposes set pcie_dbg_print != 0 to see printf messages
2347  * during interrupt.
2348  *
2349  * When a proper solution is in place this code will disappear.
2350  * Potential solutions are:
2351  * o circular buffers
2352  * o taskq to print at lower pil
2353  */
2354 int pcie_dbg_print = 0;
2355 void
2356 pcie_dbg(char *fmt, ...)
2357 {
2358 	va_list ap;
2359 
2360 	if (!pcie_debug_flags) {
2361 		return;
2362 	}
2363 	va_start(ap, fmt);
2364 	if (servicing_interrupt()) {
2365 		if (pcie_dbg_print) {
2366 			prom_vprintf(fmt, ap);
2367 		}
2368 	} else {
2369 		prom_vprintf(fmt, ap);
2370 	}
2371 	va_end(ap);
2372 }
2373 #endif	/* DEBUG */
2374 
2375 #if defined(__i386) || defined(__amd64)
2376 static void
2377 pcie_check_io_mem_range(ddi_acc_handle_t cfg_hdl, boolean_t *empty_io_range,
2378     boolean_t *empty_mem_range)
2379 {
2380 	uint8_t	class, subclass;
2381 	uint_t	val;
2382 
2383 	class = pci_config_get8(cfg_hdl, PCI_CONF_BASCLASS);
2384 	subclass = pci_config_get8(cfg_hdl, PCI_CONF_SUBCLASS);
2385 
2386 	if ((class == PCI_CLASS_BRIDGE) && (subclass == PCI_BRIDGE_PCI)) {
2387 		val = (((uint_t)pci_config_get8(cfg_hdl, PCI_BCNF_IO_BASE_LOW) &
2388 		    PCI_BCNF_IO_MASK) << 8);
2389 		/*
2390 		 * Assuming that a zero based io_range[0] implies an
2391 		 * invalid I/O range.  Likewise for mem_range[0].
2392 		 */
2393 		if (val == 0)
2394 			*empty_io_range = B_TRUE;
2395 		val = (((uint_t)pci_config_get16(cfg_hdl, PCI_BCNF_MEM_BASE) &
2396 		    PCI_BCNF_MEM_MASK) << 16);
2397 		if (val == 0)
2398 			*empty_mem_range = B_TRUE;
2399 	}
2400 }
2401 
2402 #endif /* defined(__i386) || defined(__amd64) */
2403