Merge branch 'topic/ppc-kvm' into next
Merge our ppc-kvm topic branch to bring in the Ultravisor support patches.
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include <asm/epapr_hcalls.h>
|
||||
#include <asm/dcr.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/ultravisor-api.h>
|
||||
|
||||
#include <uapi/asm/ucontext.h>
|
||||
|
||||
@@ -34,6 +35,16 @@ extern struct static_key hcall_tracepoint_key;
|
||||
void __trace_hcall_entry(unsigned long opcode, unsigned long *args);
|
||||
void __trace_hcall_exit(long opcode, long retval, unsigned long *retbuf);
|
||||
|
||||
/* Ultravisor */
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
long ucall_norets(unsigned long opcode, ...);
|
||||
#else
|
||||
static inline long ucall_norets(unsigned long opcode, ...)
|
||||
{
|
||||
return U_NOT_AVAILABLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* OPAL */
|
||||
int64_t __opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3,
|
||||
int64_t a4, int64_t a5, int64_t a6, int64_t a7,
|
||||
|
24
arch/powerpc/include/asm/elfnote.h
Normal file
24
arch/powerpc/include/asm/elfnote.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* PowerPC ELF notes.
|
||||
*
|
||||
* Copyright 2019, IBM Corporation
|
||||
*/
|
||||
|
||||
#ifndef __ASM_POWERPC_ELFNOTE_H__
|
||||
#define __ASM_POWERPC_ELFNOTE_H__
|
||||
|
||||
/*
|
||||
* These note types should live in a SHT_NOTE segment and have
|
||||
* "PowerPC" in the name field.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The capabilities supported/required by this kernel (bitmap).
|
||||
*
|
||||
* This type uses a bitmap as "desc" field. Each bit is described
|
||||
* in arch/powerpc/kernel/note.S
|
||||
*/
|
||||
#define PPC_ELFNOTE_CAPABILITIES 1
|
||||
|
||||
#endif /* __ASM_POWERPC_ELFNOTE_H__ */
|
@@ -50,6 +50,7 @@
|
||||
#define FW_FEATURE_DRC_INFO ASM_CONST(0x0000000800000000)
|
||||
#define FW_FEATURE_BLOCK_REMOVE ASM_CONST(0x0000001000000000)
|
||||
#define FW_FEATURE_PAPR_SCM ASM_CONST(0x0000002000000000)
|
||||
#define FW_FEATURE_ULTRAVISOR ASM_CONST(0x0000004000000000)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@@ -68,9 +69,9 @@ enum {
|
||||
FW_FEATURE_TYPE1_AFFINITY | FW_FEATURE_PRRN |
|
||||
FW_FEATURE_HPT_RESIZE | FW_FEATURE_DRMEM_V2 |
|
||||
FW_FEATURE_DRC_INFO | FW_FEATURE_BLOCK_REMOVE |
|
||||
FW_FEATURE_PAPR_SCM,
|
||||
FW_FEATURE_PAPR_SCM | FW_FEATURE_ULTRAVISOR,
|
||||
FW_FEATURE_PSERIES_ALWAYS = 0,
|
||||
FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL,
|
||||
FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_ULTRAVISOR,
|
||||
FW_FEATURE_POWERNV_ALWAYS = 0,
|
||||
FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
|
||||
FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
|
||||
|
@@ -48,15 +48,16 @@ struct iommu_table_ops {
|
||||
* returns old TCE and DMA direction mask.
|
||||
* @tce is a physical address.
|
||||
*/
|
||||
int (*exchange)(struct iommu_table *tbl,
|
||||
int (*xchg_no_kill)(struct iommu_table *tbl,
|
||||
long index,
|
||||
unsigned long *hpa,
|
||||
enum dma_data_direction *direction);
|
||||
/* Real mode */
|
||||
int (*exchange_rm)(struct iommu_table *tbl,
|
||||
long index,
|
||||
unsigned long *hpa,
|
||||
enum dma_data_direction *direction);
|
||||
enum dma_data_direction *direction,
|
||||
bool realmode);
|
||||
|
||||
void (*tce_kill)(struct iommu_table *tbl,
|
||||
unsigned long index,
|
||||
unsigned long pages,
|
||||
bool realmode);
|
||||
|
||||
__be64 *(*useraddrptr)(struct iommu_table *tbl, long index, bool alloc);
|
||||
#endif
|
||||
@@ -209,6 +210,12 @@ extern void iommu_del_device(struct device *dev);
|
||||
extern long iommu_tce_xchg(struct mm_struct *mm, struct iommu_table *tbl,
|
||||
unsigned long entry, unsigned long *hpa,
|
||||
enum dma_data_direction *direction);
|
||||
extern long iommu_tce_xchg_no_kill(struct mm_struct *mm,
|
||||
struct iommu_table *tbl,
|
||||
unsigned long entry, unsigned long *hpa,
|
||||
enum dma_data_direction *direction);
|
||||
extern void iommu_tce_kill(struct iommu_table *tbl,
|
||||
unsigned long entry, unsigned long pages);
|
||||
#else
|
||||
static inline void iommu_register_group(struct iommu_table_group *table_group,
|
||||
int pci_domain_number,
|
||||
|
@@ -283,6 +283,7 @@ struct kvm_arch {
|
||||
cpumask_t cpu_in_guest;
|
||||
u8 radix;
|
||||
u8 fwnmi_enabled;
|
||||
u8 secure_guest;
|
||||
bool threads_indep;
|
||||
bool nested_enable;
|
||||
pgd_t *pgtable;
|
||||
|
29
arch/powerpc/include/asm/ultravisor-api.h
Normal file
29
arch/powerpc/include/asm/ultravisor-api.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Ultravisor API.
|
||||
*
|
||||
* Copyright 2019, IBM Corporation.
|
||||
*
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ULTRAVISOR_API_H
|
||||
#define _ASM_POWERPC_ULTRAVISOR_API_H
|
||||
|
||||
#include <asm/hvcall.h>
|
||||
|
||||
/* Return codes */
|
||||
#define U_BUSY H_BUSY
|
||||
#define U_FUNCTION H_FUNCTION
|
||||
#define U_NOT_AVAILABLE H_NOT_AVAILABLE
|
||||
#define U_P2 H_P2
|
||||
#define U_P3 H_P3
|
||||
#define U_P4 H_P4
|
||||
#define U_P5 H_P5
|
||||
#define U_PARAMETER H_PARAMETER
|
||||
#define U_PERMISSION H_PERMISSION
|
||||
#define U_SUCCESS H_SUCCESS
|
||||
|
||||
/* opcodes */
|
||||
#define UV_WRITE_PATE 0xF104
|
||||
#define UV_RETURN 0xF11C
|
||||
|
||||
#endif /* _ASM_POWERPC_ULTRAVISOR_API_H */
|
34
arch/powerpc/include/asm/ultravisor.h
Normal file
34
arch/powerpc/include/asm/ultravisor.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Ultravisor definitions
|
||||
*
|
||||
* Copyright 2019, IBM Corporation.
|
||||
*
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ULTRAVISOR_H
|
||||
#define _ASM_POWERPC_ULTRAVISOR_H
|
||||
|
||||
#include <asm/asm-prototypes.h>
|
||||
#include <asm/ultravisor-api.h>
|
||||
#include <asm/firmware.h>
|
||||
|
||||
int early_init_dt_scan_ultravisor(unsigned long node, const char *uname,
|
||||
int depth, void *data);
|
||||
|
||||
/*
|
||||
* In ultravisor enabled systems, PTCR becomes ultravisor privileged only for
|
||||
* writing and an attempt to write to it will cause a Hypervisor Emulation
|
||||
* Assistance interrupt.
|
||||
*/
|
||||
static inline void set_ptcr_when_no_uv(u64 val)
|
||||
{
|
||||
if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR))
|
||||
mtspr(SPRN_PTCR, val);
|
||||
}
|
||||
|
||||
static inline int uv_register_pate(u64 lpid, u64 dw0, u64 dw1)
|
||||
{
|
||||
return ucall_norets(UV_WRITE_PATE, lpid, dw0, dw1);
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ULTRAVISOR_H */
|
Reference in New Issue
Block a user