/*1* Copyright (C) 2013 Red Hat2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,19* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE20* SOFTWARE.21*/2223#ifndef DRM_FLIP_WORK_H24#define DRM_FLIP_WORK_H2526#include <linux/kfifo.h>27#include <linux/spinlock.h>28#include <linux/workqueue.h>2930/**31* DOC: flip utils32*33* Utility to queue up work to run from work-queue context after flip/vblank.34* Typically this can be used to defer unref of framebuffer's, cursor35* bo's, etc until after vblank. The APIs are all thread-safe. Moreover,36* drm_flip_work_commit() can be called in atomic context.37*/3839struct drm_flip_work;4041/*42* drm_flip_func_t - callback function43*44* @work: the flip work45* @val: value queued via drm_flip_work_queue()46*47* Callback function to be called for each of the queue'd work items after48* drm_flip_work_commit() is called.49*/50typedef void (*drm_flip_func_t)(struct drm_flip_work *work, void *val);5152/**53* struct drm_flip_work - flip work queue54* @name: debug name55* @func: callback fxn called for each committed item56* @worker: worker which calls @func57* @queued: queued tasks58* @commited: commited tasks59* @lock: lock to access queued and commited lists60*/61struct drm_flip_work {62const char *name;63drm_flip_func_t func;64struct work_struct worker;65struct list_head queued;66struct list_head commited;67spinlock_t lock;68};6970void drm_flip_work_queue(struct drm_flip_work *work, void *val);71void drm_flip_work_commit(struct drm_flip_work *work,72struct workqueue_struct *wq);73void drm_flip_work_init(struct drm_flip_work *work,74const char *name, drm_flip_func_t func);75void drm_flip_work_cleanup(struct drm_flip_work *work);7677#endif /* DRM_FLIP_WORK_H */787980