• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/gpu/drm/nouveau/
1/*
2 * Copyright (C) 2008 Maarten Maathuis.
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 *
25 */
26
27#include "drmP.h"
28#include "drm_crtc_helper.h"
29#include "nouveau_drv.h"
30#include "nouveau_fb.h"
31#include "nouveau_fbcon.h"
32
33static void
34nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
35{
36	struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
37
38	if (fb->nvbo)
39		drm_gem_object_unreference_unlocked(fb->nvbo->gem);
40
41	drm_framebuffer_cleanup(drm_fb);
42	kfree(fb);
43}
44
45static int
46nouveau_user_framebuffer_create_handle(struct drm_framebuffer *drm_fb,
47				       struct drm_file *file_priv,
48				       unsigned int *handle)
49{
50	struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
51
52	return drm_gem_handle_create(file_priv, fb->nvbo->gem, handle);
53}
54
55static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
56	.destroy = nouveau_user_framebuffer_destroy,
57	.create_handle = nouveau_user_framebuffer_create_handle,
58};
59
60int
61nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb,
62			 struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo)
63{
64	int ret;
65
66	ret = drm_framebuffer_init(dev, &nouveau_fb->base, &nouveau_framebuffer_funcs);
67	if (ret) {
68		return ret;
69	}
70
71	drm_helper_mode_fill_fb_struct(&nouveau_fb->base, mode_cmd);
72	nouveau_fb->nvbo = nvbo;
73	return 0;
74}
75
76static struct drm_framebuffer *
77nouveau_user_framebuffer_create(struct drm_device *dev,
78				struct drm_file *file_priv,
79				struct drm_mode_fb_cmd *mode_cmd)
80{
81	struct nouveau_framebuffer *nouveau_fb;
82	struct drm_gem_object *gem;
83	int ret;
84
85	gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
86	if (!gem)
87		return ERR_PTR(-ENOENT);
88
89	nouveau_fb = kzalloc(sizeof(struct nouveau_framebuffer), GFP_KERNEL);
90	if (!nouveau_fb)
91		return ERR_PTR(-ENOMEM);
92
93	ret = nouveau_framebuffer_init(dev, nouveau_fb, mode_cmd, nouveau_gem_object(gem));
94	if (ret) {
95		drm_gem_object_unreference(gem);
96		return ERR_PTR(ret);
97	}
98
99	return &nouveau_fb->base;
100}
101
102const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
103	.fb_create = nouveau_user_framebuffer_create,
104	.output_poll_changed = nouveau_fbcon_output_poll_changed,
105};
106