mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/dg-gitlab/tags/ppc-for-6.1-20210709' into staging
ppc patch queue 2021-07-09
Here's a (probably) final pull request before the qemu-6.1 soft
freeze. Includes:
* Implementation of the new H_RPT_INVALIDATE hypercall
* Virtual Open Firmware for pSeries and pegasos2 machine types.
This is an experimental minimal Open Firmware implementation which
works by delegating nearly everything to qemu itself via a special
hypercall.
* A number of cleanups to the ppc soft MMU code
* Fix to handling of two-level radix mode translations for the
powernv machine type
* Update the H_GET_CPU_CHARACTERISTICS call with newly defined bits.
This will allow more flexible handling of possible future CPU
Spectre-like flaws
* Correctly treat mtmsrd as an illegal instruction on BookE cpus
* Firmware update for the ppce500 machine type
# gpg: Signature made Fri 09 Jul 2021 06:16:42 BST
# gpg: using RSA key 75F46586AE61A66CC44E87DC6C38CACA20D9B392
# gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>" [full]
# gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>" [full]
# gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>" [full]
# gpg: aka "David Gibson (kernel.org) <dwg@kernel.org>" [unknown]
# Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392
* remotes/dg-gitlab/tags/ppc-for-6.1-20210709: (33 commits)
target/ppc: Support for H_RPT_INVALIDATE hcall
linux-headers: Update
spapr: Fix implementation of Open Firmware client interface
target/ppc: Don't compile ppc_tlb_invalid_all without TCG
ppc/pegasos2: Implement some RTAS functions with VOF
ppc/pegasos2: Fix use of && instead of &
ppc/pegasos2: Use Virtual Open Firmware as firmware replacement
target/ppc/spapr: Update H_GET_CPU_CHARACTERISTICS L1D cache flush bits
target/ppc: Allow virtual hypervisor on CPU without HV
ppc/pegasos2: Introduce Pegasos2MachineState structure
target/ppc: mtmsrd is an illegal instruction on BookE
spapr: Implement Open Firmware client interface
docs/system: ppc: Update ppce500 documentation with eTSEC support
roms/u-boot: Bump ppce500 u-boot to v2021.07 to add eTSEC support
target/ppc: change ppc_hash32_xlate to use mmu_idx
target/ppc: introduce mmu-books.h
target/ppc: changed ppc_hash64_xlate to use mmu_idx
target/ppc: fix address translation bug for radix mmus
target/ppc: Fix compilation with DEBUG_BATS debug option
target/ppc: Fix compilation with FLUSH_ALL_TLBS debug option
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+12
@@ -1360,6 +1360,18 @@ F: hw/pci-host/mv64361.c
|
||||
F: hw/pci-host/mv643xx.h
|
||||
F: include/hw/pci-host/mv64361.h
|
||||
|
||||
Virtual Open Firmware (VOF)
|
||||
M: Alexey Kardashevskiy <aik@ozlabs.ru>
|
||||
R: David Gibson <david@gibson.dropbear.id.au>
|
||||
R: Greg Kurz <groug@kaod.org>
|
||||
L: qemu-ppc@nongnu.org
|
||||
S: Maintained
|
||||
F: hw/ppc/spapr_vof*
|
||||
F: hw/ppc/vof*
|
||||
F: include/hw/ppc/vof*
|
||||
F: pc-bios/vof/*
|
||||
F: pc-bios/vof*
|
||||
|
||||
RISC-V Machines
|
||||
---------------
|
||||
OpenTitan
|
||||
|
||||
@@ -14,7 +14,7 @@ CONFIG_SAM460EX=y
|
||||
CONFIG_MAC_OLDWORLD=y
|
||||
CONFIG_MAC_NEWWORLD=y
|
||||
|
||||
CONFIG_PEGASOS2=n
|
||||
CONFIG_PEGASOS2=y
|
||||
|
||||
# For PReP
|
||||
CONFIG_PREP=y
|
||||
|
||||
@@ -19,6 +19,7 @@ The ``ppce500`` machine supports the following devices:
|
||||
* Power-off functionality via one GPIO pin
|
||||
* 1 Freescale MPC8xxx PCI host controller
|
||||
* VirtIO devices via PCI bus
|
||||
* 1 Freescale Enhanced Triple Speed Ethernet controller (eTSEC)
|
||||
|
||||
Hardware configuration information
|
||||
----------------------------------
|
||||
@@ -121,7 +122,7 @@ To boot the 32-bit Linux kernel:
|
||||
Running U-Boot
|
||||
--------------
|
||||
|
||||
U-Boot mainline v2021.04 release is tested at the time of writing. To build a
|
||||
U-Boot mainline v2021.07 release is tested at the time of writing. To build a
|
||||
U-Boot mainline bootloader that can be booted by the ``ppce500`` machine, use
|
||||
the qemu-ppce500_defconfig with similar commands as described above for Linux:
|
||||
|
||||
@@ -154,3 +155,10 @@ interface at PCI address 0.1.0, but we can switch that to an e1000 NIC by:
|
||||
-display none -serial stdio \
|
||||
-bios u-boot \
|
||||
-nic tap,ifname=tap0,script=no,downscript=no,model=e1000
|
||||
|
||||
The QEMU ``ppce500`` machine can also dynamically instantiate an eTSEC device
|
||||
if “-device eTSEC” is given to QEMU:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
-netdev tap,ifname=tap0,script=no,downscript=no,id=net0 -device eTSEC,netdev=net0
|
||||
|
||||
@@ -13,6 +13,7 @@ config PSERIES
|
||||
select MSI_NONBROKEN
|
||||
select FDT_PPC
|
||||
select CHRP_NVRAM
|
||||
select VOF
|
||||
|
||||
config SPAPR_RNG
|
||||
bool
|
||||
@@ -75,6 +76,7 @@ config PEGASOS2
|
||||
select VT82C686
|
||||
select IDE_VIA
|
||||
select SMBUS_EEPROM
|
||||
select VOF
|
||||
# This should come with VT82C686
|
||||
select ACPI_X86
|
||||
|
||||
@@ -144,3 +146,6 @@ config FW_CFG_PPC
|
||||
|
||||
config FDT_PPC
|
||||
bool
|
||||
|
||||
config VOF
|
||||
bool
|
||||
|
||||
@@ -84,4 +84,7 @@ ppc_ss.add(when: 'CONFIG_VIRTEX', if_true: files('virtex_ml507.c'))
|
||||
# Pegasos2
|
||||
ppc_ss.add(when: 'CONFIG_PEGASOS2', if_true: files('pegasos2.c'))
|
||||
|
||||
ppc_ss.add(when: 'CONFIG_VOF', if_true: files('vof.c'))
|
||||
ppc_ss.add(when: ['CONFIG_VOF', 'CONFIG_PSERIES'], if_true: files('spapr_vof.c'))
|
||||
|
||||
hw_arch += {'ppc': ppc_ss}
|
||||
|
||||
+774
-15
File diff suppressed because it is too large
Load Diff
+66
-11
@@ -101,6 +101,7 @@
|
||||
#define FDT_MAX_ADDR 0x80000000 /* FDT must stay below that */
|
||||
#define FW_MAX_SIZE 0x400000
|
||||
#define FW_FILE_NAME "slof.bin"
|
||||
#define FW_FILE_NAME_VOF "vof.bin"
|
||||
#define FW_OVERHEAD 0x2800000
|
||||
#define KERNEL_LOAD_ADDR FW_MAX_SIZE
|
||||
|
||||
@@ -880,6 +881,10 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||
add_str(hypertas, "hcall-copy");
|
||||
add_str(hypertas, "hcall-debug");
|
||||
add_str(hypertas, "hcall-vphn");
|
||||
if (spapr_get_cap(spapr, SPAPR_CAP_RPT_INVALIDATE) == SPAPR_CAP_ON) {
|
||||
add_str(hypertas, "hcall-rpt-invalidate");
|
||||
}
|
||||
|
||||
add_str(qemu_hypertas, "hcall-memop1");
|
||||
|
||||
if (!kvm_enabled() || kvmppc_spapr_use_multitce()) {
|
||||
@@ -919,9 +924,13 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||
*
|
||||
* The extra 8 bytes is required because Linux's FWNMI error log check
|
||||
* is off-by-one.
|
||||
*
|
||||
* RTAS_MIN_SIZE is required for the RTAS blob itself.
|
||||
*/
|
||||
_FDT(fdt_setprop_cell(fdt, rtas, "rtas-size", RTAS_ERROR_LOG_MAX +
|
||||
ms->smp.max_cpus * sizeof(uint64_t)*2 + sizeof(uint64_t)));
|
||||
_FDT(fdt_setprop_cell(fdt, rtas, "rtas-size", RTAS_MIN_SIZE +
|
||||
RTAS_ERROR_LOG_MAX +
|
||||
ms->smp.max_cpus * sizeof(uint64_t) * 2 +
|
||||
sizeof(uint64_t)));
|
||||
_FDT(fdt_setprop_cell(fdt, rtas, "rtas-error-log-max",
|
||||
RTAS_ERROR_LOG_MAX));
|
||||
_FDT(fdt_setprop_cell(fdt, rtas, "rtas-event-scan-rate",
|
||||
@@ -1639,22 +1648,29 @@ static void spapr_machine_reset(MachineState *machine)
|
||||
fdt_addr = MIN(spapr->rma_size, FDT_MAX_ADDR) - FDT_MAX_SIZE;
|
||||
|
||||
fdt = spapr_build_fdt(spapr, true, FDT_MAX_SIZE);
|
||||
if (spapr->vof) {
|
||||
spapr_vof_reset(spapr, fdt, &error_fatal);
|
||||
/*
|
||||
* Do not pack the FDT as the client may change properties.
|
||||
* VOF client does not expect the FDT so we do not load it to the VM.
|
||||
*/
|
||||
} else {
|
||||
rc = fdt_pack(fdt);
|
||||
/* Should only fail if we've built a corrupted tree */
|
||||
assert(rc == 0);
|
||||
|
||||
rc = fdt_pack(fdt);
|
||||
|
||||
/* Should only fail if we've built a corrupted tree */
|
||||
assert(rc == 0);
|
||||
|
||||
/* Load the fdt */
|
||||
spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT,
|
||||
0, fdt_addr, 0);
|
||||
cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
|
||||
}
|
||||
qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
|
||||
cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
|
||||
|
||||
g_free(spapr->fdt_blob);
|
||||
spapr->fdt_size = fdt_totalsize(fdt);
|
||||
spapr->fdt_initial_size = spapr->fdt_size;
|
||||
spapr->fdt_blob = fdt;
|
||||
|
||||
/* Set up the entry state */
|
||||
spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT, 0, fdt_addr, 0);
|
||||
first_ppc_cpu->env.gpr[5] = 0;
|
||||
|
||||
spapr->fwnmi_system_reset_addr = -1;
|
||||
@@ -2018,6 +2034,7 @@ static const VMStateDescription vmstate_spapr = {
|
||||
&vmstate_spapr_cap_ccf_assist,
|
||||
&vmstate_spapr_cap_fwnmi,
|
||||
&vmstate_spapr_fwnmi,
|
||||
&vmstate_spapr_cap_rpt_invalidate,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
@@ -2657,7 +2674,8 @@ static void spapr_machine_init(MachineState *machine)
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(machine);
|
||||
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
const char *bios_name = machine->firmware ?: FW_FILE_NAME;
|
||||
const char *bios_default = spapr->vof ? FW_FILE_NAME_VOF : FW_FILE_NAME;
|
||||
const char *bios_name = machine->firmware ?: bios_default;
|
||||
const char *kernel_filename = machine->kernel_filename;
|
||||
const char *initrd_filename = machine->initrd_filename;
|
||||
PCIHostState *phb;
|
||||
@@ -3014,6 +3032,10 @@ static void spapr_machine_init(MachineState *machine)
|
||||
}
|
||||
|
||||
qemu_cond_init(&spapr->fwnmi_machine_check_interlock_cond);
|
||||
if (spapr->vof) {
|
||||
spapr->vof->fw_size = fw_size; /* for claim() on itself */
|
||||
spapr_register_hypercall(KVMPPC_H_VOF_CLIENT, spapr_h_vof_client);
|
||||
}
|
||||
}
|
||||
|
||||
#define DEFAULT_KVM_TYPE "auto"
|
||||
@@ -3204,6 +3226,28 @@ static void spapr_set_resize_hpt(Object *obj, const char *value, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
static bool spapr_get_vof(Object *obj, Error **errp)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(obj);
|
||||
|
||||
return spapr->vof != NULL;
|
||||
}
|
||||
|
||||
static void spapr_set_vof(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(obj);
|
||||
|
||||
if (spapr->vof) {
|
||||
vof_cleanup(spapr->vof);
|
||||
g_free(spapr->vof);
|
||||
spapr->vof = NULL;
|
||||
}
|
||||
if (!value) {
|
||||
return;
|
||||
}
|
||||
spapr->vof = g_malloc0(sizeof(*spapr->vof));
|
||||
}
|
||||
|
||||
static char *spapr_get_ic_mode(Object *obj, Error **errp)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(obj);
|
||||
@@ -3329,6 +3373,11 @@ static void spapr_instance_init(Object *obj)
|
||||
stringify(KERNEL_LOAD_ADDR)
|
||||
" for -kernel is the default");
|
||||
spapr->kernel_addr = KERNEL_LOAD_ADDR;
|
||||
|
||||
object_property_add_bool(obj, "x-vof", spapr_get_vof, spapr_set_vof);
|
||||
object_property_set_description(obj, "x-vof",
|
||||
"Enable Virtual Open Firmware (experimental)");
|
||||
|
||||
/* The machine class defines the default interrupt controller mode */
|
||||
spapr->irq = smc->irq;
|
||||
object_property_add_str(obj, "ic-mode", spapr_get_ic_mode,
|
||||
@@ -4492,6 +4541,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
XICSFabricClass *xic = XICS_FABRIC_CLASS(oc);
|
||||
InterruptStatsProviderClass *ispc = INTERRUPT_STATS_PROVIDER_CLASS(oc);
|
||||
XiveFabricClass *xfc = XIVE_FABRIC_CLASS(oc);
|
||||
VofMachineIfClass *vmc = VOF_MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "pSeries Logical Partition (PAPR compliant)";
|
||||
mc->ignore_boot_device_suffixes = true;
|
||||
@@ -4573,6 +4623,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
|
||||
smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_ON;
|
||||
smc->default_caps.caps[SPAPR_CAP_FWNMI] = SPAPR_CAP_ON;
|
||||
smc->default_caps.caps[SPAPR_CAP_RPT_INVALIDATE] = SPAPR_CAP_OFF;
|
||||
spapr_caps_add_properties(smc);
|
||||
smc->irq = &spapr_irq_dual;
|
||||
smc->dr_phb_enabled = true;
|
||||
@@ -4580,6 +4631,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
smc->smp_threads_vsmt = true;
|
||||
smc->nr_xirqs = SPAPR_NR_XIRQS;
|
||||
xfc->match_nvt = spapr_match_nvt;
|
||||
vmc->client_architecture_support = spapr_vof_client_architecture_support;
|
||||
vmc->quiesce = spapr_vof_quiesce;
|
||||
vmc->setprop = spapr_vof_setprop;
|
||||
}
|
||||
|
||||
static const TypeInfo spapr_machine_info = {
|
||||
@@ -4599,6 +4653,7 @@ static const TypeInfo spapr_machine_info = {
|
||||
{ TYPE_XICS_FABRIC },
|
||||
{ TYPE_INTERRUPT_STATS_PROVIDER },
|
||||
{ TYPE_XIVE_FABRIC },
|
||||
{ TYPE_VOF_MACHINE_IF },
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
@@ -582,6 +582,37 @@ static void cap_fwnmi_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
}
|
||||
}
|
||||
|
||||
static void cap_rpt_invalidate_apply(SpaprMachineState *spapr,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
|
||||
if (!val) {
|
||||
/* capability disabled by default */
|
||||
return;
|
||||
}
|
||||
|
||||
if (tcg_enabled()) {
|
||||
error_setg(errp, "No H_RPT_INVALIDATE support in TCG");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-rpt-invalidate=off\n");
|
||||
} else if (kvm_enabled()) {
|
||||
if (!kvmppc_has_cap_mmu_radix()) {
|
||||
error_setg(errp, "H_RPT_INVALIDATE only supported on Radix");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!kvmppc_has_cap_rpt_invalidate()) {
|
||||
error_setg(errp,
|
||||
"KVM implementation does not support H_RPT_INVALIDATE");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-rpt-invalidate=off\n");
|
||||
} else {
|
||||
kvmppc_enable_h_rpt_invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
|
||||
[SPAPR_CAP_HTM] = {
|
||||
.name = "htm",
|
||||
@@ -690,6 +721,15 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
|
||||
.type = "bool",
|
||||
.apply = cap_fwnmi_apply,
|
||||
},
|
||||
[SPAPR_CAP_RPT_INVALIDATE] = {
|
||||
.name = "rpt-invalidate",
|
||||
.description = "Allow H_RPT_INVALIDATE",
|
||||
.index = SPAPR_CAP_RPT_INVALIDATE,
|
||||
.get = spapr_cap_get_bool,
|
||||
.set = spapr_cap_set_bool,
|
||||
.type = "bool",
|
||||
.apply = cap_rpt_invalidate_apply,
|
||||
},
|
||||
};
|
||||
|
||||
static SpaprCapabilities default_caps_with_cpu(SpaprMachineState *spapr,
|
||||
@@ -830,6 +870,7 @@ SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV);
|
||||
SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER);
|
||||
SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST);
|
||||
SPAPR_CAP_MIG_STATE(fwnmi, SPAPR_CAP_FWNMI);
|
||||
SPAPR_CAP_MIG_STATE(rpt_invalidate, SPAPR_CAP_RPT_INVALIDATE);
|
||||
|
||||
void spapr_caps_init(SpaprMachineState *spapr)
|
||||
{
|
||||
|
||||
+22
-2
@@ -1233,8 +1233,7 @@ target_ulong do_client_architecture_support(PowerPCCPU *cpu,
|
||||
spapr_setup_hpt(spapr);
|
||||
}
|
||||
|
||||
fdt = spapr_build_fdt(spapr, false, fdt_bufsize);
|
||||
|
||||
fdt = spapr_build_fdt(spapr, spapr->vof != NULL, fdt_bufsize);
|
||||
g_free(spapr->fdt_blob);
|
||||
spapr->fdt_size = fdt_totalsize(fdt);
|
||||
spapr->fdt_initial_size = spapr->fdt_size;
|
||||
@@ -1277,6 +1276,25 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
|
||||
return ret;
|
||||
}
|
||||
|
||||
target_ulong spapr_vof_client_architecture_support(MachineState *ms,
|
||||
CPUState *cs,
|
||||
target_ulong ovec_addr)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(ms);
|
||||
|
||||
target_ulong ret = do_client_architecture_support(POWERPC_CPU(cs), spapr,
|
||||
ovec_addr, FDT_MAX_SIZE);
|
||||
|
||||
/*
|
||||
* This adds stdout and generates phandles for boottime and CAS FDTs.
|
||||
* It is alright to update the FDT here as do_client_architecture_support()
|
||||
* does not pack it.
|
||||
*/
|
||||
spapr_vof_client_dt_finalize(spapr, spapr->fdt_blob);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
|
||||
SpaprMachineState *spapr,
|
||||
target_ulong opcode,
|
||||
@@ -1299,6 +1317,8 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
|
||||
behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR;
|
||||
break;
|
||||
case SPAPR_CAP_FIXED:
|
||||
behaviour |= H_CPU_BEHAV_NO_L1D_FLUSH_ENTRY;
|
||||
behaviour |= H_CPU_BEHAV_NO_L1D_FLUSH_UACCESS;
|
||||
break;
|
||||
default: /* broken */
|
||||
assert(safe_cache == SPAPR_CAP_BROKEN);
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* SPAPR machine hooks to Virtual Open Firmware,
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/ppc/spapr.h"
|
||||
#include "hw/ppc/spapr_vio.h"
|
||||
#include "hw/ppc/spapr_cpu_core.h"
|
||||
#include "hw/ppc/fdt.h"
|
||||
#include "hw/ppc/vof.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "qom/qom-qobject.h"
|
||||
#include "trace.h"
|
||||
|
||||
target_ulong spapr_h_vof_client(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
target_ulong opcode, target_ulong *_args)
|
||||
{
|
||||
int ret = vof_client_call(MACHINE(spapr), spapr->vof, spapr->fdt_blob,
|
||||
ppc64_phys_to_real(_args[0]));
|
||||
|
||||
if (ret) {
|
||||
return H_PARAMETER;
|
||||
}
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
void spapr_vof_client_dt_finalize(SpaprMachineState *spapr, void *fdt)
|
||||
{
|
||||
char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus);
|
||||
|
||||
vof_build_dt(fdt, spapr->vof);
|
||||
|
||||
if (spapr->vof->bootargs) {
|
||||
int chosen;
|
||||
|
||||
_FDT(chosen = fdt_path_offset(fdt, "/chosen"));
|
||||
/*
|
||||
* If the client did not change "bootargs", spapr_dt_chosen() must have
|
||||
* stored machine->kernel_cmdline in it before getting here.
|
||||
*/
|
||||
_FDT(fdt_setprop_string(fdt, chosen, "bootargs", spapr->vof->bootargs));
|
||||
}
|
||||
|
||||
/*
|
||||
* SLOF-less setup requires an open instance of stdout for early
|
||||
* kernel printk. By now all phandles are settled so we can open
|
||||
* the default serial console.
|
||||
*/
|
||||
if (stdout_path) {
|
||||
_FDT(vof_client_open_store(fdt, spapr->vof, "/chosen", "stdout",
|
||||
stdout_path));
|
||||
}
|
||||
}
|
||||
|
||||
void spapr_vof_reset(SpaprMachineState *spapr, void *fdt, Error **errp)
|
||||
{
|
||||
target_ulong stack_ptr;
|
||||
Vof *vof = spapr->vof;
|
||||
PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
|
||||
|
||||
vof_init(vof, spapr->rma_size, errp);
|
||||
|
||||
stack_ptr = vof_claim(vof, 0, VOF_STACK_SIZE, VOF_STACK_SIZE);
|
||||
if (stack_ptr == -1) {
|
||||
error_setg(errp, "Memory allocation for stack failed");
|
||||
return;
|
||||
}
|
||||
/* Stack grows downwards plus reserve space for the minimum stack frame */
|
||||
stack_ptr += VOF_STACK_SIZE - 0x20;
|
||||
|
||||
if (spapr->kernel_size &&
|
||||
vof_claim(vof, spapr->kernel_addr, spapr->kernel_size, 0) == -1) {
|
||||
error_setg(errp, "Memory for kernel is in use");
|
||||
return;
|
||||
}
|
||||
|
||||
if (spapr->initrd_size &&
|
||||
vof_claim(vof, spapr->initrd_base, spapr->initrd_size, 0) == -1) {
|
||||
error_setg(errp, "Memory for initramdisk is in use");
|
||||
return;
|
||||
}
|
||||
|
||||
spapr_vof_client_dt_finalize(spapr, fdt);
|
||||
|
||||
spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT,
|
||||
stack_ptr, spapr->initrd_base,
|
||||
spapr->initrd_size);
|
||||
/* VOF is 32bit BE so enforce MSR here */
|
||||
first_ppc_cpu->env.msr &= ~((1ULL << MSR_SF) | (1ULL << MSR_LE));
|
||||
|
||||
/*
|
||||
* At this point the expected allocation map is:
|
||||
*
|
||||
* 0..c38 - the initial firmware
|
||||
* 8000..10000 - stack
|
||||
* 400000.. - kernel
|
||||
* 3ea0000.. - initramdisk
|
||||
*
|
||||
* We skip writing FDT as nothing expects it; OF client interface is
|
||||
* going to be used for reading the device tree.
|
||||
*/
|
||||
}
|
||||
|
||||
void spapr_vof_quiesce(MachineState *ms)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(ms);
|
||||
|
||||
spapr->fdt_size = fdt_totalsize(spapr->fdt_blob);
|
||||
spapr->fdt_initial_size = spapr->fdt_size;
|
||||
}
|
||||
|
||||
bool spapr_vof_setprop(MachineState *ms, const char *path, const char *propname,
|
||||
void *val, int vallen)
|
||||
{
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(ms);
|
||||
|
||||
/*
|
||||
* We only allow changing properties which we know how to update in QEMU
|
||||
* OR
|
||||
* the ones which we know that they need to survive during "quiesce".
|
||||
*/
|
||||
|
||||
if (strcmp(path, "/rtas") == 0) {
|
||||
if (strcmp(propname, "linux,rtas-base") == 0 ||
|
||||
strcmp(propname, "linux,rtas-entry") == 0) {
|
||||
/* These need to survive quiesce so let them store in the FDT */
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(path, "/chosen") == 0) {
|
||||
if (strcmp(propname, "bootargs") == 0) {
|
||||
Vof *vof = spapr->vof;
|
||||
|
||||
g_free(vof->bootargs);
|
||||
vof->bootargs = g_strndup(val, vallen);
|
||||
return true;
|
||||
}
|
||||
if (strcmp(propname, "linux,initrd-start") == 0) {
|
||||
if (vallen == sizeof(uint32_t)) {
|
||||
spapr->initrd_base = ldl_be_p(val);
|
||||
return true;
|
||||
}
|
||||
if (vallen == sizeof(uint64_t)) {
|
||||
spapr->initrd_base = ldq_be_p(val);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (strcmp(propname, "linux,initrd-end") == 0) {
|
||||
if (vallen == sizeof(uint32_t)) {
|
||||
spapr->initrd_size = ldl_be_p(val) - spapr->initrd_base;
|
||||
return true;
|
||||
}
|
||||
if (vallen == sizeof(uint64_t)) {
|
||||
spapr->initrd_size = ldq_be_p(val) - spapr->initrd_base;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -71,6 +71,30 @@ spapr_rtas_ibm_configure_connector_invalid(uint32_t index) "DRC index: 0x%"PRIx3
|
||||
spapr_vio_h_reg_crq(uint64_t reg, uint64_t queue_addr, uint64_t queue_len) "CRQ for dev 0x%" PRIx64 " registered at 0x%" PRIx64 "/0x%" PRIx64
|
||||
spapr_vio_free_crq(uint32_t reg) "CRQ for dev 0x%" PRIx32 " freed"
|
||||
|
||||
# vof.c
|
||||
vof_error_str_truncated(const char *s, int len) "%s truncated to %d"
|
||||
vof_error_param(const char *method, int nargscheck, int nretcheck, int nargs, int nret) "%s takes/returns %d/%d, not %d/%d"
|
||||
vof_error_unknown_service(const char *service, int nargs, int nret) "\"%s\" args=%d rets=%d"
|
||||
vof_error_unknown_method(const char *method) "\"%s\""
|
||||
vof_error_unknown_ihandle_close(uint32_t ih) "ih=0x%x"
|
||||
vof_error_unknown_path(const char *path) "\"%s\""
|
||||
vof_error_write(uint32_t ih) "ih=0x%x"
|
||||
vof_finddevice(const char *path, uint32_t ph) "\"%s\" => ph=0x%x"
|
||||
vof_claim(uint32_t virt, uint32_t size, uint32_t align, uint32_t ret) "virt=0x%x size=0x%x align=0x%x => 0x%x"
|
||||
vof_release(uint32_t virt, uint32_t size, uint32_t ret) "virt=0x%x size=0x%x => 0x%x"
|
||||
vof_method(uint32_t ihandle, const char *method, uint32_t param, uint32_t ret, uint32_t ret2) "ih=0x%x \"%s\"(0x%x) => 0x%x 0x%x"
|
||||
vof_getprop(uint32_t ph, const char *prop, uint32_t ret, const char *val) "ph=0x%x \"%s\" => len=%d [%s]"
|
||||
vof_getproplen(uint32_t ph, const char *prop, uint32_t ret) "ph=0x%x \"%s\" => len=%d"
|
||||
vof_setprop(uint32_t ph, const char *prop, const char *val, uint32_t vallen, uint32_t ret) "ph=0x%x \"%s\" [%s] len=%d => ret=%d"
|
||||
vof_open(const char *path, uint32_t ph, uint32_t ih) "%s ph=0x%x => ih=0x%x"
|
||||
vof_interpret(const char *cmd, uint32_t param1, uint32_t param2, uint32_t ret, uint32_t ret2) "[%s] 0x%x 0x%x => 0x%x 0x%x"
|
||||
vof_package_to_path(uint32_t ph, const char *tmp, uint32_t ret) "ph=0x%x => %s len=%d"
|
||||
vof_instance_to_path(uint32_t ih, uint32_t ph, const char *tmp, uint32_t ret) "ih=0x%x ph=0x%x => %s len=%d"
|
||||
vof_instance_to_package(uint32_t ih, uint32_t ph) "ih=0x%x => ph=0x%x"
|
||||
vof_write(uint32_t ih, unsigned cb, const char *msg) "ih=0x%x [%u] \"%s\""
|
||||
vof_avail(uint64_t start, uint64_t end, uint64_t size) "0x%"PRIx64"..0x%"PRIx64" size=0x%"PRIx64
|
||||
vof_claimed(uint64_t start, uint64_t end, uint64_t size) "0x%"PRIx64"..0x%"PRIx64" size=0x%"PRIx64
|
||||
|
||||
# ppc.c
|
||||
ppc_tb_adjust(uint64_t offs1, uint64_t offs2, int64_t diff, int64_t seconds) "adjusted from 0x%"PRIx64" to 0x%"PRIx64", diff %"PRId64" (%"PRId64"s)"
|
||||
|
||||
|
||||
+1053
File diff suppressed because it is too large
Load Diff
+27
-4
@@ -12,6 +12,7 @@
|
||||
#include "hw/ppc/spapr_xive.h" /* For SpaprXive */
|
||||
#include "hw/ppc/xics.h" /* For ICSState */
|
||||
#include "hw/ppc/spapr_tpm_proxy.h"
|
||||
#include "hw/ppc/vof.h"
|
||||
|
||||
struct SpaprVioBus;
|
||||
struct SpaprPhbState;
|
||||
@@ -74,8 +75,10 @@ typedef enum {
|
||||
#define SPAPR_CAP_CCF_ASSIST 0x09
|
||||
/* Implements PAPR FWNMI option */
|
||||
#define SPAPR_CAP_FWNMI 0x0A
|
||||
/* Support H_RPT_INVALIDATE */
|
||||
#define SPAPR_CAP_RPT_INVALIDATE 0x0B
|
||||
/* Num Caps */
|
||||
#define SPAPR_CAP_NUM (SPAPR_CAP_FWNMI + 1)
|
||||
#define SPAPR_CAP_NUM (SPAPR_CAP_RPT_INVALIDATE + 1)
|
||||
|
||||
/*
|
||||
* Capability Values
|
||||
@@ -180,6 +183,7 @@ struct SpaprMachineState {
|
||||
uint64_t kernel_addr;
|
||||
uint32_t initrd_base;
|
||||
long initrd_size;
|
||||
Vof *vof;
|
||||
uint64_t rtc_offset; /* Now used only during incoming migration */
|
||||
struct PPCTimebase tb;
|
||||
bool has_graphics;
|
||||
@@ -398,10 +402,13 @@ struct SpaprMachineState {
|
||||
#define H_CPU_CHAR_THR_RECONF_TRIG PPC_BIT(6)
|
||||
#define H_CPU_CHAR_CACHE_COUNT_DIS PPC_BIT(7)
|
||||
#define H_CPU_CHAR_BCCTR_FLUSH_ASSIST PPC_BIT(9)
|
||||
|
||||
#define H_CPU_BEHAV_FAVOUR_SECURITY PPC_BIT(0)
|
||||
#define H_CPU_BEHAV_L1D_FLUSH_PR PPC_BIT(1)
|
||||
#define H_CPU_BEHAV_BNDS_CHK_SPEC_BAR PPC_BIT(2)
|
||||
#define H_CPU_BEHAV_FLUSH_COUNT_CACHE PPC_BIT(5)
|
||||
#define H_CPU_BEHAV_NO_L1D_FLUSH_ENTRY PPC_BIT(7)
|
||||
#define H_CPU_BEHAV_NO_L1D_FLUSH_UACCESS PPC_BIT(8)
|
||||
|
||||
/* Each control block has to be on a 4K boundary */
|
||||
#define H_CB_ALIGNMENT 4096
|
||||
@@ -542,8 +549,9 @@ struct SpaprMachineState {
|
||||
#define H_SCM_UNBIND_MEM 0x3F0
|
||||
#define H_SCM_UNBIND_ALL 0x3FC
|
||||
#define H_SCM_HEALTH 0x400
|
||||
#define H_RPT_INVALIDATE 0x448
|
||||
|
||||
#define MAX_HCALL_OPCODE H_SCM_HEALTH
|
||||
#define MAX_HCALL_OPCODE H_RPT_INVALIDATE
|
||||
|
||||
/* The hcalls above are standardized in PAPR and implemented by pHyp
|
||||
* as well.
|
||||
@@ -558,7 +566,9 @@ struct SpaprMachineState {
|
||||
/* Client Architecture support */
|
||||
#define KVMPPC_H_CAS (KVMPPC_HCALL_BASE + 0x2)
|
||||
#define KVMPPC_H_UPDATE_DT (KVMPPC_HCALL_BASE + 0x3)
|
||||
#define KVMPPC_HCALL_MAX KVMPPC_H_UPDATE_DT
|
||||
/* 0x4 was used for KVMPPC_H_UPDATE_PHANDLE in SLOF */
|
||||
#define KVMPPC_H_VOF_CLIENT (KVMPPC_HCALL_BASE + 0x5)
|
||||
#define KVMPPC_HCALL_MAX KVMPPC_H_VOF_CLIENT
|
||||
|
||||
/*
|
||||
* The hcall range 0xEF00 to 0xEF80 is reserved for use in facilitating
|
||||
@@ -770,7 +780,7 @@ void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr);
|
||||
#define SPAPR_IS_PCI_LIOBN(liobn) (!!((liobn) & 0x80000000))
|
||||
#define SPAPR_PCI_DMA_WINDOW_NUM(liobn) ((liobn) & 0xff)
|
||||
|
||||
#define RTAS_SIZE 2048
|
||||
#define RTAS_MIN_SIZE 20 /* hv_rtas_size in SLOF */
|
||||
#define RTAS_ERROR_LOG_MAX 2048
|
||||
|
||||
/* Offset from rtas-base where error log is placed */
|
||||
@@ -932,6 +942,7 @@ extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv;
|
||||
extern const VMStateDescription vmstate_spapr_cap_large_decr;
|
||||
extern const VMStateDescription vmstate_spapr_cap_ccf_assist;
|
||||
extern const VMStateDescription vmstate_spapr_cap_fwnmi;
|
||||
extern const VMStateDescription vmstate_spapr_cap_rpt_invalidate;
|
||||
|
||||
static inline uint8_t spapr_get_cap(SpaprMachineState *spapr, int cap)
|
||||
{
|
||||
@@ -956,4 +967,16 @@ bool spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
|
||||
void spapr_set_all_lpcrs(target_ulong value, target_ulong mask);
|
||||
hwaddr spapr_get_rtas_addr(void);
|
||||
bool spapr_memory_hot_unplug_supported(SpaprMachineState *spapr);
|
||||
|
||||
void spapr_vof_reset(SpaprMachineState *spapr, void *fdt, Error **errp);
|
||||
void spapr_vof_quiesce(MachineState *ms);
|
||||
bool spapr_vof_setprop(MachineState *ms, const char *path, const char *propname,
|
||||
void *val, int vallen);
|
||||
target_ulong spapr_h_vof_client(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
target_ulong opcode, target_ulong *args);
|
||||
target_ulong spapr_vof_client_architecture_support(MachineState *ms,
|
||||
CPUState *cs,
|
||||
target_ulong ovec_addr);
|
||||
void spapr_vof_client_dt_finalize(SpaprMachineState *spapr, void *fdt);
|
||||
|
||||
#endif /* HW_SPAPR_H */
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Virtual Open Firmware
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#ifndef HW_VOF_H
|
||||
#define HW_VOF_H
|
||||
|
||||
typedef struct Vof {
|
||||
uint64_t top_addr; /* copied from rma_size */
|
||||
GArray *claimed; /* array of SpaprOfClaimed */
|
||||
uint64_t claimed_base;
|
||||
GHashTable *of_instances; /* ihandle -> SpaprOfInstance */
|
||||
uint32_t of_instance_last;
|
||||
char *bootargs;
|
||||
long fw_size;
|
||||
} Vof;
|
||||
|
||||
int vof_client_call(MachineState *ms, Vof *vof, void *fdt,
|
||||
target_ulong args_real);
|
||||
uint64_t vof_claim(Vof *vof, uint64_t virt, uint64_t size, uint64_t align);
|
||||
void vof_init(Vof *vof, uint64_t top_addr, Error **errp);
|
||||
void vof_cleanup(Vof *vof);
|
||||
void vof_build_dt(void *fdt, Vof *vof);
|
||||
uint32_t vof_client_open_store(void *fdt, Vof *vof, const char *nodename,
|
||||
const char *prop, const char *path);
|
||||
|
||||
#define TYPE_VOF_MACHINE_IF "vof-machine-if"
|
||||
|
||||
typedef struct VofMachineIfClass VofMachineIfClass;
|
||||
DECLARE_CLASS_CHECKERS(VofMachineIfClass, VOF_MACHINE, TYPE_VOF_MACHINE_IF)
|
||||
|
||||
struct VofMachineIfClass {
|
||||
InterfaceClass parent;
|
||||
target_ulong (*client_architecture_support)(MachineState *ms, CPUState *cs,
|
||||
target_ulong vec);
|
||||
void (*quiesce)(MachineState *ms);
|
||||
bool (*setprop)(MachineState *ms, const char *path, const char *propname,
|
||||
void *val, int vallen);
|
||||
};
|
||||
|
||||
/*
|
||||
* Initial stack size is from
|
||||
* https://www.devicetree.org/open-firmware/bindings/ppc/release/ppc-2_1.html#REF27292
|
||||
*
|
||||
* "Client programs shall be invoked with a valid stack pointer (r1) with
|
||||
* at least 32K bytes of memory available for stack growth".
|
||||
*/
|
||||
#define VOF_STACK_SIZE 0x8000
|
||||
|
||||
#define VOF_MEM_READ(pa, buf, size) \
|
||||
address_space_read(&address_space_memory, \
|
||||
(pa), MEMTXATTRS_UNSPECIFIED, (buf), (size))
|
||||
#define VOF_MEM_WRITE(pa, buf, size) \
|
||||
address_space_write(&address_space_memory, \
|
||||
(pa), MEMTXATTRS_UNSPECIFIED, (buf), (size))
|
||||
|
||||
#endif /* HW_VOF_H */
|
||||
@@ -33,6 +33,8 @@
|
||||
#define KVM_FEATURE_PV_SCHED_YIELD 13
|
||||
#define KVM_FEATURE_ASYNC_PF_INT 14
|
||||
#define KVM_FEATURE_MSI_EXT_DEST_ID 15
|
||||
#define KVM_FEATURE_HC_MAP_GPA_RANGE 16
|
||||
#define KVM_FEATURE_MIGRATION_CONTROL 17
|
||||
|
||||
#define KVM_HINTS_REALTIME 0
|
||||
|
||||
@@ -54,6 +56,7 @@
|
||||
#define MSR_KVM_POLL_CONTROL 0x4b564d05
|
||||
#define MSR_KVM_ASYNC_PF_INT 0x4b564d06
|
||||
#define MSR_KVM_ASYNC_PF_ACK 0x4b564d07
|
||||
#define MSR_KVM_MIGRATION_CONTROL 0x4b564d08
|
||||
|
||||
struct kvm_steal_time {
|
||||
uint64_t steal;
|
||||
@@ -90,6 +93,16 @@ struct kvm_clock_pairing {
|
||||
/* MSR_KVM_ASYNC_PF_INT */
|
||||
#define KVM_ASYNC_PF_VEC_MASK GENMASK(7, 0)
|
||||
|
||||
/* MSR_KVM_MIGRATION_CONTROL */
|
||||
#define KVM_MIGRATION_READY (1 << 0)
|
||||
|
||||
/* KVM_HC_MAP_GPA_RANGE */
|
||||
#define KVM_MAP_GPA_RANGE_PAGE_SZ_4K 0
|
||||
#define KVM_MAP_GPA_RANGE_PAGE_SZ_2M (1 << 0)
|
||||
#define KVM_MAP_GPA_RANGE_PAGE_SZ_1G (1 << 1)
|
||||
#define KVM_MAP_GPA_RANGE_ENC_STAT(n) (n << 4)
|
||||
#define KVM_MAP_GPA_RANGE_ENCRYPTED KVM_MAP_GPA_RANGE_ENC_STAT(1)
|
||||
#define KVM_MAP_GPA_RANGE_DECRYPTED KVM_MAP_GPA_RANGE_ENC_STAT(0)
|
||||
|
||||
/* Operations for KVM_HC_MMU_OP */
|
||||
#define KVM_MMU_OP_WRITE_PTE 1
|
||||
|
||||
@@ -167,6 +167,13 @@ extern "C" {
|
||||
#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
|
||||
#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
|
||||
|
||||
/* 64 bpp RGB */
|
||||
#define DRM_FORMAT_XRGB16161616 fourcc_code('X', 'R', '4', '8') /* [63:0] x:R:G:B 16:16:16:16 little endian */
|
||||
#define DRM_FORMAT_XBGR16161616 fourcc_code('X', 'B', '4', '8') /* [63:0] x:B:G:R 16:16:16:16 little endian */
|
||||
|
||||
#define DRM_FORMAT_ARGB16161616 fourcc_code('A', 'R', '4', '8') /* [63:0] A:R:G:B 16:16:16:16 little endian */
|
||||
#define DRM_FORMAT_ABGR16161616 fourcc_code('A', 'B', '4', '8') /* [63:0] A:B:G:R 16:16:16:16 little endian */
|
||||
|
||||
/*
|
||||
* Floating point 64bpp RGB
|
||||
* IEEE 754-2008 binary16 half-precision float
|
||||
|
||||
@@ -233,7 +233,7 @@ enum tunable_id {
|
||||
ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
|
||||
/*
|
||||
* Add your fresh new tunable attribute above and remember to update
|
||||
* tunable_strings[] in net/core/ethtool.c
|
||||
* tunable_strings[] in net/ethtool/common.c
|
||||
*/
|
||||
__ETHTOOL_TUNABLE_COUNT,
|
||||
};
|
||||
@@ -297,7 +297,7 @@ enum phy_tunable_id {
|
||||
ETHTOOL_PHY_EDPD,
|
||||
/*
|
||||
* Add your fresh new phy tunable attribute above and remember to update
|
||||
* phy_tunable_strings[] in net/core/ethtool.c
|
||||
* phy_tunable_strings[] in net/ethtool/common.c
|
||||
*/
|
||||
__ETHTOOL_PHY_TUNABLE_COUNT,
|
||||
};
|
||||
|
||||
@@ -611,6 +611,7 @@
|
||||
#define KEY_VOICECOMMAND 0x246 /* Listening Voice Command */
|
||||
#define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */
|
||||
#define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */
|
||||
#define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */
|
||||
|
||||
#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */
|
||||
#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
#define VIRTIO_ID_SOUND 25 /* virtio sound */
|
||||
#define VIRTIO_ID_FS 26 /* virtio filesystem */
|
||||
#define VIRTIO_ID_PMEM 27 /* virtio pmem */
|
||||
#define VIRTIO_ID_BT 28 /* virtio bluetooth */
|
||||
#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */
|
||||
#define VIRTIO_ID_BT 40 /* virtio bluetooth */
|
||||
|
||||
#endif /* _LINUX_VIRTIO_IDS_H */
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
#include "standard-headers/linux/virtio_ids.h"
|
||||
#include "standard-headers/linux/virtio_config.h"
|
||||
|
||||
/* The feature bitmap for virtio vsock */
|
||||
#define VIRTIO_VSOCK_F_SEQPACKET 1 /* SOCK_SEQPACKET supported */
|
||||
|
||||
struct virtio_vsock_config {
|
||||
uint64_t guest_cid;
|
||||
} QEMU_PACKED;
|
||||
@@ -65,6 +68,7 @@ struct virtio_vsock_hdr {
|
||||
|
||||
enum virtio_vsock_type {
|
||||
VIRTIO_VSOCK_TYPE_STREAM = 1,
|
||||
VIRTIO_VSOCK_TYPE_SEQPACKET = 2,
|
||||
};
|
||||
|
||||
enum virtio_vsock_op {
|
||||
@@ -91,4 +95,9 @@ enum virtio_vsock_shutdown {
|
||||
VIRTIO_VSOCK_SHUTDOWN_SEND = 2,
|
||||
};
|
||||
|
||||
/* VIRTIO_VSOCK_OP_RW flags values */
|
||||
enum virtio_vsock_rw {
|
||||
VIRTIO_VSOCK_SEQ_EOR = 1,
|
||||
};
|
||||
|
||||
#endif /* _LINUX_VIRTIO_VSOCK_H */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user