Received: by 2002:a19:f614:0:0:0:0:0 with SMTP id x20csp58684lfe; Fri, 15 Apr 2022 19:24:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/9ApoiQV0pB8mQHpDxTJ1IFFgwPQyB8dv3GZ1arF955ye4hs0CfwujCqWYHM47noIlz+3 X-Received: by 2002:a65:410a:0:b0:399:38b9:8ba with SMTP id w10-20020a65410a000000b0039938b908bamr1372312pgp.526.1650075873964; Fri, 15 Apr 2022 19:24:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650075873; cv=none; d=google.com; s=arc-20160816; b=JAeKm/OBIzIl2Kp5/eV5M+rTsyYUkbhWfT8DaXa+DwIBkkg1IKiAvMuSTNseGI2BIS lRlo/ew+gZM9aqXZw8rQdRKNcUJ6ua6v2ev2WCz2OR2ojSWoy7OgAm9upZ74I7kBph1A cnKmZp5e9wFPgADMdbADPsQYzRe9VR5ua4je2+svbnnne3HsHoyn3Kx+uyyoje/x4igh SayKnK+S+8/uWa+aXnv6FBZbbd3KNMB1oji1Gr+Ba1vbckjokcuM0WqGlSbpqXN2toUu Kk2fAO9Lm/mo8J1H8IFSWTCYCra78gcUKg3m+elc+8kY/vSK8kRqsICdW1zTMcBTvvyw RB9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8Tky5qgRsHu8J57vf6jzjLX91bGgMkqLQSJb9YKNZfU=; b=IM9cy4tqeFg1iBa616ZQ3qPtnNwS6GoBM0/tzCQ1WuTIkH3J8rqGA27xcUhlfedHk8 g57qBmAuZrxNJe4JWMl0hM78GupjLqSd63hx6TUcBYYzYjKqDk5eg52SCgdLq8VBoHjC TDZJlHXT8jxTSc7hsWZEzDOVPDz4T1lAqRl+X+/DdgUCFsypFzQFxHP3abR823Cu6e/3 AZMY/tDfof1NI+GjZOW3G5yq2UqnjCJhDX4+O+uuGufJ0Tr03cBIOk2KsQsnefQ4vooI 51AKmq0YBJzGuLnSVE2U5OeL3rTGkNd6pNt4wMjJ+ajNnctVwB47glvNN/WpBnwTEU6v qSZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=eQFNm0WH; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id s11-20020a170902ea0b00b00153b2d16524si2920100plg.300.2022.04.15.19.24.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Apr 2022 19:24:33 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=eQFNm0WH; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 633DC2C3F8D; Fri, 15 Apr 2022 18:36:47 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346523AbiDNUfq (ORCPT + 99 others); Thu, 14 Apr 2022 16:35:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44254 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346393AbiDNUfT (ORCPT ); Thu, 14 Apr 2022 16:35:19 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E35AEB18AF; Thu, 14 Apr 2022 13:32:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649968371; x=1681504371; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2Tybu43Q/AOkxQR4mWLkzoAsXHB7tKEYezKagE/IOBY=; b=eQFNm0WHR7tB5jT1msTy/npSsTUAoXCKWZiW7kxZdE1AsGtS1Ze/yODS W+bBaoYdwDTJi/p6vKRXlCStXT+CaIJLIQqRJuPD2TpJxYRN2Ap2rtAfM OMXfV2JBZMyk8hM1dRhUShE9srbb0Xb0hN0gQcWS7PR5OspZNcJxeoY6o CtLN+7pyB2RLllx8UuZQaU2Nu0XkBaIFe4qe524/sG71vWV76WjMyevGQ 8AY0zVBuRXcEIIhNkeIc8uY788zl4SuNuJWbg+KlOXnCAKutwOPHOEyvi tSfw/X5wBP/LS0RrMX2+kBIbL17ZBWZE8NZOZVmXpufbyJbsG50D8QaIP A==; X-IronPort-AV: E=McAfee;i="6400,9594,10317"; a="262779242" X-IronPort-AV: E=Sophos;i="5.90,260,1643702400"; d="scan'208";a="262779242" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2022 13:32:51 -0700 X-IronPort-AV: E=Sophos;i="5.90,260,1643702400"; d="scan'208";a="661507150" Received: from aimeehax-mobl1.amr.corp.intel.com (HELO localhost) ([10.212.113.132]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2022 13:32:51 -0700 From: ira.weiny@intel.com To: Dan Williams , Bjorn Helgaas , Jonathan Cameron Cc: Ira Weiny , Alison Schofield , Vishal Verma , Ben Widawsky , linux-kernel@vger.kernel.org, linux-cxl@vger.kernel.org, linux-pci@vger.kernel.org Subject: [PATCH V8 10/10] cxl/port: Parse out DSMAS data from CDAT table Date: Thu, 14 Apr 2022 13:32:37 -0700 Message-Id: <20220414203237.2198665-11-ira.weiny@intel.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220414203237.2198665-1-ira.weiny@intel.com> References: <20220414203237.2198665-1-ira.weiny@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ira Weiny CXL Ports with memory devices attached need the information from the Device Scoped Memory Affinity Structure (DSMAS). This information is contained within the CDAT table buffer which is previously read and cached in the device state. If CDAT data is available, parse and cache DSMAS data from the table. Store this data in unmarshaled struct dsmas data structures for ease of use. Signed-off-by: Ira Weiny --- Changes from V7 Rebased on cxl-pending Changes from V6 Move to port.c It is not an error if no DSMAS data is found Changes from V5 Fix up sparse warnings Split out cdat_hdr_valid() Update cdat_hdr_valid() Remove revision and cs field parsing There is no point in these Add seq check and debug print. From Jonathan Add spaces around '+' and '/' use devm_krealloc() for dmas_ary --- drivers/cxl/cdat.h | 17 ++++++++++++ drivers/cxl/cxl.h | 6 +++++ drivers/cxl/port.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/drivers/cxl/cdat.h b/drivers/cxl/cdat.h index a7725d26f2d2..66706b238bc9 100644 --- a/drivers/cxl/cdat.h +++ b/drivers/cxl/cdat.h @@ -83,6 +83,23 @@ #define CDAT_SSLBIS_ENTRY_PORT_Y(entry, i) (((entry)[4 + (i) * 2] & 0xffff0000) >> 16) #define CDAT_SSLBIS_ENTRY_LAT_OR_BW(entry, i) ((entry)[4 + (i) * 2 + 1] & 0x0000ffff) +/** + * struct cxl_dsmas - host unmarshaled version of DSMAS data + * + * As defined in the Coherent Device Attribute Table (CDAT) specification this + * represents a single DSMAS entry in that table. + * + * @dpa_base: The lowest Device Physical Address associated with this DSMAD + * @length: Length in bytes of this DSMAD + * @non_volatile: If set, the memory region represents Non-Volatile memory + */ +struct cxl_dsmas { + u64 dpa_base; + u64 length; + /* Flags */ + u8 non_volatile:1; +}; + /** * struct cxl_cdat - CXL CDAT data * diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 50817fd2c912..80fd39769a65 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -9,6 +9,8 @@ #include #include +#include "cdat.h" + /** * DOC: cxl objects * @@ -269,6 +271,8 @@ struct cxl_nvdimm { * @component_reg_phys: component register capability base address (optional) * @dead: last ep has been removed, force port re-creation * @depth: How deep this port is relative to the root. depth 0 is the root. + * @dsmas_ary: Array of DSMAS entries as parsed from the CDAT table + * @nr_dsmas: Number of entries in dsmas_ary */ struct cxl_port { struct device dev; @@ -280,6 +284,8 @@ struct cxl_port { resource_size_t component_reg_phys; bool dead; unsigned int depth; + struct cxl_dsmas *dsmas_ary; + int nr_dsmas; }; /** diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c index d420da5fc39c..2288432a27cd 100644 --- a/drivers/cxl/port.c +++ b/drivers/cxl/port.c @@ -30,6 +30,70 @@ static void schedule_detach(void *cxlmd) schedule_cxl_memdev_detach(cxlmd); } +static void parse_dsmas(struct cxl_port *port, struct cxl_dev_state *cxlds) +{ + struct device *dev = &port->dev; + struct cxl_dsmas *dsmas_ary = NULL; + u32 *data = cxlds->cdat.table; + int bytes_left = cxlds->cdat.length; + int nr_dsmas = 0; + + if (!data) { + dev_info(dev, "No CDAT data available for DSMAS\n"); + return; + } + + /* Skip header */ + data += CDAT_HEADER_LENGTH_DW; + bytes_left -= CDAT_HEADER_LENGTH_BYTES; + + while (bytes_left > 0) { + u32 *cur_rec = data; + u8 type = FIELD_GET(CDAT_STRUCTURE_DW0_TYPE, cur_rec[0]); + u16 length = FIELD_GET(CDAT_STRUCTURE_DW0_LENGTH, cur_rec[0]); + + if (type == CDAT_STRUCTURE_DW0_TYPE_DSMAS) { + struct cxl_dsmas *new_ary; + u8 flags; + + new_ary = devm_krealloc(dev, dsmas_ary, + sizeof(*dsmas_ary) * (nr_dsmas + 1), + GFP_KERNEL); + if (!new_ary) { + dev_err(dev, + "Failed to allocate memory for DSMAS data (nr_dsmas %d)\n", + nr_dsmas); + return; + } + dsmas_ary = new_ary; + + flags = FIELD_GET(CDAT_DSMAS_DW1_FLAGS, cur_rec[1]); + + dsmas_ary[nr_dsmas].dpa_base = CDAT_DSMAS_DPA_OFFSET(cur_rec); + dsmas_ary[nr_dsmas].length = CDAT_DSMAS_DPA_LEN(cur_rec); + dsmas_ary[nr_dsmas].non_volatile = CDAT_DSMAS_NON_VOLATILE(flags); + + dev_dbg(dev, "DSMAS %d: %llx:%llx %s\n", + nr_dsmas, + dsmas_ary[nr_dsmas].dpa_base, + dsmas_ary[nr_dsmas].dpa_base + + dsmas_ary[nr_dsmas].length, + (dsmas_ary[nr_dsmas].non_volatile ? + "Persistent" : "Volatile") + ); + + nr_dsmas++; + } + + data += (length / sizeof(u32)); + bytes_left -= length; + } + + dev_dbg(dev, "Found %d DSMAS entries\n", nr_dsmas); + port->dsmas_ary = dsmas_ary; + port->nr_dsmas = nr_dsmas; +} + static int cxl_port_probe(struct device *dev) { struct cxl_port *port = to_cxl_port(dev); @@ -43,6 +107,7 @@ static int cxl_port_probe(struct device *dev) rc = devm_add_action_or_reset(dev, schedule_detach, cxlmd); if (rc) return rc; + parse_dsmas(port, cxlmd->cxlds); } else { rc = devm_cxl_port_enumerate_dports(port); if (rc < 0) -- 2.35.1