From nobody Mon Feb 9 09:24:41 2026 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78554185B4D; Wed, 11 Sep 2024 09:07:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.176.79.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726045642; cv=none; b=MtIrzz234nNSYRa9cphzq+sVgHiJQFOqZOLJFKw0J2DZ5X5YxbNkCLK1qYqgfLTTIVkM7XrE8vvlDGENeBTtXjQmvSdF+Xt7XhQeFc52ptQyR0EEa/518RJGpkiOUD5QGPnC70XgGqYCqGUmMitRyNFEX9XGU2jwI88bXGOAcQI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726045642; c=relaxed/simple; bh=2RiEQxClHwYeX0h2bMNc92gSkY9x5D76kMJtmP3Hloo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=S+n0R0ABoXmWFLjb0NL3CLBKFP3xUD2qHUdL9cAhJPc6dUDcvrTLtu5hRAOT0HdVr+sFfnUJeOHEXa960lip9q23TjGA/xjn8+L92Pnb4ud+E0s+vaMD3EX4AgVdd7m7Uvm8W9OZnN4ma+/PDG+dsQudlYKEHfaYy8n50DGEhC4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=185.176.79.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4X3ZMp39nxz6K6R1; Wed, 11 Sep 2024 17:02:30 +0800 (CST) Received: from frapeml500007.china.huawei.com (unknown [7.182.85.172]) by mail.maildlp.com (Postfix) with ESMTPS id 89E9E1400F4; Wed, 11 Sep 2024 17:07:17 +0800 (CST) Received: from P_UKIT01-A7bmah.china.huawei.com (10.195.245.151) by frapeml500007.china.huawei.com (7.182.85.172) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 11 Sep 2024 11:07:14 +0200 From: To: , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v12 06/17] cxl: Refactor user ioctl command path from mds to mailbox Date: Wed, 11 Sep 2024 10:04:35 +0100 Message-ID: <20240911090447.751-7-shiju.jose@huawei.com> X-Mailer: git-send-email 2.43.0.windows.1 In-Reply-To: <20240911090447.751-1-shiju.jose@huawei.com> References: <20240911090447.751-1-shiju.jose@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: lhrpeml500003.china.huawei.com (7.191.162.67) To frapeml500007.china.huawei.com (7.182.85.172) Content-Type: text/plain; charset="utf-8" From: Dave Jiang With 'struct cxl_mailbox' context introduced, the helper functions cxl_query_cmd() and cxl_send_cmd() can take a cxl_mailbox directly rather than a cxl_memdev parameter. Refactor to use cxl_mailbox directly. Signed-off-by: Dave Jiang --- drivers/cxl/core/core.h | 6 +- drivers/cxl/core/mbox.c | 120 ++++++++++++++++++------------------ drivers/cxl/core/memdev.c | 39 ++++++++---- drivers/cxl/cxlmem.h | 6 +- drivers/cxl/pci.c | 6 +- drivers/cxl/pmem.c | 6 +- drivers/cxl/security.c | 18 ++++-- include/linux/cxl/mailbox.h | 5 ++ 8 files changed, 116 insertions(+), 90 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 72a506c9dbd0..2b9f80d61ee9 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -4,6 +4,8 @@ #ifndef __CXL_CORE_H__ #define __CXL_CORE_H__ =20 +#include + extern const struct device_type cxl_nvdimm_bridge_type; extern const struct device_type cxl_nvdimm_type; extern const struct device_type cxl_pmu_type; @@ -65,9 +67,9 @@ static inline void cxl_region_exit(void) =20 struct cxl_send_command; struct cxl_mem_query_commands; -int cxl_query_cmd(struct cxl_memdev *cxlmd, +int cxl_query_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mem_query_commands __user *q); -int cxl_send_cmd(struct cxl_memdev *cxlmd, struct cxl_send_command __user = *s); +int cxl_send_cmd(struct cxl_mailbox *cxl_mailbox, struct cxl_send_command = __user *s); void __iomem *devm_cxl_iomap_block(struct device *dev, resource_size_t add= r, resource_size_t length); =20 diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 5cbb76c4aa16..fa1ee495a4e3 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -225,7 +225,7 @@ static const char *cxl_mem_opcode_to_name(u16 opcode) =20 /** * cxl_internal_send_cmd() - Kernel internal interface to send a mailbox c= ommand - * @mds: The driver data for the operation + * @cxl_mbox: CXL mailbox context for the operation * @mbox_cmd: initialized command to execute * * Context: Any context. @@ -241,10 +241,9 @@ static const char *cxl_mem_opcode_to_name(u16 opcode) * error. While this distinction can be useful for commands from userspace= , the * kernel will only be able to use results when both are successful. */ -int cxl_internal_send_cmd(struct cxl_memdev_state *mds, +int cxl_internal_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd) { - struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; size_t out_size, min_out; int rc; =20 @@ -350,40 +349,40 @@ static bool cxl_payload_from_user_allowed(u16 opcode,= void *payload_in) return true; } =20 -static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox, - struct cxl_memdev_state *mds, u16 opcode, +static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox_cmd, + struct cxl_mailbox *cxl_mbox, u16 opcode, size_t in_size, size_t out_size, u64 in_payload) { - struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; - *mbox =3D (struct cxl_mbox_cmd) { + *mbox_cmd =3D (struct cxl_mbox_cmd) { .opcode =3D opcode, .size_in =3D in_size, }; =20 if (in_size) { - mbox->payload_in =3D vmemdup_user(u64_to_user_ptr(in_payload), - in_size); - if (IS_ERR(mbox->payload_in)) - return PTR_ERR(mbox->payload_in); - - if (!cxl_payload_from_user_allowed(opcode, mbox->payload_in)) { - dev_dbg(mds->cxlds.dev, "%s: input payload not allowed\n", + mbox_cmd->payload_in =3D vmemdup_user(u64_to_user_ptr(in_payload), + in_size); + if (IS_ERR(mbox_cmd->payload_in)) + return PTR_ERR(mbox_cmd->payload_in); + + if (!cxl_payload_from_user_allowed(opcode, + mbox_cmd->payload_in)) { + dev_dbg(cxl_mbox->host, "%s: input payload not allowed\n", cxl_mem_opcode_to_name(opcode)); - kvfree(mbox->payload_in); + kvfree(mbox_cmd->payload_in); return -EBUSY; } } =20 /* Prepare to handle a full payload for variable sized output */ if (out_size =3D=3D CXL_VARIABLE_PAYLOAD) - mbox->size_out =3D cxl_mbox->payload_size; + mbox_cmd->size_out =3D cxl_mbox->payload_size; else - mbox->size_out =3D out_size; + mbox_cmd->size_out =3D out_size; =20 - if (mbox->size_out) { - mbox->payload_out =3D kvzalloc(mbox->size_out, GFP_KERNEL); - if (!mbox->payload_out) { - kvfree(mbox->payload_in); + if (mbox_cmd->size_out) { + mbox_cmd->payload_out =3D kvzalloc(mbox_cmd->size_out, GFP_KERNEL); + if (!mbox_cmd->payload_out) { + kvfree(mbox_cmd->payload_in); return -ENOMEM; } } @@ -398,10 +397,8 @@ static void cxl_mbox_cmd_dtor(struct cxl_mbox_cmd *mbo= x) =20 static int cxl_to_mem_cmd_raw(struct cxl_mem_command *mem_cmd, const struct cxl_send_command *send_cmd, - struct cxl_memdev_state *mds) + struct cxl_mailbox *cxl_mbox) { - struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; - if (send_cmd->raw.rsvd) return -EINVAL; =20 @@ -416,7 +413,7 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *m= em_cmd, if (!cxl_mem_raw_command_allowed(send_cmd->raw.opcode)) return -EPERM; =20 - dev_WARN_ONCE(mds->cxlds.dev, true, "raw command path used\n"); + dev_WARN_ONCE(cxl_mbox->host, true, "raw command path used\n"); =20 *mem_cmd =3D (struct cxl_mem_command) { .info =3D { @@ -432,7 +429,7 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *m= em_cmd, =20 static int cxl_to_mem_cmd(struct cxl_mem_command *mem_cmd, const struct cxl_send_command *send_cmd, - struct cxl_memdev_state *mds) + struct cxl_mailbox *cxl_mbox) { struct cxl_mem_command *c =3D &cxl_mem_commands[send_cmd->id]; const struct cxl_command_info *info =3D &c->info; @@ -447,11 +444,11 @@ static int cxl_to_mem_cmd(struct cxl_mem_command *mem= _cmd, return -EINVAL; =20 /* Check that the command is enabled for hardware */ - if (!test_bit(info->id, mds->enabled_cmds)) + if (!test_bit(info->id, cxl_mbox->enabled_cmds)) return -ENOTTY; =20 /* Check that the command is not claimed for exclusive kernel use */ - if (test_bit(info->id, mds->exclusive_cmds)) + if (test_bit(info->id, cxl_mbox->exclusive_cmds)) return -EBUSY; =20 /* Check the input buffer is the expected size */ @@ -495,10 +492,9 @@ static int cxl_to_mem_cmd(struct cxl_mem_command *mem_= cmd, * safe to send to the hardware. */ static int cxl_validate_cmd_from_user(struct cxl_mbox_cmd *mbox_cmd, - struct cxl_memdev_state *mds, + struct cxl_mailbox *cxl_mbox, const struct cxl_send_command *send_cmd) { - struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mem_command mem_cmd; int rc; =20 @@ -515,24 +511,23 @@ static int cxl_validate_cmd_from_user(struct cxl_mbox= _cmd *mbox_cmd, =20 /* Sanitize and construct a cxl_mem_command */ if (send_cmd->id =3D=3D CXL_MEM_COMMAND_ID_RAW) - rc =3D cxl_to_mem_cmd_raw(&mem_cmd, send_cmd, mds); + rc =3D cxl_to_mem_cmd_raw(&mem_cmd, send_cmd, cxl_mbox); else - rc =3D cxl_to_mem_cmd(&mem_cmd, send_cmd, mds); + rc =3D cxl_to_mem_cmd(&mem_cmd, send_cmd, cxl_mbox); =20 if (rc) return rc; =20 /* Sanitize and construct a cxl_mbox_cmd */ - return cxl_mbox_cmd_ctor(mbox_cmd, mds, mem_cmd.opcode, + return cxl_mbox_cmd_ctor(mbox_cmd, cxl_mbox, mem_cmd.opcode, mem_cmd.info.size_in, mem_cmd.info.size_out, send_cmd->in.payload); } =20 -int cxl_query_cmd(struct cxl_memdev *cxlmd, +int cxl_query_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mem_query_commands __user *q) { - struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); - struct device *dev =3D &cxlmd->dev; + struct device *dev =3D cxl_mbox->host; struct cxl_mem_command *cmd; u32 n_commands; int j =3D 0; @@ -553,9 +548,9 @@ int cxl_query_cmd(struct cxl_memdev *cxlmd, cxl_for_each_cmd(cmd) { struct cxl_command_info info =3D cmd->info; =20 - if (test_bit(info.id, mds->enabled_cmds)) + if (test_bit(info.id, cxl_mbox->enabled_cmds)) info.flags |=3D CXL_MEM_COMMAND_FLAG_ENABLED; - if (test_bit(info.id, mds->exclusive_cmds)) + if (test_bit(info.id, cxl_mbox->exclusive_cmds)) info.flags |=3D CXL_MEM_COMMAND_FLAG_EXCLUSIVE; =20 if (copy_to_user(&q->commands[j++], &info, sizeof(info))) @@ -570,7 +565,7 @@ int cxl_query_cmd(struct cxl_memdev *cxlmd, =20 /** * handle_mailbox_cmd_from_user() - Dispatch a mailbox command for userspa= ce. - * @mds: The driver data for the operation + * @mailbox: The mailbox context for the operation. * @mbox_cmd: The validated mailbox command. * @out_payload: Pointer to userspace's output payload. * @size_out: (Input) Max payload size to copy out. @@ -591,13 +586,12 @@ int cxl_query_cmd(struct cxl_memdev *cxlmd, * * See cxl_send_cmd(). */ -static int handle_mailbox_cmd_from_user(struct cxl_memdev_state *mds, +static int handle_mailbox_cmd_from_user(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd, u64 out_payload, s32 *size_out, u32 *retval) { - struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; - struct device *dev =3D mds->cxlds.dev; + struct device *dev =3D cxl_mbox->host; int rc; =20 dev_dbg(dev, @@ -634,10 +628,9 @@ static int handle_mailbox_cmd_from_user(struct cxl_mem= dev_state *mds, return rc; } =20 -int cxl_send_cmd(struct cxl_memdev *cxlmd, struct cxl_send_command __user = *s) +int cxl_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_send_command __u= ser *s) { - struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); - struct device *dev =3D &cxlmd->dev; + struct device *dev =3D cxl_mbox->host; struct cxl_send_command send; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -647,11 +640,11 @@ int cxl_send_cmd(struct cxl_memdev *cxlmd, struct cxl= _send_command __user *s) if (copy_from_user(&send, s, sizeof(send))) return -EFAULT; =20 - rc =3D cxl_validate_cmd_from_user(&mbox_cmd, mds, &send); + rc =3D cxl_validate_cmd_from_user(&mbox_cmd, cxl_mbox, &send); if (rc) return rc; =20 - rc =3D handle_mailbox_cmd_from_user(mds, &mbox_cmd, send.out.payload, + rc =3D handle_mailbox_cmd_from_user(cxl_mbox, &mbox_cmd, send.out.payload, &send.out.size, &send.retval); if (rc) return rc; @@ -689,7 +682,7 @@ static int cxl_xfer_log(struct cxl_memdev_state *mds, u= uid_t *uuid, .payload_out =3D out, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); =20 /* * The output payload length that indicates the number @@ -725,6 +718,7 @@ static int cxl_xfer_log(struct cxl_memdev_state *mds, u= uid_t *uuid, */ static void cxl_walk_cel(struct cxl_memdev_state *mds, size_t size, u8 *ce= l) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_cel_entry *cel_entry; const int cel_entries =3D size / sizeof(*cel_entry); struct device *dev =3D mds->cxlds.dev; @@ -738,7 +732,7 @@ static void cxl_walk_cel(struct cxl_memdev_state *mds, = size_t size, u8 *cel) int enabled =3D 0; =20 if (cmd) { - set_bit(cmd->info.id, mds->enabled_cmds); + set_bit(cmd->info.id, cxl_mbox->enabled_cmds); enabled++; } =20 @@ -775,7 +769,7 @@ static struct cxl_mbox_get_supported_logs *cxl_get_gsl(= struct cxl_memdev_state * /* At least the record number field must be valid */ .min_out =3D 2, }; - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) { kvfree(ret); return ERR_PTR(rc); @@ -808,6 +802,7 @@ static const uuid_t log_uuid[] =3D { */ int cxl_enumerate_cmds(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_get_supported_logs *gsl; struct device *dev =3D mds->cxlds.dev; struct cxl_mem_command *cmd; @@ -846,7 +841,7 @@ int cxl_enumerate_cmds(struct cxl_memdev_state *mds) /* In case CEL was bogus, enable some default commands. */ cxl_for_each_cmd(cmd) if (cmd->flags & CXL_CMD_FLAG_FORCE_ENABLE) - set_bit(cmd->info.id, mds->enabled_cmds); + set_bit(cmd->info.id, cxl_mbox->enabled_cmds); =20 /* Found the required CEL */ rc =3D 0; @@ -964,7 +959,7 @@ static int cxl_clear_event_record(struct cxl_memdev_sta= te *mds, =20 if (i =3D=3D max_handles) { payload->nr_recs =3D i; - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) goto free_pl; i =3D 0; @@ -975,7 +970,7 @@ static int cxl_clear_event_record(struct cxl_memdev_sta= te *mds, if (i) { payload->nr_recs =3D i; mbox_cmd.size_in =3D struct_size(payload, handles, i); - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) goto free_pl; } @@ -1009,7 +1004,7 @@ static void cxl_mem_get_records_log(struct cxl_memdev= _state *mds, .min_out =3D struct_size(payload, records, 0), }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) { dev_err_ratelimited(dev, "Event log '%d': Failed to query event records : %d", @@ -1080,6 +1075,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_mem_get_event_records, CXL); */ static int cxl_mem_get_partition_info(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_get_partition_info pi; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -1089,7 +1085,7 @@ static int cxl_mem_get_partition_info(struct cxl_memd= ev_state *mds) .size_out =3D sizeof(pi), .payload_out =3D &pi, }; - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) return rc; =20 @@ -1116,6 +1112,7 @@ static int cxl_mem_get_partition_info(struct cxl_memd= ev_state *mds) */ int cxl_dev_state_identify(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; /* See CXL 2.0 Table 175 Identify Memory Device Output Payload */ struct cxl_mbox_identify id; struct cxl_mbox_cmd mbox_cmd; @@ -1130,7 +1127,7 @@ int cxl_dev_state_identify(struct cxl_memdev_state *m= ds) .size_out =3D sizeof(id), .payload_out =3D &id, }; - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) return rc; =20 @@ -1170,11 +1167,12 @@ static int __cxl_mem_sanitize(struct cxl_memdev_sta= te *mds, u16 cmd) }; struct cxl_mbox_cmd mbox_cmd =3D { .opcode =3D cmd }; struct cxl_dev_state *cxlds =3D &mds->cxlds; + struct cxl_mailbox *cxl_mbox =3D &cxlds->cxl_mbox; =20 if (cmd !=3D CXL_MBOX_OP_SANITIZE && cmd !=3D CXL_MBOX_OP_SECURE_ERASE) return -EINVAL; =20 - rc =3D cxl_internal_send_cmd(mds, &sec_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &sec_cmd); if (rc < 0) { dev_err(cxlds->dev, "Failed to get security state : %d", rc); return rc; @@ -1193,7 +1191,7 @@ static int __cxl_mem_sanitize(struct cxl_memdev_state= *mds, u16 cmd) sec_out & CXL_PMEM_SEC_STATE_LOCKED) return -EINVAL; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) { dev_err(cxlds->dev, "Failed to sanitize device : %d", rc); return rc; @@ -1310,6 +1308,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_mem_create_range_info, CXL); =20 int cxl_set_timestamp(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd; struct cxl_mbox_set_timestamp_in pi; int rc; @@ -1321,7 +1320,7 @@ int cxl_set_timestamp(struct cxl_memdev_state *mds) .payload_in =3D &pi, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); /* * Command is optional. Devices may have another way of providing * a timestamp, or may return all 0s in timestamp fields. @@ -1362,7 +1361,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 = offset, u64 len, .min_out =3D struct_size(po, record, 0), }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) break; =20 @@ -1438,6 +1437,7 @@ struct cxl_memdev_state *cxl_memdev_state_create(stru= ct device *dev) mutex_init(&mds->event.log_lock); mds->cxlds.dev =3D dev; mds->cxlds.reg_map.host =3D dev; + mds->cxlds.cxl_mbox.host =3D dev; mds->cxlds.reg_map.resource =3D CXL_RESOURCE_NONE; mds->cxlds.type =3D CXL_DEVTYPE_CLASSMEM; mds->ram_perf.qos_class =3D CXL_QOS_CLASS_INVALID; diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index 05bb84cb1274..9f0fe698414d 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -279,6 +279,7 @@ static int cxl_validate_poison_dpa(struct cxl_memdev *c= xlmd, u64 dpa) int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) { struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_inject_poison inject; struct cxl_poison_record record; struct cxl_mbox_cmd mbox_cmd; @@ -308,7 +309,7 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) .size_in =3D sizeof(inject), .payload_in =3D &inject, }; - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) goto out; =20 @@ -334,6 +335,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, CXL); int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) { struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_clear_poison clear; struct cxl_poison_record record; struct cxl_mbox_cmd mbox_cmd; @@ -372,7 +374,7 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) .payload_in =3D &clear, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) goto out; =20 @@ -564,9 +566,11 @@ EXPORT_SYMBOL_NS_GPL(is_cxl_memdev, CXL); void set_exclusive_cxl_commands(struct cxl_memdev_state *mds, unsigned long *cmds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; + down_write(&cxl_memdev_rwsem); - bitmap_or(mds->exclusive_cmds, mds->exclusive_cmds, cmds, - CXL_MEM_COMMAND_ID_MAX); + bitmap_or(cxl_mbox->exclusive_cmds, cxl_mbox->exclusive_cmds, + cmds, CXL_MEM_COMMAND_ID_MAX); up_write(&cxl_memdev_rwsem); } EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, CXL); @@ -579,9 +583,11 @@ EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, CXL); void clear_exclusive_cxl_commands(struct cxl_memdev_state *mds, unsigned long *cmds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; + down_write(&cxl_memdev_rwsem); - bitmap_andnot(mds->exclusive_cmds, mds->exclusive_cmds, cmds, - CXL_MEM_COMMAND_ID_MAX); + bitmap_andnot(cxl_mbox->exclusive_cmds, cxl_mbox->exclusive_cmds, + cmds, CXL_MEM_COMMAND_ID_MAX); up_write(&cxl_memdev_rwsem); } EXPORT_SYMBOL_NS_GPL(clear_exclusive_cxl_commands, CXL); @@ -656,11 +662,14 @@ static struct cxl_memdev *cxl_memdev_alloc(struct cxl= _dev_state *cxlds, static long __cxl_memdev_ioctl(struct cxl_memdev *cxlmd, unsigned int cmd, unsigned long arg) { + struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; + switch (cmd) { case CXL_MEM_QUERY_COMMANDS: - return cxl_query_cmd(cxlmd, (void __user *)arg); + return cxl_query_cmd(cxl_mbox, (void __user *)arg); case CXL_MEM_SEND_COMMAND: - return cxl_send_cmd(cxlmd, (void __user *)arg); + return cxl_send_cmd(cxl_mbox, (void __user *)arg); default: return -ENOTTY; } @@ -715,6 +724,7 @@ static int cxl_memdev_release_file(struct inode *inode,= struct file *file) */ static int cxl_mem_get_fw_info(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_get_fw_info info; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -725,7 +735,7 @@ static int cxl_mem_get_fw_info(struct cxl_memdev_state = *mds) .payload_out =3D &info, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) return rc; =20 @@ -749,6 +759,7 @@ static int cxl_mem_get_fw_info(struct cxl_memdev_state = *mds) */ static int cxl_mem_activate_fw(struct cxl_memdev_state *mds, int slot) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_activate_fw activate; struct cxl_mbox_cmd mbox_cmd; =20 @@ -765,7 +776,7 @@ static int cxl_mem_activate_fw(struct cxl_memdev_state = *mds, int slot) activate.action =3D CXL_FW_ACTIVATE_OFFLINE; activate.slot =3D slot; =20 - return cxl_internal_send_cmd(mds, &mbox_cmd); + return cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); } =20 /** @@ -780,6 +791,7 @@ static int cxl_mem_activate_fw(struct cxl_memdev_state = *mds, int slot) */ static int cxl_mem_abort_fw_xfer(struct cxl_memdev_state *mds) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_transfer_fw *transfer; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -799,7 +811,7 @@ static int cxl_mem_abort_fw_xfer(struct cxl_memdev_stat= e *mds) =20 transfer->action =3D CXL_FW_TRANSFER_ACTION_ABORT; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); kfree(transfer); return rc; } @@ -924,7 +936,7 @@ static enum fw_upload_err cxl_fw_write(struct fw_upload= *fwl, const u8 *data, .poll_count =3D 30, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) { rc =3D FW_UPLOAD_ERR_RW_ERROR; goto out_free; @@ -991,10 +1003,11 @@ static void cxl_remove_fw_upload(void *fwl) int devm_cxl_setup_fw_upload(struct device *host, struct cxl_memdev_state = *mds) { struct cxl_dev_state *cxlds =3D &mds->cxlds; + struct cxl_mailbox *cxl_mbox =3D &cxlds->cxl_mbox; struct device *dev =3D &cxlds->cxlmd->dev; struct fw_upload *fwl; =20 - if (!test_bit(CXL_MEM_COMMAND_ID_GET_FW_INFO, mds->enabled_cmds)) + if (!test_bit(CXL_MEM_COMMAND_ID_GET_FW_INFO, cxl_mbox->enabled_cmds)) return 0; =20 fwl =3D firmware_upload_register(THIS_MODULE, dev, dev_name(dev), diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 19609b708b09..d7c6ffe2a884 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -417,8 +417,6 @@ struct cxl_dev_state { * @lsa_size: Size of Label Storage Area * (CXL 2.0 8.2.9.5.1.1 Identify Memory Device) * @firmware_version: Firmware version for the memory device. - * @enabled_cmds: Hardware commands found enabled in CEL. - * @exclusive_cmds: Commands that are kernel-internal only * @total_bytes: sum of all possible capacities * @volatile_only_bytes: hard volatile capacity * @persistent_only_bytes: hard persistent capacity @@ -441,8 +439,6 @@ struct cxl_memdev_state { struct cxl_dev_state cxlds; size_t lsa_size; char firmware_version[0x10]; - DECLARE_BITMAP(enabled_cmds, CXL_MEM_COMMAND_ID_MAX); - DECLARE_BITMAP(exclusive_cmds, CXL_MEM_COMMAND_ID_MAX); u64 total_bytes; u64 volatile_only_bytes; u64 persistent_only_bytes; @@ -769,7 +765,7 @@ enum { CXL_PMEM_SEC_PASS_USER, }; =20 -int cxl_internal_send_cmd(struct cxl_memdev_state *mds, +int cxl_internal_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *cmd); int cxl_dev_state_identify(struct cxl_memdev_state *mds); int cxl_await_media_ready(struct cxl_dev_state *cxlds); diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c index faf6f5a49368..3c73de475bf3 100644 --- a/drivers/cxl/pci.c +++ b/drivers/cxl/pci.c @@ -661,6 +661,7 @@ static int cxl_event_req_irq(struct cxl_dev_state *cxld= s, u8 setting) static int cxl_event_get_int_policy(struct cxl_memdev_state *mds, struct cxl_event_interrupt_policy *policy) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd =3D { .opcode =3D CXL_MBOX_OP_GET_EVT_INT_POLICY, .payload_out =3D policy, @@ -668,7 +669,7 @@ static int cxl_event_get_int_policy(struct cxl_memdev_s= tate *mds, }; int rc; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) dev_err(mds->cxlds.dev, "Failed to get event interrupt policy : %d", rc); @@ -679,6 +680,7 @@ static int cxl_event_get_int_policy(struct cxl_memdev_s= tate *mds, static int cxl_event_config_msgnums(struct cxl_memdev_state *mds, struct cxl_event_interrupt_policy *policy) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd; int rc; =20 @@ -695,7 +697,7 @@ static int cxl_event_config_msgnums(struct cxl_memdev_s= tate *mds, .size_in =3D sizeof(*policy), }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) { dev_err(mds->cxlds.dev, "Failed to set event interrupt policy : %d", rc); diff --git a/drivers/cxl/pmem.c b/drivers/cxl/pmem.c index 3985ff9ce70e..5453c0faa295 100644 --- a/drivers/cxl/pmem.c +++ b/drivers/cxl/pmem.c @@ -120,6 +120,7 @@ static int cxl_pmem_get_config_data(struct cxl_memdev_s= tate *mds, struct nd_cmd_get_config_data_hdr *cmd, unsigned int buf_len) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_get_lsa get_lsa; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -141,7 +142,7 @@ static int cxl_pmem_get_config_data(struct cxl_memdev_s= tate *mds, .payload_out =3D cmd->out_buf, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); cmd->status =3D 0; =20 return rc; @@ -151,6 +152,7 @@ static int cxl_pmem_set_config_data(struct cxl_memdev_s= tate *mds, struct nd_cmd_set_config_hdr *cmd, unsigned int buf_len) { + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_set_lsa *set_lsa; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -177,7 +179,7 @@ static int cxl_pmem_set_config_data(struct cxl_memdev_s= tate *mds, .size_in =3D struct_size(set_lsa, data, cmd->in_length), }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); =20 /* * Set "firmware" status (4-packed bytes at the end of the input diff --git a/drivers/cxl/security.c b/drivers/cxl/security.c index 21856a3f408e..95a92b87c99a 100644 --- a/drivers/cxl/security.c +++ b/drivers/cxl/security.c @@ -15,6 +15,7 @@ static unsigned long cxl_pmem_get_security_flags(struct n= vdimm *nvdimm, struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; unsigned long security_flags =3D 0; struct cxl_get_security_output { __le32 flags; @@ -29,7 +30,7 @@ static unsigned long cxl_pmem_get_security_flags(struct n= vdimm *nvdimm, .payload_out =3D &out, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) return 0; =20 @@ -71,6 +72,7 @@ static int cxl_pmem_security_change_key(struct nvdimm *nv= dimm, struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd; struct cxl_set_pass set_pass; =20 @@ -87,7 +89,7 @@ static int cxl_pmem_security_change_key(struct nvdimm *nv= dimm, .payload_in =3D &set_pass, }; =20 - return cxl_internal_send_cmd(mds, &mbox_cmd); + return cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); } =20 static int __cxl_pmem_security_disable(struct nvdimm *nvdimm, @@ -97,6 +99,7 @@ static int __cxl_pmem_security_disable(struct nvdimm *nvd= imm, struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_disable_pass dis_pass; struct cxl_mbox_cmd mbox_cmd; =20 @@ -112,7 +115,7 @@ static int __cxl_pmem_security_disable(struct nvdimm *n= vdimm, .payload_in =3D &dis_pass, }; =20 - return cxl_internal_send_cmd(mds, &mbox_cmd); + return cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); } =20 static int cxl_pmem_security_disable(struct nvdimm *nvdimm, @@ -132,11 +135,12 @@ static int cxl_pmem_security_freeze(struct nvdimm *nv= dimm) struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd =3D { .opcode =3D CXL_MBOX_OP_FREEZE_SECURITY, }; =20 - return cxl_internal_send_cmd(mds, &mbox_cmd); + return cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); } =20 static int cxl_pmem_security_unlock(struct nvdimm *nvdimm, @@ -145,6 +149,7 @@ static int cxl_pmem_security_unlock(struct nvdimm *nvdi= mm, struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; u8 pass[NVDIMM_PASSPHRASE_LEN]; struct cxl_mbox_cmd mbox_cmd; int rc; @@ -156,7 +161,7 @@ static int cxl_pmem_security_unlock(struct nvdimm *nvdi= mm, .payload_in =3D pass, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) return rc; =20 @@ -170,6 +175,7 @@ static int cxl_pmem_security_passphrase_erase(struct nv= dimm *nvdimm, struct cxl_nvdimm *cxl_nvd =3D nvdimm_provider_data(nvdimm); struct cxl_memdev *cxlmd =3D cxl_nvd->cxlmd; struct cxl_memdev_state *mds =3D to_cxl_memdev_state(cxlmd->cxlds); + struct cxl_mailbox *cxl_mbox =3D &mds->cxlds.cxl_mbox; struct cxl_mbox_cmd mbox_cmd; struct cxl_pass_erase erase; int rc; @@ -185,7 +191,7 @@ static int cxl_pmem_security_passphrase_erase(struct nv= dimm *nvdimm, .payload_in =3D &erase, }; =20 - rc =3D cxl_internal_send_cmd(mds, &mbox_cmd); + rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc < 0) return rc; =20 diff --git a/include/linux/cxl/mailbox.h b/include/linux/cxl/mailbox.h index 654df6175828..2380b22d7a12 100644 --- a/include/linux/cxl/mailbox.h +++ b/include/linux/cxl/mailbox.h @@ -3,6 +3,7 @@ #ifndef __CXL_MBOX_H__ #define __CXL_MBOX_H__ =20 +#include #include =20 /** @@ -45,6 +46,8 @@ struct cxl_mbox_cmd { * struct cxl_mailbox - context for CXL mailbox operations * @host: device that hosts the mailbox * @adev: auxiliary device for fw-ctl + * @enabled_cmds: Hardware commands found enabled in CEL. + * @exclusive_cmds: Commands that are kernel-internal only * @payload_size: Size of space for payload * (CXL 3.1 8.2.8.4.3 Mailbox Capabilities Register) * @mbox_mutex: mutex protects device mailbox and firmware @@ -54,6 +57,8 @@ struct cxl_mbox_cmd { struct cxl_mailbox { struct device *host; struct auxiliary_device adev; /* For fw-ctl */ + DECLARE_BITMAP(enabled_cmds, CXL_MEM_COMMAND_ID_MAX); + DECLARE_BITMAP(exclusive_cmds, CXL_MEM_COMMAND_ID_MAX); size_t payload_size; struct mutex mbox_mutex; /* lock to protect mailbox context */ struct rcuwait mbox_wait; --=20 2.34.1