]> Git Repo - linux.git/blob - drivers/cxl/mem.c
cxl/mem: Return -EFAULT if copy_to_user() fails
[linux.git] / drivers / cxl / mem.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2020 Intel Corporation. All rights reserved. */
3 #include <uapi/linux/cxl_mem.h>
4 #include <linux/security.h>
5 #include <linux/debugfs.h>
6 #include <linux/module.h>
7 #include <linux/mutex.h>
8 #include <linux/cdev.h>
9 #include <linux/idr.h>
10 #include <linux/pci.h>
11 #include <linux/io.h>
12 #include <linux/io-64-nonatomic-lo-hi.h>
13 #include "pci.h"
14 #include "cxl.h"
15
16 /**
17  * DOC: cxl mem
18  *
19  * This implements a CXL memory device ("type-3") as it is defined by the
20  * Compute Express Link specification.
21  *
22  * The driver has several responsibilities, mainly:
23  *  - Create the memX device and register on the CXL bus.
24  *  - Enumerate device's register interface and map them.
25  *  - Probe the device attributes to establish sysfs interface.
26  *  - Provide an IOCTL interface to userspace to communicate with the device for
27  *    things like firmware update.
28  *  - Support management of interleave sets.
29  *  - Handle and manage error conditions.
30  */
31
32 /*
33  * An entire PCI topology full of devices should be enough for any
34  * config
35  */
36 #define CXL_MEM_MAX_DEVS 65536
37
38 #define cxl_doorbell_busy(cxlm)                                                \
39         (readl((cxlm)->mbox_regs + CXLDEV_MBOX_CTRL_OFFSET) &                  \
40          CXLDEV_MBOX_CTRL_DOORBELL)
41
42 /* CXL 2.0 - 8.2.8.4 */
43 #define CXL_MAILBOX_TIMEOUT_MS (2 * HZ)
44
45 enum opcode {
46         CXL_MBOX_OP_INVALID             = 0x0000,
47         CXL_MBOX_OP_RAW                 = CXL_MBOX_OP_INVALID,
48         CXL_MBOX_OP_GET_FW_INFO         = 0x0200,
49         CXL_MBOX_OP_ACTIVATE_FW         = 0x0202,
50         CXL_MBOX_OP_GET_SUPPORTED_LOGS  = 0x0400,
51         CXL_MBOX_OP_GET_LOG             = 0x0401,
52         CXL_MBOX_OP_IDENTIFY            = 0x4000,
53         CXL_MBOX_OP_GET_PARTITION_INFO  = 0x4100,
54         CXL_MBOX_OP_SET_PARTITION_INFO  = 0x4101,
55         CXL_MBOX_OP_GET_LSA             = 0x4102,
56         CXL_MBOX_OP_SET_LSA             = 0x4103,
57         CXL_MBOX_OP_GET_HEALTH_INFO     = 0x4200,
58         CXL_MBOX_OP_SET_SHUTDOWN_STATE  = 0x4204,
59         CXL_MBOX_OP_SCAN_MEDIA          = 0x4304,
60         CXL_MBOX_OP_GET_SCAN_MEDIA      = 0x4305,
61         CXL_MBOX_OP_MAX                 = 0x10000
62 };
63
64 /**
65  * struct mbox_cmd - A command to be submitted to hardware.
66  * @opcode: (input) The command set and command submitted to hardware.
67  * @payload_in: (input) Pointer to the input payload.
68  * @payload_out: (output) Pointer to the output payload. Must be allocated by
69  *               the caller.
70  * @size_in: (input) Number of bytes to load from @payload_in.
71  * @size_out: (input) Max number of bytes loaded into @payload_out.
72  *            (output) Number of bytes generated by the device. For fixed size
73  *            outputs commands this is always expected to be deterministic. For
74  *            variable sized output commands, it tells the exact number of bytes
75  *            written.
76  * @return_code: (output) Error code returned from hardware.
77  *
78  * This is the primary mechanism used to send commands to the hardware.
79  * All the fields except @payload_* correspond exactly to the fields described in
80  * Command Register section of the CXL 2.0 8.2.8.4.5. @payload_in and
81  * @payload_out are written to, and read from the Command Payload Registers
82  * defined in CXL 2.0 8.2.8.4.8.
83  */
84 struct mbox_cmd {
85         u16 opcode;
86         void *payload_in;
87         void *payload_out;
88         size_t size_in;
89         size_t size_out;
90         u16 return_code;
91 #define CXL_MBOX_SUCCESS 0
92 };
93
94 /**
95  * struct cxl_memdev - CXL bus object representing a Type-3 Memory Device
96  * @dev: driver core device object
97  * @cdev: char dev core object for ioctl operations
98  * @cxlm: pointer to the parent device driver data
99  * @ops_active: active user of @cxlm in ops handlers
100  * @ops_dead: completion when all @cxlm ops users have exited
101  * @id: id number of this memdev instance.
102  */
103 struct cxl_memdev {
104         struct device dev;
105         struct cdev cdev;
106         struct cxl_mem *cxlm;
107         struct percpu_ref ops_active;
108         struct completion ops_dead;
109         int id;
110 };
111
112 static int cxl_mem_major;
113 static DEFINE_IDA(cxl_memdev_ida);
114 static struct dentry *cxl_debugfs;
115 static bool cxl_raw_allow_all;
116
117 enum {
118         CEL_UUID,
119         VENDOR_DEBUG_UUID,
120 };
121
122 /* See CXL 2.0 Table 170. Get Log Input Payload */
123 static const uuid_t log_uuid[] = {
124         [CEL_UUID] = UUID_INIT(0xda9c0b5, 0xbf41, 0x4b78, 0x8f, 0x79, 0x96,
125                                0xb1, 0x62, 0x3b, 0x3f, 0x17),
126         [VENDOR_DEBUG_UUID] = UUID_INIT(0xe1819d9, 0x11a9, 0x400c, 0x81, 0x1f,
127                                         0xd6, 0x07, 0x19, 0x40, 0x3d, 0x86),
128 };
129
130 /**
131  * struct cxl_mem_command - Driver representation of a memory device command
132  * @info: Command information as it exists for the UAPI
133  * @opcode: The actual bits used for the mailbox protocol
134  * @flags: Set of flags effecting driver behavior.
135  *
136  *  * %CXL_CMD_FLAG_FORCE_ENABLE: In cases of error, commands with this flag
137  *    will be enabled by the driver regardless of what hardware may have
138  *    advertised.
139  *
140  * The cxl_mem_command is the driver's internal representation of commands that
141  * are supported by the driver. Some of these commands may not be supported by
142  * the hardware. The driver will use @info to validate the fields passed in by
143  * the user then submit the @opcode to the hardware.
144  *
145  * See struct cxl_command_info.
146  */
147 struct cxl_mem_command {
148         struct cxl_command_info info;
149         enum opcode opcode;
150         u32 flags;
151 #define CXL_CMD_FLAG_NONE 0
152 #define CXL_CMD_FLAG_FORCE_ENABLE BIT(0)
153 };
154
155 #define CXL_CMD(_id, sin, sout, _flags)                                        \
156         [CXL_MEM_COMMAND_ID_##_id] = {                                         \
157         .info = {                                                              \
158                         .id = CXL_MEM_COMMAND_ID_##_id,                        \
159                         .size_in = sin,                                        \
160                         .size_out = sout,                                      \
161                 },                                                             \
162         .opcode = CXL_MBOX_OP_##_id,                                           \
163         .flags = _flags,                                                       \
164         }
165
166 /*
167  * This table defines the supported mailbox commands for the driver. This table
168  * is made up of a UAPI structure. Non-negative values as parameters in the
169  * table will be validated against the user's input. For example, if size_in is
170  * 0, and the user passed in 1, it is an error.
171  */
172 static struct cxl_mem_command mem_commands[] = {
173         CXL_CMD(IDENTIFY, 0, 0x43, CXL_CMD_FLAG_FORCE_ENABLE),
174 #ifdef CONFIG_CXL_MEM_RAW_COMMANDS
175         CXL_CMD(RAW, ~0, ~0, 0),
176 #endif
177         CXL_CMD(GET_SUPPORTED_LOGS, 0, ~0, CXL_CMD_FLAG_FORCE_ENABLE),
178         CXL_CMD(GET_FW_INFO, 0, 0x50, 0),
179         CXL_CMD(GET_PARTITION_INFO, 0, 0x20, 0),
180         CXL_CMD(GET_LSA, 0x8, ~0, 0),
181         CXL_CMD(GET_HEALTH_INFO, 0, 0x12, 0),
182         CXL_CMD(GET_LOG, 0x18, ~0, CXL_CMD_FLAG_FORCE_ENABLE),
183 };
184
185 /*
186  * Commands that RAW doesn't permit. The rationale for each:
187  *
188  * CXL_MBOX_OP_ACTIVATE_FW: Firmware activation requires adjustment /
189  * coordination of transaction timeout values at the root bridge level.
190  *
191  * CXL_MBOX_OP_SET_PARTITION_INFO: The device memory map may change live
192  * and needs to be coordinated with HDM updates.
193  *
194  * CXL_MBOX_OP_SET_LSA: The label storage area may be cached by the
195  * driver and any writes from userspace invalidates those contents.
196  *
197  * CXL_MBOX_OP_SET_SHUTDOWN_STATE: Set shutdown state assumes no writes
198  * to the device after it is marked clean, userspace can not make that
199  * assertion.
200  *
201  * CXL_MBOX_OP_[GET_]SCAN_MEDIA: The kernel provides a native error list that
202  * is kept up to date with patrol notifications and error management.
203  */
204 static u16 cxl_disabled_raw_commands[] = {
205         CXL_MBOX_OP_ACTIVATE_FW,
206         CXL_MBOX_OP_SET_PARTITION_INFO,
207         CXL_MBOX_OP_SET_LSA,
208         CXL_MBOX_OP_SET_SHUTDOWN_STATE,
209         CXL_MBOX_OP_SCAN_MEDIA,
210         CXL_MBOX_OP_GET_SCAN_MEDIA,
211 };
212
213 /*
214  * Command sets that RAW doesn't permit. All opcodes in this set are
215  * disabled because they pass plain text security payloads over the
216  * user/kernel boundary. This functionality is intended to be wrapped
217  * behind the keys ABI which allows for encrypted payloads in the UAPI
218  */
219 static u8 security_command_sets[] = {
220         0x44, /* Sanitize */
221         0x45, /* Persistent Memory Data-at-rest Security */
222         0x46, /* Security Passthrough */
223 };
224
225 #define cxl_for_each_cmd(cmd)                                                  \
226         for ((cmd) = &mem_commands[0];                                         \
227              ((cmd) - mem_commands) < ARRAY_SIZE(mem_commands); (cmd)++)
228
229 #define cxl_cmd_count ARRAY_SIZE(mem_commands)
230
231 static int cxl_mem_wait_for_doorbell(struct cxl_mem *cxlm)
232 {
233         const unsigned long start = jiffies;
234         unsigned long end = start;
235
236         while (cxl_doorbell_busy(cxlm)) {
237                 end = jiffies;
238
239                 if (time_after(end, start + CXL_MAILBOX_TIMEOUT_MS)) {
240                         /* Check again in case preempted before timeout test */
241                         if (!cxl_doorbell_busy(cxlm))
242                                 break;
243                         return -ETIMEDOUT;
244                 }
245                 cpu_relax();
246         }
247
248         dev_dbg(&cxlm->pdev->dev, "Doorbell wait took %dms",
249                 jiffies_to_msecs(end) - jiffies_to_msecs(start));
250         return 0;
251 }
252
253 static bool cxl_is_security_command(u16 opcode)
254 {
255         int i;
256
257         for (i = 0; i < ARRAY_SIZE(security_command_sets); i++)
258                 if (security_command_sets[i] == (opcode >> 8))
259                         return true;
260         return false;
261 }
262
263 static void cxl_mem_mbox_timeout(struct cxl_mem *cxlm,
264                                  struct mbox_cmd *mbox_cmd)
265 {
266         struct device *dev = &cxlm->pdev->dev;
267
268         dev_dbg(dev, "Mailbox command (opcode: %#x size: %zub) timed out\n",
269                 mbox_cmd->opcode, mbox_cmd->size_in);
270 }
271
272 /**
273  * __cxl_mem_mbox_send_cmd() - Execute a mailbox command
274  * @cxlm: The CXL memory device to communicate with.
275  * @mbox_cmd: Command to send to the memory device.
276  *
277  * Context: Any context. Expects mbox_mutex to be held.
278  * Return: -ETIMEDOUT if timeout occurred waiting for completion. 0 on success.
279  *         Caller should check the return code in @mbox_cmd to make sure it
280  *         succeeded.
281  *
282  * This is a generic form of the CXL mailbox send command thus only using the
283  * registers defined by the mailbox capability ID - CXL 2.0 8.2.8.4. Memory
284  * devices, and perhaps other types of CXL devices may have further information
285  * available upon error conditions. Driver facilities wishing to send mailbox
286  * commands should use the wrapper command.
287  *
288  * The CXL spec allows for up to two mailboxes. The intention is for the primary
289  * mailbox to be OS controlled and the secondary mailbox to be used by system
290  * firmware. This allows the OS and firmware to communicate with the device and
291  * not need to coordinate with each other. The driver only uses the primary
292  * mailbox.
293  */
294 static int __cxl_mem_mbox_send_cmd(struct cxl_mem *cxlm,
295                                    struct mbox_cmd *mbox_cmd)
296 {
297         void __iomem *payload = cxlm->mbox_regs + CXLDEV_MBOX_PAYLOAD_OFFSET;
298         u64 cmd_reg, status_reg;
299         size_t out_len;
300         int rc;
301
302         lockdep_assert_held(&cxlm->mbox_mutex);
303
304         /*
305          * Here are the steps from 8.2.8.4 of the CXL 2.0 spec.
306          *   1. Caller reads MB Control Register to verify doorbell is clear
307          *   2. Caller writes Command Register
308          *   3. Caller writes Command Payload Registers if input payload is non-empty
309          *   4. Caller writes MB Control Register to set doorbell
310          *   5. Caller either polls for doorbell to be clear or waits for interrupt if configured
311          *   6. Caller reads MB Status Register to fetch Return code
312          *   7. If command successful, Caller reads Command Register to get Payload Length
313          *   8. If output payload is non-empty, host reads Command Payload Registers
314          *
315          * Hardware is free to do whatever it wants before the doorbell is rung,
316          * and isn't allowed to change anything after it clears the doorbell. As
317          * such, steps 2 and 3 can happen in any order, and steps 6, 7, 8 can
318          * also happen in any order (though some orders might not make sense).
319          */
320
321         /* #1 */
322         if (cxl_doorbell_busy(cxlm)) {
323                 dev_err_ratelimited(&cxlm->pdev->dev,
324                                     "Mailbox re-busy after acquiring\n");
325                 return -EBUSY;
326         }
327
328         cmd_reg = FIELD_PREP(CXLDEV_MBOX_CMD_COMMAND_OPCODE_MASK,
329                              mbox_cmd->opcode);
330         if (mbox_cmd->size_in) {
331                 if (WARN_ON(!mbox_cmd->payload_in))
332                         return -EINVAL;
333
334                 cmd_reg |= FIELD_PREP(CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK,
335                                       mbox_cmd->size_in);
336                 memcpy_toio(payload, mbox_cmd->payload_in, mbox_cmd->size_in);
337         }
338
339         /* #2, #3 */
340         writeq(cmd_reg, cxlm->mbox_regs + CXLDEV_MBOX_CMD_OFFSET);
341
342         /* #4 */
343         dev_dbg(&cxlm->pdev->dev, "Sending command\n");
344         writel(CXLDEV_MBOX_CTRL_DOORBELL,
345                cxlm->mbox_regs + CXLDEV_MBOX_CTRL_OFFSET);
346
347         /* #5 */
348         rc = cxl_mem_wait_for_doorbell(cxlm);
349         if (rc == -ETIMEDOUT) {
350                 cxl_mem_mbox_timeout(cxlm, mbox_cmd);
351                 return rc;
352         }
353
354         /* #6 */
355         status_reg = readq(cxlm->mbox_regs + CXLDEV_MBOX_STATUS_OFFSET);
356         mbox_cmd->return_code =
357                 FIELD_GET(CXLDEV_MBOX_STATUS_RET_CODE_MASK, status_reg);
358
359         if (mbox_cmd->return_code != 0) {
360                 dev_dbg(&cxlm->pdev->dev, "Mailbox operation had an error\n");
361                 return 0;
362         }
363
364         /* #7 */
365         cmd_reg = readq(cxlm->mbox_regs + CXLDEV_MBOX_CMD_OFFSET);
366         out_len = FIELD_GET(CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK, cmd_reg);
367
368         /* #8 */
369         if (out_len && mbox_cmd->payload_out) {
370                 /*
371                  * Sanitize the copy. If hardware misbehaves, out_len per the
372                  * spec can actually be greater than the max allowed size (21
373                  * bits available but spec defined 1M max). The caller also may
374                  * have requested less data than the hardware supplied even
375                  * within spec.
376                  */
377                 size_t n = min3(mbox_cmd->size_out, cxlm->payload_size, out_len);
378
379                 memcpy_fromio(mbox_cmd->payload_out, payload, n);
380                 mbox_cmd->size_out = n;
381         } else {
382                 mbox_cmd->size_out = 0;
383         }
384
385         return 0;
386 }
387
388 /**
389  * cxl_mem_mbox_get() - Acquire exclusive access to the mailbox.
390  * @cxlm: The memory device to gain access to.
391  *
392  * Context: Any context. Takes the mbox_mutex.
393  * Return: 0 if exclusive access was acquired.
394  */
395 static int cxl_mem_mbox_get(struct cxl_mem *cxlm)
396 {
397         struct device *dev = &cxlm->pdev->dev;
398         u64 md_status;
399         int rc;
400
401         mutex_lock_io(&cxlm->mbox_mutex);
402
403         /*
404          * XXX: There is some amount of ambiguity in the 2.0 version of the spec
405          * around the mailbox interface ready (8.2.8.5.1.1).  The purpose of the
406          * bit is to allow firmware running on the device to notify the driver
407          * that it's ready to receive commands. It is unclear if the bit needs
408          * to be read for each transaction mailbox, ie. the firmware can switch
409          * it on and off as needed. Second, there is no defined timeout for
410          * mailbox ready, like there is for the doorbell interface.
411          *
412          * Assumptions:
413          * 1. The firmware might toggle the Mailbox Interface Ready bit, check
414          *    it for every command.
415          *
416          * 2. If the doorbell is clear, the firmware should have first set the
417          *    Mailbox Interface Ready bit. Therefore, waiting for the doorbell
418          *    to be ready is sufficient.
419          */
420         rc = cxl_mem_wait_for_doorbell(cxlm);
421         if (rc) {
422                 dev_warn(dev, "Mailbox interface not ready\n");
423                 goto out;
424         }
425
426         md_status = readq(cxlm->memdev_regs + CXLMDEV_STATUS_OFFSET);
427         if (!(md_status & CXLMDEV_MBOX_IF_READY && CXLMDEV_READY(md_status))) {
428                 dev_err(dev, "mbox: reported doorbell ready, but not mbox ready\n");
429                 rc = -EBUSY;
430                 goto out;
431         }
432
433         /*
434          * Hardware shouldn't allow a ready status but also have failure bits
435          * set. Spit out an error, this should be a bug report
436          */
437         rc = -EFAULT;
438         if (md_status & CXLMDEV_DEV_FATAL) {
439                 dev_err(dev, "mbox: reported ready, but fatal\n");
440                 goto out;
441         }
442         if (md_status & CXLMDEV_FW_HALT) {
443                 dev_err(dev, "mbox: reported ready, but halted\n");
444                 goto out;
445         }
446         if (CXLMDEV_RESET_NEEDED(md_status)) {
447                 dev_err(dev, "mbox: reported ready, but reset needed\n");
448                 goto out;
449         }
450
451         /* with lock held */
452         return 0;
453
454 out:
455         mutex_unlock(&cxlm->mbox_mutex);
456         return rc;
457 }
458
459 /**
460  * cxl_mem_mbox_put() - Release exclusive access to the mailbox.
461  * @cxlm: The CXL memory device to communicate with.
462  *
463  * Context: Any context. Expects mbox_mutex to be held.
464  */
465 static void cxl_mem_mbox_put(struct cxl_mem *cxlm)
466 {
467         mutex_unlock(&cxlm->mbox_mutex);
468 }
469
470 /**
471  * handle_mailbox_cmd_from_user() - Dispatch a mailbox command for userspace.
472  * @cxlm: The CXL memory device to communicate with.
473  * @cmd: The validated command.
474  * @in_payload: Pointer to userspace's input payload.
475  * @out_payload: Pointer to userspace's output payload.
476  * @size_out: (Input) Max payload size to copy out.
477  *            (Output) Payload size hardware generated.
478  * @retval: Hardware generated return code from the operation.
479  *
480  * Return:
481  *  * %0        - Mailbox transaction succeeded. This implies the mailbox
482  *                protocol completed successfully not that the operation itself
483  *                was successful.
484  *  * %-ENOMEM  - Couldn't allocate a bounce buffer.
485  *  * %-EFAULT  - Something happened with copy_to/from_user.
486  *  * %-EINTR   - Mailbox acquisition interrupted.
487  *  * %-EXXX    - Transaction level failures.
488  *
489  * Creates the appropriate mailbox command and dispatches it on behalf of a
490  * userspace request. The input and output payloads are copied between
491  * userspace.
492  *
493  * See cxl_send_cmd().
494  */
495 static int handle_mailbox_cmd_from_user(struct cxl_mem *cxlm,
496                                         const struct cxl_mem_command *cmd,
497                                         u64 in_payload, u64 out_payload,
498                                         s32 *size_out, u32 *retval)
499 {
500         struct device *dev = &cxlm->pdev->dev;
501         struct mbox_cmd mbox_cmd = {
502                 .opcode = cmd->opcode,
503                 .size_in = cmd->info.size_in,
504                 .size_out = cmd->info.size_out,
505         };
506         int rc;
507
508         if (cmd->info.size_out) {
509                 mbox_cmd.payload_out = kvzalloc(cmd->info.size_out, GFP_KERNEL);
510                 if (!mbox_cmd.payload_out)
511                         return -ENOMEM;
512         }
513
514         if (cmd->info.size_in) {
515                 mbox_cmd.payload_in = vmemdup_user(u64_to_user_ptr(in_payload),
516                                                    cmd->info.size_in);
517                 if (IS_ERR(mbox_cmd.payload_in))
518                         return PTR_ERR(mbox_cmd.payload_in);
519         }
520
521         rc = cxl_mem_mbox_get(cxlm);
522         if (rc)
523                 goto out;
524
525         dev_dbg(dev,
526                 "Submitting %s command for user\n"
527                 "\topcode: %x\n"
528                 "\tsize: %ub\n",
529                 cxl_command_names[cmd->info.id].name, mbox_cmd.opcode,
530                 cmd->info.size_in);
531
532         dev_WARN_ONCE(dev, cmd->info.id == CXL_MEM_COMMAND_ID_RAW,
533                       "raw command path used\n");
534
535         rc = __cxl_mem_mbox_send_cmd(cxlm, &mbox_cmd);
536         cxl_mem_mbox_put(cxlm);
537         if (rc)
538                 goto out;
539
540         /*
541          * @size_out contains the max size that's allowed to be written back out
542          * to userspace. While the payload may have written more output than
543          * this it will have to be ignored.
544          */
545         if (mbox_cmd.size_out) {
546                 dev_WARN_ONCE(dev, mbox_cmd.size_out > *size_out,
547                               "Invalid return size\n");
548                 if (copy_to_user(u64_to_user_ptr(out_payload),
549                                  mbox_cmd.payload_out, mbox_cmd.size_out)) {
550                         rc = -EFAULT;
551                         goto out;
552                 }
553         }
554
555         *size_out = mbox_cmd.size_out;
556         *retval = mbox_cmd.return_code;
557
558 out:
559         kvfree(mbox_cmd.payload_in);
560         kvfree(mbox_cmd.payload_out);
561         return rc;
562 }
563
564 static bool cxl_mem_raw_command_allowed(u16 opcode)
565 {
566         int i;
567
568         if (!IS_ENABLED(CONFIG_CXL_MEM_RAW_COMMANDS))
569                 return false;
570
571         if (security_locked_down(LOCKDOWN_NONE))
572                 return false;
573
574         if (cxl_raw_allow_all)
575                 return true;
576
577         if (cxl_is_security_command(opcode))
578                 return false;
579
580         for (i = 0; i < ARRAY_SIZE(cxl_disabled_raw_commands); i++)
581                 if (cxl_disabled_raw_commands[i] == opcode)
582                         return false;
583
584         return true;
585 }
586
587 /**
588  * cxl_validate_cmd_from_user() - Check fields for CXL_MEM_SEND_COMMAND.
589  * @cxlm: &struct cxl_mem device whose mailbox will be used.
590  * @send_cmd: &struct cxl_send_command copied in from userspace.
591  * @out_cmd: Sanitized and populated &struct cxl_mem_command.
592  *
593  * Return:
594  *  * %0        - @out_cmd is ready to send.
595  *  * %-ENOTTY  - Invalid command specified.
596  *  * %-EINVAL  - Reserved fields or invalid values were used.
597  *  * %-ENOMEM  - Input or output buffer wasn't sized properly.
598  *  * %-EPERM   - Attempted to use a protected command.
599  *
600  * The result of this command is a fully validated command in @out_cmd that is
601  * safe to send to the hardware.
602  *
603  * See handle_mailbox_cmd_from_user()
604  */
605 static int cxl_validate_cmd_from_user(struct cxl_mem *cxlm,
606                                       const struct cxl_send_command *send_cmd,
607                                       struct cxl_mem_command *out_cmd)
608 {
609         const struct cxl_command_info *info;
610         struct cxl_mem_command *c;
611
612         if (send_cmd->id == 0 || send_cmd->id >= CXL_MEM_COMMAND_ID_MAX)
613                 return -ENOTTY;
614
615         /*
616          * The user can never specify an input payload larger than what hardware
617          * supports, but output can be arbitrarily large (simply write out as
618          * much data as the hardware provides).
619          */
620         if (send_cmd->in.size > cxlm->payload_size)
621                 return -EINVAL;
622
623         /*
624          * Checks are bypassed for raw commands but a WARN/taint will occur
625          * later in the callchain
626          */
627         if (send_cmd->id == CXL_MEM_COMMAND_ID_RAW) {
628                 const struct cxl_mem_command temp = {
629                         .info = {
630                                 .id = CXL_MEM_COMMAND_ID_RAW,
631                                 .flags = 0,
632                                 .size_in = send_cmd->in.size,
633                                 .size_out = send_cmd->out.size,
634                         },
635                         .opcode = send_cmd->raw.opcode
636                 };
637
638                 if (send_cmd->raw.rsvd)
639                         return -EINVAL;
640
641                 /*
642                  * Unlike supported commands, the output size of RAW commands
643                  * gets passed along without further checking, so it must be
644                  * validated here.
645                  */
646                 if (send_cmd->out.size > cxlm->payload_size)
647                         return -EINVAL;
648
649                 if (!cxl_mem_raw_command_allowed(send_cmd->raw.opcode))
650                         return -EPERM;
651
652                 memcpy(out_cmd, &temp, sizeof(temp));
653
654                 return 0;
655         }
656
657         if (send_cmd->flags & ~CXL_MEM_COMMAND_FLAG_MASK)
658                 return -EINVAL;
659
660         if (send_cmd->rsvd)
661                 return -EINVAL;
662
663         if (send_cmd->in.rsvd || send_cmd->out.rsvd)
664                 return -EINVAL;
665
666         /* Convert user's command into the internal representation */
667         c = &mem_commands[send_cmd->id];
668         info = &c->info;
669
670         /* Check that the command is enabled for hardware */
671         if (!test_bit(info->id, cxlm->enabled_cmds))
672                 return -ENOTTY;
673
674         /* Check the input buffer is the expected size */
675         if (info->size_in >= 0 && info->size_in != send_cmd->in.size)
676                 return -ENOMEM;
677
678         /* Check the output buffer is at least large enough */
679         if (info->size_out >= 0 && send_cmd->out.size < info->size_out)
680                 return -ENOMEM;
681
682         memcpy(out_cmd, c, sizeof(*c));
683         out_cmd->info.size_in = send_cmd->in.size;
684         /*
685          * XXX: out_cmd->info.size_out will be controlled by the driver, and the
686          * specified number of bytes @send_cmd->out.size will be copied back out
687          * to userspace.
688          */
689
690         return 0;
691 }
692
693 static int cxl_query_cmd(struct cxl_memdev *cxlmd,
694                          struct cxl_mem_query_commands __user *q)
695 {
696         struct device *dev = &cxlmd->dev;
697         struct cxl_mem_command *cmd;
698         u32 n_commands;
699         int j = 0;
700
701         dev_dbg(dev, "Query IOCTL\n");
702
703         if (get_user(n_commands, &q->n_commands))
704                 return -EFAULT;
705
706         /* returns the total number if 0 elements are requested. */
707         if (n_commands == 0)
708                 return put_user(cxl_cmd_count, &q->n_commands);
709
710         /*
711          * otherwise, return max(n_commands, total commands) cxl_command_info
712          * structures.
713          */
714         cxl_for_each_cmd(cmd) {
715                 const struct cxl_command_info *info = &cmd->info;
716
717                 if (copy_to_user(&q->commands[j++], info, sizeof(*info)))
718                         return -EFAULT;
719
720                 if (j == n_commands)
721                         break;
722         }
723
724         return 0;
725 }
726
727 static int cxl_send_cmd(struct cxl_memdev *cxlmd,
728                         struct cxl_send_command __user *s)
729 {
730         struct cxl_mem *cxlm = cxlmd->cxlm;
731         struct device *dev = &cxlmd->dev;
732         struct cxl_send_command send;
733         struct cxl_mem_command c;
734         int rc;
735
736         dev_dbg(dev, "Send IOCTL\n");
737
738         if (copy_from_user(&send, s, sizeof(send)))
739                 return -EFAULT;
740
741         rc = cxl_validate_cmd_from_user(cxlmd->cxlm, &send, &c);
742         if (rc)
743                 return rc;
744
745         /* Prepare to handle a full payload for variable sized output */
746         if (c.info.size_out < 0)
747                 c.info.size_out = cxlm->payload_size;
748
749         rc = handle_mailbox_cmd_from_user(cxlm, &c, send.in.payload,
750                                           send.out.payload, &send.out.size,
751                                           &send.retval);
752         if (rc)
753                 return rc;
754
755         if (copy_to_user(s, &send, sizeof(send)))
756                 return -EFAULT;
757
758         return 0;
759 }
760
761 static long __cxl_memdev_ioctl(struct cxl_memdev *cxlmd, unsigned int cmd,
762                                unsigned long arg)
763 {
764         switch (cmd) {
765         case CXL_MEM_QUERY_COMMANDS:
766                 return cxl_query_cmd(cxlmd, (void __user *)arg);
767         case CXL_MEM_SEND_COMMAND:
768                 return cxl_send_cmd(cxlmd, (void __user *)arg);
769         default:
770                 return -ENOTTY;
771         }
772 }
773
774 static long cxl_memdev_ioctl(struct file *file, unsigned int cmd,
775                              unsigned long arg)
776 {
777         struct cxl_memdev *cxlmd;
778         struct inode *inode;
779         int rc = -ENOTTY;
780
781         inode = file_inode(file);
782         cxlmd = container_of(inode->i_cdev, typeof(*cxlmd), cdev);
783
784         if (!percpu_ref_tryget_live(&cxlmd->ops_active))
785                 return -ENXIO;
786
787         rc = __cxl_memdev_ioctl(cxlmd, cmd, arg);
788
789         percpu_ref_put(&cxlmd->ops_active);
790
791         return rc;
792 }
793
794 static const struct file_operations cxl_memdev_fops = {
795         .owner = THIS_MODULE,
796         .unlocked_ioctl = cxl_memdev_ioctl,
797         .compat_ioctl = compat_ptr_ioctl,
798         .llseek = noop_llseek,
799 };
800
801 static inline struct cxl_mem_command *cxl_mem_find_command(u16 opcode)
802 {
803         struct cxl_mem_command *c;
804
805         cxl_for_each_cmd(c)
806                 if (c->opcode == opcode)
807                         return c;
808
809         return NULL;
810 }
811
812 /**
813  * cxl_mem_mbox_send_cmd() - Send a mailbox command to a memory device.
814  * @cxlm: The CXL memory device to communicate with.
815  * @opcode: Opcode for the mailbox command.
816  * @in: The input payload for the mailbox command.
817  * @in_size: The length of the input payload
818  * @out: Caller allocated buffer for the output.
819  * @out_size: Expected size of output.
820  *
821  * Context: Any context. Will acquire and release mbox_mutex.
822  * Return:
823  *  * %>=0      - Number of bytes returned in @out.
824  *  * %-E2BIG   - Payload is too large for hardware.
825  *  * %-EBUSY   - Couldn't acquire exclusive mailbox access.
826  *  * %-EFAULT  - Hardware error occurred.
827  *  * %-ENXIO   - Command completed, but device reported an error.
828  *  * %-EIO     - Unexpected output size.
829  *
830  * Mailbox commands may execute successfully yet the device itself reported an
831  * error. While this distinction can be useful for commands from userspace, the
832  * kernel will only be able to use results when both are successful.
833  *
834  * See __cxl_mem_mbox_send_cmd()
835  */
836 static int cxl_mem_mbox_send_cmd(struct cxl_mem *cxlm, u16 opcode,
837                                  void *in, size_t in_size,
838                                  void *out, size_t out_size)
839 {
840         const struct cxl_mem_command *cmd = cxl_mem_find_command(opcode);
841         struct mbox_cmd mbox_cmd = {
842                 .opcode = opcode,
843                 .payload_in = in,
844                 .size_in = in_size,
845                 .size_out = out_size,
846                 .payload_out = out,
847         };
848         int rc;
849
850         if (out_size > cxlm->payload_size)
851                 return -E2BIG;
852
853         rc = cxl_mem_mbox_get(cxlm);
854         if (rc)
855                 return rc;
856
857         rc = __cxl_mem_mbox_send_cmd(cxlm, &mbox_cmd);
858         cxl_mem_mbox_put(cxlm);
859         if (rc)
860                 return rc;
861
862         /* TODO: Map return code to proper kernel style errno */
863         if (mbox_cmd.return_code != CXL_MBOX_SUCCESS)
864                 return -ENXIO;
865
866         /*
867          * Variable sized commands can't be validated and so it's up to the
868          * caller to do that if they wish.
869          */
870         if (cmd->info.size_out >= 0 && mbox_cmd.size_out != out_size)
871                 return -EIO;
872
873         return 0;
874 }
875
876 /**
877  * cxl_mem_setup_regs() - Setup necessary MMIO.
878  * @cxlm: The CXL memory device to communicate with.
879  *
880  * Return: 0 if all necessary registers mapped.
881  *
882  * A memory device is required by spec to implement a certain set of MMIO
883  * regions. The purpose of this function is to enumerate and map those
884  * registers.
885  */
886 static int cxl_mem_setup_regs(struct cxl_mem *cxlm)
887 {
888         struct device *dev = &cxlm->pdev->dev;
889         int cap, cap_count;
890         u64 cap_array;
891
892         cap_array = readq(cxlm->regs + CXLDEV_CAP_ARRAY_OFFSET);
893         if (FIELD_GET(CXLDEV_CAP_ARRAY_ID_MASK, cap_array) !=
894             CXLDEV_CAP_ARRAY_CAP_ID)
895                 return -ENODEV;
896
897         cap_count = FIELD_GET(CXLDEV_CAP_ARRAY_COUNT_MASK, cap_array);
898
899         for (cap = 1; cap <= cap_count; cap++) {
900                 void __iomem *register_block;
901                 u32 offset;
902                 u16 cap_id;
903
904                 cap_id = FIELD_GET(CXLDEV_CAP_HDR_CAP_ID_MASK,
905                                    readl(cxlm->regs + cap * 0x10));
906                 offset = readl(cxlm->regs + cap * 0x10 + 0x4);
907                 register_block = cxlm->regs + offset;
908
909                 switch (cap_id) {
910                 case CXLDEV_CAP_CAP_ID_DEVICE_STATUS:
911                         dev_dbg(dev, "found Status capability (0x%x)\n", offset);
912                         cxlm->status_regs = register_block;
913                         break;
914                 case CXLDEV_CAP_CAP_ID_PRIMARY_MAILBOX:
915                         dev_dbg(dev, "found Mailbox capability (0x%x)\n", offset);
916                         cxlm->mbox_regs = register_block;
917                         break;
918                 case CXLDEV_CAP_CAP_ID_SECONDARY_MAILBOX:
919                         dev_dbg(dev, "found Secondary Mailbox capability (0x%x)\n", offset);
920                         break;
921                 case CXLDEV_CAP_CAP_ID_MEMDEV:
922                         dev_dbg(dev, "found Memory Device capability (0x%x)\n", offset);
923                         cxlm->memdev_regs = register_block;
924                         break;
925                 default:
926                         dev_dbg(dev, "Unknown cap ID: %d (0x%x)\n", cap_id, offset);
927                         break;
928                 }
929         }
930
931         if (!cxlm->status_regs || !cxlm->mbox_regs || !cxlm->memdev_regs) {
932                 dev_err(dev, "registers not found: %s%s%s\n",
933                         !cxlm->status_regs ? "status " : "",
934                         !cxlm->mbox_regs ? "mbox " : "",
935                         !cxlm->memdev_regs ? "memdev" : "");
936                 return -ENXIO;
937         }
938
939         return 0;
940 }
941
942 static int cxl_mem_setup_mailbox(struct cxl_mem *cxlm)
943 {
944         const int cap = readl(cxlm->mbox_regs + CXLDEV_MBOX_CAPS_OFFSET);
945
946         cxlm->payload_size =
947                 1 << FIELD_GET(CXLDEV_MBOX_CAP_PAYLOAD_SIZE_MASK, cap);
948
949         /*
950          * CXL 2.0 8.2.8.4.3 Mailbox Capabilities Register
951          *
952          * If the size is too small, mandatory commands will not work and so
953          * there's no point in going forward. If the size is too large, there's
954          * no harm is soft limiting it.
955          */
956         cxlm->payload_size = min_t(size_t, cxlm->payload_size, SZ_1M);
957         if (cxlm->payload_size < 256) {
958                 dev_err(&cxlm->pdev->dev, "Mailbox is too small (%zub)",
959                         cxlm->payload_size);
960                 return -ENXIO;
961         }
962
963         dev_dbg(&cxlm->pdev->dev, "Mailbox payload sized %zu",
964                 cxlm->payload_size);
965
966         return 0;
967 }
968
969 static struct cxl_mem *cxl_mem_create(struct pci_dev *pdev, u32 reg_lo,
970                                       u32 reg_hi)
971 {
972         struct device *dev = &pdev->dev;
973         struct cxl_mem *cxlm;
974         void __iomem *regs;
975         u64 offset;
976         u8 bar;
977         int rc;
978
979         cxlm = devm_kzalloc(&pdev->dev, sizeof(*cxlm), GFP_KERNEL);
980         if (!cxlm) {
981                 dev_err(dev, "No memory available\n");
982                 return NULL;
983         }
984
985         offset = ((u64)reg_hi << 32) | FIELD_GET(CXL_REGLOC_ADDR_MASK, reg_lo);
986         bar = FIELD_GET(CXL_REGLOC_BIR_MASK, reg_lo);
987
988         /* Basic sanity check that BAR is big enough */
989         if (pci_resource_len(pdev, bar) < offset) {
990                 dev_err(dev, "BAR%d: %pr: too small (offset: %#llx)\n", bar,
991                         &pdev->resource[bar], (unsigned long long)offset);
992                 return NULL;
993         }
994
995         rc = pcim_iomap_regions(pdev, BIT(bar), pci_name(pdev));
996         if (rc) {
997                 dev_err(dev, "failed to map registers\n");
998                 return NULL;
999         }
1000         regs = pcim_iomap_table(pdev)[bar];
1001
1002         mutex_init(&cxlm->mbox_mutex);
1003         cxlm->pdev = pdev;
1004         cxlm->regs = regs + offset;
1005         cxlm->enabled_cmds =
1006                 devm_kmalloc_array(dev, BITS_TO_LONGS(cxl_cmd_count),
1007                                    sizeof(unsigned long),
1008                                    GFP_KERNEL | __GFP_ZERO);
1009         if (!cxlm->enabled_cmds) {
1010                 dev_err(dev, "No memory available for bitmap\n");
1011                 return NULL;
1012         }
1013
1014         dev_dbg(dev, "Mapped CXL Memory Device resource\n");
1015         return cxlm;
1016 }
1017
1018 static int cxl_mem_dvsec(struct pci_dev *pdev, int dvsec)
1019 {
1020         int pos;
1021
1022         pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DVSEC);
1023         if (!pos)
1024                 return 0;
1025
1026         while (pos) {
1027                 u16 vendor, id;
1028
1029                 pci_read_config_word(pdev, pos + PCI_DVSEC_HEADER1, &vendor);
1030                 pci_read_config_word(pdev, pos + PCI_DVSEC_HEADER2, &id);
1031                 if (vendor == PCI_DVSEC_VENDOR_ID_CXL && dvsec == id)
1032                         return pos;
1033
1034                 pos = pci_find_next_ext_capability(pdev, pos,
1035                                                    PCI_EXT_CAP_ID_DVSEC);
1036         }
1037
1038         return 0;
1039 }
1040
1041 static struct cxl_memdev *to_cxl_memdev(struct device *dev)
1042 {
1043         return container_of(dev, struct cxl_memdev, dev);
1044 }
1045
1046 static void cxl_memdev_release(struct device *dev)
1047 {
1048         struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
1049
1050         percpu_ref_exit(&cxlmd->ops_active);
1051         ida_free(&cxl_memdev_ida, cxlmd->id);
1052         kfree(cxlmd);
1053 }
1054
1055 static char *cxl_memdev_devnode(struct device *dev, umode_t *mode, kuid_t *uid,
1056                                 kgid_t *gid)
1057 {
1058         return kasprintf(GFP_KERNEL, "cxl/%s", dev_name(dev));
1059 }
1060
1061 static ssize_t firmware_version_show(struct device *dev,
1062                                      struct device_attribute *attr, char *buf)
1063 {
1064         struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
1065         struct cxl_mem *cxlm = cxlmd->cxlm;
1066
1067         return sprintf(buf, "%.16s\n", cxlm->firmware_version);
1068 }
1069 static DEVICE_ATTR_RO(firmware_version);
1070
1071 static ssize_t payload_max_show(struct device *dev,
1072                                 struct device_attribute *attr, char *buf)
1073 {
1074         struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
1075         struct cxl_mem *cxlm = cxlmd->cxlm;
1076
1077         return sprintf(buf, "%zu\n", cxlm->payload_size);
1078 }
1079 static DEVICE_ATTR_RO(payload_max);
1080
1081 static ssize_t ram_size_show(struct device *dev, struct device_attribute *attr,
1082                              char *buf)
1083 {
1084         struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
1085         struct cxl_mem *cxlm = cxlmd->cxlm;
1086         unsigned long long len = range_len(&cxlm->ram_range);
1087
1088         return sprintf(buf, "%#llx\n", len);
1089 }
1090
1091 static struct device_attribute dev_attr_ram_size =
1092         __ATTR(size, 0444, ram_size_show, NULL);
1093
1094 static ssize_t pmem_size_show(struct device *dev, struct device_attribute *attr,
1095                               char *buf)
1096 {
1097         struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
1098         struct cxl_mem *cxlm = cxlmd->cxlm;
1099         unsigned long long len = range_len(&cxlm->pmem_range);
1100
1101         return sprintf(buf, "%#llx\n", len);
1102 }
1103
1104 static struct device_attribute dev_attr_pmem_size =
1105         __ATTR(size, 0444, pmem_size_show, NULL);
1106
1107 static struct attribute *cxl_memdev_attributes[] = {
1108         &dev_attr_firmware_version.attr,
1109         &dev_attr_payload_max.attr,
1110         NULL,
1111 };
1112
1113 static struct attribute *cxl_memdev_pmem_attributes[] = {
1114         &dev_attr_pmem_size.attr,
1115         NULL,
1116 };
1117
1118 static struct attribute *cxl_memdev_ram_attributes[] = {
1119         &dev_attr_ram_size.attr,
1120         NULL,
1121 };
1122
1123 static struct attribute_group cxl_memdev_attribute_group = {
1124         .attrs = cxl_memdev_attributes,
1125 };
1126
1127 static struct attribute_group cxl_memdev_ram_attribute_group = {
1128         .name = "ram",
1129         .attrs = cxl_memdev_ram_attributes,
1130 };
1131
1132 static struct attribute_group cxl_memdev_pmem_attribute_group = {
1133         .name = "pmem",
1134         .attrs = cxl_memdev_pmem_attributes,
1135 };
1136
1137 static const struct attribute_group *cxl_memdev_attribute_groups[] = {
1138         &cxl_memdev_attribute_group,
1139         &cxl_memdev_ram_attribute_group,
1140         &cxl_memdev_pmem_attribute_group,
1141         NULL,
1142 };
1143
1144 static const struct device_type cxl_memdev_type = {
1145         .name = "cxl_memdev",
1146         .release = cxl_memdev_release,
1147         .devnode = cxl_memdev_devnode,
1148         .groups = cxl_memdev_attribute_groups,
1149 };
1150
1151 static void cxlmdev_unregister(void *_cxlmd)
1152 {
1153         struct cxl_memdev *cxlmd = _cxlmd;
1154         struct device *dev = &cxlmd->dev;
1155
1156         percpu_ref_kill(&cxlmd->ops_active);
1157         cdev_device_del(&cxlmd->cdev, dev);
1158         wait_for_completion(&cxlmd->ops_dead);
1159         cxlmd->cxlm = NULL;
1160         put_device(dev);
1161 }
1162
1163 static void cxlmdev_ops_active_release(struct percpu_ref *ref)
1164 {
1165         struct cxl_memdev *cxlmd =
1166                 container_of(ref, typeof(*cxlmd), ops_active);
1167
1168         complete(&cxlmd->ops_dead);
1169 }
1170
1171 static int cxl_mem_add_memdev(struct cxl_mem *cxlm)
1172 {
1173         struct pci_dev *pdev = cxlm->pdev;
1174         struct cxl_memdev *cxlmd;
1175         struct device *dev;
1176         struct cdev *cdev;
1177         int rc;
1178
1179         cxlmd = kzalloc(sizeof(*cxlmd), GFP_KERNEL);
1180         if (!cxlmd)
1181                 return -ENOMEM;
1182         init_completion(&cxlmd->ops_dead);
1183
1184         /*
1185          * @cxlm is deallocated when the driver unbinds so operations
1186          * that are using it need to hold a live reference.
1187          */
1188         cxlmd->cxlm = cxlm;
1189         rc = percpu_ref_init(&cxlmd->ops_active, cxlmdev_ops_active_release, 0,
1190                              GFP_KERNEL);
1191         if (rc)
1192                 goto err_ref;
1193
1194         rc = ida_alloc_range(&cxl_memdev_ida, 0, CXL_MEM_MAX_DEVS, GFP_KERNEL);
1195         if (rc < 0)
1196                 goto err_id;
1197         cxlmd->id = rc;
1198
1199         dev = &cxlmd->dev;
1200         device_initialize(dev);
1201         dev->parent = &pdev->dev;
1202         dev->bus = &cxl_bus_type;
1203         dev->devt = MKDEV(cxl_mem_major, cxlmd->id);
1204         dev->type = &cxl_memdev_type;
1205         dev_set_name(dev, "mem%d", cxlmd->id);
1206
1207         cdev = &cxlmd->cdev;
1208         cdev_init(cdev, &cxl_memdev_fops);
1209
1210         rc = cdev_device_add(cdev, dev);
1211         if (rc)
1212                 goto err_add;
1213
1214         return devm_add_action_or_reset(dev->parent, cxlmdev_unregister, cxlmd);
1215
1216 err_add:
1217         ida_free(&cxl_memdev_ida, cxlmd->id);
1218 err_id:
1219         /*
1220          * Theoretically userspace could have already entered the fops,
1221          * so flush ops_active.
1222          */
1223         percpu_ref_kill(&cxlmd->ops_active);
1224         wait_for_completion(&cxlmd->ops_dead);
1225         percpu_ref_exit(&cxlmd->ops_active);
1226 err_ref:
1227         kfree(cxlmd);
1228
1229         return rc;
1230 }
1231
1232 static int cxl_xfer_log(struct cxl_mem *cxlm, uuid_t *uuid, u32 size, u8 *out)
1233 {
1234         u32 remaining = size;
1235         u32 offset = 0;
1236
1237         while (remaining) {
1238                 u32 xfer_size = min_t(u32, remaining, cxlm->payload_size);
1239                 struct cxl_mbox_get_log {
1240                         uuid_t uuid;
1241                         __le32 offset;
1242                         __le32 length;
1243                 } __packed log = {
1244                         .uuid = *uuid,
1245                         .offset = cpu_to_le32(offset),
1246                         .length = cpu_to_le32(xfer_size)
1247                 };
1248                 int rc;
1249
1250                 rc = cxl_mem_mbox_send_cmd(cxlm, CXL_MBOX_OP_GET_LOG, &log,
1251                                            sizeof(log), out, xfer_size);
1252                 if (rc < 0)
1253                         return rc;
1254
1255                 out += xfer_size;
1256                 remaining -= xfer_size;
1257                 offset += xfer_size;
1258         }
1259
1260         return 0;
1261 }
1262
1263 /**
1264  * cxl_walk_cel() - Walk through the Command Effects Log.
1265  * @cxlm: Device.
1266  * @size: Length of the Command Effects Log.
1267  * @cel: CEL
1268  *
1269  * Iterate over each entry in the CEL and determine if the driver supports the
1270  * command. If so, the command is enabled for the device and can be used later.
1271  */
1272 static void cxl_walk_cel(struct cxl_mem *cxlm, size_t size, u8 *cel)
1273 {
1274         struct cel_entry {
1275                 __le16 opcode;
1276                 __le16 effect;
1277         } __packed * cel_entry;
1278         const int cel_entries = size / sizeof(*cel_entry);
1279         int i;
1280
1281         cel_entry = (struct cel_entry *)cel;
1282
1283         for (i = 0; i < cel_entries; i++) {
1284                 u16 opcode = le16_to_cpu(cel_entry[i].opcode);
1285                 struct cxl_mem_command *cmd = cxl_mem_find_command(opcode);
1286
1287                 if (!cmd) {
1288                         dev_dbg(&cxlm->pdev->dev,
1289                                 "Opcode 0x%04x unsupported by driver", opcode);
1290                         continue;
1291                 }
1292
1293                 set_bit(cmd->info.id, cxlm->enabled_cmds);
1294         }
1295 }
1296
1297 struct cxl_mbox_get_supported_logs {
1298         __le16 entries;
1299         u8 rsvd[6];
1300         struct gsl_entry {
1301                 uuid_t uuid;
1302                 __le32 size;
1303         } __packed entry[];
1304 } __packed;
1305
1306 static struct cxl_mbox_get_supported_logs *cxl_get_gsl(struct cxl_mem *cxlm)
1307 {
1308         struct cxl_mbox_get_supported_logs *ret;
1309         int rc;
1310
1311         ret = kvmalloc(cxlm->payload_size, GFP_KERNEL);
1312         if (!ret)
1313                 return ERR_PTR(-ENOMEM);
1314
1315         rc = cxl_mem_mbox_send_cmd(cxlm, CXL_MBOX_OP_GET_SUPPORTED_LOGS, NULL,
1316                                    0, ret, cxlm->payload_size);
1317         if (rc < 0) {
1318                 kvfree(ret);
1319                 return ERR_PTR(rc);
1320         }
1321
1322         return ret;
1323 }
1324
1325 /**
1326  * cxl_mem_enumerate_cmds() - Enumerate commands for a device.
1327  * @cxlm: The device.
1328  *
1329  * Returns 0 if enumerate completed successfully.
1330  *
1331  * CXL devices have optional support for certain commands. This function will
1332  * determine the set of supported commands for the hardware and update the
1333  * enabled_cmds bitmap in the @cxlm.
1334  */
1335 static int cxl_mem_enumerate_cmds(struct cxl_mem *cxlm)
1336 {
1337         struct cxl_mbox_get_supported_logs *gsl;
1338         struct device *dev = &cxlm->pdev->dev;
1339         struct cxl_mem_command *cmd;
1340         int i, rc;
1341
1342         gsl = cxl_get_gsl(cxlm);
1343         if (IS_ERR(gsl))
1344                 return PTR_ERR(gsl);
1345
1346         rc = -ENOENT;
1347         for (i = 0; i < le16_to_cpu(gsl->entries); i++) {
1348                 u32 size = le32_to_cpu(gsl->entry[i].size);
1349                 uuid_t uuid = gsl->entry[i].uuid;
1350                 u8 *log;
1351
1352                 dev_dbg(dev, "Found LOG type %pU of size %d", &uuid, size);
1353
1354                 if (!uuid_equal(&uuid, &log_uuid[CEL_UUID]))
1355                         continue;
1356
1357                 log = kvmalloc(size, GFP_KERNEL);
1358                 if (!log) {
1359                         rc = -ENOMEM;
1360                         goto out;
1361                 }
1362
1363                 rc = cxl_xfer_log(cxlm, &uuid, size, log);
1364                 if (rc) {
1365                         kvfree(log);
1366                         goto out;
1367                 }
1368
1369                 cxl_walk_cel(cxlm, size, log);
1370                 kvfree(log);
1371
1372                 /* In case CEL was bogus, enable some default commands. */
1373                 cxl_for_each_cmd(cmd)
1374                         if (cmd->flags & CXL_CMD_FLAG_FORCE_ENABLE)
1375                                 set_bit(cmd->info.id, cxlm->enabled_cmds);
1376
1377                 /* Found the required CEL */
1378                 rc = 0;
1379         }
1380
1381 out:
1382         kvfree(gsl);
1383         return rc;
1384 }
1385
1386 /**
1387  * cxl_mem_identify() - Send the IDENTIFY command to the device.
1388  * @cxlm: The device to identify.
1389  *
1390  * Return: 0 if identify was executed successfully.
1391  *
1392  * This will dispatch the identify command to the device and on success populate
1393  * structures to be exported to sysfs.
1394  */
1395 static int cxl_mem_identify(struct cxl_mem *cxlm)
1396 {
1397         struct cxl_mbox_identify {
1398                 char fw_revision[0x10];
1399                 __le64 total_capacity;
1400                 __le64 volatile_capacity;
1401                 __le64 persistent_capacity;
1402                 __le64 partition_align;
1403                 __le16 info_event_log_size;
1404                 __le16 warning_event_log_size;
1405                 __le16 failure_event_log_size;
1406                 __le16 fatal_event_log_size;
1407                 __le32 lsa_size;
1408                 u8 poison_list_max_mer[3];
1409                 __le16 inject_poison_limit;
1410                 u8 poison_caps;
1411                 u8 qos_telemetry_caps;
1412         } __packed id;
1413         int rc;
1414
1415         rc = cxl_mem_mbox_send_cmd(cxlm, CXL_MBOX_OP_IDENTIFY, NULL, 0, &id,
1416                                    sizeof(id));
1417         if (rc < 0)
1418                 return rc;
1419
1420         /*
1421          * TODO: enumerate DPA map, as 'ram' and 'pmem' do not alias.
1422          * For now, only the capacity is exported in sysfs
1423          */
1424         cxlm->ram_range.start = 0;
1425         cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) - 1;
1426
1427         cxlm->pmem_range.start = 0;
1428         cxlm->pmem_range.end = le64_to_cpu(id.persistent_capacity) - 1;
1429
1430         memcpy(cxlm->firmware_version, id.fw_revision, sizeof(id.fw_revision));
1431
1432         return 0;
1433 }
1434
1435 static int cxl_mem_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1436 {
1437         struct device *dev = &pdev->dev;
1438         struct cxl_mem *cxlm = NULL;
1439         u32 regloc_size, regblocks;
1440         int rc, regloc, i;
1441
1442         rc = pcim_enable_device(pdev);
1443         if (rc)
1444                 return rc;
1445
1446         regloc = cxl_mem_dvsec(pdev, PCI_DVSEC_ID_CXL_REGLOC_OFFSET);
1447         if (!regloc) {
1448                 dev_err(dev, "register location dvsec not found\n");
1449                 return -ENXIO;
1450         }
1451
1452         /* Get the size of the Register Locator DVSEC */
1453         pci_read_config_dword(pdev, regloc + PCI_DVSEC_HEADER1, &regloc_size);
1454         regloc_size = FIELD_GET(PCI_DVSEC_HEADER1_LENGTH_MASK, regloc_size);
1455
1456         regloc += PCI_DVSEC_ID_CXL_REGLOC_BLOCK1_OFFSET;
1457         regblocks = (regloc_size - PCI_DVSEC_ID_CXL_REGLOC_BLOCK1_OFFSET) / 8;
1458
1459         for (i = 0; i < regblocks; i++, regloc += 8) {
1460                 u32 reg_lo, reg_hi;
1461                 u8 reg_type;
1462
1463                 /* "register low and high" contain other bits */
1464                 pci_read_config_dword(pdev, regloc, &reg_lo);
1465                 pci_read_config_dword(pdev, regloc + 4, &reg_hi);
1466
1467                 reg_type = FIELD_GET(CXL_REGLOC_RBI_MASK, reg_lo);
1468
1469                 if (reg_type == CXL_REGLOC_RBI_MEMDEV) {
1470                         cxlm = cxl_mem_create(pdev, reg_lo, reg_hi);
1471                         break;
1472                 }
1473         }
1474
1475         if (!cxlm)
1476                 return -ENODEV;
1477
1478         rc = cxl_mem_setup_regs(cxlm);
1479         if (rc)
1480                 return rc;
1481
1482         rc = cxl_mem_setup_mailbox(cxlm);
1483         if (rc)
1484                 return rc;
1485
1486         rc = cxl_mem_enumerate_cmds(cxlm);
1487         if (rc)
1488                 return rc;
1489
1490         rc = cxl_mem_identify(cxlm);
1491         if (rc)
1492                 return rc;
1493
1494         return cxl_mem_add_memdev(cxlm);
1495 }
1496
1497 static const struct pci_device_id cxl_mem_pci_tbl[] = {
1498         /* PCI class code for CXL.mem Type-3 Devices */
1499         { PCI_DEVICE_CLASS((PCI_CLASS_MEMORY_CXL << 8 | CXL_MEMORY_PROGIF), ~0)},
1500         { /* terminate list */ },
1501 };
1502 MODULE_DEVICE_TABLE(pci, cxl_mem_pci_tbl);
1503
1504 static struct pci_driver cxl_mem_driver = {
1505         .name                   = KBUILD_MODNAME,
1506         .id_table               = cxl_mem_pci_tbl,
1507         .probe                  = cxl_mem_probe,
1508         .driver = {
1509                 .probe_type     = PROBE_PREFER_ASYNCHRONOUS,
1510         },
1511 };
1512
1513 static __init int cxl_mem_init(void)
1514 {
1515         struct dentry *mbox_debugfs;
1516         dev_t devt;
1517         int rc;
1518
1519         rc = alloc_chrdev_region(&devt, 0, CXL_MEM_MAX_DEVS, "cxl");
1520         if (rc)
1521                 return rc;
1522
1523         cxl_mem_major = MAJOR(devt);
1524
1525         rc = pci_register_driver(&cxl_mem_driver);
1526         if (rc) {
1527                 unregister_chrdev_region(MKDEV(cxl_mem_major, 0),
1528                                          CXL_MEM_MAX_DEVS);
1529                 return rc;
1530         }
1531
1532         cxl_debugfs = debugfs_create_dir("cxl", NULL);
1533         mbox_debugfs = debugfs_create_dir("mbox", cxl_debugfs);
1534         debugfs_create_bool("raw_allow_all", 0600, mbox_debugfs,
1535                             &cxl_raw_allow_all);
1536
1537         return 0;
1538 }
1539
1540 static __exit void cxl_mem_exit(void)
1541 {
1542         debugfs_remove_recursive(cxl_debugfs);
1543         pci_unregister_driver(&cxl_mem_driver);
1544         unregister_chrdev_region(MKDEV(cxl_mem_major, 0), CXL_MEM_MAX_DEVS);
1545 }
1546
1547 MODULE_LICENSE("GPL v2");
1548 module_init(cxl_mem_init);
1549 module_exit(cxl_mem_exit);
1550 MODULE_IMPORT_NS(CXL);
This page took 0.120117 seconds and 4 git commands to generate.