xref: /OK3568_Linux_fs/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_gpu.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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