forked from Minki/linux
eaf99c749d
i915.ko has a custom fbdev initialisation routine that aims to preserve the current mode set by the BIOS, unless overruled by the user. The user's wishes are determined by what, if any, mode is specified on the command line (via the video= parameter). However, that command line mode is first parsed by drm_fb_helper_initial_config() which is called after i915.ko's custom initial_config() as a fallback method. So in order for us to honour it, we need to move the cmdline parser earlier. If we perform the connector cmdline parsing as soon as we initialise the connector, that cmdline mode and forced status is then available even if the fbdev helper is not compiled in or never called. We also then expose the cmdline user mode in the connector mode lists. v2: Rebase after connector->name upheaval. v3: Adapt mga200 to look for the cmdline mode in the new place. Nicely simplifies things while at that. v4: Fix checkpatch. v5: Select FB_CMDLINE to adapt to the changed fbdev patch. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73154 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v2) Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> (v2) Cc: dri-devel@lists.freedesktop.org Cc: Julia Lemire <jlemire@matrox.com> Cc: Dave Airlie <airlied@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
137 lines
5.1 KiB
C
137 lines
5.1 KiB
C
/*
|
|
* 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
|
|
|
|
struct drm_fb_helper;
|
|
|
|
#include <linux/kgdb.h>
|
|
|
|
struct drm_fb_helper_crtc {
|
|
struct drm_mode_set mode_set;
|
|
struct drm_display_mode *desired_mode;
|
|
};
|
|
|
|
struct drm_fb_helper_surface_size {
|
|
u32 fb_width;
|
|
u32 fb_height;
|
|
u32 surface_width;
|
|
u32 surface_height;
|
|
u32 surface_bpp;
|
|
u32 surface_depth;
|
|
};
|
|
|
|
/**
|
|
* struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library
|
|
* @gamma_set: Set the given gamma lut register on the given crtc.
|
|
* @gamma_get: Read the given gamma lut register on the given crtc, used to
|
|
* save the current lut when force-restoring the fbdev for e.g.
|
|
* kdbg.
|
|
* @fb_probe: Driver callback to allocate and initialize the fbdev info
|
|
* structure. Furthermore it also needs to allocate the drm
|
|
* framebuffer used to back the fbdev.
|
|
* @initial_config: Setup an initial fbdev display configuration
|
|
*
|
|
* Driver callbacks used by the fbdev emulation helper library.
|
|
*/
|
|
struct drm_fb_helper_funcs {
|
|
void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,
|
|
u16 blue, int regno);
|
|
void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
u16 *blue, int regno);
|
|
|
|
int (*fb_probe)(struct drm_fb_helper *helper,
|
|
struct drm_fb_helper_surface_size *sizes);
|
|
bool (*initial_config)(struct drm_fb_helper *fb_helper,
|
|
struct drm_fb_helper_crtc **crtcs,
|
|
struct drm_display_mode **modes,
|
|
bool *enabled, int width, int height);
|
|
};
|
|
|
|
struct drm_fb_helper_connector {
|
|
struct drm_connector *connector;
|
|
};
|
|
|
|
struct drm_fb_helper {
|
|
struct drm_framebuffer *fb;
|
|
struct drm_device *dev;
|
|
int crtc_count;
|
|
struct drm_fb_helper_crtc *crtc_info;
|
|
int connector_count;
|
|
int connector_info_alloc_count;
|
|
struct drm_fb_helper_connector **connector_info;
|
|
const struct drm_fb_helper_funcs *funcs;
|
|
struct fb_info *fbdev;
|
|
u32 pseudo_palette[17];
|
|
struct list_head kernel_fb_list;
|
|
|
|
/* we got a hotplug but fbdev wasn't running the console
|
|
delay until next set_par */
|
|
bool delayed_hotplug;
|
|
};
|
|
|
|
void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
|
|
const struct drm_fb_helper_funcs *funcs);
|
|
int drm_fb_helper_init(struct drm_device *dev,
|
|
struct drm_fb_helper *helper, int crtc_count,
|
|
int max_conn);
|
|
void drm_fb_helper_fini(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);
|
|
|
|
bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
|
|
void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
|
|
uint32_t fb_width, uint32_t fb_height);
|
|
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
|
uint32_t depth);
|
|
|
|
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
|
|
|
|
int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
|
|
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
|
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
|
|
int drm_fb_helper_debug_enter(struct fb_info *info);
|
|
int drm_fb_helper_debug_leave(struct fb_info *info);
|
|
struct drm_display_mode *
|
|
drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
|
|
int width, int height);
|
|
struct drm_display_mode *
|
|
drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
|
|
int width, int height);
|
|
|
|
int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);
|
|
int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
|
|
struct drm_connector *connector);
|
|
#endif
|