Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <asm/asm-offsets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #define MMU_BASE	8		/* MMU flags base in cpu_mmu_flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) ENTRY(relocate_new_kernel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	movel %sp@(4),%a0		/* a0 = ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	movel %sp@(8),%a1		/* a1 = start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	movel %sp@(12),%d1		/* d1 = cpu_mmu_flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	movew #PAGE_MASK,%d2		/* d2 = PAGE_MASK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	/* Disable MMU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	btst #MMU_BASE + MMUB_68851,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	jeq 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 1:	/* 68851 or 68030 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	lea %pc@(.Lcopy),%a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 2:	addl #0x00000000,%a4		/* virt_to_phys() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	.section ".m68k_fixup","aw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	.long M68K_FIXUP_MEMOFFSET, 2b+2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	.chip 68030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	pmove %tc,%d0			/* Disable MMU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	bclr #7,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	pmove %d0,%tc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	jmp %a4@			/* Jump to physical .Lcopy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	.chip 68k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	btst #MMU_BASE + MMUB_68030,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	jne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	btst #MMU_BASE + MMUB_68040,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	jeq 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 4:	/* 68040 or 68060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	lea %pc@(.Lcont040),%a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 5:	addl #0x00000000,%a4		/* virt_to_phys() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	.section ".m68k_fixup","aw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	.long M68K_FIXUP_MEMOFFSET, 5b+2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	movel %a4,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	andl #0xff000000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	orw #0xe020,%d0			/* Map 16 MiB, enable, cacheable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	.chip 68040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	movec %d0,%itt0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	movec %d0,%dtt0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	.chip 68k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	jmp %a4@			/* Jump to physical .Lcont040 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) .Lcont040:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	moveq #0,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	.chip 68040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	movec %d0,%tc			/* Disable MMU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	movec %d0,%itt0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	movec %d0,%itt1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	movec %d0,%dtt0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	movec %d0,%dtt1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	.chip 68k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	jra .Lcopy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	btst #MMU_BASE + MMUB_68060,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	jne 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) .Lcopy:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	movel %a0@+,%d0			/* d0 = entry = *ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	jeq .Lflush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	btst #2,%d0			/* entry & IND_DONE? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	jne .Lflush
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	btst #1,%d0			/* entry & IND_INDIRECTION? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	jeq 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	andw %d2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	movel %d0,%a0			/* ptr = entry & PAGE_MASK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	jra .Lcopy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	btst #0,%d0			/* entry & IND_DESTINATION? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	jeq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	andw %d2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	movel %d0,%a2			/* a2 = dst = entry & PAGE_MASK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	jra .Lcopy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	btst #3,%d0			/* entry & IND_SOURCE? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	jeq .Lcopy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	andw %d2,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	movel %d0,%a3			/* a3 = src = entry & PAGE_MASK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	movew #PAGE_SIZE/32 - 1,%d0	/* d0 = PAGE_SIZE/32 - 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	movel %a3@+,%a2@+		/* *dst++ = *src++ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	dbf %d0, 3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	jra .Lcopy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .Lflush:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	/* Flush all caches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	btst #CPUB_68020,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	jeq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 1:	/* 68020 or 68030 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.chip 68030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	movec %cacr,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	orw #0x808,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	movec %d0,%cacr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	.chip 68k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	jra .Lreincarnate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	btst #CPUB_68030,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	jne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	btst #CPUB_68040,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	jeq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 3:	/* 68040 or 68060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	.chip 68040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	cpusha %bc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	cinva %bc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	.chip 68k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	jra .Lreincarnate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	btst #CPUB_68060,%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	jne 3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .Lreincarnate:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	jmp %a1@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) relocate_new_kernel_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ENTRY(relocate_new_kernel_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	.long relocate_new_kernel_end - relocate_new_kernel