summaryrefslogtreecommitdiff
path: root/mali_kbase
diff options
context:
space:
mode:
authorAnkit Goyal <layog@google.com>2023-01-10 15:52:57 -0800
committerJack Diver <diverj@google.com>2023-04-13 15:14:35 +0000
commitd7993a262e8c1feb701c8061dc89d4702c91777e (patch)
tree17cd4fd3fcb173278f59ab66eb4c489c8d2707b7 /mali_kbase
parentf374dceb0feb56cde9341bfbc39ed6c632bde8f3 (diff)
downloadgpu-d7993a262e8c1feb701c8061dc89d4702c91777e.tar.gz
Add partial term support to pixel gpu init
Bug: 254279889 Test: Boots to home Signed-off-by: Jack Diver <diverj@google.com> (cherry picked from https://partner-android-review.googlesource.com/q/commit:08be62386b8b087e1979c0396a23847246ca36bb) Change-Id: I1427019107b67139381390a5a73bf518b99927c8
Diffstat (limited to 'mali_kbase')
-rw-r--r--mali_kbase/platform/pixel/pixel_gpu.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/mali_kbase/platform/pixel/pixel_gpu.c b/mali_kbase/platform/pixel/pixel_gpu.c
index c85311d..14a5e3f 100644
--- a/mali_kbase/platform/pixel/pixel_gpu.c
+++ b/mali_kbase/platform/pixel/pixel_gpu.c
@@ -222,6 +222,24 @@ static void gpu_pixel_kctx_term(struct kbase_context *kctx)
kctx->platform_data = NULL;
}
+static const struct kbase_device_init dev_init[] = {
+ { gpu_pm_init, gpu_pm_term, "PM init failed" },
+#ifdef CONFIG_MALI_MIDGARD_DVFS
+ { gpu_dvfs_init, gpu_dvfs_term, "DVFS init failed" },
+#endif
+ { gpu_sysfs_init, gpu_sysfs_term, "sysfs init failed" },
+ { gpu_sscd_init, gpu_sscd_term, "SSCD init failed" },
+};
+
+static void gpu_pixel_term_partial(struct kbase_device *kbdev,
+ unsigned int i)
+{
+ while (i-- > 0) {
+ if (dev_init[i].term)
+ dev_init[i].term(kbdev);
+ }
+}
+
/**
* gpu_pixel_init() - Initializes the Pixel integration for the Mali GPU.
*
@@ -231,8 +249,8 @@ static void gpu_pixel_kctx_term(struct kbase_context *kctx)
*/
static int gpu_pixel_init(struct kbase_device *kbdev)
{
- int ret;
-
+ int ret = 0;
+ unsigned int i;
struct pixel_context *pc;
pc = kzalloc(sizeof(struct pixel_context), GFP_KERNEL);
@@ -245,30 +263,22 @@ static int gpu_pixel_init(struct kbase_device *kbdev)
kbdev->platform_context = pc;
pc->kbdev = kbdev;
- ret = gpu_pm_init(kbdev);
- if (ret)
- goto done;
-
-#ifdef CONFIG_MALI_MIDGARD_DVFS
- ret = gpu_dvfs_init(kbdev);
- if (ret) {
- dev_err(kbdev->dev, "DVFS init failed\n");
- goto done;
- }
-#endif /* CONFIG_MALI_MIDGARD_DVFS */
-
- ret = gpu_sysfs_init(kbdev);
- if (ret) {
- dev_err(kbdev->dev, "sysfs init failed\n");
- goto done;
+ for (i = 0; i < ARRAY_SIZE(dev_init); i++) {
+ if (dev_init[i].init) {
+ ret = dev_init[i].init(kbdev);
+ if (ret) {
+ dev_err(kbdev->dev, "%s error = %d\n",
+ dev_init[i].err_mes, ret);
+ break;
+ }
+ }
}
- ret = gpu_sscd_init(kbdev);
if (ret) {
- dev_err(kbdev->dev, "SSCD init failed\n");
- goto done;
+ gpu_pixel_term_partial(kbdev, i);
+ kbdev->platform_context = NULL;
+ kfree(pc);
}
- ret = 0;
done:
return ret;
@@ -283,11 +293,7 @@ static void gpu_pixel_term(struct kbase_device *kbdev)
{
struct pixel_context *pc = kbdev->platform_context;
- gpu_sscd_term(kbdev);
- gpu_sysfs_term(kbdev);
- gpu_dvfs_term(kbdev);
- gpu_pm_term(kbdev);
-
+ gpu_pixel_term_partial(kbdev, ARRAY_SIZE(dev_init));
kbdev->platform_context = NULL;
kfree(pc);
}