Bläddra i källkod

msm: camera: common: presil hw access headers

Added declarations and stubs for presil hw access apis.

CRs-Fixed: 2932495
Change-Id: Icbb38ca08ded2d8ba6be495ddf64bc1ae6a30245
Signed-off-by: Suraj Dongre <[email protected]>
Suraj Dongre 4 år sedan
förälder
incheckning
f460877a7c

+ 6 - 0
Kbuild

@@ -86,6 +86,12 @@ camera-y := \
 	drivers/cam_cdm/cam_cdm_virtual_core.o \
 	drivers/cam_cdm/cam_cdm_hw_core.o
 
+ifeq (,$(filter $(CONFIG_CAM_PRESIL),y m))
+	camera-y += drivers/cam_presil/stub/cam_presil_hw_access_stub.o
+else
+	ccflags-y += -DCONFIG_CAM_PRESIL=1
+endif
+
 camera-$(CONFIG_QCOM_CX_IPEAK) += drivers/cam_utils/cam_cx_ipeak.o
 camera-$(CONFIG_QCOM_BUS_SCALING) += drivers/cam_utils/cam_soc_bus.o
 camera-$(CONFIG_INTERCONNECT_QCOM) += drivers/cam_utils/cam_soc_icc.o

+ 198 - 0
drivers/cam_presil/inc/cam_presil_hw_access.h

@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _CAM_PRESIL_HW_ACCESS_H_
+#define _CAM_PRESIL_HW_ACCESS_H_
+
+#include <linux/interrupt.h>
+
+/*
+ * enum cam_presil_err - return code from presil apis
+ *
+ * @CAM_PRESIL_SUCCESS         : Success
+ * @CAM_PRESIL_FAILED          : Failed
+ * @CAM_PRESIL_BLOCKED         : not presil hw
+ * @CAM_PRESIL_BLOCKED_BOOTUP  : presil hw but at boot presil not connected
+ *
+ */
+enum cam_presil_err {
+	CAM_PRESIL_SUCCESS = 0x0,
+	CAM_PRESIL_FAILED,
+	CAM_PRESIL_BLOCKED,
+	CAM_PRESIL_BLOCKED_BOOTUP,
+};
+
+/**
+ * struct cam_presil_intr_reginfo - register received with irq
+ * callback
+ */
+struct cam_presil_intr_reginfo
+{
+	uint32_t intr_en_off;
+	uint32_t intr_status_off;
+	uint32_t intr_en_val;
+	uint32_t intr_status_val;
+};
+
+/**
+ * struct cam_presil_intr_regwrinfo - reg val pair from pchost
+ */
+struct cam_presil_intr_regwrinfo
+{
+	void *   reg_off;
+	uint32_t reg_val;
+};
+
+#define CAM_MODE_MAX_REG_CNT 25
+
+/**
+ * struct cam_presil_irq_data - data received along with irq cb
+ * from pchost
+ */
+struct cam_presil_irq_data
+{
+	uint32_t                         irq_num;
+	uint32_t                         irq_reg_count;
+	struct cam_presil_intr_reginfo   intr_reg[CAM_MODE_MAX_REG_CNT];
+	uint32_t                         irq_wr_count;
+	struct cam_presil_intr_regwrinfo intr_wr_reg[CAM_MODE_MAX_REG_CNT];
+	uint32_t                         magic;
+};
+
+/*
+ *  cam_presil_subscribe_device_irq()
+ *
+ * @brief         :  Register for irq from presil framework.
+ *
+ * @irq_num       :  Unique irq number
+ * @irq_handler   :  handler callback
+ * @irq_priv_data :  Callback data
+ * @irq_name      :  Irq name
+ *
+ * @return true or false.
+ */
+bool cam_presil_subscribe_device_irq(int irq_num, irq_handler_t irq_handler,
+	void* irq_priv_data, const char *irq_name);
+
+/*
+ *  cam_presil_subscribe_device_irq()
+ *
+ * @brief   :  Un-Register for irq from presil framework.
+ *
+ * @irq_num :  Unique irq number
+ *
+ * @return true or false.
+ */
+bool cam_presil_unsubscribe_device_irq(int irq_num);
+
+/*
+ *  cam_presil_register_read()
+ *
+ * @brief   :  register read from presil hw.
+ *
+ * @addr    :  Register offset
+ * @pValue  :  Value read from hw
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_register_read(void *addr, uint32_t *pValue);
+
+/*
+ *  cam_presil_register_write()
+ *
+ * @brief   :  register write to presil hw.
+ *
+ * @addr    :  Register offset
+ * @pValue  :  Value to write to hw
+ * @flags   :  Flags
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_register_write(void *addr, uint32_t value, uint32_t flags);
+
+/*
+ *  cam_presil_send_buffer()
+ *
+ * @brief        :  Copy buffer content to presil hw memory.
+ *
+ * @dma_buf_uint :  Not fd , it is dma_buf ptr to be sent to
+ * 	presil umd daemon
+ * @mmu_hdl      :  Iommu handle
+ * @offset       :  Offset to start copy
+ * @size         :  Size of copy
+ * @addr32       :  Iova to start copy at
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_send_buffer(uint64_t dma_buf_uint, int mmu_hdl, uint32_t offset,
+	uint32_t size, uint32_t addr32);
+
+/*
+ *  cam_presil_retrieve_buffer()
+ *
+ * @brief        :  Copy buffer content back from presil hw memory.
+ *
+ * @dma_buf_uint :  Not fd , it is dma_buf ptr to be sent to
+ * 	presil umd daemon
+ * @mmu_hdl      :  Iommu handle
+ * @offset       :  Offset to start copy
+ * @size         :  Size of copy
+ * @addr32       :  Iova to start copy at
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_retrieve_buffer(uint64_t dma_buf_uint,
+	int mmu_hdl, uint32_t offset, uint32_t size, uint32_t addr32);
+
+/*
+ *  cam_presil_readl_poll_timeout()
+ *
+ * @brief         :  Custom register poll function for presil hw.
+ *
+ * @mem_address   :  Reg offset to poll
+ * @val           :  Value to compare
+ * @max_try_count :  Max number of tries
+ * @interval_msec :  Interval between tries
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_readl_poll_timeout(void __iomem *mem_address, uint32_t val,
+	int max_try_count, int interval_msec);
+
+/*
+ *  cam_presil_hfi_write_cmd()
+ *
+ * @brief   :  Write HFI command to presil hw.
+ *
+ * @addr    :  Pointer to HFI command
+ * @cmdlen  :  Length
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_hfi_write_cmd(void *addr, uint32_t cmdlen);
+
+/*
+ *  cam_presil_hfi_read_message()
+ *
+ * @brief         :  Read HFI response message from presil hw.
+ *
+ * @pmsg          :  Pointer to HFI message buffer
+ * @q_id          :  Length
+ * @words_read    :  Response message
+ * @interval_msec :  Interval between tries
+ *
+ * @return:  Success or Failure
+ */
+int cam_presil_hfi_read_message(uint32_t *pmsg, uint8_t q_id,
+	uint32_t *words_read);
+
+/**
+ * @brief : API to check if camera driver running in presil
+ *        enabled mode
+ *
+ * @return true or false.
+ */
+bool cam_presil_mode_enabled(void);
+#endif /* _CAM_PRESIL_HW_ACCESS_H_ */

+ 62 - 0
drivers/cam_presil/stub/cam_presil_hw_access_stub.c

@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include "cam_debug_util.h"
+#include "cam_presil_hw_access.h"
+
+bool cam_presil_mode_enabled(void)
+{
+	return false;
+}
+
+bool cam_presil_subscribe_device_irq(int irq_num,
+	irq_handler_t irq_handler, void *irq_priv_data, const char *irq_name)
+{
+	return true;
+}
+
+bool cam_presil_unsubscribe_device_irq(int irq_num)
+{
+	return true;
+}
+
+int cam_presil_register_read(void *addr, uint32_t *val)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_register_write(void *addr, uint32_t value, uint32_t flags)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_send_buffer(uint64_t dma_buf_uint, int mmu_hdl, uint32_t offset,
+	uint32_t size, uint32_t addr32)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_retrieve_buffer(uint64_t dma_buf_uint, int mmu_hdl,
+	uint32_t offset, uint32_t size, uint32_t addr32)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_readl_poll_timeout(void __iomem *mem_address, uint32_t val,
+	int max_try_count, int interval_msec)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_hfi_write_cmd(void *hfi_cmd, uint32_t cmdlen)
+{
+	return CAM_PRESIL_SUCCESS;
+}
+
+int cam_presil_hfi_read_message(uint32_t *pmsg, uint8_t q_id,
+	uint32_t *words_read)
+{
+	return CAM_PRESIL_SUCCESS;
+}

+ 1 - 0
drivers/cam_utils/cam_debug_util.h

@@ -7,6 +7,7 @@
 #define _CAM_DEBUG_UTIL_H_
 
 #include <linux/platform_device.h>
+#include "cam_presil_hw_access.h"
 
 /* Module IDs used for debug logging */
 #define CAM_CDM           BIT_ULL(0)