#define DVFS_LATENCY(hdr) ((hdr) >> 16)
#define DVFS_OPP_COUNT(hdr) (((hdr) >> 8) & 0xff)
-int max_chan_num = 0;
+static int max_chan_num = 0;
static DECLARE_BITMAP(bm_mbox_chans, 4);
static DEFINE_MUTEX(scpi_mtx);
int timeout_ms;
};
+struct scpi_mcu_ver {
+ u32 scpi_ver;
+ char mcu_ver[16];
+};
+
static int high_priority_cmds[] = {
SCPI_CMD_GET_CSS_PWR_STATE,
SCPI_CMD_CFG_PWR_STATE_STAT,
scpi_buf.timeout_ms = SCPI_CMD_DEFAULT_TIMEOUT_MS; \
} while (0)
+#define SCPI_SETUP_DBUF_BY_SIZE(scpi_buf, mbox_buf, _client_id, \
+ _cmd, _tx_buf, _tx_size, _rx_buf) \
+do { \
+ struct rockchip_mbox_msg *pdata = &mbox_buf; \
+ pdata->cmd = _cmd; \
+ pdata->tx_buf = _tx_buf; \
+ pdata->tx_size = _tx_size; \
+ pdata->rx_buf = &_rx_buf; \
+ pdata->rx_size = sizeof(_rx_buf); \
+ scpi_buf.client_id = _client_id; \
+ scpi_buf.data = pdata; \
+ scpi_buf.timeout_ms = SCPI_CMD_DEFAULT_TIMEOUT_MS; \
+} while (0)
+
static int scpi_execute_cmd(struct scpi_data_buf *scpi_buf)
{
struct rockchip_mbox_msg *data;
}
EXPORT_SYMBOL_GPL(scpi_get_sensor_value);
-static int scpi_get_version(u32 old, u32 *ver)
+static int scpi_get_version(u32 old, struct scpi_mcu_ver *ver)
{
+ int ret;
struct scpi_data_buf sdata;
struct rockchip_mbox_msg mdata;
struct __packed {
u32 status;
- u32 ver;
+ struct scpi_mcu_ver version;
} buf;
- int ret;
+ memset(&buf, 0, sizeof(buf));
SCPI_SETUP_DBUF(sdata, mdata, SCPI_CL_SYS, SCPI_SYS_GET_VERSION,
old, buf);
ret = scpi_execute_cmd(&sdata);
- if (ret)
- *ver = buf.ver;
+ if (ret) {
+ pr_err("get scpi version from MCU failed, ret=%d\n", ret);
+ goto OUT;
+ }
+
+ memcpy(ver, &(buf.version), sizeof(*ver));
+OUT:
return ret;
}
}
EXPORT_SYMBOL_GPL(scpi_sys_set_mcu_state_resume);
-int scpi_ddr_init(u32 dram_speed_bin, u32 freq, u32 lcdc_type)
+int scpi_ddr_init(u32 dram_speed_bin, u32 freq, u32 lcdc_type, u32 addr_mcu_el3)
{
struct scpi_data_buf sdata;
struct rockchip_mbox_msg mdata;
u32 dram_speed_bin;
u32 freq;
u32 lcdc_type;
+ u32 addr_mcu_el3;
} tx_buf;
struct __packed2 {
u32 status;
tx_buf.dram_speed_bin = (u32)dram_speed_bin;
tx_buf.freq = (u32)freq;
tx_buf.lcdc_type = (u32)lcdc_type;
-
+ tx_buf.addr_mcu_el3 = addr_mcu_el3;
SCPI_SETUP_DBUF(sdata, mdata, SCPI_CL_DDR,
SCPI_DDR_INIT, tx_buf, rx_buf);
return scpi_execute_cmd(&sdata);
}
EXPORT_SYMBOL_GPL(scpi_ddr_set_clk_rate);
+int scpi_ddr_send_timing(u32 *p, u32 size)
+{
+ struct scpi_data_buf sdata;
+ struct rockchip_mbox_msg mdata;
+ struct __packed2 {
+ u32 status;
+ } rx_buf;
+ SCPI_SETUP_DBUF_BY_SIZE(sdata, mdata, SCPI_CL_DDR,
+ SCPI_DDR_SEND_TIMING, p, size, rx_buf);
+ return scpi_execute_cmd(&sdata);
+}
+EXPORT_SYMBOL_GPL(scpi_ddr_send_timing);
+
int scpi_ddr_round_rate(u32 m_hz)
{
struct scpi_data_buf sdata;
{
int ret = 0;
int retry = 3;
- u32 ver = 0;
- int check_version = 0; /*0: not check version, 1: check version*/
int val = 0;
+ struct scpi_mcu_ver mcu_ver;
+ int check_version = 1; /*0: not check version, 1: check version*/
the_scpi_device = &pdev->dev;
+ /* try to get mboxes chan nums from DT */
+ if (of_property_read_u32((&pdev->dev)->of_node, "chan-nums", &val)) {
+ dev_err(&pdev->dev, "parse mboxes chan-nums failed\n");
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ max_chan_num = val;
+
+ /* try to check up with SCPI version from MCU */
while ((retry--) && (check_version != 0)) {
- ret = scpi_get_version(SCPI_VERSION, &ver);
- if ((ret == 0) && (ver == SCPI_VERSION))
+ memset(&mcu_ver, 0, sizeof(mcu_ver));
+
+ ret = scpi_get_version(SCPI_VERSION, &mcu_ver);
+ if ((ret == 0) && (mcu_ver.scpi_ver == SCPI_VERSION))
break;
}
if ((retry <= 0) && (check_version != 0)) {
- dev_err(&pdev->dev, "Failed to get scpi version\n");
+ dev_err(&pdev->dev,
+ "Scpi verison not match:kernel ver:0x%x, MCU ver:0x%x, ret=%d\n",
+ SCPI_VERSION, mcu_ver.scpi_ver, ret);
ret = -EIO;
goto exit;
}
- /* try to get mboxes chan nums from DT */
- if (of_property_read_u32((&pdev->dev)->of_node, "chan-nums", &val)) {
- dev_err(&pdev->dev, "parse mboxes chan-nums failed\n");
- ret = -EINVAL;
- goto exit;
- }
-
- max_chan_num = val;
+ dev_info(&pdev->dev, "Scpi initialize, version: 0x%x, chan nums: %d\n",
+ mcu_ver.scpi_ver, val);
+ dev_info(&pdev->dev, "MCU version: %s\n", mcu_ver.mcu_ver);
- dev_info(&pdev->dev,
- "Scpi initialize, version: 0x%x, chan nums: %d\n", ver, val);
return 0;
exit:
the_scpi_device = NULL;