From patchwork Sat Oct 19 17:04:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roy Franz X-Patchwork-Id: 21190 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f199.google.com (mail-ie0-f199.google.com [209.85.223.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id E8FFA244CE for ; Sat, 19 Oct 2013 17:04:46 +0000 (UTC) Received: by mail-ie0-f199.google.com with SMTP id qd12sf14069384ieb.2 for ; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:x-gm-message-state:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=n+e7+Or7rjAxME6uCEQgsq2KeqQwQcOdH2mlaQ6RE2k=; b=QnJNB5i1axIKK8YR+fFURzGpQbJFZCmHhxk3+zLwSUlNJmUfThORl9d7akgOpTlLH7 sivGpWfabzGBuLisa0eqtC44l7eAvynW27/12+J4QmZ3L8UmIXDZpOeufGtsS9we6jjr iAv8ogrFzH7cFzGQZR5nyAnWzMbq7XGR4WlEAFif9SNfrvsXpBxEKaNMFrpxnUdCXIav ltXcTZy0V6FtVXS9YXtMF0390teXXMiuczlbZfUtPv5acI6sNV4uP/Y6q4qieERnehB6 bbiF0VVOcU9rP6t+2KZIuidzzHHB3f3B9xWQwB0j/nk5mZvIrbnj4h8X2dEmkd6DCNcE yxYA== X-Received: by 10.43.114.67 with SMTP id ez3mr2830740icc.6.1382202285446; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.104.177 with SMTP id gf17ls1629936qeb.4.gmail; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) X-Received: by 10.220.183.199 with SMTP id ch7mr182350vcb.27.1382202285343; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) Received: from mail-vb0-f53.google.com (mail-vb0-f53.google.com [209.85.212.53]) by mx.google.com with ESMTPS id d2si2017573vei.69.2013.10.19.10.04.45 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 19 Oct 2013 10:04:45 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.212.53 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.212.53; Received: by mail-vb0-f53.google.com with SMTP id i3so2610060vbh.40 for ; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) X-Gm-Message-State: ALoCoQkeGItQCduG4t+JEiLaiwPMOl1vuHjdjJhmxvETe0Hw38BgWE+BCqklZTo8CPoXYWJRoU8k X-Received: by 10.220.184.70 with SMTP id cj6mr279589vcb.23.1382202285199; Sat, 19 Oct 2013 10:04:45 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.174.196 with SMTP id u4csp43179vcz; Sat, 19 Oct 2013 10:04:44 -0700 (PDT) X-Received: by 10.67.30.100 with SMTP id kd4mr9582438pad.24.1382202283463; Sat, 19 Oct 2013 10:04:43 -0700 (PDT) Received: from mail-pb0-f46.google.com (mail-pb0-f46.google.com [209.85.160.46]) by mx.google.com with ESMTPS id n5si4619514pav.69.2013.10.19.10.04.43 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 19 Oct 2013 10:04:43 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.160.46 is neither permitted nor denied by best guess record for domain of roy.franz@linaro.org) client-ip=209.85.160.46; Received: by mail-pb0-f46.google.com with SMTP id rq2so5164706pbb.19 for ; Sat, 19 Oct 2013 10:04:43 -0700 (PDT) X-Received: by 10.68.131.165 with SMTP id on5mr1627081pbb.165.1382202283082; Sat, 19 Oct 2013 10:04:43 -0700 (PDT) Received: from rfranz-i7.local (c-98-244-40-86.hsd1.ca.comcast.net. [98.244.40.86]) by mx.google.com with ESMTPSA id va8sm9864513pbc.16.2013.10.19.10.04.41 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 19 Oct 2013 10:04:42 -0700 (PDT) From: Roy Franz To: qemu-devel@nongnu.org, kwolf@redhat.com, stefanha@redhat.com Cc: peter.maydell@linaro.org, patches@linaro.org, Roy Franz Subject: [PATCH 1/2 v3] block: Add device-width property to pflash_cfi01 Date: Sat, 19 Oct 2013 10:04:33 -0700 Message-Id: <1382202274-8190-2-git-send-email-roy.franz@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1382202274-8190-1-git-send-email-roy.franz@linaro.org> References: <1382202274-8190-1-git-send-email-roy.franz@linaro.org> X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: roy.franz@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.53 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The width of the devices that make up the flash interface is required to mask certain commands, in particular the write length for buffered writes. This length will be presented to each device on the interface by the program writing the flash, and the flash emulation code needs to be able to determine the length of the write as recieved by each flash device. The device-width defaults to the bank width which should maintain existing behavior for platforms that don't need this change. This change is required to support buffered writes on the vexpress platform that has a 32 bit flash interface with 2 16 bit devices on it. Signed-off-by: Roy Franz --- hw/block/pflash_cfi01.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 018a967..cda8289 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -71,7 +71,8 @@ struct pflash_t { BlockDriverState *bs; uint32_t nb_blocs; uint64_t sector_len; - uint8_t width; + uint8_t bank_width; + uint8_t device_width; uint8_t be; uint8_t wcycle; /* if 0, the flash is read normally */ int ro; @@ -126,9 +127,9 @@ static uint32_t pflash_read (pflash_t *pfl, hwaddr offset, ret = -1; boff = offset & 0xFF; /* why this here ?? */ - if (pfl->width == 2) + if (pfl->bank_width == 2) boff = boff >> 1; - else if (pfl->width == 4) + else if (pfl->bank_width == 4) boff = boff >> 2; #if 0 @@ -378,6 +379,8 @@ static void pflash_write(pflash_t *pfl, hwaddr offset, break; case 0xe8: + /* Mask writeblock size based on device width */ + value &= (1ULL << (pfl->device_width * 8)) - 1; DPRINTF("%s: block write of %x bytes\n", __func__, value); pfl->counter = value; pfl->wcycle++; @@ -665,7 +668,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp) pfl->cfi_table[0x28] = 0x02; pfl->cfi_table[0x29] = 0x00; /* Max number of bytes in multi-bytes write */ - if (pfl->width == 1) { + if (pfl->bank_width == 1) { pfl->cfi_table[0x2A] = 0x08; } else { pfl->cfi_table[0x2A] = 0x0B; @@ -706,7 +709,8 @@ static Property pflash_cfi01_properties[] = { DEFINE_PROP_DRIVE("drive", struct pflash_t, bs), DEFINE_PROP_UINT32("num-blocks", struct pflash_t, nb_blocs, 0), DEFINE_PROP_UINT64("sector-length", struct pflash_t, sector_len, 0), - DEFINE_PROP_UINT8("width", struct pflash_t, width, 0), + DEFINE_PROP_UINT8("width", struct pflash_t, bank_width, 0), + DEFINE_PROP_UINT8("device-width", struct pflash_t, device_width, 0), DEFINE_PROP_UINT8("big-endian", struct pflash_t, be, 0), DEFINE_PROP_UINT16("id0", struct pflash_t, ident0, 0), DEFINE_PROP_UINT16("id1", struct pflash_t, ident1, 0), @@ -745,8 +749,8 @@ pflash_t *pflash_cfi01_register(hwaddr base, DeviceState *qdev, const char *name, hwaddr size, BlockDriverState *bs, - uint32_t sector_len, int nb_blocs, int width, - uint16_t id0, uint16_t id1, + uint32_t sector_len, int nb_blocs, + int bank_width, uint16_t id0, uint16_t id1, uint16_t id2, uint16_t id3, int be) { DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH01); @@ -756,7 +760,8 @@ pflash_t *pflash_cfi01_register(hwaddr base, } qdev_prop_set_uint32(dev, "num-blocks", nb_blocs); qdev_prop_set_uint64(dev, "sector-length", sector_len); - qdev_prop_set_uint8(dev, "width", width); + qdev_prop_set_uint8(dev, "width", bank_width); + qdev_prop_set_uint8(dev, "device-width", bank_width); qdev_prop_set_uint8(dev, "big-endian", !!be); qdev_prop_set_uint16(dev, "id0", id0); qdev_prop_set_uint16(dev, "id1", id1);