qemu/hw/arm
Peter Maydell 817e2db8ce hw/arm/boot: Support setting psci-conduit based on guest EL
Currently we expect board code to set the psci-conduit property on
CPUs and ensure that secondary CPUs are created with the
start-powered-off property set to false, if the board wishes to use
QEMU's builtin PSCI emulation.  This worked OK for the virt board
where we first wanted to use it, because the virt board directly
creates its CPUs and is in a reasonable position to set those
properties.  For other boards which model real hardware and use a
separate SoC object, however, it is more awkward.  Most PSCI-using
boards just set the psci-conduit board unconditionally.

This was never strictly speaking correct (because you would not be
able to run EL3 guest firmware that itself provided the PSCI
interface, as the QEMU implementation would overrule it), but mostly
worked in practice because for non-PSCI SMC calls QEMU would emulate
the SMC instruction as normal (by trapping to guest EL3).  However,
we would like to make our PSCI emulation follow the part of the SMCC
specification that mandates that SMC calls with unknown function
identifiers return a failure code, which means that all SMC calls
will be handled by the PSCI code and the "emulate as normal" path
will no longer be taken.

We tried to implement that in commit 9fcd15b919
("arm: tcg: Adhere to SMCCC 1.3 section 5.2"), but this
regressed attempts to run EL3 guest code on the affected boards:
 * mcimx6ul-evk, mcimx7d-sabre, orangepi, xlnx-zcu102
 * for the case only of EL3 code loaded via -kernel (and
   not via -bios or -pflash), virt and xlnx-versal-virt
so for the 7.0 release we reverted it (in commit 4825eaae4f).

This commit provides a mechanism that boards can use to arrange that
psci-conduit is set if running guest code at a low enough EL but not
if it would be running at the same EL that the conduit implies that
the QEMU PSCI implementation is using.  (Later commits will convert
individual board models to use this mechanism.)

We do this by moving the setting of the psci-conduit and
start-powered-off properties to arm_load_kernel().  Boards which want
to potentially use emulated PSCI must set a psci_conduit field in the
arm_boot_info struct to the type of conduit they want to use (SMC or
HVC); arm_load_kernel() will then set the CPUs up accordingly if it
is not going to start the guest code at the same or higher EL as the
fake QEMU firmware would be at.

Board/SoC code which uses this mechanism should no longer set the CPU
psci-conduit property directly.  It should only set the
start-powered-off property for secondaries if EL3 guest firmware
running bare metal expects that rather than the alternative "all CPUs
start executing the firmware at once".

