Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f33380f1 authored by zhuo's avatar zhuo
Browse files

msm: camera: cdm: Fix workqueue timing issue



Due to workqueue does not process the work in order,
so sometimes the later work will be processed earlier.
Such as, when submit request order: 1/2/3, cdm interrupt
come order: 1/2/3, workqueue process order: 2/1/3,
when process 2 request, which currently will notify 1/2
CDM clients and remove 1/2 from submit list. After that,
when process 1 request, will notify 3, actually 3 is not
done at the moment, which maybe cause smmu page fault issue.
And sometimes, when there is a delay in handling interrupts,
then HLOS handles two interrupts as one only. This change only
notify the request less than and equal to the interrupt request.

CRs-Fixed: 3130447
Change-Id: I0fd0e8adee48767e5ab7db1921a8284d107c2f40
Signed-off-by: default avatarzhuo <quic_zhuo@quicinc.com>
parent 6639a3b5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#ifndef _CAM_CDM_H_
@@ -68,6 +69,8 @@
#define CAM_CDM_BL_FIFO_LENGTH_MAX_DEFAULT 0x40
#define CAM_CDM_BL_FIFO_LENGTH_CFG_SHIFT 0x10
#define CAM_CDM_BL_FIFO_FLUSH_SHIFT 0x3
#define CAM_CDM_BL_FIFO_BOUNDARY_CHECK \
	(CAM_CDM_BL_FIFO_LENGTH_MAX_DEFAULT / 2)

#define CAM_CDM_BL_FIFO_REQ_SIZE_MAX 0x00
#define CAM_CDM_BL_FIFO_REQ_SIZE_MAX_DIV2 0x01
+22 −17
Original line number Diff line number Diff line
// 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.
 */

#include <linux/delay.h>
@@ -1263,6 +1264,9 @@ static void cam_hw_cdm_work(struct work_struct *work)
			list_for_each_entry_safe(node, tnode,
				&core->bl_fifo[fifo_idx].bl_request_list,
				entry) {
				if ((node->bl_tag <= payload->irq_data) ||
					((node->bl_tag - payload->irq_data) >
					CAM_CDM_BL_FIFO_BOUNDARY_CHECK)) {
					if (node->request_type ==
						CAM_HW_CDM_BL_CB_CLIENT) {
						cam_cdm_notify_clients(cdm_hw,
@@ -1284,6 +1288,7 @@ static void cam_hw_cdm_work(struct work_struct *work)
					kfree(node);
					node = NULL;
				}
			}
		} else {
			CAM_INFO(CAM_CDM,
				"Skip GenIRQ, tag 0x%x fifo %d",