mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20200703' into staging
target-arm queue: * i.MX6UL EVK board: put PHYs in the correct places * hw/arm/virt: Let the virtio-iommu bypass MSIs * target/arm: kvm: Handle DABT with no valid ISS * hw/arm/virt-acpi-build: Only expose flash on older machine types * target/arm: Fix temp double-free in sve ldr/str * hw/display/bcm2835_fb.c: Initialize all fields of struct * hw/arm/spitz: Code cleanup to fix Coverity-detected memory leak * Deprecate TileGX port # gpg: Signature made Fri 03 Jul 2020 17:53:05 BST # 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] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20200703: (34 commits) Deprecate TileGX port Replace uses of FROM_SSI_SLAVE() macro with QOM casts hw/arm/spitz: Provide usual QOM macros for corgi-ssp and spitz-lcdtg hw/arm/pxa2xx_pic: Use LOG_GUEST_ERROR for bad guest register accesses hw/arm/spitz: Use LOG_GUEST_ERROR for bad guest register accesses hw/gpio/zaurus.c: Use LOG_GUEST_ERROR for bad guest register accesses hw/arm/spitz: Encapsulate misc GPIO handling in a device hw/misc/max111x: Create header file for documentation, TYPE_ macros hw/misc/max111x: Use GPIO lines rather than max111x_set_input() hw/arm/spitz: Use max111x properties to set initial values ssi: Add ssi_realize_and_unref() hw/misc/max111x: Don't use vmstate_register() hw/misc/max111x: provide QOM properties for setting initial values hw/arm/spitz: Implement inbound GPIO lines for bit5 and power signals hw/arm/spitz: Keep pointers to scp0, scp1 in SpitzMachineState hw/arm/spitz: Keep pointers to MPU and SSI devices in SpitzMachineState hw/arm/spitz: Create SpitzMachineClass abstract base class hw/arm/spitz: Detabify hw/display/bcm2835_fb.c: Initialize all fields of struct target/arm: Fix temp double-free in sve ldr/str ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -787,6 +787,7 @@ F: hw/gpio/max7310.c
|
||||
F: hw/gpio/zaurus.c
|
||||
F: hw/misc/mst_fpga.c
|
||||
F: hw/misc/max111x.c
|
||||
F: include/hw/misc/max111x.h
|
||||
F: include/hw/arm/pxa.h
|
||||
F: include/hw/arm/sharpsl.h
|
||||
F: include/hw/display/tc6393xb.h
|
||||
|
||||
@@ -404,6 +404,17 @@ The above, converted to the current supported format::
|
||||
|
||||
json:{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"}
|
||||
|
||||
linux-user mode CPUs
|
||||
--------------------
|
||||
|
||||
``tilegx`` CPUs (since 5.1.0)
|
||||
'''''''''''''''''''''''''''''
|
||||
|
||||
The ``tilegx`` guest CPU support (which was only implemented in
|
||||
linux-user mode) is deprecated and will be removed in a future version
|
||||
of QEMU. Support for this CPU was removed from the upstream Linux
|
||||
kernel in 2018, and has also been dropped from glibc.
|
||||
|
||||
Related binaries
|
||||
----------------
|
||||
|
||||
|
||||
@@ -427,6 +427,9 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
|
||||
FSL_IMX6UL_ENET2_TIMER_IRQ,
|
||||
};
|
||||
|
||||
object_property_set_uint(OBJECT(&s->eth[i]),
|
||||
s->phy_num[i],
|
||||
"phy-num", &error_abort);
|
||||
object_property_set_uint(OBJECT(&s->eth[i]),
|
||||
FSL_IMX6UL_ETH_NUM_TX_RINGS,
|
||||
"tx-ring-num", &error_abort);
|
||||
@@ -607,10 +610,17 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
|
||||
FSL_IMX6UL_OCRAM_ALIAS_ADDR, &s->ocram_alias);
|
||||
}
|
||||
|
||||
static Property fsl_imx6ul_properties[] = {
|
||||
DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
|
||||
DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void fsl_imx6ul_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
|
||||
device_class_set_props(dc, fsl_imx6ul_properties);
|
||||
dc->realize = fsl_imx6ul_realize;
|
||||
dc->desc = "i.MX6UL SOC";
|
||||
/* Reason: Uses serial_hds and nd_table in realize() directly */
|
||||
|
||||
@@ -40,6 +40,8 @@ static void mcimx6ul_evk_init(MachineState *machine)
|
||||
|
||||
s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
|
||||
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
|
||||
object_property_set_uint(OBJECT(s), 2, "fec1-phy-num", &error_fatal);
|
||||
object_property_set_uint(OBJECT(s), 1, "fec2-phy-num", &error_fatal);
|
||||
qdev_realize(DEVICE(s), NULL, &error_fatal);
|
||||
|
||||
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
|
||||
|
||||
+7
-2
@@ -11,6 +11,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/log.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/arm/pxa.h"
|
||||
#include "hw/sysbus.h"
|
||||
@@ -166,7 +167,9 @@ static uint64_t pxa2xx_pic_mem_read(void *opaque, hwaddr offset,
|
||||
case ICHP: /* Highest Priority register */
|
||||
return pxa2xx_pic_highest(s);
|
||||
default:
|
||||
printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"pxa2xx_pic_mem_read: bad register offset 0x%" HWADDR_PRIx
|
||||
"\n", offset);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -199,7 +202,9 @@ static void pxa2xx_pic_mem_write(void *opaque, hwaddr offset,
|
||||
s->priority[32 + ((offset - IPR32) >> 2)] = value & 0x8000003f;
|
||||
break;
|
||||
default:
|
||||
printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"pxa2xx_pic_mem_write: bad register offset 0x%"
|
||||
HWADDR_PRIx "\n", offset);
|
||||
return;
|
||||
}
|
||||
pxa2xx_pic_update(opaque);
|
||||
|
||||
+297
-210
File diff suppressed because it is too large
Load Diff
@@ -749,6 +749,7 @@ static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
|
||||
static void
|
||||
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
{
|
||||
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
|
||||
Aml *scope, *dsdt;
|
||||
MachineState *ms = MACHINE(vms);
|
||||
const MemMapEntry *memmap = vms->memmap;
|
||||
@@ -767,7 +768,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
acpi_dsdt_add_cpus(scope, vms->smp_cpus);
|
||||
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
|
||||
(irqmap[VIRT_UART] + ARM_SPI_BASE));
|
||||
acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
|
||||
if (vmc->acpi_expose_flash) {
|
||||
acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
|
||||
}
|
||||
acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]);
|
||||
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
|
||||
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
|
||||
|
||||
@@ -600,6 +600,7 @@ static void create_its(VirtMachineState *vms)
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
|
||||
|
||||
fdt_add_its_gic_node(vms);
|
||||
vms->msi_controller = VIRT_MSI_CTRL_ITS;
|
||||
}
|
||||
|
||||
static void create_v2m(VirtMachineState *vms)
|
||||
@@ -620,6 +621,7 @@ static void create_v2m(VirtMachineState *vms)
|
||||
}
|
||||
|
||||
fdt_add_v2m_gic_node(vms);
|
||||
vms->msi_controller = VIRT_MSI_CTRL_GICV2M;
|
||||
}
|
||||
|
||||
static void create_gic(VirtMachineState *vms)
|
||||
@@ -2198,8 +2200,36 @@ out:
|
||||
static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
|
||||
|
||||
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
||||
virt_memory_pre_plug(hotplug_dev, dev, errp);
|
||||
} else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
|
||||
hwaddr db_start = 0, db_end = 0;
|
||||
char *resv_prop_str;
|
||||
|
||||
switch (vms->msi_controller) {
|
||||
case VIRT_MSI_CTRL_NONE:
|
||||
return;
|
||||
case VIRT_MSI_CTRL_ITS:
|
||||
/* GITS_TRANSLATER page */
|
||||
db_start = base_memmap[VIRT_GIC_ITS].base + 0x10000;
|
||||
db_end = base_memmap[VIRT_GIC_ITS].base +
|
||||
base_memmap[VIRT_GIC_ITS].size - 1;
|
||||
break;
|
||||
case VIRT_MSI_CTRL_GICV2M:
|
||||
/* MSI_SETSPI_NS page */
|
||||
db_start = base_memmap[VIRT_GIC_V2M].base;
|
||||
db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1;
|
||||
break;
|
||||
}
|
||||
resv_prop_str = g_strdup_printf("0x%"PRIx64":0x%"PRIx64":%u",
|
||||
db_start, db_end,
|
||||
VIRTIO_IOMMU_RESV_MEM_T_MSI);
|
||||
|
||||
qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
|
||||
qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
|
||||
g_free(resv_prop_str);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2480,9 +2510,12 @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 1)
|
||||
|
||||
static void virt_machine_5_0_options(MachineClass *mc)
|
||||
{
|
||||
VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||||
|
||||
virt_machine_5_1_options(mc);
|
||||
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
|
||||
mc->numa_mem_supported = true;
|
||||
vmc->acpi_expose_flash = true;
|
||||
}
|
||||
DEFINE_VIRT_MACHINE(5, 0)
|
||||
|
||||
|
||||
+7
-4
@@ -111,9 +111,12 @@ typedef struct {
|
||||
int pos;
|
||||
} ZipitLCD;
|
||||
|
||||
#define TYPE_ZIPIT_LCD "zipit-lcd"
|
||||
#define ZIPIT_LCD(obj) OBJECT_CHECK(ZipitLCD, (obj), TYPE_ZIPIT_LCD)
|
||||
|
||||
static uint32_t zipit_lcd_transfer(SSISlave *dev, uint32_t value)
|
||||
{
|
||||
ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
|
||||
ZipitLCD *z = ZIPIT_LCD(dev);
|
||||
uint16_t val;
|
||||
if (z->selected) {
|
||||
z->buf[z->pos] = value & 0xff;
|
||||
@@ -153,7 +156,7 @@ static void z2_lcd_cs(void *opaque, int line, int level)
|
||||
|
||||
static void zipit_lcd_realize(SSISlave *dev, Error **errp)
|
||||
{
|
||||
ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
|
||||
ZipitLCD *z = ZIPIT_LCD(dev);
|
||||
z->selected = 0;
|
||||
z->enabled = 0;
|
||||
z->pos = 0;
|
||||
@@ -185,7 +188,7 @@ static void zipit_lcd_class_init(ObjectClass *klass, void *data)
|
||||
}
|
||||
|
||||
static const TypeInfo zipit_lcd_info = {
|
||||
.name = "zipit-lcd",
|
||||
.name = TYPE_ZIPIT_LCD,
|
||||
.parent = TYPE_SSI_SLAVE,
|
||||
.instance_size = sizeof(ZipitLCD),
|
||||
.class_init = zipit_lcd_class_init,
|
||||
@@ -325,7 +328,7 @@ static void z2_init(MachineState *machine)
|
||||
|
||||
type_register_static(&zipit_lcd_info);
|
||||
type_register_static(&aer915_info);
|
||||
z2_lcd = ssi_create_slave(mpu->ssp[1], "zipit-lcd");
|
||||
z2_lcd = ssi_create_slave(mpu->ssp[1], TYPE_ZIPIT_LCD);
|
||||
bus = pxa2xx_i2c_bus(mpu->i2c[0]);
|
||||
i2c_create_slave(bus, TYPE_AER915, 0x55);
|
||||
wm = i2c_create_slave(bus, TYPE_WM8750, 0x1b);
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "chardev/char.h"
|
||||
#include "qemu/uuid.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/cutils.h"
|
||||
|
||||
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
|
||||
Error **errp)
|
||||
@@ -578,6 +579,94 @@ const PropertyInfo qdev_prop_macaddr = {
|
||||
.set = set_mac,
|
||||
};
|
||||
|
||||
/* --- Reserved Region --- */
|
||||
|
||||
/*
|
||||
* Accepted syntax:
|
||||
* <low address>:<high address>:<type>
|
||||
* where low/high addresses are uint64_t in hexadecimal
|
||||
* and type is a non-negative decimal integer
|
||||
*/
|
||||
static void get_reserved_region(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
|
||||
char buffer[64];
|
||||
char *p = buffer;
|
||||
int rc;
|
||||
|
||||
rc = snprintf(buffer, sizeof(buffer), "0x%"PRIx64":0x%"PRIx64":%u",
|
||||
rr->low, rr->high, rr->type);
|
||||
assert(rc < sizeof(buffer));
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
}
|
||||
|
||||
static void set_reserved_region(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
|
||||
Error *local_err = NULL;
|
||||
const char *endptr;
|
||||
char *str;
|
||||
int ret;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_str(v, name, &str, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = qemu_strtou64(str, &endptr, 16, &rr->low);
|
||||
if (ret) {
|
||||
error_setg(errp, "start address of '%s'"
|
||||
" must be a hexadecimal integer", name);
|
||||
goto out;
|
||||
}
|
||||
if (*endptr != ':') {
|
||||
goto separator_error;
|
||||
}
|
||||
|
||||
ret = qemu_strtou64(endptr + 1, &endptr, 16, &rr->high);
|
||||
if (ret) {
|
||||
error_setg(errp, "end address of '%s'"
|
||||
" must be a hexadecimal integer", name);
|
||||
goto out;
|
||||
}
|
||||
if (*endptr != ':') {
|
||||
goto separator_error;
|
||||
}
|
||||
|
||||
ret = qemu_strtoui(endptr + 1, &endptr, 10, &rr->type);
|
||||
if (ret) {
|
||||
error_setg(errp, "type of '%s'"
|
||||
" must be a non-negative decimal integer", name);
|
||||
}
|
||||
goto out;
|
||||
|
||||
separator_error:
|
||||
error_setg(errp, "reserved region fields must be separated with ':'");
|
||||
out:
|
||||
g_free(str);
|
||||
return;
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_reserved_region = {
|
||||
.name = "reserved_region",
|
||||
.description = "Reserved Region, example: 0xFEE00000:0xFEEFFFFF:0",
|
||||
.get = get_reserved_region,
|
||||
.set = set_reserved_region,
|
||||
};
|
||||
|
||||
/* --- on/off/auto --- */
|
||||
|
||||
const PropertyInfo qdev_prop_on_off_auto = {
|
||||
|
||||
@@ -29,6 +29,9 @@ typedef struct {
|
||||
int output;
|
||||
} ADS7846State;
|
||||
|
||||
#define TYPE_ADS7846 "ads7846"
|
||||
#define ADS7846(obj) OBJECT_CHECK(ADS7846State, (obj), TYPE_ADS7846)
|
||||
|
||||
/* Control-byte bitfields */
|
||||
#define CB_PD0 (1 << 0)
|
||||
#define CB_PD1 (1 << 1)
|
||||
@@ -61,7 +64,7 @@ static void ads7846_int_update(ADS7846State *s)
|
||||
|
||||
static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value)
|
||||
{
|
||||
ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev);
|
||||
ADS7846State *s = ADS7846(dev);
|
||||
|
||||
switch (s->cycle ++) {
|
||||
case 0:
|
||||
@@ -139,7 +142,7 @@ static const VMStateDescription vmstate_ads7846 = {
|
||||
static void ads7846_realize(SSISlave *d, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(d);
|
||||
ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
|
||||
ADS7846State *s = ADS7846(d);
|
||||
|
||||
qdev_init_gpio_out(dev, &s->interrupt, 1);
|
||||
|
||||
@@ -166,7 +169,7 @@ static void ads7846_class_init(ObjectClass *klass, void *data)
|
||||
}
|
||||
|
||||
static const TypeInfo ads7846_info = {
|
||||
.name = "ads7846",
|
||||
.name = TYPE_ADS7846,
|
||||
.parent = TYPE_SSI_SLAVE,
|
||||
.instance_size = sizeof(ADS7846State),
|
||||
.class_init = ads7846_class_init,
|
||||
|
||||
@@ -282,6 +282,10 @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
|
||||
newconf.base = s->vcram_base | (value & 0xc0000000);
|
||||
newconf.base += BCM2835_FB_OFFSET;
|
||||
|
||||
/* Copy fields which we don't want to change from the existing config */
|
||||
newconf.pixo = s->config.pixo;
|
||||
newconf.alpha = s->config.alpha;
|
||||
|
||||
bcm2835_fb_validate_config(&newconf);
|
||||
|
||||
pitch = bcm2835_fb_get_pitch(&newconf);
|
||||
|
||||
@@ -66,9 +66,13 @@ typedef struct {
|
||||
uint8_t framebuffer[128 * 80 / 2];
|
||||
} ssd0323_state;
|
||||
|
||||
#define TYPE_SSD0323 "ssd0323"
|
||||
#define SSD0323(obj) OBJECT_CHECK(ssd0323_state, (obj), TYPE_SSD0323)
|
||||
|
||||
|
||||
static uint32_t ssd0323_transfer(SSISlave *dev, uint32_t data)
|
||||
{
|
||||
ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
|
||||
ssd0323_state *s = SSD0323(dev);
|
||||
|
||||
switch (s->mode) {
|
||||
case SSD0323_DATA:
|
||||
@@ -346,7 +350,7 @@ static const GraphicHwOps ssd0323_ops = {
|
||||
static void ssd0323_realize(SSISlave *d, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(d);
|
||||
ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
|
||||
ssd0323_state *s = SSD0323(d);
|
||||
|
||||
s->col_end = 63;
|
||||
s->row_end = 79;
|
||||
@@ -368,7 +372,7 @@ static void ssd0323_class_init(ObjectClass *klass, void *data)
|
||||
}
|
||||
|
||||
static const TypeInfo ssd0323_info = {
|
||||
.name = "ssd0323",
|
||||
.name = TYPE_SSD0323,
|
||||
.parent = TYPE_SSI_SLAVE,
|
||||
.instance_size = sizeof(ssd0323_state),
|
||||
.class_init = ssd0323_class_init,
|
||||
|
||||
+7
-5
@@ -22,9 +22,7 @@
|
||||
#include "hw/sysbus.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qemu/module.h"
|
||||
|
||||
#undef REG_FMT
|
||||
#define REG_FMT "0x%02lx"
|
||||
#include "qemu/log.h"
|
||||
|
||||
/* SCOOP devices */
|
||||
|
||||
@@ -104,7 +102,9 @@ static uint64_t scoop_read(void *opaque, hwaddr addr,
|
||||
case SCOOP_GPRR:
|
||||
return s->gpio_level;
|
||||
default:
|
||||
zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"scoop_read: bad register offset 0x%02" HWADDR_PRIx "\n",
|
||||
addr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -150,7 +150,9 @@ static void scoop_write(void *opaque, hwaddr addr,
|
||||
scoop_gpio_handler_update(s);
|
||||
break;
|
||||
default:
|
||||
zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"scoop_write: bad register offset 0x%02" HWADDR_PRIx "\n",
|
||||
addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+51
-35
@@ -11,29 +11,11 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/misc/max111x.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/ssi/ssi.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "qemu/module.h"
|
||||
|
||||
typedef struct {
|
||||
SSISlave parent_obj;
|
||||
|
||||
qemu_irq interrupt;
|
||||
uint8_t tb1, rb2, rb3;
|
||||
int cycle;
|
||||
|
||||
uint8_t input[8];
|
||||
int inputs, com;
|
||||
} MAX111xState;
|
||||
|
||||
#define TYPE_MAX_111X "max111x"
|
||||
|
||||
#define MAX_111X(obj) \
|
||||
OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
|
||||
|
||||
#define TYPE_MAX_1110 "max1110"
|
||||
#define TYPE_MAX_1111 "max1111"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
||||
/* Control-byte bitfields */
|
||||
#define CB_PD0 (1 << 0)
|
||||
@@ -127,27 +109,24 @@ static const VMStateDescription vmstate_max111x = {
|
||||
}
|
||||
};
|
||||
|
||||
static void max111x_input_set(void *opaque, int line, int value)
|
||||
{
|
||||
MAX111xState *s = MAX_111X(opaque);
|
||||
|
||||
assert(line >= 0 && line < s->inputs);
|
||||
s->input[line] = value;
|
||||
}
|
||||
|
||||
static int max111x_init(SSISlave *d, int inputs)
|
||||
{
|
||||
DeviceState *dev = DEVICE(d);
|
||||
MAX111xState *s = MAX_111X(dev);
|
||||
|
||||
qdev_init_gpio_out(dev, &s->interrupt, 1);
|
||||
qdev_init_gpio_in(dev, max111x_input_set, inputs);
|
||||
|
||||
s->inputs = inputs;
|
||||
/* TODO: add a user interface for setting these */
|
||||
s->input[0] = 0xf0;
|
||||
s->input[1] = 0xe0;
|
||||
s->input[2] = 0xd0;
|
||||
s->input[3] = 0xc0;
|
||||
s->input[4] = 0xb0;
|
||||
s->input[5] = 0xa0;
|
||||
s->input[6] = 0x90;
|
||||
s->input[7] = 0x80;
|
||||
s->com = 0;
|
||||
|
||||
vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
|
||||
&vmstate_max111x, s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -161,18 +140,51 @@ static void max1111_realize(SSISlave *dev, Error **errp)
|
||||
max111x_init(dev, 4);
|
||||
}
|
||||
|
||||
void max111x_set_input(DeviceState *dev, int line, uint8_t value)
|
||||
static void max111x_reset(DeviceState *dev)
|
||||
{
|
||||
MAX111xState *s = MAX_111X(dev);
|
||||
assert(line >= 0 && line < s->inputs);
|
||||
s->input[line] = value;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < s->inputs; i++) {
|
||||
s->input[i] = s->reset_input[i];
|
||||
}
|
||||
s->com = 0;
|
||||
s->tb1 = 0;
|
||||
s->rb2 = 0;
|
||||
s->rb3 = 0;
|
||||
s->cycle = 0;
|
||||
}
|
||||
|
||||
static Property max1110_properties[] = {
|
||||
/* Reset values for ADC inputs */
|
||||
DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
|
||||
DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
|
||||
DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
|
||||
DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static Property max1111_properties[] = {
|
||||
/* Reset values for ADC inputs */
|
||||
DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
|
||||
DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
|
||||
DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
|
||||
DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
|
||||
DEFINE_PROP_UINT8("input4", MAX111xState, reset_input[4], 0xb0),
|
||||
DEFINE_PROP_UINT8("input5", MAX111xState, reset_input[5], 0xa0),
|
||||
DEFINE_PROP_UINT8("input6", MAX111xState, reset_input[6], 0x90),
|
||||
DEFINE_PROP_UINT8("input7", MAX111xState, reset_input[7], 0x80),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void max111x_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->transfer = max111x_transfer;
|
||||
dc->reset = max111x_reset;
|
||||
dc->vmsd = &vmstate_max111x;
|
||||
}
|
||||
|
||||
static const TypeInfo max111x_info = {
|
||||
@@ -186,8 +198,10 @@ static const TypeInfo max111x_info = {
|
||||
static void max1110_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->realize = max1110_realize;
|
||||
device_class_set_props(dc, max1110_properties);
|
||||
}
|
||||
|
||||
static const TypeInfo max1110_info = {
|
||||
@@ -199,8 +213,10 @@ static const TypeInfo max1110_info = {
|
||||
static void max1111_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->realize = max1111_realize;
|
||||
device_class_set_props(dc, max1111_properties);
|
||||
}
|
||||
|
||||
static const TypeInfo max1111_info = {
|
||||
|
||||
+17
-7
@@ -280,12 +280,16 @@ static void imx_phy_reset(IMXFECState *s)
|
||||
static uint32_t imx_phy_read(IMXFECState *s, int reg)
|
||||
{
|
||||
uint32_t val;
|
||||
uint32_t phy = reg / 32;
|
||||
|
||||
if (reg > 31) {
|
||||
/* we only advertise one phy */
|
||||
if (phy != s->phy_num) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
|
||||
TYPE_IMX_FEC, __func__, phy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
reg %= 32;
|
||||
|
||||
switch (reg) {
|
||||
case 0: /* Basic Control */
|
||||
val = s->phy_control;
|
||||
@@ -331,20 +335,25 @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
|
||||
break;
|
||||
}
|
||||
|
||||
trace_imx_phy_read(val, reg);
|
||||
trace_imx_phy_read(val, phy, reg);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
|
||||
{
|
||||
trace_imx_phy_write(val, reg);
|
||||
uint32_t phy = reg / 32;
|
||||
|
||||
if (reg > 31) {
|
||||
/* we only advertise one phy */
|
||||
if (phy != s->phy_num) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
|
||||
TYPE_IMX_FEC, __func__, phy);
|
||||
return;
|
||||
}
|
||||
|
||||
reg %= 32;
|
||||
|
||||
trace_imx_phy_write(val, phy, reg);
|
||||
|
||||
switch (reg) {
|
||||
case 0: /* Basic Control */
|
||||
if (val & 0x8000) {
|
||||
@@ -926,7 +935,7 @@ static void imx_eth_write(void *opaque, hwaddr offset, uint64_t value,
|
||||
extract32(value,
|
||||
18, 10)));
|
||||
} else {
|
||||
/* This a write operation */
|
||||
/* This is a write operation */
|
||||
imx_phy_write(s, extract32(value, 18, 10), extract32(value, 0, 16));
|
||||
}
|
||||
/* raise the interrupt as the PHY operation is done */
|
||||
@@ -1315,6 +1324,7 @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
|
||||
static Property imx_eth_properties[] = {
|
||||
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
|
||||
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
|
||||
DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
||||
+2
-2
@@ -413,8 +413,8 @@ i82596_set_multicast(uint16_t count) "Added %d multicast entries"
|
||||
i82596_channel_attention(void *s) "%p: Received CHANNEL ATTENTION"
|
||||
|
||||
# imx_fec.c
|
||||
imx_phy_read(uint32_t val, int reg) "0x%04"PRIx32" <= reg[%d]"
|
||||
imx_phy_write(uint32_t val, int reg) "0x%04"PRIx32" => reg[%d]"
|
||||
imx_phy_read(uint32_t val, int phy, int reg) "0x%04"PRIx32" <= phy[%d].reg[%d]"
|
||||
imx_phy_write(uint32_t val, int phy, int reg) "0x%04"PRIx32" => phy[%d].reg[%d]"
|
||||
imx_phy_update_link(const char *s) "%s"
|
||||
imx_phy_reset(void) ""
|
||||
imx_fec_read_bd(uint64_t addr, int flags, int len, int data) "tx_bd 0x%"PRIx64" flags 0x%04x len %d data 0x%08x"
|
||||
|
||||
+2
-2
@@ -74,7 +74,7 @@ typedef struct {
|
||||
|
||||
static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
|
||||
{
|
||||
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev);
|
||||
ssi_sd_state *s = SSI_SD(dev);
|
||||
|
||||
/* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */
|
||||
if (s->mode == SSI_SD_DATA_READ && val == 0x4d) {
|
||||
@@ -241,7 +241,7 @@ static const VMStateDescription vmstate_ssi_sd = {
|
||||
|
||||
static void ssi_sd_realize(SSISlave *d, Error **errp)
|
||||
{
|
||||
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
|
||||
ssi_sd_state *s = SSI_SD(d);
|
||||
DeviceState *carddev;
|
||||
DriveInfo *dinfo;
|
||||
Error *err = NULL;
|
||||
|
||||
+6
-1
@@ -90,11 +90,16 @@ static const TypeInfo ssi_slave_info = {
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
|
||||
{
|
||||
return qdev_realize_and_unref(dev, &bus->parent_obj, errp);
|
||||
}
|
||||
|
||||
DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
|
||||
{
|
||||
DeviceState *dev = qdev_new(name);
|
||||
|
||||
qdev_realize_and_unref(dev, &bus->parent_obj, &error_fatal);
|
||||
ssi_realize_and_unref(dev, bus, &error_fatal);
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,3 +74,4 @@ virtio_iommu_get_domain(uint32_t domain_id) "Alloc domain=%d"
|
||||
virtio_iommu_put_domain(uint32_t domain_id) "Free domain=%d"
|
||||
virtio_iommu_translate_out(uint64_t virt_addr, uint64_t phys_addr, uint32_t sid) "0x%"PRIx64" -> 0x%"PRIx64 " for sid=%d"
|
||||
virtio_iommu_report_fault(uint8_t reason, uint32_t flags, uint32_t endpoint, uint64_t addr) "FAULT reason=%d flags=%d endpoint=%d address =0x%"PRIx64
|
||||
virtio_iommu_fill_resv_property(uint32_t devid, uint8_t subtype, uint64_t start, uint64_t end) "dev= %d, type=%d start=0x%"PRIx64" end=0x%"PRIx64
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user