target-arm queue:

* New board type max78000fthr
  * Enable use of CXL on Arm 'virt' board
  * Some more tidyup of ID register handling
  * Refactor AT insns and PMU regs into separate source files
  * Don't enforce NSE,NS check for EL3->EL3 returns
  * hw/arm/fsl-imx8mp: Wire VIRQ and VFIQ
  * Allow nested-virtualization with KVM on the 'virt' board
  * system/qdev: Remove pointless NULL check in qdev_device_add_from_qdict
  * hw/arm/virt-acpi-build: Don't create ITS id mappings by default
  * target/arm: Remove unused helper_sme2_luti4_4b
 -----BEGIN PGP SIGNATURE-----
 
 iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmhxEcoZHHBldGVyLm1h
 eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3j5yEACWYnNeqo8Yph6/EJExE6eV
 r0tC6FBb5ShPgA6kDxhpOc1lI6uXGh8+D7bL9BePEdz/brCf1QDfs2Z4q/hb5ysX
 D0H6VI5Gr1j6MjkFRBo3+vvYz4Yh++XLn5Q9lZv8zaSEdraq/ay2kxnuhRCK+4Ar
 +QoGtKrGMJ7UCpfiRlvNnd1UjgORZf10EE/bRImX13sxeDomP3CZhFzAyJyShOP9
 JA7bAd4rYJ4oj8R33y8Yaxjwm4FOndj740B0zwpO8mpjzFiE5zbqsaO+mEgYSflc
 OQisCu/KRFpyIR+UqP+4gNaJLfKQW5Y4r61zEaiJWV/c4RdKNnbK1f7MX11fNhOk
 k1paF3GIXp6f794Hb14vtsYnKHF2eeNSmRkAomXxLgUSYzLezL+yj7cdYmRJhgYU
 thc1PSiEmHYhjRmOaMC9+dkMtvIexWyDNYNFTygoOE5/kTMSazeTFQpFmw+ZuTee
 9pjKsYRZJgTa64IkJy1L34jc2gds48Q20KpQsqZ22KQcjwt4PW4eQXkvMylawSut
 mArHVH6AAxIK+defeEmnQCJ0OccyGCENjRDuWyWMMGoP/ggZpO47rGWmCUOK8xz8
 IfGdPeF/9xsKSKWvjpiHyyKa48wuO2bVC+5bISS6IPA2uGneS2DpmjkHU+gHBqpk
 GNlvEnXZfavZOHejE7/L/Q==
 =hJ4/
 -----END PGP SIGNATURE-----

Merge tag 'pull-target-arm-20250711' of https://gitlab.com/pm215/qemu into staging

target-arm queue:
 * New board type max78000fthr
 * Enable use of CXL on Arm 'virt' board
 * Some more tidyup of ID register handling
 * Refactor AT insns and PMU regs into separate source files
 * Don't enforce NSE,NS check for EL3->EL3 returns
 * hw/arm/fsl-imx8mp: Wire VIRQ and VFIQ
 * Allow nested-virtualization with KVM on the 'virt' board
 * system/qdev: Remove pointless NULL check in qdev_device_add_from_qdict
 * hw/arm/virt-acpi-build: Don't create ITS id mappings by default
 * target/arm: Remove unused helper_sme2_luti4_4b

