
Currently we allocate the memory for CDM GENIRQ command within the Kernel on every stream on. Presil framework do not have an ability to transfer the kernel only buffers to the user daemon. For that reason we need to add support to use the user allocated command buffer instead of the kernel generated memory to add the GenIRQ cdm command while submitting BLs. This change also helps to reduce the stream on and stream off latency by not having to allocate and free the GENIRQ memory on every stream on and stream off respectively. CRs-Fixed: 3115399 Change-Id: Ic159efd56fb9c4480ed1eb25cf2c058cbb914332 Signed-off-by: Jigar Agrawal <quic_jigar@quicinc.com>
168 lines
5.3 KiB
C
168 lines
5.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _CAM_PACKET_UTIL_H_
|
|
#define _CAM_PACKET_UTIL_H_
|
|
|
|
#include <media/cam_defs.h>
|
|
|
|
/**
|
|
* @brief KMD scratch buffer information
|
|
*
|
|
* @handle: Memory handle
|
|
* @cpu_addr: Cpu address
|
|
* @offset: Offset from the start of the buffer
|
|
* @size: Size of the buffer in bytes
|
|
* @used_bytes: Used memory in bytes
|
|
*
|
|
*/
|
|
struct cam_kmd_buf_info {
|
|
int handle;
|
|
uint32_t *cpu_addr;
|
|
uint32_t offset;
|
|
uint32_t size;
|
|
uint32_t used_bytes;
|
|
};
|
|
|
|
/* Generic Cmd Buffer blob callback function type */
|
|
typedef int (*cam_packet_generic_blob_handler)(void *user_data,
|
|
uint32_t blob_type, uint32_t blob_size, uint8_t *blob_data);
|
|
|
|
/**
|
|
* cam_packet_util_get_cmd_mem_addr()
|
|
*
|
|
* @brief Get command buffer address
|
|
*
|
|
* @handle: Command buffer memory handle
|
|
* @buf_addr: Command buffer cpu mapped address
|
|
* @len: Command buffer length
|
|
*
|
|
* @return: 0 for success
|
|
* -EINVAL for Fail
|
|
*/
|
|
int cam_packet_util_get_cmd_mem_addr(int handle, uint32_t **buf_addr,
|
|
size_t *len);
|
|
|
|
/**
|
|
* cam_packet_util_validate_packet()
|
|
*
|
|
* @brief Validate the packet
|
|
*
|
|
* @packet: Packet to be validated
|
|
*
|
|
* @remain_len: CPU buff length after config offset
|
|
*
|
|
* @return: 0 for success
|
|
* -EINVAL for Fail
|
|
*/
|
|
int cam_packet_util_validate_packet(struct cam_packet *packet,
|
|
size_t remain_len);
|
|
|
|
/**
|
|
* cam_packet_util_validate_cmd_desc()
|
|
*
|
|
* @brief Validate the packet
|
|
*
|
|
* @cmd_desc: Command descriptor to be validated
|
|
*
|
|
* @return: 0 for success
|
|
* -EINVAL for Fail
|
|
*/
|
|
int cam_packet_util_validate_cmd_desc(struct cam_cmd_buf_desc *cmd_desc);
|
|
|
|
/**
|
|
* cam_packet_util_get_kmd_buffer()
|
|
*
|
|
* @brief Get the kmd buffer from the packet command descriptor
|
|
*
|
|
* @packet: Packet data
|
|
* @kmd_buf: Extracted the KMD buffer information
|
|
*
|
|
* @return: 0 for success
|
|
* -EINVAL for Fail
|
|
*/
|
|
int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
|
|
struct cam_kmd_buf_info *kmd_buf_info);
|
|
|
|
/**
|
|
* cam_packet_dump_patch_info()
|
|
*
|
|
* @brief: Dump patch info in case of page fault
|
|
*
|
|
* @packet: Input packet containing Command Buffers and Patches
|
|
* @iommu_hdl: IOMMU handle of the HW Device that received the packet
|
|
* @sec_iommu_hdl: Secure IOMMU handle of the HW Device that
|
|
* received the packet
|
|
*
|
|
*/
|
|
void cam_packet_dump_patch_info(struct cam_packet *packet,
|
|
int32_t iommu_hdl, int32_t sec_mmu_hdl);
|
|
|
|
/**
|
|
* cam_packet_util_process_patches()
|
|
*
|
|
* @brief: Replace the handle in Packet to Address using the
|
|
* information from patches.
|
|
*
|
|
* @packet: Input packet containing Command Buffers and Patches
|
|
* @iommu_hdl: IOMMU handle of the HW Device that received the packet
|
|
* @sec_iommu_hdl: Secure IOMMU handle of the HW Device that
|
|
* received the packet
|
|
* @exp_mem: Boolean to know if patched address is in expanded memory range
|
|
* or within default 32-bit address space.
|
|
*
|
|
* @return: 0: Success
|
|
* Negative: Failure
|
|
*/
|
|
int cam_packet_util_process_patches(struct cam_packet *packet,
|
|
int32_t iommu_hdl, int32_t sec_mmu_hdl, bool exp_mem);
|
|
|
|
/**
|
|
* cam_packet_util_process_generic_cmd_buffer()
|
|
*
|
|
* @brief: Process Generic Blob command buffer. This utility
|
|
* function process the command buffer and calls the
|
|
* blob_handle_cb callback for each blob that exists
|
|
* in the command buffer.
|
|
*
|
|
* @cmd_buf: Generic Blob Cmd Buffer handle
|
|
* @blob_handler_cb: Callback pointer to call for each blob exists in the
|
|
* command buffer
|
|
* @user_data: User data to be passed while callback
|
|
*
|
|
* @return: 0: Success
|
|
* Negative: Failure
|
|
*/
|
|
int cam_packet_util_process_generic_cmd_buffer(
|
|
struct cam_cmd_buf_desc *cmd_buf,
|
|
cam_packet_generic_blob_handler blob_handler_cb, void *user_data);
|
|
|
|
/**
|
|
* @brief : API to retrieve image buffers from presil after processing is
|
|
* done,using packet from request
|
|
*
|
|
* @packet: Packet pointer for current request
|
|
* @iommu_hdl: IOMMU hdl for Image buffers
|
|
* @out_res_id: Resource ID corresponding to the output buffer
|
|
*
|
|
* @return: Success or Failure
|
|
*/
|
|
int cam_presil_retrieve_buffers_from_packet(struct cam_packet *packet, int iommu_hdl,
|
|
int out_res_id);
|
|
|
|
/**
|
|
* @brief : API to send relevant buffers to presil
|
|
*
|
|
* @packet : Packet pointer for current request
|
|
* @img_iommu_hdl: IOMMU hdl for Image buffers
|
|
* @cdm_iommu_hdl: IOMMU hdl for cdm buffers
|
|
*
|
|
*/
|
|
int cam_presil_send_buffers_from_packet(struct cam_packet *packet, int img_iommu_hdl,
|
|
int cdm_iommu_hdl);
|
|
|
|
#endif /* _CAM_PACKET_UTIL_H_ */
|