cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sram.c (1622B)


      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
     15static struct gen_pool *sram_pool;
     16
     17struct gen_pool *sram_get_gen_pool(void)
     18{
     19	return sram_pool;
     20}
     21
     22void *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}
     34EXPORT_SYMBOL(sram_alloc);
     35
     36void sram_free(void *addr, size_t len)
     37{
     38	gen_pool_free(sram_pool, (unsigned long) addr, len);
     39}
     40EXPORT_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 */
     49static 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}
     76core_initcall(sram_init);
     77