kernel-brax3-ubuntu-touch/drivers/gpu/mediatek/gpueb/gpueb_plat_service.c
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

92 lines
No EOL
2.1 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2019 MediaTek Inc.
*/
/**
* @file gpueb_ipi.c
* @brief IPI init flow for gpueb
*/
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
#include <linux/platform_device.h>
#include <linux/regulator/consumer.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/uaccess.h>
#include <linux/random.h>
#include <linux/seq_file.h>
#include <linux/pm_runtime.h>
#include <mboot_params.h>
#include "gpueb_ipi.h"
#include "gpueb_plat_service.h"
#include "gpueb_helper.h"
// MTK common IPI/MBOX
#include <linux/soc/mediatek/mtk_tinysys_ipi.h>
#include <linux/soc/mediatek/mtk-mbox.h>
int plat_service_init_ret;
int gpueb_plat_service_init(struct platform_device *pdev)
{
int ret = 0;
int channel_id = 0;
#if PLAT_IPI_TEST
struct plat_ipi_send_data plat_send_data;
#endif
channel_id = gpueb_get_send_PIN_ID_by_name("IPI_ID_PLATFORM");
if (channel_id == -1) {
gpueb_pr_debug("get channel ID fail!");
return -1;
}
#if !IPI_TEST
// IPI channel - CH_PLATFORM register
ret = mtk_ipi_register(&gpueb_ipidev,
channel_id,
NULL,
NULL,
(void *)&plat_service_init_ret);
if (ret != IPI_ACTION_DONE) {
gpueb_pr_debug("%s: ipi:#%d register fail! ret = %d\n",
__func__, channel_id, ret);
if (ret != IPI_DUPLEX)
return ret;
}
#endif
#if PLAT_IPI_TEST
/* Check gpueb alive and IPI is OK */
plat_send_data.cmd = 0xDEAD;
ret = mtk_ipi_send(
&gpueb_ipidev, // GPUEB's IPI device
channel_id, // Send channel
0, // 0: wait, 1: polling
(void *)&plat_send_data, // Send data
1, // 1 slots message = 1 * 4 = 4 bytes
IPI_TIMEOUT_MS); // Timeout value in milisecond
if (ret != IPI_ACTION_DONE) {
gpueb_pr_info("%s: IPI fail ret=%d\n", __func__, ret);
return ret;
}
ret = mtk_ipi_recv(&gpueb_ipidev, channel_id);
if (ret != IPI_ACTION_DONE) {
gpueb_pr_info("%s: IPI fail ret=%d\n", __func__, ret);
return ret;
}
if (plat_service_init_ret == 1)
gpueb_pr_info("%s: plt IPI success, recv data=%d\n",
__func__, plat_service_init_ret);
#endif // PLAT_IPI_TEST
return ret;
}