mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-target-arm-20240202' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target/arm: fix exception syndrome for AArch32 bkpt insn pci, vmbus, adb, s390x/css-bridge: Switch buses to 3-phase reset system/vl.c: Fix handling of '-serial none -serial something' target/arm: Add ID_AA64ZFR0_EL1.B16B16 to the exposed-to-userspace set tests/qtest/xlnx-versal-trng-test.c: Drop use of variable length array target/arm: Reinstate "vfp" property on AArch32 CPUs doc/sphinx/hxtool.py: add optional label argument to SRST directive hw/arm: Check for CPU types in machine_run_board_init() for various boards pci-host: designware: Limit value range of iATU viewport register hw/arm: Convert some DPRINTF macros to trace events and guest errors hw/arm: NPCM7XX SoC: Add GMAC ethernet controller devices hw/arm: Implement BCM2835 SPI Controller # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmW9C84ZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3qS6D/wM0/JGEYfaadpuMEOAx4PG # AnfScbPqVhx9J31P2Ks3VrB5F108aq/SaL2BmCb3BLF/ECChlhBXIjd7ukdHstts # F1TvqtvLGDZQz6wSVUeB0YOvAjGa3vIskn+Xvk9e6Ne6PcXgVnxAof/cPsXUiYNy # 6DJjNiLJ/a9Xgq9rjFO6vzW3AL95U6/FmD2F0pOotWXERhNhoyYVV6RtyeqKlDQP # yFVk5h601YURk9PeNZn9zpOpZqjAM7PxyF3X50N3Sv+G0uoKSr6b+c3/fDJbJo3+ # 0LXomEa8hdheQxm1dLY5OD0JX3bvYxwH41bDg9B0iEdjxUdXt6LfXI9Nvw9BAwix # 8AcGJJUaL4XU4uPfHBpRJApM15+MRb0hqfv4ZcGk8e67IIqVeDbKL2clTQGoHSg1 # KaB0POhtFx//M/uBOyk/FR2gb2eBNU8GuoCgxdDwh0K5ylcaK1YPiX4Tcglu4iS0 # Frvazphb2pO1BK6JiJwN2/9ezzDkDJqTKoSqdc4g3ETVOGnxr+tXwcds3t2iK3g2 # y+pgijDOAT3bJO5kYeGvhoEJPKqXwJ3UQ8zTJsU2XSYwBjIyv5V3oOn6elwYJaWq # yUDTC3QEK61KfnQnfTyLfdGWX1aVzHnYLWmQdO+3cczuQU0s0MP246Z1GAgDtgvD # jGjDBz6mryWvP2H0xSmERQ== # =azdP # -----END PGP SIGNATURE----- # gpg: Signature made Fri 02 Feb 2024 15:35:42 GMT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [ultimate] # gpg: aka "Peter Maydell <peter@archaic.org.uk>" [ultimate] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * tag 'pull-target-arm-20240202' of https://git.linaro.org/people/pmaydell/qemu-arm: (36 commits) hw/arm: Connect SPI Controller to BCM2835 hw/ssi: Implement BCM2835 SPI Controller tests/qtest: Adding PCS Module test to GMAC Qtest hw/net: GMAC Tx Implementation hw/net: GMAC Rx Implementation tests/qtest: Creating qtest for GMAC Module hw/arm: Add GMAC devices to NPCM7XX SoC hw/net: Add NPCMXXX GMAC device hw/xen: convert stderr prints to error/warn reports hw/xen/xen-hvm-common.c: convert DPRINTF to tracepoints hw/xen/xen-mapcache.c: convert DPRINTF to tracepoints hw/arm/xen_arm.c: convert DPRINTF to trace events and error/warn reports hw/arm/z2: convert DPRINTF to trace events and guest errors hw/arm/strongarm.c: convert DPRINTF to trace events and guest errors pci-host: designware: Limit value range of iATU viewport register hw/arm/zynq: Check for CPU types in machine_run_board_init() hw/arm/vexpress: Check for CPU types in machine_run_board_init() hw/arm/npcm7xx_boards: Simplify setting MachineClass::valid_cpu_types[] hw/arm/musca: Simplify setting MachineClass::valid_cpu_types[] hw/arm/msf2: Simplify setting MachineClass::valid_cpu_types[] ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+10
-2
@@ -30,6 +30,13 @@ nor the documentation output.
|
||||
|
||||
``SRST`` starts a reStructuredText section. Following lines
|
||||
are put into the documentation verbatim, and discarded from the C output.
|
||||
The alternative form ``SRST()`` is used to define a label which can be
|
||||
referenced from elsewhere in the rST documentation. The label will take
|
||||
the form ``<DOCNAME-HXFILE-LABEL>``, where ``DOCNAME`` is the name of the
|
||||
top level rST file, ``HXFILE`` is the filename of the .hx file without
|
||||
the ``.hx`` extension, and ``LABEL`` is the text provided within the
|
||||
``SRST()`` directive. For example,
|
||||
``<system/invocation-qemu-options-initrd>``.
|
||||
|
||||
``ERST`` ends the documentation section started with ``SRST``,
|
||||
and switches back to a C code section.
|
||||
@@ -53,8 +60,9 @@ text, but in ``hmp-commands.hx`` the C code sections are elements
|
||||
of an array of structs of type ``HMPCommand`` which define the
|
||||
name, behaviour and help text for each monitor command.
|
||||
|
||||
In the file ``qemu-options.hx``, do not try to define a
|
||||
In the file ``qemu-options.hx``, do not try to explicitly define a
|
||||
reStructuredText label within a documentation section. This file
|
||||
is included into two separate Sphinx documents, and some
|
||||
versions of Sphinx will complain about the duplicate label
|
||||
that results.
|
||||
that results. Use the ``SRST()`` directive documented above, to
|
||||
emit an unambiguous label.
|
||||
|
||||
@@ -78,6 +78,14 @@ def parse_archheading(file, lnum, line):
|
||||
serror(file, lnum, "Invalid ARCHHEADING line")
|
||||
return match.group(1)
|
||||
|
||||
def parse_srst(file, lnum, line):
|
||||
"""Handle an SRST directive"""
|
||||
# The input should be either "SRST", or "SRST(label)".
|
||||
match = re.match(r'SRST(\((.*?)\))?', line)
|
||||
if match is None:
|
||||
serror(file, lnum, "Invalid SRST line")
|
||||
return match.group(2)
|
||||
|
||||
class HxtoolDocDirective(Directive):
|
||||
"""Extract rST fragments from the specified .hx file"""
|
||||
required_argument = 1
|
||||
@@ -113,6 +121,14 @@ class HxtoolDocDirective(Directive):
|
||||
serror(hxfile, lnum, 'expected ERST, found SRST')
|
||||
else:
|
||||
state = HxState.RST
|
||||
label = parse_srst(hxfile, lnum, line)
|
||||
if label:
|
||||
rstlist.append("", hxfile, lnum - 1)
|
||||
# Build label as _DOCNAME-HXNAME-LABEL
|
||||
hx = os.path.splitext(os.path.basename(hxfile))[0]
|
||||
refline = ".. _" + env.docname + "-" + hx + \
|
||||
"-" + label + ":"
|
||||
rstlist.append(refline, hxfile, lnum - 1)
|
||||
elif directive == 'ERST':
|
||||
if state == HxState.CTEXT:
|
||||
serror(hxfile, lnum, 'expected SRST, found ERST')
|
||||
|
||||
@@ -33,11 +33,11 @@ Implemented devices
|
||||
* USB2 host controller (DWC2 and MPHI)
|
||||
* MailBox controller (MBOX)
|
||||
* VideoCore firmware (property)
|
||||
* Peripheral SPI controller (SPI)
|
||||
|
||||
|
||||
Missing devices
|
||||
---------------
|
||||
|
||||
* Peripheral SPI controller (SPI)
|
||||
* Analog to Digital Converter (ADC)
|
||||
* Pulse Width Modulation (PWM)
|
||||
|
||||
@@ -132,7 +132,8 @@ The example above provides the guest kernel command line after a separator
|
||||
(" ``--`` ") on the Xen command line, and does not provide the guest kernel
|
||||
with an actual initramfs, which would need to listed as a second multiboot
|
||||
module. For more complicated alternatives, see the command line
|
||||
documentation for the ``-initrd`` option.
|
||||
:ref:`documentation <system/invocation-qemu-options-initrd>` for the
|
||||
``-initrd`` option.
|
||||
|
||||
Host OS requirements
|
||||
--------------------
|
||||
|
||||
@@ -429,6 +429,7 @@ config RASPI
|
||||
select PL011 # UART
|
||||
select SDHCI
|
||||
select USB_DWC2
|
||||
select BCM2835_SPI
|
||||
|
||||
config STM32F100_SOC
|
||||
bool
|
||||
|
||||
@@ -144,6 +144,10 @@ static void bcm2835_peripherals_init(Object *obj)
|
||||
/* Power Management */
|
||||
object_initialize_child(obj, "powermgt", &s->powermgt,
|
||||
TYPE_BCM2835_POWERMGT);
|
||||
|
||||
/* SPI */
|
||||
object_initialize_child(obj, "bcm2835-spi0", &s->spi[0],
|
||||
TYPE_BCM2835_SPI);
|
||||
}
|
||||
|
||||
static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
||||
@@ -402,11 +406,22 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion(&s->peri_mr, PM_OFFSET,
|
||||
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->powermgt), 0));
|
||||
|
||||
/* SPI */
|
||||
if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[0]), errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_add_subregion(&s->peri_mr, SPI0_OFFSET,
|
||||
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->spi[0]), 0));
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[0]), 0,
|
||||
qdev_get_gpio_in_named(DEVICE(&s->ic),
|
||||
BCM2835_IC_GPU_IRQ,
|
||||
INTERRUPT_SPI));
|
||||
|
||||
create_unimp(s, &s->txp, "bcm2835-txp", TXP_OFFSET, 0x1000);
|
||||
create_unimp(s, &s->armtmr, "bcm2835-sp804", ARMCTRL_TIMER0_1_OFFSET, 0x40);
|
||||
create_unimp(s, &s->i2s, "bcm2835-i2s", I2S_OFFSET, 0x100);
|
||||
create_unimp(s, &s->smi, "bcm2835-smi", SMI_OFFSET, 0x100);
|
||||
create_unimp(s, &s->spi[0], "bcm2835-spi0", SPI0_OFFSET, 0x20);
|
||||
create_unimp(s, &s->bscsl, "bcm2835-spis", BSC_SL_OFFSET, 0x100);
|
||||
create_unimp(s, &s->i2c[0], "bcm2835-i2c0", BSC0_OFFSET, 0x20);
|
||||
create_unimp(s, &s->i2c[1], "bcm2835-i2c1", BSC1_OFFSET, 0x20);
|
||||
|
||||
@@ -556,6 +556,7 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
|
||||
for (n = 0; n < EXYNOS4210_NCPUS; n++) {
|
||||
Object *cpuobj = object_new(ARM_CPU_TYPE_NAME("cortex-a9"));
|
||||
|
||||
object_property_add_child(OBJECT(s), "cpu[*]", cpuobj);
|
||||
/* By default A9 CPUs have EL3 enabled. This board does not currently
|
||||
* support EL3 so the CPU EL3 property is disabled before realization.
|
||||
*/
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/irq.h"
|
||||
#include "target/arm/cpu-qom.h"
|
||||
|
||||
#define SMDK_LAN9118_BASE_ADDR 0x05000000
|
||||
|
||||
@@ -148,12 +149,18 @@ static void smdkc210_init(MachineState *machine)
|
||||
arm_load_kernel(s->soc.cpu[0], machine, &exynos4_board_binfo);
|
||||
}
|
||||
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a9"),
|
||||
NULL
|
||||
};
|
||||
|
||||
static void nuri_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Samsung NURI board (Exynos4210)";
|
||||
mc->init = nuri_init;
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->max_cpus = EXYNOS4210_NCPUS;
|
||||
mc->min_cpus = EXYNOS4210_NCPUS;
|
||||
mc->default_cpus = EXYNOS4210_NCPUS;
|
||||
@@ -172,6 +179,7 @@ static void smdkc210_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
mc->desc = "Samsung SMDKC210 board (Exynos4210)";
|
||||
mc->init = smdkc210_init;
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->max_cpus = EXYNOS4210_NCPUS;
|
||||
mc->min_cpus = EXYNOS4210_NCPUS;
|
||||
mc->default_cpus = EXYNOS4210_NCPUS;
|
||||
|
||||
@@ -209,6 +209,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
|
||||
cpuobj = object_new(machine->cpu_type);
|
||||
cpu = ARM_CPU(cpuobj);
|
||||
|
||||
object_property_add_child(OBJECT(machine), "cpu[*]", cpuobj);
|
||||
object_property_set_int(cpuobj, "psci-conduit", QEMU_PSCI_CONDUIT_SMC,
|
||||
&error_abort);
|
||||
|
||||
@@ -342,10 +343,15 @@ static void midway_init(MachineState *machine)
|
||||
|
||||
static void highbank_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a9"),
|
||||
NULL
|
||||
};
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Calxeda Highbank (ECX-1000)";
|
||||
mc->init = highbank_init;
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->block_default_type = IF_IDE;
|
||||
mc->units_per_default_bus = 1;
|
||||
mc->max_cpus = 4;
|
||||
@@ -361,10 +367,15 @@ static const TypeInfo highbank_type = {
|
||||
|
||||
static void midway_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a15"),
|
||||
NULL
|
||||
};
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Calxeda Midway (ECX-2000)";
|
||||
mc->init = midway_init;
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->block_default_type = IF_IDE;
|
||||
mc->units_per_default_bus = 1;
|
||||
mc->max_cpus = 4;
|
||||
|
||||
+1
-2
@@ -134,7 +134,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
|
||||
|
||||
armv7m = DEVICE(&s->armv7m);
|
||||
qdev_prop_set_uint32(armv7m, "num-irq", 81);
|
||||
qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
|
||||
qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m3"));
|
||||
qdev_prop_set_bit(armv7m, "enable-bitband", true);
|
||||
qdev_connect_clock_in(armv7m, "cpuclk", s->m3clk);
|
||||
qdev_connect_clock_in(armv7m, "refclk", s->refclk);
|
||||
@@ -227,7 +227,6 @@ static Property m2sxxx_soc_properties[] = {
|
||||
* part name specifies the type of SmartFusion2 device variant(this
|
||||
* property is for information purpose only.
|
||||
*/
|
||||
DEFINE_PROP_STRING("cpu-type", MSF2State, cpu_type),
|
||||
DEFINE_PROP_STRING("part-name", MSF2State, part_name),
|
||||
DEFINE_PROP_UINT64("eNVM-size", MSF2State, envm_size, MSF2_ENVM_MAX_SIZE),
|
||||
DEFINE_PROP_UINT64("eSRAM-size", MSF2State, esram_size,
|
||||
|
||||
@@ -47,7 +47,6 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
|
||||
DeviceState *dev;
|
||||
DeviceState *spi_flash;
|
||||
MSF2State *soc;
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
|
||||
qemu_irq cs_line;
|
||||
BusState *spi_bus;
|
||||
@@ -62,8 +61,6 @@ static void emcraft_sf2_s2s010_init(MachineState *machine)
|
||||
dev = qdev_new(TYPE_MSF2_SOC);
|
||||
object_property_add_child(OBJECT(machine), "soc", OBJECT(dev));
|
||||
qdev_prop_set_string(dev, "part-name", "M2S010");
|
||||
qdev_prop_set_string(dev, "cpu-type", mc->default_cpu_type);
|
||||
|
||||
qdev_prop_set_uint64(dev, "eNVM-size", M2S010_ENVM_SIZE);
|
||||
qdev_prop_set_uint64(dev, "eSRAM-size", M2S010_ESRAM_SIZE);
|
||||
|
||||
@@ -108,7 +105,6 @@ static void emcraft_sf2_machine_init(MachineClass *mc)
|
||||
|
||||
mc->desc = "SmartFusion2 SOM kit from Emcraft (M2S010)";
|
||||
mc->init = emcraft_sf2_s2s010_init;
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
}
|
||||
|
||||
|
||||
@@ -605,7 +605,6 @@ static void musca_class_init(ObjectClass *oc, void *data)
|
||||
mc->default_cpus = 2;
|
||||
mc->min_cpus = mc->default_cpus;
|
||||
mc->max_cpus = mc->default_cpus;
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m33");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->init = musca_init;
|
||||
}
|
||||
|
||||
+35
-2
@@ -84,8 +84,10 @@ enum NPCM7xxInterrupt {
|
||||
NPCM7XX_UART1_IRQ,
|
||||
NPCM7XX_UART2_IRQ,
|
||||
NPCM7XX_UART3_IRQ,
|
||||
NPCM7XX_GMAC1_IRQ = 14,
|
||||
NPCM7XX_EMC1RX_IRQ = 15,
|
||||
NPCM7XX_EMC1TX_IRQ,
|
||||
NPCM7XX_GMAC2_IRQ,
|
||||
NPCM7XX_MMC_IRQ = 26,
|
||||
NPCM7XX_PSPI2_IRQ = 28,
|
||||
NPCM7XX_PSPI1_IRQ = 31,
|
||||
@@ -229,6 +231,12 @@ static const hwaddr npcm7xx_pspi_addr[] = {
|
||||
0xf0201000,
|
||||
};
|
||||
|
||||
/* Register base address for each GMAC Module */
|
||||
static const hwaddr npcm7xx_gmac_addr[] = {
|
||||
0xf0802000,
|
||||
0xf0804000,
|
||||
};
|
||||
|
||||
static const struct {
|
||||
hwaddr regs_addr;
|
||||
uint32_t unconnected_pins;
|
||||
@@ -457,6 +465,10 @@ static void npcm7xx_init(Object *obj)
|
||||
object_initialize_child(obj, "pspi[*]", &s->pspi[i], TYPE_NPCM_PSPI);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(s->gmac); i++) {
|
||||
object_initialize_child(obj, "gmac[*]", &s->gmac[i], TYPE_NPCM_GMAC);
|
||||
}
|
||||
|
||||
object_initialize_child(obj, "mmc", &s->mmc, TYPE_NPCM7XX_SDHCI);
|
||||
}
|
||||
|
||||
@@ -690,6 +702,29 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
|
||||
sysbus_connect_irq(sbd, 1, npcm7xx_irq(s, rx_irq));
|
||||
}
|
||||
|
||||
/*
|
||||
* GMAC Modules. Cannot fail.
|
||||
*/
|
||||
QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_gmac_addr) != ARRAY_SIZE(s->gmac));
|
||||
QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->gmac) != 2);
|
||||
for (i = 0; i < ARRAY_SIZE(s->gmac); i++) {
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(&s->gmac[i]);
|
||||
|
||||
/*
|
||||
* The device exists regardless of whether it's connected to a QEMU
|
||||
* netdev backend. So always instantiate it even if there is no
|
||||
* backend.
|
||||
*/
|
||||
sysbus_realize(sbd, &error_abort);
|
||||
sysbus_mmio_map(sbd, 0, npcm7xx_gmac_addr[i]);
|
||||
int irq = i == 0 ? NPCM7XX_GMAC1_IRQ : NPCM7XX_GMAC2_IRQ;
|
||||
/*
|
||||
* N.B. The values for the second argument sysbus_connect_irq are
|
||||
* chosen to match the registration order in npcm7xx_emc_realize.
|
||||
*/
|
||||
sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
|
||||
}
|
||||
|
||||
/*
|
||||
* Flash Interface Unit (FIU). Can fail if incorrect number of chip selects
|
||||
* specified, but this is a programming error.
|
||||
@@ -752,8 +787,6 @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
|
||||
create_unimplemented_device("npcm7xx.siox[2]", 0xf0102000, 4 * KiB);
|
||||
create_unimplemented_device("npcm7xx.ahbpci", 0xf0400000, 1 * MiB);
|
||||
create_unimplemented_device("npcm7xx.mcphy", 0xf05f0000, 64 * KiB);
|
||||
create_unimplemented_device("npcm7xx.gmac1", 0xf0802000, 8 * KiB);
|
||||
create_unimplemented_device("npcm7xx.gmac2", 0xf0804000, 8 * KiB);
|
||||
create_unimplemented_device("npcm7xx.vcd", 0xf0810000, 64 * KiB);
|
||||
create_unimplemented_device("npcm7xx.ece", 0xf0820000, 8 * KiB);
|
||||
create_unimplemented_device("npcm7xx.vdma", 0xf0822000, 8 * KiB);
|
||||
|
||||
@@ -465,7 +465,6 @@ static void npcm7xx_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->no_cdrom = 1;
|
||||
mc->no_parallel = 1;
|
||||
mc->default_ram_id = "ram";
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
}
|
||||
|
||||
|
||||
+52
-30
@@ -46,8 +46,7 @@
|
||||
#include "qemu/log.h"
|
||||
#include "qom/object.h"
|
||||
#include "target/arm/cpu-qom.h"
|
||||
|
||||
//#define DEBUG
|
||||
#include "trace.h"
|
||||
|
||||
/*
|
||||
TODO
|
||||
@@ -66,12 +65,6 @@
|
||||
- Enhance UART with modem signals
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
# define DPRINTF(format, ...) printf(format , ## __VA_ARGS__)
|
||||
#else
|
||||
# define DPRINTF(format, ...) do { } while (0)
|
||||
#endif
|
||||
|
||||
static struct {
|
||||
hwaddr io_base;
|
||||
int irq;
|
||||
@@ -151,8 +144,9 @@ static uint64_t strongarm_pic_mem_read(void *opaque, hwaddr offset,
|
||||
case ICPR:
|
||||
return s->pending;
|
||||
default:
|
||||
printf("%s: Bad register offset 0x" HWADDR_FMT_plx "\n",
|
||||
__func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad register offset 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, offset);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -173,8 +167,9 @@ static void strongarm_pic_mem_write(void *opaque, hwaddr offset,
|
||||
s->int_idle = (value & 1) ? 0 : ~0;
|
||||
break;
|
||||
default:
|
||||
printf("%s: Bad register offset 0x" HWADDR_FMT_plx "\n",
|
||||
__func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad register offset 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, offset);
|
||||
break;
|
||||
}
|
||||
strongarm_pic_update(s);
|
||||
@@ -333,7 +328,9 @@ static uint64_t strongarm_rtc_read(void *opaque, hwaddr addr,
|
||||
((qemu_clock_get_ms(rtc_clock) - s->last_hz) << 15) /
|
||||
(1000 * ((s->rttr & 0xffff) + 1));
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad rtc register read 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -375,7 +372,9 @@ static void strongarm_rtc_write(void *opaque, hwaddr addr,
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad rtc register write 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,12 +555,12 @@ static uint64_t strongarm_gpio_read(void *opaque, hwaddr offset,
|
||||
|
||||
case GPSR: /* GPIO Pin-Output Set registers */
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"strongarm GPIO: read from write only register GPSR\n");
|
||||
"%s: read from write only register GPSR\n", __func__);
|
||||
return 0;
|
||||
|
||||
case GPCR: /* GPIO Pin-Output Clear registers */
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"strongarm GPIO: read from write only register GPCR\n");
|
||||
"%s: read from write only register GPCR\n", __func__);
|
||||
return 0;
|
||||
|
||||
case GRER: /* GPIO Rising-Edge Detect Enable registers */
|
||||
@@ -581,7 +580,9 @@ static uint64_t strongarm_gpio_read(void *opaque, hwaddr offset,
|
||||
return s->status;
|
||||
|
||||
default:
|
||||
printf("%s: Bad offset 0x" HWADDR_FMT_plx "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad gpio read offset 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, offset);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -626,7 +627,9 @@ static void strongarm_gpio_write(void *opaque, hwaddr offset,
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s: Bad offset 0x" HWADDR_FMT_plx "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad write offset 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -782,7 +785,9 @@ static uint64_t strongarm_ppc_read(void *opaque, hwaddr offset,
|
||||
return s->ppfr | ~0x7f001;
|
||||
|
||||
default:
|
||||
printf("%s: Bad offset 0x" HWADDR_FMT_plx "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad ppc read offset 0x"HWADDR_FMT_plx "\n",
|
||||
__func__, offset);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -817,7 +822,9 @@ static void strongarm_ppc_write(void *opaque, hwaddr offset,
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s: Bad offset 0x" HWADDR_FMT_plx "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad ppc write offset 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1029,8 +1036,13 @@ static void strongarm_uart_update_parameters(StrongARMUARTState *s)
|
||||
s->char_transmit_time = (NANOSECONDS_PER_SECOND / speed) * frame_size;
|
||||
qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
|
||||
|
||||
DPRINTF(stderr, "%s speed=%d parity=%c data=%d stop=%d\n", s->chr->label,
|
||||
speed, parity, data_bits, stop_bits);
|
||||
trace_strongarm_uart_update_parameters((s->chr.chr ?
|
||||
s->chr.chr->label : "NULL") ?:
|
||||
"NULL",
|
||||
speed,
|
||||
parity,
|
||||
data_bits,
|
||||
stop_bits);
|
||||
}
|
||||
|
||||
static void strongarm_uart_rx_to(void *opaque)
|
||||
@@ -1164,7 +1176,9 @@ static uint64_t strongarm_uart_read(void *opaque, hwaddr addr,
|
||||
return s->utsr1;
|
||||
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad uart register read 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1221,7 +1235,9 @@ static void strongarm_uart_write(void *opaque, hwaddr addr,
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad uart register write 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1434,7 +1450,7 @@ static uint64_t strongarm_ssp_read(void *opaque, hwaddr addr,
|
||||
return 0xffffffff;
|
||||
}
|
||||
if (s->rx_level < 1) {
|
||||
printf("%s: SSP Rx Underrun\n", __func__);
|
||||
trace_strongarm_ssp_read_underrun();
|
||||
return 0xffffffff;
|
||||
}
|
||||
s->rx_level--;
|
||||
@@ -1443,7 +1459,9 @@ static uint64_t strongarm_ssp_read(void *opaque, hwaddr addr,
|
||||
strongarm_ssp_fifo_update(s);
|
||||
return retval;
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad ssp register read 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
@@ -1458,8 +1476,8 @@ static void strongarm_ssp_write(void *opaque, hwaddr addr,
|
||||
case SSCR0:
|
||||
s->sscr[0] = value & 0xffbf;
|
||||
if ((s->sscr[0] & SSCR0_SSE) && SSCR0_DSS(value) < 4) {
|
||||
printf("%s: Wrong data size: %i bits\n", __func__,
|
||||
(int)SSCR0_DSS(value));
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: Wrong data size: %i bits\n",
|
||||
__func__, (int)SSCR0_DSS(value));
|
||||
}
|
||||
if (!(value & SSCR0_SSE)) {
|
||||
s->sssr = 0;
|
||||
@@ -1471,7 +1489,9 @@ static void strongarm_ssp_write(void *opaque, hwaddr addr,
|
||||
case SSCR1:
|
||||
s->sscr[1] = value & 0x2f;
|
||||
if (value & SSCR1_LBM) {
|
||||
printf("%s: Attempt to use SSP LBM mode\n", __func__);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Attempt to use SSP LBM mode\n",
|
||||
__func__);
|
||||
}
|
||||
strongarm_ssp_fifo_update(s);
|
||||
break;
|
||||
@@ -1509,7 +1529,9 @@ static void strongarm_ssp_write(void *opaque, hwaddr addr,
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s: Bad register 0x" HWADDR_FMT_plx "\n", __func__, addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad ssp register write 0x"HWADDR_FMT_plx"\n",
|
||||
__func__, addr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,3 +55,18 @@ smmuv3_notify_flag_add(const char *iommu) "ADD SMMUNotifier node for iommu mr=%s
|
||||
smmuv3_notify_flag_del(const char *iommu) "DEL SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_inv_notifiers_iova(const char *name, uint16_t asid, uint16_t vmid, uint64_t iova, uint8_t tg, uint64_t num_pages) "iommu mr=%s asid=%d vmid=%d iova=0x%"PRIx64" tg=%d num_pages=0x%"PRIx64
|
||||
|
||||
# strongarm.c
|
||||
strongarm_uart_update_parameters(const char *label, int speed, char parity, int data_bits, int stop_bits) "%s speed=%d parity=%c data=%d stop=%d"
|
||||
strongarm_ssp_read_underrun(void) "SSP rx underrun"
|
||||
|
||||
# z2.c
|
||||
z2_lcd_reg_update(uint8_t cur, uint8_t i_0, uint8_t i_1, uint8_t i_2, uint32_t value) "cur_reg = 0x%x, buf = [0x%x, 0x%x, 0x%x], value = 0x%x"
|
||||
z2_lcd_enable_disable_result(const char *result) "LCD %s"
|
||||
z2_aer915_send_too_long(int8_t msg) "message too long (%i bytes)"
|
||||
z2_aer915_send(uint8_t reg, uint8_t value) "reg %d value 0x%02x"
|
||||
z2_aer915_event(int8_t event, int8_t len) "i2c event =0x%x len=%d bytes"
|
||||
|
||||
# xen_arm.c
|
||||
xen_create_virtio_mmio_devices(int i, int irq, uint64_t base) "Created virtio-mmio device %d: irq %d base 0x%"PRIx64
|
||||
xen_init_ram(uint64_t machine_ram_size) "Initialized xen ram with size 0x%"PRIx64
|
||||
xen_enable_tpm(uint64_t addr) "Connected tpmdev at address 0x%"PRIx64
|
||||
|
||||
+10
-2
@@ -783,22 +783,30 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
static void vexpress_a9_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a9"),
|
||||
NULL
|
||||
};
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
VexpressMachineClass *vmc = VEXPRESS_MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "ARM Versatile Express for Cortex-A9";
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
|
||||
vmc->daughterboard = &a9_daughterboard;
|
||||
}
|
||||
|
||||
static void vexpress_a15_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a15"),
|
||||
NULL
|
||||
};
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
VexpressMachineClass *vmc = VEXPRESS_MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "ARM Versatile Express for Cortex-A15";
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
|
||||
vmc->daughterboard = &a15_daughterboard;
|
||||
|
||||
|
||||
+11
-12
@@ -34,6 +34,7 @@
|
||||
#include "hw/xen/xen-hvm-common.h"
|
||||
#include "sysemu/tpm.h"
|
||||
#include "hw/xen/arch_hvm.h"
|
||||
#include "trace.h"
|
||||
|
||||
#define TYPE_XEN_ARM MACHINE_TYPE_NAME("xenpvh")
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(XenArmState, XEN_ARM)
|
||||
@@ -91,8 +92,9 @@ static void xen_create_virtio_mmio_devices(XenArmState *xam)
|
||||
|
||||
sysbus_create_simple("virtio-mmio", base, irq);
|
||||
|
||||
DPRINTF("Created virtio-mmio device %d: irq %d base 0x%lx\n",
|
||||
i, GUEST_VIRTIO_MMIO_SPI_FIRST + i, base);
|
||||
trace_xen_create_virtio_mmio_devices(i,
|
||||
GUEST_VIRTIO_MMIO_SPI_FIRST + i,
|
||||
base);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +103,7 @@ static void xen_init_ram(MachineState *machine)
|
||||
MemoryRegion *sysmem = get_system_memory();
|
||||
ram_addr_t block_len, ram_size[GUEST_RAM_BANKS];
|
||||
|
||||
trace_xen_init_ram(machine->ram_size);
|
||||
if (machine->ram_size <= GUEST_RAM0_SIZE) {
|
||||
ram_size[0] = machine->ram_size;
|
||||
ram_size[1] = 0;
|
||||
@@ -117,15 +120,10 @@ static void xen_init_ram(MachineState *machine)
|
||||
memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo", &ram_memory,
|
||||
GUEST_RAM0_BASE, ram_size[0]);
|
||||
memory_region_add_subregion(sysmem, GUEST_RAM0_BASE, &ram_lo);
|
||||
DPRINTF("Initialized region xen.ram.lo: base 0x%llx size 0x%lx\n",
|
||||
GUEST_RAM0_BASE, ram_size[0]);
|
||||
|
||||
if (ram_size[1] > 0) {
|
||||
memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi", &ram_memory,
|
||||
GUEST_RAM1_BASE, ram_size[1]);
|
||||
memory_region_add_subregion(sysmem, GUEST_RAM1_BASE, &ram_hi);
|
||||
DPRINTF("Initialized region xen.ram.hi: base 0x%llx size 0x%lx\n",
|
||||
GUEST_RAM1_BASE, ram_size[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,7 +156,7 @@ static void xen_enable_tpm(XenArmState *xam)
|
||||
|
||||
TPMBackend *be = qemu_find_tpm_be("tpm0");
|
||||
if (be == NULL) {
|
||||
DPRINTF("Couldn't fine the backend for tpm0\n");
|
||||
error_report("Couldn't find tmp0 backend");
|
||||
return;
|
||||
}
|
||||
dev = qdev_new(TYPE_TPM_TIS_SYSBUS);
|
||||
@@ -168,7 +166,7 @@ static void xen_enable_tpm(XenArmState *xam)
|
||||
sysbus_realize_and_unref(busdev, &error_fatal);
|
||||
sysbus_mmio_map(busdev, 0, xam->cfg.tpm_base_addr);
|
||||
|
||||
DPRINTF("Connected tpmdev at address 0x%lx\n", xam->cfg.tpm_base_addr);
|
||||
trace_xen_enable_tpm(xam->cfg.tpm_base_addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -179,8 +177,9 @@ static void xen_arm_init(MachineState *machine)
|
||||
xam->state = g_new0(XenIOState, 1);
|
||||
|
||||
if (machine->ram_size == 0) {
|
||||
DPRINTF("ram_size not specified. QEMU machine started without IOREQ"
|
||||
"(no emulated devices including Virtio)\n");
|
||||
warn_report("%s non-zero ram size not specified. QEMU machine started"
|
||||
" without IOREQ (no emulated devices including virtio)",
|
||||
MACHINE_CLASS(object_get_class(OBJECT(machine)))->desc);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -194,7 +193,7 @@ static void xen_arm_init(MachineState *machine)
|
||||
if (xam->cfg.tpm_base_addr) {
|
||||
xen_enable_tpm(xam);
|
||||
} else {
|
||||
DPRINTF("tpm-base-addr is not provided. TPM will not be enabled\n");
|
||||
warn_report("tpm-base-addr is not provided. TPM will not be enabled");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -352,13 +352,17 @@ static void zynq_init(MachineState *machine)
|
||||
|
||||
static void zynq_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
static const char * const valid_cpu_types[] = {
|
||||
ARM_CPU_TYPE_NAME("cortex-a9"),
|
||||
NULL
|
||||
};
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
|
||||
mc->init = zynq_init;
|
||||
mc->max_cpus = 1;
|
||||
mc->no_sdcard = 1;
|
||||
mc->ignore_memory_transaction_failures = true;
|
||||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
|
||||
mc->valid_cpu_types = valid_cpu_types;
|
||||
mc->default_ram_id = "zynq.ext_ram";
|
||||
}
|
||||
|
||||
|
||||
+8
-19
@@ -27,13 +27,7 @@
|
||||
#include "exec/address-spaces.h"
|
||||
#include "qom/object.h"
|
||||
#include "qapi/error.h"
|
||||
|
||||
#ifdef DEBUG_Z2
|
||||
#define DPRINTF(fmt, ...) \
|
||||
printf(fmt, ## __VA_ARGS__)
|
||||
#else
|
||||
#define DPRINTF(fmt, ...)
|
||||
#endif
|
||||
#include "trace.h"
|
||||
|
||||
static const struct keymap map[0x100] = {
|
||||
[0 ... 0xff] = { -1, -1 },
|
||||
@@ -119,6 +113,8 @@ static uint32_t zipit_lcd_transfer(SSIPeripheral *dev, uint32_t value)
|
||||
{
|
||||
ZipitLCD *z = ZIPIT_LCD(dev);
|
||||
uint16_t val;
|
||||
|
||||
trace_z2_lcd_reg_update(z->cur_reg, z->buf[0], z->buf[1], z->buf[2], value);
|
||||
if (z->selected) {
|
||||
z->buf[z->pos] = value & 0xff;
|
||||
z->pos++;
|
||||
@@ -126,22 +122,19 @@ static uint32_t zipit_lcd_transfer(SSIPeripheral *dev, uint32_t value)
|
||||
if (z->pos == 3) {
|
||||
switch (z->buf[0]) {
|
||||
case 0x74:
|
||||
DPRINTF("%s: reg: 0x%.2x\n", __func__, z->buf[2]);
|
||||
z->cur_reg = z->buf[2];
|
||||
break;
|
||||
case 0x76:
|
||||
val = z->buf[1] << 8 | z->buf[2];
|
||||
DPRINTF("%s: value: 0x%.4x\n", __func__, val);
|
||||
if (z->cur_reg == 0x22 && val == 0x0000) {
|
||||
z->enabled = 1;
|
||||
printf("%s: LCD enabled\n", __func__);
|
||||
trace_z2_lcd_enable_disable_result("enabled");
|
||||
} else if (z->cur_reg == 0x10 && val == 0x0000) {
|
||||
z->enabled = 0;
|
||||
printf("%s: LCD disabled\n", __func__);
|
||||
trace_z2_lcd_enable_disable_result("disabled");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DPRINTF("%s: unknown command!\n", __func__);
|
||||
break;
|
||||
}
|
||||
z->pos = 0;
|
||||
@@ -211,14 +204,12 @@ static int aer915_send(I2CSlave *i2c, uint8_t data)
|
||||
|
||||
s->buf[s->len] = data;
|
||||
if (s->len++ > 2) {
|
||||
DPRINTF("%s: message too long (%i bytes)\n",
|
||||
__func__, s->len);
|
||||
trace_z2_aer915_send_too_long(s->len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (s->len == 2) {
|
||||
DPRINTF("%s: reg %d value 0x%02x\n", __func__,
|
||||
s->buf[0], s->buf[1]);
|
||||
trace_z2_aer915_send(s->buf[0], s->buf[1]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -228,14 +219,12 @@ static int aer915_event(I2CSlave *i2c, enum i2c_event event)
|
||||
{
|
||||
AER915State *s = AER915(i2c);
|
||||
|
||||
trace_z2_aer915_event(s->len, event);
|
||||
switch (event) {
|
||||
case I2C_START_SEND:
|
||||
s->len = 0;
|
||||
break;
|
||||
case I2C_START_RECV:
|
||||
if (s->len != 1) {
|
||||
DPRINTF("%s: short message!?\n", __func__);
|
||||
}
|
||||
break;
|
||||
case I2C_FINISH:
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user