1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * "Indirect" DCR access
4 *
5 * Copyright (c) 2004 Eugene Surovegin <ebs@ebshome.net>
6 */
7
8#include <linux/export.h>
9#include <asm/ppc_asm.h>
10#include <asm/processor.h>
11#include <asm/bug.h>
12
13#define DCR_ACCESS_PROLOG(table) \
14 cmplwi cr0,r3,1024; \
15 rlwinm r3,r3,4,18,27; \
16 lis r5,table@h; \
17 ori r5,r5,table@l; \
18 add r3,r3,r5; \
19 bge- 1f; \
20 mtctr r3; \
21 bctr; \
221: trap; \
23 EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0; \
24 blr
25
26_GLOBAL(__mfdcr)
27 DCR_ACCESS_PROLOG(__mfdcr_table)
28EXPORT_SYMBOL(__mfdcr)
29
30_GLOBAL(__mtdcr)
31 DCR_ACCESS_PROLOG(__mtdcr_table)
32EXPORT_SYMBOL(__mtdcr)
33
34__mfdcr_table:
35 mfdcr r3,0; blr
36__mtdcr_table:
37 mtdcr 0,r4; blr
38
39dcr = 1
40 .rept 1023
41 mfdcr r3,dcr; blr
42 mtdcr dcr,r4; blr
43 dcr = dcr + 1
44 .endr
45

source code of linux/arch/powerpc/sysdev/dcr-low.S