18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci#ifndef __ASM_POWERPC_FEATURE_FIXUPS_H 38c2ecf20Sopenharmony_ci#define __ASM_POWERPC_FEATURE_FIXUPS_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <asm/asm-const.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci/* 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * Feature section common macros 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * Note that the entries now contain offsets between the table entry 148c2ecf20Sopenharmony_ci * and the code rather than absolute code pointers in order to be 158c2ecf20Sopenharmony_ci * useable with the vdso shared library. There is also an assumption 168c2ecf20Sopenharmony_ci * that values will be negative, that is, the fixup table has to be 178c2ecf20Sopenharmony_ci * located after the code it fixes up. 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_ci#if defined(CONFIG_PPC64) && !defined(__powerpc64__) 208c2ecf20Sopenharmony_ci/* 64 bits kernel, 32 bits code (ie. vdso32) */ 218c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG .8byte 228c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET .long 0xffffffff; .long 238c2ecf20Sopenharmony_ci#elif defined(CONFIG_PPC64) 248c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG .8byte 258c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET .8byte 268c2ecf20Sopenharmony_ci#else 278c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG .long 288c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET .long 298c2ecf20Sopenharmony_ci#endif 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#define START_FTR_SECTION(label) label##1: 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#define FTR_SECTION_ELSE_NESTED(label) \ 348c2ecf20Sopenharmony_cilabel##2: \ 358c2ecf20Sopenharmony_ci .pushsection __ftr_alt_##label,"a"; \ 368c2ecf20Sopenharmony_ci .align 2; \ 378c2ecf20Sopenharmony_cilabel##3: 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ 408c2ecf20Sopenharmony_cilabel##4: \ 418c2ecf20Sopenharmony_ci .popsection; \ 428c2ecf20Sopenharmony_ci .pushsection sect,"a"; \ 438c2ecf20Sopenharmony_ci .align 3; \ 448c2ecf20Sopenharmony_cilabel##5: \ 458c2ecf20Sopenharmony_ci FTR_ENTRY_LONG msk; \ 468c2ecf20Sopenharmony_ci FTR_ENTRY_LONG val; \ 478c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET label##1b-label##5b; \ 488c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET label##2b-label##5b; \ 498c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET label##3b-label##5b; \ 508c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET label##4b-label##5b; \ 518c2ecf20Sopenharmony_ci .ifgt (label##4b- label##3b)-(label##2b- label##1b); \ 528c2ecf20Sopenharmony_ci .error "Feature section else case larger than body"; \ 538c2ecf20Sopenharmony_ci .endif; \ 548c2ecf20Sopenharmony_ci .popsection; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci/* CPU feature dependent sections */ 588c2ecf20Sopenharmony_ci#define BEGIN_FTR_SECTION_NESTED(label) START_FTR_SECTION(label) 598c2ecf20Sopenharmony_ci#define BEGIN_FTR_SECTION START_FTR_SECTION(97) 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#define END_FTR_SECTION_NESTED(msk, val, label) \ 628c2ecf20Sopenharmony_ci FTR_SECTION_ELSE_NESTED(label) \ 638c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci#define END_FTR_SECTION(msk, val) \ 668c2ecf20Sopenharmony_ci END_FTR_SECTION_NESTED(msk, val, 97) 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#define END_FTR_SECTION_NESTED_IFSET(msk, label) \ 698c2ecf20Sopenharmony_ci END_FTR_SECTION_NESTED((msk), (msk), label) 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci#define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) 728c2ecf20Sopenharmony_ci#define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* CPU feature sections with alternatives, use BEGIN_FTR_SECTION to start */ 758c2ecf20Sopenharmony_ci#define FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97) 768c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED(msk, val, label) \ 778c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup) 788c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED_IFSET(msk, label) \ 798c2ecf20Sopenharmony_ci ALT_FTR_SECTION_END_NESTED(msk, msk, label) 808c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED_IFCLR(msk, label) \ 818c2ecf20Sopenharmony_ci ALT_FTR_SECTION_END_NESTED(msk, 0, label) 828c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END(msk, val) \ 838c2ecf20Sopenharmony_ci ALT_FTR_SECTION_END_NESTED(msk, val, 97) 848c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_IFSET(msk) \ 858c2ecf20Sopenharmony_ci ALT_FTR_SECTION_END_NESTED_IFSET(msk, 97) 868c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_IFCLR(msk) \ 878c2ecf20Sopenharmony_ci ALT_FTR_SECTION_END_NESTED_IFCLR(msk, 97) 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/* MMU feature dependent sections */ 908c2ecf20Sopenharmony_ci#define BEGIN_MMU_FTR_SECTION_NESTED(label) START_FTR_SECTION(label) 918c2ecf20Sopenharmony_ci#define BEGIN_MMU_FTR_SECTION START_FTR_SECTION(97) 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_NESTED(msk, val, label) \ 948c2ecf20Sopenharmony_ci FTR_SECTION_ELSE_NESTED(label) \ 958c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup) 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION(msk, val) \ 988c2ecf20Sopenharmony_ci END_MMU_FTR_SECTION_NESTED(msk, val, 97) 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_NESTED_IFSET(msk, label) \ 1018c2ecf20Sopenharmony_ci END_MMU_FTR_SECTION_NESTED((msk), (msk), label) 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_IFSET(msk) END_MMU_FTR_SECTION((msk), (msk)) 1048c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_IFCLR(msk) END_MMU_FTR_SECTION((msk), 0) 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci/* MMU feature sections with alternatives, use BEGIN_FTR_SECTION to start */ 1078c2ecf20Sopenharmony_ci#define MMU_FTR_SECTION_ELSE_NESTED(label) FTR_SECTION_ELSE_NESTED(label) 1088c2ecf20Sopenharmony_ci#define MMU_FTR_SECTION_ELSE MMU_FTR_SECTION_ELSE_NESTED(97) 1098c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED(msk, val, label) \ 1108c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup) 1118c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, label) \ 1128c2ecf20Sopenharmony_ci ALT_MMU_FTR_SECTION_END_NESTED(msk, msk, label) 1138c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, label) \ 1148c2ecf20Sopenharmony_ci ALT_MMU_FTR_SECTION_END_NESTED(msk, 0, label) 1158c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END(msk, val) \ 1168c2ecf20Sopenharmony_ci ALT_MMU_FTR_SECTION_END_NESTED(msk, val, 97) 1178c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_IFSET(msk) \ 1188c2ecf20Sopenharmony_ci ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, 97) 1198c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_IFCLR(msk) \ 1208c2ecf20Sopenharmony_ci ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, 97) 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci/* Firmware feature dependent sections */ 1238c2ecf20Sopenharmony_ci#define BEGIN_FW_FTR_SECTION_NESTED(label) START_FTR_SECTION(label) 1248c2ecf20Sopenharmony_ci#define BEGIN_FW_FTR_SECTION START_FTR_SECTION(97) 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_NESTED(msk, val, label) \ 1278c2ecf20Sopenharmony_ci FTR_SECTION_ELSE_NESTED(label) \ 1288c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup) 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION(msk, val) \ 1318c2ecf20Sopenharmony_ci END_FW_FTR_SECTION_NESTED(msk, val, 97) 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) 1348c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci/* Firmware feature sections with alternatives */ 1378c2ecf20Sopenharmony_ci#define FW_FTR_SECTION_ELSE_NESTED(label) FTR_SECTION_ELSE_NESTED(label) 1388c2ecf20Sopenharmony_ci#define FW_FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97) 1398c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED(msk, val, label) \ 1408c2ecf20Sopenharmony_ci MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup) 1418c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, label) \ 1428c2ecf20Sopenharmony_ci ALT_FW_FTR_SECTION_END_NESTED(msk, msk, label) 1438c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, label) \ 1448c2ecf20Sopenharmony_ci ALT_FW_FTR_SECTION_END_NESTED(msk, 0, label) 1458c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END(msk, val) \ 1468c2ecf20Sopenharmony_ci ALT_FW_FTR_SECTION_END_NESTED(msk, val, 97) 1478c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_IFSET(msk) \ 1488c2ecf20Sopenharmony_ci ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, 97) 1498c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_IFCLR(msk) \ 1508c2ecf20Sopenharmony_ci ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, 97) 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci#define ASM_FTR_IF(section_if, section_else, msk, val) \ 1558c2ecf20Sopenharmony_ci stringify_in_c(BEGIN_FTR_SECTION) \ 1568c2ecf20Sopenharmony_ci section_if "; " \ 1578c2ecf20Sopenharmony_ci stringify_in_c(FTR_SECTION_ELSE) \ 1588c2ecf20Sopenharmony_ci section_else "; " \ 1598c2ecf20Sopenharmony_ci stringify_in_c(ALT_FTR_SECTION_END((msk), (val))) 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci#define ASM_FTR_IFSET(section_if, section_else, msk) \ 1628c2ecf20Sopenharmony_ci ASM_FTR_IF(section_if, section_else, (msk), (msk)) 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci#define ASM_FTR_IFCLR(section_if, section_else, msk) \ 1658c2ecf20Sopenharmony_ci ASM_FTR_IF(section_if, section_else, (msk), 0) 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IF(section_if, section_else, msk, val) \ 1688c2ecf20Sopenharmony_ci stringify_in_c(BEGIN_MMU_FTR_SECTION) \ 1698c2ecf20Sopenharmony_ci section_if "; " \ 1708c2ecf20Sopenharmony_ci stringify_in_c(MMU_FTR_SECTION_ELSE) \ 1718c2ecf20Sopenharmony_ci section_else "; " \ 1728c2ecf20Sopenharmony_ci stringify_in_c(ALT_MMU_FTR_SECTION_END((msk), (val))) 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IFSET(section_if, section_else, msk) \ 1758c2ecf20Sopenharmony_ci ASM_MMU_FTR_IF(section_if, section_else, (msk), (msk)) 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IFCLR(section_if, section_else, msk) \ 1788c2ecf20Sopenharmony_ci ASM_MMU_FTR_IF(section_if, section_else, (msk), 0) 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */ 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/* LWSYNC feature sections */ 1838c2ecf20Sopenharmony_ci#define START_LWSYNC_SECTION(label) label##1: 1848c2ecf20Sopenharmony_ci#define MAKE_LWSYNC_SECTION_ENTRY(label, sect) \ 1858c2ecf20Sopenharmony_cilabel##2: \ 1868c2ecf20Sopenharmony_ci .pushsection sect,"a"; \ 1878c2ecf20Sopenharmony_ci .align 2; \ 1888c2ecf20Sopenharmony_cilabel##3: \ 1898c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET label##1b-label##3b; \ 1908c2ecf20Sopenharmony_ci .popsection; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci#define STF_ENTRY_BARRIER_FIXUP_SECTION \ 1938c2ecf20Sopenharmony_ci953: \ 1948c2ecf20Sopenharmony_ci .pushsection __stf_entry_barrier_fixup,"a"; \ 1958c2ecf20Sopenharmony_ci .align 2; \ 1968c2ecf20Sopenharmony_ci954: \ 1978c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 953b-954b; \ 1988c2ecf20Sopenharmony_ci .popsection; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci#define STF_EXIT_BARRIER_FIXUP_SECTION \ 2018c2ecf20Sopenharmony_ci955: \ 2028c2ecf20Sopenharmony_ci .pushsection __stf_exit_barrier_fixup,"a"; \ 2038c2ecf20Sopenharmony_ci .align 2; \ 2048c2ecf20Sopenharmony_ci956: \ 2058c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 955b-956b; \ 2068c2ecf20Sopenharmony_ci .popsection; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci#define UACCESS_FLUSH_FIXUP_SECTION \ 2098c2ecf20Sopenharmony_ci959: \ 2108c2ecf20Sopenharmony_ci .pushsection __uaccess_flush_fixup,"a"; \ 2118c2ecf20Sopenharmony_ci .align 2; \ 2128c2ecf20Sopenharmony_ci960: \ 2138c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 959b-960b; \ 2148c2ecf20Sopenharmony_ci .popsection; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci#define ENTRY_FLUSH_FIXUP_SECTION \ 2178c2ecf20Sopenharmony_ci957: \ 2188c2ecf20Sopenharmony_ci .pushsection __entry_flush_fixup,"a"; \ 2198c2ecf20Sopenharmony_ci .align 2; \ 2208c2ecf20Sopenharmony_ci958: \ 2218c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 957b-958b; \ 2228c2ecf20Sopenharmony_ci .popsection; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci#define SCV_ENTRY_FLUSH_FIXUP_SECTION \ 2258c2ecf20Sopenharmony_ci957: \ 2268c2ecf20Sopenharmony_ci .pushsection __scv_entry_flush_fixup,"a"; \ 2278c2ecf20Sopenharmony_ci .align 2; \ 2288c2ecf20Sopenharmony_ci958: \ 2298c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 957b-958b; \ 2308c2ecf20Sopenharmony_ci .popsection; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci#define RFI_FLUSH_FIXUP_SECTION \ 2338c2ecf20Sopenharmony_ci951: \ 2348c2ecf20Sopenharmony_ci .pushsection __rfi_flush_fixup,"a"; \ 2358c2ecf20Sopenharmony_ci .align 2; \ 2368c2ecf20Sopenharmony_ci952: \ 2378c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 951b-952b; \ 2388c2ecf20Sopenharmony_ci .popsection; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci#define NOSPEC_BARRIER_FIXUP_SECTION \ 2418c2ecf20Sopenharmony_ci953: \ 2428c2ecf20Sopenharmony_ci .pushsection __barrier_nospec_fixup,"a"; \ 2438c2ecf20Sopenharmony_ci .align 2; \ 2448c2ecf20Sopenharmony_ci954: \ 2458c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 953b-954b; \ 2468c2ecf20Sopenharmony_ci .popsection; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci#define START_BTB_FLUSH_SECTION \ 2498c2ecf20Sopenharmony_ci955: \ 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci#define END_BTB_FLUSH_SECTION \ 2528c2ecf20Sopenharmony_ci956: \ 2538c2ecf20Sopenharmony_ci .pushsection __btb_flush_fixup,"a"; \ 2548c2ecf20Sopenharmony_ci .align 2; \ 2558c2ecf20Sopenharmony_ci957: \ 2568c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 955b-957b; \ 2578c2ecf20Sopenharmony_ci FTR_ENTRY_OFFSET 956b-957b; \ 2588c2ecf20Sopenharmony_ci .popsection; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 2618c2ecf20Sopenharmony_ci#include <linux/types.h> 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ciextern long stf_barrier_fallback; 2648c2ecf20Sopenharmony_ciextern long entry_flush_fallback; 2658c2ecf20Sopenharmony_ciextern long scv_entry_flush_fallback; 2668c2ecf20Sopenharmony_ciextern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup; 2678c2ecf20Sopenharmony_ciextern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; 2688c2ecf20Sopenharmony_ciextern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup; 2698c2ecf20Sopenharmony_ciextern long __start___entry_flush_fixup, __stop___entry_flush_fixup; 2708c2ecf20Sopenharmony_ciextern long __start___scv_entry_flush_fixup, __stop___scv_entry_flush_fixup; 2718c2ecf20Sopenharmony_ciextern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; 2728c2ecf20Sopenharmony_ciextern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; 2738c2ecf20Sopenharmony_ciextern long __start__btb_flush_fixup, __stop__btb_flush_fixup; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_civoid apply_feature_fixups(void); 2768c2ecf20Sopenharmony_civoid setup_feature_keys(void); 2778c2ecf20Sopenharmony_ci#endif 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci#endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */ 280