;	[]===========================================================[]
;
;	NOTICE: THIS PROGRAM BELONGS TO AWARD SOFTWARE INTERNATIONAL(R)
;	        INC. IT IS CONSIDERED A TRADE SECRET AND IS NOT TO BE 	
;	        DIVULGED OR USED BY PARTIES WHO HAVE NOT RECEIVED	
;	        WRITTEN AUTHORIZATION FROM THE OWNER.
;
; 	[]===========================================================[]
;
;----------------------------------------------------------------------------
;Rev	Date	 Name	Description
;----------------------------------------------------------------------------
;R10	04/07/99 RAY	Add "COMPILE_FOR_PCI21TBL_ASM EQU 1" to tell COMMON.EQU
;			to do special compiling for this file.
;R09	10/15/98 RAY	Support up to 9 PCI slots.
;R08	09/10/98 LAW	Fixed USB Device Enable WIndows 98 IRQ Steering cann't
;			Enable
;R05A	09/03/98 RAY	The USB routing must be placed at the end of the
;			PCI routing table. R05 put AGP at the end!
;R07	06/30/98 RCH	Added PCI IRQ routing dynamic change by GPI state
;			for onboard multi-function AHA7895 SCSI.
;R06	06/23/98 RCH	Added six and seven PCI slots IRQ routing table support
;R05	06/23/98 RCH	Added AGP PCI/IRQ routing table support
;R04	04/20/98 KGN	Patch define CARDBUS_USE_LAGECY, routing table report
;			wrong device number
;R03	12/16/97 RAY	Report the assigned PCI IRQs instead of a fix value
;			in the Field of "Exclusive IRQs"
;			This is to to fix the ICU hang up problem
;R02	08/05/97 RAY	Rewrite this file to pass the IRQ-Routing test running
;			in Memphis. Due to this is a great change, I also kill
;			all the ;Rxx because the BIOS didn't pass the Memphis
;			test since Aug-1-97. Please forget R00 & R01 !
;
;			To pass the test, we have to do the followings:
;
;			1. The MS '$PIR' table must be supported
;
;			2. The MS '$PIR' must match the table returned by
;			   API call in PCI1A.ASM & PCI32.ASM. So we created
;			   this file for both the MS $PIR table and the
;			   PCI1A(PCI32) to reference. 
;
;			   There is a tricky routine in PCI32.ASM: Get_Next_IP
;			   This routine will return with ESI the return addr.
;			   (the IP address right after the "call" instruction)
;			   which is relative to the 32 bit code descriptor.
;			   By calling this routine & adding the displacement
;			   between the the label we want to reference & the
;			   return addr. we can use cs:[esi] to refer to the
;			   label even though the caller does not pass a good
;			   descriptor for us. This is implemented to solve the
;			   UNIXWARE installation problem.
;
;			3. For unknown reason, the MS '$PIR' must be placed
;			   in a address in F000 segment not too low in order
;			   for the SystemSoft's PCMCIA DOS driver not to hang
;			   up. So we linked the PCI21TBL.OBJ just right before
;			   PM_RAM.OBJ.
;
;			4. The linked value of the IRQ table should reflect
;			   the PIRQ# register. That is, if the IRQ router
;			   is PIIX, link value 1 should be 60h, 2 be 61h & so
;			   on. These special link value are defined in
;			   COMMON.EQU.
;
;			     Engineers porting new chipsets please refer to
;			     COMMON.EQU, searching "M5143" for special 
;			     link values where "M5143" is switch for ALi's
;			     Alladin 4 Plus.
;
;			5. All onboard devices which requst a IRQ in its
;			   Cfg Space 3Dh must be reported in the IRQ routing
;			   table.
;
;			     Engineers porting new chipsets please refer to
;			     COMMON.EQU, searching "M5229" for IDE routing
;			     & "M5237" for USB routing. Both of them are
;			     switches for ALi's Alladin 4 Plus.
;
;			6. All devices that will be completely hiddened
;			   when disabled must not be reported in the IRQ table
;			   (e.g. USB controller of PIIX3)
;
;			     We place the USB IRQ link table at the end of 
;			     whole IRQ table. At the end of POST, we change
;			     the table size by checking the existance of the
;			     USB devices.
;
;R01	08/04/97 RAY	Support also the notebook project with card bus on board
;R00	08/01/97 RAY	Initial Revision for PC 97 test

.386

.XLIST

COMPILE_FOR_PCI21TBL_ASM	EQU	1			;R10

		INCLUDE BIOS.CFG
		INCLUDE COMMON.EQU
		INCLUDE 8259.EQU
		INCLUDE CMOS.EQU
		INCLUDE COMMON.MAC
.LIST

IRQROUTE	STRUC
		PciBus_No     	db	?	;PCI bus number
		PciDev_No     	db	?	;PCI device number(upper 5bits)
		LinkIntA      	db	?	;link value for INTA#
		IrqIntA		dw	?	;available IRQ for INT A
		LinkIntB      	db	?	;link value for INTB#
		IrqIntB		dw	?	;available IRQ for INT B
		LinkIntC      	db	?	;link value for INTVC#
		IrqIntC		dw	?	;available IRQ for INT C
		LinkIntD  	db	?	;link value for INTD#
		IrqIntD		dw	?	;available IRQ for INT D
		PciSlot_No	db	?	;PCI slot number
		NoUseByte 	db	?	;reserved byte
IRQROUTE	ENDS

DEFINE_LNK_VAL	MACRO	SLOTNO, LNKVAL 
			&SLOTNO&_LNK&LNKVAL	=	&SLOTNO&_INT&LNKVAL
		IF	&SLOTNO&_INT&LNKVAL EQ 1
			&SLOTNO&_LNK&LNKVAL	=	PIRQ0_VAL
		ENDIF	
		IF	&SLOTNO&_INT&LNKVAL EQ 2
			&SLOTNO&_LNK&LNKVAL	=	PIRQ1_VAL
		ENDIF	
		IF	&SLOTNO&_INT&LNKVAL EQ 3
			&SLOTNO&_LNK&LNKVAL	=	PIRQ2_VAL
		ENDIF	
		IF	&SLOTNO&_INT&LNKVAL EQ 4
			&SLOTNO&_LNK&LNKVAL	=	PIRQ3_VAL
		ENDIF	
		ENDM

DEFINE_SLOT_LNKS	MACRO	SLOTNO
		DEFINE_LNK_VAL	&SLOTNO, A
		DEFINE_LNK_VAL	&SLOTNO, B
		DEFINE_LNK_VAL	&SLOTNO, C
		DEFINE_LNK_VAL	&SLOTNO, D
			ENDM

FCODE		SEGMENT PARA PUBLIC 'CODE'
		ASSUME	CS:FCODE

ifdef	PCI_BUS
		ALIGN	16
		Public	MsPciIrqTbl
MsPciIrqTbl	Label	Byte

IF	MSIRQROUT_SUPPORT
		db	'$PIR'		;signature
		dw	0100h		;version
		dw	MsPciIrqTbl_LEN	;table size
		db	0		;Router's bus number
		db	ROUTER_DEV	;Router's DevFunc number
;R03		dw	1		;exclusive IRQs
		Public	PCI_IRQ_RECORD					;R03
PCI_IRQ_RECORD	Label	Word						;R03
		dw	0		;exclusive IRQs			;R03
		dw	ROUTER_VID  	;compatible PCI router's vendor ID
		dw	ROUTER_DID	;compatible PCI router's device ID
		dd	0		;miniport Data
		db	11 dup (0)	;reserved
		db	0		;checksum
ENDIF	;MSIRQROUT_SUPPORT

		Public	IrqRouteTbl
IrqRouteTbl	Label	Byte

IF	SLOT1_EXIST
	DEFINE_SLOT_LNKS	SLOT1			
	IRQROUTE <0,(SLOT1_ID SHL 3),\
			SLOT1_LNKA,IRQ_PCI,\
			SLOT1_LNKB,IRQ_PCI,\
			SLOT1_LNKC,IRQ_PCI,\
			SLOT1_LNKD,IRQ_PCI,1,0>
