powerpc fixes for 4.8 #4
Andrew Donnellan (1): cxl: use pcibios_free_controller_deferred() when removing vPHBs Andrzej Hajda (1): powerpc/powernv/pci: fix iterator signedness Boqun Feng (1): powerpc, hotplug: Avoid to touch non-existent cpumasks. Christophe Leroy (1): powerpc: sysdev: cpm: fix gpio save_regs functions Cyril Bur (1): powerpc: signals: Discard transaction state from signal frames Guenter Roeck (1): powerpc: cputhreads: Add missing include file Markus Elfring (3): drivers/macintosh: Delete owner assignment powerpc/512x: Delete unnecessary assignment for the field "owner" powerpc: mpc8349emitx: Delete unnecessary assignment for the field "owner" Mauricio Faria de Oliveira (1): powerpc/pseries: use pci_host_bridge.release_fn() to kfree(phb) Michael Ellerman (1): powerpc/prom: Fix sub-processor option passed to ibm, client-architecture-support Mukesh Ojha (1): powerpc/powernv : Drop reference added by kset_find_obj() Nicholas Piggin (3): powerpc/pseries: PACA save area fix for general exception vs MCE powerpc/pseries: PACA save area fix for MCE vs MCE powerpc/tm: do not use r13 for tabort_syscall Paolo Bonzini (1): powerpc: move hmi.c to arch/powerpc/kvm/ Paul Gortmaker (1): powerpc: migrate exception table users off module.h and onto extable.h -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJXw7jmAAoJEHM62YSLdExeu6YP+gMNWkW4CDjvIo8OsVMhYKqX RP3c6xa8APcizfdxssKMwX+STP6nfEzRUMCsDMmChSSpb1ZtSNdwM2t2zmlLDe8r wKHN7Chqw1EJsnIT6TLa79fvHft03MyGQCTjeRvr54aFcTVJHuAgZnTeuejFBrtN hHCsO/pEv+KjgGlDkN+UvEMUs0quI5Ri8kRJpDxO6il1agcPpeYFYB3ksIcgwaVH 0X/MwLJbzENmiDLhtb3S0jQWGMijmpPbcz5b3z36gIpTxddEPnC9UhYCdc924V/C sREuku7rihXDEda6B/qNpk8kOxXxIkE/dh5eWVMyWVDHIXJA6hy4z0zpoF9xe4Ba H2/ERyCfsP3LqonOpDOWKs/tkTAmMXOwdfgr+geoc4vDsbR2X8jyjHqb3bdj7J2A YtcjmQ/w9HCnzC0weme1+0xR2tfyjUciNOdNoRHP/shLAObzc14xXlpg0IZ3eou2 oozGqkHnGoA6SrsqezF0UmsAf3884BcVscY1N45p1s8ulMRkyHTgPHM8KnGpHoHq 1zgUZji2F4VFgjGrMJyMZ82c3usP3/N65d2nkvRv/QzkmdTat4OmXLiB0Qky26Wy gW7GsyRpGdEvW/KxhLxuobxPw7xg4mGQ3MdUMWzL3Df17IuRquuFhjljeQIUsQDE I7NVfZATWJ7mqJQU2s5L =+1I0 -----END PGP SIGNATURE----- Merge tag 'powerpc-4.8-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fixes from Ben Herrenschmidt: "This was meant to be sent early last week, but I has a change pending on one of the fixes and other things made me forget all about. Ugh. We have some misc fixes for powerpc 4.8. Some trivial bits and some regressions, and a trivial cleanup or two that I saw no point in letting rot in patchwork" * tag 'powerpc-4.8-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc: signals: Discard transaction state from signal frames powerpc/powernv : Drop reference added by kset_find_obj() powerpc/tm: do not use r13 for tabort_syscall powerpc: move hmi.c to arch/powerpc/kvm/ powerpc: sysdev: cpm: fix gpio save_regs functions powerpc/pseries: PACA save area fix for MCE vs MCE powerpc/pseries: PACA save area fix for general exception vs MCE powerpc/prom: Fix sub-processor option passed to ibm, client-architecture-support powerpc, hotplug: Avoid to touch non-existent cpumasks. powerpc: migrate exception table users off module.h and onto extable.h powerpc/powernv/pci: fix iterator signedness powerpc/pseries: use pci_host_bridge.release_fn() to kfree(phb) cxl: use pcibios_free_controller_deferred() when removing vPHBs powerpc: mpc8349emitx: Delete unnecessary assignment for the field "owner" powerpc/512x: Delete unnecessary assignment for the field "owner" drivers/macintosh: Delete owner assignment powerpc: cputhreads: Add missing include file
This commit is contained in:
commit
2a90309e06
36 changed files with 160 additions and 43 deletions
|
@ -167,6 +167,8 @@ signal will be rolled back anyway.
|
||||||
For signals taken in non-TM or suspended mode, we use the
|
For signals taken in non-TM or suspended mode, we use the
|
||||||
normal/non-checkpointed stack pointer.
|
normal/non-checkpointed stack pointer.
|
||||||
|
|
||||||
|
Any transaction initiated inside a sighandler and suspended on return
|
||||||
|
from the sighandler to the kernel will get reclaimed and discarded.
|
||||||
|
|
||||||
Failure cause codes used by kernel
|
Failure cause codes used by kernel
|
||||||
==================================
|
==================================
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
|
#include <asm/cpu_has_feature.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mapping of threads to cores
|
* Mapping of threads to cores
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#ifndef __ASM_PPC64_HMI_H__
|
#ifndef __ASM_PPC64_HMI_H__
|
||||||
#define __ASM_PPC64_HMI_H__
|
#define __ASM_PPC64_HMI_H__
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||||
|
|
||||||
#define CORE_TB_RESYNC_REQ_BIT 63
|
#define CORE_TB_RESYNC_REQ_BIT 63
|
||||||
#define MAX_SUBCORE_PER_CORE 4
|
#define MAX_SUBCORE_PER_CORE 4
|
||||||
|
|
|
@ -183,11 +183,6 @@ struct paca_struct {
|
||||||
*/
|
*/
|
||||||
u16 in_mce;
|
u16 in_mce;
|
||||||
u8 hmi_event_available; /* HMI event is available */
|
u8 hmi_event_available; /* HMI event is available */
|
||||||
/*
|
|
||||||
* Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for
|
|
||||||
* more details
|
|
||||||
*/
|
|
||||||
struct sibling_subcore_state *sibling_subcore_state;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Stuff for accurate time accounting */
|
/* Stuff for accurate time accounting */
|
||||||
|
@ -202,6 +197,13 @@ struct paca_struct {
|
||||||
struct kvmppc_book3s_shadow_vcpu shadow_vcpu;
|
struct kvmppc_book3s_shadow_vcpu shadow_vcpu;
|
||||||
#endif
|
#endif
|
||||||
struct kvmppc_host_state kvm_hstate;
|
struct kvmppc_host_state kvm_hstate;
|
||||||
|
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||||
|
/*
|
||||||
|
* Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for
|
||||||
|
* more details
|
||||||
|
*/
|
||||||
|
struct sibling_subcore_state *sibling_subcore_state;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -301,6 +301,7 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||||
/* Allocate & free a PCI host bridge structure */
|
/* Allocate & free a PCI host bridge structure */
|
||||||
extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
|
extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
|
||||||
extern void pcibios_free_controller(struct pci_controller *phb);
|
extern void pcibios_free_controller(struct pci_controller *phb);
|
||||||
|
extern void pcibios_free_controller_deferred(struct pci_host_bridge *bridge);
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
extern int pcibios_vaddr_is_ioport(void __iomem *address);
|
extern int pcibios_vaddr_is_ioport(void __iomem *address);
|
||||||
|
|
|
@ -41,7 +41,7 @@ obj-$(CONFIG_VDSO32) += vdso32/
|
||||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
|
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
|
||||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o
|
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o
|
||||||
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o hmi.o
|
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o
|
||||||
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o
|
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o
|
||||||
obj-$(CONFIG_PPC64) += vdso64/
|
obj-$(CONFIG_PPC64) += vdso64/
|
||||||
obj-$(CONFIG_ALTIVEC) += vecemu.o
|
obj-$(CONFIG_ALTIVEC) += vecemu.o
|
||||||
|
|
|
@ -368,13 +368,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||||
tabort_syscall:
|
tabort_syscall:
|
||||||
/* Firstly we need to enable TM in the kernel */
|
/* Firstly we need to enable TM in the kernel */
|
||||||
mfmsr r10
|
mfmsr r10
|
||||||
li r13, 1
|
li r9, 1
|
||||||
rldimi r10, r13, MSR_TM_LG, 63-MSR_TM_LG
|
rldimi r10, r9, MSR_TM_LG, 63-MSR_TM_LG
|
||||||
mtmsrd r10, 0
|
mtmsrd r10, 0
|
||||||
|
|
||||||
/* tabort, this dooms the transaction, nothing else */
|
/* tabort, this dooms the transaction, nothing else */
|
||||||
li r13, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
li r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
||||||
TABORT(R13)
|
TABORT(R9)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return directly to userspace. We have corrupted user register state,
|
* Return directly to userspace. We have corrupted user register state,
|
||||||
|
@ -382,8 +382,8 @@ tabort_syscall:
|
||||||
* resume after the tbegin of the aborted transaction with the
|
* resume after the tbegin of the aborted transaction with the
|
||||||
* checkpointed register state.
|
* checkpointed register state.
|
||||||
*/
|
*/
|
||||||
li r13, MSR_RI
|
li r9, MSR_RI
|
||||||
andc r10, r10, r13
|
andc r10, r10, r9
|
||||||
mtmsrd r10, 1
|
mtmsrd r10, 1
|
||||||
mtspr SPRN_SRR0, r11
|
mtspr SPRN_SRR0, r11
|
||||||
mtspr SPRN_SRR1, r12
|
mtspr SPRN_SRR1, r12
|
||||||
|
|
|
@ -485,7 +485,23 @@ machine_check_fwnmi:
|
||||||
EXCEPTION_PROLOG_0(PACA_EXMC)
|
EXCEPTION_PROLOG_0(PACA_EXMC)
|
||||||
machine_check_pSeries_0:
|
machine_check_pSeries_0:
|
||||||
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
||||||
EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
|
/*
|
||||||
|
* The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
|
||||||
|
* difference that MSR_RI is not enabled, because PACA_EXMC is being
|
||||||
|
* used, so nested machine check corrupts it. machine_check_common
|
||||||
|
* enables MSR_RI.
|
||||||
|
*/
|
||||||
|
ld r12,PACAKBASE(r13)
|
||||||
|
ld r10,PACAKMSR(r13)
|
||||||
|
xori r10,r10,MSR_RI
|
||||||
|
mfspr r11,SPRN_SRR0
|
||||||
|
LOAD_HANDLER(r12, machine_check_common)
|
||||||
|
mtspr SPRN_SRR0,r12
|
||||||
|
mfspr r12,SPRN_SRR1
|
||||||
|
mtspr SPRN_SRR1,r10
|
||||||
|
rfid
|
||||||
|
b . /* prevent speculative execution */
|
||||||
|
|
||||||
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
||||||
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
||||||
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
||||||
|
@ -969,14 +985,17 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
||||||
machine_check_common:
|
machine_check_common:
|
||||||
|
|
||||||
mfspr r10,SPRN_DAR
|
mfspr r10,SPRN_DAR
|
||||||
std r10,PACA_EXGEN+EX_DAR(r13)
|
std r10,PACA_EXMC+EX_DAR(r13)
|
||||||
mfspr r10,SPRN_DSISR
|
mfspr r10,SPRN_DSISR
|
||||||
stw r10,PACA_EXGEN+EX_DSISR(r13)
|
stw r10,PACA_EXMC+EX_DSISR(r13)
|
||||||
EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
|
EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
|
||||||
FINISH_NAP
|
FINISH_NAP
|
||||||
RECONCILE_IRQ_STATE(r10, r11)
|
RECONCILE_IRQ_STATE(r10, r11)
|
||||||
ld r3,PACA_EXGEN+EX_DAR(r13)
|
ld r3,PACA_EXMC+EX_DAR(r13)
|
||||||
lwz r4,PACA_EXGEN+EX_DSISR(r13)
|
lwz r4,PACA_EXMC+EX_DSISR(r13)
|
||||||
|
/* Enable MSR_RI when finished with PACA_EXMC */
|
||||||
|
li r10,MSR_RI
|
||||||
|
mtmsrd r10,1
|
||||||
std r3,_DAR(r1)
|
std r3,_DAR(r1)
|
||||||
std r4,_DSISR(r1)
|
std r4,_DSISR(r1)
|
||||||
bl save_nvgprs
|
bl save_nvgprs
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <asm/code-patching.h>
|
#include <asm/code-patching.h>
|
||||||
|
|
|
@ -153,6 +153,42 @@ void pcibios_free_controller(struct pci_controller *phb)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pcibios_free_controller);
|
EXPORT_SYMBOL_GPL(pcibios_free_controller);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is used to call pcibios_free_controller()
|
||||||
|
* in a deferred manner: a callback from the PCI subsystem.
|
||||||
|
*
|
||||||
|
* _*DO NOT*_ call pcibios_free_controller() explicitly if
|
||||||
|
* this is used (or it may access an invalid *phb pointer).
|
||||||
|
*
|
||||||
|
* The callback occurs when all references to the root bus
|
||||||
|
* are dropped (e.g., child buses/devices and their users).
|
||||||
|
*
|
||||||
|
* It's called as .release_fn() of 'struct pci_host_bridge'
|
||||||
|
* which is associated with the 'struct pci_controller.bus'
|
||||||
|
* (root bus) - it expects .release_data to hold a pointer
|
||||||
|
* to 'struct pci_controller'.
|
||||||
|
*
|
||||||
|
* In order to use it, register .release_fn()/release_data
|
||||||
|
* like this:
|
||||||
|
*
|
||||||
|
* pci_set_host_bridge_release(bridge,
|
||||||
|
* pcibios_free_controller_deferred
|
||||||
|
* (void *) phb);
|
||||||
|
*
|
||||||
|
* e.g. in the pcibios_root_bridge_prepare() callback from
|
||||||
|
* pci_create_root_bus().
|
||||||
|
*/
|
||||||
|
void pcibios_free_controller_deferred(struct pci_host_bridge *bridge)
|
||||||
|
{
|
||||||
|
struct pci_controller *phb = (struct pci_controller *)
|
||||||
|
bridge->release_data;
|
||||||
|
|
||||||
|
pr_debug("domain %d, dynamic %d\n", phb->global_number, phb->is_dynamic);
|
||||||
|
|
||||||
|
pcibios_free_controller(phb);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pcibios_free_controller_deferred);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The function is used to return the minimal alignment
|
* The function is used to return the minimal alignment
|
||||||
* for memory or I/O windows of the associated P2P bridge.
|
* for memory or I/O windows of the associated P2P bridge.
|
||||||
|
|
|
@ -695,7 +695,7 @@ unsigned char ibm_architecture_vec[] = {
|
||||||
OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */
|
OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */
|
||||||
|
|
||||||
/* option vector 5: PAPR/OF options */
|
/* option vector 5: PAPR/OF options */
|
||||||
VECTOR_LENGTH(18), /* length */
|
VECTOR_LENGTH(21), /* length */
|
||||||
0, /* don't ignore, don't halt */
|
0, /* don't ignore, don't halt */
|
||||||
OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
|
OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
|
||||||
OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
|
OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
|
||||||
|
@ -726,8 +726,11 @@ unsigned char ibm_architecture_vec[] = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
|
OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
|
||||||
OV5_FEAT(OV5_PFO_HW_842),
|
OV5_FEAT(OV5_PFO_HW_842), /* Byte 17 */
|
||||||
OV5_FEAT(OV5_SUB_PROCESSORS),
|
0, /* Byte 18 */
|
||||||
|
0, /* Byte 19 */
|
||||||
|
0, /* Byte 20 */
|
||||||
|
OV5_FEAT(OV5_SUB_PROCESSORS), /* Byte 21 */
|
||||||
|
|
||||||
/* option vector 6: IBM PAPR hints */
|
/* option vector 6: IBM PAPR hints */
|
||||||
VECTOR_LENGTH(3), /* length */
|
VECTOR_LENGTH(3), /* length */
|
||||||
|
|
|
@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
||||||
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
||||||
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||||
|
/*
|
||||||
|
* If there is a transactional state then throw it away.
|
||||||
|
* The purpose of a sigreturn is to destroy all traces of the
|
||||||
|
* signal frame, this includes any transactional state created
|
||||||
|
* within in. We only check for suspended as we can never be
|
||||||
|
* active in the kernel, we are active, there is nothing better to
|
||||||
|
* do than go ahead and Bad Thing later.
|
||||||
|
* The cause is not important as there will never be a
|
||||||
|
* recheckpoint so it's not user visible.
|
||||||
|
*/
|
||||||
|
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||||
|
tm_reclaim_current(0);
|
||||||
|
|
||||||
if (__get_user(tmp, &rt_sf->uc.uc_link))
|
if (__get_user(tmp, &rt_sf->uc.uc_link))
|
||||||
goto bad;
|
goto bad;
|
||||||
uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
|
uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
|
||||||
|
|
|
@ -676,7 +676,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||||
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
set_current_blocked(&set);
|
set_current_blocked(&set);
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||||
|
/*
|
||||||
|
* If there is a transactional state then throw it away.
|
||||||
|
* The purpose of a sigreturn is to destroy all traces of the
|
||||||
|
* signal frame, this includes any transactional state created
|
||||||
|
* within in. We only check for suspended as we can never be
|
||||||
|
* active in the kernel, we are active, there is nothing better to
|
||||||
|
* do than go ahead and Bad Thing later.
|
||||||
|
* The cause is not important as there will never be a
|
||||||
|
* recheckpoint so it's not user visible.
|
||||||
|
*/
|
||||||
|
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||||
|
tm_reclaim_current(0);
|
||||||
|
|
||||||
if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
|
if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
if (MSR_TM_ACTIVE(msr)) {
|
if (MSR_TM_ACTIVE(msr)) {
|
||||||
|
|
|
@ -830,7 +830,7 @@ int __cpu_disable(void)
|
||||||
|
|
||||||
/* Update sibling maps */
|
/* Update sibling maps */
|
||||||
base = cpu_first_thread_sibling(cpu);
|
base = cpu_first_thread_sibling(cpu);
|
||||||
for (i = 0; i < threads_per_core; i++) {
|
for (i = 0; i < threads_per_core && base + i < nr_cpu_ids; i++) {
|
||||||
cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i));
|
cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i));
|
||||||
cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu));
|
cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu));
|
||||||
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
||||||
|
|
|
@ -25,7 +25,8 @@
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
|
#include <linux/module.h> /* print_modules */
|
||||||
#include <linux/prctl.h>
|
#include <linux/prctl.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
|
|
|
@ -78,6 +78,7 @@ kvm-book3s_64-builtin-xics-objs-$(CONFIG_KVM_XICS) := \
|
||||||
|
|
||||||
ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||||
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \
|
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \
|
||||||
|
book3s_hv_hmi.o \
|
||||||
book3s_hv_rmhandlers.o \
|
book3s_hv_rmhandlers.o \
|
||||||
book3s_hv_rm_mmu.o \
|
book3s_hv_rm_mmu.o \
|
||||||
book3s_hv_ras.o \
|
book3s_hv_ras.o \
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
|
|
@ -528,7 +528,6 @@ static struct platform_driver mpc512x_lpbfifo_driver = {
|
||||||
.remove = mpc512x_lpbfifo_remove,
|
.remove = mpc512x_lpbfifo_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.of_match_table = mpc512x_lpbfifo_match,
|
.of_match_table = mpc512x_lpbfifo_match,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -222,7 +222,6 @@ static const struct of_device_id mcu_of_match_table[] = {
|
||||||
static struct i2c_driver mcu_driver = {
|
static struct i2c_driver mcu_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "mcu-mpc8349emitx",
|
.name = "mcu-mpc8349emitx",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.of_match_table = mcu_of_match_table,
|
.of_match_table = mcu_of_match_table,
|
||||||
},
|
},
|
||||||
.probe = mcu_probe,
|
.probe = mcu_probe,
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/kdev_t.h>
|
#include <linux/kdev_t.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
|
|
@ -370,6 +370,7 @@ static irqreturn_t process_dump(int irq, void *data)
|
||||||
uint32_t dump_id, dump_size, dump_type;
|
uint32_t dump_id, dump_size, dump_type;
|
||||||
struct dump_obj *dump;
|
struct dump_obj *dump;
|
||||||
char name[22];
|
char name[22];
|
||||||
|
struct kobject *kobj;
|
||||||
|
|
||||||
rc = dump_read_info(&dump_id, &dump_size, &dump_type);
|
rc = dump_read_info(&dump_id, &dump_size, &dump_type);
|
||||||
if (rc != OPAL_SUCCESS)
|
if (rc != OPAL_SUCCESS)
|
||||||
|
@ -381,8 +382,12 @@ static irqreturn_t process_dump(int irq, void *data)
|
||||||
* that gracefully and not create two conflicting
|
* that gracefully and not create two conflicting
|
||||||
* entries.
|
* entries.
|
||||||
*/
|
*/
|
||||||
if (kset_find_obj(dump_kset, name))
|
kobj = kset_find_obj(dump_kset, name);
|
||||||
|
if (kobj) {
|
||||||
|
/* Drop reference added by kset_find_obj() */
|
||||||
|
kobject_put(kobj);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dump = create_dump_obj(dump_id, dump_size, dump_type);
|
dump = create_dump_obj(dump_id, dump_size, dump_type);
|
||||||
if (!dump)
|
if (!dump)
|
||||||
|
|
|
@ -247,6 +247,7 @@ static irqreturn_t elog_event(int irq, void *data)
|
||||||
uint64_t elog_type;
|
uint64_t elog_type;
|
||||||
int rc;
|
int rc;
|
||||||
char name[2+16+1];
|
char name[2+16+1];
|
||||||
|
struct kobject *kobj;
|
||||||
|
|
||||||
rc = opal_get_elog_size(&id, &size, &type);
|
rc = opal_get_elog_size(&id, &size, &type);
|
||||||
if (rc != OPAL_SUCCESS) {
|
if (rc != OPAL_SUCCESS) {
|
||||||
|
@ -269,8 +270,12 @@ static irqreturn_t elog_event(int irq, void *data)
|
||||||
* that gracefully and not create two conflicting
|
* that gracefully and not create two conflicting
|
||||||
* entries.
|
* entries.
|
||||||
*/
|
*/
|
||||||
if (kset_find_obj(elog_kset, name))
|
kobj = kset_find_obj(elog_kset, name);
|
||||||
|
if (kobj) {
|
||||||
|
/* Drop reference added by kset_find_obj() */
|
||||||
|
kobject_put(kobj);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
create_elog_obj(log_id, elog_size, elog_type);
|
create_elog_obj(log_id, elog_size, elog_type);
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,7 @@ static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no)
|
||||||
|
|
||||||
static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb)
|
static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb)
|
||||||
{
|
{
|
||||||
unsigned long pe = phb->ioda.total_pe_num - 1;
|
long pe;
|
||||||
|
|
||||||
for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) {
|
for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) {
|
||||||
if (!test_and_set_bit(pe, phb->ioda.pe_alloc))
|
if (!test_and_set_bit(pe, phb->ioda.pe_alloc))
|
||||||
|
|
|
@ -119,6 +119,10 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
|
||||||
|
|
||||||
bus = bridge->bus;
|
bus = bridge->bus;
|
||||||
|
|
||||||
|
/* Rely on the pcibios_free_controller_deferred() callback. */
|
||||||
|
pci_set_host_bridge_release(bridge, pcibios_free_controller_deferred,
|
||||||
|
(void *) pci_bus_to_host(bus));
|
||||||
|
|
||||||
dn = pcibios_get_phb_of_node(bus);
|
dn = pcibios_get_phb_of_node(bus);
|
||||||
if (!dn)
|
if (!dn)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -106,8 +106,11 @@ int remove_phb_dynamic(struct pci_controller *phb)
|
||||||
release_resource(res);
|
release_resource(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free pci_controller data structure */
|
/*
|
||||||
pcibios_free_controller(phb);
|
* The pci_controller data structure is freed by
|
||||||
|
* the pcibios_free_controller_deferred() callback;
|
||||||
|
* see pseries_root_bridge_prepare().
|
||||||
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -534,7 +534,8 @@ struct cpm1_gpio16_chip {
|
||||||
|
|
||||||
static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
|
static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||||
{
|
{
|
||||||
struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
|
struct cpm1_gpio16_chip *cpm1_gc =
|
||||||
|
container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc);
|
||||||
struct cpm_ioport16 __iomem *iop = mm_gc->regs;
|
struct cpm_ioport16 __iomem *iop = mm_gc->regs;
|
||||||
|
|
||||||
cpm1_gc->cpdata = in_be16(&iop->dat);
|
cpm1_gc->cpdata = in_be16(&iop->dat);
|
||||||
|
@ -649,7 +650,8 @@ struct cpm1_gpio32_chip {
|
||||||
|
|
||||||
static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||||
{
|
{
|
||||||
struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
|
struct cpm1_gpio32_chip *cpm1_gc =
|
||||||
|
container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc);
|
||||||
struct cpm_ioport32b __iomem *iop = mm_gc->regs;
|
struct cpm_ioport32b __iomem *iop = mm_gc->regs;
|
||||||
|
|
||||||
cpm1_gc->cpdata = in_be32(&iop->dat);
|
cpm1_gc->cpdata = in_be32(&iop->dat);
|
||||||
|
|
|
@ -94,7 +94,8 @@ struct cpm2_gpio32_chip {
|
||||||
|
|
||||||
static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||||
{
|
{
|
||||||
struct cpm2_gpio32_chip *cpm2_gc = gpiochip_get_data(&mm_gc->gc);
|
struct cpm2_gpio32_chip *cpm2_gc =
|
||||||
|
container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
|
||||||
struct cpm2_ioports __iomem *iop = mm_gc->regs;
|
struct cpm2_ioports __iomem *iop = mm_gc->regs;
|
||||||
|
|
||||||
cpm2_gc->cpdata = in_be32(&iop->dat);
|
cpm2_gc->cpdata = in_be32(&iop->dat);
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
|
@ -73,7 +73,6 @@ MODULE_DEVICE_TABLE(i2c, ams_id);
|
||||||
static struct i2c_driver ams_i2c_driver = {
|
static struct i2c_driver ams_i2c_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "ams",
|
.name = "ams",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
},
|
},
|
||||||
.probe = ams_i2c_probe,
|
.probe = ams_i2c_probe,
|
||||||
.remove = ams_i2c_remove,
|
.remove = ams_i2c_remove,
|
||||||
|
|
|
@ -668,7 +668,6 @@ static struct platform_driver wf_pm112_driver = {
|
||||||
.remove = wf_pm112_remove,
|
.remove = wf_pm112_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "windfarm",
|
.name = "windfarm",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -789,7 +789,6 @@ static struct platform_driver wf_pm72_driver = {
|
||||||
.remove = wf_pm72_remove,
|
.remove = wf_pm72_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "windfarm",
|
.name = "windfarm",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -682,7 +682,6 @@ static struct platform_driver wf_rm31_driver = {
|
||||||
.remove = wf_rm31_remove,
|
.remove = wf_rm31_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "windfarm",
|
.name = "windfarm",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,11 @@ int cxl_pci_vphb_add(struct cxl_afu *afu)
|
||||||
if (phb->bus == NULL)
|
if (phb->bus == NULL)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
|
/* Set release hook on root bus */
|
||||||
|
pci_set_host_bridge_release(to_pci_host_bridge(phb->bus->bridge),
|
||||||
|
pcibios_free_controller_deferred,
|
||||||
|
(void *) phb);
|
||||||
|
|
||||||
/* Claim resources. This might need some rework as well depending
|
/* Claim resources. This might need some rework as well depending
|
||||||
* whether we are doing probe-only or not, like assigning unassigned
|
* whether we are doing probe-only or not, like assigning unassigned
|
||||||
* resources etc...
|
* resources etc...
|
||||||
|
@ -256,7 +261,10 @@ void cxl_pci_vphb_remove(struct cxl_afu *afu)
|
||||||
afu->phb = NULL;
|
afu->phb = NULL;
|
||||||
|
|
||||||
pci_remove_root_bus(phb->bus);
|
pci_remove_root_bus(phb->bus);
|
||||||
pcibios_free_controller(phb);
|
/*
|
||||||
|
* We don't free phb here - that's handled by
|
||||||
|
* pcibios_free_controller_deferred()
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _cxl_pci_is_vphb_device(struct pci_controller *phb)
|
static bool _cxl_pci_is_vphb_device(struct pci_controller *phb)
|
||||||
|
|
|
@ -44,6 +44,7 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
|
||||||
bridge->release_fn = release_fn;
|
bridge->release_fn = release_fn;
|
||||||
bridge->release_data = release_data;
|
bridge->release_data = release_data;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_set_host_bridge_release);
|
||||||
|
|
||||||
void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
|
void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
|
||||||
struct resource *res)
|
struct resource *res)
|
||||||
|
|
Loading…
Reference in a new issue