powerpc updates for 6.9
- Add AT_HWCAP3 and AT_HWCAP4 aux vector entries for future use by glibc. - Add support for recognising the Power11 architected and raw PVRs. - Add support for nr_cpus=n on the command line where the boot CPU is >= n. - Add ppcxx_allmodconfig targets for all 32-bit sub-arches. - Other small features, cleanups and fixes. Thanks to: Akanksha J N, Brian King, Christophe Leroy, Dawei Li, Geoff Levand, Greg Kroah-Hartman, Jan-Benedict Glaw, Kajol Jain, Kunwu Chan, Li zeming, Madhavan Srinivasan, Masahiro Yamada, Nathan Chancellor, Nicholas Piggin, Peter Bergner, Qiheng Lin, Randy Dunlap, Ricardo B. Marliere, Rob Herring, Sathvika Vasireddy, Shrikanth Hegde, Uwe Kleine-König, Vaibhav Jain, Wen Xiong. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEJFGtCPCthwEv2Y/bUevqPMjhpYAFAmX01vgTHG1wZUBlbGxl cm1hbi5pZC5hdQAKCRBR6+o8yOGlgJ4bEACVsxXXjbjl+WKgWNjHsM7sVwUX/sSV z43iVycLPXDqochSkkgKjyIEFowaWhjgWVHFHmUXWxB5FjjFEEoH4FPo3VB0IY48 VoSFT6PhzqXDrGmt2fWsJ+k6zUyJZa8pNS38DHg1yuuYDAa0KWxd3E/x/r0qzsbr vcas1uWcDWgjoUDMBuJpyx0sYTl6+mR9HlZuM4+aNQdzhTFU/jK69hAN0RFvryes K2/fLgI0fgLZpQDogCn4HV1/4uixi1eEFlVNXkwvMYDpQVo2FqiBaWLF0hNLWNCk kvm/fYIJhdFoNlp38jVKv0KJnBhW7aAs3prF+8B3YL2B23rLnvA6ZLZKHcdBAeLb 8PJMRrbAbmVxOnVSAG0fgU+0dEdkJQ+0ABqa+usMOV7xIPg9uIui1YrKT1KVq6Fs KyGHM5EQuBC/P6bTsKO6X+1beY2QIfwWxaIkoo8pj6d0WU69qU4u+LzQiDO4XR0L UQQguB1Qo8yaip3rHXhuv0hlnMNVAVye56Zw63uq1MWGkewRKSkY91Ms02L+pXpF r6+96xoFB0ulKZFnyxyBdkj2iC0426fHtTiiJFfQ4R1fiibPKtAx9P59WYnqymVh QsSYqlgC2/jWzRgqJTweLp/XQK8fWqmFkNmCGDN1N9Sij9Xjx/8aZb5dvwJkSBnK rZ4ObxBoaCPbPA== =K9Ok -----END PGP SIGNATURE----- Merge tag 'powerpc-6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc updates from Michael Ellerman: - Add AT_HWCAP3 and AT_HWCAP4 aux vector entries for future use by glibc - Add support for recognising the Power11 architected and raw PVRs - Add support for nr_cpus=n on the command line where the boot CPU is >= n - Add ppcxx_allmodconfig targets for all 32-bit sub-arches - Other small features, cleanups and fixes Thanks to Akanksha J N, Brian King, Christophe Leroy, Dawei Li, Geoff Levand, Greg Kroah-Hartman, Jan-Benedict Glaw, Kajol Jain, Kunwu Chan, Li zeming, Madhavan Srinivasan, Masahiro Yamada, Nathan Chancellor, Nicholas Piggin, Peter Bergner, Qiheng Lin, Randy Dunlap, Ricardo B. Marliere, Rob Herring, Sathvika Vasireddy, Shrikanth Hegde, Uwe Kleine-König, Vaibhav Jain, and Wen Xiong. * tag 'powerpc-6.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (71 commits) powerpc/macio: Make remove callback of macio driver void returned powerpc/83xx: Fix build failure with FPU=n powerpc/64s: Fix get_hugepd_cache_index() build failure powerpc/4xx: Fix warp_gpio_leds build failure powerpc/amigaone: Make several functions static powerpc/embedded6xx: Fix no previous prototype for avr_uart_send() etc. macintosh/adb: make adb_dev_class constant powerpc: xor_vmx: Add '-mhard-float' to CFLAGS powerpc/fsl: Fix mfpmr() asm constraint error powerpc: Remove cpu-as-y completely powerpc/fsl: Modernise mt/mfpmr powerpc/fsl: Fix mfpmr build errors with newer binutils powerpc/64s: Use .machine power4 around dcbt powerpc/64s: Move dcbt/dcbtst sequence into a macro powerpc/mm: Code cleanup for __hash_page_thp powerpc/hv-gpci: Fix the H_GET_PERF_COUNTER_INFO hcall return value checks powerpc/irq: Allow softirq to hardirq stack transition powerpc: Stop using of_root powerpc/machdep: Define 'compatibles' property in ppc_md and use it of: Reimplement of_machine_is_compatible() using of_machine_compatible_match() ...
This commit is contained in:
commit
66a27abac3
|
@ -219,18 +219,6 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
|
|||
# often slow when they are implemented at all
|
||||
KBUILD_CFLAGS += $(call cc-option,-mno-string)
|
||||
|
||||
cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec)
|
||||
|
||||
# When using '-many -mpower4' gas will first try and find a matching power4
|
||||
# mnemonic and failing that it will allow any valid mnemonic that GAS knows
|
||||
# about. GCC will pass -many to GAS when assembling, clang does not.
|
||||
# LLVM IAS doesn't understand either flag: https://github.com/ClangBuiltLinux/linux/issues/675
|
||||
# but LLVM IAS only supports ISA >= 2.06 for Book3S 64 anyway...
|
||||
cpu-as-$(CONFIG_PPC_BOOK3S_64) += $(call as-option,-Wa$(comma)-mpower4) $(call as-option,-Wa$(comma)-many)
|
||||
|
||||
KBUILD_AFLAGS += $(cpu-as-y)
|
||||
KBUILD_CFLAGS += $(cpu-as-y)
|
||||
|
||||
KBUILD_AFLAGS += $(aflags-y)
|
||||
KBUILD_CFLAGS += $(cflags-y)
|
||||
|
||||
|
@ -314,6 +302,26 @@ ppc32_allmodconfig:
|
|||
$(Q)$(MAKE) KCONFIG_ALLCONFIG=$(srctree)/arch/powerpc/configs/book3s_32.config \
|
||||
-f $(srctree)/Makefile allmodconfig
|
||||
|
||||
generated_configs += ppc40x_allmodconfig
|
||||
ppc40x_allmodconfig:
|
||||
$(Q)$(MAKE) KCONFIG_ALLCONFIG=$(srctree)/arch/powerpc/configs/40x.config \
|
||||
-f $(srctree)/Makefile allmodconfig
|
||||
|
||||
generated_configs += ppc44x_allmodconfig
|
||||
ppc44x_allmodconfig:
|
||||
$(Q)$(MAKE) KCONFIG_ALLCONFIG=$(srctree)/arch/powerpc/configs/44x.config \
|
||||
-f $(srctree)/Makefile allmodconfig
|
||||
|
||||
generated_configs += ppc8xx_allmodconfig
|
||||
ppc8xx_allmodconfig:
|
||||
$(Q)$(MAKE) KCONFIG_ALLCONFIG=$(srctree)/arch/powerpc/configs/8xx.config \
|
||||
-f $(srctree)/Makefile allmodconfig
|
||||
|
||||
generated_configs += ppc85xx_allmodconfig
|
||||
ppc85xx_allmodconfig:
|
||||
$(Q)$(MAKE) KCONFIG_ALLCONFIG=$(srctree)/arch/powerpc/configs/85xx-32bit.config \
|
||||
-f $(srctree)/Makefile allmodconfig
|
||||
|
||||
generated_configs += ppc_defconfig
|
||||
ppc_defconfig:
|
||||
$(call merge_into_defconfig,book3s_32.config,)
|
||||
|
|
|
@ -112,8 +112,11 @@ static void *simple_realloc(void *ptr, unsigned long size)
|
|||
return ptr;
|
||||
|
||||
new = simple_malloc(size);
|
||||
memcpy(new, ptr, p->size);
|
||||
simple_free(ptr);
|
||||
if (new) {
|
||||
memcpy(new, ptr, p->size);
|
||||
simple_free(ptr);
|
||||
}
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
CONFIG_PPC64=n
|
||||
CONFIG_40x=y
|
|
@ -0,0 +1,2 @@
|
|||
CONFIG_PPC64=n
|
||||
CONFIG_44x=y
|
|
@ -1,3 +1,4 @@
|
|||
CONFIG_PPC64=n
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_PPC_85xx=y
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
CONFIG_PPC64=n
|
||||
CONFIG_PPC_8xx=y
|
|
@ -24,7 +24,6 @@ CONFIG_PS3_VRAM=m
|
|||
CONFIG_PS3_LPM=m
|
||||
# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_PPC64_BIG_ENDIAN_ELF_ABI_V2 is not set
|
||||
CONFIG_PPC_4K_PAGES=y
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PM=y
|
||||
|
|
|
@ -269,8 +269,6 @@ int hash__create_section_mapping(unsigned long start, unsigned long end,
|
|||
int nid, pgprot_t prot);
|
||||
int hash__remove_section_mapping(unsigned long start, unsigned long end);
|
||||
|
||||
void hash__kernel_map_pages(struct page *page, int numpages, int enable);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_BOOK3S_64_HASH_H */
|
||||
|
|
|
@ -45,9 +45,9 @@ static inline int hugepd_ok(hugepd_t hpd)
|
|||
/*
|
||||
* This should never get called
|
||||
*/
|
||||
static inline int get_hugepd_cache_index(int index)
|
||||
static __always_inline int get_hugepd_cache_index(int index)
|
||||
{
|
||||
BUG();
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_HUGETLB_PAGE */
|
||||
|
|
|
@ -1027,16 +1027,6 @@ static inline void vmemmap_remove_mapping(unsigned long start,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
|
||||
static inline void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
if (radix_enabled())
|
||||
radix__kernel_map_pages(page, numpages, enable);
|
||||
else
|
||||
hash__kernel_map_pages(page, numpages, enable);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline pte_t pmd_pte(pmd_t pmd)
|
||||
{
|
||||
return __pte_raw(pmd_raw(pmd));
|
||||
|
|
|
@ -362,8 +362,6 @@ int radix__create_section_mapping(unsigned long start, unsigned long end,
|
|||
int radix__remove_section_mapping(unsigned long start, unsigned long end);
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
void radix__kernel_map_pages(struct page *page, int numpages, int enable);
|
||||
|
||||
#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
|
||||
#define vmemmap_can_optimize vmemmap_can_optimize
|
||||
bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap);
|
||||
|
|
|
@ -454,6 +454,9 @@ static inline void cpu_feature_keys_init(void) { }
|
|||
CPU_FTR_ARCH_300 | CPU_FTR_ARCH_31 | \
|
||||
CPU_FTR_DAWR | CPU_FTR_DAWR1 | \
|
||||
CPU_FTR_DEXCR_NPHIE)
|
||||
|
||||
#define CPU_FTRS_POWER11 CPU_FTRS_POWER10
|
||||
|
||||
#define CPU_FTRS_CELL (CPU_FTR_LWSYNC | \
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
|
||||
CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
|
||||
|
@ -542,19 +545,20 @@ enum {
|
|||
#define CPU_FTRS_DT_CPU_BASE (~0ul)
|
||||
#endif
|
||||
|
||||
/* pseries may disable DBELL with ibm,pi-features */
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
#define CPU_FTRS_ALWAYS \
|
||||
(CPU_FTRS_POSSIBLE & ~CPU_FTR_HVMODE & CPU_FTRS_POWER7 & \
|
||||
CPU_FTRS_POWER8E & CPU_FTRS_POWER8 & CPU_FTRS_POWER9 & \
|
||||
CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
|
||||
(CPU_FTRS_POSSIBLE & ~CPU_FTR_HVMODE & ~CPU_FTR_DBELL & \
|
||||
CPU_FTRS_POWER7 & CPU_FTRS_POWER8E & CPU_FTRS_POWER8 & \
|
||||
CPU_FTRS_POWER9 & CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
|
||||
CPU_FTRS_POWER10 & CPU_FTRS_DT_CPU_BASE)
|
||||
#else
|
||||
#define CPU_FTRS_ALWAYS \
|
||||
(CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & \
|
||||
CPU_FTRS_POWER6 & CPU_FTRS_POWER7 & CPU_FTRS_CELL & \
|
||||
CPU_FTRS_PA6T & CPU_FTRS_POWER8 & CPU_FTRS_POWER8E & \
|
||||
~CPU_FTR_HVMODE & CPU_FTRS_POSSIBLE & CPU_FTRS_POWER9 & \
|
||||
CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
|
||||
~CPU_FTR_HVMODE & ~CPU_FTR_DBELL & CPU_FTRS_POSSIBLE & \
|
||||
CPU_FTRS_POWER9 & CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
|
||||
CPU_FTRS_POWER10 & CPU_FTRS_DT_CPU_BASE)
|
||||
#endif /* CONFIG_CPU_LITTLE_ENDIAN */
|
||||
#endif
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
|
||||
struct platform_driver;
|
||||
|
||||
extern struct bus_type ibmebus_bus_type;
|
||||
extern const struct bus_type ibmebus_bus_type;
|
||||
|
||||
int ibmebus_register_driver(struct platform_driver *drv);
|
||||
void ibmebus_unregister_driver(struct platform_driver *drv);
|
||||
|
|
|
@ -97,7 +97,7 @@ DECLARE_STATIC_KEY_FALSE(interrupt_exit_not_reentrant);
|
|||
|
||||
static inline bool is_implicit_soft_masked(struct pt_regs *regs)
|
||||
{
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
return false;
|
||||
|
||||
if (regs->nip >= (unsigned long)__end_soft_masked)
|
||||
|
|
|
@ -22,6 +22,7 @@ struct pci_host_bridge;
|
|||
struct machdep_calls {
|
||||
const char *name;
|
||||
const char *compatible;
|
||||
const char * const *compatibles;
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_PM
|
||||
void (*iommu_restore)(void);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
extern struct bus_type macio_bus_type;
|
||||
extern const struct bus_type macio_bus_type;
|
||||
|
||||
/* MacIO device driver is defined later */
|
||||
struct macio_driver;
|
||||
|
@ -126,7 +126,7 @@ static inline struct pci_dev *macio_get_pci_dev(struct macio_dev *mdev)
|
|||
struct macio_driver
|
||||
{
|
||||
int (*probe)(struct macio_dev* dev, const struct of_device_id *match);
|
||||
int (*remove)(struct macio_dev* dev);
|
||||
void (*remove)(struct macio_dev *dev);
|
||||
|
||||
int (*suspend)(struct macio_dev* dev, pm_message_t state);
|
||||
int (*resume)(struct macio_dev* dev);
|
||||
|
|
|
@ -133,6 +133,7 @@
|
|||
#define MMU_FTRS_POWER8 MMU_FTRS_POWER6
|
||||
#define MMU_FTRS_POWER9 MMU_FTRS_POWER6
|
||||
#define MMU_FTRS_POWER10 MMU_FTRS_POWER6
|
||||
#define MMU_FTRS_POWER11 MMU_FTRS_POWER6
|
||||
#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
|
||||
MMU_FTR_CI_LARGE_PAGE
|
||||
#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
|
||||
|
|
|
@ -336,7 +336,7 @@ struct mpic
|
|||
#endif
|
||||
};
|
||||
|
||||
extern struct bus_type mpic_subsys;
|
||||
extern const struct bus_type mpic_subsys;
|
||||
|
||||
/*
|
||||
* MPIC flags (passed to mpic_alloc)
|
||||
|
|
|
@ -163,9 +163,7 @@ struct paca_struct {
|
|||
u64 kstack; /* Saved Kernel stack addr */
|
||||
u64 saved_r1; /* r1 save for RTAS calls or PM or EE=0 */
|
||||
u64 saved_msr; /* MSR saved here by enter_rtas */
|
||||
#ifdef CONFIG_PPC64
|
||||
u64 exit_save_r1; /* Syscall/interrupt R1 save */
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_BOOK3E_64
|
||||
u16 trap_save; /* Used when bad stack is encountered */
|
||||
#endif
|
||||
|
@ -214,8 +212,6 @@ struct paca_struct {
|
|||
/* Non-maskable exceptions that are not performance critical */
|
||||
u64 exnmi[EX_SIZE]; /* used for system reset (nmi) */
|
||||
u64 exmc[EX_SIZE]; /* used for machine checks */
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
/* Exclusive stacks for system reset and machine check exception. */
|
||||
void *nmi_emergency_sp;
|
||||
void *mc_emergency_sp;
|
||||
|
|
|
@ -201,11 +201,13 @@
|
|||
|
||||
#ifdef CONFIG_PPC64_ELF_ABI_V2
|
||||
#define STK_GOT 24
|
||||
#define __STK_PARAM(i) (32 + ((i)-3)*8)
|
||||
#define STK_PARAM_AREA 32
|
||||
#else
|
||||
#define STK_GOT 40
|
||||
#define __STK_PARAM(i) (48 + ((i)-3)*8)
|
||||
#define STK_PARAM_AREA 48
|
||||
#endif
|
||||
|
||||
#define __STK_PARAM(i) (STK_PARAM_AREA + ((i)-3)*8)
|
||||
#define STK_PARAM(i) __STK_PARAM(__REG_##i)
|
||||
|
||||
#ifdef CONFIG_PPC64_ELF_ABI_V2
|
||||
|
@ -506,7 +508,25 @@ END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96)
|
|||
*/
|
||||
#define DCBT_BOOK3S_STOP_ALL_STREAM_IDS(scratch) \
|
||||
lis scratch,0x60000000@h; \
|
||||
dcbt 0,scratch,0b01010
|
||||
.machine push; \
|
||||
.machine power4; \
|
||||
dcbt 0,scratch,0b01010; \
|
||||
.machine pop;
|
||||
|
||||
#define DCBT_SETUP_STREAMS(from, from_parms, to, to_parms, scratch) \
|
||||
lis scratch,0x8000; /* GO=1 */ \
|
||||
clrldi scratch,scratch,32; \
|
||||
.machine push; \
|
||||
.machine power4; \
|
||||
/* setup read stream 0 */ \
|
||||
dcbt 0,from,0b01000; /* addr from */ \
|
||||
dcbt 0,from_parms,0b01010; /* length and depth from */ \
|
||||
/* setup write stream 1 */ \
|
||||
dcbtst 0,to,0b01000; /* addr to */ \
|
||||
dcbtst 0,to_parms,0b01010; /* length and depth to */ \
|
||||
eieio; \
|
||||
dcbt 0,scratch,0b01010; /* all streams GO */ \
|
||||
.machine pop;
|
||||
|
||||
/*
|
||||
* toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them
|
||||
|
|
|
@ -1366,6 +1366,7 @@
|
|||
#define PVR_HX_C2000 0x0066
|
||||
#define PVR_POWER9 0x004E
|
||||
#define PVR_POWER10 0x0080
|
||||
#define PVR_POWER11 0x0082
|
||||
#define PVR_BE 0x0070
|
||||
#define PVR_PA6T 0x0090
|
||||
|
||||
|
@ -1377,6 +1378,7 @@
|
|||
#define PVR_ARCH_207 0x0f000004
|
||||
#define PVR_ARCH_300 0x0f000005
|
||||
#define PVR_ARCH_31 0x0f000006
|
||||
#define PVR_ARCH_31_P11 0x0f000007
|
||||
|
||||
/* Macros for setting and retrieving special purpose registers */
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
@ -11,10 +11,27 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Performance Monitor Registers */
|
||||
#define mfpmr(rn) ({unsigned int rval; \
|
||||
asm volatile("mfpmr %0," __stringify(rn) \
|
||||
: "=r" (rval)); rval;})
|
||||
#define mtpmr(rn, v) asm volatile("mtpmr " __stringify(rn) ",%0" : : "r" (v))
|
||||
static __always_inline unsigned int mfpmr(unsigned int rn)
|
||||
{
|
||||
unsigned int rval;
|
||||
|
||||
asm (".machine push; "
|
||||
".machine e300; "
|
||||
"mfpmr %[rval], %[rn];"
|
||||
".machine pop;"
|
||||
: [rval] "=r" (rval) : [rn] "i" (rn));
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
static __always_inline void mtpmr(unsigned int rn, unsigned int val)
|
||||
{
|
||||
asm (".machine push; "
|
||||
".machine e300; "
|
||||
"mtpmr %[rn], %[val];"
|
||||
".machine pop;"
|
||||
: [val] "=r" (val) : [rn] "i" (rn));
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/* Freescale Book E Performance Monitor APU Registers */
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define SET_MEMORY_X 3
|
||||
#define SET_MEMORY_NP 4 /* Set memory non present */
|
||||
#define SET_MEMORY_P 5 /* Set memory present */
|
||||
#define SET_MEMORY_ROX 6
|
||||
|
||||
int change_memory_attr(unsigned long addr, int numpages, long action);
|
||||
|
||||
|
@ -41,4 +42,10 @@ static inline int set_memory_p(unsigned long addr, int numpages)
|
|||
return change_memory_attr(addr, numpages, SET_MEMORY_P);
|
||||
}
|
||||
|
||||
static inline int set_memory_rox(unsigned long addr, int numpages)
|
||||
{
|
||||
return change_memory_attr(addr, numpages, SET_MEMORY_ROX);
|
||||
}
|
||||
#define set_memory_rox set_memory_rox
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
extern int boot_cpuid;
|
||||
extern int boot_cpu_hwid; /* PPC64 only */
|
||||
extern int boot_core_hwid;
|
||||
extern int spinning_secondaries;
|
||||
extern u32 *cpu_to_phys_id;
|
||||
extern bool coregroup_enabled;
|
||||
|
|
|
@ -48,6 +48,10 @@ static inline void disable_kernel_fp(void)
|
|||
#else
|
||||
static inline void save_fpu(struct task_struct *t) { }
|
||||
static inline void flush_fp_to_thread(struct task_struct *t) { }
|
||||
static inline void enable_kernel_fp(void)
|
||||
{
|
||||
BUILD_BUG();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
|
|
|
@ -267,6 +267,7 @@ TRACE_EVENT_FN(opal_exit,
|
|||
);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_64S_HASH_MMU
|
||||
TRACE_EVENT(hash_fault,
|
||||
|
||||
TP_PROTO(unsigned long addr, unsigned long access, unsigned long trap),
|
||||
|
@ -286,7 +287,7 @@ TRACE_EVENT(hash_fault,
|
|||
TP_printk("hash fault with addr 0x%lx and access = 0x%lx trap = 0x%lx",
|
||||
__entry->addr, __entry->access, __entry->trap)
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
TRACE_EVENT(tlbie,
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
*/
|
||||
#define VIO_CMO_MIN_ENT 1562624
|
||||
|
||||
extern struct bus_type vio_bus_type;
|
||||
extern const struct bus_type vio_bus_type;
|
||||
|
||||
struct iommu_table;
|
||||
|
||||
|
|
|
@ -7,14 +7,14 @@
|
|||
#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
|
||||
|
||||
#define arch_vmap_pud_supported arch_vmap_pud_supported
|
||||
static inline bool arch_vmap_pud_supported(pgprot_t prot)
|
||||
static __always_inline bool arch_vmap_pud_supported(pgprot_t prot)
|
||||
{
|
||||
/* HPT does not cope with large pages in the vmalloc area */
|
||||
return radix_enabled();
|
||||
}
|
||||
|
||||
#define arch_vmap_pmd_supported arch_vmap_pmd_supported
|
||||
static inline bool arch_vmap_pmd_supported(pgprot_t prot)
|
||||
static __always_inline bool arch_vmap_pmd_supported(pgprot_t prot)
|
||||
{
|
||||
return radix_enabled();
|
||||
}
|
||||
|
|
|
@ -55,7 +55,6 @@ CFLAGS_btext.o += -DDISABLE_BRANCH_PROFILING
|
|||
endif
|
||||
|
||||
KCSAN_SANITIZE_early_32.o := n
|
||||
KCSAN_SANITIZE_early_64.o := n
|
||||
KCSAN_SANITIZE_cputable.o := n
|
||||
KCSAN_SANITIZE_btext.o := n
|
||||
KCSAN_SANITIZE_paca.o := n
|
||||
|
|
|
@ -246,9 +246,7 @@ int main(void)
|
|||
OFFSET(PACAHWCPUID, paca_struct, hw_cpu_id);
|
||||
OFFSET(PACAKEXECSTATE, paca_struct, kexec_state);
|
||||
OFFSET(PACA_DSCR_DEFAULT, paca_struct, dscr_default);
|
||||
#ifdef CONFIG_PPC64
|
||||
OFFSET(PACA_EXIT_SAVE_R1, paca_struct, exit_save_r1);
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_BOOK3E_64
|
||||
OFFSET(PACA_TRAP_SAVE, paca_struct, trap_save);
|
||||
#endif
|
||||
|
|
|
@ -60,6 +60,9 @@
|
|||
PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \
|
||||
PPC_FEATURE2_VEC_CRYPTO)
|
||||
|
||||
#define COMMON_USER_POWER11 COMMON_USER_POWER10
|
||||
#define COMMON_USER2_POWER11 COMMON_USER2_POWER10
|
||||
|
||||
static struct cpu_spec cpu_specs[] __initdata = {
|
||||
{ /* PPC970 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
|
@ -281,6 +284,20 @@ static struct cpu_spec cpu_specs[] __initdata = {
|
|||
.cpu_restore = __restore_cpu_power10,
|
||||
.platform = "power10",
|
||||
},
|
||||
{ /* 3.1-compliant processor, i.e. Power11 "architected" mode */
|
||||
.pvr_mask = 0xffffffff,
|
||||
.pvr_value = 0x0f000007,
|
||||
.cpu_name = "Power11 (architected)",
|
||||
.cpu_features = CPU_FTRS_POWER11,
|
||||
.cpu_user_features = COMMON_USER_POWER11,
|
||||
.cpu_user_features2 = COMMON_USER2_POWER11,
|
||||
.mmu_features = MMU_FTRS_POWER11,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.cpu_setup = __setup_cpu_power10,
|
||||
.cpu_restore = __restore_cpu_power10,
|
||||
.platform = "power11",
|
||||
},
|
||||
{ /* Power7 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x003f0000,
|
||||
|
@ -451,6 +468,23 @@ static struct cpu_spec cpu_specs[] __initdata = {
|
|||
.machine_check_early = __machine_check_early_realmode_p10,
|
||||
.platform = "power10",
|
||||
},
|
||||
{ /* Power11 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x00820000,
|
||||
.cpu_name = "Power11 (raw)",
|
||||
.cpu_features = CPU_FTRS_POWER11,
|
||||
.cpu_user_features = COMMON_USER_POWER11,
|
||||
.cpu_user_features2 = COMMON_USER2_POWER11,
|
||||
.mmu_features = MMU_FTRS_POWER11,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.pmc_type = PPC_PMC_IBM,
|
||||
.cpu_setup = __setup_cpu_power10,
|
||||
.cpu_restore = __restore_cpu_power10,
|
||||
.machine_check_early = __machine_check_early_realmode_p10,
|
||||
.platform = "power11",
|
||||
},
|
||||
{ /* Cell Broadband Engine */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x00700000,
|
||||
|
|
|
@ -458,6 +458,14 @@ static int __init feat_enable_mce_power10(struct dt_cpu_feature *f)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int __init feat_enable_mce_power11(struct dt_cpu_feature *f)
|
||||
{
|
||||
cur_cpu_spec->platform = "power11";
|
||||
cur_cpu_spec->machine_check_early = __machine_check_early_realmode_p10;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __init feat_enable_tm(struct dt_cpu_feature *f)
|
||||
{
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
|
@ -648,8 +656,10 @@ static struct dt_cpu_feature_match __initdata
|
|||
{"pc-relative-addressing", feat_enable, 0},
|
||||
{"machine-check-power9", feat_enable_mce_power9, 0},
|
||||
{"machine-check-power10", feat_enable_mce_power10, 0},
|
||||
{"machine-check-power11", feat_enable_mce_power11, 0},
|
||||
{"performance-monitor-power9", feat_enable_pmu_power9, 0},
|
||||
{"performance-monitor-power10", feat_enable_pmu_power10, 0},
|
||||
{"performance-monitor-power11", feat_enable_pmu_power10, 0},
|
||||
{"event-based-branch-v3", feat_enable, 0},
|
||||
{"random-number-generator", feat_enable, 0},
|
||||
{"system-call-vectored", feat_disable, 0},
|
||||
|
|
|
@ -284,15 +284,14 @@ static __always_inline void call_do_irq(struct pt_regs *regs, void *sp)
|
|||
void __do_IRQ(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
void *cursp, *irqsp, *sirqsp;
|
||||
void *cursp, *irqsp;
|
||||
|
||||
/* Switch to the irq stack to handle this */
|
||||
cursp = (void *)(current_stack_pointer & ~(THREAD_SIZE - 1));
|
||||
irqsp = hardirq_ctx[raw_smp_processor_id()];
|
||||
sirqsp = softirq_ctx[raw_smp_processor_id()];
|
||||
|
||||
/* Already there ? If not switch stack and call */
|
||||
if (unlikely(cursp == irqsp || cursp == sirqsp))
|
||||
if (unlikely(cursp == irqsp))
|
||||
__do_irq(regs, current_stack_pointer);
|
||||
else
|
||||
call_do_irq(regs, irqsp);
|
||||
|
|
|
@ -134,10 +134,16 @@ void *alloc_insn_page(void)
|
|||
if (!page)
|
||||
return NULL;
|
||||
|
||||
if (strict_module_rwx_enabled())
|
||||
set_memory_rox((unsigned long)page, 1);
|
||||
if (strict_module_rwx_enabled()) {
|
||||
int err = set_memory_rox((unsigned long)page, 1);
|
||||
|
||||
if (err)
|
||||
goto error;
|
||||
}
|
||||
return page;
|
||||
error:
|
||||
module_memfree(page);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int arch_prepare_kprobe(struct kprobe *p)
|
||||
|
|
|
@ -151,6 +151,9 @@ static void __init move_device_tree(void)
|
|||
* pa-features property is missing, or a 1/0 to indicate if the feature
|
||||
* is supported/not supported. Note that the bit numbers are
|
||||
* big-endian to match the definition in PAPR.
|
||||
* Note: the 'clear' flag clears the feature if the bit is set in the
|
||||
* ibm,pa/pi-features property, it does not set the feature if the
|
||||
* bit is clear.
|
||||
*/
|
||||
struct ibm_feature {
|
||||
unsigned long cpu_features; /* CPU_FTR_xxx bit */
|
||||
|
@ -159,7 +162,7 @@ struct ibm_feature {
|
|||
unsigned int cpu_user_ftrs2; /* PPC_FEATURE2_xxx bit */
|
||||
unsigned char pabyte; /* byte number in ibm,pa/pi-features */
|
||||
unsigned char pabit; /* bit number (big-endian) */
|
||||
unsigned char invert; /* if 1, pa bit set => clear feature */
|
||||
unsigned char clear; /* if 1, pa bit set => clear feature */
|
||||
};
|
||||
|
||||
static struct ibm_feature ibm_pa_features[] __initdata = {
|
||||
|
@ -193,6 +196,7 @@ static struct ibm_feature ibm_pa_features[] __initdata = {
|
|||
*/
|
||||
static struct ibm_feature ibm_pi_features[] __initdata = {
|
||||
{ .pabyte = 0, .pabit = 3, .mmu_features = MMU_FTR_NX_DSI },
|
||||
{ .pabyte = 0, .pabit = 4, .cpu_features = CPU_FTR_DBELL, .clear = 1 },
|
||||
};
|
||||
|
||||
static void __init scan_features(unsigned long node, const unsigned char *ftrs,
|
||||
|
@ -220,12 +224,12 @@ static void __init scan_features(unsigned long node, const unsigned char *ftrs,
|
|||
if (fp->pabyte >= ftrs[0])
|
||||
continue;
|
||||
bit = (ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1;
|
||||
if (bit ^ fp->invert) {
|
||||
if (bit && !fp->clear) {
|
||||
cur_cpu_spec->cpu_features |= fp->cpu_features;
|
||||
cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
|
||||
cur_cpu_spec->cpu_user_features2 |= fp->cpu_user_ftrs2;
|
||||
cur_cpu_spec->mmu_features |= fp->mmu_features;
|
||||
} else {
|
||||
} else if (bit == fp->clear) {
|
||||
cur_cpu_spec->cpu_features &= ~fp->cpu_features;
|
||||
cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
|
||||
cur_cpu_spec->cpu_user_features2 &= ~fp->cpu_user_ftrs2;
|
||||
|
@ -368,13 +372,31 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
|
|||
if (found < 0)
|
||||
return 0;
|
||||
|
||||
DBG("boot cpu: logical %d physical %d\n", found,
|
||||
be32_to_cpu(intserv[found_thread]));
|
||||
boot_cpuid = found;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PPC64))
|
||||
boot_cpu_hwid = be32_to_cpu(intserv[found_thread]);
|
||||
|
||||
if (nr_cpu_ids % nthreads != 0) {
|
||||
set_nr_cpu_ids(ALIGN(nr_cpu_ids, nthreads));
|
||||
pr_warn("nr_cpu_ids was not a multiple of threads_per_core, adjusted to %d\n",
|
||||
nr_cpu_ids);
|
||||
}
|
||||
|
||||
if (boot_cpuid >= nr_cpu_ids) {
|
||||
// Remember boot core for smp_setup_cpu_maps()
|
||||
boot_core_hwid = be32_to_cpu(intserv[0]);
|
||||
|
||||
pr_warn("Boot CPU %d (core hwid %d) >= nr_cpu_ids, adjusted boot CPU to %d\n",
|
||||
boot_cpuid, boot_core_hwid, found_thread);
|
||||
|
||||
// Adjust boot CPU to appear on logical core 0
|
||||
boot_cpuid = found_thread;
|
||||
}
|
||||
|
||||
DBG("boot cpu: logical %d physical %d\n", boot_cpuid,
|
||||
be32_to_cpu(intserv[found_thread]));
|
||||
|
||||
/*
|
||||
* PAPR defines "logical" PVR values for cpus that
|
||||
* meet various levels of the architecture:
|
||||
|
|
|
@ -947,7 +947,7 @@ struct option_vector7 {
|
|||
} __packed;
|
||||
|
||||
struct ibm_arch_vec {
|
||||
struct { __be32 mask, val; } pvrs[14];
|
||||
struct { __be32 mask, val; } pvrs[16];
|
||||
|
||||
u8 num_vectors;
|
||||
|
||||
|
@ -1007,6 +1007,14 @@ static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = {
|
|||
.mask = cpu_to_be32(0xffff0000), /* POWER10 */
|
||||
.val = cpu_to_be32(0x00800000),
|
||||
},
|
||||
{
|
||||
.mask = cpu_to_be32(0xffff0000), /* POWER11 */
|
||||
.val = cpu_to_be32(0x00820000),
|
||||
},
|
||||
{
|
||||
.mask = cpu_to_be32(0xffffffff), /* P11 compliant */
|
||||
.val = cpu_to_be32(0x0f000007),
|
||||
},
|
||||
{
|
||||
.mask = cpu_to_be32(0xffffffff), /* all 3.1-compliant */
|
||||
.val = cpu_to_be32(0x0f000006),
|
||||
|
|
|
@ -32,8 +32,10 @@ bool is_ppc_secureboot_enabled(void)
|
|||
if (enabled)
|
||||
goto out;
|
||||
|
||||
if (!of_property_read_u32(of_root, "ibm,secure-boot", &secureboot))
|
||||
node = of_find_node_by_path("/");
|
||||
if (!of_property_read_u32(node, "ibm,secure-boot", &secureboot))
|
||||
enabled = (secureboot > 1);
|
||||
of_node_put(node);
|
||||
|
||||
out:
|
||||
pr_info("Secure boot mode %s\n", enabled ? "enabled" : "disabled");
|
||||
|
@ -54,8 +56,10 @@ bool is_ppc_trustedboot_enabled(void)
|
|||
if (enabled)
|
||||
goto out;
|
||||
|
||||
if (!of_property_read_u32(of_root, "ibm,trusted-boot", &trustedboot))
|
||||
node = of_find_node_by_path("/");
|
||||
if (!of_property_read_u32(node, "ibm,trusted-boot", &trustedboot))
|
||||
enabled = (trustedboot > 0);
|
||||
of_node_put(node);
|
||||
|
||||
out:
|
||||
pr_info("Trusted boot mode %s\n", enabled ? "enabled" : "disabled");
|
||||
|
|
|
@ -85,6 +85,7 @@ EXPORT_SYMBOL(machine_id);
|
|||
|
||||
int boot_cpuid = -1;
|
||||
EXPORT_SYMBOL_GPL(boot_cpuid);
|
||||
int __initdata boot_core_hwid = -1;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
int boot_cpu_hwid = -1;
|
||||
|
@ -411,6 +412,25 @@ static void __init cpu_init_thread_core_maps(int tpc)
|
|||
|
||||
u32 *cpu_to_phys_id = NULL;
|
||||
|
||||
static int assign_threads(unsigned int cpu, unsigned int nthreads, bool present,
|
||||
const __be32 *hw_ids)
|
||||
{
|
||||
for (int i = 0; i < nthreads && cpu < nr_cpu_ids; i++) {
|
||||
__be32 hwid;
|
||||
|
||||
hwid = be32_to_cpu(hw_ids[i]);
|
||||
|
||||
DBG(" thread %d -> cpu %d (hard id %d)\n", i, cpu, hwid);
|
||||
|
||||
set_cpu_present(cpu, present);
|
||||
set_cpu_possible(cpu, true);
|
||||
cpu_to_phys_id[cpu] = hwid;
|
||||
cpu++;
|
||||
}
|
||||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
/**
|
||||
* setup_cpu_maps - initialize the following cpu maps:
|
||||
* cpu_possible_mask
|
||||
|
@ -446,7 +466,7 @@ void __init smp_setup_cpu_maps(void)
|
|||
for_each_node_by_type(dn, "cpu") {
|
||||
const __be32 *intserv;
|
||||
__be32 cpu_be;
|
||||
int j, len;
|
||||
int len;
|
||||
|
||||
DBG(" * %pOF...\n", dn);
|
||||
|
||||
|
@ -468,27 +488,31 @@ void __init smp_setup_cpu_maps(void)
|
|||
|
||||
nthreads = len / sizeof(int);
|
||||
|
||||
for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) {
|
||||
bool avail;
|
||||
bool avail = of_device_is_available(dn);
|
||||
if (!avail)
|
||||
avail = !of_property_match_string(dn,
|
||||
"enable-method", "spin-table");
|
||||
|
||||
DBG(" thread %d -> cpu %d (hard id %d)\n",
|
||||
j, cpu, be32_to_cpu(intserv[j]));
|
||||
if (boot_core_hwid >= 0) {
|
||||
if (cpu == 0) {
|
||||
pr_info("Skipping CPU node %pOF to allow for boot core.\n", dn);
|
||||
cpu = nthreads;
|
||||
continue;
|
||||
}
|
||||
|
||||
avail = of_device_is_available(dn);
|
||||
if (!avail)
|
||||
avail = !of_property_match_string(dn,
|
||||
"enable-method", "spin-table");
|
||||
|
||||
set_cpu_present(cpu, avail);
|
||||
set_cpu_possible(cpu, true);
|
||||
cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]);
|
||||
cpu++;
|
||||
}
|
||||
|
||||
if (cpu >= nr_cpu_ids) {
|
||||
if (be32_to_cpu(intserv[0]) == boot_core_hwid) {
|
||||
pr_info("Renumbered boot core %pOF to logical 0\n", dn);
|
||||
assign_threads(0, nthreads, avail, intserv);
|
||||
of_node_put(dn);
|
||||
break;
|
||||
}
|
||||
} else if (cpu >= nr_cpu_ids) {
|
||||
of_node_put(dn);
|
||||
break;
|
||||
}
|
||||
|
||||
if (cpu < nr_cpu_ids)
|
||||
cpu = assign_threads(cpu, nthreads, avail, intserv);
|
||||
}
|
||||
|
||||
/* If no SMT supported, nthreads is forced to 1 */
|
||||
|
@ -616,6 +640,8 @@ static __init void probe_machine(void)
|
|||
DBG(" %s ...\n", machine_id->name);
|
||||
if (machine_id->compatible && !of_machine_is_compatible(machine_id->compatible))
|
||||
continue;
|
||||
if (machine_id->compatibles && !of_machine_compatible_match(machine_id->compatibles))
|
||||
continue;
|
||||
memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls));
|
||||
if (ppc_md.probe && !ppc_md.probe())
|
||||
continue;
|
||||
|
|
|
@ -31,7 +31,7 @@ notrace long system_call_exception(struct pt_regs *regs, unsigned long r0)
|
|||
user_exit_irqoff();
|
||||
|
||||
BUG_ON(regs_is_unrecoverable(regs));
|
||||
BUG_ON(!(regs->msr & MSR_PR));
|
||||
BUG_ON(!user_mode(regs));
|
||||
BUG_ON(arch_irq_disabled_regs(regs));
|
||||
|
||||
#ifdef CONFIG_PPC_PKEY
|
||||
|
|
|
@ -404,7 +404,7 @@ noinstr void hv_nmi_check_nonrecoverable(struct pt_regs *regs)
|
|||
return;
|
||||
if (!(regs->msr & MSR_HV))
|
||||
return;
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -1510,7 +1510,7 @@ static void do_program_check(struct pt_regs *regs)
|
|||
if (!is_kernel_addr(bugaddr) && !(regs->msr & MSR_IR))
|
||||
bugaddr += PAGE_OFFSET;
|
||||
|
||||
if (!(regs->msr & MSR_PR) && /* not user-mode */
|
||||
if (!user_mode(regs) &&
|
||||
report_bug(bugaddr, regs) == BUG_TRAP_TYPE_WARN) {
|
||||
regs_add_return_ip(regs, 4);
|
||||
return;
|
||||
|
|
|
@ -385,14 +385,16 @@ int add_opal_mem_range(struct crash_mem **mem_ranges)
|
|||
int add_reserved_mem_ranges(struct crash_mem **mem_ranges)
|
||||
{
|
||||
int n_mem_addr_cells, n_mem_size_cells, i, len, cells, ret = 0;
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const __be32 *prop;
|
||||
|
||||
prop = of_get_property(of_root, "reserved-ranges", &len);
|
||||
prop = of_get_property(root, "reserved-ranges", &len);
|
||||
n_mem_addr_cells = of_n_addr_cells(root);
|
||||
n_mem_size_cells = of_n_size_cells(root);
|
||||
of_node_put(root);
|
||||
if (!prop)
|
||||
return 0;
|
||||
|
||||
n_mem_addr_cells = of_n_addr_cells(of_root);
|
||||
n_mem_size_cells = of_n_size_cells(of_root);
|
||||
cells = n_mem_addr_cells + n_mem_size_cells;
|
||||
|
||||
/* Each reserved range is an (address,size) pair */
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* Author: Suzuki Poulose <suzuki@in.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/objtool.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/mmu.h>
|
||||
|
@ -349,6 +350,7 @@ write_utlb:
|
|||
cmpwi r10, PPC47x_TLB0_4K
|
||||
bne 0f
|
||||
li r10, 0x1000 /* r10 = 4k */
|
||||
ANNOTATE_INTRA_FUNCTION_CALL
|
||||
bl 1f
|
||||
|
||||
0:
|
||||
|
|
|
@ -444,6 +444,7 @@ static int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)
|
|||
guest_pcr_bit = PCR_ARCH_300;
|
||||
break;
|
||||
case PVR_ARCH_31:
|
||||
case PVR_ARCH_31_P11:
|
||||
guest_pcr_bit = PCR_ARCH_31;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -76,7 +76,7 @@ obj-$(CONFIG_PPC_LIB_RHEAP) += rheap.o
|
|||
obj-$(CONFIG_FTR_FIXUP_SELFTEST) += feature-fixups-test.o
|
||||
|
||||
obj-$(CONFIG_ALTIVEC) += xor_vmx.o xor_vmx_glue.o
|
||||
CFLAGS_xor_vmx.o += -maltivec $(call cc-option,-mabi=altivec)
|
||||
CFLAGS_xor_vmx.o += -mhard-float -maltivec $(call cc-option,-mabi=altivec)
|
||||
# Enable <altivec.h>
|
||||
CFLAGS_xor_vmx.o += -isystem $(shell $(CC) -print-file-name=include)
|
||||
|
||||
|
|
|
@ -27,17 +27,7 @@ _GLOBAL(copypage_power7)
|
|||
#endif
|
||||
ori r10,r7,1 /* stream=1 */
|
||||
|
||||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
/* setup read stream 0 */
|
||||
dcbt 0,r4,0b01000 /* addr from */
|
||||
dcbt 0,r7,0b01010 /* length and depth from */
|
||||
/* setup write stream 1 */
|
||||
dcbtst 0,r9,0b01000 /* addr to */
|
||||
dcbtst 0,r10,0b01010 /* length and depth to */
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* all streams GO */
|
||||
DCBT_SETUP_STREAMS(r4, r7, r9, r10, r8)
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
mflr r0
|
||||
|
|
|
@ -298,17 +298,7 @@ err1; stb r0,0(r3)
|
|||
or r7,r7,r0
|
||||
ori r10,r7,1 /* stream=1 */
|
||||
|
||||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
/* setup read stream 0 */
|
||||
dcbt 0,r6,0b01000 /* addr from */
|
||||
dcbt 0,r7,0b01010 /* length and depth from */
|
||||
/* setup write stream 1 */
|
||||
dcbtst 0,r9,0b01000 /* addr to */
|
||||
dcbtst 0,r10,0b01010 /* length and depth to */
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* all streams GO */
|
||||
DCBT_SETUP_STREAMS(r6, r7, r9, r10, r8)
|
||||
|
||||
beq cr1,.Lunwind_stack_nonvmx_copy
|
||||
|
||||
|
|
|
@ -244,15 +244,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
or r7,r7,r0
|
||||
ori r10,r7,1 /* stream=1 */
|
||||
|
||||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
dcbt 0,r6,0b01000
|
||||
dcbt 0,r7,0b01010
|
||||
dcbtst 0,r9,0b01000
|
||||
dcbtst 0,r10,0b01010
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* GO */
|
||||
DCBT_SETUP_STREAMS(r6, r7, r9, r10, r8)
|
||||
|
||||
beq cr1,.Lunwind_stack_nonvmx_copy
|
||||
|
||||
|
|
|
@ -1429,7 +1429,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
return 1;
|
||||
|
||||
case 18: /* rfid, scary */
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
goto priv;
|
||||
op->type = RFI;
|
||||
return 0;
|
||||
|
@ -1742,13 +1742,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
return 1;
|
||||
#endif
|
||||
case 83: /* mfmsr */
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
goto priv;
|
||||
op->type = MFMSR;
|
||||
op->reg = rd;
|
||||
return 0;
|
||||
case 146: /* mtmsr */
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
goto priv;
|
||||
op->type = MTMSR;
|
||||
op->reg = rd;
|
||||
|
@ -1756,7 +1756,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
|||
return 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
case 178: /* mtmsrd */
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
goto priv;
|
||||
op->type = MTMSR;
|
||||
op->reg = rd;
|
||||
|
@ -3437,14 +3437,14 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
|
|||
* stored in the thread_struct. If the instruction is in
|
||||
* the kernel, we must not touch the state in the thread_struct.
|
||||
*/
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_FP))
|
||||
if (!user_mode(regs) && !(regs->msr & MSR_FP))
|
||||
return 0;
|
||||
err = do_fp_load(op, ea, regs, cross_endian);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
case LOAD_VMX:
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_VEC))
|
||||
if (!user_mode(regs) && !(regs->msr & MSR_VEC))
|
||||
return 0;
|
||||
err = do_vec_load(op->reg, ea, size, regs, cross_endian);
|
||||
break;
|
||||
|
@ -3459,7 +3459,7 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
|
|||
*/
|
||||
if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC))
|
||||
msrbit = MSR_VEC;
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & msrbit))
|
||||
if (!user_mode(regs) && !(regs->msr & msrbit))
|
||||
return 0;
|
||||
err = do_vsx_load(op, ea, regs, cross_endian);
|
||||
break;
|
||||
|
@ -3495,8 +3495,7 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
|
|||
}
|
||||
#endif
|
||||
if ((op->type & UPDATE) && size == sizeof(long) &&
|
||||
op->reg == 1 && op->update_reg == 1 &&
|
||||
!(regs->msr & MSR_PR) &&
|
||||
op->reg == 1 && op->update_reg == 1 && !user_mode(regs) &&
|
||||
ea >= regs->gpr[1] - STACK_INT_FRAME_SIZE) {
|
||||
err = handle_stack_update(ea, regs);
|
||||
break;
|
||||
|
@ -3508,14 +3507,14 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
|
|||
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
case STORE_FP:
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_FP))
|
||||
if (!user_mode(regs) && !(regs->msr & MSR_FP))
|
||||
return 0;
|
||||
err = do_fp_store(op, ea, regs, cross_endian);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
case STORE_VMX:
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & MSR_VEC))
|
||||
if (!user_mode(regs) && !(regs->msr & MSR_VEC))
|
||||
return 0;
|
||||
err = do_vec_store(op->reg, ea, size, regs, cross_endian);
|
||||
break;
|
||||
|
@ -3530,7 +3529,7 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
|
|||
*/
|
||||
if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC))
|
||||
msrbit = MSR_VEC;
|
||||
if (!(regs->msr & MSR_PR) && !(regs->msr & msrbit))
|
||||
if (!user_mode(regs) && !(regs->msr & msrbit))
|
||||
return 0;
|
||||
err = do_vsx_store(op, ea, regs, cross_endian);
|
||||
break;
|
||||
|
|
|
@ -59,16 +59,13 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid,
|
|||
|
||||
rflags = htab_convert_pte_flags(new_pmd, flags);
|
||||
|
||||
#if 0
|
||||
if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) {
|
||||
/*
|
||||
* THPs are only supported on platforms that can do mixed page size
|
||||
* segments (MPSS) and all such platforms have coherent icache. Hence we
|
||||
* don't need to do lazy icache flush (hash_page_do_lazy_icache()) on
|
||||
* noexecute fault.
|
||||
*/
|
||||
|
||||
/*
|
||||
* No CPU has hugepages but lacks no execute, so we
|
||||
* don't need to worry about that case
|
||||
*/
|
||||
rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap);
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Find the slot index details for this ea, using base page size.
|
||||
*/
|
||||
|
|
|
@ -2172,7 +2172,7 @@ static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
|
|||
mmu_kernel_ssize, 0);
|
||||
}
|
||||
|
||||
void hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
int hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
unsigned long flags, vaddr, lmi;
|
||||
int i;
|
||||
|
@ -2189,6 +2189,7 @@ void hash__kernel_map_pages(struct page *page, int numpages, int enable)
|
|||
kernel_unmap_linear_page(vaddr, lmi);
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_PAGEALLOC || CONFIG_KFENCE */
|
||||
|
||||
|
|
|
@ -1339,20 +1339,6 @@ void __ref radix__vmemmap_free(unsigned long start, unsigned long end,
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
|
||||
void radix__kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
addr = (unsigned long)page_address(page);
|
||||
|
||||
if (enable)
|
||||
set_memory_p(addr, numpages);
|
||||
else
|
||||
set_memory_np(addr, numpages);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
|
||||
unsigned long radix__pmd_hugepage_update(struct mm_struct *mm, unsigned long addr,
|
||||
|
|
|
@ -393,17 +393,17 @@ static const __be32 *of_get_usable_memory(struct device_node *dn)
|
|||
int walk_drmem_lmbs(struct device_node *dn, void *data,
|
||||
int (*func)(struct drmem_lmb *, const __be32 **, void *))
|
||||
{
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const __be32 *prop, *usm;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (!of_root)
|
||||
if (!root)
|
||||
return ret;
|
||||
|
||||
/* Get the address & size cells */
|
||||
of_node_get(of_root);
|
||||
n_root_addr_cells = of_n_addr_cells(of_root);
|
||||
n_root_size_cells = of_n_size_cells(of_root);
|
||||
of_node_put(of_root);
|
||||
n_root_addr_cells = of_n_addr_cells(root);
|
||||
n_root_size_cells = of_n_size_cells(root);
|
||||
of_node_put(root);
|
||||
|
||||
if (init_drmem_lmb_size(dn))
|
||||
return ret;
|
||||
|
|
|
@ -180,3 +180,5 @@ static inline bool debug_pagealloc_enabled_or_kfence(void)
|
|||
int create_section_mapping(unsigned long start, unsigned long end,
|
||||
int nid, pgprot_t prot);
|
||||
#endif
|
||||
|
||||
int hash__kernel_map_pages(struct page *page, int numpages, int enable);
|
||||
|
|
|
@ -1111,7 +1111,7 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn)
|
|||
|
||||
static void __init find_possible_nodes(void)
|
||||
{
|
||||
struct device_node *rtas;
|
||||
struct device_node *rtas, *root;
|
||||
const __be32 *domains = NULL;
|
||||
int prop_length, max_nodes;
|
||||
u32 i;
|
||||
|
@ -1132,10 +1132,12 @@ static void __init find_possible_nodes(void)
|
|||
* If the LPAR is migratable, new nodes might be activated after a LPM,
|
||||
* so we should consider the max number in that case.
|
||||
*/
|
||||
if (!of_get_property(of_root, "ibm,migratable-partition", NULL))
|
||||
root = of_find_node_by_path("/");
|
||||
if (!of_get_property(root, "ibm,migratable-partition", NULL))
|
||||
domains = of_get_property(rtas,
|
||||
"ibm,current-associativity-domains",
|
||||
&prop_length);
|
||||
of_node_put(root);
|
||||
if (!domains) {
|
||||
domains = of_get_property(rtas, "ibm,max-associativity-domains",
|
||||
&prop_length);
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
#include <mm/mmu_decl.h>
|
||||
|
||||
static pte_basic_t pte_update_delta(pte_t *ptep, unsigned long addr,
|
||||
unsigned long old, unsigned long new)
|
||||
|
@ -38,6 +39,10 @@ static int change_page_attr(pte_t *ptep, unsigned long addr, void *data)
|
|||
/* Don't clear DIRTY bit */
|
||||
pte_update_delta(ptep, addr, _PAGE_KERNEL_RW & ~_PAGE_DIRTY, _PAGE_KERNEL_RO);
|
||||
break;
|
||||
case SET_MEMORY_ROX:
|
||||
/* Don't clear DIRTY bit */
|
||||
pte_update_delta(ptep, addr, _PAGE_KERNEL_RW & ~_PAGE_DIRTY, _PAGE_KERNEL_ROX);
|
||||
break;
|
||||
case SET_MEMORY_RW:
|
||||
pte_update_delta(ptep, addr, _PAGE_KERNEL_RO, _PAGE_KERNEL_RW);
|
||||
break;
|
||||
|
@ -97,3 +102,26 @@ int change_memory_attr(unsigned long addr, int numpages, long action)
|
|||
return apply_to_existing_page_range(&init_mm, start, size,
|
||||
change_page_attr, (void *)action);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
|
||||
#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
||||
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
int err;
|
||||
unsigned long addr = (unsigned long)page_address(page);
|
||||
|
||||
if (PageHighMem(page))
|
||||
return;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
|
||||
err = hash__kernel_map_pages(page, numpages, enable);
|
||||
else if (enable)
|
||||
err = set_memory_p(addr, numpages);
|
||||
else
|
||||
err = set_memory_np(addr, numpages);
|
||||
|
||||
if (err)
|
||||
panic("%s: changing memory protections failed\n", __func__);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -167,18 +167,3 @@ void mark_rodata_ro(void)
|
|||
set_memory_ro((unsigned long)_stext, numpages);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC) && defined(CONFIG_DEBUG_PAGEALLOC)
|
||||
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
unsigned long addr = (unsigned long)page_address(page);
|
||||
|
||||
if (PageHighMem(page))
|
||||
return;
|
||||
|
||||
if (enable)
|
||||
set_memory_p(addr, numpages);
|
||||
else
|
||||
set_memory_np(addr, numpages);
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_PAGEALLOC */
|
||||
|
|
|
@ -256,7 +256,7 @@ static bool regs_sipr(struct pt_regs *regs)
|
|||
|
||||
static inline u32 perf_flags_from_msr(struct pt_regs *regs)
|
||||
{
|
||||
if (regs->msr & MSR_PR)
|
||||
if (user_mode(regs))
|
||||
return PERF_RECORD_MISC_USER;
|
||||
if ((regs->msr & MSR_HV) && freeze_events_kernel != MMCR0_FCHV)
|
||||
return PERF_RECORD_MISC_HYPERVISOR;
|
||||
|
@ -2593,6 +2593,8 @@ static int __init init_ppc64_pmu(void)
|
|||
return 0;
|
||||
else if (!init_power10_pmu())
|
||||
return 0;
|
||||
else if (!init_power11_pmu())
|
||||
return 0;
|
||||
else if (!init_ppc970_pmu())
|
||||
return 0;
|
||||
else
|
||||
|
|
|
@ -695,6 +695,20 @@ static unsigned long single_gpci_request(u32 req, u32 starting_index,
|
|||
|
||||
ret = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
|
||||
virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
|
||||
|
||||
/*
|
||||
* ret value as 'H_PARAMETER' with detail_rc as 'GEN_BUF_TOO_SMALL',
|
||||
* specifies that the current buffer size cannot accommodate
|
||||
* all the information and a partial buffer returned.
|
||||
* Since in this function we are only accessing data for a given starting index,
|
||||
* we don't need to accommodate whole data and can get required count by
|
||||
* accessing first entry data.
|
||||
* Hence hcall fails only incase the ret value is other than H_SUCCESS or
|
||||
* H_PARAMETER with detail_rc value as GEN_BUF_TOO_SMALL(0x1B).
|
||||
*/
|
||||
if (ret == H_PARAMETER && be32_to_cpu(arg->params.detail_rc) == 0x1B)
|
||||
ret = 0;
|
||||
|
||||
if (ret) {
|
||||
pr_devel("hcall failed: 0x%lx\n", ret);
|
||||
goto out;
|
||||
|
@ -759,6 +773,7 @@ static int h_gpci_event_init(struct perf_event *event)
|
|||
{
|
||||
u64 count;
|
||||
u8 length;
|
||||
unsigned long ret;
|
||||
|
||||
/* Not our event */
|
||||
if (event->attr.type != event->pmu->type)
|
||||
|
@ -789,13 +804,23 @@ static int h_gpci_event_init(struct perf_event *event)
|
|||
}
|
||||
|
||||
/* check if the request works... */
|
||||
if (single_gpci_request(event_get_request(event),
|
||||
ret = single_gpci_request(event_get_request(event),
|
||||
event_get_starting_index(event),
|
||||
event_get_secondary_index(event),
|
||||
event_get_counter_info_version(event),
|
||||
event_get_offset(event),
|
||||
length,
|
||||
&count)) {
|
||||
&count);
|
||||
|
||||
/*
|
||||
* ret value as H_AUTHORITY implies that partition is not permitted to retrieve
|
||||
* performance information, and required to set
|
||||
* "Enable Performance Information Collection" option.
|
||||
*/
|
||||
if (ret == H_AUTHORITY)
|
||||
return -EPERM;
|
||||
|
||||
if (ret) {
|
||||
pr_devel("gpci hcall failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -10,4 +10,5 @@ int __init init_power7_pmu(void);
|
|||
int __init init_power8_pmu(void);
|
||||
int __init init_power9_pmu(void);
|
||||
int __init init_power10_pmu(void);
|
||||
int __init init_power11_pmu(void);
|
||||
int __init init_generic_compat_pmu(void);
|
||||
|
|
|
@ -634,3 +634,30 @@ int __init init_power10_pmu(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct power_pmu power11_pmu;
|
||||
|
||||
int __init init_power11_pmu(void)
|
||||
{
|
||||
unsigned int pvr;
|
||||
int rc;
|
||||
|
||||
pvr = mfspr(SPRN_PVR);
|
||||
if (PVR_VER(pvr) != PVR_POWER11)
|
||||
return -ENODEV;
|
||||
|
||||
/* Set the PERF_REG_EXTENDED_MASK here */
|
||||
PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_31;
|
||||
|
||||
power11_pmu = power10_pmu;
|
||||
power11_pmu.name = "Power11";
|
||||
|
||||
rc = register_power_pmu(&power11_pmu);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Tell userspace that EBB is supported */
|
||||
cur_cpu_spec->cpu_user_features2 |= PPC_FEATURE2_EBB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -59,16 +59,13 @@ static const char * const board[] __initconst = {
|
|||
|
||||
static int __init ppc40x_probe(void)
|
||||
{
|
||||
if (of_device_compatible_match(of_root, board)) {
|
||||
pci_set_flags(PCI_REASSIGN_ALL_RSRC);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
pci_set_flags(PCI_REASSIGN_ALL_RSRC);
|
||||
return 1;
|
||||
}
|
||||
|
||||
define_machine(ppc40x_simple) {
|
||||
.name = "PowerPC 40x Platform",
|
||||
.compatibles = board,
|
||||
.probe = ppc40x_probe,
|
||||
.progress = udbg_progress,
|
||||
.init_IRQ = uic_init_tree,
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/i2c.h>
|
||||
|
|
|
@ -32,9 +32,6 @@ static const char * const board[] __initconst = {
|
|||
*/
|
||||
static int __init mpc512x_generic_probe(void)
|
||||
{
|
||||
if (!of_device_compatible_match(of_root, board))
|
||||
return 0;
|
||||
|
||||
mpc512x_init_early();
|
||||
|
||||
return 1;
|
||||
|
@ -42,6 +39,7 @@ static int __init mpc512x_generic_probe(void)
|
|||
|
||||
define_machine(mpc512x_generic) {
|
||||
.name = "MPC512x generic",
|
||||
.compatibles = board,
|
||||
.probe = mpc512x_generic_probe,
|
||||
.init = mpc512x_init,
|
||||
.setup_arch = mpc512x_setup_arch,
|
||||
|
|
|
@ -195,8 +195,10 @@ static void __init efika_setup_arch(void)
|
|||
|
||||
static int __init efika_probe(void)
|
||||
{
|
||||
const char *model = of_get_property(of_root, "model", NULL);
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const char *model = of_get_property(root, "model", NULL);
|
||||
|
||||
of_node_put(root);
|
||||
if (model == NULL)
|
||||
return 0;
|
||||
if (strcmp(model, "EFIKA5K2"))
|
||||
|
|
|
@ -172,17 +172,9 @@ static const char * const board[] __initconst = {
|
|||
NULL,
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init lite5200_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
define_machine(lite5200) {
|
||||
.name = "lite5200",
|
||||
.probe = lite5200_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = lite5200_setup_arch,
|
||||
.discover_phbs = mpc52xx_setup_pci,
|
||||
.init = mpc52xx_declare_of_platform_devices,
|
||||
|
|
|
@ -59,17 +59,9 @@ static const char *board[] __initdata = {
|
|||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init mpc5200_simple_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
define_machine(mpc5200_simple_platform) {
|
||||
.name = "mpc5200-simple-platform",
|
||||
.probe = mpc5200_simple_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = mpc5200_simple_setup_arch,
|
||||
.discover_phbs = mpc52xx_setup_pci,
|
||||
.init = mpc52xx_declare_of_platform_devices,
|
||||
|
|
|
@ -34,19 +34,11 @@ static const char *board[] __initdata = {
|
|||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init mpc830x_rdb_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
machine_device_initcall(mpc830x_rdb, mpc83xx_declare_of_platform_devices);
|
||||
|
||||
define_machine(mpc830x_rdb) {
|
||||
.name = "MPC830x RDB",
|
||||
.probe = mpc830x_rdb_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = mpc830x_rdb_setup_arch,
|
||||
.discover_phbs = mpc83xx_setup_pci,
|
||||
.init_IRQ = mpc83xx_ipic_init_IRQ,
|
||||
|
|
|
@ -34,19 +34,11 @@ static const char *board[] __initdata = {
|
|||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init mpc831x_rdb_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
machine_device_initcall(mpc831x_rdb, mpc83xx_declare_of_platform_devices);
|
||||
|
||||
define_machine(mpc831x_rdb) {
|
||||
.name = "MPC831x RDB",
|
||||
.probe = mpc831x_rdb_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = mpc831x_rdb_setup_arch,
|
||||
.discover_phbs = mpc83xx_setup_pci,
|
||||
.init_IRQ = mpc83xx_ipic_init_IRQ,
|
||||
|
|
|
@ -61,17 +61,9 @@ static const char * const board[] __initconst = {
|
|||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init mpc837x_rdb_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
define_machine(mpc837x_rdb) {
|
||||
.name = "MPC837x RDB/WLAN",
|
||||
.probe = mpc837x_rdb_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = mpc837x_rdb_setup_arch,
|
||||
.discover_phbs = mpc83xx_setup_pci,
|
||||
.init_IRQ = mpc83xx_ipic_init_IRQ,
|
||||
|
|
|
@ -206,7 +206,8 @@ static int mpc83xx_suspend_enter(suspend_state_t state)
|
|||
out_be32(&pmc_regs->config1,
|
||||
in_be32(&pmc_regs->config1) | PMCCR1_POWER_OFF);
|
||||
|
||||
enable_kernel_fp();
|
||||
if (IS_ENABLED(CONFIG_PPC_FPU))
|
||||
enable_kernel_fp();
|
||||
|
||||
mpc83xx_enter_deep_sleep(immrbase);
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include "mpc85xx.h"
|
||||
#include "smp.h"
|
||||
|
||||
void __init bsc913x_qds_pic_init(void)
|
||||
static void __init bsc913x_qds_pic_init(void)
|
||||
{
|
||||
struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN |
|
||||
MPIC_SINGLE_DEST_CPU,
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
#include "mpc85xx.h"
|
||||
|
||||
void __init bsc913x_rdb_pic_init(void)
|
||||
static void __init bsc913x_rdb_pic_init(void)
|
||||
{
|
||||
struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN |
|
||||
MPIC_SINGLE_DEST_CPU,
|
||||
|
|
|
@ -149,7 +149,7 @@ static int __init corenet_generic_probe(void)
|
|||
extern struct smp_ops_t smp_85xx_ops;
|
||||
#endif
|
||||
|
||||
if (of_device_compatible_match(of_root, boards))
|
||||
if (of_machine_compatible_match(boards))
|
||||
return 1;
|
||||
|
||||
/* Check if we're running under the Freescale hypervisor */
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
void __iomem *imp3a_regs;
|
||||
|
||||
void __init ge_imp3a_pic_init(void)
|
||||
static void __init ge_imp3a_pic_init(void)
|
||||
{
|
||||
struct mpic *mpic;
|
||||
struct device_node *np;
|
||||
|
|
|
@ -114,7 +114,7 @@ static int gpio_halt_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int gpio_halt_remove(struct platform_device *pdev)
|
||||
static void gpio_halt_remove(struct platform_device *pdev)
|
||||
{
|
||||
free_irq(halt_irq, pdev);
|
||||
cancel_work_sync(&gpio_halt_wq);
|
||||
|
@ -124,8 +124,6 @@ static int gpio_halt_remove(struct platform_device *pdev)
|
|||
|
||||
gpiod_put(halt_gpio);
|
||||
halt_gpio = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id gpio_halt_match[] = {
|
||||
|
@ -145,7 +143,7 @@ static struct platform_driver gpio_halt_driver = {
|
|||
.of_match_table = gpio_halt_match,
|
||||
},
|
||||
.probe = gpio_halt_probe,
|
||||
.remove = gpio_halt_remove,
|
||||
.remove_new = gpio_halt_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(gpio_halt_driver);
|
||||
|
|
|
@ -112,17 +112,9 @@ static const char * const board[] __initconst = {
|
|||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Called very early, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init tqm85xx_probe(void)
|
||||
{
|
||||
return of_device_compatible_match(of_root, board);
|
||||
}
|
||||
|
||||
define_machine(tqm85xx) {
|
||||
.name = "TQM85xx",
|
||||
.probe = tqm85xx_probe,
|
||||
.compatibles = board,
|
||||
.setup_arch = tqm85xx_setup_arch,
|
||||
.init_IRQ = tqm85xx_pic_init,
|
||||
.show_cpuinfo = tqm85xx_show_cpuinfo,
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
extern void __flush_disable_L1(void);
|
||||
|
||||
void amigaone_show_cpuinfo(struct seq_file *m)
|
||||
static void amigaone_show_cpuinfo(struct seq_file *m)
|
||||
{
|
||||
seq_printf(m, "vendor\t\t: Eyetech Ltd.\n");
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ static int __init amigaone_add_bridge(struct device_node *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void __init amigaone_setup_arch(void)
|
||||
static void __init amigaone_setup_arch(void)
|
||||
{
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0);
|
||||
|
@ -83,7 +83,7 @@ static void __init amigaone_discover_phbs(void)
|
|||
BUG_ON(phb != 0);
|
||||
}
|
||||
|
||||
void __init amigaone_init_IRQ(void)
|
||||
static void __init amigaone_init_IRQ(void)
|
||||
{
|
||||
struct device_node *pic, *np = NULL;
|
||||
const unsigned long *prop = NULL;
|
||||
|
@ -123,7 +123,7 @@ static int __init request_isa_regions(void)
|
|||
}
|
||||
machine_device_initcall(amigaone, request_isa_regions);
|
||||
|
||||
void __noreturn amigaone_restart(char *cmd)
|
||||
static void __noreturn amigaone_restart(char *cmd)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
||||
|
|
|
@ -99,9 +99,6 @@ static void __init linkstation_init_IRQ(void)
|
|||
mpic_init(mpic);
|
||||
}
|
||||
|
||||
extern void avr_uart_configure(void);
|
||||
extern void avr_uart_send(const char);
|
||||
|
||||
static void __noreturn linkstation_restart(char *cmd)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
|
|
@ -156,4 +156,7 @@ int mpc10x_disable_store_gathering(struct pci_controller *hose);
|
|||
/* For MPC107 boards that use the built-in openpic */
|
||||
void mpc10x_set_openpic(void);
|
||||
|
||||
void avr_uart_configure(void);
|
||||
void avr_uart_send(const char c);
|
||||
|
||||
#endif /* __PPC_KERNEL_MPC10X_H */
|
||||
|
|
|
@ -260,7 +260,7 @@ out:
|
|||
}
|
||||
|
||||
|
||||
static int gpio_mdio_remove(struct platform_device *dev)
|
||||
static void gpio_mdio_remove(struct platform_device *dev)
|
||||
{
|
||||
struct mii_bus *bus = dev_get_drvdata(&dev->dev);
|
||||
|
||||
|
@ -271,8 +271,6 @@ static int gpio_mdio_remove(struct platform_device *dev)
|
|||
kfree(bus->priv);
|
||||
bus->priv = NULL;
|
||||
mdiobus_free(bus);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id gpio_mdio_match[] =
|
||||
|
@ -287,7 +285,7 @@ MODULE_DEVICE_TABLE(of, gpio_mdio_match);
|
|||
static struct platform_driver gpio_mdio_driver =
|
||||
{
|
||||
.probe = gpio_mdio_probe,
|
||||
.remove = gpio_mdio_remove,
|
||||
.remove_new = gpio_mdio_remove,
|
||||
.driver = {
|
||||
.name = "gpio-mdio-bitbang",
|
||||
.of_match_table = gpio_mdio_match,
|
||||
|
|
|
@ -270,16 +270,18 @@ static int __init pas_add_bridge(struct device_node *dev)
|
|||
|
||||
void __init pas_pci_init(void)
|
||||
{
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
struct device_node *np;
|
||||
int res;
|
||||
|
||||
pci_set_flags(PCI_SCAN_ALL_PCIE_DEVS);
|
||||
|
||||
np = of_find_compatible_node(of_root, NULL, "pasemi,rootbus");
|
||||
np = of_find_compatible_node(root, NULL, "pasemi,rootbus");
|
||||
if (np) {
|
||||
res = pas_add_bridge(np);
|
||||
of_node_put(np);
|
||||
}
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
void __iomem *__init pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
config PPC_PMAC
|
||||
bool "Apple PowerMac based machines"
|
||||
depends on PPC_BOOK3S && CPU_BIG_ENDIAN
|
||||
select ADB_CUDA if POWER_RESET && PPC32
|
||||
select ADB_CUDA if POWER_RESET && ADB
|
||||
select MPIC
|
||||
select FORCE_PCI
|
||||
select PPC_INDIRECT_PCI if PPC32
|
||||
|
|
|
@ -2333,7 +2333,6 @@ static struct pmac_mb_def pmac_mb_defs[] = {
|
|||
PMAC_TYPE_POWERMAC_G5, g5_features,
|
||||
0,
|
||||
},
|
||||
#ifdef CONFIG_PPC64
|
||||
{ "PowerMac7,3", "PowerMac G5",
|
||||
PMAC_TYPE_POWERMAC_G5, g5_features,
|
||||
0,
|
||||
|
@ -2359,7 +2358,6 @@ static struct pmac_mb_def pmac_mb_defs[] = {
|
|||
0,
|
||||
},
|
||||
#endif /* CONFIG_PPC64 */
|
||||
#endif /* CONFIG_PPC64 */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -425,12 +425,11 @@ static int opal_prd_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int opal_prd_remove(struct platform_device *pdev)
|
||||
static void opal_prd_remove(struct platform_device *pdev)
|
||||
{
|
||||
misc_deregister(&opal_prd_dev);
|
||||
opal_message_notifier_unregister(OPAL_MSG_PRD, &opal_prd_event_nb);
|
||||
opal_message_notifier_unregister(OPAL_MSG_PRD2, &opal_prd_event_nb2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id opal_prd_match[] = {
|
||||
|
@ -444,7 +443,7 @@ static struct platform_driver opal_prd_driver = {
|
|||
.of_match_table = opal_prd_match,
|
||||
},
|
||||
.probe = opal_prd_probe,
|
||||
.remove = opal_prd_remove,
|
||||
.remove_new = opal_prd_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(opal_prd_driver);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#define lv1call .long 0x44000022; extsw r3, r3
|
||||
|
||||
|
@ -16,12 +17,14 @@
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE(r1); \
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE; \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -38,18 +41,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r3, -8(r1); \
|
||||
std r3, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -57,21 +61,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r3, -8(r1); \
|
||||
stdu r4, -16(r1); \
|
||||
std r4, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -79,16 +84,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r3, -8(r1); \
|
||||
std r4, -16(r1); \
|
||||
stdu r5, -24(r1); \
|
||||
std r5, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -96,7 +102,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -104,7 +110,7 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r3, -8(r1); \
|
||||
std r4, -16(r1); \
|
||||
|
@ -112,12 +118,13 @@ _GLOBAL(_##API_NAME) \
|
|||
std r6, -32(r1); \
|
||||
std r7, -40(r1); \
|
||||
std r8, -48(r1); \
|
||||
stdu r9, -56(r1); \
|
||||
std r9, -56(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-56(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 56; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+56; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -133,7 +140,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -56(r1); \
|
||||
std r10, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -141,18 +148,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r4, -8(r1); \
|
||||
std r4, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -160,21 +168,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
stdu r5, -16(r1); \
|
||||
std r5, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -182,16 +191,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
std r5, -16(r1); \
|
||||
stdu r6, -24(r1); \
|
||||
std r6, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -199,7 +209,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -207,17 +217,18 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
std r5, -16(r1); \
|
||||
std r6, -24(r1); \
|
||||
stdu r7, -32(r1); \
|
||||
std r7, -32(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-32(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 32; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+32; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -227,7 +238,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -32(r1); \
|
||||
std r7, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -235,18 +246,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
std r5, -16(r1); \
|
||||
std r6, -24(r1); \
|
||||
std r7, -32(r1); \
|
||||
stdu r8, -40(r1); \
|
||||
std r8, -40(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-40(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 40; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+40; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -258,7 +270,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -40(r1); \
|
||||
std r8, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -266,19 +278,20 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
std r5, -16(r1); \
|
||||
std r6, -24(r1); \
|
||||
std r7, -32(r1); \
|
||||
std r8, -40(r1); \
|
||||
stdu r9, -48(r1); \
|
||||
std r9, -48(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-48(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 48; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+48; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -292,7 +305,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -48(r1); \
|
||||
std r9, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -300,7 +313,7 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r4, -8(r1); \
|
||||
std r5, -16(r1); \
|
||||
|
@ -308,12 +321,13 @@ _GLOBAL(_##API_NAME) \
|
|||
std r7, -32(r1); \
|
||||
std r8, -40(r1); \
|
||||
std r9, -48(r1); \
|
||||
stdu r10, -56(r1); \
|
||||
std r10, -56(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-56(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 56; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+56; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -329,7 +343,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -56(r1); \
|
||||
std r10, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -337,18 +351,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r5, -8(r1); \
|
||||
std r5, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -356,21 +371,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r5, -8(r1); \
|
||||
stdu r6, -16(r1); \
|
||||
std r6, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -378,16 +394,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r5, -8(r1); \
|
||||
std r6, -16(r1); \
|
||||
stdu r7, -24(r1); \
|
||||
std r7, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -395,7 +412,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -403,17 +420,18 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r5, -8(r1); \
|
||||
std r6, -16(r1); \
|
||||
std r7, -24(r1); \
|
||||
stdu r8, -32(r1); \
|
||||
std r8, -32(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-32(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 32; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+32;\
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -423,7 +441,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -32(r1); \
|
||||
std r7, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -431,18 +449,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r5, -8(r1); \
|
||||
std r6, -16(r1); \
|
||||
std r7, -24(r1); \
|
||||
std r8, -32(r1); \
|
||||
stdu r9, -40(r1); \
|
||||
std r9, -40(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-40(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 40; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+40; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -454,7 +473,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -40(r1); \
|
||||
std r8, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -462,18 +481,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r6, -8(r1); \
|
||||
std r6, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -481,21 +501,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r6, -8(r1); \
|
||||
stdu r7, -16(r1); \
|
||||
std r7, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -503,16 +524,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r6, -8(r1); \
|
||||
std r7, -16(r1); \
|
||||
stdu r8, -24(r1); \
|
||||
std r8, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -520,7 +542,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -528,18 +550,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r7, -8(r1); \
|
||||
std r7, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -547,21 +570,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r7, -8(r1); \
|
||||
stdu r8, -16(r1); \
|
||||
std r8, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -569,16 +593,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r7, -8(r1); \
|
||||
std r8, -16(r1); \
|
||||
stdu r9, -24(r1); \
|
||||
std r9, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -586,7 +611,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -594,18 +619,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r8, -8(r1); \
|
||||
std r8, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -613,21 +639,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r8, -8(r1); \
|
||||
stdu r9, -16(r1); \
|
||||
std r9, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -635,16 +662,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r8, -8(r1); \
|
||||
std r9, -16(r1); \
|
||||
stdu r10, -24(r1); \
|
||||
std r10, -24(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 24; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+24; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
|
@ -652,7 +680,7 @@ _GLOBAL(_##API_NAME) \
|
|||
ld r11, -24(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -660,18 +688,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r9, -8(r1); \
|
||||
std r9, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -679,21 +708,22 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r9, -8(r1); \
|
||||
stdu r10, -16(r1); \
|
||||
std r10, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -701,23 +731,24 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r9, -8(r1); \
|
||||
stdu r10, -16(r1); \
|
||||
std r10, -16(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 16; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+16; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, -16(r1); \
|
||||
std r5, 0(r11); \
|
||||
ld r11, 48+8*8(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*8(r1); \
|
||||
std r6, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -725,18 +756,19 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
stdu r10, -8(r1); \
|
||||
std r10, -8(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
addi r1, r1, 8; \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE+8; \
|
||||
ld r11, -8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -744,27 +776,29 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
\
|
||||
std r10, 48+8*7(r1); \
|
||||
std r10, STK_PARAM_AREA+8*7(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
ld r11, 48+8*7(r1); \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE; \
|
||||
ld r11, STK_PARAM_AREA+8*7(r1); \
|
||||
std r4, 0(r11); \
|
||||
ld r11, 48+8*8(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*8(r1); \
|
||||
std r5, 0(r11); \
|
||||
ld r11, 48+8*9(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*9(r1); \
|
||||
std r6, 0(r11); \
|
||||
ld r11, 48+8*10(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*10(r1); \
|
||||
std r7, 0(r11); \
|
||||
ld r11, 48+8*11(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*11(r1); \
|
||||
std r8, 0(r11); \
|
||||
ld r11, 48+8*12(r1); \
|
||||
ld r11, STK_PARAM_AREA+8*12(r1); \
|
||||
std r9, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
@ -772,15 +806,17 @@ _GLOBAL(_##API_NAME) \
|
|||
_GLOBAL(_##API_NAME) \
|
||||
\
|
||||
mflr r0; \
|
||||
std r0, 16(r1); \
|
||||
std r0, LRSAVE(r1); \
|
||||
stdu r1, -STACK_FRAME_MIN_SIZE(r1); \
|
||||
\
|
||||
li r11, API_NUMBER; \
|
||||
lv1call; \
|
||||
\
|
||||
ld r11, 48+8*8(r1); \
|
||||
addi r1, r1, STACK_FRAME_MIN_SIZE; \
|
||||
ld r11, STK_PARAM_AREA+8*8(r1); \
|
||||
std r4, 0(r11); \
|
||||
\
|
||||
ld r0, 16(r1); \
|
||||
ld r0, LRSAVE(r1); \
|
||||
mtlr r0; \
|
||||
blr
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ static struct device ibmebus_bus_device = { /* fake "parent" device */
|
|||
.init_name = "ibmebus",
|
||||
};
|
||||
|
||||
struct bus_type ibmebus_bus_type;
|
||||
const struct bus_type ibmebus_bus_type;
|
||||
|
||||
/* These devices will automatically be added to the bus during init */
|
||||
static const struct of_device_id ibmebus_matches[] __initconst = {
|
||||
|
@ -432,7 +432,7 @@ static int ibmebus_bus_modalias(const struct device *dev, struct kobj_uevent_env
|
|||
return of_device_uevent_modalias(dev, env);
|
||||
}
|
||||
|
||||
struct bus_type ibmebus_bus_type = {
|
||||
const struct bus_type ibmebus_bus_type = {
|
||||
.name = "ibmebus",
|
||||
.uevent = ibmebus_bus_modalias,
|
||||
.bus_groups = ibmbus_bus_groups,
|
||||
|
|
|
@ -346,9 +346,13 @@ static int read_rtas_lpar_name(struct seq_file *m)
|
|||
*/
|
||||
static int read_dt_lpar_name(struct seq_file *m)
|
||||
{
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const char *name;
|
||||
int ret;
|
||||
|
||||
if (of_property_read_string(of_root, "ibm,partition-name", &name))
|
||||
ret = of_property_read_string(root, "ibm,partition-name", &name);
|
||||
of_node_put(root);
|
||||
if (ret)
|
||||
return -ENOENT;
|
||||
|
||||
seq_printf(m, "partition_name=%s\n", name);
|
||||
|
|
|
@ -26,6 +26,7 @@ static int query_token, change_token;
|
|||
#define RTAS_CHANGE_MSI_FN 3
|
||||
#define RTAS_CHANGE_MSIX_FN 4
|
||||
#define RTAS_CHANGE_32MSI_FN 5
|
||||
#define RTAS_CHANGE_32MSIX_FN 6
|
||||
|
||||
/* RTAS Helpers */
|
||||
|
||||
|
@ -41,7 +42,7 @@ static int rtas_change_msi(struct pci_dn *pdn, u32 func, u32 num_irqs)
|
|||
seq_num = 1;
|
||||
do {
|
||||
if (func == RTAS_CHANGE_MSI_FN || func == RTAS_CHANGE_MSIX_FN ||
|
||||
func == RTAS_CHANGE_32MSI_FN)
|
||||
func == RTAS_CHANGE_32MSI_FN || func == RTAS_CHANGE_32MSIX_FN)
|
||||
rc = rtas_call(change_token, 6, 4, rtas_ret, addr,
|
||||
BUID_HI(buid), BUID_LO(buid),
|
||||
func, num_irqs, seq_num);
|
||||
|
@ -406,8 +407,12 @@ again:
|
|||
|
||||
if (use_32bit_msi_hack && rc > 0)
|
||||
rtas_hack_32bit_msi_gen2(pdev);
|
||||
} else
|
||||
rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
|
||||
} else {
|
||||
if (pdev->no_64bit_msi)
|
||||
rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSIX_FN, nvec);
|
||||
else
|
||||
rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
|
||||
}
|
||||
|
||||
if (rc != nvec) {
|
||||
if (nvec != nvec_in) {
|
||||
|
|
|
@ -101,10 +101,12 @@ retry:
|
|||
esi_buf_size = ESI_HDR_SIZE + (CURR_MAX_ESI_ATTRS * max_esi_attrs);
|
||||
|
||||
temp_buf = krealloc(buf, esi_buf_size, GFP_KERNEL);
|
||||
if (temp_buf)
|
||||
if (temp_buf) {
|
||||
buf = temp_buf;
|
||||
else
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
ret = -ENOMEM;
|
||||
goto out_buf;
|
||||
}
|
||||
|
||||
goto retry;
|
||||
}
|
||||
|
|
|
@ -1521,7 +1521,7 @@ err: kfree(p);
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int papr_scm_remove(struct platform_device *pdev)
|
||||
static void papr_scm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct papr_scm_priv *p = platform_get_drvdata(pdev);
|
||||
|
||||
|
@ -1538,8 +1538,6 @@ static int papr_scm_remove(struct platform_device *pdev)
|
|||
pdev->archdata.priv = NULL;
|
||||
kfree(p->bus_desc.provider_name);
|
||||
kfree(p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id papr_scm_match[] = {
|
||||
|
@ -1550,7 +1548,7 @@ static const struct of_device_id papr_scm_match[] = {
|
|||
|
||||
static struct platform_driver papr_scm_driver = {
|
||||
.probe = papr_scm_probe,
|
||||
.remove = papr_scm_remove,
|
||||
.remove_new = papr_scm_remove,
|
||||
.driver = {
|
||||
.name = "papr_scm",
|
||||
.of_match_table = papr_scm_match,
|
||||
|
|
|
@ -1029,9 +1029,11 @@ static void __init pseries_add_hw_description(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (of_property_read_bool(of_root, "ibm,powervm-partition") ||
|
||||
of_property_read_bool(of_root, "ibm,fw-net-version"))
|
||||
dn = of_find_node_by_path("/");
|
||||
if (of_property_read_bool(dn, "ibm,powervm-partition") ||
|
||||
of_property_read_bool(dn, "ibm,fw-net-version"))
|
||||
seq_buf_printf(&ppc_hw_desc, "hv:phyp ");
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1091,7 +1093,11 @@ static void pseries_power_off(void)
|
|||
|
||||
static int __init pSeries_probe(void)
|
||||
{
|
||||
if (!of_node_is_type(of_root, "chrp"))
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
bool ret = of_node_is_type(root, "chrp");
|
||||
|
||||
of_node_put(root);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
/* Cell blades firmware claims to be chrp while it's not. Until this
|
||||
|
|
|
@ -991,18 +991,6 @@ static DEVICE_ATTR_RO(cmo_allocated);
|
|||
static DEVICE_ATTR_RW(cmo_desired);
|
||||
static DEVICE_ATTR_RW(cmo_allocs_failed);
|
||||
|
||||
static struct attribute *vio_cmo_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_devspec.attr,
|
||||
&dev_attr_modalias.attr,
|
||||
&dev_attr_cmo_entitled.attr,
|
||||
&dev_attr_cmo_allocated.attr,
|
||||
&dev_attr_cmo_desired.attr,
|
||||
&dev_attr_cmo_allocs_failed.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(vio_cmo_dev);
|
||||
|
||||
/* sysfs bus functions and data structures for CMO */
|
||||
|
||||
#define viobus_cmo_rd_attr(name) \
|
||||
|
@ -1062,11 +1050,7 @@ static struct attribute *vio_bus_attrs[] = {
|
|||
};
|
||||
ATTRIBUTE_GROUPS(vio_bus);
|
||||
|
||||
static void __init vio_cmo_sysfs_init(void)
|
||||
{
|
||||
vio_bus_type.dev_groups = vio_cmo_dev_groups;
|
||||
vio_bus_type.bus_groups = vio_bus_groups;
|
||||
}
|
||||
static void __init vio_cmo_sysfs_init(void) { }
|
||||
#else /* CONFIG_PPC_SMLPAR */
|
||||
int vio_cmo_entitlement_update(size_t new_entitlement) { return 0; }
|
||||
void vio_cmo_set_dev_desired(struct vio_dev *viodev, size_t desired) {}
|
||||
|
@ -1584,14 +1568,6 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
|
||||
static struct attribute *vio_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_devspec.attr,
|
||||
&dev_attr_modalias.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(vio_dev);
|
||||
|
||||
void vio_unregister_device(struct vio_dev *viodev)
|
||||
{
|
||||
device_unregister(&viodev->dev);
|
||||
|
@ -1626,7 +1602,39 @@ static int vio_hotplug(const struct device *dev, struct kobj_uevent_env *env)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct bus_type vio_bus_type = {
|
||||
#ifdef CONFIG_PPC_SMLPAR
|
||||
static struct attribute *vio_cmo_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_devspec.attr,
|
||||
&dev_attr_modalias.attr,
|
||||
&dev_attr_cmo_entitled.attr,
|
||||
&dev_attr_cmo_allocated.attr,
|
||||
&dev_attr_cmo_desired.attr,
|
||||
&dev_attr_cmo_allocs_failed.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(vio_cmo_dev);
|
||||
|
||||
const struct bus_type vio_bus_type = {
|
||||
.name = "vio",
|
||||
.dev_groups = vio_cmo_dev_groups,
|
||||
.bus_groups = vio_bus_groups,
|
||||
.uevent = vio_hotplug,
|
||||
.match = vio_bus_match,
|
||||
.probe = vio_bus_probe,
|
||||
.remove = vio_bus_remove,
|
||||
.shutdown = vio_bus_shutdown,
|
||||
};
|
||||
#else /* CONFIG_PPC_SMLPAR */
|
||||
static struct attribute *vio_dev_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_devspec.attr,
|
||||
&dev_attr_modalias.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(vio_dev);
|
||||
|
||||
const struct bus_type vio_bus_type = {
|
||||
.name = "vio",
|
||||
.dev_groups = vio_dev_groups,
|
||||
.uevent = vio_hotplug,
|
||||
|
@ -1635,6 +1643,7 @@ struct bus_type vio_bus_type = {
|
|||
.remove = vio_bus_remove,
|
||||
.shutdown = vio_bus_shutdown,
|
||||
};
|
||||
#endif /* CONFIG_PPC_SMLPAR */
|
||||
|
||||
/**
|
||||
* vio_get_attribute: - get attribute for virtual device
|
||||
|
|
|
@ -320,7 +320,7 @@ static irqreturn_t fsl_msi_cascade(int irq, void *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int fsl_of_msi_remove(struct platform_device *ofdev)
|
||||
static void fsl_of_msi_remove(struct platform_device *ofdev)
|
||||
{
|
||||
struct fsl_msi *msi = platform_get_drvdata(ofdev);
|
||||
int virq, i;
|
||||
|
@ -343,8 +343,6 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
|
|||
if ((msi->feature & FSL_PIC_IP_MASK) != FSL_PIC_IP_VMPIC)
|
||||
iounmap(msi->msi_regs);
|
||||
kfree(msi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct lock_class_key fsl_msi_irq_class;
|
||||
|
@ -603,7 +601,7 @@ static struct platform_driver fsl_of_msi_driver = {
|
|||
.of_match_table = fsl_of_msi_ids,
|
||||
},
|
||||
.probe = fsl_of_msi_probe,
|
||||
.remove = fsl_of_msi_remove,
|
||||
.remove_new = fsl_of_msi_remove,
|
||||
};
|
||||
|
||||
static __init int fsl_of_msi_init(void)
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
struct bus_type mpic_subsys = {
|
||||
const struct bus_type mpic_subsys = {
|
||||
.name = "mpic",
|
||||
.dev_name = "mpic",
|
||||
};
|
||||
|
|
|
@ -173,7 +173,7 @@ out:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int pmi_of_remove(struct platform_device *dev)
|
||||
static void pmi_of_remove(struct platform_device *dev)
|
||||
{
|
||||
struct pmi_handler *handler, *tmp;
|
||||
|
||||
|
@ -189,13 +189,11 @@ static int pmi_of_remove(struct platform_device *dev)
|
|||
|
||||
kfree(data);
|
||||
data = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver pmi_of_platform_driver = {
|
||||
.probe = pmi_of_probe,
|
||||
.remove = pmi_of_remove,
|
||||
.remove_new = pmi_of_remove,
|
||||
.driver = {
|
||||
.name = "pmi",
|
||||
.of_match_table = pmi_match,
|
||||
|
|
|
@ -643,10 +643,8 @@ static int xmon_core(struct pt_regs *regs, volatile int fromipi)
|
|||
touch_nmi_watchdog();
|
||||
} else {
|
||||
cmd = 1;
|
||||
#ifdef CONFIG_SMP
|
||||
if (xmon_batch)
|
||||
cmd = batch_cmds(regs);
|
||||
#endif
|
||||
if (!locked_down && cmd)
|
||||
cmd = cmds(regs);
|
||||
if (locked_down || cmd != 0) {
|
||||
|
@ -1820,8 +1818,8 @@ static void print_bug_trap(struct pt_regs *regs)
|
|||
const struct bug_entry *bug;
|
||||
unsigned long addr;
|
||||
|
||||
if (regs->msr & MSR_PR)
|
||||
return; /* not in kernel */
|
||||
if (user_mode(regs))
|
||||
return;
|
||||
addr = regs->nip; /* address of trap instruction */
|
||||
if (!is_kernel_addr(addr))
|
||||
return;
|
||||
|
|
|
@ -1188,7 +1188,7 @@ static int pata_macio_attach(struct macio_dev *mdev,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int pata_macio_detach(struct macio_dev *mdev)
|
||||
static void pata_macio_detach(struct macio_dev *mdev)
|
||||
{
|
||||
struct ata_host *host = macio_get_drvdata(mdev);
|
||||
struct pata_macio_priv *priv = host->private_data;
|
||||
|
@ -1203,8 +1203,6 @@ static int pata_macio_detach(struct macio_dev *mdev)
|
|||
ata_host_detach(host);
|
||||
|
||||
unlock_media_bay(priv->mdev->media_bay);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
|
|
@ -74,7 +74,9 @@ static struct adb_driver *adb_driver_list[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct class *adb_dev_class;
|
||||
static const struct class adb_dev_class = {
|
||||
.name = "adb",
|
||||
};
|
||||
|
||||
static struct adb_driver *adb_controller;
|
||||
BLOCKING_NOTIFIER_HEAD(adb_client_list);
|
||||
|
@ -888,10 +890,10 @@ adbdev_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
adb_dev_class = class_create("adb");
|
||||
if (IS_ERR(adb_dev_class))
|
||||
if (class_register(&adb_dev_class))
|
||||
return;
|
||||
device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
|
||||
|
||||
device_create(&adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
|
||||
|
||||
platform_device_register(&adb_pfdev);
|
||||
platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
|
||||
|
|
|
@ -136,7 +136,7 @@ static int macio_device_modalias(const struct device *dev, struct kobj_uevent_en
|
|||
|
||||
extern const struct attribute_group *macio_dev_groups[];
|
||||
|
||||
struct bus_type macio_bus_type = {
|
||||
const struct bus_type macio_bus_type = {
|
||||
.name = "macio",
|
||||
.match = macio_bus_match,
|
||||
.uevent = macio_device_modalias,
|
||||
|
|
|
@ -523,7 +523,7 @@ static int rackmeter_probe(struct macio_dev* mdev,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int rackmeter_remove(struct macio_dev* mdev)
|
||||
static void rackmeter_remove(struct macio_dev *mdev)
|
||||
{
|
||||
struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
|
||||
|
||||
|
@ -558,8 +558,6 @@ static int rackmeter_remove(struct macio_dev* mdev)
|
|||
|
||||
/* Get rid of me */
|
||||
kfree(rm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rackmeter_shutdown(struct macio_dev* mdev)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue