mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*------------------------------------------------------------------------------+ */
 | 
						|
/* */
 | 
						|
/*       This source code has been made available to you by IBM on an AS-IS */
 | 
						|
/*       basis.  Anyone receiving this source is licensed under IBM */
 | 
						|
/*       copyrights to use it in any way he or she deems fit, including */
 | 
						|
/*       copying it, modifying it, compiling it, and redistributing it either */
 | 
						|
/*       with or without modifications.  No license under IBM patents or */
 | 
						|
/*       patent applications is to be implied by the copyright license. */
 | 
						|
/* */
 | 
						|
/*       Any user of this software should understand that IBM cannot provide */
 | 
						|
/*       technical support for this software and will not be responsible for */
 | 
						|
/*       any consequences resulting from the use of this software. */
 | 
						|
/* */
 | 
						|
/*       Any person who transfers this source code or any derivative work */
 | 
						|
/*       must include the IBM copyright notice, this paragraph, and the */
 | 
						|
/*       preceding two paragraphs in the transferred software. */
 | 
						|
/* */
 | 
						|
/*       COPYRIGHT   I B M   CORPORATION 1995 */
 | 
						|
/*       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M */
 | 
						|
/*------------------------------------------------------------------------------- */
 | 
						|
 | 
						|
/*----------------------------------------------------------------------------- */
 | 
						|
/* Function:     ext_bus_cntlr_init */
 | 
						|
/* Description:  Initializes the External Bus Controller for the external */
 | 
						|
/*		peripherals. IMPORTANT: For pass1 this code must run from */
 | 
						|
/*		cache since you can not reliably change a peripheral banks */
 | 
						|
/*		timing register (pbxap) while running code from that bank. */
 | 
						|
/*		For ex., since we are running from ROM on bank 0, we can NOT */
 | 
						|
/*		execute the code that modifies bank 0 timings from ROM, so */
 | 
						|
/*		we run it from cache. */
 | 
						|
/*	Bank 0 - Flash and SRAM */
 | 
						|
/*	Bank 1 - NVRAM/RTC */
 | 
						|
/*	Bank 2 - Keyboard/Mouse controller */
 | 
						|
/*	Bank 3 - IR controller */
 | 
						|
/*	Bank 4 - not used */
 | 
						|
/*	Bank 5 - not used */
 | 
						|
/*	Bank 6 - not used */
 | 
						|
/*	Bank 7 - FPGA registers */
 | 
						|
/*----------------------------------------------------------------------------- */
 | 
						|
#include <ppc4xx.h>
 | 
						|
 | 
						|
#include <ppc_asm.tmpl>
 | 
						|
#include <ppc_defs.h>
 | 
						|
 | 
						|
#include <asm/cache.h>
 | 
						|
#include <asm/mmu.h>
 | 
						|
 | 
						|
 | 
						|
	.globl	write_without_sync
 | 
						|
write_without_sync:
 | 
						|
		/*
 | 
						|
		 * Write one values to host via pci busmastering
 | 
						|
		 * ptr = 0xc0000000 -> 0x01000000 (PCI)
 | 
						|
		 * *ptr = 0x01234567;
 | 
						|
		 */
 | 
						|
	addi    r31,0,0
 | 
						|
	lis     r31,0xc000
 | 
						|
 | 
						|
start1:
 | 
						|
	lis     r0,0x0123
 | 
						|
	ori     r0,r0,0x4567
 | 
						|
	stw     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Read one value back
 | 
						|
		 * ptr = (volatile unsigned long *)addr;
 | 
						|
		 * val = *ptr;
 | 
						|
		 */
 | 
						|
 | 
						|
	lwz     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * One pci config write
 | 
						|
		 * ibmPciConfigWrite(0x2e, 2, 0x1234);
 | 
						|
		 */
 | 
						|
		/* subsystem id */
 | 
						|
 | 
						|
	li      r4,0x002C
 | 
						|
	oris    r4,r4,0x8000
 | 
						|
	lis     r3,0xEEC0
 | 
						|
	stwbrx  r4,0,r3
 | 
						|
 | 
						|
	li      r5,0x1234
 | 
						|
	ori     r3,r3,0x4
 | 
						|
	stwbrx  r5,0,r3
 | 
						|
 | 
						|
	b       start1
 | 
						|
 | 
						|
	blr	/* never reached !!!! */
 | 
						|
 | 
						|
	.globl	write_with_sync
 | 
						|
write_with_sync:
 | 
						|
		/*
 | 
						|
		 * Write one values to host via pci busmastering
 | 
						|
		 * ptr = 0xc0000000 -> 0x01000000 (PCI)
 | 
						|
		 * *ptr = 0x01234567;
 | 
						|
		 */
 | 
						|
	addi    r31,0,0
 | 
						|
	lis     r31,0xc000
 | 
						|
 | 
						|
