Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/mach-davinci/sram.c
29269 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* mach-davinci/sram.c - DaVinci simple SRAM allocator
4
*
5
* Copyright (C) 2009 David Brownell
6
*/
7
#include <linux/module.h>
8
#include <linux/init.h>
9
#include <linux/io.h>
10
#include <linux/genalloc.h>
11
12
#include "common.h"
13
#include "sram.h"
14
15
static struct gen_pool *sram_pool;
16
17
struct gen_pool *sram_get_gen_pool(void)
18
{
19
return sram_pool;
20
}
21
22
void *sram_alloc(size_t len, dma_addr_t *dma)
23
{
24
dma_addr_t dma_base = davinci_soc_info.sram_dma;
25
26
if (dma)
27
*dma = 0;
28
if (!sram_pool || (dma && !dma_base))
29
return NULL;
30
31
return gen_pool_dma_alloc(sram_pool, len, dma);
32
33
}
34
EXPORT_SYMBOL(sram_alloc);
35
36
void sram_free(void *addr, size_t len)
37
{
38
gen_pool_free(sram_pool, (unsigned long) addr, len);
39
}
40
EXPORT_SYMBOL(sram_free);
41
42
43
/*
44
* REVISIT This supports CPU and DMA access to/from SRAM, but it
45
* doesn't (yet?) support some other notable uses of SRAM: as TCM
46
* for data and/or instructions; and holding code needed to enter
47
* and exit suspend states (while DRAM can't be used).
48
*/
49
static int __init sram_init(void)
50
{
51
phys_addr_t phys = davinci_soc_info.sram_dma;
52
unsigned len = davinci_soc_info.sram_len;
53
int status = 0;
54
void __iomem *addr;
55
56
if (len) {
57
len = min_t(unsigned, len, SRAM_SIZE);
58
sram_pool = gen_pool_create(ilog2(SRAM_GRANULARITY), -1);
59
if (!sram_pool)
60
status = -ENOMEM;
61
}
62
63
if (sram_pool) {
64
addr = ioremap(phys, len);
65
if (!addr)
66
return -ENOMEM;
67
status = gen_pool_add_virt(sram_pool, (unsigned long) addr,
68
phys, len, -1);
69
if (status < 0)
70
iounmap(addr);
71
}
72
73
WARN_ON(status < 0);
74
return status;
75
}
76
core_initcall(sram_init);
77
78
79