[{"id":1761362,"web_url":"http://patchwork.ozlabs.org/comment/1761362/","msgid":"<CAKmqyKOva-ojPqFh6bqhRbJAwi3z2FB0YTB8icv5gLzdUNm7Zw@mail.gmail.com>","list_archive_url":null,"date":"2017-08-31T22:58:20","subject":"Re: [Qemu-devel] [Qemu devel v7 PATCH 2/5] msf2: Microsemi\n\tSmartfusion2 System Register block","submitter":{"id":64571,"url":"http://patchwork.ozlabs.org/api/people/64571/","name":"Alistair Francis","email":"alistair23@gmail.com"},"content":"On Mon, Aug 28, 2017 at 9:38 AM, Subbaraya Sundeep\n<sundeep.lkml@gmail.com> wrote:\n> Added Sytem register block of Smartfusion2.\n> This block has PLL registers which are accessed by guest.\n>\n> Signed-off-by: Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> ---\n>  hw/misc/Makefile.objs         |   1 +\n>  hw/misc/msf2-sysreg.c         | 199 ++++++++++++++++++++++++++++++++++++++++++\n>  include/hw/misc/msf2-sysreg.h |  78 +++++++++++++++++\n>  3 files changed, 278 insertions(+)\n>  create mode 100644 hw/misc/msf2-sysreg.c\n>  create mode 100644 include/hw/misc/msf2-sysreg.h\n>\n> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs\n> index 29fb922..e8f0a02 100644\n> --- a/hw/misc/Makefile.objs\n> +++ b/hw/misc/Makefile.objs\n> @@ -59,3 +59,4 @@ obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o\n>  obj-$(CONFIG_AUX) += auxbus.o\n>  obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o\n>  obj-y += mmio_interface.o\n> +obj-$(CONFIG_MSF2) += msf2-sysreg.o\n> diff --git a/hw/misc/msf2-sysreg.c b/hw/misc/msf2-sysreg.c\n> new file mode 100644\n> index 0000000..2aeb555\n> --- /dev/null\n> +++ b/hw/misc/msf2-sysreg.c\n> @@ -0,0 +1,199 @@\n> +/*\n> + * System Register block model of Microsemi SmartFusion2.\n> + *\n> + * Copyright (c) 2017 Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> + *\n> + * This program is free software; you can redistribute it and/or\n> + * modify it under the terms of the GNU General Public License\n> + * as published by the Free Software Foundation; either version\n> + * 2 of the License, or (at your option) any later version.\n> + *\n> + * You should have received a copy of the GNU General Public License along\n> + * with this program; if not, see <http://www.gnu.org/licenses/>.\n> + */\n> +\n> +#include \"qemu/osdep.h\"\n> +#include \"qemu/log.h\"\n> +#include \"hw/misc/msf2-sysreg.h\"\n> +\n> +#ifndef MSF2_SYSREG_ERR_DEBUG\n> +#define MSF2_SYSREG_ERR_DEBUG  0\n> +#endif\n> +\n> +#define DB_PRINT_L(lvl, fmt, args...) do { \\\n> +    if (MSF2_SYSREG_ERR_DEBUG >= lvl) { \\\n> +        qemu_log(\"%s: \" fmt \"\\n\", __func__, ## args); \\\n> +    } \\\n> +} while (0);\n> +\n> +#define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args)\n> +\n> +static inline int msf2_divbits(uint32_t div)\n> +{\n> +    int ret = 0;\n> +\n> +    switch (div) {\n> +    case 1:\n> +        ret = 0;\n> +        break;\n> +    case 2:\n> +        ret = 1;\n> +        break;\n> +    case 4:\n> +        ret = 2;\n> +        break;\n> +    case 8:\n> +        ret = 4;\n> +        break;\n> +    case 16:\n> +        ret = 5;\n> +        break;\n> +    case 32:\n> +        ret = 6;\n> +        break;\n> +    default:\n> +        break;\n> +    }\n> +\n> +    return ret;\n> +}\n> +\n> +static void msf2_sysreg_reset(DeviceState *d)\n> +{\n> +    MSF2SysregState *s = MSF2_SYSREG(d);\n> +\n> +    DB_PRINT(\"RESET\");\n> +\n> +    s->regs[MSSDDR_PLL_STATUS_LOW_CR] = 0x021A2358;\n> +    s->regs[MSSDDR_PLL_STATUS] = 0x3;\n> +    s->regs[MSSDDR_FACC1_CR] = msf2_divbits(s->apb0div) << 5 |\n> +                               msf2_divbits(s->apb1div) << 2;\n> +}\n> +\n> +static uint64_t msf2_sysreg_read(void *opaque, hwaddr offset,\n> +    unsigned size)\n> +{\n> +    MSF2SysregState *s = opaque;\n> +    uint32_t ret = 0;\n> +\n> +    offset >>= 2;\n> +    if (offset < ARRAY_SIZE(s->regs)) {\n> +        ret = s->regs[offset];\n> +        DB_PRINT(\"addr: 0x%08\" HWADDR_PRIx \" data: 0x%08\" PRIx32,\n> +                    offset << 2, ret);\n> +    } else {\n> +        qemu_log_mask(LOG_GUEST_ERROR,\n> +                    \"%s: Bad offset 0x%08\" HWADDR_PRIx \"\\n\", __func__,\n> +                    offset << 2);\n> +    }\n> +\n> +    return ret;\n> +}\n> +\n> +static void msf2_sysreg_write(void *opaque, hwaddr offset,\n> +                          uint64_t val, unsigned size)\n> +{\n> +    MSF2SysregState *s = (MSF2SysregState *)opaque;\n\nDrop this cast\n\n> +    uint32_t newval = val;\n> +    uint32_t oldval;\n> +\n> +    DB_PRINT(\"addr: 0x%08\" HWADDR_PRIx \" data: 0x%08\" PRIx64,\n> +            offset, val);\n> +\n> +    offset >>= 2;\n> +\n> +    switch (offset) {\n> +    case MSSDDR_PLL_STATUS:\n> +        break;\n> +\n> +    case ESRAM_CR:\n> +        oldval = s->regs[ESRAM_CR];\n> +        if (oldval ^ newval) {\n\nIsn't this just:\nif (newval != s->regs[ESRAM_CR])\n\nI think putting it all in the if makes it clearer.\n\n> +            qemu_log_mask(LOG_GUEST_ERROR,\n> +                       TYPE_MSF2_SYSREG\": eSRAM remapping not supported\\n\");\n> +        }\n> +        break;\n> +\n> +    case DDR_CR:\n> +        oldval = s->regs[DDR_CR];\n> +        if (oldval ^ newval) {\n> +            qemu_log_mask(LOG_GUEST_ERROR,\n> +                       TYPE_MSF2_SYSREG\": DDR remapping not supported\\n\");\n> +        }\n> +        break;\n> +\n> +    case ENVM_REMAP_BASE_CR:\n> +        oldval = s->regs[ENVM_REMAP_BASE_CR];\n> +        if (oldval ^ newval) {\n> +            qemu_log_mask(LOG_GUEST_ERROR,\n> +                       TYPE_MSF2_SYSREG\": eNVM remapping not supported\\n\");\n> +        }\n> +        break;\n> +\n> +    default:\n> +        if (offset < ARRAY_SIZE(s->regs)) {\n> +            s->regs[offset] = val;\n\nUse newval instead.\n\nWith those all fixed up you can include this in the next version:\n\nReviewed-by: Alistair Francis <alistair.francis@xilinx.com>\n\nThanks,\nAlistair\n\n\n> +        } else {\n> +            qemu_log_mask(LOG_GUEST_ERROR,\n> +                        \"%s: Bad offset 0x%08\" HWADDR_PRIx \"\\n\", __func__,\n> +                        offset << 2);\n> +        }\n> +        break;\n> +    }\n> +}\n> +\n> +static const MemoryRegionOps sysreg_ops = {\n> +    .read = msf2_sysreg_read,\n> +    .write = msf2_sysreg_write,\n> +    .endianness = DEVICE_NATIVE_ENDIAN,\n> +};\n> +\n> +static void msf2_sysreg_init(Object *obj)\n> +{\n> +    MSF2SysregState *s = MSF2_SYSREG(obj);\n> +\n> +    memory_region_init_io(&s->iomem, obj, &sysreg_ops, s, TYPE_MSF2_SYSREG,\n> +                          MSF2_SYSREG_MMIO_SIZE);\n> +    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);\n> +}\n> +\n> +static const VMStateDescription vmstate_msf2_sysreg = {\n> +    .name = TYPE_MSF2_SYSREG,\n> +    .version_id = 1,\n> +    .minimum_version_id = 1,\n> +    .fields = (VMStateField[]) {\n> +        VMSTATE_UINT32_ARRAY(regs, MSF2SysregState, MSF2_SYSREG_MMIO_SIZE / 4),\n> +        VMSTATE_END_OF_LIST()\n> +    }\n> +};\n> +\n> +static Property msf2_sysreg_properties[] = {\n> +    /* default divisors in Libero GUI */\n> +    DEFINE_PROP_UINT32(\"apb0divisor\", MSF2SysregState, apb0div, 2),\n> +    DEFINE_PROP_UINT32(\"apb1divisor\", MSF2SysregState, apb1div, 2),\n> +    DEFINE_PROP_END_OF_LIST(),\n> +};\n> +\n> +static void msf2_sysreg_class_init(ObjectClass *klass, void *data)\n> +{\n> +    DeviceClass *dc = DEVICE_CLASS(klass);\n> +\n> +    dc->vmsd = &vmstate_msf2_sysreg;\n> +    dc->reset = msf2_sysreg_reset;\n> +    dc->props = msf2_sysreg_properties;\n> +}\n> +\n> +static const TypeInfo msf2_sysreg_info = {\n> +    .name  = TYPE_MSF2_SYSREG,\n> +    .parent = TYPE_SYS_BUS_DEVICE,\n> +    .class_init = msf2_sysreg_class_init,\n> +    .instance_size  = sizeof(MSF2SysregState),\n> +    .instance_init = msf2_sysreg_init,\n> +};\n> +\n> +static void msf2_sysreg_register_types(void)\n> +{\n> +    type_register_static(&msf2_sysreg_info);\n> +}\n> +\n> +type_init(msf2_sysreg_register_types)\n> diff --git a/include/hw/misc/msf2-sysreg.h b/include/hw/misc/msf2-sysreg.h\n> new file mode 100644\n> index 0000000..f39cc41\n> --- /dev/null\n> +++ b/include/hw/misc/msf2-sysreg.h\n> @@ -0,0 +1,78 @@\n> +/*\n> + * Microsemi SmartFusion2 SYSREG\n> + *\n> + * Copyright (c) 2017 Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> + *\n> + * Permission is hereby granted, free of charge, to any person obtaining a copy\n> + * of this software and associated documentation files (the \"Software\"), to deal\n> + * in the Software without restriction, including without limitation the rights\n> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> + * copies of the Software, and to permit persons to whom the Software is\n> + * furnished to do so, subject to the following conditions:\n> + *\n> + * The above copyright notice and this permission notice shall be included in\n> + * all copies or substantial portions of the Software.\n> + *\n> + * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> + * THE SOFTWARE.\n> + */\n> +\n> +#ifndef HW_MSF2_SYSREG_H\n> +#define HW_MSF2_SYSREG_H\n> +\n> +#include \"hw/sysbus.h\"\n> +\n> +enum {\n> +    ESRAM_CR        = 0x00 / 4,\n> +    ESRAM_MAX_LAT,\n> +    DDR_CR,\n> +    ENVM_CR,\n> +    ENVM_REMAP_BASE_CR,\n> +    ENVM_REMAP_FAB_CR,\n> +    CC_CR,\n> +    CC_REGION_CR,\n> +    CC_LOCK_BASE_ADDR_CR,\n> +    CC_FLUSH_INDX_CR,\n> +    DDRB_BUF_TIMER_CR,\n> +    DDRB_NB_ADDR_CR,\n> +    DDRB_NB_SIZE_CR,\n> +    DDRB_CR,\n> +\n> +    SOFT_RESET_CR  = 0x48 / 4,\n> +    M3_CR,\n> +\n> +    GPIO_SYSRESET_SEL_CR = 0x58 / 4,\n> +\n> +    MDDR_CR = 0x60 / 4,\n> +\n> +    MSSDDR_PLL_STATUS_LOW_CR = 0x90 / 4,\n> +    MSSDDR_PLL_STATUS_HIGH_CR,\n> +    MSSDDR_FACC1_CR,\n> +    MSSDDR_FACC2_CR,\n> +\n> +    MSSDDR_PLL_STATUS = 0x150 / 4,\n> +\n> +};\n> +\n> +#define MSF2_SYSREG_MMIO_SIZE     0x300\n> +\n> +#define TYPE_MSF2_SYSREG          \"msf2-sysreg\"\n> +#define MSF2_SYSREG(obj)  OBJECT_CHECK(MSF2SysregState, (obj), TYPE_MSF2_SYSREG)\n> +\n> +typedef struct MSF2SysregState {\n> +    SysBusDevice parent_obj;\n> +\n> +    MemoryRegion iomem;\n> +\n> +    uint32_t apb0div;\n> +    uint32_t apb1div;\n> +\n> +    uint32_t regs[MSF2_SYSREG_MMIO_SIZE / 4];\n> +} MSF2SysregState;\n> +\n> +#endif /* HW_MSF2_SYSREG_H */\n> --\n> 2.5.0\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"qIXsZV8r\"; dkim-atps=neutral"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjyVm6hBCz9s83\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  1 Sep 2017 08:59:25 +1000 (AEST)","from localhost ([::1]:59685 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnYQh-00085W-PF\n\tfor incoming@patchwork.ozlabs.org; Thu, 31 Aug 2017 18:59:19 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:39466)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <alistair23@gmail.com>) id 1dnYQI-00084y-HZ\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 18:58:56 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <alistair23@gmail.com>) id 1dnYQH-0004uO-4H\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 18:58:54 -0400","from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:35924)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <alistair23@gmail.com>)\n\tid 1dnYQG-0004ty-Qb; Thu, 31 Aug 2017 18:58:53 -0400","by mail-wr0-x244.google.com with SMTP id 40so482516wrv.3;\n\tThu, 31 Aug 2017 15:58:52 -0700 (PDT)","by 10.28.191.130 with HTTP; Thu, 31 Aug 2017 15:58:20 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=mime-version:in-reply-to:references:from:date:message-id:subject:to\n\t:cc; bh=8WgloJuf6jRJSmw79sI39Xe1A8WyCVAz1lal+wEUHqk=;\n\tb=qIXsZV8rzlIil8iROfrgTM0QIPyzt/KWUii8VHz8ZvjUsF1yNFfPyXYsLoB6P0kYQt\n\t5M5qMyNKtEXNROE6HXvYjZRiHluZkpyfK4IKQcvgh1tT2uEMm0MJ9Kev14bABDJfne1i\n\tUNHqKv+65Ug+lPvwcmtKxATEZ+oMdYF0aaOeBSPTgvBDR8OJ0qsxctV7z2kHYrc8ULKd\n\tWnBv/7QuxOTY4fw+L/6p6ukZuz3RNhtQ8O76saucYcxhHt1HN+MONR53I3GA+bY/+VU+\n\tyZhOvnWcSzqDbkwmhC2IBxYGJiY1FFt4ZfZ7MnuJQ5ut4b38ATSofSlhhg4MsSr8QAvj\n\tpsxw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:in-reply-to:references:from:date\n\t:message-id:subject:to:cc;\n\tbh=8WgloJuf6jRJSmw79sI39Xe1A8WyCVAz1lal+wEUHqk=;\n\tb=rCJ31T29VLAYaenLZYBseh+Ord4H21S6MYjMsvRhmR/QiPc1wCE9sWptz3JfxYka+u\n\tG6LqUVRyKF+xGcYrQPn0QHHq0u5HhBg70H9QcVxxwJGDDAiYZk5q0OY11+2XqJASvnGk\n\tK+leymVDNEDot3Qdt0U8/IAeKnWdUFko2OJfSC0/olbZjEbpKASVaf1Iqz6hZD0Cri+K\n\tHQ5XRk92ATiKw7Fa6FbMblKx3DNu/8HI+bOYcq0WyBmWfLQScbtPNkTh58FbfukPc4ci\n\tv0OgjB+IBdCHcWz3+0tO/KkrKAu5K+OVpzOuZQnBB1iVXU8SKEQStVcSQLjs8T+m6O7o\n\tnn7w==","X-Gm-Message-State":"AHPjjUiRZNd/1jH0/WWao4hP7RAn+1Ye7pAFUlQVbX9+kJ7frWQ85QM8\n\t+FRXJS2XeghZrVImN0v+yEKFKFc2oQ==","X-Google-Smtp-Source":"ADKCNb4upm/37eL03uTofAialeP0KMdu871ufgBe/xEdQt3IsdFFlm7gLLB9Zj1LOTq3OKhgzZs5a1j2aeiRFALTHvI=","X-Received":"by 10.223.163.87 with SMTP id d23mr16601wrb.84.1504220331502;\n\tThu, 31 Aug 2017 15:58:51 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<1503938283-12404-3-git-send-email-sundeep.lkml@gmail.com>","References":"<1503938283-12404-1-git-send-email-sundeep.lkml@gmail.com>\n\t<1503938283-12404-3-git-send-email-sundeep.lkml@gmail.com>","From":"Alistair Francis <alistair23@gmail.com>","Date":"Thu, 31 Aug 2017 15:58:20 -0700","Message-ID":"<CAKmqyKOva-ojPqFh6bqhRbJAwi3z2FB0YTB8icv5gLzdUNm7Zw@mail.gmail.com>","To":"Subbaraya Sundeep <sundeep.lkml@gmail.com>","Content-Type":"text/plain; charset=\"UTF-8\"","X-detected-operating-system":"by eggs.gnu.org: Genre and OS details not\n\trecognized.","X-Received-From":"2a00:1450:400c:c0c::244","Subject":"Re: [Qemu-devel] [Qemu devel v7 PATCH 2/5] msf2: Microsemi\n\tSmartfusion2 System Register block","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Peter Maydell <peter.maydell@linaro.org>, =?utf-8?q?Philippe_Mathieu-D?=\n\t=?utf-8?b?YXVkw6k=?= <f4bug@amsat.org>, \tqemu-arm <qemu-arm@nongnu.org>,\n\t\"qemu-devel@nongnu.org Developers\" <qemu-devel@nongnu.org>, \n\tPeter Crosthwaite <crosthwaite.peter@gmail.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"}},{"id":1761478,"web_url":"http://patchwork.ozlabs.org/comment/1761478/","msgid":"<CALHRZuqj+tp5rGfJJj+2iV1Z6H4FZJZm8w_DeePccxFAL5dGCA@mail.gmail.com>","list_archive_url":null,"date":"2017-09-01T06:03:29","subject":"Re: [Qemu-devel] [Qemu devel v7 PATCH 2/5] msf2: Microsemi\n\tSmartfusion2 System Register block","submitter":{"id":64324,"url":"http://patchwork.ozlabs.org/api/people/64324/","name":"sundeep subbaraya","email":"sundeep.lkml@gmail.com"},"content":"Hi Alistair,\n\nOn Fri, Sep 1, 2017 at 4:28 AM, Alistair Francis <alistair23@gmail.com>\nwrote:\n\n> On Mon, Aug 28, 2017 at 9:38 AM, Subbaraya Sundeep\n> <sundeep.lkml@gmail.com> wrote:\n> > Added Sytem register block of Smartfusion2.\n> > This block has PLL registers which are accessed by guest.\n> >\n> > Signed-off-by: Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> > ---\n> >  hw/misc/Makefile.objs         |   1 +\n> >  hw/misc/msf2-sysreg.c         | 199 ++++++++++++++++++++++++++++++\n> ++++++++++++\n> >  include/hw/misc/msf2-sysreg.h |  78 +++++++++++++++++\n> >  3 files changed, 278 insertions(+)\n> >  create mode 100644 hw/misc/msf2-sysreg.c\n> >  create mode 100644 include/hw/misc/msf2-sysreg.h\n> >\n> > diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs\n> > index 29fb922..e8f0a02 100644\n> > --- a/hw/misc/Makefile.objs\n> > +++ b/hw/misc/Makefile.objs\n> > @@ -59,3 +59,4 @@ obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o\n> >  obj-$(CONFIG_AUX) += auxbus.o\n> >  obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o\n> >  obj-y += mmio_interface.o\n> > +obj-$(CONFIG_MSF2) += msf2-sysreg.o\n> > diff --git a/hw/misc/msf2-sysreg.c b/hw/misc/msf2-sysreg.c\n> > new file mode 100644\n> > index 0000000..2aeb555\n> > --- /dev/null\n> > +++ b/hw/misc/msf2-sysreg.c\n> > @@ -0,0 +1,199 @@\n> > +/*\n> > + * System Register block model of Microsemi SmartFusion2.\n> > + *\n> > + * Copyright (c) 2017 Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> > + *\n> > + * This program is free software; you can redistribute it and/or\n> > + * modify it under the terms of the GNU General Public License\n> > + * as published by the Free Software Foundation; either version\n> > + * 2 of the License, or (at your option) any later version.\n> > + *\n> > + * You should have received a copy of the GNU General Public License\n> along\n> > + * with this program; if not, see <http://www.gnu.org/licenses/>.\n> > + */\n> > +\n> > +#include \"qemu/osdep.h\"\n> > +#include \"qemu/log.h\"\n> > +#include \"hw/misc/msf2-sysreg.h\"\n> > +\n> > +#ifndef MSF2_SYSREG_ERR_DEBUG\n> > +#define MSF2_SYSREG_ERR_DEBUG  0\n> > +#endif\n> > +\n> > +#define DB_PRINT_L(lvl, fmt, args...) do { \\\n> > +    if (MSF2_SYSREG_ERR_DEBUG >= lvl) { \\\n> > +        qemu_log(\"%s: \" fmt \"\\n\", __func__, ## args); \\\n> > +    } \\\n> > +} while (0);\n> > +\n> > +#define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args)\n> > +\n> > +static inline int msf2_divbits(uint32_t div)\n> > +{\n> > +    int ret = 0;\n> > +\n> > +    switch (div) {\n> > +    case 1:\n> > +        ret = 0;\n> > +        break;\n> > +    case 2:\n> > +        ret = 1;\n> > +        break;\n> > +    case 4:\n> > +        ret = 2;\n> > +        break;\n> > +    case 8:\n> > +        ret = 4;\n> > +        break;\n> > +    case 16:\n> > +        ret = 5;\n> > +        break;\n> > +    case 32:\n> > +        ret = 6;\n> > +        break;\n> > +    default:\n> > +        break;\n> > +    }\n> > +\n> > +    return ret;\n> > +}\n> > +\n> > +static void msf2_sysreg_reset(DeviceState *d)\n> > +{\n> > +    MSF2SysregState *s = MSF2_SYSREG(d);\n> > +\n> > +    DB_PRINT(\"RESET\");\n> > +\n> > +    s->regs[MSSDDR_PLL_STATUS_LOW_CR] = 0x021A2358;\n> > +    s->regs[MSSDDR_PLL_STATUS] = 0x3;\n> > +    s->regs[MSSDDR_FACC1_CR] = msf2_divbits(s->apb0div) << 5 |\n> > +                               msf2_divbits(s->apb1div) << 2;\n> > +}\n> > +\n> > +static uint64_t msf2_sysreg_read(void *opaque, hwaddr offset,\n> > +    unsigned size)\n> > +{\n> > +    MSF2SysregState *s = opaque;\n> > +    uint32_t ret = 0;\n> > +\n> > +    offset >>= 2;\n> > +    if (offset < ARRAY_SIZE(s->regs)) {\n> > +        ret = s->regs[offset];\n> > +        DB_PRINT(\"addr: 0x%08\" HWADDR_PRIx \" data: 0x%08\" PRIx32,\n> > +                    offset << 2, ret);\n> > +    } else {\n> > +        qemu_log_mask(LOG_GUEST_ERROR,\n> > +                    \"%s: Bad offset 0x%08\" HWADDR_PRIx \"\\n\", __func__,\n> > +                    offset << 2);\n> > +    }\n> > +\n> > +    return ret;\n> > +}\n> > +\n> > +static void msf2_sysreg_write(void *opaque, hwaddr offset,\n> > +                          uint64_t val, unsigned size)\n> > +{\n> > +    MSF2SysregState *s = (MSF2SysregState *)opaque;\n>\n> Drop this cast\n>\n\nYeah ok.\n\n>\n> > +    uint32_t newval = val;\n> > +    uint32_t oldval;\n> > +\n> > +    DB_PRINT(\"addr: 0x%08\" HWADDR_PRIx \" data: 0x%08\" PRIx64,\n> > +            offset, val);\n> > +\n> > +    offset >>= 2;\n> > +\n> > +    switch (offset) {\n> > +    case MSSDDR_PLL_STATUS:\n> > +        break;\n> > +\n> > +    case ESRAM_CR:\n> > +        oldval = s->regs[ESRAM_CR];\n> > +        if (oldval ^ newval) {\n>\n> Isn't this just:\n> if (newval != s->regs[ESRAM_CR])\n>\n> I think putting it all in the if makes it clearer.\n>\n\nOk will change.\n\n>\n> > +            qemu_log_mask(LOG_GUEST_ERROR,\n> > +                       TYPE_MSF2_SYSREG\": eSRAM remapping not\n> supported\\n\");\n> > +        }\n> > +        break;\n> > +\n> > +    case DDR_CR:\n> > +        oldval = s->regs[DDR_CR];\n> > +        if (oldval ^ newval) {\n> > +            qemu_log_mask(LOG_GUEST_ERROR,\n> > +                       TYPE_MSF2_SYSREG\": DDR remapping not\n> supported\\n\");\n> > +        }\n> > +        break;\n> > +\n> > +    case ENVM_REMAP_BASE_CR:\n> > +        oldval = s->regs[ENVM_REMAP_BASE_CR];\n> > +        if (oldval ^ newval) {\n> > +            qemu_log_mask(LOG_GUEST_ERROR,\n> > +                       TYPE_MSF2_SYSREG\": eNVM remapping not\n> supported\\n\");\n> > +        }\n> > +        break;\n> > +\n> > +    default:\n> > +        if (offset < ARRAY_SIZE(s->regs)) {\n> > +            s->regs[offset] = val;\n>\n> Use newval instead.\n>\n\nOk\n\n>\n> With those all fixed up you can include this in the next version:\n>\n> Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>\n>\n> Thanks,\n> Alistair\n>\n\nThank you,\nSundeep\n\n>\n>\n> > +        } else {\n> > +            qemu_log_mask(LOG_GUEST_ERROR,\n> > +                        \"%s: Bad offset 0x%08\" HWADDR_PRIx \"\\n\",\n> __func__,\n> > +                        offset << 2);\n> > +        }\n> > +        break;\n> > +    }\n> > +}\n> > +\n> > +static const MemoryRegionOps sysreg_ops = {\n> > +    .read = msf2_sysreg_read,\n> > +    .write = msf2_sysreg_write,\n> > +    .endianness = DEVICE_NATIVE_ENDIAN,\n> > +};\n> > +\n> > +static void msf2_sysreg_init(Object *obj)\n> > +{\n> > +    MSF2SysregState *s = MSF2_SYSREG(obj);\n> > +\n> > +    memory_region_init_io(&s->iomem, obj, &sysreg_ops, s,\n> TYPE_MSF2_SYSREG,\n> > +                          MSF2_SYSREG_MMIO_SIZE);\n> > +    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);\n> > +}\n> > +\n> > +static const VMStateDescription vmstate_msf2_sysreg = {\n> > +    .name = TYPE_MSF2_SYSREG,\n> > +    .version_id = 1,\n> > +    .minimum_version_id = 1,\n> > +    .fields = (VMStateField[]) {\n> > +        VMSTATE_UINT32_ARRAY(regs, MSF2SysregState,\n> MSF2_SYSREG_MMIO_SIZE / 4),\n> > +        VMSTATE_END_OF_LIST()\n> > +    }\n> > +};\n> > +\n> > +static Property msf2_sysreg_properties[] = {\n> > +    /* default divisors in Libero GUI */\n> > +    DEFINE_PROP_UINT32(\"apb0divisor\", MSF2SysregState, apb0div, 2),\n> > +    DEFINE_PROP_UINT32(\"apb1divisor\", MSF2SysregState, apb1div, 2),\n> > +    DEFINE_PROP_END_OF_LIST(),\n> > +};\n> > +\n> > +static void msf2_sysreg_class_init(ObjectClass *klass, void *data)\n> > +{\n> > +    DeviceClass *dc = DEVICE_CLASS(klass);\n> > +\n> > +    dc->vmsd = &vmstate_msf2_sysreg;\n> > +    dc->reset = msf2_sysreg_reset;\n> > +    dc->props = msf2_sysreg_properties;\n> > +}\n> > +\n> > +static const TypeInfo msf2_sysreg_info = {\n> > +    .name  = TYPE_MSF2_SYSREG,\n> > +    .parent = TYPE_SYS_BUS_DEVICE,\n> > +    .class_init = msf2_sysreg_class_init,\n> > +    .instance_size  = sizeof(MSF2SysregState),\n> > +    .instance_init = msf2_sysreg_init,\n> > +};\n> > +\n> > +static void msf2_sysreg_register_types(void)\n> > +{\n> > +    type_register_static(&msf2_sysreg_info);\n> > +}\n> > +\n> > +type_init(msf2_sysreg_register_types)\n> > diff --git a/include/hw/misc/msf2-sysreg.h\n> b/include/hw/misc/msf2-sysreg.h\n> > new file mode 100644\n> > index 0000000..f39cc41\n> > --- /dev/null\n> > +++ b/include/hw/misc/msf2-sysreg.h\n> > @@ -0,0 +1,78 @@\n> > +/*\n> > + * Microsemi SmartFusion2 SYSREG\n> > + *\n> > + * Copyright (c) 2017 Subbaraya Sundeep <sundeep.lkml@gmail.com>\n> > + *\n> > + * Permission is hereby granted, free of charge, to any person\n> obtaining a copy\n> > + * of this software and associated documentation files (the\n> \"Software\"), to deal\n> > + * in the Software without restriction, including without limitation\n> the rights\n> > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or\n> sell\n> > + * copies of the Software, and to permit persons to whom the Software is\n> > + * furnished to do so, subject to the following conditions:\n> > + *\n> > + * The above copyright notice and this permission notice shall be\n> included in\n> > + * all copies or substantial portions of the Software.\n> > + *\n> > + * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR\n> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY,\n> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n> SHALL\n> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n> OTHER\n> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n> ARISING FROM,\n> > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n> DEALINGS IN\n> > + * THE SOFTWARE.\n> > + */\n> > +\n> > +#ifndef HW_MSF2_SYSREG_H\n> > +#define HW_MSF2_SYSREG_H\n> > +\n> > +#include \"hw/sysbus.h\"\n> > +\n> > +enum {\n> > +    ESRAM_CR        = 0x00 / 4,\n> > +    ESRAM_MAX_LAT,\n> > +    DDR_CR,\n> > +    ENVM_CR,\n> > +    ENVM_REMAP_BASE_CR,\n> > +    ENVM_REMAP_FAB_CR,\n> > +    CC_CR,\n> > +    CC_REGION_CR,\n> > +    CC_LOCK_BASE_ADDR_CR,\n> > +    CC_FLUSH_INDX_CR,\n> > +    DDRB_BUF_TIMER_CR,\n> > +    DDRB_NB_ADDR_CR,\n> > +    DDRB_NB_SIZE_CR,\n> > +    DDRB_CR,\n> > +\n> > +    SOFT_RESET_CR  = 0x48 / 4,\n> > +    M3_CR,\n> > +\n> > +    GPIO_SYSRESET_SEL_CR = 0x58 / 4,\n> > +\n> > +    MDDR_CR = 0x60 / 4,\n> > +\n> > +    MSSDDR_PLL_STATUS_LOW_CR = 0x90 / 4,\n> > +    MSSDDR_PLL_STATUS_HIGH_CR,\n> > +    MSSDDR_FACC1_CR,\n> > +    MSSDDR_FACC2_CR,\n> > +\n> > +    MSSDDR_PLL_STATUS = 0x150 / 4,\n> > +\n> > +};\n> > +\n> > +#define MSF2_SYSREG_MMIO_SIZE     0x300\n> > +\n> > +#define TYPE_MSF2_SYSREG          \"msf2-sysreg\"\n> > +#define MSF2_SYSREG(obj)  OBJECT_CHECK(MSF2SysregState, (obj),\n> TYPE_MSF2_SYSREG)\n> > +\n> > +typedef struct MSF2SysregState {\n> > +    SysBusDevice parent_obj;\n> > +\n> > +    MemoryRegion iomem;\n> > +\n> > +    uint32_t apb0div;\n> > +    uint32_t apb1div;\n> > +\n> > +    uint32_t regs[MSF2_SYSREG_MMIO_SIZE / 4];\n> > +} MSF2SysregState;\n> > +\n> > +#endif /* HW_MSF2_SYSREG_H */\n> > --\n> > 2.5.0\n> >\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"Fr7f7wTE\"; dkim-atps=neutral"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xk7wn04DWz9s8J\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  1 Sep 2017 16:04:05 +1000 (AEST)","from localhost ([::1]:49264 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnf3i-0006zM-Vb\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 02:04:02 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:48123)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <sundeep.lkml@gmail.com>) id 1dnf3G-0006xO-W2\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 02:03:37 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <sundeep.lkml@gmail.com>) id 1dnf3E-0002ft-8l\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 02:03:35 -0400","from mail-ua0-x242.google.com ([2607:f8b0:400c:c08::242]:35164)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <sundeep.lkml@gmail.com>)\n\tid 1dnf3E-0002fJ-2I; Fri, 01 Sep 2017 02:03:32 -0400","by mail-ua0-x242.google.com with SMTP id g47so423488uad.2;\n\tThu, 31 Aug 2017 23:03:30 -0700 (PDT)","by 10.176.75.196 with HTTP; Thu, 31 Aug 2017 23:03:29 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=mime-version:in-reply-to:references:from:date:message-id:subject:to\n\t:cc; bh=rff6hElAiLw63WL5zUW3yfzRloDLuEmPtyDD1/hLUGY=;\n\tb=Fr7f7wTE0lGWPe1sdDBCx1lP6UhEwPwClELEFT22vii5tQrSKRiKLGO20I7vJ+kdx2\n\tZ2PhxzhoAWafk1u+Tj507iQutdi2mhPaGA3pqciNjR04orvg8aphbREZUG4BDlmcgO2l\n\tCTcWjD9ouS1VeTKZrcA4LCrvJpjvW+Po5IUV/HA0dvzgjNrqCtB7jmA79p6QHfGcQYDr\n\t0QmJRdrDxxSoB8I2wdclqiEYBpcFHZdMbeFM/z0Azhen/Y4KmumeZMzk5NL6hE0TSp64\n\t618kOeJ0qlUTYkfzI9/N4FGXvRxHK8EcBBRQ214hte0S730ligyeuerlMlH7/gEXLn8w\n\tjjlQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:in-reply-to:references:from:date\n\t:message-id:subject:to:cc;\n\tbh=rff6hElAiLw63WL5zUW3yfzRloDLuEmPtyDD1/hLUGY=;\n\tb=DkMaeLYzeF8r3YtZSW1AJCGrISvyQr66OliZnk/lkv18ZDrJ3e2heyxK5IwT8p0aWt\n\ta59VEhANs3YC1BPdJf6wec0YcxCVoTj3EDUoYu9N816/GrGgjIFxVNaqot+VtSElc8Yh\n\tVyMYctqP/TNdnyq2hVr9Y3ewaWgNirtTltpbDHQjrU/lUw1feiWx0TL7TbqWLsmWCPPf\n\t4igc3RlQMCD+hajOeFsHBUydeQpJlKQsM3oJMf1CMTTGtzHzN5XXjuD1zW2mNrQGGz2l\n\tRT7J6Ob/7kEwChzCVxGje8YWELo8PiaJvNGztSJ1lhW8mWadXyB/rof6Wa6cqsquC7pd\n\tLFHA==","X-Gm-Message-State":"AHPjjUhyVLYQi8zU+ZMK+iH3AzPWR3ySW9BbekxLL9dOd4MWz5VZZIl2\n\t/Ev4ZA2p7RTJiU83bshIa7zBXeJVTQ==","X-Google-Smtp-Source":"ADKCNb5SpOHGe8HSbe9DUE0nN3ODgMGgds1qDft+o/KvwUc1IDfOUd4Hj7i2Zx5nBrhhY7bt8DEZKTBJ73C+P2hgREI=","X-Received":"by 10.176.68.102 with SMTP id m93mr435861uam.133.1504245810087; \n\tThu, 31 Aug 2017 23:03:30 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<CAKmqyKOva-ojPqFh6bqhRbJAwi3z2FB0YTB8icv5gLzdUNm7Zw@mail.gmail.com>","References":"<1503938283-12404-1-git-send-email-sundeep.lkml@gmail.com>\n\t<1503938283-12404-3-git-send-email-sundeep.lkml@gmail.com>\n\t<CAKmqyKOva-ojPqFh6bqhRbJAwi3z2FB0YTB8icv5gLzdUNm7Zw@mail.gmail.com>","From":"sundeep subbaraya <sundeep.lkml@gmail.com>","Date":"Fri, 1 Sep 2017 11:33:29 +0530","Message-ID":"<CALHRZuqj+tp5rGfJJj+2iV1Z6H4FZJZm8w_DeePccxFAL5dGCA@mail.gmail.com>","To":"Alistair Francis <alistair23@gmail.com>","X-detected-operating-system":"by eggs.gnu.org: Genre and OS details not\n\trecognized.","X-Received-From":"2607:f8b0:400c:c08::242","Content-Type":"text/plain; charset=\"UTF-8\"","X-Content-Filtered-By":"Mailman/MimeDel 2.1.21","Subject":"Re: [Qemu-devel] [Qemu devel v7 PATCH 2/5] msf2: Microsemi\n\tSmartfusion2 System Register block","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Peter Maydell <peter.maydell@linaro.org>, =?utf-8?q?Philippe_Mathieu-D?=\n\t=?utf-8?b?YXVkw6k=?= <f4bug@amsat.org>, \tqemu-arm <qemu-arm@nongnu.org>,\n\t\"qemu-devel@nongnu.org Developers\" <qemu-devel@nongnu.org>, \n\tPeter Crosthwaite <crosthwaite.peter@gmail.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"}}]