/*
 * Copyright (C) 2011-2016 ARM Limited. All rights reserved.
 * 
 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#include <linux/types.h>
#include <linux/version.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 29))
#include <mach/cpu.h>
#endif
#include "mali_kernel_common.h"
#include "mali_group.h"
#include "mali_osk.h"
#include "mali_l2_cache.h"
#include "mali_gp.h"
#include "mali_pp.h"
#include "mali_mmu.h"
#include "mali_dlbu.h"
#include "mali_broadcast.h"
#include "mali_scheduler.h"
#include "mali_osk_profiling.h"
#include "mali_osk_mali.h"
#include "mali_pm_domain.h"
#include "mali_pm.h"
#include "mali_executor.h"
#include <mali_platform.h>

#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
#include <linux/sched.h>
#include <trace/events/gpu.h>
#endif

#define MALI_MAX_NUM_DOMAIN_REFS (MALI_MAX_NUMBER_OF_GROUPS * 2)

#if defined(CONFIG_MALI400_PROFILING)
static void mali_group_report_l2_cache_counters_per_core(struct mali_group *group, u32 core_num);
#endif /* #if defined(CONFIG_MALI400_PROFILING) */

static struct mali_group *mali_global_groups[MALI_MAX_NUMBER_OF_GROUPS] = { NULL, };
static u32 mali_global_num_groups = 0;

/* SW timer for job execution */
int mali_max_job_runtime = MALI_MAX_JOB_RUNTIME_DEFAULT;

/* local helper functions */
static void mali_group_bottom_half_mmu(void *data);
static void mali_group_bottom_half_gp(void *data);
static void mali_group_bottom_half_pp(void *data);
static void mali_group_timeout(void *data);
static void mali_group_reset_pp(struct mali_group *group);
static void mali_group_reset_mmu(struct mali_group *group);

static void mali_group_activate_page_directory(struct mali_group *group, struct mali_session_data *session, mali_bool is_reload);
static void mali_group_recovery_reset(struct mali_group *group);

struct mali_group *mali_group_create(struct mali_l2_cache_core *core,
        struct mali_dlbu_core *dlbu,
        struct mali_bcast_unit *bcast,
        u32 domain_index)
{
    struct mali_group *group = NULL;

    if (mali_global_num_groups >= MALI_MAX_NUMBER_OF_GROUPS) {
        MALI_PRINT_ERROR(("Mali group: Too many group objects created\n"));
        return NULL;
    }

    group = _mali_osk_calloc(1, sizeof(struct mali_group));
    if (NULL != group) {
        group->timeout_timer = _mali_osk_timer_init();
        if (NULL != group->timeout_timer) {
            _mali_osk_timer_setcallback(group->timeout_timer, mali_group_timeout, (void *)group);

            group->l2_cache_core[0] = core;
            _mali_osk_list_init(&group->group_list);
            _mali_osk_list_init(&group->executor_list);
            _mali_osk_list_init(&group->pm_domain_list);
            group->bcast_core = bcast;
            group->dlbu_core = dlbu;

            /* register this object as a part of the correct power domain */
            if ((NULL != core) || (NULL != dlbu) || (NULL != bcast))
                group->pm_domain = mali_pm_register_group(domain_index, group);

            mali_global_groups[mali_global_num_groups] = group;
            mali_global_num_groups++;

            return group;
        }
        _mali_osk_free(group);
    }

    return NULL;
}

void mali_group_delete(struct mali_group *group)
{
    u32 i;

    MALI_DEBUG_PRINT(4, ("Deleting group %s\n",
                mali_group_core_description(group)));

    MALI_DEBUG_ASSERT(NULL == group->parent_group);
    MALI_DEBUG_ASSERT((MALI_GROUP_STATE_INACTIVE == group->state) || ((MALI_GROUP_STATE_ACTIVATION_PENDING == group->state)));

    /* Delete the resources that this group owns */
    if (NULL != group->gp_core) {
        mali_gp_delete(group->gp_core);
    }

    if (NULL != group->pp_core) {
        mali_pp_delete(group->pp_core);
    }

    if (NULL != group->mmu) {
        mali_mmu_delete(group->mmu);
    }

    if (mali_group_is_virtual(group)) {
        /* Remove all groups from virtual group */
        struct mali_group *child;
        struct mali_group *temp;

        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
            child->parent_group = NULL;
            mali_group_delete(child);
        }

        mali_dlbu_delete(group->dlbu_core);

        if (NULL != group->bcast_core) {
            mali_bcast_unit_delete(group->bcast_core);
        }
    }

    for (i = 0; i < mali_global_num_groups; i++) {
        if (mali_global_groups[i] == group) {
            mali_global_groups[i] = NULL;
            mali_global_num_groups--;

            if (i != mali_global_num_groups) {
                /* We removed a group from the middle of the array -- move the last
                 * group to the current position to close the gap */
                mali_global_groups[i] = mali_global_groups[mali_global_num_groups];
                mali_global_groups[mali_global_num_groups] = NULL;
            }

            break;
        }
    }

    if (NULL != group->timeout_timer) {
        _mali_osk_timer_del(group->timeout_timer);
        _mali_osk_timer_term(group->timeout_timer);
    }

    if (NULL != group->bottom_half_work_mmu) {
        _mali_osk_wq_delete_work(group->bottom_half_work_mmu);
    }

    if (NULL != group->bottom_half_work_gp) {
        _mali_osk_wq_delete_work(group->bottom_half_work_gp);
    }

    if (NULL != group->bottom_half_work_pp) {
        _mali_osk_wq_delete_work(group->bottom_half_work_pp);
    }

    _mali_osk_free(group);
}

_mali_osk_errcode_t mali_group_add_mmu_core(struct mali_group *group, struct mali_mmu_core *mmu_core)
{
    /* This group object now owns the MMU core object */
    group->mmu = mmu_core;
    group->bottom_half_work_mmu = _mali_osk_wq_create_work(mali_group_bottom_half_mmu, group);
    if (NULL == group->bottom_half_work_mmu) {
        return _MALI_OSK_ERR_FAULT;
    }
    return _MALI_OSK_ERR_OK;
}

void mali_group_remove_mmu_core(struct mali_group *group)
{
    /* This group object no longer owns the MMU core object */
    group->mmu = NULL;
    if (NULL != group->bottom_half_work_mmu) {
        _mali_osk_wq_delete_work(group->bottom_half_work_mmu);
    }
}

_mali_osk_errcode_t mali_group_add_gp_core(struct mali_group *group, struct mali_gp_core *gp_core)
{
    /* This group object now owns the GP core object */
    group->gp_core = gp_core;
    group->bottom_half_work_gp = _mali_osk_wq_create_work(mali_group_bottom_half_gp, group);
    if (NULL == group->bottom_half_work_gp) {
        return _MALI_OSK_ERR_FAULT;
    }
    return _MALI_OSK_ERR_OK;
}

void mali_group_remove_gp_core(struct mali_group *group)
{
    /* This group object no longer owns the GP core object */
    group->gp_core = NULL;
    if (NULL != group->bottom_half_work_gp) {
        _mali_osk_wq_delete_work(group->bottom_half_work_gp);
    }
}

_mali_osk_errcode_t mali_group_add_pp_core(struct mali_group *group, struct mali_pp_core *pp_core)
{
    /* This group object now owns the PP core object */
    group->pp_core = pp_core;
    group->bottom_half_work_pp = _mali_osk_wq_create_work(mali_group_bottom_half_pp, group);
    if (NULL == group->bottom_half_work_pp) {
        return _MALI_OSK_ERR_FAULT;
    }
    return _MALI_OSK_ERR_OK;
}

void mali_group_remove_pp_core(struct mali_group *group)
{
    /* This group object no longer owns the PP core object */
    group->pp_core = NULL;
    if (NULL != group->bottom_half_work_pp) {
        _mali_osk_wq_delete_work(group->bottom_half_work_pp);
    }
}

enum mali_group_state mali_group_activate(struct mali_group *group)
{
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_PRINT(4, ("Group: Activating group %s\n",
                mali_group_core_description(group)));

