2009-08-28 13:46:53 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2006-2009 Red Hat Inc.
|
|
|
|
* Copyright (c) 2006-2008 Intel Corporation
|
|
|
|
* Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
|
|
|
|
*
|
|
|
|
* DRM framebuffer helper functions
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice appear in all copies and that both that copyright
|
|
|
|
* notice and this permission notice appear in supporting documentation, and
|
|
|
|
* that the name of the copyright holders not be used in advertising or
|
|
|
|
* publicity pertaining to distribution of the software without specific,
|
|
|
|
* written prior permission. The copyright holders make no representations
|
|
|
|
* about the suitability of this software for any purpose. It is provided "as
|
|
|
|
* is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
|
|
* OF THIS SOFTWARE.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Dave Airlie <airlied@linux.ie>
|
|
|
|
* Jesse Barnes <jesse.barnes@intel.com>
|
|
|
|
*/
|
|
|
|
#ifndef DRM_FB_HELPER_H
|
|
|
|
#define DRM_FB_HELPER_H
|
|
|
|
|
2010-03-30 13:34:17 +08:00
|
|
|
#include <linux/slow-work.h>
|
|
|
|
|
2009-08-28 13:46:53 +08:00
|
|
|
struct drm_fb_helper_crtc {
|
|
|
|
uint32_t crtc_id;
|
|
|
|
struct drm_mode_set mode_set;
|
2010-03-30 13:34:14 +08:00
|
|
|
struct drm_display_mode *desired_mode;
|
2009-08-28 13:46:53 +08:00
|
|
|
};
|
|
|
|
|
drm/kms: start adding command line interface using fb.
[note this requires an fb patch posted to linux-fbdev-devel already]
This uses the normal video= command line option to control the kms
output setup at boot time. It is used to override the autodetection
done by kms.
video= normally takes a framebuffer as the first parameter, in kms
it will take a connector name, DVI-I-1, or LVDS-1 etc. If no output
connector is specified the mode string will apply to all connectors.
The mode specification used will match down the probed modes, and if
no mode is found it will add a CVT mode that matches.
video=1024x768 - all connectors match a 1024x768 mode or add a CVT on
video=VGA-1:1024x768, VGA-1 connector gets mode only.
The same strings as used in current fb modedb.c are used, except I've
added three more letters, e, D, d, e = enable, D = enable Digital,
d = disable, which allow a connector to be forced into a certain state.
Signed-off-by: Dave Airlie <airlied@redhat.com>
2009-09-23 12:44:08 +08:00
|
|
|
|
2009-08-28 13:46:53 +08:00
|
|
|
struct drm_fb_helper_funcs {
|
|
|
|
void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,
|
|
|
|
u16 blue, int regno);
|
2009-10-06 11:54:01 +08:00
|
|
|
void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
|
|
u16 *blue, int regno);
|
2009-08-28 13:46:53 +08:00
|
|
|
};
|
|
|
|
|
drm/kms: start adding command line interface using fb.
[note this requires an fb patch posted to linux-fbdev-devel already]
This uses the normal video= command line option to control the kms
output setup at boot time. It is used to override the autodetection
done by kms.
video= normally takes a framebuffer as the first parameter, in kms
it will take a connector name, DVI-I-1, or LVDS-1 etc. If no output
connector is specified the mode string will apply to all connectors.
The mode specification used will match down the probed modes, and if
no mode is found it will add a CVT mode that matches.
video=1024x768 - all connectors match a 1024x768 mode or add a CVT on
video=VGA-1:1024x768, VGA-1 connector gets mode only.
The same strings as used in current fb modedb.c are used, except I've
added three more letters, e, D, d, e = enable, D = enable Digital,
d = disable, which allow a connector to be forced into a certain state.
Signed-off-by: Dave Airlie <airlied@redhat.com>
2009-09-23 12:44:08 +08:00
|
|
|
/* mode specified on the command line */
|
|
|
|
struct drm_fb_helper_cmdline_mode {
|
|
|
|
bool specified;
|
|
|
|
bool refresh_specified;
|
|
|
|
bool bpp_specified;
|
|
|
|
int xres, yres;
|
|
|
|
int bpp;
|
|
|
|
int refresh;
|
|
|
|
bool rb;
|
|
|
|
bool interlace;
|
|
|
|
bool cvt;
|
|
|
|
bool margins;
|
|
|
|
};
|
|
|
|
|
2010-03-30 13:34:13 +08:00
|
|
|
struct drm_fb_helper_surface_size {
|
|
|
|
u32 fb_width;
|
|
|
|
u32 fb_height;
|
|
|
|
u32 surface_width;
|
|
|
|
u32 surface_height;
|
|
|
|
u32 surface_bpp;
|
|
|
|
u32 surface_depth;
|
|
|
|
};
|
|
|
|
|
drm/kms: start adding command line interface using fb.
[note this requires an fb patch posted to linux-fbdev-devel already]
This uses the normal video= command line option to control the kms
output setup at boot time. It is used to override the autodetection
done by kms.
video= normally takes a framebuffer as the first parameter, in kms
it will take a connector name, DVI-I-1, or LVDS-1 etc. If no output
connector is specified the mode string will apply to all connectors.
The mode specification used will match down the probed modes, and if
no mode is found it will add a CVT mode that matches.
video=1024x768 - all connectors match a 1024x768 mode or add a CVT on
video=VGA-1:1024x768, VGA-1 connector gets mode only.
The same strings as used in current fb modedb.c are used, except I've
added three more letters, e, D, d, e = enable, D = enable Digital,
d = disable, which allow a connector to be forced into a certain state.
Signed-off-by: Dave Airlie <airlied@redhat.com>
2009-09-23 12:44:08 +08:00
|
|
|
struct drm_fb_helper_connector {
|
|
|
|
struct drm_fb_helper_cmdline_mode cmdline_mode;
|
2010-03-30 13:34:15 +08:00
|
|
|
struct drm_connector *connector;
|
drm/kms: start adding command line interface using fb.
[note this requires an fb patch posted to linux-fbdev-devel already]
This uses the normal video= command line option to control the kms
output setup at boot time. It is used to override the autodetection
done by kms.
video= normally takes a framebuffer as the first parameter, in kms
it will take a connector name, DVI-I-1, or LVDS-1 etc. If no output
connector is specified the mode string will apply to all connectors.
The mode specification used will match down the probed modes, and if
no mode is found it will add a CVT mode that matches.
video=1024x768 - all connectors match a 1024x768 mode or add a CVT on
video=VGA-1:1024x768, VGA-1 connector gets mode only.
The same strings as used in current fb modedb.c are used, except I've
added three more letters, e, D, d, e = enable, D = enable Digital,
d = disable, which allow a connector to be forced into a certain state.
Signed-off-by: Dave Airlie <airlied@redhat.com>
2009-09-23 12:44:08 +08:00
|
|
|
};
|
|
|
|
|
2009-08-28 13:46:53 +08:00
|
|
|
struct drm_fb_helper {
|
|
|
|
struct drm_framebuffer *fb;
|
|
|
|
struct drm_device *dev;
|
|
|
|
struct drm_display_mode *mode;
|
|
|
|
int crtc_count;
|
|
|
|
struct drm_fb_helper_crtc *crtc_info;
|
2010-03-30 13:34:15 +08:00
|
|
|
int connector_count;
|
|
|
|
struct drm_fb_helper_connector **connector_info;
|
2009-08-28 13:46:53 +08:00
|
|
|
struct drm_fb_helper_funcs *funcs;
|
|
|
|
int conn_limit;
|
2010-03-30 13:34:13 +08:00
|
|
|
struct fb_info *fbdev;
|
|
|
|
u32 pseudo_palette[17];
|
2009-08-28 13:46:53 +08:00
|
|
|
struct list_head kernel_fb_list;
|
2010-03-30 13:34:14 +08:00
|
|
|
|
2010-03-30 13:34:17 +08:00
|
|
|
struct delayed_slow_work output_poll_slow_work;
|
|
|
|
bool poll_enabled;
|
2010-03-30 13:34:14 +08:00
|
|
|
int (*fb_probe)(struct drm_fb_helper *helper,
|
|
|
|
struct drm_fb_helper_surface_size *sizes);
|
2010-03-30 13:34:17 +08:00
|
|
|
|
|
|
|
void (*fb_poll_changed)(struct drm_fb_helper *helper);
|
2009-08-28 13:46:53 +08:00
|
|
|
};
|
|
|
|
|
2010-03-30 13:34:14 +08:00
|
|
|
int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper,
|
|
|
|
int preferred_bpp);
|
|
|
|
|
|
|
|
int drm_fb_helper_init_crtc_count(struct drm_device *dev,
|
|
|
|
struct drm_fb_helper *helper, int crtc_count,
|
2009-08-28 13:46:53 +08:00
|
|
|
int max_conn);
|
|
|
|
void drm_fb_helper_free(struct drm_fb_helper *helper);
|
|
|
|
int drm_fb_helper_blank(int blank, struct fb_info *info);
|
|
|
|
int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
|
|
|
|
struct fb_info *info);
|
|
|
|
int drm_fb_helper_set_par(struct fb_info *info);
|
|
|
|
int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
|
|
|
|
struct fb_info *info);
|
|
|
|
int drm_fb_helper_setcolreg(unsigned regno,
|
|
|
|
unsigned red,
|
|
|
|
unsigned green,
|
|
|
|
unsigned blue,
|
|
|
|
unsigned transp,
|
|
|
|
struct fb_info *info);
|
|
|
|
|
|
|
|
void drm_fb_helper_restore(void);
|
2010-03-30 13:34:13 +08:00
|
|
|
void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
|
2009-08-28 13:46:53 +08:00
|
|
|
uint32_t fb_width, uint32_t fb_height);
|
2009-10-05 07:58:02 +08:00
|
|
|
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
|
|
|
uint32_t depth);
|
2009-08-28 13:46:53 +08:00
|
|
|
|
2009-10-05 07:58:02 +08:00
|
|
|
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
|
drm/kms: start adding command line interface using fb.
[note this requires an fb patch posted to linux-fbdev-devel already]
This uses the normal video= command line option to control the kms
output setup at boot time. It is used to override the autodetection
done by kms.
video= normally takes a framebuffer as the first parameter, in kms
it will take a connector name, DVI-I-1, or LVDS-1 etc. If no output
connector is specified the mode string will apply to all connectors.
The mode specification used will match down the probed modes, and if
no mode is found it will add a CVT mode that matches.
video=1024x768 - all connectors match a 1024x768 mode or add a CVT on
video=VGA-1:1024x768, VGA-1 connector gets mode only.
The same strings as used in current fb modedb.c are used, except I've
added three more letters, e, D, d, e = enable, D = enable Digital,
d = disable, which allow a connector to be forced into a certain state.
Signed-off-by: Dave Airlie <airlied@redhat.com>
2009-09-23 12:44:08 +08:00
|
|
|
|
2010-03-30 13:34:17 +08:00
|
|
|
bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper,
|
|
|
|
u32 max_width, u32 max_height, bool polled);
|
2010-03-30 13:34:14 +08:00
|
|
|
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper);
|
2010-03-30 13:34:15 +08:00
|
|
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
|
2010-03-30 13:34:14 +08:00
|
|
|
|
2010-03-30 13:34:17 +08:00
|
|
|
void drm_fb_helper_poll_init(struct drm_fb_helper *fb_helper);
|
|
|
|
void drm_fb_helper_poll_fini(struct drm_fb_helper *fb_helper);
|
2009-08-28 13:46:53 +08:00
|
|
|
#endif
|