Module Name: src
Committed By: riastradh
Date: Sun Sep 8 16:38:51 UTC 2013
Modified Files:
src/sys/external/bsd/drm2/dist/drm [riastradh-drm2]: drm_fb_helper.c
src/sys/external/bsd/drm2/dist/drm/i915 [riastradh-drm2]:
intel_display.c intel_drv.h
src/sys/external/bsd/drm2/dist/include/drm [riastradh-drm2]:
drm_fb_helper.h
src/sys/external/bsd/drm2/i915drm [riastradh-drm2]: intel_fb.c
src/sys/modules/drm2 [riastradh-drm2]: Makefile
Log Message:
Round of hacking on i915 framebuffers.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1.2.2 -r1.1.1.1.2.3 \
src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c
cvs rdiff -u -r1.1.1.1.2.8 -r1.1.1.1.2.9 \
src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c
cvs rdiff -u -r1.1.1.1.2.4 -r1.1.1.1.2.5 \
src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h
cvs rdiff -u -r1.1.1.1.2.2 -r1.1.1.1.2.3 \
src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/external/bsd/drm2/i915drm/intel_fb.c
cvs rdiff -u -r1.1.2.41 -r1.1.2.42 src/sys/modules/drm2/Makefile
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.1.1.1.2.2 src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.1.1.1.2.3
--- src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c:1.1.1.1.2.2 Tue Jul 23 21:28:21 2013
+++ src/sys/external/bsd/drm2/dist/drm/drm_fb_helper.c Sun Sep 8 16:38:51 2013
@@ -34,6 +34,12 @@
#include <linux/slab.h>
#include <linux/fb.h>
#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/export.h>
+#include <linux/list.h>
+#include <linux/notifier.h>
+#include <linux/printk.h>
+#include <linux/sysrq.h>
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_fb_helper.h>
@@ -43,7 +49,12 @@ MODULE_AUTHOR("David Airlie, Jesse Barne
MODULE_DESCRIPTION("DRM KMS helper");
MODULE_LICENSE("GPL and additional rights");
+#ifdef __NetBSD__ /* XXX LIST_HEAD means something else */
+static struct list_head kernel_fb_helper_list =
+ LIST_HEAD_INIT(kernel_fb_helper_list);
+#else
static LIST_HEAD(kernel_fb_helper_list);
+#endif
/**
* DOC: fbdev helpers
@@ -82,6 +93,7 @@ fail:
}
EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors);
+#ifndef __NetBSD__ /* XXX fb command line */
static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper)
{
struct drm_fb_helper_connector *fb_helper_conn;
@@ -135,7 +147,9 @@ static int drm_fb_helper_parse_command_l
}
return 0;
}
+#endif
+#ifndef __NetBSD__ /* XXX fb info */
static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
{
uint16_t *r_base, *g_base, *b_base;
@@ -238,6 +252,7 @@ int drm_fb_helper_debug_leave(struct fb_
return 0;
}
EXPORT_SYMBOL(drm_fb_helper_debug_leave);
+#endif
bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
{
@@ -272,7 +287,7 @@ static bool drm_fb_helper_force_kernel_m
return error;
}
-int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed,
+static int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed,
void *panic_str)
{
/*
@@ -323,9 +338,10 @@ static struct sysrq_key_op sysrq_drm_fb_
.action_msg = "Restore framebuffer console",
};
#else
-static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
+static struct sysrq_key_op sysrq_drm_fb_helper_restore_op;
#endif
+#ifndef __NetBSD__ /* XXX fb info */
static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -382,6 +398,7 @@ int drm_fb_helper_blank(int blank, struc
return 0;
}
EXPORT_SYMBOL(drm_fb_helper_blank);
+#endif
static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
{
@@ -462,6 +479,7 @@ void drm_fb_helper_fini(struct drm_fb_he
}
EXPORT_SYMBOL(drm_fb_helper_fini);
+#ifndef __NetBSD__ /* XXX fb info */
static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
u16 blue, u16 regno, struct fb_info *info)
{
@@ -656,22 +674,17 @@ int drm_fb_helper_check_var(struct fb_va
return 0;
}
EXPORT_SYMBOL(drm_fb_helper_check_var);
+#endif
/* this will let fbcon do the mode init */
-int drm_fb_helper_set_par(struct fb_info *info)
+static int
+drm_fb_helper_set_config(struct drm_fb_helper *fb_helper)
{
- struct drm_fb_helper *fb_helper = info->par;
struct drm_device *dev = fb_helper->dev;
- struct fb_var_screeninfo *var = &info->var;
struct drm_crtc *crtc;
int ret;
int i;
- if (var->pixclock != 0) {
- DRM_ERROR("PIXEL CLOCK SET\n");
- return -EINVAL;
- }
-
mutex_lock(&dev->mode_config.mutex);
for (i = 0; i < fb_helper->crtc_count; i++) {
crtc = fb_helper->crtc_info[i].mode_set.crtc;
@@ -689,6 +702,20 @@ int drm_fb_helper_set_par(struct fb_info
}
return 0;
}
+
+#ifndef __NetBSD__
+int drm_fb_helper_set_par(struct fb_info *info)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct fb_var_screeninfo *var = &info->var;
+
+ if (var->pixclock != 0) {
+ DRM_ERROR("PIXEL CLOCK SET\n");
+ return -EINVAL;
+ }
+
+ return drm_fb_helper_set_config(fb_helper);
+}
EXPORT_SYMBOL(drm_fb_helper_set_par);
int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
@@ -722,6 +749,7 @@ int drm_fb_helper_pan_display(struct fb_
return ret;
}
EXPORT_SYMBOL(drm_fb_helper_pan_display);
+#endif
int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
int preferred_bpp)
@@ -729,7 +757,9 @@ int drm_fb_helper_single_fb_probe(struct
int new_fb = 0;
int crtc_count = 0;
int i;
+#ifndef __NetBSD__ /* XXX fb info */
struct fb_info *info;
+#endif
struct drm_fb_helper_surface_size sizes;
int gamma_size = 0;
@@ -808,13 +838,16 @@ int drm_fb_helper_single_fb_probe(struct
if (new_fb < 0)
return new_fb;
+#ifndef __NetBSD__ /* XXX fb info */
info = fb_helper->fbdev;
+#endif
/* set the fb pointer */
for (i = 0; i < fb_helper->crtc_count; i++)
fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
if (new_fb) {
+#ifndef __NetBSD__ /* XXX fb info */
info->var.pixclock = 0;
if (register_framebuffer(info) < 0)
return -EINVAL;
@@ -822,8 +855,13 @@ int drm_fb_helper_single_fb_probe(struct
dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n",
info->node, info->fix.id);
+#endif
} else {
+#ifdef __NetBSD__ /* XXX fb info */
+ drm_fb_helper_set_config(fb_helper);
+#else
drm_fb_helper_set_par(info);
+#endif
}
/* Switch back to kernel console on panic */
@@ -841,6 +879,7 @@ int drm_fb_helper_single_fb_probe(struct
}
EXPORT_SYMBOL(drm_fb_helper_single_fb_probe);
+#ifndef __NetBSD__ /* XXX fb info */
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
uint32_t depth)
{
@@ -934,6 +973,7 @@ void drm_fb_helper_fill_var(struct fb_in
info->var.yres = fb_height;
}
EXPORT_SYMBOL(drm_fb_helper_fill_var);
+#endif
static int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper,
uint32_t maxX,
@@ -975,6 +1015,9 @@ static bool drm_has_cmdline_mode(struct
static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
int width, int height)
{
+#ifdef __NetBSD__ /* XXX fb command line */
+ return NULL;
+#else
struct drm_cmdline_mode *cmdline_mode;
struct drm_display_mode *mode = NULL;
@@ -1011,6 +1054,7 @@ create_mode:
cmdline_mode);
list_add(&mode->head, &fb_helper_conn->connector->modes);
return mode;
+#endif
}
static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
@@ -1333,7 +1377,9 @@ bool drm_fb_helper_initial_config(struct
/* disable all the possible outputs/crtcs before entering KMS mode */
drm_helper_disable_unused_functions(fb_helper->dev);
+#ifndef __NetBSD__ /* XXX fb command line */
drm_fb_helper_parse_command_line(fb_helper);
+#endif
count = drm_fb_helper_probe_connector_modes(fb_helper,
dev->mode_config.max_width,
Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.8 src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.9
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.1.1.1.2.8 Wed Jul 24 03:39:23 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c Sun Sep 8 16:38:51 2013
@@ -2240,13 +2240,6 @@ intel_pipe_set_base_atomic(struct drm_cr
return dev_priv->display.update_plane(crtc, fb, x, y);
}
-#ifdef __NetBSD__ /* XXX fb */
-static int
-intel_finish_fb(struct drm_framebuffer *old_fb __unused)
-{
- return 0;
-}
-#else
static int
intel_finish_fb(struct drm_framebuffer *old_fb)
{
@@ -2255,9 +2248,20 @@ intel_finish_fb(struct drm_framebuffer *
bool was_interruptible = dev_priv->mm.interruptible;
int ret;
+#ifdef __NetBSD__ /* XXX DRM_WAIT_UNINTERRUPTIBLE_UNTIL */
+ mutex_lock(&dev_priv->pending_flip_lock);
+ do {
+ DRM_WAIT_UNTIL(ret, &dev_priv->pending_flip_queue,
+ &dev_priv->pending_flip_lock,
+ (atomic_read(&dev_priv->mm.wedged) ||
+ atomic_read(&obj->pending_flip) == 0));
+ } while (ret);
+ mutex_unlock(&dev_priv->pending_flip_lock);
+#else
wait_event(dev_priv->pending_flip_queue,
atomic_read(&dev_priv->mm.wedged) ||
atomic_read(&obj->pending_flip) == 0);
+#endif
/* Big Hammer, we also need to ensure that any pending
* MI_WAIT_FOR_EVENT inside a user batch buffer on the
@@ -2273,7 +2277,6 @@ intel_finish_fb(struct drm_framebuffer *
return ret;
}
-#endif
static void intel_crtc_update_sarea_pos(struct drm_crtc *crtc, int x, int y)
{
@@ -6638,38 +6641,36 @@ intel_framebuffer_create(struct drm_devi
return &intel_fb->base;
}
-#ifndef __NetBSD__ /* XXX fb */
static u32
intel_framebuffer_pitch_for_width(int width, int bpp)
{
u32 pitch = DIV_ROUND_UP(width * bpp, 8);
+#ifdef __NetBSD__ /* XXX ALIGN already means something. */
+ return round_up(pitch, 64);
+#else
return ALIGN(pitch, 64);
+#endif
}
static u32
intel_framebuffer_size_for_mode(struct drm_display_mode *mode, int bpp)
{
u32 pitch = intel_framebuffer_pitch_for_width(mode->hdisplay, bpp);
+#ifdef __NetBSD__ /* XXX ALIGN already means something. */
+ return round_up(pitch * mode->vdisplay, PAGE_SIZE);
+#else
return ALIGN(pitch * mode->vdisplay, PAGE_SIZE);
-}
#endif
-
-#ifdef __NetBSD__ /* XXX fb */
-static struct drm_framebuffer *
-intel_framebuffer_create_for_mode(struct drm_device *dev __unused,
- struct drm_display_mode *mode __unused,
- int depth __unused, int bpp __unused)
-{
- return NULL;
}
-#else
+
static struct drm_framebuffer *
intel_framebuffer_create_for_mode(struct drm_device *dev,
struct drm_display_mode *mode,
int depth, int bpp)
{
struct drm_i915_gem_object *obj;
- struct drm_mode_fb_cmd2 mode_cmd = { 0 };
+ static const struct drm_mode_fb_cmd2 zero_mode_cmd;
+ struct drm_mode_fb_cmd2 mode_cmd = zero_mode_cmd;
obj = i915_gem_alloc_object(dev,
intel_framebuffer_size_for_mode(mode, bpp));
@@ -6684,16 +6685,7 @@ intel_framebuffer_create_for_mode(struct
return intel_framebuffer_create(dev, &mode_cmd, obj);
}
-#endif
-#ifdef __NetBSD__ /* XXX fb */
-static struct drm_framebuffer *
-mode_fits_in_fbdev(struct drm_device *dev __unused,
- struct drm_display_mode *mode __unused)
-{
- return NULL;
-}
-#else
static struct drm_framebuffer *
mode_fits_in_fbdev(struct drm_device *dev,
struct drm_display_mode *mode)
@@ -6719,7 +6711,6 @@ mode_fits_in_fbdev(struct drm_device *de
return fb;
}
-#endif
bool intel_get_load_detect_pipe(struct drm_connector *connector,
struct drm_display_mode *mode,
Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h:1.1.1.1.2.4 src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h:1.1.1.1.2.5
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h:1.1.1.1.2.4 Wed Jul 24 03:11:21 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_drv.h Sun Sep 8 16:38:51 2013
@@ -31,9 +31,7 @@
#include "i915_drv.h"
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
-#ifndef __NetBSD__
#include <drm/drm_fb_helper.h>
-#endif
#include <drm/drm_dp_helper.h>
#define _wait_for(COND, MS, W) ({ \
@@ -132,14 +130,12 @@ struct intel_framebuffer {
struct drm_i915_gem_object *obj;
};
-#ifndef __NetBSD__ /* XXX fb */
struct intel_fbdev {
struct drm_fb_helper helper;
struct intel_framebuffer ifb;
struct list_head fbdev_list;
struct drm_display_mode *our_mode;
};
-#endif
struct intel_encoder {
struct drm_encoder base;
Index: src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h:1.1.1.1.2.2 src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h:1.1.1.1.2.3
--- src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h:1.1.1.1.2.2 Tue Jul 23 21:28:23 2013
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h Sun Sep 8 16:38:51 2013
@@ -73,7 +73,9 @@ struct drm_fb_helper {
int connector_count;
struct drm_fb_helper_connector **connector_info;
struct drm_fb_helper_funcs *funcs;
+#ifndef __NetBSD__ /* XXX fb info */
struct fb_info *fbdev;
+#endif
u32 pseudo_palette[17];
struct list_head kernel_fb_list;
@@ -89,6 +91,7 @@ int drm_fb_helper_init(struct drm_device
struct drm_fb_helper *helper, int crtc_count,
int max_conn);
void drm_fb_helper_fini(struct drm_fb_helper *helper);
+#ifndef __NetBSD__ /* XXX fb info */
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);
@@ -101,20 +104,27 @@ int drm_fb_helper_setcolreg(unsigned reg
unsigned blue,
unsigned transp,
struct fb_info *info);
+#endif
bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper);
void drm_fb_helper_restore(void);
+#ifndef __NetBSD__ /* XXX fb info */
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);
+#endif
+#ifndef __NetBSD__ /* XXX fb cmap */
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
+#endif
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);
+#ifndef __NetBSD__ /* XXX fb info */
int drm_fb_helper_debug_enter(struct fb_info *info);
int drm_fb_helper_debug_leave(struct fb_info *info);
+#endif
#endif
Index: src/sys/external/bsd/drm2/i915drm/intel_fb.c
diff -u src/sys/external/bsd/drm2/i915drm/intel_fb.c:1.1.2.1 src/sys/external/bsd/drm2/i915drm/intel_fb.c:1.1.2.2
--- src/sys/external/bsd/drm2/i915drm/intel_fb.c:1.1.2.1 Wed Jul 24 03:52:13 2013
+++ src/sys/external/bsd/drm2/i915drm/intel_fb.c Sun Sep 8 16:38:51 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: intel_fb.c,v 1.1.2.1 2013/07/24 03:52:13 riastradh Exp $ */
+/* $NetBSD: intel_fb.c,v 1.1.2.2 2013/09/08 16:38:51 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,17 +32,37 @@
/* intel_fb.c stubs */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_fb.c,v 1.1.2.1 2013/07/24 03:52:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_fb.c,v 1.1.2.2 2013/09/08 16:38:51 riastradh Exp $");
+
+#include <drm/drmP.h>
+#include <drm/drm_fb_helper.h>
#include "i915_drv.h"
+#include "intel_drv.h"
void
intel_fb_output_poll_changed(struct drm_device *dev __unused)
{
+ struct drm_i915_private *const dev_priv = dev->dev_private;
+
+ drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
}
void
intel_fb_restore_mode(struct drm_device *dev __unused)
{
-}
+ struct drm_i915_private *const dev_priv = dev->dev_private;
+ struct drm_plane *plane;
+ int ret;
+
+ mutex_lock(&dev->mode_config.mutex);
+ ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
+ if (ret)
+ DRM_ERROR("failed to restore fbdev mode: %d\n", ret);
+
+ list_for_each_entry(plane, &dev->mode_config.plane_list, head)
+ (*plane->funcs->disable_plane)(plane);
+
+ mutex_unlock(&dev->mode_config.mutex);
+}
Index: src/sys/modules/drm2/Makefile
diff -u src/sys/modules/drm2/Makefile:1.1.2.41 src/sys/modules/drm2/Makefile:1.1.2.42
--- src/sys/modules/drm2/Makefile:1.1.2.41 Sun Sep 8 16:11:29 2013
+++ src/sys/modules/drm2/Makefile Sun Sep 8 16:38:51 2013
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1.2.41 2013/09/08 16:11:29 riastradh Exp $
+# $NetBSD: Makefile,v 1.1.2.42 2013/09/08 16:38:51 riastradh Exp $
.include "../Makefile.inc"
.include "Makefile.inc"
@@ -25,7 +25,7 @@ SRCS+= drm_dp_helper.c
SRCS+= drm_drv.c
SRCS+= drm_edid.c
#SRCS+= drm_encoder_slave.c # XXX Rewrite for i2c.
-#SRCS+= drm_fb_helper.c # XXX Rewrite for wsconsole.
+SRCS+= drm_fb_helper.c # XXX Rewrite for wsconsole.
SRCS+= drm_fops.c
SRCS+= drm_gem.c
SRCS+= drm_global.c