    if (MALI_GROUP_STATE_INACTIVE == group->state) {
        /* Group is inactive, get PM refs in order to power up */

        /*
         * We'll take a maximum of 2 power domain references pr group,
         * one for the group itself, and one for it's L2 cache.
         */
        struct mali_pm_domain *domains[MALI_MAX_NUM_DOMAIN_REFS];
        struct mali_group *groups[MALI_MAX_NUM_DOMAIN_REFS];
        u32 num_domains = 0;
        mali_bool all_groups_on;

        /* Deal with child groups first */
        if (mali_group_is_virtual(group)) {
            /*
             * The virtual group might have 0, 1 or 2 L2s in
             * its l2_cache_core array, but we ignore these and
             * let the child groups take the needed L2 cache ref
             * on behalf of the virtual group.
             * In other words; The L2 refs are taken in pair with
             * the physical group which the L2 is attached to.
             */
            struct mali_group *child;
            struct mali_group *temp;

            /*
             * Child group is inactive, get PM
             * refs in order to power up.
             */
            _MALI_OSK_LIST_FOREACHENTRY(child, temp,
                    &group->group_list,
                    struct mali_group, group_list) {
                MALI_DEBUG_ASSERT(MALI_GROUP_STATE_INACTIVE
                        == child->state);

                child->state = MALI_GROUP_STATE_ACTIVATION_PENDING;

                MALI_DEBUG_ASSERT_POINTER(
                        child->pm_domain);
                domains[num_domains] = child->pm_domain;
                groups[num_domains] = child;
                num_domains++;

                /*
                 * Take L2 domain ref for child group.
                 */
                MALI_DEBUG_ASSERT(MALI_MAX_NUM_DOMAIN_REFS
                        > num_domains);
                domains[num_domains] = mali_l2_cache_get_pm_domain(
                        child->l2_cache_core[0]);
                groups[num_domains] = NULL;
                MALI_DEBUG_ASSERT(NULL ==
                        child->l2_cache_core[1]);
                num_domains++;
            }
        } else {
            /* Take L2 domain ref for physical groups. */
            MALI_DEBUG_ASSERT(MALI_MAX_NUM_DOMAIN_REFS >
                    num_domains);

            domains[num_domains] = mali_l2_cache_get_pm_domain(
                    group->l2_cache_core[0]);
            groups[num_domains] = NULL;
            MALI_DEBUG_ASSERT(NULL == group->l2_cache_core[1]);
            num_domains++;
        }

        /* Do the group itself last (it's dependencies first) */

        group->state = MALI_GROUP_STATE_ACTIVATION_PENDING;

        MALI_DEBUG_ASSERT_POINTER(group->pm_domain);
        domains[num_domains] = group->pm_domain;
        groups[num_domains] = group;
        num_domains++;

        all_groups_on = mali_pm_get_domain_refs(domains, groups,
                num_domains);

        /*
         * Complete activation for group, include
         * virtual group or physical group.
         */
        if (MALI_TRUE == all_groups_on) {

            mali_group_set_active(group);
        }
    } else if (MALI_GROUP_STATE_ACTIVE == group->state) {
        /* Already active */
        MALI_DEBUG_ASSERT(MALI_TRUE == group->power_is_on);
    } else {
        /*
         * Activation already pending, group->power_is_on could
         * be both true or false. We need to wait for power up
         * notification anyway.
         */
        MALI_DEBUG_ASSERT(MALI_GROUP_STATE_ACTIVATION_PENDING
                == group->state);
    }

    MALI_DEBUG_PRINT(4, ("Group: group %s activation result: %s\n",
                mali_group_core_description(group),
                MALI_GROUP_STATE_ACTIVE == group->state ?
                "ACTIVE" : "PENDING"));

    return group->state;
}

mali_bool mali_group_set_active(struct mali_group *group)
{
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(MALI_GROUP_STATE_ACTIVATION_PENDING == group->state);
    MALI_DEBUG_ASSERT(MALI_TRUE == group->power_is_on);

    MALI_DEBUG_PRINT(4, ("Group: Activation completed for %s\n",
                mali_group_core_description(group)));

    if (mali_group_is_virtual(group)) {
        struct mali_group *child;
        struct mali_group *temp;

        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list,
                struct mali_group, group_list) {
            if (MALI_TRUE != child->power_is_on) {
                return MALI_FALSE;
            }

            child->state = MALI_GROUP_STATE_ACTIVE;
        }

        mali_group_reset(group);
    }

    /* Go to ACTIVE state */
    group->state = MALI_GROUP_STATE_ACTIVE;

    return MALI_TRUE;
}

mali_bool mali_group_deactivate(struct mali_group *group)
{
    struct mali_pm_domain *domains[MALI_MAX_NUM_DOMAIN_REFS];
    u32 num_domains = 0;
    mali_bool power_down = MALI_FALSE;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(MALI_GROUP_STATE_INACTIVE != group->state);

    MALI_DEBUG_PRINT(3, ("Group: Deactivating group %s\n",
                mali_group_core_description(group)));

    group->state = MALI_GROUP_STATE_INACTIVE;

    MALI_DEBUG_ASSERT_POINTER(group->pm_domain);
    domains[num_domains] = group->pm_domain;
    num_domains++;

    if (mali_group_is_virtual(group)) {
        /* Release refs for all child groups */
        struct mali_group *child;
        struct mali_group *temp;

        _MALI_OSK_LIST_FOREACHENTRY(child, temp,
                &group->group_list,
                struct mali_group, group_list) {
            child->state = MALI_GROUP_STATE_INACTIVE;

            MALI_DEBUG_ASSERT_POINTER(child->pm_domain);
            domains[num_domains] = child->pm_domain;
            num_domains++;

            /* Release L2 cache domain for child groups */
            MALI_DEBUG_ASSERT(MALI_MAX_NUM_DOMAIN_REFS >
                    num_domains);
            domains[num_domains] = mali_l2_cache_get_pm_domain(
                    child->l2_cache_core[0]);
            MALI_DEBUG_ASSERT(NULL == child->l2_cache_core[1]);
            num_domains++;
        }

        /*
         * Must do mali_group_power_down() steps right here for
         * virtual group, because virtual group itself is likely to
         * stay powered on, however child groups are now very likely
         * to be powered off (and thus lose their state).
         */

        mali_group_clear_session(group);
        /*
         * Disable the broadcast unit (clear it's mask).
         * This is needed in case the GPU isn't actually
         * powered down at this point and groups are
         * removed from an inactive virtual group.
         * If not, then the broadcast unit will intercept
         * their interrupts!
         */
        mali_bcast_disable(group->bcast_core);
    } else {
        /* Release L2 cache domain for physical groups */
        MALI_DEBUG_ASSERT(MALI_MAX_NUM_DOMAIN_REFS >
                num_domains);
        domains[num_domains] = mali_l2_cache_get_pm_domain(
                group->l2_cache_core[0]);
        MALI_DEBUG_ASSERT(NULL == group->l2_cache_core[1]);
        num_domains++;
    }

    power_down = mali_pm_put_domain_refs(domains, num_domains);

    return power_down;
}

void mali_group_power_up(struct mali_group *group)
{
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_PRINT(3, ("Group: Power up for %s\n",
                mali_group_core_description(group)));

    group->power_is_on = MALI_TRUE;

    if (MALI_FALSE == mali_group_is_virtual(group)
            && MALI_FALSE == mali_group_is_in_virtual(group)) {
        mali_group_reset(group);
    }

    /*
     * When we just acquire only one physical group form virt group,
     * we should remove the bcast&dlbu mask from virt group and
     * reset bcast and dlbu core, although part of pp cores in virt
     * group maybe not be powered on.
     */
    if (MALI_TRUE == mali_group_is_virtual(group)) {
        mali_bcast_reset(group->bcast_core);
        mali_dlbu_update_mask(group->dlbu_core);
    }
}

void mali_group_power_down(struct mali_group *group)
{
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT(MALI_TRUE == group->power_is_on);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_PRINT(3, ("Group: Power down for %s\n",
                mali_group_core_description(group)));

    group->power_is_on = MALI_FALSE;

    if (mali_group_is_virtual(group)) {
        /*
         * What we do for physical jobs in this function should
         * already have been done in mali_group_deactivate()
         * for virtual group.
         */
        MALI_DEBUG_ASSERT(NULL == group->session);
    } else {
        mali_group_clear_session(group);
    }
}

