From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561667804; cv=none; d=zoho.com; s=zohoarc; b=Hz/nmnxNyyngAJWqMteiNGrJs8JVKUMyEpS3wME0nT6oFWaUBtUwSFTpSlcFWH9Rbuov9V/yODlcnjWyI0Cn9eRUY5jH7UQ0SkfxYnTsocRhKeahz2aYQGAraMvcDYYkXHFiQlHu08L2nZdcAULThO99C1jWnjsXO9MGu4kMr1M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561667804; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=c5QsuRAXTMyJyVFncCnrVZJJv9NphlpgcvINOXi+MlI=; b=CZNOBxefTo4CPVbDjwa0CUcfOjTMp2qDOjA+c32Wuc4LmFZk3n6o7v8Qrwbwi7Izvsov+6MwxUVG6UHz5Ogo8FhPFFgq3WF13a/+nz1f45yajbw+Nr7IWpvkSyZ+zXJf+OIEVdpjqtZ5B4KfjEo1mRaboXf4x0ZMcVRG/q07Vzc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561667804490681.5641474648129; Thu, 27 Jun 2019 13:36:44 -0700 (PDT) Received: from localhost ([::1]:54212 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb8I-0000Fm-CB for importer@patchew.org; Thu, 27 Jun 2019 16:36:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45277) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb09-00016g-A1 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb07-0007an-Ag for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47804) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgazj-0007Ck-Kh; Thu, 27 Jun 2019 16:27:47 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B3007308FB9D; Thu, 27 Jun 2019 20:27:41 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5F8DF6012D; Thu, 27 Jun 2019 20:27:36 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:52 +0200 Message-Id: <20190627202719.17739-2-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Thu, 27 Jun 2019 20:27:46 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 01/28] tests/pflash-cfi02: Add test for supported CFI commands X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway Test the AMD command set for parallel flash chips. This test uses an ARM musicpal board with a pflash drive to test the following list of currently-supported commands. - Autoselect - CFI - Sector erase - Chip erase - Program - Unlock bypass - Reset Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-2-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: reworded the patch subject, g_assert_cmpint -> cmphex] Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- tests/Makefile.include | 2 + tests/pflash-cfi02-test.c | 225 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 tests/pflash-cfi02-test.c diff --git a/tests/Makefile.include b/tests/Makefile.include index db750dd6d0..d02132fb94 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -260,6 +260,7 @@ check-qtest-arm-y +=3D tests/m25p80-test$(EXESUF) check-qtest-arm-y +=3D tests/test-arm-mptimer$(EXESUF) check-qtest-arm-y +=3D tests/boot-serial-test$(EXESUF) check-qtest-arm-y +=3D tests/hexloader-test$(EXESUF) +check-qtest-arm-$(CONFIG_PFLASH_CFI02) +=3D tests/pflash-cfi02-test$(EXESU= F) =20 check-qtest-aarch64-y =3D tests/numa-test$(EXESUF) check-qtest-aarch64-y +=3D tests/boot-serial-test$(EXESUF) @@ -767,6 +768,7 @@ tests/device-introspect-test$(EXESUF): tests/device-int= rospect-test.o tests/rtc-test$(EXESUF): tests/rtc-test.o tests/m48t59-test$(EXESUF): tests/m48t59-test.o tests/hexloader-test$(EXESUF): tests/hexloader-test.o +tests/pflash-cfi02$(EXESUF): tests/pflash-cfi02-test.o tests/endianness-test$(EXESUF): tests/endianness-test.o tests/prom-env-test$(EXESUF): tests/prom-env-test.o $(libqos-obj-y) tests/rtas-test$(EXESUF): tests/rtas-test.o $(libqos-spapr-obj-y) diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c new file mode 100644 index 0000000000..e7e16a8dd8 --- /dev/null +++ b/tests/pflash-cfi02-test.c @@ -0,0 +1,225 @@ +/* + * QTest testcase for parallel flash with AMD command set + * + * Copyright (c) 2019 Stephen Checkoway + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "libqtest.h" + +/* + * To test the pflash_cfi02 device, we run QEMU with the musicpal machine = with + * a pflash drive. This enables us to test some flash configurations, but = not + * all. In particular, we're limited to a 16-bit wide flash device. + */ + +#define MP_FLASH_SIZE_MAX (32 * 1024 * 1024) +#define BASE_ADDR (0x100000000ULL - MP_FLASH_SIZE_MAX) + +#define FLASH_WIDTH 2 +#define CFI_ADDR (FLASH_WIDTH * 0x55) +#define UNLOCK0_ADDR (FLASH_WIDTH * 0x5555) +#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AAA) + +#define CFI_CMD 0x98 +#define UNLOCK0_CMD 0xAA +#define UNLOCK1_CMD 0x55 +#define AUTOSELECT_CMD 0x90 +#define RESET_CMD 0xF0 +#define PROGRAM_CMD 0xA0 +#define SECTOR_ERASE_CMD 0x30 +#define CHIP_ERASE_CMD 0x10 +#define UNLOCK_BYPASS_CMD 0x20 +#define UNLOCK_BYPASS_RESET_CMD 0x00 + +static char image_path[] =3D "/tmp/qtest.XXXXXX"; + +static inline void flash_write(uint64_t byte_addr, uint16_t data) +{ + qtest_writew(global_qtest, BASE_ADDR + byte_addr, data); +} + +static inline uint16_t flash_read(uint64_t byte_addr) +{ + return qtest_readw(global_qtest, BASE_ADDR + byte_addr); +} + +static void unlock(void) +{ + flash_write(UNLOCK0_ADDR, UNLOCK0_CMD); + flash_write(UNLOCK1_ADDR, UNLOCK1_CMD); +} + +static void reset(void) +{ + flash_write(0, RESET_CMD); +} + +static void sector_erase(uint64_t byte_addr) +{ + unlock(); + flash_write(UNLOCK0_ADDR, 0x80); + unlock(); + flash_write(byte_addr, SECTOR_ERASE_CMD); +} + +static void wait_for_completion(uint64_t byte_addr) +{ + /* If DQ6 is toggling, step the clock and ensure the toggle stops. */ + if ((flash_read(byte_addr) & 0x40) ^ (flash_read(byte_addr) & 0x40)) { + /* Wait for erase or program to finish. */ + clock_step_next(); + /* Ensure that DQ6 has stopped toggling. */ + g_assert_cmphex(flash_read(byte_addr), =3D=3D, flash_read(byte_add= r)); + } +} + +static void bypass_program(uint64_t byte_addr, uint16_t data) +{ + flash_write(UNLOCK0_ADDR, PROGRAM_CMD); + flash_write(byte_addr, data); + /* + * Data isn't valid until DQ6 stops toggling. We don't model this as + * writes are immediate, but if this changes in the future, we can wait + * until the program is complete. + */ + wait_for_completion(byte_addr); +} + +static void program(uint64_t byte_addr, uint16_t data) +{ + unlock(); + bypass_program(byte_addr, data); +} + +static void chip_erase(void) +{ + unlock(); + flash_write(UNLOCK0_ADDR, 0x80); + unlock(); + flash_write(UNLOCK0_ADDR, SECTOR_ERASE_CMD); +} + +static void test_flash(void) +{ + global_qtest =3D qtest_initf("-M musicpal,accel=3Dqtest " + "-drive if=3Dpflash,file=3D%s,format=3Draw,= copy-on-read", + image_path); + /* Check the IDs. */ + unlock(); + flash_write(UNLOCK0_ADDR, AUTOSELECT_CMD); + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x0000), =3D=3D, 0x00BF); + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x0001), =3D=3D, 0x236D); + reset(); + + /* Check the erase blocks. */ + flash_write(CFI_ADDR, CFI_CMD); + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x10), =3D=3D, 'Q'); + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x11), =3D=3D, 'R'); + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x12), =3D=3D, 'Y'); + /* Num erase regions. */ + g_assert_cmphex(flash_read(FLASH_WIDTH * 0x2C), >=3D, 1); + uint32_t nb_sectors =3D flash_read(FLASH_WIDTH * 0x2D) + + (flash_read(FLASH_WIDTH * 0x2E) << 8) + 1; + uint32_t sector_len =3D (flash_read(FLASH_WIDTH * 0x2F) << 8) + + (flash_read(FLASH_WIDTH * 0x30) << 16); + reset(); + + /* Erase and program sector. */ + for (uint32_t i =3D 0; i < nb_sectors; ++i) { + uint64_t byte_addr =3D i * sector_len; + sector_erase(byte_addr); + /* Read toggle. */ + uint16_t status0 =3D flash_read(byte_addr); + /* DQ7 is 0 during an erase. */ + g_assert_cmphex(status0 & 0x80, =3D=3D, 0); + uint16_t status1 =3D flash_read(byte_addr); + /* DQ6 toggles during an erase. */ + g_assert_cmphex(status0 & 0x40, !=3D, status1 & 0x40); + /* Wait for erase to complete. */ + clock_step_next(); + /* Ensure DQ6 has stopped toggling. */ + g_assert_cmphex(flash_read(byte_addr), =3D=3D, flash_read(byte_add= r)); + /* Now the data should be valid. */ + g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0xFFFF); + + /* Program a bit pattern. */ + program(byte_addr, 0x5555); + g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0x5555); + program(byte_addr, 0xAA55); + g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0x0055); + } + + /* Erase the chip. */ + chip_erase(); + /* Read toggle. */ + uint16_t status0 =3D flash_read(0); + /* DQ7 is 0 during an erase. */ + g_assert_cmphex(status0 & 0x80, =3D=3D, 0); + uint16_t status1 =3D flash_read(0); + /* DQ6 toggles during an erase. */ + g_assert_cmphex(status0 & 0x40, !=3D, status1 & 0x40); + /* Wait for erase to complete. */ + clock_step_next(); + /* Ensure DQ6 has stopped toggling. */ + g_assert_cmphex(flash_read(0), =3D=3D, flash_read(0)); + /* Now the data should be valid. */ + g_assert_cmphex(flash_read(0), =3D=3D, 0xFFFF); + + /* Unlock bypass */ + unlock(); + flash_write(UNLOCK0_ADDR, UNLOCK_BYPASS_CMD); + bypass_program(0, 0x0123); + bypass_program(2, 0x4567); + bypass_program(4, 0x89AB); + /* + * Test that bypass programming, unlike normal programming can use any + * address for the PROGRAM_CMD. + */ + flash_write(6, PROGRAM_CMD); + flash_write(6, 0xCDEF); + wait_for_completion(6); + flash_write(0, UNLOCK_BYPASS_RESET_CMD); + bypass_program(8, 0x55AA); /* Should fail. */ + g_assert_cmphex(flash_read(0), =3D=3D, 0x0123); + g_assert_cmphex(flash_read(2), =3D=3D, 0x4567); + g_assert_cmphex(flash_read(4), =3D=3D, 0x89AB); + g_assert_cmphex(flash_read(6), =3D=3D, 0xCDEF); + g_assert_cmphex(flash_read(8), =3D=3D, 0xFFFF); + + qtest_quit(global_qtest); +} + +static void cleanup(void *opaque) +{ + unlink(image_path); +} + +int main(int argc, char **argv) +{ + int fd =3D mkstemp(image_path); + if (fd =3D=3D -1) { + g_printerr("Failed to create temporary file %s: %s\n", image_path, + strerror(errno)); + exit(EXIT_FAILURE); + } + if (ftruncate(fd, 8 * 1024 * 1024) < 0) { + int error_code =3D errno; + close(fd); + unlink(image_path); + g_printerr("Failed to truncate file %s to 8 MB: %s\n", image_path, + strerror(error_code)); + exit(EXIT_FAILURE); + } + close(fd); + + qtest_add_abrt_handler(cleanup, NULL); + g_test_init(&argc, &argv, NULL); + qtest_add_func("pflash-cfi02", test_flash); + int result =3D g_test_run(); + cleanup(NULL); + return result; +} --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668095; cv=none; d=zoho.com; s=zohoarc; b=BJOfRlVg/9MztoTkIIAzFNeqRTUVsd7YTXUcAxDCs4aCw7YUZ5duBjCxCdxPYts/PJanXFZ1VkxRio2/pMAVMZBzpoeHyP54MntXRyY+9vdHeqCthPNQiMf66V94cb/XLif0H0NwzMxG/M8RtdxfmoCjGqGNSk7IKwZEtqbZs6M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668095; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=pKvHMntEohPsXeZiJHHI1tj3rH2RN59Eg/M2Fi+d+O4=; b=hWCF4EgWX+pJBrQM8VNF0GOppmganE2xW+jUp7pErr20w0fNIQTmWRZtcdkJhozO7pq0lZkDhdK3QvEbwiGjX67bwTAIGy6cUnK4sxdsOdnJFvrcZu+UNoS/iqjPTEq61fUtLo954mV7aIn5lNaJ8vxSdGIeApPs5A+WxJl9n8E= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156166809589748.09224140228764; Thu, 27 Jun 2019 13:41:35 -0700 (PDT) Received: from localhost ([::1]:54252 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbCz-0003mb-A5 for importer@patchew.org; Thu, 27 Jun 2019 16:41:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45307) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb0C-0001AW-9V for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb0A-0007dT-D0 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56224) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb03-0007ML-Ld; Thu, 27 Jun 2019 16:28:07 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D877E3082A28; Thu, 27 Jun 2019 20:27:55 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2D735600CC; Thu, 27 Jun 2019 20:27:41 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:53 +0200 Message-Id: <20190627202719.17739-3-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Thu, 27 Jun 2019 20:27:57 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 02/28] hw/block/pflash: Simplify trace_pflash_io_read/write() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Call the read() trace function after the value is set, so we can log the returned value. Rename the I/O trace functions with '_io_' in their name. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi01.c | 5 +++-- hw/block/pflash_cfi02.c | 6 ++---- hw/block/trace-events | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 35080d915f..74fc1bc2da 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -288,7 +288,6 @@ static uint32_t pflash_read(PFlashCFI01 *pfl, hwaddr of= fset, uint32_t ret; =20 ret =3D -1; - trace_pflash_read(offset, pfl->cmd, width, pfl->wcycle); switch (pfl->cmd) { default: /* This should never happen : reset state & treat it as a read */ @@ -391,6 +390,8 @@ static uint32_t pflash_read(PFlashCFI01 *pfl, hwaddr of= fset, =20 break; } + trace_pflash_io_read(offset, width, width << 1, ret, pfl->cmd, pfl->wc= ycle); + return ret; } =20 @@ -453,7 +454,7 @@ static void pflash_write(PFlashCFI01 *pfl, hwaddr offse= t, =20 cmd =3D value; =20 - trace_pflash_write(offset, value, width, pfl->wcycle); + trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); if (!pfl->wcycle) { /* Set the device in I/O access mode */ memory_region_rom_device_set_romd(&pfl->mem, false); diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index eb106f4996..f05cd507b3 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -145,7 +145,6 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, uint8_t *p; =20 ret =3D -1; - trace_pflash_read(offset, pfl->cmd, width, pfl->wcycle); /* Lazy reset to ROMD mode after a certain amount of read accesses */ if (!pfl->rom_mode && pfl->wcycle =3D=3D 0 && ++pfl->read_counter > PFLASH_LAZY_ROMD_THRESHOLD) { @@ -241,6 +240,7 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, } break; } + trace_pflash_io_read(offset, width, width << 1, ret, pfl->cmd, pfl->wc= ycle); =20 return ret; } @@ -267,6 +267,7 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, uint8_t *p; uint8_t cmd; =20 + trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; if (pfl->cmd !=3D 0xA0 && cmd =3D=3D 0xF0) { #if 0 @@ -275,11 +276,8 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offs= et, #endif goto reset_flash; } - trace_pflash_write(offset, value, width, pfl->wcycle); offset &=3D pfl->chip_len - 1; =20 - DPRINTF("%s: offset " TARGET_FMT_plx " %08x %d\n", __func__, - offset, value, width); boff =3D offset & (pfl->sector_len - 1); if (pfl->width =3D=3D 2) boff =3D boff >> 1; diff --git a/hw/block/trace-events b/hw/block/trace-events index 97a17838ed..f637fe918e 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -7,9 +7,9 @@ fdc_ioport_write(uint8_t reg, uint8_t value) "write reg 0x%= 02x val 0x%02x" # pflash_cfi02.c # pflash_cfi01.c pflash_reset(void) "reset" -pflash_read(uint64_t offset, uint8_t cmd, int width, uint8_t wcycle) "offs= et:0x%04"PRIx64" cmd:0x%02x width:%d wcycle:%u" -pflash_write(uint64_t offset, uint32_t value, int width, uint8_t wcycle) "= offset:0x%04"PRIx64" value:0x%03x width:%d wcycle:%u" pflash_timer_expired(uint8_t cmd) "command 0x%02x done" +pflash_io_read(uint64_t offset, int width, int fmt_width, uint32_t value, = uint8_t cmd, uint8_t wcycle) "offset:0x%04"PRIx64" width:%d value:0x%0*x cm= d:0x%02x wcycle:%u" +pflash_io_write(uint64_t offset, int width, int fmt_width, uint32_t value,= uint8_t wcycle) "offset:0x%04"PRIx64" width:%d value:0x%0*x wcycle:%u" pflash_data_read8(uint64_t offset, uint32_t value) "data offset:0x%04"PRIx= 64" value:0x%02x" pflash_data_read16(uint64_t offset, uint32_t value) "data offset:0x%04"PRI= x64" value:0x%04x" pflash_data_read32(uint64_t offset, uint32_t value) "data offset:0x%04"PRI= x64" value:0x%08x" --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561667618; cv=none; d=zoho.com; s=zohoarc; b=jdkZsW71HwJmj3+N+IEk9dmZJnlCP6+fM56Hjk6Renmy7y4u9p4aMkUWutLcnQZ5YdS4KOxaasVw7SCxgb7cI6fEp35cxoeNgYg7nx6Xrn63ly3LzW5FzMmmxHidawYMf1NS4XgNXuNcP6DJ3KEXazppFlRKRe8/CFFkk02QePk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561667618; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Sj4YUGJaUWASIHwRze/HOpEpiZ+DKappvK/ezYUh15Q=; b=dReeJwRZi6hUyFVHXZAKlU4QxoSIn9fgANo1htAMjVaq5ouK1GJHo+Iq5yRDTMrRx7vizDk1rLcAYbpdddVNjtTK9P5dCpGjzDdpR/Qn/uZxwMs2VAs+N5mv0t9ndTwT/xK69DgG8UN8zbqEU3wvIwexZb+SO7QRfFJOllff0gU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561667618147683.3805517844373; Thu, 27 Jun 2019 13:33:38 -0700 (PDT) Received: from localhost ([::1]:54190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb5H-0005Om-Fw for importer@patchew.org; Thu, 27 Jun 2019 16:33:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45309) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb0C-0001Ae-AG for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb0A-0007dr-PV for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38766) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb03-0007VF-MX; Thu, 27 Jun 2019 16:28:07 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CAEFB3083391; Thu, 27 Jun 2019 20:28:03 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 542C36012D; Thu, 27 Jun 2019 20:27:56 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:54 +0200 Message-Id: <20190627202719.17739-4-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 27 Jun 2019 20:28:04 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 03/28] hw/block/pflash: Simplify trace_pflash_data_read/write() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Use a field width format to have a single function to log the different width accesses. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi01.c | 6 ++---- hw/block/pflash_cfi02.c | 6 ++---- hw/block/trace-events | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 74fc1bc2da..db4a246b22 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -248,7 +248,6 @@ static uint32_t pflash_data_read(PFlashCFI01 *pfl, hwad= dr offset, switch (width) { case 1: ret =3D p[offset]; - trace_pflash_data_read8(offset, ret); break; case 2: if (be) { @@ -258,7 +257,6 @@ static uint32_t pflash_data_read(PFlashCFI01 *pfl, hwad= dr offset, ret =3D p[offset]; ret |=3D p[offset + 1] << 8; } - trace_pflash_data_read16(offset, ret); break; case 4: if (be) { @@ -272,12 +270,12 @@ static uint32_t pflash_data_read(PFlashCFI01 *pfl, hw= addr offset, ret |=3D p[offset + 2] << 16; ret |=3D p[offset + 3] << 24; } - trace_pflash_data_read32(offset, ret); break; default: DPRINTF("BUG in %s\n", __func__); abort(); } + trace_pflash_data_read(offset, width << 1, ret); return ret; } =20 @@ -415,7 +413,7 @@ static inline void pflash_data_write(PFlashCFI01 *pfl, = hwaddr offset, { uint8_t *p =3D pfl->storage; =20 - trace_pflash_data_write(offset, value, width, pfl->counter); + trace_pflash_data_write(offset, width << 1, value, pfl->counter); switch (width) { case 1: p[offset] =3D value; diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index f05cd507b3..6cdfc85264 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -172,7 +172,6 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, switch (width) { case 1: ret =3D p[offset]; - trace_pflash_data_read8(offset, ret); break; case 2: if (be) { @@ -182,7 +181,6 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, ret =3D p[offset]; ret |=3D p[offset + 1] << 8; } - trace_pflash_data_read16(offset, ret); break; case 4: if (be) { @@ -196,9 +194,9 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, ret |=3D p[offset + 2] << 16; ret |=3D p[offset + 3] << 24; } - trace_pflash_data_read32(offset, ret); break; } + trace_pflash_data_read(offset, width << 1, ret); break; case 0x90: /* flash ID read */ @@ -343,7 +341,7 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, /* We need another unlock sequence */ goto check_unlock0; case 0xA0: - trace_pflash_data_write(offset, value, width, 0); + trace_pflash_data_write(offset, width << 1, value, 0); p =3D pfl->storage; if (!pfl->ro) { switch (width) { diff --git a/hw/block/trace-events b/hw/block/trace-events index f637fe918e..13d1b21dd4 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -10,10 +10,8 @@ pflash_reset(void) "reset" pflash_timer_expired(uint8_t cmd) "command 0x%02x done" pflash_io_read(uint64_t offset, int width, int fmt_width, uint32_t value, = uint8_t cmd, uint8_t wcycle) "offset:0x%04"PRIx64" width:%d value:0x%0*x cm= d:0x%02x wcycle:%u" pflash_io_write(uint64_t offset, int width, int fmt_width, uint32_t value,= uint8_t wcycle) "offset:0x%04"PRIx64" width:%d value:0x%0*x wcycle:%u" -pflash_data_read8(uint64_t offset, uint32_t value) "data offset:0x%04"PRIx= 64" value:0x%02x" -pflash_data_read16(uint64_t offset, uint32_t value) "data offset:0x%04"PRI= x64" value:0x%04x" -pflash_data_read32(uint64_t offset, uint32_t value) "data offset:0x%04"PRI= x64" value:0x%08x" -pflash_data_write(uint64_t offset, uint32_t value, int width, uint64_t cou= nter) "data offset:0x%04"PRIx64" value:0x%08x width:%d counter:0x%016"PRIx64 +pflash_data_read(uint64_t offset, int width, uint32_t value) "data offset:= 0x%04"PRIx64" value:0x%0*x" +pflash_data_write(uint64_t offset, int width, uint32_t value, uint64_t cou= nter) "data offset:0x%04"PRIx64" value:0x%0*x counter:0x%016"PRIx64 pflash_manufacturer_id(uint16_t id) "Read Manufacturer ID: 0x%04x" pflash_device_id(uint16_t id) "Read Device ID: 0x%04x" pflash_device_info(uint64_t offset) "Read Device Information offset:0x%04"= PRIx64 --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561667908; cv=none; d=zoho.com; s=zohoarc; b=jvL+r4dpinZID4oYyjP/gahnKXqCn9ZBF0OQCdnSODkNaw+8kHAP34C8D/m8Pek7xA1n6tl3R360cAmV5ONM/8TeHqeGpKo4sP7IREgEy2WKDuQljO4H1tCsjyYVDT4o4wcwD+nqehBFSRuzjkhjHYMKM8Sg/Xjx1acWmMF5HUw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561667908; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=eP0f5gKUXLipkUMVNUBqFj7SWpY0QK0smNxlj8u1w4M=; b=FUcQ4NR6scz2FnEz7H5ITuH+DSMGIO2zeLfDquMfjPcK5+WYrzPQgGeVKHfdgNY8tZJCnpGaDMvfh7zPOOBpFArvLEgC+WVnRg44uKuZSBYhEimSU7JivR3OOZIpu10nanL+ap2TxKUhw47SdySwHvxXvabyHD9MSGjnANWVeo0= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561667908596535.9903122291178; Thu, 27 Jun 2019 13:38:28 -0700 (PDT) Received: from localhost ([::1]:54232 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb9y-0001th-Ke for importer@patchew.org; Thu, 27 Jun 2019 16:38:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45439) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb0O-0001RS-4N for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb0L-0007os-M0 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34806) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb0C-0007eJ-9T; Thu, 27 Jun 2019 16:28:16 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DC7FF81F0E; Thu, 27 Jun 2019 20:28:14 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 424E8600CC; Thu, 27 Jun 2019 20:28:04 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:55 +0200 Message-Id: <20190627202719.17739-5-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 27 Jun 2019 20:28:15 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 04/28] hw/block/pflash_cfi02: Fix debug format string X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Always compile the debug code to prevent format string to bitrot. Delete dead code. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch, use PRIx32] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 6cdfc85264..43796e551a 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -47,15 +47,13 @@ #include "hw/sysbus.h" #include "trace.h" =20 -//#define PFLASH_DEBUG -#ifdef PFLASH_DEBUG +#define PFLASH_DEBUG false #define DPRINTF(fmt, ...) \ do { \ - fprintf(stderr, "PFLASH: " fmt , ## __VA_ARGS__); \ + if (PFLASH_DEBUG) { \ + fprintf(stderr, "PFLASH: " fmt, ## __VA_ARGS__); \ + } \ } while (0) -#else -#define DPRINTF(fmt, ...) do { } while (0) -#endif =20 #define PFLASH_LAZY_ROMD_THRESHOLD 42 =20 @@ -218,14 +216,14 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr = offset, default: goto flash_read; } - DPRINTF("%s: ID " TARGET_FMT_plx " %x\n", __func__, boff, ret); + DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx32 "\n", __func__, boff,= ret); break; case 0xA0: case 0x10: case 0x30: /* Status register read */ ret =3D pfl->status; - DPRINTF("%s: status %x\n", __func__, ret); + DPRINTF("%s: status %" PRIx32 "\n", __func__, ret); /* Toggle bit 6 */ pfl->status ^=3D 0x40; break; @@ -268,10 +266,6 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offs= et, trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; if (pfl->cmd !=3D 0xA0 && cmd =3D=3D 0xF0) { -#if 0 - DPRINTF("%s: flash reset asked (%02x %02x)\n", - __func__, pfl->cmd, cmd); -#endif goto reset_flash; } offset &=3D pfl->chip_len - 1; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668383; cv=none; d=zoho.com; s=zohoarc; b=G1VCKGCyH7S/s4nGEXlo2oVV1s5U/eciAgVV5N5wO0M/QKzNBbrL0fexTv6D+OAVktt145psbmv/I3gtucw9Jgp2xMHg6xcUAFjKbWjQQDi1/5v8l0eG3AIOgO4DzEqQR9MQTfNpAToaANZ7xjFBfVB3wGC6LT1Ytk6nwLQf5EE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668383; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=H4uEbIbizMZs4+p0aRUUG7JsTQT75PKe71xapntNzow=; b=NQg1oCCLWnw3V8edM2FdGTAusNFyvR2p7YwjaKe+wRq5DVPpJ6eoMUgu2QOSCj1A+rKFXPNYMwWPg0QoB5tOnCLXpWrBsMjBeLUliOnr4K/rAI6e9cIfTxiUBs/P4D7bymFIPAMoCaKmOtU70E2ajb4+oENRhzhMb1B4KOSrpZY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668383074357.7493089862961; Thu, 27 Jun 2019 13:46:23 -0700 (PDT) Received: from localhost ([::1]:54286 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbHd-0000u3-Cn for importer@patchew.org; Thu, 27 Jun 2019 16:46:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45484) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb0Q-0001XF-M2 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb0P-0007sx-Ja for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34856) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb0J-0007m6-Cs; Thu, 27 Jun 2019 16:28:23 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 76EEC811A9; Thu, 27 Jun 2019 20:28:20 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4E045600CC; Thu, 27 Jun 2019 20:28:15 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:56 +0200 Message-Id: <20190627202719.17739-6-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 27 Jun 2019 20:28:22 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 05/28] hw/block/pflash_cfi02: Add an enum to define the write cycles X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" No change in functionality is intended with this commit. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 43796e551a..303d225f23 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -57,6 +57,11 @@ do { = \ =20 #define PFLASH_LAZY_ROMD_THRESHOLD 42 =20 +/* Special write cycles for CFI queries. */ +enum { + WCYCLE_CFI =3D 7, +}; + struct PFlashCFI02 { /*< private >*/ SysBusDevice parent_obj; @@ -286,7 +291,7 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, if (boff =3D=3D 0x55 && cmd =3D=3D 0x98) { enter_CFI_mode: /* Enter CFI query mode */ - pfl->wcycle =3D 7; + pfl->wcycle =3D WCYCLE_CFI; pfl->cmd =3D 0x98; return; } @@ -458,7 +463,8 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, goto reset_flash; } break; - case 7: /* Special value for CFI queries */ + /* Special values for CFI queries */ + case WCYCLE_CFI: DPRINTF("%s: invalid write in CFI query mode\n", __func__); goto reset_flash; default: --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668685; cv=none; d=zoho.com; s=zohoarc; b=CIxF/wZGDTyYzZMwCJ/Y5GhKW+/ivXMbAs9nFQZ+aHIV9DgksAf/5tRMC4PwdrUkjYnF9D/FlRFoGIoiGO/5mZpcj8sIxIoaaP3AbO3XNDactRiVIqbVP2C9WpipNbxQNFeLUs2URkO9Vph56/FNAI2Qo/W2vgNBDVUntlH7xqo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668685; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=poGn8rNKsFg2xBSbl3W0xuHhYkT3vDb14kKSKthyyOY=; b=hWqkKr42yCDATQ9PfwZqVfS1PNB+/TPmKLoIlEUrTfUxDI4x5YxmTlVQgSOq0wLQgUBlo2jf/iattdhtwrRmzsIlqlqDOH2ImZtM2GKU+6u3l01OF3T8j3g6JEEGnIu7JIU4UZOws/h/vKBw/VnY1E686VezZ9wwutvEs/ProQ4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668685778544.3533988687442; Thu, 27 Jun 2019 13:51:25 -0700 (PDT) Received: from localhost ([::1]:54338 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbMV-000662-Pa for importer@patchew.org; Thu, 27 Jun 2019 16:51:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45548) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb0h-0001fE-Ni for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb0d-00085g-Oa for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:28:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39386) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb0O-0007qO-4G; Thu, 27 Jun 2019 16:28:28 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 180F8307CDD5; Thu, 27 Jun 2019 20:28:27 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E311C6012D; Thu, 27 Jun 2019 20:28:20 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:57 +0200 Message-Id: <20190627202719.17739-7-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 27 Jun 2019 20:28:27 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 06/28] hw/block/pflash_cfi02: Add helpers to manipulate the status bits X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Pull out all of the code to modify the status into simple helper functions. Status handling becomes more complex once multiple chips are interleaved to produce a single device. No change in functionality is intended with this commit. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 303d225f23..e9eea0ec08 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -101,6 +101,31 @@ struct PFlashCFI02 { void *storage; }; =20 +/* + * Toggle status bit DQ7. + */ +static inline void toggle_dq7(PFlashCFI02 *pfl) +{ + pfl->status ^=3D 0x80; +} + +/* + * Set status bit DQ7 to bit 7 of value. + */ +static inline void set_dq7(PFlashCFI02 *pfl, uint8_t value) +{ + pfl->status &=3D 0x7F; + pfl->status |=3D value & 0x80; +} + +/* + * Toggle status bit DQ6. + */ +static inline void toggle_dq6(PFlashCFI02 *pfl) +{ + pfl->status ^=3D 0x40; +} + /* * Set up replicated mappings of the same region. */ @@ -130,7 +155,7 @@ static void pflash_timer (void *opaque) =20 trace_pflash_timer_expired(pfl->cmd); /* Reset flash */ - pfl->status ^=3D 0x80; + toggle_dq7(pfl); if (pfl->bypass) { pfl->wcycle =3D 2; } else { @@ -229,8 +254,7 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, /* Status register read */ ret =3D pfl->status; DPRINTF("%s: status %" PRIx32 "\n", __func__, ret); - /* Toggle bit 6 */ - pfl->status ^=3D 0x40; + toggle_dq6(pfl); break; case 0x98: /* CFI query mode */ @@ -374,7 +398,11 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offs= et, break; } } - pfl->status =3D 0x00 | ~(value & 0x80); + /* + * While programming, status bit DQ7 should hold the opposite + * value from how it was programmed. + */ + set_dq7(pfl, ~value); /* Let's pretend write is immediate */ if (pfl->bypass) goto do_bypass; @@ -422,7 +450,7 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, memset(pfl->storage, 0xFF, pfl->chip_len); pflash_update(pfl, 0, pfl->chip_len); } - pfl->status =3D 0x00; + set_dq7(pfl, 0x00); /* Let's wait 5 seconds before chip erase is done */ timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (NANOSECONDS_PER_SECOND * 5)); @@ -437,7 +465,7 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offse= t, memset(p + offset, 0xFF, pfl->sector_len); pflash_update(pfl, offset, pfl->sector_len); } - pfl->status =3D 0x00; + set_dq7(pfl, 0x00); /* Let's wait 1/2 second before sector erase is done */ timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (NANOSECONDS_PER_SECOND / 2)); --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561667727; cv=none; d=zoho.com; s=zohoarc; b=aL5RqW1ac0iISsdaYUS9RUX8vF9m2Trj96Kn++wEB7wBHVrA7NkPBzqF5N3fFB3DWX89sA3fsVAMfogEP/6eunpYa4IGTioSQDDJuI6vz3bGdbtUPaXHUOzU4vjZMNLLrVQuV5CPi5CUfVrAabNvDj+jDX14BJkyWbTaJrmwu8A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561667727; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=N/Wib4HqKhNuJacW8iYxnbD4UjKawmqx2GzeBMbXLqI=; b=YVm+0CKdr+KNXQUcOf5rC70NhbWUkjbhwW+nii4o3Z4PkX0kLLGUPipsNAfnQNYmRfIOkpiZrHbFB3i+SM0vLbA1wUEGzEPdlBGfI6R2V73zkjPibLwUso6UbfXquRYreYJgrDluJC6aVA86KayfPLVHs/IDo2SClT1xm8x3rVQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561667727995673.4398965926677; Thu, 27 Jun 2019 13:35:27 -0700 (PDT) Received: from localhost ([::1]:54203 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb74-0007FY-Bz for importer@patchew.org; Thu, 27 Jun 2019 16:35:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45712) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb17-0001rd-Tf for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb16-0000G2-Qx for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38936) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb0x-000803-Pu; Thu, 27 Jun 2019 16:29:05 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D2A53083391; Thu, 27 Jun 2019 20:28:37 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 86DC2600CC; Thu, 27 Jun 2019 20:28:27 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:58 +0200 Message-Id: <20190627202719.17739-8-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 27 Jun 2019 20:28:37 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 07/28] hw/block/pflash_cfi02: Simplify a statement using fall through X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index e9eea0ec08..9e8c28af8f 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -239,10 +239,10 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr = offset, case 0x0E: case 0x0F: ret =3D boff & 0x01 ? pfl->ident3 : pfl->ident2; - if (ret =3D=3D (uint8_t)-1) { - goto flash_read; + if (ret !=3D (uint8_t)-1) { + break; } - break; + /* Fall through to data read. */ default: goto flash_read; } --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668319; cv=none; d=zoho.com; s=zohoarc; b=eSBxTUENcTvLwwaxF9LImnHrXfgYwxV1IsGv5GEduvdMdnbmf2zmFFdycvg51oyVllg5NBLyUliuqs8dJExLuTBceJfjEhJ8eOCFdYpbflygacxQSsna9H3c6TlG7vwqRv7fI1sSaAl7SENLcRUSYZZKcKNhgmgDLMaROSwraXY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668319; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=E09YbGVI+00z6hojR3n2eKe+c3feQuXaPvV2MGh68uY=; b=Tt34mNsVIk17aN9NS/aKf7OrFRFW55sENTSDknF0KvEX/whstOCZyja9GESgTro+R9IMrf4MNiM2jU7jX5ZPoqpvVQ97xDq1Enw+J5MIX4heKkyK9P7qgdELCK/fYA0QX3dmnZamm6GZ8ehiOBQscn1Q9tfzcWHoUTqUQDywYtg= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668319453783.922973099834; Thu, 27 Jun 2019 13:45:19 -0700 (PDT) Received: from localhost ([::1]:54282 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbGb-0000Kg-K8 for importer@patchew.org; Thu, 27 Jun 2019 16:45:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45813) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1E-0001x6-LM for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1C-0000Qx-Je for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60962) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb13-000859-Bp; Thu, 27 Jun 2019 16:29:10 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D05545277D; Thu, 27 Jun 2019 20:28:42 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A980D600CC; Thu, 27 Jun 2019 20:28:37 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:26:59 +0200 Message-Id: <20190627202719.17739-9-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 27 Jun 2019 20:28:43 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 08/28] hw/block/pflash_cfi02: Use the ldst API in pflash_write() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The load/store API eases code review. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 38 ++++++++------------------------------ 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 9e8c28af8f..ae38ed0bae 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -365,38 +365,16 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr off= set, goto check_unlock0; case 0xA0: trace_pflash_data_write(offset, width << 1, value, 0); - p =3D pfl->storage; if (!pfl->ro) { - switch (width) { - case 1: - p[offset] &=3D value; - pflash_update(pfl, offset, 1); - break; - case 2: - if (be) { - p[offset] &=3D value >> 8; - p[offset + 1] &=3D value; - } else { - p[offset] &=3D value; - p[offset + 1] &=3D value >> 8; - } - pflash_update(pfl, offset, 2); - break; - case 4: - if (be) { - p[offset] &=3D value >> 24; - p[offset + 1] &=3D value >> 16; - p[offset + 2] &=3D value >> 8; - p[offset + 3] &=3D value; - } else { - p[offset] &=3D value; - p[offset + 1] &=3D value >> 8; - p[offset + 2] &=3D value >> 16; - p[offset + 3] &=3D value >> 24; - } - pflash_update(pfl, offset, 4); - break; + p =3D (uint8_t *)pfl->storage + offset; + if (pfl->be) { + uint64_t current =3D ldn_be_p(p, width); + stn_be_p(p, width, current & value); + } else { + uint64_t current =3D ldn_le_p(p, width); + stn_le_p(p, width, current & value); } + pflash_update(pfl, offset, width); } /* * While programming, status bit DQ7 should hold the opposite --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561669051; cv=none; d=zoho.com; s=zohoarc; b=Yrh82Ay1WiPGevl6rRLB43ghM/eB3qDS7iLDNWONsdHqWtswjjvMuh9YNyi8o2yymEPkwGtwiZBZ2whOXDX69QnCUIbgFXan++SJ1zNI1PmcEyWljnkyTVKOThsRppP5glj+P35tQvb6UG9ITSFTzW9jY+evP/6ubOpWfBAysUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561669051; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ht0InYtUNy4/SIqowgzq3tCqMcdnyA895c1NWLlTZjY=; b=iiP/jHVmcaXSeqgS4MSrxHq5b6yG6x5XhMUC3VD6Gy2Bt8gen6hdzqKrCb5y6cTH1wdmkbLFtxmHl3en2QEvv7GQFIUXgI9E7ueHucXL3T8M2zxFnzemmZLLA2aH/Pl7bBja5cXgN2Hdbc1RdNzTNa37jFOGjdHdQBwA/gdgRg4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561669051768299.27557752627786; Thu, 27 Jun 2019 13:57:31 -0700 (PDT) Received: from localhost ([::1]:54410 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbRf-0003xW-8f for importer@patchew.org; Thu, 27 Jun 2019 16:56:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45816) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1E-0001x9-Li for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1C-0000Qp-Iv for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50450) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb10-0008Ai-NK; Thu, 27 Jun 2019 16:29:06 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 722303082231; Thu, 27 Jun 2019 20:28:48 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4C6BC600CC; Thu, 27 Jun 2019 20:28:43 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:00 +0200 Message-Id: <20190627202719.17739-10-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Thu, 27 Jun 2019 20:28:48 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 09/28] hw/block/pflash_cfi02: Use the ldst API in pflash_read() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The load/store API eases code review. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch, simplified tracing] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index ae38ed0bae..49afecb921 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -196,33 +196,11 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr = offset, case 0x00: flash_read: /* Flash area read */ - p =3D pfl->storage; - switch (width) { - case 1: - ret =3D p[offset]; - break; - case 2: - if (be) { - ret =3D p[offset] << 8; - ret |=3D p[offset + 1]; - } else { - ret =3D p[offset]; - ret |=3D p[offset + 1] << 8; - } - break; - case 4: - if (be) { - ret =3D p[offset] << 24; - ret |=3D p[offset + 1] << 16; - ret |=3D p[offset + 2] << 8; - ret |=3D p[offset + 3]; - } else { - ret =3D p[offset]; - ret |=3D p[offset + 1] << 8; - ret |=3D p[offset + 2] << 16; - ret |=3D p[offset + 3] << 24; - } - break; + p =3D (uint8_t *)pfl->storage + offset; + if (pfl->be) { + ret =3D ldn_be_p(p, width); + } else { + ret =3D ldn_le_p(p, width); } trace_pflash_data_read(offset, width << 1, ret); break; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668642; cv=none; d=zoho.com; s=zohoarc; b=WWdJsF32TIdroDO3dWCijI+JK+7DwN9cbFWRhRrz8WZY918vjWsrMWmymU8UMMSdLfZocF+gGAgOgU/jeyLElwlRod7vO0Ab5TLqkKzgmtYwES8epmBImrWbVaL7uLe3g9zP8C4HtUQJVbXwdTIVjf9witaOB85HrNvQ0vJMVPM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668642; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=i5PE++9aeLJtOo5649UxKEbe7QFzveTSPCGdyGfkgHg=; b=Aqg0KkOox5kfRiecbQcr3MHDRKV9UWcghM+nPkpoak8xFLYdaxA82o9NEdGsVXiyZHMpsnjziI7pyq1Zc3E33Md3KATbFE4qeHC2bkVQUsyQV6hTe16u6dTK0QNa51XjDNiWi/2u9ogUNpAbH5DjiqDvzxxsTfI7x8k6AViOeBo= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668642779820.4813443656694; Thu, 27 Jun 2019 13:50:42 -0700 (PDT) Received: from localhost ([::1]:54324 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbLm-0004GA-2Q for importer@patchew.org; Thu, 27 Jun 2019 16:50:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45867) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1I-0001zl-FN for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1G-0000YX-Eq for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56840) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb14-0008Nn-S7; Thu, 27 Jun 2019 16:29:11 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6F51430BDE4B; Thu, 27 Jun 2019 20:29:00 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E3DE5600CC; Thu, 27 Jun 2019 20:28:48 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:01 +0200 Message-Id: <20190627202719.17739-11-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 27 Jun 2019 20:29:00 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 10/28] hw/block/pflash_cfi02: Extract the pflash_data_read() function X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Extract the code block in a new function, remove a goto statement. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch, remove the XXX tracing comment] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 49afecb921..c079a63880 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -165,12 +165,23 @@ static void pflash_timer (void *opaque) pfl->cmd =3D 0; } =20 +/* + * Read data from flash. + */ +static uint64_t pflash_data_read(PFlashCFI02 *pfl, hwaddr offset, + unsigned int width) +{ + uint8_t *p =3D (uint8_t *)pfl->storage + offset; + uint64_t ret =3D pfl->be ? ldn_be_p(p, width) : ldn_le_p(p, width); + trace_pflash_data_read(offset, width << 1, ret); + return ret; +} + static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr offset, int width, int be) { hwaddr boff; uint32_t ret; - uint8_t *p; =20 ret =3D -1; /* Lazy reset to ROMD mode after a certain amount of read accesses */ @@ -194,15 +205,8 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr o= ffset, case 0x80: /* We accept reads during second unlock sequence... */ case 0x00: - flash_read: /* Flash area read */ - p =3D (uint8_t *)pfl->storage + offset; - if (pfl->be) { - ret =3D ldn_be_p(p, width); - } else { - ret =3D ldn_le_p(p, width); - } - trace_pflash_data_read(offset, width << 1, ret); + ret =3D pflash_data_read(pfl, offset, width); break; case 0x90: /* flash ID read */ @@ -222,7 +226,7 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, } /* Fall through to data read. */ default: - goto flash_read; + ret =3D pflash_data_read(pfl, offset, width); } DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx32 "\n", __func__, boff,= ret); break; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668020; cv=none; d=zoho.com; s=zohoarc; b=VXAy4zSGArqqYqJXyF3WhdQuP5p6z4+3y58enU/1b0+3TLNdppy/qbsPveGJKbRe5ixpgn29XAoJifYdRp7ug+r9VQgsSZb9Zsc4JSr6qLMHeYNiWV2J6H53Ma9IR3Ih+tv4DajYrqaLhoPOHzfXfpXG+ZsazYoGJewGYAvOzA8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668020; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=/U+f5TtByNFuP/rggoIfnPTVBYjyc8/NQXXAO4ztmms=; b=XPsojWVi1nfkflQfWVpFslSpTlJbTv0CHYSygwEqLHmB8uYkKiWaPejj/BQs7wqMNf8MSFrIgcCX8294gO2RwTPysxOT2dpbs9Cck+DiZI5QEF3MnLc/y2pEYLc3NCaVhrtXZojHIUsPYy4hZM4rdGLvAUofG6sjDjpsH9fEo+M= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668020195789.4164353958593; Thu, 27 Jun 2019 13:40:20 -0700 (PDT) Received: from localhost ([::1]:54246 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbBk-0003Ls-RI for importer@patchew.org; Thu, 27 Jun 2019 16:40:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45815) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1E-0001x8-Lh for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1C-0000RJ-PC for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56592) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb12-00006W-Lk; Thu, 27 Jun 2019 16:29:09 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F7F13058F5B; Thu, 27 Jun 2019 20:29:06 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DA31B600CC; Thu, 27 Jun 2019 20:29:00 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:02 +0200 Message-Id: <20190627202719.17739-12-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Thu, 27 Jun 2019 20:29:06 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 11/28] hw/block/pflash_cfi02: Unify the MemoryRegionOps X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The pflash_read()/pflash_write() can check the device endianess via the pfl->be variable, so remove the 'int be' argument. Since the big/little MemoryRegionOps are now identical, it is pointless to declare them both. Unify them. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-3-stephen.checkoway@oberlin.edu> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 [PMD: Extracted from bigger patch to ease review] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 60 +++++++++++------------------------------ 1 file changed, 15 insertions(+), 45 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index c079a63880..e64dc69c6c 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -177,11 +177,11 @@ static uint64_t pflash_data_read(PFlashCFI02 *pfl, hw= addr offset, return ret; } =20 -static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr offset, - int width, int be) +static uint64_t pflash_read(void *opaque, hwaddr offset, unsigned int widt= h) { + PFlashCFI02 *pfl =3D opaque; hwaddr boff; - uint32_t ret; + uint64_t ret; =20 ret =3D -1; /* Lazy reset to ROMD mode after a certain amount of read accesses */ @@ -228,14 +228,14 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr = offset, default: ret =3D pflash_data_read(pfl, offset, width); } - DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx32 "\n", __func__, boff,= ret); + DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx64 "\n", __func__, boff,= ret); break; case 0xA0: case 0x10: case 0x30: /* Status register read */ ret =3D pfl->status; - DPRINTF("%s: status %" PRIx32 "\n", __func__, ret); + DPRINTF("%s: status %" PRIx64 "\n", __func__, ret); toggle_dq6(pfl); break; case 0x98: @@ -253,8 +253,7 @@ static uint32_t pflash_read(PFlashCFI02 *pfl, hwaddr of= fset, } =20 /* update flash content on disk */ -static void pflash_update(PFlashCFI02 *pfl, int offset, - int size) +static void pflash_update(PFlashCFI02 *pfl, int offset, int size) { int offset_end; if (pfl->blk) { @@ -267,9 +266,10 @@ static void pflash_update(PFlashCFI02 *pfl, int offset, } } =20 -static void pflash_write(PFlashCFI02 *pfl, hwaddr offset, - uint32_t value, int width, int be) +static void pflash_write(void *opaque, hwaddr offset, uint64_t value, + unsigned int width) { + PFlashCFI02 *pfl =3D opaque; hwaddr boff; uint8_t *p; uint8_t cmd; @@ -477,39 +477,9 @@ static void pflash_write(PFlashCFI02 *pfl, hwaddr offs= et, pfl->cmd =3D 0; } =20 -static uint64_t pflash_be_readfn(void *opaque, hwaddr addr, unsigned size) -{ - return pflash_read(opaque, addr, size, 1); -} - -static void pflash_be_writefn(void *opaque, hwaddr addr, - uint64_t value, unsigned size) -{ - pflash_write(opaque, addr, value, size, 1); -} - -static uint64_t pflash_le_readfn(void *opaque, hwaddr addr, unsigned size) -{ - return pflash_read(opaque, addr, size, 0); -} - -static void pflash_le_writefn(void *opaque, hwaddr addr, - uint64_t value, unsigned size) -{ - pflash_write(opaque, addr, value, size, 0); -} - -static const MemoryRegionOps pflash_cfi02_ops_be =3D { - .read =3D pflash_be_readfn, - .write =3D pflash_be_writefn, - .valid.min_access_size =3D 1, - .valid.max_access_size =3D 4, - .endianness =3D DEVICE_NATIVE_ENDIAN, -}; - -static const MemoryRegionOps pflash_cfi02_ops_le =3D { - .read =3D pflash_le_readfn, - .write =3D pflash_le_writefn, +static const MemoryRegionOps pflash_cfi02_ops =3D { + .read =3D pflash_read, + .write =3D pflash_write, .valid.min_access_size =3D 1, .valid.max_access_size =3D 4, .endianness =3D DEVICE_NATIVE_ENDIAN, @@ -537,9 +507,9 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) =20 chip_len =3D pfl->sector_len * pfl->nb_blocs; =20 - memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), pfl->be ? - &pflash_cfi02_ops_be : &pflash_cfi02_ops= _le, - pfl, pfl->name, chip_len, &local_err); + memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), + &pflash_cfi02_ops, pfl, pfl->name, + chip_len, &local_err); if (local_err) { error_propagate(errp, local_err); return; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668296; cv=none; d=zoho.com; s=zohoarc; b=Pb+UfkEmmvZQraUgsnJqTaZLaQluSBNzw1SyDhXEJ3ZdTqsY6koCKlQRHuPuSI3VJcWemqBn3Hkp/pUj4z+1hW+akTRCSAH9BWTN5Wmgz1ekS0ZWtt1E39Fk4/BE3jygbqwcTd/AbxRKsf5ZnJPgnAifp62F7TgE5cszPExFl+A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668296; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=K+REI+zzmHkV3b3wLSwmrw/NFBd9aLnAYlU3xCAEB0s=; b=YMcObIGQqBCYP5dQdmSKywe9/B68uJ4ok5UwpJT4PtUmTs7CZXDHyTvCnxBbmufbHg8Q/lF0W3w+MOxjCgVu3VqeLpCP+2ABhKqG3wa4JyBd629wuiFcdkMmmFQCFwfD0QVA2LXWv7+83mD3jCqij3xJNs9kSN70YfCDZ9hBbFY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 156166829655715.00716964482342; Thu, 27 Jun 2019 13:44:56 -0700 (PDT) Received: from localhost ([::1]:54280 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbG9-0008Ir-61 for importer@patchew.org; Thu, 27 Jun 2019 16:44:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45868) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1I-0001zm-F4 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1G-0000Z5-OT for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56642) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb16-0000Ep-VR; Thu, 27 Jun 2019 16:29:13 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A0A163082B6B; Thu, 27 Jun 2019 20:29:11 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 78D66600CC; Thu, 27 Jun 2019 20:29:06 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:03 +0200 Message-Id: <20190627202719.17739-13-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Thu, 27 Jun 2019 20:29:11 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 12/28] hw/block/pflash_cfi02: Fix command address comparison X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway Most AMD commands only examine 11 bits of the address. This masks the addresses used in the comparison to 11 bits. The exceptions are word or sector addresses which use offset directly rather than the shifted offset, boff. Signed-off-by: Stephen Checkoway Acked-by: Thomas Huth Message-Id: <20190426162624.55977-4-stephen.checkoway@oberlin.edu> [PMD: Prepend 'hw/' in patch subject] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis --- hw/block/pflash_cfi02.c | 8 +++++++- tests/pflash-cfi02-test.c | 12 ++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index e64dc69c6c..4be3837be5 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -281,11 +281,13 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, } offset &=3D pfl->chip_len - 1; =20 - boff =3D offset & (pfl->sector_len - 1); + boff =3D offset; if (pfl->width =3D=3D 2) boff =3D boff >> 1; else if (pfl->width =3D=3D 4) boff =3D boff >> 2; + /* Only the least-significant 11 bits are used in most cases. */ + boff &=3D 0x7FF; switch (pfl->wcycle) { case 0: /* Set the device in I/O access mode if required */ @@ -538,6 +540,10 @@ static void pflash_cfi02_realize(DeviceState *dev, Err= or **errp) } } =20 + /* Only 11 bits are used in the comparison. */ + pfl->unlock_addr0 &=3D 0x7FF; + pfl->unlock_addr1 &=3D 0x7FF; + pflash_setup_mappings(pfl); pfl->rom_mode =3D 1; sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index e7e16a8dd8..e090b2e3a0 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -21,8 +21,8 @@ =20 #define FLASH_WIDTH 2 #define CFI_ADDR (FLASH_WIDTH * 0x55) -#define UNLOCK0_ADDR (FLASH_WIDTH * 0x5555) -#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AAA) +#define UNLOCK0_ADDR (FLASH_WIDTH * 0x555) +#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AA) =20 #define CFI_CMD 0x98 #define UNLOCK0_CMD 0xAA @@ -190,6 +190,14 @@ static void test_flash(void) g_assert_cmphex(flash_read(6), =3D=3D, 0xCDEF); g_assert_cmphex(flash_read(8), =3D=3D, 0xFFFF); =20 + /* Test ignored high order bits of address. */ + flash_write(FLASH_WIDTH * 0x5555, UNLOCK0_CMD); + flash_write(FLASH_WIDTH * 0x2AAA, UNLOCK1_CMD); + flash_write(FLASH_WIDTH * 0x5555, AUTOSELECT_CMD); + g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0000), =3D=3D, 0x00BF); + g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0001), =3D=3D, 0x236D); + reset(); + qtest_quit(global_qtest); } =20 --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668733; cv=none; d=zoho.com; s=zohoarc; b=H0lNyFJER9TAf55iaGax9hftgjGOCs/vw8Lg24Z1IWFQkMR5PW85v+EmLiAspJCJYB6cOuDLw4eSahVgw4KsgzkLr0KG4QdQZHrMs4kFSvYgQH3FBSFjlNOYhIQxsaPS/37VIJysu/ZS6ugJdSrdSqnlP9lpjqxoqh4+R1feN60= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668733; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=gQnILluADUsO310X5q/M5JCdnVh2nBKo+CX9odl2/Jw=; b=NOkMwOaXPf/SZqx4ttrSynEmHhZSn0SxXhjh22hUgLGDY2fhN65dvYbBv5La/DtnyiR54p/HH2Q8QnI4Q44AaLA7aWokULoHTz4YQE+GAk5/DaCpvDx/y4ogWPVoq++RoTlWp7U9oqIJiT3OZ6DVUanrCXaph244G+AVqwBRbus= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668733754491.4892346840577; Thu, 27 Jun 2019 13:52:13 -0700 (PDT) Received: from localhost ([::1]:54344 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbNG-0006wv-NR for importer@patchew.org; Thu, 27 Jun 2019 16:52:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46040) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1Y-0002Hn-JS for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1V-0000uf-KW for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45936) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1I-0000YH-DL; Thu, 27 Jun 2019 16:29:24 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E208DC057E65; Thu, 27 Jun 2019 20:29:21 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1ADFD600CC; Thu, 27 Jun 2019 20:29:11 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:04 +0200 Message-Id: <20190627202719.17739-14-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Jun 2019 20:29:22 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 13/28] tests/pflash-cfi02: Refactor to support testing multiple configurations X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Introduce the FlashConfig structure, to be able to run the same set of tests on different flash models/configurations. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-6-stephen.checkoway@oberlin.edu> [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis --- tests/pflash-cfi02-test.c | 386 +++++++++++++++++++++++++++----------- 1 file changed, 277 insertions(+), 109 deletions(-) diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index e090b2e3a0..b00f5ca2e7 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -17,12 +17,18 @@ */ =20 #define MP_FLASH_SIZE_MAX (32 * 1024 * 1024) +#define FLASH_SIZE (8 * 1024 * 1024) #define BASE_ADDR (0x100000000ULL - MP_FLASH_SIZE_MAX) =20 -#define FLASH_WIDTH 2 -#define CFI_ADDR (FLASH_WIDTH * 0x55) -#define UNLOCK0_ADDR (FLASH_WIDTH * 0x555) -#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AA) +/* Use a newtype to keep flash addresses separate from byte addresses. */ +typedef struct { + uint64_t addr; +} faddr; +#define FLASH_ADDR(x) ((faddr) { .addr =3D (x) }) + +#define CFI_ADDR FLASH_ADDR(0x55) +#define UNLOCK0_ADDR FLASH_ADDR(0x555) +#define UNLOCK1_ADDR FLASH_ADDR(0x2AA) =20 #define CFI_CMD 0x98 #define UNLOCK0_CMD 0xAA @@ -35,170 +41,313 @@ #define UNLOCK_BYPASS_CMD 0x20 #define UNLOCK_BYPASS_RESET_CMD 0x00 =20 +typedef struct { + int bank_width; + + QTestState *qtest; +} FlashConfig; + static char image_path[] =3D "/tmp/qtest.XXXXXX"; =20 -static inline void flash_write(uint64_t byte_addr, uint16_t data) +/* + * The pflash implementation allows some parameters to be unspecified. We = want + * to test those configurations but we also need to know the real values in + * our testing code. So after we launch qemu, we'll need a new FlashConfig + * with the correct values filled in. + */ +static FlashConfig expand_config_defaults(const FlashConfig *c) { - qtest_writew(global_qtest, BASE_ADDR + byte_addr, data); + FlashConfig ret =3D *c; + + if (ret.bank_width =3D=3D 0) { + ret.bank_width =3D 2; + } + + /* XXX: Limitations of test harness. */ + assert(ret.bank_width =3D=3D 2); + return ret; } =20 -static inline uint16_t flash_read(uint64_t byte_addr) +/* + * Return a bit mask suitable for extracting the least significant + * status/query response from an interleaved response. + */ +static inline uint64_t device_mask(const FlashConfig *c) { - return qtest_readw(global_qtest, BASE_ADDR + byte_addr); + return (uint64_t)-1; } =20 -static void unlock(void) +/* + * Return a bit mask exactly as long as the bank_width. + */ +static inline uint64_t bank_mask(const FlashConfig *c) { - flash_write(UNLOCK0_ADDR, UNLOCK0_CMD); - flash_write(UNLOCK1_ADDR, UNLOCK1_CMD); + if (c->bank_width =3D=3D 8) { + return (uint64_t)-1; + } + return (1ULL << (c->bank_width * 8)) - 1ULL; } =20 -static void reset(void) +static inline void flash_write(const FlashConfig *c, uint64_t byte_addr, + uint64_t data) { - flash_write(0, RESET_CMD); -} - -static void sector_erase(uint64_t byte_addr) -{ - unlock(); - flash_write(UNLOCK0_ADDR, 0x80); - unlock(); - flash_write(byte_addr, SECTOR_ERASE_CMD); -} - -static void wait_for_completion(uint64_t byte_addr) -{ - /* If DQ6 is toggling, step the clock and ensure the toggle stops. */ - if ((flash_read(byte_addr) & 0x40) ^ (flash_read(byte_addr) & 0x40)) { - /* Wait for erase or program to finish. */ - clock_step_next(); - /* Ensure that DQ6 has stopped toggling. */ - g_assert_cmphex(flash_read(byte_addr), =3D=3D, flash_read(byte_add= r)); + /* Sanity check our tests. */ + assert((data & ~bank_mask(c)) =3D=3D 0); + uint64_t addr =3D BASE_ADDR + byte_addr; + switch (c->bank_width) { + case 1: + qtest_writeb(c->qtest, addr, data); + break; + case 2: + qtest_writew(c->qtest, addr, data); + break; + case 4: + qtest_writel(c->qtest, addr, data); + break; + case 8: + qtest_writeq(c->qtest, addr, data); + break; + default: + abort(); } } =20 -static void bypass_program(uint64_t byte_addr, uint16_t data) +static inline uint64_t flash_read(const FlashConfig *c, uint64_t byte_addr) { - flash_write(UNLOCK0_ADDR, PROGRAM_CMD); - flash_write(byte_addr, data); + uint64_t addr =3D BASE_ADDR + byte_addr; + switch (c->bank_width) { + case 1: + return qtest_readb(c->qtest, addr); + case 2: + return qtest_readw(c->qtest, addr); + case 4: + return qtest_readl(c->qtest, addr); + case 8: + return qtest_readq(c->qtest, addr); + default: + abort(); + } +} + +/* + * Convert a flash address expressed in the maximum width of the device as= a + * byte address. + */ +static inline uint64_t as_byte_addr(const FlashConfig *c, faddr flash_addr) +{ + /* + * Command addresses are always given as addresses in the maximum + * supported bus size for the flash chip. So an x8/x16 chip in x8 mode + * uses addresses 0xAAA and 0x555 to unlock because the least signific= ant + * bit is ignored. (0x555 rather than 0x554 is traditional.) + * + * In general we need to multiply by the maximum device width. + */ + return flash_addr.addr * c->bank_width; +} + +/* + * Return the command value or expected status replicated across all devic= es. + */ +static inline uint64_t replicate(const FlashConfig *c, uint64_t data) +{ + /* Sanity check our tests. */ + assert((data & ~device_mask(c)) =3D=3D 0); + return data; +} + +static inline void flash_cmd(const FlashConfig *c, faddr cmd_addr, + uint8_t cmd) +{ + flash_write(c, as_byte_addr(c, cmd_addr), replicate(c, cmd)); +} + +static inline uint64_t flash_query(const FlashConfig *c, faddr query_addr) +{ + return flash_read(c, as_byte_addr(c, query_addr)); +} + +static inline uint64_t flash_query_1(const FlashConfig *c, faddr query_add= r) +{ + return flash_query(c, query_addr) & device_mask(c); +} + +static void unlock(const FlashConfig *c) +{ + flash_cmd(c, UNLOCK0_ADDR, UNLOCK0_CMD); + flash_cmd(c, UNLOCK1_ADDR, UNLOCK1_CMD); +} + +static void reset(const FlashConfig *c) +{ + flash_cmd(c, FLASH_ADDR(0), RESET_CMD); +} + +static void sector_erase(const FlashConfig *c, uint64_t byte_addr) +{ + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, 0x80); + unlock(c); + flash_write(c, byte_addr, replicate(c, SECTOR_ERASE_CMD)); +} + +static void wait_for_completion(const FlashConfig *c, uint64_t byte_addr) +{ + /* If DQ6 is toggling, step the clock and ensure the toggle stops. */ + const uint64_t dq6 =3D replicate(c, 0x40); + if ((flash_read(c, byte_addr) & dq6) ^ (flash_read(c, byte_addr) & dq6= )) { + /* Wait for erase or program to finish. */ + qtest_clock_step_next(c->qtest); + /* Ensure that DQ6 has stopped toggling. */ + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, flash_read(c, by= te_addr)); + } +} + +static void bypass_program(const FlashConfig *c, uint64_t byte_addr, + uint16_t data) +{ + flash_cmd(c, UNLOCK0_ADDR, PROGRAM_CMD); + flash_write(c, byte_addr, data); /* * Data isn't valid until DQ6 stops toggling. We don't model this as * writes are immediate, but if this changes in the future, we can wait * until the program is complete. */ - wait_for_completion(byte_addr); + wait_for_completion(c, byte_addr); } =20 -static void program(uint64_t byte_addr, uint16_t data) +static void program(const FlashConfig *c, uint64_t byte_addr, uint16_t dat= a) { - unlock(); - bypass_program(byte_addr, data); + unlock(c); + bypass_program(c, byte_addr, data); } =20 -static void chip_erase(void) +static void chip_erase(const FlashConfig *c) { - unlock(); - flash_write(UNLOCK0_ADDR, 0x80); - unlock(); - flash_write(UNLOCK0_ADDR, SECTOR_ERASE_CMD); + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, 0x80); + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, CHIP_ERASE_CMD); } =20 -static void test_flash(void) +static void test_flash(const void *opaque) { - global_qtest =3D qtest_initf("-M musicpal,accel=3Dqtest " - "-drive if=3Dpflash,file=3D%s,format=3Draw,= copy-on-read", - image_path); + const FlashConfig *config =3D opaque; + QTestState *qtest; + qtest =3D qtest_initf("-M musicpal,accel=3Dqtest" + " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read", + image_path); + FlashConfig explicit_config =3D expand_config_defaults(config); + explicit_config.qtest =3D qtest; + const FlashConfig *c =3D &explicit_config; + /* Check the IDs. */ - unlock(); - flash_write(UNLOCK0_ADDR, AUTOSELECT_CMD); - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x0000), =3D=3D, 0x00BF); - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x0001), =3D=3D, 0x236D); - reset(); + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, AUTOSELECT_CMD); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + if (c->bank_width >=3D 2) { + /* + * XXX: The ID returned by the musicpal flash chip is 16 bits which + * wouldn't happen with an 8-bit device. It would probably be best= to + * prohibit addresses larger than the device width in pflash_cfi02= .c, + * but then we couldn't test smaller device widths at all. + */ + g_assert_cmphex(flash_query(c, FLASH_ADDR(1)), =3D=3D, + replicate(c, 0x236D)); + } + reset(c); =20 /* Check the erase blocks. */ - flash_write(CFI_ADDR, CFI_CMD); - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x10), =3D=3D, 'Q'); - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x11), =3D=3D, 'R'); - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x12), =3D=3D, 'Y'); - /* Num erase regions. */ - g_assert_cmphex(flash_read(FLASH_WIDTH * 0x2C), >=3D, 1); - uint32_t nb_sectors =3D flash_read(FLASH_WIDTH * 0x2D) + - (flash_read(FLASH_WIDTH * 0x2E) << 8) + 1; - uint32_t sector_len =3D (flash_read(FLASH_WIDTH * 0x2F) << 8) + - (flash_read(FLASH_WIDTH * 0x30) << 16); - reset(); + flash_cmd(c, CFI_ADDR, CFI_CMD); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x10)), =3D=3D, replicate(c,= 'Q')); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x11)), =3D=3D, replicate(c,= 'R')); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x12)), =3D=3D, replicate(c,= 'Y')); =20 + /* Num erase regions. */ + g_assert_cmphex(flash_query_1(c, FLASH_ADDR(0x2C)), >=3D, 1); + + uint32_t nb_sectors =3D flash_query_1(c, FLASH_ADDR(0x2D)) + + (flash_query_1(c, FLASH_ADDR(0x2E)) << 8) + 1; + uint32_t sector_len =3D (flash_query_1(c, FLASH_ADDR(0x2F)) << 8) + + (flash_query_1(c, FLASH_ADDR(0x30)) << 16); + reset(c); + + const uint64_t dq7 =3D replicate(c, 0x80); + const uint64_t dq6 =3D replicate(c, 0x40); /* Erase and program sector. */ for (uint32_t i =3D 0; i < nb_sectors; ++i) { uint64_t byte_addr =3D i * sector_len; - sector_erase(byte_addr); + sector_erase(c, byte_addr); /* Read toggle. */ - uint16_t status0 =3D flash_read(byte_addr); + uint64_t status0 =3D flash_read(c, byte_addr); /* DQ7 is 0 during an erase. */ - g_assert_cmphex(status0 & 0x80, =3D=3D, 0); - uint16_t status1 =3D flash_read(byte_addr); + g_assert_cmphex(status0 & dq7, =3D=3D, 0); + uint64_t status1 =3D flash_read(c, byte_addr); /* DQ6 toggles during an erase. */ - g_assert_cmphex(status0 & 0x40, !=3D, status1 & 0x40); + g_assert_cmphex(status0 & dq6, =3D=3D, ~status1 & dq6); /* Wait for erase to complete. */ - clock_step_next(); + qtest_clock_step_next(c->qtest); /* Ensure DQ6 has stopped toggling. */ - g_assert_cmphex(flash_read(byte_addr), =3D=3D, flash_read(byte_add= r)); + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, flash_read(c, by= te_addr)); /* Now the data should be valid. */ - g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0xFFFF); + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)); =20 /* Program a bit pattern. */ - program(byte_addr, 0x5555); - g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0x5555); - program(byte_addr, 0xAA55); - g_assert_cmphex(flash_read(byte_addr), =3D=3D, 0x0055); + program(c, byte_addr, 0x55); + g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x55); + program(c, byte_addr, 0xA5); + g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x05); } =20 /* Erase the chip. */ - chip_erase(); + chip_erase(c); /* Read toggle. */ - uint16_t status0 =3D flash_read(0); + uint64_t status0 =3D flash_read(c, 0); /* DQ7 is 0 during an erase. */ - g_assert_cmphex(status0 & 0x80, =3D=3D, 0); - uint16_t status1 =3D flash_read(0); + g_assert_cmphex(status0 & dq7, =3D=3D, 0); + uint64_t status1 =3D flash_read(c, 0); /* DQ6 toggles during an erase. */ - g_assert_cmphex(status0 & 0x40, !=3D, status1 & 0x40); + g_assert_cmphex(status0 & dq6, =3D=3D, ~status1 & dq6); /* Wait for erase to complete. */ - clock_step_next(); + qtest_clock_step_next(c->qtest); /* Ensure DQ6 has stopped toggling. */ - g_assert_cmphex(flash_read(0), =3D=3D, flash_read(0)); + g_assert_cmphex(flash_read(c, 0), =3D=3D, flash_read(c, 0)); /* Now the data should be valid. */ - g_assert_cmphex(flash_read(0), =3D=3D, 0xFFFF); + + for (uint32_t i =3D 0; i < nb_sectors; ++i) { + uint64_t byte_addr =3D i * sector_len; + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)); + } =20 /* Unlock bypass */ - unlock(); - flash_write(UNLOCK0_ADDR, UNLOCK_BYPASS_CMD); - bypass_program(0, 0x0123); - bypass_program(2, 0x4567); - bypass_program(4, 0x89AB); + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, UNLOCK_BYPASS_CMD); + bypass_program(c, 0 * c->bank_width, 0x01); + bypass_program(c, 1 * c->bank_width, 0x23); + bypass_program(c, 2 * c->bank_width, 0x45); /* * Test that bypass programming, unlike normal programming can use any * address for the PROGRAM_CMD. */ - flash_write(6, PROGRAM_CMD); - flash_write(6, 0xCDEF); - wait_for_completion(6); - flash_write(0, UNLOCK_BYPASS_RESET_CMD); - bypass_program(8, 0x55AA); /* Should fail. */ - g_assert_cmphex(flash_read(0), =3D=3D, 0x0123); - g_assert_cmphex(flash_read(2), =3D=3D, 0x4567); - g_assert_cmphex(flash_read(4), =3D=3D, 0x89AB); - g_assert_cmphex(flash_read(6), =3D=3D, 0xCDEF); - g_assert_cmphex(flash_read(8), =3D=3D, 0xFFFF); + flash_cmd(c, FLASH_ADDR(3 * c->bank_width), PROGRAM_CMD); + flash_write(c, 3 * c->bank_width, 0x67); + wait_for_completion(c, 3 * c->bank_width); + flash_cmd(c, FLASH_ADDR(0), UNLOCK_BYPASS_RESET_CMD); + bypass_program(c, 4 * c->bank_width, 0x89); /* Should fail. */ + g_assert_cmphex(flash_read(c, 0 * c->bank_width), =3D=3D, 0x01); + g_assert_cmphex(flash_read(c, 1 * c->bank_width), =3D=3D, 0x23); + g_assert_cmphex(flash_read(c, 2 * c->bank_width), =3D=3D, 0x45); + g_assert_cmphex(flash_read(c, 3 * c->bank_width), =3D=3D, 0x67); + g_assert_cmphex(flash_read(c, 4 * c->bank_width), =3D=3D, bank_mask(c)= ); =20 /* Test ignored high order bits of address. */ - flash_write(FLASH_WIDTH * 0x5555, UNLOCK0_CMD); - flash_write(FLASH_WIDTH * 0x2AAA, UNLOCK1_CMD); - flash_write(FLASH_WIDTH * 0x5555, AUTOSELECT_CMD); - g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0000), =3D=3D, 0x00BF); - g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0001), =3D=3D, 0x236D); - reset(); + flash_cmd(c, FLASH_ADDR(0x5555), UNLOCK0_CMD); + flash_cmd(c, FLASH_ADDR(0x2AAA), UNLOCK1_CMD); + flash_cmd(c, FLASH_ADDR(0x5555), AUTOSELECT_CMD); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + reset(c); =20 - qtest_quit(global_qtest); + qtest_quit(qtest); } =20 static void cleanup(void *opaque) @@ -206,6 +355,17 @@ static void cleanup(void *opaque) unlink(image_path); } =20 +/* + * XXX: Tests are limited to bank_width =3D 2 for now because that's what + * hw/arm/musicpal.c has. + */ +static const FlashConfig configuration[] =3D { + /* One x16 device. */ + { + .bank_width =3D 2, + }, +}; + int main(int argc, char **argv) { int fd =3D mkstemp(image_path); @@ -214,19 +374,27 @@ int main(int argc, char **argv) strerror(errno)); exit(EXIT_FAILURE); } - if (ftruncate(fd, 8 * 1024 * 1024) < 0) { + if (ftruncate(fd, FLASH_SIZE) < 0) { int error_code =3D errno; close(fd); unlink(image_path); - g_printerr("Failed to truncate file %s to 8 MB: %s\n", image_path, - strerror(error_code)); + g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path, + FLASH_SIZE, strerror(error_code)); exit(EXIT_FAILURE); } close(fd); =20 qtest_add_abrt_handler(cleanup, NULL); g_test_init(&argc, &argv, NULL); - qtest_add_func("pflash-cfi02", test_flash); + + size_t nb_configurations =3D sizeof configuration / sizeof configurati= on[0]; + for (size_t i =3D 0; i < nb_configurations; ++i) { + const FlashConfig *config =3D &configuration[i]; + char *path =3D g_strdup_printf("pflash-cfi02/%d", + config->bank_width); + qtest_add_data_func(path, config, test_flash); + g_free(path); + } int result =3D g_test_run(); cleanup(NULL); return result; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670413; cv=none; d=zoho.com; s=zohoarc; b=WlQzgCTJj/SqqXVZiuIayf/+qZ7Ki3J9Ice0BIM5sp8JB8WTI42fWTVtVn6AuQvWowJ57GpbjOideyT9dL05KxrLa2ZyMXzpWkGu09ProoL/9OkI3iz+Oszxx6lEzhnSexWyQnDEuDKsMZxW/B3AbZ1xmOMrhdkEi2SB2JBHMGE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670413; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=sG0mO0BHi9wXEjIwdF+boTy0yaqo0M6mtjONVqdf7u4=; b=XKGTPgYsqZQDZfHooK77ysCGasnPSTukUogsZ2P4/isjFUBZCmXyNE241jBmAWQM3CDXK2P9YYgSiLY2SNe+OLMOlLsf/ZdAxo0LLX8NVsTO58J+B9lWGV5V/yEdtMb1Lx/q4+0cn4k0AXUdKTEMmkpp4d6YJo8rR9BJQASTkeA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561670413087543.255092289397; Thu, 27 Jun 2019 14:20:13 -0700 (PDT) Received: from localhost ([::1]:54474 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbYG-0002Hj-H9 for importer@patchew.org; Thu, 27 Jun 2019 17:03:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46024) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1W-0002FY-PL for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1V-0000uv-Mg for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49496) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1N-0000fL-Iv; Thu, 27 Jun 2019 16:29:29 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 82C5E356DA; Thu, 27 Jun 2019 20:29:27 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5D50C600CC; Thu, 27 Jun 2019 20:29:22 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:05 +0200 Message-Id: <20190627202719.17739-15-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 27 Jun 2019 20:29:27 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 14/28] hw/block/pflash_cfi02: Remove pointless local variable X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" We can directly use pfl->total_len, remove the local 'chip_len' variable. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-6-stephen.checkoway@oberlin.edu> [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 4be3837be5..1a794fa83c 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -409,7 +409,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, /* Chip erase */ DPRINTF("%s: start chip erase\n", __func__); if (!pfl->ro) { - memset(pfl->storage, 0xFF, pfl->chip_len); + memset(pfl->storage, 0xff, pfl->chip_len); pflash_update(pfl, 0, pfl->chip_len); } set_dq7(pfl, 0x00); @@ -490,7 +490,6 @@ static const MemoryRegionOps pflash_cfi02_ops =3D { static void pflash_cfi02_realize(DeviceState *dev, Error **errp) { PFlashCFI02 *pfl =3D PFLASH_CFI02(dev); - uint32_t chip_len; int ret; Error *local_err =3D NULL; =20 @@ -507,18 +506,17 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) return; } =20 - chip_len =3D pfl->sector_len * pfl->nb_blocs; + pfl->chip_len =3D pfl->sector_len * pfl->nb_blocs; =20 memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), &pflash_cfi02_ops, pfl, pfl->name, - chip_len, &local_err); + pfl->chip_len, &local_err); if (local_err) { error_propagate(errp, local_err); return; } =20 pfl->storage =3D memory_region_get_ram_ptr(&pfl->orig_mem); - pfl->chip_len =3D chip_len; =20 if (pfl->blk) { uint64_t perm; @@ -533,8 +531,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) } =20 if (pfl->blk) { - if (!blk_check_size_and_read_all(pfl->blk, pfl->storage, chip_len, - errp)) { + if (!blk_check_size_and_read_all(pfl->blk, pfl->storage, + pfl->chip_len, errp)) { vmstate_unregister_ram(&pfl->orig_mem, DEVICE(pfl)); return; } @@ -594,7 +592,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) /* Max timeout for chip erase */ pfl->cfi_table[0x26] =3D 0x0D; /* Device size */ - pfl->cfi_table[0x27] =3D ctz32(chip_len); + pfl->cfi_table[0x27] =3D ctz32(pfl->chip_len); /* Flash device interface (8 & 16 bits) */ pfl->cfi_table[0x28] =3D 0x02; pfl->cfi_table[0x29] =3D 0x00; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668957; cv=none; d=zoho.com; s=zohoarc; b=fFa/jSx+d0FwY3Lh2n2QNOsxCvafVs0eZIol4Vm8velFFPgs8CxKf9DLpTH55WPabbCXK/5QymvLUrrpQEjiP+WLIqBI2jlmvzllI9PGYCeFqCL1fcvEi0sxvrLhZAZ3KWGzcO51R47paL03pUqEnuCAQCNv2vaRR5Mq4ZZh19o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668957; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=YOP/ljxbS18OjSNlpeWZm5XqOJH1JNBBFJ/vwrYo2D8=; b=EBmHEJwgn8oYhYIZW6rnDSdSjtuGNOo/d6E7ho7hmDZw+dC4q4xp42NDjlPFOpGOkiLKbGTz/vVfTBz5bqeyxmZAmDwHdYoN8WVGdnR98tr54fPqdqDN49Rn57AGPBHsFNqiY3t6LL6ND3sb69CYOIU7cmAQRq/AEQh24qSqT5g= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668957934617.1342776956473; Thu, 27 Jun 2019 13:55:57 -0700 (PDT) Received: from localhost ([::1]:54406 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbQr-0002hs-Mq for importer@patchew.org; Thu, 27 Jun 2019 16:55:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46079) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1c-0002NW-JU for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1b-00011x-EI for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33194) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1T-0000pz-OG; Thu, 27 Jun 2019 16:29:35 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 277C737F46; Thu, 27 Jun 2019 20:29:33 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id F3BE6600CC; Thu, 27 Jun 2019 20:29:27 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:06 +0200 Message-Id: <20190627202719.17739-16-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 27 Jun 2019 20:29:33 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 15/28] hw/block/pflash_cfi02: Document the current CFI values X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-6-stephen.checkoway@oberlin.edu> [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis --- hw/block/pflash_cfi02.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 1a794fa83c..f1bac480f5 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -550,6 +550,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->wcycle =3D 0; pfl->cmd =3D 0; pfl->status =3D 0; + /* Hardcoded CFI table (mostly from SG29 Spansion flash) */ /* Standard "QRY" string */ pfl->cfi_table[0x10] =3D 'Q'; @@ -575,7 +576,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->cfi_table[0x1D] =3D 0x00; /* Vpp max (no Vpp pin) */ pfl->cfi_table[0x1E] =3D 0x00; - /* Reserved */ + /* Timeout per single byte/word write (128 ms) */ pfl->cfi_table[0x1F] =3D 0x07; /* Timeout for min size buffer write (NA) */ pfl->cfi_table[0x20] =3D 0x00; @@ -614,17 +615,25 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) pfl->cfi_table[0x32] =3D 'R'; pfl->cfi_table[0x33] =3D 'I'; =20 + /* Extended version 1.0 */ pfl->cfi_table[0x34] =3D '1'; pfl->cfi_table[0x35] =3D '0'; =20 + /* Address sensitive unlock required. */ pfl->cfi_table[0x36] =3D 0x00; + /* Erase suspend not supported. */ pfl->cfi_table[0x37] =3D 0x00; + /* Sector protect not supported. */ pfl->cfi_table[0x38] =3D 0x00; + /* Temporary sector unprotect not supported. */ pfl->cfi_table[0x39] =3D 0x00; =20 + /* Sector protect/unprotect scheme. */ pfl->cfi_table[0x3a] =3D 0x00; =20 + /* Simultaneous operation not supported. */ pfl->cfi_table[0x3b] =3D 0x00; + /* Burst mode not supported. */ pfl->cfi_table[0x3c] =3D 0x00; } =20 --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561667810; cv=none; d=zoho.com; s=zohoarc; b=Bjl+CedxVBfuEHal2vDwyGX8Z7bR3shxjAe5gMUZuudG/at+0dyVE8khhigmW2pfw8WYZ/vUaqWtJivxeJ2UdPhnM2RBc8Vp9mEEkG139Wk9wHrq/vz3GLVp6bJMh2hRZV2/1t0cdF3SPQSK8eogv2zWDEbRMQ5LLd24FWCaqgU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561667810; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=OoXwSQ379f75RZiNG5V1yYayNlPT6Pmn/F3Rh5cyvjE=; b=mtNQDlWFAE2eBqowDgNqIyIJiZEB5dVqbh8pO/wSb8CEADK370gD+UVziKKo0lLBSsPmdT3bW53pqaBmRGfbb9Sd3RM1r7dEwfjmcYf/OtESzAL7Y2KBJHoTllRyT/e9GqD+vKdr8c34ekVsjB09QhOdbYJD+g/yBmceUHuEf2Y= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561667810009503.98539358197365; Thu, 27 Jun 2019 13:36:50 -0700 (PDT) Received: from localhost ([::1]:54214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb8N-0000UA-Tp for importer@patchew.org; Thu, 27 Jun 2019 16:36:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46148) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1i-0002n5-Cd for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1h-0001Ad-6l for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60838) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1c-00012L-96; Thu, 27 Jun 2019 16:29:44 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5FE2488305; Thu, 27 Jun 2019 20:29:43 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9685E600CC; Thu, 27 Jun 2019 20:29:33 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:07 +0200 Message-Id: <20190627202719.17739-17-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 27 Jun 2019 20:29:43 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 16/28] hw/block/pflash_cfi02: Hold the PRI table offset in a variable X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Manufacturers are allowed to move the PRI table, this is why the offset is queryable via fixed offsets 0x15/0x16. Add a variable to hold the offset, so it will be easier to later move the PRI table. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index f1bac480f5..23d05a6308 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -552,6 +552,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->status =3D 0; =20 /* Hardcoded CFI table (mostly from SG29 Spansion flash) */ + const uint16_t pri_ofs =3D 0x31; /* Standard "QRY" string */ pfl->cfi_table[0x10] =3D 'Q'; pfl->cfi_table[0x11] =3D 'R'; @@ -560,8 +561,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->cfi_table[0x13] =3D 0x02; pfl->cfi_table[0x14] =3D 0x00; /* Primary extended table address */ - pfl->cfi_table[0x15] =3D 0x31; - pfl->cfi_table[0x16] =3D 0x00; + pfl->cfi_table[0x15] =3D pri_ofs; + pfl->cfi_table[0x16] =3D pri_ofs >> 8; /* Alternate command set (none) */ pfl->cfi_table[0x17] =3D 0x00; pfl->cfi_table[0x18] =3D 0x00; @@ -609,32 +610,34 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) pfl->cfi_table[0x2E] =3D (pfl->nb_blocs - 1) >> 8; pfl->cfi_table[0x2F] =3D pfl->sector_len >> 8; pfl->cfi_table[0x30] =3D pfl->sector_len >> 16; + assert(0x30 < pri_ofs); =20 /* Extended */ - pfl->cfi_table[0x31] =3D 'P'; - pfl->cfi_table[0x32] =3D 'R'; - pfl->cfi_table[0x33] =3D 'I'; + pfl->cfi_table[0x00 + pri_ofs] =3D 'P'; + pfl->cfi_table[0x01 + pri_ofs] =3D 'R'; + pfl->cfi_table[0x02 + pri_ofs] =3D 'I'; =20 /* Extended version 1.0 */ - pfl->cfi_table[0x34] =3D '1'; - pfl->cfi_table[0x35] =3D '0'; + pfl->cfi_table[0x03 + pri_ofs] =3D '1'; + pfl->cfi_table[0x04 + pri_ofs] =3D '0'; =20 /* Address sensitive unlock required. */ - pfl->cfi_table[0x36] =3D 0x00; + pfl->cfi_table[0x05 + pri_ofs] =3D 0x00; /* Erase suspend not supported. */ - pfl->cfi_table[0x37] =3D 0x00; + pfl->cfi_table[0x06 + pri_ofs] =3D 0x00; /* Sector protect not supported. */ - pfl->cfi_table[0x38] =3D 0x00; + pfl->cfi_table[0x07 + pri_ofs] =3D 0x00; /* Temporary sector unprotect not supported. */ - pfl->cfi_table[0x39] =3D 0x00; + pfl->cfi_table[0x08 + pri_ofs] =3D 0x00; =20 /* Sector protect/unprotect scheme. */ - pfl->cfi_table[0x3a] =3D 0x00; + pfl->cfi_table[0x09 + pri_ofs] =3D 0x00; =20 /* Simultaneous operation not supported. */ - pfl->cfi_table[0x3b] =3D 0x00; + pfl->cfi_table[0x0a + pri_ofs] =3D 0x00; /* Burst mode not supported. */ - pfl->cfi_table[0x3c] =3D 0x00; + pfl->cfi_table[0x0b + pri_ofs] =3D 0x00; + assert(0x0b + pri_ofs < ARRAY_SIZE(pfl->cfi_table)); } =20 static Property pflash_cfi02_properties[] =3D { --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561669166; cv=none; d=zoho.com; s=zohoarc; b=SfA9bHBoHQfprB5jyEcP7fjXTD2s5JabB+bAn/WWE0VmPcJxDFz1d7fwKdzPgAzl7OgdeT/5npya70qV0yGi1kyFxiwH+IZMxvh5fSxNi7C7de4nAKy9dvi874WiclkmEA6Dyn0dDbBvvFd/Puj7GIDXxINwqWlR1l4JByw8iYs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561669166; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=rcxLJhJzg6YUFzrfiag3q6XxASLpwX1JP+iDG0mhOU8=; b=V9W19NrR5jFxrKJ0/P5D8xRyS0MbtiXBWZCA+d95QrACI5Va3ocud4+eeW5SeDJ3ZOdbU9xxxHDMIoahICx/9WNqNfi5WoqHm6dBY2gm7+oDDmhBcakuevLtIQGkWdkDyt1vG8d7VnfkWl9DKXgtkC+ZEyS7j86PkX/VJ4/LVAU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561669166126301.5981409283431; Thu, 27 Jun 2019 13:59:26 -0700 (PDT) Received: from localhost ([::1]:54446 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbUG-0007j2-T2 for importer@patchew.org; Thu, 27 Jun 2019 16:59:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46216) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb1n-00037n-92 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb1m-0001LA-9y for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:29:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47669) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1h-0001Aj-QL; Thu, 27 Jun 2019 16:29:49 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 02E6F307D859; Thu, 27 Jun 2019 20:29:49 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D0E0C600CC; Thu, 27 Jun 2019 20:29:43 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:08 +0200 Message-Id: <20190627202719.17739-18-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Thu, 27 Jun 2019 20:29:49 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 17/28] hw/block/pflash_cfi02: Document 'Page Mode' operations are not supported X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The 'page mode' feature entry was implicitly set as zero (not supported). Document it exists, so we won't discard it if we squeeze the CFI table. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-6-stephen.checkoway@oberlin.edu> [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 23d05a6308..01d9c5d75a 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -637,7 +637,9 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->cfi_table[0x0a + pri_ofs] =3D 0x00; /* Burst mode not supported. */ pfl->cfi_table[0x0b + pri_ofs] =3D 0x00; - assert(0x0b + pri_ofs < ARRAY_SIZE(pfl->cfi_table)); + /* Page mode not supported. */ + pfl->cfi_table[0x0c + pri_ofs] =3D 0x00; + assert(0x0c + pri_ofs < ARRAY_SIZE(pfl->cfi_table)); } =20 static Property pflash_cfi02_properties[] =3D { --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668146; cv=none; d=zoho.com; s=zohoarc; b=kqU8Kus0f5HKyyfV5JAzu78XBPt6DveuzUUDDeaepVahi6ZOb5BpLRrR1naZi3OCblwnowdDovIj/Q4UUcrvxYNVPAAg3qc9l3YR2QWWBgl+Cj+LksQl6aOClUsDya8l/COv7ShHQrs6sHuGQil6+re5baEErx4UqsEtQF0xwtU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668146; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=YcoNSECPvOQki/7IbGCwy/u4Rkf7kH57uu1XMOhodrQ=; b=XkFe31Ai1H8F7qAc5S+KrvqMKVwQ2JrUc0L2VbP8m5VZ3MD8jF1FCQ7Fij81AVyp6NvCOQ5ca6Z28nZuEzV3at5Onmr7fy/+p1U2TkmDkjqZPlH/bovfTSZPAxvan2hBktts/1BWhAdmKhMJ6WG7Ynt1d5E8XB92+tBe2UWeBGY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668146449389.39155419619044; Thu, 27 Jun 2019 13:42:26 -0700 (PDT) Received: from localhost ([::1]:54256 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbDp-0004kO-6H for importer@patchew.org; Thu, 27 Jun 2019 16:42:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46383) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2Y-0003uX-OJ for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2J-00026F-2Q for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46210) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb1n-0001MT-MX; Thu, 27 Jun 2019 16:29:55 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D02A2C057F4B; Thu, 27 Jun 2019 20:29:54 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 75E10600CC; Thu, 27 Jun 2019 20:29:49 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:09 +0200 Message-Id: <20190627202719.17739-19-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Jun 2019 20:29:55 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 18/28] hw/block/pflash_cfi02: Implement nonuniform sector sizes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway Some flash chips support sectors of different sizes. For example, the AMD AM29LV160DT has 31 64 kB sectors, one 32 kB sector, two 8 kB sectors, and a 16 kB sector, in that order. The AM29LV160DB has those in the reverse order. The `num-blocks` and `sector-length` properties work exactly as they did before: a flash device with uniform sector lengths. To get non-uniform sector lengths for up to four regions, the following properties may be set - region 0. `num-blocks0` and `sector-length0`; - region 1. `num-blocks1` and `sector-length1`; - region 2. `num-blocks2` and `sector-length2`; and - region 3. `num-blocks3` and `sector-length3`. If the uniform and nonuniform properties are set, then both must specify a flash device with the same total size. It would be better to disallow both being set, or make `num-blocks0` and `sector-length0` alias `num-blocks` and `sector-length`, but that would make testing currently impossible. Signed-off-by: Stephen Checkoway Acked-by: Thomas Huth Message-Id: <20190426162624.55977-6-stephen.checkoway@oberlin.edu> [PMD: Rebased, add assert() on pri_offset] Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi02.c | 141 +++++++++++++++++++++++++++------- tests/pflash-cfi02-test.c | 155 ++++++++++++++++++++++++++++---------- 2 files changed, 231 insertions(+), 65 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 01d9c5d75a..1f096ec185 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -29,7 +29,6 @@ * - CFI queries * * It does not support flash interleaving. - * It does not implement boot blocs with reduced size * It does not implement software data protection as found in many real ch= ips * It does not implement erase suspend/resume commands * It does not implement multiple sectors erase @@ -57,6 +56,13 @@ do { = \ =20 #define PFLASH_LAZY_ROMD_THRESHOLD 42 =20 +/* + * The size of the cfi_table indirectly depends on this and the start of t= he + * PRI table directly depends on it. 4 is the maximum size (and also what + * seems common) without changing the PRT table address. + */ +#define PFLASH_MAX_ERASE_REGIONS 4 + /* Special write cycles for CFI queries. */ enum { WCYCLE_CFI =3D 7, @@ -68,8 +74,10 @@ struct PFlashCFI02 { /*< public >*/ =20 BlockBackend *blk; - uint32_t sector_len; - uint32_t nb_blocs; + uint32_t uniform_nb_blocs; + uint32_t uniform_sector_len; + uint32_t nb_blocs[PFLASH_MAX_ERASE_REGIONS]; + uint32_t sector_len[PFLASH_MAX_ERASE_REGIONS]; uint32_t chip_len; uint8_t mappings; uint8_t width; @@ -86,7 +94,7 @@ struct PFlashCFI02 { uint16_t ident3; uint16_t unlock_addr0; uint16_t unlock_addr1; - uint8_t cfi_table[0x52]; + uint8_t cfi_table[0x4d]; QEMUTimer timer; /* The device replicates the flash memory across its memory space. Em= ulate * that by having a container (.mem) filled with an array of aliases @@ -177,6 +185,25 @@ static uint64_t pflash_data_read(PFlashCFI02 *pfl, hwa= ddr offset, return ret; } =20 +/* + * offset should be a byte offset of the QEMU device and _not_ a device + * offset. + */ +static uint32_t pflash_sector_len(PFlashCFI02 *pfl, hwaddr offset) +{ + assert(offset < pfl->chip_len); + int nb_regions =3D pfl->cfi_table[0x2C]; + hwaddr addr =3D 0; + for (int i =3D 0; i < nb_regions; ++i) { + uint64_t region_size =3D (uint64_t)pfl->nb_blocs[i] * pfl->sector_= len[i]; + if (addr <=3D offset && offset < addr + region_size) { + return pfl->sector_len[i]; + } + addr +=3D region_size; + } + abort(); +} + static uint64_t pflash_read(void *opaque, hwaddr offset, unsigned int widt= h) { PFlashCFI02 *pfl =3D opaque; @@ -191,10 +218,11 @@ static uint64_t pflash_read(void *opaque, hwaddr offs= et, unsigned int width) } offset &=3D pfl->chip_len - 1; boff =3D offset & 0xFF; - if (pfl->width =3D=3D 2) + if (pfl->width =3D=3D 2) { boff =3D boff >> 1; - else if (pfl->width =3D=3D 4) + } else if (pfl->width =3D=3D 4) { boff =3D boff >> 2; + } switch (pfl->cmd) { default: /* This should never happen : reset state & treat it as a read*/ @@ -273,6 +301,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, hwaddr boff; uint8_t *p; uint8_t cmd; + uint32_t sector_len; =20 trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; @@ -282,10 +311,11 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, offset &=3D pfl->chip_len - 1; =20 boff =3D offset; - if (pfl->width =3D=3D 2) + if (pfl->width =3D=3D 2) { boff =3D boff >> 1; - else if (pfl->width =3D=3D 4) + } else if (pfl->width =3D=3D 4) { boff =3D boff >> 2; + } /* Only the least-significant 11 bits are used in most cases. */ boff &=3D 0x7FF; switch (pfl->wcycle) { @@ -420,12 +450,14 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, case 0x30: /* Sector erase */ p =3D pfl->storage; - offset &=3D ~(pfl->sector_len - 1); - DPRINTF("%s: start sector erase at " TARGET_FMT_plx "\n", __fu= nc__, - offset); + sector_len =3D pflash_sector_len(pfl, offset); + offset &=3D ~(sector_len - 1); + DPRINTF("%s: start sector erase at %0*" PRIx64 "-%0*" PRIx64 "= \n", + __func__, pfl->width * 2, offset, + pfl->width * 2, offset + sector_len - 1); if (!pfl->ro) { - memset(p + offset, 0xFF, pfl->sector_len); - pflash_update(pfl, offset, pfl->sector_len); + memset(p + offset, 0xff, sector_len); + pflash_update(pfl, offset, sector_len); } set_dq7(pfl, 0x00); /* Let's wait 1/2 second before sector erase is done */ @@ -493,11 +525,11 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) int ret; Error *local_err =3D NULL; =20 - if (pfl->sector_len =3D=3D 0) { + if (pfl->uniform_sector_len =3D=3D 0 && pfl->sector_len[0] =3D=3D 0) { error_setg(errp, "attribute \"sector-length\" not specified or zer= o."); return; } - if (pfl->nb_blocs =3D=3D 0) { + if (pfl->uniform_nb_blocs =3D=3D 0 && pfl->nb_blocs[0] =3D=3D 0) { error_setg(errp, "attribute \"num-blocks\" not specified or zero."= ); return; } @@ -506,7 +538,51 @@ static void pflash_cfi02_realize(DeviceState *dev, Err= or **errp) return; } =20 - pfl->chip_len =3D pfl->sector_len * pfl->nb_blocs; + int nb_regions; + pfl->chip_len =3D 0; + for (nb_regions =3D 0; nb_regions < PFLASH_MAX_ERASE_REGIONS; ++nb_reg= ions) { + if (pfl->nb_blocs[nb_regions] =3D=3D 0) { + break; + } + uint64_t sector_len_per_device =3D pfl->sector_len[nb_regions]; + + /* + * The size of each flash sector must be a power of 2 and it must = be + * aligned at the same power of 2. + */ + if (sector_len_per_device & 0xff || + sector_len_per_device >=3D (1 << 24) || + !is_power_of_2(sector_len_per_device)) + { + error_setg(errp, "unsupported configuration: " + "sector length[%d] per device =3D %" PRIx64 ".", + nb_regions, sector_len_per_device); + return; + } + if (pfl->chip_len & (sector_len_per_device - 1)) { + error_setg(errp, "unsupported configuration: " + "flash region %d not correctly aligned.", + nb_regions); + return; + } + + pfl->chip_len +=3D (uint64_t)pfl->sector_len[nb_regions] * + pfl->nb_blocs[nb_regions]; + } + + uint64_t uniform_len =3D (uint64_t)pfl->uniform_nb_blocs * + pfl->uniform_sector_len; + if (nb_regions =3D=3D 0) { + nb_regions =3D 1; + pfl->nb_blocs[0] =3D pfl->uniform_nb_blocs; + pfl->sector_len[0] =3D pfl->uniform_sector_len; + pfl->chip_len =3D uniform_len; + } else if (uniform_len !=3D 0 && uniform_len !=3D pfl->chip_len) { + error_setg(errp, "\"num-blocks\"*\"sector-length\" " + "different from \"num-blocks0\"*\'sector-length0\" + ..= . + " + "\"num-blocks3\"*\"sector-length3\""); + return; + } =20 memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), &pflash_cfi02_ops, pfl, pfl->name, @@ -552,7 +628,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->status =3D 0; =20 /* Hardcoded CFI table (mostly from SG29 Spansion flash) */ - const uint16_t pri_ofs =3D 0x31; + const uint16_t pri_ofs =3D 0x40; /* Standard "QRY" string */ pfl->cfi_table[0x10] =3D 'Q'; pfl->cfi_table[0x11] =3D 'R'; @@ -603,14 +679,17 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) // pfl->cfi_table[0x2A] =3D 0x05; pfl->cfi_table[0x2A] =3D 0x00; pfl->cfi_table[0x2B] =3D 0x00; - /* Number of erase block regions (uniform) */ - pfl->cfi_table[0x2C] =3D 0x01; - /* Erase block region 1 */ - pfl->cfi_table[0x2D] =3D pfl->nb_blocs - 1; - pfl->cfi_table[0x2E] =3D (pfl->nb_blocs - 1) >> 8; - pfl->cfi_table[0x2F] =3D pfl->sector_len >> 8; - pfl->cfi_table[0x30] =3D pfl->sector_len >> 16; - assert(0x30 < pri_ofs); + /* Number of erase block regions */ + pfl->cfi_table[0x2c] =3D nb_regions; + /* Erase block regions */ + for (int i =3D 0; i < nb_regions; ++i) { + uint32_t sector_len_per_device =3D pfl->sector_len[i]; + pfl->cfi_table[0x2d + 4 * i] =3D pfl->nb_blocs[i] - 1; + pfl->cfi_table[0x2e + 4 * i] =3D (pfl->nb_blocs[i] - 1) >> 8; + pfl->cfi_table[0x2f + 4 * i] =3D sector_len_per_device >> 8; + pfl->cfi_table[0x30 + 4 * i] =3D sector_len_per_device >> 16; + } + assert(0x2c + 4 * nb_regions < pri_ofs); =20 /* Extended */ pfl->cfi_table[0x00 + pri_ofs] =3D 'P'; @@ -644,8 +723,16 @@ static void pflash_cfi02_realize(DeviceState *dev, Err= or **errp) =20 static Property pflash_cfi02_properties[] =3D { DEFINE_PROP_DRIVE("drive", PFlashCFI02, blk), - DEFINE_PROP_UINT32("num-blocks", PFlashCFI02, nb_blocs, 0), - DEFINE_PROP_UINT32("sector-length", PFlashCFI02, sector_len, 0), + DEFINE_PROP_UINT32("num-blocks", PFlashCFI02, uniform_nb_blocs, 0), + DEFINE_PROP_UINT32("sector-length", PFlashCFI02, uniform_sector_len, 0= ), + DEFINE_PROP_UINT32("num-blocks0", PFlashCFI02, nb_blocs[0], 0), + DEFINE_PROP_UINT32("sector-length0", PFlashCFI02, sector_len[0], 0), + DEFINE_PROP_UINT32("num-blocks1", PFlashCFI02, nb_blocs[1], 0), + DEFINE_PROP_UINT32("sector-length1", PFlashCFI02, sector_len[1], 0), + DEFINE_PROP_UINT32("num-blocks2", PFlashCFI02, nb_blocs[2], 0), + DEFINE_PROP_UINT32("sector-length2", PFlashCFI02, sector_len[2], 0), + DEFINE_PROP_UINT32("num-blocks3", PFlashCFI02, nb_blocs[3], 0), + DEFINE_PROP_UINT32("sector-length3", PFlashCFI02, sector_len[3], 0), DEFINE_PROP_UINT8("width", PFlashCFI02, width, 0), DEFINE_PROP_UINT8("mappings", PFlashCFI02, mappings, 0), DEFINE_PROP_UINT8("big-endian", PFlashCFI02, be, 0), diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index b00f5ca2e7..1659eaebce 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -17,9 +17,11 @@ */ =20 #define MP_FLASH_SIZE_MAX (32 * 1024 * 1024) -#define FLASH_SIZE (8 * 1024 * 1024) #define BASE_ADDR (0x100000000ULL - MP_FLASH_SIZE_MAX) =20 +#define UNIFORM_FLASH_SIZE (8 * 1024 * 1024) +#define UNIFORM_FLASH_SECTOR_SIZE (64 * 1024) + /* Use a newtype to keep flash addresses separate from byte addresses. */ typedef struct { uint64_t addr; @@ -44,6 +46,10 @@ typedef struct { typedef struct { int bank_width; =20 + /* Nonuniform block size. */ + int nb_blocs[4]; + int sector_len[4]; + QTestState *qtest; } FlashConfig; =20 @@ -62,6 +68,10 @@ static FlashConfig expand_config_defaults(const FlashCon= fig *c) if (ret.bank_width =3D=3D 0) { ret.bank_width =3D 2; } + if (ret.nb_blocs[0] =3D=3D 0 && ret.sector_len[0] =3D=3D 0) { + ret.sector_len[0] =3D UNIFORM_FLASH_SECTOR_SIZE; + ret.nb_blocs[0] =3D UNIFORM_FLASH_SIZE / UNIFORM_FLASH_SECTOR_SIZE; + } =20 /* XXX: Limitations of test harness. */ assert(ret.bank_width =3D=3D 2); @@ -230,13 +240,41 @@ static void chip_erase(const FlashConfig *c) flash_cmd(c, UNLOCK0_ADDR, CHIP_ERASE_CMD); } =20 -static void test_flash(const void *opaque) +/* + * Test flash commands with a variety of device geometry. + */ +static void test_geometry(const void *opaque) { const FlashConfig *config =3D opaque; QTestState *qtest; qtest =3D qtest_initf("-M musicpal,accel=3Dqtest" - " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read", - image_path); + " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read" + /* Device geometry properties. */ + " -global driver=3Dcfi.pflash02," + "property=3Dnum-blocks0,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dsector-length0,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dnum-blocks1,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dsector-length1,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dnum-blocks2,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dsector-length2,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dnum-blocks3,value=3D%d" + " -global driver=3Dcfi.pflash02," + "property=3Dsector-length3,value=3D%d", + image_path, + config->nb_blocs[0], + config->sector_len[0], + config->nb_blocs[1], + config->sector_len[1], + config->nb_blocs[2], + config->sector_len[2], + config->nb_blocs[3], + config->sector_len[3]); FlashConfig explicit_config =3D expand_config_defaults(config); explicit_config.qtest =3D qtest; const FlashConfig *c =3D &explicit_config; @@ -264,39 +302,56 @@ static void test_flash(const void *opaque) g_assert_cmphex(flash_query(c, FLASH_ADDR(0x12)), =3D=3D, replicate(c,= 'Y')); =20 /* Num erase regions. */ - g_assert_cmphex(flash_query_1(c, FLASH_ADDR(0x2C)), >=3D, 1); + int nb_erase_regions =3D flash_query_1(c, FLASH_ADDR(0x2C)); + g_assert_cmphex(nb_erase_regions, =3D=3D, + !!c->nb_blocs[0] + !!c->nb_blocs[1] + !!c->nb_blocs[2]= + + !!c->nb_blocs[3]); + + /* Check device length. */ + uint32_t device_len =3D 1 << flash_query_1(c, FLASH_ADDR(0x27)); + g_assert_cmphex(device_len, =3D=3D, UNIFORM_FLASH_SIZE); =20 - uint32_t nb_sectors =3D flash_query_1(c, FLASH_ADDR(0x2D)) + - (flash_query_1(c, FLASH_ADDR(0x2E)) << 8) + 1; - uint32_t sector_len =3D (flash_query_1(c, FLASH_ADDR(0x2F)) << 8) + - (flash_query_1(c, FLASH_ADDR(0x30)) << 16); reset(c); =20 const uint64_t dq7 =3D replicate(c, 0x80); const uint64_t dq6 =3D replicate(c, 0x40); - /* Erase and program sector. */ - for (uint32_t i =3D 0; i < nb_sectors; ++i) { - uint64_t byte_addr =3D i * sector_len; - sector_erase(c, byte_addr); - /* Read toggle. */ - uint64_t status0 =3D flash_read(c, byte_addr); - /* DQ7 is 0 during an erase. */ - g_assert_cmphex(status0 & dq7, =3D=3D, 0); - uint64_t status1 =3D flash_read(c, byte_addr); - /* DQ6 toggles during an erase. */ - g_assert_cmphex(status0 & dq6, =3D=3D, ~status1 & dq6); - /* Wait for erase to complete. */ - qtest_clock_step_next(c->qtest); - /* Ensure DQ6 has stopped toggling. */ - g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, flash_read(c, by= te_addr)); - /* Now the data should be valid. */ - g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)); + uint64_t byte_addr =3D 0; + for (int region =3D 0; region < nb_erase_regions; ++region) { + uint64_t base =3D 0x2D + 4 * region; + flash_cmd(c, CFI_ADDR, CFI_CMD); + uint32_t nb_sectors =3D flash_query_1(c, FLASH_ADDR(base + 0)) + + (flash_query_1(c, FLASH_ADDR(base + 1)) << 8= ) + 1; + uint32_t sector_len =3D (flash_query_1(c, FLASH_ADDR(base + 2)) <<= 8) + + (flash_query_1(c, FLASH_ADDR(base + 3)) << 1= 6); + g_assert_cmphex(nb_sectors, =3D=3D, c->nb_blocs[region]); + g_assert_cmphex(sector_len, =3D=3D, c->sector_len[region]); + reset(c); =20 - /* Program a bit pattern. */ - program(c, byte_addr, 0x55); - g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x55); - program(c, byte_addr, 0xA5); - g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x05); + /* Erase and program sector. */ + for (uint32_t i =3D 0; i < nb_sectors; ++i) { + sector_erase(c, byte_addr); + /* Read toggle. */ + uint64_t status0 =3D flash_read(c, byte_addr); + /* DQ7 is 0 during an erase. */ + g_assert_cmphex(status0 & dq7, =3D=3D, 0); + uint64_t status1 =3D flash_read(c, byte_addr); + /* DQ6 toggles during an erase. */ + g_assert_cmphex(status0 & dq6, =3D=3D, ~status1 & dq6); + /* Wait for erase to complete. */ + qtest_clock_step_next(c->qtest); + /* Ensure DQ6 has stopped toggling. */ + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, + flash_read(c, byte_addr)); + /* Now the data should be valid. */ + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)= ); + + /* Program a bit pattern. */ + program(c, byte_addr, 0x55); + g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x55); + program(c, byte_addr, 0xA5); + g_assert_cmphex(flash_read(c, byte_addr) & 0xFF, =3D=3D, 0x05); + byte_addr +=3D sector_len; + } } =20 /* Erase the chip. */ @@ -314,9 +369,11 @@ static void test_flash(const void *opaque) g_assert_cmphex(flash_read(c, 0), =3D=3D, flash_read(c, 0)); /* Now the data should be valid. */ =20 - for (uint32_t i =3D 0; i < nb_sectors; ++i) { - uint64_t byte_addr =3D i * sector_len; - g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)); + for (int region =3D 0; region < nb_erase_regions; ++region) { + for (uint32_t i =3D 0; i < c->nb_blocs[region]; ++i) { + uint64_t byte_addr =3D i * c->sector_len[region]; + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)= ); + } } =20 /* Unlock bypass */ @@ -364,6 +421,18 @@ static const FlashConfig configuration[] =3D { { .bank_width =3D 2, }, + /* Nonuniform sectors (top boot). */ + { + .bank_width =3D 2, + .nb_blocs =3D { 127, 1, 2, 1 }, + .sector_len =3D { 0x10000, 0x08000, 0x02000, 0x04000 }, + }, + /* Nonuniform sectors (bottom boot). */ + { + .bank_width =3D 2, + .nb_blocs =3D { 1, 2, 1, 127 }, + .sector_len =3D { 0x04000, 0x02000, 0x08000, 0x10000 }, + }, }; =20 int main(int argc, char **argv) @@ -374,12 +443,12 @@ int main(int argc, char **argv) strerror(errno)); exit(EXIT_FAILURE); } - if (ftruncate(fd, FLASH_SIZE) < 0) { + if (ftruncate(fd, UNIFORM_FLASH_SIZE) < 0) { int error_code =3D errno; close(fd); unlink(image_path); g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path, - FLASH_SIZE, strerror(error_code)); + UNIFORM_FLASH_SIZE, strerror(error_code)); exit(EXIT_FAILURE); } close(fd); @@ -390,9 +459,19 @@ int main(int argc, char **argv) size_t nb_configurations =3D sizeof configuration / sizeof configurati= on[0]; for (size_t i =3D 0; i < nb_configurations; ++i) { const FlashConfig *config =3D &configuration[i]; - char *path =3D g_strdup_printf("pflash-cfi02/%d", + char *path =3D g_strdup_printf("pflash-cfi02" + "/geometry/%dx%x-%dx%x-%dx%x-%dx%x" + "/%d", + config->nb_blocs[0], + config->sector_len[0], + config->nb_blocs[1], + config->sector_len[1], + config->nb_blocs[2], + config->sector_len[2], + config->nb_blocs[3], + config->sector_len[3], config->bank_width); - qtest_add_data_func(path, config, test_flash); + qtest_add_data_func(path, config, test_geometry); g_free(path); } int result =3D g_test_run(); --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668998; cv=none; d=zoho.com; s=zohoarc; b=nllM5HWq5CNEP8kWtllI71pNiovKFBnflSANveqyIIgTvd9UcfgS5fxW/bVg30UOU3ArO7j1U8bFUP5DpE3Ydn4ARmP+vrE+XQSdhtIokeFPXWor1VgA3hfFKiKPfD6e1/DiryBSlfkMXNSSEOjeI793IpmpaQB0/0H7XSCwTcs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668998; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=JGPSBMwY03hH8u7Mj2TPONMetGABoq4pznLaaz0Femc=; b=iug5FY6D6GOWD+dQ4FA2G54g6ljdTmlDhlDTj6c+owyr0hXGE0d4XUkTyW42iV3RoEeUGtv4Q3HLGn4enpnz82ThL2CtsEXwR6Xp2ccxI3DQ7yQ21VMx6oqj7foGiU7xA2rouhJOwRb/gjVG8zmdE3AqPJEAxlP9rHGHFeUvb1E= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668998489778.8434438991408; Thu, 27 Jun 2019 13:56:38 -0700 (PDT) Received: from localhost ([::1]:54408 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbRX-0003kP-IH for importer@patchew.org; Thu, 27 Jun 2019 16:56:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46460) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2d-000412-KQ for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2b-0002SS-T2 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47543) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb27-0001gS-8r; Thu, 27 Jun 2019 16:30:16 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 000B5882FF; Thu, 27 Jun 2019 20:30:05 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4920B600CC; Thu, 27 Jun 2019 20:29:55 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:10 +0200 Message-Id: <20190627202719.17739-20-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 27 Jun 2019 20:30:06 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 19/28] hw/block/pflash_cfi02: Extract pflash_regions_count() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Extract the pflash_regions_count() function, the code will be easier to review. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 1f096ec185..a0d3bd60dc 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -157,6 +157,11 @@ static void pflash_register_memory(PFlashCFI02 *pfl, i= nt rom_mode) pfl->rom_mode =3D rom_mode; } =20 +static size_t pflash_regions_count(PFlashCFI02 *pfl) +{ + return pfl->cfi_table[0x2c]; +} + static void pflash_timer (void *opaque) { PFlashCFI02 *pfl =3D opaque; @@ -192,9 +197,8 @@ static uint64_t pflash_data_read(PFlashCFI02 *pfl, hwad= dr offset, static uint32_t pflash_sector_len(PFlashCFI02 *pfl, hwaddr offset) { assert(offset < pfl->chip_len); - int nb_regions =3D pfl->cfi_table[0x2C]; hwaddr addr =3D 0; - for (int i =3D 0; i < nb_regions; ++i) { + for (int i =3D 0; i < pflash_regions_count(pfl); ++i) { uint64_t region_size =3D (uint64_t)pfl->nb_blocs[i] * pfl->sector_= len[i]; if (addr <=3D offset && offset < addr + region_size) { return pfl->sector_len[i]; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668354; cv=none; d=zoho.com; s=zohoarc; b=dqAIxaEiYkHaKz3P2rXBU18c2RSdNXr+ecN5n52qHwGIXtj4w5jn+oePGqiZ5Ilx/gDUGf6phs9wyyrmTwnSjqAgssKibsDSIRndhcKZz9Hc7SzLnSccNtwUiOadJym8SY4azbYc8NP8q4gkAuMGNyducyfWG27Vksc+bDp0JSw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668354; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=KxGZVGKVtgxBFb4VQ0GXKN1vlWua7CPVa9GXBDDqmEM=; b=J11h6bDD6OaI5PVxKTe/wLU89TJIB3mPScfYNeg6dIw7X68VJePGXopoEkewVbKQBSckn734dvG8s5zqCJZYwWnrTOE/vMi7NNrOrfhYTnVQrGWHf4Gew9PqOdgWZgjaMDjEhRbpqK9p2Dr4mHg5QKxSiAIhnflPQnV7bZwkd1E= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561668354382330.9628110155551; Thu, 27 Jun 2019 13:45:54 -0700 (PDT) Received: from localhost ([::1]:54284 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbHA-0000jd-Ik for importer@patchew.org; Thu, 27 Jun 2019 16:45:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46452) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2d-00040T-9g for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2b-0002Sm-UA for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35540) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb29-0001sR-6e; Thu, 27 Jun 2019 16:30:18 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 16F2183F45; Thu, 27 Jun 2019 20:30:14 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6BB4D6012D; Thu, 27 Jun 2019 20:30:06 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:11 +0200 Message-Id: <20190627202719.17739-21-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 27 Jun 2019 20:30:14 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 20/28] hw/block/pflash_cfi02: Split if() condition X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Split the if() condition check and arrange the indentation to ease the review of the next patches. No logical change. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index a0d3bd60dc..08b2bc83cb 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -309,8 +309,10 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, =20 trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; - if (pfl->cmd !=3D 0xA0 && cmd =3D=3D 0xF0) { - goto reset_flash; + if (pfl->cmd !=3D 0xA0) { + if (cmd =3D=3D 0xF0) { + goto reset_flash; + } } offset &=3D pfl->chip_len - 1; =20 --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670086; cv=none; d=zoho.com; s=zohoarc; b=fIhVYxodaBhWG6eCVHYYTbGjzZOxeeDjm+AoVPG5w8RIiCqLcyeDDAd4kwTAyN2/miJKmR7KQ3CP1YqVnGQNBHsZsDNq+P2DE1h1XT+oQ5UjiKcrR9mHiPSzXVHDE7dQXCJWfM1QI3ZTnsajjB6wrj5RhNKMH43rTTsMrXpwRD0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670086; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=WpAQskqr3QwIPHSXjskH3RfNYs1V79vdX5h0isgvQvs=; b=Tirb1iQf6iYZK3dZ423l+UfzG640jsxc37CGo65tepk3TwF0hbbGVyX5FNEpgjHkggp14lbBjaVtbGo/5vqtRpkXyDfM6MeLsjkjL/G3UfEdO9keQB6rG/RWPJeuEUk2kbkoVXmFilSuJy/bQgikKKKgLGi/W0V8snwDTgN6eaM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156167008678169.87779384125702; Thu, 27 Jun 2019 14:14:46 -0700 (PDT) Received: from localhost ([::1]:54614 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbez-0001A2-Ah for importer@patchew.org; Thu, 27 Jun 2019 17:10:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46645) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2q-0004Hq-0n for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2o-0002sV-6t for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46520) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2Z-00023s-In; Thu, 27 Jun 2019 16:30:43 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9AF77C057F4B; Thu, 27 Jun 2019 20:30:24 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8629D600CC; Thu, 27 Jun 2019 20:30:14 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:12 +0200 Message-Id: <20190627202719.17739-22-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Jun 2019 20:30:24 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 21/28] hw/block/pflash_cfi02: Fix CFI in autoselect mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway After a flash device enters CFI mode from autoselect mode, the reset command returns the device to autoselect mode. An additional reset command is necessary to return to read array mode. Signed-off-by: Stephen Checkoway Acked-by: Thomas Huth Message-Id: <20190426162624.55977-7-stephen.checkoway@oberlin.edu> Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Alistair Francis --- hw/block/pflash_cfi02.c | 22 ++++++++++++++++++---- tests/pflash-cfi02-test.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 08b2bc83cb..13f76fa71d 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -66,6 +66,7 @@ do { = \ /* Special write cycles for CFI queries. */ enum { WCYCLE_CFI =3D 7, + WCYCLE_AUTOSELECT_CFI =3D 8, }; =20 struct PFlashCFI02 { @@ -311,6 +312,12 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, cmd =3D value; if (pfl->cmd !=3D 0xA0) { if (cmd =3D=3D 0xF0) { + if (pfl->wcycle =3D=3D WCYCLE_AUTOSELECT_CFI) { + /* Return to autoselect mode. */ + pfl->wcycle =3D 3; + pfl->cmd =3D 0x90; + return; + } goto reset_flash; } } @@ -333,7 +340,6 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, /* We're in read mode */ check_unlock0: if (boff =3D=3D 0x55 && cmd =3D=3D 0x98) { - enter_CFI_mode: /* Enter CFI query mode */ pfl->wcycle =3D WCYCLE_CFI; pfl->cmd =3D 0x98; @@ -410,9 +416,16 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, /* Unlock bypass reset */ goto reset_flash; } - /* We can enter CFI query mode from autoselect mode */ - if (boff =3D=3D 0x55 && cmd =3D=3D 0x98) - goto enter_CFI_mode; + /* + * We can enter CFI query mode from autoselect mode, but we mu= st + * return to autoselect mode after a reset. + */ + if (boff =3D=3D 0x55 && cmd =3D=3D 0x98) { + /* Enter autoselect CFI query mode */ + pfl->wcycle =3D WCYCLE_AUTOSELECT_CFI; + pfl->cmd =3D 0x98; + return; + } /* No break here */ default: DPRINTF("%s: invalid write for command %02x\n", @@ -493,6 +506,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, break; /* Special values for CFI queries */ case WCYCLE_CFI: + case WCYCLE_AUTOSELECT_CFI: DPRINTF("%s: invalid write in CFI query mode\n", __func__); goto reset_flash; default: diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index 1659eaebce..00e2261742 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -407,6 +407,42 @@ static void test_geometry(const void *opaque) qtest_quit(qtest); } =20 +/* + * Test that + * 1. enter autoselect mode; + * 2. enter CFI mode; and then + * 3. exit CFI mode + * leaves the flash device in autoselect mode. + */ +static void test_cfi_in_autoselect(const void *opaque) +{ + const FlashConfig *config =3D opaque; + QTestState *qtest; + qtest =3D qtest_initf("-M musicpal,accel=3Dqtest" + " -drive if=3Dpflash,file=3D%s,format=3Draw,copy-o= n-read", + image_path); + FlashConfig explicit_config =3D expand_config_defaults(config); + explicit_config.qtest =3D qtest; + const FlashConfig *c =3D &explicit_config; + + /* 1. Enter autoselect. */ + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, AUTOSELECT_CMD); + g_assert_cmpint(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + + /* 2. Enter CFI. */ + flash_cmd(c, CFI_ADDR, CFI_CMD); + g_assert_cmpint(flash_query(c, FLASH_ADDR(0x10)), =3D=3D, replicate(c,= 'Q')); + g_assert_cmpint(flash_query(c, FLASH_ADDR(0x11)), =3D=3D, replicate(c,= 'R')); + g_assert_cmpint(flash_query(c, FLASH_ADDR(0x12)), =3D=3D, replicate(c,= 'Y')); + + /* 3. Exit CFI. */ + reset(c); + g_assert_cmpint(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + + qtest_quit(qtest); +} + static void cleanup(void *opaque) { unlink(image_path); @@ -474,6 +510,9 @@ int main(int argc, char **argv) qtest_add_data_func(path, config, test_geometry); g_free(path); } + + qtest_add_data_func("pflash-cfi02/cfi-in-autoselect", &configuration[0= ], + test_cfi_in_autoselect); int result =3D g_test_run(); cleanup(NULL); return result; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670056; cv=none; d=zoho.com; s=zohoarc; b=V48aCRy0hRIFOjB9Fb9foIswpovqNJapedBpFo1PgFt9Lq0QrrrLtdyiAORxvNLOi+jeEZtCkGuBrsxXOBAQ+ARGg2mkJsmDpsLpPbhukZAzURxVAqpZprd5mojxkeRWhaidQYmDpObEs2j/BBStYa2yA35Ds39U6+GpxtXVQ48= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670056; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=3Oh3y9BdF1fJT2umGPs7Xs4Ex7SZA6b97BytUcLTw74=; b=YN6VvsLch5xNnmat8ul+/o6/JFERl2n2QhdVShmWPqLDN2Pu+g3lkQoHcBUMRO5h07Z8u7tVpIUyuWWOo93bR8VDvXewOotKN1NNYVEfBys2Nw2xK+YPMInfTz2ntMcei5mKKHS2vgj2d2MBlSIwLPh7yYLHbtJb3UsY/GRMN5Q= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15616700560031005.5507799415448; Thu, 27 Jun 2019 14:14:16 -0700 (PDT) Received: from localhost ([::1]:54584 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbd9-0007Uw-6a for importer@patchew.org; Thu, 27 Jun 2019 17:08:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46620) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2o-0004GV-SY for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2j-0002lf-R4 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:30:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64936) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2c-0002AX-6l; Thu, 27 Jun 2019 16:30:46 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 415853082AED; Thu, 27 Jun 2019 20:30:30 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1071A600CC; Thu, 27 Jun 2019 20:30:24 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:13 +0200 Message-Id: <20190627202719.17739-23-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Thu, 27 Jun 2019 20:30:30 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 22/28] hw/block/pflash_cfi02: Fix reset command not ignored during erase X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway When the flash device is performing a chip erase, all commands are ignored. When it is performing a sector erase, only the erase suspend command is valid, which is currently not supported. In particular, the reset command should not cause the device to reset to read array mode while programming is on going. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-8-stephen.checkoway@oberlin.edu> Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 13f76fa71d..39daa95833 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -311,7 +311,8 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; if (pfl->cmd !=3D 0xA0) { - if (cmd =3D=3D 0xF0) { + /* Reset does nothing during chip erase and sector erase. */ + if (cmd =3D=3D 0xF0 && pfl->cmd !=3D 0x10 && pfl->cmd !=3D 0x30) { if (pfl->wcycle =3D=3D WCYCLE_AUTOSELECT_CFI) { /* Return to autoselect mode. */ pfl->wcycle =3D 3; --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670472; cv=none; d=zoho.com; s=zohoarc; b=I9M/Ss3sOEFO5QoTMrj2FQFvEGqxllLO3K8eywRimEFW1VTpA8fU1Uc89T23VOdpVIF3WhFKGTHa5wC1Br7pz0YOgGGXkOhCjktBNKebVfMkulep2g4RIF8cW9oRmpT+8Uv3gK9tOvf4pcvHb9WVNtCn9X5TTt59gBX1hwR564M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670472; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=619KS7gRhXsKOHqwmC7KmUQmIjEXHHHMrdjAUiuMvXo=; b=jLWSTH8Hdnlml4Rl5jHRv5/tSy+xHQ8ibDnA7JYkP/TM+i1GPtCGeQNbW5wfHarP2TgC1KGlvrSTuiGCgC+mt2AK6uQC1QGObBCFqmbaponpSZ4nhQINM70L+uGEg4FbchzXSmrmJH8ZcBUZsb6SRjbbURsZgdYuf4qW9y3DN8c= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561670472450210.3931748270004; Thu, 27 Jun 2019 14:21:12 -0700 (PDT) Received: from localhost ([::1]:54582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbc2-0006kV-IO for importer@patchew.org; Thu, 27 Jun 2019 17:07:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46812) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb31-0004ML-5v for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2v-000345-LP for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33046) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2c-0002Gw-BT; Thu, 27 Jun 2019 16:30:46 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E22FD821C3; Thu, 27 Jun 2019 20:30:35 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B2A16600CC; Thu, 27 Jun 2019 20:30:30 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:14 +0200 Message-Id: <20190627202719.17739-24-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 27 Jun 2019 20:30:36 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 23/28] hw/block/pflash_cfi02: Implement multi-sector erase X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway After two unlock cycles and a sector erase command, the AMD flash chips start a 50 us erase time out. Any additional sector erase commands add a sector to be erased and restart the 50 us timeout. During the timeout, status bit DQ3 is cleared. After the time out, DQ3 is asserted during erasure. Signed-off-by: Stephen Checkoway Acked-by: Thomas Huth Message-Id: <20190426162624.55977-9-stephen.checkoway@oberlin.edu> [PMD: Rebased] Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi02.c | 94 +++++++++++++++++++++++++++++++-------- tests/pflash-cfi02-test.c | 70 +++++++++++++++++++++++++---- 2 files changed, 137 insertions(+), 27 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 39daa95833..5874bd55ad 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -31,7 +31,6 @@ * It does not support flash interleaving. * It does not implement software data protection as found in many real ch= ips * It does not implement erase suspend/resume commands - * It does not implement multiple sectors erase */ =20 #include "qemu/osdep.h" @@ -106,6 +105,7 @@ struct PFlashCFI02 { MemoryRegion orig_mem; int rom_mode; int read_counter; /* used for lazy switch-back to rom mode */ + int sectors_to_erase; char *name; void *storage; }; @@ -135,6 +135,22 @@ static inline void toggle_dq6(PFlashCFI02 *pfl) pfl->status ^=3D 0x40; } =20 +/* + * Turn on DQ3. + */ +static inline void assert_dq3(PFlashCFI02 *pfl) +{ + pfl->status |=3D 0x08; +} + +/* + * Turn off DQ3. + */ +static inline void reset_dq3(PFlashCFI02 *pfl) +{ + pfl->status &=3D ~0x08; +} + /* * Set up replicated mappings of the same region. */ @@ -163,11 +179,37 @@ static size_t pflash_regions_count(PFlashCFI02 *pfl) return pfl->cfi_table[0x2c]; } =20 -static void pflash_timer (void *opaque) +static void pflash_timer(void *opaque) { PFlashCFI02 *pfl =3D opaque; =20 trace_pflash_timer_expired(pfl->cmd); + if (pfl->cmd =3D=3D 0x30) { + /* + * Sector erase. If DQ3 is 0 when the timer expires, then the 50 + * us erase timeout has expired so we need to start the timer for = the + * sector erase algorithm. Otherwise, the erase completed and we s= hould + * go back to read array mode. + */ + if ((pfl->status & 0x08) =3D=3D 0) { + assert_dq3(pfl); + /* + * CFI address 0x21 is "Typical timeout per individual block e= rase + * 2^N ms" + */ + uint64_t timeout =3D ((1ULL << pfl->cfi_table[0x21]) * + pfl->sectors_to_erase) * 1000000; + timer_mod(&pfl->timer, + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + timeout); + DPRINTF("%s: erase timeout fired; erasing %d sectors\n", + __func__, pfl->sectors_to_erase); + return; + } + DPRINTF("%s: sector erase complete\n", __func__); + pfl->sectors_to_erase =3D 0; + reset_dq3(pfl); + } + /* Reset flash */ toggle_dq7(pfl); if (pfl->bypass) { @@ -299,6 +341,24 @@ static void pflash_update(PFlashCFI02 *pfl, int offset= , int size) } } =20 +static void pflash_sector_erase(PFlashCFI02 *pfl, hwaddr offset) +{ + uint64_t sector_len =3D pflash_sector_len(pfl, offset); + offset &=3D ~(sector_len - 1); + DPRINTF("%s: start sector erase at %0*" PRIx64 "-%0*" PRIx64 "\n", + __func__, pfl->width * 2, offset, + pfl->width * 2, offset + sector_len - 1); + if (!pfl->ro) { + uint8_t *p =3D pfl->storage; + memset(p + offset, 0xff, sector_len); + pflash_update(pfl, offset, sector_len); + } + set_dq7(pfl, 0x00); + ++pfl->sectors_to_erase; + /* Set (or reset) the 50 us timer for additional erase commands. */ + timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 50000); +} + static void pflash_write(void *opaque, hwaddr offset, uint64_t value, unsigned int width) { @@ -306,7 +366,6 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, hwaddr boff; uint8_t *p; uint8_t cmd; - uint32_t sector_len; =20 trace_pflash_io_write(offset, width, width << 1, value, pfl->wcycle); cmd =3D value; @@ -469,20 +528,7 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, break; case 0x30: /* Sector erase */ - p =3D pfl->storage; - sector_len =3D pflash_sector_len(pfl, offset); - offset &=3D ~(sector_len - 1); - DPRINTF("%s: start sector erase at %0*" PRIx64 "-%0*" PRIx64 "= \n", - __func__, pfl->width * 2, offset, - pfl->width * 2, offset + sector_len - 1); - if (!pfl->ro) { - memset(p + offset, 0xff, sector_len); - pflash_update(pfl, offset, sector_len); - } - set_dq7(pfl, 0x00); - /* Let's wait 1/2 second before sector erase is done */ - timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + - (NANOSECONDS_PER_SECOND / 2)); + pflash_sector_erase(pfl, offset); break; default: DPRINTF("%s: invalid command %02x (wc 5)\n", __func__, cmd); @@ -496,7 +542,19 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, /* Ignore writes during chip erase */ return; case 0x30: - /* Ignore writes during sector erase */ + /* + * If DQ3 is 0, additional sector erase commands can be + * written and anything else (other than an erase suspend) res= ets + * the device. + */ + if ((pfl->status & 0x08) =3D=3D 0) { + if (cmd =3D=3D 0x30) { + pflash_sector_erase(pfl, offset); + } else { + goto reset_flash; + } + } + /* Ignore writes during the actual erase. */ return; default: /* Should never happen */ diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index 00e2261742..303bc87820 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -35,6 +35,7 @@ typedef struct { #define CFI_CMD 0x98 #define UNLOCK0_CMD 0xAA #define UNLOCK1_CMD 0x55 +#define SECOND_UNLOCK_CMD 0x80 #define AUTOSELECT_CMD 0x90 #define RESET_CMD 0xF0 #define PROGRAM_CMD 0xA0 @@ -196,7 +197,7 @@ static void reset(const FlashConfig *c) static void sector_erase(const FlashConfig *c, uint64_t byte_addr) { unlock(c); - flash_cmd(c, UNLOCK0_ADDR, 0x80); + flash_cmd(c, UNLOCK0_ADDR, SECOND_UNLOCK_CMD); unlock(c); flash_write(c, byte_addr, replicate(c, SECTOR_ERASE_CMD)); } @@ -235,7 +236,7 @@ static void program(const FlashConfig *c, uint64_t byte= _addr, uint16_t data) static void chip_erase(const FlashConfig *c) { unlock(c); - flash_cmd(c, UNLOCK0_ADDR, 0x80); + flash_cmd(c, UNLOCK0_ADDR, SECOND_UNLOCK_CMD); unlock(c); flash_cmd(c, UNLOCK0_ADDR, CHIP_ERASE_CMD); } @@ -315,6 +316,8 @@ static void test_geometry(const void *opaque) =20 const uint64_t dq7 =3D replicate(c, 0x80); const uint64_t dq6 =3D replicate(c, 0x40); + const uint64_t dq3 =3D replicate(c, 0x08); + uint64_t byte_addr =3D 0; for (int region =3D 0; region < nb_erase_regions; ++region) { uint64_t base =3D 0x2D + 4 * region; @@ -330,18 +333,29 @@ static void test_geometry(const void *opaque) /* Erase and program sector. */ for (uint32_t i =3D 0; i < nb_sectors; ++i) { sector_erase(c, byte_addr); - /* Read toggle. */ + + /* Check that DQ3 is 0. */ + g_assert_cmphex(flash_read(c, byte_addr) & dq3, =3D=3D, 0); + qtest_clock_step_next(c->qtest); /* Step over the 50 us timeou= t. */ + + /* Check that DQ3 is 1. */ uint64_t status0 =3D flash_read(c, byte_addr); + g_assert_cmphex(status0 & dq3, =3D=3D, dq3); + /* DQ7 is 0 during an erase. */ g_assert_cmphex(status0 & dq7, =3D=3D, 0); uint64_t status1 =3D flash_read(c, byte_addr); + /* DQ6 toggles during an erase. */ g_assert_cmphex(status0 & dq6, =3D=3D, ~status1 & dq6); + /* Wait for erase to complete. */ - qtest_clock_step_next(c->qtest); + wait_for_completion(c, byte_addr); + /* Ensure DQ6 has stopped toggling. */ g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, flash_read(c, byte_addr)); + /* Now the data should be valid. */ g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mask(c)= ); =20 @@ -404,6 +418,44 @@ static void test_geometry(const void *opaque) g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); reset(c); =20 + /* + * Program a word on each sector, erase one or two sectors per region,= and + * verify that all of those, and only those, are erased. + */ + byte_addr =3D 0; + for (int region =3D 0; region < nb_erase_regions; ++region) { + for (int i =3D 0; i < config->nb_blocs[region]; ++i) { + program(c, byte_addr, 0); + byte_addr +=3D config->sector_len[region]; + } + } + unlock(c); + flash_cmd(c, UNLOCK0_ADDR, SECOND_UNLOCK_CMD); + unlock(c); + byte_addr =3D 0; + const uint64_t erase_cmd =3D replicate(c, SECTOR_ERASE_CMD); + for (int region =3D 0; region < nb_erase_regions; ++region) { + flash_write(c, byte_addr, erase_cmd); + if (c->nb_blocs[region] > 1) { + flash_write(c, byte_addr + c->sector_len[region], erase_cmd); + } + byte_addr +=3D c->sector_len[region] * c->nb_blocs[region]; + } + + qtest_clock_step_next(c->qtest); /* Step over the 50 us timeout. */ + wait_for_completion(c, 0); + byte_addr =3D 0; + for (int region =3D 0; region < nb_erase_regions; ++region) { + for (int i =3D 0; i < config->nb_blocs[region]; ++i) { + if (i < 2) { + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, bank_mas= k(c)); + } else { + g_assert_cmphex(flash_read(c, byte_addr), =3D=3D, 0); + } + byte_addr +=3D config->sector_len[region]; + } + } + qtest_quit(qtest); } =20 @@ -428,17 +480,17 @@ static void test_cfi_in_autoselect(const void *opaque) /* 1. Enter autoselect. */ unlock(c); flash_cmd(c, UNLOCK0_ADDR, AUTOSELECT_CMD); - g_assert_cmpint(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); =20 /* 2. Enter CFI. */ flash_cmd(c, CFI_ADDR, CFI_CMD); - g_assert_cmpint(flash_query(c, FLASH_ADDR(0x10)), =3D=3D, replicate(c,= 'Q')); - g_assert_cmpint(flash_query(c, FLASH_ADDR(0x11)), =3D=3D, replicate(c,= 'R')); - g_assert_cmpint(flash_query(c, FLASH_ADDR(0x12)), =3D=3D, replicate(c,= 'Y')); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x10)), =3D=3D, replicate(c,= 'Q')); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x11)), =3D=3D, replicate(c,= 'R')); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0x12)), =3D=3D, replicate(c,= 'Y')); =20 /* 3. Exit CFI. */ reset(c); - g_assert_cmpint(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); + g_assert_cmphex(flash_query(c, FLASH_ADDR(0)), =3D=3D, replicate(c, 0x= BF)); =20 qtest_quit(qtest); } --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561668751; cv=none; d=zoho.com; s=zohoarc; b=chx7LhF+C13tvVn5d4WH5tgWTzERxsCwbOvSCOrAlOOqKSaZlJoiliXRofdIhwKn95R2M2T+K2+3cdd9o2Hz5mj4Aee2rIe//Vo82fbTlwLTHbI4t330fLG+TB3LR1dmlUAn8yN7sF+L/3fF4Rfounm8erLJWr8AO2HAbz8DwE4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561668751; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=QH32BTsvbJ47mKiPC9y1B1SDSA5nURMBg0+yZHQZlX0=; b=nK5gm9f+NyO7QB9prtXbe5T+xKGaRT3W66txOl98EzvikM32kUHJBcwTi1NrL/sSYcxYOxB+HylY8d/2n3HohH3ZXeBOvKBy2/SVN//3JiLpsojEsCOC+nM2Q2GWy9yfDo0BPj4/NE6w+TVVU/Wx4ogue75OO7YEL6atr33L3v0= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156166875168673.67515796393661; Thu, 27 Jun 2019 13:52:31 -0700 (PDT) Received: from localhost ([::1]:54352 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbNY-0007aG-NY for importer@patchew.org; Thu, 27 Jun 2019 16:52:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46819) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb32-0004ND-7z for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2y-000376-1z for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40264) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2d-0002U8-9l; Thu, 27 Jun 2019 16:30:47 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 411DD30054AB; Thu, 27 Jun 2019 20:30:46 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5F4F86012D; Thu, 27 Jun 2019 20:30:36 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:15 +0200 Message-Id: <20190627202719.17739-25-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 27 Jun 2019 20:30:46 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 24/28] hw/block/pflash_cfi02: Implement erase suspend/resume X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway During a sector erase (but not a chip erase), the embeded erase program can be suspended. Once suspended, the sectors not selected for erasure may be read and programmed. Autoselect mode is allowed during erase suspend mode. Presumably, CFI queries are similarly allowed so this commit allows them as well. Since guest firmware can use status bits DQ7, DQ6, DQ3, and DQ2 to determine the current state of sector erasure, these bits are properly implemented. Signed-off-by: Stephen Checkoway Acked-by: Thomas Huth Message-Id: <20190426162624.55977-10-stephen.checkoway@oberlin.edu> [PMD: Rebased] Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi02.c | 154 ++++++++++++++++++++++++++++++++++---- tests/pflash-cfi02-test.c | 110 +++++++++++++++++++++++++++ 2 files changed, 250 insertions(+), 14 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 5874bd55ad..a3665da3b8 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -30,7 +30,6 @@ * * It does not support flash interleaving. * It does not implement software data protection as found in many real ch= ips - * It does not implement erase suspend/resume commands */ =20 #include "qemu/osdep.h" @@ -38,6 +37,7 @@ #include "hw/block/block.h" #include "hw/block/flash.h" #include "qapi/error.h" +#include "qemu/bitmap.h" #include "qemu/timer.h" #include "sysemu/block-backend.h" #include "qemu/host-utils.h" @@ -76,6 +76,7 @@ struct PFlashCFI02 { BlockBackend *blk; uint32_t uniform_nb_blocs; uint32_t uniform_sector_len; + uint32_t total_sectors; uint32_t nb_blocs[PFLASH_MAX_ERASE_REGIONS]; uint32_t sector_len[PFLASH_MAX_ERASE_REGIONS]; uint32_t chip_len; @@ -106,6 +107,8 @@ struct PFlashCFI02 { int rom_mode; int read_counter; /* used for lazy switch-back to rom mode */ int sectors_to_erase; + uint64_t erase_time_remaining; + unsigned long *sector_erase_map; char *name; void *storage; }; @@ -151,6 +154,14 @@ static inline void reset_dq3(PFlashCFI02 *pfl) pfl->status &=3D ~0x08; } =20 +/* + * Toggle status bit DQ2. + */ +static inline void toggle_dq2(PFlashCFI02 *pfl) +{ + pfl->status ^=3D 0x04; +} + /* * Set up replicated mappings of the same region. */ @@ -179,6 +190,29 @@ static size_t pflash_regions_count(PFlashCFI02 *pfl) return pfl->cfi_table[0x2c]; } =20 +/* + * Returns the time it takes to erase the number of sectors scheduled for + * erasure based on CFI address 0x21 which is "Typical timeout per individ= ual + * block erase 2^N ms." + */ +static uint64_t pflash_erase_time(PFlashCFI02 *pfl) +{ + /* + * If there are no sectors to erase (which can happen if all of the se= ctors + * to be erased are protected), then erase takes 100 us. Protected sec= tors + * aren't supported so this should never happen. + */ + return ((1ULL << pfl->cfi_table[0x21]) * pfl->sectors_to_erase) * SCAL= E_US; +} + +/* + * Returns true if the device is currently in erase suspend mode. + */ +static inline bool pflash_erase_suspend_mode(PFlashCFI02 *pfl) +{ + return pfl->erase_time_remaining > 0; +} + static void pflash_timer(void *opaque) { PFlashCFI02 *pfl =3D opaque; @@ -193,12 +227,7 @@ static void pflash_timer(void *opaque) */ if ((pfl->status & 0x08) =3D=3D 0) { assert_dq3(pfl); - /* - * CFI address 0x21 is "Typical timeout per individual block e= rase - * 2^N ms" - */ - uint64_t timeout =3D ((1ULL << pfl->cfi_table[0x21]) * - pfl->sectors_to_erase) * 1000000; + uint64_t timeout =3D pflash_erase_time(pfl); timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + timeout); DPRINTF("%s: erase timeout fired; erasing %d sectors\n", @@ -206,6 +235,7 @@ static void pflash_timer(void *opaque) return; } DPRINTF("%s: sector erase complete\n", __func__); + bitmap_zero(pfl->sector_erase_map, pfl->total_sectors); pfl->sectors_to_erase =3D 0; reset_dq3(pfl); } @@ -233,24 +263,44 @@ static uint64_t pflash_data_read(PFlashCFI02 *pfl, hw= addr offset, return ret; } =20 +typedef struct { + uint32_t len; + uint32_t num; +} SectorInfo; + /* * offset should be a byte offset of the QEMU device and _not_ a device * offset. */ -static uint32_t pflash_sector_len(PFlashCFI02 *pfl, hwaddr offset) +static SectorInfo pflash_sector_info(PFlashCFI02 *pfl, hwaddr offset) { assert(offset < pfl->chip_len); hwaddr addr =3D 0; + uint32_t sector_num =3D 0; for (int i =3D 0; i < pflash_regions_count(pfl); ++i) { uint64_t region_size =3D (uint64_t)pfl->nb_blocs[i] * pfl->sector_= len[i]; if (addr <=3D offset && offset < addr + region_size) { - return pfl->sector_len[i]; + return (SectorInfo) { + .len =3D pfl->sector_len[i], + .num =3D sector_num + (offset - addr) / pfl->sector_len[i], + }; } + sector_num +=3D pfl->nb_blocs[i]; addr +=3D region_size; } abort(); } =20 +/* + * Returns true if the offset refers to a flash sector that is currently b= eing + * erased. + */ +static bool pflash_sector_is_erasing(PFlashCFI02 *pfl, hwaddr offset) +{ + long sector_num =3D pflash_sector_info(pfl, offset).num; + return test_bit(sector_num, pfl->sector_erase_map); +} + static uint64_t pflash_read(void *opaque, hwaddr offset, unsigned int widt= h) { PFlashCFI02 *pfl =3D opaque; @@ -280,6 +330,15 @@ static uint64_t pflash_read(void *opaque, hwaddr offse= t, unsigned int width) case 0x80: /* We accept reads during second unlock sequence... */ case 0x00: + if (pflash_erase_suspend_mode(pfl) && + pflash_sector_is_erasing(pfl, offset)) { + /* Toggle bit 2, but not 6. */ + toggle_dq2(pfl); + /* Status register read */ + ret =3D pfl->status; + DPRINTF("%s: status %" PRIx64 "\n", __func__, ret); + break; + } /* Flash area read */ ret =3D pflash_data_read(pfl, offset, width); break; @@ -305,13 +364,16 @@ static uint64_t pflash_read(void *opaque, hwaddr offs= et, unsigned int width) } DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx64 "\n", __func__, boff,= ret); break; - case 0xA0: case 0x10: case 0x30: + /* Toggle bit 2 during erase, but not program. */ + toggle_dq2(pfl); + case 0xA0: + /* Toggle bit 6 */ + toggle_dq6(pfl); /* Status register read */ ret =3D pfl->status; DPRINTF("%s: status %" PRIx64 "\n", __func__, ret); - toggle_dq6(pfl); break; case 0x98: /* CFI query mode */ @@ -343,7 +405,8 @@ static void pflash_update(PFlashCFI02 *pfl, int offset,= int size) =20 static void pflash_sector_erase(PFlashCFI02 *pfl, hwaddr offset) { - uint64_t sector_len =3D pflash_sector_len(pfl, offset); + SectorInfo sector_info =3D pflash_sector_info(pfl, offset); + uint64_t sector_len =3D sector_info.len; offset &=3D ~(sector_len - 1); DPRINTF("%s: start sector erase at %0*" PRIx64 "-%0*" PRIx64 "\n", __func__, pfl->width * 2, offset, @@ -355,6 +418,7 @@ static void pflash_sector_erase(PFlashCFI02 *pfl, hwadd= r offset) } set_dq7(pfl, 0x00); ++pfl->sectors_to_erase; + set_bit(sector_info.num, pfl->sector_erase_map); /* Set (or reset) the 50 us timer for additional erase commands. */ timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 50000); } @@ -405,6 +469,25 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, pfl->cmd =3D 0x98; return; } + /* Handle erase resume in erase suspend mode, otherwise reset. */ + if (cmd =3D=3D 0x30) { + if (pflash_erase_suspend_mode(pfl)) { + /* Resume the erase. */ + timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUA= L) + + pfl->erase_time_remaining); + pfl->erase_time_remaining =3D 0; + pfl->wcycle =3D 6; + pfl->cmd =3D 0x30; + set_dq7(pfl, 0x00); + assert_dq3(pfl); + return; + } + goto reset_flash; + } + /* Ignore erase suspend. */ + if (cmd =3D=3D 0xB0) { + return; + } if (boff !=3D pfl->unlock_addr0 || cmd !=3D 0xAA) { DPRINTF("%s: unlock0 failed " TARGET_FMT_plx " %02x %04x\n", __func__, boff, cmd, pfl->unlock_addr0); @@ -450,6 +533,14 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, /* We need another unlock sequence */ goto check_unlock0; case 0xA0: + if (pflash_erase_suspend_mode(pfl) && + pflash_sector_is_erasing(pfl, offset)) { + /* Ignore writes to erasing sectors. */ + if (pfl->bypass) { + goto do_bypass; + } + goto reset_flash; + } trace_pflash_data_write(offset, width << 1, value, 0); if (!pfl->ro) { p =3D (uint8_t *)pfl->storage + offset; @@ -508,6 +599,10 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, } break; case 5: + if (pflash_erase_suspend_mode(pfl)) { + /* Erasing is not supported in erase suspend mode. */ + goto reset_flash; + } switch (cmd) { case 0x10: if (boff !=3D pfl->unlock_addr0) { @@ -542,6 +637,30 @@ static void pflash_write(void *opaque, hwaddr offset, = uint64_t value, /* Ignore writes during chip erase */ return; case 0x30: + if (cmd =3D=3D 0xB0) { + /* + * If erase suspend happens during the erase timeout (so D= Q3 is + * 0), then the device suspends erasing immediately. Set t= he + * remaining time to be the total time to erase. Otherwise, + * there is a maximum amount of time it can take to enter + * suspend mode. Let's ignore that and suspend immediately= and + * set the remaining time to the actual time remaining on = the + * timer. + */ + if ((pfl->status & 0x08) =3D=3D 0) { + pfl->erase_time_remaining =3D pflash_erase_time(pfl); + } else { + int64_t delta =3D timer_expire_time_ns(&pfl->timer) - + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + /* Make sure we have a positive time remaining. */ + pfl->erase_time_remaining =3D delta <=3D 0 ? 1 : delta; + } + reset_dq3(pfl); + timer_del(&pfl->timer); + pfl->wcycle =3D 0; + pfl->cmd =3D 0; + return; + } /* * If DQ3 is 0, additional sector erase commands can be * written and anything else (other than an erase suspend) res= ets @@ -619,10 +738,12 @@ static void pflash_cfi02_realize(DeviceState *dev, Er= ror **errp) =20 int nb_regions; pfl->chip_len =3D 0; + pfl->total_sectors =3D 0; for (nb_regions =3D 0; nb_regions < PFLASH_MAX_ERASE_REGIONS; ++nb_reg= ions) { if (pfl->nb_blocs[nb_regions] =3D=3D 0) { break; } + pfl->total_sectors +=3D pfl->nb_blocs[nb_regions]; uint64_t sector_len_per_device =3D pfl->sector_len[nb_regions]; =20 /* @@ -656,6 +777,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->nb_blocs[0] =3D pfl->uniform_nb_blocs; pfl->sector_len[0] =3D pfl->uniform_sector_len; pfl->chip_len =3D uniform_len; + pfl->total_sectors =3D pfl->uniform_nb_blocs; } else if (uniform_len !=3D 0 && uniform_len !=3D pfl->chip_len) { error_setg(errp, "\"num-blocks\"*\"sector-length\" " "different from \"num-blocks0\"*\'sector-length0\" + ..= . + " @@ -697,6 +819,9 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->unlock_addr0 &=3D 0x7FF; pfl->unlock_addr1 &=3D 0x7FF; =20 + /* Allocate memory for a bitmap for sectors being erased. */ + pfl->sector_erase_map =3D bitmap_new(pfl->total_sectors); + pflash_setup_mappings(pfl); pfl->rom_mode =3D 1; sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); @@ -781,8 +906,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) =20 /* Address sensitive unlock required. */ pfl->cfi_table[0x05 + pri_ofs] =3D 0x00; - /* Erase suspend not supported. */ - pfl->cfi_table[0x06 + pri_ofs] =3D 0x00; + /* Erase suspend to read/write. */ + pfl->cfi_table[0x06 + pri_ofs] =3D 0x02; /* Sector protect not supported. */ pfl->cfi_table[0x07 + pri_ofs] =3D 0x00; /* Temporary sector unprotect not supported. */ @@ -829,6 +954,7 @@ static void pflash_cfi02_unrealize(DeviceState *dev, Er= ror **errp) { PFlashCFI02 *pfl =3D PFLASH_CFI02(dev); timer_del(&pfl->timer); + g_free(pfl->sector_erase_map); } =20 static void pflash_cfi02_class_init(ObjectClass *klass, void *data) diff --git a/tests/pflash-cfi02-test.c b/tests/pflash-cfi02-test.c index 303bc87820..d3b23f4f66 100644 --- a/tests/pflash-cfi02-test.c +++ b/tests/pflash-cfi02-test.c @@ -43,6 +43,8 @@ typedef struct { #define CHIP_ERASE_CMD 0x10 #define UNLOCK_BYPASS_CMD 0x20 #define UNLOCK_BYPASS_RESET_CMD 0x00 +#define ERASE_SUSPEND_CMD 0xB0 +#define ERASE_RESUME_CMD SECTOR_ERASE_CMD =20 typedef struct { int bank_width; @@ -241,6 +243,16 @@ static void chip_erase(const FlashConfig *c) flash_cmd(c, UNLOCK0_ADDR, CHIP_ERASE_CMD); } =20 +static void erase_suspend(const FlashConfig *c) +{ + flash_cmd(c, FLASH_ADDR(0), ERASE_SUSPEND_CMD); +} + +static void erase_resume(const FlashConfig *c) +{ + flash_cmd(c, FLASH_ADDR(0), ERASE_RESUME_CMD); +} + /* * Test flash commands with a variety of device geometry. */ @@ -312,11 +324,20 @@ static void test_geometry(const void *opaque) uint32_t device_len =3D 1 << flash_query_1(c, FLASH_ADDR(0x27)); g_assert_cmphex(device_len, =3D=3D, UNIFORM_FLASH_SIZE); =20 + /* Check that erase suspend to read/write is supported. */ + uint16_t pri =3D flash_query_1(c, FLASH_ADDR(0x15)) + + (flash_query_1(c, FLASH_ADDR(0x16)) << 8); + g_assert_cmpint(pri, >=3D, 0x2D + 4 * nb_erase_regions); + g_assert_cmpint(flash_query(c, FLASH_ADDR(pri + 0)), =3D=3D, replicate= (c, 'P')); + g_assert_cmpint(flash_query(c, FLASH_ADDR(pri + 1)), =3D=3D, replicate= (c, 'R')); + g_assert_cmpint(flash_query(c, FLASH_ADDR(pri + 2)), =3D=3D, replicate= (c, 'I')); + g_assert_cmpint(flash_query_1(c, FLASH_ADDR(pri + 6)), =3D=3D, 2); /* = R/W */ reset(c); =20 const uint64_t dq7 =3D replicate(c, 0x80); const uint64_t dq6 =3D replicate(c, 0x40); const uint64_t dq3 =3D replicate(c, 0x08); + const uint64_t dq2 =3D replicate(c, 0x04); =20 uint64_t byte_addr =3D 0; for (int region =3D 0; region < nb_erase_regions; ++region) { @@ -456,6 +477,95 @@ static void test_geometry(const void *opaque) } } =20 + /* Test erase suspend/resume during erase timeout. */ + sector_erase(c, 0); + /* + * Check that DQ 3 is 0 and DQ6 and DQ2 are toggling in the sector bei= ng + * erased as well as in a sector not being erased. + */ + byte_addr =3D c->sector_len[0]; + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq3, =3D=3D, 0); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + status0 =3D flash_read(c, byte_addr); + status1 =3D flash_read(c, byte_addr); + g_assert_cmpint(status0 & dq3, =3D=3D, 0); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + + /* + * Check that after suspending, DQ6 does not toggle but DQ2 does toggl= e in + * an erase suspended sector but that neither toggle (we should be + * getting data) in a sector not being erased. + */ + erase_suspend(c); + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq6, =3D=3D, status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + g_assert_cmpint(flash_read(c, byte_addr), =3D=3D, flash_read(c, byte_a= ddr)); + + /* Check that after resuming, DQ3 is 1 and DQ6 and DQ2 toggle. */ + erase_resume(c); + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + status0 =3D flash_read(c, byte_addr); + status1 =3D flash_read(c, byte_addr); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + wait_for_completion(c, 0); + + /* Repeat this process but this time suspend after the timeout. */ + sector_erase(c, 0); + qtest_clock_step_next(c->qtest); + /* + * Check that DQ 3 is 1 and DQ6 and DQ2 are toggling in the sector bei= ng + * erased as well as in a sector not being erased. + */ + byte_addr =3D c->sector_len[0]; + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + status0 =3D flash_read(c, byte_addr); + status1 =3D flash_read(c, byte_addr); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + + /* + * Check that after suspending, DQ6 does not toggle but DQ2 does toggl= e in + * an erase suspended sector but that neither toggle (we should be + * getting data) in a sector not being erased. + */ + erase_suspend(c); + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq6, =3D=3D, status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + g_assert_cmpint(flash_read(c, byte_addr), =3D=3D, flash_read(c, byte_a= ddr)); + + /* Check that after resuming, DQ3 is 1 and DQ6 and DQ2 toggle. */ + erase_resume(c); + status0 =3D flash_read(c, 0); + status1 =3D flash_read(c, 0); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + status0 =3D flash_read(c, byte_addr); + status1 =3D flash_read(c, byte_addr); + g_assert_cmpint(status0 & dq3, =3D=3D, dq3); + g_assert_cmpint(status0 & dq6, =3D=3D, ~status1 & dq6); + g_assert_cmpint(status0 & dq2, =3D=3D, ~status1 & dq2); + wait_for_completion(c, 0); + qtest_quit(qtest); } =20 --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670001; cv=none; d=zoho.com; s=zohoarc; b=Tu+WM0FMvF0jCv/22cfD65R/fzEDFlJ5TM6TnqnTvqcdExyfzAJLoGXbZyHT5ru8T7y0pTqal/7qIR+6MzmkO4E972yodD5Fxk1pZzK8serQBDS8TgVd03cZPA+RRj5pMLx4pM2vAPAy38RtPpQOtN8blEwO/qzmYGHdugQgJ4A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670001; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=b3yoBQEBllKPNDRihXSZaR9javEMr9NTjTzeyZRG//8=; b=E3sdRgQQLnZ/Z4VONQ77nr4DFn+YHu82XNXQgoSk+NsL9I5SRinwZY0oraGOQks6cBo2Rn2RVTvRHA/+1WmK3iLqqIEJHLLA+mqx1SEwSxEUxnIV3JZ6RSI2QsEoMylrQpCmSLBD/og512uDo7XYdbi6E+qVmY96nfY5i/tyXgQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156167000136075.62182081451579; Thu, 27 Jun 2019 14:13:21 -0700 (PDT) Received: from localhost ([::1]:54646 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbhj-0003on-CM for importer@patchew.org; Thu, 27 Jun 2019 17:13:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46778) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb2x-0004Lx-SX for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb2u-00031v-69 for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40350) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2j-0002j8-3v; Thu, 27 Jun 2019 16:30:53 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E282630BB523; Thu, 27 Jun 2019 20:30:51 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B0AD6600CC; Thu, 27 Jun 2019 20:30:46 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:16 +0200 Message-Id: <20190627202719.17739-26-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 27 Jun 2019 20:30:52 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 25/28] hw/block/pflash_cfi02: Use chip erase time specified in the CFI table X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Stephen Checkoway When erasing the chip, use the typical time specified in the CFI table rather than arbitrarily selecting 5 seconds. Since the currently unconfigurable value set in the table is 12, this means a chip erase takes 4096 ms so this isn't a big change in behavior. Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-11-stephen.checkoway@oberlin.edu> Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- TODO check not zero --- hw/block/pflash_cfi02.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index a3665da3b8..b2d37c33bb 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -617,9 +617,9 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, pflash_update(pfl, 0, pfl->chip_len); } set_dq7(pfl, 0x00); - /* Let's wait 5 seconds before chip erase is done */ + /* Wait the time specified at CFI address 0x22. */ timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + - (NANOSECONDS_PER_SECOND * 5)); + (1ULL << pfl->cfi_table[0x22]) * SCALE_MS); break; case 0x30: /* Sector erase */ --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561669344; cv=none; d=zoho.com; s=zohoarc; b=oVbqpL9FrlNrJC9bcV9eM6LIyz0sC+f3vTGMEDEV1tpyVjYGxKqbGoMj9bbpezhnLW34T4KWHlI6um8CGLNr9GHN6vx9PvApnfxBDGh0slcdPhrrJ/hk1dB/T2hx99JpRG4iuMrDTUFXHjbZ1oowaLQGRW/9/DrRUOCgNwgboKM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561669344; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=p4W2j2XTFVlfC09dQ1we+NJMMYZEBLTirnpaiMEGT4s=; b=OU87iXzB72xmWqq20FdaD5x3bSIBMDz8mX5ia2bkbZSvgOFbqBJfskbod+vbCPMkD4RXC4b7QpgyU9htwTjoIigBMe2Ja/dYDMH+Y/pWbaM+ieTyddF1wcZV7F2vkI7XIolV6kIr8FivrjmsHEVgb65kalHZFcZ2zHvh68PL9SU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561669344676119.40605195537933; Thu, 27 Jun 2019 14:02:24 -0700 (PDT) Received: from localhost ([::1]:54454 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbWm-0008Un-2G for importer@patchew.org; Thu, 27 Jun 2019 17:01:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46889) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb3D-0004RO-IC for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb34-0003HY-9o for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53196) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb2p-0002rm-UF; Thu, 27 Jun 2019 16:31:01 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8446830C5833; Thu, 27 Jun 2019 20:30:57 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5F6DD600CC; Thu, 27 Jun 2019 20:30:52 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:17 +0200 Message-Id: <20190627202719.17739-27-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Thu, 27 Jun 2019 20:30:57 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 26/28] hw/block/pflash_cfi02: Reduce single byte/word write delay X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Stephen Checkoway Message-Id: <20190426162624.55977-5-stephen.checkoway@oberlin.edu> [PMD: Extracted from bigger patch] Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- TODO: Why? To respect the datasheet? Which model is this? --- hw/block/pflash_cfi02.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index b2d37c33bb..e9519cbae8 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -857,8 +857,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Erro= r **errp) pfl->cfi_table[0x1D] =3D 0x00; /* Vpp max (no Vpp pin) */ pfl->cfi_table[0x1E] =3D 0x00; - /* Timeout per single byte/word write (128 ms) */ - pfl->cfi_table[0x1F] =3D 0x07; + /* Timeout per single byte/word write (16 us) */ + pfl->cfi_table[0x1F] =3D 0x04; /* Timeout for min size buffer write (NA) */ pfl->cfi_table[0x20] =3D 0x00; /* Typical timeout for block erase (512 ms) */ --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561670335; cv=none; d=zoho.com; s=zohoarc; b=dh+WTiEZxfgR/cJahUX9V405FJy0M0ogH8twO5g27l7qhyoUwGGbpnVwA7blmQW5/Q3XS/5Se79mLbBbwOWFdi7iVLFwAg5AAMUUf8DDiSSNVyoRbZqaJDpg4ugOxQmUWfGdi+HGQIiIipDM3Rm0LKodu7FEZvRAuAHgNmtd7YY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561670335; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=CFx0AAXnlVFEA1QgKUukpBbJKJW2g1mYQFOkRkMEzHI=; b=NYLKmMJvwY9dSwjOoKwh2e6GWuXj9Z0AH9pUf84FRco/viePNf0w16m54gPVKgoFGd5xICFRzYbPsKS2RyAC9oZ5EblIcISE+GZbxJBwHoEOosFRYCGgGyqHvxOrfzEM4WBG8qcxqFSIfyz/Eg/BUoL8ZRlNq+rQ09WQe7hdeP8= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561670335004786.7786719532472; Thu, 27 Jun 2019 14:18:55 -0700 (PDT) Received: from localhost ([::1]:54462 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbX4-0000Fc-VY for importer@patchew.org; Thu, 27 Jun 2019 17:02:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47034) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb3Q-0004Vc-4T for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb3O-0003k4-Mu for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40484) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb32-00036Y-1b; Thu, 27 Jun 2019 16:31:12 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7209330BB54B; Thu, 27 Jun 2019 20:31:07 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 01734600CC; Thu, 27 Jun 2019 20:30:57 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:18 +0200 Message-Id: <20190627202719.17739-28-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 27 Jun 2019 20:31:07 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 27/28] hw/block/pflash_cfi02: Document commands X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index e9519cbae8..db9dc7d8fb 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -327,7 +327,7 @@ static uint64_t pflash_read(void *opaque, hwaddr offset= , unsigned int width) pfl->wcycle =3D 0; pfl->cmd =3D 0; /* fall through to the read code */ - case 0x80: + case 0x80: /* Erase (unlock) */ /* We accept reads during second unlock sequence... */ case 0x00: if (pflash_erase_suspend_mode(pfl) && @@ -342,8 +342,7 @@ static uint64_t pflash_read(void *opaque, hwaddr offset= , unsigned int width) /* Flash area read */ ret =3D pflash_data_read(pfl, offset, width); break; - case 0x90: - /* flash ID read */ + case 0x90: /* flash ID read */ switch (boff) { case 0x00: case 0x01: @@ -364,11 +363,11 @@ static uint64_t pflash_read(void *opaque, hwaddr offs= et, unsigned int width) } DPRINTF("%s: ID " TARGET_FMT_plx " %" PRIx64 "\n", __func__, boff,= ret); break; - case 0x10: - case 0x30: + case 0x10: /* Chip Erase */ + case 0x30: /* Sector Erase */ /* Toggle bit 2 during erase, but not program. */ toggle_dq2(pfl); - case 0xA0: + case 0xA0: /* Program */ /* Toggle bit 6 */ toggle_dq6(pfl); /* Status register read */ @@ -470,7 +469,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, return; } /* Handle erase resume in erase suspend mode, otherwise reset. */ - if (cmd =3D=3D 0x30) { + if (cmd =3D=3D 0x30) { /* Erase Resume */ if (pflash_erase_suspend_mode(pfl)) { /* Resume the erase. */ timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUA= L) + @@ -485,7 +484,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, goto reset_flash; } /* Ignore erase suspend. */ - if (cmd =3D=3D 0xB0) { + if (cmd =3D=3D 0xB0) { /* Erase Suspend */ return; } if (boff !=3D pfl->unlock_addr0 || cmd !=3D 0xAA) { @@ -516,9 +515,9 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, case 0x20: pfl->bypass =3D 1; goto do_bypass; - case 0x80: - case 0x90: - case 0xA0: + case 0x80: /* Erase */ + case 0x90: /* Autoselect */ + case 0xA0: /* Program */ pfl->cmd =3D cmd; DPRINTF("%s: starting command %02x\n", __func__, cmd); break; @@ -529,10 +528,10 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, break; case 3: switch (pfl->cmd) { - case 0x80: + case 0x80: /* Erase */ /* We need another unlock sequence */ goto check_unlock0; - case 0xA0: + case 0xA0: /* Program */ if (pflash_erase_suspend_mode(pfl) && pflash_sector_is_erasing(pfl, offset)) { /* Ignore writes to erasing sectors. */ @@ -562,7 +561,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, if (pfl->bypass) goto do_bypass; goto reset_flash; - case 0x90: + case 0x90: /* Autoselect */ if (pfl->bypass && cmd =3D=3D 0x00) { /* Unlock bypass reset */ goto reset_flash; @@ -585,11 +584,11 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, } case 4: switch (pfl->cmd) { - case 0xA0: + case 0xA0: /* Program */ /* Ignore writes while flash data write is occurring */ /* As we suppose write is immediate, this should never happen = */ return; - case 0x80: + case 0x80: /* Erase */ goto check_unlock1; default: /* Should never happen */ @@ -604,7 +603,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, goto reset_flash; } switch (cmd) { - case 0x10: + case 0x10: /* Chip Erase */ if (boff !=3D pfl->unlock_addr0) { DPRINTF("%s: chip erase: invalid address " TARGET_FMT_plx = "\n", __func__, offset); @@ -621,8 +620,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, timer_mod(&pfl->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (1ULL << pfl->cfi_table[0x22]) * SCALE_MS); break; - case 0x30: - /* Sector erase */ + case 0x30: /* Sector erase */ pflash_sector_erase(pfl, offset); break; default: @@ -633,10 +631,10 @@ static void pflash_write(void *opaque, hwaddr offset,= uint64_t value, break; case 6: switch (pfl->cmd) { - case 0x10: + case 0x10: /* Chip Erase */ /* Ignore writes during chip erase */ return; - case 0x30: + case 0x30: /* Sector erase */ if (cmd =3D=3D 0xB0) { /* * If erase suspend happens during the erase timeout (so D= Q3 is --=20 2.20.1 From nobody Thu May 16 17:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561669042; cv=none; d=zoho.com; s=zohoarc; b=M56o3Ir6QVtzO0u2LoLX0HbGEh4Vvvi1TgWfKCwwbTxeM10uf7QZI3fIwgqN19nhZbEu7Vxq3+mnncxjlbaXQqgyHul7SZda6Xn5hxLkRX6pcG3i6a981flJR1FGdJ4yD5fv4HK9YmP0uvRRy99LFBaovvdTFqz4bbGh0zPi13U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561669042; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=nqW7cMzevv5+0o/q5GZ3gzA29j+x/IFYWMdEMqNvCSc=; b=CB7VrQ+ZaWLI1Mm6VylTkul6Ag3IBWPffCPfnDZTYAutQxDfrYSaZBfPEsuxL4doIgO5SUS31BdOIXXM4tLW4oHb3T7/TJ1KbaIKsDfiVUSduFfdYFc0XQnZ9GLu81x0lwtuLB9n3Haa5z15XfVoSwVYN0RhdJxYrgKxttMgfCE= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561669042113311.4680940302376; Thu, 27 Jun 2019 13:57:22 -0700 (PDT) Received: from localhost ([::1]:54412 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgbSG-0004V2-CW for importer@patchew.org; Thu, 27 Jun 2019 16:57:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47024) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hgb3P-0004Vb-HH for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hgb3O-0003jr-HV for qemu-devel@nongnu.org; Thu, 27 Jun 2019 16:31:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45200) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hgb34-0003GA-Ai; Thu, 27 Jun 2019 16:31:16 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 138FB301D217; Thu, 27 Jun 2019 20:31:13 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-69.brq.redhat.com [10.40.204.69]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E056C600CC; Thu, 27 Jun 2019 20:31:07 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: Stephen Checkoway , qemu-devel@nongnu.org Date: Thu, 27 Jun 2019 22:27:19 +0200 Message-Id: <20190627202719.17739-29-philmd@redhat.com> In-Reply-To: <20190627202719.17739-1-philmd@redhat.com> References: <20190627202719.17739-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Thu, 27 Jun 2019 20:31:13 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v5 28/28] hw/block/pflash_cfi02: Reduce I/O accesses to 16-bit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Laurent Vivier , Thomas Huth , qemu-block@nongnu.org, Peter Maydell , John Snow , Paolo Bonzini , Alistair Francis , Magnus Damm , Markus Armbruster , Max Reitz , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Michael Walle , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Antony Pavlov , "Edgar E. Iglesias" , Jan Kiszka , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Parallel NOR flashes are limited to 16-bit bus accesses. Remove the 32-bit dead code. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis --- hw/block/pflash_cfi02.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index db9dc7d8fb..d1f28b02b9 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -317,8 +317,6 @@ static uint64_t pflash_read(void *opaque, hwaddr offset= , unsigned int width) boff =3D offset & 0xFF; if (pfl->width =3D=3D 2) { boff =3D boff >> 1; - } else if (pfl->width =3D=3D 4) { - boff =3D boff >> 2; } switch (pfl->cmd) { default: @@ -449,8 +447,6 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, boff =3D offset; if (pfl->width =3D=3D 2) { boff =3D boff >> 1; - } else if (pfl->width =3D=3D 4) { - boff =3D boff >> 2; } /* Only the least-significant 11 bits are used in most cases. */ boff &=3D 0x7FF; @@ -710,6 +706,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, static const MemoryRegionOps pflash_cfi02_ops =3D { .read =3D pflash_read, .write =3D pflash_write, + .impl.max_access_size =3D 2, .valid.min_access_size =3D 1, .valid.max_access_size =3D 4, .endianness =3D DEVICE_NATIVE_ENDIAN, --=20 2.20.1