Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp1766263pxy; Thu, 6 May 2021 15:40:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxIOSRIN+w++VSARZzu3oPmHcnBr57fW+29wfJr5M/yPgougZRwiq5iTp3C1x2xAMKvvOwD X-Received: by 2002:a05:6402:1d8e:: with SMTP id dk14mr2766472edb.385.1620340838176; Thu, 06 May 2021 15:40:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620340838; cv=none; d=google.com; s=arc-20160816; b=vNwLxdoKW8eR7O2fJaWUDsv/RbrgIOqir3hqk5634D4iNc038vjtHHst7QTlQo55F0 LduI5DTfCevxG7mjt/mH8R7DcO4X15jhop7i84SCzadEldAJkqRqcxbAqlkYllyfD1Sf DcsDhPDb2PvUdNZL/ZzbaUTW8Av6qbDb89NYsALsjcvFnhCn2Yv7i3jirVUkulixWT5R iLBzHeuQ4sdNkzqCI/ryeIeP+CkIOJefoBqWj97+kkpejOJo7dl5o8am54XO2+oab4Gz ndKHqs2tPcPdz/tbjd/OCI345OR7avkvzcasWGt+SM/m32oM7pLLueb3pfMr+upokmgo 2k5w== 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 :ironport-sdr:ironport-sdr; bh=Cd1jcetD5qBWQ5BNYnLGJ3YXpG+hHymgAmyeUai7VJw=; b=nY23kumJ7wFKfoz+Poa9m1vbW/gPoSCH4IjUUQcsGW9jEU54Xisvz7/nL8F1D937zv IJobT/zjM94vPgaivf733GSKGL4EfUOCxMSikMwrl3nKzPOSvetmUDTljnelPxfZ8wPZ 7BcPr0ZO3vkzgIXf9ZjrXjgLkJaUjmPOUVikM2YC4RF9b9a6dbwSt2TpsRykBbgTyBP5 X+PVnUMvSAmnR34BXjjpoGSxV7FrxCxRA1QtCgc6lwycoOtx2YvkH7Q56qKHjpSuprmB E6NelY148JL4/tDCV44g3O8RlMG+8fC5Cc0TAPgjZmka5mFP3hxf/hJLhF7iXHhqJ37z RUKQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v18si3606832edb.78.2021.05.06.15.40.13; Thu, 06 May 2021 15:40:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231417AbhEFWiW (ORCPT + 99 others); Thu, 6 May 2021 18:38:22 -0400 Received: from mga02.intel.com ([134.134.136.20]:7715 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231262AbhEFWiL (ORCPT ); Thu, 6 May 2021 18:38:11 -0400 IronPort-SDR: HTr0+sdPB/XRInHtaJiE0OhW+Y6pL1N5rFy8HQjW07lpIOQ8er2ojT6tM3LLnT9KeNiGZHdklh qvXn+yHrK8RA== X-IronPort-AV: E=McAfee;i="6200,9189,9976"; a="185726274" X-IronPort-AV: E=Sophos;i="5.82,279,1613462400"; d="scan'208";a="185726274" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 May 2021 15:37:13 -0700 IronPort-SDR: OiO7tSPIZ6kPeGpcC4D8iowwCheXuvB+rUpUoYIzvEQ47zROLSGvXFs74998NI4hzOGhw34dbq 0PMetbKnsYiQ== X-IronPort-AV: E=Sophos;i="5.82,279,1613462400"; d="scan'208";a="622630615" Received: from iweiny-desk2.sc.intel.com (HELO localhost) ([10.3.52.147]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 May 2021 15:37:13 -0700 From: ira.weiny@intel.com To: Ben Widawsky , Dan Williams Cc: Ira Weiny , Alison Schofield , Vishal Verma , Jonathan Cameron , linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] cxl/mem: Introduce cxl_decode_register_block() Date: Thu, 6 May 2021 15:36:53 -0700 Message-Id: <20210506223654.1310516-4-ira.weiny@intel.com> X-Mailer: git-send-email 2.28.0.rc0.12.gb6a658bd00c9 In-Reply-To: <20210506223654.1310516-1-ira.weiny@intel.com> References: <20210506223654.1310516-1-ira.weiny@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ira Weiny Each register block located in the DVSEC needs to be decoded from 2 words, 'register offset high' and 'register offset low'. Create a function, cxl_decode_register_block() to perform this decode and return the bar, offset, and register type of the register block. Then use the values decoded in cxl_mem_map_regblock() instead of passing the raw registers. Signed-off-by: Ira Weiny --- drivers/cxl/pci.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c index 40016709b310..cee14de0f251 100644 --- a/drivers/cxl/pci.c +++ b/drivers/cxl/pci.c @@ -922,16 +922,12 @@ static struct cxl_mem *cxl_mem_create(struct pci_dev *pdev) return cxlm; } -static void __iomem *cxl_mem_map_regblock(struct cxl_mem *cxlm, u32 reg_lo, u32 reg_hi) +static void __iomem *cxl_mem_map_regblock(struct cxl_mem *cxlm, + u8 bar, u64 offset) { struct pci_dev *pdev = cxlm->pdev; struct device *dev = &pdev->dev; void __iomem *rc; - u64 offset; - u8 bar; - - offset = ((u64)reg_hi << 32) | (reg_lo & CXL_REGLOC_ADDR_MASK); - bar = FIELD_GET(CXL_REGLOC_BIR_MASK, reg_lo); /* Basic sanity check that BAR is big enough */ if (pci_resource_len(pdev, bar) < offset) { @@ -975,6 +971,14 @@ static int cxl_mem_dvsec(struct pci_dev *pdev, int dvsec) return 0; } +static void cxl_decode_register_block(u32 reg_lo, u32 reg_hi, + u8 *bar, u64 *offset, u8 *reg_type) +{ + *offset = ((u64)reg_hi << 32) | (reg_lo & CXL_REGLOC_ADDR_MASK); + *bar = FIELD_GET(CXL_REGLOC_BIR_MASK, reg_lo); + *reg_type = FIELD_GET(CXL_REGLOC_RBI_MASK, reg_lo); +} + /** * cxl_mem_setup_regs() - Setup necessary MMIO. * @cxlm: The CXL memory device to communicate with. @@ -1013,15 +1017,21 @@ static int cxl_mem_setup_regs(struct cxl_mem *cxlm) for (i = 0; i < regblocks; i++, regloc += 8) { u32 reg_lo, reg_hi; u8 reg_type; + u64 offset; + u8 bar; /* "register low and high" contain other bits */ pci_read_config_dword(pdev, regloc, ®_lo); pci_read_config_dword(pdev, regloc + 4, ®_hi); - reg_type = FIELD_GET(CXL_REGLOC_RBI_MASK, reg_lo); + cxl_decode_register_block(reg_lo, reg_hi, &bar, &offset, + ®_type); + + dev_dbg(dev, "Found register block in bar %u @ 0x%llx of type %u\n", + bar, offset, reg_type); if (reg_type == CXL_REGLOC_RBI_MEMDEV) { - base = cxl_mem_map_regblock(cxlm, reg_lo, reg_hi); + base = cxl_mem_map_regblock(cxlm, bar, offset); if (IS_ERR(base)) return PTR_ERR(base); break; -- 2.28.0.rc0.12.gb6a658bd00c9