D–20 PALcode Restrictions and Guidelines
21264/EV68A Hardware Reference Manual
Restriction 40: Scrubbing a Single-Bit Error
hw_mtpr r31, EV6__DTB_IA ; (7,1L) flush dtb
lda r20, ^x3301(r31) ; set WE, RE
bis r31, r31, r31
bis r31, r31, r31
hw_mtpr r31, <EV6__MM_STAT ! ^x80> ; wait for retire
srl r4, #13, r6 ; shift byte offset
sll r6, #EV6__DTB_PTE0__PFN__S, r6 ; shift into position
bis r6, r20, r6 ; produce pte
hw_mtpr r4, EV6__DTB_TAG0 ; (2&6,0L) write tag0
hw_mtpr r4, EV6__DTB_TAG1 ; (1&5,1L) write tag1
hw_mtpr r6, EV6__DTB_PTE0 ; (0&4,0L) write pte0
hw_mtpr r6, EV6__DTB_PTE1 ; (3&7,1L) write pte1
mb ; quiet before we start
bis r31, r31, r31
bis r31, r31, r31
bis r31, r31, r31
ldq r6, ^x00(r4) ; re-read the bad block QW #0
ldq r6, ^x08(r4) ; re-read the bad block QW #1
ldq r6, ^x10(r4) ; re-read the bad block QW #2
ldq r6, ^x18(r4) ; re-read the bad block QW #3
ldq r6, ^x20(r4) ; re-read the bad block QW #4
ldq r6, ^x28(r4) ; re-read the bad block QW #5
ldq r6, ^x30(r4) ; re-read the bad block QW #6
mb ; no other mem-ops till done
ldq_l r6, ^x38(r4) ; re-read the bad block QW #7
stq_c r6, ^x38(r4) ; now store it to force scrub
mb
and r6, r31, r6 ; consumer of above
beq r6, sys__crd_scrub_done ; these 2 lines......
br r31, .-4 ; .....stop pre-fetching
sys__crd_scrub_done:
bsr r7, sys__cbox ; clean the cbox error chain
bis r31, r31, r31
hw_mtpr r31, EV6__DTB_IA ; (7,1L) flush dtb
bis r31, r31, r31
bis r31, r31, r31
bis r31, r31, r31
hw_mtpr r31, <EV6__MM_STAT ! ^x80> ; wait for retire
bis r31, #1, r7 ; get a 1
sll r7, #EV6__HW_INT_CLR__CR__S, r7 ; shift into position
hw_mtpr r7, EV6__HW_INT_CLR ; (4,0L) clear crd
lda r7, EV6__DC_STAT_W1C_CRD(r31) ; W1C bits
hw_mtpr r7, EV6__DC_STAT ; (6,0L)
bis r31, r31 ,r31
bis r31, r31 ,r31
hw_mtpr r31, <EV6__MM_STAT ! ^x50> ; stall till they retire