MALI_DEBUG_CODE(static void mali_group_print_virtual(struct mali_group *vgroup)
        {
        u32 i;
        struct mali_group *group;
        struct mali_group *temp;

        MALI_DEBUG_PRINT(4, ("Virtual group %s (%p)\n",
                mali_group_core_description(vgroup),
                vgroup));
        MALI_DEBUG_PRINT(4, ("l2_cache_core[0] = %p, ref = %d\n", vgroup->l2_cache_core[0], vgroup->l2_cache_core_ref_count[0]));
        MALI_DEBUG_PRINT(4, ("l2_cache_core[1] = %p, ref = %d\n", vgroup->l2_cache_core[1], vgroup->l2_cache_core_ref_count[1]));

        i = 0;
        _MALI_OSK_LIST_FOREACHENTRY(group, temp, &vgroup->group_list, struct mali_group, group_list) {
        MALI_DEBUG_PRINT(4, ("[%d] %s (%p), l2_cache_core[0] = %p\n",
                i, mali_group_core_description(group),
                group, group->l2_cache_core[0]));
        i++;
        }
        })

static void mali_group_dump_core_status(struct mali_group *group)
{
	u32 i;

	MALI_DEBUG_ASSERT_POINTER(group);
	MALI_DEBUG_ASSERT(NULL != group->gp_core || (NULL != group->pp_core && !mali_group_is_virtual(group)));

	if (NULL != group->gp_core) {
		MALI_PRINT(("Dump Group %s\n", group->gp_core->hw_core.description));

		for (i = 0; i < 0xA8; i += 0x10) {
			MALI_PRINT(("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, mali_hw_core_register_read(&group->gp_core->hw_core, i),
				    mali_hw_core_register_read(&group->gp_core->hw_core, i + 4),
				    mali_hw_core_register_read(&group->gp_core->hw_core, i + 8),
				    mali_hw_core_register_read(&group->gp_core->hw_core, i + 12)));
		}


	} else {
		MALI_PRINT(("Dump Group %s\n", group->pp_core->hw_core.description));

		for (i = 0; i < 0x5c; i += 0x10) {
			MALI_PRINT(("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, mali_hw_core_register_read(&group->pp_core->hw_core, i),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 4),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 8),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 12)));
		}

		/* Ignore some minor registers */
		for (i = 0x1000; i < 0x1068; i += 0x10) {
			MALI_PRINT(("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, mali_hw_core_register_read(&group->pp_core->hw_core, i),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 4),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 8),
				    mali_hw_core_register_read(&group->pp_core->hw_core, i + 12)));
		}
	}

	MALI_PRINT(("Dump Group MMU\n"));
	for (i = 0; i < 0x24; i += 0x10) {
		MALI_PRINT(("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, mali_hw_core_register_read(&group->mmu->hw_core, i),
			    mali_hw_core_register_read(&group->mmu->hw_core, i + 4),
			    mali_hw_core_register_read(&group->mmu->hw_core, i + 8),
			    mali_hw_core_register_read(&group->mmu->hw_core, i + 12)));
	}
}


/**
 * @Dump group status
 */
void mali_group_dump_status(struct mali_group *group)
{
	MALI_DEBUG_ASSERT_POINTER(group);

	if (mali_group_is_virtual(group)) {
		struct mali_group *group_c;
		struct mali_group *temp;
		_MALI_OSK_LIST_FOREACHENTRY(group_c, temp, &group->group_list, struct mali_group, group_list) {
			mali_group_dump_core_status(group_c);
		}
	} else {
		mali_group_dump_core_status(group);
	}
}

/**
 * @brief Add child group to virtual group parent
 */
void mali_group_add_group(struct mali_group *parent, struct mali_group *child)
{
    mali_bool found;
    u32 i;

    MALI_DEBUG_PRINT(3, ("Adding group %s to virtual group %s\n",
                mali_group_core_description(child),
                mali_group_core_description(parent)));

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(mali_group_is_virtual(parent));
    MALI_DEBUG_ASSERT(!mali_group_is_virtual(child));
    MALI_DEBUG_ASSERT(NULL == child->parent_group);

    _mali_osk_list_addtail(&child->group_list, &parent->group_list);

    child->parent_group = parent;

    MALI_DEBUG_ASSERT_POINTER(child->l2_cache_core[0]);

    MALI_DEBUG_PRINT(4, ("parent->l2_cache_core: [0] = %p, [1] = %p\n", parent->l2_cache_core[0], parent->l2_cache_core[1]));
    MALI_DEBUG_PRINT(4, ("child->l2_cache_core: [0] = %p, [1] = %p\n", child->l2_cache_core[0], child->l2_cache_core[1]));

    /* Keep track of the L2 cache cores of child groups */
    found = MALI_FALSE;
    for (i = 0; i < 2; i++) {
        if (parent->l2_cache_core[i] == child->l2_cache_core[0]) {
            MALI_DEBUG_ASSERT(parent->l2_cache_core_ref_count[i] > 0);
            parent->l2_cache_core_ref_count[i]++;
            found = MALI_TRUE;
        }
    }

    if (!found) {
        /* First time we see this L2 cache, add it to our list */
        i = (NULL == parent->l2_cache_core[0]) ? 0 : 1;

        MALI_DEBUG_PRINT(4, ("First time we see l2_cache %p. Adding to [%d] = %p\n", child->l2_cache_core[0], i, parent->l2_cache_core[i]));

        MALI_DEBUG_ASSERT(NULL == parent->l2_cache_core[i]);

        parent->l2_cache_core[i] = child->l2_cache_core[0];
        parent->l2_cache_core_ref_count[i]++;
    }

    /* Update Broadcast Unit and DLBU */
    mali_bcast_add_group(parent->bcast_core, child);
    mali_dlbu_add_group(parent->dlbu_core, child);

    if (MALI_TRUE == parent->power_is_on) {
        mali_bcast_reset(parent->bcast_core);
        mali_dlbu_update_mask(parent->dlbu_core);
    }

    if (MALI_TRUE == child->power_is_on) {
        if (NULL == parent->session) {
            if (NULL != child->session) {
                /*
                 * Parent has no session, so clear
                 * child session as well.
                 */
                mali_mmu_activate_empty_page_directory(child->mmu);
            }
        } else {
            if (parent->session == child->session) {
                /* We already have same session as parent,
                 * so a simple zap should be enough.
                 */
                mali_mmu_zap_tlb(child->mmu);
            } else {
                /*
                 * Parent has a different session, so we must
                 * switch to that sessions page table
                 */
                mali_mmu_activate_page_directory(child->mmu, mali_session_get_page_directory(parent->session));
            }

            /* It is the parent which keeps the session from now on */
            child->session = NULL;
        }
    } else {
        /* should have been cleared when child was powered down */
        MALI_DEBUG_ASSERT(NULL == child->session);
    }

    /* Start job on child when parent is active */
    if (NULL != parent->pp_running_job) {
        struct mali_pp_job *job = parent->pp_running_job;

        MALI_DEBUG_PRINT(3, ("Group %x joining running job %d on virtual group %x\n",
                    child, mali_pp_job_get_id(job), parent));

        /* Only allowed to add active child to an active parent */
        MALI_DEBUG_ASSERT(MALI_GROUP_STATE_ACTIVE == parent->state);
        MALI_DEBUG_ASSERT(MALI_GROUP_STATE_ACTIVE == child->state);

        mali_pp_job_start(child->pp_core, job, mali_pp_core_get_id(child->pp_core), MALI_TRUE);

        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(child->pp_core)) |
                MALI_PROFILING_EVENT_REASON_SINGLE_HW_FLUSH,
                mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job), 0, 0, 0);

        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(child->pp_core)) |
                MALI_PROFILING_EVENT_REASON_START_STOP_HW_VIRTUAL,
                mali_pp_job_get_pid(job), mali_pp_job_get_tid(job), 0, 0, 0);
#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
        trace_gpu_sched_switch(
                mali_pp_core_description(group->pp_core),
                sched_clock(), mali_pp_job_get_tid(job),
                0, mali_pp_job_get_id(job));
#endif

