Path: blob/master/arch/ia64/sn/kernel/sn2/ptc_deadlock.S
17531 views
/*1* This file is subject to the terms and conditions of the GNU General Public2* License. See the file "COPYING" in the main directory of this archive3* for more details.4*5* Copyright (C) 2000-2005 Silicon Graphics, Inc. All rights reserved.6*/78#include <asm/types.h>9#include <asm/sn/shub_mmr.h>1011#define DEADLOCKBIT SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_SHFT12#define WRITECOUNTMASK SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK13#define ALIAS_OFFSET 8141516.global sn2_ptc_deadlock_recovery_core17.proc sn2_ptc_deadlock_recovery_core1819sn2_ptc_deadlock_recovery_core:20.regstk 6,0,0,02122ptc0 = in023data0 = in124ptc1 = in225data1 = in326piowc = in427zeroval = in528piowcphy = r3029psrsave = r230scr1 = r1631scr2 = r1732mask = r18333435extr.u piowcphy=piowc,0,61;; // Convert piowc to uncached physical address36dep piowcphy=-1,piowcphy,63,137movl mask=WRITECOUNTMASK38mov r8=r039401:41cmp.ne p8,p9=r0,ptc1 // Test for shub type (ptc1 non-null on shub1)42// p8 = 1 if shub1, p9 = 1 if shub24344add scr2=ALIAS_OFFSET,piowc // Address of WRITE_STATUS alias register45mov scr1=7;; // Clear DEADLOCK, WRITE_ERROR, MULTI_WRITE_ERROR46(p8) st8.rel [scr2]=scr1;;47(p9) ld8.acq scr1=[scr2];;48495: ld8.acq scr1=[piowc];; // Wait for PIOs to complete.50hint @pause51and scr2=scr1,mask;; // mask of writecount bits52cmp.ne p6,p0=zeroval,scr253(p6) br.cond.sptk 5b54555657////////////// BEGIN PHYSICAL MODE ////////////////////58mov psrsave=psr // Disable IC (no PMIs)59rsm psr.i | psr.dt | psr.ic;;60srlz.i;;6162st8.rel [ptc0]=data0 // Write PTC0 & wait for completion.63645: ld8.acq scr1=[piowcphy];; // Wait for PIOs to complete.65hint @pause66and scr2=scr1,mask;; // mask of writecount bits67cmp.ne p6,p0=zeroval,scr268(p6) br.cond.sptk 5b;;6970tbit.nz p8,p7=scr1,DEADLOCKBIT;;// Test for DEADLOCK71(p7) cmp.ne p7,p0=r0,ptc1;; // Test for non-null ptc17273(p7) st8.rel [ptc1]=data1;; // Now write PTC1.74755: ld8.acq scr1=[piowcphy];; // Wait for PIOs to complete.76hint @pause77and scr2=scr1,mask;; // mask of writecount bits78cmp.ne p6,p0=zeroval,scr279(p6) br.cond.sptk 5b8081tbit.nz p8,p0=scr1,DEADLOCKBIT;;// Test for DEADLOCK8283mov psr.l=psrsave;; // Reenable IC84srlz.i;;85////////////// END PHYSICAL MODE ////////////////////8687(p8) add r8=1,r888(p8) br.cond.spnt 1b;; // Repeat if DEADLOCK occurred.8990br.ret.sptk rp91.endp sn2_ptc_deadlock_recovery_core929394