Received: by 2002:a05:7208:d0c6:b0:81:def:69cd with SMTP id w6csp4071rba; Sun, 24 Mar 2024 21:04:04 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXAmelF5rE7fza7czX0bNTqs554ZS9m+jGu7iRIme5aFFKwAeuhR8qo0lhrpmKT+TIwInsmPniq3WIDmGa4x1o9v8W/0GrwFATEmGZvtQ== X-Google-Smtp-Source: AGHT+IHmx8hFCciGDS1/edlsXgMcu3mJI5dflSuPD7Nj4uhkp9PaaW67sr2LJg63ulVFtHyf1Vxd X-Received: by 2002:a05:6808:278c:b0:3c3:7c52:fc23 with SMTP id es12-20020a056808278c00b003c37c52fc23mr6823529oib.19.1711339443676; Sun, 24 Mar 2024 21:04:03 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711339443; cv=pass; d=google.com; s=arc-20160816; b=eDV8PM2y+Bd8pCLfStscVr/5Y9Rzmz0aAtmYzfYkUeP52L8p4Vq2q6DRnVsUfCwS1+ feocmiEn1YaXw1ASalQ/DYHVudnUyzS22KRpl2psHLiTwc2/gCvZz2LAwZqIvXZC2gIx zFp+CgDfEGgxg7Dty515AxFBD1yL/oJtCnepNY4t+1TSoDMvaB+ft6Q0+Jz4gT3suoWT mEWFZKBGYaOn2+u34MI4a6z88IjZQu6Edd1uTrDxPSXzRw1WFdrTnGA4cmTbYiYTJARd 7cZ26SO+kwZaHXZmzKmAhHGvSioa8mwDnM8PNOqgZM7ucRNe3nb14PSgw9II8tYSSeul sYRQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :subject:date:from:dkim-signature; bh=lRTAMLX9AyVtTOy27yCSiktxUy/Tk6bBLj/k+mPseeM=; fh=jwXaZJRrOM4egV/vk4EDc5NAOlRIQo+IhUtiKaNRnyo=; b=SbwgQy4NOCB3MXBTmC1E7qIJcC+W6EHu/ddcOoegElLwmyUM8bOmFUqD6JUNbqhGmA 4kcJkZB1rEfC4++pvggME//cgZ9UIMdFKadBaPTU2EmNo/dB5tr2hNGen2H91YEVlpqp apqwoFFXCVJT9qVcWdSG9mT87xovObW2ODygLgaObye50eVcxnAdmOk6myyt3Q4McfWP pkjzMTFBu2J9DMjVD3Js5bvH8xzn4Hi+sMg8282i6j12iTJsMM3FFNgqCmPoChGascPq RFhGcHmsW0X3GUNGUgrr3Nkt/dUrQ6wDSWTcZ/DcNL/EJTo3X/J9z5EFeDwzvu+JPIDU AGow==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=jvOfUriz; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-114657-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-114657-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id h13-20020a056a00000d00b006ea92adbb9csi4367684pfk.169.2024.03.24.21.04.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 Mar 2024 21:04:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-114657-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=jvOfUriz; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-114657-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-114657-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 934DA28CC0D for ; Mon, 25 Mar 2024 03:53:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 932FD2ADE0D; Sun, 24 Mar 2024 23:57:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="jvOfUriz" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.18]) (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 EFF6723658E; Sun, 24 Mar 2024 23:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711322304; cv=none; b=Fi5g82VbYiCGmJlKrNAUeV0mxZC+YtHZwbd4LObdKbY6d9fekuB5FeAeZDgi4rjwFfVc3XVfm6UqUvER0uEnJiKKgRujIDgUJ+yZp4iA6rAJvHprKE951xIQ1P+CjFzOLtuhUb8/jEzJZLHc3irtLCZpGWeHXEQdCPW3sCBhbiw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711322304; c=relaxed/simple; bh=jpICBPUr8QKCqbR4SJy1LOgy8CWC6HE3wLUZi8Ng7QI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RT3e4J5vMP9Nd1G7wcuit7VQvspDLoV7d9fEywWiOWAQoBPBvjaB3zsY2mR+14aE5Gh31Z/SjkUk9it/EaaDAvsvSwVT1RPc6G/gg3DNlxFps8f6m/hjdZjpcqulLh2pM9XqqN6PQnfuxCYa6704sSViktRhO36w4U4I6MR+swo= 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=jvOfUriz; arc=none smtp.client-ip=198.175.65.18 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711322302; x=1742858302; h=from:date:subject:mime-version:content-transfer-encoding: message-id:references:in-reply-to:to:cc; bh=jpICBPUr8QKCqbR4SJy1LOgy8CWC6HE3wLUZi8Ng7QI=; b=jvOfUrizr10OCGWvoalLVSvC6SKLWKRxjMAezrlqLdEFy1YwOy9hkV3b Mvu81rbDTlgMH7MDvGjvsXVqkdXSdwYb7yDkbKBdhr9/xtE8jj8fhLl2Y fAKFt4QeerEdaXBr7N3KIqLrWz8bBW0lFJ39rzubHnhKP0dLKoNNvCy9g 4Gx34n0Y9VXiU/1YSLsM8z2rBPHTji6BXyOKrsM4ggQY099qESfSZpFBu 7mvK9cXk0gzfscnZ7Oi3/snM4tJSZbUAjJpJm/Que3U/99j0hd7IW3WI3 fRBUblJmb6VHHqlyu18WzN8tTX/stJ9y7tqA7XbJQAqn8wgE1g/BKhEv8 g==; X-IronPort-AV: E=McAfee;i="6600,9927,11023"; a="6431724" X-IronPort-AV: E=Sophos;i="6.07,152,1708416000"; d="scan'208";a="6431724" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa110.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Mar 2024 16:18:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,152,1708416000"; d="scan'208";a="15464695" Received: from iweiny-mobl.amr.corp.intel.com (HELO localhost) ([10.213.186.165]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Mar 2024 16:18:18 -0700 From: ira.weiny@intel.com Date: Sun, 24 Mar 2024 16:18:16 -0700 Subject: [PATCH 13/26] cxl/mem: Configure dynamic capacity interrupts Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20240324-dcd-type2-upstream-v1-13-b7b00d623625@intel.com> References: <20240324-dcd-type2-upstream-v1-0-b7b00d623625@intel.com> In-Reply-To: <20240324-dcd-type2-upstream-v1-0-b7b00d623625@intel.com> To: Dave Jiang , Fan Ni , Jonathan Cameron , Navneet Singh Cc: Dan Williams , Davidlohr Bueso , Alison Schofield , Vishal Verma , Ira Weiny , linux-btrfs@vger.kernel.org, linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13-dev-2d940 X-Developer-Signature: v=1; a=ed25519-sha256; t=1711322284; l=7384; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=afeKpiwwXvLku3qEQtUdlGCLPDe8+v1v2EDR9Z21gU0=; b=1CWhZo72Bc/KNO7mSZme0mvhCKIebSsHGuyOOKuKh7hjC9cPxXTiEC9s9Gbe1Bt1ITIafKZjy cy9QJof5DZpD1h0DjwHRMOpY2eTVe4aywAK/34OUtZQOhpL+FZG+gAd X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= From: Navneet Singh Dynamic Capacity Devices (DCD) support extent change notifications through the event log mechanism. The interrupt mailbox commands were extended in CXL 3.1 to support these notifications. Firmware can't configure DCD events to be FW controlled but can retain control of memory events. Split irq configuration of memory events and DCD events to allow for FW control of memory events while DCD is host controlled. Configure DCD event log interrupts on devices supporting dynamic capacity. Disable DCD if interrupts are not supported. Signed-off-by: Navneet Singh Co-developed-by: Ira Weiny Signed-off-by: Ira Weiny --- Changes for v1 [iweiny: rebase to upstream irq code] [iweiny: disable DCD if irqs not supported] --- drivers/cxl/core/mbox.c | 9 ++++++- drivers/cxl/cxl.h | 4 ++- drivers/cxl/cxlmem.h | 4 +++ drivers/cxl/pci.c | 71 ++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 14e8a7528a8b..58b31fa47b93 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -1323,10 +1323,17 @@ static int cxl_get_dc_config(struct cxl_memdev_state *mds, u8 start_region, return rc; } -static bool cxl_dcd_supported(struct cxl_memdev_state *mds) +bool cxl_dcd_supported(struct cxl_memdev_state *mds) { return test_bit(CXL_DCD_ENABLED_GET_CONFIG, mds->dcd_cmds); } +EXPORT_SYMBOL_NS_GPL(cxl_dcd_supported, CXL); + +void cxl_disable_dcd(struct cxl_memdev_state *mds) +{ + clear_bit(CXL_DCD_ENABLED_GET_CONFIG, mds->dcd_cmds); +} +EXPORT_SYMBOL_NS_GPL(cxl_disable_dcd, CXL); /** * cxl_dev_dynamic_capacity_identify() - Reads the dynamic capacity diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 15d418b3bc9b..d585f5fdd3ae 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -164,11 +164,13 @@ static inline int ways_to_eiw(unsigned int ways, u8 *eiw) #define CXLDEV_EVENT_STATUS_WARN BIT(1) #define CXLDEV_EVENT_STATUS_FAIL BIT(2) #define CXLDEV_EVENT_STATUS_FATAL BIT(3) +#define CXLDEV_EVENT_STATUS_DCD BIT(4) #define CXLDEV_EVENT_STATUS_ALL (CXLDEV_EVENT_STATUS_INFO | \ CXLDEV_EVENT_STATUS_WARN | \ CXLDEV_EVENT_STATUS_FAIL | \ - CXLDEV_EVENT_STATUS_FATAL) + CXLDEV_EVENT_STATUS_FATAL| \ + CXLDEV_EVENT_STATUS_DCD) /* CXL rev 3.0 section 8.2.9.2.4; Table 8-52 */ #define CXLDEV_EVENT_INT_MODE_MASK GENMASK(1, 0) diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 4624cf612c1e..01bee6eedff3 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -225,7 +225,9 @@ struct cxl_event_interrupt_policy { u8 warn_settings; u8 failure_settings; u8 fatal_settings; + u8 dcd_settings; } __packed; +#define CXL_EVENT_INT_POLICY_BASE_SIZE 4 /* info, warn, failure, fatal */ /** * struct cxl_event_state - Event log driver state @@ -890,6 +892,8 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, enum cxl_event_log_type type, enum cxl_event_type event_type, const uuid_t *uuid, union cxl_event *evt); +bool cxl_dcd_supported(struct cxl_memdev_state *mds); +void cxl_disable_dcd(struct cxl_memdev_state *mds); int cxl_set_timestamp(struct cxl_memdev_state *mds); int cxl_poison_state_init(struct cxl_memdev_state *mds); int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c index 12cd5d399230..ef482eae09e9 100644 --- a/drivers/cxl/pci.c +++ b/drivers/cxl/pci.c @@ -669,22 +669,33 @@ static int cxl_event_get_int_policy(struct cxl_memdev_state *mds, } static int cxl_event_config_msgnums(struct cxl_memdev_state *mds, - struct cxl_event_interrupt_policy *policy) + struct cxl_event_interrupt_policy *policy, + bool native_cxl) { struct cxl_mbox_cmd mbox_cmd; + size_t size_in; int rc; - *policy = (struct cxl_event_interrupt_policy) { - .info_settings = CXL_INT_MSI_MSIX, - .warn_settings = CXL_INT_MSI_MSIX, - .failure_settings = CXL_INT_MSI_MSIX, - .fatal_settings = CXL_INT_MSI_MSIX, - }; + if (native_cxl) { + *policy = (struct cxl_event_interrupt_policy) { + .info_settings = CXL_INT_MSI_MSIX, + .warn_settings = CXL_INT_MSI_MSIX, + .failure_settings = CXL_INT_MSI_MSIX, + .fatal_settings = CXL_INT_MSI_MSIX, + .dcd_settings = 0, + }; + } + size_in = CXL_EVENT_INT_POLICY_BASE_SIZE; + + if (cxl_dcd_supported(mds)) { + policy->dcd_settings = CXL_INT_MSI_MSIX; + size_in += sizeof(policy->dcd_settings); + } mbox_cmd = (struct cxl_mbox_cmd) { .opcode = CXL_MBOX_OP_SET_EVT_INT_POLICY, .payload_in = policy, - .size_in = sizeof(*policy), + .size_in = size_in, }; rc = cxl_internal_send_cmd(mds, &mbox_cmd); @@ -731,6 +742,31 @@ static int cxl_event_irqsetup(struct cxl_memdev_state *mds, return 0; } +static int cxl_irqsetup(struct cxl_memdev_state *mds, + struct cxl_event_interrupt_policy *policy, + bool native_cxl) +{ + struct cxl_dev_state *cxlds = &mds->cxlds; + int rc; + + if (native_cxl) { + rc = cxl_event_irqsetup(mds, policy); + if (rc) + return rc; + } + + if (cxl_dcd_supported(mds)) { + rc = cxl_event_req_irq(cxlds, policy->dcd_settings); + if (rc) { + dev_err(cxlds->dev, "Failed to get interrupt for DCD event log\n"); + cxl_disable_dcd(mds); + return rc; + } + } + + return 0; +} + static bool cxl_event_int_is_fw(u8 setting) { u8 mode = FIELD_GET(CXLDEV_EVENT_INT_MODE_MASK, setting); @@ -757,17 +793,25 @@ static int cxl_event_config(struct pci_host_bridge *host_bridge, struct cxl_memdev_state *mds, bool irq_avail) { struct cxl_event_interrupt_policy policy = { 0 }; + bool native_cxl = host_bridge->native_cxl_error; int rc; /* * When BIOS maintains CXL error reporting control, it will process * event records. Only one agent can do so. + * + * If BIOS has control of events and DCD is not supported skip event + * configuration. */ - if (!host_bridge->native_cxl_error) + if (!native_cxl && !cxl_dcd_supported(mds)) return 0; if (!irq_avail) { dev_info(mds->cxlds.dev, "No interrupt support, disable event processing.\n"); + if (cxl_dcd_supported(mds)) { + dev_info(mds->cxlds.dev, "DCD requires interrupts, disable DCD\n"); + cxl_disable_dcd(mds); + } return 0; } @@ -775,10 +819,10 @@ static int cxl_event_config(struct pci_host_bridge *host_bridge, if (rc) return rc; - if (!cxl_event_validate_mem_policy(mds, &policy)) + if (native_cxl && !cxl_event_validate_mem_policy(mds, &policy)) return -EBUSY; - rc = cxl_event_config_msgnums(mds, &policy); + rc = cxl_event_config_msgnums(mds, &policy, native_cxl); if (rc) return rc; @@ -786,12 +830,15 @@ static int cxl_event_config(struct pci_host_bridge *host_bridge, if (rc) return rc; - rc = cxl_event_irqsetup(mds, &policy); + rc = cxl_irqsetup(mds, &policy, native_cxl); if (rc) return rc; cxl_mem_get_event_records(mds, CXLDEV_EVENT_STATUS_ALL); + dev_dbg(mds->cxlds.dev, "Event config : %d %d\n", + native_cxl, cxl_dcd_supported(mds)); + return 0; } -- 2.44.0