mm-drivers: hw_fence: update ipc regs config to support phys-id
Starting pineapple, each ipc client has a different physical-id and virtual-id for registers access and configuration. This change updates the ipc to handle this different configuration. Change-Id: I36fa84b07ffd209ce3fb323ff796f9e7721d7dd2 Signed-off-by: Ingrid Gallardo <quic_ingridg@quicinc.com>
This commit is contained in:
@@ -69,7 +69,8 @@ int process_validation_client_loopback(struct hw_fence_driver_data *drv_data, in
|
|||||||
extern const struct file_operations hw_sync_debugfs_fops;
|
extern const struct file_operations hw_sync_debugfs_fops;
|
||||||
|
|
||||||
struct hw_fence_out_clients_map {
|
struct hw_fence_out_clients_map {
|
||||||
int ipc_client_id; /* ipc client id for the hw fence client */
|
int ipc_client_id_vid; /* ipc client virtual id for the hw fence client */
|
||||||
|
int ipc_client_id_pid; /* ipc client physical id for the hw fence client */
|
||||||
int ipc_signal_id; /* ipc signal id for the hw fence client */
|
int ipc_signal_id; /* ipc signal id for the hw fence client */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -81,21 +82,21 @@ struct hw_fence_out_clients_map {
|
|||||||
*/
|
*/
|
||||||
static const struct hw_fence_out_clients_map
|
static const struct hw_fence_out_clients_map
|
||||||
dbg_out_clients_signal_map_no_dpu[HW_FENCE_CLIENT_MAX] = {
|
dbg_out_clients_signal_map_no_dpu[HW_FENCE_CLIENT_MAX] = {
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 0}, /* CTRL_LOOPBACK */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 0}, /* CTRL_LOOPBACK */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_GPU, 0}, /* CTX0 */
|
{HW_FENCE_IPC_CLIENT_ID_GPU_VID, HW_FENCE_IPC_CLIENT_ID_GPU_VID, 0}, /* CTX0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 2}, /* CTL0 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 2}, /* CTL0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 4}, /* CTL1 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 4}, /* CTL1 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 6}, /* CTL2 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 6}, /* CTL2 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 8}, /* CTL3 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 8}, /* CTL3 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 10}, /* CTL4 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 10}, /* CTL4 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 12}, /* CTL5 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 12}, /* CTL5 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 21}, /* VAL0 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 21}, /* VAL0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 22}, /* VAL1 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 22}, /* VAL1 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 23}, /* VAL2 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 23}, /* VAL2 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 24}, /* VAL3 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 24}, /* VAL3 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 25}, /* VAL4 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 25}, /* VAL4 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 26}, /* VAL5 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 26}, /* VAL5 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 27}, /* VAL6 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 27}, /* VAL6 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -6,17 +6,26 @@
|
|||||||
#ifndef __HW_FENCE_DRV_IPC_H
|
#ifndef __HW_FENCE_DRV_IPC_H
|
||||||
#define __HW_FENCE_DRV_IPC_H
|
#define __HW_FENCE_DRV_IPC_H
|
||||||
|
|
||||||
#define HW_FENCE_IPC_CLIENT_ID_APPS 8
|
/* ipc clients virtual client-id */
|
||||||
#define HW_FENCE_IPC_CLIENT_ID_GPU 9
|
#define HW_FENCE_IPC_CLIENT_ID_APPS_VID 8
|
||||||
#define HW_FENCE_IPC_CLIENT_ID_DPU 25
|
#define HW_FENCE_IPC_CLIENT_ID_GPU_VID 9
|
||||||
|
#define HW_FENCE_IPC_CLIENT_ID_DPU_VID 25
|
||||||
|
|
||||||
|
/* ipc clients physical client-id */
|
||||||
|
#define HW_FENCE_IPC_CLIENT_ID_APPS_PID 3
|
||||||
|
#define HW_FENCE_IPC_CLIENT_ID_GPU_PID 4
|
||||||
|
#define HW_FENCE_IPC_CLIENT_ID_DPU_PID 9
|
||||||
|
|
||||||
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA 2
|
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA 2
|
||||||
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_WAIPIO 1
|
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_WAIPIO 1
|
||||||
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_KAILUA 2
|
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_KALAMA 2
|
||||||
|
#define HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_PINEAPPLE 2
|
||||||
|
#define HW_FENCE_IPC_FENCE_PROTOCOL_ID_PINEAPPLE 4
|
||||||
|
|
||||||
#define HW_FENCE_IPCC_HW_REV_100 0x00010000 /* Lahaina */
|
#define HW_FENCE_IPCC_HW_REV_100 0x00010000 /* Lahaina */
|
||||||
#define HW_FENCE_IPCC_HW_REV_110 0x00010100 /* Waipio */
|
#define HW_FENCE_IPCC_HW_REV_110 0x00010100 /* Waipio */
|
||||||
#define HW_FENCE_IPCC_HW_REV_170 0x00010700 /* Kailua */
|
#define HW_FENCE_IPCC_HW_REV_170 0x00010700 /* Kalama */
|
||||||
|
#define HW_FENCE_IPCC_HW_REV_203 0x00020003 /* Pineapple */
|
||||||
|
|
||||||
#define IPC_PROTOCOLp_CLIENTc_VERSION(base, p, c) (base + (0x40000*p) + (0x1000*c))
|
#define IPC_PROTOCOLp_CLIENTc_VERSION(base, p, c) (base + (0x40000*p) + (0x1000*c))
|
||||||
#define IPC_PROTOCOLp_CLIENTc_CONFIG(base, p, c) (base + 0x8 + (0x40000*p) + (0x1000*c))
|
#define IPC_PROTOCOLp_CLIENTc_CONFIG(base, p, c) (base + 0x8 + (0x40000*p) + (0x1000*c))
|
||||||
@@ -55,8 +64,8 @@ int hw_fence_ipcc_enable_dpu_signaling(struct hw_fence_driver_data *drv_data);
|
|||||||
#endif /* HW_DPU_IPCC */
|
#endif /* HW_DPU_IPCC */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hw_fence_ipcc_get_client_id() - Returns the ipc client id that corresponds to the hw fence
|
* hw_fence_ipcc_get_client_virt_id() - Returns the ipc client virtual id that corresponds to the
|
||||||
* driver client.
|
* hw fence driver client.
|
||||||
* @drv_data: driver data.
|
* @drv_data: driver data.
|
||||||
* @client_id: hw fence driver client id.
|
* @client_id: hw fence driver client id.
|
||||||
*
|
*
|
||||||
@@ -64,7 +73,19 @@ int hw_fence_ipcc_enable_dpu_signaling(struct hw_fence_driver_data *drv_data);
|
|||||||
*
|
*
|
||||||
* Return: client_id on success or negative errno (-EINVAL)
|
* Return: client_id on success or negative errno (-EINVAL)
|
||||||
*/
|
*/
|
||||||
int hw_fence_ipcc_get_client_id(struct hw_fence_driver_data *drv_data, u32 client_id);
|
int hw_fence_ipcc_get_client_virt_id(struct hw_fence_driver_data *drv_data, u32 client_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hw_fence_ipcc_get_client_phys_id() - Returns the ipc client physical id that corresponds to the
|
||||||
|
* hw fence driver client.
|
||||||
|
* @drv_data: driver data.
|
||||||
|
* @client_id: hw fence driver client id.
|
||||||
|
*
|
||||||
|
* The ipc client id returned by this API is used by the hw fence driver when signaling the fence.
|
||||||
|
*
|
||||||
|
* Return: client_id on success or negative errno (-EINVAL)
|
||||||
|
*/
|
||||||
|
int hw_fence_ipcc_get_client_phys_id(struct hw_fence_driver_data *drv_data, u32 client_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hw_fence_ipcc_get_signal_id() - Returns the ipc signal id that corresponds to the hw fence
|
* hw_fence_ipcc_get_signal_id() - Returns the ipc signal id that corresponds to the hw fence
|
||||||
|
@@ -148,7 +148,8 @@ enum payload_type {
|
|||||||
* @mem_descriptor: hfi header memory descriptor
|
* @mem_descriptor: hfi header memory descriptor
|
||||||
* @queues: queues descriptor
|
* @queues: queues descriptor
|
||||||
* @ipc_signal_id: id of the signal to be triggered for this client
|
* @ipc_signal_id: id of the signal to be triggered for this client
|
||||||
* @ipc_client_id: id of the ipc client for this hw fence driver client
|
* @ipc_client_vid: virtual id of the ipc client for this hw fence driver client
|
||||||
|
* @ipc_client_pid: physical id of the ipc client for this hw fence driver client
|
||||||
* @update_rxq: bool to indicate if client uses rx-queue
|
* @update_rxq: bool to indicate if client uses rx-queue
|
||||||
* @send_ipc: bool to indicate if client requires ipc interrupt for already signaled fences
|
* @send_ipc: bool to indicate if client requires ipc interrupt for already signaled fences
|
||||||
* @wait_queue: wait queue for the validation clients
|
* @wait_queue: wait queue for the validation clients
|
||||||
@@ -159,7 +160,8 @@ struct msm_hw_fence_client {
|
|||||||
struct msm_hw_fence_mem_addr mem_descriptor;
|
struct msm_hw_fence_mem_addr mem_descriptor;
|
||||||
struct msm_hw_fence_queue queues[HW_FENCE_CLIENT_QUEUES];
|
struct msm_hw_fence_queue queues[HW_FENCE_CLIENT_QUEUES];
|
||||||
int ipc_signal_id;
|
int ipc_signal_id;
|
||||||
int ipc_client_id;
|
int ipc_client_vid;
|
||||||
|
int ipc_client_pid;
|
||||||
bool update_rxq;
|
bool update_rxq;
|
||||||
bool send_ipc;
|
bool send_ipc;
|
||||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||||
@@ -238,7 +240,8 @@ struct msm_hw_fence_dbg_data {
|
|||||||
* @ipcc_io_mem: base for the ipcc io mem map
|
* @ipcc_io_mem: base for the ipcc io mem map
|
||||||
* @ipcc_size: size of the ipcc io mem mapping
|
* @ipcc_size: size of the ipcc io mem mapping
|
||||||
* @protocol_id: ipcc protocol id used by this driver
|
* @protocol_id: ipcc protocol id used by this driver
|
||||||
* @ipcc_client_id: ipcc client id for this driver
|
* @ipcc_client_vid: ipcc client virtual-id for this driver
|
||||||
|
* @ipcc_client_pid: ipcc client physical-id for this driver
|
||||||
* @ipc_clients_table: table with the ipcc mapping for each client of this driver
|
* @ipc_clients_table: table with the ipcc mapping for each client of this driver
|
||||||
* @qtime_reg_base: qtimer register base address
|
* @qtime_reg_base: qtimer register base address
|
||||||
* @qtime_io_mem: qtimer io mem map
|
* @qtime_io_mem: qtimer io mem map
|
||||||
@@ -304,7 +307,8 @@ struct hw_fence_driver_data {
|
|||||||
void __iomem *ipcc_io_mem;
|
void __iomem *ipcc_io_mem;
|
||||||
uint32_t ipcc_size;
|
uint32_t ipcc_size;
|
||||||
u32 protocol_id;
|
u32 protocol_id;
|
||||||
u32 ipcc_client_id;
|
u32 ipcc_client_vid;
|
||||||
|
u32 ipcc_client_pid;
|
||||||
|
|
||||||
/* table with mapping of ipc client for each hw-fence client */
|
/* table with mapping of ipc client for each hw-fence client */
|
||||||
struct hw_fence_client_ipc_map *ipc_clients_table;
|
struct hw_fence_client_ipc_map *ipc_clients_table;
|
||||||
|
@@ -106,8 +106,10 @@ static int _debugfs_ipcc_trigger(struct file *file, const char __user *user_buf,
|
|||||||
static ssize_t hw_fence_dbg_ipcc_write(struct file *file, const char __user *user_buf,
|
static ssize_t hw_fence_dbg_ipcc_write(struct file *file, const char __user *user_buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
return _debugfs_ipcc_trigger(file, user_buf, count, ppos, HW_FENCE_IPC_CLIENT_ID_APPS,
|
struct hw_fence_driver_data *drv_data = file->private_data;
|
||||||
HW_FENCE_IPC_CLIENT_ID_APPS);
|
|
||||||
|
return _debugfs_ipcc_trigger(file, user_buf, count, ppos, drv_data->ipcc_client_pid,
|
||||||
|
drv_data->ipcc_client_vid);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HW_DPU_IPCC
|
#ifdef HW_DPU_IPCC
|
||||||
@@ -124,8 +126,10 @@ static ssize_t hw_fence_dbg_ipcc_write(struct file *file, const char __user *use
|
|||||||
static ssize_t hw_fence_dbg_ipcc_dpu_write(struct file *file, const char __user *user_buf,
|
static ssize_t hw_fence_dbg_ipcc_dpu_write(struct file *file, const char __user *user_buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
return _debugfs_ipcc_trigger(file, user_buf, count, ppos, HW_FENCE_IPC_CLIENT_ID_APPS,
|
struct hw_fence_driver_data *drv_data = file->private_data;
|
||||||
HW_FENCE_IPC_CLIENT_ID_DPU);
|
|
||||||
|
return _debugfs_ipcc_trigger(file, user_buf, count, ppos, drv_data->ipcc_client_pid,
|
||||||
|
hw_fence_ipcc_get_client_virt_id(drv_data, HW_FENCE_CLIENT_ID_CTL0));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,8 +365,8 @@ static ssize_t hw_fence_dbg_tx_and_signal_clients_wr(struct file *file,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Write to ipcc to trigger the irq */
|
/* Write to ipcc to trigger the irq */
|
||||||
tx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
tx_client = drv_data->ipcc_client_pid;
|
||||||
rx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
rx_client = drv_data->ipcc_client_vid;
|
||||||
HWFNC_DBG_IRQ("client:%d tx_client:%d rx_client:%d signal:%d delay:%d in_data%d\n",
|
HWFNC_DBG_IRQ("client:%d tx_client:%d rx_client:%d signal:%d delay:%d in_data%d\n",
|
||||||
client_id_src, tx_client, rx_client, signal_id,
|
client_id_src, tx_client, rx_client, signal_id,
|
||||||
drv_data->debugfs_data.hw_fence_sim_release_delay, input_data);
|
drv_data->debugfs_data.hw_fence_sim_release_delay, input_data);
|
||||||
@@ -866,8 +870,8 @@ static ssize_t hw_fence_dbg_create_join_fence(struct file *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* write to ipcc to trigger the irq */
|
/* write to ipcc to trigger the irq */
|
||||||
tx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
tx_client = drv_data->ipcc_client_pid;
|
||||||
rx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
rx_client = drv_data->ipcc_client_vid;
|
||||||
hw_fence_ipcc_trigger_signal(drv_data, tx_client, rx_client, signal_id);
|
hw_fence_ipcc_trigger_signal(drv_data, tx_client, rx_client, signal_id);
|
||||||
|
|
||||||
usleep_range(drv_data->debugfs_data.hw_fence_sim_release_delay,
|
usleep_range(drv_data->debugfs_data.hw_fence_sim_release_delay,
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/of_platform.h>
|
||||||
#include "hw_fence_drv_priv.h"
|
#include "hw_fence_drv_priv.h"
|
||||||
#include "hw_fence_drv_utils.h"
|
#include "hw_fence_drv_utils.h"
|
||||||
#include "hw_fence_drv_ipc.h"
|
#include "hw_fence_drv_ipc.h"
|
||||||
@@ -10,13 +11,15 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* struct hw_fence_client_ipc_map - map client id with ipc signal for trigger.
|
* struct hw_fence_client_ipc_map - map client id with ipc signal for trigger.
|
||||||
* @ipc_client_id: ipc client id for the hw-fence client.
|
* @ipc_client_id_virt: virtual ipc client id for the hw-fence client.
|
||||||
|
* @ipc_client_id_phys: physical ipc client id for the hw-fence client.
|
||||||
* @ipc_signal_id: ipc signal id for the hw-fence client.
|
* @ipc_signal_id: ipc signal id for the hw-fence client.
|
||||||
* @update_rxq: bool to indicate if clinet uses rx-queue.
|
* @update_rxq: bool to indicate if clinet uses rx-queue.
|
||||||
* @send_ipc: bool to indicate if client requires ipc interrupt for signaled fences
|
* @send_ipc: bool to indicate if client requires ipc interrupt for signaled fences
|
||||||
*/
|
*/
|
||||||
struct hw_fence_client_ipc_map {
|
struct hw_fence_client_ipc_map {
|
||||||
int ipc_client_id;
|
int ipc_client_id_virt;
|
||||||
|
int ipc_client_id_phys;
|
||||||
int ipc_signal_id;
|
int ipc_signal_id;
|
||||||
bool update_rxq;
|
bool update_rxq;
|
||||||
bool send_ipc;
|
bool send_ipc;
|
||||||
@@ -34,22 +37,22 @@ struct hw_fence_client_ipc_map {
|
|||||||
* {HW_FENCE_IPC_CLIENT_ID_APPS, 20}.
|
* {HW_FENCE_IPC_CLIENT_ID_APPS, 20}.
|
||||||
*/
|
*/
|
||||||
struct hw_fence_client_ipc_map hw_fence_clients_ipc_map_no_dpu[HW_FENCE_CLIENT_MAX] = {
|
struct hw_fence_client_ipc_map hw_fence_clients_ipc_map_no_dpu[HW_FENCE_CLIENT_MAX] = {
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 1, true, true}, /* ctrl queue loopback */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 1, true, true},/* ctrlq*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_GPU, 0, false, false}, /* ctx0 */
|
{HW_FENCE_IPC_CLIENT_ID_GPU_VID, HW_FENCE_IPC_CLIENT_ID_GPU_VID, 0, false, false},/* ctx0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 14, false, true}, /* ctl0 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 14, false, true},/*ctl0*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 15, false, true}, /* ctl1 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 15, false, true},/*ctl1*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 16, false, true}, /* ctl2 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 16, false, true},/*ctl2*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 17, false, true}, /* ctl3 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 17, false, true},/*ctl3*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 18, false, true}, /* ctl4 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 18, false, true},/*ctl4*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 19, false, true}, /* ctl5 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 19, false, true},/*ctl5*/
|
||||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 21, true, true}, /* val0 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 21, true, true},/* val0*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 22, true, true}, /* val1 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 22, true, true},/* val1*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 23, true, true}, /* val2 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 23, true, true},/* val2*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 24, true, true}, /* val3 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 24, true, true},/* val3*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 25, true, true}, /* val4 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 25, true, true},/* val4*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 26, true, true}, /* val5 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 26, true, true},/* val5*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 27, true, true}, /* val6 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 27, true, true},/* val6*/
|
||||||
#endif /* CONFIG_DEBUG_FS */
|
#endif /* CONFIG_DEBUG_FS */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -62,31 +65,67 @@ struct hw_fence_client_ipc_map hw_fence_clients_ipc_map_no_dpu[HW_FENCE_CLIENT_M
|
|||||||
* Note that the index of this struct must match the enum hw_fence_client_id
|
* Note that the index of this struct must match the enum hw_fence_client_id
|
||||||
*/
|
*/
|
||||||
struct hw_fence_client_ipc_map hw_fence_clients_ipc_map[HW_FENCE_CLIENT_MAX] = {
|
struct hw_fence_client_ipc_map hw_fence_clients_ipc_map[HW_FENCE_CLIENT_MAX] = {
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 1, true, true}, /* ctrl queue loopback */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 1, true, true},/*ctrl q*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_GPU, 0, false, false}, /* ctx0 */
|
{HW_FENCE_IPC_CLIENT_ID_GPU_VID, HW_FENCE_IPC_CLIENT_ID_GPU_VID, 0, false, false},/*ctx0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 0, false, true}, /* ctl0 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 0, false, true},/* ctl0 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 1, false, true}, /* ctl1 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 1, false, true},/* ctl1 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 2, false, true}, /* ctl2 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 2, false, true},/* ctl2 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 3, false, true}, /* ctl3 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 3, false, true},/* ctl3 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 4, false, true}, /* ctl4 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 4, false, true},/* ctl4 */
|
||||||
{HW_FENCE_IPC_CLIENT_ID_DPU, 5, false, true}, /* ctl5 */
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_VID, 5, false, true},/* ctl5 */
|
||||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 21, true, true}, /* val0 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 21, true, true},/* val0*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 22, true, true}, /* val1 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 22, true, true},/* val1*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 23, true, true}, /* val2 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 23, true, true},/* val2*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 24, true, true}, /* val3 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 24, true, true},/* val3*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 25, true, true}, /* val4 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 25, true, true},/* val4*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 26, true, true}, /* val5 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 26, true, true},/* val5*/
|
||||||
{HW_FENCE_IPC_CLIENT_ID_APPS, 27, true, true}, /* val6 */
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_VID, 27, true, true},/* val6*/
|
||||||
#endif /* CONFIG_DEBUG_FS */
|
#endif /* CONFIG_DEBUG_FS */
|
||||||
};
|
};
|
||||||
|
|
||||||
int hw_fence_ipcc_get_client_id(struct hw_fence_driver_data *drv_data, u32 client_id)
|
/**
|
||||||
|
* struct hw_fence_clients_ipc_map_v2 - Table makes the 'client to signal' mapping, which is
|
||||||
|
* used by the hw fence driver to trigger ipc signal when hw fence is already
|
||||||
|
* signaled.
|
||||||
|
* This version is for targets that support dpu client id and IPC v2.
|
||||||
|
*
|
||||||
|
* Note that the index of this struct must match the enum hw_fence_client_id
|
||||||
|
*/
|
||||||
|
struct hw_fence_client_ipc_map hw_fence_clients_ipc_map_v2[HW_FENCE_CLIENT_MAX] = {
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 1, true, true},/*ctrlq */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_GPU_VID, HW_FENCE_IPC_CLIENT_ID_GPU_PID, 0, false, false},/* ctx0*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 0, false, true},/* ctl0 */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 1, false, true},/* ctl1 */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 2, false, true},/* ctl2 */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 3, false, true},/* ctl3 */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 4, false, true},/* ctl4 */
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_DPU_VID, HW_FENCE_IPC_CLIENT_ID_DPU_PID, 5, false, true},/* ctl5 */
|
||||||
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 21, true, true},/* val0*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 22, true, true},/* val1*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 23, true, true},/* val2*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 24, true, true},/* val3*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 25, true, true},/* val4*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 26, true, true},/* val5*/
|
||||||
|
{HW_FENCE_IPC_CLIENT_ID_APPS_VID, HW_FENCE_IPC_CLIENT_ID_APPS_PID, 27, true, true},/* val6*/
|
||||||
|
#endif /* CONFIG_DEBUG_FS */
|
||||||
|
};
|
||||||
|
|
||||||
|
int hw_fence_ipcc_get_client_virt_id(struct hw_fence_driver_data *drv_data, u32 client_id)
|
||||||
{
|
{
|
||||||
if (!drv_data || client_id >= HW_FENCE_CLIENT_MAX)
|
if (!drv_data || client_id >= HW_FENCE_CLIENT_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return drv_data->ipc_clients_table[client_id].ipc_client_id;
|
return drv_data->ipc_clients_table[client_id].ipc_client_id_virt;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hw_fence_ipcc_get_client_phys_id(struct hw_fence_driver_data *drv_data, u32 client_id)
|
||||||
|
{
|
||||||
|
if (!drv_data || client_id >= HW_FENCE_CLIENT_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return drv_data->ipc_clients_table[client_id].ipc_client_id_phys;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hw_fence_ipcc_get_signal_id(struct hw_fence_driver_data *drv_data, u32 client_id)
|
int hw_fence_ipcc_get_signal_id(struct hw_fence_driver_data *drv_data, u32 client_id)
|
||||||
@@ -114,36 +153,53 @@ bool hw_fence_ipcc_needs_ipc_irq(struct hw_fence_driver_data *drv_data, int clie
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _get_ipc_client_name() - Returns ipc client name, used for debugging.
|
* _get_ipc_phys_client_name() - Returns ipc client name from its physical id, used for debugging.
|
||||||
*/
|
*/
|
||||||
static inline char *_get_ipc_client_name(u32 client_id)
|
static inline char *_get_ipc_phys_client_name(u32 client_id)
|
||||||
{
|
{
|
||||||
switch (client_id) {
|
switch (client_id) {
|
||||||
case HW_FENCE_IPC_CLIENT_ID_APPS:
|
case HW_FENCE_IPC_CLIENT_ID_APPS_PID:
|
||||||
return "APPS";
|
return "APPS_PID";
|
||||||
case HW_FENCE_IPC_CLIENT_ID_GPU:
|
case HW_FENCE_IPC_CLIENT_ID_GPU_PID:
|
||||||
return "GPU";
|
return "GPU_PID";
|
||||||
case HW_FENCE_IPC_CLIENT_ID_DPU:
|
case HW_FENCE_IPC_CLIENT_ID_DPU_PID:
|
||||||
return "DPU";
|
return "DPU_PID";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "UNKNOWN";
|
return "UNKNOWN_PID";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _get_ipc_virt_client_name() - Returns ipc client name from its virtual id, used for debugging.
|
||||||
|
*/
|
||||||
|
static inline char *_get_ipc_virt_client_name(u32 client_id)
|
||||||
|
{
|
||||||
|
switch (client_id) {
|
||||||
|
case HW_FENCE_IPC_CLIENT_ID_APPS_VID:
|
||||||
|
return "APPS_VID";
|
||||||
|
case HW_FENCE_IPC_CLIENT_ID_GPU_VID:
|
||||||
|
return "GPU_VID";
|
||||||
|
case HW_FENCE_IPC_CLIENT_ID_DPU_VID:
|
||||||
|
return "DPU_VID";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "UNKNOWN_VID";
|
||||||
}
|
}
|
||||||
|
|
||||||
void hw_fence_ipcc_trigger_signal(struct hw_fence_driver_data *drv_data,
|
void hw_fence_ipcc_trigger_signal(struct hw_fence_driver_data *drv_data,
|
||||||
u32 tx_client_id, u32 rx_client_id, u32 signal_id)
|
u32 tx_client_pid, u32 rx_client_vid, u32 signal_id)
|
||||||
{
|
{
|
||||||
void __iomem *ptr;
|
void __iomem *ptr;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
/* Send signal */
|
/* Send signal */
|
||||||
ptr = IPC_PROTOCOLp_CLIENTc_SEND(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
ptr = IPC_PROTOCOLp_CLIENTc_SEND(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
||||||
tx_client_id);
|
tx_client_pid);
|
||||||
val = (rx_client_id << 16) | signal_id;
|
val = (rx_client_vid << 16) | signal_id;
|
||||||
|
|
||||||
HWFNC_DBG_IRQ("Sending ipcc from %s (%d) to %s (%d) signal_id:%d [wr:0x%x to off:0x%pK]\n",
|
HWFNC_DBG_IRQ("Sending ipcc from %s (%d) to %s (%d) signal_id:%d [wr:0x%x to off:0x%pK]\n",
|
||||||
_get_ipc_client_name(tx_client_id), tx_client_id,
|
_get_ipc_phys_client_name(tx_client_pid), tx_client_pid,
|
||||||
_get_ipc_client_name(rx_client_id), rx_client_id,
|
_get_ipc_virt_client_name(rx_client_vid), rx_client_vid,
|
||||||
signal_id, val, ptr);
|
signal_id, val, ptr);
|
||||||
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
||||||
writel_relaxed(val, ptr);
|
writel_relaxed(val, ptr);
|
||||||
@@ -162,22 +218,32 @@ static int _hw_fence_ipcc_hwrev_init(struct hw_fence_driver_data *drv_data, u32
|
|||||||
{
|
{
|
||||||
switch (hwrev) {
|
switch (hwrev) {
|
||||||
case HW_FENCE_IPCC_HW_REV_100:
|
case HW_FENCE_IPCC_HW_REV_100:
|
||||||
drv_data->ipcc_client_id = HW_FENCE_IPC_CLIENT_ID_APPS;
|
drv_data->ipcc_client_vid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
|
drv_data->ipcc_client_pid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA;
|
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA;
|
||||||
drv_data->ipc_clients_table = hw_fence_clients_ipc_map_no_dpu;
|
drv_data->ipc_clients_table = hw_fence_clients_ipc_map_no_dpu;
|
||||||
HWFNC_DBG_INIT("ipcc protocol_id: Lahaina\n");
|
HWFNC_DBG_INIT("ipcc protocol_id: Lahaina\n");
|
||||||
break;
|
break;
|
||||||
case HW_FENCE_IPCC_HW_REV_110:
|
case HW_FENCE_IPCC_HW_REV_110:
|
||||||
drv_data->ipcc_client_id = HW_FENCE_IPC_CLIENT_ID_APPS;
|
drv_data->ipcc_client_vid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
|
drv_data->ipcc_client_pid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_WAIPIO;
|
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_WAIPIO;
|
||||||
drv_data->ipc_clients_table = hw_fence_clients_ipc_map_no_dpu;
|
drv_data->ipc_clients_table = hw_fence_clients_ipc_map_no_dpu;
|
||||||
HWFNC_DBG_INIT("ipcc protocol_id: Waipio\n");
|
HWFNC_DBG_INIT("ipcc protocol_id: Waipio\n");
|
||||||
break;
|
break;
|
||||||
case HW_FENCE_IPCC_HW_REV_170:
|
case HW_FENCE_IPCC_HW_REV_170:
|
||||||
drv_data->ipcc_client_id = HW_FENCE_IPC_CLIENT_ID_APPS;
|
drv_data->ipcc_client_vid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_KAILUA;
|
drv_data->ipcc_client_pid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
|
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_KALAMA;
|
||||||
drv_data->ipc_clients_table = hw_fence_clients_ipc_map;
|
drv_data->ipc_clients_table = hw_fence_clients_ipc_map;
|
||||||
HWFNC_DBG_INIT("ipcc protocol_id: Kailua\n");
|
HWFNC_DBG_INIT("ipcc protocol_id: Kalama\n");
|
||||||
|
break;
|
||||||
|
case HW_FENCE_IPCC_HW_REV_203:
|
||||||
|
drv_data->ipcc_client_vid = HW_FENCE_IPC_CLIENT_ID_APPS_VID;
|
||||||
|
drv_data->ipcc_client_pid = HW_FENCE_IPC_CLIENT_ID_APPS_PID;
|
||||||
|
drv_data->protocol_id = HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_PINEAPPLE; /* Fence */
|
||||||
|
drv_data->ipc_clients_table = hw_fence_clients_ipc_map_v2;
|
||||||
|
HWFNC_DBG_INIT("ipcc protocol_id: Pineapple\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
@@ -190,13 +256,25 @@ int hw_fence_ipcc_enable_signaling(struct hw_fence_driver_data *drv_data)
|
|||||||
{
|
{
|
||||||
void __iomem *ptr;
|
void __iomem *ptr;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
HWFNC_DBG_H("enable ipc +\n");
|
HWFNC_DBG_H("enable ipc +\n");
|
||||||
|
|
||||||
/* Read IPC Version from Client=0x8 (apps) for protocol=2 (compute_l1) */
|
/**
|
||||||
val = readl_relaxed(IPC_PROTOCOLp_CLIENTc_VERSION(drv_data->ipcc_io_mem,
|
* Attempt to read the ipc version from dt, if not available, then attempt
|
||||||
HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA, HW_FENCE_IPC_CLIENT_ID_APPS));
|
* to read from the registers.
|
||||||
HWFNC_DBG_INIT("ipcc version:0x%x\n", val);
|
*/
|
||||||
|
ret = of_property_read_u32(drv_data->dev->of_node, "qcom,hw-fence-ipc-ver", &val);
|
||||||
|
if (ret || !val) {
|
||||||
|
/* if no device tree prop, attempt to get the version from the registers*/
|
||||||
|
HWFNC_DBG_H("missing hw fences ipc-ver entry or invalid ret:%d val:%d\n", ret, val);
|
||||||
|
|
||||||
|
/* Read IPC Version from Client=0x8 (apps) for protocol=2 (compute_l1) */
|
||||||
|
val = readl_relaxed(IPC_PROTOCOLp_CLIENTc_VERSION(drv_data->ipcc_io_mem,
|
||||||
|
HW_FENCE_IPC_COMPUTE_L1_PROTOCOL_ID_LAHAINA,
|
||||||
|
HW_FENCE_IPC_CLIENT_ID_APPS_VID));
|
||||||
|
HWFNC_DBG_INIT("ipcc version:0x%x\n", val);
|
||||||
|
}
|
||||||
|
|
||||||
if (_hw_fence_ipcc_hwrev_init(drv_data, val)) {
|
if (_hw_fence_ipcc_hwrev_init(drv_data, val)) {
|
||||||
HWFNC_ERR("ipcc protocol id not supported\n");
|
HWFNC_ERR("ipcc protocol id not supported\n");
|
||||||
@@ -206,14 +284,14 @@ int hw_fence_ipcc_enable_signaling(struct hw_fence_driver_data *drv_data)
|
|||||||
/* Enable compute l1 (protocol_id = 2) */
|
/* Enable compute l1 (protocol_id = 2) */
|
||||||
val = 0x00000000;
|
val = 0x00000000;
|
||||||
ptr = IPC_PROTOCOLp_CLIENTc_CONFIG(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
ptr = IPC_PROTOCOLp_CLIENTc_CONFIG(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
||||||
HW_FENCE_IPC_CLIENT_ID_APPS);
|
drv_data->ipcc_client_pid);
|
||||||
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
||||||
writel_relaxed(val, ptr);
|
writel_relaxed(val, ptr);
|
||||||
|
|
||||||
/* Enable Client-Signal pairs from APPS(NS) (0x8) to APPS(NS) (0x8) */
|
/* Enable Client-Signal pairs from APPS(NS) (0x8) to APPS(NS) (0x8) */
|
||||||
val = 0x000080000;
|
val = 0x000080000;
|
||||||
ptr = IPC_PROTOCOLp_CLIENTc_RECV_SIGNAL_ENABLE(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
ptr = IPC_PROTOCOLp_CLIENTc_RECV_SIGNAL_ENABLE(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
||||||
HW_FENCE_IPC_CLIENT_ID_APPS);
|
drv_data->ipcc_client_pid);
|
||||||
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%pK\n", val, ptr);
|
||||||
writel_relaxed(val, ptr);
|
writel_relaxed(val, ptr);
|
||||||
|
|
||||||
@@ -226,6 +304,7 @@ int hw_fence_ipcc_enable_signaling(struct hw_fence_driver_data *drv_data)
|
|||||||
int hw_fence_ipcc_enable_dpu_signaling(struct hw_fence_driver_data *drv_data)
|
int hw_fence_ipcc_enable_dpu_signaling(struct hw_fence_driver_data *drv_data)
|
||||||
{
|
{
|
||||||
struct hw_fence_client_ipc_map *hw_fence_client;
|
struct hw_fence_client_ipc_map *hw_fence_client;
|
||||||
|
bool protocol_enabled = false;
|
||||||
void __iomem *ptr;
|
void __iomem *ptr;
|
||||||
u32 val;
|
u32 val;
|
||||||
int i;
|
int i;
|
||||||
@@ -239,31 +318,41 @@ int hw_fence_ipcc_enable_dpu_signaling(struct hw_fence_driver_data *drv_data)
|
|||||||
|
|
||||||
HWFNC_DBG_H("ipcc_io_mem:0x%lx\n", (u64)drv_data->ipcc_io_mem);
|
HWFNC_DBG_H("ipcc_io_mem:0x%lx\n", (u64)drv_data->ipcc_io_mem);
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable compute l1 (protocol_id = 2) for dpu (25)
|
|
||||||
* Sets bit(1) to clear when RECV_ID is read
|
|
||||||
*/
|
|
||||||
val = 0x00000001;
|
|
||||||
ptr = IPC_PROTOCOLp_CLIENTc_CONFIG(drv_data->ipcc_io_mem, drv_data->protocol_id,
|
|
||||||
HW_FENCE_IPC_CLIENT_ID_DPU);
|
|
||||||
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%lx\n", val, (u64)ptr);
|
|
||||||
writel_relaxed(val, ptr);
|
|
||||||
|
|
||||||
HWFNC_DBG_H("Initialize dpu signals\n");
|
HWFNC_DBG_H("Initialize dpu signals\n");
|
||||||
/* Enable Client-Signal pairs from DPU (25) to APPS(NS) (8) */
|
/* Enable Client-Signal pairs from DPU (25) to APPS(NS) (8) */
|
||||||
for (i = 0; i < HW_FENCE_CLIENT_MAX; i++) {
|
for (i = 0; i < HW_FENCE_CLIENT_MAX; i++) {
|
||||||
hw_fence_client = &drv_data->ipc_clients_table[i];
|
hw_fence_client = &drv_data->ipc_clients_table[i];
|
||||||
|
|
||||||
/* skip any client that is not a dpu client */
|
/* skip any client that is not a dpu client */
|
||||||
if (hw_fence_client->ipc_client_id != HW_FENCE_IPC_CLIENT_ID_DPU)
|
if (hw_fence_client->ipc_client_id_virt != HW_FENCE_IPC_CLIENT_ID_DPU_VID)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!protocol_enabled) {
|
||||||
|
/*
|
||||||
|
* First DPU client will enable the protocol for dpu, e.g. compute l1
|
||||||
|
* (protocol_id = 2) or fencing protocol, depending on the target, for the
|
||||||
|
* dpu client (vid = 25, pid = 9).
|
||||||
|
* Sets bit(1) to clear when RECV_ID is read
|
||||||
|
*/
|
||||||
|
val = 0x00000001;
|
||||||
|
ptr = IPC_PROTOCOLp_CLIENTc_CONFIG(drv_data->ipcc_io_mem,
|
||||||
|
drv_data->protocol_id, hw_fence_client->ipc_client_id_phys);
|
||||||
|
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%lx\n", val, (u64)ptr);
|
||||||
|
writel_relaxed(val, ptr);
|
||||||
|
|
||||||
|
protocol_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Enable signals for dpu client */
|
/* Enable signals for dpu client */
|
||||||
HWFNC_DBG_H("dpu:%d client:%d signal:%d\n", hw_fence_client->ipc_client_id, i,
|
HWFNC_DBG_H("dpu client:%d vid:%d pid:%d signal:%d\n", i,
|
||||||
|
hw_fence_client->ipc_client_id_virt, hw_fence_client->ipc_client_id_phys,
|
||||||
hw_fence_client->ipc_signal_id);
|
hw_fence_client->ipc_signal_id);
|
||||||
val = 0x000080000 | (hw_fence_client->ipc_signal_id & 0xFFFF);
|
|
||||||
|
/* Enable input apps-signal for dpu */
|
||||||
|
val = (HW_FENCE_IPC_CLIENT_ID_APPS_VID << 16) |
|
||||||
|
(hw_fence_client->ipc_signal_id & 0xFFFF);
|
||||||
ptr = IPC_PROTOCOLp_CLIENTc_RECV_SIGNAL_ENABLE(drv_data->ipcc_io_mem,
|
ptr = IPC_PROTOCOLp_CLIENTc_RECV_SIGNAL_ENABLE(drv_data->ipcc_io_mem,
|
||||||
drv_data->protocol_id, HW_FENCE_IPC_CLIENT_ID_DPU);
|
drv_data->protocol_id, hw_fence_client->ipc_client_id_phys);
|
||||||
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%lx\n", val, (u64)ptr);
|
HWFNC_DBG_H("Write:0x%x to RegOffset:0x%lx\n", val, (u64)ptr);
|
||||||
writel_relaxed(val, ptr);
|
writel_relaxed(val, ptr);
|
||||||
}
|
}
|
||||||
|
@@ -1047,8 +1047,8 @@ static void _fence_ctl_signal(struct hw_fence_driver_data *drv_data,
|
|||||||
struct msm_hw_fence_client *hw_fence_client, struct msm_hw_fence *hw_fence, u64 hash,
|
struct msm_hw_fence_client *hw_fence_client, struct msm_hw_fence *hw_fence, u64 hash,
|
||||||
u64 flags, u32 error)
|
u64 flags, u32 error)
|
||||||
{
|
{
|
||||||
u32 tx_client_id = drv_data->ipcc_client_id;
|
u32 tx_client_id = drv_data->ipcc_client_pid; /* phys id for tx client */
|
||||||
u32 rx_client_id = hw_fence_client->ipc_client_id;
|
u32 rx_client_id = hw_fence_client->ipc_client_vid; /* virt id for rx client */
|
||||||
|
|
||||||
HWFNC_DBG_H("We must signal the client now! hfence hash:%llu\n", hash);
|
HWFNC_DBG_H("We must signal the client now! hfence hash:%llu\n", hash);
|
||||||
|
|
||||||
|
@@ -546,6 +546,7 @@ static long hw_sync_ioctl_reg_for_wait(struct hw_sync_obj *obj, unsigned long ar
|
|||||||
|
|
||||||
static long hw_sync_ioctl_fence_signal(struct hw_sync_obj *obj, unsigned long arg)
|
static long hw_sync_ioctl_fence_signal(struct hw_sync_obj *obj, unsigned long arg)
|
||||||
{
|
{
|
||||||
|
struct msm_hw_fence_client *hw_fence_client;
|
||||||
struct hw_fence_sync_signal_data data;
|
struct hw_fence_sync_signal_data data;
|
||||||
int ret, tx_client, rx_client, signal_id;
|
int ret, tx_client, rx_client, signal_id;
|
||||||
|
|
||||||
@@ -556,6 +557,12 @@ static long hw_sync_ioctl_fence_signal(struct hw_sync_obj *obj, unsigned long ar
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hw_fence_client = (struct msm_hw_fence_client *)obj->client_handle;
|
||||||
|
if (!hw_fence_client) {
|
||||||
|
HWFNC_ERR("invalid client handle\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (copy_from_user(&data, (void __user *)arg, sizeof(data)))
|
if (copy_from_user(&data, (void __user *)arg, sizeof(data)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
@@ -569,8 +576,8 @@ static long hw_sync_ioctl_fence_signal(struct hw_sync_obj *obj, unsigned long ar
|
|||||||
if (signal_id < 0)
|
if (signal_id < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
tx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
tx_client = hw_fence_client->ipc_client_vid;
|
||||||
rx_client = HW_FENCE_IPC_CLIENT_ID_APPS;
|
rx_client = hw_fence_client->ipc_client_pid;
|
||||||
ret = msm_hw_fence_trigger_signal(obj->client_handle, tx_client, rx_client, signal_id);
|
ret = msm_hw_fence_trigger_signal(obj->client_handle, tx_client, rx_client, signal_id);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
HWFNC_ERR("hw fence trigger signal has failed\n");
|
HWFNC_ERR("hw fence trigger signal has failed\n");
|
||||||
|
@@ -54,10 +54,14 @@ void *msm_hw_fence_register(enum hw_fence_client_id client_id,
|
|||||||
mutex_unlock(&hw_fence_drv_data->clients_register_lock);
|
mutex_unlock(&hw_fence_drv_data->clients_register_lock);
|
||||||
|
|
||||||
hw_fence_client->client_id = client_id;
|
hw_fence_client->client_id = client_id;
|
||||||
hw_fence_client->ipc_client_id = hw_fence_ipcc_get_client_id(hw_fence_drv_data, client_id);
|
hw_fence_client->ipc_client_vid =
|
||||||
|
hw_fence_ipcc_get_client_virt_id(hw_fence_drv_data, client_id);
|
||||||
|
hw_fence_client->ipc_client_pid =
|
||||||
|
hw_fence_ipcc_get_client_phys_id(hw_fence_drv_data, client_id);
|
||||||
|
|
||||||
if (hw_fence_client->ipc_client_id <= 0) {
|
if (hw_fence_client->ipc_client_vid <= 0 || hw_fence_client->ipc_client_pid <= 0) {
|
||||||
HWFNC_ERR("Failed to find client:%d ipc id\n", client_id);
|
HWFNC_ERR("Failed to find client:%d ipc vid:%d pid:%d\n", client_id,
|
||||||
|
hw_fence_client->ipc_client_vid, hw_fence_client->ipc_client_pid);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -91,9 +95,9 @@ void *msm_hw_fence_register(enum hw_fence_client_id client_id,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
HWFNC_DBG_INIT("-- Initialized ptr:0x%p client_id:%d ipc_signal_id:%d ipc_client_id:%d\n",
|
HWFNC_DBG_INIT("-- Initialized ptr:0x%p client_id:%d ipc_signal_id:%d ipc vid:%d pid:%d\n",
|
||||||
hw_fence_client, hw_fence_client->client_id, hw_fence_client->ipc_signal_id,
|
hw_fence_client, hw_fence_client->client_id, hw_fence_client->ipc_signal_id,
|
||||||
hw_fence_client->ipc_client_id);
|
hw_fence_client->ipc_client_vid, hw_fence_client->ipc_client_pid);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||||
init_waitqueue_head(&hw_fence_client->wait_queue);
|
init_waitqueue_head(&hw_fence_client->wait_queue);
|
||||||
@@ -338,8 +342,9 @@ int msm_hw_fence_update_txq(void *client_handle, u64 handle, u64 flags, u32 erro
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(msm_hw_fence_update_txq);
|
EXPORT_SYMBOL(msm_hw_fence_update_txq);
|
||||||
|
|
||||||
|
/* tx client has to be the physical, rx client virtual id*/
|
||||||
int msm_hw_fence_trigger_signal(void *client_handle,
|
int msm_hw_fence_trigger_signal(void *client_handle,
|
||||||
u32 tx_client_id, u32 rx_client_id,
|
u32 tx_client_pid, u32 rx_client_vid,
|
||||||
u32 signal_id)
|
u32 signal_id)
|
||||||
{
|
{
|
||||||
struct msm_hw_fence_client *hw_fence_client;
|
struct msm_hw_fence_client *hw_fence_client;
|
||||||
@@ -355,8 +360,8 @@ int msm_hw_fence_trigger_signal(void *client_handle,
|
|||||||
hw_fence_client = (struct msm_hw_fence_client *)client_handle;
|
hw_fence_client = (struct msm_hw_fence_client *)client_handle;
|
||||||
|
|
||||||
HWFNC_DBG_H("sending ipc for client:%d\n", hw_fence_client->client_id);
|
HWFNC_DBG_H("sending ipc for client:%d\n", hw_fence_client->client_id);
|
||||||
hw_fence_ipcc_trigger_signal(hw_fence_drv_data, tx_client_id,
|
hw_fence_ipcc_trigger_signal(hw_fence_drv_data, tx_client_pid,
|
||||||
rx_client_id, signal_id);
|
rx_client_vid, signal_id);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user