From 50b77104c97af362cc694b10443a17e834018674 Mon Sep 17 00:00:00 2001 From: "Mohd Azmy, Muhammad Amirul" Date: Thu, 6 Aug 2026 18:01:05 +0800 Subject: [PATCH 01/19] AR0234: Add ACPI sensor profiles into ar0234.xml for ipu6epmtl Add ar0234_acpi-1 and ar0234_acpi-2 sensor configs (media control and static metadata for GMSL DES0 CH00/CH01) Signed-off-by: Mohd Azmy, Muhammad Amirul --- config/ar0234/ipu6epmtl/sensors/ar0234.xml | 104 +++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/config/ar0234/ipu6epmtl/sensors/ar0234.xml b/config/ar0234/ipu6epmtl/sensors/ar0234.xml index a8a98e73..06941f10 100644 --- a/config/ar0234/ipu6epmtl/sensors/ar0234.xml +++ b/config/ar0234/ipu6epmtl/sensors/ar0234.xml @@ -154,4 +154,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From fcfcb2f7493f0aa95e947b2d5c3a6ccf035fd159 Mon Sep 17 00:00:00 2001 From: "Mohd Azmy, Muhammad Amirul" Date: Mon, 27 Jul 2026 15:22:13 +0800 Subject: [PATCH 02/19] script: acpi: mc-setup: Add AR0234 sensor support Register the AR0234 sensor HID (INTC10C0) in SENSOR_MODEL and SENSOR_PREFIX tables, define the 'raw' stream token with SGRBG10_1X10 media-bus format at 1280x960, add BA10 pixelformat to MBUS_TO_PIXFMT, and combine the ar0234 serializer routing block with isx031 as both sensors share the same single-stream pass-through routing logic. Signed-off-by: Mohd Azmy, Muhammad Amirul --- script/acpi/mc-setup.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/script/acpi/mc-setup.sh b/script/acpi/mc-setup.sh index e8719386..192554bf 100755 --- a/script/acpi/mc-setup.sh +++ b/script/acpi/mc-setup.sh @@ -100,10 +100,12 @@ declare -A SENSOR_MODEL=( [INTC10CD]=d4xx [INTC113C]=isx031 + [INTC10C0]=ar0234 ) declare -A SENSOR_PREFIX=( [INTC10CD]="DS5 mux" [INTC113C]="isx031" + [INTC10C0]="ar0234" ) # ---- Serializer / Deserializer HID -> v4l entity prefix --------------------- @@ -128,10 +130,12 @@ declare -A MAX_LINKS_BY_PREFIX=( declare -A MODEL_STREAMS=( [d4xx]="depth rgb ir imu" [isx031]="yuv" + [ar0234]="raw" ) declare -A MODEL_DEFAULT_STREAMS=( [d4xx]="depth rgb" [isx031]="yuv" + [ar0234]="raw" ) # STREAM_NODE: per-stream capture-node index (also used as the v4l2 @@ -143,6 +147,7 @@ declare -A STREAM_NODE=( [ir]=2 [imu]=3 [yuv]=0 + [raw]=0 ) # Keep capture-node groups consistent across 2-link and 4-link deserializers: @@ -171,6 +176,7 @@ declare -A STREAM_FMT=( [ir]=${STREAM_FMT_ir:-VYUY8_1X16} [imu]=${STREAM_FMT_imu:-Y8_1X8} [yuv]=${STREAM_FMT_yuv:-UYVY8_1X16} + [raw]=${STREAM_FMT_raw:-SGRBG10_1X10} ) declare -A STREAM_SIZE=( [depth]=${STREAM_SIZE_depth:-$D4XX_SIZE} @@ -178,6 +184,7 @@ declare -A STREAM_SIZE=( [ir]=${STREAM_SIZE_ir:-$D4XX_SIZE} [imu]=${STREAM_SIZE_imu:-38x1} [yuv]=${STREAM_SIZE_yuv:-1920x1536} + [raw]=${STREAM_SIZE_raw:-1280x960} ) # ---- Media-bus -> V4L2 pixelformat fourcc (used on capture nodes) ----------- @@ -186,6 +193,7 @@ declare -A MBUS_TO_PIXFMT=( [YUYV8_1X16]="YUYV" [VYUY8_1X16]="Y8I " # IR -> interleaved 8-bit greyscale [Y8_1X8]="GREY" + [SGRBG10_1X10]="BA10" # AR0234 RAW Bayer SGRBG 10-bit ) # ============================================================================= @@ -781,7 +789,7 @@ for k in "${!CFG_LINKS[@]}"; do unset is_selected ;; - isx031) + isx031|ar0234) ser_route_parts=() for s in "${sel_streams[@]}"; do sid=${STREAM_NODE[$s]} @@ -844,6 +852,9 @@ for k in "${!CFG_LINKS[@]}"; do isx031) mc_v "\"isx031 ${cam}\":0/${sid} [fmt:${fmt}/${size} field:none]" ;; + ar0234) + mc_v "\"ar0234 ${cam}\":0/${sid} [fmt:${fmt}/${size} field:none]" + ;; esac mc_v "\"${ser_pfx} ${ser}\":0/${sid} [fmt:${fmt}/${size} field:none]" mc_v "\"${ser_pfx} ${ser}\":1/${sid} [fmt:${fmt}/${size} field:none]" From 3269fdd9bc60f7383957e04301daefab40b03a4c Mon Sep 17 00:00:00 2001 From: "Mohd Azmy, Muhammad Amirul" Date: Mon, 27 Jul 2026 14:12:35 +0800 Subject: [PATCH 03/19] acpi: ipu6: ar0234: Add AR0234 D3 SSDT overlay Add ACPI/SSDT tables for the AR0234 image sensor on the D3 module, connected via MAX9296A deserializer and MAX96717 serializers on the IPU6 ARL platform. - _cam_common_ar0234.asl: common camera device template for AR0234 - _des_ch_common_ar0234.asl: per-channel template for AR0234 under a deserializer link - _des_common_max9296.asl: include AR0234 channel variant - max9296_d3_ar0234.asl: top-level SSDT overlay for D3 AR0234 with MAX9296A deserializer carrying two AR0234 cameras on links 0 and 1 Signed-off-by: Mohd Azmy, Muhammad Amirul --- acpi/ipu6/_cam_common_ar0234.asl | 97 +++++++++++++++++++++++ acpi/ipu6/_des_ch_common_ar0234.asl | 55 +++++++++++++ acpi/ipu6/max9296_d3_ar0234.asl | 118 ++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 acpi/ipu6/_cam_common_ar0234.asl create mode 100644 acpi/ipu6/_des_ch_common_ar0234.asl create mode 100644 acpi/ipu6/max9296_d3_ar0234.asl diff --git a/acpi/ipu6/_cam_common_ar0234.asl b/acpi/ipu6/_cam_common_ar0234.asl new file mode 100644 index 00000000..5958452f --- /dev/null +++ b/acpi/ipu6/_cam_common_ar0234.asl @@ -0,0 +1,97 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * CAM-level defines expected by caller: + * DESCH_SER_REF - Path to parent SER (e.g. \_SB.PC00.DESx.CHxx.SERx), used in _DEP + * DESCH_SER_PATH - Path to parent SER (e.g. "\\_SB.PC00.DESx.CHxx.SERx"), used in CSI2Bus and GpioIo + * DESCH_SER_GPIOREF - GPIO controller path for SER (e.g. ^^SERx), used in gpio resources (e.g. reset-gpios) + * CAM_LANES - Number of MIPI data lanes for the camera + */ + Method (_STA, 0, NotSerialized) // _STA: Status + { + Return (0x0F) // bit 0: device is present, bit 1: device is enabled, bit 2: device is shown in UI, bit 3: device is functional + } + + Method (_HID, 0, NotSerialized) // _HID: Hardware ID + { + Return ("INTC10C0") // AR0234 + } + + Name (_DEP, Package (0x01) // _DEP: Dependencies + { + DESCH_SER_REF // Path to parent SER (e.g "\\_SB.PC00.DESx.CHxx.SERx") + }) + + Name(_CRS, ResourceTemplate () // _CRS: Current Resource Settings +{ + /* + * mipi-disco-img.c will use the information in CSI2Bus to create fwnode. + * CAMx Local Port -> SERx Remote Port + * CAMx PRT0 -> SERx PRT0 + */ + CSI2Bus( + DeviceInitiated, // SlaveMode + 1, // PhyType (1 for DPHY) + 0, // LocalPort (AR0234 only 1 PHY) + DESCH_SER_PATH, // ResourceSource (Path to parent SERx, e.g. "\\_SB.PC00.DESx.CHxx.SERx") + 0, // ResourceSourceIndex (e.g. 0 for SERx PRT0) + , // ResourceUsage + , // DescriptorName + ) // VendorData + + I2cSerialBusV2 ( + 0x0010, // SlaveAddress (0x10 based on AR0234 hardware) + ControllerInitiated, // SlaveMode + 0x00061A80, // ConnectionSpeed + AddressingMode7Bit, // AddressingMode + DESCH_SER_PATH, // ResourceSource (Path to parent SER, e.g. "\\_SB.PC00.DESx.CHxx.SERx") + 0x00, // ResourceSourceIndex + ResourceConsumer, // ResourceUsage + , // DescriptorName + Exclusive, // Shared + ) // VendorData +}) + +Name (_DSD, Package () // _DSD: Device-Specific Data +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties for _DSD + Package () + { + Package () { "mipi-img-clock-frequency", 96000000 }, // 96 MHz + + /* + * Sensor specific GPIOs, reset-gpios will be used by ar0234.c + * when devm_gpiod_get_optional is being called with "reset" consumer. + * For details, please refer to ACPI GPIO binding documentation + * https://www.kernel.org/doc/html/latest/firmware-guide/acpi/gpio-properties.html + * + * DESCH_SER_GPIOREF is the GPIO controller from parent SERx + * 0 is the GPIO pin group in parent SERx + * 0 is the index of pin in the GPIO pin group in parent SERx + * 1 is active low for reset + * + */ + Package () { "reset-gpios", Package () { DESCH_SER_GPIOREF, 0, 0, 1 } }, + }, + ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"), // Hierarchical Data Extension + Package () + { + /* mipi-img-port here are NOT actual MIPI ports, but is used by mipi-disco-img.c to create fwnode. */ + Package () { "mipi-img-port-0", "PRT0" }, // Connected to SERx PRTx (used by CAMx CSI2Bus LocalPort) + }, +}) + +Name (PRT0, Package() +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-lanes", 0 }, + #if CAM_LANES == 4 + Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, + #else + Package () { "mipi-img-data-lanes", Package() { 1, 2 } }, + #endif + }, +}) \ No newline at end of file diff --git a/acpi/ipu6/_des_ch_common_ar0234.asl b/acpi/ipu6/_des_ch_common_ar0234.asl new file mode 100644 index 00000000..e27a3390 --- /dev/null +++ b/acpi/ipu6/_des_ch_common_ar0234.asl @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * Description: Common template for each AR0234 GMSL camera under each deserializer link, + * where each link is represented as an ATR channel device. + * + * DES-level defines expected by caller: + * DES_PATH - DESx ACPI path string (e.g., "\\_SB.PC00.DES0") + * DES_REF - DESx ACPI namespace reference (e.g., \_SB.PC00.DES0) + * + * Channel-level defines expected by caller: + * DESCH_CH - Channel device name (e.g., CH00) + * DESCH_SER - Serializer device name (e.g., SER0) + * DESCH_CAM - Camera device name (e.g., CAM0) + * DESCH_CH_PATH - CHxx ACPI path string (e.g., "\\_SB.PC00.DES0.CH00") + * DESCH_SER_PATH - SERx ACPI path string (e.g., "\\_SB.PC00.DES0.CH00.SER0") + * DESCH_SER_REF - SERx ACPI namespace reference (e.g., \_SB.PC00.DES0.CH00.SER0) + * DESCH_SER_I2C - SERx I2C address (e.g., 0x40) + * DESCH_LINK_NUM - Channel/link number (0, 1, 2, 3) - used for _ADR, reg, and SER remote port + * DESCH_SER_GPIOREF - SERx GPIO controller reference (e.g., ^^SER0, ^^SER1, etc.) + * CAM_LANES - CAMx Number of MIPI data lanes for the camera (e.g., 2, 4) + * Optional defines: + * DESCH_SER_EXTRA_GPIO_PIN - SERx Additional GPIO pin number (e.g., 7 for MFP7 in MAX9295A) + * DESCH_SER_X/Y/Z/U_VC - SERx VC filter for Pipe X/Y/Z/U, specifically for MAX96717 driver + */ + +Device (DESCH_CH) // New CHxx Device under parent DESx device for each DES channel/link +{ + /* + * Channel is the naming convention used by i2c-mux or i2c-atr in ACPI namespace + * In GMSL context, it can directly be translated as Link 0/1/2/3 of the Deserializer + */ + + Name (_ADR, DESCH_LINK_NUM) // _ADR: Address for the channel (e.g. 0 for Link 0, 1 for Link 1) + + Name (_DSD, Package () // _DSD: Device Specific Data + { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "reg", DESCH_LINK_NUM }, // used by i2c-atr driver. Represents the channel / link number + } + }) + + Device (DESCH_SER) // SERx device under parent DESx.CHxx + { + #include "_ser_common_max9295.asl" + + Device (DESCH_CAM) // CAMx device under parent DESx.CHxx.SERx + { + #include "_cam_common_ar0234.asl" + } + } +} \ No newline at end of file diff --git a/acpi/ipu6/max9296_d3_ar0234.asl b/acpi/ipu6/max9296_d3_ar0234.asl new file mode 100644 index 00000000..a71a2d22 --- /dev/null +++ b/acpi/ipu6/max9296_d3_ar0234.asl @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SSDT overlay: D3 AR0234 GMSL camera configuration with MAX9296A deserializer on IPU6EPMTL platform. + * One MAX9296A deserializer (DES0, two GMSL links) with DPHY connection to IPU6EPMTL platform, + * carrying two AR0234 cameras over GMSL Links 0..1, fronted by MAX9295A serializers. + * + * + * DES-level defines (set per DESx, undef'd at the end of each Device): + * DES_PHY_TYPE - DES PHY type (0 for CPHY, 1 for DPHY) + * DES_I2C_ADDR - DES I2C slave address (e.g. 0x0048 for MAX9296A) + * DES_LANES - Number of MIPI data lanes (e.g. 2, 4) + * DES_INTERNAL_PHY - DES internal PHY index (MAX9296A: 1 or 2) + * DES_TO_MIPI_PORT - DES connected to IPU0 MIPI port (e.g. 0/1/2/3) + * DES_I2C_BUS - DES I2C bus path (e.g. "\\_SB.PC00.I2C1") + * DES_PATH - DES ACPI path string (e.g. "\\_SB.PC00.DES0") + * DES_REF - DES ACPI namespace reference (e.g. \_SB.PC00.DES0) + * + * Channel-level defines (set per CHxx, undef'd by _des_ch_common_ar0234.asl): + * DESCH_LINK_NUM - Channel/link number (0..1 for MAX9296A) - used for _ADR, reg, SER remote port + * DESCH_CH - Channel device name (e.g. CH00) + * DESCH_SER - Serializer device name (e.g. SER0) + * DESCH_CAM - Camera device name (e.g. CAM0) + * DESCH_SER_I2C - SER I2C slave address (e.g. 0x40 for MAX9295A) + * DESCH_CH_PATH - CHxx ACPI path string (e.g. "\\_SB.PC00.DES0.CH00") + * DESCH_SER_PATH - SERx ACPI path string (e.g. "\\_SB.PC00.DES0.CH00.SER0") + * DESCH_SER_REF - SERx ACPI namespace reference (e.g. \_SB.PC00.DES0.CH00.SER0) + * DESCH_SER_GPIOREF - SERx GPIO controller reference (e.g. ^^SER0) + * CAM_ALIAS - Camera alias I2C address used in i2c-alias-pool of the SER + * CAM_LANES - Number of MIPI data lanes for the camera (e.g. 2, 4) + */ + +DefinitionBlock ("", "SSDT", 2, "", "IMG_IPU", 0x20260715) +{ + External (_SB.PC00, DeviceObj) + + Include ("_ipu.asl") + + Scope (\_SB.PC00) + { + Device (DES0) + { + //DES-level defines for DES0 + #define DES_PHY_TYPE 1 + #define DES_I2C_ADDR 0x0048 + #define DES_LANES 4 + #define DES_INTERNAL_PHY 2 + #define DES_TO_MIPI_PORT 0 + #define DES_I2C_BUS "\\_SB.PC00.I2C1" + #define DES_PATH "\\_SB.PC00.DES0" + #define DES_REF \_SB.PC00.DES0 + #define LINK_FREQ 700000000 + #include "_des_common_max9296.asl" + + // Channel 0 + #define DESCH_LINK_NUM 0 + #define DESCH_CH CH00 + #define DESCH_SER SER0 + #define DESCH_CAM CAM0 + #define DESCH_SER_I2C 0x40 + #define DESCH_CH_PATH "\\_SB.PC00.DES0.CH00" + #define DESCH_SER_PATH "\\_SB.PC00.DES0.CH00.SER0" + #define DESCH_SER_REF \_SB.PC00.DES0.CH00.SER0 + #define DESCH_SER_GPIOREF ^^SER0 + #define CAM_ALIAS 0x54 + #define CAM_LANES 2 + #include "_des_ch_common_ar0234.asl" + #undef DESCH_CH + #undef DESCH_SER + #undef DESCH_CAM + #undef DESCH_CH_PATH + #undef DESCH_SER_PATH + #undef DESCH_SER_REF + #undef DESCH_LINK_NUM + #undef DESCH_SER_I2C + #undef DESCH_SER_GPIOREF + #undef CAM_ALIAS + #undef CAM_LANES + + // Channel 1 + #define DESCH_LINK_NUM 1 + #define DESCH_CH CH01 + #define DESCH_SER SER1 + #define DESCH_CAM CAM1 + #define DESCH_SER_I2C 0x40 + #define DESCH_CH_PATH "\\_SB.PC00.DES0.CH01" + #define DESCH_SER_PATH "\\_SB.PC00.DES0.CH01.SER1" + #define DESCH_SER_REF \_SB.PC00.DES0.CH01.SER1 + #define DESCH_SER_GPIOREF ^^SER1 + #define CAM_ALIAS 0x55 + #define CAM_LANES 2 + #include "_des_ch_common_ar0234.asl" + #undef DESCH_CH + #undef DESCH_SER + #undef DESCH_CAM + #undef DESCH_CH_PATH + #undef DESCH_SER_PATH + #undef DESCH_SER_REF + #undef DESCH_LINK_NUM + #undef DESCH_SER_I2C + #undef DESCH_SER_GPIOREF + #undef CAM_ALIAS + #undef CAM_LANES + + // Clean up DES-level defines + #undef DES_PHY_TYPE + #undef DES_I2C_ADDR + #undef DES_LANES + #undef DES_INTERNAL_PHY + #undef DES_TO_MIPI_PORT + #undef DES_I2C_BUS + #undef DES_PATH + #undef DES_REF + #undef LINK_FREQ + } + } +} \ No newline at end of file From b446e89139903d6afba51d8d1bcbe719b4b68e5d Mon Sep 17 00:00:00 2001 From: "Mohd Azmy, Muhammad Amirul" Date: Mon, 27 Jul 2026 14:12:10 +0800 Subject: [PATCH 04/19] driver: media: i2c: max96717: Add AR0234 sensor support Add AR0234 image sensor configuration to the MAX96717 serializer driver. Register the AR0234-specific pipe and link setup required for GMSL operation with the MAX9296A deserializer. Signed-off-by: Mohd Azmy, Muhammad Amirul --- drivers/media/i2c/maxim-serdes/max96717.c | 26 ++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/maxim-serdes/max96717.c b/drivers/media/i2c/maxim-serdes/max96717.c index 9fc72fd2..6107e18a 100644 --- a/drivers/media/i2c/maxim-serdes/max96717.c +++ b/drivers/media/i2c/maxim-serdes/max96717.c @@ -820,6 +820,30 @@ static int max96717_gpio_set(struct gpio_chip *gc, unsigned int offset, int valu return max96717_conf_pin_config_set_one(priv, offset, config); } +static int max96717_gpio_set_config(struct gpio_chip *gc, unsigned int offset, + unsigned long config) +{ + struct max96717_priv *priv = gpiochip_get_data(gc); + unsigned int mask, val; + + switch (pinconf_to_config_param(config)) { + case PIN_CONFIG_DRIVE_OPEN_DRAIN: + /* OUT_TYPE = 0 -> open-drain; leave pull resistor config unchanged */ + mask = MAX96717_GPIO_B_OUT_TYPE; + val = 0; + break; + case PIN_CONFIG_DRIVE_PUSH_PULL: + /* OUT_TYPE = 1 -> push-pull */ + mask = MAX96717_GPIO_B_OUT_TYPE; + val = field_prep(MAX96717_GPIO_B_OUT_TYPE, 1); + break; + default: + return max96717_conf_pin_config_set_one(priv, offset, config); + } + + return regmap_update_bits(priv->regmap, MAX96717_GPIO_B(offset), mask, val); +} + static unsigned int max96717_pipe_id(struct max96717_priv *priv, struct max_ser_pipe *pipe) { @@ -1728,7 +1752,7 @@ static int max96717_gpiochip_probe(struct max96717_priv *priv) .can_sleep = true, .request = gpiochip_generic_request, .free = gpiochip_generic_free, - .set_config = gpiochip_generic_config, + .set_config = max96717_gpio_set_config, .get_direction = max96717_gpio_get_direction, .direction_input = max96717_gpio_direction_input, .direction_output = max96717_gpio_direction_output, From 2146b794cf0a022cd1048dd1ec4f8e527e4fb8db Mon Sep 17 00:00:00 2001 From: syafiqnizam25 Date: Thu, 30 Jul 2026 18:46:15 +0800 Subject: [PATCH 05/19] Maxim-serdes: Max96724: upstream ipu6 Dphy 8x isx031 - fix to enable camera in media-ctl. - fix to enable camera to stream - fix deskew value - fix pink frame - fix Data Lane for Des 1 Signed-off-by: syafiqnizam25 --- acpi/ipu6/_cam_common_d457.asl | 2 +- acpi/ipu6/_cam_common_isx031.asl | 2 +- acpi/ipu6/_des_common_max9296.asl | 8 ++-- acpi/ipu6/_des_common_max96724.asl | 15 +++--- acpi/ipu6/_ser_common_max9295.asl | 4 +- acpi/ipu6/max96724_dphy_d3_isx031.asl | 2 +- acpi/ipu7/_cam_common_d457.asl | 2 +- acpi/ipu7/_cam_common_isx031.asl | 2 +- acpi/ipu7/_des_common_max96724.asl | 16 +++---- acpi/ipu7/_ser_common_max9295.asl | 4 +- acpi/ipu8/_cam_common_d457.asl | 2 +- acpi/ipu8/_cam_common_isx031.asl | 2 +- acpi/ipu8/_des_common_max96724.asl | 16 +++---- acpi/ipu8/_ser_common_max9295.asl | 4 +- drivers/media/i2c/maxim-serdes/max96724.c | 57 +++++++++++++++++++---- 15 files changed, 90 insertions(+), 48 deletions(-) diff --git a/acpi/ipu6/_cam_common_d457.asl b/acpi/ipu6/_cam_common_d457.asl index 38930bc0..e17865ce 100644 --- a/acpi/ipu6/_cam_common_d457.asl +++ b/acpi/ipu6/_cam_common_d457.asl @@ -87,7 +87,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu6/_cam_common_isx031.asl b/acpi/ipu6/_cam_common_isx031.asl index b68f6b8b..1ab9c3f7 100644 --- a/acpi/ipu6/_cam_common_isx031.asl +++ b/acpi/ipu6/_cam_common_isx031.asl @@ -101,7 +101,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu6/_des_common_max9296.asl b/acpi/ipu6/_des_common_max9296.asl index 19e3109b..c0dc4929 100644 --- a/acpi/ipu6/_des_common_max9296.asl +++ b/acpi/ipu6/_des_common_max9296.asl @@ -90,7 +90,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4} }, }, }) @@ -100,7 +100,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, }) @@ -110,7 +110,7 @@ Name (PRT2, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 2 Package () { "mipi-img-data-lanes", Package() { 1, 2 } }, #else @@ -125,7 +125,7 @@ Name (PRT3, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 2 Package () { "mipi-img-data-lanes", Package() { 1, 2 } }, #else diff --git a/acpi/ipu6/_des_common_max96724.asl b/acpi/ipu6/_des_common_max96724.asl index 23de1eb1..5a82a335 100644 --- a/acpi/ipu6/_des_common_max96724.asl +++ b/acpi/ipu6/_des_common_max96724.asl @@ -1,3 +1,4 @@ +/* /* * SPDX-License-Identifier: GPL-2.0 * Copyright (c) 2026 Intel Corporation. @@ -105,7 +106,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4} }, }, }) @@ -115,7 +116,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -126,7 +127,7 @@ Name (PRT2, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, }, }) @@ -136,7 +137,7 @@ Name (PRT3, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -147,7 +148,7 @@ Name (PRT4, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0}, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -182,7 +183,7 @@ Name (PRT6, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0}, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -197,7 +198,7 @@ Name (PRT7, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else diff --git a/acpi/ipu6/_ser_common_max9295.asl b/acpi/ipu6/_ser_common_max9295.asl index 465a9938..6bd3b263 100644 --- a/acpi/ipu6/_ser_common_max9295.asl +++ b/acpi/ipu6/_ser_common_max9295.asl @@ -105,7 +105,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 data lanes #elif CAM_LANES == 2 @@ -121,7 +121,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, }) diff --git a/acpi/ipu6/max96724_dphy_d3_isx031.asl b/acpi/ipu6/max96724_dphy_d3_isx031.asl index bd569a30..3cea8a0a 100644 --- a/acpi/ipu6/max96724_dphy_d3_isx031.asl +++ b/acpi/ipu6/max96724_dphy_d3_isx031.asl @@ -178,7 +178,7 @@ DefinitionBlock ("", "SSDT", 2, "", "IMG_IPU", 0x20260513) // DES-level defines for DES1. #define DES_PHY_TYPE 1 #define DES_I2C_ADDR 0x0027 - #define DES_LANES 2 + #define DES_LANES 4 #define DES_INTERNAL_PHY 6 #define DES_TO_MIPI_PORT 4 #define DES_I2C_BUS "\\_SB.PC00.I2C0" diff --git a/acpi/ipu7/_cam_common_d457.asl b/acpi/ipu7/_cam_common_d457.asl index 7fbd05dd..74f93cac 100644 --- a/acpi/ipu7/_cam_common_d457.asl +++ b/acpi/ipu7/_cam_common_d457.asl @@ -91,7 +91,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu7/_cam_common_isx031.asl b/acpi/ipu7/_cam_common_isx031.asl index d4231542..a4e9fc5d 100644 --- a/acpi/ipu7/_cam_common_isx031.asl +++ b/acpi/ipu7/_cam_common_isx031.asl @@ -105,7 +105,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu7/_des_common_max96724.asl b/acpi/ipu7/_des_common_max96724.asl index 2a268f48..d3030cc9 100644 --- a/acpi/ipu7/_des_common_max96724.asl +++ b/acpi/ipu7/_des_common_max96724.asl @@ -104,7 +104,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4} }, }, }) @@ -114,7 +114,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -125,7 +125,7 @@ Name (PRT2, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, }, }) @@ -135,7 +135,7 @@ Name (PRT3, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -146,7 +146,7 @@ Name (PRT4, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -161,7 +161,7 @@ Name (PRT5, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -176,7 +176,7 @@ Name (PRT6, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -191,7 +191,7 @@ Name (PRT7, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else diff --git a/acpi/ipu7/_ser_common_max9295.asl b/acpi/ipu7/_ser_common_max9295.asl index e874e863..066ecfea 100644 --- a/acpi/ipu7/_ser_common_max9295.asl +++ b/acpi/ipu7/_ser_common_max9295.asl @@ -109,7 +109,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 data lanes #elif CAM_LANES == 2 @@ -125,7 +125,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, }) diff --git a/acpi/ipu8/_cam_common_d457.asl b/acpi/ipu8/_cam_common_d457.asl index 38930bc0..e17865ce 100644 --- a/acpi/ipu8/_cam_common_d457.asl +++ b/acpi/ipu8/_cam_common_d457.asl @@ -87,7 +87,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu8/_cam_common_isx031.asl b/acpi/ipu8/_cam_common_isx031.asl index b68f6b8b..1ab9c3f7 100644 --- a/acpi/ipu8/_cam_common_isx031.asl +++ b/acpi/ipu8/_cam_common_isx031.asl @@ -101,7 +101,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, #elif CAM_LANES == 2 diff --git a/acpi/ipu8/_des_common_max96724.asl b/acpi/ipu8/_des_common_max96724.asl index 5535c05b..60450fd7 100644 --- a/acpi/ipu8/_des_common_max96724.asl +++ b/acpi/ipu8/_des_common_max96724.asl @@ -100,7 +100,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4} }, }, }) @@ -110,7 +110,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -121,7 +121,7 @@ Name (PRT2, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, }, }) @@ -131,7 +131,7 @@ Name (PRT3, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, @@ -142,7 +142,7 @@ Name (PRT4, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -157,7 +157,7 @@ Name (PRT5, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -172,7 +172,7 @@ Name (PRT6, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else @@ -187,7 +187,7 @@ Name (PRT7, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if DES_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else diff --git a/acpi/ipu8/_ser_common_max9295.asl b/acpi/ipu8/_ser_common_max9295.asl index 465a9938..6bd3b263 100644 --- a/acpi/ipu8/_ser_common_max9295.asl +++ b/acpi/ipu8/_ser_common_max9295.asl @@ -105,7 +105,7 @@ Name (PRT0, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #if CAM_LANES == 4 Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 data lanes #elif CAM_LANES == 2 @@ -121,7 +121,7 @@ Name (PRT1, Package() ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, }, }) diff --git a/drivers/media/i2c/maxim-serdes/max96724.c b/drivers/media/i2c/maxim-serdes/max96724.c index 3d70e95e..c76f25bc 100644 --- a/drivers/media/i2c/maxim-serdes/max96724.c +++ b/drivers/media/i2c/maxim-serdes/max96724.c @@ -80,7 +80,7 @@ #define MAX96724_BACKTOP32_BPP10DBL1_MODE BIT(7) #define MAX96724_MIPI_PHY0 0x8a0 -#define MAX96724_MIPI_PHY0_PHY_CONFIG GENMASK(4, 0) +#define MAX96724_MIPI_PHY0_PHY_CONFIG GENMASK(6, 0) #define MAX96724_MIPI_PHY0_PHY_4X2 BIT(0) #define MAX96724_MIPI_PHY0_PHY_2X4 BIT(2) #define MAX96724_MIPI_PHY0_PHY_1X4A_2X2 BIT(3) @@ -124,11 +124,12 @@ #define MAX96724_MIPI_PHY27_PHY_PKT_CNT(x) (GENMASK(3, 0) << (4 * ((x) % 2))) #define MAX96724_MIPI_TX3(x) (0x903 + (x) * 0x40) -#define MAX96724_MIPI_TX3_DESKEW_INIT_8X32K FIELD_PREP(GENMASK(2, 0), 0b001) +#define MAX96724_MIPI_TX3_DESKEW_INIT_8X32K FIELD_PREP(GENMASK(2, 0), 0b111) #define MAX96724_MIPI_TX3_DESKEW_INIT_AUTO BIT(7) #define MAX96724_MIPI_TX4(x) (0x904 + (x) * 0x40) -#define MAX96724_MIPI_TX4_DESKEW_PER_2K FIELD_PREP(GENMASK(2, 0), 0b001) +#define MAX96724_MIPI_TX4_DESKEW_PER_8 FIELD_PREP(GENMASK(2, 0), 0b111) +#define MAX96724_MIPI_TX4_DESKEW_PER_INT_1FRAME FIELD_PREP(GENMASK(5, 3), 0b000) #define MAX96724_MIPI_TX4_DESKEW_PER_AUTO BIT(7) #define MAX96724_MIPI_TX10(x) (0x90a + (x) * 0x40) @@ -403,6 +404,7 @@ static const unsigned int max96724_phys_configs_reg_val[] = { MAX96724_MIPI_PHY0_PHY_1X4A_2X2, MAX96724_MIPI_PHY0_PHY_1X4B_2X2, MAX96724_MIPI_PHY0_PHY_2X4, + MAX96724_MIPI_PHY0_PHY_1X4A_2X2 | MAX96724_MIPI_PHY0_CLK_PHY0, }; static const struct max_serdes_phys_config max96724_phys_configs[] = { @@ -424,6 +426,7 @@ static const struct max_serdes_phys_config max96724_phys_configs[] = { { { 4, 0, 2, 2 } }, { { 2, 2, 4, 0 } }, { { 4, 0, 4, 0 } }, + { { 0, 4, 2, 2 }, { 0, MAX96724_PHY1_ALT_CLOCK, 0, 0 } }, }; static int max96724_init_tpg(struct max_des *des) @@ -591,17 +594,18 @@ static int max96724_init_phy(struct max_des *des, struct max_des_phy *phy) } if (!is_cphy && dpll_freq > 1500000000ull) { - /* Enable initial deskew with 2 x 32k UI. */ + /* Enable initial deskew with 8 x 32k UI. */ ret = regmap_write(priv->regmap, MAX96724_MIPI_TX3(index), MAX96724_MIPI_TX3_DESKEW_INIT_AUTO | MAX96724_MIPI_TX3_DESKEW_INIT_8X32K); if (ret) return ret; - /* Enable periodic deskew with 2 x 1k UI.. */ + /* Enable periodic deskew with 8 x 1k UI. */ ret = regmap_write(priv->regmap, MAX96724_MIPI_TX4(index), MAX96724_MIPI_TX4_DESKEW_PER_AUTO | - MAX96724_MIPI_TX4_DESKEW_PER_2K); + MAX96724_MIPI_TX4_DESKEW_PER_INT_1FRAME | + MAX96724_MIPI_TX4_DESKEW_PER_8); if (ret) return ret; } else { @@ -712,11 +716,48 @@ static int max96724_set_pipe_remap(struct max_des *des, struct max_des_remap *remap) { struct max96724_priv *priv = des_to_priv(des); - struct max_des_phy *phy = &des->phys[remap->phy]; - unsigned int phy_id = max96724_phy_id(des, phy); + struct max_des_phy *phy = NULL; + unsigned int phy_id; unsigned int index = pipe->index; + unsigned int j; int ret; + /* + * Route MAP_DPHY_DEST to the output PHY selected by the core for this + * route (remap->phy), but only when that PHY is a valid active output + * (enabled and with non-zero hw data lanes). This keeps multiple + * simultaneous output PHYs (e.g. 2x4/4x2) routed correctly. + */ + if (remap->phy < des->ops->num_phys && + des->phys[remap->phy].enabled && + max_des_phy_hw_data_lanes(des, &des->phys[remap->phy])) + phy = &des->phys[remap->phy]; + + /* + * Otherwise fall back to the first enabled PHY with non-zero hw data + * lanes. In 1x4A mode this is PHY1 (the master that carries the clock + * lane); the routing-context PHY can point at an inactive PHY (e.g. + * PHY0 with 0 lanes), which must not be programmed as the destination. + */ + if (!phy) { + for (j = 0; j < des->ops->num_phys; j++) { + if (des->phys[j].enabled && + max_des_phy_hw_data_lanes(des, &des->phys[j])) { + phy = &des->phys[j]; + break; + } + } + } + + if (!phy) { + dev_err(priv->dev, + "No active output PHY for pipe %u remap %u\n", index, i); + return -EINVAL; + } + + /* Translate logical PHY index to the physical MIPI controller id. */ + phy_id = max96724_phy_id(des, phy); + /* Set source Data Type and Virtual Channel. */ /* TODO: implement extended Virtual Channel. */ ret = regmap_write(priv->regmap, MAX96724_MIPI_TX13(index, i), From 0d77f0ea54815baaa0f3407bd6dd990332ca4b38 Mon Sep 17 00:00:00 2001 From: "Khai Wen, Ng" Date: Mon, 27 Jul 2026 14:21:14 +0800 Subject: [PATCH 06/19] ipu7-drivers: Update Submodule commit Update submodule commit to bed9b71d5be56d0e24c771c7a6ec83fd0a9db433 Signed-off-by: Khai Wen, Ng --- ipu7-drivers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipu7-drivers b/ipu7-drivers index 22ce0dda..bed9b71d 160000 --- a/ipu7-drivers +++ b/ipu7-drivers @@ -1 +1 @@ -Subproject commit 22ce0dda426bd0c84695e6245139bc30fb554e54 +Subproject commit bed9b71d5be56d0e24c771c7a6ec83fd0a9db433 From 6d79d9d637a7cbf8b6e50eef7064c054c4cd4e9b Mon Sep 17 00:00:00 2001 From: "Khai Wen, Ng" Date: Tue, 11 Aug 2026 14:22:57 +0800 Subject: [PATCH 07/19] patches: Fix CI failure Patch 6.18/0006 failed to git apply cleanly in CI build. CONFIG_VIDEO_INTEL_IPU7_ISYS_RESET turned on caused line number to alter. Signed-off-by: Khai Wen, Ng --- .../6.18/0006-media-pci-ipu7-Add-D4XX-support-to-IPU7.patch | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/patches/6.18/0006-media-pci-ipu7-Add-D4XX-support-to-IPU7.patch b/patches/6.18/0006-media-pci-ipu7-Add-D4XX-support-to-IPU7.patch index 8e36a03f..c0742f43 100644 --- a/patches/6.18/0006-media-pci-ipu7-Add-D4XX-support-to-IPU7.patch +++ b/patches/6.18/0006-media-pci-ipu7-Add-D4XX-support-to-IPU7.patch @@ -41,7 +41,7 @@ WARN_ON(1); --- a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7-isys-video.c +++ b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7-isys-video.c -@@ -84,11 +84,20 @@ const struct ipu7_isys_pixelformat ipu7_isys_pfmts[] = { +@@ -84,12 +84,21 @@ const struct ipu7_isys_pixelformat ipu7_isys_pfmts[] = { {V4L2_PIX_FMT_UYVY, 16, 16, MEDIA_BUS_FMT_UYVY8_1X16, IPU_INSYS_FRAME_FORMAT_UYVY}, {V4L2_PIX_FMT_YUYV, 16, 16, MEDIA_BUS_FMT_YUYV8_1X16, @@ -62,7 +62,8 @@ + IPU_INSYS_FRAME_FORMAT_RAW8}, }; - static int video_open(struct file *file) + #ifdef CONFIG_VIDEO_INTEL_IPU7_ISYS_RESET + static int video_release(struct file *file) --- a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7-isys.h +++ b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7-isys.h @@ -45,7 +45,7 @@ struct ipu7_isys_stream; From 3632de16498cb63af9a631703cc1c1ade136d7a3 Mon Sep 17 00:00:00 2001 From: syafiqnizam25 Date: Thu, 30 Jul 2026 18:46:15 +0800 Subject: [PATCH 08/19] Maxim-serdes: Max96724: upstream ipu6 Dphy 8x isx031 - fix to enable camera in media-ctl. - fix to enable camera to stream - fix deskew value - fix pink frame - fix Data Lane for Des 1 Signed-off-by: syafiqnizam25 --- acpi/ipu6/_des_common_max96724.asl | 7 +++---- drivers/media/i2c/maxim-serdes/max96724.c | 19 ------------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/acpi/ipu6/_des_common_max96724.asl b/acpi/ipu6/_des_common_max96724.asl index 5a82a335..5868783c 100644 --- a/acpi/ipu6/_des_common_max96724.asl +++ b/acpi/ipu6/_des_common_max96724.asl @@ -1,4 +1,3 @@ -/* /* * SPDX-License-Identifier: GPL-2.0 * Copyright (c) 2026 Intel Corporation. @@ -165,13 +164,13 @@ Name (PRT5, Package() { #if DES_LANES == 4 #if DES_PHY_TYPE == 1 - Package () { "mipi-img-clock-lanes", 5 }, // DPHY uses alternate CKCP PHY0 clock lane + Package () { "mipi-img-clock-lane", 5 }, // DPHY uses alternate CKCP PHY0 clock lane #else - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, #endif Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // 4 lanes for DPHY on Intel MIPI CRD #else - Package () { "mipi-img-clock-lanes", 0 }, + Package () { "mipi-img-clock-lane", 0 }, Package () { "mipi-img-data-lanes", Package() { 1, 2 } }, // 2 lanes for CPHY/DPHY on Intel MIPI CRD #endif Package () { "mipi-img-link-frequencies", Package() { LINK_FREQ } }, diff --git a/drivers/media/i2c/maxim-serdes/max96724.c b/drivers/media/i2c/maxim-serdes/max96724.c index c76f25bc..faeb30cd 100644 --- a/drivers/media/i2c/maxim-serdes/max96724.c +++ b/drivers/media/i2c/maxim-serdes/max96724.c @@ -515,25 +515,6 @@ static int max96724_init_phy(struct max_des *des, struct max_des_phy *phy) MAX96724_MIPI_TX10_CSI2_CPHY_EN, is_cphy); if (ret) return ret; - - switch (phy->mipi.clock_lane) { - case 0: - val = MAX96724_MIPI_PHY0_CLK_PHY3; - break; - case 5: - val = MAX96724_MIPI_PHY0_CLK_PHY0; - break; - default: - dev_err(priv->dev, "Invalid clock lane %u for PHY %u\n", - phy->mipi.clock_lane, phy->index); - return -EINVAL; - } - - ret = regmap_assign_bits(priv->regmap, MAX96724_MIPI_PHY0, - MAX96724_MIPI_PHY0_CLK_PHY0 | MAX96724_MIPI_PHY0_CLK_PHY3, val); - if (ret) - return ret; - /* Configure lane mapping. */ val = 0; for (i = 0; i < num_hw_data_lanes ; i++) { From bd025f414c2d2375debbcce7d4f8902e05e55f1e Mon Sep 17 00:00:00 2001 From: "Sodhi, Vunny" Date: Wed, 5 Aug 2026 09:54:26 +0800 Subject: [PATCH 09/19] mc-setup.sh: Add direct MIPI camera support Add fallback support for cameras connected directly to CSI2 without a GMSL deserializer/serializer chain. Changes: - Add MIPI_SENSOR_HID table for direct MIPI sensor HIDs - Add discover_mipi_cameras() to enumerate ACPI devices - Add detect_mipi_csi2() to find CSI2 entities from media topology - Add setup_mipi_cameras() to configure formats and enable links - Move mbus_to_pixfmt() earlier for reuse by MIPI setup - Modify discover() to fall back to MIPI when no deserializers found The script now auto-detects the camera topology and configures the appropriate pipeline for either GMSL or direct MIPI cameras. Signed-off-by: Sodhi, Vunny --- script/acpi/mc-setup.sh | 172 +++++++++++++++++++++++++++++++++------- 1 file changed, 142 insertions(+), 30 deletions(-) diff --git a/script/acpi/mc-setup.sh b/script/acpi/mc-setup.sh index 192554bf..35ef715a 100755 --- a/script/acpi/mc-setup.sh +++ b/script/acpi/mc-setup.sh @@ -108,6 +108,11 @@ declare -A SENSOR_PREFIX=( [INTC10C0]="ar0234" ) +# ---- Direct MIPI sensor HIDs (no GMSL deserializer) ------------------------ +declare -A MIPI_SENSOR_HID=( + [INTC113C]=isx031 +) + # ---- Serializer / Deserializer HID -> v4l entity prefix --------------------- declare -A SER_PREFIX=( [INTC1138]="max96717" @@ -195,6 +200,7 @@ declare -A MBUS_TO_PIXFMT=( [Y8_1X8]="GREY" [SGRBG10_1X10]="BA10" # AR0234 RAW Bayer SGRBG 10-bit ) +mbus_to_pixfmt() { echo "${MBUS_TO_PIXFMT[$1]:-}"; } # ============================================================================= # end of USER CONFIGURATION @@ -202,6 +208,25 @@ declare -A MBUS_TO_PIXFMT=( # -------- low-level helpers --------------------------------------------------- +# Find the lowest "ISYS Capture N" index linked from a given CSI2 entity. +# Reads media-ctl topology from stdin. +capture_base_of_csi2() { + awk -v csi="$1" ' + /^- entity / { + n = "" + if (match($0, /Intel IPU[0-9]+ ISYS Capture [0-9]+/)) { + s = substr($0, RSTART, RLENGTH) + sub(/.*Capture /, "", s) + n = s + 0 + } + } + n != "" && index($0, "<- \"" csi "\":") { + if (m == "" || n < m) m = n + } + END { if (m != "") print m } + ' +} + # Read "bus-addr" (e.g. 18-0010) from any v4l-subdev whose name starts with # the given prefix, under any physical_node* of an ACPI sysfs dir. acpi_busaddr() { @@ -337,7 +362,7 @@ discover_one_des() { DES_PATH[$d]=$des_path DES_BA[$d]=$des_ba DES_PREFIX_NAME[$d]=$des_prefix - # DES_SRC_PAD[$d] is filled in later by detect_csi2_entities() based on the + # DES_SRC_PAD[$d] is filled in later by detect_gmsl_csi2() based on the # live media topology (which reflects the DES_CSI_LOCAL_PORT value the # SSDT/_CRS published in the CSI2Bus resource). DES_MAX_LINKS[$d]=${MAX_LINKS_BY_PREFIX[$des_prefix]:-4} @@ -430,19 +455,107 @@ discover_one_des() { discover() { local des_dirs=() mapfile -t des_dirs < <(find_all_deserializers) - [ "${#des_dirs[@]}" -gt 0 ] || { - echo "ERROR: no known deserializer ACPI device present" >&2 + if [ "${#des_dirs[@]}" -gt 0 ]; then + local d=0 dir + for dir in "${des_dirs[@]}"; do + if discover_one_des "$d" "$dir"; then + d=$((d + 1)) + fi + done + NUM_DES=$d + fi + if [ "$NUM_DES" -eq 0 ] && [ "${#des_dirs[@]}" -gt 0 ]; then + echo "WARN: ${#des_dirs[@]} deserializer ACPI device(s) found" \ + "but none are usable (driver loaded?)" >&2 + fi + # Discover direct MIPI cameras (skips sensors already behind a DES). + discover_mipi_cameras + [ "$NUM_DES" -gt 0 ] || [ "$NUM_MIPI" -gt 0 ] || { + echo "ERROR: no deserializer or direct MIPI camera found" >&2 return 1 } - local d=0 dir - for dir in "${des_dirs[@]}"; do - if discover_one_des "$d" "$dir"; then - d=$((d + 1)) + return 0 +} + +# ---- Direct MIPI camera support --------------------------------------------- +declare -a MIPI_BA=() MIPI_PREFIX=() MIPI_MODEL=() MIPI_CSI2=() MIPI_CAP=() +NUM_MIPI=0 + +discover_mipi_cameras() { + local hid model prefix d ba path idx=0 + for hid in "${!MIPI_SENSOR_HID[@]}"; do + model=${MIPI_SENSOR_HID[$hid]} + prefix=${SENSOR_PREFIX[$hid]} + for d in /sys/bus/acpi/devices/${hid}:*; do + [ -d "$d" ] || continue + # Skip sensors already discovered behind a deserializer. + path=$(cat "$d/path" 2>/dev/null) || continue + local skip=0 di + for ((di = 0; di < NUM_DES; di++)); do + case "$path" in "${DES_PATH[$di]}."*) skip=1; break ;; esac + done + [ "$skip" -eq 1 ] && continue + ba=$(acpi_busaddr "$d" "$prefix") || continue + MIPI_BA[$idx]=$ba; MIPI_PREFIX[$idx]=$prefix; MIPI_MODEL[$idx]=$model + idx=$((idx + 1)) + done + done + NUM_MIPI=$idx + [ "$NUM_MIPI" -gt 0 ] && echo "Discovered $NUM_MIPI direct MIPI camera(s)" +} + +detect_mipi_csi2() { + [ "$NUM_MIPI" -eq 0 ] && return 0 + local topo i cam csi2 base + topo=$(media-ctl -p 2>/dev/null) || return 1 + for ((i = 0; i < NUM_MIPI; i++)); do + cam="${MIPI_PREFIX[$i]} ${MIPI_BA[$i]}" + csi2=$(awk -v c="$cam" ' + /- entity.*: / { f = index($0, ": " c " (") ? 1 : 0 } + f && /-> "Intel IPU[0-9]+ CSI2 [0-9]+"/ { + gsub(/.*-> "|":.*/, "") + print + exit + } + ' <<<"$topo") + [ -z "$csi2" ] && { echo "ERROR: no CSI2 link for $cam" >&2; return 1; } + MIPI_CSI2[$i]=$csi2 + MIPI_CAP[$i]=$(capture_base_of_csi2 "$csi2" <<<"$topo") + if [ -z "${MIPI_CAP[$i]}" ]; then + echo "ERROR: MIPI${i}: could not find any 'ISYS Capture' entity linked from '$csi2'" >&2 + return 1 fi done - NUM_DES=$d - [ "$NUM_DES" -gt 0 ] || { echo "ERROR: no usable deserializer found" >&2; return 1; } - return 0 +} + +setup_mipi_cameras() { + [ "$NUM_MIPI" -eq 0 ] && return 0 + echo -e "\nConfiguring direct MIPI cameras..." + local i model cam csi2 node fmt size s pixfmt w h ipu + for ((i = 0; i < NUM_MIPI; i++)); do + model=${MIPI_MODEL[$i]} + cam=${MIPI_BA[$i]} + csi2=${MIPI_CSI2[$i]} + node=${MIPI_CAP[$i]} + for s in ${MODEL_DEFAULT_STREAMS[$model]}; do + fmt=${STREAM_FMT[$s]} + size=${STREAM_SIZE[$s]} + break + done + echo " ${MIPI_PREFIX[$i]} $cam -> $csi2 -> /dev/video$node ($fmt/$size)" + mc_v "\"${MIPI_PREFIX[$i]} ${cam}\":0 [fmt:${fmt}/${size} field:none]" + mc_v "\"${csi2}\":0 [fmt:${fmt}/${size} field:none]" + mc_v "\"${csi2}\":1 [fmt:${fmt}/${size} field:none]" + ipu=${csi2% CSI2 *} + mc_l "\"${csi2}\":1 -> \"${ipu} ISYS Capture ${node}\":0[1]" + pixfmt=$(mbus_to_pixfmt "$fmt") + w=${size%x*} + h=${size#*x} + [ -n "$pixfmt" ] && + v4l2-ctl -d "/dev/video${node}" \ + --set-fmt-video="width=${w},height=${h},pixelformat=${pixfmt}" \ + >/dev/null + done } # For each DES, locate the "Intel IPUx CSI2 N" entity wired to its source @@ -450,7 +563,7 @@ discover() { # the SSDT CSI2Bus resource), and the absolute capture-node base (lowest # "ISYS Capture " index linked to that CSI2). The DES->CSI2 link is # IMMUTABLE so the live media topology is the source of truth. -detect_csi2_entities() { +detect_gmsl_csi2() { local topo topo=$(media-ctl -p 2>/dev/null) || { echo "ERROR: failed to read media topology via 'media-ctl -p'" >&2 @@ -483,25 +596,11 @@ detect_csi2_entities() { IPU_CSI2_ENTITY[$d]=$csi2 IPU_BASE[$d]=${csi2% CSI2 *} - # Capture base = lowest "ISYS Capture N" entity that links from this CSI2. - base=$(awk -v csi="$csi2" ' - /^- entity / { - cap_num = "" - if (match($0, /Intel IPU[0-9]+ ISYS Capture [0-9]+/)) { - s = substr($0, RSTART, RLENGTH) - sub(/.*Capture /, "", s) - cap_num = s + 0 - } - } - cap_num != "" && index($0, "<- \"" csi "\":") { - if (min == "" || cap_num < min) min = cap_num - } - END { if (min != "") print min }' <<<"$topo") - if [ -z "$base" ]; then + CAPTURE_BASE[$d]=$(capture_base_of_csi2 "$csi2" <<<"$topo") + if [ -z "${CAPTURE_BASE[$d]}" ]; then echo "ERROR: DES${d}: could not find any 'ISYS Capture' entity linked from '$csi2'" >&2 return 1 fi - CAPTURE_BASE[$d]=$base done return 0 } @@ -524,6 +623,11 @@ print_topology() { "${CAM_MODEL[$key]}" "${CAM_HID[$key]}" done done + for ((i = 0; i < NUM_MIPI; i++)); do + printf " MIPI%d %s %s -> %s (capture /dev/video%s)\n" \ + "$i" "${MIPI_PREFIX[$i]}" "${MIPI_BA[$i]}" \ + "${MIPI_CSI2[$i]}" "${MIPI_CAP[$i]}" + done } # -------- per-sensor media-ctl programming ----------------------------------- @@ -608,9 +712,16 @@ check_media_ctl_version() { check_media_ctl_version discover || exit 1 -detect_csi2_entities || exit 1 + +[ "$NUM_DES" -gt 0 ] && { detect_gmsl_csi2 || exit 1; } +[ "$NUM_MIPI" -gt 0 ] && { detect_mipi_csi2 || exit 1; } print_topology +# ---- GMSL programming (DES-based cameras) ----------------------------------- +# Steps below (argument parsing, pad computation, route setup, format +# propagation, capture-node format) apply only to GMSL deserializer cameras. +# Direct MIPI cameras are handled separately by setup_mipi_cameras() at the end. + # ---- argument parsing ------------------------------------------------------ # Each CFG entry is identified by (des_idx, link_idx) and carries a streams list. @@ -867,8 +978,6 @@ done # ---- v4l2-ctl: capture-node format ----------------------------------------- -mbus_to_pixfmt() { echo "${MBUS_TO_PIXFMT[$1]:-}"; } - for k in "${!CFG_LINKS[@]}"; do d=${CFG_DES[$k]} for s in ${CFG_STREAMS[$k]}; do @@ -883,3 +992,6 @@ for k in "${!CFG_LINKS[@]}"; do >/dev/null done done + +# ---- direct MIPI cameras (non-GMSL) ----------------------------------------- +setup_mipi_cameras From dc7cbf6a0dffedfa2714faf16b14bbc62206e67c Mon Sep 17 00:00:00 2001 From: "Khai Wen, Ng" Date: Wed, 22 Jul 2026 11:02:06 +0800 Subject: [PATCH 10/19] Makefile: Add CONFIG_VIDEO_INTEL_IPU7_ISYS_RESET Enable ISYS_RESET config for IPU7 Signed-off-by: Khai Wen, Ng --- Makefile | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 67ed2bde..4a9c514a 100644 --- a/Makefile +++ b/Makefile @@ -90,18 +90,20 @@ ccflags-y := -I$(src)/include ifneq (,$(filter 1,$(KERNEL_EQ_6_17) $(KERNEL_EQ_6_18) $(KERNEL_EQ_7_0))) # IPU7 driver configs export CONFIG_VIDEO_INTEL_IPU7=m +export CONFIG_VIDEO_INTEL_IPU7_ISYS_RESET=y export CONFIG_VIDEO_INTEL_IPU6=m export CONFIG_VIDEO_INTEL_IPU6_ISYS_RESET=y -subdir-ccflags-y += -DIPU8_INSYS_NEW_ABI -subdir-ccflags-y += -DCONFIG_VIDEO_INTEL_IPU7 -subdir-ccflags-y += -DCONFIG_VIDEO_INTEL_IPU6 +subdir-ccflags-$(CONFIG_VIDEO_INTEL_IPU7) += -DCONFIG_VIDEO_INTEL_IPU7 -DIPU8_INSYS_NEW_ABI +subdir-ccflags-$(CONFIG_VIDEO_INTEL_IPU7_ISYS_RESET) += -DCONFIG_VIDEO_INTEL_IPU7_ISYS_RESET +subdir-ccflags-$(CONFIG_VIDEO_INTEL_IPU6) += -DCONFIG_VIDEO_INTEL_IPU6 +subdir-ccflags-$(CONFIG_VIDEO_INTEL_IPU6_ISYS_RESET) += -DCONFIG_VIDEO_INTEL_IPU6_ISYS_RESET # Build IPU7 drivers from submodule -obj-m += ipu7-drivers/drivers/media/pci/intel/ipu7/ +obj-$(CONFIG_VIDEO_INTEL_IPU7) += ipu7-drivers/drivers/media/pci/intel/ipu7/ # Build IPU6 drivers from submodule -obj-m += ipu6-drivers/drivers/media/pci/intel/ipu6/ +obj-$(CONFIG_VIDEO_INTEL_IPU6) += ipu6-drivers/drivers/media/pci/intel/ipu6/ # Select extracted kernel tree based on running kernel ifeq ($(KERNEL_EQ_7_0),1) From 49dc3c56d46f43d041330b7f83542beab49f85d1 Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 6 Aug 2026 10:53:54 +0800 Subject: [PATCH 11/19] config: ar0234: Add IPU75XA MIPI sensor configuration Add IPU75XA sensor configs for dual AR0234 MIPI cameras (ar0234-a, ar0234-b), including MediaCtl routing, AIQ tuning (.aiqb) and graph settings (gcss .bin/.xml) files, libcamhal_configs.json enabling ar0234-a-0 and ar0234-b-2, pipe_scheduler_profiles.json and pnp_profiles.json on the IPU7 platform. Signed-off-by: Goh, Wei Khang1 --- .../AR0234_GRBG_1280_960_PTL.IPU75XA.aiqb | Bin 0 -> 196420 bytes config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.bin | Bin 0 -> 90560 bytes config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.xml | 2301 +++++++++++++++++ config/ar0234/ipu75xa/libcamhal_configs.json | 26 + .../ipu75xa/pipe_scheduler_profiles.json | 104 + config/ar0234/ipu75xa/pnp_profiles.json | 37 + config/ar0234/ipu75xa/sensors/ar0234-a.json | 222 ++ config/ar0234/ipu75xa/sensors/ar0234-b.json | 220 ++ 8 files changed, 2910 insertions(+) create mode 100644 config/ar0234/ipu75xa/AR0234_GRBG_1280_960_PTL.IPU75XA.aiqb create mode 100644 config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.bin create mode 100644 config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.xml create mode 100644 config/ar0234/ipu75xa/libcamhal_configs.json create mode 100644 config/ar0234/ipu75xa/pipe_scheduler_profiles.json create mode 100644 config/ar0234/ipu75xa/pnp_profiles.json create mode 100644 config/ar0234/ipu75xa/sensors/ar0234-a.json create mode 100644 config/ar0234/ipu75xa/sensors/ar0234-b.json diff --git a/config/ar0234/ipu75xa/AR0234_GRBG_1280_960_PTL.IPU75XA.aiqb b/config/ar0234/ipu75xa/AR0234_GRBG_1280_960_PTL.IPU75XA.aiqb new file mode 100644 index 0000000000000000000000000000000000000000..eed4e3a67f8b0a5ccb64c1169d3f0620da906106 GIT binary patch literal 196420 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˹Jgi80 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

