// SPDX-License-Identifier: GPL-2.0 or MIT
/* Copyright 2025 ARM Limited. All rights reserved. */
+#include <linux/nvmem-consumer.h>
#include <drm/drm_print.h>
#include "panthor_device.h"
return "(Unknown Mali GPU)";
}
-static void panthor_gpu_info_init(struct panthor_device *ptdev)
+static int overload_shader_present(struct panthor_device *ptdev)
+{
+ u64 contents;
+ int ret;
+
+ ret = nvmem_cell_read_variable_le_u64(ptdev->base.dev, "shader-present",
+ &contents);
+ if (!ret)
+ ptdev->gpu_info.shader_present = contents;
+ else if (ret == -ENOENT)
+ return 0;
+ else
+ return dev_err_probe(ptdev->base.dev, ret,
+ "Failed to read shader-present nvmem cell\n");
+
+ return 0;
+}
+
+static int panthor_gpu_info_init(struct panthor_device *ptdev)
{
unsigned int i;
ptdev->gpu_info.tiler_present = gpu_read64(ptdev, GPU_TILER_PRESENT);
ptdev->gpu_info.l2_present = gpu_read64(ptdev, GPU_L2_PRESENT);
}
+
+ return overload_shader_present(ptdev);
}
-static void panthor_hw_info_init(struct panthor_device *ptdev)
+static int panthor_hw_info_init(struct panthor_device *ptdev)
{
u32 major, minor, status;
+ int ret;
- panthor_gpu_info_init(ptdev);
+ ret = panthor_gpu_info_init(ptdev);
+ if (ret)
+ return ret;
major = GPU_VER_MAJOR(ptdev->gpu_info.gpu_id);
minor = GPU_VER_MINOR(ptdev->gpu_info.gpu_id);
"shader_present=0x%0llx l2_present=0x%0llx tiler_present=0x%0llx",
ptdev->gpu_info.shader_present, ptdev->gpu_info.l2_present,
ptdev->gpu_info.tiler_present);
+
+ return 0;
}
static int panthor_hw_bind_device(struct panthor_device *ptdev)
if (ret)
return ret;
- panthor_hw_info_init(ptdev);
-
- return 0;
+ return panthor_hw_info_init(ptdev);
}