Lines Matching +full:activate +full:- +full:to +full:- +full:activate

1 // SPDX-License-Identifier: GPL-2.0-only
4 #include <linux/io-64-nonatomic-lo-hi.h>
29 ida_free(&cxl_memdev_ida, cxlmd->id); in cxl_memdev_release()
43 struct cxl_dev_state *cxlds = cxlmd->cxlds; in firmware_version_show()
48 return sysfs_emit(buf, "%.16s\n", mds->firmware_version); in firmware_version_show()
56 struct cxl_dev_state *cxlds = cxlmd->cxlds; in payload_max_show()
61 return sysfs_emit(buf, "%zu\n", mds->payload_size); in payload_max_show()
69 struct cxl_dev_state *cxlds = cxlmd->cxlds; in label_storage_size_show()
74 return sysfs_emit(buf, "%zu\n", mds->lsa_size); in label_storage_size_show()
82 struct cxl_dev_state *cxlds = cxlmd->cxlds; in ram_size_show()
83 unsigned long long len = resource_size(&cxlds->ram_res); in ram_size_show()
95 struct cxl_dev_state *cxlds = cxlmd->cxlds; in pmem_size_show()
96 unsigned long long len = resource_size(&cxlds->pmem_res); in pmem_size_show()
108 struct cxl_dev_state *cxlds = cxlmd->cxlds; in serial_show()
110 return sysfs_emit(buf, "%#llx\n", cxlds->serial); in serial_show()
126 struct cxl_dev_state *cxlds = cxlmd->cxlds; in security_state_show()
128 unsigned long state = mds->security.state; in security_state_show()
132 mutex_lock(&mds->mbox_mutex); in security_state_show()
133 if (mds->security.sanitize_active) in security_state_show()
135 mutex_unlock(&mds->mbox_mutex); in security_state_show()
162 return -EINVAL; in security_sanitize_store()
182 return -EINVAL; in security_erase_store()
195 struct cxl_dev_state *cxlds = cxlmd->cxlds; in cxl_get_poison_by_memdev()
200 if (resource_size(&cxlds->pmem_res)) { in cxl_get_poison_by_memdev()
201 offset = cxlds->pmem_res.start; in cxl_get_poison_by_memdev()
202 length = resource_size(&cxlds->pmem_res); in cxl_get_poison_by_memdev()
207 if (resource_size(&cxlds->ram_res)) { in cxl_get_poison_by_memdev()
208 offset = cxlds->ram_res.start; in cxl_get_poison_by_memdev()
209 length = resource_size(&cxlds->ram_res); in cxl_get_poison_by_memdev()
215 if (rc == -EFAULT) in cxl_get_poison_by_memdev()
226 port = cxlmd->endpoint; in cxl_trigger_poison_list()
228 return -EINVAL; in cxl_trigger_poison_list()
241 /* No regions mapped to this memdev */ in cxl_trigger_poison_list()
263 u64 dpa = ctx->dpa; in __cxl_dpa_to_region()
269 if (!cxled->dpa_res || !resource_size(cxled->dpa_res)) in __cxl_dpa_to_region()
272 if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start) in __cxl_dpa_to_region()
276 dev_name(&cxled->cxld.region->dev)); in __cxl_dpa_to_region()
278 ctx->cxlr = cxled->cxld.region; in __cxl_dpa_to_region()
291 port = cxlmd->endpoint; in cxl_dpa_to_region()
293 device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); in cxl_dpa_to_region()
300 struct cxl_dev_state *cxlds = cxlmd->cxlds; in cxl_validate_poison_dpa()
305 if (!resource_size(&cxlds->dpa_res)) { in cxl_validate_poison_dpa()
306 dev_dbg(cxlds->dev, "device has no dpa resource\n"); in cxl_validate_poison_dpa()
307 return -EINVAL; in cxl_validate_poison_dpa()
309 if (dpa < cxlds->dpa_res.start || dpa > cxlds->dpa_res.end) { in cxl_validate_poison_dpa()
310 dev_dbg(cxlds->dev, "dpa:0x%llx not in resource:%pR\n", in cxl_validate_poison_dpa()
311 dpa, &cxlds->dpa_res); in cxl_validate_poison_dpa()
312 return -EINVAL; in cxl_validate_poison_dpa()
315 dev_dbg(cxlds->dev, "dpa:0x%llx is not 64-byte aligned\n", dpa); in cxl_validate_poison_dpa()
316 return -EINVAL; in cxl_validate_poison_dpa()
324 struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); in cxl_inject_poison()
360 dev_warn_once(mds->cxlds.dev, in cxl_inject_poison()
362 dev_name(&cxlr->dev)); in cxl_inject_poison()
379 struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); in cxl_clear_poison()
405 * is defined to accept 64 bytes of write-data, along with the in cxl_clear_poison()
406 * address to clear. This driver uses zeroes as write-data. in cxl_clear_poison()
424 dev_warn_once(mds->cxlds.dev, in cxl_clear_poison()
426 dev_name(&cxlr->dev)); in cxl_clear_poison()
454 struct cxl_dev_state *cxlds = cxlmd->cxlds; in pmem_qos_class_show()
457 return sysfs_emit(buf, "%d\n", mds->pmem_perf.qos_class); in pmem_qos_class_show()
473 struct cxl_dev_state *cxlds = cxlmd->cxlds; in ram_qos_class_show()
476 return sysfs_emit(buf, "%d\n", mds->ram_perf.qos_class); in ram_qos_class_show()
500 return a->mode; in cxl_memdev_visible()
512 struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); in cxl_ram_visible()
515 if (mds->ram_perf.qos_class == CXL_QOS_CLASS_INVALID) in cxl_ram_visible()
518 return a->mode; in cxl_ram_visible()
531 struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); in cxl_pmem_visible()
534 if (mds->pmem_perf.qos_class == CXL_QOS_CLASS_INVALID) in cxl_pmem_visible()
537 return a->mode; in cxl_pmem_visible()
551 struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); in cxl_memdev_security_visible()
554 !test_bit(CXL_SEC_ENABLED_SANITIZE, mds->security.enabled_cmds)) in cxl_memdev_security_visible()
558 !test_bit(CXL_SEC_ENABLED_SECURE_ERASE, mds->security.enabled_cmds)) in cxl_memdev_security_visible()
561 return a->mode; in cxl_memdev_security_visible()
580 sysfs_update_group(&cxlmd->dev.kobj, &cxl_memdev_ram_attribute_group); in cxl_memdev_update_perf()
581 sysfs_update_group(&cxlmd->dev.kobj, &cxl_memdev_pmem_attribute_group); in cxl_memdev_update_perf()
594 return dev->type == &cxl_memdev_type; in is_cxl_memdev()
599 * set_exclusive_cxl_commands() - atomically disable user cxl commands
600 * @mds: The device state to operate on
601 * @cmds: bitmap of commands to mark exclusive
603 * Grab the cxl_memdev_rwsem in write mode to flush in-flight
611 bitmap_or(mds->exclusive_cmds, mds->exclusive_cmds, cmds, in set_exclusive_cxl_commands()
618 * clear_exclusive_cxl_commands() - atomically enable user cxl commands
619 * @mds: The device state to modify
620 * @cmds: bitmap of commands to mark available for userspace
626 bitmap_andnot(mds->exclusive_cmds, mds->exclusive_cmds, cmds, in clear_exclusive_cxl_commands()
637 cxlmd->cxlds = NULL; in cxl_memdev_shutdown()
644 struct device *dev = &cxlmd->dev; in cxl_memdev_unregister()
646 cdev_device_del(&cxlmd->cdev, dev); in cxl_memdev_unregister()
656 device_release_driver(&cxlmd->dev); in detach_memdev()
657 put_device(&cxlmd->dev); in detach_memdev()
672 return ERR_PTR(-ENOMEM); in cxl_memdev_alloc()
674 rc = ida_alloc_max(&cxl_memdev_ida, CXL_MEM_MAX_DEVS - 1, GFP_KERNEL); in cxl_memdev_alloc()
677 cxlmd->id = rc; in cxl_memdev_alloc()
678 cxlmd->depth = -1; in cxl_memdev_alloc()
680 dev = &cxlmd->dev; in cxl_memdev_alloc()
682 lockdep_set_class(&dev->mutex, &cxl_memdev_key); in cxl_memdev_alloc()
683 dev->parent = cxlds->dev; in cxl_memdev_alloc()
684 dev->bus = &cxl_bus_type; in cxl_memdev_alloc()
685 dev->devt = MKDEV(cxl_mem_major, cxlmd->id); in cxl_memdev_alloc()
686 dev->type = &cxl_memdev_type; in cxl_memdev_alloc()
688 INIT_WORK(&cxlmd->detach_work, detach_memdev); in cxl_memdev_alloc()
690 cdev = &cxlmd->cdev; in cxl_memdev_alloc()
708 return -ENOTTY; in __cxl_memdev_ioctl()
715 struct cxl_memdev *cxlmd = file->private_data; in cxl_memdev_ioctl()
717 int rc = -ENXIO; in cxl_memdev_ioctl()
720 cxlds = cxlmd->cxlds; in cxl_memdev_ioctl()
721 if (cxlds && cxlds->type == CXL_DEVTYPE_CLASSMEM) in cxl_memdev_ioctl()
731 container_of(inode->i_cdev, typeof(*cxlmd), cdev); in cxl_memdev_open()
733 get_device(&cxlmd->dev); in cxl_memdev_open()
734 file->private_data = cxlmd; in cxl_memdev_open()
742 container_of(inode->i_cdev, typeof(*cxlmd), cdev); in cxl_memdev_release_file()
744 put_device(&cxlmd->dev); in cxl_memdev_release_file()
750 * cxl_mem_get_fw_info - Get Firmware info
757 * See CXL-3.0 8.2.9.3.1 Get FW Info
775 mds->fw.num_slots = info.num_slots; in cxl_mem_get_fw_info()
776 mds->fw.cur_slot = FIELD_GET(CXL_FW_INFO_SLOT_INFO_CUR_MASK, in cxl_mem_get_fw_info()
783 * cxl_mem_activate_fw - Activate Firmware
785 * @slot: slot number to activate
787 * Activate firmware in a given slot for the device specified.
791 * See CXL-3.0 8.2.9.3.3 Activate FW
795 struct cxl_mbox_activate_fw activate; in cxl_mem_activate_fw() local
798 if (slot == 0 || slot > mds->fw.num_slots) in cxl_mem_activate_fw()
799 return -EINVAL; in cxl_mem_activate_fw()
803 .size_in = sizeof(activate), in cxl_mem_activate_fw()
804 .payload_in = &activate, in cxl_mem_activate_fw()
808 activate.action = CXL_FW_ACTIVATE_OFFLINE; in cxl_mem_activate_fw()
809 activate.slot = slot; in cxl_mem_activate_fw()
815 * cxl_mem_abort_fw_xfer - Abort an in-progress FW transfer
818 * Abort an in-progress firmware transfer for the device specified.
822 * See CXL-3.0 8.2.9.3.2 Transfer FW
832 return -ENOMEM; in cxl_mem_abort_fw_xfer()
843 transfer->action = CXL_FW_TRANSFER_ACTION_ABORT; in cxl_mem_abort_fw_xfer()
852 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_cleanup()
854 mds->fw.next_slot = 0; in cxl_fw_cleanup()
859 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_do_cancel()
860 struct cxl_dev_state *cxlds = &mds->cxlds; in cxl_fw_do_cancel()
861 struct cxl_memdev *cxlmd = cxlds->cxlmd; in cxl_fw_do_cancel()
866 dev_err(&cxlmd->dev, "Error aborting FW transfer: %d\n", rc); in cxl_fw_do_cancel()
874 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_prepare()
880 mds->fw.oneshot = struct_size(transfer, data, size) < in cxl_fw_prepare()
881 mds->payload_size; in cxl_fw_prepare()
890 if (test_and_clear_bit(CXL_FW_CANCEL, mds->fw.state)) in cxl_fw_prepare()
899 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_write()
900 struct cxl_dev_state *cxlds = &mds->cxlds; in cxl_fw_write()
901 struct cxl_memdev *cxlmd = cxlds->cxlmd; in cxl_fw_write()
910 /* Offset has to be aligned to 128B (CXL-3.0 8.2.9.3.2 Table 8-57) */ in cxl_fw_write()
912 dev_err(&cxlmd->dev, in cxl_fw_write()
919 * Pick transfer size based on mds->payload_size @size must bw 128-byte in cxl_fw_write()
920 * aligned, ->payload_size is a power of 2 starting at 256 bytes, and in cxl_fw_write()
924 cur_size = min_t(size_t, size, mds->payload_size - sizeof(*transfer)); in cxl_fw_write()
926 remaining = size - cur_size; in cxl_fw_write()
929 if (test_and_clear_bit(CXL_FW_CANCEL, mds->fw.state)) in cxl_fw_write()
933 * Slot numbers are 1-indexed in cxl_fw_write()
934 * cur_slot is the 0-indexed next_slot (i.e. 'cur_slot - 1 + 1') in cxl_fw_write()
935 * Check for rollover using modulo, and 1-index it by adding 1 in cxl_fw_write()
937 mds->fw.next_slot = (mds->fw.cur_slot % mds->fw.num_slots) + 1; in cxl_fw_write()
944 transfer->offset = cpu_to_le32(offset / CXL_FW_TRANSFER_ALIGNMENT); in cxl_fw_write()
945 memcpy(transfer->data, data + offset, cur_size); in cxl_fw_write()
946 if (mds->fw.oneshot) { in cxl_fw_write()
947 transfer->action = CXL_FW_TRANSFER_ACTION_FULL; in cxl_fw_write()
948 transfer->slot = mds->fw.next_slot; in cxl_fw_write()
951 transfer->action = CXL_FW_TRANSFER_ACTION_INITIATE; in cxl_fw_write()
953 transfer->action = CXL_FW_TRANSFER_ACTION_END; in cxl_fw_write()
954 transfer->slot = mds->fw.next_slot; in cxl_fw_write()
956 transfer->action = CXL_FW_TRANSFER_ACTION_CONTINUE; in cxl_fw_write()
976 /* Activate FW if oneshot or if the last slice was written */ in cxl_fw_write()
977 if (mds->fw.oneshot || remaining == 0) { in cxl_fw_write()
978 dev_dbg(&cxlmd->dev, "Activating firmware slot: %d\n", in cxl_fw_write()
979 mds->fw.next_slot); in cxl_fw_write()
980 rc = cxl_mem_activate_fw(mds, mds->fw.next_slot); in cxl_fw_write()
982 dev_err(&cxlmd->dev, "Error activating firmware: %d\n", in cxl_fw_write()
998 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_poll_complete()
1002 * No need to wait for completions here - any errors would've been in cxl_fw_poll_complete()
1003 * reported and handled during the ->write() call(s). in cxl_fw_poll_complete()
1006 if (test_and_clear_bit(CXL_FW_CANCEL, mds->fw.state)) in cxl_fw_poll_complete()
1014 struct cxl_memdev_state *mds = fwl->dd_handle; in cxl_fw_cancel()
1016 set_bit(CXL_FW_CANCEL, mds->fw.state); in cxl_fw_cancel()
1034 struct cxl_dev_state *cxlds = &mds->cxlds; in devm_cxl_setup_fw_upload()
1035 struct device *dev = &cxlds->cxlmd->dev; in devm_cxl_setup_fw_upload()
1038 if (!test_bit(CXL_MEM_COMMAND_ID_GET_FW_INFO, mds->enabled_cmds)) in devm_cxl_setup_fw_upload()
1070 dev = &cxlmd->dev; in devm_cxl_add_memdev()
1071 rc = dev_set_name(dev, "mem%d", cxlmd->id); in devm_cxl_add_memdev()
1076 * Activate ioctl operations, no cxl_memdev_rwsem manipulation in devm_cxl_add_memdev()
1079 cxlmd->cxlds = cxlds; in devm_cxl_add_memdev()
1080 cxlds->cxlmd = cxlmd; in devm_cxl_add_memdev()
1082 cdev = &cxlmd->cdev; in devm_cxl_add_memdev()
1112 mutex_lock(&mds->mbox_mutex); in sanitize_teardown_notifier()
1113 state = mds->security.sanitize_node; in sanitize_teardown_notifier()
1114 mds->security.sanitize_node = NULL; in sanitize_teardown_notifier()
1115 mutex_unlock(&mds->mbox_mutex); in sanitize_teardown_notifier()
1117 cancel_delayed_work_sync(&mds->security.poll_dwork); in sanitize_teardown_notifier()
1124 struct cxl_dev_state *cxlds = cxlmd->cxlds; in devm_cxl_sanitize_setup_notifier()
1128 if (!test_bit(CXL_SEC_ENABLED_SANITIZE, mds->security.enabled_cmds)) in devm_cxl_sanitize_setup_notifier()
1132 * Note, the expectation is that @cxlmd would have failed to be in devm_cxl_sanitize_setup_notifier()
1135 sec = sysfs_get_dirent(cxlmd->dev.kobj.sd, "security"); in devm_cxl_sanitize_setup_notifier()
1137 return -ENOENT; in devm_cxl_sanitize_setup_notifier()
1138 mds->security.sanitize_node = sysfs_get_dirent(sec, "state"); in devm_cxl_sanitize_setup_notifier()
1140 if (!mds->security.sanitize_node) in devm_cxl_sanitize_setup_notifier()
1141 return -ENOENT; in devm_cxl_sanitize_setup_notifier()