Xtq{|aDWru9ZQrq)3B7bF>eR-;2 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 Icfq~?2Znpg^#A|> literal 0 HcmV?d00001 diff --git a/config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.bin b/config/ar0234/ipu75xa/gcss/AR0234.IPU75XA.bin new file mode 100644 index 0000000000000000000000000000000000000000..313fad15067faa626aacbf08312f6f473430f537 GIT binary patch literal 90560 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/ar0234/ipu75xa/libcamhal_configs.json b/config/ar0234/ipu75xa/libcamhal_configs.json new file mode 100644 index 00000000..ce9b3314 --- /dev/null +++ b/config/ar0234/ipu75xa/libcamhal_configs.json @@ -0,0 +1,26 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "Common" : { + "version": 1.0, + "platform": "IPU7", + // The value format of availableSensors is "sensor name"-wf/uf-"CSI port ID". + // wf is world facing, and uf is user facing. + "availableSensors": ["ar0234-a-0","ar0234-b-2"], + "videoStreamNum" : 2 + } +} diff --git a/config/ar0234/ipu75xa/pipe_scheduler_profiles.json b/config/ar0234/ipu75xa/pipe_scheduler_profiles.json new file mode 100644 index 00000000..c5a2186e --- /dev/null +++ b/config/ar0234/ipu75xa/pipe_scheduler_profiles.json @@ -0,0 +1,104 @@ +// +// Copyright (C) 2026 Intel Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "PipeSchedulerPolicy": { + // Configuration is chosen according to: graphId, usecase, cameraId + "schedulers": [ + { + "id": 1, "graphId": 100000, + "pipe_executors": [ + { + "name": "video_lb", + "nodes": [ + "lbff", + ], + }, + { + "name": "video_bb", + "nodes": [ + "bbps", + "post_1", + "post_2", + ], + }, + { + "name": "still_full", + "nodes": [ + "lbff1", + "bbps1", + "post_0", + ], + }, + ], + }, + { + "id": 2, "graphId": 100200, + "pipe_executors": [ + { + "name": "video_lb", + "nodes": [ + "lbff", + ], + }, + { + "name": "video_bb", + "nodes": [ + "bbps", + "post_1", + "post_2", + ], + }, + { + "name": "still_full", + "nodes": [ + "lbff1", + "bbps1", + "post_0", + ], + }, + ], + }, + { + "id": 2, "graphId": 100002, + "pipe_executors": [ + { + "name": "video_lb", + "nodes": [ + "lbff", + "bbps", + ], + }, + { + "name": "video_bb", + "nodes": [ + "post_1", + "post_2", + ], + }, + { + "name": "still_full", + "nodes": [ + "lbff1", + "bbps1", + "post_0", + ], + }, + ], + }, + ], + } +} diff --git a/config/ar0234/ipu75xa/pnp_profiles.json b/config/ar0234/ipu75xa/pnp_profiles.json new file mode 100644 index 00000000..d6ef965a --- /dev/null +++ b/config/ar0234/ipu75xa/pnp_profiles.json @@ -0,0 +1,37 @@ +// +// Copyright (C) 2026 Intel Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "PnpDebugConfig": { + "Power": { + "useMockAAL": false, + "useMockHal": false, + "pnpMockFps": 30, + // algos + "bypass3A": false, + "bypassPAL": false, + // disable all face features + "disableFace": false, + "disableFaceAe": false, + "bypassFDAlgo": false, + // IPU PSYS + "bypassCB": false, + "useMockPipes": false, + // IPU ISYS + "bypassISys": false, + } + } +} diff --git a/config/ar0234/ipu75xa/sensors/ar0234-a.json b/config/ar0234/ipu75xa/sensors/ar0234-a.json new file mode 100644 index 00000000..4befa2c5 --- /dev/null +++ b/config/ar0234/ipu75xa/sensors/ar0234-a.json @@ -0,0 +1,222 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "CameraSettings": { + "Sensor": [ + { + "name": "ar0234-a", + "description": "AR0234 MIPI CSI-2 Sensor 1", + "MediaCtlConfig": [ + { + "id": 0 , + "configMode": "AUTO", + "output": [1280, 960], + "format": "V4L2_PIX_FMT_SGRBG10", + "formats": [ + {"name": "ar0234 $I2CBUS", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"} + ], + "link": [ + {"srcName": "ar0234 $I2CBUS", "srcPad": 0, "sinkName": "Intel IPU7 CSI2 $CSI_PORT", "sinkPad": 0, "enable": true}, + {"srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true} + ], + "videonode": [ + {"name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER"}, + {"name": "ar0234 $I2CBUS", "videoNodeType": "VIDEO_PIXEL_ARRAY"} + ] + } + ], + "StaticMetadata": { + "supportedStreamConfig": [ + { "format": "V4L2_PIX_FMT_NV12", "size": [1280, 960], "field": 0, "mcId": 0} + ], + "supportedFeatures": [ + "MANUAL_EXPOSURE", + "MANUAL_WHITE_BALANCE", + "IMAGE_ENHANCEMENT", + "NOISE_REDUCTION", + "PER_FRAME_CONTROL", + "SCENE_MODE" + ], + "fpsRange": [ 10, 30 ], + "evRange": [ -6, 6 ], + "evStep": [ 1, 3 ], + "supportedAeMode": [ + "AUTO", + "MANUAL" + ], + "supportedVideoStabilizationModes": [ + "OFF" + ], + "supportedSceneMode": [ + "NORMAL" + ], + "supportedAntibandingMode": [ + "AUTO", + "50Hz", + "60Hz", + "OFF" + ], + "supportedAwbMode": [ + "AUTO", + "INCANDESCENT", + "FLUORESCENT", + "DAYLIGHT", + "FULL_OVERCAST", + "PARTLY_OVERCAST", + "SUNSET", + "VIDEO_CONFERENCE", + "MANUAL_CCT_RANGE", + "MANUAL_WHITE_POINT", + "MANUAL_GAIN", + "MANUAL_COLOR_TRANSFORM" + ], + "supportedAfMode": [ + "OFF" + ], + "metadata":{ + "ae.lockAvailable": [1], + "awb.lockAvailable": [1], + // 0: OFF, 1: AUTO, 2: USE_SCENE_MODE, 3: OFF_KEEP_STATE + "control.availableModes" : [ 0, 1 ], + // 0: DISABLE, 1: FACE_PRIORITY + "control.availableSceneModes": [1], + "control.maxRegions" : [ 1, 0, 1 ], + // 0: OFF, 1: SIMPLE, 2: FULL + "statistics.info.availableFaceDetectModes" : [0], + "sensor.orientation" : [0], + // 43*15.9 + "sensor.maxAnalogSensitivity" : [699], + "sensor.info.sensitivityRange" : [44, 1399], + // align with supportedAeExposureTimeRange + "sensor.info.exposureTimeRange": [ 100, 100000 ], + "sensor.info.activeArraySize": [ 0, 0, 1280, 960 ], + "sensor.info.pixelArraySize": [1280, 960], + // 1280x1.12um 960x1.12um + "sensor.info.physicalSize": [ 4.71, 3.49 ], + // 0: off, 1: solid color, 2: color bars + "sensor.availableTestPatternModes": [ 0, 2 ], + // 0:RGGB, 1:GRBG, 2:GBRG, 3:BGGR, 4:RGB + "sensor.info.colorFilterArrangement": [1], + // shading 0:OFF,1:FAST,2:HIGH_QUALITY + "shading.availableModes": [ 0, 1, 2 ], + "lens.facing": [1], + "lens.info.availableApertures": [2.2], + "lens.info.availableFilterDensities": [0.0], + "lens.info.availableFocalLengths": [3.39], + "lens.info.availableOpticalStabilization": [0], + "lens.info.hyperfocalDistance": [1.37], + "lens.info.minimumFocusDistance": [10.0], + "lens.info.shadingMapSize": [ 63, 47 ], + "lens.info.focusDistanceCalibration": [1], + // raw, yuv, jpeg + "request.maxNumOutputStreams": [ 1, 3, 1 ], + // 0: No input, 1: 1 input stream (YUV or RAW), 2: 2 input streams (YUV and RAW) + "request.maxNumInputStreams": [1], + "request.pipelineMaxDepth": [7], + // 0:backward, 1:manual_sensor, 2:manual_pso_processing, 3:raw, 4:zsl, 5:read_sensor_settings, 6:burst_capture, 7: yuv reprocessing + "request.availableCapabilities": [ 0, 1, 2, 4, 5, 6 ], + // input fmt, output fmt number, output fmts; fmt: YCbCr_420_888:0x23 (35), IMPLEMENTATION_DEFINED:0x22 (34), Blob:0x21 (33) + "scaler.availableInputOutputFormatsMap": [ 34, 2, 33, 35 ], + "sensor.opaqueRawSize": [1280, 960, 100], + // available stream configurations: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, type: output(0)|input(1) + "scaler.availableStreamConfigurations": [ + 33, 1280, 960, 0, + 35, 1280, 960, 0, + 34, 1280, 960, 0, + ], + // minimum frame duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableMinFrameDurations": [ + 33, 1280, 960, 33333333, + 35, 1280, 960, 33333333, + 34, 1280, 960, 33333333, + ], + // maximum stall duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableStallDurations": [ + 33, 1280, 960, 33333333, + ], + // maximum JPEG size: 1920*1200*1.5 + "jpeg.maxSize": [3456000], + // INCREASING ORDER + "jpeg.availableThumbnailSizes": [ 0, 0, 320, 180, 320, 240 ], + // 0:off, 1:fast, 2:high_quality, 3:zero_shutter_lag + "edge.availableEdgeModes": [ 0, 1, 2, 3 ], + // 0:off, 1:fast, 2:high_quality + "hotPixel.availableHotPixelModes": [ 1, 2 ], + // 0:off, 1:fast, 2:high_quality, 3:minimal, 4:zero_shutter_lag + "noiseReduction.availableNoiseReductionModes": [ 0, 1, 2, 4 ], + "tonemap.maxCurvePoints": [1024], + // 0:contrast_curve, 1:fast, 2:high_quality, 3:gamma_value, 4:preset_curve + "tonemap.availableToneMapModes": [ 1, 2, 3, 4 ], + // Number of frames + "reprocess.maxCaptureStall": [4], + // 0:limited, 1:full, 2:legacy, 3:level3 + "info.supportedHardwareLevel": [1], + // 0:per-frame, -1:unknown, other positive number:frame count + "sync.maxLatency": [0] + } + }, + "supportedTuningConfig": [ + ["NORMAL", "VIDEO", "AR0234_GRBG_1280_960_PTL.IPU75XA"], + ["STILL_CAPTURE", "VIDEO", "AR0234_GRBG_1280_960_PTL.IPU75XA"] + ], + // The lard tags configuration. Every tag should be 4-characters. + // TuningMode, cmc tag, aiq tag, isp tag, others tag + "lardTags": [ + ["VIDEO", "DFLT", "DFLT", "DFLT", "DFLT"] + ], + // ascending order request + "supportedISysSizes": [[1280, 960]], + "supportedISysFormat": ["V4L2_PIX_FMT_SGRBG10"], + "enableAIQ": true, + "iSysRawFormat": "V4L2_PIX_FMT_SGRBG10", + "maxRawDataNum": 32, + "initialSkipFrame": 0, + "exposureLag": 2, + "gainLag": 0, + "digitalGainLag": 0, + // Option: full, reduced + "yuvColorRangeMode": "full", + "pipeSwitchDelayFrame": 60, + "graphSettingsFile": "AR0234.IPU75XA.bin", + // Option: coupled, dispersed + "graphSettingsType": "coupled", + "enablePSysProcessor": true, + "dvsType": "IMG_TRANS", + "nvmDeviceInfo": ["NVM", 590], + "lensName": "dw9714", + "lensHwType": "LENS_VCM_HW", + "testPatternMap": { + "Off": 0, + "ColorBars": 1 + }, + "enableAiqd": true, + "useCrlModule": false, + "pslOutputMapForRotation": [ + [[1280, 960], [1280, 960]], + ], + "maxRequestsInflight": 6, + "psysBundleWithAic": false, + "skipFrameV4L2Error": true, + "isISYSCompression": false, + "isPSACompression": false, + "usingMockPSys": false + } + ] + } +} diff --git a/config/ar0234/ipu75xa/sensors/ar0234-b.json b/config/ar0234/ipu75xa/sensors/ar0234-b.json new file mode 100644 index 00000000..5495d951 --- /dev/null +++ b/config/ar0234/ipu75xa/sensors/ar0234-b.json @@ -0,0 +1,220 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "CameraSettings": { + "Sensor": [ + { + "name": "ar0234-b", + "description": "AR0234 MIPI CSI-2 Sensor 2", + "MediaCtlConfig": [ + { + "id": 0 , + "configMode": "AUTO", + "output": [1280, 960], + "format": "V4L2_PIX_FMT_SGRBG10", + "formats": [ + {"name": "ar0234 $I2CBUS", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"} + ], + "link": [ + {"srcName": "ar0234 $I2CBUS", "srcPad": 0, "sinkName": "Intel IPU7 CSI2 $CSI_PORT", "sinkPad": 0, "enable": true}, + {"srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true} + ], + "videonode": [ + {"name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER"}, + {"name": "ar0234 $I2CBUS", "videoNodeType": "VIDEO_PIXEL_ARRAY"} + ] + } + ], + "StaticMetadata": { + "supportedStreamConfig": [ + { "format": "V4L2_PIX_FMT_NV12", "size": [1280, 960], "field": 0, "mcId": 0} + ], + "supportedFeatures": [ + "MANUAL_EXPOSURE", + "MANUAL_WHITE_BALANCE", + "IMAGE_ENHANCEMENT", + "NOISE_REDUCTION", + "PER_FRAME_CONTROL", + "SCENE_MODE" + ], + "fpsRange": [ 10, 30 ], + "evRange": [ -6, 6 ], + "evStep": [ 1, 3 ], + "supportedAeMode": [ + "AUTO", + "MANUAL" + ], + "supportedVideoStabilizationModes": [ + "OFF" + ], + "supportedSceneMode": [ + "NORMAL" + ], + "supportedAntibandingMode": [ + "AUTO", + "50Hz", + "60Hz", + "OFF" + ], + "supportedAwbMode": [ + "AUTO", + "INCANDESCENT", + "FLUORESCENT", + "DAYLIGHT", + "FULL_OVERCAST", + "PARTLY_OVERCAST", + "SUNSET", + "VIDEO_CONFERENCE", + "MANUAL_CCT_RANGE", + "MANUAL_WHITE_POINT", + "MANUAL_GAIN", + "MANUAL_COLOR_TRANSFORM" + ], + "supportedAfMode": [ + "OFF" + ], + "metadata":{ + "ae.lockAvailable": [1], + "awb.lockAvailable": [1], + // 0: OFF, 1: AUTO, 2: USE_SCENE_MODE, 3: OFF_KEEP_STATE + "control.availableModes" : [ 0, 1 ], + // 0: DISABLE, 1: FACE_PRIORITY + "control.availableSceneModes": [1], + "control.maxRegions" : [ 1, 0, 1 ], + // 0: OFF, 1: SIMPLE, 2: FULL + "statistics.info.availableFaceDetectModes" : [0], + "sensor.orientation" : [0], + // 43*15.9 + "sensor.maxAnalogSensitivity" : [699], + "sensor.info.sensitivityRange" : [44, 1399], + // align with supportedAeExposureTimeRange + "sensor.info.exposureTimeRange": [ 100, 100000 ], + "sensor.info.activeArraySize": [ 0, 0, 1280, 960 ], + "sensor.info.pixelArraySize": [1280, 960], + // 1280x1.12um 960x1.12um + "sensor.info.physicalSize": [ 4.71, 3.49 ], + // 0: off, 1: solid color, 2: color bars + "sensor.availableTestPatternModes": [ 0, 2 ], + // 0:RGGB, 1:GRBG, 2:GBRG, 3:BGGR, 4:RGB + "sensor.info.colorFilterArrangement": [1], + // shading 0:OFF,1:FAST,2:HIGH_QUALITY + "shading.availableModes": [ 0, 1, 2 ], + "lens.facing": [1], + "lens.info.availableApertures": [2.2], + "lens.info.availableFilterDensities": [0.0], + "lens.info.availableFocalLengths": [3.39], + "lens.info.availableOpticalStabilization": [0], + "lens.info.hyperfocalDistance": [1.37], + "lens.info.minimumFocusDistance": [10.0], + "lens.info.shadingMapSize": [ 63, 47 ], + "lens.info.focusDistanceCalibration": [1], + // raw, yuv, jpeg + "request.maxNumOutputStreams": [ 1, 3, 1 ], + // 0: No input, 1: 1 input stream (YUV or RAW), 2: 2 input streams (YUV and RAW) + "request.maxNumInputStreams": [1], + "request.pipelineMaxDepth": [7], + // 0:backward, 1:manual_sensor, 2:manual_pso_processing, 3:raw, 4:zsl, 5:read_sensor_settings, 6:burst_capture, 7: yuv reprocessing + "request.availableCapabilities": [ 0, 1, 2, 4, 5, 6 ], + // input fmt, output fmt number, output fmts; fmt: YCbCr_420_888:0x23 (35), IMPLEMENTATION_DEFINED:0x22 (34), Blob:0x21 (33) + "scaler.availableInputOutputFormatsMap": [ 34, 2, 33, 35 ], + "sensor.opaqueRawSize": [1280, 960, 100], + // available stream configurations: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, type: output(0)|input(1) + "scaler.availableStreamConfigurations": [ + 33, 1280, 960, 0, + 35, 1280, 960, 0, + 34, 1280, 960, 0, + ], + // minimum frame duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableMinFrameDurations": [ + 33, 1280, 960, 33333333, + 35, 1280, 960, 33333333, + 34, 1280, 960, 33333333, + ], + // maximum stall duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableStallDurations": [ + 33, 1280, 960, 33333333, + ], + // maximum JPEG size: 1920*1200*1.5 + "jpeg.maxSize": [3456000], + // INCREASING ORDER + "jpeg.availableThumbnailSizes": [ 0, 0, 320, 180, 320, 240 ], + // 0:off, 1:fast, 2:high_quality, 3:zero_shutter_lag + "edge.availableEdgeModes": [ 0, 1, 2, 3 ], + // 0:off, 1:fast, 2:high_quality + "hotPixel.availableHotPixelModes": [ 1, 2 ], + // 0:off, 1:fast, 2:high_quality, 3:minimal, 4:zero_shutter_lag + "noiseReduction.availableNoiseReductionModes": [ 0, 1, 2, 4 ], + "tonemap.maxCurvePoints": [1024], + // 0:contrast_curve, 1:fast, 2:high_quality, 3:gamma_value, 4:preset_curve + "tonemap.availableToneMapModes": [ 1, 2, 3, 4 ], + // Number of frames + "reprocess.maxCaptureStall": [4], + // 0:limited, 1:full, 2:legacy, 3:level3 + "info.supportedHardwareLevel": [1], + // 0:per-frame, -1:unknown, other positive number:frame count + "sync.maxLatency": [0] + } + }, + "supportedTuningConfig": [ + ["NORMAL", "VIDEO", "AR0234_GRBG_1280_960_PTL.IPU75XA"], + ["STILL_CAPTURE", "VIDEO", "AR0234_GRBG_1280_960_PTL.IPU75XA"] + ], + // The lard tags configuration. Every tag should be 4-characters. + // TuningMode, cmc tag, aiq tag, isp tag, others tag + "lardTags": [ + ["VIDEO", "DFLT", "DFLT", "DFLT", "DFLT"] + ], + // ascending order request + "supportedISysSizes": [[1280, 960]], + "supportedISysFormat": ["V4L2_PIX_FMT_SGRBG10"], + "enableAIQ": true, + "iSysRawFormat": "V4L2_PIX_FMT_SGRBG10", + "maxRawDataNum": 32, + "initialSkipFrame": 0, + "exposureLag": 2, + "gainLag": 0, + "digitalGainLag": 0, + "yuvColorRangeMode": "full", + "pipeSwitchDelayFrame": 60, + "graphSettingsFile": "AR0234.IPU75XA.bin", + "graphSettingsType": "coupled", + "enablePSysProcessor": true, + "dvsType": "IMG_TRANS", + "nvmDeviceInfo": ["NVM", 590], + "lensName": "dw9714", + "lensHwType": "LENS_VCM_HW", + "testPatternMap": { + "Off": 0, + "ColorBars": 1 + }, + "enableAiqd": true, + "useCrlModule": false, + "pslOutputMapForRotation": [ + [[1280, 960], [1280, 960]], + ], + "maxRequestsInflight": 6, + "psysBundleWithAic": false, + "skipFrameV4L2Error": true, + "isISYSCompression": false, + "isPSACompression": false, + "usingMockPSys": false + } + ] + } +} From 999d7a07f2fdd6b8a9be504b6a52a7fa29a5b026 Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 6 Aug 2026 10:55:57 +0800 Subject: [PATCH 12/19] doc: ar0234: Add IPU75XA setup instructions to userspace-mipi guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document the IPU75XA MIPI dual-sensor setup alongside the existing IPU6EPMTL instructions: BIOS MIPI camera configuration table, config file deployment steps for x2 sensors, and a tuning file placeholder (N/A, no external tuning file needed). Also add a README.md reference note for system setup prerequisites. Add a collapsible table of contents linking to each section to ease navigation of the growing userspace-mipi.md doc. Append a '↑ Back to Top' link after the final note so readers can quickly jump back to the table of contents from the end of the doc. Signed-off-by: Goh, Wei Khang1 --- doc/ar0234/userspace-mipi.md | 103 ++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/doc/ar0234/userspace-mipi.md b/doc/ar0234/userspace-mipi.md index abf65c6f..faa8d18a 100644 --- a/doc/ar0234/userspace-mipi.md +++ b/doc/ar0234/userspace-mipi.md @@ -2,11 +2,43 @@ This document details the configuration settings for the AR0234 MIPI CSI-2 sensor, providing essential information for system integration. The table below presents the key parameters and their respective values used during system setup and validation. + +

+ Table of Contents +
    +
  1. BIOS Configuration Table
  2. +
  3. MIPI Camera Configuration + +
  4. +
  5. Camera Configuration File Setup + +
  6. +
  7. Camera Tuning File Setup + +
  8. +
  9. Environment Setup
  10. +
  11. Sensor Verification
  12. +
  13. Sample Userspace Command
  14. +
  15. Streaming Result
  16. +
+
+ ## BIOS Configuration Table > **Note:** No External Clock required. -### MIPI Camera Configuration for IPU6EPMTL +## MIPI Camera Configuration + +#### Setup for IPU6EPMTL Config path: `Intel Advanced Menu`->`System Agent (SA) Configuration`->`MIPI Camera Configuration` @@ -51,6 +83,57 @@ Config path: `Intel Advanced Menu`->`System Agent (SA) Configuration`->`MIPI Cam | Customize Device ID Number | 19 | 19 | | Flash Driver Selection | Disabled | Disabled | +#### Setup for IPU75XA + +Config path: `Intel Advanced Menu`->`System Agent (SA) Configuration`->`MIPI Camera Configuration` + +| | Control Logic 1 | Control Logic 2 | +|--- |--- |--- | +| Control Logic Type | Discrete | Discrete | +| CRD Version | CRD-D | CRD-D | +| Input Clock | 19.2MHz | 19.2MHz | +| PCH Clock | IMGCLKOUT_0 | IMGCLKOUT_1 | +| Number of GPIOs | 1 | 1 | +| GPIO Pin 0 | | | +| Group Pad Number | 10 | 1 | +| Group Number | C_E_V | C_E_V | +| Com Number | COM1 | COM1 | +| Function | RESET | RESET | +| Active Value | 1 | 1 | +| Initial Value | 0 | 0 | +| Interrupt GPIO | Disabled | Disabled | + +| | Camera1 Link options | Camera2 Link options | +|--- |--- | --- | +| Sensor Model | User Custom | User Custom | +| Custom HID | INTC10C0 | INTC10C0 | +| Lanes Clock division | 4 4 2 2 | 4 4 2 2 | +| CRD Version | CRD-D | CRD-D | +| GPIO control | Control Logic 1 | Control Logic 2 | +| Camera position | Front | Back | +| Flash Support | Disabled | Disabled | +| Privacy LED | Driver default | Driver default | +| Rotation | 0 | 0 | +| PPR Value | 2 | 2 | +| PPR Unit | 2 | 2 | +| PhyConfiguration | DPHY | DPHY | +| Camera module name | _ | _ | +| MIPI port | 0 | 2 | +| LaneUsed | x2 | x2 | +| MCLK | 19200000 | 19200000 | +| EEPROM Type | ROM_NONE | ROM_NONE | +| VCM Type | VCM_NONE | VCM_NONE | +| Number of I2C Components | 1 | 1 | +| I2C Channel | I2C1 | I2C2 | +| Device 0 | | | +| I2C Address | 10 | 10 | +| Device Type | Sensor | Sensor | +| Customize Device ID List | | | +| Customize Device ID Number | 17 | 17 | +| Customize Device ID Number | 18 | 18 | +| Customize Device ID Number | 19 | 19 | +| Flash Driver Selection | Disabled | Disabled | + ## Camera Configuration File Setup #### Setup for IPU6EPMTL @@ -62,12 +145,24 @@ Replace target system with recommended [ipu6epmtl](../../config/ar0234/ipu6epmtl sudo cp -r ../../config/ar0234/ipu6epmtl /etc/camera sudo sed -i '/availableSensors/c\ ' /etc/camera/ipu6epmtl/libcamhal_profile.xml +#### Setup for IPU75XA + +Replace target system with recommended [ipu75xa](../../config/ar0234/ipu75xa) setting + +> **Note:** Add config below only if using x2 MIPI sensors. + + sudo cp -r ../../config/ar0234/ipu75xa /etc/camera + ## Camera Tuning File Setup #### Setup for IPU6EPMTL Import [AR0234_TGL_10bits.aiqb](https://github.com/intel/ipu6-camera-hal/blob/iotg_ipu6/config/linux/ipu6epmtl/AR0234_TGL_10bits.aiqb) into target system `/etc/camera/ipu6epmtl` +#### Setup for IPU75XA + +> **TODO:** No action needed for now, will revisit once AIQB config available in [ipu7-camera-hal](https://github.com/intel/ipu7-camera-hal/tree/main/config/linux/ipu75xa). + ## Environment Setup > **Note:** PSYS library requires superuser access, please login as root to run the sample commands given below. @@ -147,3 +242,9 @@ Upon setup completion, verify sensor with: | x1 | DMA MODE | 30 | | x2 | USERPTR | 30 | | x2 | DMA MODE | 30 | + +> **Note**: Refer to [README.md](https://github.com/intel-innersource/drivers.camera.scaling.sensor) for system setup prerequisite. + +--- + +[↑ Back to Top](#description) From c6e91288c47209d9eb2306ab5fbc66857064bff0 Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 13 Aug 2026 10:29:25 +0800 Subject: [PATCH 13/19] README: Add IPU75XA support and submodule pinning guidance Update the sensor support matrix to reflect that AR0234 over MIPI CSI-2 now supports IPU75XA in addition to IPU6EPMTL, and add the missing 24.04.4 / 6.18 Intel BKC row for IPU75XA in the kernel support table. Bump the pinned ipu7-camera-bins/hal commit references for IPU7 to the software dependency table. Document the workaround for pinning the ipu7-drivers submodule to a specific commit for IPU75XA, since it tracks the tip of mainby default and RAW sensor support depends on a specific tuning-compatible commit. Signed-off-by: Goh, Wei Khang1 --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 699e6274..935f7629 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ This repository contains reference drivers and configurations for Intel MIPI CSI |-----------------|-------------|-----------------|----------------------------------| | AR0233+GW5300 | GMSL | Sensing | IPU6EPMTL, IPU75XA | | AR0234 | GMSL | D3 Embedded | IPU6EPMTL | -| AR0234 | MIPI CSI-2 | D3 Embedded | IPU6EPMTL | +| AR0234 | MIPI CSI-2 | D3 Embedded | IPU6EPMTL, IPU75XA | | AR0820+GW5300 | GMSL | Sensing | IPU6EPMTL, IPU75XA | | AR0830+AP1302 | MIPI CSI-2 | Leopard Imaging | IPU6EPMTL, IPU75XA | | ISX031 | GMSL | D3 Embedded | IPU6EP, IPU6EPMTL, IPU75XA, IPU8 | @@ -60,6 +60,7 @@ IPU8 represents NVL platforms. | | 26.04 | 7.0 Canonical | | IPU75XA | 24.04.4 | 6.17 Intel BKC | | | 24.04.4 | 6.17 Canonical | +| | 24.04.4 | 6.18 Intel BKC | | | 26.04 | 7.0 Canonical | | IPU8 | 24.04.4 | 6.18 Intel BKC | | | 24.04.4 | 7.0 IOT Next | @@ -101,7 +102,7 @@ Install these software dependencies in your target system: | IPU Version | ipu-camera-bins | ipu-camera-hal | icamerasrc | |-------------|------------------------------------------|------------------------------------------|------------------------------------------| | IPU6 | d9421fef539f24fc80c27002d5da753e193b0670 | f93eec544a5234bf0b610b3f76d64c8fa711c364 | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | -| IPU7 | d235697c3bb41d56402d4805a7b82fdc938c077a | ea085c325e7a67a811a0baa5ce2d1b8f5641ea02 | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | +| IPU7 | cead7320d84ee9ade4f60d74e935b16b5a760945 | ef30767553685b83034e42325992a2442c5fcb2c | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | ## Setup Procedure @@ -112,6 +113,15 @@ Initialize and update current repository recursively to ensure all dependencies git checkout main git submodule update --init --recursive +> **Note:** Workaround required for IPU7/IPU8 RAW sensor due to tuning dependency. + +By default, `ipu7-drivers` submodule tracks the tip of its `main` branch. +For IPU75XA, + + cd ipu7-drivers + git checkout 44bbc2de71fe5e7a5a7124d4c5e5900e70e13736 + cd .. + Build and install modules using DKMS sudo dkms remove ipu-camera-sensor/0.1 From 011da0902939525bb01d43e3d2526288ad0e9e4d Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 6 Aug 2026 11:08:12 +0800 Subject: [PATCH 14/19] config: ar0234: Add IPU8 MIPI sensor configuration Add IPU8 platform support for AR0234 MIPI cameras, including AIQ tuning (.aiqb) and graph settings (gcss .bin/.xml) files, libcamhal_configs.json, pipe scheduler and plug-and-play profiles, and sensor configs. Signed-off-by: Goh, Wei Khang1 --- .../ipu8/AR0234_GRBG_1280_960_NVL.IPU8.aiqb | Bin 0 -> 221458 bytes config/ar0234/ipu8/gcss/AR0234.IPU8.bin | Bin 0 -> 30260 bytes config/ar0234/ipu8/gcss/AR0234.IPU8.xml | 652 ++++++++++++++++++ config/ar0234/ipu8/libcamhal_configs.json | 26 + .../ar0234/ipu8/pipe_scheduler_profiles.json | 48 ++ config/ar0234/ipu8/pnp_profiles.json | 37 + config/ar0234/ipu8/sensors/ar0234-a.json | 220 ++++++ config/ar0234/ipu8/sensors/ar0234-b.json | 220 ++++++ 8 files changed, 1203 insertions(+) create mode 100644 config/ar0234/ipu8/AR0234_GRBG_1280_960_NVL.IPU8.aiqb create mode 100644 config/ar0234/ipu8/gcss/AR0234.IPU8.bin create mode 100644 config/ar0234/ipu8/gcss/AR0234.IPU8.xml create mode 100644 config/ar0234/ipu8/libcamhal_configs.json create mode 100644 config/ar0234/ipu8/pipe_scheduler_profiles.json create mode 100644 config/ar0234/ipu8/pnp_profiles.json create mode 100644 config/ar0234/ipu8/sensors/ar0234-a.json create mode 100644 config/ar0234/ipu8/sensors/ar0234-b.json diff --git a/config/ar0234/ipu8/AR0234_GRBG_1280_960_NVL.IPU8.aiqb b/config/ar0234/ipu8/AR0234_GRBG_1280_960_NVL.IPU8.aiqb new file mode 100644 index 0000000000000000000000000000000000000000..b767659addce60fefe68a6ff3f298024dbc9cd1a GIT binary patch literal 221458 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℞Ee`9S_ck)U|x5`82K=M_0a#g=x26<2% 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 literal 0 HcmV?d00001 diff --git a/config/ar0234/ipu8/gcss/AR0234.IPU8.xml b/config/ar0234/ipu8/gcss/AR0234.IPU8.xml new file mode 100644 index 00000000..2ef439e3 --- /dev/null +++ b/config/ar0234/ipu8/gcss/AR0234.IPU8.xml @@ -0,0 +1,652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/ar0234/ipu8/libcamhal_configs.json b/config/ar0234/ipu8/libcamhal_configs.json new file mode 100644 index 00000000..ce9b3314 --- /dev/null +++ b/config/ar0234/ipu8/libcamhal_configs.json @@ -0,0 +1,26 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "Common" : { + "version": 1.0, + "platform": "IPU7", + // The value format of availableSensors is "sensor name"-wf/uf-"CSI port ID". + // wf is world facing, and uf is user facing. + "availableSensors": ["ar0234-a-0","ar0234-b-2"], + "videoStreamNum" : 2 + } +} diff --git a/config/ar0234/ipu8/pipe_scheduler_profiles.json b/config/ar0234/ipu8/pipe_scheduler_profiles.json new file mode 100644 index 00000000..3612b689 --- /dev/null +++ b/config/ar0234/ipu8/pipe_scheduler_profiles.json @@ -0,0 +1,48 @@ +// +// Copyright (C) 2026 Intel Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "PipeSchedulerPolicy": { + // Configuration is chosen according to: graphId, usecase, cameraId + "schedulers": [ + { + "id": 1, "graphId": 100002, + "pipe_executors": [ + { + "name": "video_lb", + "nodes": [ + "lbff", + ], + }, + { + "name": "video_po", + "nodes": [ + "post_1", + "post_2", + ], + }, + { + "name": "still_full", + "nodes": [ + "lbff1", + "post_0", + ], + }, + ], + }, + ], + } +} diff --git a/config/ar0234/ipu8/pnp_profiles.json b/config/ar0234/ipu8/pnp_profiles.json new file mode 100644 index 00000000..d6ef965a --- /dev/null +++ b/config/ar0234/ipu8/pnp_profiles.json @@ -0,0 +1,37 @@ +// +// Copyright (C) 2026 Intel Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "PnpDebugConfig": { + "Power": { + "useMockAAL": false, + "useMockHal": false, + "pnpMockFps": 30, + // algos + "bypass3A": false, + "bypassPAL": false, + // disable all face features + "disableFace": false, + "disableFaceAe": false, + "bypassFDAlgo": false, + // IPU PSYS + "bypassCB": false, + "useMockPipes": false, + // IPU ISYS + "bypassISys": false, + } + } +} diff --git a/config/ar0234/ipu8/sensors/ar0234-a.json b/config/ar0234/ipu8/sensors/ar0234-a.json new file mode 100644 index 00000000..07b05fca --- /dev/null +++ b/config/ar0234/ipu8/sensors/ar0234-a.json @@ -0,0 +1,220 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "CameraSettings": { + "Sensor": [ + { + "name": "ar0234-a", + "description": "AR0234 MIPI CSI-2 Sensor 1", + "MediaCtlConfig": [ + { + "id": 0 , + "configMode": "AUTO", + "output": [1280, 960], + "format": "V4L2_PIX_FMT_SGRBG10", + "formats": [ + {"name": "ar0234 $I2CBUS", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"} + ], + "link": [ + {"srcName": "ar0234 $I2CBUS", "srcPad": 0, "sinkName": "Intel IPU7 CSI2 $CSI_PORT", "sinkPad": 0, "enable": true}, + {"srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true} + ], + "videonode": [ + {"name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER"}, + {"name": "ar0234 $I2CBUS", "videoNodeType": "VIDEO_PIXEL_ARRAY"} + ] + } + ], + "StaticMetadata": { + "supportedStreamConfig": [ + { "format": "V4L2_PIX_FMT_NV12", "size": [1280, 960], "field": 0, "mcId": 0} + ], + "supportedFeatures": [ + "MANUAL_EXPOSURE", + "MANUAL_WHITE_BALANCE", + "IMAGE_ENHANCEMENT", + "NOISE_REDUCTION", + "PER_FRAME_CONTROL", + "SCENE_MODE" + ], + "fpsRange": [ 10, 30 ], + "evRange": [ -6, 6 ], + "evStep": [ 1, 3 ], + "supportedAeMode": [ + "AUTO", + "MANUAL" + ], + "supportedVideoStabilizationModes": [ + "OFF" + ], + "supportedSceneMode": [ + "NORMAL" + ], + "supportedAntibandingMode": [ + "AUTO", + "50Hz", + "60Hz", + "OFF" + ], + "supportedAwbMode": [ + "AUTO", + "INCANDESCENT", + "FLUORESCENT", + "DAYLIGHT", + "FULL_OVERCAST", + "PARTLY_OVERCAST", + "SUNSET", + "VIDEO_CONFERENCE", + "MANUAL_CCT_RANGE", + "MANUAL_WHITE_POINT", + "MANUAL_GAIN", + "MANUAL_COLOR_TRANSFORM" + ], + "supportedAfMode": [ + "OFF" + ], + "metadata":{ + "ae.lockAvailable": [1], + "awb.lockAvailable": [1], + // 0: OFF, 1: AUTO, 2: USE_SCENE_MODE, 3: OFF_KEEP_STATE + "control.availableModes" : [ 0, 1 ], + // 0: DISABLE, 1: FACE_PRIORITY + "control.availableSceneModes": [1], + "control.maxRegions" : [ 1, 0, 1 ], + // 0: OFF, 1: SIMPLE, 2: FULL + "statistics.info.availableFaceDetectModes" : [0], + "sensor.orientation" : [0], + // 43*15.9 + "sensor.maxAnalogSensitivity" : [699], + "sensor.info.sensitivityRange" : [44, 1399], + // align with supportedAeExposureTimeRange + "sensor.info.exposureTimeRange": [ 100, 100000 ], + "sensor.info.activeArraySize": [ 0, 0, 1280, 960 ], + "sensor.info.pixelArraySize": [1280, 960], + // 1280x1.12um 960x1.12um + "sensor.info.physicalSize": [ 4.71, 3.49 ], + // 0: off, 1: solid color, 2: color bars + "sensor.availableTestPatternModes": [ 0, 2 ], + // 0:RGGB, 1:GRBG, 2:GBRG, 3:BGGR, 4:RGB + "sensor.info.colorFilterArrangement": [1], + // shading 0:OFF,1:FAST,2:HIGH_QUALITY + "shading.availableModes": [ 0, 1, 2 ], + "lens.facing": [1], + "lens.info.availableApertures": [2.2], + "lens.info.availableFilterDensities": [0.0], + "lens.info.availableFocalLengths": [3.39], + "lens.info.availableOpticalStabilization": [0], + "lens.info.hyperfocalDistance": [1.37], + "lens.info.minimumFocusDistance": [10.0], + "lens.info.shadingMapSize": [ 63, 47 ], + "lens.info.focusDistanceCalibration": [1], + // raw, yuv, jpeg + "request.maxNumOutputStreams": [ 1, 3, 1 ], + // 0: No input, 1: 1 input stream (YUV or RAW), 2: 2 input streams (YUV and RAW) + "request.maxNumInputStreams": [1], + "request.pipelineMaxDepth": [7], + // 0:backward, 1:manual_sensor, 2:manual_pso_processing, 3:raw, 4:zsl, 5:read_sensor_settings, 6:burst_capture, 7: yuv reprocessing + "request.availableCapabilities": [ 0, 1, 2, 4, 5, 6 ], + // input fmt, output fmt number, output fmts; fmt: YCbCr_420_888:0x23 (35), IMPLEMENTATION_DEFINED:0x22 (34), Blob:0x21 (33) + "scaler.availableInputOutputFormatsMap": [ 34, 2, 33, 35 ], + "sensor.opaqueRawSize": [1280, 960, 100], + // available stream configurations: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, type: output(0)|input(1) + "scaler.availableStreamConfigurations": [ + 33, 1280, 960, 0, + 35, 1280, 960, 0, + 34, 1280, 960, 0, + ], + // minimum frame duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableMinFrameDurations": [ + 33, 1280, 960, 33333333, + 35, 1280, 960, 33333333, + 34, 1280, 960, 33333333, + ], + // maximum stall duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableStallDurations": [ + 33, 1280, 960, 33333333, + ], + // maximum JPEG size: 1920*1200*1.5 + "jpeg.maxSize": [3456000], + // INCREASING ORDER + "jpeg.availableThumbnailSizes": [ 0, 0, 320, 180, 320, 240 ], + // 0:off, 1:fast, 2:high_quality, 3:zero_shutter_lag + "edge.availableEdgeModes": [ 0, 1, 2, 3 ], + // 0:off, 1:fast, 2:high_quality + "hotPixel.availableHotPixelModes": [ 1, 2 ], + // 0:off, 1:fast, 2:high_quality, 3:minimal, 4:zero_shutter_lag + "noiseReduction.availableNoiseReductionModes": [ 0, 1, 2, 4 ], + "tonemap.maxCurvePoints": [1024], + // 0:contrast_curve, 1:fast, 2:high_quality, 3:gamma_value, 4:preset_curve + "tonemap.availableToneMapModes": [ 1, 2, 3, 4 ], + // Number of frames + "reprocess.maxCaptureStall": [4], + // 0:limited, 1:full, 2:legacy, 3:level3 + "info.supportedHardwareLevel": [1], + // 0:per-frame, -1:unknown, other positive number:frame count + "sync.maxLatency": [0] + } + }, + "supportedTuningConfig": [ + ["NORMAL", "VIDEO", "AR0234_GRBG_1280_960_NVL.IPU8"], + ["STILL_CAPTURE", "VIDEO", "AR0234_GRBG_1280_960_NVL.IPU8"] + ], + // The lard tags configuration. Every tag should be 4-characters. + // TuningMode, cmc tag, aiq tag, isp tag, others tag + "lardTags": [ + ["VIDEO", "DFLT", "DFLT", "DFLT", "DFLT"] + ], + // ascending order request + "supportedISysSizes": [[1280, 960]], + "supportedISysFormat": ["V4L2_PIX_FMT_SGRBG10"], + "enableAIQ": true, + "iSysRawFormat": "V4L2_PIX_FMT_SGRBG10", + "maxRawDataNum": 32, + "initialSkipFrame": 0, + "exposureLag": 2, + "gainLag": 0, + "digitalGainLag": 0, + "yuvColorRangeMode": "full", + "pipeSwitchDelayFrame": 60, + "graphSettingsFile": "AR0234.IPU8.bin", + "graphSettingsType": "coupled", + "enablePSysProcessor": true, + "dvsType": "IMG_TRANS", + "nvmDeviceInfo": ["NVM", 590], + "lensName": "dw9714", + "lensHwType": "LENS_VCM_HW", + "testPatternMap": { + "Off": 0, + "ColorBars": 1 + }, + "enableAiqd": true, + "useCrlModule": false, + "pslOutputMapForRotation": [ + [[1280, 960], [1280, 960]], + ], + "maxRequestsInflight": 6, + "psysBundleWithAic": false, + "skipFrameV4L2Error": true, + "isISYSCompression": false, + "isPSACompression": false, + "usingMockPSys": false + } + ] + } +} diff --git a/config/ar0234/ipu8/sensors/ar0234-b.json b/config/ar0234/ipu8/sensors/ar0234-b.json new file mode 100644 index 00000000..ff04325a --- /dev/null +++ b/config/ar0234/ipu8/sensors/ar0234-b.json @@ -0,0 +1,220 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +{ + "CameraSettings": { + "Sensor": [ + { + "name": "ar0234-b", + "description": "AR0234 MIPI CSI-2 Sensor 2", + "MediaCtlConfig": [ + { + "id": 0 , + "configMode": "AUTO", + "output": [1280, 960], + "format": "V4L2_PIX_FMT_SGRBG10", + "formats": [ + {"name": "ar0234 $I2CBUS", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "pad": 0, "width": 1280, "height": 960, "format": "V4L2_MBUS_FMT_SGRBG10_1X10"} + ], + "link": [ + {"srcName": "ar0234 $I2CBUS", "srcPad": 0, "sinkName": "Intel IPU7 CSI2 $CSI_PORT", "sinkPad": 0, "enable": true}, + {"srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true} + ], + "videonode": [ + {"name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC"}, + {"name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER"}, + {"name": "ar0234 $I2CBUS", "videoNodeType": "VIDEO_PIXEL_ARRAY"} + ] + } + ], + "StaticMetadata": { + "supportedStreamConfig": [ + { "format": "V4L2_PIX_FMT_NV12", "size": [1280, 960], "field": 0, "mcId": 0} + ], + "supportedFeatures": [ + "MANUAL_EXPOSURE", + "MANUAL_WHITE_BALANCE", + "IMAGE_ENHANCEMENT", + "NOISE_REDUCTION", + "PER_FRAME_CONTROL", + "SCENE_MODE" + ], + "fpsRange": [ 10, 30 ], + "evRange": [ -6, 6 ], + "evStep": [ 1, 3 ], + "supportedAeMode": [ + "AUTO", + "MANUAL" + ], + "supportedVideoStabilizationModes": [ + "OFF" + ], + "supportedSceneMode": [ + "NORMAL" + ], + "supportedAntibandingMode": [ + "AUTO", + "50Hz", + "60Hz", + "OFF" + ], + "supportedAwbMode": [ + "AUTO", + "INCANDESCENT", + "FLUORESCENT", + "DAYLIGHT", + "FULL_OVERCAST", + "PARTLY_OVERCAST", + "SUNSET", + "VIDEO_CONFERENCE", + "MANUAL_CCT_RANGE", + "MANUAL_WHITE_POINT", + "MANUAL_GAIN", + "MANUAL_COLOR_TRANSFORM" + ], + "supportedAfMode": [ + "OFF" + ], + "metadata":{ + "ae.lockAvailable": [1], + "awb.lockAvailable": [1], + // 0: OFF, 1: AUTO, 2: USE_SCENE_MODE, 3: OFF_KEEP_STATE + "control.availableModes" : [ 0, 1 ], + // 0: DISABLE, 1: FACE_PRIORITY + "control.availableSceneModes": [1], + "control.maxRegions" : [ 1, 0, 1 ], + // 0: OFF, 1: SIMPLE, 2: FULL + "statistics.info.availableFaceDetectModes" : [0], + "sensor.orientation" : [0], + // 43*15.9 + "sensor.maxAnalogSensitivity" : [699], + "sensor.info.sensitivityRange" : [44, 1399], + // align with supportedAeExposureTimeRange + "sensor.info.exposureTimeRange": [ 100, 100000 ], + "sensor.info.activeArraySize": [ 0, 0, 1280, 960 ], + "sensor.info.pixelArraySize": [1280, 960], + // 1280x1.12um 960x1.12um + "sensor.info.physicalSize": [ 4.71, 3.49 ], + // 0: off, 1: solid color, 2: color bars + "sensor.availableTestPatternModes": [ 0, 2 ], + // 0:RGGB, 1:GRBG, 2:GBRG, 3:BGGR, 4:RGB + "sensor.info.colorFilterArrangement": [1], + // shading 0:OFF,1:FAST,2:HIGH_QUALITY + "shading.availableModes": [ 0, 1, 2 ], + "lens.facing": [1], + "lens.info.availableApertures": [2.2], + "lens.info.availableFilterDensities": [0.0], + "lens.info.availableFocalLengths": [3.39], + "lens.info.availableOpticalStabilization": [0], + "lens.info.hyperfocalDistance": [1.37], + "lens.info.minimumFocusDistance": [10.0], + "lens.info.shadingMapSize": [ 63, 47 ], + "lens.info.focusDistanceCalibration": [1], + // raw, yuv, jpeg + "request.maxNumOutputStreams": [ 1, 3, 1 ], + // 0: No input, 1: 1 input stream (YUV or RAW), 2: 2 input streams (YUV and RAW) + "request.maxNumInputStreams": [1], + "request.pipelineMaxDepth": [7], + // 0:backward, 1:manual_sensor, 2:manual_pso_processing, 3:raw, 4:zsl, 5:read_sensor_settings, 6:burst_capture, 7: yuv reprocessing + "request.availableCapabilities": [ 0, 1, 2, 4, 5, 6 ], + // input fmt, output fmt number, output fmts; fmt: YCbCr_420_888:0x23 (35), IMPLEMENTATION_DEFINED:0x22 (34), Blob:0x21 (33) + "scaler.availableInputOutputFormatsMap": [ 34, 2, 33, 35 ], + "sensor.opaqueRawSize": [1280, 960, 100], + // available stream configurations: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, type: output(0)|input(1) + "scaler.availableStreamConfigurations": [ + 33, 1280, 960, 0, + 35, 1280, 960, 0, + 34, 1280, 960, 0, + ], + // minimum frame duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableMinFrameDurations": [ + 33, 1280, 960, 33333333, + 35, 1280, 960, 33333333, + 34, 1280, 960, 33333333, + ], + // maximum stall duration: format: IMPLEMENTATION_DEFINED(34)|YCbCr_420_888:0x23(35)|BLOB(33), widthxheight, duration:(ns) + "scaler.availableStallDurations": [ + 33, 1280, 960, 33333333, + ], + // maximum JPEG size: 1920*1200*1.5 + "jpeg.maxSize": [3456000], + // INCREASING ORDER + "jpeg.availableThumbnailSizes": [ 0, 0, 320, 180, 320, 240 ], + // 0:off, 1:fast, 2:high_quality, 3:zero_shutter_lag + "edge.availableEdgeModes": [ 0, 1, 2, 3 ], + // 0:off, 1:fast, 2:high_quality + "hotPixel.availableHotPixelModes": [ 1, 2 ], + // 0:off, 1:fast, 2:high_quality, 3:minimal, 4:zero_shutter_lag + "noiseReduction.availableNoiseReductionModes": [ 0, 1, 2, 4 ], + "tonemap.maxCurvePoints": [1024], + // 0:contrast_curve, 1:fast, 2:high_quality, 3:gamma_value, 4:preset_curve + "tonemap.availableToneMapModes": [ 1, 2, 3, 4 ], + // Number of frames + "reprocess.maxCaptureStall": [4], + // 0:limited, 1:full, 2:legacy, 3:level3 + "info.supportedHardwareLevel": [1], + // 0:per-frame, -1:unknown, other positive number:frame count + "sync.maxLatency": [0] + } + }, + "supportedTuningConfig": [ + ["NORMAL", "VIDEO", "AR0234_GRBG_1280_960_NVL.IPU8"], + ["STILL_CAPTURE", "VIDEO", "AR0234_GRBG_1280_960_NVL.IPU8"] + ], + // The lard tags configuration. Every tag should be 4-characters. + // TuningMode, cmc tag, aiq tag, isp tag, others tag + "lardTags": [ + ["VIDEO", "DFLT", "DFLT", "DFLT", "DFLT"] + ], + // ascending order request + "supportedISysSizes": [[1280, 960]], + "supportedISysFormat": ["V4L2_PIX_FMT_SGRBG10"], + "enableAIQ": true, + "iSysRawFormat": "V4L2_PIX_FMT_SGRBG10", + "maxRawDataNum": 32, + "initialSkipFrame": 0, + "exposureLag": 2, + "gainLag": 0, + "digitalGainLag": 0, + "yuvColorRangeMode": "full", + "pipeSwitchDelayFrame": 60, + "graphSettingsFile": "AR0234.IPU8.bin", + "graphSettingsType": "coupled", + "enablePSysProcessor": true, + "dvsType": "IMG_TRANS", + "nvmDeviceInfo": ["NVM", 590], + "lensName": "dw9714", + "lensHwType": "LENS_VCM_HW", + "testPatternMap": { + "Off": 0, + "ColorBars": 1 + }, + "enableAiqd": true, + "useCrlModule": false, + "pslOutputMapForRotation": [ + [[1280, 960], [1280, 960]], + ], + "maxRequestsInflight": 6, + "psysBundleWithAic": false, + "skipFrameV4L2Error": true, + "isISYSCompression": false, + "isPSACompression": false, + "usingMockPSys": false + } + ] + } +} From c95cf978781efd822a880c4d5fdc03f527b2abba Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 6 Aug 2026 11:14:43 +0800 Subject: [PATCH 15/19] doc: ar0234: Add IPU8 setup instructions to userspace-mipi guide Document the IPU8 MIPI dual-sensor setup alongside the existing IPU6EPMTL and IPU75XA instructions: BIOS MIPI camera configuration table, config file deployment steps for x2 sensors, and a tuning file placeholder (N/A, no external tuning file needed). Update the table of contents with the new IPU8 entries. Signed-off-by: Goh, Wei Khang1 --- doc/ar0234/userspace-mipi.md | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/doc/ar0234/userspace-mipi.md b/doc/ar0234/userspace-mipi.md index faa8d18a..ce2878f5 100644 --- a/doc/ar0234/userspace-mipi.md +++ b/doc/ar0234/userspace-mipi.md @@ -11,18 +11,21 @@ This document details the configuration settings for the AR0234 MIPI CSI-2 senso
  • Camera Configuration File Setup
  • Camera Tuning File Setup
  • Environment Setup
  • @@ -134,6 +137,57 @@ Config path: `Intel Advanced Menu`->`System Agent (SA) Configuration`->`MIPI Cam | Customize Device ID Number | 19 | 19 | | Flash Driver Selection | Disabled | Disabled | +#### Setup for IPU8 + +Config path: `Intel Advanced Menu`->`System Agent (SA) Configuration`->`MIPI Camera Configuration` + +| | Control Logic 1 | Control Logic 2 | +|--- |--- |--- | +| Control Logic Type | Discrete | Discrete | +| CRD Version | CRD-D | CRD-D | +| Input Clock | 19.2MHz | 19.2MHz | +| PCH Clock | IMGCLKOUT_0 | IMGCLKOUT_1 | +| Number of GPIOs | 1 | 1 | +| GPIO Pin 0 | | | +| Group Pad Number | 10 | 1 | +| Group Number | C_E_V | C_E_V | +| Com Number | COM1 | COM1 | +| Function | RESET | RESET | +| Active Value | 1 | 1 | +| Initial Value | 0 | 0 | +| Interrupt GPIO | Disabled | Disabled | + +| | Camera1 Link options | Camera2 Link options | +|--- |--- | --- | +| Sensor Model | User Custom | User Custom | +| Custom HID | INTC10C0 | INTC10C0 | +| Lanes Clock division | 4 4 2 2 | 4 4 2 2 | +| CRD Version | CRD-D | CRD-D | +| GPIO control | Control Logic 1 | Control Logic 2 | +| Camera position | Front | Back | +| Flash Support | Disabled | Disabled | +| Privacy LED | Driver default | Driver default | +| Rotation | 0 | 0 | +| PPR Value | 2 | 2 | +| PPR Unit | 2 | 2 | +| PhyConfiguration | DPHY | DPHY | +| Camera module name | _ | _ | +| MIPI port | 0 | 2 | +| LaneUsed | x2 | x2 | +| MCLK | 19200000 | 19200000 | +| EEPROM Type | ROM_NONE | ROM_NONE | +| VCM Type | VCM_NONE | VCM_NONE | +| Number of I2C Components | 1 | 1 | +| I2C Channel | I2C1 | I2C0 | +| Device 0 | | | +| I2C Address | 10 | 10 | +| Device Type | Sensor | Sensor | +| Customize Device ID List | | | +| Customize Device ID Number | 17 | 17 | +| Customize Device ID Number | 18 | 18 | +| Customize Device ID Number | 19 | 19 | +| Flash Driver Selection | Disabled | Disabled | + ## Camera Configuration File Setup #### Setup for IPU6EPMTL @@ -153,6 +207,14 @@ Replace target system with recommended [ipu75xa](../../config/ar0234/ipu75xa) se sudo cp -r ../../config/ar0234/ipu75xa /etc/camera +#### Setup for IPU8 + +Replace target system with recommended [ipu8](../../config/ar0234/ipu8) setting + +> **Note:** Add config below only if using x2 MIPI sensors. + + sudo cp -r ../../config/ar0234/ipu8 /etc/camera + ## Camera Tuning File Setup #### Setup for IPU6EPMTL @@ -163,6 +225,10 @@ Import [AR0234_TGL_10bits.aiqb](https://github.com/intel/ipu6-camera-hal/blob/io > **TODO:** No action needed for now, will revisit once AIQB config available in [ipu7-camera-hal](https://github.com/intel/ipu7-camera-hal/tree/main/config/linux/ipu75xa). +#### Setup for IPU8 + +> **TODO:** No action needed for now, will revisit once AIQB config available in [ipu7-camera-hal](https://github.com/intel/ipu7-camera-hal/tree/main/config/linux/ipu8). + ## Environment Setup > **Note:** PSYS library requires superuser access, please login as root to run the sample commands given below. From 98f27bba3d444b60bae0649e9366bda9166b7713 Mon Sep 17 00:00:00 2001 From: "Goh, Wei Khang1" Date: Thu, 13 Aug 2026 19:04:54 +0800 Subject: [PATCH 16/19] README: Add IPU8 support and submodule pinning guidance Update the sensor support matrix to reflect that AR0234 over MIPI CSI-2 now supports IPU8 in addition to IPU6EPMTL and IPU75XA. Bump the pinned ipu7-camera-bins/hal commit references for IPU8 to the software dependency table. Document the workaround for pinning the ipu7-drivers submodule to a specific commit for IPU8, since it tracks the tip of mainby default and RAW sensor support depends on a specific tuning-compatible commit. Signed-off-by: Goh, Wei Khang1 --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 935f7629..f302b65f 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ This repository contains reference drivers and configurations for Intel MIPI CSI |-----------------|-------------|-----------------|----------------------------------| | AR0233+GW5300 | GMSL | Sensing | IPU6EPMTL, IPU75XA | | AR0234 | GMSL | D3 Embedded | IPU6EPMTL | -| AR0234 | MIPI CSI-2 | D3 Embedded | IPU6EPMTL, IPU75XA | +| AR0234 | MIPI CSI-2 | D3 Embedded | IPU6EPMTL, IPU75XA, IPU8 | | AR0820+GW5300 | GMSL | Sensing | IPU6EPMTL, IPU75XA | | AR0830+AP1302 | MIPI CSI-2 | Leopard Imaging | IPU6EPMTL, IPU75XA | | ISX031 | GMSL | D3 Embedded | IPU6EP, IPU6EPMTL, IPU75XA, IPU8 | @@ -103,6 +103,7 @@ Install these software dependencies in your target system: |-------------|------------------------------------------|------------------------------------------|------------------------------------------| | IPU6 | d9421fef539f24fc80c27002d5da753e193b0670 | f93eec544a5234bf0b610b3f76d64c8fa711c364 | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | | IPU7 | cead7320d84ee9ade4f60d74e935b16b5a760945 | ef30767553685b83034e42325992a2442c5fcb2c | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | +| IPU8 | adf55525ab9d370828723b1ff8bee76ed7a492e8 | fd1efb6f2ef25fd24775a303cc71af6139d797eb | 867c5b6ab7925c9b69b8374873a832266d97d7e5 | ## Setup Procedure @@ -122,6 +123,12 @@ For IPU75XA, git checkout 44bbc2de71fe5e7a5a7124d4c5e5900e70e13736 cd .. +For IPU8, + + cd ipu7-drivers + git checkout bed9b71d5be56d0e24c771c7a6ec83fd0a9db433 + cd .. + Build and install modules using DKMS sudo dkms remove ipu-camera-sensor/0.1 From 880fbf67dc433bfbe0e6d9b20bcc8df0033f10d8 Mon Sep 17 00:00:00 2001 From: "Sodhi, Vunny" Date: Wed, 5 Aug 2026 09:03:06 +0800 Subject: [PATCH 17/19] acpi: ipu7: add dual ISX031 direct MIPI SSDT overlay Add SSDT overlay for direct MIPI CSI-2 connected ISX031 cameras on PTL platform, using a reusable _mipi_cam_common_isx031.asl include file for the camera device body. This mirrors the _des_ch_common_isx031.asl pattern used for GMSL cameras, enabling mix-and-match of MIPI and GMSL camera configurations. Per-camera defines: CAM_I2C_BUS, CAM_I2C_ADDR, CAM_TO_MIPI_PORT, CAM_LANES, CAM_GPIO_CTLR, CAM_RESET_PIN, CAM_IPU_PATH, CAM_IPU_REF, CAM_GPIO_REF. Default configuration: CAM0: I2C1, MIPI port 0, 4 lanes, GPP_E_1 (pin 27) CAM1: I2C2, MIPI port 2, 2 lanes, GPP_E_10 (pin 36) Signed-off-by: Sodhi, Vunny --- acpi/ipu7/_mipi_cam_common_isx031.asl | 112 ++++++++++++++++++++++++++ acpi/ipu7/mipi_isx031.asl | 78 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 acpi/ipu7/_mipi_cam_common_isx031.asl create mode 100644 acpi/ipu7/mipi_isx031.asl diff --git a/acpi/ipu7/_mipi_cam_common_isx031.asl b/acpi/ipu7/_mipi_cam_common_isx031.asl new file mode 100644 index 00000000..0713d180 --- /dev/null +++ b/acpi/ipu7/_mipi_cam_common_isx031.asl @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * Description: Common template for a direct MIPI CSI-2 ISX031 camera device. + * This include provides the body of a CAMx device for native MIPI. + * + * CAM-level defines expected by caller: + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A) + * CAM_TO_MIPI_PORT - Connected IPU MIPI port index (e.g. 0, 1, 2) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI1") + * CAM_RESET_PIN - GPIO pin number for RESET + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + */ +Method (_STA, 0, NotSerialized) // _STA: Status +{ + Return (0x0F) +} + +Method (_HID, 0, NotSerialized) // _HID: Hardware ID +{ + Return ("INTC113C") // ISX031 +} + +Name (_DEP, Package (0x01) // _DEP: Dependencies +{ + CAM_IPU_REF +}) + +Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings +{ + /* + * mipi-disco-img.c will use the information in CSI2Bus to create fwnode. + * CAMx Local Port -> IPU Remote Port + * CAMx PRT0 -> IPU PRTx (selected by CAM_TO_MIPI_PORT) + */ + CSI2Bus( + DeviceInitiated, // SlaveMode + 1, // PhyType (1 for DPHY) + 0, // LocalPort (sensor local port) + CAM_IPU_PATH, // ResourceSource (Path to IPU) + CAM_TO_MIPI_PORT, // ResourceSourceIndex (IPU PRTx) + , // ResourceUsage + , // DescriptorName + ) // VendorData + + I2cSerialBusV2 ( + CAM_I2C_ADDR, // SlaveAddress + ControllerInitiated, // SlaveMode + 400000, // I2C ConnectionSpeed + AddressingMode7Bit, // AddressingMode + CAM_I2C_BUS, // ResourceSource + 0x00, // ResourceSourceIndex + ResourceConsumer, // ResourceUsage + , // DescriptorName + Exclusive, // Shared + ) // VendorData + + /* GPIO for sensor RESET (directly from SoC GPIO controller) */ + GpioIo ( + Exclusive, // Shared (Not shared) + PullNone, // PinConfig (No need for pulls) + 0, // DebounceTimeout + 0, // DriveStrength + IoRestrictionOutputOnly,// IoRestriction (Only used as output) + CAM_GPIO_CTLR, // ResourceSource (GPIO controller) + 0) // ResourceSourceIndex (Must be 0) + { + CAM_RESET_PIN // Pin number + } +}) + +Name (_DSD, Package () // _DSD: Device-Specific Data +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-frequency", 96000000 }, // 96 MHz + /* + * reset-gpios: used by isx031.c driver via + * devm_gpiod_get_optional(dev, "reset", ...) + * Format: { , , , } + */ + Package () { "reset-gpios", Package () { CAM_GPIO_REF, 0, 0, 1 } }, + }, + ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"), // Hierarchical Data Extension + Package () + { + /* mipi-img-port here is local camera port used by mipi-disco-img.c. */ + Package () { "mipi-img-port-0", "PRT0" }, + }, +}) + +Name (PRT0, Package () +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-lane", 0 }, +#if CAM_LANES == 4 + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#elif CAM_LANES == 2 + Package () { "mipi-img-data-lanes", Package () { 1, 2 } }, +#else + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#endif + }, +}) diff --git a/acpi/ipu7/mipi_isx031.asl b/acpi/ipu7/mipi_isx031.asl new file mode 100644 index 00000000..f3582881 --- /dev/null +++ b/acpi/ipu7/mipi_isx031.asl @@ -0,0 +1,78 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SSDT overlay: Direct MIPI CSI-2 ISX031 camera configuration on PTL platform. + * + * This overlay describes a native MIPI-connected ISX031 sensor (no GMSL SERDES). + * Adjust the CAM_* defines below to match your hardware wiring. + * + * CAM-level defines (set per CAMx, see _mipi_cam_common_isx031.asl): + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A for ISX031) + * CAM_TO_MIPI_PORT - Connected IPU0 MIPI port (e.g. 0/1/2) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI1") + * CAM_RESET_PIN - GPIO pin number for RESET (e.g. 27 for GPP_E_1) + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + */ + +DefinitionBlock ("", "SSDT", 2, "", "IMG_IPU", 0x20260807) +{ + External (_SB.PC00, DeviceObj) + External (_SB.PC00.IPU0, DeviceObj) + External (_SB.GPI1, DeviceObj) // GPIO controller for RESET + + Include ("_ipu.asl") + + Scope (\_SB.PC00) + { + Device (CAM0) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C1" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 0 + #define CAM_LANES 4 + #define CAM_GPIO_CTLR "\\_SB.GPI1" + #define CAM_RESET_PIN 27 + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM0 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + + Device (CAM1) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C2" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 2 + #define CAM_LANES 2 + #define CAM_GPIO_CTLR "\\_SB.GPI1" + #define CAM_RESET_PIN 36 + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM1 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + } +} From 2f0365106a5e265107f931a484f99f49ccdb7fa5 Mon Sep 17 00:00:00 2001 From: "Sodhi, Vunny" Date: Tue, 11 Aug 2026 17:39:01 +0800 Subject: [PATCH 18/19] acpi: ipu6: add dual ISX031 direct MIPI SSDT overlay Add SSDT overlay for direct MIPI CSI-2 connected ISX031 cameras on MTL platform, using a reusable _mipi_cam_common_isx031.asl include file for the camera device body. This mirrors the _des_ch_common_isx031.asl pattern used for GMSL cameras, enabling mix-and-match of MIPI and GMSL camera configurations. Per-camera defines: CAM_I2C_BUS, CAM_I2C_ADDR, CAM_TO_MIPI_PORT, CAM_LANES, CAM_GPIO_CTLR, CAM_RESET_PIN, CAM_IPU_PATH, CAM_IPU_REF, CAM_GPIO_REF. Default configuration: CAM0: I2C1, MIPI port 0, 4 lanes, GPIO COM0 GPP_D_23 (pin 48) CAM1: I2C0, MIPI port 4, 4 lanes, GPIO COM3 GPP_H_0 (pin 0) Signed-off-by: Sodhi, Vunny --- acpi/ipu6/_mipi_cam_common_isx031.asl | 112 ++++++++++++++++++++++++++ acpi/ipu6/mipi_isx031.asl | 79 ++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 acpi/ipu6/_mipi_cam_common_isx031.asl create mode 100644 acpi/ipu6/mipi_isx031.asl diff --git a/acpi/ipu6/_mipi_cam_common_isx031.asl b/acpi/ipu6/_mipi_cam_common_isx031.asl new file mode 100644 index 00000000..0713d180 --- /dev/null +++ b/acpi/ipu6/_mipi_cam_common_isx031.asl @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * Description: Common template for a direct MIPI CSI-2 ISX031 camera device. + * This include provides the body of a CAMx device for native MIPI. + * + * CAM-level defines expected by caller: + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A) + * CAM_TO_MIPI_PORT - Connected IPU MIPI port index (e.g. 0, 1, 2) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI1") + * CAM_RESET_PIN - GPIO pin number for RESET + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + */ +Method (_STA, 0, NotSerialized) // _STA: Status +{ + Return (0x0F) +} + +Method (_HID, 0, NotSerialized) // _HID: Hardware ID +{ + Return ("INTC113C") // ISX031 +} + +Name (_DEP, Package (0x01) // _DEP: Dependencies +{ + CAM_IPU_REF +}) + +Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings +{ + /* + * mipi-disco-img.c will use the information in CSI2Bus to create fwnode. + * CAMx Local Port -> IPU Remote Port + * CAMx PRT0 -> IPU PRTx (selected by CAM_TO_MIPI_PORT) + */ + CSI2Bus( + DeviceInitiated, // SlaveMode + 1, // PhyType (1 for DPHY) + 0, // LocalPort (sensor local port) + CAM_IPU_PATH, // ResourceSource (Path to IPU) + CAM_TO_MIPI_PORT, // ResourceSourceIndex (IPU PRTx) + , // ResourceUsage + , // DescriptorName + ) // VendorData + + I2cSerialBusV2 ( + CAM_I2C_ADDR, // SlaveAddress + ControllerInitiated, // SlaveMode + 400000, // I2C ConnectionSpeed + AddressingMode7Bit, // AddressingMode + CAM_I2C_BUS, // ResourceSource + 0x00, // ResourceSourceIndex + ResourceConsumer, // ResourceUsage + , // DescriptorName + Exclusive, // Shared + ) // VendorData + + /* GPIO for sensor RESET (directly from SoC GPIO controller) */ + GpioIo ( + Exclusive, // Shared (Not shared) + PullNone, // PinConfig (No need for pulls) + 0, // DebounceTimeout + 0, // DriveStrength + IoRestrictionOutputOnly,// IoRestriction (Only used as output) + CAM_GPIO_CTLR, // ResourceSource (GPIO controller) + 0) // ResourceSourceIndex (Must be 0) + { + CAM_RESET_PIN // Pin number + } +}) + +Name (_DSD, Package () // _DSD: Device-Specific Data +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-frequency", 96000000 }, // 96 MHz + /* + * reset-gpios: used by isx031.c driver via + * devm_gpiod_get_optional(dev, "reset", ...) + * Format: { , , , } + */ + Package () { "reset-gpios", Package () { CAM_GPIO_REF, 0, 0, 1 } }, + }, + ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"), // Hierarchical Data Extension + Package () + { + /* mipi-img-port here is local camera port used by mipi-disco-img.c. */ + Package () { "mipi-img-port-0", "PRT0" }, + }, +}) + +Name (PRT0, Package () +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-lane", 0 }, +#if CAM_LANES == 4 + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#elif CAM_LANES == 2 + Package () { "mipi-img-data-lanes", Package () { 1, 2 } }, +#else + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#endif + }, +}) diff --git a/acpi/ipu6/mipi_isx031.asl b/acpi/ipu6/mipi_isx031.asl new file mode 100644 index 00000000..d9df2e9d --- /dev/null +++ b/acpi/ipu6/mipi_isx031.asl @@ -0,0 +1,79 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SSDT overlay: Direct MIPI CSI-2 ISX031 camera configuration on MTL platform. + * + * This overlay describes a native MIPI-connected ISX031 sensor (no GMSL SERDES). + * Adjust the CAM_* defines below to match your hardware wiring. + * + * CAM-level defines (set per CAMx, see _mipi_cam_common_isx031.asl): + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A for ISX031) + * CAM_TO_MIPI_PORT - Connected IPU0 MIPI port (e.g. 0/1/2/3/4/5) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI0") + * CAM_RESET_PIN - GPIO pin number for RESET (community-relative) + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + */ + +DefinitionBlock ("", "SSDT", 2, "", "IMG_IPU", 0x20260807) +{ + External (_SB.PC00, DeviceObj) + External (_SB.PC00.IPU0, DeviceObj) + External (_SB.GPI0, DeviceObj) // GPIO controller COM0 for CAM0 RESET + External (_SB.GPI3, DeviceObj) // GPIO controller COM3 for CAM1 RESET + + Include ("_ipu.asl") + + Scope (\_SB.PC00) + { + Device (CAM0) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C1" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 0 + #define CAM_LANES 4 + #define CAM_GPIO_CTLR "\\_SB.GPI0" + #define CAM_RESET_PIN 48 // GPP_D_23 (COM0: vGPIO_3 0-24, GPP_D starts at 25) + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM0 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + + Device (CAM1) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C0" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 4 + #define CAM_LANES 4 + #define CAM_GPIO_CTLR "\\_SB.GPI3" + #define CAM_RESET_PIN 0 // GPP_H_0 (COM3: GPP_H starts at 0) + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM1 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + } +} From a7a3e8962cbb0f0c8d34fc5a1708574afbaafcdb Mon Sep 17 00:00:00 2001 From: "Sodhi, Vunny" Date: Thu, 13 Aug 2026 02:40:04 +0800 Subject: [PATCH 19/19] acpi: ipu8: add dual ISX031 direct MIPI SSDT overlay Add SSDT overlay for direct MIPI CSI-2 connected ISX031 cameras on NVL platform, using a reusable _mipi_cam_common_isx031.asl include file for the camera device body. This mirrors the _des_ch_common_isx031.asl pattern used for GMSL cameras, enabling mix-and-match of MIPI and GMSL camera configurations. Consolidate IPU port configuration into the shared _ipu.asl by fixing PRT2 to 2 DPHY data lanes, matching the x2 sensor on MIPI port 2. The previous 4-lane PRT2 setting was incorrect for all existing SSDTs and caused the CSI2 receiver to hang waiting for lanes 3+4 to synchronize. Remove the now-redundant _ipu_mipi.asl. Per-camera defines: CAM_I2C_BUS, CAM_I2C_ADDR, CAM_TO_MIPI_PORT, CAM_LANES, CAM_GPIO_CTLR, CAM_RESET_PIN, CAM_IPU_PATH, CAM_IPU_REF, CAM_GPIO_REF. Default configuration: CAM0: I2C1, MIPI port 0, 4 lanes, GPP_E_1 (pin 27) CAM1: I2C0, MIPI port 2, 2 lanes, GPP_E_10 (pin 36) Signed-off-by: Sodhi, Vunny --- acpi/ipu8/_ipu.asl | 2 +- acpi/ipu8/_mipi_cam_common_isx031.asl | 112 ++++++++++++++++++++++++++ acpi/ipu8/mipi_isx031.asl | 82 +++++++++++++++++++ 3 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 acpi/ipu8/_mipi_cam_common_isx031.asl create mode 100644 acpi/ipu8/mipi_isx031.asl diff --git a/acpi/ipu8/_ipu.asl b/acpi/ipu8/_ipu.asl index 55499351..8fa36119 100644 --- a/acpi/ipu8/_ipu.asl +++ b/acpi/ipu8/_ipu.asl @@ -38,7 +38,7 @@ Scope (\_SB.PC00.IPU0) { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties Package () { - Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } } + Package () { "mipi-img-data-lanes", Package () { 1, 2 } } }, }) } diff --git a/acpi/ipu8/_mipi_cam_common_isx031.asl b/acpi/ipu8/_mipi_cam_common_isx031.asl new file mode 100644 index 00000000..0713d180 --- /dev/null +++ b/acpi/ipu8/_mipi_cam_common_isx031.asl @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * Description: Common template for a direct MIPI CSI-2 ISX031 camera device. + * This include provides the body of a CAMx device for native MIPI. + * + * CAM-level defines expected by caller: + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A) + * CAM_TO_MIPI_PORT - Connected IPU MIPI port index (e.g. 0, 1, 2) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI1") + * CAM_RESET_PIN - GPIO pin number for RESET + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + */ +Method (_STA, 0, NotSerialized) // _STA: Status +{ + Return (0x0F) +} + +Method (_HID, 0, NotSerialized) // _HID: Hardware ID +{ + Return ("INTC113C") // ISX031 +} + +Name (_DEP, Package (0x01) // _DEP: Dependencies +{ + CAM_IPU_REF +}) + +Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings +{ + /* + * mipi-disco-img.c will use the information in CSI2Bus to create fwnode. + * CAMx Local Port -> IPU Remote Port + * CAMx PRT0 -> IPU PRTx (selected by CAM_TO_MIPI_PORT) + */ + CSI2Bus( + DeviceInitiated, // SlaveMode + 1, // PhyType (1 for DPHY) + 0, // LocalPort (sensor local port) + CAM_IPU_PATH, // ResourceSource (Path to IPU) + CAM_TO_MIPI_PORT, // ResourceSourceIndex (IPU PRTx) + , // ResourceUsage + , // DescriptorName + ) // VendorData + + I2cSerialBusV2 ( + CAM_I2C_ADDR, // SlaveAddress + ControllerInitiated, // SlaveMode + 400000, // I2C ConnectionSpeed + AddressingMode7Bit, // AddressingMode + CAM_I2C_BUS, // ResourceSource + 0x00, // ResourceSourceIndex + ResourceConsumer, // ResourceUsage + , // DescriptorName + Exclusive, // Shared + ) // VendorData + + /* GPIO for sensor RESET (directly from SoC GPIO controller) */ + GpioIo ( + Exclusive, // Shared (Not shared) + PullNone, // PinConfig (No need for pulls) + 0, // DebounceTimeout + 0, // DriveStrength + IoRestrictionOutputOnly,// IoRestriction (Only used as output) + CAM_GPIO_CTLR, // ResourceSource (GPIO controller) + 0) // ResourceSourceIndex (Must be 0) + { + CAM_RESET_PIN // Pin number + } +}) + +Name (_DSD, Package () // _DSD: Device-Specific Data +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-frequency", 96000000 }, // 96 MHz + /* + * reset-gpios: used by isx031.c driver via + * devm_gpiod_get_optional(dev, "reset", ...) + * Format: { , , , } + */ + Package () { "reset-gpios", Package () { CAM_GPIO_REF, 0, 0, 1 } }, + }, + ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"), // Hierarchical Data Extension + Package () + { + /* mipi-img-port here is local camera port used by mipi-disco-img.c. */ + Package () { "mipi-img-port-0", "PRT0" }, + }, +}) + +Name (PRT0, Package () +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-lane", 0 }, +#if CAM_LANES == 4 + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#elif CAM_LANES == 2 + Package () { "mipi-img-data-lanes", Package () { 1, 2 } }, +#else + Package () { "mipi-img-data-lanes", Package () { 1, 2, 3, 4 } }, +#endif + }, +}) diff --git a/acpi/ipu8/mipi_isx031.asl b/acpi/ipu8/mipi_isx031.asl new file mode 100644 index 00000000..145447ff --- /dev/null +++ b/acpi/ipu8/mipi_isx031.asl @@ -0,0 +1,82 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SSDT overlay: Direct MIPI CSI-2 ISX031 camera configuration on NVL platform. + * + * This overlay describes a native MIPI-connected ISX031 sensor (no GMSL SERDES). + * Adjust the CAM_* defines below to match your hardware wiring. + * + * CAM-level defines (set per CAMx, see _mipi_cam_common_isx031.asl): + * CAM_I2C_BUS - Camera I2C bus path (e.g. "\\_SB.PC00.I2C1") + * CAM_I2C_ADDR - Camera I2C slave address (e.g. 0x001A for ISX031) + * CAM_TO_MIPI_PORT - Connected IPU0 MIPI port (e.g. 0/1/2) + * CAM_LANES - Number of MIPI data lanes (e.g. 2, 4) + * CAM_GPIO_CTLR - GPIO controller path (e.g. "\\_SB.GPI1") + * CAM_RESET_PIN - GPIO pin number for RESET (community-relative) + * CAM_IPU_PATH - IPU path string (e.g. "\\_SB.PC00.IPU0") + * CAM_IPU_REF - IPU namespace reference (e.g. \_SB.PC00.IPU0) + * CAM_GPIO_REF - Device self-reference for reset-gpios (e.g. ^CAM0) + * + * Default configuration (from BIOS table, COM1 groups C_E_V): + * CAM0: I2C1, MIPI port 0, 4 lanes, GPP_E_1 (pin 27) + * CAM1: I2C0, MIPI port 2, 2 lanes, GPP_E_10 (pin 36) + */ + +DefinitionBlock ("", "SSDT", 2, "", "IMG_IPU", 0x20260807) +{ + External (_SB.PC00, DeviceObj) + External (_SB.PC00.IPU0, DeviceObj) + External (_SB.GPI1, DeviceObj) // GPIO controller COM1 for RESET + + Include ("_ipu.asl") + + Scope (\_SB.PC00) + { + Device (CAM0) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C1" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 0 + #define CAM_LANES 4 + #define CAM_GPIO_CTLR "\\_SB.GPI1" + #define CAM_RESET_PIN 27 // GPP_E_1 (COM1 pin 27) + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM0 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + + Device (CAM1) + { + #define CAM_I2C_BUS "\\_SB.PC00.I2C0" + #define CAM_I2C_ADDR 0x001A + #define CAM_TO_MIPI_PORT 2 + #define CAM_LANES 2 + #define CAM_GPIO_CTLR "\\_SB.GPI1" + #define CAM_RESET_PIN 36 // GPP_E_10 (COM1 pin 36) + #define CAM_IPU_PATH "\\_SB.PC00.IPU0" + #define CAM_IPU_REF \_SB.PC00.IPU0 + #define CAM_GPIO_REF ^CAM1 + #include "_mipi_cam_common_isx031.asl" + #undef CAM_I2C_BUS + #undef CAM_I2C_ADDR + #undef CAM_TO_MIPI_PORT + #undef CAM_LANES + #undef CAM_GPIO_CTLR + #undef CAM_RESET_PIN + #undef CAM_IPU_PATH + #undef CAM_IPU_REF + #undef CAM_GPIO_REF + } + } +}