clear-pkgs-linux-iot-lts2018/0954-media-Enable-streamID-...

202 lines
7.1 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Meng Wei <wei.meng@intel.com>
Date: Mon, 3 Dec 2018 16:53:27 +0800
Subject: [PATCH] media: Enable streamID switching for ISYS IOMMU
Enable streamID switching for ISYS IOMMU
Change-Id: Ibc3e0b0f883f06991006f99f159d04e270878516
Tracked-On: PKT-1691
Signed-off-by: mingdaxu <mingda.xu@intel.com>
---
drivers/media/pci/intel/ipu-fw-isys.c | 4 ++
drivers/media/pci/intel/ipu-fw-isys.h | 45 ++++++++++++++++
drivers/media/pci/intel/ipu-isys-video.c | 68 +++++++++++++++++++++++-
drivers/media/pci/intel/ipu-isys.h | 4 ++
4 files changed, 120 insertions(+), 1 deletion(-)
diff --git a/drivers/media/pci/intel/ipu-fw-isys.c b/drivers/media/pci/intel/ipu-fw-isys.c
index e68e03e3a752..130d2ca4a438 100644
--- a/drivers/media/pci/intel/ipu-fw-isys.c
+++ b/drivers/media/pci/intel/ipu-fw-isys.c
@@ -156,6 +156,10 @@ ipu_fw_isys_dump_stream_cfg(struct device *dev,
stream_cfg->output_pins[i].send_irq);
dev_dbg(dev, "Reserve compression %d\n",
stream_cfg->output_pins[i].reserve_compression);
+ dev_dbg(dev, "snoopable %d\n",
+ stream_cfg->output_pins[i].snoopable);
+ dev_dbg(dev, "sensor type %d\n",
+ stream_cfg->output_pins[i].sensor_type);
dev_dbg(dev, "----------------\n");
}
diff --git a/drivers/media/pci/intel/ipu-fw-isys.h b/drivers/media/pci/intel/ipu-fw-isys.h
index 7b49648c263f..2853e1e1c9d9 100644
--- a/drivers/media/pci/intel/ipu-fw-isys.h
+++ b/drivers/media/pci/intel/ipu-fw-isys.h
@@ -148,6 +148,51 @@ enum ipu_fw_isys_stream_source {
N_IPU_FW_ISYS_STREAM_SRC
};
+#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
+enum ipu_fw_isys_sensor_type {
+ /* non-snoopable to PSYS */
+ IPU_FW_ISYS_VC1_SENSOR_DATA = 0,
+ /* non-snoopable for PDAF */
+ IPU_FW_ISYS_VC1_SENSOR_PDAF,
+ /* snoopable to CPU */
+ IPU_FW_ISYS_VC0_SENSOR_METADATA,
+ /* snoopable to CPU */
+ IPU_FW_ISYS_VC0_SENSOR_DATA,
+ N_IPU_FW_ISYS_SENSOR_TYPE
+};
+
+enum ipu_fw_isys_sensor_info {
+ /* VC1 */
+ IPU_FW_ISYS_SENSOR_DATA_1 = 1,
+ IPU_FW_ISYS_SENSOR_DATA_2 = 2,
+ IPU_FW_ISYS_SENSOR_DATA_3 = 3,
+ IPU_FW_ISYS_SENSOR_DATA_4 = 4,
+ IPU_FW_ISYS_SENSOR_DATA_5 = 5,
+ IPU_FW_ISYS_SENSOR_DATA_6 = 6,
+ IPU_FW_ISYS_SENSOR_DATA_7 = 7,
+ IPU_FW_ISYS_SENSOR_DATA_8 = 8,
+ IPU_FW_ISYS_SENSOR_DATA_9 = 9,
+ IPU_FW_ISYS_SENSOR_DATA_10 = 10,
+ IPU_FW_ISYS_SENSOR_PDAF_1 = 11,
+ IPU_FW_ISYS_SENSOR_PDAF_2 = 12,
+ /* VC0 */
+ IPU_FW_ISYS_SENSOR_METADATA = 13,
+ IPU_FW_ISYS_SENSOR_DATA_11 = 14,
+ IPU_FW_ISYS_SENSOR_DATA_12 = 15,
+ IPU_FW_ISYS_SENSOR_DATA_13 = 16,
+ IPU_FW_ISYS_SENSOR_DATA_14 = 17,
+ IPU_FW_ISYS_SENSOR_DATA_15 = 18,
+ IPU_FW_ISYS_SENSOR_DATA_16 = 19,
+ N_IPU_FW_ISYS_SENSOR_INFO,
+ IPU_FW_ISYS_VC1_SENSOR_DATA_START = IPU_FW_ISYS_SENSOR_DATA_1,
+ IPU_FW_ISYS_VC1_SENSOR_DATA_END = IPU_FW_ISYS_SENSOR_DATA_10,
+ IPU_FW_ISYS_VC0_SENSOR_DATA_START = IPU_FW_ISYS_SENSOR_DATA_11,
+ IPU_FW_ISYS_VC0_SENSOR_DATA_END = IPU_FW_ISYS_SENSOR_DATA_16,
+ IPU_FW_ISYS_VC1_SENSOR_PDAF_START = IPU_FW_ISYS_SENSOR_PDAF_1,
+ IPU_FW_ISYS_VC1_SENSOR_PDAF_END = IPU_FW_ISYS_SENSOR_PDAF_2,
+};
+#endif
+
#define IPU_FW_ISYS_STREAM_SRC_CSI2_PORT0 IPU_FW_ISYS_STREAM_SRC_PORT_0
#define IPU_FW_ISYS_STREAM_SRC_CSI2_PORT1 IPU_FW_ISYS_STREAM_SRC_PORT_1
#define IPU_FW_ISYS_STREAM_SRC_CSI2_PORT2 IPU_FW_ISYS_STREAM_SRC_PORT_2
diff --git a/drivers/media/pci/intel/ipu-isys-video.c b/drivers/media/pci/intel/ipu-isys-video.c
index 57d96a2cde88..d3815d37b608 100644
--- a/drivers/media/pci/intel/ipu-isys-video.c
+++ b/drivers/media/pci/intel/ipu-isys-video.c
@@ -961,6 +961,10 @@ static void csi_short_packet_prepare_firmware_stream_cfg(
output_info->pt = IPU_ISYS_SHORT_PACKET_PT;
output_info->ft = IPU_ISYS_SHORT_PACKET_FT;
output_info->send_irq = 1;
+#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
+ output_info->snoopable = true;
+ output_info->sensor_type = IPU_FW_ISYS_SENSOR_METADATA;
+#endif
}
void ipu_isys_prepare_firmware_stream_cfg_default(
@@ -969,9 +973,12 @@ void ipu_isys_prepare_firmware_stream_cfg_default(
{
struct ipu_isys_pipeline *ip =
to_ipu_isys_pipeline(av->vdev.entity.pipe);
-
struct ipu_isys_queue *aq = &av->aq;
struct ipu_fw_isys_output_pin_info_abi *pin_info;
+#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
+ struct ipu_isys *isys = av->isys;
+ unsigned int type_index;
+#endif
int pin = cfg->nof_output_pins++;
aq->fw_output = pin;
@@ -995,6 +1002,65 @@ void ipu_isys_prepare_firmware_stream_cfg_default(
pin_info->ft = av->pfmt->css_pixelformat;
pin_info->send_irq = 1;
cfg->vc = ip->vc;
+
+#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
+ switch (pin_info->pt) {
+ /* non-snoopable sensor data to PSYS */
+ case IPU_FW_ISYS_PIN_TYPE_RAW_DUAL_SOC:
+ case IPU_FW_ISYS_PIN_TYPE_RAW_NS:
+ case IPU_FW_ISYS_PIN_TYPE_RAW_S:
+ type_index = IPU_FW_ISYS_VC1_SENSOR_DATA;
+ pin_info->sensor_type = isys->sensor_types[type_index]++;
+ pin_info->snoopable = false;
+
+ if (isys->sensor_types[type_index] >
+ IPU_FW_ISYS_VC1_SENSOR_DATA_END)
+ isys->sensor_types[type_index] =
+ IPU_FW_ISYS_VC1_SENSOR_DATA_START;
+
+ break;
+ /* non-snoopable PDAF data */
+ case IPU_FW_ISYS_PIN_TYPE_PAF_FF:
+ type_index = IPU_FW_ISYS_VC1_SENSOR_PDAF;
+ pin_info->sensor_type = isys->sensor_types[type_index]++;
+ pin_info->snoopable = false;
+
+ if (isys->sensor_types[type_index] >
+ IPU_FW_ISYS_VC1_SENSOR_PDAF_END)
+ isys->sensor_types[type_index] =
+ IPU_FW_ISYS_VC1_SENSOR_PDAF_START;
+
+ break;
+ /* snoopable META/Stats data to CPU */
+ case IPU_FW_ISYS_PIN_TYPE_METADATA_0:
+ case IPU_FW_ISYS_PIN_TYPE_METADATA_1:
+ case IPU_FW_ISYS_PIN_TYPE_AWB_STATS:
+ case IPU_FW_ISYS_PIN_TYPE_AF_STATS:
+ case IPU_FW_ISYS_PIN_TYPE_HIST_STATS:
+ pin_info->sensor_type = IPU_FW_ISYS_SENSOR_METADATA;
+ pin_info->snoopable = true;
+ break;
+ /* snoopable sensor data to CPU */
+ case IPU_FW_ISYS_PIN_TYPE_MIPI:
+ case IPU_FW_ISYS_PIN_TYPE_RAW_SOC:
+ type_index = IPU_FW_ISYS_VC0_SENSOR_DATA;
+ pin_info->sensor_type = isys->sensor_types[type_index]++;
+ pin_info->snoopable = true;
+
+ if (isys->sensor_types[type_index] >
+ IPU_FW_ISYS_VC0_SENSOR_DATA_END)
+ isys->sensor_types[type_index] =
+ IPU_FW_ISYS_VC0_SENSOR_DATA_START;
+
+ break;
+ default:
+ dev_err(&av->isys->adev->dev,
+ "Unknown pin type, use metadata type as default\n");
+
+ pin_info->sensor_type = IPU_FW_ISYS_SENSOR_METADATA;
+ pin_info->snoopable = true;
+ }
+#endif
}
static unsigned int ipu_isys_get_compression_scheme(u32 code)
diff --git a/drivers/media/pci/intel/ipu-isys.h b/drivers/media/pci/intel/ipu-isys.h
index 30d3b9b53a2e..847961062c9f 100644
--- a/drivers/media/pci/intel/ipu-isys.h
+++ b/drivers/media/pci/intel/ipu-isys.h
@@ -109,6 +109,10 @@ struct ipu_isys {
bool csi2_cse_ipc_not_supported;
unsigned int video_opened;
unsigned int stream_opened;
+#if !defined(CONFIG_VIDEO_INTEL_IPU4) && !defined(CONFIG_VIDEO_INTEL_IPU4P)
+ unsigned int sensor_types[N_IPU_FW_ISYS_SENSOR_TYPE];
+#endif
+
struct dentry *debugfsdir;
struct mutex mutex; /* Serialise isys video open/release related */
struct mutex stream_mutex; /* Stream start, stop, queueing reqs */
--
https://clearlinux.org