blob: 62866a962cc60174f9bc1520842385115415ee8d [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2017-2020, The Linux Foundation. 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
* @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
*
* @return: 0: Success
* Negative: Failure
*/
int cam_packet_util_process_patches(struct cam_packet *packet,
int32_t iommu_hdl, int32_t sec_mmu_hdl);
/**
* 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);
#endif /* _CAM_PACKET_UTIL_H_ */