}
 EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, CXL);
 
+int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)
+{
+       struct cxl_dev_state *cxlds = cxlmd->cxlds;
+       struct cxl_mbox_clear_poison clear;
+       struct cxl_mbox_cmd mbox_cmd;
+       int rc;
+
+       if (!IS_ENABLED(CONFIG_DEBUG_FS))
+               return 0;
+
+       rc = down_read_interruptible(&cxl_dpa_rwsem);
+       if (rc)
+               return rc;
+
+       rc = cxl_validate_poison_dpa(cxlmd, dpa);
+       if (rc)
+               goto out;
+
+       /*
+        * In CXL 3.0 Spec 8.2.9.8.4.3, the Clear Poison mailbox command
+        * is defined to accept 64 bytes of write-data, along with the
+        * address to clear. This driver uses zeroes as write-data.
+        */
+       clear = (struct cxl_mbox_clear_poison) {
+               .address = cpu_to_le64(dpa)
+       };
+
+       mbox_cmd = (struct cxl_mbox_cmd) {
+               .opcode = CXL_MBOX_OP_CLEAR_POISON,
+               .size_in = sizeof(clear),
+               .payload_in = &clear,
+       };
+
+       rc = cxl_internal_send_cmd(cxlds, &mbox_cmd);
+       if (rc)
+               goto out;
+out:
+       up_read(&cxl_dpa_rwsem);
+
+       return rc;
+}
+EXPORT_SYMBOL_NS_GPL(cxl_clear_poison, CXL);
+
 static struct attribute *cxl_memdev_attributes[] = {
        &dev_attr_serial.attr,
        &dev_attr_firmware_version.attr,
 
        __le64 address;
 };
 
+/* Clear Poison  CXL 3.0 Spec 8.2.9.8.4.3 */
+struct cxl_mbox_clear_poison {
+       __le64 address;
+       u8 write_data[CXL_POISON_LEN_MULT];
+} __packed;
+
 /**
  * struct cxl_mem_command - Driver representation of a memory device command
  * @info: Command information as it exists for the UAPI
                       struct cxl_region *cxlr);
 int cxl_trigger_poison_list(struct cxl_memdev *cxlmd);
 int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa);
+int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa);
 
 #ifdef CONFIG_CXL_SUSPEND
 void cxl_mem_active_inc(void);