ENDIF	;SLOT1_EXIST

IF	SLOT2_EXIST
	DEFINE_SLOT_LNKS	SLOT2				
	IRQROUTE <0,(SLOT2_ID SHL 3),\
			SLOT2_LNKA,IRQ_PCI,\
			SLOT2_LNKB,IRQ_PCI,\
			SLOT2_LNKC,IRQ_PCI,\
			SLOT2_LNKD,IRQ_PCI,2,0>
ENDIF	;SLOT2_EXIST

IF	SLOT3_EXIST
	DEFINE_SLOT_LNKS	SLOT3				
	IRQROUTE <0,(SLOT3_ID SHL 3),\
			SLOT3_LNKA,IRQ_PCI,\
			SLOT3_LNKB,IRQ_PCI,\
			SLOT3_LNKC,IRQ_PCI,\
			SLOT3_LNKD,IRQ_PCI,3,0>
ENDIF	;SLOT3_EXIST

IF	SLOT4_EXIST
	DEFINE_SLOT_LNKS	SLOT4				
	IRQROUTE <0,(SLOT4_ID SHL 3),\
			SLOT4_LNKA,IRQ_PCI,\
			SLOT4_LNKB,IRQ_PCI,\
			SLOT4_LNKC,IRQ_PCI,\
			SLOT4_LNKD,IRQ_PCI,4,0>
ENDIF	;SLOT4_EXIST

IF	SLOT5_EXIST
	DEFINE_SLOT_LNKS	SLOT5				
	IRQROUTE <0,(SLOT5_ID SHL 3),\
			SLOT5_LNKA,IRQ_PCI,\
			SLOT5_LNKB,IRQ_PCI,\
			SLOT5_LNKC,IRQ_PCI,\
			SLOT5_LNKD,IRQ_PCI,5,0>
ENDIF	;SLOT5_EXIST

;R06 - start
IF	SLOT6_EXIST
	DEFINE_SLOT_LNKS	SLOT6
	IRQROUTE <0,(SLOT6_ID SHL 3),\
			SLOT6_LNKA,IRQ_PCI,\
			SLOT6_LNKB,IRQ_PCI,\
			SLOT6_LNKC,IRQ_PCI,\
			SLOT6_LNKD,IRQ_PCI,6,0>
ENDIF;	SLOT6_EXIST

IF	SLOT7_EXIST
	DEFINE_SLOT_LNKS	SLOT7
	IRQROUTE <0,(SLOT7_ID SHL 3),\
			SLOT7_LNKA,IRQ_PCI,\
			SLOT7_LNKB,IRQ_PCI,\
			SLOT7_LNKC,IRQ_PCI,\
			SLOT7_LNKD,IRQ_PCI,7,0>
ENDIF;	SLOT7_EXIST
;R06 - end

;R09 - starts
IF	SLOT8_EXIST
	DEFINE_SLOT_LNKS	SLOT8
	IRQROUTE <0,(SLOT8_ID SHL 3),\
			SLOT8_LNKA,IRQ_PCI,\
			SLOT8_LNKB,IRQ_PCI,\
			SLOT8_LNKC,IRQ_PCI,\
			SLOT8_LNKD,IRQ_PCI,8,0>
ENDIF;	SLOT8_EXIST

IF	SLOT9_EXIST
	DEFINE_SLOT_LNKS	SLOT9
	IRQROUTE <0,(SLOT9_ID SHL 3),\
			SLOT9_LNKA,IRQ_PCI,\
			SLOT9_LNKB,IRQ_PCI,\
			SLOT9_LNKC,IRQ_PCI,\
			SLOT9_LNKD,IRQ_PCI,9,0>
ENDIF;	SLOT9_EXIST
;R09 - ends

IF	SCSI_ONBOARD
	DEFINE_SLOT_LNKS	SCSI				
	public	ScsiPci21Tbl			;R07
 ScsiPci21Tbl:					;R07
	IRQROUTE <0,(SCSI_SLOT SHL 3),\
			SCSI_LNKA,IRQ_PCI,\
			SCSI_LNKB,IRQ_PCI,\
			SCSI_LNKC,IRQ_PCI,\
			SCSI_LNKD,IRQ_PCI,0,0>
