Linux-ACPI Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 1/3] cxl/mem: Fix register block offset calculation
@ 2021-04-15 23:26 Ben Widawsky
  2021-04-15 23:26 ` [PATCH 2/3] cxl/mem: Print unknown capability IDs as hex Ben Widawsky
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Ben Widawsky @ 2021-04-15 23:26 UTC (permalink / raw)
  To: linux-cxl
  Cc: Ben Widawsky, linux-pci, linux-acpi, ira.weiny, vishal.l.verma,
	alison.schofield, dan.j.williams, linux-kernel

The offset for the register block should be a 64K aligned value, and
therefore FIELD_GET (which will shift) is not correct for the
calculation.

From 8.1.9.1 of the CXL 2.0 spec:
  A[31:16] of offset from the address contained by one of the Function's
  Base Address Registers to point to the base of the Register Block.
  Register Block Offset is 64K aligned. Hence A[15:0] is zero

Fix this by simply using a mask.

This wasn't found earlier because the primary development done in the
QEMU environment only uses 0 offsets

Fixes: 8adaf747c9f0b ("cxl/mem: Find device capabilities")
Reported-by: Vishal Verma <vishal.l.verma@intel.com>
Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
---
 drivers/cxl/mem.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
index e3003f49b329..1b5078311f7d 100644
--- a/drivers/cxl/mem.c
+++ b/drivers/cxl/mem.c
@@ -998,7 +998,7 @@ static struct cxl_mem *cxl_mem_create(struct pci_dev *pdev, u32 reg_lo,
 		return NULL;
 	}
 
-	offset = ((u64)reg_hi << 32) | FIELD_GET(CXL_REGLOC_ADDR_MASK, reg_lo);
+	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 */
-- 
2.31.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, back to index

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-15 23:26 [PATCH 1/3] cxl/mem: Fix register block offset calculation Ben Widawsky
2021-04-15 23:26 ` [PATCH 2/3] cxl/mem: Print unknown capability IDs as hex Ben Widawsky
2021-04-15 23:34   ` Verma, Vishal L
2021-04-15 23:26 ` [PATCH 3/3] cxl/mem: Demarcate vendor specific capability IDs Ben Widawsky
2021-04-15 23:27   ` Ben Widawsky
2021-04-15 23:37     ` Verma, Vishal L
2021-04-15 23:50       ` Ben Widawsky
2021-05-19 20:01     ` Dan Williams
2021-04-16  0:29   ` Dan Williams
2021-04-16  0:03 ` [PATCH 1/3] cxl/mem: Fix register block offset calculation Dan Williams
2021-04-16  2:49 ` [PATCH v2] " Ben Widawsky

Linux-ACPI Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-acpi/0 linux-acpi/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-acpi linux-acpi/ https://lore.kernel.org/linux-acpi \
		linux-acpi@vger.kernel.org
	public-inbox-index linux-acpi

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-acpi


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git