Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers: i3c: add ccc setbuscon and fixup rstact #79024

Merged
merged 5 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions drivers/i3c/i3c_ccc.c
Original file line number Diff line number Diff line change
Expand Up @@ -893,3 +893,20 @@
out:
return ret;
}

int i3c_ccc_do_setbuscon(const struct device *controller,
uint8_t *context, uint16_t length)
{

Check notice on line 899 in drivers/i3c/i3c_ccc.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/i3c/i3c_ccc.c:899 -int i3c_ccc_do_setbuscon(const struct device *controller, - uint8_t *context, uint16_t length) +int i3c_ccc_do_setbuscon(const struct device *controller, uint8_t *context, uint16_t length)
struct i3c_ccc_payload ccc_payload;

__ASSERT_NO_MSG(controller != NULL);
__ASSERT_NO_MSG(context != NULL);

memset(&ccc_payload, 0, sizeof(ccc_payload));
ccc_payload.ccc.id = I3C_CCC_SETBUSCON;

ccc_payload.ccc.data = context;
ccc_payload.ccc.data_len = length;

return i3c_do_ccc(controller, &ccc_payload);
}
57 changes: 39 additions & 18 deletions drivers/i3c/i3c_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -1064,29 +1064,17 @@ static int cmd_i3c_ccc_rstact(const struct shell *sh, size_t argc, char **argv)
int ret;
uint8_t data;

dev = device_get_binding(argv[ARGV_DEV]);
if (!dev) {
shell_error(sh, "I3C: Device driver %s not found.", argv[ARGV_DEV]);
return -ENODEV;
}

