[{"id":3673704,"web_url":"http://patchwork.ozlabs.org/comment/3673704/","msgid":"<723521f1-84b8-4fe9-a790-225d1e3c84d2@gmail.com>","list_archive_url":null,"date":"2026-04-06T11:05:20","subject":"Re: [PATCH 4/5] hw/ufs: Add UFS Write Booster Support","submitter":{"id":86755,"url":"http://patchwork.ozlabs.org/api/people/86755/","name":"Jeuk Kim","email":"jeuk20.kim@gmail.com"},"content":"On 4/2/2026 6:43 PM, Jaemyung Lee wrote:\n> Add UFS Write Booster implementation which follows UFS 4.1 Spec.\n>\n> Signed-off-by: Jaemyung Lee <jaemyung.lee@samsung.com>\n> ---\n>   hw/ufs/lu.c         |  85 ++++++++++++++\n>   hw/ufs/ufs.c        | 328 +++++++++++++++++++++++++++++++++++++++++++++++++---\n>   hw/ufs/ufs.h        |  39 +++++++\n>   include/block/ufs.h |  51 ++++++++\n>   4 files changed, 488 insertions(+), 15 deletions(-)\n>\n> diff --git a/hw/ufs/lu.c b/hw/ufs/lu.c\n> index 3f3c9589cee57ae3e77e2f486476d5fcec204d80..7c25c15169f76f22059c3ae03dfc1f21b0e41e8d 100644\n> --- a/hw/ufs/lu.c\n> +++ b/hw/ufs/lu.c\n> @@ -247,6 +247,89 @@ static UfsReqResult ufs_emulate_scsi_cmd(UfsLu *lu, UfsRequest *req)\n>       return UFS_REQUEST_SUCCESS;\n>   }\n>   \n> +#define UFS_GROUP_NUMBER_MASK 0x1F\n> +#define UFS_WB_GROUP_NUMBER_PINNED 0x18 /* 11000b */\n> +static bool ufs_wb_check_write_pinned(UfsHc *u, UfsRequest *req)\n> +{\n> +    uint8_t group_number = req->req_upiu.sc.cdb[6] & UFS_GROUP_NUMBER_MASK;\n> +\n> +    if (u->attributes.wb_buffer_partial_flush_mode != UFS_WB_FLUSH_PINNED) {\n> +        return false;\n> +    }\n> +\n> +    return (group_number == UFS_WB_GROUP_NUMBER_PINNED);\n> +}\n> +\n> +#define UFS_WB_TOTAL_WRITTEN_SHIFT 21 /* 10MB */\n> +static void ufs_wb_process_write_pinned(UfsHc *u, UfsRequest *req)\n> +{\n> +    UfsWb *wb = &u->wb;\n> +    uint64_t remain_bytes, remain_data;\n> +    uint32_t total_written;\n> +\n> +    if (!wb->pinned_curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    if (wb->pinned_used_bytes >= wb->pinned_curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    remain_bytes = wb->pinned_curr_bytes - wb->pinned_used_bytes;\n> +    if (remain_bytes >= req->data_len) {\n> +        wb->pinned_total_written_bytes += req->data_len;\n> +        wb->pinned_used_bytes += req->data_len;\n> +        remain_data = 0;\n> +\n> +    } else {\n> +        wb->pinned_total_written_bytes += remain_bytes;\n> +        wb->pinned_used_bytes += remain_bytes;\n> +        remain_data = req->data_len - remain_bytes;\n> +    }\n> +\n> +    total_written = wb->pinned_total_written_bytes >> UFS_WB_TOTAL_WRITTEN_SHIFT;\n> +    u->attributes.pinned_wb_cumm_written_size = cpu_to_be32(total_written);\n> +\n> +    remain_bytes = wb->curr_bytes - wb->used_bytes;\n> +    wb->used_bytes += MIN(remain_bytes, remain_data);\n> +}\n> +\n> +static void ufs_wb_process_write_normal(UfsHc *u, UfsRequest *req)\n> +{\n> +    UfsWb *wb = &u->wb;\n> +    uint64_t curr_bytes, used_bytes, remain_bytes;\n> +\n> +    if (!wb->curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    curr_bytes = wb->curr_bytes - wb->pinned_curr_bytes;\n> +    used_bytes = wb->used_bytes - wb->pinned_used_bytes;\n> +\n> +    if (used_bytes >= curr_bytes) {\n> +        return;\n> +    }\n> +\n> +    remain_bytes = curr_bytes - used_bytes;\n> +    wb->used_bytes += MIN(remain_bytes, req->data_len);\n> +}\n> +\n> +static void ufs_wb_process_write_cmd(UfsRequest *req)\n> +{\n> +    uint8_t command = req->req_upiu.sc.cdb[0];\n> +    UfsHc *u = req->hc;\n> +\n> +    if (command != WRITE_10 || !u->flags.wb_en) {\n\nQEMU UFS supports not only WRITE_10 but also WRITE_6, WRITE_12, and \nWRITE_16.\n\nThis path should take those commands into account as well, and the group \nnumber handling would need to be updated accordingly.\n\n\n> +        return;\n> +    }\n> +\n> +    if (ufs_wb_check_write_pinned(u, req)) {\n> +        ufs_wb_process_write_pinned(u, req);\n> +    } else {\n> +        ufs_wb_process_write_normal(u, req);\n> +    }\n> +}\n> +\n>   static UfsReqResult ufs_process_scsi_cmd(UfsLu *lu, UfsRequest *req)\n>   {\n>       uint8_t task_tag = req->req_upiu.header.task_tag;\n> @@ -261,6 +344,8 @@ static UfsReqResult ufs_process_scsi_cmd(UfsLu *lu, UfsRequest *req)\n>           return ufs_emulate_scsi_cmd(lu, req);\n>       }\n>   \n> +    ufs_wb_process_write_cmd(req);\n\nIt seems better to account this at completion time instead.\n\nOtherwise failed writes can still consume WB space, and the accounting \nhas to rely on req->data_len rather than the actual transferred_len \nreported at completion.\n\n> +\n>   static void ufs_init_hc(UfsHc *u)\n>   {\n>       uint32_t cap = 0;\n>       uint32_t mcqconfig = 0;\n>       uint32_t mcqcap = 0;\n> +    uint32_t ext_wb_sup = WB_RESIZE | WB_FIFO | WB_PINNED;\n> +    uint32_t ext_ufs_feat_sup = UFS_DEV_WB_SUPPORT |\n> +                                UFS_DEV_HIGH_TEMP_NOTIF |\n> +                                UFS_DEV_LOW_TEMP_NOTIF;\n>       int64_t now = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT);\n>   \n>       u->reg_size = pow2ceil(ufs_reg_size(u));\n> @@ -1965,8 +2241,13 @@ static void ufs_init_hc(UfsHc *u)\n>           UFS_DEV_LOW_TEMP_NOTIF;\n>       u->device_desc.queue_depth = u->params.nutrs;\n>       u->device_desc.product_revision_level = 0x04;\n> +    u->device_desc.extended_wb_support |= cpu_to_be16(ext_wb_sup);\n>       u->device_desc.extended_ufs_features_support =\n> -        cpu_to_be32(UFS_DEV_HIGH_TEMP_NOTIF | UFS_DEV_LOW_TEMP_NOTIF);\n> +        cpu_to_be32((ext_ufs_feat_sup));\n> +    u->device_desc.write_booster_buffer_preserve_user_space_en = 0x01;\n> +    u->device_desc.write_booster_buffer_type = 0x01;\n> +    u->device_desc.num_shared_write_booster_buffer_alloc_units =\n> +        cpu_to_be32(0x400); /* 4GB */\n\nShouldn't this use the configured wb-max-size rather than a hardcoded \nvalue?\n\n\n>   \n>       memset(&u->geometry_desc, 0, sizeof(GeometryDescriptor));\n>       u->geometry_desc.length = sizeof(GeometryDescriptor);\n> @@ -1982,6 +2263,16 @@ static void ufs_init_hc(UfsHc *u)\n>           0x0; /* out-of-order data transfer is not supported */\n>       u->geometry_desc.max_context_id_number = 0x5;\n>       u->geometry_desc.supported_memory_types = cpu_to_be16(0x8001);\n> +    u->geometry_desc.write_booster_buffer_max_n_alloc_units =\n> +        cpu_to_be32(u->params.wb_max_size);\n> +    u->geometry_desc.device_max_write_booster_l_us =\n> +        u->params.wb_max_lus;\n> +    u->geometry_desc.write_booster_buffer_cap_adj_fac =\n> +        u->params.wb_cap_adj_fac;\n> +    u->geometry_desc.supported_write_booster_buffer_user_space_reduction_types =\n> +        u->params.wb_reduction;\n> +    u->geometry_desc.supported_write_booster_buffer_types =\n> +        0x1; /* lu-dedicated buffer type is not supported */\n>   \n>       memset(&u->attributes, 0, sizeof(u->attributes));\n>       u->attributes.max_data_in_size = 0x08;\n> @@ -1996,6 +2287,8 @@ static void ufs_init_hc(UfsHc *u)\n>       memset(&u->flags, 0, sizeof(u->flags));\n>       u->flags.permanently_disable_fw_update = 1;\n>   \n> +    ufs_wb_init(u);\n> +\n>       /*\n>        * The temperature value is fixed to UFS_TEMPERATURE and does not change\n>        * dynamically\n> @@ -2061,6 +2354,11 @@ static const Property ufs_props[] = {\n>       DEFINE_PROP_UINT8(\"nutmrs\", UfsHc, params.nutmrs, 8),\n>       DEFINE_PROP_BOOL(\"mcq\", UfsHc, params.mcq, false),\n>       DEFINE_PROP_UINT8(\"mcq-maxq\", UfsHc, params.mcq_maxq, 2),\n> +    DEFINE_PROP_UINT32(\"wb-max-size\", UfsHc, params.wb_max_size, 0x400),\n> +    DEFINE_PROP_UINT32(\"wb-min-size\", UfsHc, params.wb_min_size, 0x100),\n> +    DEFINE_PROP_UINT8(\"wb-max-lus\", UfsHc, params.wb_max_lus, 1),\n> +    DEFINE_PROP_UINT8(\"wb-cap-adj-fac\", UfsHc, params.wb_cap_adj_fac, 3),\n> +    DEFINE_PROP_UINT8(\"wb-reduction\", UfsHc, params.wb_reduction, 1),\n>   };\n>   \n>   static const VMStateDescription ufs_vmstate = {\n> diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h\n> index b5f040302129f4d02732ddd20ef82eb33c41922a..f27c30d202195636726e6920d14c3ee9c03494be 100644\n> --- a/hw/ufs/ufs.h\n> +++ b/hw/ufs/ufs.h\n> @@ -91,6 +91,11 @@ typedef struct UfsParams {\n>       bool mcq; /* Multiple Command Queue support */\n>       uint8_t mcq_qcfgptr; /* MCQ Queue Configuration Pointer in MCQCAP */\n>       uint8_t mcq_maxq; /* MCQ Maximum number of Queues */\n> +    uint32_t wb_max_size; /* WB Maximum allocation units */\n> +    uint32_t wb_min_size; /* WB Minimum allocation units */\n\nHow about checking this in ufs_check_constraints() and rejecting \nconfigurations where wb_min_size is larger than wb_max_size?\nAllowing that configuration can make the WB resize calculation behave \nunexpectedly from the start.\n\n\n> +    uint8_t wb_max_lus; /* WB Maximum number of LUs */\n> +    uint8_t wb_cap_adj_fac; /* WB Capacity Adjustment Factor */\n> +    uint8_t wb_reduction; /* WB User Space Reduction */\n>   } UfsParams;\n>   \n>   /*\n> @@ -118,6 +123,24 @@ typedef struct UfsCq {\n>       QTAILQ_HEAD(, UfsRequest) req_list;\n>   } UfsCq;\n>   \n> +/*\n> + * Extended features\n> + */\n> +typedef struct UfsWb {\n> +    struct UfsHc *u;\n> +    uint64_t max_bytes;\n> +    uint64_t min_bytes;\n> +    uint64_t curr_bytes;\n> +    uint64_t used_bytes;\n> +    uint64_t resize_bytes;\n> +\n> +    uint64_t pinned_max_bytes;\n> +    uint64_t pinned_min_bytes;\n> +    uint64_t pinned_curr_bytes;\n> +    uint64_t pinned_used_bytes;\n> +    uint64_t pinned_total_written_bytes;\n> +} UfsWb;\n> +\n>   typedef struct UfsHc {\n>       PCIDevice parent_obj;\n>       UfsBus bus;\n> @@ -147,6 +170,9 @@ typedef struct UfsHc {\n>       UfsSq *sq[UFS_MAX_MCQ_QNUM];\n>       UfsCq *cq[UFS_MAX_MCQ_QNUM];\n>   \n> +    /* Extended features */\n> +    UfsWb wb;\n> +\n>       uint8_t temperature;\n>   \n>       QEMUTimer idle_timer;\n> @@ -211,6 +237,19 @@ static inline bool ufs_mcq_cq_full(UfsHc *u, uint32_t qid)\n>       return tail == ufs_mcq_cq_head(u, qid);\n>   }\n>   \n> +static inline uint64_t ufs_unit_to_byte(UfsHc *u, uint32_t unit)\n> +{\n> +    return unit * u->geometry_desc.allocation_unit_size *\n> +           be32_to_cpu(u->geometry_desc.segment_size) * BDRV_SECTOR_SIZE;\n\nThe size conversion path should promote to 64-bit before doing the \nmultiplication.\n\n(uint64_t)unit * u->geometry_desc.allocation_unit_size *\n     ...\n\n\n> +}\n> +\n> +static inline uint32_t ufs_byte_to_unit(UfsHc *u, uint64_t byte)\n> +{\n> +    return byte / BDRV_SECTOR_SIZE /\n> +           be32_to_cpu(u->geometry_desc.segment_size) /\n> +           u->geometry_desc.allocation_unit_size;\n> +}\n> +\n>   #define TYPE_UFS \"ufs\"\n>   #define UFS(obj) OBJECT_CHECK(UfsHc, (obj), TYPE_UFS)\n>   \n> diff --git a/include/block/ufs.h b/include/block/ufs.h\n> index 4dacfb776f947a285d86018add82115f148b7dd9..aa0dde805826d0b06ab80fb74034192ba06c2045 100644\n> --- a/include/block/ufs.h\n> +++ b/include/block/ufs.h\n> @@ -1126,11 +1126,24 @@ enum health_desc_param {\n>       UFS_HEALTH_DESC_PARAM_LIFE_TIME_EST_B = 0x4,\n>   };\n>   \n> +/* Possible values for bUFSFeaturesSupport */\n>   enum {\n>       UFS_DEV_HIGH_TEMP_NOTIF = BIT(4),\n>       UFS_DEV_LOW_TEMP_NOTIF = BIT(5),\n>   };\n>   \n> +/* Possible values for dExtendedWriteBoosterSupport */\n> +enum {\n> +    WB_RESIZE = BIT(0),\n> +    WB_FIFO = BIT(1),\n> +    WB_PINNED = BIT(2),\n> +};\n> +\n> +/* Possible values for dExtendedUFSFeaturesSupport */\n> +enum {\n> +    UFS_DEV_WB_SUPPORT = BIT(8),\n> +};\n> +\n>   /* WriteBooster buffer mode */\n>   enum {\n>       UFS_WB_BUF_MODE_LU_DEDICATED = 0x0,\n> @@ -1207,6 +1220,44 @@ enum ufs_dev_pwr_mode {\n>       UFS_DEEPSLEEP_PWR_MODE = 4,\n>   };\n>   \n> +/* UFS Write Booster */\n> +enum ufs_wb_flush_status {\n> +    UFS_WB_FLUSH_IDLE = 0,\n> +    UFS_WB_FLUSH_IN_PROGRESS = 1,\n> +    UFS_WB_FLUSH_SUSPENDED = 2,\n> +    UFS_WB_FLUSH_COMPLETED = 3,\n> +    UFS_WB_FLUSH_FAILED = 4,\n> +    UFS_WB_FLUSH_STATUS_MAX,\n> +};\n> +\n> +enum ufs_wb_flush_mode {\n> +    UFS_WB_FLUSH_NONE = 0,\n> +    UFS_WB_FLUSH_FIFO = 1,\n> +    UFS_WB_FLUSH_PINNED = 2,\n> +    UFS_WB_FLUSH_MODE_MAX,\n> +};\n> +\n> +enum ufs_wb_resize_hint {\n> +    UFS_WB_HINT_KEEP = 0,\n> +    UFS_WB_HINT_DECREASE = 1,\n> +    UFS_WB_HINT_ENCREASE = 2,\n> +    UFS_WB_RESIZE_HINT_MAX,\n> +};\n> +\n> +enum ufs_wb_resize_op {\n> +    UFS_WB_DECREASE = 0,\n> +    UFS_WB_INCREASE = 1,\n> +    UFS_WB_RESIZE_OP_MAX,\n> +};\n> +\n> +enum ufs_wb_resize_status {\n> +    UFS_WB_RESIZE_IDLE = 0,\n> +    UFS_WB_RESIZE_IN_PROGRESS = 1,\n> +    UFS_WB_RESIZE_COMPLETED = 2,\n> +    UFS_WB_RESIZE_FAILED = 3,\n> +    UFS_WB_RESIZE_STATUS_MAX,\n> +};\n> +\n>   /*\n>    * struct UtpCmdRsp - Response UPIU structure\n>    * @residual_transfer_count: Residual transfer count DW-3\n>","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=jtUFCLKY;\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 4fq62H4D7mz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 06 Apr 2026 21:05:59 +1000 (AEST)","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 1w9hls-0003uf-GG; Mon, 06 Apr 2026 07:05:32 -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 <jeuk20.kim@gmail.com>)\n id 1w9hln-0003st-Pv\n for qemu-devel@nongnu.org; Mon, 06 Apr 2026 07:05:27 -0400","from mail-pj1-x1034.google.com ([2607:f8b0:4864:20::1034])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <jeuk20.kim@gmail.com>)\n id 1w9hll-0003RR-9V\n for qemu-devel@nongnu.org; Mon, 06 Apr 2026 07:05:27 -0400","by mail-pj1-x1034.google.com with SMTP id\n 98e67ed59e1d1-35d9923eec5so2206708a91.2\n for <qemu-devel@nongnu.org>; Mon, 06 Apr 2026 04:05:24 -0700 (PDT)","from [192.168.0.22] ([211.226.54.223])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35de6a5e62dsm3666335a91.13.2026.04.06.04.05.21\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Mon, 06 Apr 2026 04:05:23 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775473524; x=1776078324; darn=nongnu.org;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :from:to:cc:subject:date:message-id:reply-to;\n bh=gDabuopvI4cEhh7FEKyL+72w4eJz9sd6DRtakqpqGB0=;\n b=jtUFCLKY9LYImCtTf1yGHBDtt2ppbza46nmqQ71LX43CbqvKsMvJXWoR7Zon4c3NMI\n 2yroE6jM8uPzhsilhqrbrL0g0fguQWxpdnAm77HxNmFKpvacaG9msva3kV745uV3xRrk\n oEodlp/k6zQNFnvO1YSs8yIk4BVBax6iZAY8nYlIy9S4g9DpyxbeZbZ43EU+xbesZGFW\n KES871bV7RpHGCacsDiILapRQJWl2skqev2yTKS4rh7SDL7v+7wBl+ypu9LCuslz4IZy\n 7mNt6GrnCNCYCEL75H6gy1gy+4dj0C5chuLh3V0L7h2tnw8SSza3wJ6f1VzlGQS/e2ZA\n 8yiA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775473524; x=1776078324;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=gDabuopvI4cEhh7FEKyL+72w4eJz9sd6DRtakqpqGB0=;\n b=J9B/eUjsvA18D2yt0A//Dbzvuh1r+it1cTL4EdPwETuUrbnMVkQPUMKk1GZ6h8MmKC\n tLRKBwfFvmxVLZRWywIjPObbBZFqHxto4gmhfTho0eQ5tLkilIc5h55YR3jOpaPSw/mF\n NuuDiVol+d/XBN580u8qXIhyq5Nz520JQqOTgqckiT5jU5i7Gdmw2waiFBmox2gwla9h\n xAgvz61BaS/v+4ssh4OMTjlBuSrcuO39nIQXvziQboY7vZTC8XDMQaXp5ArvMYheMl83\n u5bheZ5EBhqBbgLj4K8WBLcyWZQBI+yGTCxKeR+7ZAThTBH+YVkxXC4LOkKqrUFj9la6\n O+Aw==","X-Forwarded-Encrypted":"i=1;\n AJvYcCVk7jSBultRZr5GFVsBuzaqEmwqJdbjhzNuIP1qWAXOfgi7APE1TDiXwcdBGKQ8VzdF0+QzVEcJYJr5@nongnu.org","X-Gm-Message-State":"AOJu0YwiWfbaCHRfou9eYr/VTNQFpOOL0lqGpq0zr+Y4MO0ttOgrxRwj\n /V+o+qvMFcdHPZldU4lp4gK2OsUQf/ZdAzum2ZxxnSfUXTe4wjKyBkcH","X-Gm-Gg":"AeBDietYeHJ7odSvhO0J261q9MCyEkqtHmiNnptcMb5bajZlnXMNUr2puDX8dhIcZAs\n NPGilnXsWn96Rs94DjUdVcr/PVXlEMD3M7pqS3fwpPYmAyV2t3FsOsyfgE+0zlnf96OqJNH8eJ4\n 3SSlI4IqExEAh6bs0/9vF4NVS7yhd3iisT34N4gLhwu7kdQrdEp+13jyj+vc7K8ETCeXrAhtR/Z\n U5cYj4TOCf1aHCwwr842wvqK+nMwsac9t370CnilpBTI0CjkFXpyizDFBQxIqpg/b/SoNtk+z8v\n JCJSzuH6OqbThsNX/QfFDS21yC/ZPuUvXhvhJVydKlH+NrZjJEttg1Zs30e3oQwLOPPUSYT8gwD\n JwCbCSMcLhdJu9E9FsXGw9lJIdaIyEV10eS1qkUd10LGTgWVYxt+s8x9Pz5Q+lkbtWRG8ksRbAP\n sUaGikv7vn2CN9SR0jSsr6kYcZhh6y180qTG90kMjvWw==","X-Received":"by 2002:a17:90a:dfc3:b0:35b:e529:2d60 with SMTP id\n 98e67ed59e1d1-35de68712b0mr11175755a91.8.1775473523674;\n Mon, 06 Apr 2026 04:05:23 -0700 (PDT)","Message-ID":"<723521f1-84b8-4fe9-a790-225d1e3c84d2@gmail.com>","Date":"Mon, 6 Apr 2026 20:05:20 +0900","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 4/5] hw/ufs: Add UFS Write Booster Support","To":"Jaemyung Lee <ldc.jml@gmail.com>, 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>, Jaemyung Lee <jaemyung.lee@samsung.com>","References":"<20260402-write_booster-v1-0-e4fed1df6c7e@samsung.com>\n <20260402-write_booster-v1-4-e4fed1df6c7e@samsung.com>","Content-Language":"ko","From":"Jeuk Kim <jeuk20.kim@gmail.com>","In-Reply-To":"<20260402-write_booster-v1-4-e4fed1df6c7e@samsung.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2607:f8b0:4864:20::1034;\n envelope-from=jeuk20.kim@gmail.com; helo=mail-pj1-x1034.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-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"}}]