#if defined(CONFIG_MALI400_PROFILING)
        trace_mali_core_active(mali_pp_job_get_pid(job), 1 /* active */, 0 /* PP */, mali_pp_core_get_id(child->pp_core),
                mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job));
#endif
    }

    MALI_DEBUG_CODE(mali_group_print_virtual(parent);)
}

/**
 * @brief Remove child group from virtual group parent
 */
void mali_group_remove_group(struct mali_group *parent, struct mali_group *child)
{
    u32 i;

    MALI_DEBUG_PRINT(3, ("Removing group %s from virtual group %s\n",
                mali_group_core_description(child),
                mali_group_core_description(parent)));

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(mali_group_is_virtual(parent));
    MALI_DEBUG_ASSERT(!mali_group_is_virtual(child));
    MALI_DEBUG_ASSERT(parent == child->parent_group);

    /* Update Broadcast Unit and DLBU */
    mali_bcast_remove_group(parent->bcast_core, child);
    mali_dlbu_remove_group(parent->dlbu_core, child);

    if (MALI_TRUE == parent->power_is_on) {
        mali_bcast_reset(parent->bcast_core);
        mali_dlbu_update_mask(parent->dlbu_core);
    }

    child->session = parent->session;
    child->parent_group = NULL;

    _mali_osk_list_delinit(&child->group_list);
    if (_mali_osk_list_empty(&parent->group_list)) {
        parent->session = NULL;
    }

    /* Keep track of the L2 cache cores of child groups */
    i = (child->l2_cache_core[0] == parent->l2_cache_core[0]) ? 0 : 1;

    MALI_DEBUG_ASSERT(child->l2_cache_core[0] == parent->l2_cache_core[i]);

    parent->l2_cache_core_ref_count[i]--;
    if (parent->l2_cache_core_ref_count[i] == 0) {
        parent->l2_cache_core[i] = NULL;
    }

    MALI_DEBUG_CODE(mali_group_print_virtual(parent));
}

struct mali_group *mali_group_acquire_group(struct mali_group *parent)
{
    struct mali_group *child = NULL;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(mali_group_is_virtual(parent));

    if (!_mali_osk_list_empty(&parent->group_list)) {
        child = _MALI_OSK_LIST_ENTRY(parent->group_list.prev, struct mali_group, group_list);
        mali_group_remove_group(parent, child);
    }

    if (NULL != child) {
        if (MALI_GROUP_STATE_ACTIVE != parent->state
                && MALI_TRUE == child->power_is_on) {
            mali_group_reset(child);
        }
    }

    return child;
}

void mali_group_reset(struct mali_group *group)
{
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT(NULL == group->gp_running_job);
    MALI_DEBUG_ASSERT(NULL == group->pp_running_job);
    MALI_DEBUG_ASSERT(NULL == group->session);

    MALI_DEBUG_PRINT(3, ("Group: reset of %s\n",
                mali_group_core_description(group)));

    if (NULL != group->dlbu_core) {
        mali_dlbu_reset(group->dlbu_core);
    }

    if (NULL != group->bcast_core) {
        mali_bcast_reset(group->bcast_core);
    }

    MALI_DEBUG_ASSERT(NULL != group->mmu);
    mali_group_reset_mmu(group);

    if (NULL != group->gp_core) {
        MALI_DEBUG_ASSERT(NULL == group->pp_core);
        mali_gp_reset(group->gp_core);
    } else {
        MALI_DEBUG_ASSERT(NULL != group->pp_core);
        mali_group_reset_pp(group);
    }
}

void mali_group_start_gp_job(struct mali_group *group, struct mali_gp_job *job, mali_bool gpu_secure_mode_pre_enabled)
{
    struct mali_session_data *session;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_PRINT(3, ("Group: Starting GP job 0x%08X on group %s\n",
                job,
                mali_group_core_description(group)));

    session = mali_gp_job_get_session(job);

    MALI_DEBUG_ASSERT_POINTER(group->l2_cache_core[0]);
    mali_l2_cache_invalidate_conditional(group->l2_cache_core[0], mali_gp_job_get_cache_order(job));

	/* Reset GPU and disable gpu secure mode if needed. */
	if (MALI_TRUE == _mali_osk_gpu_secure_mode_is_enabled()) {
		struct mali_pmu_core *pmu = mali_pmu_get_global_pmu_core();
		_mali_osk_gpu_reset_and_secure_mode_disable();
		/* Need to disable the pmu interrupt mask register */
		if (NULL != pmu) {
			mali_pmu_reset(pmu);
		}
	}

	/* Reload mmu page table if needed */
	if (MALI_TRUE == gpu_secure_mode_pre_enabled) {
		mali_group_reset(group);
		mali_group_activate_page_directory(group, session, MALI_TRUE);
	} else {
		mali_group_activate_page_directory(group, session, MALI_FALSE);
	}

    mali_gp_job_start(group->gp_core, job);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE |
            MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0) |
            MALI_PROFILING_EVENT_REASON_SINGLE_HW_FLUSH,
            mali_gp_job_get_frame_builder_id(job), mali_gp_job_get_flush_id(job), 0, 0, 0);
    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
            MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0),
            mali_gp_job_get_pid(job), mali_gp_job_get_tid(job), 0, 0, 0);

#if defined(CONFIG_MALI400_PROFILING)
    trace_mali_core_active(mali_gp_job_get_pid(job), 1 /* active */, 1 /* GP */,  0 /* core */,
            mali_gp_job_get_frame_builder_id(job), mali_gp_job_get_flush_id(job));
#endif

#if defined(CONFIG_MALI400_PROFILING)
    if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
            (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0]))) {
        mali_group_report_l2_cache_counters_per_core(group, 0);
    }
#endif /* #if defined(CONFIG_MALI400_PROFILING) */

#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
    trace_gpu_sched_switch(mali_gp_core_description(group->gp_core),
            sched_clock(), mali_gp_job_get_tid(job),
            0, mali_gp_job_get_id(job));
#endif

    group->gp_running_job = job;
    group->is_working = MALI_TRUE;

    /* Setup SW timer and record start time */
    group->start_time = _mali_osk_time_tickcount();
    _mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));

    MALI_DEBUG_PRINT(4, ("Group: Started GP job 0x%08X on group %s at %u\n",
                job,
                mali_group_core_description(group),
                group->start_time));
}

/* Used to set all the registers except frame renderer list address and fragment shader stack address
 * It means the caller must set these two registers properly before calling this function
 */
