Skip to content
Closed
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
8 changes: 1 addition & 7 deletions boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0.dts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/dts-v1/;

#include <zephyr/dt-bindings/gpio/gpio.h>
#include <ti/am64x_r5.dtsi>
#include <ti/am64x_r5f0_0.dtsi>
#include "am243x_evm_am2434_r5f0_0-pinctrl.dtsi"

/ {
Expand Down Expand Up @@ -85,22 +85,16 @@
&main_i2c0 {
pinctrl-0 = <&main_i2c0_scl &main_i2c0_sda>;
pinctrl-names = "default";
status = "okay";
power-domains = <&i2c0_pd>;
};

&main_mcspi0 {
pinctrl-0 = <&spi0_clk &spi0_cs0 &spi0_d0 &spi0_d1>;
pinctrl-names = "default";
status = "okay";
power-domains = <&mcspi0_pd>;
};

&main_adc0 {
ti,vrefp = <1800>;
ti,fifo = <0>;
status = "okay";
power-domains = <&adc0_pd>;

channel@0 {
reg = <0>;
Expand Down
12 changes: 12 additions & 0 deletions boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,15 @@ CONFIG_UART_CONSOLE=y

# Enable MPU
CONFIG_ARM_MPU=y

# Enable TISCI
CONFIG_TISCI=y

# Enable Power Management
CONFIG_POWER_DOMAIN=y
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y

# Enable Clock Management
CONFIG_CLOCK_CONTROL=y
89 changes: 56 additions & 33 deletions drivers/firmware/tisci/tisci.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/drivers/mbox/mbox_ti_secproxy.h>
#include <stdint.h>
#include <stdio.h>
#define DT_DRV_COMPAT ti_k2g_sci
#define DT_DRV_COMPAT ti_k2g_sci
#define DT_SECPROXY_COMPAT ti_secure_proxy
#include <zephyr/drivers/mbox.h>
#include <zephyr/device.h>
#include "tisci.h"
Expand All @@ -15,8 +17,13 @@
#include <zephyr/sys/util.h>
#define LOG_LEVEL CONFIG_MBOX_LOG_LEVEL
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(ti_k2g_sci);

BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 1, "There can only be one DMSC instance");

#define DMSC_USES_SECPROXY (DT_NODE_HAS_COMPAT(DT_INST_PHANDLE(0, mboxes), DT_SECPROXY_COMPAT))

/**
* @struct tisci_config - TISCI device configuration structure
* @mbox_tx: Mailbox transmit channel specification.
Expand Down Expand Up @@ -65,7 +72,9 @@ static struct tisci_xfer *tisci_setup_one_xfer(const struct device *dev, uint16_
{
struct tisci_data *data = dev->data;

k_sem_take(&data->data_sem, K_FOREVER);
if (!k_is_pre_kernel()) {
k_sem_take(&data->data_sem, K_FOREVER);
}

const struct tisci_config *config = dev->config;
struct tisci_xfer *xfer = &data->xfer;
Expand Down Expand Up @@ -102,7 +111,9 @@ static void callback(const struct device *dev, mbox_channel_id_t channel_id, voi
{
struct rx_msg *msg = user_data;

k_sem_give(msg->response_ready_sem);
if (!k_is_pre_kernel()) {
k_sem_give(msg->response_ready_sem);
}
}

static bool tisci_is_response_ack(void *r)
Expand All @@ -127,10 +138,12 @@ static int tisci_get_response(const struct device *dev, struct tisci_xfer *xfer)
return -EINVAL;
}

if (k_sem_take(data->rx_message.response_ready_sem, K_MSEC(config->max_rx_timeout_ms)) !=
0) {
LOG_ERR("Timeout waiting for response");
return -ETIMEDOUT;
if (!k_is_pre_kernel()) {
if (k_sem_take(data->rx_message.response_ready_sem,
K_MSEC(config->max_rx_timeout_ms)) != 0) {
LOG_ERR("Timeout waiting for response");
return -ETIMEDOUT;
}
}

if (xfer->rx_message.size > config->max_msg_size) {
Expand All @@ -152,7 +165,9 @@ static int tisci_get_response(const struct device *dev, struct tisci_xfer *xfer)
return -EINVAL;
}

k_sem_give(&data->data_sem);
if (!k_is_pre_kernel()) {
k_sem_give(&data->data_sem);
}
return 0;
}

Expand All @@ -166,7 +181,18 @@ static int tisci_do_xfer(const struct device *dev, struct tisci_xfer *xfer)
struct mbox_msg *msg = &xfer->tx_message;
int ret;

ret = mbox_send_dt(&config->mbox_tx, msg);
if (k_is_pre_kernel()) {
#if DMSC_USES_SECPROXY
ret = secproxy_mailbox_send_then_poll_rx_dt(&config->mbox_rx, &config->mbox_tx,
msg);
#else
LOG_ERR("Cannot transceive messages during pre kernel\n");
return -ENOTSUP;
#endif
} else {
ret = mbox_send_dt(&config->mbox_tx, msg);
}

if (ret < 0) {
LOG_ERR("Could not send (%d)\n", ret);
return ret;
Expand Down Expand Up @@ -1576,27 +1602,24 @@ static int tisci_init(const struct device *dev)
}

/* Device Tree Instantiation */
#define TISCI_DEFINE(_n) \
static uint8_t rx_message_buf_##_n[MAILBOX_MBOX_SIZE] = {0}; \
static struct k_sem response_ready_sem_##_n; \
static struct tisci_data tisci_data_##_n = { \
.seq = 0, \
.rx_message = \
{ \
.buf = rx_message_buf_##_n, \
.size = sizeof(rx_message_buf_##_n), \
.response_ready_sem = &response_ready_sem_##_n, \
}, \
.data_sem = Z_SEM_INITIALIZER(tisci_data_##_n.data_sem, 1, 1), \
}; \
static const struct tisci_config tisci_config_##_n = { \
.mbox_tx = MBOX_DT_SPEC_INST_GET(_n, tx), \
.mbox_rx = MBOX_DT_SPEC_INST_GET(_n, rx), \
.host_id = DT_INST_PROP(_n, ti_host_id), \
.max_msg_size = MAILBOX_MBOX_SIZE, \
.max_rx_timeout_ms = 10000, \
}; \
DEVICE_DT_INST_DEFINE(_n, tisci_init, NULL, &tisci_data_##_n, &tisci_config_##_n, \
PRE_KERNEL_1, CONFIG_TISCI_INIT_PRIORITY, NULL);

DT_INST_FOREACH_STATUS_OKAY(TISCI_DEFINE)
static uint8_t rx_message_buf[MAILBOX_MBOX_SIZE] = {0};
static struct k_sem response_ready_sem;
static struct tisci_data tisci_data = {
.seq = 0,
.rx_message = {
.buf = rx_message_buf,
.size = sizeof(rx_message_buf),
.response_ready_sem = &response_ready_sem,
},
.data_sem = Z_SEM_INITIALIZER(tisci_data.data_sem, 1, 1),
};
static const struct tisci_config tisci_config = {
.mbox_tx = MBOX_DT_SPEC_INST_GET(0, tx),
.mbox_rx = MBOX_DT_SPEC_INST_GET(0, rx),
.host_id = DT_INST_PROP(0, ti_host_id),
.max_msg_size = MAILBOX_MBOX_SIZE,
.max_rx_timeout_ms = 10000,
};

DEVICE_DT_INST_DEFINE(0, tisci_init, NULL, &tisci_data, &tisci_config, PRE_KERNEL_1,
CONFIG_TISCI_INIT_PRIORITY, NULL);
Loading
Loading