# -----BEGIN PGP SIGNATURE-----
#
# iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmhxEcoZHHBldGVyLm1h
# eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3j5yEACWYnNeqo8Yph6/EJExE6eV
# r0tC6FBb5ShPgA6kDxhpOc1lI6uXGh8+D7bL9BePEdz/brCf1QDfs2Z4q/hb5ysX
# D0H6VI5Gr1j6MjkFRBo3+vvYz4Yh++XLn5Q9lZv8zaSEdraq/ay2kxnuhRCK+4Ar
# +QoGtKrGMJ7UCpfiRlvNnd1UjgORZf10EE/bRImX13sxeDomP3CZhFzAyJyShOP9
# JA7bAd4rYJ4oj8R33y8Yaxjwm4FOndj740B0zwpO8mpjzFiE5zbqsaO+mEgYSflc
# OQisCu/KRFpyIR+UqP+4gNaJLfKQW5Y4r61zEaiJWV/c4RdKNnbK1f7MX11fNhOk
# k1paF3GIXp6f794Hb14vtsYnKHF2eeNSmRkAomXxLgUSYzLezL+yj7cdYmRJhgYU
# thc1PSiEmHYhjRmOaMC9+dkMtvIexWyDNYNFTygoOE5/kTMSazeTFQpFmw+ZuTee
# 9pjKsYRZJgTa64IkJy1L34jc2gds48Q20KpQsqZ22KQcjwt4PW4eQXkvMylawSut
# mArHVH6AAxIK+defeEmnQCJ0OccyGCENjRDuWyWMMGoP/ggZpO47rGWmCUOK8xz8
# IfGdPeF/9xsKSKWvjpiHyyKa48wuO2bVC+5bISS6IPA2uGneS2DpmjkHU+gHBqpk
# GNlvEnXZfavZOHejE7/L/Q==
# =hJ4/
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 11 Jul 2025 09:29:46 EDT
# gpg:                using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE
# gpg:                issuer "peter.maydell@linaro.org"
# gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [full]
# gpg:                 aka "Peter Maydell <pmaydell@gmail.com>" [full]
# gpg:                 aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [full]
# gpg:                 aka "Peter Maydell <peter@archaic.org.uk>" [unknown]
# Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83  15CF 3C25 25ED 1436 0CDE

* tag 'pull-target-arm-20250711' of https://gitlab.com/pm215/qemu: (36 commits)
  tests/functional: Add a test for the MAX78000 arm machine
  docs/system: arm: Add max78000 board description
  target/arm: Remove helper_sme2_luti4_4b
  hw/arm/virt-acpi-build: Don't create ITS id mappings by default
  system/qdev: Remove pointless NULL check in qdev_device_add_from_qdict
  hw/arm/virt: Allow virt extensions with KVM
  hw/arm/arm_gicv3_kvm: Add a migration blocker with kvm nested virt
  target/arm: Enable feature ARM_FEATURE_EL2 if EL2 is supported
  target/arm/kvm: Add helper to detect EL2 when using KVM
  hw/arm: Allow setting KVM vGIC maintenance IRQ
  hw/arm/fsl-imx8mp: Wire VIRQ and VFIQ
  target/arm: Don't enforce NSE,NS check for EL3->EL3 returns
  target/arm: Split out performance monitor regs to cpregs-pmu.c
  target/arm: Split out AT insns to tcg/cpregs-at.c
  target/arm: Drop stub for define_tlb_insn_regs
  arm/kvm: shorten one overly long line
  arm/cpu: store clidr into the idregs array
  arm/cpu: fix trailing ',' for SET_IDREG
  arm/cpu: store id_aa64afr{0,1} into the idregs array
  arm/cpu: store id_afr0 into the idregs array
  ...

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2025-07-13 01:45:17 -04:00
commit 0edc2afe0c
62 changed files with 4300 additions and 2010 deletions

View file

@ -0,0 +1,50 @@
/*
* MAX78000 SOC
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_ARM_MAX78000_SOC_H
#define HW_ARM_MAX78000_SOC_H
#include "hw/or-irq.h"
#include "hw/arm/armv7m.h"
#include "hw/misc/max78000_aes.h"
#include "hw/misc/max78000_gcr.h"
#include "hw/misc/max78000_icc.h"
#include "hw/char/max78000_uart.h"
#include "hw/misc/max78000_trng.h"
#include "qom/object.h"
#define TYPE_MAX78000_SOC "max78000-soc"
OBJECT_DECLARE_SIMPLE_TYPE(MAX78000State, MAX78000_SOC)
#define FLASH_BASE_ADDRESS 0x10000000
#define FLASH_SIZE (512 * 1024)
#define SRAM_BASE_ADDRESS 0x20000000
#define SRAM_SIZE (128 * 1024)
/* The MAX78k has 2 instruction caches; only icc0 matters, icc1 is for RISC */
#define MAX78000_NUM_ICC 2
#define MAX78000_NUM_UART 3
struct MAX78000State {
SysBusDevice parent_obj;
ARMv7MState armv7m;
MemoryRegion sram;
MemoryRegion flash;
Max78000GcrState gcr;
Max78000IccState icc[MAX78000_NUM_ICC];
Max78000UartState uart[MAX78000_NUM_UART];
Max78000TrngState trng;
Max78000AesState aes;
Clock *sysclk;
};
#endif