tdev = device_get_binding(argv[ARGV_TDEV]);
if (!tdev) {
shell_error(sh, "I3C: Device driver %s not found.", argv[ARGV_TDEV]);
return -ENODEV;
}
desc = get_i3c_attached_desc_from_dev_name(dev, tdev->name);
if (!desc) {
shell_error(sh, "I3C: Device %s not attached to bus.", tdev->name);
return -ENODEV;
ret = i3c_parse_args(sh, argv, &dev, &tdev, &desc);
if (ret != 0) {
return ret;
}

action = strtol(argv[5], NULL, 16);

if (strcmp(argv[4], "get") == 0) {
ret = i3c_ccc_do_rstact_fmt3(tdev, action, &data);
ret = i3c_ccc_do_rstact_fmt3(desc, action, &data);
} else if (strcmp(argv[4], "set") == 0) {
ret = i3c_ccc_do_rstact_fmt2(tdev, action);
ret = i3c_ccc_do_rstact_fmt2(desc, action);
} else {
shell_error(sh, "I3C: invalid parameter");
return -EINVAL;
Expand All @@ -1098,7 +1086,7 @@ static int cmd_i3c_ccc_rstact(const struct shell *sh, size_t argc, char **argv)
}

if (action >= 0x80) {
shell_print("RSTACT Returned Data: 0x%02x", data);
shell_print(sh, "RSTACT Returned Data: 0x%02x", data);
}

return ret;
Expand Down Expand Up @@ -1622,6 +1610,35 @@ static int cmd_i3c_ccc_setvendor_bc(const struct shell *sh, size_t argc, char **
return ret;
}

/* i3c ccc setbuscon <device> <context> [<optional bytes>] */
static int cmd_i3c_ccc_setbuscon(const struct shell *sh, size_t argc, char **argv)
{
const struct device *dev;
uint8_t buf[MAX_I3C_BYTES] = {0};
uint8_t data_length;
int ret;
int i;

dev = device_get_binding(argv[ARGV_DEV]);
if (!dev) {
shell_error(sh, "I3C: Device driver %s not found.", argv[ARGV_DEV]);
return -ENODEV;
}

data_length = argc - 2;
for (i = 0; i < data_length; i++) {
buf[i] = (uint8_t)strtol(argv[2 + i], NULL, 16);
}

ret = i3c_ccc_do_setbuscon(dev, buf, data_length);
if (ret < 0) {
shell_error(sh, "I3C: unable to send CCC SETBUSCON.");
return ret;
}

return ret;
}

/* i3c ccc getmxds <device> <target> [<defining byte>] */
static int cmd_i3c_ccc_getmxds(const struct shell *sh, size_t argc, char **argv)
{
Expand Down Expand Up @@ -2264,6 +2281,10 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
"Send CCC GETMXDS\n"
"Usage: ccc getmxds <device> <target> [<defining byte>]",
cmd_i3c_ccc_getmxds, 3, 1),
SHELL_CMD_ARG(setbuscon, &dsub_i3c_device_name,
"Send CCC SETBUSCON\n"
"Usage: ccc setbuscon <device> <context> [<optional bytes>]",
cmd_i3c_ccc_setbuscon, 3, MAX_I3C_BYTES - 1),
SHELL_CMD_ARG(getvendor, &dsub_i3c_device_attached_name,
"Send CCC GETVENDOR\n"
"Usage: ccc getvendor <device> <target> <id> [<defining byte>]",
Expand Down
101 changes: 101 additions & 0 deletions include/zephyr/drivers/i3c/ccc.h
Original file line number Diff line number Diff line change
Expand Up @@ -1271,6 +1271,93 @@
I3C_CCC_RSTACT_RETURN_VIRTUAL_TARGET_INDICATION = 0x84U,
};

/**
* @name Set Bus Context MIPI I3C Specification v1.Y Minor Version (SETBUSCON)
* @anchor I3C_CCC_SETBUSCON_I3C_SPEC
*
* - CONTEXT[7:6]: 2'b00
*
* - CONTEXT[5]: I3C Specification Editorial Revision (within Minor Version)
* - 0: Version 1.Y.0
* - 1: Version 1.Y.1 or greater
*
* - CONTEXT[4]: I3C Specification Family
* - 0: MIPI I3C Specification
* - 1: MIPI I3C Basic Specification
*
* - CONTEXT[3:0]: I3C Specification Minor Version (v1.Y)
* - 0: Illegal, do not use (see Note below)
* (It would encode v1.0, but SETBUSCON was not available in I3C Basic v1.0)
* - 1-15: Version 1.1 - Version 1.15
*
* Examples: Bit[5] Bit[4] Bits[3:0]
* I3C Basic v1.1.0: 1’b0 || 1’b1 || 4’b0001 or 8’b00010001
* I3C Basic v1.1.1: 1’b1 || 1’b1 || 4’b0001 or 8’b00110001
* I3C Basic v1.2.0: 1’b0 || 1’b1 || 4’b0010 or 8’b00010010
*
* @{
*/

/** I3C Specification Minor Version shift mask */
#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK GENMASK(3U, 0U)

Check notice on line 1303 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:1303 -#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK GENMASK(3U, 0U) +#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK GENMASK(3U, 0U)
/**
* @brief I3C Specification Minor Version (v1.Y)
*
* Set the context bits for SETBUSCON
*
* @param y I3C Specification Minor Version Number
*/
#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER(y) \
FIELD_PREP(I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK, (y))

/** MIPI I3C Specification */
#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC 0

/** MIPI I3C Basic Specification */
#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_BASIC_SPEC BIT(4)

/** Version 1.Y.0 */
#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_0 0

/** Version 1.Y.1 or greater */
#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_1 BIT(5)

Check notice on line 1325 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:1325 -#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER(y) \ +#define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER(y) \ FIELD_PREP(I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK, (y)) /** MIPI I3C Specification */ -#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC 0 +#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC 0 /** MIPI I3C Basic Specification */ -#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_BASIC_SPEC BIT(4) +#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_BASIC_SPEC BIT(4) /** Version 1.Y.0 */ -#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_0 0 +#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_0 0 /** Version 1.Y.1 or greater */ -#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_1 BIT(5) +#define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_1 BIT(5)
/** @} */

/**
* @name Set Bus Context Other Standards Organizations (SETBUSCON)
* @anchor I3C_CCC_SETBUSCON_OTHER_STANDARDS
*
* @{
*/

/**
* @brief JEDEC Sideband
*
* JEDEC SideBand Bus device, compliant to JESD403 Specification v1.0 or later.
*/
#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_JEDEC_SIDEBAND 128

Check notice on line 1341 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:1341 -#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_JEDEC_SIDEBAND 128 +#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_JEDEC_SIDEBAND 128
/**
* @brief MCTP
*
* MCTP for system manageability (conforming to the content protocol defined in
* the MCTP I3C Transport Binding Specification, released by DMTF, version 1.0
* or newer)
*/
#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_MCTP 129

Check notice on line 1350 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:1350 -#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_MCTP 129 +#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_MCTP 129
/**
* @brief ETSI
*
* ETSI for Secure Smart Platform Devices used for mobile networks authentication
* and other ETSI security functions in mobile ecosystem
*/
#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_ETSI 130

Check notice on line 1358 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:1358 -#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_ETSI 130 +#define I3C_CCC_SETBUSCON_OTHER_STANDARDS_ETSI 130
/** @} */

/**
* @brief Test if I3C CCC payload is for broadcast.
*
Expand Down Expand Up @@ -2018,6 +2105,20 @@
int i3c_ccc_do_deftgts_all(const struct device *controller,
struct i3c_ccc_deftgts *deftgts);

/**
* @brief Broadcast SETBUSCON to set the bus context
*
* Helper function to set the bus context of all connected targets.
*
* @param[in] controller Pointer to the controller device driver instance.
* @param[in] context Pointer to context byte values
* @param[in] length Length of the context buffer
*
* @return @see i3c_do_ccc
*/
int i3c_ccc_do_setbuscon(const struct device *controller,
uint8_t *context, uint16_t length);

Check notice on line 2121 in include/zephyr/drivers/i3c/ccc.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/i3c/ccc.h:2121 -int i3c_ccc_do_setbuscon(const struct device *controller, - uint8_t *context, uint16_t length); +int i3c_ccc_do_setbuscon(const struct device *controller, uint8_t *context, uint16_t length);
#ifdef __cplusplus
}
#endif
Expand Down
2 changes: 2 additions & 0 deletions tests/drivers/build_all/i3c/prj.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
CONFIG_TEST=y
CONFIG_TEST_USERSPACE=y
CONFIG_I3C=y
CONFIG_SHELL=y
CONFIG_I3C_SHELL=y
Loading