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 C6CE6C05027 for ; Fri, 10 Feb 2023 18:36:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 50198280011; Fri, 10 Feb 2023 13:36:09 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4B237280003; Fri, 10 Feb 2023 13:36:09 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 352DB280011; Fri, 10 Feb 2023 13:36:09 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 2183A280003 for ; Fri, 10 Feb 2023 13:36:09 -0500 (EST) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id D56AB1C5BB2 for ; Fri, 10 Feb 2023 18:36:08 +0000 (UTC) X-FDA: 80452236816.07.0B26620 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by imf13.hostedemail.com (Postfix) with ESMTP id AFE9C20007 for ; Fri, 10 Feb 2023 18:36:05 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="HrE/Qtvv"; spf=pass (imf13.hostedemail.com: domain of dave.jiang@intel.com designates 192.55.52.43 as permitted sender) smtp.mailfrom=dave.jiang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1676054166; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=4tb6a1x1NREiwe35SCtKJ0n50JlL2USlqcazZ8U4W9Y=; b=uzKnvk5b6vDxKxRgbjeYjFwq0xmaJqvqKEWm1rdsyFY6aOm9KF+2+q49TkOkHUbof7Psdg iBqtc04JmU2RSQTTjsDDzlSR73GOIQxqO2ggxRSNKUF4LOex57UtVzWUCZ+pzf6Tqp8GQ5 GM249FyAt+cAGJC6twIjcj9+mWrSUEk= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="HrE/Qtvv"; spf=pass (imf13.hostedemail.com: domain of dave.jiang@intel.com designates 192.55.52.43 as permitted sender) smtp.mailfrom=dave.jiang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1676054166; a=rsa-sha256; cv=none; b=RhT9FHLFc88JgG2nXLBOj4uUZel6HlD+v+KxyOW/0f+bVPwwE3pmFQv6lj+jLsKw0r2Iel LUUfSqzYMQAKIkDQWK0G0QKutve841KWxdUDkqZTBVgKUyMGSyP2bGlQ66KHZfNrnKcgC1 iBH8SJiCLd4mz6LnKHjBVGboLV0C+MA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1676054165; x=1707590165; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=dOo4WPZmm/7JTrc9XPEwSRLAKLJIAbDMR6eC57vvadg=; b=HrE/QtvvoWjtKsdxxpBmQOBd0SX5G9iRr0q1s8/MoGRUGvWEt0lCbah9 d2NodZxfrc31cyrxzAGx2V+DHd+5YHUHo0MIArrSuHj5pKs9KPGXk9aOE YfVqLsYv/EFJxarTOiVETdQglxD9/2lX6fcH+bF46dA7YRNI8P89EBu4U 16H2nxpOLN1VQHpAw15sEO/iqR7IM0zkK7DoTqF4nzXrIsKUCyP73K70i RcDFTnab25tXmigx3Bp2iDvEsvM5nSOS+8i5UupuMUwG+r6ucxAJh+AIb dpXyDHlpqJXf84s/HM2MF8yf9IX5Y4flAgXdGEKQ4jRlpoCtyC1wmz5/F Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="416718254" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="416718254" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 10:36:03 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="645714590" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="645714590" Received: from djiang5-mobl3.amr.corp.intel.com (HELO [10.213.190.133]) ([10.213.190.133]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 10:36:03 -0800 Message-ID: <3ea4d6ae-a9e8-3ad4-2b08-86a7b53b956a@intel.com> Date: Fri, 10 Feb 2023 11:36:02 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.6.0 Subject: Re: [PATCH v2 14/20] tools/testing/cxl: Define a fixed volatile configuration to parse Content-Language: en-US To: Dan Williams , linux-cxl@vger.kernel.org Cc: Fan Ni , vishal.l.verma@intel.com, dave.hansen@linux.intel.com, linux-mm@kvack.org, linux-acpi@vger.kernel.org References: <167601992097.1924368.18291887895351917895.stgit@dwillia2-xfh.jf.intel.com> <167602000547.1924368.11613151863880268868.stgit@dwillia2-xfh.jf.intel.com> From: Dave Jiang In-Reply-To: <167602000547.1924368.11613151863880268868.stgit@dwillia2-xfh.jf.intel.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: b1b5x14mnyatex59fa6hhjjt1nth8bug X-Rspamd-Queue-Id: AFE9C20007 X-HE-Tag: 1676054165-407195 X-HE-Meta: U2FsdGVkX18iuCcTUMMlTvRda2vkhh+elfYkJhXMLIKE4q5JZzdDlxWV9SeLD1MQoEa8OSQAd/6tixXpODCPVhXQ0zYXQxd8VwIlJFz8cj9Qq2A0WZ96+s75a6AvVurKuUfrUubHYT1I+NzjleD98qRKyOu2sJIwDDIYL8C68b0bjBjo+3wZXLoaqkoP7FqTfo5azurSZuHrSrZ1OXDwIjL5qV0iuRWslbBZRQjZAXFY82W8kyeFjMvWXZXsgDPBY3fOcdw9RmobJRIlW5Aly1EQnrCChMmILKbsPn7otA2ipdCM6UR5d4ZlcYyRkHoYSbBdQ9yOy4GxwWXFv0GjzF0MdCf9AAyZMtAAWZt8dzzN/ITmvvVHhLRCaB38elcOuUnAvS8xqx9H9GC+tcUemE28FRCeZJ44vavVTZxJOzrqEUz2GA3i6FfEe84Iz6B5+MOobhTJXrxOAQTE0AuTK8jvin2p2m/k1n7n/WiLMmLkNqkWruNY/9LZ5LiSnII8fTHAFrMyB2fno0jsSHZmNzCBCsTpjk5f8YN/7YGYA4xE5xqRH2W4tLychGHZErhn0RR1zQb09NeieRzw3ugLLPNy+/uBlCIcmhEeNE/E7aiOVCoZsejCHBtJRZvfHtc5sRO9sNLfS/QVpwkmeJNdkGmD+/nyf1TL3IgVsSu4EhQUNdLLsXPDmLy/KXZyh50xKevRyhX1H238vZ0MKWCxMsp0Cy7cVLq/m1ScpEGG+I78h2PH7KeekXLdaKa9hOgtQTZGmA86xNKZgWdcprrdSbaqt1cSC8kk18HffEEXdQ7uy20nnbKa50y7c28Uv1wRi+2ULpKdKcqTn+/B20A32oI8FwuI8jpOpaukyNkmjvO4gHNGk28U7UEddK/hd2ecctLV3Sj7e3mPHrRuGyOM6Ub2J7Mijstz8Su4vXk9RkJ8gNstAh6b9yFii9jYaxX3FgPUnKH0LM2bgmCup6x KddotRmt /mruad7UzvsFYUieeVVJcN++Psof5frrWlCKsMxjgsm31HKNPbl5rOVtw7+LIvnAZX7SOjj+EV64EC06aXzAc0ku5uJojNPbFv8mNxrCciWSpRhm5Xsgk9vNMHfyRNMpBcpRtMV72Rj5T+tPC6CopiJDBzbTQo8Df0tuGzqqA7S2+AZQygJ5WwDuHRGzHmQnhLGwYFy+HEgMvPNqxjLpGBlX26Q+bxn7cZXnGmNKSb/AcVPmMLfH8kUteo17CCfiSam00b1z6lcUIPAE= 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: On 2/10/23 2:06 AM, Dan Williams wrote: > Take two endpoints attached to the first switch on the first host-bridge > in the cxl_test topology and define a pre-initialized region. This is a > x2 interleave underneath a x1 CXL Window. > > $ modprobe cxl_test > $ # cxl list -Ru > { > "region":"region3", > "resource":"0xf010000000", > "size":"512.00 MiB (536.87 MB)", > "interleave_ways":2, > "interleave_granularity":4096, > "decode_state":"commit" > } > > Tested-by: Fan Ni > Link: https://lore.kernel.org/r/167564541523.847146.12199636368812381475.stgit@dwillia2-xfh.jf.intel.com > Signed-off-by: Dan Williams Reviewed-by: Dave Jiang > --- > drivers/cxl/core/core.h | 3 - > drivers/cxl/core/hdm.c | 3 + > drivers/cxl/core/port.c | 2 + > drivers/cxl/cxl.h | 2 + > drivers/cxl/cxlmem.h | 3 + > tools/testing/cxl/test/cxl.c | 147 +++++++++++++++++++++++++++++++++++++++--- > 6 files changed, 146 insertions(+), 14 deletions(-) > > diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h > index 5eb873da5a30..479f01da6d35 100644 > --- a/drivers/cxl/core/core.h > +++ b/drivers/cxl/core/core.h > @@ -57,9 +57,6 @@ resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled); > resource_size_t cxl_dpa_resource_start(struct cxl_endpoint_decoder *cxled); > extern struct rw_semaphore cxl_dpa_rwsem; > > -bool is_switch_decoder(struct device *dev); > -struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev); > - > int cxl_memdev_init(void); > void cxl_memdev_exit(void); > void cxl_mbox_init(void); > diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c > index 8c29026a4b9d..80eccae6ba9e 100644 > --- a/drivers/cxl/core/hdm.c > +++ b/drivers/cxl/core/hdm.c > @@ -279,7 +279,7 @@ static int __cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled, > return 0; > } > > -static int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled, > +int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled, > resource_size_t base, resource_size_t len, > resource_size_t skipped) > { > @@ -295,6 +295,7 @@ static int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled, > > return devm_add_action_or_reset(&port->dev, cxl_dpa_release, cxled); > } > +EXPORT_SYMBOL_NS_GPL(devm_cxl_dpa_reserve, CXL); > > resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled) > { > diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c > index 59620528571a..b45d2796ef35 100644 > --- a/drivers/cxl/core/port.c > +++ b/drivers/cxl/core/port.c > @@ -458,6 +458,7 @@ bool is_switch_decoder(struct device *dev) > { > return is_root_decoder(dev) || dev->type == &cxl_decoder_switch_type; > } > +EXPORT_SYMBOL_NS_GPL(is_switch_decoder, CXL); > > struct cxl_decoder *to_cxl_decoder(struct device *dev) > { > @@ -485,6 +486,7 @@ struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev) > return NULL; > return container_of(dev, struct cxl_switch_decoder, cxld.dev); > } > +EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, CXL); > > static void cxl_ep_release(struct cxl_ep *ep) > { > diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h > index c8ee4bb8cce6..2ac344235235 100644 > --- a/drivers/cxl/cxl.h > +++ b/drivers/cxl/cxl.h > @@ -653,8 +653,10 @@ struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port, > > struct cxl_decoder *to_cxl_decoder(struct device *dev); > struct cxl_root_decoder *to_cxl_root_decoder(struct device *dev); > +struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev); > struct cxl_endpoint_decoder *to_cxl_endpoint_decoder(struct device *dev); > bool is_root_decoder(struct device *dev); > +bool is_switch_decoder(struct device *dev); > bool is_endpoint_decoder(struct device *dev); > struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, > unsigned int nr_targets, > diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h > index c9da3c699a21..bf7d4c5c8612 100644 > --- a/drivers/cxl/cxlmem.h > +++ b/drivers/cxl/cxlmem.h > @@ -81,6 +81,9 @@ static inline bool is_cxl_endpoint(struct cxl_port *port) > } > > struct cxl_memdev *devm_cxl_add_memdev(struct cxl_dev_state *cxlds); > +int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled, > + resource_size_t base, resource_size_t len, > + resource_size_t skipped); > > static inline struct cxl_ep *cxl_ep_load(struct cxl_port *port, > struct cxl_memdev *cxlmd) > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index 920bd969c554..5342f69d70d2 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -703,6 +703,142 @@ static int mock_decoder_reset(struct cxl_decoder *cxld) > return 0; > } > > +static void default_mock_decoder(struct cxl_decoder *cxld) > +{ > + cxld->hpa_range = (struct range){ > + .start = 0, > + .end = -1, > + }; > + > + cxld->interleave_ways = 1; > + cxld->interleave_granularity = 256; > + cxld->target_type = CXL_DECODER_EXPANDER; > + cxld->commit = mock_decoder_commit; > + cxld->reset = mock_decoder_reset; > +} > + > +static int first_decoder(struct device *dev, void *data) > +{ > + struct cxl_decoder *cxld; > + > + if (!is_switch_decoder(dev)) > + return 0; > + cxld = to_cxl_decoder(dev); > + if (cxld->id == 0) > + return 1; > + return 0; > +} > + > +static void mock_init_hdm_decoder(struct cxl_decoder *cxld) > +{ > + struct acpi_cedt_cfmws *window = mock_cfmws[0]; > + struct platform_device *pdev = NULL; > + struct cxl_endpoint_decoder *cxled; > + struct cxl_switch_decoder *cxlsd; > + struct cxl_port *port, *iter; > + const int size = SZ_512M; > + struct cxl_memdev *cxlmd; > + struct cxl_dport *dport; > + struct device *dev; > + bool hb0 = false; > + u64 base; > + int i; > + > + if (is_endpoint_decoder(&cxld->dev)) { > + cxled = to_cxl_endpoint_decoder(&cxld->dev); > + cxlmd = cxled_to_memdev(cxled); > + WARN_ON(!dev_is_platform(cxlmd->dev.parent)); > + pdev = to_platform_device(cxlmd->dev.parent); > + > + /* check is endpoint is attach to host-bridge0 */ > + port = cxled_to_port(cxled); > + do { > + if (port->uport == &cxl_host_bridge[0]->dev) { > + hb0 = true; > + break; > + } > + if (is_cxl_port(port->dev.parent)) > + port = to_cxl_port(port->dev.parent); > + else > + port = NULL; > + } while (port); > + port = cxled_to_port(cxled); > + } > + > + /* > + * The first decoder on the first 2 devices on the first switch > + * attached to host-bridge0 mock a fake / static RAM region. All > + * other decoders are default disabled. Given the round robin > + * assignment those devices are named cxl_mem.0, and cxl_mem.4. > + * > + * See 'cxl list -BMPu -m cxl_mem.0,cxl_mem.4' > + */ > + if (!hb0 || pdev->id % 4 || pdev->id > 4 || cxld->id > 0) { > + default_mock_decoder(cxld); > + return; > + } > + > + base = window->base_hpa; > + cxld->hpa_range = (struct range) { > + .start = base, > + .end = base + size - 1, > + }; > + > + cxld->interleave_ways = 2; > + eig_to_granularity(window->granularity, &cxld->interleave_granularity); > + cxld->target_type = CXL_DECODER_EXPANDER; > + cxld->flags = CXL_DECODER_F_ENABLE; > + cxled->state = CXL_DECODER_STATE_AUTO; > + port->commit_end = cxld->id; > + devm_cxl_dpa_reserve(cxled, 0, size / cxld->interleave_ways, 0); > + cxld->commit = mock_decoder_commit; > + cxld->reset = mock_decoder_reset; > + > + /* > + * Now that endpoint decoder is set up, walk up the hierarchy > + * and setup the switch and root port decoders targeting @cxlmd. > + */ > + iter = port; > + for (i = 0; i < 2; i++) { > + dport = iter->parent_dport; > + iter = dport->port; > + dev = device_find_child(&iter->dev, NULL, first_decoder); > + /* > + * Ancestor ports are guaranteed to be enumerated before > + * @port, and all ports have at least one decoder. > + */ > + if (WARN_ON(!dev)) > + continue; > + cxlsd = to_cxl_switch_decoder(dev); > + if (i == 0) { > + /* put cxl_mem.4 second in the decode order */ > + if (pdev->id == 4) > + cxlsd->target[1] = dport; > + else > + cxlsd->target[0] = dport; > + } else > + cxlsd->target[0] = dport; > + cxld = &cxlsd->cxld; > + cxld->target_type = CXL_DECODER_EXPANDER; > + cxld->flags = CXL_DECODER_F_ENABLE; > + iter->commit_end = 0; > + /* > + * Switch targets 2 endpoints, while host bridge targets > + * one root port > + */ > + if (i == 0) > + cxld->interleave_ways = 2; > + else > + cxld->interleave_ways = 1; > + cxld->interleave_granularity = 256; > + cxld->hpa_range = (struct range) { > + .start = base, > + .end = base + size - 1, > + }; > + put_device(dev); > + } > +} > + > static int mock_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) > { > struct cxl_port *port = cxlhdm->port; > @@ -748,16 +884,7 @@ static int mock_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) > cxld = &cxled->cxld; > } > > - cxld->hpa_range = (struct range) { > - .start = 0, > - .end = -1, > - }; > - > - cxld->interleave_ways = min_not_zero(target_count, 1); > - cxld->interleave_granularity = SZ_4K; > - cxld->target_type = CXL_DECODER_EXPANDER; > - cxld->commit = mock_decoder_commit; > - cxld->reset = mock_decoder_reset; > + mock_init_hdm_decoder(cxld); > > if (target_count) { > rc = device_for_each_child(port->uport, &ctx, >