Note that when calculating whether we are going to run guest
code at EL3, we ignore the setting of arm_boot_info::secure_board_setup,
which might cause us to run a stub bit of guest code at EL3 which
does some board-specific setup before dropping to EL2 or EL1 to
run the guest kernel. This is OK because only one board that
enables PSCI sets secure_board_setup (the highbank board), and
the stub code it writes will behave the same way whether the
one SMC call it makes is handled by "emulate the SMC" or by
"PSCI default returns an error code". So we can leave that stub
code in place until after we've changed the PSCI default behaviour;
at that point we will remove it.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Tested-by: Cédric Le Goater <clg@kaod.org>
Message-id: 20220127154639.2090164-4-peter.maydell@linaro.org
2022-02-08 10:56:27 +00:00
..
allwinner-a10.c Do not include exec/address-spaces.h if it's not really necessary 2021-05-02 17:24:51 +02:00
allwinner-h3.c allwinner-h3: Switch to SMC as PSCI conduit 2021-09-30 13:42:09 +01:00
armsse.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
armv7m.c hw/armv7m: Fix broken VMStateDescription 2022-01-28 14:29:46 +00:00
aspeed_ast2600.c hw/arm: ast2600: Fix address mapping of second SPI controller 2022-01-28 14:29:47 +00:00
aspeed_soc.c hw/arm: Integrate ADC model into Aspeed SoC 2021-10-12 08:20:08 +02:00
aspeed.c hw/arm/aspeed: Replace drive_get_next() by drive_get() 2021-12-15 14:56:06 +01:00
bcm2835_peripherals.c hw/arm: Add basic power management to raspi. 2021-07-02 11:48:36 +01:00
bcm2836.c Do not include cpu.h if it's not really necessary 2021-05-02 17:24:51 +02:00
boot.c hw/arm/boot: Support setting psci-conduit based on guest EL 2022-02-08 10:56:27 +00:00
collie.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
cubieboard.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
digic_boards.c hw/arm: Don't include qemu-common.h unnecessarily 2021-12-15 10:35:26 +00:00
digic.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
exynos4_boards.c Do not include cpu.h if it's not really necessary 2021-05-02 17:24:51 +02:00
exynos4210.c hw/dma/pl330: Add memory region to replace default 2021-08-25 10:48:50 +01:00
fsl-imx6.c Add the ability to change the FEC PHY MDIO device number on i.MX6 processor 2020-07-13 14:36:08 +01:00
fsl-imx6ul.c fsl-imx6ul: Instantiate SAI1/2/3 and ASRC as unimplemented devices 2021-08-25 10:48:50 +01:00
fsl-imx7.c fsl-imx7: Instantiate SAI1/2/3 as unimplemented devices 2021-08-25 10:48:51 +01:00
fsl-imx25.c Do not include exec/address-spaces.h if it's not really necessary 2021-05-02 17:24:51 +02:00
fsl-imx31.c Do not include cpu.h if it's not really necessary 2021-05-02 17:24:51 +02:00
gumstix.c hw/arm/gumstix: Simplify since the machines are little-endian only 2020-03-05 16:09:14 +00:00
highbank.c hw/arm: Don't include qemu-common.h unnecessarily 2021-12-15 10:35:26 +00:00
imx25_pdk.c hw/arm/imx25_pdk: Replace drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
integratorcp.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
Kconfig hw/arm/virt: Support for virtio-mem-pci 2022-01-20 11:47:52 +00:00
kzm.c Do not include cpu.h if it's not really necessary 2021-05-02 17:24:51 +02:00
mainstone.c qtest: delete superfluous inclusions of qtest.h 2021-03-09 06:03:53 +01:00
mcimx6ul-evk.c hw/arm/mcimx6ul-evk: Replace drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
mcimx7d-sabre.c hw/arm/mcimx7d-sabre: Replace drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
meson.build stm32vldiscovery: Add the STM32VLDISCOVERY Machine 2021-07-09 16:09:12 +01:00
microbit.c hw/arm: Display CPU type in machine description 2021-02-03 10:15:51 +00:00
mps2-tz.c hw/arm/mps2-tz.c: Mark internal-only I2C buses as 'full' 2021-09-13 21:01:08 +01:00
mps2.c hw/arm/mps2.c: Mark internal-only I2C buses as 'full' 2021-09-13 21:01:08 +01:00
msf2-soc.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
msf2-som.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
musca.c arm: Update infocenter.arm.com URLs 2021-02-11 11:50:14 +00:00
musicpal.c hw/net: Move MV88W8618 network device out of hw/arm/ directory 2022-01-20 11:47:52 +00:00
netduino2.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
netduinoplus2.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
npcm7xx_boards.c hw/arm: kudo add lm75s behind bus 1 switch at 75 2022-01-20 11:47:53 +00:00
npcm7xx.c hw/arm: Add Nuvoton SD module to board 2021-11-02 14:14:55 -04:00
nrf51_soc.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
nseries.c hw/arm/nseries: Display hexadecimal value with '0x' prefix 2021-07-27 10:57:40 +01:00
omap1.c rtc: Move RTC function prototypes to their own header 2022-01-28 14:29:46 +00:00
omap2.c Do not include hw/boards.h if it's not really necessary 2021-05-02 17:24:51 +02:00
omap_sx1.c hw/arm: Use memory_region_init_rom() with read-only regions 2020-03-17 15:18:46 +01:00
orangepi.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
palm.c Do not include exec/address-spaces.h if it's not really necessary 2021-05-02 17:24:51 +02:00
pxa2xx_gpio.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
pxa2xx_pic.c hw/arm: Constify VMStateDescription 2021-05-02 17:24:50 +02:00
pxa2xx.c rtc: Move RTC function prototypes to their own header 2022-01-28 14:29:46 +00:00
raspi.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
realview.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
sabrelite.c hw: Replace trivial drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
sbsa-ref.c hw/arm: Don't include qemu-common.h unnecessarily 2021-12-15 10:35:26 +00:00
smmu-common.c dma: Let dma_memory_read/write() take MemTxAttrs argument 2021-12-30 17:16:32 +01:00
smmu-internal.h hw/arm/smmuv3: Fix SMMU_CMD_CFGI_STE_RANGE handling 2021-03-12 12:40:10 +00:00
smmuv3-internal.h hw/arm/smmuv3: Check 31st bit to see if CD is valid 2021-07-27 10:57:39 +01:00
smmuv3.c dma: Let dma_memory_read/write() take MemTxAttrs argument 2021-12-30 17:16:32 +01:00
spitz.c hw/i2c: Rename i2c_set_slave_address() -> i2c_slave_set_address() 2021-07-08 14:15:01 -05:00
stellaris.c hw/sd/ssi-sd: Do not create SD card within controller's realize 2021-12-15 08:38:16 +01:00
stm32f100_soc.c hw/arm/stm32f100: Wire up sysclk and refclk 2021-09-01 11:08:19 +01:00
stm32f205_soc.c hw/arm/stm32f205: Wire up sysclk and refclk 2021-09-01 11:08:19 +01:00
stm32f405_soc.c hw/arm: Don't include qemu-common.h unnecessarily 2021-12-15 10:35:26 +00:00
stm32vldiscovery.c arm: Remove system_clock_scale global 2021-09-01 11:08:21 +01:00
strongarm.c rtc: Move RTC function prototypes to their own header 2022-01-28 14:29:46 +00:00
strongarm.h hw/arm/collie: Create the RAM in the board 2019-10-22 17:44:01 +01:00
sysbus-fdt.c arm: Eliminate all TPM related code if CONFIG_TPM is not set 2021-06-15 10:54:55 -04:00
tosa.c hw/ssi: Rename SSI 'slave' as 'peripheral' 2020-12-10 12:15:03 -05:00
trace-events docs: fix references to docs/devel/tracing.rst 2021-06-02 06:51:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
versatilepb.c hw/arm/versatilepb hw/arm/vexpress: Replace drive_get_next() by drive_get() 2021-12-15 08:38:16 +01:00
vexpress.c Block device patches patches for 2021-12-15 2021-12-15 12:14:44 -08:00
virt-acpi-build.c hw/arm/virt: Drop superfluous checks against highmem 2022-01-20 11:47:53 +00:00
virt.c hw/arm/virt: Drop superfluous checks against highmem 2022-01-20 11:47:53 +00:00
xilinx_zynq.c hw/arm/xilinx_zynq: Replace drive_get_next() by drive_get() 2021-12-15 14:55:40 +01:00
xlnx-versal-virt.c hw/arm/xlnx-versal-virt: Connect mt35xu01g flashes to the OSPI 2022-01-28 14:29:46 +00:00
xlnx-versal.c hw/arm/xlnx-versal: Connect the OSPI flash memory controller model 2022-01-28 14:29:46 +00:00
xlnx-zcu102.c hw/arm/xlnx-zcu102: Replace drive_get_next() by drive_get() 2021-12-15 14:55:25 +01:00
xlnx-zynqmp.c hw/arm/xlnx-zynqmp: 'Or' the QSPI / QSPI DMA IRQs 2022-02-08 10:56:27 +00:00
z2.c hw/arm: Constify VMStateDescription 2021-05-02 17:24:50 +02:00