/******************************************************************************* * Copyright (C) 2018 Cadence Design Systems, Inc. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to use this Software with Cadence processor cores only and * not with any other processors and platforms, subject to * the following conditions: * * The above copyright notice and this permission notice 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. ******************************************************************************/ /******************************************************************************* * xf-sched.h * * Non-preemptive earliest-deadline-first scheduler * ******************************************************************************/ #ifndef __XF_SCHED_H #define __XF_SCHED_H /******************************************************************************* * Types definitions ******************************************************************************/ /* ...scheduler data */ typedef rb_tree_t xf_sched_t; /* ...scheduling item */ typedef rb_node_t xf_task_t; /******************************************************************************* * Helpers ******************************************************************************/ /* ...retrieve timestamp from task handle */ static inline u32 xf_task_timestamp(xf_task_t *t) { /* ...wipe out last bit of "color" */ return (((rb_node_t *)t)->color & ~1); } /* ...set task decoding timestamp */ static inline u32 xf_task_timestamp_set(xf_task_t *t, u32 ts) { /* ...technically, wiping out last bit of timestamp is not needed */ return (((rb_node_t *)t)->color = ts); } /* ...compare two timestamps with respect to wrap-around */ static inline int xf_timestamp_before(u32 t0, u32 t1) { /* ...distance between active items is never high */ return ((s32)(t0 - t1) < 0); } /* ...current scheduler timestamp */ static inline u32 xf_sched_timestamp(xf_sched_t *sched) { /* ...don't quite care about last bit */ return ((rb_tree_t *)sched)->root.color; } /* ...set scheduler timestamp */ static inline u32 xf_sched_timestamp_set(xf_sched_t *sched, u32 ts) { /* ...wipe out last bit (black color is 0) */ return (((rb_tree_t *)sched)->root.color = ts & ~0x1); } /******************************************************************************* * Entry points ******************************************************************************/ /* ...place message into scheduler queue */ extern void xf_sched_put(xf_sched_t *sched, xf_task_t *t, u32 ts); /* ...get first item from the scheduler */ extern xf_task_t * xf_sched_get(xf_sched_t *sched); /* ...cancel task execution */ extern void xf_sched_cancel(xf_sched_t *sched, xf_task_t *t); /* ...initialize scheduler */ extern void xf_sched_init(xf_sched_t *sched); #endif /* __XF_SCHED_H */