From patchwork Fri Jan 25 08:19:56 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuo-Jung Su X-Patchwork-Id: 215580 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BE1D32C0092 for ; Fri, 25 Jan 2013 19:24:38 +1100 (EST) Received: from localhost ([::1]:32810 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyeaS-00042X-TI for incoming@patchwork.ozlabs.org; Fri, 25 Jan 2013 03:24:36 -0500 Received: from eggs.gnu.org ([208.118.235.92]:44890) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyeXT-00069s-5E for qemu-devel@nongnu.org; Fri, 25 Jan 2013 03:21:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TyeXK-0008KQ-Q3 for qemu-devel@nongnu.org; Fri, 25 Jan 2013 03:21:31 -0500 Received: from mail-pa0-f41.google.com ([209.85.220.41]:64448) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyeXK-0008KI-Gc for qemu-devel@nongnu.org; Fri, 25 Jan 2013 03:21:22 -0500 Received: by mail-pa0-f41.google.com with SMTP id bj3so127998pad.0 for ; Fri, 25 Jan 2013 00:21:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:in-reply-to:references; bh=TXEIlHEUNha+Qcf3apkqZhAl2JA3CaaThVKRp42Sn4Y=; b=Y5mzobGPAPBUDm60IyQkSW1rMgU7ENmspwGjQ51wqvvPmKtN2S6vnOzAFN93N8UWCX mW0h3nwcJhmjCla7XCP29LuknA64iasUCYMa5egsY/J4soLN7oYIBhzc3rbxilS2a2Eq 7AInLLoISs8oOnrPfWY+6+dRNDRRVgglUEaLrF7cIMaPzjuIeUBsPPQjaPbfaTMfjQkl 76jstp82IqV0R+LqpwcJDmyFiw3fkdzOKHwy6ldPxI2TpRpVuJ5gklUwbqBV7jeYS9Jn DgOoRxo9mKo6STrAOgb9eofniqOqin57evxYEkLZs0V6kvcJSutQEGCE/9R11vUF/X/O 4I5Q== X-Received: by 10.68.254.137 with SMTP id ai9mr12281488pbd.21.1359102081912; Fri, 25 Jan 2013 00:21:21 -0800 (PST) Received: from localhost.localdomain ([220.132.37.35]) by mx.google.com with ESMTPS id uh9sm246180pbc.65.2013.01.25.00.21.18 (version=TLSv1 cipher=DES-CBC3-SHA bits=168/168); Fri, 25 Jan 2013 00:21:21 -0800 (PST) From: Kuo-Jung Su To: qemu-devel@nongnu.org Date: Fri, 25 Jan 2013 16:19:56 +0800 Message-Id: <1359101996-11667-21-git-send-email-dantesu@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1359101996-11667-1-git-send-email-dantesu@gmail.com> References: <1359101996-11667-1-git-send-email-dantesu@gmail.com> In-Reply-To: <1358490506-18281-1-git-send-email-dantesu@faraday-tech.com> References: <1358490506-18281-1-git-send-email-dantesu@faraday-tech.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.220.41 Cc: peter.maydell@linaro.org, blauwirbel@gmail.com, paul@codesourcery.com, Kuo-Jung Su , afaerber@suse.de, fred.konrad@greensocs.com Subject: [Qemu-devel] [PATCH v2 20/20] arm: add generic ROM model for Faraday SoC platforms X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Kuo-Jung Su Since the NAND and SPI flash memories do not support random access, so most of the systems which use such memory as main storages usually has some bootstrap code stored inside the embedded ROM of its SoC, and the bootstrap code is responsible for SDRAM initialization and then load the specific software(i.e. u-boot/linux) into SDRAM, and finally jumps into the loaded primary software. This QEMU model simply emulates the behavior of the embedded ROM for bootstrap code execution. Signed-off-by: Kuo-Jung Su --- hw/rom.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 hw/rom.c diff --git a/hw/rom.c b/hw/rom.c new file mode 100644 index 0000000..aff2666 --- /dev/null +++ b/hw/rom.c @@ -0,0 +1,119 @@ +/* + * QEMU model of ROM + * + * Copyright (C) 2012 Faraday Technology + * Written by Dante Su + * + * This file is licensed under GNU GPL v2. + */ + +#include "sysbus.h" +#include "sysemu/sysemu.h" +#include "sysemu/blockdev.h" + +#define TYPE_ROM "rom" + +typedef struct ROMState { + SysBusDevice busdev; + MemoryRegion mem; + MemoryRegion *mem_mappings; /* array; one per mapping */ + MemoryRegion orig_mem; + BlockDriverState *bdrv; + uint8_t *storage; + uint32_t size; +} rom_state; + +#define ROM(obj) \ + OBJECT_CHECK(rom_state, obj, TYPE_ROM) + +static uint64_t +rom_mem_read(void *opaque, hwaddr addr, unsigned int size) +{ + return 0; +} + +static void +rom_mem_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) +{ +} + +static const MemoryRegionOps rom_ops = { + .read = rom_mem_read, + .write = rom_mem_write, + .endianness = DEVICE_NATIVE_ENDIAN, + .valid = { + .min_access_size = 1, + .max_access_size = 8 + } +}; + +static int rom_init(SysBusDevice *dev) +{ + rom_state *s = ROM(FROM_SYSBUS(rom_state, dev)); + DriveInfo *dinfo; + + memory_region_init_rom_device(&s->orig_mem, &rom_ops, s, "rom", s->size); + vmstate_register_ram(&s->orig_mem, DEVICE(s)); + s->storage = memory_region_get_ram_ptr(&s->orig_mem); + + dinfo = drive_get_next(IF_PFLASH); + if (dinfo && dinfo->bdrv) { + s->bdrv = dinfo->bdrv; + /* read the initial flash content */ + bdrv_read(s->bdrv, 0, s->storage, + DIV_ROUND_UP(s->size, BDRV_SECTOR_SIZE)); + } else { + memset(s->storage, 0x00, s->size); + } + + memory_region_init(&s->mem, "rom", s->size); + s->mem_mappings = g_new(MemoryRegion, 1); + memory_region_init_alias(&s->mem_mappings[0], + "rom-alias", + &s->orig_mem, + 0, + s->size); + memory_region_add_subregion(&s->mem, 0, &s->mem_mappings[0]); + + sysbus_init_mmio(dev, &s->mem); + return 0; +} + +static Property rom_properties[] = { + DEFINE_PROP_UINT32("size", rom_state, size, 16384), + DEFINE_PROP_END_OF_LIST(), +}; + +static const VMStateDescription vmstate_rom = { + .name = "rom", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField[]) { + VMSTATE_END_OF_LIST() + } +}; + +static void rom_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); + + k->init = rom_init; + dc->props = rom_properties; + dc->vmsd = &vmstate_rom; +} + +static const TypeInfo rom_info = { + .name = TYPE_ROM, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(rom_state), + .class_init = rom_class_init, +}; + +static void rom_register_types(void) +{ + type_register_static(&rom_info); +} + +type_init(rom_register_types)