From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 08E61CE8379 for ; Mon, 30 Sep 2024 18:12:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 77064280019; Mon, 30 Sep 2024 14:12:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6D19B280017; Mon, 30 Sep 2024 14:12:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5223D280019; Mon, 30 Sep 2024 14:12:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 34ACF280017 for ; Mon, 30 Sep 2024 14:12:45 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id E8DD81C611B for ; Mon, 30 Sep 2024 18:12:44 +0000 (UTC) X-FDA: 82622200248.01.DEEECD3 Received: from mail-yw1-f182.google.com (mail-yw1-f182.google.com [209.85.128.182]) by imf03.hostedemail.com (Postfix) with ESMTP id 027CF2000F for ; Mon, 30 Sep 2024 18:12:42 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dSsO1yVo; spf=pass (imf03.hostedemail.com: domain of nifan.cxl@gmail.com designates 209.85.128.182 as permitted sender) smtp.mailfrom=nifan.cxl@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1727719836; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yOQRubuT/DdhrnZg0J46Z8IjsbDjiXizvk3mSMiIiPk=; b=Ejl3L5ZQ3K/AKw+nM+PlKexAe8s+XTJ880AvvL0Di3N7g4qBf4misCpfmqw5SuSet2ffT4 nOUGMpXNIXnobWH04YslNj4J88L3P4FeBmXBAogMqFqQ56OHkMj2NsRNxmX9N24YHfZ9lV uyCbqe30w3v7QC6++Jtj3cBC/QNLR2A= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727719836; a=rsa-sha256; cv=none; b=s/bivyDKojMlYuZ4kY2kk6MqoWuZf4QEpxLAbUbXTxZfpZczLndrVd9yTC12qA8ljGhs4F mVb31p9XhV4gdTkGz0AHZvIiL+wIUHEt1ZrmAyRMFTaGOvGiFKuXS1B6Db6z+fQhY7+UpW EyWtkqJKhMBziEHf+5cPcSMx7GlRpVE= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dSsO1yVo; spf=pass (imf03.hostedemail.com: domain of nifan.cxl@gmail.com designates 209.85.128.182 as permitted sender) smtp.mailfrom=nifan.cxl@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-yw1-f182.google.com with SMTP id 00721157ae682-6dbb24ee2ebso42358407b3.1 for ; Mon, 30 Sep 2024 11:12:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727719962; x=1728324762; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:from:to:cc:subject:date:message-id:reply-to; bh=yOQRubuT/DdhrnZg0J46Z8IjsbDjiXizvk3mSMiIiPk=; b=dSsO1yVoYqJ3H8yh+ScySMI49qXLzzyQf2nnNQRk/AyDjvo2vkOrZS7U+h7yQRsTX4 JzdT4weUxStDFeHbwoUqCyX/K0SyOI0U0pjl5E5u6yU84+PsZ/QAecGSMbpGOYy+D+X4 viOJMCh4e4Az35xFgV/0/+3xyjzjq8+sTgzcjF58KjeV2l8P1EEfTyG6menGQ+kEqsTY PkUsc7XpQXu2EYOk82jHSKxx4jRsoVfJ2k5EW8vmPzypiu6BnQBixI3K65xS7ndRu5RT 2DHkBC9rmgaAyqiX05dBDRhbXO1sYTsXH3bPD+5qg5hZ6fl1VxhhyEGJUNXsFP+QLais DpyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727719962; x=1728324762; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=yOQRubuT/DdhrnZg0J46Z8IjsbDjiXizvk3mSMiIiPk=; b=wW4cSwTQAgDKtY0gPjDOWYDLMEXU/t5pZG5CYoVQnuiA87nyLqN8jejWx/rzi4bNHF Osn6mkxGYZNkJlQyvdT6VwpDqu6i96PesIshmClEAjOiWCr+/WrJJxjRfqYhEkzPu+yo nalAdFYRd641b1THBGVC/v4sKUWDo1GgTVHOA6kVmdSrqdw0MA81JmzQS7hPNE02riF9 mLjSAoWVbeWKF0dqVIxv8dh4H0h6aJFUbRVu73dlx31/7yOI30aLz+0+QW+E5DxGpddy 7i6OdfF06QhJsd8d5w/H2jIH7OQ25rHNGyNTANJNODn8EiZCzsMiLuKINQE9KIZFpLS2 fCQw== X-Forwarded-Encrypted: i=1; AJvYcCUYH83JP9xffMKNFDfyq+UfTodx0jN/Mo3VrpPDrvEep7s2WFDrN7SYQDewCZJ7iP4q+IGWl3kYXQ==@kvack.org X-Gm-Message-State: AOJu0YyltklopzZy0ct172OVn/wRgTCNghJ9oflEUXS5UXTiXX8E1+ew pF9j4gUlipgi8ZhV6C50pQU61vcV9qDFWx8EW6WHwNSWYr/Wyswe X-Google-Smtp-Source: AGHT+IFGDtb1okPx8ASJ/FqC3q3kJ3m8KDX+uOf7nXaeJotGB3ywKi4Rawv85c/1vPtm8bldSFByTQ== X-Received: by 2002:a05:690c:389:b0:6e2:71b:150 with SMTP id 00721157ae682-6e2475d07c4mr79893047b3.29.1727719961869; Mon, 30 Sep 2024 11:12:41 -0700 (PDT) Received: from fan ([50.205.20.42]) by smtp.gmail.com with ESMTPSA id 00721157ae682-6e24536999esm15107697b3.95.2024.09.30.11.12.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2024 11:12:41 -0700 (PDT) From: Fan Ni X-Google-Original-From: Fan Ni Date: Mon, 30 Sep 2024 11:12:36 -0700 To: shiju.jose@huawei.com Cc: linux-edac@vger.kernel.org, linux-cxl@vger.kernel.org, linux-acpi@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, bp@alien8.de, tony.luck@intel.com, rafael@kernel.org, lenb@kernel.org, mchehab@kernel.org, dan.j.williams@intel.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, david@redhat.com, Vilas.Sridharan@amd.com, leo.duran@amd.com, Yazen.Ghannam@amd.com, rientjes@google.com, jiaqiyan@google.com, Jon.Grimm@amd.com, dave.hansen@linux.intel.com, naoya.horiguchi@nec.com, james.morse@arm.com, jthoughton@google.com, somasundaram.a@hpe.com, erdemaktas@google.com, pgonda@google.com, duenwen@google.com, mike.malvestuto@intel.com, gthelen@google.com, wschwartz@amperecomputing.com, dferguson@amperecomputing.com, wbs@os.amperecomputing.com, nifan.cxl@gmail.com, jgroves@micron.com, vsalve@micron.com, tanxiaofei@huawei.com, prime.zeng@hisilicon.com, roberto.sassu@huawei.com, kangkang.shen@futurewei.com, wanghuiqiang@huawei.com, linuxarm@huawei.com Subject: Re: [PATCH v12 11/17] cxl/memfeature: Add CXL memory device ECS control feature Message-ID: References: <20240911090447.751-1-shiju.jose@huawei.com> <20240911090447.751-12-shiju.jose@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240911090447.751-12-shiju.jose@huawei.com> X-Stat-Signature: bt7wdn3nsd17omoctfr1ahcnfewjwzqw X-Rspamd-Queue-Id: 027CF2000F X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1727719962-527893 X-HE-Meta: U2FsdGVkX1+4Y01zJQHCNU82cWiSKQBiT0DtRbHY/iJ67zywonJ5XK5Q/DP8V7eK8JJwXJSpqXoVU+48vj4/zp45TikFz+11VXA9qdNarjftp0SW250S07CDe/Xha+jp91iK5Vhjj3c+p+7wlKyuRMnrEd8erxCpj7tno/NaRg5kmRW/oFvSmsRT5n4x77Bv0QUqTDzbOy0j9TgIdCdYH+wdQSizTEhmqrzC69mC8YlF9pPZ6FuJouJbu6iRjUq03XIlTk2YOtNF5tjeHDjvdGw+of+zKJ+s1CXUrBo9RZK5Ieo+3da6I9ru5z9406FQntmfev53pVncwlaBJ2y+zYk+Sk6yJb+y96HMuvDWV4cyqLyZOEjIW/UCr3IYjI2N0FnWJAfuV/+Av6TYt+7Px2bDIQX4qa3Am5nq2P4DlqGaK+zdrhO0tz9mf9+Wf7Lotijwhx3KEJFFeiW1Tcb9KJPo9xVFctAvEOeMi8foUM35k7j5+SEruKONYZzqNU8ANuwXdCHiHaz1ToJ6BvsS1Pnl36cxiAzqXUihfIDO/Oc7Wy3LLiU5oXWdIjOqdhxo+WTPit/jANwKPpRBhXTgv6sLXEKR9ghN8Yck4o9N6BBrjtl9jUuRep0KxrjUI8OYey9RR0HgYx0XHvFyXlOTB1pv6bsGroK7fiaNUeWJNJbaAXc2GKwOyfq+4fF2UIGyiStzpP5Lop7jF/a+6MiKAMqhj+Qpd2bqUER8LGERcxhfHxT+F+eWUUpR6x30X2gthXpDleBW9x4QDkZU/laV6OumweyaNJVJXvWq0LIcAPWdvNYAjXCJ28Ed8AK2Ef+2L1061gWiXjvvSGGXHJpXWRc0H1+Rh5iMiiYZvNxu4P/SXP+35wJpmiNU3YB+GFGQ3d3FcJgv4q/dH5l7A6VxBi5y+c5zDf2PPRRqhf/SSgSoluJ6EfOOBzvCZfYQj5F/KXu2nDBTCd43rd0IZPQ TT9ffDJ5 9jrCIdpiGVaY4TC56F5q9nDd57ZE4et9FkqELqbg/yDV4AJoHwdb1XxFqhTiOCR3cXAI5G3+I1vRO87bfEb/Uj8YlucFhk5vp1wPHpCuyFEUFB9/XAUBxH3oXLfnG7sECS+5y/43gp9+Ld6egS8Q/pi1qxAijM0hMk2FuBhtgyHiJj9gPFQvtAbF5HZotASyDxEYnnJUafR/2S8Z+2JfL3tFvuW/6z3kmKCe02H1GlXQKlCoOAioK0VCEaJUb4LZLil7cK1xC9qhP4EcOpb59PascQ9iyXHL+T1AbXOXlMJEorLJ3XU6oEv12cvdOTvntZLYHMt39zH7JLbco52ux6wc/Pa/7iWxrkMc54sYmKTzboaijwGCxkR0ek5WXjBxtoq2SAPQgZNG44LVE88Mwm9OM1mwRNHTrBUZ1Qj6KM8ZS7LreWMwgxJ4UAsqg/EAZLVdjYMyGLYT+XwqCZ4oNc6NONd3Oy4njh7xDh5MtVG39woBZJSe8Lp0umnIeW3GiTgbb/364bu7MYFQ= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Wed, Sep 11, 2024 at 10:04:40AM +0100, shiju.jose@huawei.com wrote: > From: Shiju Jose > > CXL spec 3.1 section 8.2.9.9.11.2 describes the DDR5 ECS (Error Check > Scrub) control feature. > The Error Check Scrub (ECS) is a feature defined in JEDEC DDR5 SDRAM > Specification (JESD79-5) and allows the DRAM to internally read, correct > single-bit errors, and write back corrected data bits to the DRAM array > while providing transparency to error counts. > > The ECS control allows the requester to change the log entry type, the ECS > threshold count provided that the request is within the definition > specified in DDR5 mode registers, change mode between codeword mode and > row count mode, and reset the ECS counter. > > Register with EDAC RAS control feature driver, which gets the ECS attr > descriptors from the EDAC ECS and expose sysfs ECS control attributes > to the userspace. > For example ECS control for the memory media FRU 0 in CXL mem0 device is > in /sys/bus/edac/devices/cxl_mem0/ecs_fru0/ > > Signed-off-by: Shiju Jose > --- > drivers/cxl/core/memfeature.c | 439 +++++++++++++++++++++++++++++++++- > 1 file changed, 438 insertions(+), 1 deletion(-) > > diff --git a/drivers/cxl/core/memfeature.c b/drivers/cxl/core/memfeature.c > index 90c68d20b02b..5d4057fa304c 100644 > --- a/drivers/cxl/core/memfeature.c > +++ b/drivers/cxl/core/memfeature.c > @@ -19,7 +19,7 @@ > #include > #include > > -#define CXL_DEV_NUM_RAS_FEATURES 1 > +#define CXL_DEV_NUM_RAS_FEATURES 2 > #define CXL_DEV_HOUR_IN_SECS 3600 > > #define CXL_SCRUB_NAME_LEN 128 > @@ -303,6 +303,405 @@ static const struct edac_scrub_ops cxl_ps_scrub_ops = { > .cycle_duration_write = cxl_patrol_scrub_write_scrub_cycle, > }; > ... > + case CXL_ECS_PARAM_THRESHOLD: > + wr_attrs[fru_id].ecs_config &= ~CXL_ECS_THRESHOLD_COUNT_MASK; > + switch (params->threshold) { > + case 256: > + wr_attrs[fru_id].ecs_config |= FIELD_PREP(CXL_ECS_THRESHOLD_COUNT_MASK, > + ECS_THRESHOLD_256); > + break; > + case 1024: > + wr_attrs[fru_id].ecs_config |= FIELD_PREP(CXL_ECS_THRESHOLD_COUNT_MASK, > + ECS_THRESHOLD_1024); > + break; > + case 4096: > + wr_attrs[fru_id].ecs_config |= FIELD_PREP(CXL_ECS_THRESHOLD_COUNT_MASK, > + ECS_THRESHOLD_4096); > + break; > + default: > + dev_err(dev, > + "Invalid CXL ECS scrub threshold count(%d) to set\n", > + params->threshold); > + dev_err(dev, > + "Supported scrub threshold count: 256,1024,4096\n"); > + return -EINVAL; > + } > + break; > + case CXL_ECS_PARAM_MODE: > + if (params->mode != ECS_MODE_COUNTS_ROWS && > + params->mode != ECS_MODE_COUNTS_CODEWORDS) { > + dev_err(dev, > + "Invalid CXL ECS scrub mode(%d) to set\n", > + params->mode); > + dev_err(dev, > + "Mode 0: ECS counts rows with errors" > + " 1: ECS counts codewords with errors\n"); The messaging here can be improved. When printed out in dmesg, it looks like root@localhost:~# echo 2 > /sys/bus/edac/devices/cxl_mem0/ecs_fru0/mode ---- [ 6099.073006] cxl_mem mem0: Invalid CXL ECS scrub mode(2) to set [ 6099.074407] cxl_mem mem0: Mode 0: ECS counts rows with errors 1: ECS counts codewords with errors ---- Maybe use similar message format as threshold above, like + dev_err(dev, + "Supported ECS mode: 0: ECS counts rows with errors; 1: ECS counts codewords with errors\n"); Fan > + return -EINVAL; > + } > + wr_attrs[fru_id].ecs_config &= ~CXL_ECS_MODE_MASK; > + wr_attrs[fru_id].ecs_config |= FIELD_PREP(CXL_ECS_MODE_MASK, > + params->mode); > + break; > + case CXL_ECS_PARAM_RESET_COUNTER: > + wr_attrs[fru_id].ecs_config &= ~CXL_ECS_RESET_COUNTER_MASK; > + wr_attrs[fru_id].ecs_config |= FIELD_PREP(CXL_ECS_RESET_COUNTER_MASK, > + params->reset_counter); > + break; > + default: > + dev_err(dev, "Invalid CXL ECS parameter to set\n"); > + return -EINVAL; > + } > + > + ret = cxl_set_feature(cxlds, cxl_ecs_uuid, cxl_ecs_ctx->set_version, > + wr_attrs, wr_data_size, > + CXL_SET_FEAT_FLAG_DATA_SAVED_ACROSS_RESET); > + if (ret) { > + dev_err(dev, "CXL ECS set feature failed ret=%d\n", ret); > + return ret; > + } > + > + return 0; > +} > + > +static int cxl_ecs_get_log_entry_type(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + *val = params.log_entry_type; > + > + return 0; > +} > + > +static int cxl_ecs_set_log_entry_type(struct device *dev, void *drv_data, > + int fru_id, u32 val) > +{ > + struct cxl_ecs_params params = { > + .log_entry_type = val, > + }; > + > + return cxl_mem_ecs_set_attrs(dev, drv_data, fru_id, > + ¶ms, CXL_ECS_PARAM_LOG_ENTRY_TYPE); > +} > + > +static int cxl_ecs_get_log_entry_type_per_dram(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + if (params.log_entry_type == ECS_LOG_ENTRY_TYPE_DRAM) > + *val = 1; > + else > + *val = 0; > + > + return 0; > +} > + > +static int cxl_ecs_get_log_entry_type_per_memory_media(struct device *dev, > + void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + if (params.log_entry_type == ECS_LOG_ENTRY_TYPE_MEM_MEDIA_FRU) > + *val = 1; > + else > + *val = 0; > + > + return 0; > +} > + > +static int cxl_ecs_get_mode(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + *val = params.mode; > + > + return 0; > +} > + > +static int cxl_ecs_set_mode(struct device *dev, void *drv_data, > + int fru_id, u32 val) > +{ > + struct cxl_ecs_params params = { > + .mode = val, > + }; > + > + return cxl_mem_ecs_set_attrs(dev, drv_data, fru_id, > + ¶ms, CXL_ECS_PARAM_MODE); > +} > + > +static int cxl_ecs_get_mode_counts_rows(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + if (params.mode == ECS_MODE_COUNTS_ROWS) > + *val = 1; > + else > + *val = 0; > + > + return 0; > +} > + > +static int cxl_ecs_get_mode_counts_codewords(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + if (params.mode == ECS_MODE_COUNTS_CODEWORDS) > + *val = 1; > + else > + *val = 0; > + > + return 0; > +} > + > +static int cxl_ecs_reset(struct device *dev, void *drv_data, int fru_id, u32 val) > +{ > + struct cxl_ecs_params params = { > + .reset_counter = val, > + }; > + > + return cxl_mem_ecs_set_attrs(dev, drv_data, fru_id, > + ¶ms, CXL_ECS_PARAM_RESET_COUNTER); > +} > + > +static int cxl_ecs_get_threshold(struct device *dev, void *drv_data, > + int fru_id, u32 *val) > +{ > + struct cxl_ecs_params params; > + int ret; > + > + ret = cxl_mem_ecs_get_attrs(dev, drv_data, fru_id, ¶ms); > + if (ret) > + return ret; > + > + *val = params.threshold; > + > + return 0; > +} > + > +static int cxl_ecs_set_threshold(struct device *dev, void *drv_data, > + int fru_id, u32 val) > +{ > + struct cxl_ecs_params params = { > + .threshold = val, > + }; > + > + return cxl_mem_ecs_set_attrs(dev, drv_data, fru_id, > + ¶ms, CXL_ECS_PARAM_THRESHOLD); > +} > + > +static const struct edac_ecs_ops cxl_ecs_ops = { > + .get_log_entry_type = cxl_ecs_get_log_entry_type, > + .set_log_entry_type = cxl_ecs_set_log_entry_type, > + .get_log_entry_type_per_dram = cxl_ecs_get_log_entry_type_per_dram, > + .get_log_entry_type_per_memory_media = > + cxl_ecs_get_log_entry_type_per_memory_media, > + .get_mode = cxl_ecs_get_mode, > + .set_mode = cxl_ecs_set_mode, > + .get_mode_counts_codewords = cxl_ecs_get_mode_counts_codewords, > + .get_mode_counts_rows = cxl_ecs_get_mode_counts_rows, > + .reset = cxl_ecs_reset, > + .get_threshold = cxl_ecs_get_threshold, > + .set_threshold = cxl_ecs_set_threshold, > +}; > + > int cxl_mem_ras_features_init(struct cxl_memdev *cxlmd, struct cxl_region *cxlr) > { > struct edac_dev_feature ras_features[CXL_DEV_NUM_RAS_FEATURES]; > @@ -310,7 +709,9 @@ int cxl_mem_ras_features_init(struct cxl_memdev *cxlmd, struct cxl_region *cxlr) > struct cxl_patrol_scrub_context *cxl_ps_ctx; > struct cxl_feat_entry feat_entry; > char cxl_dev_name[CXL_SCRUB_NAME_LEN]; > + struct cxl_ecs_context *cxl_ecs_ctx; > int rc, i, num_ras_features = 0; > + int num_media_frus; > > if (cxlr) { > struct cxl_region_params *p = &cxlr->params; > @@ -366,6 +767,42 @@ int cxl_mem_ras_features_init(struct cxl_memdev *cxlmd, struct cxl_region *cxlr) > ras_features[num_ras_features].ctx = cxl_ps_ctx; > num_ras_features++; > > + if (!cxlr) { > + rc = cxl_get_supported_feature_entry(cxlds, &cxl_ecs_uuid, > + &feat_entry); > + if (rc < 0) > + goto feat_register; > + > + if (!(feat_entry.attr_flags & CXL_FEAT_ENTRY_FLAG_CHANGABLE)) > + goto feat_register; > + num_media_frus = feat_entry.get_feat_size / > + sizeof(struct cxl_ecs_rd_attrs); > + if (!num_media_frus) > + goto feat_register; > + > + cxl_ecs_ctx = devm_kzalloc(&cxlmd->dev, sizeof(*cxl_ecs_ctx), > + GFP_KERNEL); > + if (!cxl_ecs_ctx) > + goto feat_register; > + *cxl_ecs_ctx = (struct cxl_ecs_context) { > + .get_feat_size = feat_entry.get_feat_size, > + .set_feat_size = feat_entry.set_feat_size, > + .get_version = feat_entry.get_feat_ver, > + .set_version = feat_entry.set_feat_ver, > + .set_effects = feat_entry.set_effects, > + .num_media_frus = num_media_frus, > + .cxlmd = cxlmd, > + }; > + > + ras_features[num_ras_features].ft_type = RAS_FEAT_ECS; > + ras_features[num_ras_features].ecs_ops = &cxl_ecs_ops; > + ras_features[num_ras_features].ctx = cxl_ecs_ctx; > + ras_features[num_ras_features].ecs_info.num_media_frus = > + num_media_frus; > + num_ras_features++; > + } > + > +feat_register: > return edac_dev_register(&cxlmd->dev, cxl_dev_name, NULL, > num_ras_features, ras_features); > } > -- > 2.34.1 > -- Fan Ni