Merge remote-tracking branch 'origin/develop-3.10' into develop-3.10-next
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / mali400 / mali / linux / mali_osk_mali.c
1 /*
2  * This confidential and proprietary software may be used only as
3  * authorised by a licensing agreement from ARM Limited
4  * (C) COPYRIGHT 2008-2013 ARM Limited
5  * ALL RIGHTS RESERVED
6  * The entire notice above must be reproduced on all authorised
7  * copies and copies may only be made to the extent permitted
8  * by a licensing agreement from ARM Limited.
9  */
10
11 /**
12  * @file mali_osk_mali.c
13  * Implementation of the OS abstraction layer which is specific for the Mali kernel device driver
14  */
15 #include <linux/kernel.h>
16 #include <asm/uaccess.h>
17 #include <linux/platform_device.h>
18 #include <linux/mali/mali_utgard.h>
19
20 #include "mali_osk_mali.h"
21 #include "mali_kernel_common.h" /* MALI_xxx macros */
22 #include "mali_osk.h"           /* kernel side OS functions */
23 #include "mali_kernel_linux.h"
24
25 static u32 _mali_osk_resource_irq(_mali_osk_resource_t *res)
26 {
27         int i;
28         char name[32];
29         struct resource *resource;
30
31         snprintf(name, sizeof(name), "%s_IRQ", res->description);
32         for (i = 0; i < mali_platform_device->num_resources; i++) {
33                 resource = &mali_platform_device->resource[i];
34                 if (IORESOURCE_IRQ == resource_type(resource) &&
35                     !strncmp(name, resource->name, sizeof(name)))
36                         return resource->start;
37         }
38
39         return -1;
40 }
41
42 _mali_osk_errcode_t _mali_osk_resource_find(u32 addr, _mali_osk_resource_t *res)
43 {
44         int i;
45
46         if (NULL == mali_platform_device) {
47                 /* Not connected to a device */
48                 return _MALI_OSK_ERR_ITEM_NOT_FOUND;
49         }
50
51         for (i = 0; i < mali_platform_device->num_resources; i++) {
52                 if (IORESOURCE_MEM == resource_type(&(mali_platform_device->resource[i])) &&
53                     mali_platform_device->resource[i].start == addr) {
54                         if (NULL != res) {
55                                 res->base = addr;
56                                 res->description = mali_platform_device->resource[i].name;
57
58                                 res->irq = _mali_osk_resource_irq(res);
59 #if 0
60                                 /* Any (optional) IRQ resource belonging to this resource will follow */
61                                 if ((i + 1) < mali_platform_device->num_resources &&
62                                     IORESOURCE_IRQ == resource_type(&(mali_platform_device->resource[i+1]))) {
63                                         res->irq = mali_platform_device->resource[i+1].start;
64                                 } else {
65                                         res->irq = -1;
66                                 }
67 #endif
68                         }
69                         return _MALI_OSK_ERR_OK;
70                 }
71         }
72
73         return _MALI_OSK_ERR_ITEM_NOT_FOUND;
74 }
75
76 u32 _mali_osk_resource_base_address(void)
77 {
78         u32 lowest_addr = 0xFFFFFFFF;
79         u32 ret = 0;
80
81         if (NULL != mali_platform_device) {
82                 int i;
83                 for (i = 0; i < mali_platform_device->num_resources; i++) {
84                         if (mali_platform_device->resource[i].flags & IORESOURCE_MEM &&
85                             mali_platform_device->resource[i].start < lowest_addr) {
86                                 lowest_addr = mali_platform_device->resource[i].start;
87                                 ret = lowest_addr;
88                         }
89                 }
90         }
91
92         return ret;
93 }
94
95 _mali_osk_errcode_t _mali_osk_device_data_get(struct _mali_osk_device_data *data)
96 {
97         MALI_DEBUG_ASSERT_POINTER(data);
98
99         if (NULL != mali_platform_device) {
100                 struct mali_gpu_device_data* os_data = NULL;
101
102                 os_data = (struct mali_gpu_device_data*)mali_platform_device->dev.platform_data;
103                 if (NULL != os_data) {
104                         /* Copy data from OS dependant struct to Mali neutral struct (identical!) */
105                         data->dedicated_mem_start = os_data->dedicated_mem_start;
106                         data->dedicated_mem_size = os_data->dedicated_mem_size;
107                         data->shared_mem_size = os_data->shared_mem_size;
108                         data->fb_start = os_data->fb_start;
109                         data->fb_size = os_data->fb_size;
110                         data->max_job_runtime = os_data->max_job_runtime;
111                         data->utilization_interval = os_data->utilization_interval;
112                         data->utilization_callback = os_data->utilization_callback;
113                         data->pmu_switch_delay = os_data->pmu_switch_delay;
114                         data->set_freq_callback = os_data->set_freq_callback;
115
116                         memcpy(data->pmu_domain_config, os_data->pmu_domain_config, sizeof(os_data->pmu_domain_config));
117                         return _MALI_OSK_ERR_OK;
118                 }
119         }
120
121         return _MALI_OSK_ERR_ITEM_NOT_FOUND;
122 }
123
124 mali_bool _mali_osk_shared_interrupts(void)
125 {
126         u32 irqs[128];
127         u32 i, j, irq, num_irqs_found = 0;
128
129         MALI_DEBUG_ASSERT_POINTER(mali_platform_device);
130         MALI_DEBUG_ASSERT(128 >= mali_platform_device->num_resources);
131
132         for (i = 0; i < mali_platform_device->num_resources; i++) {
133                 if (IORESOURCE_IRQ & mali_platform_device->resource[i].flags) {
134                         irq = mali_platform_device->resource[i].start;
135
136                         for (j = 0; j < num_irqs_found; ++j) {
137                                 if (irq == irqs[j]) {
138                                         return MALI_TRUE;
139                                 }
140                         }
141
142                         irqs[num_irqs_found++] = irq;
143                 }
144         }
145
146         return MALI_FALSE;
147 }