1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2bdde6b3cSTkhai Kirill/* 3bdde6b3cSTkhai Kirill * hibernate_asm.S: Hibernaton support specific for sparc64. 4bdde6b3cSTkhai Kirill * 5bdde6b3cSTkhai Kirill * Copyright (C) 2013 Kirill V Tkhai (tkhai@yandex.ru) 6bdde6b3cSTkhai Kirill */ 7bdde6b3cSTkhai Kirill 8bdde6b3cSTkhai Kirill#include <linux/linkage.h> 9bdde6b3cSTkhai Kirill 10bdde6b3cSTkhai Kirill#include <asm/asm-offsets.h> 11bdde6b3cSTkhai Kirill#include <asm/cpudata.h> 12bdde6b3cSTkhai Kirill#include <asm/page.h> 13bdde6b3cSTkhai Kirill 14bdde6b3cSTkhai KirillENTRY(swsusp_arch_suspend) 15bdde6b3cSTkhai Kirill save %sp, -128, %sp 16bdde6b3cSTkhai Kirill save %sp, -128, %sp 17bdde6b3cSTkhai Kirill flushw 18bdde6b3cSTkhai Kirill 19bdde6b3cSTkhai Kirill setuw saved_context, %g3 20bdde6b3cSTkhai Kirill 21bdde6b3cSTkhai Kirill /* Save window regs */ 22bdde6b3cSTkhai Kirill rdpr %cwp, %g2 23bdde6b3cSTkhai Kirill stx %g2, [%g3 + SC_REG_CWP] 24bdde6b3cSTkhai Kirill rdpr %wstate, %g2 25bdde6b3cSTkhai Kirill stx %g2, [%g3 + SC_REG_WSTATE] 26bdde6b3cSTkhai Kirill stx %fp, [%g3 + SC_REG_FP] 27bdde6b3cSTkhai Kirill 28bdde6b3cSTkhai Kirill /* Save state regs */ 29bdde6b3cSTkhai Kirill rdpr %tick, %g2 30bdde6b3cSTkhai Kirill stx %g2, [%g3 + SC_REG_TICK] 31bdde6b3cSTkhai Kirill rdpr %pstate, %g2 32bdde6b3cSTkhai Kirill stx %g2, [%g3 + SC_REG_PSTATE] 33bdde6b3cSTkhai Kirill 34bdde6b3cSTkhai Kirill /* Save global regs */ 35bdde6b3cSTkhai Kirill stx %g4, [%g3 + SC_REG_G4] 36bdde6b3cSTkhai Kirill stx %g5, [%g3 + SC_REG_G5] 37bdde6b3cSTkhai Kirill stx %g6, [%g3 + SC_REG_G6] 38bdde6b3cSTkhai Kirill 39bdde6b3cSTkhai Kirill call swsusp_save 40bdde6b3cSTkhai Kirill nop 41bdde6b3cSTkhai Kirill 42bdde6b3cSTkhai Kirill mov %o0, %i0 43bdde6b3cSTkhai Kirill restore 44bdde6b3cSTkhai Kirill 45bdde6b3cSTkhai Kirill mov %o0, %i0 46bdde6b3cSTkhai Kirill ret 47bdde6b3cSTkhai Kirill restore 48bdde6b3cSTkhai Kirill 49bdde6b3cSTkhai KirillENTRY(swsusp_arch_resume) 50bdde6b3cSTkhai Kirill /* Write restore_pblist to %l0 */ 51bdde6b3cSTkhai Kirill sethi %hi(restore_pblist), %l0 52bdde6b3cSTkhai Kirill ldx [%l0 + %lo(restore_pblist)], %l0 53bdde6b3cSTkhai Kirill 54bdde6b3cSTkhai Kirill call __flush_tlb_all 55bdde6b3cSTkhai Kirill nop 56bdde6b3cSTkhai Kirill 57bdde6b3cSTkhai Kirill /* Write PAGE_OFFSET to %g7 */ 589d0713edSDavid S. Miller sethi %hi(PAGE_OFFSET), %g7 599d0713edSDavid S. Miller ldx [%g7 + %lo(PAGE_OFFSET)], %g7 60bdde6b3cSTkhai Kirill 61bdde6b3cSTkhai Kirill setuw (PAGE_SIZE-8), %g3 62bdde6b3cSTkhai Kirill 63bdde6b3cSTkhai Kirill /* Use MMU Bypass */ 64bdde6b3cSTkhai Kirill rd %asi, %g1 65bdde6b3cSTkhai Kirill wr %g0, ASI_PHYS_USE_EC, %asi 66bdde6b3cSTkhai Kirill 67bdde6b3cSTkhai Kirill ba fill_itlb 68bdde6b3cSTkhai Kirill nop 69bdde6b3cSTkhai Kirill 70bdde6b3cSTkhai Kirillpbe_loop: 71bdde6b3cSTkhai Kirill cmp %l0, %g0 72bdde6b3cSTkhai Kirill be restore_ctx 73bdde6b3cSTkhai Kirill sub %l0, %g7, %l0 74bdde6b3cSTkhai Kirill 75bdde6b3cSTkhai Kirill ldxa [%l0 ] %asi, %l1 /* address */ 76bdde6b3cSTkhai Kirill ldxa [%l0 + 8] %asi, %l2 /* orig_address */ 77bdde6b3cSTkhai Kirill 78bdde6b3cSTkhai Kirill /* phys addr */ 79bdde6b3cSTkhai Kirill sub %l1, %g7, %l1 80bdde6b3cSTkhai Kirill sub %l2, %g7, %l2 81bdde6b3cSTkhai Kirill 82bdde6b3cSTkhai Kirill mov %g3, %l3 /* PAGE_SIZE-8 */ 83bdde6b3cSTkhai Kirillcopy_loop: 84bdde6b3cSTkhai Kirill ldxa [%l1 + %l3] ASI_PHYS_USE_EC, %g2 85bdde6b3cSTkhai Kirill stxa %g2, [%l2 + %l3] ASI_PHYS_USE_EC 86bdde6b3cSTkhai Kirill cmp %l3, %g0 87bdde6b3cSTkhai Kirill bne copy_loop 88bdde6b3cSTkhai Kirill sub %l3, 8, %l3 89bdde6b3cSTkhai Kirill 90bdde6b3cSTkhai Kirill /* next pbe */ 91bdde6b3cSTkhai Kirill ba pbe_loop 92bdde6b3cSTkhai Kirill ldxa [%l0 + 16] %asi, %l0 93bdde6b3cSTkhai Kirill 94bdde6b3cSTkhai Kirillrestore_ctx: 95bdde6b3cSTkhai Kirill setuw saved_context, %g3 96bdde6b3cSTkhai Kirill 97bdde6b3cSTkhai Kirill /* Restore window regs */ 98bdde6b3cSTkhai Kirill wrpr %g0, 0, %canrestore 99bdde6b3cSTkhai Kirill wrpr %g0, 0, %otherwin 100bdde6b3cSTkhai Kirill wrpr %g0, 6, %cansave 101bdde6b3cSTkhai Kirill wrpr %g0, 0, %cleanwin 102bdde6b3cSTkhai Kirill 103bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_CWP] %asi, %g2 104bdde6b3cSTkhai Kirill wrpr %g2, %cwp 105bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_WSTATE] %asi, %g2 106bdde6b3cSTkhai Kirill wrpr %g2, %wstate 107bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_FP] %asi, %fp 108bdde6b3cSTkhai Kirill 109bdde6b3cSTkhai Kirill /* Restore state regs */ 110bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_PSTATE] %asi, %g2 111bdde6b3cSTkhai Kirill wrpr %g2, %pstate 112bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_TICK] %asi, %g2 113bdde6b3cSTkhai Kirill wrpr %g2, %tick 114bdde6b3cSTkhai Kirill 115bdde6b3cSTkhai Kirill /* Restore global regs */ 116bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_G4] %asi, %g4 117bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_G5] %asi, %g5 118bdde6b3cSTkhai Kirill ldxa [%g3 + SC_REG_G6] %asi, %g6 119bdde6b3cSTkhai Kirill 120bdde6b3cSTkhai Kirill wr %g1, %g0, %asi 121bdde6b3cSTkhai Kirill 122bdde6b3cSTkhai Kirill restore 123bdde6b3cSTkhai Kirill restore 124bdde6b3cSTkhai Kirill 125bdde6b3cSTkhai Kirill wrpr %g0, 14, %pil 126bdde6b3cSTkhai Kirill 127bdde6b3cSTkhai Kirill retl 128bdde6b3cSTkhai Kirill mov %g0, %o0 129bdde6b3cSTkhai Kirill 130bdde6b3cSTkhai Kirillfill_itlb: 131bdde6b3cSTkhai Kirill ba pbe_loop 132bdde6b3cSTkhai Kirill wrpr %g0, 15, %pil 133