1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2a88b5ba8SSam Ravnborg/* head.S: Initial boot code for the Sparc64 port of Linux. 3a88b5ba8SSam Ravnborg * 4a88b5ba8SSam Ravnborg * Copyright (C) 1996, 1997, 2007 David S. Miller (davem@davemloft.net) 5a88b5ba8SSam Ravnborg * Copyright (C) 1996 David Sitsky (David.Sitsky@anu.edu.au) 6a88b5ba8SSam Ravnborg * Copyright (C) 1997, 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 7a88b5ba8SSam Ravnborg * Copyright (C) 1997 Miguel de Icaza (miguel@nuclecu.unam.mx) 8a88b5ba8SSam Ravnborg */ 9a88b5ba8SSam Ravnborg 10a88b5ba8SSam Ravnborg#include <linux/version.h> 11a88b5ba8SSam Ravnborg#include <linux/errno.h> 12*4cdb71b6SMasahiro Yamada#include <linux/export.h> 13a88b5ba8SSam Ravnborg#include <linux/threads.h> 14a88b5ba8SSam Ravnborg#include <linux/init.h> 15a88b5ba8SSam Ravnborg#include <linux/linkage.h> 1665fddcfcSMike Rapoport#include <linux/pgtable.h> 17a88b5ba8SSam Ravnborg#include <asm/thread_info.h> 18a88b5ba8SSam Ravnborg#include <asm/asi.h> 19a88b5ba8SSam Ravnborg#include <asm/pstate.h> 20a88b5ba8SSam Ravnborg#include <asm/ptrace.h> 21a88b5ba8SSam Ravnborg#include <asm/spitfire.h> 22a88b5ba8SSam Ravnborg#include <asm/page.h> 23a88b5ba8SSam Ravnborg#include <asm/errno.h> 24a88b5ba8SSam Ravnborg#include <asm/signal.h> 25a88b5ba8SSam Ravnborg#include <asm/processor.h> 26a88b5ba8SSam Ravnborg#include <asm/lsu.h> 27a88b5ba8SSam Ravnborg#include <asm/dcr.h> 28a88b5ba8SSam Ravnborg#include <asm/dcu.h> 29a88b5ba8SSam Ravnborg#include <asm/head.h> 30a88b5ba8SSam Ravnborg#include <asm/ttable.h> 31a88b5ba8SSam Ravnborg#include <asm/mmu.h> 32a88b5ba8SSam Ravnborg#include <asm/cpudata.h> 33a88b5ba8SSam Ravnborg#include <asm/pil.h> 34a88b5ba8SSam Ravnborg#include <asm/estate.h> 35a88b5ba8SSam Ravnborg#include <asm/sfafsr.h> 36a88b5ba8SSam Ravnborg#include <asm/unistd.h> 37a88b5ba8SSam Ravnborg 38a88b5ba8SSam Ravnborg/* This section from from _start to sparc64_boot_end should fit into 39a88b5ba8SSam Ravnborg * 0x0000000000404000 to 0x0000000000408000. 40a88b5ba8SSam Ravnborg */ 41a88b5ba8SSam Ravnborg .text 42a88b5ba8SSam Ravnborg .globl start, _start, stext, _stext 43a88b5ba8SSam Ravnborg_start: 44a88b5ba8SSam Ravnborgstart: 45a88b5ba8SSam Ravnborg_stext: 46a88b5ba8SSam Ravnborgstext: 47a88b5ba8SSam Ravnborg! 0x0000000000404000 48a88b5ba8SSam Ravnborg b sparc64_boot 49a88b5ba8SSam Ravnborg flushw /* Flush register file. */ 50a88b5ba8SSam Ravnborg 51a88b5ba8SSam Ravnborg/* This stuff has to be in sync with SILO and other potential boot loaders 52a88b5ba8SSam Ravnborg * Fields should be kept upward compatible and whenever any change is made, 53a88b5ba8SSam Ravnborg * HdrS version should be incremented. 54a88b5ba8SSam Ravnborg */ 55a88b5ba8SSam Ravnborg .global root_flags, ram_flags, root_dev 56a88b5ba8SSam Ravnborg .global sparc_ramdisk_image, sparc_ramdisk_size 57a88b5ba8SSam Ravnborg .global sparc_ramdisk_image64 58a88b5ba8SSam Ravnborg 59a88b5ba8SSam Ravnborg .ascii "HdrS" 60a88b5ba8SSam Ravnborg .word LINUX_VERSION_CODE 61a88b5ba8SSam Ravnborg 62a88b5ba8SSam Ravnborg /* History: 63a88b5ba8SSam Ravnborg * 64a88b5ba8SSam Ravnborg * 0x0300 : Supports being located at other than 0x4000 65a88b5ba8SSam Ravnborg * 0x0202 : Supports kernel params string 66a88b5ba8SSam Ravnborg * 0x0201 : Supports reboot_command 67a88b5ba8SSam Ravnborg */ 68a88b5ba8SSam Ravnborg .half 0x0301 /* HdrS version */ 69a88b5ba8SSam Ravnborg 70a88b5ba8SSam Ravnborgroot_flags: 71a88b5ba8SSam Ravnborg .half 1 72a88b5ba8SSam Ravnborgroot_dev: 73a88b5ba8SSam Ravnborg .half 0 74a88b5ba8SSam Ravnborgram_flags: 75a88b5ba8SSam Ravnborg .half 0 76a88b5ba8SSam Ravnborgsparc_ramdisk_image: 77a88b5ba8SSam Ravnborg .word 0 78a88b5ba8SSam Ravnborgsparc_ramdisk_size: 79a88b5ba8SSam Ravnborg .word 0 80a88b5ba8SSam Ravnborg .xword reboot_command 81a88b5ba8SSam Ravnborg .xword bootstr_info 82a88b5ba8SSam Ravnborgsparc_ramdisk_image64: 83a88b5ba8SSam Ravnborg .xword 0 84a88b5ba8SSam Ravnborg .word _end 85a88b5ba8SSam Ravnborg 86a88b5ba8SSam Ravnborg /* PROM cif handler code address is in %o4. */ 87a88b5ba8SSam Ravnborgsparc64_boot: 88a88b5ba8SSam Ravnborg mov %o4, %l7 89a88b5ba8SSam Ravnborg 9025985edcSLucas De Marchi /* We need to remap the kernel. Use position independent 91a88b5ba8SSam Ravnborg * code to remap us to KERNBASE. 92a88b5ba8SSam Ravnborg * 93a88b5ba8SSam Ravnborg * SILO can invoke us with 32-bit address masking enabled, 94a88b5ba8SSam Ravnborg * so make sure that's clear. 95a88b5ba8SSam Ravnborg */ 96a88b5ba8SSam Ravnborg rdpr %pstate, %g1 97a88b5ba8SSam Ravnborg andn %g1, PSTATE_AM, %g1 98a88b5ba8SSam Ravnborg wrpr %g1, 0x0, %pstate 99a88b5ba8SSam Ravnborg ba,a,pt %xcc, 1f 1000ae2d26fSBabu Moger nop 101a88b5ba8SSam Ravnborg 102a88b5ba8SSam Ravnborg .globl prom_finddev_name, prom_chosen_path, prom_root_node 103a88b5ba8SSam Ravnborg .globl prom_getprop_name, prom_mmu_name, prom_peer_name 104a88b5ba8SSam Ravnborg .globl prom_callmethod_name, prom_translate_name, prom_root_compatible 105a88b5ba8SSam Ravnborg .globl prom_map_name, prom_unmap_name, prom_mmu_ihandle_cache 106a88b5ba8SSam Ravnborg .globl prom_boot_mapped_pc, prom_boot_mapping_mode 107a88b5ba8SSam Ravnborg .globl prom_boot_mapping_phys_high, prom_boot_mapping_phys_low 108a88b5ba8SSam Ravnborg .globl prom_compatible_name, prom_cpu_path, prom_cpu_compatible 109a88b5ba8SSam Ravnborg .globl is_sun4v, sun4v_chip_type, prom_set_trap_table_name 110a88b5ba8SSam Ravnborgprom_peer_name: 111a88b5ba8SSam Ravnborg .asciz "peer" 112a88b5ba8SSam Ravnborgprom_compatible_name: 113a88b5ba8SSam Ravnborg .asciz "compatible" 114a88b5ba8SSam Ravnborgprom_finddev_name: 115a88b5ba8SSam Ravnborg .asciz "finddevice" 116a88b5ba8SSam Ravnborgprom_chosen_path: 117a88b5ba8SSam Ravnborg .asciz "/chosen" 118a88b5ba8SSam Ravnborgprom_cpu_path: 119a88b5ba8SSam Ravnborg .asciz "/cpu" 120a88b5ba8SSam Ravnborgprom_getprop_name: 121a88b5ba8SSam Ravnborg .asciz "getprop" 122a88b5ba8SSam Ravnborgprom_mmu_name: 123a88b5ba8SSam Ravnborg .asciz "mmu" 124a88b5ba8SSam Ravnborgprom_callmethod_name: 125a88b5ba8SSam Ravnborg .asciz "call-method" 126a88b5ba8SSam Ravnborgprom_translate_name: 127a88b5ba8SSam Ravnborg .asciz "translate" 128a88b5ba8SSam Ravnborgprom_map_name: 129a88b5ba8SSam Ravnborg .asciz "map" 130a88b5ba8SSam Ravnborgprom_unmap_name: 131a88b5ba8SSam Ravnborg .asciz "unmap" 132a88b5ba8SSam Ravnborgprom_set_trap_table_name: 133a88b5ba8SSam Ravnborg .asciz "SUNW,set-trap-table" 134a88b5ba8SSam Ravnborgprom_sun4v_name: 135a88b5ba8SSam Ravnborg .asciz "sun4v" 136a88b5ba8SSam Ravnborgprom_niagara_prefix: 137a88b5ba8SSam Ravnborg .asciz "SUNW,UltraSPARC-T" 1384ba991d3SDavid S. Millerprom_sparc_prefix: 13908cefa9fSDavid S. Miller .asciz "SPARC-" 14076950e6eSAllen Paisprom_sparc64x_prefix: 14176950e6eSAllen Pais .asciz "SPARC64-X" 142a88b5ba8SSam Ravnborg .align 4 143a88b5ba8SSam Ravnborgprom_root_compatible: 144a88b5ba8SSam Ravnborg .skip 64 145a88b5ba8SSam Ravnborgprom_cpu_compatible: 146a88b5ba8SSam Ravnborg .skip 64 147a88b5ba8SSam Ravnborgprom_root_node: 148a88b5ba8SSam Ravnborg .word 0 149d3867f04SAl ViroEXPORT_SYMBOL(prom_root_node) 150a88b5ba8SSam Ravnborgprom_mmu_ihandle_cache: 151a88b5ba8SSam Ravnborg .word 0 152a88b5ba8SSam Ravnborgprom_boot_mapped_pc: 153a88b5ba8SSam Ravnborg .word 0 154a88b5ba8SSam Ravnborgprom_boot_mapping_mode: 155a88b5ba8SSam Ravnborg .word 0 156a88b5ba8SSam Ravnborg .align 8 157a88b5ba8SSam Ravnborgprom_boot_mapping_phys_high: 158a88b5ba8SSam Ravnborg .xword 0 159a88b5ba8SSam Ravnborgprom_boot_mapping_phys_low: 160a88b5ba8SSam Ravnborg .xword 0 161a88b5ba8SSam Ravnborgis_sun4v: 162a88b5ba8SSam Ravnborg .word 0 163a88b5ba8SSam Ravnborgsun4v_chip_type: 164a88b5ba8SSam Ravnborg .word SUN4V_CHIP_INVALID 165d3867f04SAl ViroEXPORT_SYMBOL(sun4v_chip_type) 166a88b5ba8SSam Ravnborg1: 167a88b5ba8SSam Ravnborg rd %pc, %l0 168a88b5ba8SSam Ravnborg 169a88b5ba8SSam Ravnborg mov (1b - prom_peer_name), %l1 170a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 171a88b5ba8SSam Ravnborg mov 0, %l2 172a88b5ba8SSam Ravnborg 173a88b5ba8SSam Ravnborg /* prom_root_node = prom_peer(0) */ 174a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "peer" 175a88b5ba8SSam Ravnborg mov 1, %l3 176a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 1 177a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 178a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x18] ! arg1, 0 179a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x20] ! ret1 180a88b5ba8SSam Ravnborg call %l7 181a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 182a88b5ba8SSam Ravnborg 183a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x20], %l4 ! prom root node 184a88b5ba8SSam Ravnborg mov (1b - prom_root_node), %l1 185a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 186a88b5ba8SSam Ravnborg stw %l4, [%l1] 187a88b5ba8SSam Ravnborg 188a88b5ba8SSam Ravnborg mov (1b - prom_getprop_name), %l1 189a88b5ba8SSam Ravnborg mov (1b - prom_compatible_name), %l2 190a88b5ba8SSam Ravnborg mov (1b - prom_root_compatible), %l5 191a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 192a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 193a88b5ba8SSam Ravnborg sub %l0, %l5, %l5 194a88b5ba8SSam Ravnborg 195a88b5ba8SSam Ravnborg /* prom_getproperty(prom_root_node, "compatible", 196a88b5ba8SSam Ravnborg * &prom_root_compatible, 64) 197a88b5ba8SSam Ravnborg */ 198a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "getprop" 199a88b5ba8SSam Ravnborg mov 4, %l3 200a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 4 201a88b5ba8SSam Ravnborg mov 1, %l3 202a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 203a88b5ba8SSam Ravnborg stx %l4, [%sp + 2047 + 128 + 0x18] ! arg1, prom_root_node 204a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x20] ! arg2, "compatible" 205a88b5ba8SSam Ravnborg stx %l5, [%sp + 2047 + 128 + 0x28] ! arg3, &prom_root_compatible 206a88b5ba8SSam Ravnborg mov 64, %l3 207a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4, size 208a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x38] ! ret1 209a88b5ba8SSam Ravnborg call %l7 210a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 211a88b5ba8SSam Ravnborg 212a88b5ba8SSam Ravnborg mov (1b - prom_finddev_name), %l1 213a88b5ba8SSam Ravnborg mov (1b - prom_chosen_path), %l2 214a88b5ba8SSam Ravnborg mov (1b - prom_boot_mapped_pc), %l3 215a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 216a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 217a88b5ba8SSam Ravnborg sub %l0, %l3, %l3 218a88b5ba8SSam Ravnborg stw %l0, [%l3] 219a88b5ba8SSam Ravnborg sub %sp, (192 + 128), %sp 220a88b5ba8SSam Ravnborg 221a88b5ba8SSam Ravnborg /* chosen_node = prom_finddevice("/chosen") */ 222a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "finddevice" 223a88b5ba8SSam Ravnborg mov 1, %l3 224a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 1 225a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 226a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x18] ! arg1, "/chosen" 227a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x20] ! ret1 228a88b5ba8SSam Ravnborg call %l7 229a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 230a88b5ba8SSam Ravnborg 231a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x20], %l4 ! chosen device node 232a88b5ba8SSam Ravnborg 233a88b5ba8SSam Ravnborg mov (1b - prom_getprop_name), %l1 234a88b5ba8SSam Ravnborg mov (1b - prom_mmu_name), %l2 235a88b5ba8SSam Ravnborg mov (1b - prom_mmu_ihandle_cache), %l5 236a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 237a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 238a88b5ba8SSam Ravnborg sub %l0, %l5, %l5 239a88b5ba8SSam Ravnborg 240a88b5ba8SSam Ravnborg /* prom_mmu_ihandle_cache = prom_getint(chosen_node, "mmu") */ 241a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "getprop" 242a88b5ba8SSam Ravnborg mov 4, %l3 243a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 4 244a88b5ba8SSam Ravnborg mov 1, %l3 245a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 246a88b5ba8SSam Ravnborg stx %l4, [%sp + 2047 + 128 + 0x18] ! arg1, chosen_node 247a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x20] ! arg2, "mmu" 248a88b5ba8SSam Ravnborg stx %l5, [%sp + 2047 + 128 + 0x28] ! arg3, &prom_mmu_ihandle_cache 249a88b5ba8SSam Ravnborg mov 4, %l3 250a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4, sizeof(arg3) 251a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x38] ! ret1 252a88b5ba8SSam Ravnborg call %l7 253a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 254a88b5ba8SSam Ravnborg 255a88b5ba8SSam Ravnborg mov (1b - prom_callmethod_name), %l1 256a88b5ba8SSam Ravnborg mov (1b - prom_translate_name), %l2 257a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 258a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 259a88b5ba8SSam Ravnborg lduw [%l5], %l5 ! prom_mmu_ihandle_cache 260a88b5ba8SSam Ravnborg 261a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "call-method" 262a88b5ba8SSam Ravnborg mov 3, %l3 263a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 3 264a88b5ba8SSam Ravnborg mov 5, %l3 265a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 5 266a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x18] ! arg1: "translate" 267a88b5ba8SSam Ravnborg stx %l5, [%sp + 2047 + 128 + 0x20] ! arg2: prom_mmu_ihandle_cache 268a88b5ba8SSam Ravnborg /* PAGE align */ 269a88b5ba8SSam Ravnborg srlx %l0, 13, %l3 270a88b5ba8SSam Ravnborg sllx %l3, 13, %l3 271a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x28] ! arg3: vaddr, our PC 272a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x30] ! res1 273a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x38] ! res2 274a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x40] ! res3 275a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x48] ! res4 276a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x50] ! res5 277a88b5ba8SSam Ravnborg call %l7 278a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 279a88b5ba8SSam Ravnborg 280a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x40], %l1 ! translation mode 281a88b5ba8SSam Ravnborg mov (1b - prom_boot_mapping_mode), %l4 282a88b5ba8SSam Ravnborg sub %l0, %l4, %l4 283a88b5ba8SSam Ravnborg stw %l1, [%l4] 284a88b5ba8SSam Ravnborg mov (1b - prom_boot_mapping_phys_high), %l4 285a88b5ba8SSam Ravnborg sub %l0, %l4, %l4 286a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x48], %l2 ! physaddr high 287a88b5ba8SSam Ravnborg stx %l2, [%l4 + 0x0] 288a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x50], %l3 ! physaddr low 289a88b5ba8SSam Ravnborg /* 4MB align */ 2900eef331aSDavid S. Miller srlx %l3, ILOG2_4MB, %l3 2910eef331aSDavid S. Miller sllx %l3, ILOG2_4MB, %l3 292a88b5ba8SSam Ravnborg stx %l3, [%l4 + 0x8] 293a88b5ba8SSam Ravnborg 294a88b5ba8SSam Ravnborg /* Leave service as-is, "call-method" */ 295a88b5ba8SSam Ravnborg mov 7, %l3 296a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 7 297a88b5ba8SSam Ravnborg mov 1, %l3 298a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 299a88b5ba8SSam Ravnborg mov (1b - prom_map_name), %l3 300a88b5ba8SSam Ravnborg sub %l0, %l3, %l3 301a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x18] ! arg1: "map" 302a88b5ba8SSam Ravnborg /* Leave arg2 as-is, prom_mmu_ihandle_cache */ 303a88b5ba8SSam Ravnborg mov -1, %l3 304a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x28] ! arg3: mode (-1 default) 305a88b5ba8SSam Ravnborg /* 4MB align the kernel image size. */ 306a88b5ba8SSam Ravnborg set (_end - KERNBASE), %l3 307a88b5ba8SSam Ravnborg set ((4 * 1024 * 1024) - 1), %l4 308a88b5ba8SSam Ravnborg add %l3, %l4, %l3 309a88b5ba8SSam Ravnborg andn %l3, %l4, %l3 310a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4: roundup(ksize, 4MB) 311a88b5ba8SSam Ravnborg sethi %hi(KERNBASE), %l3 312a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x38] ! arg5: vaddr (KERNBASE) 313a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x40] ! arg6: empty 314a88b5ba8SSam Ravnborg mov (1b - prom_boot_mapping_phys_low), %l3 315a88b5ba8SSam Ravnborg sub %l0, %l3, %l3 316a88b5ba8SSam Ravnborg ldx [%l3], %l3 317a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x48] ! arg7: phys addr 318a88b5ba8SSam Ravnborg call %l7 319a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 320a88b5ba8SSam Ravnborg 321a88b5ba8SSam Ravnborg add %sp, (192 + 128), %sp 322a88b5ba8SSam Ravnborg 323a88b5ba8SSam Ravnborg sethi %hi(prom_root_compatible), %g1 324a88b5ba8SSam Ravnborg or %g1, %lo(prom_root_compatible), %g1 325a88b5ba8SSam Ravnborg sethi %hi(prom_sun4v_name), %g7 326a88b5ba8SSam Ravnborg or %g7, %lo(prom_sun4v_name), %g7 327a88b5ba8SSam Ravnborg mov 5, %g3 328a88b5ba8SSam Ravnborg90: ldub [%g7], %g2 329a88b5ba8SSam Ravnborg ldub [%g1], %g4 330a88b5ba8SSam Ravnborg cmp %g2, %g4 331a88b5ba8SSam Ravnborg bne,pn %icc, 80f 332a88b5ba8SSam Ravnborg add %g7, 1, %g7 333a88b5ba8SSam Ravnborg subcc %g3, 1, %g3 334a88b5ba8SSam Ravnborg bne,pt %xcc, 90b 335a88b5ba8SSam Ravnborg add %g1, 1, %g1 336a88b5ba8SSam Ravnborg 337a88b5ba8SSam Ravnborg sethi %hi(is_sun4v), %g1 338a88b5ba8SSam Ravnborg or %g1, %lo(is_sun4v), %g1 339a88b5ba8SSam Ravnborg mov 1, %g7 340a88b5ba8SSam Ravnborg stw %g7, [%g1] 341a88b5ba8SSam Ravnborg 342a88b5ba8SSam Ravnborg /* cpu_node = prom_finddevice("/cpu") */ 343a88b5ba8SSam Ravnborg mov (1b - prom_finddev_name), %l1 344a88b5ba8SSam Ravnborg mov (1b - prom_cpu_path), %l2 345a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 346a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 347a88b5ba8SSam Ravnborg sub %sp, (192 + 128), %sp 348a88b5ba8SSam Ravnborg 349a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "finddevice" 350a88b5ba8SSam Ravnborg mov 1, %l3 351a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 1 352a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 353a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x18] ! arg1, "/cpu" 354a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x20] ! ret1 355a88b5ba8SSam Ravnborg call %l7 356a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 357a88b5ba8SSam Ravnborg 358a88b5ba8SSam Ravnborg ldx [%sp + 2047 + 128 + 0x20], %l4 ! cpu device node 359a88b5ba8SSam Ravnborg 360a88b5ba8SSam Ravnborg mov (1b - prom_getprop_name), %l1 361a88b5ba8SSam Ravnborg mov (1b - prom_compatible_name), %l2 362a88b5ba8SSam Ravnborg mov (1b - prom_cpu_compatible), %l5 363a88b5ba8SSam Ravnborg sub %l0, %l1, %l1 364a88b5ba8SSam Ravnborg sub %l0, %l2, %l2 365a88b5ba8SSam Ravnborg sub %l0, %l5, %l5 366a88b5ba8SSam Ravnborg 367a88b5ba8SSam Ravnborg /* prom_getproperty(cpu_node, "compatible", 368a88b5ba8SSam Ravnborg * &prom_cpu_compatible, 64) 369a88b5ba8SSam Ravnborg */ 370a88b5ba8SSam Ravnborg stx %l1, [%sp + 2047 + 128 + 0x00] ! service, "getprop" 371a88b5ba8SSam Ravnborg mov 4, %l3 372a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x08] ! num_args, 4 373a88b5ba8SSam Ravnborg mov 1, %l3 374a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x10] ! num_rets, 1 375a88b5ba8SSam Ravnborg stx %l4, [%sp + 2047 + 128 + 0x18] ! arg1, cpu_node 376a88b5ba8SSam Ravnborg stx %l2, [%sp + 2047 + 128 + 0x20] ! arg2, "compatible" 377a88b5ba8SSam Ravnborg stx %l5, [%sp + 2047 + 128 + 0x28] ! arg3, &prom_cpu_compatible 378a88b5ba8SSam Ravnborg mov 64, %l3 379a88b5ba8SSam Ravnborg stx %l3, [%sp + 2047 + 128 + 0x30] ! arg4, size 380a88b5ba8SSam Ravnborg stx %g0, [%sp + 2047 + 128 + 0x38] ! ret1 381a88b5ba8SSam Ravnborg call %l7 382a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 ! argument array 383a88b5ba8SSam Ravnborg 384a88b5ba8SSam Ravnborg add %sp, (192 + 128), %sp 385a88b5ba8SSam Ravnborg 386a88b5ba8SSam Ravnborg sethi %hi(prom_cpu_compatible), %g1 387a88b5ba8SSam Ravnborg or %g1, %lo(prom_cpu_compatible), %g1 388a88b5ba8SSam Ravnborg sethi %hi(prom_niagara_prefix), %g7 389a88b5ba8SSam Ravnborg or %g7, %lo(prom_niagara_prefix), %g7 390a88b5ba8SSam Ravnborg mov 17, %g3 391a88b5ba8SSam Ravnborg90: ldub [%g7], %g2 392a88b5ba8SSam Ravnborg ldub [%g1], %g4 393a88b5ba8SSam Ravnborg cmp %g2, %g4 3944ba991d3SDavid S. Miller bne,pn %icc, 89f 3954ba991d3SDavid S. Miller add %g7, 1, %g7 3964ba991d3SDavid S. Miller subcc %g3, 1, %g3 3974ba991d3SDavid S. Miller bne,pt %xcc, 90b 3984ba991d3SDavid S. Miller add %g1, 1, %g1 3994ba991d3SDavid S. Miller ba,pt %xcc, 91f 4004ba991d3SDavid S. Miller nop 4014ba991d3SDavid S. Miller 4024ba991d3SDavid S. Miller89: sethi %hi(prom_cpu_compatible), %g1 4034ba991d3SDavid S. Miller or %g1, %lo(prom_cpu_compatible), %g1 4044ba991d3SDavid S. Miller sethi %hi(prom_sparc_prefix), %g7 4054ba991d3SDavid S. Miller or %g7, %lo(prom_sparc_prefix), %g7 40608cefa9fSDavid S. Miller mov 6, %g3 4074ba991d3SDavid S. Miller90: ldub [%g7], %g2 4084ba991d3SDavid S. Miller ldub [%g1], %g4 4094ba991d3SDavid S. Miller cmp %g2, %g4 410a88b5ba8SSam Ravnborg bne,pn %icc, 4f 411a88b5ba8SSam Ravnborg add %g7, 1, %g7 412a88b5ba8SSam Ravnborg subcc %g3, 1, %g3 413a88b5ba8SSam Ravnborg bne,pt %xcc, 90b 414a88b5ba8SSam Ravnborg add %g1, 1, %g1 415a88b5ba8SSam Ravnborg 416a88b5ba8SSam Ravnborg sethi %hi(prom_cpu_compatible), %g1 417a88b5ba8SSam Ravnborg or %g1, %lo(prom_cpu_compatible), %g1 41808cefa9fSDavid S. Miller ldub [%g1 + 6], %g2 41908cefa9fSDavid S. Miller cmp %g2, 'T' 42008cefa9fSDavid S. Miller be,pt %xcc, 70f 42108cefa9fSDavid S. Miller cmp %g2, 'M' 422c5b8b5beSKhalid Aziz be,pt %xcc, 70f 423c5b8b5beSKhalid Aziz cmp %g2, 'S' 42476950e6eSAllen Pais bne,pn %xcc, 49f 42508cefa9fSDavid S. Miller nop 42608cefa9fSDavid S. Miller 42708cefa9fSDavid S. Miller70: ldub [%g1 + 7], %g2 4289e48cd4aSAllen Pais cmp %g2, CPU_ID_NIAGARA3 4294ba991d3SDavid S. Miller be,pt %xcc, 5f 4304ba991d3SDavid S. Miller mov SUN4V_CHIP_NIAGARA3, %g4 4319e48cd4aSAllen Pais cmp %g2, CPU_ID_NIAGARA4 43208cefa9fSDavid S. Miller be,pt %xcc, 5f 43308cefa9fSDavid S. Miller mov SUN4V_CHIP_NIAGARA4, %g4 4349e48cd4aSAllen Pais cmp %g2, CPU_ID_NIAGARA5 43508cefa9fSDavid S. Miller be,pt %xcc, 5f 43608cefa9fSDavid S. Miller mov SUN4V_CHIP_NIAGARA5, %g4 4379e48cd4aSAllen Pais cmp %g2, CPU_ID_M6 438cadbb580SAllen Pais be,pt %xcc, 5f 439cadbb580SAllen Pais mov SUN4V_CHIP_SPARC_M6, %g4 4409e48cd4aSAllen Pais cmp %g2, CPU_ID_M7 441cadbb580SAllen Pais be,pt %xcc, 5f 442cadbb580SAllen Pais mov SUN4V_CHIP_SPARC_M7, %g4 4437d484acbSAllen Pais cmp %g2, CPU_ID_M8 4447d484acbSAllen Pais be,pt %xcc, 5f 4457d484acbSAllen Pais mov SUN4V_CHIP_SPARC_M8, %g4 4469e48cd4aSAllen Pais cmp %g2, CPU_ID_SONOMA1 447c5b8b5beSKhalid Aziz be,pt %xcc, 5f 448c5b8b5beSKhalid Aziz mov SUN4V_CHIP_SPARC_SN, %g4 44976950e6eSAllen Pais ba,pt %xcc, 49f 4504ba991d3SDavid S. Miller nop 4514ba991d3SDavid S. Miller 4524ba991d3SDavid S. Miller91: sethi %hi(prom_cpu_compatible), %g1 4534ba991d3SDavid S. Miller or %g1, %lo(prom_cpu_compatible), %g1 454a88b5ba8SSam Ravnborg ldub [%g1 + 17], %g2 4559e48cd4aSAllen Pais cmp %g2, CPU_ID_NIAGARA1 456a88b5ba8SSam Ravnborg be,pt %xcc, 5f 457a88b5ba8SSam Ravnborg mov SUN4V_CHIP_NIAGARA1, %g4 4589e48cd4aSAllen Pais cmp %g2, CPU_ID_NIAGARA2 459a88b5ba8SSam Ravnborg be,pt %xcc, 5f 460a88b5ba8SSam Ravnborg mov SUN4V_CHIP_NIAGARA2, %g4 4614ba991d3SDavid S. Miller 462a88b5ba8SSam Ravnborg4: 46376950e6eSAllen Pais /* Athena */ 46476950e6eSAllen Pais sethi %hi(prom_cpu_compatible), %g1 46576950e6eSAllen Pais or %g1, %lo(prom_cpu_compatible), %g1 46676950e6eSAllen Pais sethi %hi(prom_sparc64x_prefix), %g7 46776950e6eSAllen Pais or %g7, %lo(prom_sparc64x_prefix), %g7 46876950e6eSAllen Pais mov 9, %g3 46976950e6eSAllen Pais41: ldub [%g7], %g2 47076950e6eSAllen Pais ldub [%g1], %g4 47176950e6eSAllen Pais cmp %g2, %g4 47276950e6eSAllen Pais bne,pn %icc, 49f 47376950e6eSAllen Pais add %g7, 1, %g7 47476950e6eSAllen Pais subcc %g3, 1, %g3 47576950e6eSAllen Pais bne,pt %xcc, 41b 47676950e6eSAllen Pais add %g1, 1, %g1 47776950e6eSAllen Pais ba,pt %xcc, 5f 47849fa5230SDavid S. Miller mov SUN4V_CHIP_SPARC64X, %g4 47976950e6eSAllen Pais 48076950e6eSAllen Pais49: 481a88b5ba8SSam Ravnborg mov SUN4V_CHIP_UNKNOWN, %g4 482a88b5ba8SSam Ravnborg5: sethi %hi(sun4v_chip_type), %g2 483a88b5ba8SSam Ravnborg or %g2, %lo(sun4v_chip_type), %g2 484a88b5ba8SSam Ravnborg stw %g4, [%g2] 485a88b5ba8SSam Ravnborg 486a88b5ba8SSam Ravnborg80: 487a88b5ba8SSam Ravnborg BRANCH_IF_SUN4V(g1, jump_to_sun4u_init) 488a88b5ba8SSam Ravnborg BRANCH_IF_CHEETAH_BASE(g1,g7,cheetah_boot) 489a88b5ba8SSam Ravnborg BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,cheetah_plus_boot) 490a88b5ba8SSam Ravnborg ba,pt %xcc, spitfire_boot 491a88b5ba8SSam Ravnborg nop 492a88b5ba8SSam Ravnborg 493a88b5ba8SSam Ravnborgcheetah_plus_boot: 494a88b5ba8SSam Ravnborg /* Preserve OBP chosen DCU and DCR register settings. */ 495a88b5ba8SSam Ravnborg ba,pt %xcc, cheetah_generic_boot 496a88b5ba8SSam Ravnborg nop 497a88b5ba8SSam Ravnborg 498a88b5ba8SSam Ravnborgcheetah_boot: 499a88b5ba8SSam Ravnborg mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1 500a88b5ba8SSam Ravnborg wr %g1, %asr18 501a88b5ba8SSam Ravnborg 502a88b5ba8SSam Ravnborg sethi %uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g7 503a88b5ba8SSam Ravnborg or %g7, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g7 504a88b5ba8SSam Ravnborg sllx %g7, 32, %g7 505a88b5ba8SSam Ravnborg or %g7, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g7 506a88b5ba8SSam Ravnborg stxa %g7, [%g0] ASI_DCU_CONTROL_REG 507a88b5ba8SSam Ravnborg membar #Sync 508a88b5ba8SSam Ravnborg 509a88b5ba8SSam Ravnborgcheetah_generic_boot: 510a88b5ba8SSam Ravnborg mov TSB_EXTENSION_P, %g3 511a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 512a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_IMMU 513a88b5ba8SSam Ravnborg membar #Sync 514a88b5ba8SSam Ravnborg 515a88b5ba8SSam Ravnborg mov TSB_EXTENSION_S, %g3 516a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 517a88b5ba8SSam Ravnborg membar #Sync 518a88b5ba8SSam Ravnborg 519a88b5ba8SSam Ravnborg mov TSB_EXTENSION_N, %g3 520a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 521a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_IMMU 522a88b5ba8SSam Ravnborg membar #Sync 523a88b5ba8SSam Ravnborg 524a88b5ba8SSam Ravnborg ba,a,pt %xcc, jump_to_sun4u_init 525a88b5ba8SSam Ravnborg 526a88b5ba8SSam Ravnborgspitfire_boot: 527a88b5ba8SSam Ravnborg /* Typically PROM has already enabled both MMU's and both on-chip 528a88b5ba8SSam Ravnborg * caches, but we do it here anyway just to be paranoid. 529a88b5ba8SSam Ravnborg */ 530a88b5ba8SSam Ravnborg mov (LSU_CONTROL_IC|LSU_CONTROL_DC|LSU_CONTROL_IM|LSU_CONTROL_DM), %g1 531a88b5ba8SSam Ravnborg stxa %g1, [%g0] ASI_LSU_CONTROL 532a88b5ba8SSam Ravnborg membar #Sync 533a88b5ba8SSam Ravnborg 534a88b5ba8SSam Ravnborgjump_to_sun4u_init: 535a88b5ba8SSam Ravnborg /* 536a88b5ba8SSam Ravnborg * Make sure we are in privileged mode, have address masking, 537a88b5ba8SSam Ravnborg * using the ordinary globals and have enabled floating 538a88b5ba8SSam Ravnborg * point. 539a88b5ba8SSam Ravnborg * 540a88b5ba8SSam Ravnborg * Again, typically PROM has left %pil at 13 or similar, and 541a88b5ba8SSam Ravnborg * (PSTATE_PRIV | PSTATE_PEF | PSTATE_IE) in %pstate. 542a88b5ba8SSam Ravnborg */ 543a88b5ba8SSam Ravnborg wrpr %g0, (PSTATE_PRIV|PSTATE_PEF|PSTATE_IE), %pstate 544a88b5ba8SSam Ravnborg wr %g0, 0, %fprs 545a88b5ba8SSam Ravnborg 546a88b5ba8SSam Ravnborg set sun4u_init, %g2 547a88b5ba8SSam Ravnborg jmpl %g2 + %g0, %g0 548a88b5ba8SSam Ravnborg nop 549a88b5ba8SSam Ravnborg 550a0871e8cSTim Abbott __REF 551a88b5ba8SSam Ravnborgsun4u_init: 552a88b5ba8SSam Ravnborg BRANCH_IF_SUN4V(g1, sun4v_init) 553a88b5ba8SSam Ravnborg 554a88b5ba8SSam Ravnborg /* Set ctx 0 */ 555a88b5ba8SSam Ravnborg mov PRIMARY_CONTEXT, %g7 556a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_DMMU 557a88b5ba8SSam Ravnborg membar #Sync 558a88b5ba8SSam Ravnborg 559a88b5ba8SSam Ravnborg mov SECONDARY_CONTEXT, %g7 560a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_DMMU 561a88b5ba8SSam Ravnborg membar #Sync 562a88b5ba8SSam Ravnborg 56349fa5230SDavid S. Miller ba,a,pt %xcc, sun4u_continue 564a88b5ba8SSam Ravnborg 565a88b5ba8SSam Ravnborgsun4v_init: 566a88b5ba8SSam Ravnborg /* Set ctx 0 */ 567a88b5ba8SSam Ravnborg mov PRIMARY_CONTEXT, %g7 568a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_MMU 569a88b5ba8SSam Ravnborg membar #Sync 570a88b5ba8SSam Ravnborg 571a88b5ba8SSam Ravnborg mov SECONDARY_CONTEXT, %g7 572a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_MMU 573a88b5ba8SSam Ravnborg membar #Sync 57449fa5230SDavid S. Miller ba,a,pt %xcc, niagara_tlb_fixup 575a88b5ba8SSam Ravnborg 576a88b5ba8SSam Ravnborgsun4u_continue: 577a88b5ba8SSam Ravnborg BRANCH_IF_ANY_CHEETAH(g1, g7, cheetah_tlb_fixup) 578a88b5ba8SSam Ravnborg 57949fa5230SDavid S. Miller ba,a,pt %xcc, spitfire_tlb_fixup 580a88b5ba8SSam Ravnborg 581a88b5ba8SSam Ravnborgniagara_tlb_fixup: 582a88b5ba8SSam Ravnborg mov 3, %g2 /* Set TLB type to hypervisor. */ 583a88b5ba8SSam Ravnborg sethi %hi(tlb_type), %g1 584a88b5ba8SSam Ravnborg stw %g2, [%g1 + %lo(tlb_type)] 585a88b5ba8SSam Ravnborg 586a88b5ba8SSam Ravnborg /* Patch copy/clear ops. */ 587a88b5ba8SSam Ravnborg sethi %hi(sun4v_chip_type), %g1 588a88b5ba8SSam Ravnborg lduw [%g1 + %lo(sun4v_chip_type)], %g1 589a88b5ba8SSam Ravnborg cmp %g1, SUN4V_CHIP_NIAGARA1 590a88b5ba8SSam Ravnborg be,pt %xcc, niagara_patch 591a88b5ba8SSam Ravnborg cmp %g1, SUN4V_CHIP_NIAGARA2 592a88b5ba8SSam Ravnborg be,pt %xcc, niagara2_patch 593a88b5ba8SSam Ravnborg nop 5944ba991d3SDavid S. Miller cmp %g1, SUN4V_CHIP_NIAGARA3 5954ba991d3SDavid S. Miller be,pt %xcc, niagara2_patch 5964ba991d3SDavid S. Miller nop 59708cefa9fSDavid S. Miller cmp %g1, SUN4V_CHIP_NIAGARA4 598ae2c6ca6SDavid S. Miller be,pt %xcc, niagara4_patch 59908cefa9fSDavid S. Miller nop 60008cefa9fSDavid S. Miller cmp %g1, SUN4V_CHIP_NIAGARA5 601ae2c6ca6SDavid S. Miller be,pt %xcc, niagara4_patch 60208cefa9fSDavid S. Miller nop 603cadbb580SAllen Pais cmp %g1, SUN4V_CHIP_SPARC_M6 604cadbb580SAllen Pais be,pt %xcc, niagara4_patch 605cadbb580SAllen Pais nop 606cadbb580SAllen Pais cmp %g1, SUN4V_CHIP_SPARC_M7 607b3a04ed5SBabu Moger be,pt %xcc, sparc_m7_patch 608cadbb580SAllen Pais nop 6097d484acbSAllen Pais cmp %g1, SUN4V_CHIP_SPARC_M8 610b3a04ed5SBabu Moger be,pt %xcc, sparc_m7_patch 6117d484acbSAllen Pais nop 612c5b8b5beSKhalid Aziz cmp %g1, SUN4V_CHIP_SPARC_SN 613c5b8b5beSKhalid Aziz be,pt %xcc, niagara4_patch 614c5b8b5beSKhalid Aziz nop 615a88b5ba8SSam Ravnborg 616a88b5ba8SSam Ravnborg call generic_patch_copyops 617a88b5ba8SSam Ravnborg nop 618a88b5ba8SSam Ravnborg call generic_patch_bzero 619a88b5ba8SSam Ravnborg nop 620a88b5ba8SSam Ravnborg call generic_patch_pageops 621a88b5ba8SSam Ravnborg nop 622a88b5ba8SSam Ravnborg 623a88b5ba8SSam Ravnborg ba,a,pt %xcc, 80f 6240ae2d26fSBabu Moger nop 625b3a04ed5SBabu Moger 626b3a04ed5SBabu Mogersparc_m7_patch: 627b3a04ed5SBabu Moger call m7_patch_copyops 628b3a04ed5SBabu Moger nop 629b3a04ed5SBabu Moger call m7_patch_bzero 630b3a04ed5SBabu Moger nop 631b3a04ed5SBabu Moger call m7_patch_pageops 632b3a04ed5SBabu Moger nop 633b3a04ed5SBabu Moger 634b3a04ed5SBabu Moger ba,a,pt %xcc, 80f 635b3a04ed5SBabu Moger nop 636b3a04ed5SBabu Moger 637ae2c6ca6SDavid S. Millerniagara4_patch: 638ae2c6ca6SDavid S. Miller call niagara4_patch_copyops 639ae2c6ca6SDavid S. Miller nop 6409f825962SDavid S. Miller call niagara4_patch_bzero 641ae2c6ca6SDavid S. Miller nop 642ae2c6ca6SDavid S. Miller call niagara4_patch_pageops 643ae2c6ca6SDavid S. Miller nop 64446ad8d2dSVijay Kumar call niagara4_patch_fls 64546ad8d2dSVijay Kumar nop 646ae2c6ca6SDavid S. Miller 647ae2c6ca6SDavid S. Miller ba,a,pt %xcc, 80f 6480ae2d26fSBabu Moger nop 649ae2c6ca6SDavid S. Miller 650a88b5ba8SSam Ravnborgniagara2_patch: 651a88b5ba8SSam Ravnborg call niagara2_patch_copyops 652a88b5ba8SSam Ravnborg nop 653a88b5ba8SSam Ravnborg call niagara_patch_bzero 654a88b5ba8SSam Ravnborg nop 655e95ade08SDavid S. Miller call niagara_patch_pageops 656a88b5ba8SSam Ravnborg nop 657a88b5ba8SSam Ravnborg 658a88b5ba8SSam Ravnborg ba,a,pt %xcc, 80f 6590ae2d26fSBabu Moger nop 660a88b5ba8SSam Ravnborg 661a88b5ba8SSam Ravnborgniagara_patch: 662a88b5ba8SSam Ravnborg call niagara_patch_copyops 663a88b5ba8SSam Ravnborg nop 664a88b5ba8SSam Ravnborg call niagara_patch_bzero 665a88b5ba8SSam Ravnborg nop 666a88b5ba8SSam Ravnborg call niagara_patch_pageops 667a88b5ba8SSam Ravnborg nop 668a88b5ba8SSam Ravnborg 669a88b5ba8SSam Ravnborg80: 670a88b5ba8SSam Ravnborg /* Patch TLB/cache ops. */ 671a88b5ba8SSam Ravnborg call hypervisor_patch_cachetlbops 672a88b5ba8SSam Ravnborg nop 673a88b5ba8SSam Ravnborg 67449fa5230SDavid S. Miller ba,a,pt %xcc, tlb_fixup_done 675a88b5ba8SSam Ravnborg 676a88b5ba8SSam Ravnborgcheetah_tlb_fixup: 677a88b5ba8SSam Ravnborg mov 2, %g2 /* Set TLB type to cheetah+. */ 678a88b5ba8SSam Ravnborg BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,1f) 679a88b5ba8SSam Ravnborg 680a88b5ba8SSam Ravnborg mov 1, %g2 /* Set TLB type to cheetah. */ 681a88b5ba8SSam Ravnborg 682a88b5ba8SSam Ravnborg1: sethi %hi(tlb_type), %g1 683a88b5ba8SSam Ravnborg stw %g2, [%g1 + %lo(tlb_type)] 684a88b5ba8SSam Ravnborg 685a88b5ba8SSam Ravnborg /* Patch copy/page operations to cheetah optimized versions. */ 686a88b5ba8SSam Ravnborg call cheetah_patch_copyops 687a88b5ba8SSam Ravnborg nop 688a88b5ba8SSam Ravnborg call cheetah_patch_copy_page 689a88b5ba8SSam Ravnborg nop 690a88b5ba8SSam Ravnborg call cheetah_patch_cachetlbops 691a88b5ba8SSam Ravnborg nop 692a88b5ba8SSam Ravnborg 69349fa5230SDavid S. Miller ba,a,pt %xcc, tlb_fixup_done 694a88b5ba8SSam Ravnborg 695a88b5ba8SSam Ravnborgspitfire_tlb_fixup: 696a88b5ba8SSam Ravnborg /* Set TLB type to spitfire. */ 697a88b5ba8SSam Ravnborg mov 0, %g2 698a88b5ba8SSam Ravnborg sethi %hi(tlb_type), %g1 699a88b5ba8SSam Ravnborg stw %g2, [%g1 + %lo(tlb_type)] 700a88b5ba8SSam Ravnborg 701a88b5ba8SSam Ravnborgtlb_fixup_done: 702a88b5ba8SSam Ravnborg sethi %hi(init_thread_union), %g6 703a88b5ba8SSam Ravnborg or %g6, %lo(init_thread_union), %g6 704a88b5ba8SSam Ravnborg ldx [%g6 + TI_TASK], %g4 705a88b5ba8SSam Ravnborg 706a88b5ba8SSam Ravnborg wr %g0, ASI_P, %asi 707a88b5ba8SSam Ravnborg mov 1, %g1 708a88b5ba8SSam Ravnborg sllx %g1, THREAD_SHIFT, %g1 709d17b9ec7SAl Viro sub %g1, (STACKFRAME_SZ + STACK_BIAS + TRACEREG_SZ), %g1 710a88b5ba8SSam Ravnborg add %g6, %g1, %sp 711a88b5ba8SSam Ravnborg 712a88b5ba8SSam Ravnborg /* Set per-cpu pointer initially to zero, this makes 713a88b5ba8SSam Ravnborg * the boot-cpu use the in-kernel-image per-cpu areas 714a88b5ba8SSam Ravnborg * before setup_per_cpu_area() is invoked. 715a88b5ba8SSam Ravnborg */ 716a88b5ba8SSam Ravnborg clr %g5 717a88b5ba8SSam Ravnborg 718a88b5ba8SSam Ravnborg wrpr %g0, 0, %wstate 719a88b5ba8SSam Ravnborg wrpr %g0, 0x0, %tl 720a88b5ba8SSam Ravnborg 721a88b5ba8SSam Ravnborg /* Clear the bss */ 722a88b5ba8SSam Ravnborg sethi %hi(__bss_start), %o0 723a88b5ba8SSam Ravnborg or %o0, %lo(__bss_start), %o0 724a88b5ba8SSam Ravnborg sethi %hi(_end), %o1 725a88b5ba8SSam Ravnborg or %o1, %lo(_end), %o1 726a88b5ba8SSam Ravnborg call __bzero 727a88b5ba8SSam Ravnborg sub %o1, %o0, %o1 728a88b5ba8SSam Ravnborg 729a88b5ba8SSam Ravnborg call prom_init 730a88b5ba8SSam Ravnborg mov %l7, %o0 ! OpenPROM cif handler 731a88b5ba8SSam Ravnborg 732ef3e035cSDavid S. Miller /* To create a one-register-window buffer between the kernel's 733ef3e035cSDavid S. Miller * initial stack and the last stack frame we use from the firmware, 734ef3e035cSDavid S. Miller * do the rest of the boot from a C helper function. 735a88b5ba8SSam Ravnborg */ 736ef3e035cSDavid S. Miller call start_early_boot 737a88b5ba8SSam Ravnborg nop 738a88b5ba8SSam Ravnborg /* Not reached... */ 739a88b5ba8SSam Ravnborg 740a88b5ba8SSam Ravnborg .previous 741a88b5ba8SSam Ravnborg 742a88b5ba8SSam Ravnborg /* This is meant to allow the sharing of this code between 743a88b5ba8SSam Ravnborg * boot processor invocation (via setup_tba() below) and 744a88b5ba8SSam Ravnborg * secondary processor startup (via trampoline.S). The 745a88b5ba8SSam Ravnborg * former does use this code, the latter does not yet due 746a88b5ba8SSam Ravnborg * to some complexities. That should be fixed up at some 747a88b5ba8SSam Ravnborg * point. 748a88b5ba8SSam Ravnborg * 749a88b5ba8SSam Ravnborg * There used to be enormous complexity wrt. transferring 750877d0310SNick Andrew * over from the firmware's trap table to the Linux kernel's. 751a88b5ba8SSam Ravnborg * For example, there was a chicken & egg problem wrt. building 752a88b5ba8SSam Ravnborg * the OBP page tables, yet needing to be on the Linux kernel 753a88b5ba8SSam Ravnborg * trap table (to translate PAGE_OFFSET addresses) in order to 754a88b5ba8SSam Ravnborg * do that. 755a88b5ba8SSam Ravnborg * 756a88b5ba8SSam Ravnborg * We now handle OBP tlb misses differently, via linear lookups 757a88b5ba8SSam Ravnborg * into the prom_trans[] array. So that specific problem no 758a88b5ba8SSam Ravnborg * longer exists. Yet, unfortunately there are still some issues 759a88b5ba8SSam Ravnborg * preventing trampoline.S from using this code... ho hum. 760a88b5ba8SSam Ravnborg */ 761a88b5ba8SSam Ravnborg .globl setup_trap_table 762a88b5ba8SSam Ravnborgsetup_trap_table: 763a88b5ba8SSam Ravnborg save %sp, -192, %sp 764a88b5ba8SSam Ravnborg 765a88b5ba8SSam Ravnborg /* Force interrupts to be disabled. */ 766a88b5ba8SSam Ravnborg rdpr %pstate, %l0 767a88b5ba8SSam Ravnborg andn %l0, PSTATE_IE, %o1 768a88b5ba8SSam Ravnborg wrpr %o1, 0x0, %pstate 769a88b5ba8SSam Ravnborg rdpr %pil, %l1 770a88b5ba8SSam Ravnborg wrpr %g0, PIL_NORMAL_MAX, %pil 771a88b5ba8SSam Ravnborg 772a88b5ba8SSam Ravnborg /* Make the firmware call to jump over to the Linux trap table. */ 773a88b5ba8SSam Ravnborg sethi %hi(is_sun4v), %o0 774a88b5ba8SSam Ravnborg lduw [%o0 + %lo(is_sun4v)], %o0 775a88b5ba8SSam Ravnborg brz,pt %o0, 1f 776a88b5ba8SSam Ravnborg nop 777a88b5ba8SSam Ravnborg 778a88b5ba8SSam Ravnborg TRAP_LOAD_TRAP_BLOCK(%g2, %g3) 779a88b5ba8SSam Ravnborg add %g2, TRAP_PER_CPU_FAULT_INFO, %g2 780a88b5ba8SSam Ravnborg stxa %g2, [%g0] ASI_SCRATCHPAD 781a88b5ba8SSam Ravnborg 782a88b5ba8SSam Ravnborg /* Compute physical address: 783a88b5ba8SSam Ravnborg * 784a88b5ba8SSam Ravnborg * paddr = kern_base + (mmfsa_vaddr - KERNBASE) 785a88b5ba8SSam Ravnborg */ 786a88b5ba8SSam Ravnborg sethi %hi(KERNBASE), %g3 787a88b5ba8SSam Ravnborg sub %g2, %g3, %g2 788a88b5ba8SSam Ravnborg sethi %hi(kern_base), %g3 789a88b5ba8SSam Ravnborg ldx [%g3 + %lo(kern_base)], %g3 790a88b5ba8SSam Ravnborg add %g2, %g3, %o1 791a88b5ba8SSam Ravnborg sethi %hi(sparc64_ttable_tl0), %o0 792a88b5ba8SSam Ravnborg 793a88b5ba8SSam Ravnborg set prom_set_trap_table_name, %g2 794a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 795a88b5ba8SSam Ravnborg mov 2, %g2 796a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 797a88b5ba8SSam Ravnborg mov 0, %g2 798a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 799a88b5ba8SSam Ravnborg stx %o0, [%sp + 2047 + 128 + 0x18] 800a88b5ba8SSam Ravnborg stx %o1, [%sp + 2047 + 128 + 0x20] 801a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 802a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 803a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 804a88b5ba8SSam Ravnborg call %o1 805a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 806a88b5ba8SSam Ravnborg 80749fa5230SDavid S. Miller ba,a,pt %xcc, 2f 808a88b5ba8SSam Ravnborg 809a88b5ba8SSam Ravnborg1: sethi %hi(sparc64_ttable_tl0), %o0 810a88b5ba8SSam Ravnborg set prom_set_trap_table_name, %g2 811a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 812a88b5ba8SSam Ravnborg mov 1, %g2 813a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 814a88b5ba8SSam Ravnborg mov 0, %g2 815a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 816a88b5ba8SSam Ravnborg stx %o0, [%sp + 2047 + 128 + 0x18] 817a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 818a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 819a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 820a88b5ba8SSam Ravnborg call %o1 821a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 822a88b5ba8SSam Ravnborg 823a88b5ba8SSam Ravnborg /* Start using proper page size encodings in ctx register. */ 824a88b5ba8SSam Ravnborg2: sethi %hi(sparc64_kern_pri_context), %g3 825a88b5ba8SSam Ravnborg ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2 826a88b5ba8SSam Ravnborg 827a88b5ba8SSam Ravnborg mov PRIMARY_CONTEXT, %g1 828a88b5ba8SSam Ravnborg 829a88b5ba8SSam Ravnborg661: stxa %g2, [%g1] ASI_DMMU 830a88b5ba8SSam Ravnborg .section .sun4v_1insn_patch, "ax" 831a88b5ba8SSam Ravnborg .word 661b 832a88b5ba8SSam Ravnborg stxa %g2, [%g1] ASI_MMU 833a88b5ba8SSam Ravnborg .previous 834a88b5ba8SSam Ravnborg 835a88b5ba8SSam Ravnborg membar #Sync 836a88b5ba8SSam Ravnborg 837a88b5ba8SSam Ravnborg BRANCH_IF_SUN4V(o2, 1f) 838a88b5ba8SSam Ravnborg 839a88b5ba8SSam Ravnborg /* Kill PROM timer */ 840a88b5ba8SSam Ravnborg sethi %hi(0x80000000), %o2 841a88b5ba8SSam Ravnborg sllx %o2, 32, %o2 842a88b5ba8SSam Ravnborg wr %o2, 0, %tick_cmpr 843a88b5ba8SSam Ravnborg 844a88b5ba8SSam Ravnborg BRANCH_IF_ANY_CHEETAH(o2, o3, 1f) 845a88b5ba8SSam Ravnborg 84649fa5230SDavid S. Miller ba,a,pt %xcc, 2f 847a88b5ba8SSam Ravnborg 848a88b5ba8SSam Ravnborg /* Disable STICK_INT interrupts. */ 849a88b5ba8SSam Ravnborg1: 850a88b5ba8SSam Ravnborg sethi %hi(0x80000000), %o2 851a88b5ba8SSam Ravnborg sllx %o2, 32, %o2 852a88b5ba8SSam Ravnborg wr %o2, %asr25 853a88b5ba8SSam Ravnborg 854a88b5ba8SSam Ravnborg2: 855a88b5ba8SSam Ravnborg wrpr %g0, %g0, %wstate 856a88b5ba8SSam Ravnborg 857a88b5ba8SSam Ravnborg call init_irqwork_curcpu 858a88b5ba8SSam Ravnborg nop 859a88b5ba8SSam Ravnborg 860a88b5ba8SSam Ravnborg /* Now we can restore interrupt state. */ 861a88b5ba8SSam Ravnborg wrpr %l0, 0, %pstate 862a88b5ba8SSam Ravnborg wrpr %l1, 0x0, %pil 863a88b5ba8SSam Ravnborg 864a88b5ba8SSam Ravnborg ret 865a88b5ba8SSam Ravnborg restore 866a88b5ba8SSam Ravnborg 867a88b5ba8SSam Ravnborg .globl setup_tba 868a88b5ba8SSam Ravnborgsetup_tba: 869a88b5ba8SSam Ravnborg save %sp, -192, %sp 870a88b5ba8SSam Ravnborg 871a88b5ba8SSam Ravnborg /* The boot processor is the only cpu which invokes this 872a88b5ba8SSam Ravnborg * routine, the other cpus set things up via trampoline.S. 873a88b5ba8SSam Ravnborg * So save the OBP trap table address here. 874a88b5ba8SSam Ravnborg */ 875a88b5ba8SSam Ravnborg rdpr %tba, %g7 876a88b5ba8SSam Ravnborg sethi %hi(prom_tba), %o1 877a88b5ba8SSam Ravnborg or %o1, %lo(prom_tba), %o1 878a88b5ba8SSam Ravnborg stx %g7, [%o1] 879a88b5ba8SSam Ravnborg 880a88b5ba8SSam Ravnborg call setup_trap_table 881a88b5ba8SSam Ravnborg nop 882a88b5ba8SSam Ravnborg 883a88b5ba8SSam Ravnborg ret 884a88b5ba8SSam Ravnborg restore 885a88b5ba8SSam Ravnborgsparc64_boot_end: 886a88b5ba8SSam Ravnborg 887a88b5ba8SSam Ravnborg#include "etrap_64.S" 888a88b5ba8SSam Ravnborg#include "rtrap_64.S" 889a88b5ba8SSam Ravnborg#include "winfixup.S" 890a88b5ba8SSam Ravnborg#include "fpu_traps.S" 891a88b5ba8SSam Ravnborg#include "ivec.S" 892a88b5ba8SSam Ravnborg#include "getsetcc.S" 893a88b5ba8SSam Ravnborg#include "utrap.S" 894a88b5ba8SSam Ravnborg#include "spiterrs.S" 895a88b5ba8SSam Ravnborg#include "cherrs.S" 896a88b5ba8SSam Ravnborg#include "misctrap.S" 897a88b5ba8SSam Ravnborg#include "syscalls.S" 898a88b5ba8SSam Ravnborg#include "helpers.S" 899a88b5ba8SSam Ravnborg#include "sun4v_tlb_miss.S" 90075037500SKhalid Aziz#include "sun4v_mcd.S" 901a88b5ba8SSam Ravnborg#include "sun4v_ivec.S" 902a88b5ba8SSam Ravnborg#include "ktlb.S" 903a88b5ba8SSam Ravnborg#include "tsb.S" 904a88b5ba8SSam Ravnborg 905a88b5ba8SSam Ravnborg/* 906a88b5ba8SSam Ravnborg * The following skip makes sure the trap table in ttable.S is aligned 907a88b5ba8SSam Ravnborg * on a 32K boundary as required by the v9 specs for TBA register. 908a88b5ba8SSam Ravnborg * 909a88b5ba8SSam Ravnborg * We align to a 32K boundary, then we have the 32K kernel TSB, 910a88b5ba8SSam Ravnborg * the 64K kernel 4MB TSB, and then the 32K aligned trap table. 911a88b5ba8SSam Ravnborg */ 912a88b5ba8SSam Ravnborg1: 913a88b5ba8SSam Ravnborg .skip 0x4000 + _start - 1b 914a88b5ba8SSam Ravnborg 915a88b5ba8SSam Ravnborg! 0x0000000000408000 916a88b5ba8SSam Ravnborg 917a88b5ba8SSam Ravnborg .globl swapper_tsb 918a88b5ba8SSam Ravnborgswapper_tsb: 919a88b5ba8SSam Ravnborg .skip (32 * 1024) 920a88b5ba8SSam Ravnborg 921a88b5ba8SSam Ravnborg .globl swapper_4m_tsb 922a88b5ba8SSam Ravnborgswapper_4m_tsb: 923a88b5ba8SSam Ravnborg .skip (64 * 1024) 924a88b5ba8SSam Ravnborg 925a88b5ba8SSam Ravnborg! 0x0000000000420000 926a88b5ba8SSam Ravnborg 927a88b5ba8SSam Ravnborg /* Some care needs to be exercised if you try to move the 928a88b5ba8SSam Ravnborg * location of the trap table relative to other things. For 929a88b5ba8SSam Ravnborg * one thing there are br* instructions in some of the 930a88b5ba8SSam Ravnborg * trap table entires which branch back to code in ktlb.S 931a88b5ba8SSam Ravnborg * Those instructions can only handle a signed 16-bit 932a88b5ba8SSam Ravnborg * displacement. 933a88b5ba8SSam Ravnborg * 934a88b5ba8SSam Ravnborg * There is a binutils bug (bugzilla #4558) which causes 935a88b5ba8SSam Ravnborg * the relocation overflow checks for such instructions to 936a88b5ba8SSam Ravnborg * not be done correctly. So bintuils will not notice the 937a88b5ba8SSam Ravnborg * error and will instead write junk into the relocation and 938a88b5ba8SSam Ravnborg * you'll have an unbootable kernel. 939a88b5ba8SSam Ravnborg */ 940b979542dSSam Ravnborg#include "ttable_64.S" 941a88b5ba8SSam Ravnborg 942a88b5ba8SSam Ravnborg! 0x0000000000428000 943a88b5ba8SSam Ravnborg 944df7b2155SNitin Gupta#include "hvcalls.S" 945a88b5ba8SSam Ravnborg#include "systbls_64.S" 946a88b5ba8SSam Ravnborg 947a88b5ba8SSam Ravnborg .data 948a88b5ba8SSam Ravnborg .align 8 949a88b5ba8SSam Ravnborg .globl prom_tba, tlb_type 950a88b5ba8SSam Ravnborgprom_tba: .xword 0 951a88b5ba8SSam Ravnborgtlb_type: .word 0 /* Must NOT end up in BSS */ 952d3867f04SAl ViroEXPORT_SYMBOL(tlb_type) 953a88b5ba8SSam Ravnborg .section ".fixup",#alloc,#execinstr 954a88b5ba8SSam Ravnborg 95540bdac7dSDavid S. MillerENTRY(__retl_efault) 956a88b5ba8SSam Ravnborg retl 957a88b5ba8SSam Ravnborg mov -EFAULT, %o0 95840bdac7dSDavid S. MillerENDPROC(__retl_efault) 95940bdac7dSDavid S. Miller 96040bdac7dSDavid S. MillerENTRY(__retl_o1) 96140bdac7dSDavid S. Miller retl 96240bdac7dSDavid S. Miller mov %o1, %o0 96340bdac7dSDavid S. MillerENDPROC(__retl_o1) 9643c7f6221SDave Aldridge 9653c7f6221SDave AldridgeENTRY(__retl_o1_asi) 9663c7f6221SDave Aldridge wr %o5, 0x0, %asi 9673c7f6221SDave Aldridge retl 9683c7f6221SDave Aldridge mov %o1, %o0 9693c7f6221SDave AldridgeENDPROC(__retl_o1_asi) 970