Re: RFC: How to deal with the INT3472 handshake GPIO found on Intel IPU6 MTL?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All,

On 30-Jan-25 4:34 PM, Hans de Goede wrote:
> Hi Sakari,
> 
> On 27-Jan-25 8:48 AM, sakari.ailus@xxxxxxxxxxxxxxx wrote:
>> Hi Hans,
>>
>> Thanks for your e-mail.
>>
>> On Wed, Jan 22, 2025 at 06:19:47PM +0100, Hans de Goede wrote:
>>> Hi All,
>>>
>>> Background / analysis:
>>> ----------------------
>>>
>>> New Intel Meteor Lake based laptops with IPU6 cameras have a new type 0x12
>>> pin defined in the INT3472 sensor companion device which describes
>>> the sensor's GPIOs.
>>>
>>> Based on what I know about this now, this pin seems to be used in at least
>>> 3 different scenarios:
>>>
>>> 1. To power-up / activate some unknown auxiliary IC on HP laptop designs
>>> where the sensor is directly connected to the main Meteor Lake SoC for
>>> I2C and GPIOs (no USB io-expander used). Example dyndbg int3472 output:
>>>
>>> HP Spectre x360 2-in-1 Laptop 16t-aa000/8C17, BIOS F.11 08/14/2024 (ov08x40):
>>> [    4.908016] int3472-discrete INT3472:01: unknown \_SB.GPI0 pin 65 active-high
>>> [    4.908019] int3472-discrete INT3472:01: GPIO type 0x12 unknown; the sensor may not work
>>> [    4.908100] int3472-discrete INT3472:01: privacy-led \_SB.GPI0 pin 107 active-high
>>> (and lsusb shows no Lattice NX## / Synaptics Sabre USB-io expander)
>>>
>>> 2. To make the Lattice chip in designs with the Lattice chip is used run
>>> the power-on sequence of the sensor which is handled by the Lattice chip
>>> firmware itself running the entire power-on/-down sequence when changing
>>> the GPIO value. Example dyndbg int3472 output:
>>>
>>> Dell Latitude 7450 (with patch to map handshake in INT3472) (ov02e10):
>>> [    5.110920] int3472-discrete INT3472:01: Sensor name OVTI02E1:00
>>> [    5.111908] int3472-discrete INT3472:01: Sensor module id: 'CIFNE24'
>>> [    5.113653] int3472-discrete INT3472:01: handshake \_SB.PC00.XHCI.RHUB.HS05.VGPO pin 0 active-high
>>> [    5.113676] int3472-discrete INT3472:01: privacy-led \_SB.PC00.XHCI.RHUB.HS05.VGPO pin 2 active-high
>>> (with 2ac1:20c9 Lattice NX33 USB IO-expander)
>>
>> The good thing is that there's a datasheet
>> <URL:https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/5726/FPGA-DS-02104-0-92-CrossLink-NX-33-and-CrossLink-NX-33U.pdf>
>> so we don't need to guess.
>>
>> Lattice NX-33 is more than an USB IO expenader. Most likely it acts as a
>> CSI-2 RX and CSI-2 TX and does something in between, like IVSC. It should
>> have its own driver, even if all it does is toggle GPIOs and sleep a
>> little.
> 
> I guess that what you mean is having something similar to:
> 
> drivers/media/pci/intel/ivsc/mei_csi.c
> 
> which just toggles the handshake GPIO on the s_stream() callback ?
> 
> That would require injecting the Lattice NX33 into the media fwnode
> graph similar to how we are doing this for the ivsc. But where
> the ivsc triggers this on there being an ACPI fwnode, there does
> not appear to be any ACPI fwnode for the NX33 at least not
> on Alan's laptop where we know the handshake signal is necessary.
> 
> https://github.com/intel/vision-drivers
> 
> suggests that the new chip shows up as an i2c device when it
> actually is mitm-ing the sensor and here is "ls /sys/bus/i2c/devices"
> output for Alan's laptop with the usbio-i2c driver loaded:
> 
> $ ls -l /sys/bus/i2c/devices
> total 0
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-1 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-1/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-10 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-1/i2c-10/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-11 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-2/i2c-11/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-12 -> ../../../devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-12/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-13 -> ../../../devices/pci0000:00/0000:00:15.3/i2c_designware.1/i2c-13/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-14 -> ../../../devices/pci0000:00/0000:00:1f.4/i2c-14/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-15 -> ../../../devices/pci0000:00/0000:00:14.0/usb3/3-5/3-5:1.0/usbio-i2c.2.auto/i2c-15/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-16 -> ../../../devices/pci0000:00/0000:00:14.0/usb3/3-5/3-5:1.0/usbio-i2c.3.auto/i2c-16/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-2 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-2/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-3 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-3/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-4 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-4/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-5 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-5/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-6 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-6/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-7 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-7/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-8 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-8/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-9 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/i2c-9/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-HIMX1092:00 -> ../../../devices/pci0000:00/0000:00:14.0/usb3/3-5/3-5:1.0/usbio-i2c.2.auto/i2c-15/i2c-HIMX1092:00/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-OVTI02E1:00 -> ../../../devices/pci0000:00/0000:00:14.0/usb3/3-5/3-5:1.0/usbio-i2c.3.auto/i2c-16/i2c-OVTI02E1:00/
> lrwxrwxrwx. 1 root root 0 Jan  6 08:46 i2c-VEN_0488:00 -> ../../../devices/pci0000:00/0000:00:15.3/i2c_designware.1/i2c-13/i2c-VEN_0488:00/
> 
> Notice there is no i2c device matching the devices expected by
> the vision-drivers.
> 
> I have heard that the X1 carbon gen 13 (lunar lake) does have
> such an i2c device.
> 
> So I think that the CSI pass-through functionality is not used
> on Alan's laptop.
> 
> Also the ivcs needed to be configured for number of CSI lanes +
> CSI frequency. That is not the case here. It is a fully opaque
> black box and Windows seems to treat it mostly as if it is
> not there at all.
> 
> I believe that it would be best to do the same as Windows and
> just make sure we toggle the handshake pin and otherwise forget
> about the chip being there. In my many years if experience with
> x86 hw primarily designed for Windows trying to behave differently
> from Windows only causes trouble.
> 
> If we were to try and model this as a separate v4l2-subdev
> in the media graph then then the questions become:
> 
> 1. When to inject such a node. The ivsc model of going by
> ACPI HID's very likely does not work (or maybe it does and
> we simply have not seen hw yet which actually uses the vision
> parts? That is what the vision-drivers git repo suggests).
> 
> Going by the presence of a handshake pin in the INT3472 device
> is riddled with problems:
> 
> a. It requires digging into the ACPI resources of a device
> not owned by the ipu-bridge code.
> 
> b. Given the HP laptop example, likely also Alan's laptop
> the presence of a handshake pin on meteor lake laptops does
> not seem to guarantee the CSI signals are actually MITM-ed
> by a chip, so we will likely create false-positives.
> 
> c. Some previous (alder/raptor lake) HP laptops advertise
> a handshake pin but already work since they seem to not use it,
> so more false-postive matches.
> 
> 2. Without an ACPI hid we have no struct-device/fwnode
> to use as parent for the extra v4l2-subdev, so what do we
> use for this ?
> 
> 3. What about models where the fwnode-s for the media graph
> come from ACPI MIPI discovery? We skip the ipu-bridge code
> there ...
> 
> Combining these issues with the fact that the interface
> is now just a single GPIO of which we do not exactly know
> what it does, where as with the ivsc we actually needed
> to program a CSI2 lane-count + link-freq I do not believe
> that modelling this unknown hw controlled by the handshake
> pin as an extra node on the media graph is the right thing
> to do.
> 
> ATM this feels much more like some power-sequencing thing,
> just one more regulator / clk / reset-pin which we need
> to set during power-up / -down.
> 
> If in the future we get models where the ACPI HIDs claimed by:
> https://github.com/intel/vision-drivers/blob/main/drivers/misc/icvs/intel_cvs.c#L720
> actually show up then we can revisit this. It might make
> sense to treat things like the ivsc setup in that case and
> then if those too use the type 0x12 GPIO on the INT3472
> device we can use the same code as used by the ipu-bridge
> to create the extra media graph nodes to opt out of mapping
> type 0x12 to a vdd supply.
> 
> Another solution would be to move even closer to what Windows
> does and switch the driver for the INT3472 ACPI device from
> mapping pins to gpio-lookups / clks / regulators to it controlling
> all the GPIOs listed in the INT3472 _DSM directly from runtime
> suspend/resume functions, using a runtime pm device link from
> the sensor to ensure that the INT3472 device is suspended / resumed
> at the right time.
> 
> This would also solve all of the mapping issues discussed in relation
> to the ov7251 driver expecting an "enable" pin. I believe that this
> would be the closest mirror of what Windows actually does and thus
> is what will work without issues / quirks on the most laptop models.
> 
>> Any thoughts, Bingbu?
>>
>>>
>>> 3. For unknown reason (ACPI table bug? / not actually used) there is
>>> a handshake type pin in the INT3472 device on some older HP models with
>>> a hi556 sensor connected directly to the Alder Lake or Raptor Lake SoC,
>>> see e.g. the dmesg from: https://linux-hardware.org/?probe=a9a2e2ab03 :
>>>
>>> [    9.077107] int3472-discrete INT3472:01: reset \_SB.GPI0 pin number mismatch _DSM 141 resource 301
>>> [    9.077170] int3472-discrete INT3472:01: power-enable \_SB.GPI0 pin number mismatch _DSM 142 resource 302
>>> [    9.086727] int3472-discrete INT3472:01: GPIO type 0x12 unknown; the sensor may not work
>>>
>>> which is from a model where it has been confirmed that the FOSS stack
>>> works already even though we have no handshake GPIO support yet.
>>>
>>> Testing has shown that for things to work in scenario 1. and 2. the 0x12 /
>>> handshake type pin needs to be driven high, followed by a msleep of 25 ms.
>>>
>>> The 25 ms was taken from the out of tree drivers which specify this as
>>> minimum sleep for the Lattice case. For the HP without Lattice, the default
>>> 1 ms post reset delay also is not enough see:
>>> https://lore.kernel.org/linux-media/1664997903.107383327.1734874558698.JavaMail.zimbra@xxxxxxxxxx/
>>
>> Maybe that 25 ms is required for booting whatever runs on NX-33?
> 
> Yes the comments in the out of tree driver refer to this being
> related to the Lattice fw.
> 
>>> This applies to both the HP Spectre x360 16t without Lattice chip and
>>> the Dell Latitude 7450 with Lattice chip.
>>>
>>> I suspect that there might be some micro-controller or something running
>>> the power-on sequence in the HP Spectre x360 16t case too, but there it
>>> is just a standalone chip responding to the GPIO, not an USB attached chip
>>> also offering, e.g. an I2C + GPIO controller like the Lattice chip.
>>
>> So there's nothing unusual there in terms of USB devices there?
>>
>> Would you be able to dump the ACPI tables from the HP machine? (I don't
>> mind Dell either.)
> 
> I have attached an acpidump from a HP Spectre x360 14-eu0xxx where
> the handshake pin appears to be necessary but there is no lattice chip here:
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=2333331
> 
> Alan can you send Sakari an acpidump of your laptop ?
> 
> <snip>
> 
>> I'll need to dig a bit further, hoping to find out what that special GPIO
>> 0x12 is.
> 
> Between this and the pin mapping discussion before I'm more and more
> convinced that we are going all wrong about this.
> 
> The INT3472 device seems to purely be a power-sequencing device which
> I believe has its own driver separate from the sensor drivers under
> Windows and the ACPI _DEP link ensures that it gets powered-up before
> the sensor device does.
> 
> We really should use this fw API as intended and simply have
> the INT3472 driver directly control the GPIOs from its own runtime
> suspend/resume methods and use a runtime-pm link to ensure
> the INT3472 device gets runtime-resumed before the sensor device
> gets runtime-resumed.
> 
> This requires basically rewriting:
> drivers/platform/x86/intel/int3472/discrete.c
> but I believe that the end result will be cleaner / smaller and this
> should solve most problems surrounding this code once and for all
> avoiding us to have to revisit things all the time to work around
> the mismatch in expectations between the ACPI tables on Windows
> laptops and the devicetree-like setup the sensor drivers expect.

One remark about my idea to turn the INT3472 discrete driver into
a power-sequencing driver and have it control all the GPIOs +
timing itself. Using runtime suspend/resume with runtime-pm
device links will not work since the i2c_client does not exist
yet when the INT3472 driver binds and adding the links later
is troublesome since as soon as the i2c_client is there
the sensor driver my bind and that may want to power-up
the sensor during probe().

So instead I think we should go with Sakari's suggestion from:
https://lore.kernel.org/platform-driver-x86/Z49V5CqEt6H96LvJ@kekkonen.localdomain/

to use a virtual GPIO controller offering a "reset" or
"enable" con_id GPIO to the sensor and then do the
power-sequencing based on that GPIO being set low/high by
the sensor driver.

Regards,

Hans







[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux