tizen 2.4 release
[kernel/linux-3.0.git] / drivers / gpu / arm / mali400 / r4p0_rel0 / common / mali_hw_core.h
1 /*
2  * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
3  * 
4  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
5  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
6  * 
7  * A copy of the licence is included with the program, and can also be obtained from Free Software
8  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
9  */
10
11 #ifndef __MALI_HW_CORE_H__
12 #define __MALI_HW_CORE_H__
13
14 #include "mali_osk.h"
15 #include "mali_kernel_common.h"
16
17 /**
18  * The common parts for all Mali HW cores (GP, PP, MMU, L2 and PMU)
19  * This struct is embedded inside all core specific structs.
20  */
21 struct mali_hw_core {
22         u32 phys_addr;                    /**< Physical address of the registers */
23         u32 phys_offset;                  /**< Offset from start of Mali to registers */
24         u32 size;                         /**< Size of registers */
25         mali_io_address mapped_registers; /**< Virtual mapping of the registers */
26         const char* description;          /**< Name of unit (as specified in device configuration) */
27 };
28
29 #define MALI_REG_POLL_COUNT_FAST 1000
30 #define MALI_REG_POLL_COUNT_SLOW 1000000
31
32 _mali_osk_errcode_t mali_hw_core_create(struct mali_hw_core *core, const _mali_osk_resource_t *resource, u32 reg_size);
33 void mali_hw_core_delete(struct mali_hw_core *core);
34
35 MALI_STATIC_INLINE u32 mali_hw_core_register_read(struct mali_hw_core *core, u32 relative_address)
36 {
37         u32 read_val;
38         read_val = _mali_osk_mem_ioread32(core->mapped_registers, relative_address);
39         MALI_DEBUG_PRINT(6, ("register_read for core %s, relative addr=0x%04X, val=0x%08X\n",
40                              core->description, relative_address, read_val));
41         return read_val;
42 }
43
44 MALI_STATIC_INLINE void mali_hw_core_register_write_relaxed(struct mali_hw_core *core, u32 relative_address, u32 new_val)
45 {
46         MALI_DEBUG_PRINT(6, ("register_write_relaxed for core %s, relative addr=0x%04X, val=0x%08X\n",
47                              core->description, relative_address, new_val));
48         _mali_osk_mem_iowrite32_relaxed(core->mapped_registers, relative_address, new_val);
49 }
50
51 /* Conditionally write a register.
52  * The register will only be written if the new value is different from the old_value.
53  * If the new value is different, the old value will also be updated */
54 MALI_STATIC_INLINE void mali_hw_core_register_write_relaxed_conditional(struct mali_hw_core *core, u32 relative_address, u32 new_val, const u32 old_val)
55 {
56         MALI_DEBUG_PRINT(6, ("register_write_relaxed for core %s, relative addr=0x%04X, val=0x%08X\n",
57                              core->description, relative_address, new_val));
58         if(old_val != new_val) {
59                 _mali_osk_mem_iowrite32_relaxed(core->mapped_registers, relative_address, new_val);
60         }
61 }
62
63
64 MALI_STATIC_INLINE void mali_hw_core_register_write(struct mali_hw_core *core, u32 relative_address, u32 new_val)
65 {
66         MALI_DEBUG_PRINT(6, ("register_write for core %s, relative addr=0x%04X, val=0x%08X\n",
67                              core->description, relative_address, new_val));
68         _mali_osk_mem_iowrite32(core->mapped_registers, relative_address, new_val);
69 }
70
71 MALI_STATIC_INLINE void mali_hw_core_register_write_array_relaxed(struct mali_hw_core *core, u32 relative_address, u32 *write_array, u32 nr_of_regs)
72 {
73         u32 i;
74         MALI_DEBUG_PRINT(6, ("register_write_array: for core %s, relative addr=0x%04X, nr of regs=%u\n",
75                              core->description,relative_address, nr_of_regs));
76
77         /* Do not use burst writes against the registers */
78         for (i = 0; i< nr_of_regs; i++) {
79                 mali_hw_core_register_write_relaxed(core, relative_address + i*4, write_array[i]);
80         }
81 }
82
83 /* Conditionally write a set of registers.
84  * The register will only be written if the new value is different from the old_value.
85  * If the new value is different, the old value will also be updated */
86 MALI_STATIC_INLINE void mali_hw_core_register_write_array_relaxed_conditional(struct mali_hw_core *core, u32 relative_address, u32 *write_array, u32 nr_of_regs, const u32* old_array)
87 {
88         u32 i;
89         MALI_DEBUG_PRINT(6, ("register_write_array: for core %s, relative addr=0x%04X, nr of regs=%u\n",
90                              core->description,relative_address, nr_of_regs));
91
92         /* Do not use burst writes against the registers */
93         for (i = 0; i< nr_of_regs; i++) {
94                 if(old_array[i] != write_array[i]) {
95                         mali_hw_core_register_write_relaxed(core, relative_address + i*4, write_array[i]);
96                 }
97         }
98 }
99
100 #endif /* __MALI_HW_CORE_H__ */