-
Notifications
You must be signed in to change notification settings - Fork 0
/
xengfx_fb.c
111 lines (93 loc) · 3.52 KB
/
xengfx_fb.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**************************************************************************
*
* Copyright (c) 2011 Citrix 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 deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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.
*
* Authors:
* Julian Pidancet <[email protected]>
*
**************************************************************************/
#include <linux/module.h>
#include "drmP.h"
#include "drm_crtc_helper.h"
#include "xengfx_drv.h"
#include "xengfx_reg.h"
#include "xengfx_compat.h"
static void xengfx_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
u16 blue, int regno)
{
/* I doubt we are going to implement this */
}
static void xengfx_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
u16 *blue, int regno)
{
/* I doubt we are going to implement this */
}
struct fb_ops xengfx_fb_ops = {
.owner = THIS_MODULE,
.fb_check_var = drm_fb_helper_check_var,
.fb_set_par = drm_fb_helper_set_par,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_pan_display = drm_fb_helper_pan_display,
.fb_blank = drm_fb_helper_blank,
.fb_setcmap = drm_fb_helper_setcmap,
FB_DEBUG_OPS
};
struct drm_fb_helper_funcs xengfx_fb_helper_funcs = {
.gamma_set = xengfx_fb_gamma_set,
.gamma_get = xengfx_fb_gamma_get,
FB_PROBE_IMPLEMENTATION
};
int xengfx_fbdev_init(struct drm_device *dev)
{
struct xengfx_private *dev_priv = dev->dev_private;
struct xengfx_fbdev *fbdev;
fbdev = kzalloc(sizeof (*fbdev), GFP_KERNEL);
if (!fbdev)
return -ENOMEM;
dev_priv->fbdev = fbdev;
return xengfx_fbdev_init_compat(dev);
}
void xengfx_fbdev_cleanup(struct drm_device *dev)
{
struct xengfx_private *dev_priv = dev->dev_private;
struct xengfx_fbdev *fbdev = dev_priv->fbdev;
struct fb_info *info;
if (!fbdev)
return;
info = fbdev_to_fb_info(fbdev);
if (info) {
unregister_framebuffer(info);
iounmap(info->screen_base);
framebuffer_release(info);
}
DRM_FB_HELPER_FREE(&fbdev->helper);
drm_framebuffer_cleanup(&fbdev->fb.drm_fb);
if (fbdev->fb.obj) {
DRM_GEM_OBJECT_UNREFERENCE(&fbdev->fb.obj->gem_object);
fbdev->fb.obj = NULL;
}
kfree(dev_priv->fbdev);
dev_priv->fbdev = NULL;
}