Hi all, This patch series contains fixes for atomisp to work (again). Tested on Microsoft Surface 3 (Windows) and Xiaomi Mi Pad 2 (Android model) with v5.15-rc5. Both are Cherry Trail (ISP2401) devices. I'm still not used to Linux patch sending flow. Sorry in advance if there is some weirdness :-) but I did my best. I'll send another series that contains RFC patches later named ("bug reports for atomisp to make it work"). To try to capture images, applying those RFC patches are also needed. The following 1st-7th patches are fixes for the upstreamed atomisp: media: atomisp: pci: add missing media_device_cleanup() in atomisp_unregister_entities() media: atomisp: pci: fix punit_ddr_dvfs_enable() argument for mrfld_power up case media: atomisp: pci: fix inverted logic in buffers_needed() media: atomisp: pci: do not use err var when checking port validity for ISP2400 media: atomisp: pci: fix inverted error check for ia_css_mipi_is_source_port_valid() media: atomisp: pci: use IA_CSS_ERROR() for error messages in sh_css_mipi.c media: atomisp: pci: fix ifdefs in sh_css.c The following 8th-13th patches partially reverts driver version back to irci_stable_candrpv_0415_20150521_0458: media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 1/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 2/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 3/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 4/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 5/5 media: atomisp: pci: release_version is now irci_stable_candrpv_0415_20150521_0458 One of the issues on the upstreamed atomisp is, the driver is a result of the following two different versions of driver merged by tools using `ifdef ISP2401`: - ISP2400: irci_stable_candrpv_0415_20150521_0458 - ISP2401: irci_master_20150911_0724 and we don't have such firmware made for irci_master_20150911_0724. I confirmed that the driver version irci_stable_candrpv_0415_20150521_0458 works well on the intel-aero version atomisp for ISP2401, too. Here is my port, if someone is interested [2]: So, eventually, such ISP version tests caused by just the driver version difference can be removed (not just being unified but removed). That said, it may take longer time until we remove such tests. So, for now I thought it may be better to focus on just making atomisp work by partially reverting the incompatible things for the firmware version irci_stable_candrpv_0415_20150521_0458. I added a little bit further note about ifdefs below. Take a look at ("## about (a lot of) ISP2401 ifdef tests"). The following 14th patch is to remove the "trace_printk() being used" kernel warning message: media: atomisp: pci: Remove remaining instance of call to trace_printk The following 15th-16th patch adds ACPI variables to atomsip_gmin_platform because surface3 does not describe the variables in DSDT or EFI. I added the second patch marked as "[NOT-FOR-MERGE]" for a surface3 that its DMI table is broken. I know this is just a HACK but included it anyway just for the record. media: atomsip: pci: add Microsoft Surface 3 ACPI vars [NOT-FOR-MERGE] media: atomsip: pci: add DMI match for Microsoft Surface 3 with broken DMI (OEMB) The following last patch is from Alan [1] about 4 years ago. I didn't write this patch in any way but this patch is required for atomisp to work normally. So, I added this just for convenience and reminder. If possible, could someone look into this patch again? [NOT-FOR-MERGE] atomisp: Fix up the open v load race [1] https://lore.kernel.org/linux-media/151001137594.77201.4306351721772580664.stgit@alans-desktop/ [2] You can try, but don't have to look into it; I'll try to describe what is needed in this mail: https://github.com/kitakar5525/linux-kernel/commits/mainline+aero_atomisp_wo_kapi_changes-2021-10-11 ## taking a picture with atomisp Note that to try to take a picture, please also apply at least the this RFC patch ("[BUG][RFC] media: atomisp: pci: assume run_mode is PREVIEW") I'll send as almost a BUG report later. You need to use firmware version irci_stable_candrpv_0415_20150521_0458, which is available from the intel-aero [1] The atomisp (ipu2), like the ipu3, needs userspace support. The libcamera has now decent ipu3 support but does not have atomisp support yet. I found some userspace tools for atomisp that run on Linux: - capturev4l2 from intel-aero/sample-apps (https://github.com/intel-aero/sample-apps/tree/master/capturev4l2) - hd-camera from intel-aero/sample-apps (https://github.com/intel-aero/sample-apps/tree/master/hd-camera) - intel/nvt (https://github.com/intel/nvt) It looks like the nvt is the most feature-rich, like exposure and white balance. Note that current upstreamed atomisp dropped 32-bit support. So, you need to build it with `-m64` (change it in Makefile). Here is the example of usage I use on mipad2: $ ./v4l2n -o testimage_@.raw \ --device /dev/video2 \ --input 0 \ --exposure=30000,30000,30000,30000 \ --parm type=1,capturemode=CI_MODE_PREVIEW \ --fmt type=1,width=1920,height=1080,pixelformat=NV12 \ --reqbufs count=2,memory=USERPTR \ --parameters=wb_config.r=32768,wb_config.gr=21043,wb_config.gb=21043,wb_config.b=30863 \ --capture=2 \ ./raw2pnm -x1920 -y1080 -fNV12 testimage_001.raw testimage_001.pnm feh *.pnm # open the converted image rm testimage* Note that I see the following warn/err after capture: kern :warn : [72660.793335] atomisp-isp2 0000:00:03.0: stop stream timeout. kern :err : [72660.973629] atomisp-isp2 0000:00:03.0: atomisp_reset but I see the same message on the Android kernel, too. So, I think this is not a real issue (I hope). [1] https://github.com/intel-aero/meta-intel-aero-base/tree/master/recipes-kernel/linux/linux-yocto filename shisp_2401a0_v21.bin ## about (a lot of) ISP2401 ifdef tests When porting intel-aero version atomisp to mainline, I thought almost all the `ifdef ISP2401` things are the result of two different driver version merged by tools. To confirm that, I tried removing ifdefs for the initial commit of upstreamed atomisp [1]. And I can successfully take a picture there on surface3. Currently, I can remove ifdefs up to commit bd674b5a413c ("media: atomisp: cleanup ifdefs from ia_css_debug.c") [2] which is before 641c2292bf19 ("media: atomisp: get rid of version-dependent globals"). Up to there, I stopped and realized it may take some time to remove ifdefs for current atomisp. So, instead of removing ifdefs, I partially reverted incompatible parts in this series for now. The ifdefs for the real hardware difference is like the following which were removed or integrated into `ifdef ISP2401` on commit 641c2292bf19 ("media: atomisp: get rid of version-dependent globals") and bd674b5a413c ("media: atomisp: cleanup ifdefs from ia_css_debug.c"): - HAS_NO_INPUT_FORMATTER - USE_INPUT_SYSTEM_VERSION_2 - USE_INPUT_SYSTEM_VERSION_2401 ... I need to elaborate on this ifdef thing later (and I'll do later), but for now, let's focus on make it just work... [1] https://github.com/kitakar5525/linux-kernel/commits/mainline+upst_atomisp@a49d25364dfb_first Note that many of the commits are backports to make it build on the mainline; commits that remove ifdefs are in the 2nd page. [2] https://github.com/kitakar5525/linux-kernel/commits/mainline+upst_atomisp@bd674b5a413c_before_get_rid_ver_globals ## for surface3 (and some crystal cove pmic based devices) For devices which use intel_pmic_bytcrc driver, you need to add i2c address. I sent RFC patch earlier named ("ACPI / PMIC: Add i2c address to intel_pmic_bytcrc driver"). Also, sensor drivers are not upstream. Take a look at my working tree if someone is interested [1]. I made world-facing camera (OV8835) work, which the driver is from the old Android kernel tree. Unfortunately, the user-facing camera (AR0330) is not working yet; the output is completely black. I'm not sure why, maybe the sensor power issue (atomisp_gmin_platform) or sensor driver issue, which the driver is from non-atomisp driver. [1] https://github.com/kitakar5525/linux-kernel/commits/mainline+upst_atomisp ## for mipad2 (and whiskey cove pmic based devices) For devices which equip whiskey cove PMIC, you need to add non-upstream regulator driver [1]. [1] work done by jekhor, which seems to be from intel-aero or old Android kernel https://github.com/jekhor/yogabook-linux-kernel/commit/11c05b365fb2eeb4fced5aa66b362c511be32a34 ("intel_soc_pmic_chtwc: Add regulator driver and definition for VPROG1B") Regards, Tsuchiya Yuto Alan (1): [NOT-FOR-MERGE] atomisp: Fix up the open v load race Tsuchiya Yuto (16): media: atomisp: pci: add missing media_device_cleanup() in atomisp_unregister_entities() media: atomisp: pci: fix punit_ddr_dvfs_enable() argument for mrfld_power up case media: atomisp: pci: fix inverted logic in buffers_needed() media: atomisp: pci: do not use err var when checking port validity for ISP2400 media: atomisp: pci: fix inverted error check for ia_css_mipi_is_source_port_valid() media: atomisp: pci: use IA_CSS_ERROR() for error messages in sh_css_mipi.c media: atomisp: pci: fix ifdefs in sh_css.c media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 1/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 2/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 3/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 4/5 media: atomisp: pci: make fw ver irci_stable_candrpv_0415_20150521_0458 work - 5/5 media: atomisp: pci: release_version is now irci_stable_candrpv_0415_20150521_0458 media: atomisp: pci: Remove remaining instance of call to trace_printk media: atomsip: pci: add Microsoft Surface 3 ACPI vars [NOT-FOR-MERGE] media: atomsip: pci: add DMI match for Microsoft Surface 3 with broken DMI (OEMB) .../media/atomisp/pci/atomisp_compat_css20.c | 10 --- .../staging/media/atomisp/pci/atomisp_fops.c | 12 ++++ .../media/atomisp/pci/atomisp_gmin_platform.c | 30 ++++++++ .../media/atomisp/pci/atomisp_internal.h | 5 ++ .../staging/media/atomisp/pci/atomisp_v4l2.c | 19 ++++-- .../pci/camera/pipe/src/pipe_binarydesc.c | 5 -- .../css_2401_system/hive/ia_css_isp_params.c | 23 ------- .../media/atomisp/pci/ia_css_acc_types.h | 5 -- .../media/atomisp/pci/ia_css_isp_configs.h | 8 --- .../media/atomisp/pci/ia_css_isp_params.h | 3 - .../media/atomisp/pci/ia_css_pipe_public.h | 3 - .../pci/isp/kernels/hdr/ia_css_hdr.host.c | 1 - .../pci/isp/kernels/hdr/ia_css_hdr.host.h | 1 - .../pci/isp/kernels/hdr/ia_css_hdr_param.h | 1 - .../pci/isp/kernels/hdr/ia_css_hdr_types.h | 1 - .../isp/kernels/sc/sc_1.0/ia_css_sc.host.c | 68 ------------------- .../isp/kernels/sc/sc_1.0/ia_css_sc.host.h | 33 --------- .../isp/kernels/sc/sc_1.0/ia_css_sc_types.h | 14 ---- .../atomisp/pci/isp2401_input_system_global.h | 12 ---- .../runtime/binary/interface/ia_css_binary.h | 1 - .../atomisp/pci/runtime/binary/src/binary.c | 14 ---- .../pci/runtime/isys/src/virtual_isys.c | 11 --- drivers/staging/media/atomisp/pci/sh_css.c | 31 +++------ .../media/atomisp/pci/sh_css_firmware.c | 16 +---- .../media/atomisp/pci/sh_css_internal.h | 8 --- .../staging/media/atomisp/pci/sh_css_mipi.c | 67 +++++++++--------- drivers/staging/media/atomisp/pci/sh_css_sp.c | 22 ------ 27 files changed, 104 insertions(+), 320 deletions(-) -- 2.33.1