clear-pkgs-linux-iot-lts2018/1142-media-intel-ipu4-Squas...

434 lines
14 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: "Yew, Chang Ching" <chang.ching.yew@intel.com>
Date: Sun, 4 Aug 2019 20:08:23 -0700
Subject: [PATCH] media: intel-ipu4: Squashed of 4 reverted patches
Below patches is a regression of android/CL natve, some times camera can
not be opened and camera will hang both reproduce in GPMRB/LeafHill.
Revert "media: intel-ipu4: Generate error signal only for faulty
stream."
This reverts commit 79ec0c90
Revert "media: intel-ipu4: Send recovery error signal to userspace"
This reverts commit c1b8622d
Revert "media: intel-ipu4: Extended error recovery for
multistreaming use cases"
This reverts commit aa76f72a
Revert "ipu4: Added IPU hang recovery"
This reverts commit 543949bb
Change-Id: I99d1f425d255c0fa4b8dd3e0a2d0c572c50a0b91
Tracked-On: HSD-1507334566
Tracked-On: PKT-2253
Signed-off-by: Yew, Chang Ching <chang.ching.yew@intel.com>
---
drivers/media/pci/intel/ipu-isys-csi2.c | 6 +-
drivers/media/pci/intel/ipu-isys-csi2.h | 15 --
drivers/media/pci/intel/ipu-isys-queue.c | 4 +-
drivers/media/pci/intel/ipu-isys-video.c | 43 +-----
drivers/media/pci/intel/ipu-isys.h | 1 -
drivers/media/pci/intel/ipu4/ipu4-isys-csi2.c | 142 ------------------
6 files changed, 6 insertions(+), 205 deletions(-)
diff --git a/drivers/media/pci/intel/ipu-isys-csi2.c b/drivers/media/pci/intel/ipu-isys-csi2.c
index 1e0400c90e40..0f3e122439c0 100644
--- a/drivers/media/pci/intel/ipu-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu-isys-csi2.c
@@ -871,9 +871,6 @@ void ipu_isys_csi2_eof_event(struct ipu_isys_csi2 *csi2, unsigned int vc)
csi2->in_frame[vc] = false;
if (csi2->wait_for_sync[vc])
complete(&csi2->eof_completion);
- if (csi2->wdt_enable)
- mod_timer(&csi2->eof_timer, jiffies + csi2->eof_wdt_timeout);
-
spin_unlock_irqrestore(&csi2->isys->lock, flags);
for (i = 0; i < IPU_ISYS_MAX_STREAMS; i++) {
@@ -913,7 +910,8 @@ void ipu_isys_csi2_wait_last_eof(struct ipu_isys_csi2 *csi2)
reinit_completion(&csi2->eof_completion);
csi2->wait_for_sync[i] = true;
spin_unlock_irqrestore(&csi2->isys->lock, flags);
- tout = wait_for_completion_timeout(&csi2->eof_completion, IPU_EOF_TIMEOUT_JIFFIES);
+ tout = wait_for_completion_timeout(&csi2->eof_completion,
+ IPU_EOF_TIMEOUT_JIFFIES);
if (!tout)
dev_err(&csi2->isys->adev->dev,
"csi2-%d: timeout at sync to eof of vc %d\n",
diff --git a/drivers/media/pci/intel/ipu-isys-csi2.h b/drivers/media/pci/intel/ipu-isys-csi2.h
index c6f513c50f12..d7f2df3eb805 100644
--- a/drivers/media/pci/intel/ipu-isys-csi2.h
+++ b/drivers/media/pci/intel/ipu-isys-csi2.h
@@ -6,10 +6,6 @@
#include <media/media-entity.h>
#include <media/v4l2-device.h>
-#include <linux/workqueue.h>
-#include <linux/mutex.h>
-#include <linux/timer.h>
-
#include "ipu-isys-queue.h"
#include "ipu-isys-subdev.h"
@@ -109,13 +105,6 @@ struct ipu_isys_csi2 {
unsigned int stream_count;
struct v4l2_ctrl *store_csi2_header;
- struct timer_list eof_timer;
- struct work_struct wdt_work;
- struct workqueue_struct *wdt_wq;
- unsigned long eof_wdt_timeout;
- int wdt_enable;
- struct task_struct *current_owner;
- bool error_signal_send;
};
struct ipu_isys_csi2_timing {
@@ -184,9 +173,5 @@ void ipu_isys_csi2_isr(struct ipu_isys_csi2 *csi2);
void ipu_isys_csi2_error(struct ipu_isys_csi2 *csi2);
bool ipu_isys_csi2_skew_cal_required(struct ipu_isys_csi2 *csi2);
int ipu_isys_csi2_set_skew_cal(struct ipu_isys_csi2 *csi2, int enable);
-void ipu_isys_csi2_start_wdt(struct ipu_isys_csi2 *csi2,
- unsigned int timeout);
-void ipu_isys_csi2_stop_wdt(struct ipu_isys_csi2 *csi2);
-void ipu_isys_csi2_trigger_error_all(struct ipu_isys *isys);
#endif /* IPU_ISYS_CSI2_H */
diff --git a/drivers/media/pci/intel/ipu-isys-queue.c b/drivers/media/pci/intel/ipu-isys-queue.c
index e601b1c92372..a88c0d7e9ca9 100644
--- a/drivers/media/pci/intel/ipu-isys-queue.c
+++ b/drivers/media/pci/intel/ipu-isys-queue.c
@@ -1164,9 +1164,7 @@ void ipu_isys_queue_buf_done(struct ipu_isys_buffer *ib)
*/
atomic_set(&ib->str2mmio_flag, 0);
} else {
- vb2_buffer_done(vb, vb->vb2_queue->error ?
- VB2_BUF_STATE_ERROR :
- VB2_BUF_STATE_DONE);
+ vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
}
}
diff --git a/drivers/media/pci/intel/ipu-isys-video.c b/drivers/media/pci/intel/ipu-isys-video.c
index e3d10544ef6e..942ad1755ae8 100644
--- a/drivers/media/pci/intel/ipu-isys-video.c
+++ b/drivers/media/pci/intel/ipu-isys-video.c
@@ -39,18 +39,6 @@ static unsigned int num_stream_support = IPU_ISYS_NUM_STREAMS;
module_param(num_stream_support, uint, 0660);
MODULE_PARM_DESC(num_stream_support, "IPU project support number of stream");
-static bool csi_watchdog_enable = 1;
-module_param(csi_watchdog_enable, bool, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
-MODULE_PARM_DESC(csi_watchdog_enable, "IPU4 CSI watchdog enable");
-
-static unsigned int csi_watchdog_timeout = 500;
-module_param(csi_watchdog_timeout, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
-MODULE_PARM_DESC(csi_watchdog_timeout, "IPU4 CSI watchdog timeout");
-
-static bool use_stream_stop;
-module_param(use_stream_stop, bool, 0660);
-MODULE_PARM_DESC(use_stream_stop, "Use STOP command if running in CSI capture mode");
-
const struct ipu_isys_pixelformat ipu_isys_pfmts_be_soc[] = {
{V4L2_PIX_FMT_Y10, 16, 10, 0, MEDIA_BUS_FMT_Y10_1X10,
IPU_FW_ISYS_FRAME_FORMAT_RAW16},
@@ -169,8 +157,6 @@ const struct ipu_isys_pixelformat ipu_isys_pfmts_packed[] = {
{}
};
-void ipu_isys_csi2_trigger_error_all(struct ipu_isys *isys);
-
static int video_open(struct file *file)
{
struct ipu_isys_video *av = video_drvdata(file);
@@ -182,7 +168,6 @@ static int video_open(struct file *file)
mutex_lock(&isys->mutex);
if (isys->reset_needed || isp->flr_done) {
- ipu_isys_csi2_trigger_error_all(av->isys);
mutex_unlock(&isys->mutex);
dev_warn(&isys->adev->dev, "isys power cycle required\n");
return -EIO;
@@ -215,7 +200,6 @@ static int video_open(struct file *file)
mutex_lock(&isys->mutex);
- isys->csi2_in_error_state = 0;
if (isys->video_opened++) {
/* Already open */
mutex_unlock(&isys->mutex);
@@ -1345,7 +1329,7 @@ static int start_stream_firmware(struct ipu_isys_video *av,
}
tout = wait_for_completion_timeout(&ip->stream_close_completion,
- av->isys->csi2_in_error_state ? 0 : IPU_LIB_CALL_TIMEOUT_JIFFIES);
+ IPU_LIB_CALL_TIMEOUT_JIFFIES);
if (!tout)
dev_err(dev, "stream close time out\n");
else if (ip->error)
@@ -1378,7 +1362,6 @@ static void stop_streaming_firmware(struct ipu_isys_video *av)
send_type = IPU_FW_ISYS_SEND_TYPE_STREAM_STOP;
#endif
- mutex_lock(&av->isys->mutex);
rval = ipu_fw_isys_simple_cmd(av->isys, ip->stream_handle,
send_type);
@@ -1388,15 +1371,13 @@ static void stop_streaming_firmware(struct ipu_isys_video *av)
}
tout = wait_for_completion_timeout(&ip->stream_stop_completion,
- IPU_LIB_CALL_TIMEOUT_JIFFIES);
+ IPU_LIB_CALL_TIMEOUT_JIFFIES);
if (!tout)
dev_err(dev, "stream stop time out\n");
else if (ip->error)
dev_err(dev, "stream stop error: %d\n", ip->error);
else
dev_dbg(dev, "stop stream: complete\n");
-
- mutex_unlock(&av->isys->mutex);
}
static void close_streaming_firmware(struct ipu_isys_video *av)
@@ -1408,8 +1389,6 @@ static void close_streaming_firmware(struct ipu_isys_video *av)
reinit_completion(&ip->stream_close_completion);
- mutex_lock(&av->isys->mutex);
-
rval = ipu_fw_isys_simple_cmd(av->isys, ip->stream_handle,
IPU_FW_ISYS_SEND_TYPE_STREAM_CLOSE);
if (rval < 0) {
@@ -1418,7 +1397,7 @@ static void close_streaming_firmware(struct ipu_isys_video *av)
}
tout = wait_for_completion_timeout(&ip->stream_close_completion,
- IPU_LIB_CALL_TIMEOUT_JIFFIES);
+ IPU_LIB_CALL_TIMEOUT_JIFFIES);
if (!tout)
dev_err(dev, "stream close time out\n");
else if (ip->error)
@@ -1428,7 +1407,6 @@ static void close_streaming_firmware(struct ipu_isys_video *av)
put_stream_opened(av);
put_stream_handle(av);
- mutex_unlock(&av->isys->mutex);
}
void
@@ -1627,12 +1605,6 @@ int ipu_isys_video_set_streaming(struct ipu_isys_video *av,
}
if (!state) {
- if (ip->csi2) {
- if (csi_watchdog_enable)
- ipu_isys_csi2_stop_wdt(ip->csi2);
- ip->csi2->current_owner = NULL;
- }
-
stop_streaming_firmware(av);
/* stop external sub-device now. */
@@ -1716,15 +1688,6 @@ int ipu_isys_video_set_streaming(struct ipu_isys_video *av,
rval = v4l2_subdev_call(esd, video, s_stream, state);
if (rval)
goto out_media_entity_stop_streaming_firmware;
-
- if (ip->csi2) {
- ip->csi2->current_owner = current;
- ip->csi2->error_signal_send = false;
- if (csi_watchdog_enable)
- ipu_isys_csi2_start_wdt(ip->csi2,
- csi_watchdog_timeout);
- }
-
} else {
close_streaming_firmware(av);
av->ip.stream_id = 0;
diff --git a/drivers/media/pci/intel/ipu-isys.h b/drivers/media/pci/intel/ipu-isys.h
index 5b0961b84a4b..847961062c9f 100644
--- a/drivers/media/pci/intel/ipu-isys.h
+++ b/drivers/media/pci/intel/ipu-isys.h
@@ -109,7 +109,6 @@ struct ipu_isys {
bool csi2_cse_ipc_not_supported;
unsigned int video_opened;
unsigned int stream_opened;
- unsigned int csi2_in_error_state;
#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
unsigned int sensor_types[N_IPU_FW_ISYS_SENSOR_TYPE];
#endif
diff --git a/drivers/media/pci/intel/ipu4/ipu4-isys-csi2.c b/drivers/media/pci/intel/ipu4/ipu4-isys-csi2.c
index 2c87487b2e81..50eb7a9ab6e4 100644
--- a/drivers/media/pci/intel/ipu4/ipu4-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu4/ipu4-isys-csi2.c
@@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2013 - 2018 Intel Corporation
-#include <linux/sched/signal.h>
#include "ipu.h"
#include "ipu-buttress.h"
#include "ipu-isys.h"
@@ -21,55 +20,6 @@
#define CSI2_UPDATE_TIME_TRY_NUM 3
#define CSI2_UPDATE_TIME_MAX_DIFF 20
-
-static unsigned int ipu_isys_csi2_fatal_errors[] = {
- CSI2_CSIRX_FIFO_OVERFLOW,
- CSI2_CSIRX_FRAME_SYNC_ERROR,
- CSI2_CSIRX_DPHY_NONRECOVERABLE_SYNC_ERROR
-};
-
-static int ipu_isys_csi2_is_fatal_error(unsigned int error)
-{
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE(ipu_isys_csi2_fatal_errors); ++i)
- if (error & ipu_isys_csi2_fatal_errors[i])
- return 1;
- return 0;
-}
-
-static void trigger_error(struct ipu_isys_csi2 *csi2)
-{
- unsigned long flags;
-
- if (!csi2->isys)
- return;
-
- if (!csi2->isys)
- return;
-
- spin_lock_irqsave(&csi2->isys->lock, flags);
- if (csi2->wdt_enable)
- queue_work(csi2->wdt_wq, &csi2->wdt_work);
- spin_unlock_irqrestore(&csi2->isys->lock, flags);
-}
-
-void ipu_isys_csi2_trigger_error(struct ipu_isys_csi2 *csi2)
-{
- csi2->isys->reset_needed = true;
- trigger_error(csi2);
-}
-
-void ipu_isys_csi2_trigger_error_all(struct ipu_isys *isys)
-{
- int i;
-
- isys->reset_needed = true;
- for (i = 0; i < isys->pdata->ipdata->csi2.nports; i++) {
- trigger_error(&isys->csi2[i]);
- }
-}
-
static u32
build_cse_ipc_commands(struct ipu_ipc_buttress_bulk_msg *target,
u32 nbr_msgs, u32 opcodel, u32 reg, u32 data)
@@ -341,13 +291,6 @@ void ipu_isys_csi2_error(struct ipu_isys_csi2 *csi2)
status = csi2->receiver_errors;
csi2->receiver_errors = 0;
- if (ipu_isys_csi2_is_fatal_error(status)) {
- dev_err_ratelimited(&csi2->isys->adev->dev,
- "csi2-%i received fatal error\n",
- csi2->index);
- ipu_isys_csi2_trigger_error(csi2);
- }
-
for (i = 0; i < ARRAY_SIZE(errors); i++) {
if (!(status & BIT(i)))
continue;
@@ -768,88 +711,3 @@ int ipu_isys_csi2_set_skew_cal(struct ipu_isys_csi2 *csi2, int enable)
return 0;
}
-
-static void eof_wdt_handler(struct work_struct *w)
-{
- unsigned long flags;
- struct ipu_isys_csi2 *csi2;
- struct ipu_isys_pipeline *ip;
- struct ipu_isys_queue *aq;
- struct siginfo info;
-
- if (!w)
- return;
-
- csi2 = container_of(w, struct ipu_isys_csi2, wdt_work);
-
- if (!(csi2 && csi2->isys))
- return;
-
- spin_lock_irqsave(&csi2->isys->lock, flags);
- if (csi2->wdt_enable) {
- dev_err_ratelimited(&csi2->isys->adev->dev,
- "csi2-%i non recoverable error\n",
- csi2->index);
- ip = to_ipu_isys_pipeline(csi2->asd.sd.entity.pipe);
- list_for_each_entry(aq, &ip->queues, node) {
- vb2_queue_error(&aq->vbq);
- wake_up_interruptible(&aq->vbq.done_wq);
- }
- csi2->isys->csi2_in_error_state = 1;
- if (csi2->current_owner && !csi2->error_signal_send) {
- memset(&info, 0, sizeof(struct siginfo));
- info.si_signo = SIGUSR1;
- info.si_code = 0;
- info.si_int = 0;
- send_sig_info(SIGUSR1, &info, csi2->current_owner);
- csi2->error_signal_send = true;
- }
-
- }
- spin_unlock_irqrestore(&csi2->isys->lock, flags);
-}
-
-static void eof_timer_handler(struct timer_list *data)
-{
- struct ipu_isys_csi2 *csi2 = container_of(data, struct ipu_isys_csi2, eof_timer);
- trigger_error(csi2);
-}
-
-void ipu_isys_csi2_start_wdt(
- struct ipu_isys_csi2 *csi2,
- unsigned int timeout)
-{
- unsigned long flags;
-
- if (!csi2->wdt_wq)
- csi2->wdt_wq = create_singlethread_workqueue("eof_wdt");
-
- if (!csi2->wdt_wq)
- return;
-
- INIT_WORK(&csi2->wdt_work, eof_wdt_handler);
- spin_lock_irqsave(&csi2->isys->lock, flags);
- csi2->eof_wdt_timeout = msecs_to_jiffies(timeout);
- timer_setup(&csi2->eof_timer, eof_timer_handler, 0);
- mod_timer(&csi2->eof_timer, jiffies + csi2->eof_wdt_timeout);
- csi2->wdt_enable = true;
- spin_unlock_irqrestore(&csi2->isys->lock, flags);
-}
-
-void ipu_isys_csi2_stop_wdt(
- struct ipu_isys_csi2 *csi2)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&csi2->isys->lock, flags);
- csi2->wdt_enable = false;
- spin_unlock_irqrestore(&csi2->isys->lock, flags);
-
- del_timer_sync(&csi2->eof_timer);
- if (csi2->wdt_wq) {
- flush_workqueue(csi2->wdt_wq);
- destroy_workqueue(csi2->wdt_wq);
- csi2->wdt_wq = NULL;
- }
-}
-
--
https://clearlinux.org