On Wed, 21 Sep 2022 08:31:45 -0700 Dave Jiang <[email protected]> wrote:
> Add the emulation support for handling "Get Security State" opcode for a > CXL memory device for the cxl_test. The function will copy back device > security state bitmask to the output payload. > > The security state data is added as platform_data for the mock mem device. > > Reviewed-by: Davidlohr Bueso <[email protected]> > Signed-off-by: Dave Jiang <[email protected]> FWIW LGTM Reviewed-by: Jonathan Cameron <[email protected]> > --- > tools/testing/cxl/test/cxl.c | 18 ++++++++++++++++++ > tools/testing/cxl/test/mem.c | 20 ++++++++++++++++++++ > tools/testing/cxl/test/mem_pdata.h | 10 ++++++++++ > 3 files changed, 48 insertions(+) > create mode 100644 tools/testing/cxl/test/mem_pdata.h > > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index a072b2d3e726..6dd286a52839 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -10,6 +10,7 @@ > #include <linux/mm.h> > #include <cxlmem.h> > #include "mock.h" > +#include "mem_pdata.h" > > #define NR_CXL_HOST_BRIDGES 2 > #define NR_CXL_ROOT_PORTS 2 > @@ -629,8 +630,18 @@ static void mock_companion(struct acpi_device *adev, > struct device *dev) > > static __init int cxl_test_init(void) > { > + struct cxl_mock_mem_pdata *mem_pdata; > int rc, i; > > + /* > + * Only a zeroed copy of this data structure is needed since no > + * additional initialization is needed for initial state. > + * platform_device_add_data() will make a copy of this data. > + */ > + mem_pdata = kzalloc(sizeof(*mem_pdata), GFP_KERNEL); > + if (!mem_pdata) > + return -ENOMEM; > + > register_cxl_mock_ops(&cxl_mock_ops); > > cxl_mock_pool = gen_pool_create(ilog2(SZ_2M), NUMA_NO_NODE); > @@ -735,6 +746,12 @@ static __init int cxl_test_init(void) > pdev->dev.parent = &dport->dev; > set_dev_node(&pdev->dev, i % 2); > > + rc = platform_device_add_data(pdev, mem_pdata, > sizeof(*mem_pdata)); > + if (rc) { > + platform_device_put(pdev); > + goto err_mem; > + } > + > rc = platform_device_add(pdev); > if (rc) { > platform_device_put(pdev); > @@ -785,6 +802,7 @@ static __init int cxl_test_init(void) > gen_pool_destroy(cxl_mock_pool); > err_gen_pool_create: > unregister_cxl_mock_ops(&cxl_mock_ops); > + kfree(mem_pdata); > return rc; > } > > diff --git a/tools/testing/cxl/test/mem.c b/tools/testing/cxl/test/mem.c > index aa2df3a15051..9002a3ae3ea5 100644 > --- a/tools/testing/cxl/test/mem.c > +++ b/tools/testing/cxl/test/mem.c > @@ -8,6 +8,7 @@ > #include <linux/sizes.h> > #include <linux/bits.h> > #include <cxlmem.h> > +#include "mem_pdata.h" > > #define LSA_SIZE SZ_128K > #define DEV_SIZE SZ_2G > @@ -137,6 +138,22 @@ static int mock_partition_info(struct cxl_dev_state > *cxlds, > return 0; > } > > +static int mock_get_security_state(struct cxl_dev_state *cxlds, > + struct cxl_mbox_cmd *cmd) > +{ > + struct cxl_mock_mem_pdata *mdata = dev_get_platdata(cxlds->dev); > + > + if (cmd->size_in) > + return -EINVAL; > + > + if (cmd->size_out != sizeof(u32)) > + return -EINVAL; > + > + memcpy(cmd->payload_out, &mdata->security_state, sizeof(u32)); > + > + return 0; > +} > + > static int mock_get_lsa(struct cxl_dev_state *cxlds, struct cxl_mbox_cmd > *cmd) > { > struct cxl_mbox_get_lsa *get_lsa = cmd->payload_in; > @@ -230,6 +247,9 @@ static int cxl_mock_mbox_send(struct cxl_dev_state > *cxlds, struct cxl_mbox_cmd * > case CXL_MBOX_OP_GET_HEALTH_INFO: > rc = mock_health_info(cxlds, cmd); > break; > + case CXL_MBOX_OP_GET_SECURITY_STATE: > + rc = mock_get_security_state(cxlds, cmd); > + break; > default: > break; > } > diff --git a/tools/testing/cxl/test/mem_pdata.h > b/tools/testing/cxl/test/mem_pdata.h > new file mode 100644 > index 000000000000..6a7b111147eb > --- /dev/null > +++ b/tools/testing/cxl/test/mem_pdata.h > @@ -0,0 +1,10 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +#ifndef _MEM_PDATA_H_ > +#define _MEM_PDATA_H_ > + > +struct cxl_mock_mem_pdata { > + u32 security_state; > +}; > + > +#endif > >
