From 1b6b1c620ba87ffda9016bf0fafd4875617abd9b Mon Sep 17 00:00:00 2001 From: anupamg Date: Tue, 23 Jul 2024 21:51:14 +0000 Subject: [PATCH] DCE-KMD: Move IPC region alloc/free calls to OS - Move IPC region alloc/free calls to OS layer because they mean different for different OSs. - For Linux it will allocate/dma map memory for IVC comm. - For HVRTOS it will simply fetch pre-allocated memory details since the memory allocation is only allowed in hypervisor module. - Accordingly, rename the API dce_ipc_allocate_region() -> dce_ipc_init_region_info(). Similarly for free as well. JIRA TDS-16052 Change-Id: I201cb5b1bc7384a9b0ccdbf5bc72bbd78d6b1506 Signed-off-by: anupamg Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3180405 Reviewed-by: svcacv Reviewed-by: Arun Swain Reviewed-by: Mahesh Kumar GVS: buildbot_gerritrpt --- drivers/platform/tegra/dce/dce-admin.c | 6 +- drivers/platform/tegra/dce/dce-ipc.c | 61 -------------- drivers/platform/tegra/dce/dce-util-common.c | 85 ++++++++++++++++++++ drivers/platform/tegra/dce/include/dce-ipc.h | 4 +- 4 files changed, 90 insertions(+), 66 deletions(-) diff --git a/drivers/platform/tegra/dce/dce-admin.c b/drivers/platform/tegra/dce/dce-admin.c index a5e12811..d1c9ce9c 100644 --- a/drivers/platform/tegra/dce/dce-admin.c +++ b/drivers/platform/tegra/dce/dce-admin.c @@ -234,7 +234,7 @@ int dce_admin_init(struct tegra_dce *d) int ret = 0; d->boot_status |= DCE_EARLY_INIT_START; - ret = dce_ipc_allocate_region(d); + ret = dce_ipc_init_region_info(d); if (ret) { dce_err(d, "IPC region allocation failed"); goto err_ipc_reg_alloc; @@ -250,7 +250,7 @@ int dce_admin_init(struct tegra_dce *d) return 0; err_channel_init: - dce_ipc_free_region(d); + dce_ipc_deinit_region_info(d); err_ipc_reg_alloc: d->boot_status |= DCE_EARLY_INIT_FAILED; return ret; @@ -268,7 +268,7 @@ void dce_admin_deinit(struct tegra_dce *d) { dce_admin_channel_deinit(d); - dce_ipc_free_region(d); + dce_ipc_deinit_region_info(d); dce_mailbox_deinit_interface(d, DCE_MAILBOX_ADMIN_INTERFACE); diff --git a/drivers/platform/tegra/dce/dce-ipc.c b/drivers/platform/tegra/dce/dce-ipc.c index 5a039a5a..42d43b4d 100644 --- a/drivers/platform/tegra/dce/dce-ipc.c +++ b/drivers/platform/tegra/dce/dce-ipc.c @@ -131,67 +131,6 @@ static struct dce_ipc_channel ivc_channels[DCE_IPC_CH_KMD_TYPE_MAX] = { }, }; -/** - * dce_ipc_allocate_region - Allocates IPC region for IVC - * - * @ch : Pointer to the pertinent dce_ipc_channel. - * @q_size : IVC queue size. - * - * Return : 0 if successful - */ -int dce_ipc_allocate_region(struct tegra_dce *d) -{ - unsigned long tot_q_sz; - unsigned long tot_ivc_q_sz; - struct device *dev; - struct dce_ipc_region *region; - - dev = dev_from_dce(d); - region = &d->d_ipc.region; - - tot_q_sz = ((DCE_ADMIN_CMD_MAX_NFRAMES * - tegra_ivc_align(DCE_ADMIN_CMD_MAX_FSIZE) * 2) + - (DCE_DISPRM_CMD_MAX_NFRAMES * - tegra_ivc_align(DCE_DISPRM_CMD_MAX_FSIZE) * 2) + - (DCE_ADMIN_CMD_MAX_NFRAMES * - tegra_ivc_align(DCE_ADMIN_CMD_CHAN_FSIZE) * 2) + - (DCE_DISPRM_EVENT_NOTIFY_CMD_MAX_NFRAMES * - tegra_ivc_align(DCE_DISPRM_EVENT_NOTIFY_CMD_MAX_FSIZE) * 2) - ); - - tot_ivc_q_sz = tegra_ivc_total_queue_size(tot_q_sz); - region->size = dce_get_nxt_pow_of_2(&tot_ivc_q_sz, 32); - region->base = dma_alloc_coherent(dev, region->size, - ®ion->iova, GFP_KERNEL | __GFP_ZERO); - if (!region->base) - return -ENOMEM; - - region->s_offset = 0; - - return 0; -} - -/** - * dce_ipc_free_region - Frees up the IPC region for IVC - * - * @d : Pointer to the tegra_dce struct. - * - * Return : Void - */ -void dce_ipc_free_region(struct tegra_dce *d) -{ - struct device *dev; - struct dce_ipc_region *region; - - dev = dev_from_dce(d); - region = &d->d_ipc.region; - - dma_free_coherent(dev, region->size, - (void *)region->base, region->iova); - - region->s_offset = 0; -} - /** * dce_ipc_signal_target - Generic function to signal target. * diff --git a/drivers/platform/tegra/dce/dce-util-common.c b/drivers/platform/tegra/dce/dce-util-common.c index ea8a39a4..505aac30 100644 --- a/drivers/platform/tegra/dce/dce-util-common.c +++ b/drivers/platform/tegra/dce/dce-util-common.c @@ -666,3 +666,88 @@ int dce_init_work(struct tegra_dce *d, return 0; } + +/** + * ipc_allocate_region [Private] - Allocates IPC region + * + * @d : Pointer to tegra_dce structure. + * + * Return : 0 if successful + */ +static int ipc_allocate_region(struct tegra_dce *d) +{ + unsigned long tot_q_sz; + unsigned long tot_ivc_q_sz; + struct device *dev; + struct dce_ipc_region *region; + + dev = dev_from_dce(d); + region = &d->d_ipc.region; + + tot_q_sz = ((DCE_ADMIN_CMD_MAX_NFRAMES * + tegra_ivc_align(DCE_ADMIN_CMD_MAX_FSIZE) * 2) + + (DCE_DISPRM_CMD_MAX_NFRAMES * + tegra_ivc_align(DCE_DISPRM_CMD_MAX_FSIZE) * 2) + + (DCE_ADMIN_CMD_MAX_NFRAMES * + tegra_ivc_align(DCE_ADMIN_CMD_CHAN_FSIZE) * 2) + + (DCE_DISPRM_EVENT_NOTIFY_CMD_MAX_NFRAMES * + tegra_ivc_align(DCE_DISPRM_EVENT_NOTIFY_CMD_MAX_FSIZE) * 2) + ); + + tot_ivc_q_sz = tegra_ivc_total_queue_size(tot_q_sz); + region->size = dce_get_nxt_pow_of_2(&tot_ivc_q_sz, 32); + region->base = dma_alloc_coherent(dev, region->size, + ®ion->iova, GFP_KERNEL | __GFP_ZERO); + if (!region->base) + return -ENOMEM; + + region->s_offset = 0; + + return 0; +} + + +/** + * ipc_free_region [Private] - Frees up the IPC region + * + * @d : Pointer to the tegra_dce struct. + * + * Return : Void + */ +static void ipc_free_region(struct tegra_dce *d) +{ + struct device *dev; + struct dce_ipc_region *region; + + dev = dev_from_dce(d); + region = &d->d_ipc.region; + + dma_free_coherent(dev, region->size, + (void *)region->base, region->iova); + + region->s_offset = 0; +} + +/** + * dce_ipc_init_region_info - Initialize IPC region information. + * + * @d : Pointer to tegra_dce structure. + * + * Return : 0 if successful + */ +int dce_ipc_init_region_info(struct tegra_dce *d) +{ + return ipc_allocate_region(d); +} + +/** + * dce_os_ipc_deinit_region_info - De-initialize the IPC region + * + * @d : Pointer to the tegra_dce struct. + * + * Return : Void + */ +void dce_ipc_deinit_region_info(struct tegra_dce *d) +{ + return ipc_free_region(d); +} diff --git a/drivers/platform/tegra/dce/include/dce-ipc.h b/drivers/platform/tegra/dce/include/dce-ipc.h index 4a6034d4..f4c9d545 100644 --- a/drivers/platform/tegra/dce/include/dce-ipc.h +++ b/drivers/platform/tegra/dce/include/dce-ipc.h @@ -159,9 +159,9 @@ int dce_ipc_send_message_sync(struct tegra_dce *d, int dce_ipc_get_channel_info(struct tegra_dce *d, struct dce_ipc_queue_info *q_info, u32 ch_index); -void dce_ipc_free_region(struct tegra_dce *d); +void dce_ipc_deinit_region_info(struct tegra_dce *d); -int dce_ipc_allocate_region(struct tegra_dce *d); +int dce_ipc_init_region_info(struct tegra_dce *d); struct tegra_dce *dce_ipc_get_dce_from_ch(u32 ch_type);