From 6b5a988f83484d2778f58779a64df16502600213 Mon Sep 17 00:00:00 2001 From: "Khai Wen, Ng" Date: Fri, 11 Sep 2026 12:01:49 +0800 Subject: [PATCH 1/4] drivers: d4xx: Add bound checking Add bound checking to avoid OOB set and OOB read. Signed-off-by: Khai Wen, Ng --- drivers/media/i2c/d4xx.c | 44 ++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/drivers/media/i2c/d4xx.c b/drivers/media/i2c/d4xx.c index 9da3c211..93b50b2d 100644 --- a/drivers/media/i2c/d4xx.c +++ b/drivers/media/i2c/d4xx.c @@ -3469,6 +3469,13 @@ static int ds5_s_ctrl(struct v4l2_ctrl *ctrl) dev_dbg(&state->client->dev, "%s(): offset %x, size: %x\n", __func__, offset, size); + if (size < 4 || size > ctrl->dims[0]) { + dev_err(&state->client->dev, + "%s(): Invalid ERB size: %u\n", __func__, size); + ret = -EINVAL; + break; + } + len = sizeof(struct hwm_cmd) + size; erb_cmd = devm_kzalloc(&state->client->dev, len, GFP_KERNEL); if (!erb_cmd) { @@ -3483,14 +3490,17 @@ static int ds5_s_ctrl(struct v4l2_ctrl *ctrl) erb_cmd->param2 = size; ret = ds5_send_hwmc(state, sizeof(struct hwm_cmd), erb_cmd); if (!ret) - ret = ds5_get_hwmc(state, erb_cmd->Data, len, &size); + ret = ds5_get_hwmc(state, erb_cmd->Data, size, &size); + if (!ret && (size < 4 || size > ctrl->dims[0])) + ret = -EBADMSG; if (ret) { dev_err(&state->client->dev, "%s(): ERB cmd failed, ret: %d," "requested size: %d, actual size: %d\n", __func__, ret, erb_cmd->param2, size); devm_kfree(&state->client->dev, erb_cmd); - return -EAGAIN; + ret = -EAGAIN; + break; } // Actual size returned from FW @@ -3524,6 +3534,12 @@ static int ds5_s_ctrl(struct v4l2_ctrl *ctrl) *((u8 *)ctrl->p_new.p_u8 + 1), *((u8 *)ctrl->p_new.p_u8 + 2), *((u8 *)ctrl->p_new.p_u8 + 3)); + if (size > ctrl->dims[0] - 4) { + dev_err(&state->client->dev, + "%s(): Invalid EWB size: %u\n", __func__, size); + ret = -EINVAL; + break; + } ewb_cmd = devm_kzalloc(&state->client->dev, sizeof(struct hwm_cmd) + size, @@ -3549,7 +3565,8 @@ static int ds5_s_ctrl(struct v4l2_ctrl *ctrl) "requested size: %d, actual size: %d\n", __func__, ret, ewb_cmd->param2, size); devm_kfree(&state->client->dev, ewb_cmd); - return -EAGAIN; + ret = -EAGAIN; + break; } devm_kfree(&state->client->dev, ewb_cmd); @@ -3849,7 +3866,8 @@ static int ds5_g_volatile_ctrl(struct v4l2_ctrl *ctrl) break; case DS5_CAMERA_CID_AE_ROI_GET: if (ctrl->p_new.p_u16) { - u16 len = sizeof(struct hwm_cmd) + 12; + u16 data_capacity = 12; + u16 len = sizeof(struct hwm_cmd) + data_capacity; u16 dataLen = 0; struct hwm_cmd *ae_roi_cmd; ae_roi_cmd = devm_kzalloc(&state->client->dev, len, GFP_KERNEL); @@ -3866,15 +3884,19 @@ static int ds5_g_volatile_ctrl(struct v4l2_ctrl *ctrl) devm_kfree(&state->client->dev, ae_roi_cmd); return ret; } - ret = ds5_get_hwmc(state, ae_roi_cmd->Data, len, &dataLen); - if (!ret && dataLen <= ctrl->dims[0]) + ret = ds5_get_hwmc(state, ae_roi_cmd->Data, + data_capacity, &dataLen); + if (!ret && dataLen == data_capacity) memcpy(ctrl->p_new.p_u16, ae_roi_cmd->Data + 4, 8); + else if (!ret) + ret = -EBADMSG; devm_kfree(&state->client->dev, ae_roi_cmd); } break; case DS5_CAMERA_CID_AE_SETPOINT_GET: if (ctrl->p_new.p_s32) { - u16 len = sizeof(struct hwm_cmd) + 8; + u16 data_capacity = 8; + u16 len = sizeof(struct hwm_cmd) + data_capacity; u16 dataLen = 0; struct hwm_cmd *ae_setpoint_cmd; ae_setpoint_cmd = devm_kzalloc(&state->client->dev, len, GFP_KERNEL); @@ -3891,8 +3913,12 @@ static int ds5_g_volatile_ctrl(struct v4l2_ctrl *ctrl) devm_kfree(&state->client->dev, ae_setpoint_cmd); return ret; } - ret = ds5_get_hwmc(state, ae_setpoint_cmd->Data, len, &dataLen); - memcpy(ctrl->p_new.p_s32, ae_setpoint_cmd->Data + 4, 4); + ret = ds5_get_hwmc(state, ae_setpoint_cmd->Data, + data_capacity, &dataLen); + if (!ret && dataLen == data_capacity) + memcpy(ctrl->p_new.p_s32, ae_setpoint_cmd->Data + 4, 4); + else if (!ret) + ret = -EBADMSG; dev_dbg(&state->client->dev, "%s(): len: %d, 0x%x \n", __func__, dataLen, *(ctrl->p_new.p_s32)); devm_kfree(&state->client->dev, ae_setpoint_cmd); From 08e86b98d3cff659976020645b36f76d27e9bbdf Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Thu, 17 Sep 2026 16:44:14 +0800 Subject: [PATCH 2/4] maxim-serdes: Add ACPI HID for MAX96717 Assign INTC1141 as ACPI HID of MAX96717 serializer Signed-off-by: Yew, Chang Ching --- drivers/media/i2c/maxim-serdes/max96717.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/i2c/maxim-serdes/max96717.c b/drivers/media/i2c/maxim-serdes/max96717.c index 0cfeeec8..fc3a1e47 100644 --- a/drivers/media/i2c/maxim-serdes/max96717.c +++ b/drivers/media/i2c/maxim-serdes/max96717.c @@ -1968,6 +1968,7 @@ static const struct max96717_chip_info max96717_info = { static const struct acpi_device_id max96717_acpi_ids[] = { { "INTC1138", (kernel_ulong_t)&max9295a_info}, { "INTC1140", (kernel_ulong_t)&max9295d_info}, + { "INTC1141", (kernel_ulong_t)&max96717_info}, {} }; MODULE_DEVICE_TABLE(acpi, max96717_acpi_ids); From 7556c81d87a23cad640c0d8b43d2e1c9139af161 Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Thu, 17 Sep 2026 16:46:21 +0800 Subject: [PATCH 3/4] Add Sensing M3A sensor ASL Add platform ASL containing 3 units of Sensing M3A monocular sensor and 1 unit of Realsense D457 for Robinson Lake platform Signed-off-by: Yew, Chang Ching --- acpi/ipu7/_des_ch_common_m3a.asl | 56 ++++ acpi/ipu7/_ser_common_max96717.asl | 206 ++++++++++++ .../robinson_bay/3_m3a_1_d457_frame_sync.asl | 308 ++++++++++++++++++ acpi/ipu7/robinson_bay/_des_ch_common_m3a.asl | 1 + .../robinson_bay/_ser_common_max96717.asl | 1 + 5 files changed, 572 insertions(+) create mode 100644 acpi/ipu7/_des_ch_common_m3a.asl create mode 100644 acpi/ipu7/_ser_common_max96717.asl create mode 100644 acpi/ipu7/robinson_bay/3_m3a_1_d457_frame_sync.asl create mode 120000 acpi/ipu7/robinson_bay/_des_ch_common_m3a.asl create mode 120000 acpi/ipu7/robinson_bay/_ser_common_max96717.asl diff --git a/acpi/ipu7/_des_ch_common_m3a.asl b/acpi/ipu7/_des_ch_common_m3a.asl new file mode 100644 index 00000000..d8a5831b --- /dev/null +++ b/acpi/ipu7/_des_ch_common_m3a.asl @@ -0,0 +1,56 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * Description: Common template for each Sensing M3A 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 + * EXTERNAL_FRAME_SYNC - CAMx Add fsin-gpio resource if defined + */ + +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_max96717.asl" + + Device (DESCH_CAM) // CAMx device under parent DESx.CHxx.SERx + { + #include "_cam_common_isx031.asl" + } + } +} diff --git a/acpi/ipu7/_ser_common_max96717.asl b/acpi/ipu7/_ser_common_max96717.asl new file mode 100644 index 00000000..dfb9ebee --- /dev/null +++ b/acpi/ipu7/_ser_common_max96717.asl @@ -0,0 +1,206 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SER-level defines expected by caller: + * DES_REF - Reference to parent DES (e.g. \_SB.PC00.DESx), used in _DEP + * DES_PATH - Path to parent DES (e.g. "\\_SB.PC00.DESx"), used in CSI2Bus + * DESCH_CH_PATH - Path to DES channel (e.g. "\\_SB.PC00.DESx.CHxx"), used in I2cSerialBusV2 + * DESCH_SER_PATH - Path to SER (e.g. "\\_SB.PC00.DESx.CHxx.SERx"), used in GpioIo + * DESCH_LINK_NUM - DES channel number (e.g. 0 for CH00, 1 for CH01), used in CSI2Bus + * DESCH_SER_I2C - SER I2C slave address (e.g. 0x40, 0x62), used in I2cSerialBusV2 + * CAM_ALIAS - Camera alias I2C address used in i2c-alias-pool in _DSD + * DESCH_SER_RESET_GPIO - (Optional) SER Reset GPIO pin number, used in GpioIo + * DESCH_SER_FSIN_GPIO - (Optional) SER Extra GPIO pin number, used in GpioIo + * DESCH_SER_FSYNC_RX_ID - (Optional) GMSL GPIO ID the DES sends frame sync as, used in MFP node + * DESCH_SER_X/Y/Z/U_VC - (Optional) SER VC filter for Pipe X/Y/Z/U, specifically for MAX96717 driver + */ + +#ifndef DESCH_SER_RESET_GPIO +#ifndef DESCH_SER_FSIN_GPIO + +#define DESCH_SER_RESET_GPIO 0 + +#endif +#endif + +#ifdef DESCH_SER_RESET_GPIO +#ifdef DESCH_SER_FSIN_GPIO + +#if DESCH_SER_RESET_GPIO == DESCH_SER_FSIN_GPIO +#error "DESCH_SER_RESET_GPIO and DESCH_SER_FSIN_GPIO cannot be the same GPIO pin number" +#endif + +#endif +#endif + +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 ("INTC1141") // MAX96717 +} + +Name (_DEP, Package (0x01) // _DEP: Dependencies +{ + DES_REF // Path to parent DES (e.g. "\\_SB.PC00.DESx") +}) + +Name(_CRS, ResourceTemplate () // _CRS: Current Resource Settings +{ + /* + * mipi-disco-img.c will use the information in CSI2Bus to create fwnode. + * SERx Local Port -> DESx Remote Port + * SERx PRT1 -> DESx PRT0/1/2/3 + */ + CSI2Bus( + DeviceInitiated, // SlaveMode + 1, // PhyType (1 for DPHY) + 1, // LocalPort (MAX96717 only 1 PHY) + DES_PATH, // ResourceSource (Path to parent DES, e.g. "\\_SB.PC00.DESx") + DESCH_LINK_NUM, // ResourceSourceIndex (e.g. 0/1/2/3 for parent DES PRT0/1/2/3) + , // ResourceUsage + , // DescriptorName + ) // VendorData + + I2cSerialBusV2 ( + DESCH_SER_I2C, // SlaveAddress (e.g. 0x40, 0x62 based on Serializer Hardware) + ControllerInitiated, // SlaveMode +#ifdef I2C_SPEED + I2C_SPEED, // I2C ConnectionSpeed (e.g. 100000 for 100kHz) +#else + 400000, // I2C ConnectionSpeed (400000 for 400kHz) +#endif + AddressingMode7Bit, // AddressingMode + DESCH_CH_PATH, // ResourceSource (e.g. "\\_SB.PC00.DESx.CHxx") based on which Link + 0x00, // ResourceSourceIndex + ResourceConsumer, // ResourceUsage + , // DescriptorName + Exclusive, // Shared + ) // VendorData + + GpioIo ( + Exclusive, // Shared (Not shared) + PullNone, // PinConfig (No need for pulls) + 0, // DebounceTimeout + 0, // DriveStrength + IoRestrictionNone, // IoRestriction + DESCH_SER_PATH, // ResourceSourceIndex (Path to SER GPIO controller, e.g. "\\_SB.PC00.DESx.CHxx.SERx" based on which Link) + 0) // ResourceUsage (Must be 0) + { +#ifdef DESCH_SER_RESET_GPIO + DESCH_SER_RESET_GPIO, // Pin 0 (e.g. MFP0 on MAX96717) +#endif +#ifdef DESCH_SER_FSIN_GPIO + DESCH_SER_FSIN_GPIO, // Extra pin (e.g. MFP7 on MAX96717) +#endif +#ifdef DESCH_SER_FSIN_GPIO_2 + DESCH_SER_FSIN_GPIO_2, // Extra pin (e.g. MFP7 on MAX96717) +#endif + } +}) + +Name (_DSD, Package () // _DSD: Device-Specific Data +{ + ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties for _DSD + Package () + { + /* + * I2C alias pool used by i2c-atr driver. + * Address called out in the pool is used as Camera Alias Address. + */ + Package () { "i2c-alias-pool", Package() { CAM_ALIAS } }, + /* + * External GMSL frame sync control, consumed by max96717.c. + * Disabled by default; define EXTERNAL_FRAME_SYNC (1) by the + * caller to override. + */ +#ifdef EXTERNAL_FRAME_SYNC + Package () { "gmsl-frame-sync-enable", EXTERNAL_FRAME_SYNC }, // Zero to disable, One to enable +#else + Package () { "gmsl-frame-sync-enable", 0 }, // Disabled by default +#endif + }, + 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 CAMx (used by CAMx CSI2Bus ResourceSourceIndex) + Package () { "mipi-img-port-1", "PRT1" }, // Connected to DESx PRTx (used by SERx CSI2Bus LocalPort) + + /* Below are for MAX96717 driver usage. Refer to max96717.c for implementation details */ + Package () { "Pipe-X", "PIPX" }, // Pipe X +#ifdef EXTERNAL_FRAME_SYNC +#ifdef DESCH_SER_FSYNC_RX_ID +#ifdef DESCH_SER_FSIN_GPIO + Package () { "fsync", "MFP" }, // fsync pin configuration +#endif +#endif +#endif + } +}) + +#ifdef EXTERNAL_FRAME_SYNC +#ifdef DESCH_SER_FSYNC_RX_ID +#ifdef DESCH_SER_FSIN_GPIO +Name (MFP, Package() +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + #ifdef DESCH_SER_FSYNC_RX_ID + Package () { "maxim,rx-id", DESCH_SER_FSYNC_RX_ID }, // GMSL GPIO ID sent by the DES + #endif + #ifdef DESCH_SER_FSIN_GPIO + Package () { "gmsl-frame-sync-gpio-pin", DESCH_SER_FSIN_GPIO }, + #endif + #ifdef DESCH_SER_FSIN_GPIO_2 + Package () { "gmsl-frame-sync-gpio-pin-2", DESCH_SER_FSIN_GPIO_2 }, + #endif + }, +}) +#endif +#endif +#endif + +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 } }, // 4 data lanes + #elif CAM_LANES == 2 + Package () { "mipi-img-data-lanes", Package() { 1, 2 } }, // 2 data lanes + #else + Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, // Default to 4 data lanes if not defined + #endif + }, +}) + +Name (PRT1, Package() +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + Package () { "mipi-img-clock-lane", 0 }, + Package () { "mipi-img-data-lanes", Package() { 1, 2, 3, 4 } }, + }, +}) + +Name (PIPX, Package() +{ + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), // Device Properties + Package () + { + #ifdef DESCH_SER_X_VC + Package () { "vc-id", DESCH_SER_X_VC }, // VC filter for pipe X + #else + Package () { "vc-id", Package () { 0 } }, // Default to VC 0 if not defined + #endif + }, +}) \ No newline at end of file diff --git a/acpi/ipu7/robinson_bay/3_m3a_1_d457_frame_sync.asl b/acpi/ipu7/robinson_bay/3_m3a_1_d457_frame_sync.asl new file mode 100644 index 00000000..f7ba5381 --- /dev/null +++ b/acpi/ipu7/robinson_bay/3_m3a_1_d457_frame_sync.asl @@ -0,0 +1,308 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * Copyright (c) 2026 Intel Corporation. + * + * SSDT overlay: 3x Sensing M3A GMSL camera + 1x RS D457 configuration on Robinson Bay. + * + * DES0 (MAX96724 2-trio CPHY, MIPI port 0) + * - Link 1: 4-lane Sensing M3A (MAX96717 SER @ 0x40) + * - Link 2: 4-lane Sensing M3A (MAX96717 SER @ 0x40) + * - Link 3: 4-lane Sensing M3A (MAX96717 SER @ 0x40) + * DES1 (MAX96724 2-trio CPHY, MIPI port 2) + * - Link 1: 2-lane RealSense D457 (MAX9295A SER @ 0x40, D457 VC mapping) + * + * 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. 0x0027 for MAX96724) + * DES_LANES - Number of MIPI data lanes (e.g. 2, 4) + * DES_INTERNAL_PHY - DES internal PHY (PHY0 = 4, PHY1 = 5, PHY2 = 6, PHY3 = 7) + * 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) + * DES_PIPE_STR_AUTOSELECT - (Optional) MAX96724 pipe-stream-autoselect override (0 disables, 1 enables) + * I2C_SPEED - (Optional) I2C connection speed for I2cSerialBusV2 (defaults to 400000) + * DES_FSIN_GPIO_PIN - (Optional) DES GPIO pin number, used in GpioIo (e.g. 7 for MFP7 on MAX96724, + * used to receive the external GMSL frame sync trigger pulse) + * + * Channel-level defines (set per CHxx, undef'd by the caller after each channel include): + * DESCH_LINK_NUM - Channel/link number (0..3) - 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) + * DESCH_SER_RESET_GPIO - (Optional) SER RESET GPIO pin number (e.g. 0 for MFP0 of Serializer) + * DESCH_SER_FSIN_GPIO - (Optional) SER FSIN GPIO pin number (e.g. 7 for MFP7 of Serializer) + * DESCH_SER_FSYNC_RX_ID - (Optional) SER FSYNC RX pin ID (e.g. 7 to receive signal from MFP7 of Deserializer) + * DESCH_SER_X/Y/Z/U_VC - (Optional) VC mapping/filter for D457 streams (Package of VC indices) + * EXTERNAL_FRAME_SYNC - Camera external frame sync FSIN GPIO enablement + * 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) + */ + +/* + * IMPORTANT: The setup below is for Robinson Bay. + * + * Rotation 0 = Channel 0 + * Rotation 90 = Channel 1 + * Rotation 180 = Channel 2 + * Rotation 270 = Channel 3 + * + * ___ ___ ___ ___ + * | | | | | | + * |90 |180| | 1 | 2 | + * |___|___| --> |___|___| + * | | | | | | + * |270| 0 | | 3 | 0 | + * |___|___| |___|___| + * + * + * Update the ASL accordingly based on your connection. + * Make sure DESCH_CH, DESCH_SER, DESCH_CAM, DESCH_CH_PATH, DESCH_SER_PATH, + * DESCH_SER_REF, DESCH_SER_GPIOREF are all updated if connection changed. + * + * 3x Sensing M3A on MIPI-0 (90, 180, 270), --> DES0, channel 1,2,3 : frame sync enabled + * 1x RealSense on MIPI-2 (90) --> DES1, channel 1 : frame sync enabled + * + */ + + +DefinitionBlock ("", "SSDT", 2, "", "IMG_ROB", 0x20260916) +{ + External (_SB.PC00, DeviceObj) + + Include ("_ipu.asl") + + Scope (\_SB.PC00) + { + Device (DES0) + { + #define EXTERNAL_FRAME_SYNC 1 + + // DES-level defines for DES0 + #define DES_PHY_TYPE 0 + #define DES_I2C_ADDR 0x0027 + #define DES_LANES 2 + #define DES_INTERNAL_PHY 4 + #define DES_TO_MIPI_PORT 0 + #define DES_I2C_BUS "\\_SB.PC00.I2C0" + #define DES_PATH "\\_SB.PC00.DES0" + #define DES_REF \_SB.PC00.DES0 + #define DES_FSIN_GPIO_PIN 7 + #include "_des_common_max96724.asl" + + // Channel 1/acpi 2 (Sensing M3A MFP7 fsync) + #define DESCH_CH CH01 + #define DESCH_SER SER1 + #define DESCH_CAM CAM1 + #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_LINK_NUM 1 + #define DESCH_SER_I2C 0x40 + #define DESCH_SER_GPIOREF ^^SER1 + #define DESCH_SER_RESET_GPIO 0 + #define DESCH_SER_FSIN_GPIO 7 + #define DESCH_SER_FSYNC_RX_ID 7 + #define CAM_ALIAS 0x55 + #define CAM_LANES 4 + #include "_des_ch_common_m3a.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 +#ifdef DESCH_SER_RESET_GPIO + #undef DESCH_SER_RESET_GPIO +#endif +#ifdef DESCH_SER_FSIN_GPIO + #undef DESCH_SER_FSIN_GPIO +#endif +#ifdef DESCH_SER_FSYNC_RX_ID + #undef DESCH_SER_FSYNC_RX_ID +#endif + #undef CAM_ALIAS + #undef CAM_LANES + + // Channel 2/acpi 3 (Sensing M3A MFP7 fsync) + #define DESCH_CH CH02 + #define DESCH_SER SER2 + #define DESCH_CAM CAM2 + #define DESCH_CH_PATH "\\_SB.PC00.DES0.CH02" + #define DESCH_SER_PATH "\\_SB.PC00.DES0.CH02.SER2" + #define DESCH_SER_REF \_SB.PC00.DES0.CH02.SER2 + #define DESCH_LINK_NUM 2 + #define DESCH_SER_I2C 0x40 + #define DESCH_SER_GPIOREF ^^SER2 + #define DESCH_SER_RESET_GPIO 0 + #define DESCH_SER_FSIN_GPIO 7 + #define DESCH_SER_FSYNC_RX_ID 7 + #define CAM_ALIAS 0x56 + #define CAM_LANES 4 + #include "_des_ch_common_m3a.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 +#ifdef DESCH_SER_RESET_GPIO + #undef DESCH_SER_RESET_GPIO +#endif +#ifdef DESCH_SER_FSIN_GPIO + #undef DESCH_SER_FSIN_GPIO +#endif +#ifdef DESCH_SER_FSYNC_RX_ID + #undef DESCH_SER_FSYNC_RX_ID +#endif + #undef CAM_ALIAS + #undef CAM_LANES + + // Channel 3/acpi 4 (Sensing M3A MFP7 fsync) + #define DESCH_CH CH03 + #define DESCH_SER SER3 + #define DESCH_CAM CAM3 + #define DESCH_CH_PATH "\\_SB.PC00.DES0.CH03" + #define DESCH_SER_PATH "\\_SB.PC00.DES0.CH03.SER3" + #define DESCH_SER_REF \_SB.PC00.DES0.CH03.SER3 + #define DESCH_LINK_NUM 3 + #define DESCH_SER_I2C 0x40 + #define DESCH_SER_GPIOREF ^^SER3 + #define DESCH_SER_RESET_GPIO 0 + #define DESCH_SER_FSIN_GPIO 7 + #define DESCH_SER_FSYNC_RX_ID 7 + #define CAM_ALIAS 0x57 + #define CAM_LANES 4 + #include "_des_ch_common_m3a.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 +#ifdef DESCH_SER_RESET_GPIO + #undef DESCH_SER_RESET_GPIO +#endif +#ifdef DESCH_SER_FSIN_GPIO + #undef DESCH_SER_FSIN_GPIO +#endif +#ifdef DESCH_SER_FSYNC_RX_ID + #undef DESCH_SER_FSYNC_RX_ID +#endif + #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 +#ifdef DES_FSIN_GPIO_PIN + #undef DES_FSIN_GPIO_PIN +#endif +#ifdef EXTERNAL_FRAME_SYNC + #undef EXTERNAL_FRAME_SYNC +#endif + } + + Device (DES1) + { + #define EXTERNAL_FRAME_SYNC 1 + + // DES-level defines for DES1 + #define DES_PHY_TYPE 0 + #define DES_I2C_ADDR 0x0027 + #define DES_LANES 2 + #define DES_INTERNAL_PHY 6 + #define DES_TO_MIPI_PORT 2 + #define DES_I2C_BUS "\\_SB.PC00.I2C1" + #define DES_PATH "\\_SB.PC00.DES1" + #define DES_REF \_SB.PC00.DES1 + #define DES_PIPE_STR_AUTOSELECT 0 + #define I2C_SPEED 100000 + #define DES_FSIN_GPIO_PIN 7 + #include "_des_common_max96724.asl" + + // Channel 1 (D457 MFP0 fsync) + #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.DES1.CH01" + #define DESCH_SER_PATH "\\_SB.PC00.DES1.CH01.SER1" + #define DESCH_SER_REF \_SB.PC00.DES1.CH01.SER1 + #define DESCH_SER_GPIOREF ^^SER1 + #define DESCH_SER_X_VC Package () { 0 } + #define DESCH_SER_Y_VC Package () { 1 } + #define DESCH_SER_Z_VC Package () { 2 } + #define DESCH_SER_U_VC Package () { 3 } + #define DESCH_SER_FSIN_GPIO 0 + #define DESCH_SER_FSIN_GPIO_2 1 + #define DESCH_SER_FSYNC_RX_ID 7 + #define CAM_ALIAS 0x55 + #define CAM_LANES 2 + #include "_des_ch_common_d457.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 + #undef DESCH_SER_X_VC + #undef DESCH_SER_Y_VC + #undef DESCH_SER_Z_VC + #undef DESCH_SER_U_VC +#ifdef DESCH_SER_FSIN_GPIO + #undef DESCH_SER_FSIN_GPIO +#endif +#ifdef DESCH_SER_FSIN_GPIO_2 + #undef DESCH_SER_FSIN_GPIO_2 +#endif +#ifdef DESCH_SER_FSYNC_RX_ID + #undef DESCH_SER_FSYNC_RX_ID +#endif + + // Clean up DES1-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 DES_PIPE_STR_AUTOSELECT +#ifdef DES_FSIN_GPIO_PIN + #undef DES_FSIN_GPIO_PIN +#endif +#ifdef EXTERNAL_FRAME_SYNC + #undef EXTERNAL_FRAME_SYNC +#endif + #undef I2C_SPEED + } + } +} diff --git a/acpi/ipu7/robinson_bay/_des_ch_common_m3a.asl b/acpi/ipu7/robinson_bay/_des_ch_common_m3a.asl new file mode 120000 index 00000000..62048e05 --- /dev/null +++ b/acpi/ipu7/robinson_bay/_des_ch_common_m3a.asl @@ -0,0 +1 @@ +../_des_ch_common_m3a.asl \ No newline at end of file diff --git a/acpi/ipu7/robinson_bay/_ser_common_max96717.asl b/acpi/ipu7/robinson_bay/_ser_common_max96717.asl new file mode 120000 index 00000000..42d338d0 --- /dev/null +++ b/acpi/ipu7/robinson_bay/_ser_common_max96717.asl @@ -0,0 +1 @@ +../_ser_common_max96717.asl \ No newline at end of file From d2624647c5e63190c1e88bde3af27588370b1d6b Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Thu, 17 Sep 2026 16:48:17 +0800 Subject: [PATCH 4/4] mc-setup.sh: Add support of max96717 serializer Add HID INTC1141 to serializer whitelist of mc-setup.sh script Signed-off-by: Yew, Chang Ching --- script/acpi/mc-setup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/script/acpi/mc-setup.sh b/script/acpi/mc-setup.sh index 58957623..3e73aa04 100755 --- a/script/acpi/mc-setup.sh +++ b/script/acpi/mc-setup.sh @@ -34,7 +34,8 @@ # INTC10CD = D4XX camera (entity prefixes: "DS5 mux", "D4XX depth/rgb/ir/imu") # INTC113C = ISX031 camera (entity prefix: "isx031") # OVTI13B1 = OV13B10 camera (entity prefix: "ov13b10") -# INTC1138 = MAX9295 / MAX96717 serializer (entity prefix: "max96717") +# INTC1138 = MAX9295 serializer (entity prefix: "max96717") +# INTC1141 = MAX96717 serializer (entity prefix: "max96717") # INTC1137 = MAX9296A deserializer (entity prefix: "max9296a") # INTC1139 = MAX96724 deserializer (entity prefix: "max96724") @@ -103,6 +104,7 @@ declare -A MIPI_SENSOR_HID=( # ---- Serializer / Deserializer HID -> v4l entity prefix --------------------- declare -A SER_PREFIX=( [INTC1138]="max96717" + [INTC1141]="max96717" ) declare -A DES_PREFIX=( [INTC1137]="max9296a"