/* Copyright (c) 2009, 2012, 2015 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * Valmon Leymarie <leymariv@berkeley.edu>
 * Kevin Klues <klueska@cs.berkeley.edu>
 * See LICENSE for details.
 */

#pragma once

#include <stdbool.h>
#include <arch/topology.h>
#if defined(CONFIG_COREALLOC_FCFS)
  #include <corealloc_fcfs.h>
#elif defined(CONFIG_COREALLOC_PACKED)
  #include <corealloc_packed.h>
#else
  #error "Need a corealloc header!"
#endif

/* Initialize any data assocaited with doing core allocation. */
void corealloc_init(void);

/* Initialize any data associated with allocating cores to a process. */
void corealloc_proc_init(struct proc *p);

/* Find the best core to allocate to a process as dictated by the core
 * allocation algorithm. If no core is found, return -1. This code assumes
 * that the scheduler that uses it holds a lock for the duration of the call.
 * */
uint32_t __find_best_core_to_alloc(struct proc *p);

/* Track the pcore properly when it is allocated to p. This code assumes that
 * the scheduler that uses it holds a lock for the duration of the call. */
void __track_core_alloc(struct proc *p, uint32_t pcoreid);

/* Track the pcore properly when it is deallocated from p. This code assumes
 * that the scheduler that uses it holds a lock for the duration of the call.
 * */
void __track_core_dealloc(struct proc *p, uint32_t pcoreid);

/* Bulk interface for __track_core_dealloc */
void __track_core_dealloc_bulk(struct proc *p, uint32_t *pc_arr,
                               uint32_t nr_cores);

/* One off functions to make 'pcoreid' the next core chosen by the core
 * allocation algorithm (so long as no provisioned cores are still idle), and
 * to sort the idle core list for debugging. This code assumes that the
 * scheduler that uses it holds a lock for the duration of the call. */
void __next_core_to_alloc(uint32_t pcoreid);
void __sort_idle_cores(void);

/* Provision a core to proc p. This code assumes that the scheduler that uses
 * it holds a lock for the duration of the call. */
void __provision_core(struct proc *p, uint32_t pcoreid);

/* Unprovision all cores from proc p. This code assumes that the scheduler
 * that uses * it holds a lock for the duration of the call. */
void __unprovision_all_cores(struct proc *p);

/* Print the map of idle cores that are still allocatable through our core
 * allocation algorithm. */
void print_idle_core_map(void);

/* Print a list of the cores currently provisioned to p. */
void print_proc_coreprov(struct proc *p);

/* Print the processes attached to each provisioned core. */
void print_coreprov_map(void);

static inline struct proc *get_alloc_proc(uint32_t pcoreid)
{
	extern struct sched_pcore *all_pcores;

	return all_pcores[pcoreid].alloc_proc;
}

static inline struct proc *get_prov_proc(uint32_t pcoreid)
{
	extern struct sched_pcore *all_pcores;

	return all_pcores[pcoreid].prov_proc;
}

/* TODO: need more thorough CG/LL management.  For now, core0 is the only LL
 * core.  This won't play well with the ghetto shit in schedule_init() if you do
 * anything like 'DEDICATED_MONITOR' or the ARSC server.  All that needs an
 * overhaul. */
static inline bool is_ll_core(uint32_t pcoreid)
{
	if (pcoreid == 0)
		return TRUE;
	return FALSE;
}

/* Normally it'll be the max number of CG cores ever */
static inline uint32_t max_vcores(struct proc *p)
{
/* TODO: (CG/LL) */
#ifdef CONFIG_DISABLE_SMT
	return num_cores >> 1;
#else
	return num_cores - 1;	/* reserving core 0 */
#endif /* CONFIG_DISABLE_SMT */
}
