2 * drivers/gpu/ion/ion_dummy_driver.c
4 * Copyright (C) 2013 Linaro, Inc
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #include <linux/err.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/bootmem.h>
21 #include <linux/memblock.h>
22 #include <linux/sizes.h>
26 struct ion_device
*idev
;
27 struct ion_heap
**heaps
;
32 struct ion_platform_heap dummy_heaps
[] = {
34 .id
= ION_HEAP_TYPE_SYSTEM
,
35 .type
= ION_HEAP_TYPE_SYSTEM
,
39 .id
= ION_HEAP_TYPE_SYSTEM_CONTIG
,
40 .type
= ION_HEAP_TYPE_SYSTEM_CONTIG
,
41 .name
= "system contig",
44 .id
= ION_HEAP_TYPE_CARVEOUT
,
45 .type
= ION_HEAP_TYPE_CARVEOUT
,
50 .id
= ION_HEAP_TYPE_CHUNK
,
51 .type
= ION_HEAP_TYPE_CHUNK
,
55 .priv
= (void *)(SZ_16K
),
59 struct ion_platform_data dummy_ion_pdata
= {
64 static int __init
ion_dummy_init(void)
68 idev
= ion_device_create(NULL
);
69 heaps
= kzalloc(sizeof(struct ion_heap
*) * dummy_ion_pdata
.nr
,
72 return PTR_ERR(heaps
);
75 /* Allocate a dummy carveout heap */
76 carveout_ptr
= alloc_pages_exact(
77 dummy_heaps
[ION_HEAP_TYPE_CARVEOUT
].size
,
80 dummy_heaps
[ION_HEAP_TYPE_CARVEOUT
].base
=
81 virt_to_phys(carveout_ptr
);
83 pr_err("ion_dummy: Could not allocate carveout\n");
85 /* Allocate a dummy chunk heap */
86 chunk_ptr
= alloc_pages_exact(
87 dummy_heaps
[ION_HEAP_TYPE_CHUNK
].size
,
90 dummy_heaps
[ION_HEAP_TYPE_CHUNK
].base
= virt_to_phys(chunk_ptr
);
92 pr_err("ion_dummy: Could not allocate chunk\n");
94 for (i
= 0; i
< dummy_ion_pdata
.nr
; i
++) {
95 struct ion_platform_heap
*heap_data
= &dummy_ion_pdata
.heaps
[i
];
97 if (heap_data
->type
== ION_HEAP_TYPE_CARVEOUT
&&
101 if (heap_data
->type
== ION_HEAP_TYPE_CHUNK
&& !heap_data
->base
)
104 heaps
[i
] = ion_heap_create(heap_data
);
105 if (IS_ERR_OR_NULL(heaps
[i
])) {
106 err
= PTR_ERR(heaps
[i
]);
109 ion_device_add_heap(idev
, heaps
[i
]);
113 for (i
= 0; i
< dummy_ion_pdata
.nr
; i
++) {
115 ion_heap_destroy(heaps
[i
]);
120 free_pages_exact(carveout_ptr
,
121 dummy_heaps
[ION_HEAP_TYPE_CARVEOUT
].size
);
125 free_pages_exact(chunk_ptr
,
126 dummy_heaps
[ION_HEAP_TYPE_CHUNK
].size
);
132 static void __exit
ion_dummy_exit(void)
136 ion_device_destroy(idev
);
138 for (i
= 0; i
< dummy_ion_pdata
.nr
; i
++)
139 ion_heap_destroy(heaps
[i
]);
143 free_pages_exact(carveout_ptr
,
144 dummy_heaps
[ION_HEAP_TYPE_CARVEOUT
].size
);
148 free_pages_exact(chunk_ptr
,
149 dummy_heaps
[ION_HEAP_TYPE_CHUNK
].size
);
156 module_init(ion_dummy_init
);
157 module_exit(ion_dummy_exit
);