#ifndef __CAKE_INTF_H
#define __CAKE_INTF_H
#include <limits.h>
#ifndef __VMLINUX_H__
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long u64;
typedef signed char s8;
typedef signed short s16;
typedef signed int s32;
typedef signed long s64;
#endif
enum cake_tier {
CAKE_TIER_CRITICAL = 0,
CAKE_TIER_INTERACT = 1,
CAKE_TIER_FRAME = 2,
CAKE_TIER_BULK = 3,
CAKE_TIER_IDLE = 255,
CAKE_TIER_MAX = 4,
};
#define CAKE_MAX_CPUS 64
#define CAKE_MAX_LLCS 8
#define LLC_DSQ_BASE 200
enum cake_flow_flags {
CAKE_FLOW_NEW = 1 << 0,
};
struct cake_task_ctx {
u64 next_slice;
union {
struct {
union {
struct {
u16 deficit_us;
u16 avg_runtime_us;
};
u32 deficit_avg_fused;
};
u32 packed_info;
};
u64 state_fused_u64;
};
u32 last_run_at;
u16 reclass_counter;
u8 __pad[42];
} __attribute__((aligned(64)));
#define SHIFT_KALMAN_ERROR 0
#define SHIFT_WAIT_DATA 8
#define SHIFT_FLAGS 24
#define SHIFT_TIER 28
#define SHIFT_STABLE 30
#define MASK_KALMAN_ERROR 0xFF
#define MASK_WAIT_DATA 0xFF
#define MASK_TIER 0x03
#define MASK_FLAGS 0x0F
#define EXTRACT_DEFICIT(fused) ((u16)((fused) & 0xFFFF))
#define EXTRACT_AVG_RT(fused) ((u16)((fused) >> 16))
#define PACK_DEFICIT_AVG(deficit, avg) (((u32)(deficit) & 0xFFFF) | ((u32)(avg) << 16))
#define TIER_GATE_T0 100
#define TIER_GATE_T1 2000
#define TIER_GATE_T2 8000
#define MBOX_TIER_MASK 0x03
#define MBOX_VICTIM_BIT 0x08
#define MBOX_IDLE_BIT 0x10
#define MBOX_WARM_BIT 0x20
#define MBOX_GET_TIER(f) ((f) & MBOX_TIER_MASK)
#define MBOX_IS_VICTIM(f) ((f) & MBOX_VICTIM_BIT)
#define MBOX_IS_IDLE(f) ((f) & MBOX_IDLE_BIT)
#define MBOX_IS_WARM(f) ((f) & MBOX_WARM_BIT)
struct mega_mailbox_entry {
u8 flags;
u8 dsq_hint;
u8 tick_counter;
u8 __reserved[61];
} __attribute__((aligned(64)));
struct cake_stats {
u64 nr_new_flow_dispatches;
u64 nr_old_flow_dispatches;
u64 nr_tier_dispatches[CAKE_TIER_MAX];
u64 nr_starvation_preempts_tier[CAKE_TIER_MAX];
u64 _pad[22];
} __attribute__((aligned(64)));
#define CAKE_DEFAULT_QUANTUM_NS (2 * 1000 * 1000)
#define CAKE_DEFAULT_NEW_FLOW_BONUS_NS (8 * 1000 * 1000)
#define CAKE_DEFAULT_STARVATION_NS (100 * 1000 * 1000)
#define CAKE_DEFAULT_STARVATION_T0 3000000
#define CAKE_DEFAULT_STARVATION_T1 8000000
#define CAKE_DEFAULT_STARVATION_T2 40000000
#define CAKE_DEFAULT_STARVATION_T3 100000000
#define CAKE_DEFAULT_MULTIPLIER_T0 256
#define CAKE_DEFAULT_MULTIPLIER_T1 1024
#define CAKE_DEFAULT_MULTIPLIER_T2 2048
#define CAKE_DEFAULT_MULTIPLIER_T3 4095
#define CAKE_DEFAULT_WAIT_BUDGET_T0 100000
#define CAKE_DEFAULT_WAIT_BUDGET_T1 2000000
#define CAKE_DEFAULT_WAIT_BUDGET_T2 8000000
#define CAKE_DEFAULT_WAIT_BUDGET_T3 0
typedef u64 fused_config_t;
#define CFG_SHIFT_MULTIPLIER 0
#define CFG_SHIFT_QUANTUM 12
#define CFG_SHIFT_BUDGET 28
#define CFG_SHIFT_STARVATION 44
#define CFG_MASK_MULTIPLIER 0x0FFFULL
#define CFG_MASK_QUANTUM 0xFFFFULL
#define CFG_MASK_BUDGET 0xFFFFULL
#define CFG_MASK_STARVATION 0xFFFFFULL
#define UNPACK_MULTIPLIER(cfg) ((cfg) & CFG_MASK_MULTIPLIER)
#define UNPACK_QUANTUM_NS(cfg) ((((cfg) >> CFG_SHIFT_QUANTUM) & CFG_MASK_QUANTUM) << 10)
#define UNPACK_BUDGET_NS(cfg) ((((cfg) >> CFG_SHIFT_BUDGET) & CFG_MASK_BUDGET) << 10)
#define UNPACK_STARVATION_NS(cfg) (((cfg) >> CFG_SHIFT_STARVATION) << 10)
#define PACK_CONFIG(q_us, mult, budget_us, starv_us) \
((((u64)(mult) & CFG_MASK_MULTIPLIER) << CFG_SHIFT_MULTIPLIER) | \
(((u64)(q_us) & CFG_MASK_QUANTUM) << CFG_SHIFT_QUANTUM) | \
(((u64)(budget_us) & CFG_MASK_BUDGET) << CFG_SHIFT_BUDGET) | \
(((u64)(starv_us) & CFG_MASK_STARVATION) << CFG_SHIFT_STARVATION))
#endif