xref: /netbsd/sys/arch/arm/sunxi/sunxi_drm.h (revision 9773320f)
1 /* $NetBSD: sunxi_drm.h,v 1.3 2021/12/19 12:28:20 riastradh Exp $ */
2 
3 /*-
4  * Copyright (c) 2019 Jared D. McNeill <jmcneill@invisible.ca>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #ifndef _ARM_SUNXI_DRM_H
30 #define _ARM_SUNXI_DRM_H
31 
32 #include <sys/queue.h>
33 #include <sys/workqueue.h>
34 
35 #include <drm/drm_fb_helper.h>
36 #include <drm/drm_gem_cma_helper.h>
37 
38 #define DRIVER_AUTHOR		"Jared McNeill"
39 
40 #define DRIVER_NAME		"sunxi"
41 #define DRIVER_DESC		"Allwinner Display Engine"
42 #define DRIVER_DATE		"20190123"
43 
44 #define DRIVER_MAJOR		1
45 #define DRIVER_MINOR		0
46 #define DRIVER_PATCHLEVEL	0
47 
48 struct sunxi_framebuffer;
49 
50 #define	SUNXI_DRM_MAX_CRTC	2
51 
52 struct sunxi_drm_vblank {
53 	void			*priv;
54 	void			(*enable_vblank)(void *);
55 	void			(*disable_vblank)(void *);
56 	uint32_t		(*get_vblank_counter)(void *);
57 };
58 
59 struct sunxi_drm_softc {
60 	device_t		sc_dev;
61 	struct drm_device	*sc_ddev;
62 
63 	bus_space_tag_t		sc_bst;
64 	bus_dma_tag_t		sc_dmat;
65 
66 	int			sc_phandle;
67 
68 	struct lwp			*sc_task_thread;
69 	SIMPLEQ_HEAD(, sunxi_drm_task)	sc_tasks;
70 	struct workqueue		*sc_task_wq;
71 
72 	bool			sc_dev_registered;
73 
74 	struct sunxi_drm_vblank	sc_vbl[SUNXI_DRM_MAX_CRTC];
75 };
76 
77 struct sunxi_drm_framebuffer {
78 	struct drm_framebuffer	base;
79 	struct drm_gem_cma_object *obj;
80 };
81 
82 struct sunxi_drm_endpoint {
83 	int			phandle;
84 	struct fdt_endpoint	*ep;
85 	struct drm_device	*ddev;
86 	TAILQ_ENTRY(sunxi_drm_endpoint) entries;
87 };
88 
89 struct sunxi_drm_fbdev {
90 	struct drm_fb_helper	helper;
91 };
92 
93 struct sunxi_drmfb_attach_args {
94 	struct drm_device	*sfa_drm_dev;
95 	struct drm_fb_helper	*sfa_fb_helper;
96 	struct drm_fb_helper_surface_size sfa_fb_sizes;
97 	bus_space_tag_t		sfa_fb_bst;
98 	bus_dma_tag_t		sfa_fb_dmat;
99 	uint32_t		sfa_fb_linebytes;
100 };
101 
102 struct sunxi_drm_task {
103 	union {
104 		SIMPLEQ_ENTRY(sunxi_drm_task)	queue;
105 		struct work			work;
106 	}		sdt_u;
107 	void		(*sdt_fn)(struct sunxi_drm_task *);
108 };
109 
110 #define sunxi_drm_private(ddev)		(ddev)->dev_private
111 #define	to_sunxi_drm_framebuffer(x)	container_of(x, struct sunxi_drm_framebuffer, base)
112 
113 int	sunxi_drm_register_endpoint(int, struct fdt_endpoint *);
114 struct drm_device *sunxi_drm_endpoint_device(struct fdt_endpoint *);
115 
116 void	sunxi_task_init(struct sunxi_drm_task *,
117 	    void (*)(struct sunxi_drm_task *));
118 void	sunxi_task_schedule(device_t, struct sunxi_drm_task *);
119 
120 #endif /* _ARM_SUNXI_DRM_H */
121