From patchwork Wed May 8 18:47:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13659055 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CCDA7B3E1 for ; Wed, 8 May 2024 18:47:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194079; cv=none; b=XPL83yVTl9XBDY8IOjljWkTjNdNtS5dQz0npHWT2LVoOhYiDJ4aea+SMPpmycMPw3z2lbORXjtGY8EGQsfZ4llpb5JGUZTOA65v6PAHY8zch7eBCqq4eudGNGMZORCzjHSNavTjUnjXrkTaspCADm926oDiI/p9e+1+hfM48l/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194079; c=relaxed/simple; bh=AgVEq8xn6oX0OJvh64e7eF7az3f4hWwSYG8fdmhEyMQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=QaiVgJVFa5H4fTM/WBDkMNTIFK8n3Brgo+gRjTkcy6i53r+iDoN/rIqI2H8jt97rJd4067dGiDQcq0gULjd/W5lSAUPIwTiESzyFMlsz4+okpXPhM7CVAYk7nsDx2yCKhngEFl31dhisMALHF/M6KKFlHudpv8z4BnF0Vl8k17g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=JJl4Dypy; arc=none smtp.client-ip=192.198.163.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="JJl4Dypy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715194078; x=1746730078; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AgVEq8xn6oX0OJvh64e7eF7az3f4hWwSYG8fdmhEyMQ=; b=JJl4DypyjNVOjz3zNG4fqdZthrMXr5OATP1LBna7Kwb7CojOC2A5i+4Z 6mEzsxIG5bOIhRL0zFWk0rrZTywrYOtvCS5qOn7WODoQQn30jhSJ8aMrE gtCro6U2JVefUWz8clf0zXHVX5aCc+UQANKxXBlrCV80eHQSRtxwX1MN6 yHWeuDaOLDINN6SNwW2YWb8A6v0vSnTbgLFWr+YDfUH4sM/2ZtqVNSrnv 4d+C7hgj9Hj+d7qO7OT7r5ly2DBpcKh8HHdCGAVa3qbSIMhr6HTRTZK3q HD5z6xDbFoe6qaZ1ISlnJhga8JsXsjGKTnX4MPnUUn0bAvkz3MPZF0P2o Q==; X-CSE-ConnectionGUID: +y8ZnlRMTNOhPQk+U+NdZw== X-CSE-MsgGUID: UY//swyIQAOBi3WKE+4GDQ== X-IronPort-AV: E=McAfee;i="6600,9927,11067"; a="21675607" X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="21675607" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:56 -0700 X-CSE-ConnectionGUID: 2HhyzJGtSZaBMt11XZx8Nw== X-CSE-MsgGUID: EE2kCqvLQyyQChb2w/91kg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="33531054" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.212.242.107]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:56 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org Subject: [PATCH v2 1/4] cxl/core: Rename cxl_trace_hpa() to cxl_translate() Date: Wed, 8 May 2024 11:47:50 -0700 Message-Id: <27686c91cf4f8b09991534708f6ad2dfc2443af1.1715192606.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield Although cxl_trace_hpa() is used to populate TRACE EVENTs with HPA addresses, the work it performs is a translation (dpa->hpa), not a trace. Rename it. Since this is the only translate work in CXL, drop the _hpa suffix in the rename. Suggested-by: Dan Williams Signed-off-by: Alison Schofield Reviewed-by: Dan Williams --- drivers/cxl/core/core.h | 4 ++-- drivers/cxl/core/mbox.c | 2 +- drivers/cxl/core/region.c | 2 +- drivers/cxl/core/trace.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 625394486459..8ceebd3b51d2 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -28,12 +28,12 @@ int cxl_region_init(void); void cxl_region_exit(void); int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa); -u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, +u64 cxl_translate(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); #else static inline u64 -cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) +cxl_translate(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) { return ULLONG_MAX; } diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 2626f3fff201..edc54a1ca298 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -878,7 +878,7 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, dpa = le64_to_cpu(evt->common.phys_addr) & CXL_DPA_MASK; cxlr = cxl_dpa_to_region(cxlmd, dpa); if (cxlr) - hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); + hpa = cxl_translate(cxlr, cxlmd, dpa); if (event_type == CXL_CPER_EVENT_GEN_MEDIA) trace_cxl_general_media(cxlmd, type, cxlr, hpa, diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 00a9f0eef8dd..245edf748906 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2797,7 +2797,7 @@ static u64 cxl_dpa_to_hpa(u64 dpa, struct cxl_region *cxlr, return hpa; } -u64 cxl_trace_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, +u64 cxl_translate(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) { struct cxl_region_params *p = &cxlr->params; diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index 07a0394b1d99..6925a6a31f01 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -704,7 +704,7 @@ TRACE_EVENT(cxl_poison, if (cxlr) { __assign_str(region, dev_name(&cxlr->dev)); memcpy(__entry->uuid, &cxlr->params.uuid, 16); - __entry->hpa = cxl_trace_hpa(cxlr, cxlmd, + __entry->hpa = cxl_translate(cxlr, cxlmd, __entry->dpa); } else { __assign_str(region, ""); From patchwork Wed May 8 18:47:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13659057 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF4DF82D93 for ; Wed, 8 May 2024 18:47:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194080; cv=none; b=DPZB9jiHgnZY2n5Yt4gZg8C/YWXoXVDVlguz1TFsFs9mGj5IYUJTLJ/xeSs+3tkPTCFi39H1E87x1KxKm5IIQJibrlMGuD+woqCN1zMzDk+0VCxQ0ADvpAk7/OYJJnHZb5nsm2cMqcVIrShKueKMVWY9gWZZm+v0sSvxWRMG7DE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194080; c=relaxed/simple; bh=4PNzCZnTcw4cicrLbNi2KIUdcRIC3DZCHRKY08omsxE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ttIWfmcCWaJUUKu6ThYuGlSw81J8elF1wDJozYVpn0TRVtFA7QdyRFPanm5ZHw4CBQ8N1wMgz7311RpNgPvku9TNuJAeGsG8zMU0YqMgR8eEwuM+CgBuQjA7KUg1Soxi67OOatsd9OPKOCr8pEElq7KOLYv6/PcMK6YSqERtqZg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=KcYsWaO0; arc=none smtp.client-ip=192.198.163.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="KcYsWaO0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715194078; x=1746730078; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4PNzCZnTcw4cicrLbNi2KIUdcRIC3DZCHRKY08omsxE=; b=KcYsWaO05jB+A9Y6ABWsTZKYotyAlL2esTxCklhdDtpBJGyWZGN/f8NH y/YHJ1Y9zuvfCfPWfm2bpBd51fAEkB45NNZhglR/CD6Qx/CnFYwZ0BkoY 6UJXlGpQFy0XcYsK8bZrLdfA4iXxWvImX3/+ji35n7wWUvJuGeMQ4y2xE vlYEoJnoMQeUrBnPl5zRJcToj4kYnDW39G3wZNLDi32rcx6PKybvIS401 Wg7D7dnNToAY6Kb77wJqYPJHmhf1cMZ+BMQ7mROXDzyiwUm7FEEDPhrqX ik5li7X0QzfrKRQlj8W+krP096RFcSsVqS9qpBJwri0TbfJz6ZeRK1/iZ w==; X-CSE-ConnectionGUID: YkzTRJ/CRLSa8Jmu4fxXXQ== X-CSE-MsgGUID: WnPhkhdcRzCwMl2c1jYJVQ== X-IronPort-AV: E=McAfee;i="6600,9927,11067"; a="21675611" X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="21675611" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:57 -0700 X-CSE-ConnectionGUID: yP91DdIhSwORqqNDTkbH0Q== X-CSE-MsgGUID: +2uvSsYHTI6H9sMMscAk+Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="33531060" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.212.242.107]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:57 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org Subject: [PATCH v2 2/4] cxl/acpi: Restore XOR'd position bits during address translation Date: Wed, 8 May 2024 11:47:51 -0700 Message-Id: <77d251960a557f23aa6e6e0465e0e42f1d461514.1715192606.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield When a CXL region is created in a CXL Window (CFMWS) that uses XOR interleave arithmetic XOR maps are applied during the HPA->DPA translation. The XOR function changes the interleave selector bit (aka position bit) in the HPA thereby varying which host bridge services an HPA. The purpose is to minimize hot spots thereby improving performance. When a device reports a DPA in events such as poison, general_media, and dram, the driver translates that DPA back to an HPA. Presently, the CXL driver translation only considers the modulo position and will report the wrong HPA for XOR configured CFMWS's. Add a helper function that restores the XOR'd bits during DPA->HPA address translation. Plumb a root decoder callback to the new helper when XOR interleave arithmetic is in use. For MODULO arithmetic, just let the callback be NULL - as in no extra work required. Fixes: 28a3ae4ff66c ("cxl/trace: Add an HPA to cxl_poison trace events") Signed-off-by: Alison Schofield Reviewed-by: Jonathan Cameron --- drivers/cxl/acpi.c | 48 ++++++++++++++++++++++++++++++++++++--- drivers/cxl/core/port.c | 5 +++- drivers/cxl/core/region.c | 5 ++++ drivers/cxl/cxl.h | 6 ++++- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c index 571069863c62..20488e7b09ac 100644 --- a/drivers/cxl/acpi.c +++ b/drivers/cxl/acpi.c @@ -74,6 +74,43 @@ static struct cxl_dport *cxl_hb_xor(struct cxl_root_decoder *cxlrd, int pos) return cxlrd->cxlsd.target[n]; } +static u64 cxl_xor_translate(struct cxl_root_decoder *cxlrd, u64 hpa) +{ + struct cxl_cxims_data *cximsd = cxlrd->platform_data; + int hbiw = cxlrd->cxlsd.nr_targets; + u64 val; + int pos; + + /* No xormaps for host bridge interleave ways of 1 or 3 */ + if (hbiw == 1 || hbiw == 3) + return hpa; + + /* + * For root decoders using xormaps (hbiw: 2,4,6,8,12,16) restore + * the position bit to its value before the xormap was applied at + * HPA->DPA translation. + * + * pos is the lowest set bit in an XORMAP + * val is the XORALLBITS(HPA & XORMAP) + * + * XORALLBITS: The CXL spec (3.1 Table 9-22) defines XORALLBITS + * as an operation that outputs a single bit by XORing all the + * bits in the input (hpa & xormap). Implement XORALLBITS using + * hweight64(). If the hamming weight is even the XOR of those + * bits results in 0, if odd the XOR result is 1. + */ + + for (int i = 0; i < cximsd->nr_maps; i++) { + if (!cximsd->xormaps[i]) + continue; + pos = __ffs(cximsd->xormaps[i]); + val = (hweight64(hpa & cximsd->xormaps[i]) & 1); + hpa = (hpa & ~(1ULL << pos)) | (val << pos); + } + + return hpa; +} + struct cxl_cxims_context { struct device *dev; struct cxl_root_decoder *cxlrd; @@ -362,6 +399,7 @@ static int __cxl_parse_cfmws(struct acpi_cedt_cfmws *cfmws, struct cxl_cxims_context cxims_ctx; struct device *dev = ctx->dev; cxl_calc_hb_fn cxl_calc_hb; + cxl_translate_fn translate; struct cxl_decoder *cxld; unsigned int ways, i, ig; int rc; @@ -389,13 +427,17 @@ static int __cxl_parse_cfmws(struct acpi_cedt_cfmws *cfmws, if (rc) return rc; - if (cfmws->interleave_arithmetic == ACPI_CEDT_CFMWS_ARITHMETIC_MODULO) + if (cfmws->interleave_arithmetic == ACPI_CEDT_CFMWS_ARITHMETIC_MODULO) { cxl_calc_hb = cxl_hb_modulo; - else + translate = NULL; + + } else { cxl_calc_hb = cxl_hb_xor; + translate = cxl_xor_translate; + } struct cxl_root_decoder *cxlrd __free(put_cxlrd) = - cxl_root_decoder_alloc(root_port, ways, cxl_calc_hb); + cxl_root_decoder_alloc(root_port, ways, cxl_calc_hb, translate); if (IS_ERR(cxlrd)) return PTR_ERR(cxlrd); diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 762783bb091a..32346c171892 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1808,6 +1808,7 @@ static int cxl_switch_decoder_init(struct cxl_port *port, * @port: owning CXL root of this decoder * @nr_targets: static number of downstream targets * @calc_hb: which host bridge covers the n'th position by granularity + * @translate: decoder specific address translation function * * Return: A new cxl decoder to be registered by cxl_decoder_add(). A * 'CXL root' decoder is one that decodes from a top-level / static platform @@ -1816,7 +1817,8 @@ static int cxl_switch_decoder_init(struct cxl_port *port, */ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, unsigned int nr_targets, - cxl_calc_hb_fn calc_hb) + cxl_calc_hb_fn calc_hb, + cxl_translate_fn translate) { struct cxl_root_decoder *cxlrd; struct cxl_switch_decoder *cxlsd; @@ -1839,6 +1841,7 @@ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, } cxlrd->calc_hb = calc_hb; + cxlrd->translate = translate; mutex_init(&cxlrd->range_lock); cxld = &cxlsd->cxld; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 245edf748906..2fe93c5a8072 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2752,6 +2752,7 @@ static bool cxl_is_hpa_in_range(u64 hpa, struct cxl_region *cxlr, int pos) static u64 cxl_dpa_to_hpa(u64 dpa, struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled) { + struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); u64 dpa_offset, hpa_offset, bits_upper, mask_upper, hpa; struct cxl_region_params *p = &cxlr->params; int pos = cxled->pos; @@ -2791,6 +2792,10 @@ static u64 cxl_dpa_to_hpa(u64 dpa, struct cxl_region *cxlr, /* Apply the hpa_offset to the region base address */ hpa = hpa_offset + p->res->start; + /* Root decoder translation overrides typical modulo decode */ + if (cxlrd->translate) + hpa = cxlrd->translate(cxlrd, hpa); + if (!cxl_is_hpa_in_range(hpa, cxlr, cxled->pos)) return ULLONG_MAX; diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 80f58b96dc1c..e11155002213 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -434,12 +434,14 @@ struct cxl_switch_decoder { struct cxl_root_decoder; typedef struct cxl_dport *(*cxl_calc_hb_fn)(struct cxl_root_decoder *cxlrd, int pos); +typedef u64 (*cxl_translate_fn)(struct cxl_root_decoder *cxlrd, u64 hpa); /** * struct cxl_root_decoder - Static platform CXL address decoder * @res: host / parent resource for region allocations * @region_id: region id for next region provisioning event * @calc_hb: which host bridge covers the n'th position by granularity + * @translate: decoder specific address translation function * @platform_data: platform specific configuration data * @range_lock: sync region autodiscovery by address range * @qos_class: QoS performance class cookie @@ -449,6 +451,7 @@ struct cxl_root_decoder { struct resource *res; atomic_t region_id; cxl_calc_hb_fn calc_hb; + cxl_translate_fn translate; void *platform_data; struct mutex range_lock; int qos_class; @@ -773,7 +776,8 @@ 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, - cxl_calc_hb_fn calc_hb); + cxl_calc_hb_fn calc_hb, + cxl_translate_fn translate); struct cxl_dport *cxl_hb_modulo(struct cxl_root_decoder *cxlrd, int pos); struct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port, unsigned int nr_targets); From patchwork Wed May 8 18:47:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13659056 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A154B7C6CE for ; Wed, 8 May 2024 18:47:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194080; cv=none; b=F81b62mbPPyzrfuT7k8fXXyhLWcKGZVXIxEv5P4mRYSU3Jhnrk/QVr4iIGK4TSfkAhhnqTQRM+d0Wf3ZwCFm+UvewBDvuk24acVeLbbCfKfnVE+/knlirJ46ZCUKVyzJCRP5SGDXIacNb3geWkikycZ1rHvln9k+tDg7mFdO5IA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194080; c=relaxed/simple; bh=VM/Yol1pgkm1vC/WnCTMkBF7VRGnNQzXEBX5CkJhHaQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IpH9hPidlzrOhGiQEXOYk1DgDx9VyRXNbpOuUeqPuaWpOjQM7MjCk+ql+jAWt2XSWxdmRVJvQ3R5PTZUbrLGRE4c9jWRN4S9laj4rUoWkzyLMBsOdAEYYLqk5kl/+3V/F3RY8ZdYmtlaI0p4u+OyZie4/MTRDQnZ6TJaIFvbPxg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=l/rvN8Lz; arc=none smtp.client-ip=198.175.65.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="l/rvN8Lz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715194079; x=1746730079; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VM/Yol1pgkm1vC/WnCTMkBF7VRGnNQzXEBX5CkJhHaQ=; b=l/rvN8Lzes3ipWwPqsbh3Rgt0/wlJvNMqyIoPHedGMMYgAzogOK6xp0v uFA0CT5w/wDyN4a8F0yMZTWxnGmTNrwc01jUGrhMm9AOrXG1FbgtDFQp0 1gciLvJgaPxGBCKw9JT3+vLBXAJWbgyqoVHrt7MSeEmk6P1ygzqJBJZ9L 9wW0u/OjEJ+8QyAmpryfpjRzLBVEqimXkRpkwI65AoPb89zb+nvdF6//H uEJ2UwXSf0MZnmuOhW5ZvDvZodLcH1/Q+oJCPYSUdRr4piIGoTj1uXns5 Z4FW/w5awhhhMNOzP50gfPjf5Ke5voqF+iNXBNomZ02xm9xk9Nzzf93Wf w==; X-CSE-ConnectionGUID: rIdgSLYORf6rw38zgPALyA== X-CSE-MsgGUID: 7mDX5Wv+RAi+n1aKBknsKw== X-IronPort-AV: E=McAfee;i="6600,9927,11067"; a="10928016" X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="10928016" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:58 -0700 X-CSE-ConnectionGUID: 2RP6hSznSnCV0oDjbtQZ3Q== X-CSE-MsgGUID: 9QIDkd4SRKyt1p5gP3rO7Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="33811964" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.212.242.107]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:57 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org Subject: [PATCH v2 3/4] cxl/region: Verify target positions using the ordered target list Date: Wed, 8 May 2024 11:47:52 -0700 Message-Id: <562c5e2097f32567bf7aa505d7952d9c068d830b.1715192606.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield When a root decoder is configured the interleave target list is read from the BIOS populated CFMWS structure. Per the CXL spec 3.1 Table 9-22 the target list is in interleave order. The CXL driver populates its decoder target list in the same order and stores it in 'struct cxl_switch_decoder' field "@target: active ordered target list in current decoder configuration" Given the promise of an ordered list, the driver can stop duplicating the work of BIOS and simply check target positions against the ordered list during region configuration. The simplified check against the ordered list is presented here. A follow-on patch will remove the unused code. For Modulo arithmetic this is not a fix, only a simplification. For XOR arithmetic this is a fix for HB IW of 3,6,12. Fixes: f9db85bfec0d ("cxl/acpi: Support CXL XOR Interleave Math (CXIMS)") Signed-off-by: Alison Schofield Reviewed-by: Jonathan Cameron Reviewed-by: Dan Williams --- drivers/cxl/core/region.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 2fe93c5a8072..6aa2c981f1c4 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1559,10 +1559,13 @@ static int cxl_region_attach_position(struct cxl_region *cxlr, const struct cxl_dport *dport, int pos) { struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); + struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd; + struct cxl_decoder *cxld = &cxlsd->cxld; + int iw = cxld->interleave_ways; struct cxl_port *iter; int rc; - if (cxlrd->calc_hb(cxlrd, pos) != dport) { + if (dport != cxlrd->cxlsd.target[pos % iw]) { dev_dbg(&cxlr->dev, "%s:%s invalid target position for %s\n", dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), dev_name(&cxlrd->cxlsd.cxld.dev)); From patchwork Wed May 8 18:47:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Schofield X-Patchwork-Id: 13659058 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FEE485626 for ; Wed, 8 May 2024 18:48:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194082; cv=none; b=BkTayYoRihX1rsWGFCVB05W4KGWxgLegL4VAiWNcyVtzgtUkcv9OIqOuH2NVWbqtezbBRvSFKkHxJU4j7ZIR6SrCYgcX3suGYqb9ox/84qq+SiS0uE0ZmsnHYTKGF+6bJ0tyUxIZAsGKYpKpuVJKfeE5nBycQimAVUFYJ1SXh74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715194082; c=relaxed/simple; bh=8ZaTMIA2VWuUyCfHILHaPfFNIOx7N6yy+lPc9hfj9Uc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UzqwUOazM9T1C6WGMBaW2Ik3Q1DPtRFwkawVORmfDKb6Gpca9iXJPyGoWRPeGkIaKaOr+N6TsGEn+2Xj5bjYbj3tMatF7SNfJcC9q1HNVbIVP7HITyU3CDJ/VUT1jCbAfW6GxPlV4j39fZH8qtOTrE1LtVxQWArWQrYbb0gcg7o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=L7xk30A6; arc=none smtp.client-ip=198.175.65.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="L7xk30A6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715194081; x=1746730081; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=8ZaTMIA2VWuUyCfHILHaPfFNIOx7N6yy+lPc9hfj9Uc=; b=L7xk30A6sThTvpgFNZaqbYnRqhVN36sm0zWIEJH/YDN4hLZl15IAl0pV /RXsTFbulw4VrqnSgGBGFhdDZPYEAsL+M1FF5egQBgS2/+Jz/bKg7WmBA T0SCk60QP1LXIZhwKCOMfJ+THs2WXsZlsc1Z5XdI9/wqGbPcumORAzKwL NqN9coa5T0dXzLtE+sjxePoQvSoefbD58yGPQDV5nm3tXqKFJC9fKEEaR FfwHIo4EzqVAcJxznqYwrl8AVWscjbwprXynmJrtuke84opiArZfiLcKp 5eQZKFEKLkz02ApyXBar/tbsWVlplDksR1R2RkjMuOK43+4815bt8MQgi g==; X-CSE-ConnectionGUID: o7+E0SoiTbiY7nl6pNgx+g== X-CSE-MsgGUID: I++c54G6TnuWU6NRGXTbxQ== X-IronPort-AV: E=McAfee;i="6600,9927,11067"; a="10928021" X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="10928021" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:59 -0700 X-CSE-ConnectionGUID: 2p3fZP8HSBSBmvf2ddqTGA== X-CSE-MsgGUID: hKCh3Am3S4y+eQwv9o/Fng== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,145,1712646000"; d="scan'208";a="33811970" Received: from aschofie-mobl2.amr.corp.intel.com (HELO localhost) ([10.212.242.107]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 11:47:58 -0700 From: alison.schofield@intel.com To: Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , Vishal Verma , Ira Weiny , Dan Williams Cc: linux-cxl@vger.kernel.org Subject: [PATCH v2 4/4] cxl: Remove defunct code calculating host bridge target positions Date: Wed, 8 May 2024 11:47:53 -0700 Message-Id: <2f2536ae494a158292951141c17881828e85fd23.1715192606.git.alison.schofield@intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-cxl@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Alison Schofield The CXL Spec 3.1 Table 9-22 requires that the BIOS populate the CFMWS target list in interleave target order. This means that the calculations the CXL driver added to determine positions when XOR math is in use, along with the entire XOR vs Modulo call back setup is not needed. A prior patch added a common method to verify positions. Remove the now unused code related to the cxl_calc_hb_fn. Signed-off-by: Alison Schofield Reviewed-by: Dan Williams Reviewed-by: Jonathan Cameron --- drivers/cxl/acpi.c | 62 ++--------------------------------------- drivers/cxl/core/port.c | 18 ------------ drivers/cxl/cxl.h | 6 ---- 3 files changed, 3 insertions(+), 83 deletions(-) diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c index 20488e7b09ac..25da55337834 100644 --- a/drivers/cxl/acpi.c +++ b/drivers/cxl/acpi.c @@ -22,57 +22,6 @@ static const guid_t acpi_cxl_qtg_id_guid = GUID_INIT(0xF365F9A6, 0xA7DE, 0x4071, 0xA6, 0x6A, 0xB4, 0x0C, 0x0B, 0x4F, 0x8E, 0x52); -/* - * Find a targets entry (n) in the host bridge interleave list. - * CXL Specification 3.0 Table 9-22 - */ -static int cxl_xor_calc_n(u64 hpa, struct cxl_cxims_data *cximsd, int iw, - int ig) -{ - int i = 0, n = 0; - u8 eiw; - - /* IW: 2,4,6,8,12,16 begin building 'n' using xormaps */ - if (iw != 3) { - for (i = 0; i < cximsd->nr_maps; i++) - n |= (hweight64(hpa & cximsd->xormaps[i]) & 1) << i; - } - /* IW: 3,6,12 add a modulo calculation to 'n' */ - if (!is_power_of_2(iw)) { - if (ways_to_eiw(iw, &eiw)) - return -1; - hpa &= GENMASK_ULL(51, eiw + ig); - n |= do_div(hpa, 3) << i; - } - return n; -} - -static struct cxl_dport *cxl_hb_xor(struct cxl_root_decoder *cxlrd, int pos) -{ - struct cxl_cxims_data *cximsd = cxlrd->platform_data; - struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd; - struct cxl_decoder *cxld = &cxlsd->cxld; - int ig = cxld->interleave_granularity; - int iw = cxld->interleave_ways; - int n = 0; - u64 hpa; - - if (dev_WARN_ONCE(&cxld->dev, - cxld->interleave_ways != cxlsd->nr_targets, - "misconfigured root decoder\n")) - return NULL; - - hpa = cxlrd->res->start + pos * ig; - - /* Entry (n) is 0 for no interleave (iw == 1) */ - if (iw != 1) - n = cxl_xor_calc_n(hpa, cximsd, iw, ig); - - if (n < 0) - return NULL; - - return cxlrd->cxlsd.target[n]; -} static u64 cxl_xor_translate(struct cxl_root_decoder *cxlrd, u64 hpa) { @@ -398,7 +347,6 @@ static int __cxl_parse_cfmws(struct acpi_cedt_cfmws *cfmws, struct cxl_port *root_port = ctx->root_port; struct cxl_cxims_context cxims_ctx; struct device *dev = ctx->dev; - cxl_calc_hb_fn cxl_calc_hb; cxl_translate_fn translate; struct cxl_decoder *cxld; unsigned int ways, i, ig; @@ -427,17 +375,13 @@ static int __cxl_parse_cfmws(struct acpi_cedt_cfmws *cfmws, if (rc) return rc; - if (cfmws->interleave_arithmetic == ACPI_CEDT_CFMWS_ARITHMETIC_MODULO) { - cxl_calc_hb = cxl_hb_modulo; + if (cfmws->interleave_arithmetic == ACPI_CEDT_CFMWS_ARITHMETIC_MODULO) translate = NULL; - - } else { - cxl_calc_hb = cxl_hb_xor; + else translate = cxl_xor_translate; - } struct cxl_root_decoder *cxlrd __free(put_cxlrd) = - cxl_root_decoder_alloc(root_port, ways, cxl_calc_hb, translate); + cxl_root_decoder_alloc(root_port, ways, translate); if (IS_ERR(cxlrd)) return PTR_ERR(cxlrd); diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 32346c171892..9c0e4c6387aa 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1733,21 +1733,6 @@ static int decoder_populate_targets(struct cxl_switch_decoder *cxlsd, return 0; } -struct cxl_dport *cxl_hb_modulo(struct cxl_root_decoder *cxlrd, int pos) -{ - struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd; - struct cxl_decoder *cxld = &cxlsd->cxld; - int iw; - - iw = cxld->interleave_ways; - if (dev_WARN_ONCE(&cxld->dev, iw != cxlsd->nr_targets, - "misconfigured root decoder\n")) - return NULL; - - return cxlrd->cxlsd.target[pos % iw]; -} -EXPORT_SYMBOL_NS_GPL(cxl_hb_modulo, CXL); - static struct lock_class_key cxl_decoder_key; /** @@ -1807,7 +1792,6 @@ static int cxl_switch_decoder_init(struct cxl_port *port, * cxl_root_decoder_alloc - Allocate a root level decoder * @port: owning CXL root of this decoder * @nr_targets: static number of downstream targets - * @calc_hb: which host bridge covers the n'th position by granularity * @translate: decoder specific address translation function * * Return: A new cxl decoder to be registered by cxl_decoder_add(). A @@ -1817,7 +1801,6 @@ static int cxl_switch_decoder_init(struct cxl_port *port, */ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, unsigned int nr_targets, - cxl_calc_hb_fn calc_hb, cxl_translate_fn translate) { struct cxl_root_decoder *cxlrd; @@ -1840,7 +1823,6 @@ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, return ERR_PTR(rc); } - cxlrd->calc_hb = calc_hb; cxlrd->translate = translate; mutex_init(&cxlrd->range_lock); diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index e11155002213..68ac68506670 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -432,15 +432,12 @@ struct cxl_switch_decoder { }; struct cxl_root_decoder; -typedef struct cxl_dport *(*cxl_calc_hb_fn)(struct cxl_root_decoder *cxlrd, - int pos); typedef u64 (*cxl_translate_fn)(struct cxl_root_decoder *cxlrd, u64 hpa); /** * struct cxl_root_decoder - Static platform CXL address decoder * @res: host / parent resource for region allocations * @region_id: region id for next region provisioning event - * @calc_hb: which host bridge covers the n'th position by granularity * @translate: decoder specific address translation function * @platform_data: platform specific configuration data * @range_lock: sync region autodiscovery by address range @@ -450,7 +447,6 @@ typedef u64 (*cxl_translate_fn)(struct cxl_root_decoder *cxlrd, u64 hpa); struct cxl_root_decoder { struct resource *res; atomic_t region_id; - cxl_calc_hb_fn calc_hb; cxl_translate_fn translate; void *platform_data; struct mutex range_lock; @@ -776,9 +772,7 @@ 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, - cxl_calc_hb_fn calc_hb, cxl_translate_fn translate); -struct cxl_dport *cxl_hb_modulo(struct cxl_root_decoder *cxlrd, int pos); struct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port, unsigned int nr_targets); int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map);