View file

@ -36,6 +36,7 @@
#include "hw/arm/boot.h"
#include "hw/arm/bsa.h"
#include "hw/block/flash.h"
#include "hw/cxl/cxl.h"
#include "system/kvm.h"
#include "hw/intc/arm_gicv3_common.h"
#include "qom/object.h"
@ -85,6 +86,7 @@ enum {
/* indices of IO regions located after the RAM */
enum {
VIRT_HIGH_GIC_REDIST2 = VIRT_LOWMEMMAP_LAST,
VIRT_CXL_HOST,
VIRT_HIGH_PCIE_ECAM,
VIRT_HIGH_PCIE_MMIO,
};
@ -140,6 +142,7 @@ struct VirtMachineState {
bool secure;
bool highmem;
bool highmem_compact;
bool highmem_cxl;
bool highmem_ecam;
bool highmem_mmio;
bool highmem_redists;
@ -174,6 +177,7 @@ struct VirtMachineState {
char *oem_id;
char *oem_table_id;
bool ns_el2_virt_timer_irq;
CXLState cxl_devices_state;
};
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)

View file

@ -0,0 +1,78 @@
/*
* MAX78000 UART
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MAX78000_UART_H
#define HW_MAX78000_UART_H
#include "hw/sysbus.h"
#include "chardev/char-fe.h"
#include "qemu/fifo8.h"
#include "qom/object.h"
#define UART_CTRL 0x0
#define UART_STATUS 0x4
#define UART_INT_EN 0x8
#define UART_INT_FL 0xc
#define UART_CLKDIV 0x10
#define UART_OSR 0x14
#define UART_TXPEEK 0x18
#define UART_PNR 0x1c
#define UART_FIFO 0x20
#define UART_DMA 0x30
#define UART_WKEN 0x34
#define UART_WKFL 0x38
/* CTRL */
#define UART_CTF_DIS (1 << 7)
#define UART_FLUSH_TX (1 << 8)
#define UART_FLUSH_RX (1 << 9)
#define UART_BCLKEN (1 << 15)
#define UART_BCLKRDY (1 << 19)
/* STATUS */
#define UART_RX_LVL 8
#define UART_TX_EM (1 << 6)
#define UART_RX_FULL (1 << 5)
#define UART_RX_EM (1 << 4)
/* PNR (Pin Control Register) */
#define UART_CTS 1
#define UART_RTS (1 << 1)
/* INT_EN / INT_FL */
#define UART_RX_THD (1 << 4)
#define UART_TX_HE (1 << 6)
#define UART_RXBUFLEN 0x100
#define TYPE_MAX78000_UART "max78000-uart"
OBJECT_DECLARE_SIMPLE_TYPE(Max78000UartState, MAX78000_UART)
struct Max78000UartState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint32_t ctrl;
uint32_t status;
uint32_t int_en;
uint32_t int_fl;
uint32_t clkdiv;
uint32_t osr;
uint32_t txpeek;
uint32_t pnr;
uint32_t fifo;
uint32_t dma;
uint32_t wken;
uint32_t wkfl;
Fifo8 rx_fifo;
CharBackend chr;
qemu_irq irq;
};
#endif /* HW_STM32F2XX_USART_H */

View file