void mali_group_start_pp_job(struct mali_group *group, struct mali_pp_job *job, u32 sub_job, mali_bool gpu_secure_mode_pre_enabled)
{
    struct mali_session_data *session;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_PRINT(3, ("Group: Starting PP job 0x%08X part %u/%u on group %s\n",
                job, sub_job + 1,
                mali_pp_job_get_sub_job_count(job),
                mali_group_core_description(group)));

    session = mali_pp_job_get_session(job);

    if (NULL != group->l2_cache_core[0]) {
        mali_l2_cache_invalidate_conditional(group->l2_cache_core[0], mali_pp_job_get_cache_order(job));
    }

    if (NULL != group->l2_cache_core[1]) {
        mali_l2_cache_invalidate_conditional(group->l2_cache_core[1], mali_pp_job_get_cache_order(job));
    }

	/* Reset GPU and change gpu secure mode if needed. */
	if (MALI_TRUE == mali_pp_job_is_protected_job(job) && MALI_FALSE == _mali_osk_gpu_secure_mode_is_enabled()) {
		struct mali_pmu_core *pmu = mali_pmu_get_global_pmu_core();
		_mali_osk_gpu_reset_and_secure_mode_enable();
		/* Need to disable the pmu interrupt mask register */
		if (NULL != pmu) {
			mali_pmu_reset(pmu);
		}
	} else if (MALI_FALSE == mali_pp_job_is_protected_job(job) && MALI_TRUE == _mali_osk_gpu_secure_mode_is_enabled()) {
		struct mali_pmu_core *pmu = mali_pmu_get_global_pmu_core();
		_mali_osk_gpu_reset_and_secure_mode_disable();
		/* Need to disable the pmu interrupt mask register */
		if (NULL != pmu) {
			mali_pmu_reset(pmu);
		}
	}

	/* Reload the mmu page table if needed */
	if ((MALI_TRUE == mali_pp_job_is_protected_job(job) && MALI_FALSE == gpu_secure_mode_pre_enabled)
	    || (MALI_FALSE == mali_pp_job_is_protected_job(job) && MALI_TRUE == gpu_secure_mode_pre_enabled)) {
		mali_group_reset(group);
		mali_group_activate_page_directory(group, session, MALI_TRUE);
	} else {
		mali_group_activate_page_directory(group, session, MALI_FALSE);
	}

    if (mali_group_is_virtual(group)) {
        struct mali_group *child;
        struct mali_group *temp;
        u32 core_num = 0;

        MALI_DEBUG_ASSERT(mali_pp_job_is_virtual(job));

        /* Configure DLBU for the job */
        mali_dlbu_config_job(group->dlbu_core, job);

        /* Write stack address for each child group */
        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
            mali_pp_write_addr_stack(child->pp_core, job);
            core_num++;
        }

        mali_pp_job_start(group->pp_core, job, sub_job, MALI_FALSE);
    } else {
        mali_pp_job_start(group->pp_core, job, sub_job, MALI_FALSE);
    }

    /* if the group is virtual, loop through physical groups which belong to this group
     * and call profiling events for its cores as virtual */
    if (MALI_TRUE == mali_group_is_virtual(group)) {
        struct mali_group *child;
        struct mali_group *temp;

        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
            _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE |
                    MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(child->pp_core)) |
                    MALI_PROFILING_EVENT_REASON_SINGLE_HW_FLUSH,
                    mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job), 0, 0, 0);

            _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                    MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(child->pp_core)) |
                    MALI_PROFILING_EVENT_REASON_START_STOP_HW_VIRTUAL,
                    mali_pp_job_get_pid(job), mali_pp_job_get_tid(job), 0, 0, 0);

#if defined(CONFIG_MALI400_PROFILING)
            trace_mali_core_active(mali_pp_job_get_pid(job), 1 /* active */, 0 /* PP */, mali_pp_core_get_id(child->pp_core),
                    mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job));
#endif
        }

#if defined(CONFIG_MALI400_PROFILING)
        if (0 != group->l2_cache_core_ref_count[0]) {
            if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
                    (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0]))) {
                mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[0]));
            }
        }
        if (0 != group->l2_cache_core_ref_count[1]) {
            if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[1])) &&
                    (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[1]))) {
                mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[1]));
            }
        }
#endif /* #if defined(CONFIG_MALI400_PROFILING) */

    } else { /* group is physical - call profiling events for physical cores */
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(group->pp_core)) |
                MALI_PROFILING_EVENT_REASON_SINGLE_HW_FLUSH,
                mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job), 0, 0, 0);

        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(group->pp_core)) |
                MALI_PROFILING_EVENT_REASON_START_STOP_HW_PHYSICAL,
                mali_pp_job_get_pid(job), mali_pp_job_get_tid(job), 0, 0, 0);

#if defined(CONFIG_MALI400_PROFILING)
        trace_mali_core_active(mali_pp_job_get_pid(job), 1 /* active */, 0 /* PP */, mali_pp_core_get_id(group->pp_core),
                mali_pp_job_get_frame_builder_id(job), mali_pp_job_get_flush_id(job));
#endif

#if defined(CONFIG_MALI400_PROFILING)
        if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
                (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0]))) {
            mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[0]));
        }
#endif /* #if defined(CONFIG_MALI400_PROFILING) */
    }

#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
    trace_gpu_sched_switch(mali_pp_core_description(group->pp_core),
            sched_clock(), mali_pp_job_get_tid(job),
            0, mali_pp_job_get_id(job));
#endif

    group->pp_running_job = job;
    group->pp_running_sub_job = sub_job;
    group->is_working = MALI_TRUE;

    /* Setup SW timer and record start time */
    group->start_time = _mali_osk_time_tickcount();
    _mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));

    MALI_DEBUG_PRINT(4, ("Group: Started PP job 0x%08X part %u/%u on group %s at %u\n",
                job, sub_job + 1,
                mali_pp_job_get_sub_job_count(job),
                mali_group_core_description(group),
                group->start_time));

}

void mali_group_resume_gp_with_new_heap(struct mali_group *group, u32 job_id, u32 start_addr, u32 end_addr)
{
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    MALI_DEBUG_ASSERT_POINTER(group->l2_cache_core[0]);
    mali_l2_cache_invalidate(group->l2_cache_core[0]);

    mali_mmu_zap_tlb_without_stall(group->mmu);

    mali_gp_resume_with_new_heap(group->gp_core, start_addr, end_addr);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_RESUME |
            MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0),
            0, 0, 0, 0, 0);

#if defined(CONFIG_MALI400_PROFILING)
    trace_mali_core_active(mali_gp_job_get_pid(group->gp_running_job), 1 /* active */, 1 /* GP */,  0 /* core */,
            mali_gp_job_get_frame_builder_id(group->gp_running_job), mali_gp_job_get_flush_id(group->gp_running_job));
#endif
}

static void mali_group_reset_mmu(struct mali_group *group)
{
    struct mali_group *child;
    struct mali_group *temp;
    _mali_osk_errcode_t err;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    if (!mali_group_is_virtual(group)) {
        /* This is a physical group or an idle virtual group -- simply wait for
         * the reset to complete. */
        err = mali_mmu_reset(group->mmu);
        MALI_DEBUG_ASSERT(_MALI_OSK_ERR_OK == err);
    } else { /* virtual group */
        /* Loop through all members of this virtual group and wait
         * until they are done resetting.
         */
        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
            err = mali_mmu_reset(child->mmu);
            MALI_DEBUG_ASSERT(_MALI_OSK_ERR_OK == err);
        }
    }
}

static void mali_group_reset_pp(struct mali_group *group)
{
    struct mali_group *child;
    struct mali_group *temp;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    mali_pp_reset_async(group->pp_core);

    if (!mali_group_is_virtual(group) || NULL == group->pp_running_job) {
        /* This is a physical group or an idle virtual group -- simply wait for
         * the reset to complete. */
        mali_pp_reset_wait(group->pp_core);
    } else {
        /* Loop through all members of this virtual group and wait until they
         * are done resetting.
         */
        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
            mali_pp_reset_wait(child->pp_core);
        }
    }
}

struct mali_pp_job *mali_group_complete_pp(struct mali_group *group, mali_bool success, u32 *sub_job)
{
    struct mali_pp_job *pp_job_to_return;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->pp_core);
    MALI_DEBUG_ASSERT_POINTER(group->pp_running_job);
    MALI_DEBUG_ASSERT_POINTER(sub_job);
    MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working);

    /* Stop/clear the timeout timer. */
    _mali_osk_timer_del_async(group->timeout_timer);

    if (NULL != group->pp_running_job) {

        /* Deal with HW counters and profiling */

        if (MALI_TRUE == mali_group_is_virtual(group)) {
            struct mali_group *child;
            struct mali_group *temp;

            /* update performance counters from each physical pp core within this virtual group */
            _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
                mali_pp_update_performance_counters(group->pp_core, child->pp_core, group->pp_running_job, mali_pp_core_get_id(child->pp_core));
            }

#if defined(CONFIG_MALI400_PROFILING)
            /* send profiling data per physical core */
            _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
                _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                        MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(child->pp_core)) |
                        MALI_PROFILING_EVENT_REASON_START_STOP_HW_VIRTUAL,
                        mali_pp_job_get_perf_counter_value0(group->pp_running_job, mali_pp_core_get_id(child->pp_core)),
                        mali_pp_job_get_perf_counter_value1(group->pp_running_job, mali_pp_core_get_id(child->pp_core)),
                        mali_pp_job_get_perf_counter_src0(group->pp_running_job, group->pp_running_sub_job) | (mali_pp_job_get_perf_counter_src1(group->pp_running_job, group->pp_running_sub_job) << 8),
                        0, 0);

                trace_mali_core_active(mali_pp_job_get_pid(group->pp_running_job),
                        0 /* active */, 0 /* PP */, mali_pp_core_get_id(child->pp_core),
                        mali_pp_job_get_frame_builder_id(group->pp_running_job),
                        mali_pp_job_get_flush_id(group->pp_running_job));
            }
            if (0 != group->l2_cache_core_ref_count[0]) {
                if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
                        (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0]))) {
                    mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[0]));
                }
            }
            if (0 != group->l2_cache_core_ref_count[1]) {
                if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[1])) &&
                        (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[1]))) {
                    mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[1]));
                }
            }

