#ifndef _ARM_SUNXI_DRM_H
#define _ARM_SUNXI_DRM_H
#include <sys/queue.h>
#include <sys/workqueue.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_gem_cma_helper.h>
#define DRIVER_AUTHOR "Jared McNeill"
#define DRIVER_NAME "sunxi"
#define DRIVER_DESC "Allwinner Display Engine"
#define DRIVER_DATE "20190123"
#define DRIVER_MAJOR 1
#define DRIVER_MINOR 0
#define DRIVER_PATCHLEVEL 0
struct sunxi_framebuffer;
#define SUNXI_DRM_MAX_CRTC 2
struct sunxi_drm_vblank {
void *priv;
void (*enable_vblank)(void *);
void (*disable_vblank)(void *);
struct drm_pending_vblank_event *event;
struct drm_crtc *crtc;
};
struct sunxi_drm_softc {
device_t sc_dev;
struct drm_device *sc_ddev;
bus_space_tag_t sc_bst;
bus_dma_tag_t sc_dmat;
int sc_phandle;
struct lwp *sc_task_thread;
SIMPLEQ_HEAD(, sunxi_drm_task) sc_tasks;
struct workqueue *sc_task_wq;
bool sc_dev_registered;
struct sunxi_drm_vblank sc_vbl[SUNXI_DRM_MAX_CRTC];
};
struct sunxi_drm_framebuffer {
struct drm_framebuffer base;
struct drm_gem_cma_object *obj;
};
struct sunxi_drm_endpoint {
int phandle;
struct fdt_endpoint *ep;
struct drm_device *ddev;
TAILQ_ENTRY(sunxi_drm_endpoint) entries;
};
struct sunxi_drm_fbdev {
struct drm_fb_helper helper;
};
struct sunxi_drmfb_attach_args {
struct drm_device *sfa_drm_dev;
struct drm_fb_helper *sfa_fb_helper;
struct drm_fb_helper_surface_size sfa_fb_sizes;
bus_space_tag_t sfa_fb_bst;
bus_dma_tag_t sfa_fb_dmat;
uint32_t sfa_fb_linebytes;
};
struct sunxi_drm_task {
union {
SIMPLEQ_ENTRY(sunxi_drm_task) queue;
struct work work;
} sdt_u;
void (*sdt_fn)(struct sunxi_drm_task *);
};
#define sunxi_drm_private(ddev) (ddev)->dev_private
#define to_sunxi_drm_framebuffer(x) container_of(x, struct sunxi_drm_framebuffer, base)
int sunxi_drm_register_endpoint(int, struct fdt_endpoint *);
struct drm_device *sunxi_drm_endpoint_device(struct fdt_endpoint *);
void sunxi_task_init(struct sunxi_drm_task *,
void (*)(struct sunxi_drm_task *));
void sunxi_task_schedule(device_t, struct sunxi_drm_task *);
#endif