ENDIF	;SCSI_ONBOARD

IF	VGA_ONBOARD
	DEFINE_SLOT_LNKS	VGA				
	IRQROUTE <0,(ONBOARD_PCI_VGA shl 3),\
			VGA_LNKA,IRQ_PCI,\
			VGA_LNKB,IRQ_PCI,\
			VGA_LNKC,IRQ_PCI,\
			VGA_LNKD,IRQ_PCI,0,0>
ENDIF	;VGA_ONBOARD

IF	IDE_ONBOARD
	DEFINE_SLOT_LNKS	IDE
	IRQROUTE <0,IDE_ONBOARD,\
			IDE_LNKA,IRQ_PCI,\
			IDE_LNKB,IRQ_PCI,\
			IDE_LNKC,IRQ_PCI,\
			IDE_LNKD,IRQ_PCI,0,0>
ENDIF	;IDE_ONBOARD

IF	CARDBUS_ONBOARD
	DEFINE_SLOT_LNKS	CARDBUS				
;R04	IRQROUTE <0,CARDBUS_ONBOARD,\
	IRQROUTE <0,CARDBUS_USE_LAGECY,\
			CARDBUS_LNKA,IRQ_PCI,\
			CARDBUS_LNKB,IRQ_PCI,\
			CARDBUS_LNKC,IRQ_PCI,\
			CARDBUS_LNKD,IRQ_PCI,0,0>
ENDIF	;CARDBUS_ONBOARD

;R05A - start
IF	AGP_ROUTE
	DEFINE_SLOT_LNKS	AGP
	IRQROUTE <0,AGP_ROUTE,\
			AGP_LNKA,IRQ_PCI,\
			AGP_LNKB,IRQ_PCI,\
			AGP_LNKC,IRQ_PCI,\
			AGP_LNKD,IRQ_PCI,0,0>
ENDIF;	AGP_ROUTE
;R05A - end

;[]-----------------------------------------------------------------------[]
;
;   The onboard USB table must be placed in the end of the whole table. 
;   The PCI kernel will check whether this device exists or not so as to 
;   modify the table size in order for the IRQ-routing test not to report
;   a un-used slot if this device is completely hiddened.
;
;[]-----------------------------------------------------------------------[]
IF	USB_ONBOARD
ifndef	M1543				;R08
	DEFINE_SLOT_LNKS	USB
	IRQROUTE <0,USB_ONBOARD,\
			USB_LNKA,IRQ_PCI,\
			USB_LNKB,IRQ_PCI,\
			USB_LNKC,IRQ_PCI,\
			USB_LNKD,IRQ_PCI,0,0>
;R08 - start
else;	M1543
		public	IRQTBL_USB
IRQTBL_USB:
	DEFINE_SLOT_LNKS	USB
	IRQROUTE <0,USB_ONBOARD,\
			USB_LNKA,IRQ_PCI,\
			0,0,\
			0,0,\
			0,0,0,0>
endif;	M1543
;R08 - end
ENDIF	;USB_ONBOARD

;R05A ;R05 - start
;R05A IF	AGP_ROUTE
;R05A 	DEFINE_SLOT_LNKS	AGP
;R05A 	IRQROUTE <0,AGP_ROUTE,\
;R05A 			AGP_LNKA,IRQ_PCI,\
;R05A 			AGP_LNKB,IRQ_PCI,\
;R05A 			AGP_LNKC,IRQ_PCI,\
;R05A 			AGP_LNKD,IRQ_PCI,0,0>
;R05A ENDIF;	AGP_ROUTE
;R05A ;R05 - end

		Public	IrqRouteTbl_END
IrqRouteTbl_END	Label	Near

MsPciIrqTbl_LEN	EQU	($ - (offset MsPciIrqTbl))

		Public	PciIrqTbl_Size
PciIrqTbl_Size	dw	($ - (offset IrqRouteTbl))

endif	;PCI_BUS

FCODE		ENDS
		END
