⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcipost.asm

📁 <B>Award BIOS(Basic Input/Output System)(电脑启动时所必需)的源码</B>
💻 ASM
📖 第 1 页 / 共 5 页
字号:

DEFINE_STACK	RESERVE_PCIIRQ		, 1
DEFINE_STACK	PCI_IRQ_ASSIGNED	, 2
DEFINE_STACK	PCI_IRQ_MAP		, 2
DEFINE_STACK	PCIIRQ  		, 32		;need 16*2 bytes
							;PCI available IRQ no. 1,2,4,4
							;low byte = IRQ No. 0-15
							;high byte = INT No. 1-16
DEFINE_STACK	PCI_IDE_EXIST		, 1
DEFINE_STACK	PCI_IDE_FOUND		, 1
		IDE_EXIST		EQU	0AAH	;flag for PCI/IDE found

DEFINE_STACK	ESCD_IRQ		, 2
DEFINE_STACK	ESCD_DMA		, 1
DEFINE_STACK	BP_FIXED_IRQ_MAP	, 2		;R111

;[]================================================================[]
;[]================================================================[]

MAX_SUB_BUS		EQU	16
BUS_TREE_STRUC		STRUC
  Host_Slot		db	?
  P2PB_BusNo		db	?
  P2PB_DevFucNo		db	?
  Sub_Buses		db	MAX_SUB_BUS dup (?)
  TotalMemReq		dd	?
  TotalPfMemReq		dd	?
  TotalIOReq		dd	?
  TotalLMemReq		dd	?
  Bus_IO_Start		dd	?
  Bus_Mem_Start		dd	?
  Bus_PfMem_Start	dd	?
BUS_TREE_STRUC		ENDS
SIZE_BUS_TREE_STRUC	EQU	(SIZE BUS_TREE_STRUC)

VGA_INFO_STRUC		STRUC
	VGA_DevNum	db	?
	VGA_BusNum	db	?
	OnboardVGA	db	?
			db	?	;dummy byte
	VGA_ID		dd	?
VGA_INFO_STRUC		ENDS
SIZE_VGA_INFO_STRUC	EQU	(SIZE VGA_INFO_STRUC)

IRQ_REQ_STRUC		STRUC
;R111 - starts
	FixedIRQ	db	?
			db	?	;dummy byte
			db	?	;dummy byte
			db	?	;dummy byte
;R111 - ends
	IntPin		db	?
	IrqReqDevNum	db	?
	IrqReqBusNum	db	?
	HostSlot	db	?
;R111			dd	?	;dummy dword
IRQ_REQ_STRUC		ENDS
SIZE_IRQ_REQ_STRUC	EQU	(SIZE IRQ_REQ_STRUC)

TEMP_PCI_REQ_BUF	SEGMENT USE16 AT 5000h
P2P_TREE_INFO		Label	Byte
			db	(MAX_SUB_BUS * SIZE_BUS_TREE_STRUC) dup (?)
PCI_VGA_DEVICE_BUF	Label	Byte
			db	16*SIZE_VGA_INFO_STRUC dup (?)
TEMP_BASE_REQ_BUF	Label	Byte
TEMP_PCI_REQ_BUF	ENDS

MEMIO_BUF		STRUC
	MemIO_Req	dd	0
	Cfg_Loc		dw	0
	MemIo_Info	db	0
	Bus_Num		db	0
MEMIO_BUF		ENDS
SIZE_MEMIO_BUF		EQU	SIZE MEMIO_BUF

PCI_REQ_BUF	SEGMENT USE16 AT 4000h
BUF_SIZE	EQU	6*8*32		;max 32 devices
					;each device has max 8 functions
					;each function request max 6 Mem base
IO_BUF		db	(BUF_SIZE * SIZE_MEMIO_BUF) dup (?)
HMEM_BUF	db	(BUF_SIZE * SIZE_MEMIO_BUF) dup (?)
LMEM_BUF	db	(BUF_SIZE * SIZE_MEMIO_BUF) dup (?)
PREFET_MEM_BUF	db	(BUF_SIZE * SIZE_MEMIO_BUF) dup (?)

PCI_REQ_BUF	ENDS

VIRTUAL_HMEM_BASE	EQU	0A0h
VIRTUAL_PFMEM_BASE	EQU	0A8h
VIRTUAL_BUS0_PFMEM_BASE	EQU	0B0h
VIRTUAL_IO_BASE		EQU	0A1h

