/* 
 | 
 * 
 | 
 * (C) COPYRIGHT 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. 
 | 
 * 
 | 
 */ 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
/* 
 | 
 * Affinity Manager internal APIs. 
 | 
 */ 
 | 
  
 | 
#ifndef _KBASE_JS_AFFINITY_H_ 
 | 
#define _KBASE_JS_AFFINITY_H_ 
 | 
  
 | 
/** 
 | 
 * kbase_js_can_run_job_on_slot_no_lock - Decide whether it is possible to 
 | 
 * submit a job to a particular job slot in the current status 
 | 
 * 
 | 
 * @kbdev: The kbase device structure of the device 
 | 
 * @js:    Job slot number to check for allowance 
 | 
 * 
 | 
 * Will check if submitting to the given job slot is allowed in the current 
 | 
 * status.  For example using job slot 2 while in soft-stoppable state and only 
 | 
 * having 1 coregroup is not allowed by the policy. This function should be 
 | 
 * called prior to submitting a job to a slot to make sure policy rules are not 
 | 
 * violated. 
 | 
 * 
 | 
 * The following locking conditions are made on the caller 
 | 
 * - it must hold hwaccess_lock 
 | 
 */ 
 | 
bool kbase_js_can_run_job_on_slot_no_lock(struct kbase_device *kbdev, int js); 
 | 
  
 | 
/** 
 | 
 * kbase_js_choose_affinity - Compute affinity for a given job. 
 | 
 * 
 | 
 * @affinity: Affinity bitmap computed 
 | 
 * @kbdev:    The kbase device structure of the device 
 | 
 * @katom:    Job chain of which affinity is going to be found 
 | 
 * @js:       Slot the job chain is being submitted 
 | 
 * 
 | 
 * Currently assumes an all-on/all-off power management policy. 
 | 
 * Also assumes there is at least one core with tiler available. 
 | 
 * 
 | 
 * Returns true if a valid affinity was chosen, false if 
 | 
 * no cores were available. 
 | 
 */ 
 | 
bool kbase_js_choose_affinity(u64 * const affinity, 
 | 
                    struct kbase_device *kbdev, 
 | 
                    struct kbase_jd_atom *katom, 
 | 
                    int js); 
 | 
  
 | 
/** 
 | 
 * kbase_js_affinity_would_violate - Determine whether a proposed affinity on 
 | 
 * job slot @js would cause a violation of affinity restrictions. 
 | 
 * 
 | 
 * @kbdev:    Kbase device structure 
 | 
 * @js:       The job slot to test 
 | 
 * @affinity: The affinity mask to test 
 | 
 * 
 | 
 * The following locks must be held by the caller 
 | 
 * - hwaccess_lock 
 | 
 * 
 | 
 * Return: true if the affinity would violate the restrictions 
 | 
 */ 
 | 
bool kbase_js_affinity_would_violate(struct kbase_device *kbdev, int js, 
 | 
                                u64 affinity); 
 | 
  
 | 
/** 
 | 
 * kbase_js_affinity_retain_slot_cores - Affinity tracking: retain cores used by 
 | 
 *                                       a slot 
 | 
 * 
 | 
 * @kbdev:    Kbase device structure 
 | 
 * @js:       The job slot retaining the cores 
 | 
 * @affinity: The cores to retain 
 | 
 * 
 | 
 * The following locks must be held by the caller 
 | 
 * - hwaccess_lock 
 | 
 */ 
 | 
void kbase_js_affinity_retain_slot_cores(struct kbase_device *kbdev, int js, 
 | 
                                u64 affinity); 
 | 
  
 | 
/** 
 | 
 * kbase_js_affinity_release_slot_cores - Affinity tracking: release cores used 
 | 
 *                                        by a slot 
 | 
 * 
 | 
 * @kbdev:    Kbase device structure 
 | 
 * @js:       Job slot 
 | 
 * @affinity: Bit mask of core to be released 
 | 
 * 
 | 
 * Cores must be released as soon as a job is dequeued from a slot's 'submit 
 | 
 * slots', and before another job is submitted to those slots. Otherwise, the 
 | 
 * refcount could exceed the maximum number submittable to a slot, 
 | 
 * %BASE_JM_SUBMIT_SLOTS. 
 | 
 * 
 | 
 * The following locks must be held by the caller 
 | 
 * - hwaccess_lock 
 | 
 */ 
 | 
void kbase_js_affinity_release_slot_cores(struct kbase_device *kbdev, int js, 
 | 
                                u64 affinity); 
 | 
  
 | 
/** 
 | 
 * kbase_js_debug_log_current_affinities - log the current affinities 
 | 
 * 
 | 
 * @kbdev:  Kbase device structure 
 | 
 * 
 | 
 * Output to the Trace log the current tracked affinities on all slots 
 | 
 */ 
 | 
#if KBASE_TRACE_ENABLE 
 | 
void kbase_js_debug_log_current_affinities(struct kbase_device *kbdev); 
 | 
#else                /*  KBASE_TRACE_ENABLE  */ 
 | 
static inline void 
 | 
kbase_js_debug_log_current_affinities(struct kbase_device *kbdev) 
 | 
{ 
 | 
} 
 | 
#endif                /*  KBASE_TRACE_ENABLE  */ 
 | 
  
 | 
#endif                /* _KBASE_JS_AFFINITY_H_ */ 
 |