@ -27,6 +27,8 @@
typedef struct PXBCXLDev PXBCXLDev;
typedef struct CXLFixedWindow {
SysBusDevice parent_obj;
int index;
uint64_t size;
char **targets;
PXBCXLDev *target_hbs[16];
@ -37,12 +39,13 @@ typedef struct CXLFixedWindow {
MemoryRegion mr;
hwaddr base;
} CXLFixedWindow;
#define TYPE_CXL_FMW "cxl-fmw"
OBJECT_DECLARE_SIMPLE_TYPE(CXLFixedWindow, CXL_FMW)
typedef struct CXLState {
bool is_enabled;
MemoryRegion host_mr;
unsigned int next_mr_idx;
GList *fixed_windows;
CXLFixedMemoryWindowOptionsList *cfmw_list;
} CXLState;

View file

@ -14,8 +14,11 @@
#define CXL_HOST_H
void cxl_machine_init(Object *obj, CXLState *state);
void cxl_fmws_link_targets(CXLState *stat, Error **errp);
void cxl_fmws_link_targets(Error **errp);
void cxl_hook_up_pxb_registers(PCIBus *bus, CXLState *state, Error **errp);
hwaddr cxl_fmws_set_memmap(hwaddr base, hwaddr max_addr);
void cxl_fmws_update_mmio(void);
GSList *cxl_fmws_get_all_sorted(void);
extern const MemoryRegionOps cfmws_ops;

View file

@ -231,6 +231,7 @@ struct GICv3State {
uint32_t num_cpu;
uint32_t num_irq;
uint32_t revision;
uint32_t maint_irq;
bool lpi_enable;
bool nmi_support;
bool security_extn;

View file

@ -0,0 +1,68 @@
/*
* MAX78000 AES
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MAX78000_AES_H
#define HW_MAX78000_AES_H
#include "hw/sysbus.h"
#include "crypto/aes.h"
#include "qom/object.h"
#define TYPE_MAX78000_AES "max78000-aes"
OBJECT_DECLARE_SIMPLE_TYPE(Max78000AesState, MAX78000_AES)
#define CTRL 0
#define STATUS 4
#define INTFL 8
#define INTEN 0xc
#define FIFO 0x10
#define KEY_BASE 0x400
#define KEY_END 0x420
/* CTRL */
#define TYPE (1 << 9 | 1 << 8)
#define KEY_SIZE (1 << 7 | 1 << 6)
#define OUTPUT_FLUSH (1 << 5)
#define INPUT_FLUSH (1 << 4)
#define START (1 << 3)
#define AES_EN (1 << 0)
/* STATUS */
#define OUTPUT_FULL (1 << 4)
#define OUTPUT_EMPTY (1 << 3)
#define INPUT_FULL (1 << 2)
#define INPUT_EMPTY (1 << 1)
#define BUSY (1 << 0)
/* INTFL*/
#define DONE (1 << 0)
struct Max78000AesState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint32_t ctrl;
uint32_t status;
uint32_t intfl;
uint32_t inten;
uint32_t data_index;
uint8_t data[16];
uint8_t key[32];
AES_KEY internal_key;
uint32_t result_index;
uint8_t result[16];
qemu_irq irq;
};
#endif

View file

@ -0,0 +1,131 @@
/*
* MAX78000 Global Control Register
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MAX78000_GCR_H
#define HW_MAX78000_GCR_H
#include "hw/sysbus.h"
#include "qom/object.h"
#define TYPE_MAX78000_GCR "max78000-gcr"
OBJECT_DECLARE_SIMPLE_TYPE(Max78000GcrState, MAX78000_GCR)
#define SYSCTRL 0x0
#define RST0 0x4
#define CLKCTRL 0x8
#define PM 0xc
#define PCLKDIV 0x18
#define PCLKDIS0 0x24
#define MEMCTRL 0x28
#define MEMZ 0x2c
#define SYSST 0x40
#define RST1 0x44
#define PCKDIS1 0x48
#define EVENTEN 0x4c
#define REVISION 0x50
#define SYSIE 0x54
#define ECCERR 0x64
#define ECCED 0x68
#define ECCIE 0x6c
#define ECCADDR 0x70
/* RST0 */
#define SYSTEM_RESET (1 << 31)
#define PERIPHERAL_RESET (1 << 30)
#define SOFT_RESET (1 << 29)
#define UART2_RESET (1 << 28)
#define ADC_RESET (1 << 26)
#define CNN_RESET (1 << 25)
#define TRNG_RESET (1 << 24)
#define RTC_RESET (1 << 17)
#define I2C0_RESET (1 << 16)
#define SPI1_RESET (1 << 13)
#define UART1_RESET (1 << 12)
#define UART0_RESET (1 << 11)
#define TMR3_RESET (1 << 8)
#define TMR2_RESET (1 << 7)
#define TMR1_RESET (1 << 6)
#define TMR0_RESET (1 << 5)
#define GPIO1_RESET (1 << 3)
#define GPIO0_RESET (1 << 2)
#define WDT0_RESET (1 << 1)
#define DMA_RESET (1 << 0)
/* CLKCTRL */
#define SYSCLK_RDY (1 << 13)
/* MEMZ */
#define ram0 (1 << 0)
#define ram1 (1 << 1)
#define ram2 (1 << 2)
#define ram3 (1 << 3)
/* RST1 */
#define CPU1_RESET (1 << 31)
#define SIMO_RESET (1 << 25)
#define DVS_RESET (1 << 24)
#define I2C2_RESET (1 << 20)
#define I2S_RESET (1 << 19)
#define SMPHR_RESET (1 << 16)
#define SPI0_RESET (1 << 11)
#define AES_RESET (1 << 10)
#define CRC_RESET (1 << 9)
#define PT_RESET (1 << 1)
#define I2C1_RESET (1 << 0)
#define SYSRAM0_START 0x20000000
#define SYSRAM1_START 0x20008000
#define SYSRAM2_START 0x20010000
#define SYSRAM3_START 0x2001C000
struct Max78000GcrState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint32_t sysctrl;
uint32_t rst0;
uint32_t clkctrl;
uint32_t pm;
uint32_t pclkdiv;
uint32_t pclkdis0;
uint32_t memctrl;
uint32_t memz;
uint32_t sysst;
uint32_t rst1;
uint32_t pckdis1;
uint32_t eventen;
uint32_t revision;
uint32_t sysie;
uint32_t eccerr;
uint32_t ecced;
uint32_t eccie;
uint32_t eccaddr;
MemoryRegion *sram;
AddressSpace sram_as;
DeviceState *uart0;
DeviceState *uart1;
DeviceState *uart2;
DeviceState *trng;
DeviceState *aes;
};
#endif

View file

@ -0,0 +1,33 @@
/*
* MAX78000 Instruction Cache
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MAX78000_ICC_H
#define HW_MAX78000_ICC_H
#include "hw/sysbus.h"
#include "qom/object.h"
#define TYPE_MAX78000_ICC "max78000-icc"
OBJECT_DECLARE_SIMPLE_TYPE(Max78000IccState, MAX78000_ICC)
#define ICC_INFO 0x0
#define ICC_SZ 0x4
#define ICC_CTRL 0x100
#define ICC_INVALIDATE 0x700
struct Max78000IccState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint32_t info;
uint32_t sz;
uint32_t ctrl;
};
#endif

View file

@ -0,0 +1,35 @@
/*
* MAX78000 True Random Number Generator
*
* Copyright (c) 2025 Jackson Donaldson <jcksn@duck.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MAX78000_TRNG_H
#define HW_MAX78000_TRNG_H
#include "hw/sysbus.h"
#include "qom/object.h"
#define TYPE_MAX78000_TRNG "max78000-trng"
OBJECT_DECLARE_SIMPLE_TYPE(Max78000TrngState, MAX78000_TRNG)
#define CTRL 0
#define STATUS 4
#define DATA 8
#define RND_IE (1 << 1)
struct Max78000TrngState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint32_t ctrl;
uint32_t status;
uint32_t data;
qemu_irq irq;
};
#endif