/*
 * memory.c
 *
 *  Created on: 2021Äê12ÔÂ25ÈÕ
 *      Author: graydon
 */

#include <stdio.h>
#include <string.h>
#include "memory.h"

//L1¿Õ¼ä
#define L1_DM1_SIZE 64*1024+16
#define L1_DM2_SIZE 0
#define L1_PM_SIZE 64*1024+16
static char l1mem_dm[L1_DM1_SIZE];
static char l1mem_dm2[L1_DM2_SIZE];
static pm char l1mem_pm[L1_PM_SIZE];

//ÓÉÓÚL1·ÇÁ¬Ðø£¬ÐèÒª¶¨ÖÆÄÚ´æ.
#define BANKNUM 3
static int memIndex[BANKNUM] ={255,255,255};

int sram_init()
{
//	heap_init(SRAM_L2);
//	heap_init(SRAM_L1);
//	heap_init(SRAM_DDR);
#if L1_DM1_SIZE> 0
	memIndex[mem_dm1] = heap_install(l1mem_dm, L1_DM1_SIZE , 10);
#endif
#if L1_DM2_SIZE> 0
	memIndex[mem_dm2] = heap_install(l1mem_dm2, L1_DM2_SIZE , 11);
#endif
#if L1_PM_SIZE> 0
	memIndex[mem_pm] = heap_install(l1mem_pm, L1_PM_SIZE , 12);
#endif

	return 0;
}

static void* sram_alloc_l1(meml1_sub_type subType, int size) {
	int i, memid;
	void* ptr = NULL;

	switch(subType){
	case mem_dm1:
	case mem_dm2:
	case mem_pm:
		if(memIndex[subType] != 255)
			ptr = heap_malloc(memIndex[subType],size);
		break;
	case mem_heap:
		ptr = heap_malloc(SRAM_L1,size);
		break;
	case mem_any:
		ptr = heap_malloc(SRAM_L1,size);
		if(ptr) break;
		ptr = heap_malloc(memIndex[mem_dm1],size);
		if(ptr) break;
		ptr = heap_malloc(memIndex[mem_dm2],size);
		if(ptr) break;
		ptr = heap_malloc(memIndex[mem_pm],size);
		if(ptr) break;
	}

	if(ptr == NULL) {
		memid = -1;
	}
	return ptr;
}

void* sram_malloc(MemoryType memtype , meml1_sub_type subType ,int size)
{
	void* p = NULL;

	switch(memtype) {
	case SRAM_L2:
	case SRAM_DDR:
		p = heap_malloc(memtype,size);
		break;
	case SRAM_L1:
		p = sram_alloc_l1(subType, size);
		break;
	case SRAM_AUTO:
		p = sram_alloc_l1(subType, size);
		if(p == NULL) {
			p = heap_malloc(SRAM_L2,size);
		}
		if(p == NULL) {
			p = heap_malloc(SRAM_DDR,size);
		}
		break;
	default:
		break;
	}


	return p;
}

void sram_free(MemoryType memtype ,void* ptr)
{
	if(memtype < SRAM_AUTO) {
		heap_free(memtype, ptr);
	}
}

int sram_free_space(MemoryType memtype, meml1_sub_type subType)
{
	int size = 0;
	int memid ;

	switch(memtype) {
	case SRAM_L2:
	case SRAM_DDR:
		size = heap_space_unused(memtype);
		break;
	case SRAM_L1:
		switch(subType) {
		case mem_heap:
			size = heap_space_unused(memtype);
			break;
		case mem_pm:
		case mem_dm1:
		case mem_dm2:
			size = heap_space_unused(memIndex[subType]);
			break;
		}
		break;
	case SRAM_AUTO:
		break;
	default:
		break;
	}

	return  size;
}