cregit-Linux how code gets into the kernel

Release 4.14 arch/blackfin/mm/sram-alloc.c

Directory: arch/blackfin/mm
/*
 * SRAM allocator for Blackfin on-chip memory
 *
 * Copyright 2004-2009 Analog Devices Inc.
 *
 * Licensed under the GPL-2 or later.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/miscdevice.h>
#include <linux/ioport.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/spinlock.h>
#include <linux/rtc.h>
#include <linux/slab.h>
#include <linux/mm_types.h>

#include <asm/blackfin.h>
#include <asm/mem_map.h>
#include "blackfin_sram.h"

/* the data structure for L1 scratchpad and DATA SRAM */

struct sram_piece {
	
void *paddr;
	
int size;
	
pid_t pid;
	
struct sram_piece *next;
};

static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1sram_lock);
static DEFINE_PER_CPU(struct sram_piece, free_l1_ssram_head);
static DEFINE_PER_CPU(struct sram_piece, used_l1_ssram_head);

#if L1_DATA_A_LENGTH != 0
static DEFINE_PER_CPU(struct sram_piece, free_l1_data_A_sram_head);
static DEFINE_PER_CPU(struct sram_piece, used_l1_data_A_sram_head);
#endif

#if L1_DATA_B_LENGTH != 0
static DEFINE_PER_CPU(struct sram_piece, free_l1_data_B_sram_head);
static DEFINE_PER_CPU(struct sram_piece, used_l1_data_B_sram_head);
#endif

#if L1_DATA_A_LENGTH || L1_DATA_B_LENGTH
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_data_sram_lock);
#endif

#if L1_CODE_LENGTH != 0
static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_inst_sram_lock);
static DEFINE_PER_CPU(struct sram_piece, free_l1_inst_sram_head);
static DEFINE_PER_CPU(struct sram_piece, used_l1_inst_sram_head);
#endif

#if L2_LENGTH != 0

static spinlock_t l2_sram_lock ____cacheline_aligned_in_smp;


static struct sram_piece free_l2_sram_head, used_l2_sram_head;
#endif


static struct kmem_cache *sram_piece_cache;

/* L1 Scratchpad SRAM initialization function */

