162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * lppaca.h 462306a36Sopenharmony_ci * Copyright (C) 2001 Mike Corrigan IBM Corporation 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef _ASM_POWERPC_LPPACA_H 762306a36Sopenharmony_ci#define _ASM_POWERPC_LPPACA_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifdef __KERNEL__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* 1262306a36Sopenharmony_ci * These definitions relate to hypervisors that only exist when using 1362306a36Sopenharmony_ci * a server type processor 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * This control block contains the data that is shared between the 1962306a36Sopenharmony_ci * hypervisor and the OS. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#include <linux/cache.h> 2262306a36Sopenharmony_ci#include <linux/threads.h> 2362306a36Sopenharmony_ci#include <asm/types.h> 2462306a36Sopenharmony_ci#include <asm/mmu.h> 2562306a36Sopenharmony_ci#include <asm/firmware.h> 2662306a36Sopenharmony_ci#include <asm/paca.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * The lppaca is the "virtual processor area" registered with the hypervisor, 3062306a36Sopenharmony_ci * H_REGISTER_VPA etc. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * According to PAPR, the structure is 640 bytes long, must be L1 cache line 3362306a36Sopenharmony_ci * aligned, and must not cross a 4kB boundary. Its size field must be at 3462306a36Sopenharmony_ci * least 640 bytes (but may be more). 3562306a36Sopenharmony_ci * 3662306a36Sopenharmony_ci * Pre-v4.14 KVM hypervisors reject the VPA if its size field is smaller than 3762306a36Sopenharmony_ci * 1kB, so we dynamically allocate 1kB and advertise size as 1kB, but keep 3862306a36Sopenharmony_ci * this structure as the canonical 640 byte size. 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct lppaca { 4162306a36Sopenharmony_ci /* cacheline 1 contains read-only data */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci __be32 desc; /* Eye catcher 0xD397D781 */ 4462306a36Sopenharmony_ci __be16 size; /* Size of this struct */ 4562306a36Sopenharmony_ci u8 reserved1[3]; 4662306a36Sopenharmony_ci u8 __old_status; /* Old status, including shared proc */ 4762306a36Sopenharmony_ci u8 reserved3[14]; 4862306a36Sopenharmony_ci volatile __be32 dyn_hw_node_id; /* Dynamic hardware node id */ 4962306a36Sopenharmony_ci volatile __be32 dyn_hw_proc_id; /* Dynamic hardware proc id */ 5062306a36Sopenharmony_ci u8 reserved4[56]; 5162306a36Sopenharmony_ci volatile u8 vphn_assoc_counts[8]; /* Virtual processor home node */ 5262306a36Sopenharmony_ci /* associativity change counters */ 5362306a36Sopenharmony_ci u8 reserved5[32]; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* cacheline 2 contains local read-write data */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci u8 reserved6[48]; 5862306a36Sopenharmony_ci u8 cede_latency_hint; 5962306a36Sopenharmony_ci u8 ebb_regs_in_use; 6062306a36Sopenharmony_ci u8 reserved7[6]; 6162306a36Sopenharmony_ci u8 dtl_enable_mask; /* Dispatch Trace Log mask */ 6262306a36Sopenharmony_ci u8 donate_dedicated_cpu; /* Donate dedicated CPU cycles */ 6362306a36Sopenharmony_ci u8 fpregs_in_use; 6462306a36Sopenharmony_ci u8 pmcregs_in_use; 6562306a36Sopenharmony_ci u8 reserved8[28]; 6662306a36Sopenharmony_ci __be64 wait_state_cycles; /* Wait cycles for this proc */ 6762306a36Sopenharmony_ci u8 reserved9[28]; 6862306a36Sopenharmony_ci __be16 slb_count; /* # of SLBs to maintain */ 6962306a36Sopenharmony_ci u8 idle; /* Indicate OS is idle */ 7062306a36Sopenharmony_ci u8 vmxregs_in_use; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* cacheline 3 is shared with other processors */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* 7562306a36Sopenharmony_ci * This is the yield_count. An "odd" value (low bit on) means that 7662306a36Sopenharmony_ci * the processor is yielded (either because of an OS yield or a 7762306a36Sopenharmony_ci * hypervisor preempt). An even value implies that the processor is 7862306a36Sopenharmony_ci * currently executing. 7962306a36Sopenharmony_ci * NOTE: Even dedicated processor partitions can yield so this 8062306a36Sopenharmony_ci * field cannot be used to determine if we are shared or dedicated. 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci volatile __be32 yield_count; 8362306a36Sopenharmony_ci volatile __be32 dispersion_count; /* dispatch changed physical cpu */ 8462306a36Sopenharmony_ci volatile __be64 cmo_faults; /* CMO page fault count */ 8562306a36Sopenharmony_ci volatile __be64 cmo_fault_time; /* CMO page fault time */ 8662306a36Sopenharmony_ci u8 reserved10[64]; /* [S]PURR expropriated/donated */ 8762306a36Sopenharmony_ci volatile __be64 enqueue_dispatch_tb; /* Total TB enqueue->dispatch */ 8862306a36Sopenharmony_ci volatile __be64 ready_enqueue_tb; /* Total TB ready->enqueue */ 8962306a36Sopenharmony_ci volatile __be64 wait_ready_tb; /* Total TB wait->ready */ 9062306a36Sopenharmony_ci u8 reserved11[16]; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* cacheline 4-5 */ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci __be32 page_ins; /* CMO Hint - # page ins by OS */ 9562306a36Sopenharmony_ci u8 reserved12[148]; 9662306a36Sopenharmony_ci volatile __be64 dtl_idx; /* Dispatch Trace Log head index */ 9762306a36Sopenharmony_ci u8 reserved13[96]; 9862306a36Sopenharmony_ci} ____cacheline_aligned; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define lppaca_of(cpu) (*paca_ptrs[cpu]->lppaca_ptr) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* 10362306a36Sopenharmony_ci * We are using a non architected field to determine if a partition is 10462306a36Sopenharmony_ci * shared or dedicated. This currently works on both KVM and PHYP, but 10562306a36Sopenharmony_ci * we will have to transition to something better. 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_ci#define LPPACA_OLD_SHARED_PROC 2 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#ifdef CONFIG_PPC_PSERIES 11062306a36Sopenharmony_ci/* 11162306a36Sopenharmony_ci * All CPUs should have the same shared proc value, so directly access the PACA 11262306a36Sopenharmony_ci * to avoid false positives from DEBUG_PREEMPT. 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_cistatic inline bool lppaca_shared_proc(void) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci struct lppaca *l = local_paca->lppaca_ptr; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci if (!firmware_has_feature(FW_FEATURE_SPLPAR)) 11962306a36Sopenharmony_ci return false; 12062306a36Sopenharmony_ci return !!(l->__old_status & LPPACA_OLD_SHARED_PROC); 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define get_lppaca() (get_paca()->lppaca_ptr) 12462306a36Sopenharmony_ci#endif 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci/* 12762306a36Sopenharmony_ci * SLB shadow buffer structure as defined in the PAPR. The save_area 12862306a36Sopenharmony_ci * contains adjacent ESID and VSID pairs for each shadowed SLB. The 12962306a36Sopenharmony_ci * ESID is stored in the lower 64bits, then the VSID. 13062306a36Sopenharmony_ci */ 13162306a36Sopenharmony_cistruct slb_shadow { 13262306a36Sopenharmony_ci __be32 persistent; /* Number of persistent SLBs */ 13362306a36Sopenharmony_ci __be32 buffer_length; /* Total shadow buffer length */ 13462306a36Sopenharmony_ci __be64 reserved; 13562306a36Sopenharmony_ci struct { 13662306a36Sopenharmony_ci __be64 esid; 13762306a36Sopenharmony_ci __be64 vsid; 13862306a36Sopenharmony_ci } save_area[SLB_NUM_BOLTED]; 13962306a36Sopenharmony_ci} ____cacheline_aligned; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#endif /* CONFIG_PPC_BOOK3S */ 14262306a36Sopenharmony_ci#endif /* __KERNEL__ */ 14362306a36Sopenharmony_ci#endif /* _ASM_POWERPC_LPPACA_H */ 144