start2:
 | 
						|
	lis     r0,0x0123
 | 
						|
	ori     r0,r0,0x4567
 | 
						|
	stw     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Read one value back
 | 
						|
		 * ptr = (volatile unsigned long *)addr;
 | 
						|
		 * val = *ptr;
 | 
						|
		 */
 | 
						|
 | 
						|
	lwz     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * One pci config write
 | 
						|
		 * ibmPciConfigWrite(0x2e, 2, 0x1234);
 | 
						|
		 */
 | 
						|
		/* subsystem id */
 | 
						|
 | 
						|
	li      r4,0x002C
 | 
						|
	oris    r4,r4,0x8000
 | 
						|
	lis     r3,0xEEC0
 | 
						|
	stwbrx  r4,0,r3
 | 
						|
	sync
 | 
						|
 | 
						|
	li      r5,0x1234
 | 
						|
	ori     r3,r3,0x4
 | 
						|
	stwbrx  r5,0,r3
 | 
						|
	sync
 | 
						|
 | 
						|
	b       start2
 | 
						|
 | 
						|
	blr	/* never reached !!!! */
 | 
						|
 | 
						|
	.globl	write_with_less_sync
 | 
						|
write_with_less_sync:
 | 
						|
		/*
 | 
						|
		 * Write one values to host via pci busmastering
 | 
						|
		 * ptr = 0xc0000000 -> 0x01000000 (PCI)
 | 
						|
		 * *ptr = 0x01234567;
 | 
						|
		 */
 | 
						|
	addi    r31,0,0
 | 
						|
	lis     r31,0xc000
 | 
						|
 | 
						|
start2b:
 | 
						|
	lis     r0,0x0123
 | 
						|
	ori     r0,r0,0x4567
 | 
						|
	stw     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Read one value back
 | 
						|
		 * ptr = (volatile unsigned long *)addr;
 | 
						|
		 * val = *ptr;
 | 
						|
		 */
 | 
						|
 | 
						|
	lwz     r0,0(r31)
 | 
						|
 | 
						|
		/*
 | 
						|
		 * One pci config write
 | 
						|
		 * ibmPciConfigWrite(0x2e, 2, 0x1234);
 | 
						|
		 */
 | 
						|
		/* subsystem id */
 | 
						|
 | 
						|
	li      r4,0x002C
 | 
						|
	oris    r4,r4,0x8000
 | 
						|
	lis     r3,0xEEC0
 | 
						|
	stwbrx  r4,0,r3
 | 
						|
	sync
 | 
						|
 | 
						|
	li      r5,0x1234
 | 
						|
	ori     r3,r3,0x4
 | 
						|
	stwbrx  r5,0,r3
 | 
						|
/*        sync */
 | 
						|
 | 
						|
	b       start2b
 | 
						|
 | 
						|
	blr	/* never reached !!!! */
 | 
						|
 | 
						|
	.globl	write_with_more_sync
 | 
						|
write_with_more_sync:
 | 
						|
		/*
 | 
						|
		 * Write one values to host via pci busmastering
 | 
						|
		 * ptr = 0xc0000000 -> 0x01000000 (PCI)
 | 
						|
		 * *ptr = 0x01234567;
 | 
						|
		 */
 | 
						|
	addi    r31,0,0
 | 
						|
	lis     r31,0xc000
 | 
						|
 | 
						|
start3:
 | 
						|
	lis     r0,0x0123
 | 
						|
	ori     r0,r0,0x4567
 | 
						|
	stw     r0,0(r31)
 | 
						|
	sync
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Read one value back
 | 
						|
		 * ptr = (volatile unsigned long *)addr;
 | 
						|
		 * val = *ptr;
 | 
						|
		 */
 | 
						|
 | 
						|
	lwz     r0,0(r31)
 | 
						|
	sync
 | 
						|
 | 
						|
		/*
 | 
						|
		 * One pci config write
 | 
						|
		 * ibmPciConfigWrite(0x2e, 2, 0x1234);
 | 
						|
		 */
 | 
						|
		/* subsystem id (PCIC0_SBSYSVID)*/
 | 
						|
 | 
						|
	li      r4,0x002C
 | 
						|
	oris    r4,r4,0x8000
 | 
						|
	lis     r3,0xEEC0
 | 
						|
	stwbrx  r4,0,r3
 | 
						|
	sync
 | 
						|
 | 
						|
	li      r5,0x1234
 | 
						|
	ori     r3,r3,0x4
 | 
						|
	stwbrx  r5,0,r3
 | 
						|
	sync
 | 
						|
 | 
						|
	b       start3
 | 
						|
 | 
						|
	blr	/* never reached !!!! */
 |