G_RAM		SEGMENT USE16 AT 0

		ORG	04H*4
		INCLUDE SEG_0.INC

		ORG	400H
		INCLUDE G_RAM.INC
ifdef	PNP_BIOS
		ORG	2000h
		INCLUDE PNPDATA.INC
endif	;PNP_BIOS

G_RAM		ENDS

		extrn	xcall_proc:near
		extrn	X_GetItem_Value:Near

.LIST

IFE	COMPILE_FOR_E0 EQ 1

ifdef	PCI_BUS

	ifdef	PNP_BIOS
		extrn	Build_OnboardRomNode:near
	 ifdef	COMBINE_ISA_ROM
		extrn	Build_OtherRomNode:near
	 endif;	COMBINE_ISA_ROM
;R110	 ifndef	NEW_PNP_SETUP
;R110	 ifdef	PNP_PCI_AUTO
;R110		extrn	PnP_Auto_Item:near
;R110	 endif	;PNP_PCI_AUTO
;R110	 endif	;NEW_PNP_SETUP
	endif;	PNP_BIOS

	ifdef	Cardbus_support
		extrn	Cardbus_Init:near
	endif	;Cardbus_support

	IF	SET_MPIRQ_TBL
		extrn	IO_Int_Entry16:near
	ENDIF	;SET_MPIRQ_TBL

		extrn	Pci_Class_Code:near

IF	BIOS_SUPPORT_586				;R99
		extrn	Check_M1_Cpu:near
ENDIF	;BIOS_SUPPORT_586				;R99
		extrn	Unlock_Cyrix:near
		extrn	lock_Cyrix:near
		extrn	F000_Set_Cyrix:near

		extrn	F000_call_proc:near
		extrn	Post_call_proc:near
		extrn	POST_func_end:Near
		extrn	POST_VECT:Near

		extrn	Vga_Snoop_Item:near

		extrn	Ct_OnChip_IDE_Chk:near
	ifdef	ONBOARD_NCR_SETUPABLE
		extrn	Scsi_Item:near
	endif	;ONBOARD_NCR_SETUPABLE

		extrn	AGet_CfgSpace_Byte:near
		extrn	AGet_CfgSpace_Word:near
		extrn	AGet_CfgSpace_Dword:near
		extrn	ASet_CfgSpace_Byte:near
		extrn	ASet_CfgSpace_Word:near
		extrn	ASet_CfgSpace_Dword:near
		extrn	Move_Codes:Near
		extrn	GetItem_Value:Near
		extrn	F000_GetItem_Value:near

		extrn	F000_Shadow_W:near
		extrn	F000_Shadow_R:near
		extrn	E000_64k_Shadow_RW:Near
		extrn	E000_64k_Shadow_R:Near
		extrn	C000_Shadow_RW:near		;chipset.asm
		extrn	C000_Shadow_R:near		;chipset.asm
		extrn	C800_Shadow:near		;chipset.asm
		extrn	CC00_Shadow:near		;chipset.asm
		extrn	D000_Shadow:near		;chipset.asm
		extrn	D400_Shadow:near		;chipset.asm
		extrn	D800_Shadow:near		;chipset.asm
		extrn	DC00_Shadow:near		;chipset.asm

		extrn	PCI_SLOT_CFG:near		;chipset.asm
		extrn	Ct_Shadow_Unit:Near		;pcichip.asm
		extrn	Ct_C8_To_DF_RW:Near		;pcichip.asm
		extrn	Ct_C8_To_DF_R:Near		;pcichip.asm
		extrn	Ct_PCI_Info:Near		;pcichip.asm
		extrn	Ct_Special_PCI_Device:Near	;pcichip.asm
		extrn	Ct_Set_PciIrq:near		;pcichip.asm
		extrn	IrqRout_Table:near		;pcichip.asm
;R110	ifndef	NEW_PNP_SETUP
;R110		extrn	PciIrq_Item:near		;pcichip.asm
;R110	endif	;NEW_PNP_SETUP
		extrn	Ct_Disable_Shadow:Near		;pcichip.asm

;R82	ifdef	CT_SHADOW_RW_HOOK_SUPPORT
		extrn	Ct_Shadow_R:near		;pcichip.asm
		extrn	Ct_Shadow_RW:near		;pcichip.asm
;R82	endif	;CT_SHADOW_RW_HOOK_SUPPORT

