Merge branch 'topic/ppc-kvm' into next
Merge our topic branch shared with KVM. In particular this includes the rewrite of the idle code into C.
This commit is contained in:
@@ -27,10 +27,11 @@
|
||||
* the THREAD_WINKLE_BITS are set, which indicate which threads have not
|
||||
* yet woken from the winkle state.
|
||||
*/
|
||||
#define PNV_CORE_IDLE_LOCK_BIT 0x10000000
|
||||
#define NR_PNV_CORE_IDLE_LOCK_BIT 28
|
||||
#define PNV_CORE_IDLE_LOCK_BIT (1ULL << NR_PNV_CORE_IDLE_LOCK_BIT)
|
||||
|
||||
#define PNV_CORE_IDLE_WINKLE_COUNT_SHIFT 16
|
||||
#define PNV_CORE_IDLE_WINKLE_COUNT 0x00010000
|
||||
#define PNV_CORE_IDLE_WINKLE_COUNT_ALL_BIT 0x00080000
|
||||
#define PNV_CORE_IDLE_WINKLE_COUNT_BITS 0x000F0000
|
||||
#define PNV_CORE_IDLE_THREAD_WINKLE_BITS_SHIFT 8
|
||||
#define PNV_CORE_IDLE_THREAD_WINKLE_BITS 0x0000FF00
|
||||
@@ -68,16 +69,6 @@
|
||||
#define ERR_DEEP_STATE_ESL_MISMATCH -2
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Additional SPRs that need to be saved/restored during stop */
|
||||
struct stop_sprs {
|
||||
u64 pid;
|
||||
u64 ldbar;
|
||||
u64 fscr;
|
||||
u64 hfscr;
|
||||
u64 mmcr1;
|
||||
u64 mmcr2;
|
||||
u64 mmcra;
|
||||
};
|
||||
|
||||
#define PNV_IDLE_NAME_LEN 16
|
||||
struct pnv_idle_states_t {
|
||||
@@ -92,10 +83,6 @@ struct pnv_idle_states_t {
|
||||
|
||||
extern struct pnv_idle_states_t *pnv_idle_states;
|
||||
extern int nr_pnv_idle_states;
|
||||
extern u32 pnv_fastsleep_workaround_at_entry[];
|
||||
extern u32 pnv_fastsleep_workaround_at_exit[];
|
||||
|
||||
extern u64 pnv_first_deep_stop_state;
|
||||
|
||||
unsigned long pnv_cpu_offline(unsigned int cpu);
|
||||
int validate_psscr_val_mask(u64 *psscr_val, u64 *psscr_mask, u32 flags);
|
||||
|
@@ -90,10 +90,18 @@ static inline void hw_breakpoint_disable(void)
|
||||
extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs);
|
||||
int hw_breakpoint_handler(struct die_args *args);
|
||||
|
||||
extern int set_dawr(struct arch_hw_breakpoint *brk);
|
||||
extern bool dawr_force_enable;
|
||||
static inline bool dawr_enabled(void)
|
||||
{
|
||||
return dawr_force_enable;
|
||||
}
|
||||
|
||||
#else /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
static inline void hw_breakpoint_disable(void) { }
|
||||
static inline void thread_change_pc(struct task_struct *tsk,
|
||||
struct pt_regs *regs) { }
|
||||
static inline bool dawr_enabled(void) { return false; }
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _PPC_BOOK3S_64_HW_BREAKPOINT_H */
|
||||
|
@@ -186,8 +186,8 @@
|
||||
#define OPAL_XIVE_FREE_IRQ 140
|
||||
#define OPAL_XIVE_SYNC 141
|
||||
#define OPAL_XIVE_DUMP 142
|
||||
#define OPAL_XIVE_RESERVED3 143
|
||||
#define OPAL_XIVE_RESERVED4 144
|
||||
#define OPAL_XIVE_GET_QUEUE_STATE 143
|
||||
#define OPAL_XIVE_SET_QUEUE_STATE 144
|
||||
#define OPAL_SIGNAL_SYSTEM_RESET 145
|
||||
#define OPAL_NPU_INIT_CONTEXT 146
|
||||
#define OPAL_NPU_DESTROY_CONTEXT 147
|
||||
@@ -210,7 +210,8 @@
|
||||
#define OPAL_PCI_GET_PBCQ_TUNNEL_BAR 164
|
||||
#define OPAL_PCI_SET_PBCQ_TUNNEL_BAR 165
|
||||
#define OPAL_NX_COPROC_INIT 167
|
||||
#define OPAL_LAST 167
|
||||
#define OPAL_XIVE_GET_VP_STATE 170
|
||||
#define OPAL_LAST 170
|
||||
|
||||
#define QUIESCE_HOLD 1 /* Spin all calls at entry */
|
||||
#define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */
|
||||
|
@@ -279,6 +279,13 @@ int64_t opal_xive_allocate_irq(uint32_t chip_id);
|
||||
int64_t opal_xive_free_irq(uint32_t girq);
|
||||
int64_t opal_xive_sync(uint32_t type, uint32_t id);
|
||||
int64_t opal_xive_dump(uint32_t type, uint32_t id);
|
||||
int64_t opal_xive_get_queue_state(uint64_t vp, uint32_t prio,
|
||||
__be32 *out_qtoggle,
|
||||
__be32 *out_qindex);
|
||||
int64_t opal_xive_set_queue_state(uint64_t vp, uint32_t prio,
|
||||
uint32_t qtoggle,
|
||||
uint32_t qindex);
|
||||
int64_t opal_xive_get_vp_state(uint64_t vp, __be64 *out_w01);
|
||||
int64_t opal_pci_set_p2p(uint64_t phb_init, uint64_t phb_target,
|
||||
uint64_t desc, uint16_t pe_number);
|
||||
|
||||
|
@@ -173,7 +173,6 @@ struct paca_struct {
|
||||
u8 irq_happened; /* irq happened while soft-disabled */
|
||||
u8 io_sync; /* writel() needs spin_unlock sync */
|
||||
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
|
||||
u8 nap_state_lost; /* NV GPR values lost in power7_idle */
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
u8 pmcregs_in_use; /* pseries puts this in lppaca */
|
||||
#endif
|
||||
@@ -183,23 +182,28 @@ struct paca_struct {
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
/* Per-core mask tracking idle threads and a lock bit-[L][TTTTTTTT] */
|
||||
u32 *core_idle_state_ptr;
|
||||
u8 thread_idle_state; /* PNV_THREAD_RUNNING/NAP/SLEEP */
|
||||
/* Mask to indicate thread id in core */
|
||||
u8 thread_mask;
|
||||
/* Mask to denote subcore sibling threads */
|
||||
u8 subcore_sibling_mask;
|
||||
/* Flag to request this thread not to stop */
|
||||
atomic_t dont_stop;
|
||||
/* The PSSCR value that the kernel requested before going to stop */
|
||||
u64 requested_psscr;
|
||||
/* PowerNV idle fields */
|
||||
/* PNV_CORE_IDLE_* bits, all siblings work on thread 0 paca */
|
||||
unsigned long idle_state;
|
||||
union {
|
||||
/* P7/P8 specific fields */
|
||||
struct {
|
||||
/* PNV_THREAD_RUNNING/NAP/SLEEP */
|
||||
u8 thread_idle_state;
|
||||
/* Mask to denote subcore sibling threads */
|
||||
u8 subcore_sibling_mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* Save area for additional SPRs that need to be
|
||||
* saved/restored during cpuidle stop.
|
||||
*/
|
||||
struct stop_sprs stop_sprs;
|
||||
/* P9 specific fields */
|
||||
struct {
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
/* The PSSCR value that the kernel requested before going to stop */
|
||||
u64 requested_psscr;
|
||||
/* Flag to request this thread not to stop */
|
||||
atomic_t dont_stop;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
|
@@ -414,14 +414,17 @@ static inline unsigned long get_clean_sp(unsigned long sp, int is_32)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* asm stubs */
|
||||
extern unsigned long isa300_idle_stop_noloss(unsigned long psscr_val);
|
||||
extern unsigned long isa300_idle_stop_mayloss(unsigned long psscr_val);
|
||||
extern unsigned long isa206_idle_insn_mayloss(unsigned long type);
|
||||
|
||||
extern unsigned long cpuidle_disable;
|
||||
enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
|
||||
|
||||
extern int powersave_nap; /* set if nap mode can be used in idle loop */
|
||||
extern unsigned long power7_idle_insn(unsigned long type); /* PNV_THREAD_NAP/etc*/
|
||||
|
||||
extern void power7_idle_type(unsigned long type);
|
||||
extern unsigned long power9_idle_stop(unsigned long psscr_val);
|
||||
extern unsigned long power9_offline_stop(unsigned long psscr_val);
|
||||
extern void power9_idle_type(unsigned long stop_psscr_val,
|
||||
unsigned long stop_psscr_mask);
|
||||
|
||||
|
@@ -168,6 +168,7 @@
|
||||
#define PSSCR_ESL 0x00200000 /* Enable State Loss */
|
||||
#define PSSCR_SD 0x00400000 /* Status Disable */
|
||||
#define PSSCR_PLS 0xf000000000000000 /* Power-saving Level Status */
|
||||
#define PSSCR_PLS_SHIFT 60
|
||||
#define PSSCR_GUEST_VIS 0xf0000000000003ffUL /* Guest-visible PSSCR fields */
|
||||
#define PSSCR_FAKE_SUSPEND 0x00000400 /* Fake-suspend bit (P9 DD2.2) */
|
||||
#define PSSCR_FAKE_SUSPEND_LG 10 /* Fake-suspend bit position */
|
||||
@@ -758,10 +759,9 @@
|
||||
#define SRR1_WAKERESET 0x00100000 /* System reset */
|
||||
#define SRR1_WAKEHDBELL 0x000c0000 /* Hypervisor doorbell on P8 */
|
||||
#define SRR1_WAKESTATE 0x00030000 /* Powersave exit mask [46:47] */
|
||||
#define SRR1_WS_DEEPEST 0x00030000 /* Some resources not maintained,
|
||||
* may not be recoverable */
|
||||
#define SRR1_WS_DEEPER 0x00020000 /* Some resources not maintained */
|
||||
#define SRR1_WS_DEEP 0x00010000 /* All resources maintained */
|
||||
#define SRR1_WS_HVLOSS 0x00030000 /* HV resources not maintained */
|
||||
#define SRR1_WS_GPRLOSS 0x00020000 /* GPRs not maintained */
|
||||
#define SRR1_WS_NOLOSS 0x00010000 /* All resources maintained */
|
||||
#define SRR1_PROGTM 0x00200000 /* TM Bad Thing */
|
||||
#define SRR1_PROGFPE 0x00100000 /* Floating Point Enabled */
|
||||
#define SRR1_PROGILL 0x00080000 /* Illegal instruction */
|
||||
|
@@ -109,12 +109,26 @@ extern int xive_native_configure_queue(u32 vp_id, struct xive_q *q, u8 prio,
|
||||
extern void xive_native_disable_queue(u32 vp_id, struct xive_q *q, u8 prio);
|
||||
|
||||
extern void xive_native_sync_source(u32 hw_irq);
|
||||
extern void xive_native_sync_queue(u32 hw_irq);
|
||||
extern bool is_xive_irq(struct irq_chip *chip);
|
||||
extern int xive_native_enable_vp(u32 vp_id, bool single_escalation);
|
||||
extern int xive_native_disable_vp(u32 vp_id);
|
||||
extern int xive_native_get_vp_info(u32 vp_id, u32 *out_cam_id, u32 *out_chip_id);
|
||||
extern bool xive_native_has_single_escalation(void);
|
||||
|
||||
extern int xive_native_get_queue_info(u32 vp_id, uint32_t prio,
|
||||
u64 *out_qpage,
|
||||
u64 *out_qsize,
|
||||
u64 *out_qeoi_page,
|
||||
u32 *out_escalate_irq,
|
||||
u64 *out_qflags);
|
||||
|
||||
extern int xive_native_get_queue_state(u32 vp_id, uint32_t prio, u32 *qtoggle,
|
||||
u32 *qindex);
|
||||
extern int xive_native_set_queue_state(u32 vp_id, uint32_t prio, u32 qtoggle,
|
||||
u32 qindex);
|
||||
extern int xive_native_get_vp_state(u32 vp_id, u64 *out_state);
|
||||
|
||||
#else
|
||||
|
||||
static inline bool xive_enabled(void) { return false; }
|
||||
|
Reference in New Issue
Block a user