#endif
        } else {
            /* update performance counters for a physical group's pp core */
            mali_pp_update_performance_counters(group->pp_core, group->pp_core, group->pp_running_job, group->pp_running_sub_job);

#if defined(CONFIG_MALI400_PROFILING)
            _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                    MALI_PROFILING_MAKE_EVENT_CHANNEL_PP(mali_pp_core_get_id(group->pp_core)) |
                    MALI_PROFILING_EVENT_REASON_START_STOP_HW_PHYSICAL,
                    mali_pp_job_get_perf_counter_value0(group->pp_running_job, group->pp_running_sub_job),
                    mali_pp_job_get_perf_counter_value1(group->pp_running_job, group->pp_running_sub_job),
                    mali_pp_job_get_perf_counter_src0(group->pp_running_job, group->pp_running_sub_job) | (mali_pp_job_get_perf_counter_src1(group->pp_running_job, group->pp_running_sub_job) << 8),
                    0, 0);

            trace_mali_core_active(mali_pp_job_get_pid(group->pp_running_job),
                    0 /* active */, 0 /* PP */, mali_pp_core_get_id(group->pp_core),
                    mali_pp_job_get_frame_builder_id(group->pp_running_job),
                    mali_pp_job_get_flush_id(group->pp_running_job));

            if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
                    (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0]))) {
                mali_group_report_l2_cache_counters_per_core(group, mali_l2_cache_get_id(group->l2_cache_core[0]));
            }
#endif
        }

#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
        trace_gpu_sched_switch(
                mali_gp_core_description(group->gp_core),
                sched_clock(), 0, 0, 0);
#endif

    }

    if (success) {
        /* Only do soft reset for successful jobs, a full recovery
         * reset will be done for failed jobs. */
        mali_pp_reset_async(group->pp_core);
    }

    pp_job_to_return = group->pp_running_job;
    group->pp_running_job = NULL;
    group->is_working = MALI_FALSE;
    *sub_job = group->pp_running_sub_job;

    if (!success) {
        MALI_DEBUG_PRINT(2, ("Mali group: Executing recovery reset due to job failure\n"));
        mali_group_recovery_reset(group);
    } else if (_MALI_OSK_ERR_OK != mali_pp_reset_wait(group->pp_core)) {
        MALI_PRINT_ERROR(("Mali group: Executing recovery reset due to reset failure\n"));
        mali_group_recovery_reset(group);
    }

    return pp_job_to_return;
}

struct mali_gp_job *mali_group_complete_gp(struct mali_group *group, mali_bool success)
{
    struct mali_gp_job *gp_job_to_return;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->gp_core);
    MALI_DEBUG_ASSERT_POINTER(group->gp_running_job);
    MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working);

    /* Stop/clear the timeout timer. */
    _mali_osk_timer_del_async(group->timeout_timer);

    if (NULL != group->gp_running_job) {
        mali_gp_update_performance_counters(group->gp_core, group->gp_running_job);

#if defined(CONFIG_MALI400_PROFILING)
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP | MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0),
                mali_gp_job_get_perf_counter_value0(group->gp_running_job),
                mali_gp_job_get_perf_counter_value1(group->gp_running_job),
                mali_gp_job_get_perf_counter_src0(group->gp_running_job) | (mali_gp_job_get_perf_counter_src1(group->gp_running_job) << 8),
                0, 0);

        if ((MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src0(group->l2_cache_core[0])) &&
                (MALI_HW_CORE_NO_COUNTER != mali_l2_cache_core_get_counter_src1(group->l2_cache_core[0])))
            mali_group_report_l2_cache_counters_per_core(group, 0);
#endif

#if defined(CONFIG_GPU_TRACEPOINTS) && defined(CONFIG_TRACEPOINTS)
        trace_gpu_sched_switch(
                mali_pp_core_description(group->pp_core),
                sched_clock(), 0, 0, 0);
#endif

#if defined(CONFIG_MALI400_PROFILING)
        trace_mali_core_active(mali_gp_job_get_pid(group->gp_running_job), 0 /* active */, 1 /* GP */,  0 /* core */,
                mali_gp_job_get_frame_builder_id(group->gp_running_job), mali_gp_job_get_flush_id(group->gp_running_job));
#endif

        mali_gp_job_set_current_heap_addr(group->gp_running_job,
                mali_gp_read_plbu_alloc_start_addr(group->gp_core));
    }

    if (success) {
        /* Only do soft reset for successful jobs, a full recovery
         * reset will be done for failed jobs. */
        mali_gp_reset_async(group->gp_core);
    }

    gp_job_to_return = group->gp_running_job;
    group->gp_running_job = NULL;
    group->is_working = MALI_FALSE;

    if (!success) {
        MALI_DEBUG_PRINT(2, ("Mali group: Executing recovery reset due to job failure\n"));
        mali_group_recovery_reset(group);
    } else if (_MALI_OSK_ERR_OK != mali_gp_reset_wait(group->gp_core)) {
        MALI_PRINT_ERROR(("Mali group: Executing recovery reset due to reset failure\n"));
        mali_group_recovery_reset(group);
    }

    return gp_job_to_return;
}

struct mali_group *mali_group_get_glob_group(u32 index)
{
    if (mali_global_num_groups > index) {
        return mali_global_groups[index];
    }

    return NULL;
}

u32 mali_group_get_glob_num_groups(void)
{
    return mali_global_num_groups;
}

static void mali_group_activate_page_directory(struct mali_group *group, struct mali_session_data *session, mali_bool is_reload)
{
    MALI_DEBUG_PRINT(5, ("Mali group: Activating page directory 0x%08X from session 0x%08X on group %s\n",
                mali_session_get_page_directory(session), session,
                mali_group_core_description(group)));

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

	if (group->session != session || MALI_TRUE == is_reload) {
		/* Different session than last time, so we need to do some work */
		MALI_DEBUG_PRINT(5, ("Mali group: Activate session: %08x previous: %08x on group %s\n",
				     session, group->session,
				     mali_group_core_description(group)));
		mali_mmu_activate_page_directory(group->mmu, mali_session_get_page_directory(session));
		group->session = session;
	} else {
		/* Same session as last time, so no work required */
		MALI_DEBUG_PRINT(4, ("Mali group: Activate existing session 0x%08X on group %s\n",
				     session->page_directory,
				     mali_group_core_description(group)));
		mali_mmu_zap_tlb_without_stall(group->mmu);
	}
}

static void mali_group_recovery_reset(struct mali_group *group)
{
    _mali_osk_errcode_t err;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    /* Stop cores, bus stop */
    if (NULL != group->pp_core) {
        mali_pp_stop_bus(group->pp_core);
    } else {
        mali_gp_stop_bus(group->gp_core);
    }

    /* Flush MMU and clear page fault (if any) */
    mali_mmu_activate_fault_flush_page_directory(group->mmu);
    mali_mmu_page_fault_done(group->mmu);

    /* Wait for cores to stop bus, then do a hard reset on them */
    if (NULL != group->pp_core) {
        if (mali_group_is_virtual(group)) {
            struct mali_group *child, *temp;

            /* Disable the broadcast unit while we do reset directly on the member cores. */
            mali_bcast_disable(group->bcast_core);

            _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list) {
                mali_pp_stop_bus_wait(child->pp_core);
                mali_pp_hard_reset(child->pp_core);
            }

            mali_bcast_enable(group->bcast_core);
        } else {
            mali_pp_stop_bus_wait(group->pp_core);
            mali_pp_hard_reset(group->pp_core);
        }
    } else {
        mali_gp_stop_bus_wait(group->gp_core);
        mali_gp_hard_reset(group->gp_core);
    }

    /* Reset MMU */
    err = mali_mmu_reset(group->mmu);
    MALI_DEBUG_ASSERT(_MALI_OSK_ERR_OK == err);
    MALI_IGNORE(err);

    group->session = NULL;
}

