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 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28/*
29 * Psycho+ specifics implementation:
30 *	interrupt mapping register
31 *	PBM configuration
32 *	ECC and PBM error handling
33 *	Iommu mapping handling
34 *	Streaming Cache flushing
35 */
36
37#include <sys/types.h>
38#include <sys/kmem.h>
39#include <sys/sysmacros.h>
40#include <sys/async.h>
41#include <sys/systm.h>
42#include <sys/intreg.h>		/* UPAID_TO_IGN() */
43#include <sys/ivintr.h>
44#include <sys/sunddi.h>
45#include <sys/sunndi.h>
46#include <sys/machsystm.h>
47#include <sys/fm/util.h>
48#include <sys/ddi_impldefs.h>
49#include <sys/iommutsb.h>
50#include <sys/spl.h>
51#include <sys/fm/util.h>
52#include <sys/fm/protocol.h>
53#include <sys/fm/io/pci.h>
54#include <sys/fm/io/sun4upci.h>
55#include <sys/pci/pci_obj.h>
56#include <sys/pci/pcipsy.h>
57
58#ifdef _STARFIRE
59#include <sys/starfire.h>
60#endif /* _STARFIRE */
61
62static uint32_t pci_identity_init(pci_t *pci_p);
63static int pci_intr_setup(pci_t *pci_p);
64static void pci_pbm_errstate_get(pci_t *pci_p, pbm_errstate_t *pbm_err_p);
65
66static pci_ksinfo_t	*pci_name_kstat;
67
68/*LINTLIBRARY*/
69/* called by pci_attach() DDI_ATTACH to initialize pci objects */
70int
71pci_obj_setup(pci_t *pci_p)
72{
73	pci_common_t *cmn_p;
74	int ret;
75
76	mutex_enter(&pci_global_mutex);
77	cmn_p = get_pci_common_soft_state(pci_p->pci_id);
78	if (cmn_p == NULL) {
79		uint_t id = pci_p->pci_id;
80		if (alloc_pci_common_soft_state(id) != DDI_SUCCESS) {
81			mutex_exit(&pci_global_mutex);
82			return (DDI_FAILURE);
83		}
84		cmn_p = get_pci_common_soft_state(id);
85		cmn_p->pci_common_id = id;
86	}
87
88	ASSERT((pci_p->pci_side == 0) || (pci_p->pci_side == 1));
89	if (cmn_p->pci_p[pci_p->pci_side]) {
90		/* second side attach */
91		pci_p->pci_side = PCI_OTHER_SIDE(pci_p->pci_side);
92		ASSERT(cmn_p->pci_p[pci_p->pci_side] == NULL);
93	}
94
95	cmn_p->pci_p[pci_p->pci_side] = pci_p;
96	pci_p->pci_common_p = cmn_p;
97
98	if (cmn_p->pci_common_refcnt == 0) {
99		/* Perform allocation first to avoid delicate unwinding. */
100		if (pci_alloc_tsb(pci_p) != DDI_SUCCESS) {
101			cmn_p->pci_p[pci_p->pci_side] = NULL;
102			pci_p->pci_common_p = NULL;
103			free_pci_common_soft_state(cmn_p->pci_common_id);
104			mutex_exit(&pci_global_mutex);
105			return (DDI_FAILURE);
106		}
107		cmn_p->pci_common_tsb_cookie = pci_p->pci_tsb_cookie;
108		cmn_p->pci_chip_id = pci_identity_init(pci_p);
109
110		ib_create(pci_p);
111		cmn_p->pci_common_ib_p = pci_p->pci_ib_p;
112
113		cb_create(pci_p);
114		cmn_p->pci_common_cb_p = pci_p->pci_cb_p;
115
116		iommu_create(pci_p);
117		cmn_p->pci_common_iommu_p = pci_p->pci_iommu_p;
118
119		ecc_create(pci_p);
120		cmn_p->pci_common_ecc_p = pci_p->pci_ecc_p;
121	} else {
122		ASSERT(cmn_p->pci_common_refcnt == 1);
123
124		pci_p->pci_tsb_cookie = cmn_p->pci_common_tsb_cookie;
125		pci_p->pci_ib_p = cmn_p->pci_common_ib_p;
126		pci_p->pci_cb_p = cmn_p->pci_common_cb_p;
127		pci_p->pci_iommu_p = cmn_p->pci_common_iommu_p;
128		pci_p->pci_ecc_p = cmn_p->pci_common_ecc_p;
129	}
130
131	pbm_create(pci_p);
132	sc_create(pci_p);
133
134	pci_fm_create(pci_p);
135
136	if ((ret = pci_intr_setup(pci_p)) != DDI_SUCCESS)
137		goto done;
138	if (CHIP_TYPE(pci_p) == PCI_CHIP_PSYCHO)
139		pci_kstat_create(pci_p);
140
141	cmn_p->pci_common_attachcnt++;
142	cmn_p->pci_common_refcnt++;
143done:
144	mutex_exit(&pci_global_mutex);
145	if (ret != DDI_SUCCESS)
146		cmn_err(CE_NOTE, "Interrupt register failure, returning 0x%x\n",
147			ret);
148	return (ret);
149}
150
151/* called by pci_detach() DDI_DETACH to destroy pci objects */
152void
153pci_obj_destroy(pci_t *pci_p)
154{
155	pci_common_t *cmn_p;
156
157	mutex_enter(&pci_global_mutex);
158
159	cmn_p = pci_p->pci_common_p;
160	cmn_p->pci_common_refcnt--;
161	cmn_p->pci_common_attachcnt--;
162
163	pci_kstat_destroy(pci_p);
164
165	sc_destroy(pci_p);
166	pbm_destroy(pci_p);
167	pci_fm_destroy(pci_p);
168
169	if (cmn_p->pci_common_refcnt != 0) {
170		cmn_p->pci_p[pci_p->pci_side] = NULL;
171		mutex_exit(&pci_global_mutex);
172		return;
173	}
174
175	ecc_destroy(pci_p);
176	iommu_destroy(pci_p);
177	cb_destroy(pci_p);
178	ib_destroy(pci_p);
179
180	free_pci_common_soft_state(cmn_p->pci_common_id);
181	pci_intr_teardown(pci_p);
182	mutex_exit(&pci_global_mutex);
183}
184
185/* called by pci_attach() DDI_RESUME to (re)initialize pci objects */
186void
187pci_obj_resume(pci_t *pci_p)
188{
189	pci_common_t *cmn_p = pci_p->pci_common_p;
190
191	mutex_enter(&pci_global_mutex);
192
193	if (cmn_p->pci_common_attachcnt == 0) {
194		ib_configure(pci_p->pci_ib_p);
195		iommu_configure(pci_p->pci_iommu_p);
196		ecc_configure(pci_p);
197		ib_resume(pci_p->pci_ib_p);
198	}
199
200	pbm_configure(pci_p->pci_pbm_p);
201	sc_configure(pci_p->pci_sc_p);
202
203	if (cmn_p->pci_common_attachcnt == 0)
204		cb_resume(pci_p->pci_cb_p);
205
206	pbm_resume(pci_p->pci_pbm_p);
207
208	cmn_p->pci_common_attachcnt++;
209	mutex_exit(&pci_global_mutex);
210}
211
212/* called by pci_detach() DDI_SUSPEND to suspend pci objects */
213void
214pci_obj_suspend(pci_t *pci_p)
215{
216	mutex_enter(&pci_global_mutex);
217
218	pbm_suspend(pci_p->pci_pbm_p);
219	if (!--pci_p->pci_common_p->pci_common_attachcnt) {
220		ib_suspend(pci_p->pci_ib_p);
221		cb_suspend(pci_p->pci_cb_p);
222	}
223
224	mutex_exit(&pci_global_mutex);
225}
226
227static uint32_t javelin_prom_fix[] = {0xfff800, 0, 0, 0x3f};
228static int
229pci_intr_setup(pci_t *pci_p)
230{
231	extern char *platform;
232	dev_info_t *dip = pci_p->pci_dip;
233	pbm_t *pbm_p = pci_p->pci_pbm_p;
234	cb_t *cb_p = pci_p->pci_cb_p;
235	int i, no_of_intrs;
236
237	/*
238	 * This is a hack to fix a broken imap entry in the javelin PROM.
239	 * see bugid 4226603
240	 */
241	if (strcmp((const char *)&platform, "SUNW,Ultra-250") == 0)
242		(void) ddi_prop_create(DDI_DEV_T_NONE, dip, DDI_PROP_CANSLEEP,
243		    "interrupt-map-mask", (caddr_t)javelin_prom_fix,
244		    sizeof (javelin_prom_fix));
245
246	/*
247	 * Get the interrupts property.
248	 */
249	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
250		"interrupts", (caddr_t)&pci_p->pci_inos,
251		&pci_p->pci_inos_len) != DDI_SUCCESS)
252		cmn_err(CE_PANIC, "%s%d: no interrupts property\n",
253			ddi_driver_name(dip), ddi_get_instance(dip));
254
255	/*
256	 * figure out number of interrupts in the "interrupts" property
257	 * and convert them all into ino.
258	 */
259	i = ddi_getprop(DDI_DEV_T_ANY, dip, 0, "#interrupt-cells", 1);
260	i = CELLS_1275_TO_BYTES(i);
261	no_of_intrs = pci_p->pci_inos_len / i;
262	for (i = 0; i < no_of_intrs; i++)
263		pci_p->pci_inos[i] = IB_MONDO_TO_INO(pci_p->pci_inos[i]);
264
265	if (pci_p->pci_common_p->pci_common_refcnt == 0) {
266		cb_p->cb_no_of_inos = no_of_intrs;
267		if (i = cb_register_intr(pci_p))
268			goto teardown;
269		if (i = ecc_register_intr(pci_p))
270			goto teardown;
271
272		intr_dist_add(cb_intr_dist, cb_p);
273		cb_enable_intr(pci_p);
274		ecc_enable_intr(pci_p);
275	}
276
277	if (i = pbm_register_intr(pbm_p)) {
278		if (pci_p->pci_common_p->pci_common_refcnt == 0)
279			intr_dist_rem(cb_intr_dist, cb_p);
280		goto teardown;
281	}
282	intr_dist_add(pbm_intr_dist, pbm_p);
283	ib_intr_enable(pci_p, pci_p->pci_inos[CBNINTR_PBM]);
284
285	if (pci_p->pci_common_p->pci_common_refcnt == 0)
286		intr_dist_add_weighted(ib_intr_dist_all, pci_p->pci_ib_p);
287	return (DDI_SUCCESS);
288teardown:
289	pci_intr_teardown(pci_p);
290	return (i);
291}
292
293/*
294 * pci_fix_ranges - fixes the config space entry of the "ranges"
295 *	property on psycho+ platforms
296 */
297void
298pci_fix_ranges(pci_ranges_t *rng_p, int rng_entries)
299{
300	int i;
301	for (i = 0; i < rng_entries; i++, rng_p++)
302		if ((rng_p->child_high & PCI_REG_ADDR_M) == PCI_ADDR_CONFIG)
303			rng_p->parent_low |= rng_p->child_high;
304}
305
306/*
307 * map_pci_registers
308 *
309 * This function is called from the attach routine to map the registers
310 * accessed by this driver.
311 *
312 * used by: pci_attach()
313 *
314 * return value: DDI_FAILURE on failure
315 */
316int
317map_pci_registers(pci_t *pci_p, dev_info_t *dip)
318{
319	ddi_device_acc_attr_t attr;
320
321	attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
322	attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
323
324	attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
325	if (ddi_regs_map_setup(dip, 0, &pci_p->pci_address[0], 0, 0,
326	    &attr, &pci_p->pci_ac[0]) != DDI_SUCCESS) {
327		cmn_err(CE_WARN, "%s%d: unable to map reg entry 0\n",
328			ddi_driver_name(dip), ddi_get_instance(dip));
329		return (DDI_FAILURE);
330	}
331	/*
332	 * if we don't have streaming buffer, then we don't have
333	 * pci_address[2].
334	 */
335	if (pci_stream_buf_exists &&
336	    ddi_regs_map_setup(dip, 2, &pci_p->pci_address[2], 0, 0,
337	    &attr, &pci_p->pci_ac[2]) != DDI_SUCCESS) {
338		cmn_err(CE_WARN, "%s%d: unable to map reg entry 2\n",
339			ddi_driver_name(dip), ddi_get_instance(dip));
340		ddi_regs_map_free(&pci_p->pci_ac[0]);
341		return (DDI_FAILURE);
342	}
343
344	/*
345	 * The second register set contains the bridge's configuration
346	 * header.  This header is at the very beginning of the bridge's
347	 * configuration space.  This space has litte-endian byte order.
348	 */
349	attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
350	if (ddi_regs_map_setup(dip, 1, &pci_p->pci_address[1], 0,
351	    PCI_CONF_HDR_SIZE, &attr, &pci_p->pci_ac[1]) != DDI_SUCCESS) {
352
353		cmn_err(CE_WARN, "%s%d: unable to map reg entry 1\n",
354			ddi_driver_name(dip), ddi_get_instance(dip));
355		ddi_regs_map_free(&pci_p->pci_ac[0]);
356		if (pci_stream_buf_exists)
357			ddi_regs_map_free(&pci_p->pci_ac[2]);
358		return (DDI_FAILURE);
359	}
360	DEBUG3(DBG_ATTACH, dip, "address (%p,%p,%p)\n",
361	    pci_p->pci_address[0], pci_p->pci_address[1],
362	    pci_p->pci_address[2]);
363
364	return (DDI_SUCCESS);
365}
366
367/*
368 * unmap_pci_registers:
369 *
370 * This routine unmap the registers mapped by map_pci_registers.
371 *
372 * used by: pci_detach()
373 *
374 * return value: none
375 */
376void
377unmap_pci_registers(pci_t *pci_p)
378{
379	ddi_regs_map_free(&pci_p->pci_ac[0]);
380	ddi_regs_map_free(&pci_p->pci_ac[1]);
381	if (pci_stream_buf_exists)
382		ddi_regs_map_free(&pci_p->pci_ac[2]);
383}
384
385/*
386 * These convenience wrappers relies on map_pci_registers() to setup
387 * pci_address[0-2] correctly at first.
388 */
389/* The psycho+ reg base is at 1fe.0000.0000 */
390static uintptr_t
391get_reg_base(pci_t *pci_p)
392{
393	return ((uintptr_t)pci_p->pci_address[pci_stream_buf_exists ? 2 : 0]);
394}
395
396/* The psycho+ config reg base is always the 2nd reg entry */
397static uintptr_t
398get_config_reg_base(pci_t *pci_p)
399{
400	return ((uintptr_t)(pci_p->pci_address[1]));
401}
402
403uint64_t
404ib_get_map_reg(ib_mondo_t mondo, uint32_t cpu_id)
405{
406	return ((mondo) | (cpu_id << COMMON_INTR_MAP_REG_TID_SHIFT) |
407	    COMMON_INTR_MAP_REG_VALID);
408
409}
410
411uint32_t
412ib_map_reg_get_cpu(volatile uint64_t reg)
413{
414	return ((reg & COMMON_INTR_MAP_REG_TID) >>
415	    COMMON_INTR_MAP_REG_TID_SHIFT);
416}
417
418uint64_t *
419ib_intr_map_reg_addr(ib_t *ib_p, ib_ino_t ino)
420{
421	uint64_t *addr;
422
423	if (ino & 0x20)
424		addr = (uint64_t *)(ib_p->ib_obio_intr_map_regs +
425		    (((uint_t)ino & 0x1f) << 3));
426	else
427		addr = (uint64_t *)(ib_p->ib_slot_intr_map_regs +
428		    (((uint_t)ino & 0x3c) << 1));
429	return (addr);
430}
431
432uint64_t *
433ib_clear_intr_reg_addr(ib_t *ib_p, ib_ino_t ino)
434{
435	uint64_t *addr;
436
437	if (ino & 0x20)
438		addr = (uint64_t *)(ib_p->ib_obio_clear_intr_regs +
439		    (((uint_t)ino & 0x1f) << 3));
440	else
441		addr = (uint64_t *)(ib_p->ib_slot_clear_intr_regs +
442		    (((uint_t)ino & 0x1f) << 3));
443	return (addr);
444}
445
446/*
447 * psycho have one mapping register per slot
448 */
449void
450ib_ino_map_reg_share(ib_t *ib_p, ib_ino_t ino, ib_ino_info_t *ino_p)
451{
452	if (!IB_IS_OBIO_INO(ino)) {
453		ASSERT(ino_p->ino_slot_no < 8);
454		ib_p->ib_map_reg_counters[ino_p->ino_slot_no]++;
455	}
456}
457
458/*
459 * return true if the ino shares mapping register with other interrupts
460 * of the same slot, or is still shared by other On-board devices.
461 */
462int
463ib_ino_map_reg_unshare(ib_t *ib_p, ib_ino_t ino, ib_ino_info_t *ino_p)
464{
465	ASSERT(IB_IS_OBIO_INO(ino) || ino_p->ino_slot_no < 8);
466
467	if (IB_IS_OBIO_INO(ino))
468		return (ino_p->ino_ipil_size);
469	else
470		return (--ib_p->ib_map_reg_counters[ino_p->ino_slot_no]);
471}
472
473/*ARGSUSED*/
474void
475pci_pbm_intr_dist(pbm_t *pbm_p)
476{
477}
478
479uintptr_t
480pci_ib_setup(ib_t *ib_p)
481{
482	pci_t *pci_p = ib_p->ib_pci_p;
483	uintptr_t a = get_reg_base(pci_p);
484
485	ib_p->ib_ign = PCI_ID_TO_IGN(pci_p->pci_id);
486	ib_p->ib_max_ino = PSYCHO_MAX_INO;
487	ib_p->ib_slot_intr_map_regs = a + PSYCHO_IB_SLOT_INTR_MAP_REG_OFFSET;
488	ib_p->ib_obio_intr_map_regs = a + PSYCHO_IB_OBIO_INTR_MAP_REG_OFFSET;
489	ib_p->ib_obio_clear_intr_regs =
490		a + PSYCHO_IB_OBIO_CLEAR_INTR_REG_OFFSET;
491	return (a);
492}
493
494uint32_t
495pci_xlate_intr(dev_info_t *dip, dev_info_t *rdip, ib_t *ib_p, uint32_t intr)
496{
497	int32_t len;
498	dev_info_t *cdip;
499	pci_regspec_t *pci_rp;
500	uint32_t bus, dev, phys_hi;
501
502	if ((intr > PCI_INTD) || (intr < PCI_INTA))
503		goto done;
504	if (ddi_prop_exists(DDI_DEV_T_ANY, rdip, NULL, "interrupt-map"))
505		goto done;
506	/*
507	 * Hack for pre 1275 imap machines e.g. quark & tazmo
508	 * We need to turn any PCI interrupts into ino interrupts.  machines
509	 * supporting imap will have this done in the map.
510	 */
511	cdip = get_my_childs_dip(dip, rdip);
512	if (ddi_getlongprop(DDI_DEV_T_ANY, cdip, DDI_PROP_DONTPASS, "reg",
513		(caddr_t)&pci_rp, &len) != DDI_SUCCESS)
514		return (0);
515	phys_hi = pci_rp->pci_phys_hi;
516	kmem_free(pci_rp, len);
517
518	bus = PCI_REG_BUS_G(phys_hi);
519	dev = PCI_REG_DEV_G(phys_hi);
520
521	/*
522	 * The ino for a given device id is derived as 0BSSNN where
523	 *
524	 *	B = 0 for bus A, 1 for bus B
525	 *	SS = dev - 1 for bus A, dev - 2 for bus B
526	 *	NN = 00 for INTA#, 01 for INTB#, 10 for INTC#, 11 for INTD#
527	 *
528	 * if pci bus number > 0x80, then devices are located on the A side(66)
529	 */
530	DEBUG3(DBG_IB, dip, "pci_xlate_intr: bus=%x, dev=%x, intr=%x\n",
531		bus, dev, intr);
532	intr--;
533	intr |= (bus & 0x80) ? ((dev - 1) << 2) : (0x10 | ((dev - 2) << 2));
534
535	DEBUG1(DBG_IB, dip, "pci_xlate_intr: done ino=%x\n", intr);
536done:
537	return (IB_INO_TO_MONDO(ib_p, intr));
538}
539
540/*
541 * Return the cpuid to to be used for an ino. Psycho has special slot-cpu
542 * constraints on cpu assignment:
543 *
544 * On multi-function pci cards, functions have separate devinfo nodes and
545 * interrupts. Some pci support hardware, such as the psycho/pcipsy chip,
546 * control interrupt-to-cpu binding on a per pci-slot basis instead of per
547 * function.  For hardware like this, if an interrupt for one function has
548 * already been directed to a particular cpu, we can't choose a different
549 * cpu for another function implemented in the same pci-slot - if we did
550 * we would be redirecting the first function too (which causes problems
551 * for consistent interrupt distribution).
552 *
553 * This function determines if there is already an established slot-oriented
554 * interrupt-to-cpu binding established, if there is then it returns that
555 * cpu.  Otherwise a new cpu is selected by intr_dist_cpuid().
556 *
557 * The devinfo node we are trying to associate a cpu with is
558 * ino_p->ino_ipil_p->ipil_ih_head->ih_dip.
559 */
560uint32_t
561pci_intr_dist_cpuid(ib_t *ib_p, ib_ino_info_t *ino_p)
562{
563	dev_info_t	*rdip = ino_p->ino_ipil_p->ipil_ih_head->ih_dip;
564	dev_info_t	*prdip = ddi_get_parent(rdip);
565	ib_ino_info_t	*sino_p;
566	dev_info_t	*sdip;
567	dev_info_t	*psdip;
568	char		*buf1 = NULL, *buf2 = NULL;
569	char		*s1, *s2, *s3;
570	int		l2;
571	int		cpu_id;
572
573	/* must be psycho driver parent (not ebus) */
574	if (strcmp(ddi_driver_name(prdip), "pcipsy") != 0)
575		goto newcpu;
576
577	/*
578	 * From PCI 1275 binding: 2.2.1.3 Unit Address representation:
579	 *   Since the "unit-number" is the address that appears in on Open
580	 *   Firmware 'device path', it follows that only the DD and DD,FF
581	 *   forms of the text representation can appear in a 'device path'.
582	 *
583	 * The rdip unit address is of the form "DD[,FF]".  Define two
584	 * unit address strings that represent same-slot use: "DD" and "DD,".
585	 * The first compare uses strcmp, the second uses strncmp.
586	 */
587	s1 = ddi_get_name_addr(rdip);
588	if (s1 == NULL)
589		goto newcpu;
590
591	buf1 = kmem_alloc(MAXNAMELEN, KM_SLEEP);	/* strcmp */
592	buf2 = kmem_alloc(MAXNAMELEN, KM_SLEEP);	/* strncmp */
593	s1 = strcpy(buf1, s1);
594	s2 = strcpy(buf2, s1);
595
596	s1 = strrchr(s1, ',');
597	if (s1) {
598		*s1 = '\0';			/* have "DD,FF" */
599		s1 = buf1;			/* search via strcmp "DD" */
600
601		s2 = strrchr(s2, ',');
602		*(s2 + 1) = '\0';
603		s2 = buf2;
604		l2 = strlen(s2);		/* search via strncmp "DD," */
605	} else {
606		(void) strcat(s2, ",");		/* have "DD" */
607		l2 = strlen(s2);		/* search via strncmp "DD," */
608	}
609
610	/*
611	 * Search the established ino list for devinfo nodes bound
612	 * to an ino that matches one of the slot use strings.
613	 */
614	ASSERT(MUTEX_HELD(&ib_p->ib_ino_lst_mutex));
615	for (sino_p = ib_p->ib_ino_lst; sino_p; sino_p = sino_p->ino_next_p) {
616		/* skip self and non-established */
617		if ((sino_p == ino_p) || (sino_p->ino_established == 0))
618			continue;
619
620		/* skip non-siblings */
621		sdip = sino_p->ino_ipil_p->ipil_ih_head->ih_dip;
622		psdip = ddi_get_parent(sdip);
623		if (psdip != prdip)
624			continue;
625
626		/* must be psycho driver parent (not ebus) */
627		if (strcmp(ddi_driver_name(psdip), "pcipsy") != 0)
628			continue;
629
630		s3 = ddi_get_name_addr(sdip);
631		if ((s1 && (strcmp(s1, s3) == 0)) ||
632		    (strncmp(s2, s3, l2) == 0)) {
633			extern int intr_dist_debug;
634
635			if (intr_dist_debug)
636				cmn_err(CE_CONT, "intr_dist: "
637				    "pcipsy`pci_intr_dist_cpuid "
638				    "%s#%d %s: cpu %d established "
639				    "by %s#%d %s\n", ddi_driver_name(rdip),
640				    ddi_get_instance(rdip),
641				    ddi_deviname(rdip, buf1), sino_p->ino_cpuid,
642				    ddi_driver_name(sdip),
643				    ddi_get_instance(sdip),
644				    ddi_deviname(sdip, buf2));
645			break;
646		}
647	}
648
649	/* If a slot use match is found then use established cpu */
650	if (sino_p) {
651		cpu_id = sino_p->ino_cpuid;	/* target established cpu */
652		goto out;
653	}
654
655newcpu:	cpu_id = intr_dist_cpuid();		/* target new cpu */
656
657out:	if (buf1)
658		kmem_free(buf1, MAXNAMELEN);
659	if (buf2)
660		kmem_free(buf2, MAXNAMELEN);
661	return (cpu_id);
662}
663
664
665/*ARGSUSED*/
666static void
667cb_thermal_timeout(void *arg)
668{
669	do_shutdown();
670
671	/*
672	 * In case do_shutdown() fails to halt the system.
673	 */
674	(void) timeout((void(*)(void *))power_down, NULL,
675	    thermal_powerdown_delay * hz);
676}
677
678/*
679 * High-level handler for psycho's CBNINTR_THERMAL interrupt.
680 *
681 * Use timeout(9f) to implement the core functionality so that the
682 * timeout(9f) function can sleep, if needed.
683 */
684/*ARGSUSED*/
685uint_t
686cb_thermal_intr(caddr_t a)
687{
688	cmn_err(CE_WARN, "pci: Thermal warning detected!\n");
689	if (pci_thermal_intr_fatal) {
690		(void) timeout(cb_thermal_timeout, NULL, 0);
691	}
692	return (DDI_INTR_CLAIMED);
693}
694
695void
696pci_cb_teardown(pci_t *pci_p)
697{
698	cb_t	*cb_p = pci_p->pci_cb_p;
699	uint32_t mondo;
700
701	if (pci_p->pci_thermal_interrupt != -1) {
702		mondo = ((pci_p->pci_cb_p->cb_ign  << PCI_INO_BITS) |
703		    pci_p->pci_inos[CBNINTR_THERMAL]);
704		mondo = CB_MONDO_TO_XMONDO(pci_p->pci_cb_p, mondo);
705
706		cb_disable_nintr(cb_p, CBNINTR_THERMAL, IB_INTR_WAIT);
707		VERIFY(rem_ivintr(mondo, pci_pil[CBNINTR_THERMAL]) == 0);
708	}
709#ifdef _STARFIRE
710	pc_ittrans_uninit(cb_p->cb_ittrans_cookie);
711#endif /* _STARFIRE */
712}
713
714int
715cb_register_intr(pci_t *pci_p)
716{
717	uint32_t mondo;
718
719	if (pci_p->pci_thermal_interrupt == -1)
720		return (DDI_SUCCESS);
721
722	mondo = ((pci_p->pci_cb_p->cb_ign << PCI_INO_BITS) |
723	    pci_p->pci_inos[CBNINTR_THERMAL]);
724	mondo = CB_MONDO_TO_XMONDO(pci_p->pci_cb_p, mondo);
725
726	VERIFY(add_ivintr(mondo, pci_pil[CBNINTR_THERMAL],
727	    (intrfunc)cb_thermal_intr, (caddr_t)pci_p->pci_cb_p,
728	    NULL, NULL) == 0);
729
730	return (PCI_ATTACH_RETCODE(PCI_CB_OBJ, PCI_OBJ_INTR_ADD, DDI_SUCCESS));
731}
732
733void
734cb_enable_intr(pci_t *pci_p)
735{
736	if (pci_p->pci_thermal_interrupt != -1)
737		cb_enable_nintr(pci_p, CBNINTR_THERMAL);
738}
739
740uint64_t
741cb_ino_to_map_pa(cb_t *cb_p, ib_ino_t ino)
742{
743	return (cb_p->cb_map_pa + ((ino & 0x1f) << 3));
744}
745
746uint64_t
747cb_ino_to_clr_pa(cb_t *cb_p, ib_ino_t ino)
748{
749	return (cb_p->cb_clr_pa + ((ino & 0x1f) << 3));
750}
751
752/*
753 * allow removal of exported/shared thermal interrupt
754 */
755int
756cb_remove_xintr(pci_t *pci_p, dev_info_t *dip, dev_info_t *rdip,
757	ib_ino_t ino, ib_mondo_t mondo)
758{
759	if (ino != pci_p->pci_inos[CBNINTR_THERMAL])
760		return (DDI_FAILURE);
761
762	cb_disable_nintr(pci_p->pci_cb_p, CBNINTR_THERMAL, IB_INTR_WAIT);
763	VERIFY(rem_ivintr(mondo, pci_pil[CBNINTR_THERMAL]) == 0);
764
765	DEBUG1(DBG_R_INTX, dip, "remove xintr %x\n", ino);
766	return (DDI_SUCCESS);
767}
768
769int
770pci_ecc_add_intr(pci_t *pci_p, int inum, ecc_intr_info_t *eii_p)
771{
772	uint32_t mondo;
773
774	mondo = ((pci_p->pci_cb_p->cb_ign << PCI_INO_BITS) |
775	    pci_p->pci_inos[inum]);
776	mondo = CB_MONDO_TO_XMONDO(pci_p->pci_cb_p, mondo);
777
778	VERIFY(add_ivintr(mondo, pci_pil[inum], (intrfunc)ecc_intr,
779	    (caddr_t)eii_p, NULL, NULL) == 0);
780
781	return (PCI_ATTACH_RETCODE(PCI_ECC_OBJ, PCI_OBJ_INTR_ADD, DDI_SUCCESS));
782}
783
784void
785pci_ecc_rem_intr(pci_t *pci_p, int inum, ecc_intr_info_t *eii_p)
786{
787	uint32_t mondo;
788
789	mondo = ((pci_p->pci_cb_p->cb_ign << PCI_INO_BITS) |
790	    pci_p->pci_inos[inum]);
791	mondo = CB_MONDO_TO_XMONDO(pci_p->pci_cb_p, mondo);
792
793	VERIFY(rem_ivintr(mondo, pci_pil[inum]) == 0);
794}
795
796static int pbm_has_pass_1_cheerio(pci_t *pci_p);
797
798void
799pbm_configure(pbm_t *pbm_p)
800{
801	pci_t *pci_p = pbm_p->pbm_pci_p;
802	cb_t *cb_p = pci_p->pci_cb_p;
803	dev_info_t *dip = pci_p->pci_dip;
804	int instance = ddi_get_instance(dip);
805	uint32_t mask = 1 << instance;
806	uint64_t l;
807	uint16_t s = 0;
808
809	/*
810	 * Workarounds for hardware bugs:
811	 *
812	 * bus parking
813	 *
814	 *	Pass 2 psycho parts have a bug that requires bus
815	 *	parking to be disabled.
816	 *
817	 *	Pass 1 cheerio parts have a bug which prevents them
818	 *	from working on a PBM with bus parking enabled.
819	 *
820	 * rerun disable
821	 *
822	 *	Pass 1 and 2 psycho's require that the rerun's be
823	 *	enabled.
824	 *
825	 * retry limit
826	 *
827	 *	For pass 1 and pass 2 psycho parts we disable the
828	 *	retry limit.  This is because the limit of 16 seems
829	 *	too restrictive for devices that are children of pci
830	 *	to pci bridges.  For pass 3 this limit will be 64.
831	 *
832	 * DMA write/PIO read sync
833	 *
834	 *	For pass 2 psycho, the disable this feature.
835	 */
836	l = lddphysio(cb_p->cb_base_pa + PSYCHO_CB_CONTROL_STATUS_REG_OFFSET);
837	l &= PSYCHO_CB_CONTROL_STATUS_VER;
838	l >>= PSYCHO_CB_CONTROL_STATUS_VER_SHIFT;
839
840	DEBUG2(DBG_ATTACH, dip, "cb_create: ver=%d, mask=%x\n", l, mask);
841	pci_rerun_disable = (uint32_t)-1;
842
843	switch (l) {
844	case 0:
845		DEBUG0(DBG_ATTACH, dip, "cb_create: psycho pass 1\n");
846		if (!pci_disable_pass1_workarounds) {
847			if (pbm_has_pass_1_cheerio(pci_p))
848				pci_bus_parking_enable &= ~mask;
849			pci_rerun_disable &= ~mask;
850			pci_retry_disable |= mask;
851		}
852		break;
853	case 1:
854		if (!pci_disable_pass2_workarounds) {
855			pci_bus_parking_enable &= ~mask;
856			pci_rerun_disable &= ~mask;
857			pci_retry_disable |= mask;
858			pci_dwsync_disable |= mask;
859		}
860		break;
861	case 2:
862		if (!pci_disable_pass3_workarounds) {
863			pci_dwsync_disable |= mask;
864			if (pbm_has_pass_1_cheerio(pci_p))
865				pci_bus_parking_enable &= ~mask;
866		}
867		break;
868	case 3:
869		if (!pci_disable_plus_workarounds) {
870			pci_dwsync_disable |= mask;
871			if (pbm_has_pass_1_cheerio(pci_p))
872				pci_bus_parking_enable &= ~mask;
873		}
874		break;
875	default:
876		if (!pci_disable_default_workarounds) {
877			pci_dwsync_disable |= mask;
878			if (pbm_has_pass_1_cheerio(pci_p))
879				pci_bus_parking_enable &= ~mask;
880		}
881		break;
882	}
883
884	/*
885	 * Clear any PBM errors.
886	 */
887	l = (PSYCHO_PCI_AFSR_E_MASK << PSYCHO_PCI_AFSR_PE_SHIFT) |
888		(PSYCHO_PCI_AFSR_E_MASK << PSYCHO_PCI_AFSR_SE_SHIFT);
889	*pbm_p->pbm_async_flt_status_reg = l;
890
891	/*
892	 * Clear error bits in configuration status register.
893	 */
894	s = PCI_STAT_PERROR | PCI_STAT_S_PERROR |
895		PCI_STAT_R_MAST_AB | PCI_STAT_R_TARG_AB |
896		PCI_STAT_S_TARG_AB | PCI_STAT_S_PERROR;
897	DEBUG1(DBG_ATTACH, dip, "pbm_configure: conf status reg=%x\n", s);
898	pbm_p->pbm_config_header->ch_status_reg = s;
899	DEBUG1(DBG_ATTACH, dip, "pbm_configure: conf status reg==%x\n",
900		pbm_p->pbm_config_header->ch_status_reg);
901
902	l = *pbm_p->pbm_ctrl_reg;	/* save control register state */
903	DEBUG1(DBG_ATTACH, dip, "pbm_configure: ctrl reg==%llx\n", l);
904
905	/*
906	 * See if any SERR# signals are asserted.  We'll clear them later.
907	 */
908	if (l & COMMON_PCI_CTRL_SERR)
909		cmn_err(CE_WARN, "%s%d: SERR asserted on pci bus\n",
910		    ddi_driver_name(dip), instance);
911
912	/*
913	 * Determine if PCI bus is running at 33 or 66 mhz.
914	 */
915	if (l & COMMON_PCI_CTRL_SPEED)
916		pbm_p->pbm_speed = PBM_SPEED_66MHZ;
917	else
918		pbm_p->pbm_speed = PBM_SPEED_33MHZ;
919	DEBUG1(DBG_ATTACH, dip, "pbm_configure: %d mhz\n",
920	    pbm_p->pbm_speed  == PBM_SPEED_66MHZ ? 66 : 33);
921
922	/*
923	 * Enable error interrupts.
924	 */
925	if (pci_error_intr_enable & mask)
926		l |= PSYCHO_PCI_CTRL_ERR_INT_EN;
927	else
928		l &= ~PSYCHO_PCI_CTRL_ERR_INT_EN;
929
930	/*
931	 * Disable pci streaming byte errors and error interrupts.
932	 */
933	pci_sbh_error_intr_enable &= ~mask;
934	l &= ~PSYCHO_PCI_CTRL_SBH_INT_EN;
935
936	/*
937	 * Enable/disable bus parking.
938	 */
939	if ((pci_bus_parking_enable & mask) &&
940	    !ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
941	    "no-bus-parking"))
942		l |= PSYCHO_PCI_CTRL_ARB_PARK;
943	else
944		l &= ~PSYCHO_PCI_CTRL_ARB_PARK;
945
946	/*
947	 * Enable arbitration.
948	 */
949	if (pci_p->pci_side == B)
950		l = (l & ~PSYCHO_PCI_CTRL_ARB_EN_MASK) | pci_b_arb_enable;
951	else
952		l = (l & ~PSYCHO_PCI_CTRL_ARB_EN_MASK) | pci_a_arb_enable;
953
954	/*
955	 * Make sure SERR is clear
956	 */
957	l |= COMMON_PCI_CTRL_SERR;
958
959	/*
960	 * Make sure power management interrupt is disabled.
961	 */
962	l &= ~PSYCHO_PCI_CTRL_WAKEUP_EN;
963
964#ifdef _STARFIRE
965	/*
966	 * Hack to determine whether we do Starfire special handling
967	 * For starfire, we simply program a constant odd-value
968	 * (0x1D) in the MID field.
969	 *
970	 * Zero out the MID field before ORing. We leave the LSB of
971	 * the MID field intact since we cannot have a zero (even)
972	 * MID value.
973	 */
974	l &= 0xFF0FFFFFFFFFFFFFULL;
975	l |= 0x1DULL << 51;
976
977	/*
978	 * Program in the Interrupt Group Number.  Here we have to
979	 * convert the starfire 7bit upaid into a 5bit value.
980	 */
981	l |= (uint64_t)STARFIRE_UPAID2HWIGN(pbm_p->pbm_pci_p->pci_id)
982		<< COMMON_CB_CONTROL_STATUS_IGN_SHIFT;
983#endif /* _STARFIRE */
984
985	/*
986	 * Now finally write the control register with the appropriate value.
987	 */
988	DEBUG1(DBG_ATTACH, dip, "pbm_configure: ctrl reg=%llx\n", l);
989	*pbm_p->pbm_ctrl_reg = l;
990
991	/*
992	 * Allow the diag register to be set based upon variable that
993	 * can be configured via /etc/system.
994	 */
995	l = *pbm_p->pbm_diag_reg;
996	DEBUG1(DBG_ATTACH, dip, "pbm_configure: PCI diag reg==%llx\n", l);
997	if (pci_retry_disable & mask)
998		l |= COMMON_PCI_DIAG_DIS_RETRY;
999	if (pci_retry_enable & mask)
1000		l &= ~COMMON_PCI_DIAG_DIS_RETRY;
1001	if (pci_intsync_disable & mask)
1002		l |= COMMON_PCI_DIAG_DIS_INTSYNC;
1003	else
1004		l &= ~COMMON_PCI_DIAG_DIS_INTSYNC;
1005	if (pci_dwsync_disable & mask)
1006		l |= PSYCHO_PCI_DIAG_DIS_DWSYNC;
1007	else
1008		l &= ~PSYCHO_PCI_DIAG_DIS_DWSYNC;
1009	DEBUG1(DBG_ATTACH, dip, "pbm_configure: PCI diag reg=%llx\n", l);
1010	*pbm_p->pbm_diag_reg = l;
1011
1012	/*
1013	 * Enable SERR# and parity reporting via command register.
1014	 */
1015	s = pci_perr_enable & mask ? PCI_COMM_PARITY_DETECT : 0;
1016	s |= pci_serr_enable & mask ? PCI_COMM_SERR_ENABLE : 0;
1017	DEBUG1(DBG_ATTACH, dip, "pbm_configure: conf command reg=%x\n", s);
1018	pbm_p->pbm_config_header->ch_command_reg = s;
1019	DEBUG1(DBG_ATTACH, dip, "pbm_configure: conf command reg==%x\n",
1020		pbm_p->pbm_config_header->ch_command_reg);
1021
1022	/*
1023	 * The current versions of the obp are suppose to set the latency
1024	 * timer register but do not.  Bug 1234181 is open against this
1025	 * problem.  Until this bug is fixed we check to see if the obp
1026	 * has attempted to set the latency timer register by checking
1027	 * for the existence of a "latency-timer" property.
1028	 */
1029	if (pci_set_latency_timer_register) {
1030		DEBUG1(DBG_ATTACH, dip,
1031		    "pbm_configure: set psycho latency timer to %x\n",
1032			pci_latency_timer);
1033		pbm_p->pbm_config_header->ch_latency_timer_reg =
1034			pci_latency_timer;
1035	}
1036
1037	(void) ndi_prop_update_int(DDI_DEV_T_ANY, dip, "latency-timer",
1038		(int)pbm_p->pbm_config_header->ch_latency_timer_reg);
1039}
1040
1041uint_t
1042pbm_disable_pci_errors(pbm_t *pbm_p)
1043{
1044	pci_t *pci_p = pbm_p->pbm_pci_p;
1045	ib_t *ib_p = pci_p->pci_ib_p;
1046
1047	/*
1048	 * Disable error and streaming byte hole interrupts via the
1049	 * PBM control register.
1050	 */
1051	*pbm_p->pbm_ctrl_reg &=
1052		~(PSYCHO_PCI_CTRL_ERR_INT_EN | PSYCHO_PCI_CTRL_SBH_INT_EN);
1053
1054	/*
1055	 * Disable error interrupts via the interrupt mapping register.
1056	 */
1057	ib_intr_disable(ib_p, pci_p->pci_inos[CBNINTR_PBM], IB_INTR_NOWAIT);
1058	return (BF_NONE);
1059}
1060
1061/*ARGSUSED*/
1062uint64_t
1063pci_sc_configure(pci_t *pci_p)
1064{
1065	return (0);
1066}
1067
1068/*ARGSUSED*/
1069void
1070pci_pbm_dma_sync(pbm_t *pbm_p, ib_ino_t ino)
1071{
1072	uint64_t pa = pbm_p->pbm_sync_reg_pa;
1073	if (pa)
1074		(void) lddphysio(pa);		/* Load from Sync Register */
1075}
1076
1077/*ARGSUSED*/
1078dvma_context_t
1079pci_iommu_get_dvma_context(iommu_t *iommu_p, dvma_addr_t dvma_pg_index)
1080{
1081	ASSERT(0);
1082	return (0);
1083}
1084
1085/*ARGSUSED*/
1086void
1087pci_iommu_free_dvma_context(iommu_t *iommu_p, dvma_context_t ctx)
1088{
1089	ASSERT(0);
1090}
1091
1092void
1093pci_iommu_config(iommu_t *iommu_p, uint64_t iommu_ctl, uint64_t cfgpa)
1094{
1095	volatile uint64_t *pbm_csr_p = (volatile uint64_t *)
1096		get_pbm_reg_base(iommu_p->iommu_pci_p);
1097	volatile uint64_t pbm_ctl = *pbm_csr_p;
1098
1099	volatile uint64_t *iommu_ctl_p = iommu_p->iommu_ctrl_reg;
1100	volatile uint64_t tsb_bar_val = iommu_p->iommu_tsb_paddr;
1101	volatile uint64_t *tsb_bar_p = iommu_p->iommu_tsb_base_addr_reg;
1102
1103	DEBUG2(DBG_ATTACH, iommu_p->iommu_pci_p->pci_dip,
1104		"\npci_iommu_config: pbm_csr_p=%016llx pbm_ctl=%016llx",
1105		pbm_csr_p, pbm_ctl);
1106	DEBUG2(DBG_ATTACH|DBG_CONT, iommu_p->iommu_pci_p->pci_dip,
1107		"\n\tiommu_ctl_p=%016llx iommu_ctl=%016llx",
1108		iommu_ctl_p, iommu_ctl);
1109	DEBUG2(DBG_ATTACH|DBG_CONT, iommu_p->iommu_pci_p->pci_dip,
1110		"\n\tcfgpa=%016llx tsb_bar_val=%016llx", cfgpa, tsb_bar_val);
1111
1112	if (!cfgpa)
1113		goto reprog;
1114
1115	/* disable PBM arbiters - turn off bits 0-7 */
1116	*pbm_csr_p = (pbm_ctl >> 8) << 8;
1117
1118	/* make sure we own the bus by reading any child device config space */
1119	(void) ldphysio(cfgpa); /* also flushes the prev write */
1120reprog:
1121	*tsb_bar_p = tsb_bar_val;
1122	*iommu_ctl_p = iommu_ctl;
1123
1124	*pbm_csr_p = pbm_ctl;	/* re-enable bus arbitration */
1125	pbm_ctl = *pbm_csr_p;	/* flush all prev writes */
1126}
1127
1128int
1129pci_sc_ctx_inv(dev_info_t *dip, sc_t *sc_p, ddi_dma_impl_t *mp)
1130{
1131	ASSERT(0);
1132	return (DDI_FAILURE);
1133}
1134
1135void
1136pci_cb_setup(pci_t *pci_p)
1137{
1138	uint64_t csr, csr_pa, pa;
1139	cb_t *cb_p = pci_p->pci_cb_p;
1140
1141	/* cb_p->cb_node_id = 0; */
1142	cb_p->cb_ign = PCI_ID_TO_IGN(pci_p->pci_id);
1143	pa = (uint64_t)hat_getpfnum(kas.a_hat, pci_p->pci_address[0]);
1144	cb_p->cb_base_pa  = pa = pa >> (32 - MMU_PAGESHIFT) << 32;
1145	cb_p->cb_map_pa = pa + PSYCHO_IB_OBIO_INTR_MAP_REG_OFFSET;
1146	cb_p->cb_clr_pa = pa + PSYCHO_IB_OBIO_CLEAR_INTR_REG_OFFSET;
1147	cb_p->cb_obsta_pa = pa + COMMON_IB_OBIO_INTR_STATE_DIAG_REG;
1148
1149	csr_pa = pa + PSYCHO_CB_CONTROL_STATUS_REG_OFFSET;
1150	csr = lddphysio(csr_pa);
1151
1152	/*
1153	 * Clear any pending address parity errors.
1154	 */
1155	if (csr & COMMON_CB_CONTROL_STATUS_APERR) {
1156		csr |= COMMON_CB_CONTROL_STATUS_APERR;
1157		cmn_err(CE_WARN, "clearing UPA address parity error\n");
1158	}
1159	csr |= COMMON_CB_CONTROL_STATUS_APCKEN;
1160	csr &= ~COMMON_CB_CONTROL_STATUS_IAP;
1161	stdphysio(csr_pa, csr);
1162
1163#ifdef _STARFIRE
1164	/* Setup Starfire interrupt target translation */
1165	pc_ittrans_init(pci_p->pci_id, &cb_p->cb_ittrans_cookie);
1166#endif /* _STARFIRE */
1167
1168}
1169
1170void
1171pci_ecc_setup(ecc_t *ecc_p)
1172{
1173	ecc_p->ecc_ue.ecc_errpndg_mask = 0;
1174	ecc_p->ecc_ue.ecc_offset_mask = PSYCHO_ECC_UE_AFSR_DW_OFFSET;
1175	ecc_p->ecc_ue.ecc_offset_shift = PSYCHO_ECC_UE_AFSR_DW_OFFSET_SHIFT;
1176	ecc_p->ecc_ue.ecc_size_log2 = 3;
1177
1178	ecc_p->ecc_ce.ecc_errpndg_mask = 0;
1179	ecc_p->ecc_ce.ecc_offset_mask = PSYCHO_ECC_CE_AFSR_DW_OFFSET;
1180	ecc_p->ecc_ce.ecc_offset_shift = PSYCHO_ECC_CE_AFSR_DW_OFFSET_SHIFT;
1181	ecc_p->ecc_ce.ecc_size_log2 = 3;
1182}
1183
1184/*
1185 * overwrite dvma end address (only on virtual-dma systems)
1186 * initialize tsb size
1187 * reset context bits
1188 * return: IOMMU CSR bank base address (VA)
1189 */
1190uintptr_t
1191pci_iommu_setup(iommu_t *iommu_p)
1192{
1193	pci_dvma_range_prop_t *dvma_prop;
1194	int dvma_prop_len;
1195
1196	pci_t *pci_p = iommu_p->iommu_pci_p;
1197	dev_info_t *dip = pci_p->pci_dip;
1198	uint_t tsb_size = iommu_tsb_cookie_to_size(pci_p->pci_tsb_cookie);
1199	uint_t tsb_size_prop;
1200
1201	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1202		"virtual-dma", (caddr_t)&dvma_prop, &dvma_prop_len) !=
1203		DDI_PROP_SUCCESS)
1204		goto tsb_done;
1205
1206	if (dvma_prop_len != sizeof (pci_dvma_range_prop_t)) {
1207		cmn_err(CE_WARN, "%s%d: invalid virtual-dma property",
1208			ddi_driver_name(dip), ddi_get_instance(dip));
1209		goto tsb_end;
1210	}
1211	iommu_p->iommu_dvma_end = dvma_prop->dvma_base +
1212		(dvma_prop->dvma_len - 1);
1213	tsb_size_prop = IOMMU_BTOP(dvma_prop->dvma_len) * sizeof (uint64_t);
1214	tsb_size = MIN(tsb_size_prop, tsb_size);
1215tsb_end:
1216	kmem_free(dvma_prop, dvma_prop_len);
1217tsb_done:
1218	iommu_p->iommu_tsb_size = iommu_tsb_size_encode(tsb_size);
1219
1220	if (CHIP_TYPE(pci_p) != PCI_CHIP_HUMMINGBIRD)
1221		pci_preserve_iommu_tsb = 0;
1222
1223	/*
1224	 * Psycho has no context support.
1225	 */
1226	iommu_p->iommu_ctx_bitmap = NULL;
1227	iommu_p->iommu_flush_ctx_reg = NULL;
1228	pci_use_contexts = 0;
1229	pci_sc_use_contexts = 0;
1230
1231	/*
1232	 * Determine the virtual address of the register block
1233	 * containing the iommu control registers.
1234	 */
1235	return (get_reg_base(pci_p));
1236}
1237
1238/*ARGSUSED*/
1239void
1240pci_iommu_teardown(iommu_t *iommu_p)
1241{
1242}
1243
1244/* The psycho+ PBM reg base is at 1fe.0000.2000 */
1245uintptr_t
1246get_pbm_reg_base(pci_t *pci_p)
1247{
1248	return ((uintptr_t)(pci_p->pci_address[0] +
1249		(pci_stream_buf_exists ? 0 : PSYCHO_PCI_PBM_REG_BASE)));
1250}
1251
1252void
1253pci_post_uninit_child(pci_t *pci_p)
1254{
1255}
1256
1257void
1258pci_pbm_setup(pbm_t *pbm_p)
1259{
1260	pci_t *pci_p = pbm_p->pbm_pci_p;
1261
1262	/*
1263	 * Get the base virtual address for the PBM control block.
1264	 */
1265	uintptr_t a = get_pbm_reg_base(pci_p);
1266
1267	/*
1268	 * Get the virtual address of the PCI configuration header.
1269	 * This should be mapped little-endian.
1270	 */
1271	pbm_p->pbm_config_header =
1272		(config_header_t *)get_config_reg_base(pci_p);
1273
1274	/*
1275	 * Get the virtual addresses for control, error and diag
1276	 * registers.
1277	 */
1278	pbm_p->pbm_ctrl_reg = (uint64_t *)(a + PSYCHO_PCI_CTRL_REG_OFFSET);
1279	pbm_p->pbm_diag_reg = (uint64_t *)(a + PSYCHO_PCI_DIAG_REG_OFFSET);
1280	pbm_p->pbm_async_flt_status_reg =
1281		(uint64_t *)(a + PSYCHO_PCI_ASYNC_FLT_STATUS_REG_OFFSET);
1282	pbm_p->pbm_async_flt_addr_reg =
1283		(uint64_t *)(a + PSYCHO_PCI_ASYNC_FLT_ADDR_REG_OFFSET);
1284
1285	if (CHIP_TYPE(pci_p) >= PCI_CHIP_SABRE)
1286		pbm_p->pbm_sync_reg_pa =
1287			pci_p->pci_cb_p->cb_base_pa + DMA_WRITE_SYNC_REG;
1288}
1289
1290/*ARGSUSED*/
1291void
1292pci_pbm_teardown(pbm_t *pbm_p)
1293{
1294}
1295
1296void
1297pci_sc_setup(sc_t *sc_p)
1298{
1299	pci_t *pci_p = sc_p->sc_pci_p;
1300
1301	/*
1302	 * Determine the virtual addresses of the streaming cache
1303	 * control/status and flush registers.
1304	 */
1305	uintptr_t a = get_pbm_reg_base(pci_p);
1306	sc_p->sc_ctrl_reg = (uint64_t *)(a + PSYCHO_SC_CTRL_REG_OFFSET);
1307	sc_p->sc_invl_reg = (uint64_t *)(a + PSYCHO_SC_INVL_REG_OFFSET);
1308	sc_p->sc_sync_reg = (uint64_t *)(a + PSYCHO_SC_SYNC_REG_OFFSET);
1309
1310	/*
1311	 * Determine the virtual addresses of the streaming cache
1312	 * diagnostic access registers.
1313	 */
1314	a = get_reg_base(pci_p);
1315	if (pci_p->pci_bus_range.lo != 0) {
1316		sc_p->sc_data_diag_acc = (uint64_t *)
1317				(a + PSYCHO_SC_A_DATA_DIAG_OFFSET);
1318		sc_p->sc_tag_diag_acc = (uint64_t *)
1319				(a + PSYCHO_SC_A_TAG_DIAG_OFFSET);
1320		sc_p->sc_ltag_diag_acc = (uint64_t *)
1321				(a + PSYCHO_SC_A_LTAG_DIAG_OFFSET);
1322	} else {
1323		sc_p->sc_data_diag_acc = (uint64_t *)
1324				(a + PSYCHO_SC_B_DATA_DIAG_OFFSET);
1325		sc_p->sc_tag_diag_acc = (uint64_t *)
1326				(a + PSYCHO_SC_B_TAG_DIAG_OFFSET);
1327		sc_p->sc_ltag_diag_acc = (uint64_t *)
1328				(a + PSYCHO_SC_B_LTAG_DIAG_OFFSET);
1329	}
1330}
1331
1332int
1333pci_get_numproxy(dev_info_t *dip)
1334{
1335	return (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1336		"#upa-interrupt-proxies", 1));
1337}
1338
1339int
1340pci_get_portid(dev_info_t *dip)
1341{
1342	return (ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1343	    "upa-portid", -1));
1344}
1345
1346/*
1347 * pbm_has_pass_1_cheerio
1348 *
1349 *
1350 * Given a PBM soft state pointer, this routine scans it child nodes
1351 * to see if one is a pass 1 cheerio.
1352 *
1353 * return value: 1 if pass 1 cheerio is found, 0 otherwise
1354 */
1355static int
1356pbm_has_pass_1_cheerio(pci_t *pci_p)
1357{
1358	dev_info_t *cdip;
1359	int found = 0;
1360	char *s;
1361	int rev;
1362
1363	cdip = ddi_get_child(pci_p->pci_dip);
1364	while (cdip != NULL && found == 0) {
1365		s = ddi_get_name(cdip);
1366		if (strcmp(s, "ebus") == 0 || strcmp(s, "pci108e,1000") == 0) {
1367			rev =
1368			    ddi_getprop(DDI_DEV_T_ANY, cdip, DDI_PROP_DONTPASS,
1369				"revision-id", 0);
1370			if (rev == 0)
1371				found = 1;
1372		}
1373		cdip = ddi_get_next_sibling(cdip);
1374	}
1375	return (found);
1376}
1377
1378/*
1379 * Psycho Performance Events.
1380 */
1381pci_kev_mask_t
1382psycho_pci_events[] = {
1383	{"dvma_stream_rd_a", 0x0},	{"dvma_stream_wr_a", 0x1},
1384	{"dvma_const_rd_a", 0x2},	{"dvma_const_wr_a", 0x3},
1385	{"dvma_stream_buf_mis_a", 0x4}, {"dvma_cycles_a", 0x5},
1386	{"dvma_wd_xfr_a", 0x6},		{"pio_cycles_a", 0x7},
1387	{"dvma_stream_rd_b", 0x8},	{"dvma_stream_wr_b", 0x9},
1388	{"dvma_const_rd_b", 0xa},	{"dvma_const_wr_b", 0xb},
1389	{"dvma_stream_buf_mis_b", 0xc}, {"dvma_cycles_b", 0xd},
1390	{"dvma_wd_xfr_b", 0xe},		{"pio_cycles_b", 0xf},
1391	{"dvma_tlb_misses", 0x10},	{"interrupts", 0x11},
1392	{"upa_inter_nack", 0x12},	{"pio_reads", 0x13},
1393	{"pio_writes", 0x14},		{"merge_buffer", 0x15},
1394	{"dma_tbwalk_a", 0x16},		{"dma_stc_a", 0x17},
1395	{"dma_tbwalk_b", 0x18},		{"dma_stc_b", 0x19},
1396	{"clear_pic", 0x1f}
1397};
1398
1399/*
1400 * Create the picN kstat's.
1401 */
1402void
1403pci_kstat_init()
1404{
1405	pci_name_kstat = (pci_ksinfo_t *)kmem_alloc(sizeof (pci_ksinfo_t),
1406		KM_NOSLEEP);
1407
1408	if (pci_name_kstat == NULL) {
1409		cmn_err(CE_WARN, "pcipsy : no space for kstat\n");
1410	} else {
1411		pci_name_kstat->pic_no_evs =
1412			sizeof (psycho_pci_events) / sizeof (pci_kev_mask_t);
1413		pci_name_kstat->pic_shift[0] = PSYCHO_SHIFT_PIC0;
1414		pci_name_kstat->pic_shift[1] = PSYCHO_SHIFT_PIC1;
1415		pci_create_name_kstat("pcip",
1416			pci_name_kstat, psycho_pci_events);
1417	}
1418}
1419
1420/*
1421 * Called from _fini()
1422 */
1423void
1424pci_kstat_fini()
1425{
1426	if (pci_name_kstat != NULL) {
1427		pci_delete_name_kstat(pci_name_kstat);
1428		kmem_free(pci_name_kstat, sizeof (pci_ksinfo_t));
1429		pci_name_kstat = NULL;
1430	}
1431}
1432
1433/* ARGSUSED */
1434void
1435pci_add_pci_kstat(pci_t *pci_p)
1436{
1437}
1438
1439/* ARGSUSED */
1440void
1441pci_rem_pci_kstat(pci_t *pci_p)
1442{
1443}
1444
1445/*
1446 * Create the performance 'counters' kstat.
1447 */
1448void
1449pci_add_upstream_kstat(pci_t *pci_p)
1450{
1451	pci_common_t 	*cmn_p = pci_p->pci_common_p;
1452	pci_cntr_pa_t	*cntr_pa_p = &cmn_p->pci_cmn_uks_pa;
1453	uint64_t regbase = va_to_pa((void *)get_reg_base(pci_p));
1454
1455	cntr_pa_p->pcr_pa = regbase + PSYCHO_PERF_PCR_OFFSET;
1456	cntr_pa_p->pic_pa = regbase + PSYCHO_PERF_PIC_OFFSET;
1457	cmn_p->pci_common_uksp = pci_create_cntr_kstat(pci_p, "pcip",
1458		NUM_OF_PICS, pci_cntr_kstat_pa_update, cntr_pa_p);
1459}
1460
1461/*
1462 * Extract the drivers binding name to identify which chip
1463 * we're binding to.  Whenever a new bus bridge is created, the driver alias
1464 * entry should be added here to identify the device if needed.  If a device
1465 * isn't added, the identity defaults to PCI_CHIP_UNIDENTIFIED.
1466 */
1467static uint32_t
1468pci_identity_init(pci_t *pci_p)
1469{
1470	dev_info_t *dip = pci_p->pci_dip;
1471	char *name = ddi_binding_name(dip);
1472
1473	if (strcmp(name, "pci108e,8000") == 0)
1474		return (CHIP_ID(PCI_CHIP_PSYCHO, 0x00, 0x00));
1475	if (strcmp(name, "pci108e,a000") == 0)
1476		return (CHIP_ID(PCI_CHIP_SABRE, 0x00, 0x00));
1477	if (strcmp(name, "pci108e,a001") == 0)
1478		return (CHIP_ID(PCI_CHIP_HUMMINGBIRD, 0x00, 0x00));
1479	cmn_err(CE_CONT, "?%s%d:using default chip identity\n",
1480		ddi_driver_name(dip), ddi_get_instance(dip));
1481	return (CHIP_ID(PCI_CHIP_PSYCHO, 0x00, 0x00));
1482}
1483
1484/*ARGSUSED*/
1485void
1486pci_post_init_child(pci_t *pci_p, dev_info_t *child)
1487{
1488}
1489
1490/*ARGSUSED*/
1491int
1492pci_pbm_add_intr(pci_t *pci_p)
1493{
1494	return (DDI_SUCCESS);
1495}
1496
1497/*ARGSUSED*/
1498void
1499pci_pbm_rem_intr(pci_t *pci_p)
1500{
1501}
1502
1503/*ARGSUSED*/
1504void
1505pci_pbm_suspend(pci_t *pci_p)
1506{
1507}
1508
1509/*ARGSUSED*/
1510void
1511pci_pbm_resume(pci_t *pci_p)
1512{
1513}
1514
1515/*
1516 * pcipsy error handling 101:
1517 *
1518 * The various functions below are responsible for error handling. Given
1519 * a particular error, they must gather the appropriate state, report all
1520 * errors with correct payload, and attempt recovery where ever possible.
1521 *
1522 * Recovery in the context of this driver is being able notify a leaf device
1523 * of the failed transaction. This leaf device may either be the master or
1524 * target for this transaction and may have already received an error
1525 * notification via a PCI interrupt. Notification is done via DMA and access
1526 * handles. If we capture an address for the transaction then we can map it
1527 * to a handle(if the leaf device is fma-compliant) and fault the handle as
1528 * well as call the device driver registered callback.
1529 *
1530 * The hardware can either interrupt or trap upon detection of an error, in
1531 * some rare cases it also causes a fatal reset.
1532 *
1533 * pbm_error_intr() and ecc_intr() are responsible for PCI Block Module
1534 * errors(generic PCI + bridge specific) and ECC errors, respectively. They
1535 * are common between pcisch and pcipsy and therefore exist in pci_pbm.c and
1536 * pci_ecc.c. To support error handling certain chip specific handlers
1537 * must exist and they are defined below.
1538 *
1539 * cpu_deferred_error() and cpu_async_error(), handle the traps that may
1540 * have originated from IO space. They call into the registered IO callbacks
1541 * to report and handle errors that may have caused the trap.
1542 *
1543 * pci_pbm_err_handler() is called by pbm_error_intr() or pci_err_callback()
1544 * (generic fma callback for pcipsy/pcisch, pci_fm.c). pci_err_callback() is
1545 * called when the CPU has trapped because of a possible IO error(TO/BERR/UE).
1546 * It will call pci_pbm_err_handler() to report and handle all PCI/PBM/IOMMU
1547 * related errors which are detected by the chip.
1548 *
1549 * pci_pbm_err_handler() calls a generic interface pbm_afsr_report()(pci_pbm.c)
1550 * to report the pbm specific errors and attempt to map the failed address
1551 * (if captured) to a device instance. pbm_afsr_report() calls a chip specific
1552 * interface to interpret the afsr bits pci_pbm_classify()(pcisch.c/pcipsy.c).
1553 *
1554 * ecc_err_handler()(pci_ecc.c) also calls a chip specific interface to
1555 * interpret the afsr, pci_ecc_classify(). ecc_err_handler() also calls
1556 * pci_pbm_err_handler() and ndi_fm_handler_dispatch() to log any related
1557 * errors.
1558 *
1559 * To make sure that the trap code and the interrupt code are not going
1560 * to step on each others toes we have a per chip pci_fm_mutex. This also
1561 * makes it necessary for us to be cautious while we are at a high PIL, so
1562 * that we do not cause a subsequent trap that causes us to hang.
1563 *
1564 * The attempt to commonize code was meant to keep in line with the current
1565 * pci driver implementation and it was not meant to confuse. If you are
1566 * confused then don't worry, I was too.
1567 */
1568
1569/*
1570 * For Psycho, a UE is always fatal, except if it is a translation error on a
1571 * Darwin platform.  We ignore these because they do not cause data corruption.
1572 */
1573int
1574ecc_ue_is_fatal(struct async_flt *ecc)
1575{
1576	return (((uint_t)(ecc->flt_stat >> SABRE_UE_AFSR_PDTE_SHIFT) &
1577	    SABRE_UE_AFSR_E_PDTE) == 0);
1578}
1579
1580/*
1581 * pci_ecc_classify, called by ecc_handler to classify ecc errors
1582 * and determine if we should panic or not.
1583 *
1584 * Note that it is possible yet extremely rare for more than one
1585 * primary error bit to be set.  We classify the ecc error based
1586 * on the first set bit that is found.
1587 */
1588void
1589pci_ecc_classify(uint64_t err, ecc_errstate_t *ecc_err_p)
1590{
1591	struct async_flt *ecc = &ecc_err_p->ecc_aflt;
1592	pci_common_t *cmn_p = ecc_err_p->ecc_ii_p.ecc_p->ecc_pci_cmn_p;
1593
1594	ASSERT(MUTEX_HELD(&cmn_p->pci_fm_mutex));
1595
1596	ecc_err_p->ecc_bridge_type = PCI_BRIDGE_TYPE(cmn_p);
1597	/*
1598	 * Get the parent bus id that caused the error.
1599	 */
1600	ecc_err_p->ecc_dev_id = (ecc_err_p->ecc_afsr & PSYCHO_ECC_UE_AFSR_ID)
1601			>> PSYCHO_ECC_UE_AFSR_ID_SHIFT;
1602	/*
1603	 * Determine the doubleword offset of the error.
1604	 */
1605	ecc_err_p->ecc_dw_offset = (ecc_err_p->ecc_afsr &
1606			PSYCHO_ECC_UE_AFSR_DW_OFFSET)
1607			>> PSYCHO_ECC_UE_AFSR_DW_OFFSET_SHIFT;
1608	/*
1609	 * Determine the primary error type.
1610	 */
1611	if (err & COMMON_ECC_AFSR_E_PIO) {
1612		if (ecc_err_p->ecc_ii_p.ecc_type == CBNINTR_UE) {
1613			if (ecc_err_p->ecc_pri) {
1614				ecc->flt_erpt_class = PCI_ECC_PIO_UE;
1615			} else {
1616				ecc->flt_erpt_class = PCI_ECC_SEC_PIO_UE;
1617			}
1618			ecc->flt_panic = ecc_ue_is_fatal(&ecc_err_p->ecc_aflt);
1619		} else {
1620			ecc->flt_erpt_class = ecc_err_p->ecc_pri ?
1621				PCI_ECC_PIO_CE : PCI_ECC_SEC_PIO_CE;
1622			return;
1623		}
1624	} else if (err & COMMON_ECC_AFSR_E_DRD) {
1625		if (ecc_err_p->ecc_ii_p.ecc_type == CBNINTR_UE) {
1626			if (ecc_err_p->ecc_pri) {
1627				ecc->flt_erpt_class = PCI_ECC_DRD_UE;
1628			} else {
1629				ecc->flt_erpt_class = PCI_ECC_SEC_DRD_UE;
1630			}
1631			ecc->flt_panic = ecc_ue_is_fatal(&ecc_err_p->ecc_aflt);
1632		} else {
1633			ecc->flt_erpt_class = ecc_err_p->ecc_pri ?
1634				PCI_ECC_DRD_CE : PCI_ECC_SEC_DRD_CE;
1635			return;
1636		}
1637	} else if (err & COMMON_ECC_AFSR_E_DWR) {
1638		if (ecc_err_p->ecc_ii_p.ecc_type == CBNINTR_UE) {
1639			if (ecc_err_p->ecc_pri) {
1640				ecc->flt_erpt_class = PCI_ECC_DWR_UE;
1641			} else {
1642				ecc->flt_erpt_class = PCI_ECC_SEC_DWR_UE;
1643			}
1644			ecc->flt_panic = ecc_ue_is_fatal(&ecc_err_p->ecc_aflt);
1645		} else {
1646			ecc->flt_erpt_class = ecc_err_p->ecc_pri ?
1647				PCI_ECC_DWR_CE : PCI_ECC_SEC_DWR_CE;
1648			return;
1649		}
1650	}
1651}
1652
1653ushort_t
1654pci_ecc_get_synd(uint64_t afsr)
1655{
1656	return ((ushort_t)((afsr & PSYCHO_ECC_CE_AFSR_SYND)
1657		>> PSYCHO_ECC_CE_AFSR_SYND_SHIFT));
1658}
1659
1660/*
1661 * pci_pbm_classify, called by pbm_afsr_report to classify piow afsr.
1662 */
1663int
1664pci_pbm_classify(pbm_errstate_t *pbm_err_p)
1665{
1666	uint32_t e;
1667	int nerr = 0;
1668	char **tmp_class;
1669
1670	if (pbm_err_p->pbm_pri) {
1671		tmp_class = &pbm_err_p->pbm_pci.pci_err_class;
1672		e = PBM_AFSR_TO_PRIERR(pbm_err_p->pbm_afsr);
1673		pbm_err_p->pbm_log = FM_LOG_PCI;
1674	} else {
1675		tmp_class = &pbm_err_p->pbm_err_class;
1676		e = PBM_AFSR_TO_SECERR(pbm_err_p->pbm_afsr);
1677		pbm_err_p->pbm_log = FM_LOG_PBM;
1678	}
1679
1680	if (e & PSYCHO_PCI_AFSR_E_MA) {
1681		*tmp_class = pbm_err_p->pbm_pri ? PCI_MA : PCI_SEC_MA;
1682		nerr++;
1683	}
1684	if (e & PSYCHO_PCI_AFSR_E_TA) {
1685		*tmp_class = pbm_err_p->pbm_pri ? PCI_REC_TA : PCI_SEC_REC_TA;
1686		nerr++;
1687	}
1688	if (e & PSYCHO_PCI_AFSR_E_RTRY) {
1689		pbm_err_p->pbm_err_class = pbm_err_p->pbm_pri ?
1690		    PCI_PBM_RETRY : PCI_SEC_PBM_RETRY;
1691		pbm_err_p->pbm_log = FM_LOG_PBM;
1692		nerr++;
1693	}
1694	if (e & PSYCHO_PCI_AFSR_E_PERR) {
1695		*tmp_class = pbm_err_p->pbm_pri ? PCI_MDPE : PCI_SEC_MDPE;
1696		nerr++;
1697	}
1698	return (nerr);
1699}
1700
1701/*
1702 * Function used to clear PBM/PCI/IOMMU error state after error handling
1703 * is complete. Only clearing error bits which have been logged. Called by
1704 * pci_pbm_err_handler and pci_bus_exit.
1705 */
1706static void
1707pci_clear_error(pci_t *pci_p, pbm_errstate_t *pbm_err_p)
1708{
1709	pbm_t *pbm_p = pci_p->pci_pbm_p;
1710
1711	ASSERT(MUTEX_HELD(&pbm_p->pbm_pci_p->pci_common_p->pci_fm_mutex));
1712
1713	*pbm_p->pbm_ctrl_reg = pbm_err_p->pbm_ctl_stat;
1714	*pbm_p->pbm_async_flt_status_reg = pbm_err_p->pbm_afsr;
1715	pbm_p->pbm_config_header->ch_status_reg =
1716		pbm_err_p->pbm_pci.pci_cfg_stat;
1717}
1718
1719/*ARGSUSED*/
1720int
1721pci_pbm_err_handler(dev_info_t *dip, ddi_fm_error_t *derr,
1722		const void *impl_data, int caller)
1723{
1724	int fatal = 0;
1725	int nonfatal = 0;
1726	int unknown = 0;
1727	uint32_t prierr, secerr;
1728	pbm_errstate_t pbm_err;
1729	char buf[FM_MAX_CLASS];
1730	pci_t *pci_p = (pci_t *)impl_data;
1731	pbm_t *pbm_p = pci_p->pci_pbm_p;
1732	int ret = 0;
1733	uint64_t pbm_ctl_stat;
1734	uint16_t pci_cfg_stat;
1735
1736	ASSERT(MUTEX_HELD(&pci_p->pci_common_p->pci_fm_mutex));
1737	pci_pbm_errstate_get(pci_p, &pbm_err);
1738
1739	derr->fme_ena = derr->fme_ena ? derr->fme_ena :
1740	    fm_ena_generate(0, FM_ENA_FMT1);
1741
1742	prierr = PBM_AFSR_TO_PRIERR(pbm_err.pbm_afsr);
1743	secerr = PBM_AFSR_TO_SECERR(pbm_err.pbm_afsr);
1744
1745	if (derr->fme_flag == DDI_FM_ERR_EXPECTED) {
1746		if (caller == PCI_TRAP_CALL) {
1747			/*
1748			 * For ddi_caut_get treat all events as
1749			 * nonfatal. The trampoline will set
1750			 * err_ena = 0, err_status = NONFATAL. We only
1751			 * really call this function so that pci_clear_error()
1752			 * and ndi_fm_handler_dispatch() will get called.
1753			 */
1754			derr->fme_status = DDI_FM_NONFATAL;
1755			nonfatal++;
1756			goto done;
1757		} else {
1758			/*
1759			 * For ddi_caut_put treat all events as nonfatal. Here
1760			 * we have the handle and can call ndi_fm_acc_err_set().
1761			 */
1762			derr->fme_status = DDI_FM_NONFATAL;
1763			ndi_fm_acc_err_set(pbm_p->pbm_excl_handle, derr);
1764			nonfatal++;
1765			goto done;
1766		}
1767	} else if (derr->fme_flag == DDI_FM_ERR_PEEK) {
1768		/*
1769		 * For ddi_peek treat all events as nonfatal. We only
1770		 * really call this function so that pci_clear_error()
1771		 * and ndi_fm_handler_dispatch() will get called.
1772		 */
1773		nonfatal++;
1774		goto done;
1775	} else if (derr->fme_flag == DDI_FM_ERR_POKE) {
1776		/*
1777		 * For ddi_poke we can treat as nonfatal if the
1778		 * following conditions are met :
1779		 * 1. Make sure only primary error is MA/TA
1780		 * 2. Make sure no secondary error
1781		 * 3. check pci config header stat reg to see MA/TA is
1782		 *    logged. We cannot verify only MA/TA is recorded
1783		 *    since it gets much more complicated when a
1784		 *    PCI-to-PCI bridge is present.
1785		 */
1786		if ((prierr == PSYCHO_PCI_AFSR_E_MA) && !secerr &&
1787		    (pbm_err.pbm_pci.pci_cfg_stat & PCI_STAT_R_MAST_AB)) {
1788			nonfatal++;
1789			goto done;
1790		}
1791		if ((prierr == PSYCHO_PCI_AFSR_E_TA) && !secerr &&
1792		    (pbm_err.pbm_pci.pci_cfg_stat & PCI_STAT_R_TARG_AB)) {
1793			nonfatal++;
1794			goto done;
1795		}
1796	}
1797
1798	if (prierr || secerr) {
1799		ret = pbm_afsr_report(dip, derr->fme_ena, &pbm_err);
1800		if (ret == DDI_FM_FATAL)
1801			fatal++;
1802		else
1803			nonfatal++;
1804	}
1805
1806	ret = pci_cfg_report(dip, derr, &pbm_err.pbm_pci, caller, prierr);
1807	if (ret == DDI_FM_FATAL)
1808		fatal++;
1809	else if (ret == DDI_FM_NONFATAL)
1810		nonfatal++;
1811
1812	pbm_ctl_stat = pbm_err.pbm_ctl_stat;
1813	pci_cfg_stat = pbm_err.pbm_pci.pci_cfg_stat;
1814
1815	/*
1816	 * PBM Received System Error - During any transaction, or
1817	 * at any point on the bus, some device may detect a critical
1818	 * error and signal a system error to the system.
1819	 */
1820	if (pbm_ctl_stat & COMMON_PCI_CTRL_SERR) {
1821		/*
1822		 * may be expected (master abort from pci-pci bridge during
1823		 * poke will generate SERR)
1824		 */
1825		if (derr->fme_flag != DDI_FM_ERR_POKE) {
1826			pbm_err.pbm_pci.pci_err_class = PCI_REC_SERR;
1827			(void) snprintf(buf, FM_MAX_CLASS, "%s.%s",
1828			    PCI_ERROR_SUBCLASS, pbm_err.pbm_pci.pci_err_class);
1829			ddi_fm_ereport_post(dip, buf, derr->fme_ena,
1830			    DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 0,
1831			    PCI_CONFIG_STATUS, DATA_TYPE_UINT16, pci_cfg_stat,
1832			    PCI_CONFIG_COMMAND, DATA_TYPE_UINT16,
1833			    pbm_err.pbm_pci.pci_cfg_comm, PCI_PA,
1834			    DATA_TYPE_UINT64, (uint64_t)0, NULL);
1835		}
1836		unknown++;
1837	}
1838
1839	/* Streaming Byte Hole Error */
1840	if (pbm_ctl_stat & COMMON_PCI_CTRL_SBH_ERR) {
1841		if (pci_panic_on_sbh_errors)
1842			fatal++;
1843		else
1844			nonfatal++;
1845		pbm_err.pbm_err_class = PCI_PSY_SBH;
1846		pbm_ereport_post(dip, derr->fme_ena, &pbm_err);
1847	}
1848done:
1849	ret = ndi_fm_handler_dispatch(dip, NULL, derr);
1850	if (ret == DDI_FM_FATAL) {
1851		fatal++;
1852	} else if (ret == DDI_FM_NONFATAL) {
1853		nonfatal++;
1854	} else if (ret == DDI_FM_UNKNOWN) {
1855		unknown++;
1856	}
1857
1858	/*
1859	 * rserr not claimed as nonfatal by a child is treated as fatal
1860	 */
1861	if (unknown && !nonfatal && !fatal)
1862		fatal++;
1863
1864	/* Cleanup and reset error bits */
1865	pci_clear_error(pci_p, &pbm_err);
1866
1867	return (fatal ? DDI_FM_FATAL : (nonfatal ? DDI_FM_NONFATAL :
1868	    (unknown ? DDI_FM_UNKNOWN : DDI_FM_OK)));
1869}
1870
1871int
1872pci_check_error(pci_t *pci_p)
1873{
1874	pbm_t *pbm_p = pci_p->pci_pbm_p;
1875	uint16_t pci_cfg_stat;
1876	uint64_t pbm_ctl_stat, pbm_afsr;
1877
1878	ASSERT(MUTEX_HELD(&pci_p->pci_common_p->pci_fm_mutex));
1879
1880	pci_cfg_stat = pbm_p->pbm_config_header->ch_status_reg;
1881	pbm_ctl_stat = *pbm_p->pbm_ctrl_reg;
1882	pbm_afsr = *pbm_p->pbm_async_flt_status_reg;
1883
1884	if ((pci_cfg_stat & (PCI_STAT_S_PERROR | PCI_STAT_S_TARG_AB |
1885				PCI_STAT_R_TARG_AB | PCI_STAT_R_MAST_AB |
1886				PCI_STAT_S_SYSERR | PCI_STAT_PERROR)) ||
1887			(pbm_ctl_stat & (COMMON_PCI_CTRL_SBH_ERR |
1888				COMMON_PCI_CTRL_SERR)) ||
1889			(PBM_AFSR_TO_PRIERR(pbm_afsr)))
1890		return (1);
1891
1892	return (0);
1893
1894}
1895
1896/*
1897 * Function used to gather PBM/PCI error state for the
1898 * pci_pbm_err_handler. This function must be called while pci_fm_mutex
1899 * is held.
1900 */
1901static void
1902pci_pbm_errstate_get(pci_t *pci_p, pbm_errstate_t *pbm_err_p)
1903{
1904	pbm_t *pbm_p = pci_p->pci_pbm_p;
1905
1906	ASSERT(MUTEX_HELD(&pci_p->pci_common_p->pci_fm_mutex));
1907	bzero(pbm_err_p, sizeof (pbm_errstate_t));
1908
1909	/*
1910	 * Capture all pbm error state for later logging
1911	 */
1912	pbm_err_p->pbm_bridge_type = PCI_BRIDGE_TYPE(pci_p->pci_common_p);
1913	pbm_err_p->pbm_pci.pci_cfg_stat =
1914		pbm_p->pbm_config_header->ch_status_reg;
1915	pbm_err_p->pbm_ctl_stat = *pbm_p->pbm_ctrl_reg;
1916	pbm_err_p->pbm_pci.pci_cfg_comm =
1917		pbm_p->pbm_config_header->ch_command_reg;
1918	pbm_err_p->pbm_afsr = *pbm_p->pbm_async_flt_status_reg;
1919	pbm_err_p->pbm_afar = *pbm_p->pbm_async_flt_addr_reg;
1920	pbm_err_p->pbm_pci.pci_pa = *pbm_p->pbm_async_flt_addr_reg;
1921}
1922
1923void
1924pbm_clear_error(pbm_t *pbm_p)
1925{
1926	uint64_t pbm_afsr, pbm_ctl_stat;
1927
1928	/*
1929	 * for poke() support - called from POKE_FLUSH. Spin waiting
1930	 * for MA, TA or SERR to be cleared by a pbm_error_intr().
1931	 * We have to wait for SERR too in case the device is beyond
1932	 * a pci-pci bridge.
1933	 */
1934	pbm_ctl_stat = *pbm_p->pbm_ctrl_reg;
1935	pbm_afsr = *pbm_p->pbm_async_flt_status_reg;
1936	while (((pbm_afsr >> PSYCHO_PCI_AFSR_PE_SHIFT) &
1937	    (PSYCHO_PCI_AFSR_E_MA | PSYCHO_PCI_AFSR_E_TA)) ||
1938	    (pbm_ctl_stat & COMMON_PCI_CTRL_SERR)) {
1939		pbm_ctl_stat = *pbm_p->pbm_ctrl_reg;
1940		pbm_afsr = *pbm_p->pbm_async_flt_status_reg;
1941	}
1942}
1943
1944/*ARGSUSED*/
1945void
1946pci_format_addr(dev_info_t *dip, uint64_t *afar, uint64_t afsr)
1947{
1948	/*
1949	 * For Psycho the full address is stored in hardware. So
1950	 * there is no need to format it.
1951	 */
1952}
1953
1954/*ARGSUSED*/
1955int
1956pci_bus_quiesce(pci_t *pci_p, dev_info_t *dip, void *result)
1957{
1958	return (DDI_FAILURE);
1959}
1960
1961/*ARGSUSED*/
1962int
1963pci_bus_unquiesce(pci_t *pci_p, dev_info_t *dip, void *result)
1964{
1965	return (DDI_FAILURE);
1966}
1967
1968int
1969pci_reloc_getkey(void)
1970{
1971	return (0x100);
1972}
1973
1974void
1975pci_vmem_free(iommu_t *iommu_p, ddi_dma_impl_t *mp, void *dvma_addr,
1976    size_t npages)
1977{
1978	pci_vmem_do_free(iommu_p, dvma_addr, npages,
1979	    (mp->dmai_flags & DMAI_FLAGS_VMEMCACHE));
1980}
1981
1982
1983/*
1984 * NOTE: This call is only used by legacy systems (eg. E250 and E450) that
1985 * require unregistering the pci driver's thermal intrerrupt handler before
1986 * they can register their own.
1987 */
1988void
1989pci_thermal_rem_intr(dev_info_t *rdip, uint_t inum)
1990{
1991	pci_t		*pci_p;
1992	dev_info_t	*pdip;
1993	uint32_t	dev_mondo, pci_mondo;
1994	int 		instance;
1995
1996	for (pdip = ddi_get_parent(rdip); pdip; pdip = ddi_get_parent(pdip)) {
1997		if (strcmp(ddi_driver_name(pdip), "pcipsy") == 0)
1998			break;
1999	}
2000
2001	if (!pdip) {
2002		cmn_err(CE_WARN, "pci_thermal_rem_intr() no pcipsy parent\n");
2003		return;
2004	}
2005
2006	instance = ddi_get_instance(pdip);
2007	pci_p = get_pci_soft_state(instance);
2008
2009	/* Calculate the requesting device's mondo */
2010	dev_mondo = pci_xlate_intr(pci_p->pci_dip, rdip, pci_p->pci_ib_p,
2011	    IB_MONDO_TO_INO(i_ddi_get_inum(rdip, inum)));
2012
2013	/* get pci's thermal mondo */
2014	pci_mondo = ((pci_p->pci_cb_p->cb_ign << PCI_INO_BITS) |
2015	    pci_p->pci_inos[CBNINTR_THERMAL]);
2016	pci_mondo = CB_MONDO_TO_XMONDO(pci_p->pci_cb_p, pci_mondo);
2017
2018	if (pci_mondo == dev_mondo) {
2019		DEBUG2(DBG_ATTACH, rdip, "pci_thermal_rem_intr unregistered "
2020		    "for dip=%s%d:", ddi_driver_name(rdip),
2021		    ddi_get_instance(rdip));
2022		VERIFY(rem_ivintr(pci_mondo, pci_pil[CBNINTR_THERMAL]) == 0);
2023	}
2024}
2025
2026/*
2027 * pci_iommu_bypass_end_configure
2028 *
2029 * Support for 40-bit bus width to UPA in DVMA and iommu bypass transfers:
2030 */
2031
2032dma_bypass_addr_t
2033pci_iommu_bypass_end_configure(void)
2034{
2035
2036	return ((dma_bypass_addr_t)UPA_IOMMU_BYPASS_END);
2037}
2038