qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 1/2] hw/misc/arm_sp810: Create SP810 device


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH v3 1/2] hw/misc/arm_sp810: Create SP810 device
Date: Tue, 19 Aug 2014 15:03:21 +0100

On 17 August 2014 15:24, Fabian Aggeler <address@hidden> wrote:
> This adds a device model for the PrimeXsys System Controller (SP810)
> which is present in the Versatile Express motherboards. It is
> so far read-only but allows to read the SCCTRL register.
>
> Signed-off-by: Fabian Aggeler <address@hidden>
> ---
>  default-configs/arm-softmmu.mak |   1 +
>  hw/misc/Makefile.objs           |   1 +
>  hw/misc/arm_sp810.c             | 109 
> ++++++++++++++++++++++++++++++++++++++++
>  include/hw/misc/arm_sp810.h     |  80 +++++++++++++++++++++++++++++
>  4 files changed, 191 insertions(+)
>  create mode 100644 hw/misc/arm_sp810.c
>  create mode 100644 include/hw/misc/arm_sp810.h
>
> diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
> index f3513fa..67ba99a 100644
> --- a/default-configs/arm-softmmu.mak
> +++ b/default-configs/arm-softmmu.mak
> @@ -55,6 +55,7 @@ CONFIG_PL181=y
>  CONFIG_PL190=y
>  CONFIG_PL310=y
>  CONFIG_PL330=y
> +CONFIG_SP810=y
>  CONFIG_CADENCE=y
>  CONFIG_XGMAC=y
>  CONFIG_EXYNOS4=y
> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
> index 979e532..49d023b 100644
> --- a/hw/misc/Makefile.objs
> +++ b/hw/misc/Makefile.objs
> @@ -13,6 +13,7 @@ common-obj-$(CONFIG_PL310) += arm_l2x0.o
>  common-obj-$(CONFIG_INTEGRATOR_DEBUG) += arm_integrator_debug.o
>  common-obj-$(CONFIG_A9SCU) += a9scu.o
>  common-obj-$(CONFIG_ARM11SCU) += arm11scu.o
> +common-obj-$(CONFIG_SP810) += arm_sp810.o

We mostly don't use the 'arm' prefix (compare pl330, pl011,
and other examples for other architectures), so you can
remove it from filenames and variable names here.

>
>  # PKUnity SoC devices
>  common-obj-$(CONFIG_PUV3) += puv3_pm.o
> diff --git a/hw/misc/arm_sp810.c b/hw/misc/arm_sp810.c
> new file mode 100644
> index 0000000..7aff9bd
> --- /dev/null
> +++ b/hw/misc/arm_sp810.c
> @@ -0,0 +1,109 @@
> +/*
> + * ARM PrimeXsys System Controller (SP810)
> + *
> + * Copyright (C) 2014 Fabian Aggeler <address@hidden>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +
> +#include "hw/misc/arm_sp810.h"
> +
> +static const VMStateDescription vmstate_arm_sysctl = {

^^^ should be vmstate_sp810.

> +    .name = "arm_sp810",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT8(timeren0_sel, arm_sp810_state),
> +        VMSTATE_UINT8(timeren1_sel, arm_sp810_state),
> +        VMSTATE_UINT8(timeren2_sel, arm_sp810_state),
> +        VMSTATE_UINT8(timeren3_sel, arm_sp810_state),

These are read only properties, so you don't need to save them.

> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +static uint64_t arm_sp810_read(void *opaque, hwaddr offset, unsigned size)
> +{
> +    arm_sp810_state *s = opaque;
> +
> +    switch (offset) {
> +    case SCCTRL:
> +        return (s->timeren3_sel << 21) | (s->timeren2_sel << 19)
> +                | (s->timeren1_sel << 17) | (s->timeren0_sel << 15);
> +    default:
> +        qemu_log_mask(LOG_UNIMP,
> +                "arm_sp810_read: Register not yet implemented: %s\n",
> +                HWADDR_PRIx);
> +        return 0;
> +    }
> +}
> +
> +static void arm_sp810_write(void *opaque, hwaddr offset,
> +                            uint64_t val, unsigned size)
> +{
> +    switch (offset) {
> +    default:
> +        qemu_log_mask(LOG_UNIMP,
> +                "arm_sp810_write: Register not yet implemented: %s\n",
> +                HWADDR_PRIx);
> +        return;
> +    }
> +}
> +
> +static const MemoryRegionOps arm_sp810_ops = {
> +    .read = arm_sp810_read,
> +    .write = arm_sp810_write,
> +    .endianness = DEVICE_NATIVE_ENDIAN,
> +};
> +
> +static void arm_sp810_init(Object *obj)
> +{
> +    arm_sp810_state *s = ARM_SP810(obj);
> +
> +    memory_region_init_io(&s->iomem, obj, &arm_sp810_ops, s, "arm-sp810",
> +                          0x1000);
> +    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
> +}
> +
> +static Property arm_sp810_properties[] = {
> +    DEFINE_PROP_UINT8("timeren0-sel", arm_sp810_state, timeren0_sel,
> +                                                       SCCTRL_TIMER_REFCLK),
> +    DEFINE_PROP_UINT8("timeren1-sel", arm_sp810_state, timeren1_sel,
> +                                                       SCCTRL_TIMER_REFCLK),
> +    DEFINE_PROP_UINT8("timeren2-sel", arm_sp810_state, timeren2_sel,
> +                                                       SCCTRL_TIMER_REFCLK),
> +    DEFINE_PROP_UINT8("timeren3-sel", arm_sp810_state, timeren3_sel,
> +                                                       SCCTRL_TIMER_REFCLK),

Which input signals in the hardware do these properties
correspond to? I can't figure out what the mapping is.
As far as I can tell from the documentation the bits
in SCCTRL are just always reset to 0 and are not
controlled by external signals (which is what qdev
properties should typically correspond to).

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]