xref: /onnv-gate/usr/src/uts/sun4v/io/px/px_err_gen.c (revision 12076:f531e5ff251f)
13274Set142600 /*
23274Set142600  * CDDL HEADER START
33274Set142600  *
43274Set142600  * The contents of this file are subject to the terms of the
53274Set142600  * Common Development and Distribution License (the "License").
63274Set142600  * You may not use this file except in compliance with the License.
73274Set142600  *
83274Set142600  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93274Set142600  * or http://www.opensolaris.org/os/licensing.
103274Set142600  * See the License for the specific language governing permissions
113274Set142600  * and limitations under the License.
123274Set142600  *
133274Set142600  * When distributing Covered Code, include this CDDL HEADER in each
143274Set142600  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153274Set142600  * If applicable, add the following below this CDDL HEADER, with the
163274Set142600  * fields enclosed by brackets "[]" replaced with your own identifying
173274Set142600  * information: Portions Copyright [yyyy] [name of copyright owner]
183274Set142600  *
193274Set142600  * CDDL HEADER END
203274Set142600  */
213274Set142600 /*
22*12076SKrishna.Elango@Sun.COM  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
233274Set142600  */
243274Set142600 
253274Set142600 /*
263274Set142600  * The file has been code generated.  Do NOT modify this file directly.  Please
273274Set142600  * use the sun4v PCIe FMA code generation tool.
283274Set142600  *
293274Set142600  * This file was generated for the following platforms:
303274Set142600  * - Fire
313274Set142600  * - N2PIU
3211304SJanie.Lu@Sun.COM  * - Rainbow Falls
3311304SJanie.Lu@Sun.COM  * - Victoria Falls
343274Set142600  */
353274Set142600 
36*12076SKrishna.Elango@Sun.COM #include <sys/pcie_impl.h>
37*12076SKrishna.Elango@Sun.COM 
383274Set142600 /* ARGSUSED */
393274Set142600 static int
px_cb_epkt_severity(dev_info_t * dip,ddi_fm_error_t * derr,px_rc_err_t * epkt,pf_data_t * pfd_p)40*12076SKrishna.Elango@Sun.COM px_cb_epkt_severity(dev_info_t *dip, ddi_fm_error_t *derr, px_rc_err_t *epkt,
41*12076SKrishna.Elango@Sun.COM     pf_data_t *pfd_p)
423274Set142600 {
433274Set142600 	int err = 0;
443274Set142600 
453274Set142600 	/* STOP bit indicates a secondary error. Panic if it is set */
463274Set142600 	if (epkt->rc_descr.STOP == 1)
473274Set142600 		return (PX_PANIC);
483274Set142600 
493274Set142600 	switch (epkt->rc_descr.op) {
503274Set142600 	case OP_DMA:
513274Set142600 		switch (epkt->rc_descr.phase) {
523274Set142600 		case PH_ADDR:
533274Set142600 			switch (epkt->rc_descr.cond) {
543274Set142600 			case CND_ILL:
553274Set142600 				switch (epkt->rc_descr.dir) {
563274Set142600 				case DIR_WRITE:
573274Set142600 					err = PX_PANIC;
583274Set142600 					break;
593274Set142600 				} /* DIR */
603274Set142600 				break;
613274Set142600 			} /* CND */
623274Set142600 			break;
633274Set142600 		case PH_DATA:
643274Set142600 			switch (epkt->rc_descr.cond) {
653274Set142600 			case CND_INT:
663274Set142600 				switch (epkt->rc_descr.dir) {
673274Set142600 				case DIR_READ:
683274Set142600 					err = PX_PANIC;
693274Set142600 					break;
703274Set142600 				case DIR_RDWR:
713274Set142600 					err = PX_PANIC;
723274Set142600 					break;
7311304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
7411304SJanie.Lu@Sun.COM 					err = PX_PANIC;
7511304SJanie.Lu@Sun.COM 					break;
7611304SJanie.Lu@Sun.COM 				case DIR_WRITE:
7711304SJanie.Lu@Sun.COM 					err = PX_PANIC;
7811304SJanie.Lu@Sun.COM 					break;
7911304SJanie.Lu@Sun.COM 				} /* DIR */
8011304SJanie.Lu@Sun.COM 				break;
8111304SJanie.Lu@Sun.COM 			case CND_TO:
8211304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
8311304SJanie.Lu@Sun.COM 				case DIR_READ:
8411304SJanie.Lu@Sun.COM 					err = PX_PANIC;
8511304SJanie.Lu@Sun.COM 					break;
863274Set142600 				case DIR_WRITE:
873274Set142600 					err = PX_PANIC;
883274Set142600 					break;
893274Set142600 				} /* DIR */
903274Set142600 				break;
913274Set142600 			case CND_UE:
923274Set142600 				switch (epkt->rc_descr.dir) {
933274Set142600 				case DIR_READ:
943274Set142600 					err = PX_PANIC;
953274Set142600 					break;
963274Set142600 				} /* DIR */
973274Set142600 				break;
983274Set142600 			} /* CND */
993274Set142600 			break;
1003274Set142600 		case PH_UNKNOWN:
1013274Set142600 			switch (epkt->rc_descr.cond) {
1023274Set142600 			case CND_ILL:
1033274Set142600 				switch (epkt->rc_descr.dir) {
1043274Set142600 				case DIR_READ:
1053274Set142600 					err = PX_PANIC;
1063274Set142600 					break;
1073274Set142600 				} /* DIR */
1083274Set142600 				break;
1093274Set142600 			case CND_UNKNOWN:
1103274Set142600 				switch (epkt->rc_descr.dir) {
1113274Set142600 				case DIR_READ:
1123274Set142600 					err = PX_PANIC;
1133274Set142600 					break;
1143274Set142600 				} /* DIR */
1153274Set142600 				break;
1163274Set142600 			} /* CND */
1173274Set142600 			break;
1183274Set142600 		} /* PH */
1193274Set142600 		break;
1203274Set142600 	case OP_PIO:
1213274Set142600 		switch (epkt->rc_descr.phase) {
1223274Set142600 		case PH_ADDR:
1233274Set142600 			switch (epkt->rc_descr.cond) {
1243274Set142600 			case CND_UNMAP:
1253274Set142600 				switch (epkt->rc_descr.dir) {
1263274Set142600 				case DIR_READ:
1273274Set142600 					err = PX_PANIC;
1283274Set142600 					break;
1293274Set142600 				case DIR_WRITE:
1303274Set142600 					err = PX_PANIC;
1313274Set142600 					break;
1323274Set142600 				} /* DIR */
1333274Set142600 				break;
1343274Set142600 			} /* CND */
1353274Set142600 			break;
1363274Set142600 		case PH_DATA:
1373274Set142600 			switch (epkt->rc_descr.cond) {
1383274Set142600 			case CND_INT:
1393274Set142600 				switch (epkt->rc_descr.dir) {
14011304SJanie.Lu@Sun.COM 				case DIR_RDWR:
1413274Set142600 					err = PX_PANIC;
1423274Set142600 					break;
14311304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
1443274Set142600 					err = PX_PANIC;
1453274Set142600 					break;
1463274Set142600 				case DIR_WRITE:
1473274Set142600 					err = PX_PANIC;
1483274Set142600 					break;
1493274Set142600 				} /* DIR */
1503274Set142600 				break;
1513274Set142600 			case CND_ILL:
1523274Set142600 				switch (epkt->rc_descr.dir) {
1533274Set142600 				case DIR_WRITE:
1543274Set142600 					err = PX_PANIC;
1553274Set142600 					break;
1563274Set142600 				} /* DIR */
1573274Set142600 				break;
1583274Set142600 			} /* CND */
1593274Set142600 			break;
1603274Set142600 		case PH_UNKNOWN:
1613274Set142600 			switch (epkt->rc_descr.cond) {
1623274Set142600 			case CND_ILL:
1633274Set142600 				switch (epkt->rc_descr.dir) {
1643274Set142600 				case DIR_READ:
1653274Set142600 					err = PX_PANIC;
1663274Set142600 					break;
1673274Set142600 				case DIR_WRITE:
1683274Set142600 					err = PX_PANIC;
1693274Set142600 					break;
1703274Set142600 				} /* DIR */
1713274Set142600 				break;
1723274Set142600 			case CND_TO:
1733274Set142600 				switch (epkt->rc_descr.dir) {
1743274Set142600 				case DIR_RDWR:
1753274Set142600 					err = PX_PANIC;
1763274Set142600 					break;
1773274Set142600 				} /* DIR */
1783274Set142600 				break;
1793274Set142600 			} /* CND */
1803274Set142600 			break;
1813274Set142600 		} /* PH */
1823274Set142600 		break;
1833274Set142600 	case OP_UNKNOWN:
1843274Set142600 		switch (epkt->rc_descr.phase) {
1853274Set142600 		case PH_ADDR:
1863274Set142600 			switch (epkt->rc_descr.cond) {
1873274Set142600 			case CND_UNMAP:
1883274Set142600 				switch (epkt->rc_descr.dir) {
1893274Set142600 				case DIR_RDWR:
1903274Set142600 					err = PX_PANIC;
1913274Set142600 					break;
1923274Set142600 				} /* DIR */
1933274Set142600 				break;
1943274Set142600 			} /* CND */
1953274Set142600 			break;
1963274Set142600 		case PH_DATA:
1973274Set142600 			switch (epkt->rc_descr.cond) {
19811304SJanie.Lu@Sun.COM 			case CND_INT:
19911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
20011304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
20111304SJanie.Lu@Sun.COM 					err = PX_PANIC;
20211304SJanie.Lu@Sun.COM 					break;
20311304SJanie.Lu@Sun.COM 				} /* DIR */
20411304SJanie.Lu@Sun.COM 				break;
2053274Set142600 			case CND_UE:
2063274Set142600 				switch (epkt->rc_descr.dir) {
2073274Set142600 				case DIR_IRR:
2083274Set142600 					err = PX_PANIC;
2093274Set142600 					break;
2103274Set142600 				} /* DIR */
2113274Set142600 				break;
2123274Set142600 			} /* CND */
2133274Set142600 			break;
2143274Set142600 		case PH_UNKNOWN:
2153274Set142600 			switch (epkt->rc_descr.cond) {
2163274Set142600 			case CND_ILL:
2173274Set142600 				switch (epkt->rc_descr.dir) {
2183274Set142600 				case DIR_IRR:
2193274Set142600 					err = PX_PANIC;
2203274Set142600 					break;
2213274Set142600 				} /* DIR */
2223274Set142600 			} /* CND */
2233274Set142600 		} /* PH */
2243274Set142600 	} /* OP */
2253274Set142600 
2263274Set142600 	return (err);
2273274Set142600 }
2283274Set142600 
2293274Set142600 
2303274Set142600 /* ARGSUSED */
2313274Set142600 static int
px_mmu_epkt_severity(dev_info_t * dip,ddi_fm_error_t * derr,px_rc_err_t * epkt,pf_data_t * pfd_p)232*12076SKrishna.Elango@Sun.COM px_mmu_epkt_severity(dev_info_t *dip, ddi_fm_error_t *derr, px_rc_err_t *epkt,
233*12076SKrishna.Elango@Sun.COM     pf_data_t *pfd_p)
2343274Set142600 {
2353274Set142600 	int err = 0;
2363274Set142600 
2373274Set142600 	/* STOP bit indicates a secondary error. Panic if it is set */
2383274Set142600 	if (epkt->rc_descr.STOP == 1)
2393274Set142600 		return (PX_PANIC);
2403274Set142600 
2413274Set142600 	switch (epkt->rc_descr.op) {
2423274Set142600 	case OP_BYPASS:
2433274Set142600 		switch (epkt->rc_descr.phase) {
2443274Set142600 		case PH_ADDR:
2453274Set142600 			switch (epkt->rc_descr.cond) {
2463274Set142600 			case CND_ILL:
2473274Set142600 				switch (epkt->rc_descr.dir) {
2483274Set142600 				case DIR_RDWR:
2493274Set142600 					err = PX_NO_PANIC;
2503274Set142600 					break;
2513274Set142600 				} /* DIR */
2523274Set142600 				break;
2533274Set142600 			} /* CND */
2543274Set142600 			break;
2553274Set142600 		case PH_UNKNOWN:
2563274Set142600 			switch (epkt->rc_descr.cond) {
2573274Set142600 			case CND_ILL:
2583274Set142600 				switch (epkt->rc_descr.dir) {
2593274Set142600 				case DIR_UNKNOWN:
2603274Set142600 					err = PX_NO_PANIC;
2613274Set142600 					break;
2623274Set142600 				} /* DIR */
2633274Set142600 				break;
2643274Set142600 			} /* CND */
2653274Set142600 			break;
2663274Set142600 		} /* PH */
2673274Set142600 		break;
2683274Set142600 	case OP_TBW:
2693274Set142600 		switch (epkt->rc_descr.phase) {
27011304SJanie.Lu@Sun.COM 		case PH_ADDR:
27111304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
27211304SJanie.Lu@Sun.COM 			case CND_UNKNOWN:
27311304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
27411304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
27511304SJanie.Lu@Sun.COM 					err = PX_PANIC;
27611304SJanie.Lu@Sun.COM 					break;
27711304SJanie.Lu@Sun.COM 				} /* DIR */
27811304SJanie.Lu@Sun.COM 				break;
27911304SJanie.Lu@Sun.COM 			case CND_UNMAP:
28011304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
28111304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
28211304SJanie.Lu@Sun.COM 					err = PX_PANIC;
28311304SJanie.Lu@Sun.COM 					break;
28411304SJanie.Lu@Sun.COM 				} /* DIR */
28511304SJanie.Lu@Sun.COM 				break;
28611304SJanie.Lu@Sun.COM 			} /* CND */
28711304SJanie.Lu@Sun.COM 			break;
2883274Set142600 		case PH_DATA:
2893274Set142600 			switch (epkt->rc_descr.cond) {
2903274Set142600 			case CND_INT:
2913274Set142600 				switch (epkt->rc_descr.dir) {
2923274Set142600 				case DIR_IRR:
2933274Set142600 					err = PX_PANIC;
2943274Set142600 					break;
2953274Set142600 				} /* DIR */
2963274Set142600 				break;
2973274Set142600 			} /* CND */
2983274Set142600 			break;
2993274Set142600 		case PH_UNKNOWN:
3003274Set142600 			switch (epkt->rc_descr.cond) {
3013274Set142600 			case CND_ILL:
3023274Set142600 				switch (epkt->rc_descr.dir) {
3033274Set142600 				case DIR_IRR:
3043274Set142600 					err = PX_PANIC;
3053274Set142600 					break;
3063274Set142600 				} /* DIR */
3073274Set142600 				break;
3083274Set142600 			case CND_UNKNOWN:
3093274Set142600 				switch (epkt->rc_descr.dir) {
3103274Set142600 				case DIR_IRR:
3113274Set142600 					err = PX_PANIC;
3123274Set142600 					break;
31311304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
31411304SJanie.Lu@Sun.COM 					err = PX_PANIC;
31511304SJanie.Lu@Sun.COM 					break;
3163274Set142600 				} /* DIR */
3173274Set142600 				break;
3183274Set142600 			} /* CND */
3193274Set142600 			break;
3203274Set142600 		} /* PH */
3213274Set142600 		break;
3223274Set142600 	case OP_XLAT:
3233274Set142600 		switch (epkt->rc_descr.phase) {
3243274Set142600 		case PH_ADDR:
3253274Set142600 			switch (epkt->rc_descr.cond) {
3263274Set142600 			case CND_ILL:
3273274Set142600 				switch (epkt->rc_descr.dir) {
3283274Set142600 				case DIR_RDWR:
3293274Set142600 					err = PX_NO_PANIC;
3303274Set142600 					break;
3313274Set142600 				} /* DIR */
3323274Set142600 				break;
3333274Set142600 			case CND_IRR:
3343274Set142600 				switch (epkt->rc_descr.dir) {
3353274Set142600 				case DIR_IRR:
3363274Set142600 					err = PX_PANIC;
3373274Set142600 					break;
3383274Set142600 				} /* DIR */
3393274Set142600 				break;
3403274Set142600 			case CND_PROT:
3413274Set142600 				switch (epkt->rc_descr.dir) {
3423274Set142600 				case DIR_RDWR:
3433274Set142600 					err = PX_NO_PANIC;
3443274Set142600 					break;
3453274Set142600 				} /* DIR */
3463274Set142600 				break;
3473274Set142600 			case CND_UNMAP:
3483274Set142600 				switch (epkt->rc_descr.dir) {
3493274Set142600 				case DIR_RDWR:
3503274Set142600 					err = PX_NO_PANIC;
3513274Set142600 					break;
3523274Set142600 				} /* DIR */
3533274Set142600 				break;
3543274Set142600 			} /* CND */
3553274Set142600 			break;
3563274Set142600 		case PH_DATA:
3573274Set142600 			switch (epkt->rc_descr.cond) {
35811304SJanie.Lu@Sun.COM 			case CND_INT:
35911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
36011304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
36111304SJanie.Lu@Sun.COM 					err = PX_PANIC;
36211304SJanie.Lu@Sun.COM 					break;
36311304SJanie.Lu@Sun.COM 				} /* DIR */
36411304SJanie.Lu@Sun.COM 				break;
3653274Set142600 			case CND_INV:
3663274Set142600 				switch (epkt->rc_descr.dir) {
3673274Set142600 				case DIR_RDWR:
3683274Set142600 					err = PX_NO_PANIC;
3693274Set142600 					break;
3703274Set142600 				case DIR_UNKNOWN:
3713274Set142600 					err = PX_NO_PANIC;
3723274Set142600 					break;
3733274Set142600 				} /* DIR */
3743274Set142600 				break;
3753274Set142600 			case CND_IRR:
3763274Set142600 				switch (epkt->rc_descr.dir) {
3773274Set142600 				case DIR_IRR:
3783274Set142600 					err = PX_PANIC;
3793274Set142600 					break;
3803274Set142600 				} /* DIR */
3813274Set142600 				break;
3823274Set142600 			case CND_PROT:
3833274Set142600 				switch (epkt->rc_descr.dir) {
38411304SJanie.Lu@Sun.COM 				case DIR_RDWR:
38511304SJanie.Lu@Sun.COM 					err = PX_NO_PANIC;
38611304SJanie.Lu@Sun.COM 					break;
3873274Set142600 				case DIR_WRITE:
3883274Set142600 					err = PX_NO_PANIC;
3893274Set142600 					break;
3903274Set142600 				} /* DIR */
3913274Set142600 				break;
3923274Set142600 			} /* CND */
3933274Set142600 			break;
3943274Set142600 		case PH_UNKNOWN:
3953274Set142600 			switch (epkt->rc_descr.cond) {
3963274Set142600 			case CND_ILL:
3973274Set142600 				switch (epkt->rc_descr.dir) {
3983274Set142600 				case DIR_IRR:
3993274Set142600 					err = PX_PANIC;
4003274Set142600 					break;
4013274Set142600 				} /* DIR */
4023274Set142600 			} /* CND */
4033274Set142600 		} /* PH */
4043274Set142600 	} /* OP */
4053274Set142600 
4063274Set142600 	if (epkt->rc_descr.D && (err & (PX_PANIC | PX_PROTECTED)) &&
4073274Set142600 	    px_mmu_handle_lookup(dip, derr, epkt) == PF_HDL_FOUND)
4083274Set142600 		err = PX_NO_PANIC;
4093274Set142600 
4103274Set142600 	return (err);
4113274Set142600 }
4123274Set142600 
4133274Set142600 
4143274Set142600 /* ARGSUSED */
4153274Set142600 static int
px_intr_epkt_severity(dev_info_t * dip,ddi_fm_error_t * derr,px_rc_err_t * epkt,pf_data_t * pfd_p)416*12076SKrishna.Elango@Sun.COM px_intr_epkt_severity(dev_info_t *dip, ddi_fm_error_t *derr, px_rc_err_t *epkt,
417*12076SKrishna.Elango@Sun.COM     pf_data_t *pfd_p)
4183274Set142600 {
4193274Set142600 	int err = 0;
4203274Set142600 
4213274Set142600 	/* STOP bit indicates a secondary error. Panic if it is set */
4223274Set142600 	if (epkt->rc_descr.STOP == 1)
4233274Set142600 		return (PX_PANIC);
4243274Set142600 
4253274Set142600 	switch (epkt->rc_descr.op) {
42611304SJanie.Lu@Sun.COM 	case OP_FIXED:
42711304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
42811304SJanie.Lu@Sun.COM 		case PH_UNKNOWN:
42911304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
43011304SJanie.Lu@Sun.COM 			case CND_ILL:
43111304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
43211304SJanie.Lu@Sun.COM 				case DIR_INGRESS:
43311304SJanie.Lu@Sun.COM 					err = PX_PANIC;
43411304SJanie.Lu@Sun.COM 					break;
43511304SJanie.Lu@Sun.COM 				} /* DIR */
43611304SJanie.Lu@Sun.COM 				break;
43711304SJanie.Lu@Sun.COM 			} /* CND */
43811304SJanie.Lu@Sun.COM 			break;
43911304SJanie.Lu@Sun.COM 		} /* PH */
44011304SJanie.Lu@Sun.COM 		break;
4413274Set142600 	case OP_MSI32:
4423274Set142600 		switch (epkt->rc_descr.phase) {
4433274Set142600 		case PH_DATA:
4443274Set142600 			switch (epkt->rc_descr.cond) {
4453274Set142600 			case CND_INT:
4463274Set142600 				switch (epkt->rc_descr.dir) {
4473274Set142600 				case DIR_UNKNOWN:
4483274Set142600 					err = PX_PANIC;
4493274Set142600 					break;
4503274Set142600 				} /* DIR */
4513274Set142600 				break;
4523274Set142600 			case CND_ILL:
4533274Set142600 				switch (epkt->rc_descr.dir) {
4543274Set142600 				case DIR_IRR:
4553274Set142600 					err = PX_PANIC;
4563274Set142600 					break;
4573274Set142600 				} /* DIR */
4583274Set142600 				break;
4593274Set142600 			} /* CND */
4603274Set142600 			break;
4613274Set142600 		case PH_UNKNOWN:
4623274Set142600 			switch (epkt->rc_descr.cond) {
4633274Set142600 			case CND_ILL:
4643274Set142600 				switch (epkt->rc_descr.dir) {
4653274Set142600 				case DIR_IRR:
4663274Set142600 					err = PX_PANIC;
4673274Set142600 					break;
4683274Set142600 				} /* DIR */
4693274Set142600 				break;
4703274Set142600 			} /* CND */
4713274Set142600 			break;
4723274Set142600 		} /* PH */
4733274Set142600 		break;
4743274Set142600 	case OP_MSI64:
4753274Set142600 		switch (epkt->rc_descr.phase) {
4763274Set142600 		case PH_DATA:
4773274Set142600 			switch (epkt->rc_descr.cond) {
4783274Set142600 			case CND_INT:
4793274Set142600 				switch (epkt->rc_descr.dir) {
4803274Set142600 				case DIR_UNKNOWN:
4813274Set142600 					err = PX_PANIC;
4823274Set142600 					break;
4833274Set142600 				} /* DIR */
4843274Set142600 				break;
4853274Set142600 			case CND_ILL:
4863274Set142600 				switch (epkt->rc_descr.dir) {
4873274Set142600 				case DIR_IRR:
4883274Set142600 					err = PX_PANIC;
4893274Set142600 					break;
4903274Set142600 				} /* DIR */
4913274Set142600 				break;
4923274Set142600 			} /* CND */
4933274Set142600 			break;
4943274Set142600 		case PH_UNKNOWN:
4953274Set142600 			switch (epkt->rc_descr.cond) {
4963274Set142600 			case CND_ILL:
4973274Set142600 				switch (epkt->rc_descr.dir) {
4983274Set142600 				case DIR_IRR:
4993274Set142600 					err = PX_PANIC;
5003274Set142600 					break;
5013274Set142600 				} /* DIR */
5023274Set142600 				break;
5033274Set142600 			} /* CND */
5043274Set142600 			break;
5053274Set142600 		} /* PH */
5063274Set142600 		break;
5073274Set142600 	case OP_MSIQ:
5083274Set142600 		switch (epkt->rc_descr.phase) {
50911304SJanie.Lu@Sun.COM 		case PH_DATA:
51011304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
51111304SJanie.Lu@Sun.COM 			case CND_INT:
51211304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
51311304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
51411304SJanie.Lu@Sun.COM 					err = PX_PANIC;
51511304SJanie.Lu@Sun.COM 					break;
51611304SJanie.Lu@Sun.COM 				} /* DIR */
51711304SJanie.Lu@Sun.COM 				break;
51811304SJanie.Lu@Sun.COM 			} /* CND */
51911304SJanie.Lu@Sun.COM 			break;
5203274Set142600 		case PH_UNKNOWN:
5213274Set142600 			switch (epkt->rc_descr.cond) {
5223274Set142600 			case CND_ILL:
5233274Set142600 				switch (epkt->rc_descr.dir) {
5243274Set142600 				case DIR_IRR:
5253274Set142600 					err = PX_PANIC;
5263274Set142600 					break;
5273274Set142600 				} /* DIR */
5283274Set142600 				break;
5293274Set142600 			case CND_OV:
5303274Set142600 				switch (epkt->rc_descr.dir) {
5313274Set142600 				case DIR_IRR:
5323274Set142600 					err = px_intr_handle_errors(dip, derr,
533*12076SKrishna.Elango@Sun.COM 					    epkt, pfd_p);
5343274Set142600 					break;
5353274Set142600 				} /* DIR */
5363274Set142600 				break;
5373274Set142600 			} /* CND */
5383274Set142600 			break;
5393274Set142600 		} /* PH */
5403274Set142600 		break;
5413274Set142600 	case OP_PCIEMSG:
5423274Set142600 		switch (epkt->rc_descr.phase) {
5433274Set142600 		case PH_UNKNOWN:
5443274Set142600 			switch (epkt->rc_descr.cond) {
5453274Set142600 			case CND_ILL:
5463274Set142600 				switch (epkt->rc_descr.dir) {
5473274Set142600 				case DIR_INGRESS:
5483274Set142600 					err = PX_PANIC;
5493274Set142600 					break;
5503274Set142600 				} /* DIR */
55111304SJanie.Lu@Sun.COM 				break;
55211304SJanie.Lu@Sun.COM 			} /* CND */
55311304SJanie.Lu@Sun.COM 			break;
55411304SJanie.Lu@Sun.COM 		} /* PH */
55511304SJanie.Lu@Sun.COM 		break;
55611304SJanie.Lu@Sun.COM 	case OP_UNKNOWN:
55711304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
55811304SJanie.Lu@Sun.COM 		case PH_DATA:
55911304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
56011304SJanie.Lu@Sun.COM 			case CND_INT:
56111304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
56211304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
56311304SJanie.Lu@Sun.COM 					err = PX_PANIC;
56411304SJanie.Lu@Sun.COM 					break;
56511304SJanie.Lu@Sun.COM 				} /* DIR */
56611304SJanie.Lu@Sun.COM 				break;
56711304SJanie.Lu@Sun.COM 			case CND_ILL:
56811304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
56911304SJanie.Lu@Sun.COM 				case DIR_IRR:
57011304SJanie.Lu@Sun.COM 					err = PX_PANIC;
57111304SJanie.Lu@Sun.COM 					break;
57211304SJanie.Lu@Sun.COM 				} /* DIR */
57311304SJanie.Lu@Sun.COM 				break;
57411304SJanie.Lu@Sun.COM 			} /* CND */
57511304SJanie.Lu@Sun.COM 			break;
57611304SJanie.Lu@Sun.COM 		case PH_UNKNOWN:
57711304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
57811304SJanie.Lu@Sun.COM 			case CND_ILL:
57911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
58011304SJanie.Lu@Sun.COM 				case DIR_IRR:
58111304SJanie.Lu@Sun.COM 					err = PX_PANIC;
58211304SJanie.Lu@Sun.COM 					break;
58311304SJanie.Lu@Sun.COM 				} /* DIR */
5843274Set142600 			} /* CND */
5853274Set142600 		} /* PH */
5863274Set142600 	} /* OP */
5873274Set142600 
5883274Set142600 	return (err);
5893274Set142600 }
59011304SJanie.Lu@Sun.COM 
59111304SJanie.Lu@Sun.COM 
59211304SJanie.Lu@Sun.COM /* ARGSUSED */
59311304SJanie.Lu@Sun.COM static int
px_port_epkt_severity(dev_info_t * dip,ddi_fm_error_t * derr,px_rc_err_t * epkt,pf_data_t * pfd_p)59411596SJason.Beloro@Sun.COM px_port_epkt_severity(dev_info_t *dip, ddi_fm_error_t *derr, px_rc_err_t *epkt,
59511596SJason.Beloro@Sun.COM     pf_data_t *pfd_p)
59611304SJanie.Lu@Sun.COM {
59711304SJanie.Lu@Sun.COM 	int err = 0;
59811304SJanie.Lu@Sun.COM 
59911304SJanie.Lu@Sun.COM 	/* STOP bit indicates a secondary error. Panic if it is set */
600*12076SKrishna.Elango@Sun.COM 	if (epkt->rc_descr.STOP == 1)
60111304SJanie.Lu@Sun.COM 		return (PX_PANIC);
60211304SJanie.Lu@Sun.COM 
60311304SJanie.Lu@Sun.COM 	switch (epkt->rc_descr.op) {
60411304SJanie.Lu@Sun.COM 	case OP_DMA:
60511304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
60611304SJanie.Lu@Sun.COM 		case PH_DATA:
60711304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
60811304SJanie.Lu@Sun.COM 			case CND_INT:
60911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
61011304SJanie.Lu@Sun.COM 				case DIR_READ:
61111304SJanie.Lu@Sun.COM 					err = PX_PANIC;
612*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_FLAG(pfd_p,
613*12076SKrishna.Elango@Sun.COM 					    PF_AFFECTED_BDF);
614*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_BDF(pfd_p,
615*12076SKrishna.Elango@Sun.COM 					    (uint16_t)epkt->reserved);
61611304SJanie.Lu@Sun.COM 					break;
61711304SJanie.Lu@Sun.COM 				} /* DIR */
61811304SJanie.Lu@Sun.COM 				break;
61911304SJanie.Lu@Sun.COM 			} /* CND */
62011304SJanie.Lu@Sun.COM 			break;
62111304SJanie.Lu@Sun.COM 		} /* PH */
62211304SJanie.Lu@Sun.COM 		break;
62311304SJanie.Lu@Sun.COM 	case OP_LINK:
62411304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
62511304SJanie.Lu@Sun.COM 		case PH_FC:
62611304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
62711304SJanie.Lu@Sun.COM 			case CND_TO:
62811304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
62911304SJanie.Lu@Sun.COM 				case DIR_IRR:
63011304SJanie.Lu@Sun.COM 					err = PX_PANIC;
631*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_FLAG(pfd_p,
632*12076SKrishna.Elango@Sun.COM 					    PF_AFFECTED_BDF);
633*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_BDF(pfd_p,
634*12076SKrishna.Elango@Sun.COM 					    (uint16_t)epkt->reserved);
63511304SJanie.Lu@Sun.COM 					break;
63611304SJanie.Lu@Sun.COM 				} /* DIR */
63711304SJanie.Lu@Sun.COM 				break;
63811304SJanie.Lu@Sun.COM 			} /* CND */
63911304SJanie.Lu@Sun.COM 			break;
64011304SJanie.Lu@Sun.COM 		} /* PH */
64111304SJanie.Lu@Sun.COM 		break;
64211304SJanie.Lu@Sun.COM 	case OP_PIO:
64311304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
64411304SJanie.Lu@Sun.COM 		case PH_DATA:
64511304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
64611304SJanie.Lu@Sun.COM 			case CND_INT:
64711304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
64811304SJanie.Lu@Sun.COM 				case DIR_READ:
64911304SJanie.Lu@Sun.COM 					err = PX_PANIC;
650*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_FLAG(pfd_p,
651*12076SKrishna.Elango@Sun.COM 					    PF_AFFECTED_BDF);
652*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_BDF(pfd_p,
653*12076SKrishna.Elango@Sun.COM 					    (uint16_t)epkt->reserved);
65411304SJanie.Lu@Sun.COM 					break;
65511304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
65611304SJanie.Lu@Sun.COM 					err = PX_PANIC;
657*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_FLAG(pfd_p,
658*12076SKrishna.Elango@Sun.COM 					    PF_AFFECTED_BDF);
659*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_BDF(pfd_p,
660*12076SKrishna.Elango@Sun.COM 					    (uint16_t)epkt->reserved);
66111304SJanie.Lu@Sun.COM 					break;
66211304SJanie.Lu@Sun.COM 				} /* DIR */
66311304SJanie.Lu@Sun.COM 				break;
66411304SJanie.Lu@Sun.COM 			} /* CND */
66511304SJanie.Lu@Sun.COM 			break;
66611304SJanie.Lu@Sun.COM 		case PH_IRR:
66711304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
66811304SJanie.Lu@Sun.COM 			case CND_INV:
66911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
67011304SJanie.Lu@Sun.COM 				case DIR_RDWR:
67111304SJanie.Lu@Sun.COM 					err = PX_PANIC;
67211304SJanie.Lu@Sun.COM 					break;
67311304SJanie.Lu@Sun.COM 				} /* DIR */
67411304SJanie.Lu@Sun.COM 				break;
67511304SJanie.Lu@Sun.COM 			case CND_RCA:
67611304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
67711304SJanie.Lu@Sun.COM 				case DIR_WRITE:
67811304SJanie.Lu@Sun.COM 					err = px_port_handle_errors(dip, derr,
67911596SJason.Beloro@Sun.COM 					    epkt, pfd_p);
68011304SJanie.Lu@Sun.COM 					break;
68111304SJanie.Lu@Sun.COM 				} /* DIR */
68211304SJanie.Lu@Sun.COM 				break;
68311304SJanie.Lu@Sun.COM 			case CND_RUR:
68411304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
68511304SJanie.Lu@Sun.COM 				case DIR_WRITE:
68611304SJanie.Lu@Sun.COM 					err = px_port_handle_errors(dip, derr,
68711596SJason.Beloro@Sun.COM 					    epkt, pfd_p);
68811304SJanie.Lu@Sun.COM 					break;
68911304SJanie.Lu@Sun.COM 				} /* DIR */
69011304SJanie.Lu@Sun.COM 				break;
69111304SJanie.Lu@Sun.COM 			case CND_TO:
69211304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
69311304SJanie.Lu@Sun.COM 				case DIR_WRITE:
69411304SJanie.Lu@Sun.COM 					err = PX_PANIC;
69511304SJanie.Lu@Sun.COM 					break;
69611304SJanie.Lu@Sun.COM 				} /* DIR */
69711304SJanie.Lu@Sun.COM 				break;
69811304SJanie.Lu@Sun.COM 			case CND_UC:
69911304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
70011304SJanie.Lu@Sun.COM 				case DIR_IRR:
70111304SJanie.Lu@Sun.COM 					err = PX_NO_PANIC;
70211304SJanie.Lu@Sun.COM 					break;
70311304SJanie.Lu@Sun.COM 				} /* DIR */
70411304SJanie.Lu@Sun.COM 				break;
70511304SJanie.Lu@Sun.COM 			} /* CND */
70611304SJanie.Lu@Sun.COM 			break;
70711304SJanie.Lu@Sun.COM 		} /* PH */
70811304SJanie.Lu@Sun.COM 		break;
70911304SJanie.Lu@Sun.COM 	case OP_UNKNOWN:
71011304SJanie.Lu@Sun.COM 		switch (epkt->rc_descr.phase) {
71111304SJanie.Lu@Sun.COM 		case PH_DATA:
71211304SJanie.Lu@Sun.COM 			switch (epkt->rc_descr.cond) {
71311304SJanie.Lu@Sun.COM 			case CND_INT:
71411304SJanie.Lu@Sun.COM 				switch (epkt->rc_descr.dir) {
71511304SJanie.Lu@Sun.COM 				case DIR_UNKNOWN:
71611304SJanie.Lu@Sun.COM 					err = PX_PANIC;
717*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_FLAG(pfd_p,
718*12076SKrishna.Elango@Sun.COM 					    PF_AFFECTED_BDF);
719*12076SKrishna.Elango@Sun.COM 					PFD_SET_AFFECTED_BDF(pfd_p,
720*12076SKrishna.Elango@Sun.COM 					    (uint16_t)epkt->reserved);
72111304SJanie.Lu@Sun.COM 					break;
72211304SJanie.Lu@Sun.COM 				} /* DIR */
72311304SJanie.Lu@Sun.COM 			} /* CND */
72411304SJanie.Lu@Sun.COM 		} /* PH */
72511304SJanie.Lu@Sun.COM 	} /* OP */
72611304SJanie.Lu@Sun.COM 
72711304SJanie.Lu@Sun.COM 	return (err);
72811304SJanie.Lu@Sun.COM }
729