;728	ifndef	NO_PCI_IDE_CARD
;728		extrn	PCI_IDE_IRQ:near		;pcifeat.asm
;728		extrn	First_IDE_INT:near		;pcifeat.asm
;728		extrn	Second_IDE_INT:near		;pcifeat.asm
;728	endif	;NO_PCI_IDE_CARD

;728	ifndef	NO_PCI_IDE_2ND_CONTROL
;728		extrn	Second_IDE_channel:near		;bfeature.asm
;728	endif	;NO_PCI_IDE_2ND_CONTROL

		extrn	Ct_PCI_VGA_IDSEL:near		;pcichip.asm

	ifdef	CT_SPEICAL_PCI_VGA
		extrn	Set_Ct_For_PciVga:near
	endif	;CT_SPEICAL_PCI_VGA

		extrn	Ct_Special_Copy_PCI_VGA:near

	ifdef	SPECIAL_PCI_IDE_PRG
		extrn	CT_PRI_PCI_IDE_PRG:near		;pcichip.asm
		extrn	CT_SEC_PCI_IDE_PRG:near		;pcichip.asm
	endif	;SPECIAL_PCI_IDE_PRG

ifndef	No_C8_DF_Shadow_Item
		extrn	C800_Item:near
		extrn	CC00_Item:near
		extrn	D000_Item:near
		extrn	D400_Item:near
		extrn	D800_Item:near
		extrn	DC00_Item:near
endif	;No_C8_DF_Shadow_Item

	ifdef	Combined_Other_PCI_ROM
		extrn	Ct_If_Combined_ROM_Needed:near
	endif	;Combined_Other_PCI_ROM

	ifdef	MULTI_HOST_BRIDGE
		extrn	Ct_Set_Mult_PciBus:near
	endif	;MULTI_HOST_BRIDGE

                extrn    GDTR1:fword
                extrn    code1_dt:near
                extrn    data1_dt:near
                extrn    data1_index:abs

		extrn	fProc_Pci_IO_Mem_Init:far

	IF	MSIRQROUT_SUPPORT
		extrn	MsPciIrqTbl:Near
	ENDIF	;MSIRQROUT_SUPPORT
		extrn	PciIrqTbl_Size:Near

		extrn	IRQ_REQ_BUF:Near
		extrn	IRQ_REQ_BUF_PTR:Near

		extrn	fProc_PciRom_Before_Init:Far

		extrn	POST_decompress:near
		extrn	A20_On:Near
		extrn	A20_Off:Near

;R72 		extrn	fProc_Reserve_Irq_For_PciBootDev:far

ifdef	RAID_BOOT_OPTION
		extrn	RaidBoot_Item:near
endif;	RAID_BOOT_OPTION

;R91A	ifdef	PciLanROM_Control				;R91
;R91A		extrn	LAN_COMMAND_WORD:word			;R91
;R91A	endif	;PciLanROM_Control				;R91

endif	;PCI_BUS

		extrn	BootEntryTbl:near		;R96
		extrn	BootEntryEnd:near		;R96
		extrn	R_Mod_Ck:near
		extrn	F_C000_Shadow_R:near		;R82

DGROUP		GROUP	FCODE
FCODE		SEGMENT USE16 PARA PUBLIC 'CODE'
		ASSUME	CS:DGROUP

ifdef	PCI_BUS
;[]==============================================================[]
;
;Note : Don't destroy following codes , because it will be executed
;	while warm booting
;
;Reset_PciMaster:
;	Clear bit 2 (master bit ) of PCI command register
;
;Saves: all
;
;Input : none
;
;Output: None
;
;[]==============================================================[]
		public	Reset_PciMaster
Reset_PciMaster	proc	near

ifndef	PCI_RESET_SUPPORT

		pushad

		xor	bh, bh			;start from bus 0
Scan_Nxt_BusMs:
		xor	cx, cx			;start from devic 0 , func. 0

Scan_Nxt_Master:

ifdef	Cx5510_PCI_REG
		cmp	ch, Cx5510_PCI_REG	;if Cyrix Cx5510 chipset
		je	Next_Dev		;
endif;	Cx5510_PCI_REG

		xor	cl, cl
		call	AGet_CfgSpace_Word	;get vendor ID
		cmp	ax, -1			;legal vendor ?
		je	Next_Dev

		mov	cl, 4
		call	AGet_CfgSpace_Byte	;get command register
		and	al, NOT 04H		;disable master bit
		call	ASet_CfgSpace_Byte	;Set command register

		mov	cl, 0bh
		call	AGet_CfgSpace_Byte	;get class code
		cmp	al, 02			;is PCI LAN ?
		jne	No_PCI_LAN

		mov	cl, 04h
		xor	al, al
		call	ASet_CfgSpace_Byte	;clear command register.
