18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * "Indirect" DCR access
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2004 Eugene Surovegin <ebs@ebshome.net>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h>
98c2ecf20Sopenharmony_ci#include <asm/processor.h>
108c2ecf20Sopenharmony_ci#include <asm/bug.h>
118c2ecf20Sopenharmony_ci#include <asm/export.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define DCR_ACCESS_PROLOG(table) \
148c2ecf20Sopenharmony_ci	cmplwi	cr0,r3,1024;	 \
158c2ecf20Sopenharmony_ci	rlwinm  r3,r3,4,18,27;   \
168c2ecf20Sopenharmony_ci	lis     r5,table@h;      \
178c2ecf20Sopenharmony_ci	ori     r5,r5,table@l;   \
188c2ecf20Sopenharmony_ci	add     r3,r3,r5;        \
198c2ecf20Sopenharmony_ci	bge-	1f;		 \
208c2ecf20Sopenharmony_ci	mtctr   r3;              \
218c2ecf20Sopenharmony_ci	bctr;			 \
228c2ecf20Sopenharmony_ci1:	trap;			 \
238c2ecf20Sopenharmony_ci	EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0;	\
248c2ecf20Sopenharmony_ci	blr
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci_GLOBAL(__mfdcr)
278c2ecf20Sopenharmony_ci	DCR_ACCESS_PROLOG(__mfdcr_table)
288c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__mfdcr)
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci_GLOBAL(__mtdcr)
318c2ecf20Sopenharmony_ci	DCR_ACCESS_PROLOG(__mtdcr_table)
328c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__mtdcr)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci__mfdcr_table:
358c2ecf20Sopenharmony_ci	mfdcr  r3,0; blr
368c2ecf20Sopenharmony_ci__mtdcr_table:
378c2ecf20Sopenharmony_ci	mtdcr  0,r4; blr
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cidcr     = 1
408c2ecf20Sopenharmony_ci        .rept   1023
418c2ecf20Sopenharmony_ci	mfdcr   r3,dcr; blr
428c2ecf20Sopenharmony_ci	mtdcr   dcr,r4; blr
438c2ecf20Sopenharmony_ci	dcr     = dcr + 1
448c2ecf20Sopenharmony_ci	.endr
45