#if MALI_STATE_TRACKING
u32 mali_group_dump_state(struct mali_group *group, char *buf, u32 size)
{
    int n = 0;
    int i;
    struct mali_group *child;
    struct mali_group *temp;

    if (mali_group_is_virtual(group)) {
        n += _mali_osk_snprintf(buf + n, size - n,
                "Virtual PP Group: %p\n", group);
    } else if (mali_group_is_in_virtual(group)) {
        n += _mali_osk_snprintf(buf + n, size - n,
                "Child PP Group: %p\n", group);
    } else if (NULL != group->pp_core) {
        n += _mali_osk_snprintf(buf + n, size - n,
                "Physical PP Group: %p\n", group);
    } else {
        MALI_DEBUG_ASSERT_POINTER(group->gp_core);
        n += _mali_osk_snprintf(buf + n, size - n,
                "GP Group: %p\n", group);
    }

    switch (group->state) {
        case MALI_GROUP_STATE_INACTIVE:
            n += _mali_osk_snprintf(buf + n, size - n,
                    "\tstate: INACTIVE\n");
            break;
        case MALI_GROUP_STATE_ACTIVATION_PENDING:
            n += _mali_osk_snprintf(buf + n, size - n,
                    "\tstate: ACTIVATION_PENDING\n");
            break;
        case MALI_GROUP_STATE_ACTIVE:
            n += _mali_osk_snprintf(buf + n, size - n,
                    "\tstate: MALI_GROUP_STATE_ACTIVE\n");
            break;
        default:
            n += _mali_osk_snprintf(buf + n, size - n,
                    "\tstate: UNKNOWN (%d)\n", group->state);
            MALI_DEBUG_ASSERT(0);
            break;
    }

    n += _mali_osk_snprintf(buf + n, size - n,
            "\tSW power: %s\n",
            group->power_is_on ? "On" : "Off");

    n += mali_pm_dump_state_domain(group->pm_domain, buf + n, size - n);

    for (i = 0; i < 2; i++) {
        if (NULL != group->l2_cache_core[i]) {
            struct mali_pm_domain *domain;
            domain = mali_l2_cache_get_pm_domain(
                    group->l2_cache_core[i]);
            n += mali_pm_dump_state_domain(domain,
                    buf + n, size - n);
        }
    }

    if (group->gp_core) {
        n += mali_gp_dump_state(group->gp_core, buf + n, size - n);
        n += _mali_osk_snprintf(buf + n, size - n,
                "\tGP running job: %p\n", group->gp_running_job);
    }

    if (group->pp_core) {
        n += mali_pp_dump_state(group->pp_core, buf + n, size - n);
        n += _mali_osk_snprintf(buf + n, size - n,
                "\tPP running job: %p, subjob %d \n",
                group->pp_running_job,
                group->pp_running_sub_job);
    }

    _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list,
            struct mali_group, group_list) {
        n += mali_group_dump_state(child, buf + n, size - n);
    }

    return n;
}
#endif

/* Kasin added. */
#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
#include <platform/meson_m400/mali_fix.h>
#define INT_MALI_PP2_MMU ( 6+32)
struct _mali_osk_irq_t_struct;
u32 get_irqnum(struct _mali_osk_irq_t_struct* irq);
#endif

_mali_osk_errcode_t mali_group_upper_half_mmu(void *data)
{
    struct mali_group *group = (struct mali_group *)data;
#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    struct mali_mmu_core *mmu = group->mmu;
#endif
    _mali_osk_errcode_t ret;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);

#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    if (MALI_FALSE == group->power_is_on)
        MALI_SUCCESS;
    if (get_irqnum(mmu->irq) == INT_MALI_PP2_MMU)
    {
        if (group == NULL || group->pp_core == NULL)
            MALI_SUCCESS;
        if (group->pp_core->core_id == 0) {
            if (malifix_get_mmu_int_process_state(0) == MMU_INT_HIT)
                malifix_set_mmu_int_process_state(0, MMU_INT_TOP);
            else
                MALI_SUCCESS;
        }
        else if (group->pp_core->core_id == 1) {
            if (malifix_get_mmu_int_process_state(1) == MMU_INT_HIT)
                malifix_set_mmu_int_process_state(1, MMU_INT_TOP);
            else
                MALI_SUCCESS;
        } else
            MALI_SUCCESS;
    }
#endif

#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group)) {
		/* Not working, so nothing to do */
		mali_executor_unlock();
		return _MALI_OSK_ERR_FAULT;
	}
#endif
    if (NULL != group->gp_core) {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
                0, 0, /* No pid and tid for interrupt handler */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP_MMU(0),
                mali_mmu_get_rawstat(group->mmu), 0);
    } else {
        MALI_DEBUG_ASSERT_POINTER(group->pp_core);
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
                0, 0, /* No pid and tid for interrupt handler */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP_MMU(
                    mali_pp_core_get_id(group->pp_core)),
                mali_mmu_get_rawstat(group->mmu), 0);
    }
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif

    ret = mali_executor_interrupt_mmu(group, MALI_TRUE);

#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group) && (!mali_group_power_is_on(group))) {
		/* group complete and on job shedule on it, it already power off */
		if (NULL != group->gp_core) {
			_mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
						      MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
						      MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
						      0, 0, /* No pid and tid for interrupt handler */
						      MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP_MMU(0),
						      0xFFFFFFFF, 0);
		} else {
			_mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
						      MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
						      MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
						      0, 0, /* No pid and tid for interrupt handler */
						      MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP_MMU(
							      mali_pp_core_get_id(group->pp_core)),
						      0xFFFFFFFF, 0);
		}

		mali_executor_unlock();
		return ret;
	}
#endif

    if (NULL != group->gp_core) {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
                0, 0, /* No pid and tid for interrupt handler */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP_MMU(0),
                mali_mmu_get_rawstat(group->mmu), 0);
    } else {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
                0, 0, /* No pid and tid for interrupt handler */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP_MMU(
                    mali_pp_core_get_id(group->pp_core)),
                mali_mmu_get_rawstat(group->mmu), 0);
    }
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif

    return ret;
}

static void mali_group_bottom_half_mmu(void *data)
{
    struct mali_group *group = (struct mali_group *)data;
#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    struct mali_mmu_core *mmu = group->mmu;
#endif

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);

    if (NULL != group->gp_core) {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
                0, _mali_osk_get_tid(), /* pid and tid */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP_MMU(0),
                mali_mmu_get_rawstat(group->mmu), 0);
    } else {
        MALI_DEBUG_ASSERT_POINTER(group->pp_core);
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
                0, _mali_osk_get_tid(), /* pid and tid */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP_MMU(
                    mali_pp_core_get_id(group->pp_core)),
                mali_mmu_get_rawstat(group->mmu), 0);
    }

    mali_executor_interrupt_mmu(group, MALI_FALSE);

    if (NULL != group->gp_core) {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
                0, _mali_osk_get_tid(), /* pid and tid */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP_MMU(0),
                mali_mmu_get_rawstat(group->mmu), 0);
    } else {
        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
                0, _mali_osk_get_tid(), /* pid and tid */
                MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP_MMU(
                    mali_pp_core_get_id(group->pp_core)),
                mali_mmu_get_rawstat(group->mmu), 0);
    }
#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    if (get_irqnum(mmu->irq) == INT_MALI_PP2_MMU)
    {
        if (group->pp_core->core_id == 0) {
            if (malifix_get_mmu_int_process_state(0) == MMU_INT_TOP)
                malifix_set_mmu_int_process_state(0, MMU_INT_NONE);
        }
        else if (group->pp_core->core_id == 1) {
            if (malifix_get_mmu_int_process_state(1) == MMU_INT_TOP)
                malifix_set_mmu_int_process_state(1, MMU_INT_NONE);
        }
    }
#endif
}

_mali_osk_errcode_t mali_group_upper_half_gp(void *data)
{
    struct mali_group *group = (struct mali_group *)data;
    _mali_osk_errcode_t ret;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->gp_core);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);

#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group)) {
		/* Not working, so nothing to do */
		mali_executor_unlock();
		return _MALI_OSK_ERR_FAULT;
	}