No_PCI_LAN:

Next_Dev:
		call	Get_Nxt_Device		;CH return next device to do
		jnc	Scan_Nxt_Master

		inc	bh			;next bus
		cmp	bh, 4			;total 4 buses
		jb	Scan_Nxt_BusMs

		popad

endif;	PCI_RESET_SUPPORT

		ret

Reset_PciMaster	endp

ifndef	PCI_RESET_SUPPORT
;[]================================================================[]
;Get_Next_Device:
;	This routine is used to get next device no to treat
;Input	:	CH - Slot identification Number
;Output :	NC : CH - Next Slot ID numbuer
;		CF : All slot & function spaces has scanned
;[]================================================================[]
		ALIGN	4
Get_Nxt_Device	proc	near

		test	ch, 07h			;alread a multi-function space?
		jnz	@F			;yes, go point to next function

		mov	cl, 0Eh			;read header type
		call	AGet_CfgSpace_Byte	;read header type
		test	al, 80H			;multi-function support?
		jnz	@F			;yes, multi-function card!
		and	ch, NOT 111B		;mask function bits	;R57
		add	ch, 7			;point to next device!
	@@:
		add	ch, 1			;point to next function space
		jc	@F			;already overflow!

	ifdef	CONFIG_MECHANISM_1
		cmp	ch, (31 SHL 3)		;exceed maximum device?
	else	;CONFIG_MECHANISM_1
		cmp	ch, (15 SHL 3)		;exceed maximum device?
	endif	;CONFIG_MECHANISM_1

		ja	@F			;yes, tell caller error!

		clc				;success return
		ret
	@@:
		stc				;error return
		ret

Get_Nxt_Device	endp
endif;	PCI_RESET_SUPPORT

;[]================================================================[]
;[]================================================================[]
		Public	fProc_Get_CfgSpace_Byte
fProc_Get_CfgSpace_Byte	Proc	Far
		call	Get_CfgSpace_Byte
		retf
fProc_Get_CfgSpace_Byte	Endp
Get_CfgSpace_Byte	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	AGet_CfgSpace_Byte
		pop	bx
		ret
Get_CfgSpace_Byte	Endp

;-----------------------
;-----------------------
		Public	fProc_Get_CfgSpace_Word
fProc_Get_CfgSpace_Word	Proc	Far
		call	Get_CfgSpace_Word
		retf
fProc_Get_CfgSpace_Word	Endp
Get_CfgSpace_Word	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	AGet_CfgSpace_Word
		pop	bx
		ret
Get_CfgSpace_Word	Endp

;-----------------------
;-----------------------
		Public	fProc_Get_CfgSpace_Dword
fProc_Get_CfgSpace_Dword	Proc	Far
		call	Get_CfgSpace_Dword
		retf
fProc_Get_CfgSpace_Dword	Endp
Get_CfgSpace_Dword	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	AGet_CfgSpace_Dword
		pop	bx
		ret
Get_CfgSpace_Dword	Endp

;-----------------------
;-----------------------
		Public	fProc_Set_CfgSpace_Byte
fProc_Set_CfgSpace_Byte	Proc	Far
		call	Set_CfgSpace_Byte
		retf
fProc_Set_CfgSpace_Byte	Endp
Set_CfgSpace_Byte	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	ASet_CfgSpace_Byte
		pop	bx
		ret
Set_CfgSpace_Byte	Endp

;-----------------------
;-----------------------
		Public	fProc_Set_CfgSpace_Word
fProc_Set_CfgSpace_Word	Proc	Far
		call	Set_CfgSpace_Word
		retf
fProc_Set_CfgSpace_Word	Endp
Set_CfgSpace_Word	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	ASet_CfgSpace_Word
		pop	bx
		ret
Set_CfgSpace_Word	Endp

;-----------------------
;-----------------------
		Public	fProc_Set_CfgSpace_Dword
fProc_Set_CfgSpace_Dword	Proc	Far
		call	Set_CfgSpace_Dword
		retf
fProc_Set_CfgSpace_Dword	Endp
Set_CfgSpace_Dword	Proc	Near
		push	bx
		mov	bh, CURRENT_BUS_NO[bp]
		call	ASet_CfgSpace_Dword
		pop	bx
		ret
Set_CfgSpace_Dword	Endp

;[]================================================================[]
;[]================================================================[]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -