Misc HW patches
- Replace compile-time checks by runtime ones to build virtio-mem.c once - Cleanups in Raven PCI host bridge, audio and PC devices - Allow machine dynamic registration of valid CPU types - Introduce DEFINE_MACHINE_WITH_INTERFACE[_ARRAY]() macros - Set DDR2 minimum write recovery time in EEPROM SPD - Have PPCe500 machines abort gracefully when using invalid CPU - Prevent buffer overflow in openrisc_sim_init() - Pass PCI domain to Xen xc_physdev_map_pirq_msi() - Fix register API leaks - Simplify Xilinx CANFD model - Unconditionally create System I/O on PReP machine - Update documentation around '-soundhw' command line option -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmj4k3QACgkQ4+MsLN6t wN7dTw/9EIt8F4b0Y8fYgXngAPyNm4GxVPNJt1ULUIbG/D8NSPcXmbTyFwC+1HL+ KtDp5Dxs460BSWBVQUH1BYlrcJTkl2UP/hB31md3S5E3GtKLp7dN+W96RtAENqlc jcGkNtNftozuA939eNmGgoxdRN8UYnHB1y423aKrZ7SpMu1AZU+XKaiF2/x5RAZJ hyKqEvNK8DIy+1dF8O4xJ2v8w59kmIMeptpqEIhkIkS2bsPKt6nJ1/Rw7TG9z4L5 inIcKvYP1fRu+P0BHTUakTjkzyQtbtTNzbxJfAZ/z6/gSxbdfWOI4N0dslhxzo7Z thjV5O52fr+dOkHEKOvUNOKZCXNtvUlbjqZQz8GfOwvneEca6LpJwZu0ZikHx7vY y7e1d8FzC3qDSwLzXu4f1a/HiuPPAeYpLz7kfW5q3Y43ahtp+SurDswv2kBKk8GK ZbgMO0bw0C5rV/bnoqItG4Ce+MzROkY/CWDNAy9AcjwzTL/SmMryXTFcKHcpHEoL ya4hADwNR5df2ItquZ/YkNFkmpWHUM3cMlWQYDpQe2hgmIyObSGCluUJ/hlwyEJY nlTypsC2ui+eH+CkB3fWcjOCcYo/FFRKOn4MLWcXczTgMnI41n6VyUlcO7vyhEXD 2xTSvGe0+7z/C0KDqWYDOWab1GuPVAjjInD8Ygo0u3CBU2jCR1M= =Tz8F -----END PGP SIGNATURE----- Merge tag 'hw-misc-20251021' of https://github.com/philmd/qemu into staging Misc HW patches - Replace compile-time checks by runtime ones to build virtio-mem.c once - Cleanups in Raven PCI host bridge, audio and PC devices - Allow machine dynamic registration of valid CPU types - Introduce DEFINE_MACHINE_WITH_INTERFACE[_ARRAY]() macros - Set DDR2 minimum write recovery time in EEPROM SPD - Have PPCe500 machines abort gracefully when using invalid CPU - Prevent buffer overflow in openrisc_sim_init() - Pass PCI domain to Xen xc_physdev_map_pirq_msi() - Fix register API leaks - Simplify Xilinx CANFD model - Unconditionally create System I/O on PReP machine - Update documentation around '-soundhw' command line option # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmj4k3QACgkQ4+MsLN6t # wN7dTw/9EIt8F4b0Y8fYgXngAPyNm4GxVPNJt1ULUIbG/D8NSPcXmbTyFwC+1HL+ # KtDp5Dxs460BSWBVQUH1BYlrcJTkl2UP/hB31md3S5E3GtKLp7dN+W96RtAENqlc # jcGkNtNftozuA939eNmGgoxdRN8UYnHB1y423aKrZ7SpMu1AZU+XKaiF2/x5RAZJ # hyKqEvNK8DIy+1dF8O4xJ2v8w59kmIMeptpqEIhkIkS2bsPKt6nJ1/Rw7TG9z4L5 # inIcKvYP1fRu+P0BHTUakTjkzyQtbtTNzbxJfAZ/z6/gSxbdfWOI4N0dslhxzo7Z # thjV5O52fr+dOkHEKOvUNOKZCXNtvUlbjqZQz8GfOwvneEca6LpJwZu0ZikHx7vY # y7e1d8FzC3qDSwLzXu4f1a/HiuPPAeYpLz7kfW5q3Y43ahtp+SurDswv2kBKk8GK # ZbgMO0bw0C5rV/bnoqItG4Ce+MzROkY/CWDNAy9AcjwzTL/SmMryXTFcKHcpHEoL # ya4hADwNR5df2ItquZ/YkNFkmpWHUM3cMlWQYDpQe2hgmIyObSGCluUJ/hlwyEJY # nlTypsC2ui+eH+CkB3fWcjOCcYo/FFRKOn4MLWcXczTgMnI41n6VyUlcO7vyhEXD # 2xTSvGe0+7z/C0KDqWYDOWab1GuPVAjjInD8Ygo0u3CBU2jCR1M= # =Tz8F # -----END PGP SIGNATURE----- # gpg: Signature made Wed 22 Oct 2025 03:19:00 AM CDT # gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE # gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: FAAB E75E 1291 7221 DCFD 6BB2 E3E3 2C2C DEAD C0DE * tag 'hw-misc-20251021' of https://github.com/philmd/qemu: (45 commits) docs: Update mentions of removed '-soundhw' command line option docs: update -soundhw -> -device list MAINTAINERS: Add missing machine name in the Alpha section qemu/target-info: Include missing 'qapi-types-common.h' header hw/ppc/spapr: Rename resize_hpt_err to errp hw/audio: replace AUD_log() usage hw/pcspk: check the "pit" is set hw/pcspk: make 'pit' a class property hw/pcspk: use explicitly the required PIT types hw/audio: remove global pcspk hw/audio: rename model list function hw/audio: improve error reports tests/qtest/ds1338: Reuse from_bcd() hw/intc/apic: Pass APICCommonState to apic_register_{read,write} hw/i386/apic: Ensure own APIC use in apic_msr_{read,write} hw/i386/apic: Prefer APICCommonState over DeviceState hw/ide/ide-internal: Move dma_buf_commit() into ide "namespace" hw/rtc/mc146818rtc: Assert correct usage of mc146818rtc_set_cmos_data() hw/rtc/mc146818rtc: Use ARRAY_SIZE macro hw/rtc/mc146818rtc: Convert CMOS_DPRINTF() into trace events ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
6ba4667ffd
72 changed files with 760 additions and 927 deletions
|
|
@ -671,6 +671,7 @@ F: tests/docker/dockerfiles/emsdk-wasm32-cross.docker
|
|||
|
||||
Alpha Machines
|
||||
--------------
|
||||
Clipper
|
||||
M: Richard Henderson <richard.henderson@linaro.org>
|
||||
S: Maintained
|
||||
F: hw/alpha/
|
||||
|
|
|
|||
|
|
@ -311,9 +311,9 @@ constraints.
|
|||
|
||||
Host and guest part of audio devices have always been separate.
|
||||
|
||||
The old way to define guest audio devices is -soundhw C1,...
|
||||
The old way to define guest audio devices was -soundhw C1,...
|
||||
|
||||
The new way is to define each guest audio device separately with
|
||||
The current way is to define each guest audio device separately with
|
||||
-device.
|
||||
|
||||
Map from -soundhw sound card name to -device:
|
||||
|
|
@ -324,8 +324,10 @@ Map from -soundhw sound card name to -device:
|
|||
gus -device gus,iobase=IOADDR,irq=IRQ,dma=DMA,freq=F
|
||||
hda -device intel-hda,msi=MSI -device hda-duplex
|
||||
sb16 -device sb16,iobase=IOADDR,irq=IRQ,dma=DMA,dma16=DMA16,version=V
|
||||
adlib not yet available with -device
|
||||
pcspk not yet available with -device
|
||||
adlib -device adlib,iobase=IOADDR,freq=F
|
||||
|
||||
pcspk Not available with -device,
|
||||
but audiodev can be set with -machine pcspk-audiodev=<name>
|
||||
|
||||
For PCI devices, you can add bus=PCI-BUS,addr=DEVFN to control the PCI
|
||||
device address, as usual.
|
||||
|
|
|
|||
124
hw/audio/ac97.c
124
hw/audio/ac97.c
|
|
@ -26,6 +26,7 @@
|
|||
#include "qemu/module.h"
|
||||
#include "system/dma.h"
|
||||
#include "qom/object.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "ac97.h"
|
||||
|
||||
#define SOFT_VOLUME
|
||||
|
|
@ -141,11 +142,12 @@ enum {
|
|||
BUP_LAST = 2
|
||||
};
|
||||
|
||||
#ifdef DEBUG_AC97
|
||||
#define dolog(...) AUD_log("ac97", __VA_ARGS__)
|
||||
#else
|
||||
#define dolog(...)
|
||||
#endif
|
||||
#define DEBUG_AC97 0
|
||||
#define dolog(fmt, ...) do { \
|
||||
if (DEBUG_AC97) { \
|
||||
error_report("ac97: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define MKREGS(prefix, start) \
|
||||
enum { \
|
||||
|
|
@ -190,7 +192,7 @@ static void fetch_bd(AC97LinkState *s, AC97BusMasterRegs *r)
|
|||
r->bd.addr = le32_to_cpu(*(uint32_t *) &b[0]) & ~3;
|
||||
r->bd.ctl_len = le32_to_cpu(*(uint32_t *) &b[4]);
|
||||
r->picb = r->bd.ctl_len & 0xffff;
|
||||
dolog("bd %2d addr=0x%x ctl=0x%06x len=0x%x(%d bytes)\n",
|
||||
dolog("bd %2d addr=0x%x ctl=0x%06x len=0x%x(%d bytes)",
|
||||
r->civ, r->bd.addr, r->bd.ctl_len >> 16,
|
||||
r->bd.ctl_len & 0xffff, (r->bd.ctl_len & 0xffff) << 1);
|
||||
}
|
||||
|
|
@ -222,7 +224,7 @@ static void update_sr(AC97LinkState *s, AC97BusMasterRegs *r, uint32_t new_sr)
|
|||
|
||||
r->sr = new_sr;
|
||||
|
||||
dolog("IOC%d LVB%d sr=0x%x event=%d level=%d\n",
|
||||
dolog("IOC%d LVB%d sr=0x%x event=%d level=%d",
|
||||
r->sr & SR_BCIS, r->sr & SR_LVBCI, r->sr, event, level);
|
||||
|
||||
if (!event) {
|
||||
|
|
@ -231,11 +233,11 @@ static void update_sr(AC97LinkState *s, AC97BusMasterRegs *r, uint32_t new_sr)
|
|||
|
||||
if (level) {
|
||||
s->glob_sta |= masks[r - s->bm_regs];
|
||||
dolog("set irq level=1\n");
|
||||
dolog("set irq level=1");
|
||||
pci_irq_assert(&s->dev);
|
||||
} else {
|
||||
s->glob_sta &= ~masks[r - s->bm_regs];
|
||||
dolog("set irq level=0\n");
|
||||
dolog("set irq level=0");
|
||||
pci_irq_deassert(&s->dev);
|
||||
}
|
||||
}
|
||||
|
|
@ -256,14 +258,14 @@ static void voice_set_active(AC97LinkState *s, int bm_index, int on)
|
|||
break;
|
||||
|
||||
default:
|
||||
AUD_log("ac97", "invalid bm_index(%d) in voice_set_active", bm_index);
|
||||
error_report("ac97: invalid bm_index(%d) in voice_set_active", bm_index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void reset_bm_regs(AC97LinkState *s, AC97BusMasterRegs *r)
|
||||
{
|
||||
dolog("reset_bm_regs\n");
|
||||
dolog("reset_bm_regs");
|
||||
r->bdbar = 0;
|
||||
r->civ = 0;
|
||||
r->lvi = 0;
|
||||
|
|
@ -281,7 +283,7 @@ static void reset_bm_regs(AC97LinkState *s, AC97BusMasterRegs *r)
|
|||
static void mixer_store(AC97LinkState *s, uint32_t i, uint16_t v)
|
||||
{
|
||||
if (i + 2 > sizeof(s->mixer_data)) {
|
||||
dolog("mixer_store: index %d out of bounds %zd\n",
|
||||
dolog("mixer_store: index %d out of bounds %zd",
|
||||
i, sizeof(s->mixer_data));
|
||||
return;
|
||||
}
|
||||
|
|
@ -295,7 +297,7 @@ static uint16_t mixer_load(AC97LinkState *s, uint32_t i)
|
|||
uint16_t val = 0xffff;
|
||||
|
||||
if (i + 2 > sizeof(s->mixer_data)) {
|
||||
dolog("mixer_load: index %d out of bounds %zd\n",
|
||||
dolog("mixer_load: index %d out of bounds %zd",
|
||||
i, sizeof(s->mixer_data));
|
||||
} else {
|
||||
val = s->mixer_data[i + 0] | (s->mixer_data[i + 1] << 8);
|
||||
|
|
@ -460,7 +462,7 @@ static void mixer_reset(AC97LinkState *s)
|
|||
{
|
||||
uint8_t active[LAST_INDEX];
|
||||
|
||||
dolog("mixer_reset\n");
|
||||
dolog("mixer_reset");
|
||||
memset(s->mixer_data, 0, sizeof(s->mixer_data));
|
||||
memset(active, 0, sizeof(active));
|
||||
mixer_store(s, AC97_Reset, 0x0000); /* 6940 */
|
||||
|
|
@ -508,7 +510,7 @@ static void mixer_reset(AC97LinkState *s)
|
|||
static uint32_t nam_readb(void *opaque, uint32_t addr)
|
||||
{
|
||||
AC97LinkState *s = opaque;
|
||||
dolog("U nam readb 0x%x\n", addr);
|
||||
dolog("U nam readb 0x%x", addr);
|
||||
s->cas = 0;
|
||||
return ~0U;
|
||||
}
|
||||
|
|
@ -523,7 +525,7 @@ static uint32_t nam_readw(void *opaque, uint32_t addr)
|
|||
static uint32_t nam_readl(void *opaque, uint32_t addr)
|
||||
{
|
||||
AC97LinkState *s = opaque;
|
||||
dolog("U nam readl 0x%x\n", addr);
|
||||
dolog("U nam readl 0x%x", addr);
|
||||
s->cas = 0;
|
||||
return ~0U;
|
||||
}
|
||||
|
|
@ -535,7 +537,7 @@ static uint32_t nam_readl(void *opaque, uint32_t addr)
|
|||
static void nam_writeb(void *opaque, uint32_t addr, uint32_t val)
|
||||
{
|
||||
AC97LinkState *s = opaque;
|
||||
dolog("U nam writeb 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nam writeb 0x%x <- 0x%x", addr, val);
|
||||
s->cas = 0;
|
||||
}
|
||||
|
||||
|
|
@ -563,10 +565,10 @@ static void nam_writew(void *opaque, uint32_t addr, uint32_t val)
|
|||
break;
|
||||
case AC97_Vendor_ID1:
|
||||
case AC97_Vendor_ID2:
|
||||
dolog("Attempt to write vendor ID to 0x%x\n", val);
|
||||
dolog("Attempt to write vendor ID to 0x%x", val);
|
||||
break;
|
||||
case AC97_Extended_Audio_ID:
|
||||
dolog("Attempt to write extended audio ID to 0x%x\n", val);
|
||||
dolog("Attempt to write extended audio ID to 0x%x", val);
|
||||
break;
|
||||
case AC97_Extended_Audio_Ctrl_Stat:
|
||||
if (!(val & EACS_VRA)) {
|
||||
|
|
@ -579,36 +581,36 @@ static void nam_writew(void *opaque, uint32_t addr, uint32_t val)
|
|||
mixer_store(s, AC97_MIC_ADC_Rate, 0xbb80);
|
||||
open_voice(s, MC_INDEX, 48000);
|
||||
}
|
||||
dolog("Setting extended audio control to 0x%x\n", val);
|
||||
dolog("Setting extended audio control to 0x%x", val);
|
||||
mixer_store(s, AC97_Extended_Audio_Ctrl_Stat, val);
|
||||
break;
|
||||
case AC97_PCM_Front_DAC_Rate:
|
||||
if (mixer_load(s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRA) {
|
||||
mixer_store(s, addr, val);
|
||||
dolog("Set front DAC rate to %d\n", val);
|
||||
dolog("Set front DAC rate to %d", val);
|
||||
open_voice(s, PO_INDEX, val);
|
||||
} else {
|
||||
dolog("Attempt to set front DAC rate to %d, but VRA is not set\n",
|
||||
dolog("Attempt to set front DAC rate to %d, but VRA is not set",
|
||||
val);
|
||||
}
|
||||
break;
|
||||
case AC97_MIC_ADC_Rate:
|
||||
if (mixer_load(s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRM) {
|
||||
mixer_store(s, addr, val);
|
||||
dolog("Set MIC ADC rate to %d\n", val);
|
||||
dolog("Set MIC ADC rate to %d", val);
|
||||
open_voice(s, MC_INDEX, val);
|
||||
} else {
|
||||
dolog("Attempt to set MIC ADC rate to %d, but VRM is not set\n",
|
||||
dolog("Attempt to set MIC ADC rate to %d, but VRM is not set",
|
||||
val);
|
||||
}
|
||||
break;
|
||||
case AC97_PCM_LR_ADC_Rate:
|
||||
if (mixer_load(s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRA) {
|
||||
mixer_store(s, addr, val);
|
||||
dolog("Set front LR ADC rate to %d\n", val);
|
||||
dolog("Set front LR ADC rate to %d", val);
|
||||
open_voice(s, PI_INDEX, val);
|
||||
} else {
|
||||
dolog("Attempt to set LR ADC rate to %d, but VRA is not set\n",
|
||||
dolog("Attempt to set LR ADC rate to %d, but VRA is not set",
|
||||
val);
|
||||
}
|
||||
break;
|
||||
|
|
@ -630,7 +632,7 @@ static void nam_writew(void *opaque, uint32_t addr, uint32_t val)
|
|||
/* None of the features in these regs are emulated, so they are RO */
|
||||
break;
|
||||
default:
|
||||
dolog("U nam writew 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nam writew 0x%x <- 0x%x", addr, val);
|
||||
mixer_store(s, addr, val);
|
||||
break;
|
||||
}
|
||||
|
|
@ -639,7 +641,7 @@ static void nam_writew(void *opaque, uint32_t addr, uint32_t val)
|
|||
static void nam_writel(void *opaque, uint32_t addr, uint32_t val)
|
||||
{
|
||||
AC97LinkState *s = opaque;
|
||||
dolog("U nam writel 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nam writel 0x%x <- 0x%x", addr, val);
|
||||
s->cas = 0;
|
||||
}
|
||||
|
||||
|
|
@ -655,7 +657,7 @@ static uint32_t nabm_readb(void *opaque, uint32_t addr)
|
|||
|
||||
switch (addr) {
|
||||
case CAS:
|
||||
dolog("CAS %d\n", s->cas);
|
||||
dolog("CAS %d", s->cas);
|
||||
val = s->cas;
|
||||
s->cas = 1;
|
||||
break;
|
||||
|
|
@ -664,38 +666,38 @@ static uint32_t nabm_readb(void *opaque, uint32_t addr)
|
|||
case MC_CIV:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->civ;
|
||||
dolog("CIV[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("CIV[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_LVI:
|
||||
case PO_LVI:
|
||||
case MC_LVI:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->lvi;
|
||||
dolog("LVI[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("LVI[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_PIV:
|
||||
case PO_PIV:
|
||||
case MC_PIV:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->piv;
|
||||
dolog("PIV[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("PIV[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_CR:
|
||||
case PO_CR:
|
||||
case MC_CR:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->cr;
|
||||
dolog("CR[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("CR[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_SR:
|
||||
case PO_SR:
|
||||
case MC_SR:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->sr & 0xff;
|
||||
dolog("SRb[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("SRb[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm readb 0x%x -> 0x%x\n", addr, val);
|
||||
dolog("U nabm readb 0x%x -> 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
|
|
@ -713,17 +715,17 @@ static uint32_t nabm_readw(void *opaque, uint32_t addr)
|
|||
case MC_SR:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->sr;
|
||||
dolog("SR[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("SR[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_PICB:
|
||||
case PO_PICB:
|
||||
case MC_PICB:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->picb;
|
||||
dolog("PICB[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("PICB[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm readw 0x%x -> 0x%x\n", addr, val);
|
||||
dolog("U nabm readw 0x%x -> 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
|
|
@ -741,14 +743,14 @@ static uint32_t nabm_readl(void *opaque, uint32_t addr)
|
|||
case MC_BDBAR:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->bdbar;
|
||||
dolog("BMADDR[%d] -> 0x%x\n", GET_BM(addr), val);
|
||||
dolog("BMADDR[%d] -> 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_CIV:
|
||||
case PO_CIV:
|
||||
case MC_CIV:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->civ | (r->lvi << 8) | (r->sr << 16);
|
||||
dolog("CIV LVI SR[%d] -> 0x%x, 0x%x, 0x%x\n", GET_BM(addr),
|
||||
dolog("CIV LVI SR[%d] -> 0x%x, 0x%x, 0x%x", GET_BM(addr),
|
||||
r->civ, r->lvi, r->sr);
|
||||
break;
|
||||
case PI_PICB:
|
||||
|
|
@ -756,19 +758,19 @@ static uint32_t nabm_readl(void *opaque, uint32_t addr)
|
|||
case MC_PICB:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
val = r->picb | (r->piv << 16) | (r->cr << 24);
|
||||
dolog("PICB PIV CR[%d] -> 0x%x 0x%x 0x%x 0x%x\n", GET_BM(addr),
|
||||
dolog("PICB PIV CR[%d] -> 0x%x 0x%x 0x%x 0x%x", GET_BM(addr),
|
||||
val, r->picb, r->piv, r->cr);
|
||||
break;
|
||||
case GLOB_CNT:
|
||||
val = s->glob_cnt;
|
||||
dolog("glob_cnt -> 0x%x\n", val);
|
||||
dolog("glob_cnt -> 0x%x", val);
|
||||
break;
|
||||
case GLOB_STA:
|
||||
val = s->glob_sta | GS_S0CR;
|
||||
dolog("glob_sta -> 0x%x\n", val);
|
||||
dolog("glob_sta -> 0x%x", val);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm readl 0x%x -> 0x%x\n", addr, val);
|
||||
dolog("U nabm readl 0x%x -> 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
|
|
@ -795,7 +797,7 @@ static void nabm_writeb(void *opaque, uint32_t addr, uint32_t val)
|
|||
fetch_bd(s, r);
|
||||
}
|
||||
r->lvi = val % 32;
|
||||
dolog("LVI[%d] <- 0x%x\n", GET_BM(addr), val);
|
||||
dolog("LVI[%d] <- 0x%x", GET_BM(addr), val);
|
||||
break;
|
||||
case PI_CR:
|
||||
case PO_CR:
|
||||
|
|
@ -816,7 +818,7 @@ static void nabm_writeb(void *opaque, uint32_t addr, uint32_t val)
|
|||
voice_set_active(s, r - s->bm_regs, 1);
|
||||
}
|
||||
}
|
||||
dolog("CR[%d] <- 0x%x (cr 0x%x)\n", GET_BM(addr), val, r->cr);
|
||||
dolog("CR[%d] <- 0x%x (cr 0x%x)", GET_BM(addr), val, r->cr);
|
||||
break;
|
||||
case PI_SR:
|
||||
case PO_SR:
|
||||
|
|
@ -824,10 +826,10 @@ static void nabm_writeb(void *opaque, uint32_t addr, uint32_t val)
|
|||
r = &s->bm_regs[GET_BM(addr)];
|
||||
r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK);
|
||||
update_sr(s, r, r->sr & ~(val & SR_WCLEAR_MASK));
|
||||
dolog("SR[%d] <- 0x%x (sr 0x%x)\n", GET_BM(addr), val, r->sr);
|
||||
dolog("SR[%d] <- 0x%x (sr 0x%x)", GET_BM(addr), val, r->sr);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm writeb 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nabm writeb 0x%x <- 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -844,10 +846,10 @@ static void nabm_writew(void *opaque, uint32_t addr, uint32_t val)
|
|||
r = &s->bm_regs[GET_BM(addr)];
|
||||
r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK);
|
||||
update_sr(s, r, r->sr & ~(val & SR_WCLEAR_MASK));
|
||||
dolog("SR[%d] <- 0x%x (sr 0x%x)\n", GET_BM(addr), val, r->sr);
|
||||
dolog("SR[%d] <- 0x%x (sr 0x%x)", GET_BM(addr), val, r->sr);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm writew 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nabm writew 0x%x <- 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -863,22 +865,22 @@ static void nabm_writel(void *opaque, uint32_t addr, uint32_t val)
|
|||
case MC_BDBAR:
|
||||
r = &s->bm_regs[GET_BM(addr)];
|
||||
r->bdbar = val & ~3;
|
||||
dolog("BDBAR[%d] <- 0x%x (bdbar 0x%x)\n", GET_BM(addr), val, r->bdbar);
|
||||
dolog("BDBAR[%d] <- 0x%x (bdbar 0x%x)", GET_BM(addr), val, r->bdbar);
|
||||
break;
|
||||
case GLOB_CNT:
|
||||
/* TODO: Handle WR or CR being set (warm/cold reset requests) */
|
||||
if (!(val & (GC_WR | GC_CR))) {
|
||||
s->glob_cnt = val & GC_VALID_MASK;
|
||||
}
|
||||
dolog("glob_cnt <- 0x%x (glob_cnt 0x%x)\n", val, s->glob_cnt);
|
||||
dolog("glob_cnt <- 0x%x (glob_cnt 0x%x)", val, s->glob_cnt);
|
||||
break;
|
||||
case GLOB_STA:
|
||||
s->glob_sta &= ~(val & GS_WCLEAR_MASK);
|
||||
s->glob_sta |= (val & ~(GS_WCLEAR_MASK | GS_RO_MASK)) & GS_VALID_MASK;
|
||||
dolog("glob_sta <- 0x%x (glob_sta 0x%x)\n", val, s->glob_sta);
|
||||
dolog("glob_sta <- 0x%x (glob_sta 0x%x)", val, s->glob_sta);
|
||||
break;
|
||||
default:
|
||||
dolog("U nabm writel 0x%x <- 0x%x\n", addr, val);
|
||||
dolog("U nabm writel 0x%x <- 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -903,7 +905,7 @@ static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,
|
|||
to_copy = MIN(temp, sizeof(tmpbuf));
|
||||
pci_dma_read(&s->dev, addr, tmpbuf, to_copy);
|
||||
copied = AUD_write(s->voice_po, tmpbuf, to_copy);
|
||||
dolog("write_audio max=%x to_copy=%x copied=%x\n",
|
||||
dolog("write_audio max=%x to_copy=%x copied=%x",
|
||||
max, to_copy, copied);
|
||||
if (!copied) {
|
||||
*stop = 1;
|
||||
|
|
@ -916,7 +918,7 @@ static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,
|
|||
|
||||
if (!temp) {
|
||||
if (to_copy < 4) {
|
||||
dolog("whoops\n");
|
||||
dolog("whoops");
|
||||
s->last_samp = 0;
|
||||
} else {
|
||||
s->last_samp = *(uint32_t *)&tmpbuf[to_copy - 4];
|
||||
|
|
@ -929,7 +931,7 @@ static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,
|
|||
|
||||
static void write_bup(AC97LinkState *s, int elapsed)
|
||||
{
|
||||
dolog("write_bup\n");
|
||||
dolog("write_bup");
|
||||
if (!(s->bup_flag & BUP_SET)) {
|
||||
if (s->bup_flag & BUP_LAST) {
|
||||
int i;
|
||||
|
|
@ -997,7 +999,7 @@ static void transfer_audio(AC97LinkState *s, int index, int elapsed)
|
|||
int stop = 0;
|
||||
|
||||
if (s->invalid_freq[index]) {
|
||||
AUD_log("ac97", "attempt to use voice %d with invalid frequency %d\n",
|
||||
error_report("ac97: attempt to use voice %d with invalid frequency %d",
|
||||
index, s->invalid_freq[index]);
|
||||
return;
|
||||
}
|
||||
|
|
@ -1017,12 +1019,12 @@ static void transfer_audio(AC97LinkState *s, int index, int elapsed)
|
|||
int temp;
|
||||
|
||||
if (!r->bd_valid) {
|
||||
dolog("invalid bd\n");
|
||||
dolog("invalid bd");
|
||||
fetch_bd(s, r);
|
||||
}
|
||||
|
||||
if (!r->picb) {
|
||||
dolog("fresh bd %d is empty 0x%x 0x%x\n",
|
||||
dolog("fresh bd %d is empty 0x%x 0x%x",
|
||||
r->civ, r->bd.addr, r->bd.ctl_len);
|
||||
if (r->civ == r->lvi) {
|
||||
r->sr |= SR_DCH; /* CELV? */
|
||||
|
|
@ -1059,7 +1061,7 @@ static void transfer_audio(AC97LinkState *s, int index, int elapsed)
|
|||
}
|
||||
|
||||
if (r->civ == r->lvi) {
|
||||
dolog("Underrun civ (%d) == lvi (%d)\n", r->civ, r->lvi);
|
||||
dolog("Underrun civ (%d) == lvi (%d)", r->civ, r->lvi);
|
||||
|
||||
new_sr |= SR_LVBCI | SR_DCH | SR_CELV;
|
||||
stop = 1;
|
||||
|
|
|
|||
|
|
@ -29,24 +29,24 @@
|
|||
#include "audio/audio.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
//#define DEBUG
|
||||
#define DEBUG 0
|
||||
|
||||
#define ADLIB_KILL_TIMERS 1
|
||||
|
||||
#define ADLIB_DESC "Yamaha YM3812 (OPL2)"
|
||||
|
||||
#ifdef DEBUG
|
||||
#if DEBUG
|
||||
#include "qemu/timer.h"
|
||||
#endif
|
||||
|
||||
#define dolog(...) AUD_log ("adlib", __VA_ARGS__)
|
||||
#ifdef DEBUG
|
||||
#define ldebug(...) dolog (__VA_ARGS__)
|
||||
#else
|
||||
#define ldebug(...)
|
||||
#endif
|
||||
#define ldebug(fmt, ...) do { \
|
||||
if (DEBUG) { \
|
||||
error_report("adlib: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#include "fmopl.h"
|
||||
#define SHIFT 1
|
||||
|
|
@ -64,7 +64,7 @@ struct AdlibState {
|
|||
int enabled;
|
||||
int active;
|
||||
int bufpos;
|
||||
#ifdef DEBUG
|
||||
#if DEBUG
|
||||
int64_t exp[2];
|
||||
#endif
|
||||
int16_t *mixbuf;
|
||||
|
|
@ -92,7 +92,7 @@ static void adlib_kill_timers (AdlibState *s)
|
|||
|
||||
delta = AUD_get_elapsed_usec_out (s->voice, &s->ats);
|
||||
ldebug (
|
||||
"delta = %f dexp = %f expired => %d\n",
|
||||
"delta = %f dexp = %f expired => %d",
|
||||
delta / 1000000.0,
|
||||
s->dexp[i] / 1000000.0,
|
||||
delta >= s->dexp[i]
|
||||
|
|
@ -131,7 +131,7 @@ static void timer_handler (void *opaque, int c, double interval_Sec)
|
|||
{
|
||||
AdlibState *s = opaque;
|
||||
unsigned n = c & 1;
|
||||
#ifdef DEBUG
|
||||
#if DEBUG
|
||||
double interval;
|
||||
int64_t exp;
|
||||
#endif
|
||||
|
|
@ -142,7 +142,7 @@ static void timer_handler (void *opaque, int c, double interval_Sec)
|
|||
}
|
||||
|
||||
s->ticking[n] = 1;
|
||||
#ifdef DEBUG
|
||||
#if DEBUG
|
||||
interval = NANOSECONDS_PER_SECOND * interval_Sec;
|
||||
exp = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + interval;
|
||||
s->exp[n] = exp;
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
|
|
@ -43,21 +43,21 @@
|
|||
More...
|
||||
*/
|
||||
|
||||
/* #define DEBUG */
|
||||
#define DEBUG 0
|
||||
/* #define DEBUG_XLAW */
|
||||
|
||||
static struct {
|
||||
int aci_counter;
|
||||
} conf = {1};
|
||||
|
||||
#ifdef DEBUG
|
||||
#define dolog(...) AUD_log ("cs4231a", __VA_ARGS__)
|
||||
#else
|
||||
#define dolog(...)
|
||||
#endif
|
||||
#define dolog(fmt, ...) do { \
|
||||
if (DEBUG) { \
|
||||
error_report("cs4231a: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define lwarn(...) AUD_log ("cs4231a", "warning: " __VA_ARGS__)
|
||||
#define lerr(...) AUD_log ("cs4231a", "error: " __VA_ARGS__)
|
||||
#define lwarn(fmt, ...) warn_report("cs4231a: " fmt, ##__VA_ARGS__)
|
||||
#define lerr(fmt, ...) error_report("cs4231a: " fmt, ##__VA_ARGS__)
|
||||
|
||||
#define CS_REGS 16
|
||||
#define CS_DREGS 32
|
||||
|
|
@ -284,7 +284,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
|
|||
as.freq = freqs[xtal][(val >> 1) & 7];
|
||||
|
||||
if (as.freq == -1) {
|
||||
lerr ("unsupported frequency (val=%#x)\n", val);
|
||||
lerr("unsupported frequency (val=0x%x)", val);
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -319,11 +319,11 @@ static void cs_reset_voices (CSState *s, uint32_t val)
|
|||
|
||||
case 7:
|
||||
case 4:
|
||||
lerr ("attempt to use reserved format value (%#x)\n", val);
|
||||
lerr("attempt to use reserved format value (0x%x)", val);
|
||||
goto error;
|
||||
|
||||
case 5:
|
||||
lerr ("ADPCM 4 bit IMA compatible format is not supported\n");
|
||||
lerr("ADPCM 4 bit IMA compatible format is not supported");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -393,7 +393,7 @@ static uint64_t cs_read (void *opaque, hwaddr addr, unsigned size)
|
|||
ret = s->regs[saddr];
|
||||
break;
|
||||
}
|
||||
dolog ("read %d:%d -> %d\n", saddr, iaddr, ret);
|
||||
dolog("read %d:%d -> %d", saddr, iaddr, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -425,7 +425,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
case RESERVED:
|
||||
case RESERVED_2:
|
||||
case RESERVED_3:
|
||||
lwarn ("attempt to write %#x to reserved indirect register %d\n",
|
||||
lwarn("attempt to write 0x%x to reserved indirect register %d",
|
||||
val, iaddr);
|
||||
break;
|
||||
|
||||
|
|
@ -439,7 +439,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
cs_reset_voices (s, val);
|
||||
}
|
||||
else {
|
||||
lwarn ("[P]MCE(%#x, %#x) is not set, val=%#x\n",
|
||||
lwarn("[P]MCE(0x%x, 0x%x) is not set, val=0x%x",
|
||||
s->regs[Index_Address],
|
||||
s->dregs[Alternate_Feature_Status],
|
||||
val);
|
||||
|
|
@ -453,7 +453,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
val &= ~(1 << 5); /* D5 is reserved */
|
||||
s->dregs[iaddr] = val;
|
||||
if (val & PPIO) {
|
||||
lwarn ("PIO is not supported (%#x)\n", val);
|
||||
lwarn("PIO is not supported (0x%x)", val);
|
||||
break;
|
||||
}
|
||||
if (val & PEN) {
|
||||
|
|
@ -472,11 +472,11 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
break;
|
||||
|
||||
case Error_Status_And_Initialization:
|
||||
lwarn ("attempt to write to read only register %d\n", iaddr);
|
||||
lwarn("attempt to write to read only register %d", iaddr);
|
||||
break;
|
||||
|
||||
case MODE_And_ID:
|
||||
dolog ("val=%#x\n", val);
|
||||
dolog("val=0x%x", val);
|
||||
if (val & MODE2)
|
||||
s->dregs[iaddr] |= MODE2;
|
||||
else
|
||||
|
|
@ -485,7 +485,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
|
||||
case Alternate_Feature_Enable_I:
|
||||
if (val & TE)
|
||||
lerr ("timer is not yet supported\n");
|
||||
lerr("timer is not yet supported");
|
||||
s->dregs[iaddr] = val;
|
||||
break;
|
||||
|
||||
|
|
@ -499,7 +499,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
break;
|
||||
|
||||
case Version_Chip_ID:
|
||||
lwarn ("write to Version_Chip_ID register %#x\n", val);
|
||||
lwarn("write to Version_Chip_ID register 0x%x", val);
|
||||
s->dregs[iaddr] = val;
|
||||
break;
|
||||
|
||||
|
|
@ -507,7 +507,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
s->dregs[iaddr] = val;
|
||||
break;
|
||||
}
|
||||
dolog ("written value %#x to indirect register %d\n", val, iaddr);
|
||||
dolog("written value 0x%x to indirect register %d", val, iaddr);
|
||||
break;
|
||||
|
||||
case Status:
|
||||
|
|
@ -519,7 +519,7 @@ static void cs_write (void *opaque, hwaddr addr,
|
|||
break;
|
||||
|
||||
case PIO_Data:
|
||||
lwarn ("attempt to write value %#x to PIO register\n", val);
|
||||
lwarn("attempt to write value 0x%x to PIO register", val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#include "migration/vmstate.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/module.h"
|
||||
#include "system/dma.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qom/object.h"
|
||||
#include "trace.h"
|
||||
|
||||
|
|
@ -190,7 +190,7 @@ static void print_ctl(uint32_t val)
|
|||
a(CDC_EN);
|
||||
a(SERR_DIS);
|
||||
#undef a
|
||||
AUD_log("es1370", "ctl - PCLKDIV %d(DAC2 freq %d), freq %d,%s\n",
|
||||
error_report("es1370: ctl - PCLKDIV %d(DAC2 freq %d), freq %d,%s",
|
||||
(val & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV,
|
||||
DAC2_DIVTOSR((val & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
|
||||
dac1_samplerate[(val & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL],
|
||||
|
|
@ -226,7 +226,7 @@ static void print_sctl(uint32_t val)
|
|||
}
|
||||
#undef b
|
||||
#undef a
|
||||
AUD_log("es1370",
|
||||
error_report("es1370: "
|
||||
"%s p2_end_inc %d, p2_st_inc %d,"
|
||||
" r1_fmt %s, p2_fmt %s, p1_fmt %s\n",
|
||||
buf,
|
||||
|
|
@ -238,10 +238,10 @@ static void print_sctl(uint32_t val)
|
|||
}
|
||||
}
|
||||
|
||||
#define lwarn(...) \
|
||||
#define lwarn(fmt, ...) \
|
||||
do { \
|
||||
if (VERBOSE_ES1370) { \
|
||||
AUD_log("es1370: warning", __VA_ARGS__); \
|
||||
error_report("es1370: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
|
@ -502,10 +502,10 @@ static void es1370_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
|||
break;
|
||||
|
||||
case ES1370_REG_PHANTOM_FRAMECNT:
|
||||
lwarn("writing to phantom frame count 0x%" PRIx64 "\n", val);
|
||||
lwarn("writing to phantom frame count 0x%" PRIx64, val);
|
||||
break;
|
||||
case ES1370_REG_PHANTOM_FRAMEADR:
|
||||
lwarn("writing to phantom frame address 0x%" PRIx64 "\n", val);
|
||||
lwarn("writing to phantom frame address 0x%" PRIx64, val);
|
||||
break;
|
||||
|
||||
case ES1370_REG_ADC_FRAMECNT:
|
||||
|
|
@ -522,7 +522,7 @@ static void es1370_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
|||
break;
|
||||
|
||||
default:
|
||||
lwarn("writel 0x%" PRIx64 " <- 0x%" PRIx64 "\n", addr, val);
|
||||
lwarn("writel 0x%" PRIx64 " <- 0x%" PRIx64, addr, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -586,16 +586,16 @@ static uint64_t es1370_read(void *opaque, hwaddr addr, unsigned size)
|
|||
|
||||
case ES1370_REG_PHANTOM_FRAMECNT:
|
||||
val = ~0U;
|
||||
lwarn("reading from phantom frame count\n");
|
||||
lwarn("reading from phantom frame count");
|
||||
break;
|
||||
case ES1370_REG_PHANTOM_FRAMEADR:
|
||||
val = ~0U;
|
||||
lwarn("reading from phantom frame address\n");
|
||||
lwarn("reading from phantom frame address");
|
||||
break;
|
||||
|
||||
default:
|
||||
val = ~0U;
|
||||
lwarn("readl 0x%" PRIx64 " -> 0x%x\n", addr, val);
|
||||
lwarn("readl 0x%" PRIx64 " -> 0x%x", addr, val);
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
|
|
@ -677,7 +677,7 @@ static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
|
|||
* when the sample count reaches zero) or 1 for stop mode (set
|
||||
* interrupt and stop recording).
|
||||
*/
|
||||
AUD_log ("es1370: warning", "non looping mode\n");
|
||||
warn_report("es1370: non looping mode");
|
||||
} else {
|
||||
d->frame_cnt = size;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,15 +32,16 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "gusemu.h"
|
||||
#include "gustate.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define dolog(...) AUD_log ("audio", __VA_ARGS__)
|
||||
#ifdef DEBUG
|
||||
#define ldebug(...) dolog (__VA_ARGS__)
|
||||
#else
|
||||
#define ldebug(...)
|
||||
#endif
|
||||
#define DEBUG 0
|
||||
|
||||
#define ldebug(fmt, ...) do { \
|
||||
if (DEBUG) { \
|
||||
error_report("gus: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TYPE_GUS "gus"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(GUSState, GUS)
|
||||
|
|
@ -154,14 +155,14 @@ int GUS_irqrequest (GUSEmuState *emu, int hwirq, int n)
|
|||
/* qemu_irq_lower (s->pic); */
|
||||
qemu_irq_raise (s->pic);
|
||||
s->irqs += n;
|
||||
ldebug ("irqrequest %d %d %d\n", hwirq, n, s->irqs);
|
||||
ldebug("irqrequest %d %d %d", hwirq, n, s->irqs);
|
||||
return n;
|
||||
}
|
||||
|
||||
void GUS_irqclear (GUSEmuState *emu, int hwirq)
|
||||
{
|
||||
GUSState *s = emu->opaque;
|
||||
ldebug ("irqclear %d %d\n", hwirq, s->irqs);
|
||||
ldebug("irqclear %d %d", hwirq, s->irqs);
|
||||
qemu_irq_lower (s->pic);
|
||||
s->irqs -= 1;
|
||||
#ifdef IRQ_STORM
|
||||
|
|
@ -175,7 +176,7 @@ void GUS_dmarequest (GUSEmuState *emu)
|
|||
{
|
||||
GUSState *s = emu->opaque;
|
||||
IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
|
||||
ldebug ("dma request %d\n", der->gusdma);
|
||||
ldebug("dma request %d", s->emu.gusdma);
|
||||
k->hold_DREQ(s->isa_dma, s->emu.gusdma);
|
||||
}
|
||||
|
||||
|
|
@ -186,13 +187,13 @@ static int GUS_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
|
|||
QEMU_UNINITIALIZED char tmpbuf[4096];
|
||||
int pos = dma_pos, mode, left = dma_len - dma_pos;
|
||||
|
||||
ldebug ("read DMA %#x %d\n", dma_pos, dma_len);
|
||||
ldebug("read DMA 0x%x %d", dma_pos, dma_len);
|
||||
mode = k->has_autoinitialization(s->isa_dma, s->emu.gusdma);
|
||||
while (left) {
|
||||
int to_copy = MIN ((size_t) left, sizeof (tmpbuf));
|
||||
int copied;
|
||||
|
||||
ldebug ("left=%d to_copy=%d pos=%d\n", left, to_copy, pos);
|
||||
ldebug("left=%d to_copy=%d pos=%d", left, to_copy, pos);
|
||||
copied = k->read_memory(s->isa_dma, nchan, tmpbuf, pos, to_copy);
|
||||
gus_dma_transferdata (&s->emu, tmpbuf, copied, left == copied);
|
||||
left -= copied;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "hw/audio/pcspk.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qom/object.h"
|
||||
#include "trace.h"
|
||||
|
||||
#define PCSPK_BUF_LEN 1792
|
||||
#define PCSPK_SAMPLE_RATE 32000
|
||||
|
|
@ -50,7 +51,7 @@ struct PCSpkState {
|
|||
uint8_t sample_buf[PCSPK_BUF_LEN];
|
||||
QEMUSoundCard card;
|
||||
SWVoiceOut *voice;
|
||||
void *pit;
|
||||
PITCommonState *pit;
|
||||
unsigned int pit_count;
|
||||
unsigned int samples;
|
||||
unsigned int play_pos;
|
||||
|
|
@ -60,7 +61,6 @@ struct PCSpkState {
|
|||
};
|
||||
|
||||
static const char *s_spk = "pcspk";
|
||||
static PCSpkState *pcspk_state;
|
||||
|
||||
static inline void generate_samples(PCSpkState *s)
|
||||
{
|
||||
|
|
@ -125,7 +125,7 @@ static int pcspk_audio_init(PCSpkState *s)
|
|||
|
||||
s->voice = AUD_open_out(&s->card, s->voice, s_spk, s, pcspk_callback, &as);
|
||||
if (!s->voice) {
|
||||
AUD_log(s_spk, "Could not open voice\n");
|
||||
error_report("pcspk: Could not open voice");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -137,13 +137,18 @@ static uint64_t pcspk_io_read(void *opaque, hwaddr addr,
|
|||
{
|
||||
PCSpkState *s = opaque;
|
||||
PITChannelInfo ch;
|
||||
uint8_t val;
|
||||
|
||||
pit_get_channel_info(s->pit, 2, &ch);
|
||||
|
||||
s->dummy_refresh_clock ^= (1 << 4);
|
||||
|
||||
return ch.gate | (s->data_on << 1) | s->dummy_refresh_clock |
|
||||
val = ch.gate | (s->data_on << 1) | s->dummy_refresh_clock |
|
||||
(ch.out << 5);
|
||||
|
||||
trace_pcspk_io_read(s->iobase, val);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val,
|
||||
|
|
@ -152,6 +157,8 @@ static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val,
|
|||
PCSpkState *s = opaque;
|
||||
const int gate = val & 1;
|
||||
|
||||
trace_pcspk_io_write(s->iobase, val);
|
||||
|
||||
s->data_on = (val >> 1) & 1;
|
||||
pit_set_gate(s->pit, 2, gate);
|
||||
if (s->voice) {
|
||||
|
|
@ -175,11 +182,6 @@ static void pcspk_initfn(Object *obj)
|
|||
PCSpkState *s = PC_SPEAKER(obj);
|
||||
|
||||
memory_region_init_io(&s->ioport, OBJECT(s), &pcspk_io_ops, s, "pcspk", 1);
|
||||
|
||||
object_property_add_link(obj, "pit", TYPE_PIT_COMMON,
|
||||
(Object **)&s->pit,
|
||||
qdev_prop_allow_set_link_before_realize,
|
||||
0);
|
||||
}
|
||||
|
||||
static void pcspk_realizefn(DeviceState *dev, Error **errp)
|
||||
|
|
@ -187,13 +189,16 @@ static void pcspk_realizefn(DeviceState *dev, Error **errp)
|
|||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
PCSpkState *s = PC_SPEAKER(dev);
|
||||
|
||||
if (!s->pit) {
|
||||
error_setg(errp, "pcspk: No \"pit\" set or available");
|
||||
return;
|
||||
}
|
||||
|
||||
isa_register_ioport(isadev, &s->ioport, s->iobase);
|
||||
|
||||
if (s->card.state && AUD_register_card(s_spk, &s->card, errp)) {
|
||||
pcspk_audio_init(s);
|
||||
}
|
||||
|
||||
pcspk_state = s;
|
||||
}
|
||||
|
||||
static bool migrate_needed(void *opaque)
|
||||
|
|
@ -219,6 +224,7 @@ static const Property pcspk_properties[] = {
|
|||
DEFINE_AUDIO_PROPERTIES(PCSpkState, card),
|
||||
DEFINE_PROP_UINT32("iobase", PCSpkState, iobase, 0x61),
|
||||
DEFINE_PROP_BOOL("migrate", PCSpkState, migrate, true),
|
||||
DEFINE_PROP_LINK("pit", PCSpkState, pit, TYPE_PIT_COMMON, PITCommonState *),
|
||||
};
|
||||
|
||||
static void pcspk_class_initfn(ObjectClass *klass, const void *data)
|
||||
|
|
@ -229,7 +235,6 @@ static void pcspk_class_initfn(ObjectClass *klass, const void *data)
|
|||
set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
|
||||
dc->vmsd = &vmstate_spk;
|
||||
device_class_set_props(dc, pcspk_properties);
|
||||
/* Reason: realize sets global pcspk_state */
|
||||
/* Reason: pit object link */
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
|
|
|
|||
115
hw/audio/sb16.c
115
hw/audio/sb16.c
|
|
@ -30,22 +30,21 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define dolog(...) AUD_log ("sb16", __VA_ARGS__)
|
||||
|
||||
/* #define DEBUG */
|
||||
#define DEBUG 0
|
||||
/* #define DEBUG_SB16_MOST */
|
||||
|
||||
#ifdef DEBUG
|
||||
#define ldebug(...) dolog (__VA_ARGS__)
|
||||
#else
|
||||
#define ldebug(...)
|
||||
#endif
|
||||
#define ldebug(fmt, ...) do { \
|
||||
if (DEBUG) { \
|
||||
error_report("sb16: " fmt, ##__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
|
||||
|
||||
|
|
@ -157,7 +156,7 @@ static int irq_of_magic (int magic)
|
|||
#if 0
|
||||
static void log_dsp (SB16State *dsp)
|
||||
{
|
||||
ldebug ("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d\n",
|
||||
ldebug("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d",
|
||||
dsp->fmt_stereo ? "Stereo" : "Mono",
|
||||
dsp->fmt_signed ? "Signed" : "Unsigned",
|
||||
dsp->fmt_bits,
|
||||
|
|
@ -182,7 +181,7 @@ static void control (SB16State *s, int hold)
|
|||
IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
|
||||
s->dma_running = hold;
|
||||
|
||||
ldebug ("hold %d high %d dma %d\n", hold, s->use_hdma, dma);
|
||||
ldebug("hold %d high %d dma %d", hold, s->use_hdma, dma);
|
||||
|
||||
if (hold) {
|
||||
k->hold_DREQ(isa_dma, dma);
|
||||
|
|
@ -289,8 +288,8 @@ static void dma_cmd8 (SB16State *s, int mask, int dma_len)
|
|||
" alignment %d\n", s->block_size, s->align + 1);
|
||||
}
|
||||
|
||||
ldebug ("freq %d, stereo %d, sign %d, bits %d, "
|
||||
"dma %d, auto %d, fifo %d, high %d\n",
|
||||
ldebug("freq %d, stereo %d, sign %d, bits %d, "
|
||||
"dma %d, auto %d, fifo %d, high %d",
|
||||
s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
|
||||
s->block_size, s->dma_auto, s->fifo, s->highspeed);
|
||||
|
||||
|
|
@ -337,8 +336,8 @@ static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
|
|||
s->block_size <<= s->fmt_stereo;
|
||||
}
|
||||
|
||||
ldebug ("freq %d, stereo %d, sign %d, bits %d, "
|
||||
"dma %d, auto %d, fifo %d, high %d\n",
|
||||
ldebug("freq %d, stereo %d, sign %d, bits %d, "
|
||||
"dma %d, auto %d, fifo %d, high %d",
|
||||
s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
|
||||
s->block_size, s->dma_auto, s->fifo, s->highspeed);
|
||||
|
||||
|
|
@ -395,7 +394,7 @@ static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
|
|||
|
||||
static inline void dsp_out_data (SB16State *s, uint8_t val)
|
||||
{
|
||||
ldebug ("outdata %#x\n", val);
|
||||
ldebug("outdata 0x%x", val);
|
||||
if ((size_t) s->out_data_len < sizeof (s->out_data)) {
|
||||
s->out_data[s->out_data_len++] = val;
|
||||
}
|
||||
|
|
@ -407,18 +406,18 @@ static inline uint8_t dsp_get_data (SB16State *s)
|
|||
return s->in2_data[--s->in_index];
|
||||
}
|
||||
else {
|
||||
dolog ("buffer underflow\n");
|
||||
warn_report("sb16: buffer underflow");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void command (SB16State *s, uint8_t cmd)
|
||||
{
|
||||
ldebug ("command %#x\n", cmd);
|
||||
ldebug("command 0x%x", cmd);
|
||||
|
||||
if (cmd > 0xaf && cmd < 0xd0) {
|
||||
if (cmd & 8) {
|
||||
qemu_log_mask(LOG_UNIMP, "ADC not yet supported (command %#x)\n",
|
||||
qemu_log_mask(LOG_UNIMP, "ADC not yet supported (command 0x%x)\n",
|
||||
cmd);
|
||||
}
|
||||
|
||||
|
|
@ -427,7 +426,7 @@ static void command (SB16State *s, uint8_t cmd)
|
|||
case 12:
|
||||
break;
|
||||
default:
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%#x wrong bits\n", cmd);
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "0x%x wrong bits\n", cmd);
|
||||
}
|
||||
s->needed_bytes = 3;
|
||||
}
|
||||
|
|
@ -645,13 +644,13 @@ static void command (SB16State *s, uint8_t cmd)
|
|||
goto warn;
|
||||
|
||||
default:
|
||||
qemu_log_mask(LOG_UNIMP, "Unrecognized command %#x\n", cmd);
|
||||
qemu_log_mask(LOG_UNIMP, "Unrecognized command 0x%x\n", cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!s->needed_bytes) {
|
||||
ldebug ("\n");
|
||||
ldebug("!needed_bytes");
|
||||
}
|
||||
|
||||
exit:
|
||||
|
|
@ -664,7 +663,7 @@ static void command (SB16State *s, uint8_t cmd)
|
|||
return;
|
||||
|
||||
warn:
|
||||
qemu_log_mask(LOG_UNIMP, "warning: command %#x,%d is not truly understood"
|
||||
qemu_log_mask(LOG_UNIMP, "warning: command 0x%x,%d is not truly understood"
|
||||
" yet\n", cmd, s->needed_bytes);
|
||||
goto exit;
|
||||
|
||||
|
|
@ -687,7 +686,7 @@ static uint16_t dsp_get_hilo (SB16State *s)
|
|||
static void complete (SB16State *s)
|
||||
{
|
||||
int d0, d1, d2;
|
||||
ldebug ("complete command %#x, in_index %d, needed_bytes %d\n",
|
||||
ldebug("complete command 0x%x, in_index %d, needed_bytes %d",
|
||||
s->cmd, s->in_index, s->needed_bytes);
|
||||
|
||||
if (s->cmd > 0xaf && s->cmd < 0xd0) {
|
||||
|
|
@ -696,11 +695,11 @@ static void complete (SB16State *s)
|
|||
d0 = dsp_get_data (s);
|
||||
|
||||
if (s->cmd & 8) {
|
||||
dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
|
||||
warn_report("sb16: ADC params cmd = 0x%x d0 = %d, d1 = %d, d2 = %d",
|
||||
s->cmd, d0, d1, d2);
|
||||
}
|
||||
else {
|
||||
ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
|
||||
ldebug("cmd = 0x%x d0 = %d, d1 = %d, d2 = %d",
|
||||
s->cmd, d0, d1, d2);
|
||||
dma_cmd (s, s->cmd, d0, d1 + (d2 << 8));
|
||||
}
|
||||
|
|
@ -711,13 +710,13 @@ static void complete (SB16State *s)
|
|||
s->csp_mode = dsp_get_data (s);
|
||||
s->csp_reg83r = 0;
|
||||
s->csp_reg83w = 0;
|
||||
ldebug ("CSP command 0x04: mode=%#x\n", s->csp_mode);
|
||||
ldebug("CSP command 0x04: mode=0x%x", s->csp_mode);
|
||||
break;
|
||||
|
||||
case 0x05:
|
||||
s->csp_param = dsp_get_data (s);
|
||||
s->csp_value = dsp_get_data (s);
|
||||
ldebug ("CSP command 0x05: param=%#x value=%#x\n",
|
||||
ldebug("CSP command 0x05: param=0x%x value=0x%x",
|
||||
s->csp_param,
|
||||
s->csp_value);
|
||||
break;
|
||||
|
|
@ -725,9 +724,9 @@ static void complete (SB16State *s)
|
|||
case 0x0e:
|
||||
d0 = dsp_get_data (s);
|
||||
d1 = dsp_get_data (s);
|
||||
ldebug ("write CSP register %d <- %#x\n", d1, d0);
|
||||
ldebug("write CSP register %d <- 0x%x", d1, d0);
|
||||
if (d1 == 0x83) {
|
||||
ldebug ("0x83[%d] <- %#x\n", s->csp_reg83r, d0);
|
||||
ldebug("0x83[%d] <- 0x%x", s->csp_reg83r, d0);
|
||||
s->csp_reg83[s->csp_reg83r % 4] = d0;
|
||||
s->csp_reg83r += 1;
|
||||
}
|
||||
|
|
@ -738,10 +737,10 @@ static void complete (SB16State *s)
|
|||
|
||||
case 0x0f:
|
||||
d0 = dsp_get_data (s);
|
||||
ldebug ("read CSP register %#x -> %#x, mode=%#x\n",
|
||||
ldebug("read CSP register 0x%x -> 0x%x, mode=0x%x",
|
||||
d0, s->csp_regs[d0], s->csp_mode);
|
||||
if (d0 == 0x83) {
|
||||
ldebug ("0x83[%d] -> %#x\n",
|
||||
ldebug("0x83[%d] -> 0x%x",
|
||||
s->csp_reg83w,
|
||||
s->csp_reg83[s->csp_reg83w % 4]);
|
||||
dsp_out_data (s, s->csp_reg83[s->csp_reg83w % 4]);
|
||||
|
|
@ -754,7 +753,7 @@ static void complete (SB16State *s)
|
|||
|
||||
case 0x10:
|
||||
d0 = dsp_get_data (s);
|
||||
dolog ("cmd 0x10 d0=%#x\n", d0);
|
||||
warn_report("sb16: cmd 0x10 d0=0x%x", d0);
|
||||
break;
|
||||
|
||||
case 0x14:
|
||||
|
|
@ -763,7 +762,7 @@ static void complete (SB16State *s)
|
|||
|
||||
case 0x40:
|
||||
s->time_const = dsp_get_data (s);
|
||||
ldebug ("set time const %d\n", s->time_const);
|
||||
ldebug("set time const %d", s->time_const);
|
||||
break;
|
||||
|
||||
case 0x41:
|
||||
|
|
@ -776,12 +775,12 @@ static void complete (SB16State *s)
|
|||
* http://homepages.cae.wisc.edu/~brodskye/sb16doc/sb16doc.html#SamplingRate
|
||||
*/
|
||||
s->freq = restrict_sampling_rate(dsp_get_hilo(s));
|
||||
ldebug ("set freq %d\n", s->freq);
|
||||
ldebug("set freq %d", s->freq);
|
||||
break;
|
||||
|
||||
case 0x48:
|
||||
s->block_size = dsp_get_lohi (s) + 1;
|
||||
ldebug ("set dma block len %d\n", s->block_size);
|
||||
ldebug("set dma block len %d", s->block_size);
|
||||
break;
|
||||
|
||||
case 0x74:
|
||||
|
|
@ -811,21 +810,21 @@ static void complete (SB16State *s)
|
|||
);
|
||||
}
|
||||
}
|
||||
ldebug ("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks);
|
||||
ldebug("mix silence %d %d %" PRId64, samples, bytes, ticks);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xe0:
|
||||
d0 = dsp_get_data (s);
|
||||
s->out_data_len = 0;
|
||||
ldebug ("E0 data = %#x\n", d0);
|
||||
ldebug("E0 data = 0x%x", d0);
|
||||
dsp_out_data (s, ~d0);
|
||||
break;
|
||||
|
||||
case 0xe2:
|
||||
#ifdef DEBUG
|
||||
#if DEBUG
|
||||
d0 = dsp_get_data (s);
|
||||
dolog ("E2 = %#x\n", d0);
|
||||
warn_report("sb16: E2 = 0x%x", d0);
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
|
@ -835,7 +834,7 @@ static void complete (SB16State *s)
|
|||
|
||||
case 0xf9:
|
||||
d0 = dsp_get_data (s);
|
||||
ldebug ("command 0xf9 with %#x\n", d0);
|
||||
ldebug("command 0xf9 with 0x%x", d0);
|
||||
switch (d0) {
|
||||
case 0x0e:
|
||||
dsp_out_data (s, 0xff);
|
||||
|
|
@ -856,13 +855,13 @@ static void complete (SB16State *s)
|
|||
break;
|
||||
|
||||
default:
|
||||
qemu_log_mask(LOG_UNIMP, "complete: unrecognized command %#x\n",
|
||||
qemu_log_mask(LOG_UNIMP, "complete: unrecognized command 0x%x\n",
|
||||
s->cmd);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ldebug ("\n");
|
||||
ldebug("");
|
||||
s->cmd = -1;
|
||||
}
|
||||
|
||||
|
|
@ -926,7 +925,7 @@ static void dsp_write(void *opaque, uint32_t nport, uint32_t val)
|
|||
|
||||
iport = nport - s->port;
|
||||
|
||||
ldebug ("write %#x <- %#x\n", nport, val);
|
||||
ldebug("write 0x%x <- 0x%x", nport, val);
|
||||
switch (iport) {
|
||||
case 0x06:
|
||||
switch (val) {
|
||||
|
|
@ -976,7 +975,7 @@ static void dsp_write(void *opaque, uint32_t nport, uint32_t val)
|
|||
}
|
||||
else {
|
||||
if (s->in_index == sizeof (s->in2_data)) {
|
||||
dolog ("in data overrun\n");
|
||||
warn_report("sb16: in data overrun");
|
||||
}
|
||||
else {
|
||||
s->in2_data[s->in_index++] = val;
|
||||
|
|
@ -992,7 +991,7 @@ static void dsp_write(void *opaque, uint32_t nport, uint32_t val)
|
|||
break;
|
||||
|
||||
default:
|
||||
ldebug ("(nport=%#x, val=%#x)\n", nport, val);
|
||||
ldebug("(nport=0x%x, val=0x%x)", nport, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -1016,7 +1015,7 @@ static uint32_t dsp_read(void *opaque, uint32_t nport)
|
|||
}
|
||||
else {
|
||||
if (s->cmd != -1) {
|
||||
dolog ("empty output buffer for command %#x\n",
|
||||
warn_report("sb16: empty output buffer for command 0x%x",
|
||||
s->cmd);
|
||||
}
|
||||
retval = s->last_read_byte;
|
||||
|
|
@ -1029,7 +1028,7 @@ static uint32_t dsp_read(void *opaque, uint32_t nport)
|
|||
break;
|
||||
|
||||
case 0x0d: /* timer interrupt clear */
|
||||
/* dolog ("timer interrupt clear\n"); */
|
||||
/* warn_report("sb16: timer interrupt clear"); */
|
||||
retval = 0;
|
||||
break;
|
||||
|
||||
|
|
@ -1056,13 +1055,13 @@ static uint32_t dsp_read(void *opaque, uint32_t nport)
|
|||
}
|
||||
|
||||
if (!ack) {
|
||||
ldebug ("read %#x -> %#x\n", nport, retval);
|
||||
ldebug("read 0x%x -> 0x%x", nport, retval);
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
||||
error:
|
||||
dolog ("warning: dsp_read %#x error\n", nport);
|
||||
warn_report("sb16: dsp_read 0x%x error", nport);
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
|
@ -1108,7 +1107,7 @@ static void mixer_write_datab(void *opaque, uint32_t nport, uint32_t val)
|
|||
SB16State *s = opaque;
|
||||
|
||||
(void) nport;
|
||||
ldebug ("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val);
|
||||
ldebug("mixer_write [0x%x] <- 0x%x", s->mixer_nreg, val);
|
||||
|
||||
switch (s->mixer_nreg) {
|
||||
case 0x00:
|
||||
|
|
@ -1118,7 +1117,7 @@ static void mixer_write_datab(void *opaque, uint32_t nport, uint32_t val)
|
|||
case 0x80:
|
||||
{
|
||||
int irq = irq_of_magic (val);
|
||||
ldebug ("setting irq to %d (val=%#x)\n", irq, val);
|
||||
ldebug("setting irq to %d (val=0x%x)", irq, val);
|
||||
if (irq > 0) {
|
||||
s->irq = irq;
|
||||
}
|
||||
|
|
@ -1133,7 +1132,7 @@ static void mixer_write_datab(void *opaque, uint32_t nport, uint32_t val)
|
|||
hdma = ctz32 (val & 0xf0);
|
||||
if (dma != s->dma || hdma != s->hdma) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "attempt to change DMA 8bit"
|
||||
" %d(%d), 16bit %d(%d) (val=%#x)\n", dma, s->dma,
|
||||
" %d(%d), 16bit %d(%d) (val=0x%x)\n", dma, s->dma,
|
||||
hdma, s->hdma, val);
|
||||
}
|
||||
#if 0
|
||||
|
|
@ -1145,12 +1144,12 @@ static void mixer_write_datab(void *opaque, uint32_t nport, uint32_t val)
|
|||
|
||||
case 0x82:
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "attempt to write into IRQ status"
|
||||
" register (val=%#x)\n", val);
|
||||
" register (val=0x%x)\n", val);
|
||||
return;
|
||||
|
||||
default:
|
||||
if (s->mixer_nreg >= 0x80) {
|
||||
ldebug ("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val);
|
||||
ldebug("attempt to write mixer[0x%x] <- 0x%x", s->mixer_nreg, val);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -1165,11 +1164,11 @@ static uint32_t mixer_read(void *opaque, uint32_t nport)
|
|||
(void) nport;
|
||||
#ifndef DEBUG_SB16_MOST
|
||||
if (s->mixer_nreg != 0x82) {
|
||||
ldebug ("mixer_read[%#x] -> %#x\n",
|
||||
ldebug("mixer_read[0x%x] -> 0x%x",
|
||||
s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
|
||||
}
|
||||
#else
|
||||
ldebug ("mixer_read[%#x] -> %#x\n",
|
||||
ldebug("mixer_read[0x%x] -> 0x%x",
|
||||
s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
|
||||
#endif
|
||||
return s->mixer_regs[s->mixer_nreg];
|
||||
|
|
@ -1241,7 +1240,7 @@ static int SB_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
|
|||
till = s->left_till_irq;
|
||||
|
||||
#ifdef DEBUG_SB16_MOST
|
||||
dolog ("pos:%06d %d till:%d len:%d\n",
|
||||
warn_report("sb16: pos:%06d %d till:%d len:%d",
|
||||
dma_pos, free, till, dma_len);
|
||||
#endif
|
||||
|
||||
|
|
@ -1265,7 +1264,7 @@ static int SB_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
|
|||
}
|
||||
|
||||
#ifdef DEBUG_SB16_MOST
|
||||
ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
|
||||
ldebug("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d",
|
||||
dma_pos, free, dma_len, s->left_till_irq, copy, written,
|
||||
s->block_size);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -65,18 +65,18 @@ void deprecated_register_soundhw(const char *name, const char *descr,
|
|||
soundhw_count++;
|
||||
}
|
||||
|
||||
void show_valid_soundhw(void)
|
||||
void audio_print_available_models(void)
|
||||
{
|
||||
struct soundhw *c;
|
||||
|
||||
if (soundhw_count) {
|
||||
printf("Valid sound card names (comma separated):\n");
|
||||
for (c = soundhw; c->name; ++c) {
|
||||
printf ("%-11s %s\n", c->name, c->descr);
|
||||
}
|
||||
printf("Valid audio device model names:\n");
|
||||
for (c = soundhw; c->name; ++c) {
|
||||
printf("%-11s %s\n", c->name, c->descr);
|
||||
}
|
||||
} else {
|
||||
printf("Machine has no user-selectable audio hardware "
|
||||
"(it may or may not have always-present audio hardware).\n");
|
||||
printf("Machine has no user-selectable audio hardware "
|
||||
"(it may or may not have always-present audio hardware).\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ void select_soundhw(const char *name, const char *audiodev)
|
|||
struct soundhw *c;
|
||||
|
||||
if (selected) {
|
||||
error_report("only one -soundhw option is allowed");
|
||||
error_report("only one -audio option is allowed");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
@ -101,8 +101,8 @@ void select_soundhw(const char *name, const char *audiodev)
|
|||
}
|
||||
|
||||
if (!c->name) {
|
||||
error_report("Unknown sound card name `%s'", name);
|
||||
show_valid_soundhw();
|
||||
error_report("Unknown audio device model `%s'", name);
|
||||
audio_print_available_models();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
|
@ -140,4 +140,3 @@ void soundhw_init(void)
|
|||
c->init_pci(pci_bus, audiodev_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@ hda_audio_format(const char *stream, int chan, const char *fmt, int freq) "st %s
|
|||
hda_audio_adjust(const char *stream, int pos) "st %s, pos %d"
|
||||
hda_audio_overrun(const char *stream) "st %s"
|
||||
|
||||
# pcspk.c
|
||||
pcspk_io_read(uint16_t addr, uint8_t val) "[0x%"PRIx16"] -> 0x%"PRIx8
|
||||
pcspk_io_write(uint16_t addr, uint8_t val) "[0x%"PRIx16"] <- 0x%"PRIx8
|
||||
|
||||
#via-ac97.c
|
||||
via_ac97_codec_write(uint8_t addr, uint16_t val) "0x%x <- 0x%x"
|
||||
via_ac97_sgd_fetch(uint32_t curr, uint32_t addr, char stop, char eol, char flag, uint32_t len) "curr=0x%x addr=0x%x %c%c%c len=%d"
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "qapi/qobject-input-visitor.h"
|
||||
#include "qapi/type-helpers.h"
|
||||
#include "qemu/uuid.h"
|
||||
#include "qemu/target-info.h"
|
||||
#include "qemu/target-info-qapi.h"
|
||||
#include "qom/qom-qobject.h"
|
||||
#include "system/hostmem.h"
|
||||
|
|
@ -94,9 +95,10 @@ CpuInfoFastList *qmp_query_cpus_fast(Error **errp)
|
|||
MachineInfoList *qmp_query_machines(bool has_compat_props, bool compat_props,
|
||||
Error **errp)
|
||||
{
|
||||
GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
|
||||
GSList *el, *machines;
|
||||
MachineInfoList *mach_list = NULL;
|
||||
|
||||
machines = object_class_get_list(target_machine_typename(), false);
|
||||
for (el = machines; el; el = el->next) {
|
||||
MachineClass *mc = el->data;
|
||||
const char *default_cpu_type = machine_class_default_cpu_type(mc);
|
||||
|
|
|
|||
|
|
@ -1556,6 +1556,16 @@ const char *machine_class_default_cpu_type(MachineClass *mc)
|
|||
return mc->default_cpu_type;
|
||||
}
|
||||
|
||||
const char *machine_default_cpu_type(const MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
|
||||
if (mc->get_default_cpu_type) {
|
||||
return mc->get_default_cpu_type(ms);
|
||||
}
|
||||
return machine_class_default_cpu_type(mc);
|
||||
}
|
||||
|
||||
static bool is_cpu_type_supported(const MachineState *machine, Error **errp)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
|
|
@ -1570,6 +1580,8 @@ static bool is_cpu_type_supported(const MachineState *machine, Error **errp)
|
|||
*/
|
||||
if (mc->valid_cpu_types) {
|
||||
assert(mc->valid_cpu_types[0] != NULL);
|
||||
assert(!mc->get_valid_cpu_types);
|
||||
|
||||
for (i = 0; mc->valid_cpu_types[i]; i++) {
|
||||
if (object_class_dynamic_cast(oc, mc->valid_cpu_types[i])) {
|
||||
break;
|
||||
|
|
@ -1596,6 +1608,32 @@ static bool is_cpu_type_supported(const MachineState *machine, Error **errp)
|
|||
error_append_hint(errp, "\n");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
} else if (mc->get_valid_cpu_types) {
|
||||
GPtrArray *vct = mc->get_valid_cpu_types(machine);
|
||||
bool valid = false;
|
||||
|
||||
for (i = 0; i < vct->len; i++) {
|
||||
if (object_class_dynamic_cast(oc, vct->pdata[i])) {
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
g_autofree char *requested = cpu_model_from_type(machine->cpu_type);
|
||||
|
||||
error_setg(errp, "Invalid CPU model: %s", requested);
|
||||
error_append_hint(errp, "The valid models are: ");
|
||||
for (i = 0; i < vct->len; i++) {
|
||||
g_autofree char *model = cpu_model_from_type(vct->pdata[i]);
|
||||
error_append_hint(errp, "%s%s",
|
||||
model, i + 1 == vct->len ? "\n" : ", ");
|
||||
}
|
||||
}
|
||||
g_ptr_array_free(vct, true);
|
||||
if (!valid) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -245,10 +245,16 @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
|
|||
size_t data_size_bits)
|
||||
{
|
||||
const char *device_prefix = object_get_typename(OBJECT(owner));
|
||||
RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1);
|
||||
Object *obj;
|
||||
RegisterInfoArray *r_array;
|
||||
int data_size = data_size_bits >> 3;
|
||||
int i;
|
||||
|
||||
obj = object_new(TYPE_REGISTER_ARRAY);
|
||||
object_property_add_child(OBJECT(owner), "reg-array[*]", obj);
|
||||
object_unref(obj);
|
||||
|
||||
r_array = REGISTER_ARRAY(obj);
|
||||
r_array->r = g_new0(RegisterInfo *, num);
|
||||
r_array->num_elements = num;
|
||||
r_array->debug = debug_enabled;
|
||||
|
|
@ -258,9 +264,6 @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
|
|||
int index = rae[i].addr / data_size;
|
||||
RegisterInfo *r = &ri[index];
|
||||
|
||||
/* Init the register, this will zero it. */
|
||||
object_initialize((void *)r, sizeof(*r), TYPE_REGISTER);
|
||||
|
||||
/* Set the properties of the register */
|
||||
r->data = data + data_size * index;
|
||||
r->data_size = data_size;
|
||||
|
|
@ -270,7 +273,7 @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
|
|||
r_array->r[i] = r;
|
||||
}
|
||||
|
||||
memory_region_init_io(&r_array->mem, OBJECT(owner), ops, r_array,
|
||||
memory_region_init_io(&r_array->mem, OBJECT(r_array), ops, r_array,
|
||||
device_prefix, memory_size);
|
||||
|
||||
return r_array;
|
||||
|
|
@ -312,30 +315,23 @@ RegisterInfoArray *register_init_block64(DeviceState *owner,
|
|||
data, ops, debug_enabled, memory_size, 64);
|
||||
}
|
||||
|
||||
void register_finalize_block(RegisterInfoArray *r_array)
|
||||
static void register_array_finalize(Object *obj)
|
||||
{
|
||||
RegisterInfoArray *r_array = REGISTER_ARRAY(obj);
|
||||
|
||||
g_free(r_array->r);
|
||||
g_free(r_array);
|
||||
}
|
||||
|
||||
static void register_class_init(ObjectClass *oc, const void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
|
||||
/* Reason: needs to be wired up to work */
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo register_info = {
|
||||
.name = TYPE_REGISTER,
|
||||
.parent = TYPE_DEVICE,
|
||||
.class_init = register_class_init,
|
||||
.instance_size = sizeof(RegisterInfo),
|
||||
static const TypeInfo register_array_info = {
|
||||
.name = TYPE_REGISTER_ARRAY,
|
||||
.parent = TYPE_OBJECT,
|
||||
.instance_size = sizeof(RegisterInfoArray),
|
||||
.instance_finalize = register_array_finalize,
|
||||
};
|
||||
|
||||
static void register_register_types(void)
|
||||
{
|
||||
type_register_static(®ister_info);
|
||||
type_register_static(®ister_array_info);
|
||||
}
|
||||
|
||||
type_init(register_register_types)
|
||||
|
|
|
|||
|
|
@ -288,6 +288,7 @@ uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t ram_size)
|
|||
spd[33] = 8; /* addr/cmd hold time */
|
||||
spd[34] = 20; /* data input setup time */
|
||||
spd[35] = 8; /* data input hold time */
|
||||
spd[36] = (type == DDR2 ? 13 << 2 : 0); /* min. write recovery time */
|
||||
|
||||
/* checksum */
|
||||
for (i = 0; i < 63; i++) {
|
||||
|
|
|
|||
|
|
@ -60,9 +60,8 @@ static void kvm_put_apic_state(APICCommonState *s, struct kvm_lapic_state *kapic
|
|||
kvm_apic_set_reg(kapic, 0x3e, s->divide_conf);
|
||||
}
|
||||
|
||||
void kvm_get_apic_state(DeviceState *dev, struct kvm_lapic_state *kapic)
|
||||
void kvm_get_apic_state(APICCommonState *s, struct kvm_lapic_state *kapic)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
int i, v;
|
||||
|
||||
if (kvm_has_x2apic_api() && s->apicbase & MSR_IA32_APICBASE_EXTD) {
|
||||
|
|
|
|||
|
|
@ -490,7 +490,7 @@ void vapic_report_tpr_access(DeviceState *dev, CPUState *cs, target_ulong ip,
|
|||
}
|
||||
|
||||
typedef struct VAPICEnableTPRReporting {
|
||||
DeviceState *apic;
|
||||
APICCommonState *apic;
|
||||
bool enable;
|
||||
} VAPICEnableTPRReporting;
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ int cpu_get_pic_interrupt(CPUX86State *env)
|
|||
return intno;
|
||||
}
|
||||
|
||||
DeviceState *cpu_get_current_apic(void)
|
||||
APICCommonState *cpu_get_current_apic(void)
|
||||
{
|
||||
if (current_cpu) {
|
||||
X86CPU *cpu = X86_CPU(current_cpu);
|
||||
|
|
|
|||
|
|
@ -1417,7 +1417,7 @@ static void ahci_pio_transfer(const IDEDMA *dma)
|
|||
}
|
||||
|
||||
/* Update number of transferred bytes, destroy sglist */
|
||||
dma_buf_commit(s, size);
|
||||
ide_dma_buf_commit(s, size);
|
||||
|
||||
out:
|
||||
/* declare that we processed everything */
|
||||
|
|
@ -1482,8 +1482,8 @@ static int32_t ahci_dma_prepare_buf(const IDEDMA *dma, int32_t limit)
|
|||
|
||||
/**
|
||||
* Updates the command header with a bytes-read value.
|
||||
* Called via dma_buf_commit, for both DMA and PIO paths.
|
||||
* sglist destruction is handled within dma_buf_commit.
|
||||
* Called via ide_dma_buf_commit, for both DMA and PIO paths.
|
||||
* sglist destruction is handled within ide_dma_buf_commit.
|
||||
*/
|
||||
static void ahci_commit_buf(const IDEDMA *dma, uint32_t tx_bytes)
|
||||
{
|
||||
|
|
@ -1511,7 +1511,7 @@ static int ahci_dma_rw_buf(const IDEDMA *dma, bool is_write)
|
|||
}
|
||||
|
||||
/* free sglist, update byte count */
|
||||
dma_buf_commit(s, l);
|
||||
ide_dma_buf_commit(s, l);
|
||||
s->io_buffer_index += l;
|
||||
|
||||
trace_ahci_dma_rw_buf(ad->hba, ad->port_no, l);
|
||||
|
|
|
|||
|
|
@ -827,7 +827,7 @@ static void ide_sector_read(IDEState *s)
|
|||
ide_sector_read_cb, s);
|
||||
}
|
||||
|
||||
void dma_buf_commit(IDEState *s, uint32_t tx_bytes)
|
||||
void ide_dma_buf_commit(IDEState *s, uint32_t tx_bytes)
|
||||
{
|
||||
if (s->bus->dma->ops->commit_buf) {
|
||||
s->bus->dma->ops->commit_buf(s->bus->dma, tx_bytes);
|
||||
|
|
@ -848,7 +848,7 @@ void ide_set_inactive(IDEState *s, bool more)
|
|||
|
||||
void ide_dma_error(IDEState *s)
|
||||
{
|
||||
dma_buf_commit(s, 0);
|
||||
ide_dma_buf_commit(s, 0);
|
||||
ide_abort_command(s);
|
||||
ide_set_inactive(s, false);
|
||||
ide_bus_set_irq(s->bus);
|
||||
|
|
@ -893,7 +893,7 @@ static void ide_dma_cb(void *opaque, int ret)
|
|||
if (ret < 0) {
|
||||
if (ide_handle_rw_error(s, -ret, ide_dma_cmd_to_retry(s->dma_cmd))) {
|
||||
s->bus->dma->aiocb = NULL;
|
||||
dma_buf_commit(s, 0);
|
||||
ide_dma_buf_commit(s, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -912,7 +912,7 @@ static void ide_dma_cb(void *opaque, int ret)
|
|||
sector_num = ide_get_sector(s);
|
||||
if (n > 0) {
|
||||
assert(n * 512 == s->sg.size);
|
||||
dma_buf_commit(s, s->sg.size);
|
||||
ide_dma_buf_commit(s, s->sg.size);
|
||||
sector_num += n;
|
||||
ide_set_sector(s, sector_num);
|
||||
s->nsector -= n;
|
||||
|
|
@ -944,7 +944,7 @@ static void ide_dma_cb(void *opaque, int ret)
|
|||
* Reset the Active bit and don't raise the interrupt.
|
||||
*/
|
||||
s->status = READY_STAT | SEEK_STAT;
|
||||
dma_buf_commit(s, 0);
|
||||
ide_dma_buf_commit(s, 0);
|
||||
goto eot;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -398,7 +398,7 @@ int64_t ide_get_sector(IDEState *s);
|
|||
void ide_set_sector(IDEState *s, int64_t sector_num);
|
||||
|
||||
void ide_start_dma(IDEState *s, BlockCompletionFunc *cb);
|
||||
void dma_buf_commit(IDEState *s, uint32_t tx_bytes);
|
||||
void ide_dma_buf_commit(IDEState *s, uint32_t tx_bytes);
|
||||
void ide_dma_error(IDEState *s);
|
||||
void ide_abort_command(IDEState *s);
|
||||
|
||||
|
|
|
|||
126
hw/intc/apic.c
126
hw/intc/apic.c
|
|
@ -181,10 +181,8 @@ static void apic_local_deliver(APICCommonState *s, int vector)
|
|||
}
|
||||
}
|
||||
|
||||
void apic_deliver_pic_intr(DeviceState *dev, int level)
|
||||
void apic_deliver_pic_intr(APICCommonState *s, int level)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
|
||||
if (level) {
|
||||
apic_local_deliver(s, APIC_LVT_LINT0);
|
||||
} else {
|
||||
|
|
@ -301,10 +299,8 @@ static void apic_deliver_irq(uint32_t dest, uint8_t dest_mode,
|
|||
apic_bus_deliver(deliver_bitmask, delivery_mode, vector_num, trigger_mode);
|
||||
}
|
||||
|
||||
bool is_x2apic_mode(DeviceState *dev)
|
||||
bool is_x2apic_mode(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
|
||||
return s->apicbase & MSR_IA32_APICBASE_EXTD;
|
||||
}
|
||||
|
||||
|
|
@ -388,15 +384,12 @@ static void apic_set_tpr(APICCommonState *s, uint8_t val)
|
|||
}
|
||||
}
|
||||
|
||||
int apic_get_highest_priority_irr(DeviceState *dev)
|
||||
int apic_get_highest_priority_irr(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s;
|
||||
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
/* no interrupts */
|
||||
return -1;
|
||||
}
|
||||
s = APIC_COMMON(dev);
|
||||
return get_highest_priority_int(s->irr);
|
||||
}
|
||||
|
||||
|
|
@ -458,22 +451,19 @@ static int apic_irq_pending(APICCommonState *s)
|
|||
static void apic_update_irq(APICCommonState *s)
|
||||
{
|
||||
CPUState *cpu;
|
||||
DeviceState *dev = (DeviceState *)s;
|
||||
|
||||
cpu = CPU(s->cpu);
|
||||
if (!qemu_cpu_is_self(cpu)) {
|
||||
cpu_interrupt(cpu, CPU_INTERRUPT_POLL);
|
||||
} else if (apic_irq_pending(s) > 0) {
|
||||
cpu_interrupt(cpu, CPU_INTERRUPT_HARD);
|
||||
} else if (!apic_accept_pic_intr(dev) || !pic_get_output(isa_pic)) {
|
||||
} else if (!apic_accept_pic_intr(s) || !pic_get_output(isa_pic)) {
|
||||
cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
|
||||
}
|
||||
}
|
||||
|
||||
void apic_poll_irq(DeviceState *dev)
|
||||
void apic_poll_irq(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
|
||||
apic_sync_vapic(s, SYNC_FROM_VAPIC);
|
||||
apic_update_irq(s);
|
||||
}
|
||||
|
|
@ -516,7 +506,7 @@ static void apic_eoi(APICCommonState *s)
|
|||
|
||||
static bool apic_match_dest(APICCommonState *apic, uint32_t dest)
|
||||
{
|
||||
if (is_x2apic_mode(&apic->parent_obj)) {
|
||||
if (is_x2apic_mode(apic)) {
|
||||
return apic->initial_apic_id == dest;
|
||||
} else {
|
||||
return apic->id == (uint8_t)dest;
|
||||
|
|
@ -550,7 +540,7 @@ static void apic_get_broadcast_bitmask(uint32_t *deliver_bitmask,
|
|||
for (i = 0; i < max_apics; i++) {
|
||||
apic_iter = local_apics[i];
|
||||
if (apic_iter) {
|
||||
bool apic_in_x2apic = is_x2apic_mode(&apic_iter->parent_obj);
|
||||
bool apic_in_x2apic = is_x2apic_mode(apic_iter);
|
||||
|
||||
if (is_x2apic_broadcast && apic_in_x2apic) {
|
||||
apic_set_bit(deliver_bitmask, i);
|
||||
|
|
@ -642,27 +632,24 @@ static void apic_startup(APICCommonState *s, int vector_num)
|
|||
cpu_interrupt(CPU(s->cpu), CPU_INTERRUPT_SIPI);
|
||||
}
|
||||
|
||||
void apic_sipi(DeviceState *dev)
|
||||
void apic_sipi(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
|
||||
if (!s->wait_for_sipi)
|
||||
return;
|
||||
cpu_x86_load_seg_cache_sipi(s->cpu, s->sipi_vector);
|
||||
s->wait_for_sipi = 0;
|
||||
}
|
||||
|
||||
static void apic_deliver(DeviceState *dev, uint32_t dest, uint8_t dest_mode,
|
||||
static void apic_deliver(APICCommonState *s, uint32_t dest, uint8_t dest_mode,
|
||||
uint8_t delivery_mode, uint8_t vector_num,
|
||||
uint8_t trigger_mode, uint8_t dest_shorthand)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
APICCommonState *apic_iter;
|
||||
uint32_t deliver_bitmask_size = max_apic_words * sizeof(uint32_t);
|
||||
g_autofree uint32_t *deliver_bitmask = g_new(uint32_t, max_apic_words);
|
||||
uint32_t current_apic_id;
|
||||
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
current_apic_id = s->initial_apic_id;
|
||||
} else {
|
||||
current_apic_id = s->id;
|
||||
|
|
@ -709,18 +696,15 @@ static void apic_deliver(DeviceState *dev, uint32_t dest, uint8_t dest_mode,
|
|||
|
||||
static bool apic_check_pic(APICCommonState *s)
|
||||
{
|
||||
DeviceState *dev = (DeviceState *)s;
|
||||
|
||||
if (!apic_accept_pic_intr(dev) || !pic_get_output(isa_pic)) {
|
||||
if (!apic_accept_pic_intr(s) || !pic_get_output(isa_pic)) {
|
||||
return false;
|
||||
}
|
||||
apic_deliver_pic_intr(dev, 1);
|
||||
apic_deliver_pic_intr(s, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
int apic_get_interrupt(DeviceState *dev)
|
||||
int apic_get_interrupt(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
int intno;
|
||||
|
||||
/* if the APIC is installed or enabled, we let the 8259 handle the
|
||||
|
|
@ -752,9 +736,8 @@ int apic_get_interrupt(DeviceState *dev)
|
|||
return intno;
|
||||
}
|
||||
|
||||
int apic_accept_pic_intr(DeviceState *dev)
|
||||
int apic_accept_pic_intr(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC(dev);
|
||||
uint32_t lvt0;
|
||||
|
||||
if (!s)
|
||||
|
|
@ -786,22 +769,14 @@ static void apic_timer(void *opaque)
|
|||
apic_timer_update(s, s->next_time);
|
||||
}
|
||||
|
||||
static int apic_register_read(int index, uint64_t *value)
|
||||
static int apic_register_read(APICCommonState *s, int index, uint64_t *value)
|
||||
{
|
||||
DeviceState *dev;
|
||||
APICCommonState *s;
|
||||
uint32_t val;
|
||||
int ret = 0;
|
||||
|
||||
dev = cpu_get_current_apic();
|
||||
if (!dev) {
|
||||
return -1;
|
||||
}
|
||||
s = APIC(dev);
|
||||
|
||||
switch(index) {
|
||||
case 0x02: /* id */
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
val = s->initial_apic_id;
|
||||
} else {
|
||||
val = s->id << 24;
|
||||
|
|
@ -828,14 +803,14 @@ static int apic_register_read(int index, uint64_t *value)
|
|||
val = 0;
|
||||
break;
|
||||
case 0x0d:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
val = s->extended_log_dest;
|
||||
} else {
|
||||
val = s->log_dest << 24;
|
||||
}
|
||||
break;
|
||||
case 0x0e:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
val = 0;
|
||||
ret = -1;
|
||||
} else {
|
||||
|
|
@ -887,6 +862,7 @@ static int apic_register_read(int index, uint64_t *value)
|
|||
|
||||
static uint64_t apic_mem_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
APICCommonState *s = cpu_get_current_apic();
|
||||
uint64_t val;
|
||||
int index;
|
||||
|
||||
|
|
@ -894,26 +870,27 @@ static uint64_t apic_mem_read(void *opaque, hwaddr addr, unsigned size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
index = (addr >> 4) & 0xff;
|
||||
apic_register_read(index, &val);
|
||||
apic_register_read(s, index, &val);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int apic_msr_read(int index, uint64_t *val)
|
||||
int apic_msr_read(APICCommonState *s, int index, uint64_t *val)
|
||||
{
|
||||
DeviceState *dev;
|
||||
|
||||
dev = cpu_get_current_apic();
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!is_x2apic_mode(dev)) {
|
||||
if (!is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return apic_register_read(index, val);
|
||||
return apic_register_read(s, index, val);
|
||||
}
|
||||
|
||||
static void apic_send_msi(MSIMessage *msi)
|
||||
|
|
@ -941,22 +918,13 @@ static void apic_send_msi(MSIMessage *msi)
|
|||
apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode);
|
||||
}
|
||||
|
||||
static int apic_register_write(int index, uint64_t val)
|
||||
static int apic_register_write(APICCommonState *s, int index, uint64_t val)
|
||||
{
|
||||
DeviceState *dev;
|
||||
APICCommonState *s;
|
||||
|
||||
dev = cpu_get_current_apic();
|
||||
if (!dev) {
|
||||
return -1;
|
||||
}
|
||||
s = APIC(dev);
|
||||
|
||||
trace_apic_register_write(index, val);
|
||||
|
||||
switch(index) {
|
||||
case 0x02:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -979,14 +947,14 @@ static int apic_register_write(int index, uint64_t val)
|
|||
apic_eoi(s);
|
||||
break;
|
||||
case 0x0d:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->log_dest = val >> 24;
|
||||
break;
|
||||
case 0x0e:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1005,20 +973,20 @@ static int apic_register_write(int index, uint64_t val)
|
|||
uint32_t dest;
|
||||
|
||||
s->icr[0] = val;
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
s->icr[1] = val >> 32;
|
||||
dest = s->icr[1];
|
||||
} else {
|
||||
dest = (s->icr[1] >> 24) & 0xff;
|
||||
}
|
||||
|
||||
apic_deliver(dev, dest, (s->icr[0] >> 11) & 1,
|
||||
apic_deliver(s, dest, (s->icr[0] >> 11) & 1,
|
||||
(s->icr[0] >> 8) & 7, (s->icr[0] & 0xff),
|
||||
(s->icr[0] >> 15) & 1, (s->icr[0] >> 18) & 3);
|
||||
break;
|
||||
}
|
||||
case 0x31:
|
||||
if (is_x2apic_mode(dev)) {
|
||||
if (is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1053,7 +1021,7 @@ static int apic_register_write(int index, uint64_t val)
|
|||
case 0x3f: {
|
||||
int vector = val & 0xff;
|
||||
|
||||
if (!is_x2apic_mode(dev)) {
|
||||
if (!is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1063,7 +1031,7 @@ static int apic_register_write(int index, uint64_t val)
|
|||
* - Trigger mode: 0 (Edge)
|
||||
* - Delivery mode: 0 (Fixed)
|
||||
*/
|
||||
apic_deliver(dev, 0, 0, APIC_DM_FIXED, vector, 0, 1);
|
||||
apic_deliver(s, 0, 0, APIC_DM_FIXED, vector, 0, 1);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -1078,6 +1046,7 @@ static int apic_register_write(int index, uint64_t val)
|
|||
static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
|
||||
unsigned size)
|
||||
{
|
||||
APICCommonState *s = cpu_get_current_apic();
|
||||
int index = (addr >> 4) & 0xff;
|
||||
|
||||
if (size < 4) {
|
||||
|
|
@ -1097,23 +1066,24 @@ static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
|
|||
return;
|
||||
}
|
||||
|
||||
apic_register_write(index, val);
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
|
||||
apic_register_write(s, index, val);
|
||||
}
|
||||
|
||||
int apic_msr_write(int index, uint64_t val)
|
||||
int apic_msr_write(APICCommonState *s, int index, uint64_t val)
|
||||
{
|
||||
DeviceState *dev;
|
||||
|
||||
dev = cpu_get_current_apic();
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!is_x2apic_mode(dev)) {
|
||||
if (!is_x2apic_mode(s)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return apic_register_write(index, val);
|
||||
return apic_register_write(s, index, val);
|
||||
}
|
||||
|
||||
static void apic_pre_save(APICCommonState *s)
|
||||
|
|
|
|||
|
|
@ -35,12 +35,11 @@
|
|||
|
||||
bool apic_report_tpr_access;
|
||||
|
||||
int cpu_set_apic_base(DeviceState *dev, uint64_t val)
|
||||
int cpu_set_apic_base(APICCommonState *s, uint64_t val)
|
||||
{
|
||||
trace_cpu_set_apic_base(val);
|
||||
|
||||
if (dev) {
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
if (s) {
|
||||
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||
/* Reset possibly modified xAPIC ID */
|
||||
s->id = s->initial_apic_id;
|
||||
|
|
@ -50,10 +49,9 @@ int cpu_set_apic_base(DeviceState *dev, uint64_t val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
uint64_t cpu_get_apic_base(DeviceState *dev)
|
||||
uint64_t cpu_get_apic_base(APICCommonState *s)
|
||||
{
|
||||
if (dev) {
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
if (s) {
|
||||
trace_cpu_get_apic_base((uint64_t)s->apicbase);
|
||||
return s->apicbase;
|
||||
} else {
|
||||
|
|
@ -62,52 +60,43 @@ uint64_t cpu_get_apic_base(DeviceState *dev)
|
|||
}
|
||||
}
|
||||
|
||||
bool cpu_is_apic_enabled(DeviceState *dev)
|
||||
bool cpu_is_apic_enabled(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s;
|
||||
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
s = APIC_COMMON(dev);
|
||||
|
||||
return s->apicbase & MSR_IA32_APICBASE_ENABLE;
|
||||
}
|
||||
|
||||
void cpu_set_apic_tpr(DeviceState *dev, uint8_t val)
|
||||
void cpu_set_apic_tpr(APICCommonState *s, uint8_t val)
|
||||
{
|
||||
APICCommonState *s;
|
||||
APICCommonClass *info;
|
||||
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
|
||||
s = APIC_COMMON(dev);
|
||||
info = APIC_COMMON_GET_CLASS(s);
|
||||
|
||||
info->set_tpr(s, val);
|
||||
}
|
||||
|
||||
uint8_t cpu_get_apic_tpr(DeviceState *dev)
|
||||
uint8_t cpu_get_apic_tpr(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s;
|
||||
APICCommonClass *info;
|
||||
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
s = APIC_COMMON(dev);
|
||||
info = APIC_COMMON_GET_CLASS(s);
|
||||
|
||||
return info->get_tpr(s);
|
||||
}
|
||||
|
||||
void apic_enable_tpr_access_reporting(DeviceState *dev, bool enable)
|
||||
void apic_enable_tpr_access_reporting(APICCommonState *s, bool enable)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||
|
||||
apic_report_tpr_access = enable;
|
||||
|
|
@ -116,26 +105,22 @@ void apic_enable_tpr_access_reporting(DeviceState *dev, bool enable)
|
|||
}
|
||||
}
|
||||
|
||||
void apic_enable_vapic(DeviceState *dev, hwaddr paddr)
|
||||
void apic_enable_vapic(APICCommonState *s, hwaddr paddr)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||
|
||||
s->vapic_paddr = paddr;
|
||||
info->vapic_base_update(s);
|
||||
}
|
||||
|
||||
void apic_handle_tpr_access_report(DeviceState *dev, target_ulong ip,
|
||||
void apic_handle_tpr_access_report(APICCommonState *s, target_ulong ip,
|
||||
TPRAccess access)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
|
||||
vapic_report_tpr_access(s->vapic, CPU(s->cpu), ip, access);
|
||||
}
|
||||
|
||||
void apic_deliver_nmi(DeviceState *dev)
|
||||
void apic_deliver_nmi(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||
|
||||
info->external_nmi(s);
|
||||
|
|
@ -193,16 +178,14 @@ uint32_t apic_get_current_count(APICCommonState *s)
|
|||
return val;
|
||||
}
|
||||
|
||||
void apic_init_reset(DeviceState *dev)
|
||||
void apic_init_reset(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s;
|
||||
APICCommonClass *info;
|
||||
int i;
|
||||
|
||||
if (!dev) {
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
s = APIC_COMMON(dev);
|
||||
s->tpr = 0;
|
||||
s->spurious_vec = 0xff;
|
||||
s->log_dest = 0;
|
||||
|
|
@ -233,13 +216,12 @@ void apic_init_reset(DeviceState *dev)
|
|||
}
|
||||
}
|
||||
|
||||
void apic_designate_bsp(DeviceState *dev, bool bsp)
|
||||
void apic_designate_bsp(APICCommonState *s, bool bsp)
|
||||
{
|
||||
if (dev == NULL) {
|
||||
if (s == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
if (bsp) {
|
||||
s->apicbase |= MSR_IA32_APICBASE_BSP;
|
||||
} else {
|
||||
|
|
@ -262,7 +244,7 @@ static void apic_reset_common(DeviceState *dev)
|
|||
s->vapic_paddr = 0;
|
||||
info->vapic_base_update(s);
|
||||
|
||||
apic_init_reset(dev);
|
||||
apic_init_reset(s);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_apic_common;
|
||||
|
|
|
|||
|
|
@ -634,17 +634,17 @@ static void versal_crl_init(Object *obj)
|
|||
XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj);
|
||||
XlnxVersalCRLBase *xvcb = XLNX_VERSAL_CRL_BASE(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
int i;
|
||||
|
||||
xvcb->reg_array =
|
||||
register_init_block32(DEVICE(obj), crl_regs_info,
|
||||
ARRAY_SIZE(crl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&crl_ops,
|
||||
XLNX_VERSAL_CRL_ERR_DEBUG,
|
||||
CRL_R_MAX * 4);
|
||||
reg_array = register_init_block32(DEVICE(obj), crl_regs_info,
|
||||
ARRAY_SIZE(crl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&crl_ops,
|
||||
XLNX_VERSAL_CRL_ERR_DEBUG,
|
||||
CRL_R_MAX * 4);
|
||||
xvcb->regs = s->regs;
|
||||
sysbus_init_mmio(sbd, &xvcb->reg_array->mem);
|
||||
sysbus_init_mmio(sbd, ®_array->mem);
|
||||
sysbus_init_irq(sbd, &s->irq);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(s->cfg.rpu); ++i) {
|
||||
|
|
@ -688,17 +688,18 @@ static void versal2_crl_init(Object *obj)
|
|||
XlnxVersal2CRL *s = XLNX_VERSAL2_CRL(obj);
|
||||
XlnxVersalCRLBase *xvcb = XLNX_VERSAL_CRL_BASE(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
size_t i;
|
||||
|
||||
xvcb->reg_array = register_init_block32(DEVICE(obj), versal2_crl_regs_info,
|
||||
ARRAY_SIZE(versal2_crl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&crl_ops,
|
||||
XLNX_VERSAL_CRL_ERR_DEBUG,
|
||||
VERSAL2_CRL_R_MAX * 4);
|
||||
reg_array = register_init_block32(DEVICE(obj), versal2_crl_regs_info,
|
||||
ARRAY_SIZE(versal2_crl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&crl_ops,
|
||||
XLNX_VERSAL_CRL_ERR_DEBUG,
|
||||
VERSAL2_CRL_R_MAX * 4);
|
||||
xvcb->regs = s->regs;
|
||||
|
||||
sysbus_init_mmio(sbd, &xvcb->reg_array->mem);
|
||||
sysbus_init_mmio(sbd, ®_array->mem);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(s->cfg.rpu); ++i) {
|
||||
object_property_add_link(obj, "rpu[*]", TYPE_ARM_CPU,
|
||||
|
|
@ -750,12 +751,6 @@ static void versal2_crl_init(Object *obj)
|
|||
}
|
||||
}
|
||||
|
||||
static void crl_finalize(Object *obj)
|
||||
{
|
||||
XlnxVersalCRLBase *s = XLNX_VERSAL_CRL_BASE(obj);
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_versal_crl = {
|
||||
.name = TYPE_XLNX_VERSAL_CRL,
|
||||
.version_id = 1,
|
||||
|
|
@ -804,7 +799,6 @@ static const TypeInfo crl_base_info = {
|
|||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(XlnxVersalCRLBase),
|
||||
.class_size = sizeof(XlnxVersalCRLBaseClass),
|
||||
.instance_finalize = crl_finalize,
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -627,7 +627,6 @@ static void trng_finalize(Object *obj)
|
|||
{
|
||||
XlnxVersalTRng *s = XLNX_VERSAL_TRNG(obj);
|
||||
|
||||
register_finalize_block(s->reg_array);
|
||||
g_rand_free(s->prng);
|
||||
s->prng = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -190,24 +190,19 @@ static void xram_ctrl_init(Object *obj)
|
|||
{
|
||||
XlnxXramCtrl *s = XLNX_XRAM_CTRL(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
|
||||
s->reg_array =
|
||||
reg_array =
|
||||
register_init_block32(DEVICE(obj), xram_ctrl_regs_info,
|
||||
ARRAY_SIZE(xram_ctrl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&xram_ctrl_ops,
|
||||
XLNX_XRAM_CTRL_ERR_DEBUG,
|
||||
XRAM_CTRL_R_MAX * 4);
|
||||
sysbus_init_mmio(sbd, &s->reg_array->mem);
|
||||
sysbus_init_mmio(sbd, ®_array->mem);
|
||||
sysbus_init_irq(sbd, &s->irq);
|
||||
}
|
||||
|
||||
static void xram_ctrl_finalize(Object *obj)
|
||||
{
|
||||
XlnxXramCtrl *s = XLNX_XRAM_CTRL(obj);
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_xram_ctrl = {
|
||||
.name = TYPE_XLNX_XRAM_CTRL,
|
||||
.version_id = 1,
|
||||
|
|
@ -241,7 +236,6 @@ static const TypeInfo xram_ctrl_info = {
|
|||
.instance_size = sizeof(XlnxXramCtrl),
|
||||
.class_init = xram_ctrl_class_init,
|
||||
.instance_init = xram_ctrl_init,
|
||||
.instance_finalize = xram_ctrl_finalize,
|
||||
};
|
||||
|
||||
static void xram_ctrl_register_types(void)
|
||||
|
|
|
|||
|
|
@ -179,16 +179,17 @@ static void zynqmp_apu_handle_wfi(void *opaque, int irq, int level)
|
|||
static void zynqmp_apu_init(Object *obj)
|
||||
{
|
||||
XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
int i;
|
||||
|
||||
s->reg_array =
|
||||
reg_array =
|
||||
register_init_block32(DEVICE(obj), zynqmp_apu_regs_info,
|
||||
ARRAY_SIZE(zynqmp_apu_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&zynqmp_apu_ops,
|
||||
XILINX_ZYNQMP_APU_ERR_DEBUG,
|
||||
APU_R_MAX * 4);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->reg_array->mem);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(obj), ®_array->mem);
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq_imr);
|
||||
|
||||
for (i = 0; i < APU_MAX_CPU; ++i) {
|
||||
|
|
@ -208,12 +209,6 @@ static void zynqmp_apu_init(Object *obj)
|
|||
qdev_init_gpio_in_named(DEVICE(obj), zynqmp_apu_handle_wfi, "wfi_in", 4);
|
||||
}
|
||||
|
||||
static void zynqmp_apu_finalize(Object *obj)
|
||||
{
|
||||
XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_zynqmp_apu = {
|
||||
.name = TYPE_XLNX_ZYNQMP_APU_CTRL,
|
||||
.version_id = 1,
|
||||
|
|
@ -241,7 +236,6 @@ static const TypeInfo zynqmp_apu_info = {
|
|||
.instance_size = sizeof(XlnxZynqMPAPUCtrl),
|
||||
.class_init = zynqmp_apu_class_init,
|
||||
.instance_init = zynqmp_apu_init,
|
||||
.instance_finalize = zynqmp_apu_finalize,
|
||||
};
|
||||
|
||||
static void zynqmp_apu_register_types(void)
|
||||
|
|
|
|||
|
|
@ -211,24 +211,19 @@ static void crf_init(Object *obj)
|
|||
{
|
||||
XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
|
||||
s->reg_array =
|
||||
reg_array =
|
||||
register_init_block32(DEVICE(obj), crf_regs_info,
|
||||
ARRAY_SIZE(crf_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
&crf_ops,
|
||||
XLNX_ZYNQMP_CRF_ERR_DEBUG,
|
||||
CRF_R_MAX * 4);
|
||||
sysbus_init_mmio(sbd, &s->reg_array->mem);
|
||||
sysbus_init_mmio(sbd, ®_array->mem);
|
||||
sysbus_init_irq(sbd, &s->irq_ir);
|
||||
}
|
||||
|
||||
static void crf_finalize(Object *obj)
|
||||
{
|
||||
XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_crf = {
|
||||
.name = TYPE_XLNX_ZYNQMP_CRF,
|
||||
.version_id = 1,
|
||||
|
|
@ -255,7 +250,6 @@ static const TypeInfo crf_info = {
|
|||
.instance_size = sizeof(XlnxZynqMPCRF),
|
||||
.class_init = crf_class_init,
|
||||
.instance_init = crf_init,
|
||||
.instance_finalize = crf_finalize,
|
||||
};
|
||||
|
||||
static void crf_register_types(void)
|
||||
|
|
|
|||
|
|
@ -1410,44 +1410,20 @@ static uint64_t canfd_srr_pre_write(RegisterInfo *reg, uint64_t val64)
|
|||
return s->regs[R_SOFTWARE_RESET_REGISTER];
|
||||
}
|
||||
|
||||
static uint64_t filter_mask(RegisterInfo *reg, uint64_t val64)
|
||||
static void filter_reg_write(XlnxVersalCANFDState *s, hwaddr addr,
|
||||
unsigned bank_idx, uint32_t val)
|
||||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(reg->opaque);
|
||||
uint32_t reg_idx = (reg->access->addr) / 4;
|
||||
uint32_t val = val64;
|
||||
uint32_t filter_offset = (reg_idx - R_AFMR_REGISTER) / 2;
|
||||
size_t reg_idx = addr / sizeof(uint32_t);
|
||||
|
||||
if (!(s->regs[R_ACCEPTANCE_FILTER_CONTROL_REGISTER] &
|
||||
(1 << filter_offset))) {
|
||||
if (!(s->regs[R_ACCEPTANCE_FILTER_CONTROL_REGISTER] & (1 << bank_idx))) {
|
||||
s->regs[reg_idx] = val;
|
||||
} else {
|
||||
g_autofree char *path = object_get_canonical_path(OBJECT(s));
|
||||
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d not enabled\n",
|
||||
path, filter_offset + 1);
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter register 0x%"
|
||||
HWADDR_PRIx " changed while filter %u enabled\n",
|
||||
path, addr, bank_idx + 1);
|
||||
}
|
||||
|
||||
return s->regs[reg_idx];
|
||||
}
|
||||
|
||||
static uint64_t filter_id(RegisterInfo *reg, uint64_t val64)
|
||||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(reg->opaque);
|
||||
hwaddr reg_idx = (reg->access->addr) / 4;
|
||||
uint32_t val = val64;
|
||||
uint32_t filter_offset = (reg_idx - R_AFIR_REGISTER) / 2;
|
||||
|
||||
if (!(s->regs[R_ACCEPTANCE_FILTER_CONTROL_REGISTER] &
|
||||
(1 << filter_offset))) {
|
||||
s->regs[reg_idx] = val;
|
||||
} else {
|
||||
g_autofree char *path = object_get_canonical_path(OBJECT(s));
|
||||
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d not enabled\n",
|
||||
path, filter_offset + 1);
|
||||
}
|
||||
|
||||
return s->regs[reg_idx];
|
||||
}
|
||||
|
||||
static uint64_t canfd_tx_fifo_status_prew(RegisterInfo *reg, uint64_t val64)
|
||||
|
|
@ -1575,125 +1551,6 @@ static uint64_t canfd_write_check_prew(RegisterInfo *reg, uint64_t val64)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const RegisterAccessInfo canfd_tx_regs[] = {
|
||||
{ .name = "TB_ID_REGISTER", .addr = A_TB_ID_REGISTER,
|
||||
},{ .name = "TB0_DLC_REGISTER", .addr = A_TB0_DLC_REGISTER,
|
||||
},{ .name = "TB_DW0_REGISTER", .addr = A_TB_DW0_REGISTER,
|
||||
},{ .name = "TB_DW1_REGISTER", .addr = A_TB_DW1_REGISTER,
|
||||
},{ .name = "TB_DW2_REGISTER", .addr = A_TB_DW2_REGISTER,
|
||||
},{ .name = "TB_DW3_REGISTER", .addr = A_TB_DW3_REGISTER,
|
||||
},{ .name = "TB_DW4_REGISTER", .addr = A_TB_DW4_REGISTER,
|
||||
},{ .name = "TB_DW5_REGISTER", .addr = A_TB_DW5_REGISTER,
|
||||
},{ .name = "TB_DW6_REGISTER", .addr = A_TB_DW6_REGISTER,
|
||||
},{ .name = "TB_DW7_REGISTER", .addr = A_TB_DW7_REGISTER,
|
||||
},{ .name = "TB_DW8_REGISTER", .addr = A_TB_DW8_REGISTER,
|
||||
},{ .name = "TB_DW9_REGISTER", .addr = A_TB_DW9_REGISTER,
|
||||
},{ .name = "TB_DW10_REGISTER", .addr = A_TB_DW10_REGISTER,
|
||||
},{ .name = "TB_DW11_REGISTER", .addr = A_TB_DW11_REGISTER,
|
||||
},{ .name = "TB_DW12_REGISTER", .addr = A_TB_DW12_REGISTER,
|
||||
},{ .name = "TB_DW13_REGISTER", .addr = A_TB_DW13_REGISTER,
|
||||
},{ .name = "TB_DW14_REGISTER", .addr = A_TB_DW14_REGISTER,
|
||||
},{ .name = "TB_DW15_REGISTER", .addr = A_TB_DW15_REGISTER,
|
||||
}
|
||||
};
|
||||
|
||||
static const RegisterAccessInfo canfd_rx0_regs[] = {
|
||||
{ .name = "RB_ID_REGISTER", .addr = A_RB_ID_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DLC_REGISTER", .addr = A_RB_DLC_REGISTER,
|
||||
.ro = 0xfe1fffff,
|
||||
},{ .name = "RB_DW0_REGISTER", .addr = A_RB_DW0_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW1_REGISTER", .addr = A_RB_DW1_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW2_REGISTER", .addr = A_RB_DW2_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW3_REGISTER", .addr = A_RB_DW3_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW4_REGISTER", .addr = A_RB_DW4_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW5_REGISTER", .addr = A_RB_DW5_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW6_REGISTER", .addr = A_RB_DW6_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW7_REGISTER", .addr = A_RB_DW7_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW8_REGISTER", .addr = A_RB_DW8_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW9_REGISTER", .addr = A_RB_DW9_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW10_REGISTER", .addr = A_RB_DW10_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW11_REGISTER", .addr = A_RB_DW11_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW12_REGISTER", .addr = A_RB_DW12_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW13_REGISTER", .addr = A_RB_DW13_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW14_REGISTER", .addr = A_RB_DW14_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW15_REGISTER", .addr = A_RB_DW15_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
}
|
||||
};
|
||||
|
||||
static const RegisterAccessInfo canfd_rx1_regs[] = {
|
||||
{ .name = "RB_ID_REGISTER_1", .addr = A_RB_ID_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DLC_REGISTER_1", .addr = A_RB_DLC_REGISTER_1,
|
||||
.ro = 0xfe1fffff,
|
||||
},{ .name = "RB0_DW0_REGISTER_1", .addr = A_RB0_DW0_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW1_REGISTER_1", .addr = A_RB_DW1_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW2_REGISTER_1", .addr = A_RB_DW2_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW3_REGISTER_1", .addr = A_RB_DW3_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW4_REGISTER_1", .addr = A_RB_DW4_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW5_REGISTER_1", .addr = A_RB_DW5_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW6_REGISTER_1", .addr = A_RB_DW6_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW7_REGISTER_1", .addr = A_RB_DW7_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW8_REGISTER_1", .addr = A_RB_DW8_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW9_REGISTER_1", .addr = A_RB_DW9_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW10_REGISTER_1", .addr = A_RB_DW10_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW11_REGISTER_1", .addr = A_RB_DW11_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW12_REGISTER_1", .addr = A_RB_DW12_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW13_REGISTER_1", .addr = A_RB_DW13_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW14_REGISTER_1", .addr = A_RB_DW14_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "RB_DW15_REGISTER_1", .addr = A_RB_DW15_REGISTER_1,
|
||||
.ro = 0xffffffff,
|
||||
}
|
||||
};
|
||||
|
||||
/* Acceptance filter registers. */
|
||||
static const RegisterAccessInfo canfd_af_regs[] = {
|
||||
{ .name = "AFMR_REGISTER", .addr = A_AFMR_REGISTER,
|
||||
.pre_write = filter_mask,
|
||||
},{ .name = "AFIR_REGISTER", .addr = A_AFIR_REGISTER,
|
||||
.pre_write = filter_id,
|
||||
}
|
||||
};
|
||||
|
||||
static const RegisterAccessInfo canfd_txe_regs[] = {
|
||||
{ .name = "TXE_FIFO_TB_ID_REGISTER", .addr = A_TXE_FIFO_TB_ID_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
},{ .name = "TXE_FIFO_TB_DLC_REGISTER", .addr = A_TXE_FIFO_TB_DLC_REGISTER,
|
||||
.ro = 0xffffffff,
|
||||
}
|
||||
};
|
||||
|
||||
static const RegisterAccessInfo canfd_regs_info[] = {
|
||||
{ .name = "SOFTWARE_RESET_REGISTER", .addr = A_SOFTWARE_RESET_REGISTER,
|
||||
.pre_write = canfd_srr_pre_write,
|
||||
|
|
@ -1763,7 +1620,143 @@ static void xlnx_versal_canfd_ptimer_cb(void *opaque)
|
|||
/* No action required on the timer rollover. */
|
||||
}
|
||||
|
||||
static bool canfd_decode_reg_bank(XlnxVersalCANFDState *s, hwaddr addr,
|
||||
hwaddr first_reg, hwaddr last_reg,
|
||||
size_t num_banks, unsigned *idx,
|
||||
hwaddr *offset)
|
||||
{
|
||||
hwaddr base = addr - first_reg;
|
||||
hwaddr span = last_reg - first_reg + sizeof(uint32_t);
|
||||
unsigned index = base / span;
|
||||
|
||||
if (index >= num_banks) {
|
||||
return false;
|
||||
}
|
||||
if (idx) {
|
||||
*idx = index;
|
||||
}
|
||||
|
||||
*offset = base % span;
|
||||
*offset += first_reg;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode the given addr into a (idx, offset) pair:
|
||||
* - idx is the bank index of the register at addr,
|
||||
* - offset is the register offset relative to bank 0
|
||||
*
|
||||
* @return true is the decoding succeded, false otherwise
|
||||
*/
|
||||
static bool canfd_decode_addr(XlnxVersalCANFDState *s, hwaddr addr,
|
||||
unsigned *idx, hwaddr *offset)
|
||||
{
|
||||
if (addr <= A_RX_FIFO_WATERMARK_REGISTER) {
|
||||
/* from 0x0 to 0xec. Handled by the register API */
|
||||
g_assert_not_reached();
|
||||
} else if (addr < A_TB_ID_REGISTER) {
|
||||
/* no register in this gap */
|
||||
return false;
|
||||
} else if (addr < A_AFMR_REGISTER) {
|
||||
/* TX registers */
|
||||
return canfd_decode_reg_bank(s, addr,
|
||||
A_TB_ID_REGISTER, A_TB_DW15_REGISTER,
|
||||
s->cfg.tx_fifo, idx, offset);
|
||||
} else if (addr < A_TXE_FIFO_TB_ID_REGISTER) {
|
||||
/* Filter registers */
|
||||
return canfd_decode_reg_bank(s, addr,
|
||||
A_AFMR_REGISTER, A_AFIR_REGISTER,
|
||||
32, idx, offset);
|
||||
} else if (addr < A_RB_ID_REGISTER) {
|
||||
/* TX event registers */
|
||||
return canfd_decode_reg_bank(s, addr,
|
||||
A_TXE_FIFO_TB_ID_REGISTER,
|
||||
A_TXE_FIFO_TB_DLC_REGISTER,
|
||||
32, idx, offset);
|
||||
} else if (addr < A_RB_ID_REGISTER_1) {
|
||||
/* RX0 registers */
|
||||
return canfd_decode_reg_bank(s, addr,
|
||||
A_RB_ID_REGISTER,
|
||||
A_RB_DW15_REGISTER,
|
||||
s->cfg.rx0_fifo, idx, offset);
|
||||
} else if (addr <= A_RB_DW15_REGISTER_1) {
|
||||
/* RX1 registers */
|
||||
return canfd_decode_reg_bank(s, addr,
|
||||
A_RB_ID_REGISTER_1,
|
||||
A_RB_DW15_REGISTER_1,
|
||||
s->cfg.rx1_fifo, idx, offset);
|
||||
}
|
||||
|
||||
/* decode error */
|
||||
return false;
|
||||
}
|
||||
|
||||
static uint64_t canfd_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(opaque);
|
||||
hwaddr reg_offset;
|
||||
uint64_t ret;
|
||||
|
||||
if (!canfd_decode_addr(s, addr, NULL, ®_offset)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, TYPE_XILINX_CANFD
|
||||
": read to unknown register at address 0x%"
|
||||
HWADDR_PRIx "\n", addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (reg_offset) {
|
||||
default:
|
||||
ret = s->regs[addr / sizeof(uint32_t)];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void canfd_write(void *opaque, hwaddr addr, uint64_t value,
|
||||
unsigned size)
|
||||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(opaque);
|
||||
unsigned bank_idx;
|
||||
hwaddr reg_offset;
|
||||
|
||||
if (!canfd_decode_addr(s, addr, &bank_idx, ®_offset)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, TYPE_XILINX_CANFD
|
||||
": write to unknown register at address 0x%"
|
||||
HWADDR_PRIx "\n", addr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (addr >= A_TXE_FIFO_TB_ID_REGISTER) {
|
||||
/* All registers from TX event regs to the end are read-only */
|
||||
qemu_log_mask(LOG_GUEST_ERROR, TYPE_XILINX_CANFD
|
||||
": write to read-only register at 0x%" HWADDR_PRIx "\n",
|
||||
addr);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (reg_offset) {
|
||||
case A_AFMR_REGISTER:
|
||||
case A_AFIR_REGISTER:
|
||||
filter_reg_write(s, addr, bank_idx, value);
|
||||
break;
|
||||
|
||||
default:
|
||||
s->regs[addr / sizeof(uint32_t)] = value;
|
||||
}
|
||||
}
|
||||
|
||||
static const MemoryRegionOps canfd_ops = {
|
||||
.read = canfd_read,
|
||||
.write = canfd_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid = {
|
||||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
};
|
||||
|
||||
static const MemoryRegionOps canfd_regs_ops = {
|
||||
.read = register_read_memory,
|
||||
.write = register_write_memory,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
|
|
@ -1852,142 +1845,16 @@ static int xlnx_canfd_connect_to_bus(XlnxVersalCANFDState *s,
|
|||
return can_bus_insert_client(bus, &s->bus_client);
|
||||
}
|
||||
|
||||
#define NUM_REG_PER_AF ARRAY_SIZE(canfd_af_regs)
|
||||
#define NUM_AF 32
|
||||
#define NUM_REG_PER_TXE ARRAY_SIZE(canfd_txe_regs)
|
||||
#define NUM_TXE 32
|
||||
|
||||
static int canfd_populate_regarray(XlnxVersalCANFDState *s,
|
||||
RegisterInfoArray *r_array, int pos,
|
||||
const RegisterAccessInfo *rae,
|
||||
int num_rae)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_rae; i++) {
|
||||
int index = rae[i].addr / 4;
|
||||
RegisterInfo *r = &s->reg_info[index];
|
||||
|
||||
object_initialize(r, sizeof(*r), TYPE_REGISTER);
|
||||
|
||||
*r = (RegisterInfo) {
|
||||
.data = &s->regs[index],
|
||||
.data_size = sizeof(uint32_t),
|
||||
.access = &rae[i],
|
||||
.opaque = OBJECT(s),
|
||||
};
|
||||
|
||||
r_array->r[i + pos] = r;
|
||||
}
|
||||
return i + pos;
|
||||
}
|
||||
|
||||
static void canfd_create_rai(RegisterAccessInfo *rai_array,
|
||||
const RegisterAccessInfo *canfd_regs,
|
||||
int template_rai_array_sz,
|
||||
int num_template_to_copy)
|
||||
{
|
||||
int i;
|
||||
int reg_num;
|
||||
|
||||
for (reg_num = 0; reg_num < num_template_to_copy; reg_num++) {
|
||||
int pos = reg_num * template_rai_array_sz;
|
||||
|
||||
memcpy(rai_array + pos, canfd_regs,
|
||||
template_rai_array_sz * sizeof(RegisterAccessInfo));
|
||||
|
||||
for (i = 0; i < template_rai_array_sz; i++) {
|
||||
const char *name = canfd_regs[i].name;
|
||||
uint64_t addr = canfd_regs[i].addr;
|
||||
rai_array[i + pos].name = g_strdup_printf("%s%d", name, reg_num);
|
||||
rai_array[i + pos].addr = addr + pos * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static RegisterInfoArray *canfd_create_regarray(XlnxVersalCANFDState *s)
|
||||
{
|
||||
const char *device_prefix = object_get_typename(OBJECT(s));
|
||||
uint64_t memory_size = XLNX_VERSAL_CANFD_R_MAX * 4;
|
||||
int num_regs;
|
||||
int pos = 0;
|
||||
RegisterInfoArray *r_array;
|
||||
|
||||
num_regs = ARRAY_SIZE(canfd_regs_info) +
|
||||
s->cfg.tx_fifo * NUM_REGS_PER_MSG_SPACE +
|
||||
s->cfg.rx0_fifo * NUM_REGS_PER_MSG_SPACE +
|
||||
NUM_AF * NUM_REG_PER_AF +
|
||||
NUM_TXE * NUM_REG_PER_TXE;
|
||||
|
||||
s->tx_regs = g_new0(RegisterAccessInfo,
|
||||
s->cfg.tx_fifo * ARRAY_SIZE(canfd_tx_regs));
|
||||
|
||||
canfd_create_rai(s->tx_regs, canfd_tx_regs,
|
||||
ARRAY_SIZE(canfd_tx_regs), s->cfg.tx_fifo);
|
||||
|
||||
s->rx0_regs = g_new0(RegisterAccessInfo,
|
||||
s->cfg.rx0_fifo * ARRAY_SIZE(canfd_rx0_regs));
|
||||
|
||||
canfd_create_rai(s->rx0_regs, canfd_rx0_regs,
|
||||
ARRAY_SIZE(canfd_rx0_regs), s->cfg.rx0_fifo);
|
||||
|
||||
s->af_regs = g_new0(RegisterAccessInfo,
|
||||
NUM_AF * ARRAY_SIZE(canfd_af_regs));
|
||||
|
||||
canfd_create_rai(s->af_regs, canfd_af_regs,
|
||||
ARRAY_SIZE(canfd_af_regs), NUM_AF);
|
||||
|
||||
s->txe_regs = g_new0(RegisterAccessInfo,
|
||||
NUM_TXE * ARRAY_SIZE(canfd_txe_regs));
|
||||
|
||||
canfd_create_rai(s->txe_regs, canfd_txe_regs,
|
||||
ARRAY_SIZE(canfd_txe_regs), NUM_TXE);
|
||||
|
||||
if (s->cfg.enable_rx_fifo1) {
|
||||
num_regs += s->cfg.rx1_fifo * NUM_REGS_PER_MSG_SPACE;
|
||||
|
||||
s->rx1_regs = g_new0(RegisterAccessInfo,
|
||||
s->cfg.rx1_fifo * ARRAY_SIZE(canfd_rx1_regs));
|
||||
|
||||
canfd_create_rai(s->rx1_regs, canfd_rx1_regs,
|
||||
ARRAY_SIZE(canfd_rx1_regs), s->cfg.rx1_fifo);
|
||||
}
|
||||
|
||||
r_array = g_new0(RegisterInfoArray, 1);
|
||||
r_array->r = g_new0(RegisterInfo * , num_regs);
|
||||
r_array->num_elements = num_regs;
|
||||
r_array->prefix = device_prefix;
|
||||
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
canfd_regs_info,
|
||||
ARRAY_SIZE(canfd_regs_info));
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
s->tx_regs, s->cfg.tx_fifo *
|
||||
NUM_REGS_PER_MSG_SPACE);
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
s->rx0_regs, s->cfg.rx0_fifo *
|
||||
NUM_REGS_PER_MSG_SPACE);
|
||||
if (s->cfg.enable_rx_fifo1) {
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
s->rx1_regs, s->cfg.rx1_fifo *
|
||||
NUM_REGS_PER_MSG_SPACE);
|
||||
}
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
s->af_regs, NUM_AF * NUM_REG_PER_AF);
|
||||
pos = canfd_populate_regarray(s, r_array, pos,
|
||||
s->txe_regs, NUM_TXE * NUM_REG_PER_TXE);
|
||||
|
||||
memory_region_init_io(&r_array->mem, OBJECT(s), &canfd_ops, r_array,
|
||||
device_prefix, memory_size);
|
||||
return r_array;
|
||||
}
|
||||
|
||||
static void canfd_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(dev);
|
||||
RegisterInfoArray *reg_array;
|
||||
|
||||
reg_array = canfd_create_regarray(s);
|
||||
reg_array = register_init_block32(dev, canfd_regs_info,
|
||||
ARRAY_SIZE(canfd_regs_info), s->reg_info,
|
||||
s->regs, &canfd_regs_ops, false,
|
||||
A_RX_FIFO_WATERMARK_REGISTER
|
||||
+ sizeof(uint32_t));
|
||||
memory_region_add_subregion(&s->iomem, 0x00, ®_array->mem);
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq_canfd_int);
|
||||
|
|
@ -2020,8 +1887,8 @@ static void canfd_init(Object *obj)
|
|||
{
|
||||
XlnxVersalCANFDState *s = XILINX_CANFD(obj);
|
||||
|
||||
memory_region_init(&s->iomem, obj, TYPE_XILINX_CANFD,
|
||||
XLNX_VERSAL_CANFD_R_MAX * 4);
|
||||
memory_region_init_io(&s->iomem, obj, &canfd_ops, s, TYPE_XILINX_CANFD,
|
||||
XLNX_VERSAL_CANFD_R_MAX * 4);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_canfd = {
|
||||
|
|
|
|||
|
|
@ -456,8 +456,9 @@ static void bbram_ctrl_init(Object *obj)
|
|||
{
|
||||
XlnxBBRam *s = XLNX_BBRAM(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
RegisterInfoArray *reg_array;
|
||||
|
||||
s->reg_array =
|
||||
reg_array =
|
||||
register_init_block32(DEVICE(obj), bbram_ctrl_regs_info,
|
||||
ARRAY_SIZE(bbram_ctrl_regs_info),
|
||||
s->regs_info, s->regs,
|
||||
|
|
@ -465,17 +466,10 @@ static void bbram_ctrl_init(Object *obj)
|
|||
XLNX_BBRAM_ERR_DEBUG,
|
||||
R_MAX * 4);
|
||||
|
||||
sysbus_init_mmio(sbd, &s->reg_array->mem);
|
||||
sysbus_init_mmio(sbd, ®_array->mem);
|
||||
sysbus_init_irq(sbd, &s->irq_bbram);
|
||||
}
|
||||
|
||||
static void bbram_ctrl_finalize(Object *obj)
|
||||
{
|
||||
XlnxBBRam *s = XLNX_BBRAM(obj);
|
||||
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static void bbram_prop_set_drive(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
|
|
@ -542,7 +536,6 @@ static const TypeInfo bbram_ctrl_info = {
|
|||
.instance_size = sizeof(XlnxBBRam),
|
||||
.class_init = bbram_ctrl_class_init,
|
||||
.instance_init = bbram_ctrl_init,
|
||||
.instance_finalize = bbram_ctrl_finalize,
|
||||
};
|
||||
|
||||
static void bbram_ctrl_register_types(void)
|
||||
|
|
|
|||
|
|
@ -728,7 +728,6 @@ static void efuse_ctrl_finalize(Object *obj)
|
|||
{
|
||||
XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(obj);
|
||||
|
||||
register_finalize_block(s->reg_array);
|
||||
g_free(s->extra_pg0_lock_spec);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -816,13 +816,6 @@ static void zynqmp_efuse_init(Object *obj)
|
|||
sysbus_init_irq(sbd, &s->irq);
|
||||
}
|
||||
|
||||
static void zynqmp_efuse_finalize(Object *obj)
|
||||
{
|
||||
XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(obj);
|
||||
|
||||
register_finalize_block(s->reg_array);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_efuse = {
|
||||
.name = TYPE_XLNX_ZYNQMP_EFUSE,
|
||||
.version_id = 1,
|
||||
|
|
@ -857,7 +850,6 @@ static const TypeInfo efuse_info = {
|
|||
.instance_size = sizeof(XlnxZynqMPEFuse),
|
||||
.class_init = zynqmp_efuse_class_init,
|
||||
.instance_init = zynqmp_efuse_init,
|
||||
.instance_finalize = zynqmp_efuse_finalize,
|
||||
};
|
||||
|
||||
static void efuse_register_types(void)
|
||||
|
|
|
|||
|
|
@ -247,10 +247,10 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base,
|
|||
OpenRISCCPU *cpus[], int irq_pin,
|
||||
int uart_idx)
|
||||
{
|
||||
g_autofree char *alias = g_strdup_printf("serial%d", uart_idx);
|
||||
void *fdt = state->fdt;
|
||||
char *nodename;
|
||||
qemu_irq serial_irq;
|
||||
char alias[sizeof("serial0")];
|
||||
int i;
|
||||
|
||||
if (num_cpus > 1) {
|
||||
|
|
@ -281,7 +281,6 @@ static void openrisc_sim_serial_init(Or1ksimState *state, hwaddr base,
|
|||
/* The /chosen node is created during fdt creation. */
|
||||
qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", nodename);
|
||||
}
|
||||
snprintf(alias, sizeof(alias), "serial%d", uart_idx);
|
||||
qemu_fdt_setprop_string(fdt, "/aliases", alias, nodename);
|
||||
|
||||
g_free(nodename);
|
||||
|
|
|
|||
|
|
@ -72,37 +72,29 @@ struct PRePPCIState {
|
|||
|
||||
#define PCI_IO_BASE_ADDR 0x80000000 /* Physical address on main bus */
|
||||
|
||||
static inline uint32_t raven_pci_io_config(hwaddr addr)
|
||||
static inline uint32_t raven_idsel_to_addr(hwaddr addr)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 11; i++) {
|
||||
if ((addr & (1 << (11 + i))) != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (addr & 0x7ff) | (i << 11);
|
||||
return (ctz16(addr >> 11) << 11) | (addr & 0x7ff);
|
||||
}
|
||||
|
||||
static void raven_pci_io_write(void *opaque, hwaddr addr,
|
||||
uint64_t val, unsigned int size)
|
||||
static void raven_mmcfg_write(void *opaque, hwaddr addr, uint64_t val,
|
||||
unsigned int size)
|
||||
{
|
||||
PREPPCIState *s = opaque;
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(s);
|
||||
pci_data_write(phb->bus, raven_pci_io_config(addr), val, size);
|
||||
PCIBus *hbus = opaque;
|
||||
|
||||
pci_data_write(hbus, raven_idsel_to_addr(addr), val, size);
|
||||
}
|
||||
|
||||
static uint64_t raven_pci_io_read(void *opaque, hwaddr addr,
|
||||
unsigned int size)
|
||||
static uint64_t raven_mmcfg_read(void *opaque, hwaddr addr, unsigned int size)
|
||||
{
|
||||
PREPPCIState *s = opaque;
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(s);
|
||||
return pci_data_read(phb->bus, raven_pci_io_config(addr), size);
|
||||
PCIBus *hbus = opaque;
|
||||
|
||||
return pci_data_read(hbus, raven_idsel_to_addr(addr), size);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps raven_pci_io_ops = {
|
||||
.read = raven_pci_io_read,
|
||||
.write = raven_pci_io_write,
|
||||
static const MemoryRegionOps raven_mmcfg_ops = {
|
||||
.read = raven_mmcfg_read,
|
||||
.write = raven_mmcfg_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
|
|
@ -260,8 +252,8 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
|
|||
"pci-conf-data", 4);
|
||||
memory_region_add_subregion(&s->pci_io, 0xcfc, &h->data_mem);
|
||||
|
||||
memory_region_init_io(&h->mmcfg, OBJECT(s), &raven_pci_io_ops, s,
|
||||
"pciio", 0x00400000);
|
||||
memory_region_init_io(&h->mmcfg, OBJECT(h), &raven_mmcfg_ops, h->bus,
|
||||
"pci-mmcfg", 0x00400000);
|
||||
memory_region_add_subregion(address_space_mem, 0x80800000, &h->mmcfg);
|
||||
|
||||
memory_region_init_io(&s->pci_intack, OBJECT(s), &raven_intack_ops, s,
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "qemu/guest-random.h"
|
||||
#include "exec/target_page.h"
|
||||
#include "qapi/error.h"
|
||||
#include "cpu-models.h"
|
||||
#include "e500.h"
|
||||
#include "e500-ccsr.h"
|
||||
#include "net/net.h"
|
||||
|
|
@ -942,9 +943,8 @@ void ppce500_init(MachineState *machine)
|
|||
env = &cpu->env;
|
||||
cs = CPU(cpu);
|
||||
|
||||
if (env->mmu_model != POWERPC_MMU_BOOKE206) {
|
||||
error_report("MMU model %i not supported by this machine",
|
||||
env->mmu_model);
|
||||
if (!(POWERPC_CPU_GET_CLASS(cpu)->svr & POWERPC_SVR_E500)) {
|
||||
error_report("This machine needs a CPU from the e500 family");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -308,6 +308,13 @@ static void ibm_40p_init(MachineState *machine)
|
|||
sysbus_connect_irq(pcihost, 0, qdev_get_gpio_in(i82378_dev, 15));
|
||||
isa_bus = ISA_BUS(qdev_get_child_bus(i82378_dev, "isa.0"));
|
||||
|
||||
/* system control ports */
|
||||
isa_dev = isa_new("prep-systemio");
|
||||
dev = DEVICE(isa_dev);
|
||||
qdev_prop_set_uint32(dev, "ibm-planar-id", 0xfc);
|
||||
qdev_prop_set_uint32(dev, "equipment", 0xc0);
|
||||
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
|
||||
|
||||
/* Memory controller */
|
||||
isa_dev = isa_new("rs6000-mc");
|
||||
dev = DEVICE(isa_dev);
|
||||
|
|
@ -333,7 +340,6 @@ static void ibm_40p_init(MachineState *machine)
|
|||
dev = DEVICE(isa_dev);
|
||||
qdev_prop_set_uint32(dev, "iobase", 0x830);
|
||||
qdev_prop_set_uint32(dev, "irq", 10);
|
||||
|
||||
if (machine->audiodev) {
|
||||
qdev_prop_set_string(dev, "audiodev", machine->audiodev);
|
||||
}
|
||||
|
|
@ -344,14 +350,7 @@ static void ibm_40p_init(MachineState *machine)
|
|||
qdev_prop_set_uint32(dev, "config", 12);
|
||||
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
|
||||
|
||||
isa_dev = isa_new("prep-systemio");
|
||||
dev = DEVICE(isa_dev);
|
||||
qdev_prop_set_uint32(dev, "ibm-planar-id", 0xfc);
|
||||
qdev_prop_set_uint32(dev, "equipment", 0xc0);
|
||||
isa_realize_and_unref(isa_dev, isa_bus, &error_fatal);
|
||||
|
||||
dev = DEVICE(pci_create_simple(pci_bus, PCI_DEVFN(1, 0),
|
||||
"lsi53c810"));
|
||||
dev = DEVICE(pci_create_simple(pci_bus, PCI_DEVFN(1, 0), "lsi53c810"));
|
||||
lsi53c8xx_handle_legacy_cmdline(dev);
|
||||
qdev_connect_gpio_out(dev, 0, qdev_get_gpio_in(i82378_dev, 13));
|
||||
|
||||
|
|
|
|||
|
|
@ -2817,7 +2817,7 @@ static void spapr_machine_init(MachineState *machine)
|
|||
int i;
|
||||
MemoryRegion *sysmem = get_system_memory();
|
||||
long load_limit, fw_size;
|
||||
Error *resize_hpt_err = NULL;
|
||||
Error *errp = NULL;
|
||||
NICInfo *nd;
|
||||
|
||||
if (!filename) {
|
||||
|
|
@ -2845,7 +2845,7 @@ static void spapr_machine_init(MachineState *machine)
|
|||
/* Determine capabilities to run with */
|
||||
spapr_caps_init(spapr);
|
||||
|
||||
kvmppc_check_papr_resize_hpt(&resize_hpt_err);
|
||||
kvmppc_check_papr_resize_hpt(&errp);
|
||||
if (spapr->resize_hpt == SPAPR_RESIZE_HPT_DEFAULT) {
|
||||
/*
|
||||
* If the user explicitly requested a mode we should either
|
||||
|
|
@ -2853,10 +2853,10 @@ static void spapr_machine_init(MachineState *machine)
|
|||
* it's not set explicitly, we reset our mode to something
|
||||
* that works
|
||||
*/
|
||||
if (resize_hpt_err) {
|
||||
if (errp) {
|
||||
spapr->resize_hpt = SPAPR_RESIZE_HPT_DISABLED;
|
||||
error_free(resize_hpt_err);
|
||||
resize_hpt_err = NULL;
|
||||
error_free(errp);
|
||||
errp = NULL;
|
||||
} else {
|
||||
spapr->resize_hpt = smc->resize_hpt_default;
|
||||
}
|
||||
|
|
@ -2864,14 +2864,14 @@ static void spapr_machine_init(MachineState *machine)
|
|||
|
||||
assert(spapr->resize_hpt != SPAPR_RESIZE_HPT_DEFAULT);
|
||||
|
||||
if ((spapr->resize_hpt != SPAPR_RESIZE_HPT_DISABLED) && resize_hpt_err) {
|
||||
if ((spapr->resize_hpt != SPAPR_RESIZE_HPT_DISABLED) && errp) {
|
||||
/*
|
||||
* User requested HPT resize, but this host can't supply it. Bail out
|
||||
*/
|
||||
error_report_err(resize_hpt_err);
|
||||
error_report_err(errp);
|
||||
exit(1);
|
||||
}
|
||||
error_free(resize_hpt_err);
|
||||
error_free(errp);
|
||||
|
||||
spapr->rma_size = spapr_rma_size(spapr, &error_fatal);
|
||||
|
||||
|
|
|
|||
|
|
@ -43,16 +43,10 @@
|
|||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-events-misc.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "trace.h"
|
||||
|
||||
//#define DEBUG_CMOS
|
||||
//#define DEBUG_COALESCED
|
||||
|
||||
#ifdef DEBUG_CMOS
|
||||
# define CMOS_DPRINTF(format, ...) printf(format, ## __VA_ARGS__)
|
||||
#else
|
||||
# define CMOS_DPRINTF(format, ...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_COALESCED
|
||||
# define DPRINTF_C(format, ...) printf(format, ## __VA_ARGS__)
|
||||
#else
|
||||
|
|
@ -439,8 +433,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr,
|
|||
if ((addr & 1) == 0) {
|
||||
s->cmos_index = data & 0x7f;
|
||||
} else {
|
||||
CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02" PRIx64 "\n",
|
||||
s->cmos_index, data);
|
||||
trace_mc146818_rtc_ioport_write(s->cmos_index, data);
|
||||
switch(s->cmos_index) {
|
||||
case RTC_SECONDS_ALARM:
|
||||
case RTC_MINUTES_ALARM:
|
||||
|
|
@ -726,21 +719,20 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr addr,
|
|||
ret = s->cmos_data[s->cmos_index];
|
||||
break;
|
||||
}
|
||||
CMOS_DPRINTF("cmos: read index=0x%02x val=0x%02x\n",
|
||||
s->cmos_index, ret);
|
||||
trace_mc146818_rtc_ioport_read(s->cmos_index, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
void mc146818rtc_set_cmos_data(MC146818RtcState *s, int addr, int val)
|
||||
{
|
||||
if (addr >= 0 && addr <= 127)
|
||||
s->cmos_data[addr] = val;
|
||||
assert(addr >= 0 && addr < ARRAY_SIZE(s->cmos_data));
|
||||
s->cmos_data[addr] = val;
|
||||
}
|
||||
|
||||
int mc146818rtc_get_cmos_data(MC146818RtcState *s, int addr)
|
||||
{
|
||||
assert(addr >= 0 && addr <= 127);
|
||||
assert(addr >= 0 && addr < ARRAY_SIZE(s->cmos_data));
|
||||
return s->cmos_data[addr];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,10 @@ m48txx_nvram_io_write(uint64_t addr, uint64_t value) "io write addr:0x%04" PRIx6
|
|||
m48txx_nvram_mem_read(uint32_t addr, uint32_t value) "mem read addr:0x%04x value:0x%02x"
|
||||
m48txx_nvram_mem_write(uint32_t addr, uint32_t value) "mem write addr:0x%04x value:0x%02x"
|
||||
|
||||
# mc146818rtc.c
|
||||
mc146818_rtc_ioport_read(uint8_t addr, uint8_t value) "[0x%02" PRIx8 "] -> 0x%02" PRIx8
|
||||
mc146818_rtc_ioport_write(uint8_t addr, uint8_t value) "[0x%02" PRIx8 "] <- 0x%02" PRIx8
|
||||
|
||||
# goldfish_rtc.c
|
||||
goldfish_rtc_read(uint64_t addr, uint64_t value) "addr 0x%02" PRIx64 " value 0x%08" PRIx64
|
||||
goldfish_rtc_write(uint64_t addr, uint64_t value) "addr 0x%02" PRIx64 " value 0x%08" PRIx64
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "hw/timer/i8254.h"
|
||||
#include "hw/timer/i8254_internal.h"
|
||||
#include "qom/object.h"
|
||||
#include "trace.h"
|
||||
|
||||
//#define DEBUG_PIT
|
||||
|
||||
|
|
@ -130,6 +131,8 @@ static void pit_ioport_write(void *opaque, hwaddr addr,
|
|||
int channel, access;
|
||||
PITChannelState *s;
|
||||
|
||||
trace_pit_ioport_write(addr, val);
|
||||
|
||||
addr &= 3;
|
||||
if (addr == 3) {
|
||||
channel = val >> 6;
|
||||
|
|
@ -248,6 +251,9 @@ static uint64_t pit_ioport_read(void *opaque, hwaddr addr,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
trace_pit_ioport_read(addr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,9 +32,8 @@
|
|||
#include "migration/vmstate.h"
|
||||
|
||||
/* val must be 0 or 1 */
|
||||
void pit_set_gate(ISADevice *dev, int channel, int val)
|
||||
void pit_set_gate(PITCommonState *pit, int channel, int val)
|
||||
{
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
PITChannelState *s = &pit->channels[channel];
|
||||
PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
|
||||
|
||||
|
|
@ -139,9 +138,8 @@ void pit_get_channel_info_common(PITCommonState *s, PITChannelState *sc,
|
|||
info->out = pit_get_out(sc, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
|
||||
}
|
||||
|
||||
void pit_get_channel_info(ISADevice *dev, int channel, PITChannelInfo *info)
|
||||
void pit_get_channel_info(PITCommonState *pit, int channel, PITChannelInfo *info)
|
||||
{
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
PITChannelState *s = &pit->channels[channel];
|
||||
PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,10 @@ cmsdk_apb_dualtimer_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK A
|
|||
cmsdk_apb_dualtimer_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB dualtimer write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
|
||||
cmsdk_apb_dualtimer_reset(void) "CMSDK APB dualtimer: reset"
|
||||
|
||||
# i8254.c
|
||||
pit_ioport_read(uint8_t addr, uint32_t value) "[0x%" PRIx8 "] -> 0x%" PRIx32
|
||||
pit_ioport_write(uint8_t addr, uint32_t value) "[0x%" PRIx8 "] <- 0x%" PRIx32
|
||||
|
||||
# imx_gpt.c
|
||||
imx_gpt_set_freq(uint32_t clksrc, uint32_t freq) "Setting clksrc %u to %u Hz"
|
||||
imx_gpt_read(const char *name, uint64_t value) "%s -> 0x%08" PRIx64
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ specific_virtio_ss.add(when: 'CONFIG_VIRTIO_BALLOON', if_true: files('virtio-bal
|
|||
specific_virtio_ss.add(when: 'CONFIG_VHOST_USER_FS', if_true: files('vhost-user-fs.c'))
|
||||
specific_virtio_ss.add(when: 'CONFIG_VIRTIO_PMEM', if_true: files('virtio-pmem.c'))
|
||||
specific_virtio_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock.c'))
|
||||
specific_virtio_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem.c'))
|
||||
system_virtio_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem.c'))
|
||||
system_virtio_ss.add(when: 'CONFIG_VIRTIO_NSM', if_true: files('virtio-nsm.c'))
|
||||
system_virtio_ss.add(when: 'CONFIG_VIRTIO_NSM', if_true: [files('cbor-helpers.c'), libcbor])
|
||||
system_virtio_ss.add(when: 'CONFIG_VHOST_USER_SCMI', if_true: files('vhost-user-scmi.c'))
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include "qemu/cutils.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/target-info-qapi.h"
|
||||
#include "system/numa.h"
|
||||
#include "system/system.h"
|
||||
#include "system/ramblock.h"
|
||||
|
|
@ -33,13 +34,21 @@
|
|||
|
||||
static const VMStateDescription vmstate_virtio_mem_device_early;
|
||||
|
||||
/*
|
||||
* We only had legacy x86 guests that did not support
|
||||
* VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE. Other targets don't have legacy guests.
|
||||
*/
|
||||
#if defined(TARGET_X86_64) || defined(TARGET_I386)
|
||||
#define VIRTIO_MEM_HAS_LEGACY_GUESTS
|
||||
#endif
|
||||
static bool virtio_mem_has_legacy_guests(void)
|
||||
{
|
||||
/*
|
||||
* We only had legacy x86 guests that did not support
|
||||
* VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE. Other targets don't have
|
||||
* legacy guests.
|
||||
*/
|
||||
switch (target_arch()) {
|
||||
case SYS_EMU_TARGET_I386:
|
||||
case SYS_EMU_TARGET_X86_64:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's not allow blocks smaller than 1 MiB, for example, to keep the tracking
|
||||
|
|
@ -143,7 +152,6 @@ static uint64_t virtio_mem_default_block_size(RAMBlock *rb)
|
|||
return MAX(page_size, VIRTIO_MEM_MIN_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
|
||||
{
|
||||
/*
|
||||
|
|
@ -154,7 +162,6 @@ static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
|
|||
return !qemu_ram_is_shared(rb) && qemu_ram_get_fd(rb) < 0 &&
|
||||
qemu_ram_pagesize(rb) == qemu_real_host_page_size();
|
||||
}
|
||||
#endif /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
|
||||
/*
|
||||
* Size the usable region bigger than the requested size if possible. Esp.
|
||||
|
|
@ -170,13 +177,20 @@ static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
|
|||
* necessary (as the section size can change). But it's more likely that the
|
||||
* section size will rather get smaller and not bigger over time.
|
||||
*/
|
||||
#if defined(TARGET_X86_64) || defined(TARGET_I386) || defined(TARGET_S390X)
|
||||
#define VIRTIO_MEM_USABLE_EXTENT (2 * (128 * MiB))
|
||||
#elif defined(TARGET_ARM)
|
||||
#define VIRTIO_MEM_USABLE_EXTENT (2 * (512 * MiB))
|
||||
#else
|
||||
#error VIRTIO_MEM_USABLE_EXTENT not defined
|
||||
#endif
|
||||
static uint64_t virtio_mem_usable_extent_size(void)
|
||||
{
|
||||
switch (target_arch()) {
|
||||
case SYS_EMU_TARGET_I386:
|
||||
case SYS_EMU_TARGET_X86_64:
|
||||
case SYS_EMU_TARGET_S390X:
|
||||
return 2 * 128 * MiB;
|
||||
case SYS_EMU_TARGET_AARCH64:
|
||||
case SYS_EMU_TARGET_ARM:
|
||||
return 2 * 512 * MiB;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static bool virtio_mem_is_busy(void)
|
||||
{
|
||||
|
|
@ -699,7 +713,7 @@ static void virtio_mem_resize_usable_region(VirtIOMEM *vmem,
|
|||
bool can_shrink)
|
||||
{
|
||||
uint64_t newsize = MIN(memory_region_size(&vmem->memdev->mr),
|
||||
requested_size + VIRTIO_MEM_USABLE_EXTENT);
|
||||
requested_size + virtio_mem_usable_extent_size());
|
||||
|
||||
/* The usable region size always has to be multiples of the block size. */
|
||||
newsize = QEMU_ALIGN_UP(newsize, vmem->block_size);
|
||||
|
|
@ -975,28 +989,28 @@ static void virtio_mem_device_realize(DeviceState *dev, Error **errp)
|
|||
rb = vmem->memdev->mr.ram_block;
|
||||
page_size = qemu_ram_pagesize(rb);
|
||||
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
switch (vmem->unplugged_inaccessible) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
if (virtio_mem_has_shared_zeropage(rb)) {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_OFF;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
if (virtio_mem_has_legacy_guests()) {
|
||||
switch (vmem->unplugged_inaccessible) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
if (virtio_mem_has_shared_zeropage(rb)) {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_OFF;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
}
|
||||
break;
|
||||
case ON_OFF_AUTO_OFF:
|
||||
if (!virtio_mem_has_shared_zeropage(rb)) {
|
||||
warn_report("'%s' property set to 'off' with a memdev that does"
|
||||
" not support the shared zeropage.",
|
||||
VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ON_OFF_AUTO_OFF:
|
||||
if (!virtio_mem_has_shared_zeropage(rb)) {
|
||||
warn_report("'%s' property set to 'off' with a memdev that does"
|
||||
" not support the shared zeropage.",
|
||||
VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
}
|
||||
#else /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
#endif /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
|
||||
if (vmem->dynamic_memslots &&
|
||||
vmem->unplugged_inaccessible != ON_OFF_AUTO_ON) {
|
||||
|
|
@ -1693,16 +1707,17 @@ static const Property virtio_mem_properties[] = {
|
|||
DEFINE_PROP_BOOL(VIRTIO_MEM_PREALLOC_PROP, VirtIOMEM, prealloc, false),
|
||||
DEFINE_PROP_LINK(VIRTIO_MEM_MEMDEV_PROP, VirtIOMEM, memdev,
|
||||
TYPE_MEMORY_BACKEND, HostMemoryBackend *),
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
DEFINE_PROP_ON_OFF_AUTO(VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP, VirtIOMEM,
|
||||
unplugged_inaccessible, ON_OFF_AUTO_ON),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_EARLY_MIGRATION_PROP, VirtIOMEM,
|
||||
early_migration, true),
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_DYNAMIC_MEMSLOTS_PROP, VirtIOMEM,
|
||||
dynamic_memslots, false),
|
||||
};
|
||||
|
||||
static const Property virtio_mem_legacy_guests_properties[] = {
|
||||
DEFINE_PROP_ON_OFF_AUTO(VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP, VirtIOMEM,
|
||||
unplugged_inaccessible, ON_OFF_AUTO_ON),
|
||||
};
|
||||
|
||||
static uint64_t virtio_mem_rdm_get_min_granularity(const RamDiscardManager *rdm,
|
||||
const MemoryRegion *mr)
|
||||
{
|
||||
|
|
@ -1854,6 +1869,9 @@ static void virtio_mem_class_init(ObjectClass *klass, const void *data)
|
|||
RamDiscardManagerClass *rdmc = RAM_DISCARD_MANAGER_CLASS(klass);
|
||||
|
||||
device_class_set_props(dc, virtio_mem_properties);
|
||||
if (virtio_mem_has_legacy_guests()) {
|
||||
device_class_set_props(dc, virtio_mem_legacy_guests_properties);
|
||||
}
|
||||
dc->vmsd = &vmstate_virtio_mem;
|
||||
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
|
|
|
|||
|
|
@ -138,6 +138,7 @@ static int msi_msix_setup(XenPCIPassthroughState *s,
|
|||
rc = xc_physdev_map_pirq_msi(xen_xc, xen_domid, XEN_PT_AUTO_ASSIGN,
|
||||
ppirq, PCI_DEVFN(s->real_device.dev,
|
||||
s->real_device.func),
|
||||
((uint32_t)s->real_device.domain << 16) |
|
||||
s->real_device.bus,
|
||||
msix_entry, table_base);
|
||||
if (rc) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ void deprecated_register_soundhw(const char *name, const char *descr,
|
|||
int isa, const char *typename);
|
||||
|
||||
void soundhw_init(void);
|
||||
void show_valid_soundhw(void);
|
||||
void audio_print_available_models(void);
|
||||
void select_soundhw(const char *name, const char *audiodev);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@ OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)
|
|||
|
||||
extern MachineState *current_machine;
|
||||
|
||||
/**
|
||||
* machine_default_cpu_type: Return the machine default CPU type.
|
||||
* @ms: Machine state
|
||||
*/
|
||||
const char *machine_default_cpu_type(const MachineState *ms);
|
||||
/**
|
||||
* machine_class_default_cpu_type: Return the machine default CPU type.
|
||||
* @mc: Machine class
|
||||
|
|
@ -253,6 +258,9 @@ typedef struct {
|
|||
* @smbios_memory_device_size:
|
||||
* Default size of memory device,
|
||||
* SMBIOS 3.1.0 "7.18 Memory Device (Type 17)"
|
||||
* @get_valid_cpu_types:
|
||||
* Returns a list of valid CPU types for this board. May be NULL
|
||||
* if not needed.
|
||||
*/
|
||||
struct MachineClass {
|
||||
/*< private >*/
|
||||
|
|
@ -299,6 +307,8 @@ struct MachineClass {
|
|||
bool ignore_memory_transaction_failures;
|
||||
int numa_mem_align_shift;
|
||||
const char * const *valid_cpu_types;
|
||||
GPtrArray *(*get_valid_cpu_types)(const MachineState *ms);
|
||||
const char *(*get_default_cpu_type)(const MachineState *ms);
|
||||
strList *allowed_dynamic_sysbus_devices;
|
||||
bool auto_enable_numa_with_memhp;
|
||||
bool auto_enable_numa_with_memdev;
|
||||
|
|
@ -496,6 +506,39 @@ struct MachineState {
|
|||
* DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro, _, tag)
|
||||
*/
|
||||
|
||||
#define DEFINE_MACHINE_EXTENDED(namestr, PARENT_NAME, InstanceName, \
|
||||
machine_initfn, ABSTRACT, ifaces...) \
|
||||
static void machine_initfn##_class_init(ObjectClass *oc, const void *data) \
|
||||
{ \
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
machine_initfn(mc); \
|
||||
} \
|
||||
static const TypeInfo machine_initfn##_typeinfo = { \
|
||||
.name = MACHINE_TYPE_NAME(namestr), \
|
||||
.parent = TYPE_##PARENT_NAME, \
|
||||
.class_init = machine_initfn##_class_init, \
|
||||
.instance_size = sizeof(InstanceName), \
|
||||
.abstract = ABSTRACT, \
|
||||
.interfaces = ifaces, \
|
||||
}; \
|
||||
static void machine_initfn##_register_types(void) \
|
||||
{ \
|
||||
type_register_static(&machine_initfn##_typeinfo); \
|
||||
} \
|
||||
type_init(machine_initfn##_register_types)
|
||||
|
||||
#define DEFINE_MACHINE(namestr, machine_initfn) \
|
||||
DEFINE_MACHINE_EXTENDED(namestr, MACHINE, MachineState, machine_initfn, \
|
||||
false, NULL)
|
||||
|
||||
#define DEFINE_MACHINE_WITH_INTERFACE_ARRAY(namestr, machine_initfn, ifaces...)\
|
||||
DEFINE_MACHINE_EXTENDED(namestr, MACHINE, MachineState, machine_initfn, \
|
||||
false, ifaces)
|
||||
|
||||
#define DEFINE_MACHINE_WITH_INTERFACES(namestr, machine_initfn, ...) \
|
||||
DEFINE_MACHINE_WITH_INTERFACE_ARRAY(namestr, machine_initfn, \
|
||||
(const InterfaceInfo[]) { __VA_ARGS__ })
|
||||
|
||||
/*
|
||||
* Helper for dispatching different macros based on how
|
||||
* many __VA_ARGS__ are passed. Supports 1 to 5 variadic
|
||||
|
|
@ -755,23 +798,6 @@ struct MachineState {
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define DEFINE_MACHINE(namestr, machine_initfn) \
|
||||
static void machine_initfn##_class_init(ObjectClass *oc, const void *data) \
|
||||
{ \
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
machine_initfn(mc); \
|
||||
} \
|
||||
static const TypeInfo machine_initfn##_typeinfo = { \
|
||||
.name = MACHINE_TYPE_NAME(namestr), \
|
||||
.parent = TYPE_MACHINE, \
|
||||
.class_init = machine_initfn##_class_init, \
|
||||
}; \
|
||||
static void machine_initfn##_register_types(void) \
|
||||
{ \
|
||||
type_register_static(&machine_initfn##_typeinfo); \
|
||||
} \
|
||||
type_init(machine_initfn##_register_types)
|
||||
|
||||
extern GlobalProperty hw_compat_10_1[];
|
||||
extern const size_t hw_compat_10_1_len;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,28 +1,29 @@
|
|||
#ifndef APIC_H
|
||||
#define APIC_H
|
||||
|
||||
typedef struct APICCommonState APICCommonState;
|
||||
|
||||
/* apic.c */
|
||||
void apic_set_max_apic_id(uint32_t max_apic_id);
|
||||
int apic_accept_pic_intr(DeviceState *s);
|
||||
void apic_deliver_pic_intr(DeviceState *s, int level);
|
||||
void apic_deliver_nmi(DeviceState *d);
|
||||
int apic_get_interrupt(DeviceState *s);
|
||||
int cpu_set_apic_base(DeviceState *s, uint64_t val);
|
||||
uint64_t cpu_get_apic_base(DeviceState *s);
|
||||
bool cpu_is_apic_enabled(DeviceState *s);
|
||||
void cpu_set_apic_tpr(DeviceState *s, uint8_t val);
|
||||
uint8_t cpu_get_apic_tpr(DeviceState *s);
|
||||
void apic_init_reset(DeviceState *s);
|
||||
void apic_sipi(DeviceState *s);
|
||||
void apic_poll_irq(DeviceState *d);
|
||||
void apic_designate_bsp(DeviceState *d, bool bsp);
|
||||
int apic_get_highest_priority_irr(DeviceState *dev);
|
||||
int apic_msr_read(int index, uint64_t *val);
|
||||
int apic_msr_write(int index, uint64_t val);
|
||||
bool is_x2apic_mode(DeviceState *d);
|
||||
int apic_accept_pic_intr(APICCommonState *s);
|
||||
void apic_deliver_pic_intr(APICCommonState *s, int level);
|
||||
void apic_deliver_nmi(APICCommonState *s);
|
||||
int apic_get_interrupt(APICCommonState *s);
|
||||
int cpu_set_apic_base(APICCommonState *s, uint64_t val);
|
||||
uint64_t cpu_get_apic_base(APICCommonState *s);
|
||||
bool cpu_is_apic_enabled(APICCommonState *s);
|
||||
void cpu_set_apic_tpr(APICCommonState *s, uint8_t val);
|
||||
uint8_t cpu_get_apic_tpr(APICCommonState *s);
|
||||
void apic_init_reset(APICCommonState *s);
|
||||
void apic_sipi(APICCommonState *s);
|
||||
void apic_poll_irq(APICCommonState *s);
|
||||
void apic_designate_bsp(APICCommonState *s, bool bsp);
|
||||
int apic_get_highest_priority_irr(APICCommonState *s);
|
||||
int apic_msr_read(APICCommonState *s, int index, uint64_t *val);
|
||||
int apic_msr_write(APICCommonState *s, int index, uint64_t val);
|
||||
bool is_x2apic_mode(APICCommonState *s);
|
||||
|
||||
/* pc.c */
|
||||
DeviceState *cpu_get_current_apic(void);
|
||||
APICCommonState *cpu_get_current_apic(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#define QEMU_APIC_INTERNAL_H
|
||||
|
||||
#include "cpu.h"
|
||||
#include "hw/i386/apic.h"
|
||||
#include "system/memory.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "target/i386/cpu-qom.h"
|
||||
|
|
@ -125,8 +126,6 @@
|
|||
#define VAPIC_ENABLE_BIT 0
|
||||
#define VAPIC_ENABLE_MASK (1 << VAPIC_ENABLE_BIT)
|
||||
|
||||
typedef struct APICCommonState APICCommonState;
|
||||
|
||||
#define TYPE_APIC_COMMON "apic-common"
|
||||
typedef struct APICCommonClass APICCommonClass;
|
||||
DECLARE_OBJ_CHECKERS(APICCommonState, APICCommonClass,
|
||||
|
|
@ -203,8 +202,8 @@ typedef struct VAPICState {
|
|||
extern bool apic_report_tpr_access;
|
||||
|
||||
bool apic_next_timer(APICCommonState *s, int64_t current_time);
|
||||
void apic_enable_tpr_access_reporting(DeviceState *d, bool enable);
|
||||
void apic_enable_vapic(DeviceState *d, hwaddr paddr);
|
||||
void apic_enable_tpr_access_reporting(APICCommonState *s, bool enable);
|
||||
void apic_enable_vapic(APICCommonState *s, hwaddr paddr);
|
||||
|
||||
void vapic_report_tpr_access(DeviceState *dev, CPUState *cpu, target_ulong ip,
|
||||
TPRAccess access);
|
||||
|
|
|
|||
|
|
@ -533,7 +533,6 @@ REG32(VERSAL2_RST_OCM, 0x3d8)
|
|||
struct XlnxVersalCRLBase {
|
||||
SysBusDevice parent_obj;
|
||||
|
||||
RegisterInfoArray *reg_array;
|
||||
uint32_t *regs;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ typedef struct XlnxXramCtrl {
|
|||
unsigned int encoded_size;
|
||||
} cfg;
|
||||
|
||||
RegisterInfoArray *reg_array;
|
||||
uint32_t regs[XRAM_CTRL_R_MAX];
|
||||
RegisterInfo regs_info[XRAM_CTRL_R_MAX];
|
||||
} XlnxXramCtrl;
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ struct XlnxZynqMPAPUCtrl {
|
|||
uint8_t cpu_pwrdwn_req;
|
||||
uint8_t cpu_in_wfi;
|
||||
|
||||
RegisterInfoArray *reg_array;
|
||||
uint32_t regs[APU_R_MAX];
|
||||
RegisterInfo regs_info[APU_R_MAX];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -203,7 +203,6 @@ struct XlnxZynqMPCRF {
|
|||
MemoryRegion iomem;
|
||||
qemu_irq irq_ir;
|
||||
|
||||
RegisterInfoArray *reg_array;
|
||||
uint32_t regs[CRF_R_MAX];
|
||||
RegisterInfo regs_info[CRF_R_MAX];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -54,14 +54,6 @@ typedef struct XlnxVersalCANFDState {
|
|||
qemu_irq irq_addr_err;
|
||||
|
||||
RegisterInfo reg_info[XLNX_VERSAL_CANFD_R_MAX];
|
||||
RegisterAccessInfo *tx_regs;
|
||||
RegisterAccessInfo *rx0_regs;
|
||||
RegisterAccessInfo *rx1_regs;
|
||||
RegisterAccessInfo *af_regs;
|
||||
RegisterAccessInfo *txe_regs;
|
||||
RegisterAccessInfo *rx_mailbox_regs;
|
||||
RegisterAccessInfo *af_mask_regs_mailbox;
|
||||
|
||||
uint32_t regs[XLNX_VERSAL_CANFD_R_MAX];
|
||||
|
||||
ptimer_state *canfd_timer;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ struct XlnxBBRam {
|
|||
bool bbram8_wo;
|
||||
bool blk_ro;
|
||||
|
||||
RegisterInfoArray *reg_array;
|
||||
uint32_t regs[RMAX_XLNX_BBRAM];
|
||||
RegisterInfo regs_info[RMAX_XLNX_BBRAM];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -75,10 +75,6 @@ struct RegisterAccessInfo {
|
|||
*/
|
||||
|
||||
struct RegisterInfo {
|
||||
/* <private> */
|
||||
DeviceState parent_obj;
|
||||
|
||||
/* <public> */
|
||||
void *data;
|
||||
int data_size;
|
||||
|
||||
|
|
@ -87,9 +83,8 @@ struct RegisterInfo {
|
|||
void *opaque;
|
||||
};
|
||||
|
||||
#define TYPE_REGISTER "qemu-register"
|
||||
DECLARE_INSTANCE_CHECKER(RegisterInfo, REGISTER,
|
||||
TYPE_REGISTER)
|
||||
#define TYPE_REGISTER_ARRAY "qemu-register-array"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(RegisterInfoArray, REGISTER_ARRAY)
|
||||
|
||||
/**
|
||||
* This structure is used to group all of the individual registers which are
|
||||
|
|
@ -103,6 +98,8 @@ DECLARE_INSTANCE_CHECKER(RegisterInfo, REGISTER,
|
|||
*/
|
||||
|
||||
struct RegisterInfoArray {
|
||||
Object parent_obj;
|
||||
|
||||
MemoryRegion mem;
|
||||
|
||||
int num_elements;
|
||||
|
|
@ -212,18 +209,4 @@ RegisterInfoArray *register_init_block64(DeviceState *owner,
|
|||
bool debug_enabled,
|
||||
uint64_t memory_size);
|
||||
|
||||
/**
|
||||
* This function should be called to cleanup the registers that were initialized
|
||||
* when calling register_init_block32(). This function should only be called
|
||||
* from the device's instance_finalize function.
|
||||
*
|
||||
* Any memory operations that the device performed that require cleanup (such
|
||||
* as creating subregions) need to be called before calling this function.
|
||||
*
|
||||
* @r_array: A structure containing all of the registers, as returned by
|
||||
* register_init_block32()
|
||||
*/
|
||||
|
||||
void register_finalize_block(RegisterInfoArray *r_array);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
|
|||
return d;
|
||||
}
|
||||
|
||||
void pit_set_gate(ISADevice *dev, int channel, int val);
|
||||
void pit_get_channel_info(ISADevice *dev, int channel, PITChannelInfo *info);
|
||||
void pit_set_gate(PITCommonState *pit, int channel, int val);
|
||||
void pit_get_channel_info(PITCommonState *pit, int channel, PITChannelInfo *info);
|
||||
|
||||
#endif /* HW_I8254_H */
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#ifndef QEMU_TARGET_INFO_IMPL_H
|
||||
#define QEMU_TARGET_INFO_IMPL_H
|
||||
|
||||
#include "qapi/qapi-types-common.h"
|
||||
#include "qapi/qapi-types-machine.h"
|
||||
|
||||
typedef struct TargetInfo {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/target-info.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
#include "qobject/qlist.h"
|
||||
|
|
@ -128,7 +129,7 @@ static CommandLineParameterInfoList *query_all_machine_properties(void)
|
|||
ObjectProperty *prop;
|
||||
bool is_new;
|
||||
|
||||
machines = object_class_get_list(TYPE_MACHINE, false);
|
||||
machines = object_class_get_list(target_machine_typename(), false);
|
||||
assert(machines);
|
||||
|
||||
/* Loop over all machine classes */
|
||||
|
|
|
|||
|
|
@ -73,9 +73,9 @@ typedef struct QDevAlias
|
|||
|
||||
/* Please keep this table sorted by typename. */
|
||||
static const QDevAlias qdev_alias_table[] = {
|
||||
{ "AC97", "ac97" }, /* -soundhw name */
|
||||
{ "AC97", "ac97" },
|
||||
{ "e1000", "e1000-82540em" },
|
||||
{ "ES1370", "es1370" }, /* -soundhw name */
|
||||
{ "ES1370", "es1370" },
|
||||
{ "ich9-ahci", "ahci" },
|
||||
{ "lsi53c895a", "lsi" },
|
||||
{ "virtio-9p-device", "virtio-9p", QEMU_ARCH_VIRTIO_MMIO },
|
||||
|
|
|
|||
|
|
@ -1672,7 +1672,8 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
|
|||
{
|
||||
ERRP_GUARD();
|
||||
const char *machine_type = qdict_get_try_str(qdict, "type");
|
||||
g_autoptr(GSList) machines = object_class_get_list(TYPE_MACHINE, false);
|
||||
g_autoptr(GSList) machines = object_class_get_list(target_machine_typename(),
|
||||
false);
|
||||
MachineClass *machine_class = NULL;
|
||||
|
||||
if (machine_type) {
|
||||
|
|
@ -3077,7 +3078,7 @@ void qemu_init(int argc, char **argv)
|
|||
model = g_strdup(qdict_get_str(dict, "model"));
|
||||
qdict_del(dict, "model");
|
||||
if (is_help_option(model)) {
|
||||
show_valid_soundhw();
|
||||
audio_print_available_models();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -3816,7 +3817,7 @@ void qemu_init(int argc, char **argv)
|
|||
migration_object_init();
|
||||
|
||||
/* parse features once if machine provides default cpu_type */
|
||||
current_machine->cpu_type = machine_class_default_cpu_type(machine_class);
|
||||
current_machine->cpu_type = machine_default_cpu_type(current_machine);
|
||||
if (cpu_option) {
|
||||
current_machine->cpu_type = parse_cpu_option(cpu_option);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,34 +41,31 @@ APICCommonClass *apic_get_class(Error **errp)
|
|||
|
||||
void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
|
||||
{
|
||||
APICCommonState *apic;
|
||||
APICCommonClass *apic_class = apic_get_class(errp);
|
||||
|
||||
if (!apic_class) {
|
||||
return;
|
||||
}
|
||||
|
||||
cpu->apic_state = DEVICE(object_new_with_class(OBJECT_CLASS(apic_class)));
|
||||
cpu->apic_state = APIC_COMMON(object_new_with_class(OBJECT_CLASS(apic_class)));
|
||||
object_property_add_child(OBJECT(cpu), "lapic",
|
||||
OBJECT(cpu->apic_state));
|
||||
object_unref(OBJECT(cpu->apic_state));
|
||||
|
||||
/* TODO: convert to link<> */
|
||||
apic = APIC_COMMON(cpu->apic_state);
|
||||
apic->cpu = cpu;
|
||||
apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
|
||||
cpu->apic_state->cpu = cpu;
|
||||
cpu->apic_state->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
|
||||
|
||||
/*
|
||||
* apic_common_set_id needs to check if the CPU has x2APIC
|
||||
* feature in case APIC ID >= 255, so we need to set apic->cpu
|
||||
* feature in case APIC ID >= 255, so we need to set cpu->apic_state->cpu
|
||||
* before setting APIC ID
|
||||
*/
|
||||
qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
|
||||
qdev_prop_set_uint32(DEVICE(cpu->apic_state), "id", cpu->apic_id);
|
||||
}
|
||||
|
||||
void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
|
||||
{
|
||||
APICCommonState *apic;
|
||||
static bool apic_mmio_map_once;
|
||||
|
||||
if (cpu->apic_state == NULL) {
|
||||
|
|
@ -77,12 +74,11 @@ void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
|
|||
qdev_realize(DEVICE(cpu->apic_state), NULL, errp);
|
||||
|
||||
/* Map APIC MMIO area */
|
||||
apic = APIC_COMMON(cpu->apic_state);
|
||||
if (!apic_mmio_map_once) {
|
||||
memory_region_add_subregion_overlap(get_system_memory(),
|
||||
apic->apicbase &
|
||||
cpu->apic_state->apicbase &
|
||||
MSR_IA32_APICBASE_BASE,
|
||||
&apic->io_memory,
|
||||
&cpu->apic_state->io_memory,
|
||||
0x1000);
|
||||
apic_mmio_map_once = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@ static void dump_apic_interrupt(const char *name, uint32_t *ireg_tab,
|
|||
void x86_cpu_dump_local_apic_state(CPUState *cs, int flags)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
APICCommonState *s = APIC_COMMON(cpu->apic_state);
|
||||
APICCommonState *s = cpu->apic_state;
|
||||
if (!s) {
|
||||
qemu_printf("local apic state not available\n");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -8789,7 +8789,7 @@ void x86_cpu_after_reset(X86CPU *cpu)
|
|||
}
|
||||
|
||||
if (cpu->apic_state) {
|
||||
device_cold_reset(cpu->apic_state);
|
||||
device_cold_reset(DEVICE(cpu->apic_state));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "exec/cpu-defs.h"
|
||||
#include "exec/cpu-interrupt.h"
|
||||
#include "exec/memop.h"
|
||||
#include "hw/i386/apic.h"
|
||||
#include "hw/i386/topology.h"
|
||||
#include "qapi/qapi-types-common.h"
|
||||
#include "qemu/cpu-float.h"
|
||||
|
|
@ -2349,7 +2350,7 @@ struct ArchCPU {
|
|||
|
||||
/* in order to simplify APIC support, we leave this pointer to the
|
||||
user */
|
||||
struct DeviceState *apic_state;
|
||||
APICCommonState *apic_state;
|
||||
struct MemoryRegion *cpu_as_root, *cpu_as_mem, *smram;
|
||||
Notifier machine_done;
|
||||
|
||||
|
|
@ -2830,7 +2831,7 @@ bool cpu_svm_has_intercept(CPUX86State *env, uint32_t type);
|
|||
|
||||
/* apic.c */
|
||||
void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
|
||||
void apic_handle_tpr_access_report(DeviceState *d, target_ulong ip,
|
||||
void apic_handle_tpr_access_report(APICCommonState *s, target_ulong ip,
|
||||
TPRAccess access);
|
||||
|
||||
/* Special values for X86CPUVersion: */
|
||||
|
|
|
|||
|
|
@ -527,7 +527,7 @@ void hvf_simulate_rdmsr(CPUState *cs)
|
|||
int ret;
|
||||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
ret = apic_msr_read(index, &val);
|
||||
ret = apic_msr_read(cpu->apic_state, index, &val);
|
||||
if (ret < 0) {
|
||||
x86_emul_raise_exception(env, EXCP0D_GPF, 0);
|
||||
}
|
||||
|
|
@ -638,7 +638,7 @@ void hvf_simulate_wrmsr(CPUState *cs)
|
|||
int ret;
|
||||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
ret = apic_msr_write(index, data);
|
||||
ret = apic_msr_write(cpu->apic_state, index, data);
|
||||
if (ret < 0) {
|
||||
x86_emul_raise_exception(env, EXCP0D_GPF, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5029,7 +5029,7 @@ static int kvm_get_mp_state(X86CPU *cpu)
|
|||
|
||||
static int kvm_get_apic(X86CPU *cpu)
|
||||
{
|
||||
DeviceState *apic = cpu->apic_state;
|
||||
APICCommonState *apic = cpu->apic_state;
|
||||
struct kvm_lapic_state kapic;
|
||||
int ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ bool kvm_has_adjust_clock_stable(void);
|
|||
bool kvm_has_exception_payload(void);
|
||||
void kvm_synchronize_all_tsc(void);
|
||||
|
||||
void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
|
||||
void kvm_get_apic_state(APICCommonState *s, struct kvm_lapic_state *kapic);
|
||||
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
||||
|
||||
bool kvm_has_x2apic_api(void);
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ void helper_wrmsr(CPUX86State *env)
|
|||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
bql_lock();
|
||||
ret = apic_msr_write(index, val);
|
||||
ret = apic_msr_write(env_archcpu(env)->apic_state, index, val);
|
||||
bql_unlock();
|
||||
if (ret < 0) {
|
||||
goto error;
|
||||
|
|
@ -477,7 +477,7 @@ void helper_rdmsr(CPUX86State *env)
|
|||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
bql_lock();
|
||||
ret = apic_msr_read(index, &val);
|
||||
ret = apic_msr_read(x86_cpu->apic_state, index, &val);
|
||||
bql_unlock();
|
||||
if (ret < 0) {
|
||||
raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
|
||||
|
|
|
|||
|
|
@ -151,9 +151,8 @@ static void whpx_apic_put(CPUState *cs, run_on_cpu_data data)
|
|||
}
|
||||
}
|
||||
|
||||
void whpx_apic_get(DeviceState *dev)
|
||||
void whpx_apic_get(APICCommonState *s)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
CPUState *cpu = CPU(s->cpu);
|
||||
struct whpx_lapic_state kapic;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
#include <winhvplatform.h>
|
||||
#include <winhvemulation.h>
|
||||
|
||||
#include "hw/i386/apic.h"
|
||||
|
||||
typedef enum WhpxBreakpointState {
|
||||
WHPX_BP_CLEARED = 0,
|
||||
WHPX_BP_SET_PENDING,
|
||||
|
|
@ -44,7 +46,7 @@ struct whpx_state {
|
|||
};
|
||||
|
||||
extern struct whpx_state whpx_global;
|
||||
void whpx_apic_get(DeviceState *s);
|
||||
void whpx_apic_get(APICCommonState *s);
|
||||
|
||||
#define WHV_E_UNKNOWN_CAPABILITY 0x80370300L
|
||||
|
||||
|
|
|
|||
|
|
@ -18,16 +18,12 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/bcd.h"
|
||||
#include "libqtest.h"
|
||||
#include "libqos/i2c.h"
|
||||
|
||||
#define DS1338_ADDR 0x68
|
||||
|
||||
static inline uint8_t bcd2bin(uint8_t x)
|
||||
{
|
||||
return ((x) & 0x0f) + ((x) >> 4) * 10;
|
||||
}
|
||||
|
||||
static void send_and_receive(void *obj, void *data, QGuestAllocator *alloc)
|
||||
{
|
||||
QI2CDevice *i2cdev = (QI2CDevice *)obj;
|
||||
|
|
@ -39,9 +35,9 @@ static void send_and_receive(void *obj, void *data, QGuestAllocator *alloc)
|
|||
i2c_read_block(i2cdev, 0, resp, sizeof(resp));
|
||||
|
||||
/* check retrieved time against local time */
|
||||
g_assert_cmpuint(bcd2bin(resp[4]), == , tm_ptr->tm_mday);
|
||||
g_assert_cmpuint(bcd2bin(resp[5]), == , 1 + tm_ptr->tm_mon);
|
||||
g_assert_cmpuint(2000 + bcd2bin(resp[6]), == , 1900 + tm_ptr->tm_year);
|
||||
g_assert_cmpuint(from_bcd(resp[4]), == , tm_ptr->tm_mday);
|
||||
g_assert_cmpuint(from_bcd(resp[5]), == , 1 + tm_ptr->tm_mon);
|
||||
g_assert_cmpuint(2000 + from_bcd(resp[6]), == , 1900 + tm_ptr->tm_year);
|
||||
}
|
||||
|
||||
static void ds1338_register_nodes(void)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue