/* PFE performance monitoring functions */

#include "pfe_ctrl_hal.h"
#include "pfe_perfmon.h"

static TIMER_ENTRY cpumon_timer;

u32 CLASS_DMEM_SH2(cpu_ticks[2]);
u32 TMU_DMEM_SH2(cpu_ticks[2]);
u32 UTIL_DMEM_SH2(cpu_ticks[2]);

#define compute_active_pct(total_ticks, active_ticks) ((active_ticks * 100 + (total_ticks >> 1)) / total_ticks)

static void cpumon_timer_handler(void)
{
	int id;
	u32 dmem_addr;
	u32 ticks[2];
	u32 total, active;
	struct pfe_ctrl *ctrl = &pfe->ctrl;
	struct pfe_cpumon *cpumon = &pfe->cpumon;

	// Process class PE's
	total = active = 0;
	dmem_addr = virt_to_class_dmem(&class_cpu_ticks[0]);
	for (id = CLASS0_ID; id <= CLASS_MAX_ID; id++)
	{
		cpumon->cpu_usage_pct[id] = 0;
		if (pe_sync_stop(ctrl, (1 << id)) < 0)
			continue;
		ticks[0] = be32_to_cpu(pe_dmem_read(id, dmem_addr, 4));
		ticks[1] = be32_to_cpu(pe_dmem_read(id, dmem_addr + 4, 4));
		pe_dmem_write(id, 0, dmem_addr, 4);
		pe_dmem_write(id, 0, dmem_addr + 4, 4);
		pe_start(ctrl, (1 << id));
		ticks[0] >>= 8;	// divide both values by 256, so multiply by 100 won't overflow
		ticks[1] >>= 8;
		total += ticks[0];
		active += ticks[1];
		if (ticks[0] != 0)
			cpumon->cpu_usage_pct[id] = compute_active_pct(ticks[0], ticks[1]);
	}
	if (total != 0)
		cpumon->class_usage_pct = compute_active_pct(total, active);
	else
		cpumon->class_usage_pct = 0;

	// Process TMU PE's
	total = active = 0;
	dmem_addr = virt_to_tmu_dmem(&tmu_cpu_ticks[0]);
	for (id = TMU0_ID; id <= TMU_MAX_ID; id++)
	{
		cpumon->cpu_usage_pct[id] = 0;
		if (pe_sync_stop(ctrl, (1 << id)) < 0)
			continue;
		ticks[0] = be32_to_cpu(pe_dmem_read(id, dmem_addr, 4));
		ticks[1] = be32_to_cpu(pe_dmem_read(id, dmem_addr + 4, 4));
		pe_dmem_write(id, 0, dmem_addr, 4);
		pe_dmem_write(id, 0, dmem_addr + 4, 4);
		pe_start(ctrl, (1 << id));
		if (id == TMU0_ID) { int x=0; if (++x == 10){x=0; printk("total=%x, active=%x\n",ticks[0],ticks[1]);}} //zzz
		ticks[0] >>= 8;	// divide both values by 256, so multiply by 100 won't overflow
		ticks[1] >>= 8;
		if (ticks[0] != 0)
			cpumon->cpu_usage_pct[id] = compute_active_pct(ticks[0], ticks[1]);
	}

	// Process Util PE
	dmem_addr = virt_to_util_dmem(&util_cpu_ticks[0]);
	cpumon->cpu_usage_pct[UTIL_ID] = 0;
	if (pe_sync_stop(ctrl, (1 << UTIL_ID)) < 0)
		return;
	ticks[0] = be32_to_cpu(pe_dmem_read(UTIL_ID, dmem_addr, 4));
	ticks[1] = be32_to_cpu(pe_dmem_read(UTIL_ID, dmem_addr + 4, 4));
	pe_dmem_write(UTIL_ID, 0, dmem_addr, 4);
	pe_dmem_write(UTIL_ID, 0, dmem_addr + 4, 4);
	pe_start(ctrl, (1 << UTIL_ID));
	ticks[0] >>= 8;	// divide both values by 256, so multiply by 100 won't overflow
	ticks[1] >>= 8;
	if (ticks[0] != 0)
		cpumon->cpu_usage_pct[UTIL_ID] = compute_active_pct(ticks[0], ticks[1]);
}

static int pfe_cpumon_init(struct pfe *pfe)
{
	timer_init(&cpumon_timer, cpumon_timer_handler);
	timer_add(&cpumon_timer, CT_CPUMON_INTERVAL);
	return 0;
}

static void pfe_cpumon_exit(struct pfe *pfe)
{
	timer_del(&cpumon_timer);
}


/*********************************************************************************/

// Memory monitor functions

void * pfe_kmalloc(size_t size, int flags)
{
	struct pfe_memmon *memmon = &pfe->memmon;
	void *ptr;
	ptr = kmalloc(size, flags);
	if (ptr)
		memmon->kernel_memory_allocated += ksize(ptr);
	return ptr;
}

void * pfe_kzalloc(size_t size, int flags)
{
	struct pfe_memmon *memmon = &pfe->memmon;
	void *ptr;
	ptr = kzalloc(size, flags);
	if (ptr)
		memmon->kernel_memory_allocated += ksize(ptr);
	return ptr;
}

void pfe_kfree(void *ptr)
{
	struct pfe_memmon *memmon = &pfe->memmon;
	memmon->kernel_memory_allocated -= ksize(ptr);
	kfree(ptr);
}

static int pfe_memmon_init(struct pfe *pfe)
{
	return 0;
}

static void pfe_memmon_exit(struct pfe *pfe)
{
}

/*********************************************************************************/


int pfe_perfmon_init(struct pfe *pfe)
{
	pfe_cpumon_init(pfe);
	pfe_memmon_init(pfe);
	return 0;
}

void pfe_perfmon_exit(struct pfe *pfe)
{
	pfe_cpumon_exit(pfe);
	pfe_memmon_exit(pfe);
}
