162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * "Indirect" DCR access 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2004 Eugene Surovegin <ebs@ebshome.net> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/export.h> 962306a36Sopenharmony_ci#include <asm/ppc_asm.h> 1062306a36Sopenharmony_ci#include <asm/processor.h> 1162306a36Sopenharmony_ci#include <asm/bug.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define DCR_ACCESS_PROLOG(table) \ 1462306a36Sopenharmony_ci cmplwi cr0,r3,1024; \ 1562306a36Sopenharmony_ci rlwinm r3,r3,4,18,27; \ 1662306a36Sopenharmony_ci lis r5,table@h; \ 1762306a36Sopenharmony_ci ori r5,r5,table@l; \ 1862306a36Sopenharmony_ci add r3,r3,r5; \ 1962306a36Sopenharmony_ci bge- 1f; \ 2062306a36Sopenharmony_ci mtctr r3; \ 2162306a36Sopenharmony_ci bctr; \ 2262306a36Sopenharmony_ci1: trap; \ 2362306a36Sopenharmony_ci EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0; \ 2462306a36Sopenharmony_ci blr 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci_GLOBAL(__mfdcr) 2762306a36Sopenharmony_ci DCR_ACCESS_PROLOG(__mfdcr_table) 2862306a36Sopenharmony_ciEXPORT_SYMBOL(__mfdcr) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci_GLOBAL(__mtdcr) 3162306a36Sopenharmony_ci DCR_ACCESS_PROLOG(__mtdcr_table) 3262306a36Sopenharmony_ciEXPORT_SYMBOL(__mtdcr) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci__mfdcr_table: 3562306a36Sopenharmony_ci mfdcr r3,0; blr 3662306a36Sopenharmony_ci__mtdcr_table: 3762306a36Sopenharmony_ci mtdcr 0,r4; blr 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cidcr = 1 4062306a36Sopenharmony_ci .rept 1023 4162306a36Sopenharmony_ci mfdcr r3,dcr; blr 4262306a36Sopenharmony_ci mtdcr dcr,r4; blr 4362306a36Sopenharmony_ci dcr = dcr + 1 4462306a36Sopenharmony_ci .endr 45