From: Dave Jiang Date: Fri, 14 Mar 2025 23:11:42 +0000 (-0700) Subject: Merge branch 'for-6.15/dirty-shutdown' into cxl-for-next2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d781a45270a8acabe2576cc5c47dc33180eca87c;p=users%2Fwilly%2Flinux.git Merge branch 'for-6.15/dirty-shutdown' into cxl-for-next2 Add support for Global Persistent Flush (GPF) and dirty shutdown accounting. --- d781a45270a8acabe2576cc5c47dc33180eca87c diff --cc drivers/cxl/core/core.h index 83c690ca6fad,8f2eb76a3c8c..4d8316f97ed8 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@@ -115,7 -115,6 +115,8 @@@ bool cxl_need_node_perf_attrs_update(in int cxl_port_get_switch_dport_bandwidth(struct cxl_port *port, struct access_coordinate *c); +int cxl_ras_init(void); +void cxl_ras_exit(void); + int cxl_gpf_port_setup(struct device *dport_dev, struct cxl_port *port); #endif /* __CXL_CORE_H__ */ diff --cc drivers/cxl/core/mbox.c index 7299cd3a0155,ec7b70ae5c06..85a1c1860a03 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@@ -1274,14 -1298,55 +1274,53 @@@ int cxl_mem_dpa_fetch(struct cxl_memdev return rc; } - rc = add_dpa_res(dev, &cxlds->dpa_res, &cxlds->ram_res, 0, - mds->active_volatile_bytes, "ram"); - if (rc) - return rc; - return add_dpa_res(dev, &cxlds->dpa_res, &cxlds->pmem_res, - mds->active_volatile_bytes, - mds->active_persistent_bytes, "pmem"); + add_part(info, 0, mds->active_volatile_bytes, CXL_PARTMODE_RAM); + add_part(info, mds->active_volatile_bytes, mds->active_persistent_bytes, + CXL_PARTMODE_PMEM); + + return 0; } -EXPORT_SYMBOL_NS_GPL(cxl_mem_create_range_info, "CXL"); +EXPORT_SYMBOL_NS_GPL(cxl_mem_dpa_fetch, "CXL"); + int cxl_get_dirty_count(struct cxl_memdev_state *mds, u32 *count) + { + struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox; + struct cxl_mbox_get_health_info_out hi; + struct cxl_mbox_cmd mbox_cmd; + int rc; + + mbox_cmd = (struct cxl_mbox_cmd) { + .opcode = CXL_MBOX_OP_GET_HEALTH_INFO, + .size_out = sizeof(hi), + .payload_out = &hi, + }; + + rc = cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); + if (!rc) + *count = le32_to_cpu(hi.dirty_shutdown_cnt); + + return rc; + } + EXPORT_SYMBOL_NS_GPL(cxl_get_dirty_count, "CXL"); + + int cxl_arm_dirty_shutdown(struct cxl_memdev_state *mds) + { + struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox; + struct cxl_mbox_cmd mbox_cmd; + struct cxl_mbox_set_shutdown_state_in in = { + .state = 1 + }; + + mbox_cmd = (struct cxl_mbox_cmd) { + .opcode = CXL_MBOX_OP_SET_SHUTDOWN_STATE, + .size_in = sizeof(in), + .payload_in = &in, + }; + + return cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); + } + EXPORT_SYMBOL_NS_GPL(cxl_arm_dirty_shutdown, "CXL"); + int cxl_set_timestamp(struct cxl_memdev_state *mds) { struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox;