2017-10-12 13:57:25 +01:00
/*
* Copyright © 2017 Intel Corporation
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
* FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*
*/
# include "lib_sw_fence.h"
/* Small library of different fence types useful for writing tests */
static int __i915_sw_fence_call
nop_fence_notify ( struct i915_sw_fence * fence , enum i915_sw_fence_notify state )
{
return NOTIFY_DONE ;
}
void __onstack_fence_init ( struct i915_sw_fence * fence ,
const char * name ,
struct lock_class_key * key )
{
debug_fence_init_onstack ( fence ) ;
__init_waitqueue_head ( & fence - > wait , name , key ) ;
atomic_set ( & fence - > pending , 1 ) ;
fence - > flags = ( unsigned long ) nop_fence_notify ;
}
void onstack_fence_fini ( struct i915_sw_fence * fence )
{
i915_sw_fence_commit ( fence ) ;
i915_sw_fence_fini ( fence ) ;
}
2017-10-22 17:54:03 -07:00
static void timed_fence_wake ( struct timer_list * t )
2017-10-12 13:57:25 +01:00
{
2017-10-22 17:54:03 -07:00
struct timed_fence * tf = from_timer ( tf , t , timer ) ;
2017-10-12 13:57:25 +01:00
i915_sw_fence_commit ( & tf - > fence ) ;
}
void timed_fence_init ( struct timed_fence * tf , unsigned long expires )
{
onstack_fence_init ( & tf - > fence ) ;
2017-10-22 17:54:03 -07:00
timer_setup_on_stack ( & tf - > timer , timed_fence_wake , 0 ) ;
2017-10-12 13:57:25 +01:00
if ( time_after ( expires , jiffies ) )
mod_timer ( & tf - > timer , expires ) ;
else
i915_sw_fence_commit ( & tf - > fence ) ;
}
void timed_fence_fini ( struct timed_fence * tf )
{
if ( del_timer_sync ( & tf - > timer ) )
i915_sw_fence_commit ( & tf - > fence ) ;
destroy_timer_on_stack ( & tf - > timer ) ;
i915_sw_fence_fini ( & tf - > fence ) ;
}