xref: /openbmc/linux/drivers/cxl/pci.c (revision 83946783)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2020 Intel Corporation. All rights reserved. */
3 #include <linux/io-64-nonatomic-lo-hi.h>
4 #include <linux/module.h>
5 #include <linux/sizes.h>
6 #include <linux/mutex.h>
7 #include <linux/list.h>
8 #include <linux/pci.h>
9 #include <linux/io.h>
10 #include "cxlmem.h"
11 #include "pci.h"
12 #include "cxl.h"
13 
14 /**
15  * DOC: cxl pci
16  *
17  * This implements the PCI exclusive functionality for a CXL device as it is
18  * defined by the Compute Express Link specification. CXL devices may surface
19  * certain functionality even if it isn't CXL enabled. While this driver is
20  * focused around the PCI specific aspects of a CXL device, it binds to the
21  * specific CXL memory device class code, and therefore the implementation of
22  * cxl_pci is focused around CXL memory devices.
23  *
24  * The driver has several responsibilities, mainly:
25  *  - Create the memX device and register on the CXL bus.
26  *  - Enumerate device's register interface and map them.
27  *  - Registers nvdimm bridge device with cxl_core.
28  *  - Registers a CXL mailbox with cxl_core.
29  */
30 
31 #define cxl_doorbell_busy(cxlm)                                                \
32 	(readl((cxlm)->regs.mbox + CXLDEV_MBOX_CTRL_OFFSET) &                  \
33 	 CXLDEV_MBOX_CTRL_DOORBELL)
34 
35 /* CXL 2.0 - 8.2.8.4 */
36 #define CXL_MAILBOX_TIMEOUT_MS (2 * HZ)
37 
38 static int cxl_pci_mbox_wait_for_doorbell(struct cxl_mem *cxlm)
39 {
40 	const unsigned long start = jiffies;
41 	unsigned long end = start;
42 
43 	while (cxl_doorbell_busy(cxlm)) {
44 		end = jiffies;
45 
46 		if (time_after(end, start + CXL_MAILBOX_TIMEOUT_MS)) {
47 			/* Check again in case preempted before timeout test */
48 			if (!cxl_doorbell_busy(cxlm))
49 				break;
50 			return -ETIMEDOUT;
51 		}
52 		cpu_relax();
53 	}
54 
55 	dev_dbg(cxlm->dev, "Doorbell wait took %dms",
56 		jiffies_to_msecs(end) - jiffies_to_msecs(start));
57 	return 0;
58 }
59 
60 static void cxl_pci_mbox_timeout(struct cxl_mem *cxlm,
61 				 struct cxl_mbox_cmd *mbox_cmd)
62 {
63 	struct device *dev = cxlm->dev;
64 
65 	dev_dbg(dev, "Mailbox command (opcode: %#x size: %zub) timed out\n",
66 		mbox_cmd->opcode, mbox_cmd->size_in);
67 }
68 
69 /**
70  * __cxl_pci_mbox_send_cmd() - Execute a mailbox command
71  * @cxlm: The CXL memory device to communicate with.
72  * @mbox_cmd: Command to send to the memory device.
73  *
74  * Context: Any context. Expects mbox_mutex to be held.
75  * Return: -ETIMEDOUT if timeout occurred waiting for completion. 0 on success.
76  *         Caller should check the return code in @mbox_cmd to make sure it
77  *         succeeded.
78  *
79  * This is a generic form of the CXL mailbox send command thus only using the
80  * registers defined by the mailbox capability ID - CXL 2.0 8.2.8.4. Memory
81  * devices, and perhaps other types of CXL devices may have further information
82  * available upon error conditions. Driver facilities wishing to send mailbox
83  * commands should use the wrapper command.
84  *
85  * The CXL spec allows for up to two mailboxes. The intention is for the primary
86  * mailbox to be OS controlled and the secondary mailbox to be used by system
87  * firmware. This allows the OS and firmware to communicate with the device and
88  * not need to coordinate with each other. The driver only uses the primary
89  * mailbox.
90  */
91 static int __cxl_pci_mbox_send_cmd(struct cxl_mem *cxlm,
92 				   struct cxl_mbox_cmd *mbox_cmd)
93 {
94 	void __iomem *payload = cxlm->regs.mbox + CXLDEV_MBOX_PAYLOAD_OFFSET;
95 	struct device *dev = cxlm->dev;
96 	u64 cmd_reg, status_reg;
97 	size_t out_len;
98 	int rc;
99 
100 	lockdep_assert_held(&cxlm->mbox_mutex);
101 
102 	/*
103 	 * Here are the steps from 8.2.8.4 of the CXL 2.0 spec.
104 	 *   1. Caller reads MB Control Register to verify doorbell is clear
105 	 *   2. Caller writes Command Register
106 	 *   3. Caller writes Command Payload Registers if input payload is non-empty
107 	 *   4. Caller writes MB Control Register to set doorbell
108 	 *   5. Caller either polls for doorbell to be clear or waits for interrupt if configured
109 	 *   6. Caller reads MB Status Register to fetch Return code
110 	 *   7. If command successful, Caller reads Command Register to get Payload Length
111 	 *   8. If output payload is non-empty, host reads Command Payload Registers
112 	 *
113 	 * Hardware is free to do whatever it wants before the doorbell is rung,
114 	 * and isn't allowed to change anything after it clears the doorbell. As
115 	 * such, steps 2 and 3 can happen in any order, and steps 6, 7, 8 can
116 	 * also happen in any order (though some orders might not make sense).
117 	 */
118 
119 	/* #1 */
120 	if (cxl_doorbell_busy(cxlm)) {
121 		dev_err_ratelimited(dev, "Mailbox re-busy after acquiring\n");
122 		return -EBUSY;
123 	}
124 
125 	cmd_reg = FIELD_PREP(CXLDEV_MBOX_CMD_COMMAND_OPCODE_MASK,
126 			     mbox_cmd->opcode);
127 	if (mbox_cmd->size_in) {
128 		if (WARN_ON(!mbox_cmd->payload_in))
129 			return -EINVAL;
130 
131 		cmd_reg |= FIELD_PREP(CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK,
132 				      mbox_cmd->size_in);
133 		memcpy_toio(payload, mbox_cmd->payload_in, mbox_cmd->size_in);
134 	}
135 
136 	/* #2, #3 */
137 	writeq(cmd_reg, cxlm->regs.mbox + CXLDEV_MBOX_CMD_OFFSET);
138 
139 	/* #4 */
140 	dev_dbg(dev, "Sending command\n");
141 	writel(CXLDEV_MBOX_CTRL_DOORBELL,
142 	       cxlm->regs.mbox + CXLDEV_MBOX_CTRL_OFFSET);
143 
144 	/* #5 */
145 	rc = cxl_pci_mbox_wait_for_doorbell(cxlm);
146 	if (rc == -ETIMEDOUT) {
147 		cxl_pci_mbox_timeout(cxlm, mbox_cmd);
148 		return rc;
149 	}
150 
151 	/* #6 */
152 	status_reg = readq(cxlm->regs.mbox + CXLDEV_MBOX_STATUS_OFFSET);
153 	mbox_cmd->return_code =
154 		FIELD_GET(CXLDEV_MBOX_STATUS_RET_CODE_MASK, status_reg);
155 
156 	if (mbox_cmd->return_code != 0) {
157 		dev_dbg(dev, "Mailbox operation had an error\n");
158 		return 0;
159 	}
160 
161 	/* #7 */
162 	cmd_reg = readq(cxlm->regs.mbox + CXLDEV_MBOX_CMD_OFFSET);
163 	out_len = FIELD_GET(CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK, cmd_reg);
164 
165 	/* #8 */
166 	if (out_len && mbox_cmd->payload_out) {
167 		/*
168 		 * Sanitize the copy. If hardware misbehaves, out_len per the
169 		 * spec can actually be greater than the max allowed size (21
170 		 * bits available but spec defined 1M max). The caller also may
171 		 * have requested less data than the hardware supplied even
172 		 * within spec.
173 		 */
174 		size_t n = min3(mbox_cmd->size_out, cxlm->payload_size, out_len);
175 
176 		memcpy_fromio(mbox_cmd->payload_out, payload, n);
177 		mbox_cmd->size_out = n;
178 	} else {
179 		mbox_cmd->size_out = 0;
180 	}
181 
182 	return 0;
183 }
184 
185 /**
186  * cxl_pci_mbox_get() - Acquire exclusive access to the mailbox.
187  * @cxlm: The memory device to gain access to.
188  *
189  * Context: Any context. Takes the mbox_mutex.
190  * Return: 0 if exclusive access was acquired.
191  */
192 static int cxl_pci_mbox_get(struct cxl_mem *cxlm)
193 {
194 	struct device *dev = cxlm->dev;
195 	u64 md_status;
196 	int rc;
197 
198 	mutex_lock_io(&cxlm->mbox_mutex);
199 
200 	/*
201 	 * XXX: There is some amount of ambiguity in the 2.0 version of the spec
202 	 * around the mailbox interface ready (8.2.8.5.1.1).  The purpose of the
203 	 * bit is to allow firmware running on the device to notify the driver
204 	 * that it's ready to receive commands. It is unclear if the bit needs
205 	 * to be read for each transaction mailbox, ie. the firmware can switch
206 	 * it on and off as needed. Second, there is no defined timeout for
207 	 * mailbox ready, like there is for the doorbell interface.
208 	 *
209 	 * Assumptions:
210 	 * 1. The firmware might toggle the Mailbox Interface Ready bit, check
211 	 *    it for every command.
212 	 *
213 	 * 2. If the doorbell is clear, the firmware should have first set the
214 	 *    Mailbox Interface Ready bit. Therefore, waiting for the doorbell
215 	 *    to be ready is sufficient.
216 	 */
217 	rc = cxl_pci_mbox_wait_for_doorbell(cxlm);
218 	if (rc) {
219 		dev_warn(dev, "Mailbox interface not ready\n");
220 		goto out;
221 	}
222 
223 	md_status = readq(cxlm->regs.memdev + CXLMDEV_STATUS_OFFSET);
224 	if (!(md_status & CXLMDEV_MBOX_IF_READY && CXLMDEV_READY(md_status))) {
225 		dev_err(dev, "mbox: reported doorbell ready, but not mbox ready\n");
226 		rc = -EBUSY;
227 		goto out;
228 	}
229 
230 	/*
231 	 * Hardware shouldn't allow a ready status but also have failure bits
232 	 * set. Spit out an error, this should be a bug report
233 	 */
234 	rc = -EFAULT;
235 	if (md_status & CXLMDEV_DEV_FATAL) {
236 		dev_err(dev, "mbox: reported ready, but fatal\n");
237 		goto out;
238 	}
239 	if (md_status & CXLMDEV_FW_HALT) {
240 		dev_err(dev, "mbox: reported ready, but halted\n");
241 		goto out;
242 	}
243 	if (CXLMDEV_RESET_NEEDED(md_status)) {
244 		dev_err(dev, "mbox: reported ready, but reset needed\n");
245 		goto out;
246 	}
247 
248 	/* with lock held */
249 	return 0;
250 
251 out:
252 	mutex_unlock(&cxlm->mbox_mutex);
253 	return rc;
254 }
255 
256 /**
257  * cxl_pci_mbox_put() - Release exclusive access to the mailbox.
258  * @cxlm: The CXL memory device to communicate with.
259  *
260  * Context: Any context. Expects mbox_mutex to be held.
261  */
262 static void cxl_pci_mbox_put(struct cxl_mem *cxlm)
263 {
264 	mutex_unlock(&cxlm->mbox_mutex);
265 }
266 
267 static int cxl_pci_mbox_send(struct cxl_mem *cxlm, struct cxl_mbox_cmd *cmd)
268 {
269 	int rc;
270 
271 	rc = cxl_pci_mbox_get(cxlm);
272 	if (rc)
273 		return rc;
274 
275 	rc = __cxl_pci_mbox_send_cmd(cxlm, cmd);
276 	cxl_pci_mbox_put(cxlm);
277 
278 	return rc;
279 }
280 
281 static int cxl_pci_setup_mailbox(struct cxl_mem *cxlm)
282 {
283 	const int cap = readl(cxlm->regs.mbox + CXLDEV_MBOX_CAPS_OFFSET);
284 
285 	cxlm->mbox_send = cxl_pci_mbox_send;
286 	cxlm->payload_size =
287 		1 << FIELD_GET(CXLDEV_MBOX_CAP_PAYLOAD_SIZE_MASK, cap);
288 
289 	/*
290 	 * CXL 2.0 8.2.8.4.3 Mailbox Capabilities Register
291 	 *
292 	 * If the size is too small, mandatory commands will not work and so
293 	 * there's no point in going forward. If the size is too large, there's
294 	 * no harm is soft limiting it.
295 	 */
296 	cxlm->payload_size = min_t(size_t, cxlm->payload_size, SZ_1M);
297 	if (cxlm->payload_size < 256) {
298 		dev_err(cxlm->dev, "Mailbox is too small (%zub)",
299 			cxlm->payload_size);
300 		return -ENXIO;
301 	}
302 
303 	dev_dbg(cxlm->dev, "Mailbox payload sized %zu",
304 		cxlm->payload_size);
305 
306 	return 0;
307 }
308 
309 static int cxl_map_regblock(struct pci_dev *pdev, struct cxl_register_map *map)
310 {
311 	void __iomem *addr;
312 	int bar = map->barno;
313 	struct device *dev = &pdev->dev;
314 	resource_size_t offset = map->block_offset;
315 
316 	/* Basic sanity check that BAR is big enough */
317 	if (pci_resource_len(pdev, bar) < offset) {
318 		dev_err(dev, "BAR%d: %pr: too small (offset: %pa)\n", bar,
319 			&pdev->resource[bar], &offset);
320 		return -ENXIO;
321 	}
322 
323 	addr = pci_iomap(pdev, bar, 0);
324 	if (!addr) {
325 		dev_err(dev, "failed to map registers\n");
326 		return -ENOMEM;
327 	}
328 
329 	dev_dbg(dev, "Mapped CXL Memory Device resource bar %u @ %pa\n",
330 		bar, &offset);
331 
332 	map->base = addr + map->block_offset;
333 	return 0;
334 }
335 
336 static void cxl_unmap_regblock(struct pci_dev *pdev,
337 			       struct cxl_register_map *map)
338 {
339 	pci_iounmap(pdev, map->base - map->block_offset);
340 	map->base = NULL;
341 }
342 
343 static int cxl_probe_regs(struct pci_dev *pdev, struct cxl_register_map *map)
344 {
345 	struct cxl_component_reg_map *comp_map;
346 	struct cxl_device_reg_map *dev_map;
347 	struct device *dev = &pdev->dev;
348 	void __iomem *base = map->base;
349 
350 	switch (map->reg_type) {
351 	case CXL_REGLOC_RBI_COMPONENT:
352 		comp_map = &map->component_map;
353 		cxl_probe_component_regs(dev, base, comp_map);
354 		if (!comp_map->hdm_decoder.valid) {
355 			dev_err(dev, "HDM decoder registers not found\n");
356 			return -ENXIO;
357 		}
358 
359 		dev_dbg(dev, "Set up component registers\n");
360 		break;
361 	case CXL_REGLOC_RBI_MEMDEV:
362 		dev_map = &map->device_map;
363 		cxl_probe_device_regs(dev, base, dev_map);
364 		if (!dev_map->status.valid || !dev_map->mbox.valid ||
365 		    !dev_map->memdev.valid) {
366 			dev_err(dev, "registers not found: %s%s%s\n",
367 				!dev_map->status.valid ? "status " : "",
368 				!dev_map->mbox.valid ? "mbox " : "",
369 				!dev_map->memdev.valid ? "memdev " : "");
370 			return -ENXIO;
371 		}
372 
373 		dev_dbg(dev, "Probing device registers...\n");
374 		break;
375 	default:
376 		break;
377 	}
378 
379 	return 0;
380 }
381 
382 static int cxl_map_regs(struct cxl_mem *cxlm, struct cxl_register_map *map)
383 {
384 	struct device *dev = cxlm->dev;
385 	struct pci_dev *pdev = to_pci_dev(dev);
386 
387 	switch (map->reg_type) {
388 	case CXL_REGLOC_RBI_COMPONENT:
389 		cxl_map_component_regs(pdev, &cxlm->regs.component, map);
390 		dev_dbg(dev, "Mapping component registers...\n");
391 		break;
392 	case CXL_REGLOC_RBI_MEMDEV:
393 		cxl_map_device_regs(pdev, &cxlm->regs.device_regs, map);
394 		dev_dbg(dev, "Probing device registers...\n");
395 		break;
396 	default:
397 		break;
398 	}
399 
400 	return 0;
401 }
402 
403 static void cxl_decode_regblock(u32 reg_lo, u32 reg_hi,
404 				struct cxl_register_map *map)
405 {
406 	map->block_offset =
407 		((u64)reg_hi << 32) | (reg_lo & CXL_REGLOC_ADDR_MASK);
408 	map->barno = FIELD_GET(CXL_REGLOC_BIR_MASK, reg_lo);
409 	map->reg_type = FIELD_GET(CXL_REGLOC_RBI_MASK, reg_lo);
410 }
411 
412 /**
413  * cxl_find_regblock() - Locate register blocks by type
414  * @pdev: The CXL PCI device to enumerate.
415  * @type: Register Block Indicator id
416  * @map: Enumeration output, clobbered on error
417  *
418  * Return: 0 if register block enumerated, negative error code otherwise
419  *
420  * A CXL DVSEC may point to one or more register blocks, search for them
421  * by @type.
422  */
423 static int cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type,
424 			     struct cxl_register_map *map)
425 {
426 	u32 regloc_size, regblocks;
427 	int regloc, i;
428 
429 	regloc = pci_find_dvsec_capability(pdev, PCI_DVSEC_VENDOR_ID_CXL,
430 					   PCI_DVSEC_ID_CXL_REGLOC_DVSEC_ID);
431 	if (!regloc)
432 		return -ENXIO;
433 
434 	pci_read_config_dword(pdev, regloc + PCI_DVSEC_HEADER1, &regloc_size);
435 	regloc_size = FIELD_GET(PCI_DVSEC_HEADER1_LENGTH_MASK, regloc_size);
436 
437 	regloc += PCI_DVSEC_ID_CXL_REGLOC_BLOCK1_OFFSET;
438 	regblocks = (regloc_size - PCI_DVSEC_ID_CXL_REGLOC_BLOCK1_OFFSET) / 8;
439 
440 	for (i = 0; i < regblocks; i++, regloc += 8) {
441 		u32 reg_lo, reg_hi;
442 
443 		pci_read_config_dword(pdev, regloc, &reg_lo);
444 		pci_read_config_dword(pdev, regloc + 4, &reg_hi);
445 
446 		cxl_decode_regblock(reg_lo, reg_hi, map);
447 
448 		if (map->reg_type == type)
449 			return 0;
450 	}
451 
452 	return -ENODEV;
453 }
454 
455 static int cxl_setup_regs(struct pci_dev *pdev, enum cxl_regloc_type type,
456 			  struct cxl_register_map *map)
457 {
458 	int rc;
459 
460 	rc = cxl_find_regblock(pdev, type, map);
461 	if (rc)
462 		return rc;
463 
464 	rc = cxl_map_regblock(pdev, map);
465 	if (rc)
466 		return rc;
467 
468 	rc = cxl_probe_regs(pdev, map);
469 	cxl_unmap_regblock(pdev, map);
470 
471 	return rc;
472 }
473 
474 static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
475 {
476 	struct cxl_register_map map;
477 	struct cxl_memdev *cxlmd;
478 	struct cxl_mem *cxlm;
479 	int rc;
480 
481 	/*
482 	 * Double check the anonymous union trickery in struct cxl_regs
483 	 * FIXME switch to struct_group()
484 	 */
485 	BUILD_BUG_ON(offsetof(struct cxl_regs, memdev) !=
486 		     offsetof(struct cxl_regs, device_regs.memdev));
487 
488 	rc = pcim_enable_device(pdev);
489 	if (rc)
490 		return rc;
491 
492 	cxlm = cxl_mem_create(&pdev->dev);
493 	if (IS_ERR(cxlm))
494 		return PTR_ERR(cxlm);
495 
496 	rc = cxl_setup_regs(pdev, CXL_REGLOC_RBI_MEMDEV, &map);
497 	if (rc)
498 		return rc;
499 
500 	rc = cxl_map_regs(cxlm, &map);
501 	if (rc)
502 		return rc;
503 
504 	rc = cxl_pci_setup_mailbox(cxlm);
505 	if (rc)
506 		return rc;
507 
508 	rc = cxl_mem_enumerate_cmds(cxlm);
509 	if (rc)
510 		return rc;
511 
512 	rc = cxl_mem_identify(cxlm);
513 	if (rc)
514 		return rc;
515 
516 	rc = cxl_mem_create_range_info(cxlm);
517 	if (rc)
518 		return rc;
519 
520 	cxlmd = devm_cxl_add_memdev(cxlm);
521 	if (IS_ERR(cxlmd))
522 		return PTR_ERR(cxlmd);
523 
524 	if (range_len(&cxlm->pmem_range) && IS_ENABLED(CONFIG_CXL_PMEM))
525 		rc = devm_cxl_add_nvdimm(&pdev->dev, cxlmd);
526 
527 	return rc;
528 }
529 
530 static const struct pci_device_id cxl_mem_pci_tbl[] = {
531 	/* PCI class code for CXL.mem Type-3 Devices */
532 	{ PCI_DEVICE_CLASS((PCI_CLASS_MEMORY_CXL << 8 | CXL_MEMORY_PROGIF), ~0)},
533 	{ /* terminate list */ },
534 };
535 MODULE_DEVICE_TABLE(pci, cxl_mem_pci_tbl);
536 
537 static struct pci_driver cxl_pci_driver = {
538 	.name			= KBUILD_MODNAME,
539 	.id_table		= cxl_mem_pci_tbl,
540 	.probe			= cxl_pci_probe,
541 	.driver	= {
542 		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
543 	},
544 };
545 
546 MODULE_LICENSE("GPL v2");
547 module_pci_driver(cxl_pci_driver);
548 MODULE_IMPORT_NS(CXL);
549