static void __init l1sram_init(void) { unsigned int cpu; unsigned long reserve; #ifdef CONFIG_SMP reserve = 0; #else reserve = sizeof(struct l1_scratch_task_info); #endif for (cpu = 0; cpu < num_possible_cpus(); ++cpu) { per_cpu(free_l1_ssram_head, cpu).next = kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); if (!per_cpu(free_l1_ssram_head, cpu).next) { printk(KERN_INFO "Fail to initialize Scratchpad data SRAM.\n"); return; } per_cpu(free_l1_ssram_head, cpu).next->paddr = (void *)get_l1_scratch_start_cpu(cpu) + reserve; per_cpu(free_l1_ssram_head, cpu).next->size = L1_SCRATCH_LENGTH - reserve; per_cpu(free_l1_ssram_head, cpu).next->pid = 0; per_cpu(free_l1_ssram_head, cpu).next->next = NULL; per_cpu(used_l1_ssram_head, cpu).next = NULL; /* mutex initialize */ spin_lock_init(&per_cpu(l1sram_lock, cpu)); printk(KERN_INFO "Blackfin Scratchpad data SRAM: %d KB\n", L1_SCRATCH_LENGTH >> 10); } }

Contributors

PersonTokensPropCommitsCommitProp
Graf Yang9249.73%240.00%
Sonic Zhang5429.19%120.00%
Bryan Wu3820.54%120.00%
Mike Frysinger10.54%120.00%
Total185100.00%5100.00%


static void __init l1_data_sram_init(void) { #if L1_DATA_A_LENGTH != 0 || L1_DATA_B_LENGTH != 0 unsigned int cpu; #endif #if L1_DATA_A_LENGTH != 0 for (cpu = 0; cpu < num_possible_cpus(); ++cpu) { per_cpu(free_l1_data_A_sram_head, cpu).next = kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); if (!per_cpu(free_l1_data_A_sram_head, cpu).next) { printk(KERN_INFO "Fail to initialize L1 Data A SRAM.\n"); return; } per_cpu(free_l1_data_A_sram_head, cpu).next->paddr = (void *)get_l1_data_a_start_cpu(cpu) + (_ebss_l1 - _sdata_l1); per_cpu(free_l1_data_A_sram_head, cpu).next->size = L1_DATA_A_LENGTH - (_ebss_l1 - _sdata_l1); per_cpu(free_l1_data_A_sram_head, cpu).next->pid = 0; per_cpu(free_l1_data_A_sram_head, cpu).next->next = NULL; per_cpu(used_l1_data_A_sram_head, cpu).next = NULL; printk(KERN_INFO "Blackfin L1 Data A SRAM: %d KB (%d KB free)\n", L1_DATA_A_LENGTH >> 10, per_cpu(free_l1_data_A_sram_head, cpu).next->size >> 10); } #endif #if L1_DATA_B_LENGTH != 0 for (cpu = 0; cpu < num_possible_cpus(); ++cpu) { per_cpu(free_l1_data_B_sram_head, cpu).next = kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); if (!per_cpu(free_l1_data_B_sram_head, cpu).next) { printk(KERN_INFO "Fail to initialize L1 Data B SRAM.\n"); return; } per_cpu(free_l1_data_B_sram_head, cpu).next->paddr = (void *)get_l1_data_b_start_cpu(cpu) + (_ebss_b_l1 - _sdata_b_l1); per_cpu(free_l1_data_B_sram_head, cpu).next->size = L1_DATA_B_LENGTH - (_ebss_b_l1 - _sdata_b_l1); per_cpu(free_l1_data_B_sram_head, cpu).next->pid = 0; per_cpu(free_l1_data_B_sram_head, cpu).next->next = NULL; per_cpu(used_l1_data_B_sram_head, cpu).next = NULL; printk(KERN_INFO "Blackfin L1 Data B SRAM: %d KB (%d KB free)\n", L1_DATA_B_LENGTH >> 10, per_cpu(free_l1_data_B_sram_head, cpu).next->size >> 10); /* mutex initialize */ } #endif #if L1_DATA_A_LENGTH != 0 || L1_DATA_B_LENGTH != 0 for (cpu = 0; cpu < num_possible_cpus(); ++cpu) spin_lock_init(&per_cpu(l1_data_sram_lock, cpu)); #endif }

Contributors

PersonTokensPropCommitsCommitProp
Graf Yang15740.15%112.50%
Sonic Zhang9925.32%225.00%
Bryan Wu8421.48%112.50%
Mike Frysinger5113.04%450.00%
Total391100.00%8100.00%


static void __init l1_inst_sram_init(void) { #if L1_CODE_LENGTH != 0 unsigned int cpu; for (cpu = 0; cpu < num_possible_cpus(); ++cpu) { per_cpu(free_l1_inst_sram_head, cpu).next = kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); if (!per_cpu(free_l1_inst_sram_head, cpu).next) { printk(KERN_INFO "Failed to initialize L1 Instruction SRAM\n"); return; } per_cpu(free_l1_inst_sram_head, cpu).next->paddr = (void *)get_l1_code_start_cpu(cpu) + (_etext_l1 - _stext_l1); per_cpu(free_l1_inst_sram_head, cpu).next->size = L1_CODE_LENGTH - (_etext_l1 - _stext_l1); per_cpu(free_l1_inst_sram_head, cpu).next->pid = 0; per_cpu(free_l1_inst_sram_head, cpu).next->next = NULL; per_cpu(used_l1_inst_sram_head, cpu).next = NULL; printk(KERN_INFO "Blackfin L1 Instruction SRAM: %d KB (%d KB free)\n", L1_CODE_LENGTH >> 10, per_cpu(free_l1_inst_sram_head, cpu).next->size >> 10); /* mutex initialize */ spin_lock_init(&per_cpu(l1_inst_sram_lock, cpu)); } #endif }

Contributors

PersonTokensPropCommitsCommitProp
Graf Yang7137.37%114.29%
Bryan Wu5327.89%114.29%
Sonic Zhang5026.32%228.57%
Mike Frysinger157.89%228.57%
Robin Getz10.53%114.29%
Total190100.00%7100.00%

#ifdef __ADSPBF60x__
static irqreturn_t l2_ecc_err(int irq, void *dev_id) { int status; printk(KERN_ERR "L2 ecc error happened\n"); status = bfin_read32(L2CTL0_STAT); if (status & 0x1) printk(KERN_ERR "Core channel error type:0x%x, addr:0x%x\n", bfin_read32(L2CTL0_ET0), bfin_read32(L2CTL0_EADDR0)); if (status & 0x2) printk(KERN_ERR "System channel error type:0x%x, addr:0x%x\n", bfin_read32(L2CTL0_ET1), bfin_read32(L2CTL0_EADDR1)); status = status >> 8; if (status) printk(KERN_ERR "L2 Bank%d error, addr:0x%x\n", status, bfin_read32(L2CTL0_ERRADDR0 + status)); panic("L2 Ecc error"); return IRQ_HANDLED; }

Contributors

PersonTokensPropCommitsCommitProp
Bob Liu10599.06%150.00%
Masanari Iida10.94%150.00%
Total106100.00%2100.00%

#endif
static void __init l2_sram_init(void) { #if L2_LENGTH != 0 #ifdef __ADSPBF60x__ int ret; ret = request_irq(IRQ_L2CTL0_ECC_ERR, l2_ecc_err, 0, "l2-ecc-err", NULL); if (unlikely(ret < 0)) { printk(KERN_INFO "Fail to request l2 ecc error interrupt"); return; } #endif free_l2_sram_head.next = kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); if (!free_l2_sram_head.next) { printk(KERN_INFO "Fail to initialize L2 SRAM.\n"); return; } free_l2_sram_head.next->paddr = (void *)L2_START + (_ebss_l2 - _stext_l2); free_l2_sram_head.next->size = L2_LENGTH - (_ebss_l2 - _stext_l2); free_l2_sram_head.next->pid = 0; free_l2_sram_head.next->next = NULL; used_l2_sram_head.next = NULL; printk(KERN_INFO "Blackfin L2 SRAM: %d KB (%d KB free)\n", L2_LENGTH >> 10, free_l2_sram_head.next->size >> 10); /* mutex initialize */ spin_lock_init(&l2_sram_lock); #endif }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang11369.33%116.67%
Bob Liu4125.15%116.67%
Mike Frysinger63.68%233.33%
Jie Zhang21.23%116.67%
Graf Yang10.61%116.67%
Total163100.00%6100.00%


static int __init bfin_sram_init(void) { sram_piece_cache = kmem_cache_create("sram_piece_cache", sizeof(struct sram_piece), 0, SLAB_PANIC, NULL); l1sram_init(); l1_data_sram_init(); l1_inst_sram_init(); l2_sram_init(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang3888.37%266.67%
Graf Yang511.63%133.33%
Total43100.00%3100.00%

pure_initcall(bfin_sram_init); /* SRAM allocate function */
static void *_sram_alloc(size_t size, struct sram_piece *pfree_head, struct sram_piece *pused_head) { struct sram_piece *pslot, *plast, *pavail; if (size <= 0 || !pfree_head || !pused_head) return NULL; /* Align the size */ size = (size + 3) & ~3; pslot = pfree_head->next; plast = pfree_head; /* search an available piece slot */ while (pslot != NULL && size > pslot->size) { plast = pslot; pslot = pslot->next; } if (!pslot) return NULL; if (pslot->size == size) { plast->next = pslot->next; pavail = pslot; } else { /* use atomic so our L1 allocator can be used atomically */ pavail = kmem_cache_alloc(sram_piece_cache, GFP_ATOMIC); if (!pavail) return NULL; pavail->paddr = pslot->paddr; pavail->size = size; pslot->paddr += size; pslot->size -= size; } pavail->pid = current->pid; pslot = pused_head->next; plast = pused_head; /* insert new piece into used piece list !!! */ while (pslot != NULL && pavail->paddr < pslot->paddr) { plast = pslot; pslot = pslot->next; } pavail->next = pslot; plast->next = pavail; return pavail->paddr; }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang14863.79%240.00%
Bryan Wu7833.62%120.00%
Mike Frysinger62.59%240.00%
Total232100.00%5100.00%

/* Allocate the largest available block. */
static void *_sram_alloc_max(struct sram_piece *pfree_head, struct sram_piece *pused_head, unsigned long *psize) { struct sram_piece *pslot, *pmax; if (!pfree_head || !pused_head) return NULL; pmax = pslot = pfree_head->next; /* search an available piece slot */ while (pslot != NULL) { if (pslot->size > pmax->size) pmax = pslot; pslot = pslot->next; } if (!pmax) return NULL; *psize = pmax->size; return _sram_alloc(*psize, pfree_head, pused_head); }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang6158.65%250.00%
Bryan Wu4240.38%125.00%
Mike Frysinger10.96%125.00%
Total104100.00%4100.00%

/* SRAM free function */
static int _sram_free(const void *addr, struct sram_piece *pfree_head, struct sram_piece *pused_head) { struct sram_piece *pslot, *plast, *pavail; if (!pfree_head || !pused_head) return -1; /* search the relevant memory slot */ pslot = pused_head->next; plast = pused_head; /* search an available piece slot */ while (pslot != NULL && pslot->paddr != addr) { plast = pslot; pslot = pslot->next; } if (!pslot) return -1; plast->next = pslot->next; pavail = pslot; pavail->pid = 0; /* insert free pieces back to the free list */ pslot = pfree_head->next; plast = pfree_head; while (pslot != NULL && addr > pslot->paddr) { plast = pslot; pslot = pslot->next; } if (plast != pfree_head && plast->paddr + plast->size == pavail->paddr) { plast->size += pavail->size; kmem_cache_free(sram_piece_cache, pavail); } else { pavail->next = plast->next; plast->next = pavail; plast = pavail; } if (pslot && plast->paddr + plast->size == pslot->paddr) { plast->size += pslot->size; plast->next = pslot->next; kmem_cache_free(sram_piece_cache, pslot); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang16869.42%360.00%
Bryan Wu6828.10%120.00%
Mike Frysinger62.48%120.00%
Total242100.00%5100.00%


int sram_free(const void *addr) { #if L1_CODE_LENGTH != 0 if (addr >= (void *)get_l1_code_start() && addr < (void *)(get_l1_code_start() + L1_CODE_LENGTH)) return l1_inst_sram_free(addr); else #endif #if L1_DATA_A_LENGTH != 0 if (addr >= (void *)get_l1_data_a_start() && addr < (void *)(get_l1_data_a_start() + L1_DATA_A_LENGTH)) return l1_data_A_sram_free(addr); else #endif #if L1_DATA_B_LENGTH != 0 if (addr >= (void *)get_l1_data_b_start() && addr < (void *)(get_l1_data_b_start() + L1_DATA_B_LENGTH)) return l1_data_B_sram_free(addr); else #endif #if L2_LENGTH != 0 if (addr >= (void *)L2_START && addr < (void *)(L2_START + L2_LENGTH)) return l2_sram_free(addr); else #endif return -1; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu11368.90%120.00%
Sonic Zhang3118.90%120.00%
Graf Yang127.32%120.00%
Robin Getz42.44%120.00%
Mike Frysinger42.44%120.00%
Total164100.00%5100.00%

EXPORT_SYMBOL(sram_free);
void *l1_data_A_sram_alloc(size_t size) { #if L1_DATA_A_LENGTH != 0 unsigned long flags; void *addr; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags); addr = _sram_alloc(size, &per_cpu(free_l1_data_A_sram_head, cpu), &per_cpu(used_l1_data_A_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags); pr_debug("Allocated address in l1_data_A_sram_alloc is 0x%lx+0x%lx\n", (long unsigned int)addr, size); return addr; #else return NULL; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu5955.66%114.29%
Graf Yang2826.42%114.29%
Mike Frysinger1211.32%114.29%
Sonic Zhang54.72%228.57%
Yi Li10.94%114.29%
Vegard Nossum10.94%114.29%
Total106100.00%7100.00%

EXPORT_SYMBOL(l1_data_A_sram_alloc);
int l1_data_A_sram_free(const void *addr) { #if L1_DATA_A_LENGTH != 0 unsigned long flags; int ret; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags); ret = _sram_free(addr, &per_cpu(free_l1_data_A_sram_head, cpu), &per_cpu(used_l1_data_A_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags); return ret; #else return -1; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu4548.39%114.29%
Graf Yang2830.11%114.29%
Mike Frysinger1313.98%114.29%
Sonic Zhang55.38%228.57%
Vegard Nossum11.08%114.29%
Yi Li11.08%114.29%
Total93100.00%7100.00%

EXPORT_SYMBOL(l1_data_A_sram_free);
void *l1_data_B_sram_alloc(size_t size) { #if L1_DATA_B_LENGTH != 0 unsigned long flags; void *addr; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags); addr = _sram_alloc(size, &per_cpu(free_l1_data_B_sram_head, cpu), &per_cpu(used_l1_data_B_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags); pr_debug("Allocated address in l1_data_B_sram_alloc is 0x%lx+0x%lx\n", (long unsigned int)addr, size); return addr; #else return NULL; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu7166.98%116.67%
Graf Yang2826.42%116.67%
Sonic Zhang54.72%233.33%
Vegard Nossum10.94%116.67%
Yi Li10.94%116.67%
Total106100.00%6100.00%

EXPORT_SYMBOL(l1_data_B_sram_alloc);
int l1_data_B_sram_free(const void *addr) { #if L1_DATA_B_LENGTH != 0 unsigned long flags; int ret; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_data_sram_lock, cpu), flags); ret = _sram_free(addr, &per_cpu(free_l1_data_B_sram_head, cpu), &per_cpu(used_l1_data_B_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_data_sram_lock, cpu), flags); return ret; #else return -1; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu5862.37%116.67%
Graf Yang2830.11%116.67%
Sonic Zhang55.38%233.33%
Vegard Nossum11.08%116.67%
Yi Li11.08%116.67%
Total93100.00%6100.00%

EXPORT_SYMBOL(l1_data_B_sram_free);
void *l1_data_sram_alloc(size_t size) { void *addr = l1_data_A_sram_alloc(size); if (!addr) addr = l1_data_B_sram_alloc(size); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu33100.00%1100.00%
Total33100.00%1100.00%

EXPORT_SYMBOL(l1_data_sram_alloc);
void *l1_data_sram_zalloc(size_t size) { void *addr = l1_data_sram_alloc(size); if (addr) memset(addr, 0x00, size); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu34100.00%1100.00%
Total34100.00%1100.00%

EXPORT_SYMBOL(l1_data_sram_zalloc);
int l1_data_sram_free(const void *addr) { int ret; ret = l1_data_A_sram_free(addr); if (ret == -1) ret = l1_data_B_sram_free(addr); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu37100.00%1100.00%
Total37100.00%1100.00%

EXPORT_SYMBOL(l1_data_sram_free);
void *l1_inst_sram_alloc(size_t size) { #if L1_CODE_LENGTH != 0 unsigned long flags; void *addr; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_inst_sram_lock, cpu), flags); addr = _sram_alloc(size, &per_cpu(free_l1_inst_sram_head, cpu), &per_cpu(used_l1_inst_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_inst_sram_lock, cpu), flags); pr_debug("Allocated address in l1_inst_sram_alloc is 0x%lx+0x%lx\n", (long unsigned int)addr, size); return addr; #else return NULL; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu7066.04%114.29%
Graf Yang2826.42%114.29%
Sonic Zhang54.72%228.57%
Yi Li10.94%114.29%
Vegard Nossum10.94%114.29%
Meihui Fan10.94%114.29%
Total106100.00%7100.00%

EXPORT_SYMBOL(l1_inst_sram_alloc);
int l1_inst_sram_free(const void *addr) { #if L1_CODE_LENGTH != 0 unsigned long flags; int ret; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1_inst_sram_lock, cpu), flags); ret = _sram_free(addr, &per_cpu(free_l1_inst_sram_head, cpu), &per_cpu(used_l1_inst_sram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1_inst_sram_lock, cpu), flags); return ret; #else return -1; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu5862.37%116.67%
Graf Yang2830.11%116.67%
Sonic Zhang55.38%233.33%
Vegard Nossum11.08%116.67%
Yi Li11.08%116.67%
Total93100.00%6100.00%

EXPORT_SYMBOL(l1_inst_sram_free); /* L1 Scratchpad memory allocate function */
void *l1sram_alloc(size_t size) { unsigned long flags; void *addr; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1sram_lock, cpu), flags); addr = _sram_alloc(size, &per_cpu(free_l1_ssram_head, cpu), &per_cpu(used_l1_ssram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1sram_lock, cpu), flags); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu4556.25%116.67%
Graf Yang2835.00%116.67%
Sonic Zhang56.25%233.33%
Vegard Nossum11.25%116.67%
Yi Li11.25%116.67%
Total80100.00%6100.00%

/* L1 Scratchpad memory allocate function */
void *l1sram_alloc_max(size_t *psize) { unsigned long flags; void *addr; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1sram_lock, cpu), flags); addr = _sram_alloc_max(&per_cpu(free_l1_ssram_head, cpu), &per_cpu(used_l1_ssram_head, cpu), psize); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1sram_lock, cpu), flags); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu4656.79%116.67%
Graf Yang2834.57%116.67%
Sonic Zhang56.17%233.33%
Vegard Nossum11.23%116.67%
Yi Li11.23%116.67%
Total81100.00%6100.00%

/* L1 Scratchpad memory free function */
int l1sram_free(const void *addr) { unsigned long flags; int ret; unsigned int cpu; cpu = smp_processor_id(); /* add mutex operation */ spin_lock_irqsave(&per_cpu(l1sram_lock, cpu), flags); ret = _sram_free(addr, &per_cpu(free_l1_ssram_head, cpu), &per_cpu(used_l1_ssram_head, cpu)); /* add mutex operation */ spin_unlock_irqrestore(&per_cpu(l1sram_lock, cpu), flags); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu4556.25%116.67%
Graf Yang2835.00%116.67%
Sonic Zhang56.25%233.33%
Yi Li11.25%116.67%
Vegard Nossum11.25%116.67%
Total80100.00%6100.00%


void *l2_sram_alloc(size_t size) { #if L2_LENGTH != 0 unsigned long flags; void *addr; /* add mutex operation */ spin_lock_irqsave(&l2_sram_lock, flags); addr = _sram_alloc(size, &free_l2_sram_head, &used_l2_sram_head); /* add mutex operation */ spin_unlock_irqrestore(&l2_sram_lock, flags); pr_debug("Allocated address in l2_sram_alloc is 0x%lx+0x%lx\n", (long unsigned int)addr, size); return addr; #else return NULL; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang7293.51%133.33%
Mike Frysinger45.19%133.33%
Vegard Nossum11.30%133.33%
Total77100.00%3100.00%

EXPORT_SYMBOL(l2_sram_alloc);
void *l2_sram_zalloc(size_t size) { void *addr = l2_sram_alloc(size); if (addr) memset(addr, 0x00, size); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang34100.00%1100.00%
Total34100.00%1100.00%

EXPORT_SYMBOL(l2_sram_zalloc);
int l2_sram_free(const void *addr) { #if L2_LENGTH != 0 unsigned long flags; int ret; /* add mutex operation */ spin_lock_irqsave(&l2_sram_lock, flags); ret = _sram_free(addr, &free_l2_sram_head, &used_l2_sram_head); /* add mutex operation */ spin_unlock_irqrestore(&l2_sram_lock, flags); return ret; #else return -1; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang5992.19%133.33%
Mike Frysinger46.25%133.33%
Vegard Nossum11.56%133.33%
Total64100.00%3100.00%

EXPORT_SYMBOL(l2_sram_free);
int sram_free_with_lsl(const void *addr) { struct sram_list_struct *lsl, **tmp; struct mm_struct *mm = current->mm; int ret = -1; for (tmp = &mm->context.sram_list; *tmp; tmp = &(*tmp)->next) if ((*tmp)->addr == addr) { lsl = *tmp; ret = sram_free(addr); *tmp = lsl->next; kfree(lsl); break; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu8787.88%150.00%
Mike Frysinger1212.12%150.00%
Total99100.00%2100.00%

EXPORT_SYMBOL(sram_free_with_lsl); /* Allocate memory and keep in L1 SRAM List (lsl) so that the resources are * tracked. These are designed for userspace so that when a process exits, * we can safely reap their resources. */
void *sram_alloc_with_lsl(size_t size, unsigned long flags) { void *addr = NULL; struct sram_list_struct *lsl = NULL; struct mm_struct *mm = current->mm; lsl = kzalloc(sizeof(struct sram_list_struct), GFP_KERNEL); if (!lsl) return NULL; if (flags & L1_INST_SRAM) addr = l1_inst_sram_alloc(size); if (addr == NULL && (flags & L1_DATA_A_SRAM)) addr = l1_data_A_sram_alloc(size); if (addr == NULL && (flags & L1_DATA_B_SRAM)) addr = l1_data_B_sram_alloc(size); if (addr == NULL && (flags & L2_SRAM)) addr = l2_sram_alloc(size); if (addr == NULL) { kfree(lsl); return NULL; } lsl->addr = addr; lsl->length = size; lsl->next = mm->context.sram_list; mm->context.sram_list = lsl; return addr; }

Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu15588.57%133.33%
Sonic Zhang1910.86%133.33%
Yoann Padioleau10.57%133.33%
Total175100.00%3100.00%

EXPORT_SYMBOL(sram_alloc_with_lsl); #ifdef CONFIG_PROC_FS /* Once we get a real allocator, we'll throw all of this away. * Until then, we need some sort of visibility into the L1 alloc. */ /* Need to keep line of output the same. Currently, that is 44 bytes * (including newline). */
static int _sram_proc_show(struct seq_file *m, const char *desc, struct sram_piece *pfree_head, struct sram_piece *pused_head) { struct sram_piece *pslot; if (!pfree_head || !pused_head) return -1; seq_printf(m, "--- SRAM %-14s Size PID State \n", desc); /* search the relevant memory slot */ pslot = pused_head->next; while (pslot != NULL) { seq_printf(m, "%p-%p %10i %5i %-10s\n", pslot->paddr, pslot->paddr + pslot->size, pslot->size, pslot->pid, "ALLOCATED"); pslot = pslot->next; } pslot = pfree_head->next; while (pslot != NULL) { seq_printf(m, "%p-%p %10i %5i %-10s\n", pslot->paddr, pslot->paddr + pslot->size, pslot->size, pslot->pid, "FREE"); pslot = pslot->next; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Sonic Zhang9561.69%240.00%
Mike Frysinger4931.82%240.00%
Alexey Dobriyan106.49%120.00%
Total154100.00%5100.00%


static int sram_proc_show(struct seq_file *m, void *v) { unsigned int cpu; for (cpu = 0; cpu < num_possible_cpus(); ++cpu) { if (_sram_proc_show(m, "Scratchpad", &per_cpu(free_l1_ssram_head, cpu), &per_cpu(used_l1_ssram_head, cpu))) goto not_done; #if L1_DATA_A_LENGTH != 0 if (_sram_proc_show(m, "L1 Data A", &per_cpu(free_l1_data_A_sram_head, cpu), &per_cpu(used_l1_data_A_sram_head, cpu))) goto not_done; #endif #if L1_DATA_B_LENGTH != 0 if (_sram_proc_show(m, "L1 Data B", &per_cpu(free_l1_data_B_sram_head, cpu), &per_cpu(used_l1_data_B_sram_head, cpu))) goto not_done; #endif #if L1_CODE_LENGTH != 0 if (_sram_proc_show(m, "L1 Instruction", &per_cpu(free_l1_inst_sram_head, cpu), &per_cpu(used_l1_inst_sram_head, cpu))) goto not_done; #endif } #if L2_LENGTH != 0 if (_sram_proc_show(m, "L2", &free_l2_sram_head, &used_l2_sram_head)) goto not_done; #endif not_done: return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Mike Frysinger8241.41%342.86%
Graf Yang6030.30%114.29%
Sonic Zhang3819.19%228.57%
Alexey Dobriyan189.09%114.29%
Total198100.00%7100.00%


static int sram_proc_open(struct inode *inode, struct file *file) { return single_open(file, sram_proc_show, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Alexey Dobriyan2492.31%150.00%
Mike Frysinger27.69%150.00%
Total26100.00%2100.00%

static const struct file_operations sram_proc_ops = { .open = sram_proc_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, };
static int __init sram_proc_init(void) { struct proc_dir_entry *ptr; ptr = proc_create("sram", S_IRUGO, NULL, &sram_proc_ops); if (!ptr) { printk(KERN_WARNING "unable to create /proc/sram\n"); return -1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Mike Frysinger4389.58%133.33%
Alexey Dobriyan48.33%133.33%
Sonic Zhang12.08%133.33%
Total48100.00%3100.00%

late_initcall(sram_proc_init); #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Bryan Wu146036.57%13.33%
Sonic Zhang117729.48%310.00%
Graf Yang71417.89%413.33%
Mike Frysinger3669.17%1033.33%
Bob Liu1513.78%13.33%
Alexey Dobriyan872.18%13.33%
Vegard Nossum110.28%13.33%
Yi Li90.23%13.33%
Robin Getz60.15%26.67%
Ingo Molnar30.08%13.33%
Tejun Heo30.08%13.33%
Jie Zhang20.05%13.33%
Meihui Fan10.03%13.33%
Yoann Padioleau10.03%13.33%
Masanari Iida10.03%13.33%
Total3992100.00%30100.00%
Directory: arch/blackfin/mm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.