#endif
    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
            0, 0, /* No pid and tid for interrupt handler */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP(0),
            mali_gp_get_rawstat(group->gp_core), 0);

    MALI_DEBUG_PRINT(4, ("Group: Interrupt 0x%08X from %s\n",
                mali_gp_get_rawstat(group->gp_core),
                mali_group_core_description(group)));
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif
    ret = mali_executor_interrupt_gp(group, MALI_TRUE);

#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group) && (!mali_group_power_is_on(group))) {
		/* group complete and on job shedule on it, it already power off */
		_mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
					      MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
					      MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
					      0, 0, /* No pid and tid for interrupt handler */
					      MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP(0),
					      0xFFFFFFFF, 0);
		mali_executor_unlock();
		return ret;
	}
#endif
    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
            0, 0, /* No pid and tid for interrupt handler */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP(0),
            mali_gp_get_rawstat(group->gp_core), 0);
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif
    return ret;
}

static void mali_group_bottom_half_gp(void *data)
{
    struct mali_group *group = (struct mali_group *)data;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->gp_core);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
            0, _mali_osk_get_tid(), /* pid and tid */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP(0),
            mali_gp_get_rawstat(group->gp_core), 0);

    mali_executor_interrupt_gp(group, MALI_FALSE);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
            0, _mali_osk_get_tid(), /* pid and tid */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_GP(0),
            mali_gp_get_rawstat(group->gp_core), 0);
}

#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
int PP0_int_cnt = 0;
int mali_PP0_int_cnt(void)
{
    return PP0_int_cnt;
}
EXPORT_SYMBOL(mali_PP0_int_cnt);

int PP1_int_cnt = 0;
int mali_PP1_int_cnt(void)
{
    return PP1_int_cnt;
}
EXPORT_SYMBOL(mali_PP1_int_cnt);
#endif

_mali_osk_errcode_t mali_group_upper_half_pp(void *data)
{
    struct mali_group *group = (struct mali_group *)data;
#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    struct mali_pp_core *core = group->pp_core;
#endif
    _mali_osk_errcode_t ret;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->pp_core);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);
#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group)) {
		/* Not working, so nothing to do */
		mali_executor_unlock();
		return _MALI_OSK_ERR_FAULT;
	}
#endif

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
            0, 0, /* No pid and tid for interrupt handler */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(
                mali_pp_core_get_id(group->pp_core)),
            mali_pp_get_rawstat(group->pp_core), 0);

    MALI_DEBUG_PRINT(4, ("Group: Interrupt 0x%08X from %s\n",
                mali_pp_get_rawstat(group->pp_core),
                mali_group_core_description(group)));
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif

    ret = mali_executor_interrupt_pp(group, MALI_TRUE);

#if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON6
    if (core->core_id == 0)
        PP0_int_cnt++;
    else if (core->core_id == 1)
        PP1_int_cnt++;
#endif
#if defined(CONFIG_MALI400_PROFILING) && defined (CONFIG_TRACEPOINTS)
#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_lock();
	if (!mali_group_is_working(group) && (!mali_group_power_is_on(group))) {
		/* group complete and on job shedule on it, it already power off */
		_mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
					      MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
					      MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
					      0, 0, /* No pid and tid for interrupt handler */
					      MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(
						      mali_pp_core_get_id(group->pp_core)),
					      0xFFFFFFFF, 0);
		mali_executor_unlock();
		return ret;
	}
#endif
    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
            0, 0, /* No pid and tid for interrupt handler */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(
                mali_pp_core_get_id(group->pp_core)),
            mali_pp_get_rawstat(group->pp_core), 0);

#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
	mali_executor_unlock();
#endif
#endif
    return ret;
}

static void mali_group_bottom_half_pp(void *data)
{
    struct mali_group *group = (struct mali_group *)data;

    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(group->pp_core);
    MALI_DEBUG_ASSERT_POINTER(group->mmu);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
            0, _mali_osk_get_tid(), /* pid and tid */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(
                mali_pp_core_get_id(group->pp_core)),
            mali_pp_get_rawstat(group->pp_core), 0);

    mali_executor_interrupt_pp(group, MALI_FALSE);

    _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
            MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
            MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
            0, _mali_osk_get_tid(), /* pid and tid */
            MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(
                mali_pp_core_get_id(group->pp_core)),
            mali_pp_get_rawstat(group->pp_core), 0);
}

static void mali_group_timeout(void *data)
{
    struct mali_group *group = (struct mali_group *)data;
    MALI_DEBUG_ASSERT_POINTER(group);

    MALI_DEBUG_PRINT(2, ("Group: timeout handler for %s at %u\n",
                mali_group_core_description(group),
                _mali_osk_time_tickcount()));

    if (mali_core_timeout < 65533)
        mali_core_timeout++;
    if (NULL != group->gp_core) {
        mali_group_schedule_bottom_half_gp(group);
    } else {
        MALI_DEBUG_ASSERT_POINTER(group->pp_core);
        mali_group_schedule_bottom_half_pp(group);
    }
}

mali_bool mali_group_zap_session(struct mali_group *group,
        struct mali_session_data *session)
{
    MALI_DEBUG_ASSERT_POINTER(group);
    MALI_DEBUG_ASSERT_POINTER(session);
    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    if (group->session != session) {
        /* not running from this session */
        return MALI_TRUE; /* success */
    }

    if (group->is_working) {
        /* The Zap also does the stall and disable_stall */
        mali_bool zap_success = mali_mmu_zap_tlb(group->mmu);
        return zap_success;
    } else {
        /* Just remove the session instead of zapping */
        mali_group_clear_session(group);
        return MALI_TRUE; /* success */
    }
}

#if defined(CONFIG_MALI400_PROFILING)
static void mali_group_report_l2_cache_counters_per_core(struct mali_group *group, u32 core_num)
{
    u32 source0 = 0;
    u32 value0 = 0;
    u32 source1 = 0;
    u32 value1 = 0;
    u32 profiling_channel = 0;

    MALI_DEBUG_ASSERT_EXECUTOR_LOCK_HELD();

    switch (core_num) {
        case 0:
            profiling_channel = MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_EVENT_CHANNEL_GPU |
                MALI_PROFILING_EVENT_REASON_SINGLE_GPU_L20_COUNTERS;
            break;
        case 1:
            profiling_channel = MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_EVENT_CHANNEL_GPU |
                MALI_PROFILING_EVENT_REASON_SINGLE_GPU_L21_COUNTERS;
            break;
        case 2:
            profiling_channel = MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_EVENT_CHANNEL_GPU |
                MALI_PROFILING_EVENT_REASON_SINGLE_GPU_L22_COUNTERS;
            break;
        default:
            profiling_channel = MALI_PROFILING_EVENT_TYPE_SINGLE |
                MALI_PROFILING_EVENT_CHANNEL_GPU |
                MALI_PROFILING_EVENT_REASON_SINGLE_GPU_L20_COUNTERS;
            break;
    }

    if (0 == core_num) {
        mali_l2_cache_core_get_counter_values(group->l2_cache_core[0], &source0, &value0, &source1, &value1);
    }
    if (1 == core_num) {
        if (1 == mali_l2_cache_get_id(group->l2_cache_core[0])) {
            mali_l2_cache_core_get_counter_values(group->l2_cache_core[0], &source0, &value0, &source1, &value1);
        } else if (1 == mali_l2_cache_get_id(group->l2_cache_core[1])) {
            mali_l2_cache_core_get_counter_values(group->l2_cache_core[1], &source0, &value0, &source1, &value1);
        }
    }
    if (2 == core_num) {
        if (2 == mali_l2_cache_get_id(group->l2_cache_core[0])) {
            mali_l2_cache_core_get_counter_values(group->l2_cache_core[0], &source0, &value0, &source1, &value1);
        } else if (2 == mali_l2_cache_get_id(group->l2_cache_core[1])) {
            mali_l2_cache_core_get_counter_values(group->l2_cache_core[1], &source0, &value0, &source1, &value1);
        }
    }

    _mali_osk_profiling_add_event(profiling_channel, source1 << 8 | source0, value0, value1, 0, 0);
}
#endif /* #if defined(CONFIG_MALI400_PROFILING) */
