diff options
Diffstat (limited to 'arch/x86/lib/bios_pci.S')
| -rw-r--r-- | arch/x86/lib/bios_pci.S | 92 | 
1 files changed, 63 insertions, 29 deletions
| diff --git a/arch/x86/lib/bios_pci.S b/arch/x86/lib/bios_pci.S index 53d2ea047..47c478b27 100644 --- a/arch/x86/lib/bios_pci.S +++ b/arch/x86/lib/bios_pci.S @@ -80,11 +80,15 @@ cs	incl	num_pci_bios_present  #endif  	movl	$0x20494350, %eax  gs	movl	%eax, OFFS_EDX(%bp) + +	/* We support cfg type 1 version 2.10 */  	movb	$0x01, %al -gs	movb	%al, OFFS_AL(%bp)	/* We support cfg type 1 */ -	movw	$0x0210, %ax            /* version 2.10 */ +gs	movb	%al, OFFS_AL(%bp) +	movw	$0x0210, %ax  gs	movw	%ax, OFFS_BX(%bp) -cs	movb	pci_last_bus, %al       /* last bus number */ + +	/* last bus number */ +cs	movb	pci_last_bus, %al  gs	movb	%al, OFFS_CL(%bp)  	jmp	clear_carry @@ -97,16 +101,22 @@ cs	incl	num_pci_bios_find_device  #endif  gs	movw	OFFS_CX(%bp), %di  	shll	$16, %edi -gs	movw	OFFS_DX(%bp), %di       /* edi now holds device in upper 16 -					 * bits and vendor in lower 16 bits */ +gs	movw	OFFS_DX(%bp), %di +	/* edi now holds device in upper 16 bits and vendor in lower 16 bits */ +  gs	movw	OFFS_SI(%bp), %si -	xorw	%bx, %bx                /* start at bus 0 dev 0 function 0 */ + +	/* start at bus 0 dev 0 function 0 */ +	xorw	%bx, %bx  pfd_loop: -	xorw	%ax, %ax		/* dword 0 is vendor/device */ +	/* dword 0 is vendor/device */ +	xorw	%ax, %ax  	call	__pci_bios_select_register  	movw	$0xcfc, %dx  	inl	%dx, %eax -	cmpl	%edi, %eax		/* our device ? */ + +	/* our device ? */ +	cmpl	%edi, %eax  	je	pfd_found_one  pfd_next_dev:  	/* check for multi function devices */ @@ -120,13 +130,16 @@ pfd_next_dev:  	andb	$0x80, %al  	jz	pfd_not_multi_function  pfd_function_not_zero: -	incw	%bx			/* next function, overflows in to -					 * device number, then bus number */ +	/* next function, overflows in to device number, then bus number */ +	incw	%bx  	jmp	pfd_check_bus  pfd_not_multi_function: -	andw	$0xfff8, %bx            /* remove function bits */ -	addw	$0x0008, %bx            /* next device, overflows in to bus number */ +	/* remove function bits */ +	andw	$0xfff8, %bx + +	/* next device, overflows in to bus number */ +	addw	$0x0008, %bx  pfd_check_bus:  cs	movb	pci_last_bus, %ah  	cmpb	%ah, %bh @@ -142,7 +155,8 @@ gs	movw	%bx, OFFS_BX(%bp)  	jmp	clear_carry  pfd_not_found: -	movb	$0x86, %ah              /* device not found */ +	/* device not found */ +	movb	$0x86, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -152,17 +166,24 @@ pci_bios_find_class:  cs	incl	num_pci_bios_find_class  #endif  gs	movl	OFFS_ECX(%bp), %edi -	andl	$0x00ffffff, %edi       /* edi now holds class-code in lower 24 bits */ + +	/* edi now holds class-code in lower 24 bits */ +	andl	$0x00ffffff, %edi  gs	movw	OFFS_SI(%bp), %si -	xorw	%bx, %bx                /* start at bus 0 dev 0 function 0 */ + +	/* start at bus 0 dev 0 function 0 */ +	xorw	%bx, %bx  pfc_loop: -	movw	$8, %ax			/* dword 8 is class-code high 24bits */ +	/* dword 8 is class-code high 24bits */ +	movw	$8, %ax  	call	__pci_bios_select_register  	movw	$0xcfc, %dx  	inl	%dx, %eax  	shrl	$8, %eax  	andl	$0x00ffffff, %eax -	cmpl	%edi, %eax		/* our device ? */ + +	/* our device ? */ +	cmpl	%edi, %eax  	je	pfc_found_one  pfc_next_dev:  	/* check for multi function devices */ @@ -175,13 +196,16 @@ pfc_next_dev:  	andb	$0x80, %al  	jz	pfc_not_multi_function  pfc_function_not_zero: -	incw	%bx			/* next function, overflows in to -					 * device number, then bus number */ +	/* next function, overflows in to device number, then bus number */ +	incw	%bx  	jmp	pfc_check_bus  pfc_not_multi_function: -	andw	$0xfff8, %bx            /* remove function bits */ -	addw	$0x0008, %bx            /* next device, overflows in to bus number */ +	/* remove function bits */ +	andw	$0xfff8, %bx + +	/* next device, overflows in to bus number */ +	addw	$0x0008, %bx  pfc_check_bus:  cs	movb	pci_last_bus, %ah  	cmpb	%ah, %bh @@ -197,7 +221,8 @@ gs	movw	%bx, OFFS_BX(%bp)  	jmp	clear_carry  pfc_not_found: -	movb	$0x86, %ah              /* device not found */ +	/* device not found */ +	movb	$0x86, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -206,7 +231,8 @@ pci_bios_generate_special_cycle:  #ifdef PCI_BIOS_DEBUG  cs	incl	num_pci_bios_generate_special_cycle  #endif -	movb	$0x81, %ah              /* function not supported */ +	/* function not supported */ +	movb	$0x81, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -296,7 +322,8 @@ pci_bios_get_irq_routing:  #ifdef PCI_BIOS_DEBUG  cs	incl	num_pci_bios_get_irq_routing  #endif -	movb	$0x81, %ah              /* function not supported */ +	/* function not supported */ +	movb	$0x81, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -305,7 +332,8 @@ pci_bios_set_irq:  #ifdef PCI_BIOS_DEBUG  cs	incl	num_pci_bios_set_irq  #endif -	movb	$0x81, %ah              /* function not supported */ +	/* function not supported */ +	movb	$0x81, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -314,7 +342,8 @@ unknown_function:  #ifdef PCI_BIOS_DEBUG  cs	incl	num_pci_bios_unknown_function  #endif -	movb	$0x81, %ah              /* function not supported */ +	/* function not supported */ +	movb	$0x81, %ah  	jmp	set_carry  /*****************************************************************************/ @@ -323,7 +352,8 @@ pci_bios_select_register:  gs	movw	OFFS_BX(%bp), %bx  gs	movw	OFFS_DI(%bp), %ax  /* destroys eax, dx */ -__pci_bios_select_register:               /* BX holds device id, AX holds register index */ +__pci_bios_select_register: +	/* BX holds device id, AX holds register index */  	pushl	%ebx  	andl	$0xfc, %eax  	andl	$0xffff, %ebx @@ -338,7 +368,9 @@ __pci_bios_select_register:               /* BX holds device id, AX holds regist  clear_carry:  gs	movw	OFFS_FLAGS(%bp), %ax -	andw	$0xfffe, %ax			/* clear carry -- function succeeded */ + +	/* clear carry -- function succeeded */ +	andw	$0xfffe, %ax  gs	movw	%ax, OFFS_FLAGS(%bp)  	xorw	%ax, %ax  gs	movb	%ah, OFFS_AH(%bp) @@ -347,7 +379,9 @@ gs	movb	%ah, OFFS_AH(%bp)  set_carry:  gs	movb	%ah, OFFS_AH(%bp)  gs	movw	OFFS_FLAGS(%bp), %ax -	orw	$1, %ax				/* return carry -- function not supported */ + +	/* return carry -- function not supported */ +	orw	$1, %ax  gs	movw	%ax, OFFS_FLAGS(%bp)  	movw	$-1, %ax  	ret |