Skip to content

Commit ee4c76c

Browse files
committed
media: apple: isp: Parse firmware version from device tree
Required since t8112-isp uses a 32-bit address in the CISP_CMD_CH_SET_FILE_LOAD command with the macOS 12.4 firmware. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent e937468 commit ee4c76c

3 files changed

Lines changed: 81 additions & 1 deletion

File tree

drivers/media/platform/apple/isp/isp-cmd.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/* Copyright 2023 Eileen Yoon <eyn@gmx.com> */
33

44
#include "isp-cmd.h"
5+
#include "isp-drv.h"
56
#include "isp-iommu.h"
67
#include "isp-ipc.h"
78

@@ -261,7 +262,7 @@ int isp_cmd_ch_buffer_return(struct apple_isp *isp, u32 chan)
261262
int isp_cmd_ch_set_file_load(struct apple_isp *isp, u32 chan, u64 addr,
262263
u32 size)
263264
{
264-
if (isp->hw->gen >= ISP_GEN_T8112) {
265+
if (isp->fw_compat >= ISP_FIRMWARE_V_13_5) {
265266
struct cmd_ch_set_file_load64 args = {
266267
.opcode = CISP_OPCODE(CISP_CMD_CH_SET_FILE_LOAD),
267268
.chan = chan,

drivers/media/platform/apple/isp/isp-drv.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,72 @@ static int apple_isp_init_presets(struct apple_isp *isp)
215215
return 0;
216216
}
217217

218+
static const char * isp_fw2str(enum isp_firmware_version version)
219+
{
220+
switch (version) {
221+
case ISP_FIRMWARE_V_12_3:
222+
return "12.3";
223+
case ISP_FIRMWARE_V_12_4:
224+
return "12.4";
225+
case ISP_FIRMWARE_V_13_5:
226+
return "13.5";
227+
default:
228+
return "unknown";
229+
}
230+
}
231+
232+
#define ISP_FW_VERSION_MIN_LEN 3
233+
#define ISP_FW_VERSION_MAX_LEN 5
234+
235+
static enum isp_firmware_version isp_read_fw_version(struct device *dev,
236+
const char *name)
237+
{
238+
u32 ver[ISP_FW_VERSION_MAX_LEN];
239+
int len = of_property_read_variable_u32_array(dev->of_node, name, ver,
240+
ISP_FW_VERSION_MIN_LEN,
241+
ISP_FW_VERSION_MAX_LEN);
242+
243+
switch (len) {
244+
case 3:
245+
if (ver[0] == 12 && ver[1] == 3 && ver[2] <= 1)
246+
return ISP_FIRMWARE_V_12_3;
247+
else if (ver[0] == 12 && ver[1] == 4 && ver[2] == 0)
248+
return ISP_FIRMWARE_V_12_4;
249+
else if (ver[0] == 13 && ver[1] == 5 && ver[2] == 0)
250+
return ISP_FIRMWARE_V_13_5;
251+
252+
dev_warn(dev, "unknown %s: %d.%d.%d\n", name, ver[0], ver[1], ver[2]);
253+
break;
254+
case 4:
255+
dev_warn(dev, "unknown %s: %d.%d.%d.%d\n", name, ver[0], ver[1],
256+
ver[2], ver[3]);
257+
break;
258+
case 5:
259+
dev_warn(dev, "unknown %s: %d.%d.%d.%d.%d\n", name, ver[0],
260+
ver[1], ver[2], ver[3], ver[4]);
261+
break;
262+
default:
263+
dev_warn(dev, "could not parse %s: %d\n", name, len);
264+
break;
265+
}
266+
267+
return ISP_FIRMWARE_V_UNKNOWN;
268+
}
269+
270+
static enum isp_firmware_version isp_check_firmware_version(struct device *dev)
271+
{
272+
enum isp_firmware_version version, compat;
273+
274+
/* firmware version is just informative */
275+
version = isp_read_fw_version(dev, "apple,firmware-version");
276+
compat = isp_read_fw_version(dev, "apple,firmware-compat");
277+
278+
dev_info(dev, "ISP firmware-compat: %s (FW: %s)\n", isp_fw2str(compat),
279+
isp_fw2str(version));
280+
281+
return compat;
282+
}
283+
218284
static int apple_isp_probe(struct platform_device *pdev)
219285
{
220286
struct device *dev = &pdev->dev;
@@ -234,6 +300,11 @@ static int apple_isp_probe(struct platform_device *pdev)
234300
platform_set_drvdata(pdev, isp);
235301
dev_set_drvdata(dev, isp);
236302

303+
/* Differences between firmware versions are rather minor so try to work
304+
* with unknown firmware.
305+
*/
306+
isp->fw_compat = isp_check_firmware_version(dev);
307+
237308
err = of_property_read_u32(dev->of_node, "apple,platform-id",
238309
&isp->platform_id);
239310
if (err) {

drivers/media/platform/apple/isp/isp-drv.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ enum isp_generation {
3232
ISP_GEN_T8112,
3333
};
3434

35+
enum isp_firmware_version {
36+
ISP_FIRMWARE_V_UNKNOWN,
37+
ISP_FIRMWARE_V_12_3,
38+
ISP_FIRMWARE_V_12_4,
39+
ISP_FIRMWARE_V_13_5,
40+
};
41+
3542
struct isp_surf {
3643
struct drm_mm_node *mm;
3744
struct list_head head;
@@ -180,6 +187,7 @@ struct isp_format {
180187
struct apple_isp {
181188
struct device *dev;
182189
const struct apple_isp_hw *hw;
190+
enum isp_firmware_version fw_compat;
183191
u32 platform_id;
184192
u32 temporal_filter;
185193
struct isp_preset *presets;

0 commit comments

Comments
 (0)