{"id":2219154,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2219154/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260402-write_booster-v1-2-e4fed1df6c7e@samsung.com>","date":"2026-04-02T09:43:46","name":"[2/5] hw/ufs: Modify flag handling operation","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"7eeb5cb988067806e40ff9125157ba0b24f4365d","submitter":{"id":93039,"url":"http://patchwork.ozlabs.org/api/1.0/people/93039/?format=json","name":"Jaemyung Lee","email":"ldc.jml@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260402-write_booster-v1-2-e4fed1df6c7e@samsung.com/mbox/","series":[{"id":498486,"url":"http://patchwork.ozlabs.org/api/1.0/series/498486/?format=json","date":"2026-04-02T09:43:48","name":"hw/ufs: Add Write Booster Support on UFS","version":1,"mbox":"http://patchwork.ozlabs.org/series/498486/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2219154/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=glYwg7GG;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fmjx53Mjgz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 00:53:13 +1100 (AEDT)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w8ISZ-00038u-Od; Thu, 02 Apr 2026 09:51:48 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <ldc.jml@gmail.com>) id 1w8Eaq-00019K-Vy\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 05:44:06 -0400","from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <ldc.jml@gmail.com>) id 1w8Eao-0005N1-6c\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 05:44:04 -0400","by mail-pf1-x42a.google.com with SMTP id\n d2e1a72fcca58-8296dabef74so679591b3a.1\n for <qemu-devel@nongnu.org>; Thu, 02 Apr 2026 02:44:01 -0700 (PDT)","from [172.17.0.5] ([168.126.243.22])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82cf9c6ad8asm2668477b3a.40.2026.04.02.02.43.58\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 02 Apr 2026 02:44:00 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775123041; x=1775727841; darn=nongnu.org;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=wp610CTuY5BtVJCvmliEvcgHSUgtMv4PTZfRqvUtBfw=;\n b=glYwg7GGgpR9PL2EHrBVAOw4dg2DY3J/UBGjPbZJKgZsazVS2aJyDq0SJIgSGbOWrt\n hAxgFpoo/QGYpHerKjhPQTX4XYVRlS5qi9HTxinlo0T3ig/06NZzm8/TgaUgXB8+05Y5\n g/aJbL9h6mE/EasSdB8tdCvBVAXpza1fp2NX2UXWMoTvdOGTDlj4cgxhNgU3eOcmYKAx\n qZI7XLdQku8AptuSMGckohENIJq24cA/mPUO4eDLpF+QZLi/vCd7jOmOorfaFGrFPbKS\n xREz4aWSkamWwU+TEFzkxFiVhBT8PbXlAgahfrMkxU10ilSXFpcQLB4sqy9SO19D1PVF\n oCzQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775123041; x=1775727841;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=wp610CTuY5BtVJCvmliEvcgHSUgtMv4PTZfRqvUtBfw=;\n b=XNiyRrbM+TbT12vPsYoJwXvZPumqAoz5PRwHhDUIiesBC+qUh8C23meiVtb3Ex1n79\n UD0xt9Hkq6miFQ/f3zvs3KXYSHD+p2SN0f+IFyjvAa63J8ccG6/zLMY105Lbw7xqv3TN\n sHrdhgMBuelv7B3iR+7H0PkJeFpBmnfrnTLj/vg6wBB9Ggng7EZwMwFhfn4eIXpMn2bN\n Hc5RATRrxVAq4HlOv3twqHciHXyXH4gOTx5iRfd2YVUzBOsgpLjlrAj7ISfxpjNw+Xoe\n n4XbsYVUIe2uzULoZlqiCUOTSvU3uTZ6HeowdqVT6VVNJtqODrsCsMa1co8rj29XJM2e\n 9rmA==","X-Gm-Message-State":"AOJu0YzksRWBKyMdN7vs63jWPkHdGOBlCsZCPZDZOfQ3/pCThpyQMWJE\n aQ6+ECfSRNt28lxrImVRBvMjaYq8oyuNWPiBymJOqssvUJ5xdpk9t6yO","X-Gm-Gg":"ATEYQzyO/hH3OYjpVKNAS7drX3AupzPXsYjg/4hNmW1CK9QIxKfRlknqS3cFDku28JR\n TUdp8e5eQybfnuxxWfE74oxAOrJtv0n80k3mUfBJRzKoqFDw5NMycUw5lNyjOjJjsPNhuSBmKM4\n YM8DyiO6QOxLwRyKtblhSDzjfxthSOiKYmsH/LtTpouefEQ1pjwg5LMYq7/GbrefRrwC7B4zzdM\n KJNYcSacV+vfSrK27A/cKqs8Ki90DQ60KI+91azZx6ISdrSgri72ABS2BGcXdlIhvn2cH4qU0Px\n qGey4k4gtDEvc0cONHE5xuKG29tijo2Jtt9P3ZjrhRY/57H8p0VPBv9h5gaQvbrp3faJOF4pUUw\n KAvCIjfwDU52+kaSaMPe0tIhiJw71HlQ3lUM/Cblt8oy/25/jN2h4lrsKu48ctQYJPNy0AaB2ka\n EiKVd2YqcJMstezj/DwHLqtmn9Kg1Jfhf+TbOGw1cZ","X-Received":"by 2002:a05:6a00:8008:b0:824:93e4:2ddf with SMTP id\n d2e1a72fcca58-82cfb86f42bmr2864829b3a.13.1775123040848;\n Thu, 02 Apr 2026 02:44:00 -0700 (PDT)","From":"Jaemyung Lee <ldc.jml@gmail.com>","X-Google-Original-From":"Jaemyung Lee <jaemyung.lee@samsung.com>","Date":"Thu, 02 Apr 2026 18:43:46 +0900","Subject":"[PATCH 2/5] hw/ufs: Modify flag handling operation","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260402-write_booster-v1-2-e4fed1df6c7e@samsung.com>","References":"<20260402-write_booster-v1-0-e4fed1df6c7e@samsung.com>","In-Reply-To":"<20260402-write_booster-v1-0-e4fed1df6c7e@samsung.com>","To":"qemu-devel@nongnu.org","Cc":"Jeuk Kim <jeuk20.kim@samsung.com>, Kevin Wolf <kwolf@redhat.com>,\n Hanna Reitz <hreitz@redhat.com>, qemu-block@nongnu.org,\n Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>,\n Paolo Bonzini <pbonzini@redhat.com>,\n Jaemyung Lee <jaemyung.lee@samsung.com>","X-Mailer":"b4 0.14.2","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1775123032; l=6656;\n i=jaemyung.lee@samsung.com; s=20260402; h=from:subject:message-id;\n bh=UwQldvutZu9HqLXksjdiAk3IKzXkRCngBaBlZ026a4E=;\n b=0bN/XtTRtEN1LXvZZnTKvHZfSmKcAqHBEIgpqvBbnYlsT4sbZ/FwEf87VA6/nQwPEl+uhuPei\n MKNP25e1+6XCdXigof5fotvoYDPTpbJSB1Li//DTOaRpvzoyQrvGftd","X-Developer-Key":"i=jaemyung.lee@samsung.com; a=ed25519;\n pk=bZPd7A/kteUO62FfUM6IrI1LuBPe5QrcqfvsitM1ZjE=","Received-SPF":"pass client-ip=2607:f8b0:4864:20::42a;\n envelope-from=ldc.jml@gmail.com; helo=mail-pf1-x42a.google.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-Mailman-Approved-At":"Thu, 02 Apr 2026 09:51:38 -0400","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Change internal flag handling operation same as attribute's\n\nIn UFS device, some flag queries directly trigger specific device\nbehaviour like attribute's, not only changes the internal values.\nSo restructure flag query processing functions same as attribute\nprocessing, to facilitate linking detailed implementations based on\nindividual flag value changes.\n\nSigned-off-by: Jaemyung Lee <jaemyung.lee@samsung.com>\n---\n hw/ufs/ufs.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++-------------\n 1 file changed, 119 insertions(+), 33 deletions(-)","diff":"diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c\nindex b2b70c8b38ebecd8d49ecce288614d55efd90f2e..69f82ab462d135fe6cda479891f9d8f26d19be9a 100644\n--- a/hw/ufs/ufs.c\n+++ b/hw/ufs/ufs.c\n@@ -1021,6 +1021,122 @@ static inline QueryRespCode ufs_flag_check_idn_valid(uint8_t idn, int op)\n     return UFS_QUERY_RESULT_SUCCESS;\n }\n \n+static uint32_t ufs_read_flag_value(UfsHc *u, uint8_t idn)\n+{\n+    switch (idn) {\n+    case UFS_QUERY_FLAG_IDN_FDEVICEINIT:\n+        return u->flags.device_init;\n+    case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:\n+        return u->flags.permanent_wp_en;\n+    case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:\n+        return u->flags.power_on_wp_en;\n+    case UFS_QUERY_FLAG_IDN_BKOPS_EN:\n+        return u->flags.background_ops_en;\n+    case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:\n+        return u->flags.device_life_span_mode_en;\n+    case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:\n+        return u->flags.purge_enable;\n+    case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:\n+        return u->flags.refresh_enable;\n+    case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:\n+        return u->flags.phy_resource_removal;\n+    case UFS_QUERY_FLAG_IDN_BUSY_RTC:\n+        return u->flags.busy_rtc;\n+    case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:\n+        return u->flags.permanently_disable_fw_update;\n+    case UFS_QUERY_FLAG_IDN_WB_EN:\n+        return u->flags.wb_en;\n+    case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:\n+        return u->flags.wb_buffer_flush_en;\n+    case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:\n+        return u->flags.wb_buffer_flush_during_hibernate;\n+    case UFS_QUERY_FLAG_IDN_UNPIN_EN:\n+        return u->flags.unpin_en;\n+    default:\n+        g_assert_not_reached();\n+        return 0;\n+    }\n+}\n+\n+static QueryRespCode ufs_write_flag_value(UfsHc *u, uint8_t idn, uint8_t value)\n+{\n+    switch (idn) {\n+    case UFS_QUERY_FLAG_IDN_FDEVICEINIT:\n+        u->flags.device_init = 0;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_PERMANENT_WPE:\n+        u->flags.permanent_wp_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_PWR_ON_WPE:\n+        u->flags.power_on_wp_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_BKOPS_EN:\n+        u->flags.background_ops_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE:\n+        u->flags.device_life_span_mode_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_PURGE_ENABLE:\n+        u->flags.purge_enable = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_REFRESH_ENABLE:\n+        u->flags.refresh_enable = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL:\n+        u->flags.phy_resource_removal = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE:\n+        u->flags.permanently_disable_fw_update = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_WB_EN:\n+        u->flags.wb_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_EN:\n+        u->flags.wb_buffer_flush_en = value;\n+        break;\n+    case UFS_QUERY_FLAG_IDN_WB_BUFF_FLUSH_DURING_HIBERN8:\n+        u->flags.wb_buffer_flush_during_hibernate = value;\n+        break;\n+    default:\n+        return UFS_QUERY_RESULT_INVALID_VALUE;\n+    }\n+\n+    return UFS_QUERY_RESULT_SUCCESS;\n+}\n+\n+static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)\n+{\n+    UfsHc *u = req->hc;\n+    uint8_t idn = req->req_upiu.qr.idn;\n+    uint8_t value;\n+    QueryRespCode ret;\n+\n+    ret = ufs_flag_check_idn_valid(idn, op);\n+    if (ret) {\n+        return ret;\n+    }\n+\n+    if (op == UFS_QUERY_FLAG_READ) {\n+        value = ufs_read_flag_value(u, idn);\n+        ret = UFS_QUERY_RESULT_SUCCESS;\n+    } else if (op == UFS_QUERY_FLAG_SET) {\n+        value = 1;\n+        ret = ufs_write_flag_value(u, idn, value);\n+    } else if (op == UFS_QUERY_FLAG_CLEAR) {\n+        value = 0;\n+        ret = ufs_write_flag_value(u, idn, value);\n+    } else if (op == UFS_QUERY_FLAG_TOGGLE) {\n+        value = !(ufs_read_flag_value(u, idn));\n+        ret = ufs_write_flag_value(u, idn, value);\n+    } else {\n+        trace_ufs_err_query_invalid_opcode(op);\n+        return UFS_QUERY_RESULT_INVALID_OPCODE;\n+    }\n+\n+    req->rsp_upiu.qr.value = cpu_to_be32(value);\n+    return ret;\n+}\n+\n static const int attr_permission[UFS_QUERY_ATTR_IDN_COUNT] = {\n     /* booting is not supported */\n     [UFS_QUERY_ATTR_IDN_BOOT_LU_EN] = UFS_QUERY_ATTR_READ,\n@@ -1103,39 +1219,6 @@ static inline QueryRespCode ufs_attr_check_idn_valid(uint8_t idn, int op)\n     return UFS_QUERY_RESULT_SUCCESS;\n }\n \n-static QueryRespCode ufs_exec_query_flag(UfsRequest *req, int op)\n-{\n-    UfsHc *u = req->hc;\n-    uint8_t idn = req->req_upiu.qr.idn;\n-    uint32_t value;\n-    QueryRespCode ret;\n-\n-    ret = ufs_flag_check_idn_valid(idn, op);\n-    if (ret) {\n-        return ret;\n-    }\n-\n-    if (idn == UFS_QUERY_FLAG_IDN_FDEVICEINIT) {\n-        value = 0;\n-    } else if (op == UFS_QUERY_FLAG_READ) {\n-        value = *(((uint8_t *)&u->flags) + idn);\n-    } else if (op == UFS_QUERY_FLAG_SET) {\n-        value = 1;\n-    } else if (op == UFS_QUERY_FLAG_CLEAR) {\n-        value = 0;\n-    } else if (op == UFS_QUERY_FLAG_TOGGLE) {\n-        value = *(((uint8_t *)&u->flags) + idn);\n-        value = !value;\n-    } else {\n-        trace_ufs_err_query_invalid_opcode(op);\n-        return UFS_QUERY_RESULT_INVALID_OPCODE;\n-    }\n-\n-    *(((uint8_t *)&u->flags) + idn) = value;\n-    req->rsp_upiu.qr.value = cpu_to_be32(value);\n-    return UFS_QUERY_RESULT_SUCCESS;\n-}\n-\n static inline uint8_t ufs_read_device_temp(UfsHc *u)\n {\n     uint8_t feat_sup = u->device_desc.ufs_features_support;\n@@ -1300,6 +1383,9 @@ static QueryRespCode ufs_write_attr_value(UfsHc *u, uint8_t idn, uint32_t value)\n     case UFS_QUERY_ATTR_IDN_TIMESTAMP:\n         u->attributes.timestamp = cpu_to_be64(value);\n         break;\n+    default:\n+        g_assert_not_reached();\n+        return 0;\n     }\n     return UFS_QUERY_RESULT_SUCCESS;\n }\n","prefixes":["2/5"]}