1 /*
2 *
3 * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
4 *
5 * This program is free software and is provided to you under the terms of the
6 * GNU General Public License version 2 as published by the Free Software
7 * Foundation, and any use by you of this program is subject to the terms
8 * of such GNU licence.
9 *
10 * A copy of the licence is included with the program, and can also be obtained
11 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12 * Boston, MA 02110-1301, USA.
13 *
14 */
15
16
17
18
19 /*
20 * Register-based HW access backend APIs
21 */
22 #include <mali_kbase.h>
23 #include <mali_kbase_hwaccess_backend.h>
24 #include <backend/gpu/mali_kbase_irq_internal.h>
25 #include <backend/gpu/mali_kbase_jm_internal.h>
26 #include <backend/gpu/mali_kbase_js_internal.h>
27 #include <backend/gpu/mali_kbase_pm_internal.h>
28
kbase_backend_early_init(struct kbase_device * kbdev)29 int kbase_backend_early_init(struct kbase_device *kbdev)
30 {
31 int err;
32
33 err = kbasep_platform_device_init(kbdev);
34 if (err)
35 return err;
36
37 /* Ensure we can access the GPU registers */
38 kbase_pm_register_access_enable(kbdev);
39
40 /* Find out GPU properties based on the GPU feature registers */
41 kbase_gpuprops_set(kbdev);
42
43 /* We're done accessing the GPU registers for now. */
44 kbase_pm_register_access_disable(kbdev);
45
46 err = kbase_hwaccess_pm_init(kbdev);
47 if (err)
48 goto fail_pm;
49
50 err = kbase_install_interrupts(kbdev);
51 if (err)
52 goto fail_interrupts;
53
54 return 0;
55
56 fail_interrupts:
57 kbase_hwaccess_pm_term(kbdev);
58 fail_pm:
59 kbasep_platform_device_term(kbdev);
60
61 return err;
62 }
63
kbase_backend_early_term(struct kbase_device * kbdev)64 void kbase_backend_early_term(struct kbase_device *kbdev)
65 {
66 kbase_release_interrupts(kbdev);
67 kbase_hwaccess_pm_term(kbdev);
68 kbasep_platform_device_term(kbdev);
69 }
70
kbase_backend_late_init(struct kbase_device * kbdev)71 int kbase_backend_late_init(struct kbase_device *kbdev)
72 {
73 int err;
74
75 err = kbase_hwaccess_pm_powerup(kbdev, PM_HW_ISSUES_DETECT);
76 if (err)
77 return err;
78
79 err = kbase_backend_timer_init(kbdev);
80 if (err)
81 goto fail_timer;
82
83 #ifdef CONFIG_MALI_DEBUG
84 #ifndef CONFIG_MALI_NO_MALI
85 if (kbasep_common_test_interrupt_handlers(kbdev) != 0) {
86 dev_err(kbdev->dev, "Interrupt assigment check failed.\n");
87 err = -EINVAL;
88 goto fail_interrupt_test;
89 }
90 #endif /* !CONFIG_MALI_NO_MALI */
91 #endif /* CONFIG_MALI_DEBUG */
92
93 err = kbase_job_slot_init(kbdev);
94 if (err)
95 goto fail_job_slot;
96
97 init_waitqueue_head(&kbdev->hwaccess.backend.reset_wait);
98
99 return 0;
100
101 fail_job_slot:
102
103 #ifdef CONFIG_MALI_DEBUG
104 #ifndef CONFIG_MALI_NO_MALI
105 fail_interrupt_test:
106 #endif /* !CONFIG_MALI_NO_MALI */
107 #endif /* CONFIG_MALI_DEBUG */
108
109 kbase_backend_timer_term(kbdev);
110 fail_timer:
111 kbase_hwaccess_pm_halt(kbdev);
112
113 return err;
114 }
115
kbase_backend_late_term(struct kbase_device * kbdev)116 void kbase_backend_late_term(struct kbase_device *kbdev)
117 {
118 kbase_job_slot_halt(kbdev);
119 kbase_job_slot_term(kbdev);
120 kbase_backend_timer_term(kbdev);
121 kbase_hwaccess_pm_halt(kbdev);
122 }
123
124