Commit e5202a22 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'topic/core-stuff-2014-12-19' of git://anongit.freedesktop.org/drm-intel into drm-next

Misc drm patches with mostly polish patches from Thierry, with a bit of
generic mode validation from Ville and a few other oddball things.

* tag 'topic/core-stuff-2014-12-19' of git://anongit.freedesktop.org/drm-intel: (25 commits)
  drm: Include drm_crtc_helper.h in DocBook
  drm: Make drm_crtc_helper.h standalone includible
  drm: Move IRQ related fields to proper section
  drm: Remove stale comment
  drm: Do basic sanity checks for user modes
  drm: Perform basic sanity checks on probed modes
  drm: Reorganize probed mode validation
  drm/doc: Remove duplicate "by"
  drm/info: Remove unused code
  drm/cache: Use wbinvd helpers
  drm/plane-helper: Test for plane disable earlier
  drm/doc: Document drm_add_modes_noedid() usage
  drm: bit of spell-check / editorializing.
  drm: Prefer sizeof(type) over sizeof type
  drm: Remove useless else block
  drm: Remove unneeded braces for single statement blocks
  drm: Do not assign in if condition
  drm: Prefer kmalloc_array() over kmalloc() with multiply
  drm: Prefer kcalloc() over kzalloc() with multiply
  drm: Miscellaneous checkpatch whitespace cleanups
  ...
parents b1940cd2 7552e7dd
...@@ -1377,7 +1377,7 @@ int max_width, max_height;</synopsis> ...@@ -1377,7 +1377,7 @@ int max_width, max_height;</synopsis>
<itemizedlist> <itemizedlist>
<listitem> <listitem>
DRM_PLANE_TYPE_PRIMARY represents a "main" plane for a CRTC. Primary DRM_PLANE_TYPE_PRIMARY represents a "main" plane for a CRTC. Primary
planes are the planes operated upon by by CRTC modesetting and flipping planes are the planes operated upon by CRTC modesetting and flipping
operations described in <xref linkend="drm-kms-crtcops"/>. operations described in <xref linkend="drm-kms-crtcops"/>.
</listitem> </listitem>
<listitem> <listitem>
...@@ -2362,6 +2362,7 @@ void intel_crt_init(struct drm_device *dev) ...@@ -2362,6 +2362,7 @@ void intel_crt_init(struct drm_device *dev)
</sect2> </sect2>
<sect2> <sect2>
<title>Modeset Helper Functions Reference</title> <title>Modeset Helper Functions Reference</title>
!Iinclude/drm/drm_crtc_helper.h
!Edrivers/gpu/drm/drm_crtc_helper.c !Edrivers/gpu/drm/drm_crtc_helper.c
!Pdrivers/gpu/drm/drm_crtc_helper.c overview !Pdrivers/gpu/drm/drm_crtc_helper.c overview
</sect2> </sect2>
......
...@@ -653,10 +653,6 @@ static int armada_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, ...@@ -653,10 +653,6 @@ static int armada_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
return 0; return 0;
} }
static void armada_drm_crtc_load_lut(struct drm_crtc *crtc)
{
}
/* The mode_config.mutex will be held for this call */ /* The mode_config.mutex will be held for this call */
static void armada_drm_crtc_disable(struct drm_crtc *crtc) static void armada_drm_crtc_disable(struct drm_crtc *crtc)
{ {
...@@ -678,7 +674,6 @@ static const struct drm_crtc_helper_funcs armada_crtc_helper_funcs = { ...@@ -678,7 +674,6 @@ static const struct drm_crtc_helper_funcs armada_crtc_helper_funcs = {
.mode_fixup = armada_drm_crtc_mode_fixup, .mode_fixup = armada_drm_crtc_mode_fixup,
.mode_set = armada_drm_crtc_mode_set, .mode_set = armada_drm_crtc_mode_set,
.mode_set_base = armada_drm_crtc_mode_set_base, .mode_set_base = armada_drm_crtc_mode_set_base,
.load_lut = armada_drm_crtc_load_lut,
.disable = armada_drm_crtc_disable, .disable = armada_drm_crtc_disable,
}; };
......
...@@ -18,10 +18,6 @@ MODULE_PARM_DESC(defy, "default y resolution"); ...@@ -18,10 +18,6 @@ MODULE_PARM_DESC(defy, "default y resolution");
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
static void bochs_crtc_load_lut(struct drm_crtc *crtc)
{
}
static void bochs_crtc_dpms(struct drm_crtc *crtc, int mode) static void bochs_crtc_dpms(struct drm_crtc *crtc, int mode)
{ {
switch (mode) { switch (mode) {
...@@ -144,7 +140,6 @@ static const struct drm_crtc_helper_funcs bochs_helper_funcs = { ...@@ -144,7 +140,6 @@ static const struct drm_crtc_helper_funcs bochs_helper_funcs = {
.mode_set_base = bochs_crtc_mode_set_base, .mode_set_base = bochs_crtc_mode_set_base,
.prepare = bochs_crtc_prepare, .prepare = bochs_crtc_prepare,
.commit = bochs_crtc_commit, .commit = bochs_crtc_commit,
.load_lut = bochs_crtc_load_lut,
}; };
static void bochs_crtc_init(struct drm_device *dev) static void bochs_crtc_init(struct drm_device *dev)
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <drm/drmP.h> #include <drm/drmP.h>
#if defined(CONFIG_X86) #if defined(CONFIG_X86)
#include <asm/smp.h>
/* /*
* clflushopt is an unordered instruction which needs fencing with mfence or * clflushopt is an unordered instruction which needs fencing with mfence or
...@@ -64,12 +65,6 @@ static void drm_cache_flush_clflush(struct page *pages[], ...@@ -64,12 +65,6 @@ static void drm_cache_flush_clflush(struct page *pages[],
drm_clflush_page(*pages++); drm_clflush_page(*pages++);
mb(); mb();
} }
static void
drm_clflush_ipi_handler(void *null)
{
wbinvd();
}
#endif #endif
void void
...@@ -82,7 +77,7 @@ drm_clflush_pages(struct page *pages[], unsigned long num_pages) ...@@ -82,7 +77,7 @@ drm_clflush_pages(struct page *pages[], unsigned long num_pages)
return; return;
} }
if (on_each_cpu(drm_clflush_ipi_handler, NULL, 1) != 0) if (wbinvd_on_all_cpus())
printk(KERN_ERR "Timed out waiting for cache flush.\n"); printk(KERN_ERR "Timed out waiting for cache flush.\n");
#elif defined(__powerpc__) #elif defined(__powerpc__)
...@@ -121,7 +116,7 @@ drm_clflush_sg(struct sg_table *st) ...@@ -121,7 +116,7 @@ drm_clflush_sg(struct sg_table *st)
return; return;
} }
if (on_each_cpu(drm_clflush_ipi_handler, NULL, 1) != 0) if (wbinvd_on_all_cpus())
printk(KERN_ERR "Timed out waiting for cache flush.\n"); printk(KERN_ERR "Timed out waiting for cache flush.\n");
#else #else
printk(KERN_ERR "Architecture has no drm_cache.c support\n"); printk(KERN_ERR "Architecture has no drm_cache.c support\n");
...@@ -144,7 +139,7 @@ drm_clflush_virt_range(void *addr, unsigned long length) ...@@ -144,7 +139,7 @@ drm_clflush_virt_range(void *addr, unsigned long length)
return; return;
} }
if (on_each_cpu(drm_clflush_ipi_handler, NULL, 1) != 0) if (wbinvd_on_all_cpus())
printk(KERN_ERR "Timed out waiting for cache flush.\n"); printk(KERN_ERR "Timed out waiting for cache flush.\n");
#else #else
printk(KERN_ERR "Architecture has no drm_cache.c support\n"); printk(KERN_ERR "Architecture has no drm_cache.c support\n");
......
...@@ -61,8 +61,8 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, ...@@ -61,8 +61,8 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev,
/* /*
* Global properties * Global properties
*/ */
static const struct drm_prop_enum_list drm_dpms_enum_list[] = static const struct drm_prop_enum_list drm_dpms_enum_list[] = {
{ { DRM_MODE_DPMS_ON, "On" }, { DRM_MODE_DPMS_ON, "On" },
{ DRM_MODE_DPMS_STANDBY, "Standby" }, { DRM_MODE_DPMS_STANDBY, "Standby" },
{ DRM_MODE_DPMS_SUSPEND, "Suspend" }, { DRM_MODE_DPMS_SUSPEND, "Suspend" },
{ DRM_MODE_DPMS_OFF, "Off" } { DRM_MODE_DPMS_OFF, "Off" }
...@@ -70,8 +70,7 @@ static const struct drm_prop_enum_list drm_dpms_enum_list[] = ...@@ -70,8 +70,7 @@ static const struct drm_prop_enum_list drm_dpms_enum_list[] =
DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list) DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list)
static const struct drm_prop_enum_list drm_plane_type_enum_list[] = static const struct drm_prop_enum_list drm_plane_type_enum_list[] = {
{
{ DRM_PLANE_TYPE_OVERLAY, "Overlay" }, { DRM_PLANE_TYPE_OVERLAY, "Overlay" },
{ DRM_PLANE_TYPE_PRIMARY, "Primary" }, { DRM_PLANE_TYPE_PRIMARY, "Primary" },
{ DRM_PLANE_TYPE_CURSOR, "Cursor" }, { DRM_PLANE_TYPE_CURSOR, "Cursor" },
...@@ -80,8 +79,7 @@ static const struct drm_prop_enum_list drm_plane_type_enum_list[] = ...@@ -80,8 +79,7 @@ static const struct drm_prop_enum_list drm_plane_type_enum_list[] =
/* /*
* Optional properties * Optional properties
*/ */
static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = {
{
{ DRM_MODE_SCALE_NONE, "None" }, { DRM_MODE_SCALE_NONE, "None" },
{ DRM_MODE_SCALE_FULLSCREEN, "Full" }, { DRM_MODE_SCALE_FULLSCREEN, "Full" },
{ DRM_MODE_SCALE_CENTER, "Center" }, { DRM_MODE_SCALE_CENTER, "Center" },
...@@ -97,8 +95,7 @@ static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = { ...@@ -97,8 +95,7 @@ static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = {
/* /*
* Non-global properties, but "required" for certain connectors. * Non-global properties, but "required" for certain connectors.
*/ */
static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
{
{ DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
{ DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */ { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
{ DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */ { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
...@@ -106,8 +103,7 @@ static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = ...@@ -106,8 +103,7 @@ static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] =
DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list) DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
{
{ DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */ { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */
{ DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */ { DRM_MODE_SUBCONNECTOR_DVID, "DVI-D" }, /* DVI-I */
{ DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */ { DRM_MODE_SUBCONNECTOR_DVIA, "DVI-A" }, /* DVI-I */
...@@ -116,8 +112,7 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = ...@@ -116,8 +112,7 @@ static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] =
DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name, DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name,
drm_dvi_i_subconnector_enum_list) drm_dvi_i_subconnector_enum_list)
static const struct drm_prop_enum_list drm_tv_select_enum_list[] = static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
{
{ DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */ { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
{ DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */ { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
...@@ -127,8 +122,7 @@ static const struct drm_prop_enum_list drm_tv_select_enum_list[] = ...@@ -127,8 +122,7 @@ static const struct drm_prop_enum_list drm_tv_select_enum_list[] =
DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list) DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
{
{ DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */ { DRM_MODE_SUBCONNECTOR_Unknown, "Unknown" }, /* DVI-I and TV-out */
{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */ { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
{ DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */ { DRM_MODE_SUBCONNECTOR_SVIDEO, "SVIDEO" }, /* TV-out */
...@@ -154,8 +148,8 @@ struct drm_conn_prop_enum_list { ...@@ -154,8 +148,8 @@ struct drm_conn_prop_enum_list {
/* /*
* Connector and encoder types. * Connector and encoder types.
*/ */
static struct drm_conn_prop_enum_list drm_connector_enum_list[] = static struct drm_conn_prop_enum_list drm_connector_enum_list[] = {
{ { DRM_MODE_CONNECTOR_Unknown, "Unknown" }, { DRM_MODE_CONNECTOR_Unknown, "Unknown" },
{ DRM_MODE_CONNECTOR_VGA, "VGA" }, { DRM_MODE_CONNECTOR_VGA, "VGA" },
{ DRM_MODE_CONNECTOR_DVII, "DVI-I" }, { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
{ DRM_MODE_CONNECTOR_DVID, "DVI-D" }, { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
...@@ -174,8 +168,8 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] = ...@@ -174,8 +168,8 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] =
{ DRM_MODE_CONNECTOR_DSI, "DSI" }, { DRM_MODE_CONNECTOR_DSI, "DSI" },
}; };
static const struct drm_prop_enum_list drm_encoder_enum_list[] = static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
{ { DRM_MODE_ENCODER_NONE, "None" }, { DRM_MODE_ENCODER_NONE, "None" },
{ DRM_MODE_ENCODER_DAC, "DAC" }, { DRM_MODE_ENCODER_DAC, "DAC" },
{ DRM_MODE_ENCODER_TMDS, "TMDS" }, { DRM_MODE_ENCODER_TMDS, "TMDS" },
{ DRM_MODE_ENCODER_LVDS, "LVDS" }, { DRM_MODE_ENCODER_LVDS, "LVDS" },
...@@ -185,8 +179,7 @@ static const struct drm_prop_enum_list drm_encoder_enum_list[] = ...@@ -185,8 +179,7 @@ static const struct drm_prop_enum_list drm_encoder_enum_list[] =
{ DRM_MODE_ENCODER_DPMST, "DP MST" }, { DRM_MODE_ENCODER_DPMST, "DP MST" },
}; };
static const struct drm_prop_enum_list drm_subpixel_enum_list[] = static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
{
{ SubPixelUnknown, "Unknown" }, { SubPixelUnknown, "Unknown" },
{ SubPixelHorizontalRGB, "Horizontal RGB" }, { SubPixelHorizontalRGB, "Horizontal RGB" },
{ SubPixelHorizontalBGR, "Horizontal BGR" }, { SubPixelHorizontalBGR, "Horizontal BGR" },
...@@ -1142,6 +1135,7 @@ EXPORT_SYMBOL(drm_encoder_init); ...@@ -1142,6 +1135,7 @@ EXPORT_SYMBOL(drm_encoder_init);
void drm_encoder_cleanup(struct drm_encoder *encoder) void drm_encoder_cleanup(struct drm_encoder *encoder)
{ {
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
drm_modeset_lock_all(dev); drm_modeset_lock_all(dev);
drm_mode_object_put(dev, &encoder->base); drm_mode_object_put(dev, &encoder->base);
kfree(encoder->name); kfree(encoder->name);
...@@ -1185,8 +1179,8 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, ...@@ -1185,8 +1179,8 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
plane->base.properties = &plane->properties; plane->base.properties = &plane->properties;
plane->dev = dev; plane->dev = dev;
plane->funcs = funcs; plane->funcs = funcs;
plane->format_types = kmalloc(sizeof(uint32_t) * format_count, plane->format_types = kmalloc_array(format_count, sizeof(uint32_t),
GFP_KERNEL); GFP_KERNEL);
if (!plane->format_types) { if (!plane->format_types) {
DRM_DEBUG_KMS("out of memory when allocating plane\n"); DRM_DEBUG_KMS("out of memory when allocating plane\n");
drm_mode_object_put(dev, &plane->base); drm_mode_object_put(dev, &plane->base);
...@@ -1599,7 +1593,7 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr ...@@ -1599,7 +1593,7 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr
total_objects += dev->mode_config.num_encoder; total_objects += dev->mode_config.num_encoder;
total_objects += dev->mode_config.num_bridge; total_objects += dev->mode_config.num_bridge;
group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); group->id_list = kcalloc(total_objects, sizeof(uint32_t), GFP_KERNEL);
if (!group->id_list) if (!group->id_list)
return -ENOMEM; return -ENOMEM;
...@@ -1629,7 +1623,8 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev, ...@@ -1629,7 +1623,8 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev,
struct drm_bridge *bridge; struct drm_bridge *bridge;
int ret; int ret;
if ((ret = drm_mode_group_init(dev, group))) ret = drm_mode_group_init(dev, group);
if (ret)
return ret; return ret;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
...@@ -2045,11 +2040,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, ...@@ -2045,11 +2040,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
props_count = connector->properties.count; props_count = connector->properties.count;
for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++)
if (connector->encoder_ids[i] != 0) { if (connector->encoder_ids[i] != 0)
encoders_count++; encoders_count++;
}
}
if (out_resp->count_modes == 0) { if (out_resp->count_modes == 0) {
connector->funcs->fill_modes(connector, connector->funcs->fill_modes(connector,
...@@ -2529,7 +2522,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data, ...@@ -2529,7 +2522,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
* *
* This is a little helper to wrap internal calls to the ->set_config driver * This is a little helper to wrap internal calls to the ->set_config driver
* interface. The only thing it adds is correct refcounting dance. * interface. The only thing it adds is correct refcounting dance.
* *
* Returns: * Returns:
* Zero on success, negative errno on failure. * Zero on success, negative errno on failure.
*/ */
...@@ -2690,6 +2683,12 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -2690,6 +2683,12 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
goto out; goto out;
} }
mode->status = drm_mode_validate_basic(mode);
if (mode->status != MODE_OK) {
ret = -EINVAL;
goto out;
}
drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y, ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
...@@ -2721,9 +2720,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -2721,9 +2720,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
goto out; goto out;
} }
connector_set = kmalloc(crtc_req->count_connectors * connector_set = kmalloc_array(crtc_req->count_connectors,
sizeof(struct drm_connector *), sizeof(struct drm_connector *),
GFP_KERNEL); GFP_KERNEL);
if (!connector_set) { if (!connector_set) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
...@@ -2968,6 +2967,7 @@ int drm_mode_cursor2_ioctl(struct drm_device *dev, ...@@ -2968,6 +2967,7 @@ int drm_mode_cursor2_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv) void *data, struct drm_file *file_priv)
{ {
struct drm_mode_cursor2 *req = data; struct drm_mode_cursor2 *req = data;
return drm_mode_cursor_common(dev, req, file_priv); return drm_mode_cursor_common(dev, req, file_priv);
} }
...@@ -3415,7 +3415,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, ...@@ -3415,7 +3415,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
ret = -EINVAL; ret = -EINVAL;
goto out_err1; goto out_err1;
} }
clips = kzalloc(num_clips * sizeof(*clips), GFP_KERNEL); clips = kcalloc(num_clips, sizeof(*clips), GFP_KERNEL);
if (!clips) { if (!clips) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_err1; goto out_err1;
...@@ -3516,7 +3516,8 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags, ...@@ -3516,7 +3516,8 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags,
property->dev = dev; property->dev = dev;
if (num_values) { if (num_values) {
property->values = kzalloc(sizeof(uint64_t)*num_values, GFP_KERNEL); property->values = kcalloc(num_values, sizeof(uint64_t),
GFP_KERNEL);
if (!property->values) if (!property->values)
goto fail; goto fail;
} }
...@@ -4057,7 +4058,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, ...@@ -4057,7 +4058,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,
if (out_resp->length == blob->length) { if (out_resp->length == blob->length) {
blob_ptr = (void __user *)(unsigned long)out_resp->data; blob_ptr = (void __user *)(unsigned long)out_resp->data;
if (copy_to_user(blob_ptr, blob->data, blob->length)){ if (copy_to_user(blob_ptr, blob->data, blob->length)) {
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
...@@ -4196,6 +4197,8 @@ EXPORT_SYMBOL(drm_mode_connector_update_edid_property); ...@@ -4196,6 +4197,8 @@ EXPORT_SYMBOL(drm_mode_connector_update_edid_property);
static bool drm_property_change_is_valid(struct drm_property *property, static bool drm_property_change_is_valid(struct drm_property *property,
uint64_t value) uint64_t value)
{ {
int i;
if (property->flags & DRM_MODE_PROP_IMMUTABLE) if (property->flags & DRM_MODE_PROP_IMMUTABLE)
return false; return false;
...@@ -4205,13 +4208,14 @@ static bool drm_property_change_is_valid(struct drm_property *property, ...@@ -4205,13 +4208,14 @@ static bool drm_property_change_is_valid(struct drm_property *property,
return true; return true;
} else if (drm_property_type_is(property, DRM_MODE_PROP_SIGNED_RANGE)) { } else if (drm_property_type_is(property, DRM_MODE_PROP_SIGNED_RANGE)) {
int64_t svalue = U642I64(value); int64_t svalue = U642I64(value);
if (svalue < U642I64(property->values[0]) || if (svalue < U642I64(property->values[0]) ||
svalue > U642I64(property->values[1])) svalue > U642I64(property->values[1]))
return false; return false;
return true; return true;
} else if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) { } else if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
int i;
uint64_t valid_mask = 0; uint64_t valid_mask = 0;
for (i = 0; i < property->num_values; i++) for (i = 0; i < property->num_values; i++)
valid_mask |= (1ULL << property->values[i]); valid_mask |= (1ULL << property->values[i]);
return !(value & ~valid_mask); return !(value & ~valid_mask);
...@@ -4220,6 +4224,7 @@ static bool drm_property_change_is_valid(struct drm_property *property, ...@@ -4220,6 +4224,7 @@ static bool drm_property_change_is_valid(struct drm_property *property,
return true; return true;
} else if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) { } else if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
struct drm_mode_object *obj; struct drm_mode_object *obj;
/* a zero value for an object property translates to null: */ /* a zero value for an object property translates to null: */
if (value == 0) if (value == 0)
return true; return true;
...@@ -4232,13 +4237,12 @@ static bool drm_property_change_is_valid(struct drm_property *property, ...@@ -4232,13 +4237,12 @@ static bool drm_property_change_is_valid(struct drm_property *property,
*/ */
obj = _object_find(property->dev, value, property->values[0]); obj = _object_find(property->dev, value, property->values[0]);
return obj != NULL; return obj != NULL;
} else {
int i;
for (i = 0; i < property->num_values; i++)
if (property->values[i] == value)
return true;
return false;
} }
for (i = 0; i < property->num_values; i++)
if (property->values[i] == value)
return true;
return false;
} }
/** /**
...@@ -4526,7 +4530,8 @@ int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, ...@@ -4526,7 +4530,8 @@ int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
{ {
crtc->gamma_size = gamma_size; crtc->gamma_size = gamma_size;
crtc->gamma_store = kzalloc(gamma_size * sizeof(uint16_t) * 3, GFP_KERNEL); crtc->gamma_store = kcalloc(gamma_size, sizeof(uint16_t) * 3,
GFP_KERNEL);
if (!crtc->gamma_store) { if (!crtc->gamma_store) {
crtc->gamma_size = 0; crtc->gamma_size = 0;
return -ENOMEM; return -ENOMEM;
...@@ -4741,23 +4746,23 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, ...@@ -4741,23 +4746,23 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) { if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) {
ret = -ENOMEM; ret = -ENOMEM;
spin_lock_irqsave(&dev->event_lock, flags); spin_lock_irqsave(&dev->event_lock, flags);
if (file_priv->event_space < sizeof e->event) { if (file_priv->event_space < sizeof(e->event)) {
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
goto out; goto out;
} }
file_priv->event_space -= sizeof e->event; file_priv->event_space -= sizeof(e->event);
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
e = kzalloc(sizeof *e, GFP_KERNEL); e = kzalloc(sizeof(*e), GFP_KERNEL);
if (e == NULL) { if (e == NULL) {
spin_lock_irqsave(&dev->event_lock, flags); spin_lock_irqsave(&dev->event_lock, flags);
file_priv->event_space += sizeof e->event; file_priv->event_space += sizeof(e->event);
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
goto out; goto out;
} }
e->event.base.type = DRM_EVENT_FLIP_COMPLETE; e->event.base.type = DRM_EVENT_FLIP_COMPLETE;
e->event.base.length = sizeof e->event; e->event.base.length = sizeof(e->event);
e->event.user_data = page_flip->user_data; e->event.user_data = page_flip->user_data;
e->base.event = &e->event.base; e->base.event = &e->event.base;
e->base.file_priv = file_priv; e->base.file_priv = file_priv;
...@@ -4770,7 +4775,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, ...@@ -4770,7 +4775,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
if (ret) { if (ret) {
if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) { if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) {
spin_lock_irqsave(&dev->event_lock, flags); spin_lock_irqsave(&dev->event_lock, flags);
file_priv->event_space += sizeof e->event; file_priv->event_space += sizeof(e->event);
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
kfree(e); kfree(e);
} }
......
...@@ -152,30 +152,6 @@ int drm_bufs_info(struct seq_file *m, void *data) ...@@ -152,30 +152,6 @@ int drm_bufs_info(struct seq_file *m, void *data)
return 0; return 0;
} }
/**
* Called when "/proc/dri/.../vblank" is read.
*/
int drm_vblank_info(struct seq_file *m, void *data)
{
struct drm_info_node *node = (struct drm_info_node *) m->private;
struct drm_device *dev = node->minor->dev;
int crtc;
mutex_lock(&dev->struct_mutex);
for (crtc = 0; crtc < dev->num_crtcs; crtc++) {
seq_printf(m, "CRTC %d enable: %d\n",
crtc, atomic_read(&dev->vblank[crtc].refcount));
seq_printf(m, "CRTC %d counter: %d\n",
crtc, drm_vblank_count(dev, crtc));
seq_printf(m, "CRTC %d last wait: %d\n",
crtc, dev->vblank[crtc].last_wait);
seq_printf(m, "CRTC %d in modeset: %d\n",
crtc, dev->vblank[crtc].inmodeset);
}
mutex_unlock(&dev->struct_mutex);
return 0;
}
/** /**
* Called when "/proc/dri/.../clients" is read. * Called when "/proc/dri/.../clients" is read.
* *
......
...@@ -55,7 +55,6 @@ void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpr ...@@ -55,7 +55,6 @@ void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpr
int drm_name_info(struct seq_file *m, void *data); int drm_name_info(struct seq_file *m, void *data);
int drm_vm_info(struct seq_file *m, void *data); int drm_vm_info(struct seq_file *m, void *data);
int drm_bufs_info(struct seq_file *m, void *data); int drm_bufs_info(struct seq_file *m, void *data);
int drm_vblank_info(struct seq_file *m, void *data);
int drm_clients_info(struct seq_file *m, void* data); int drm_clients_info(struct seq_file *m, void* data);
int drm_gem_name_info(struct seq_file *m, void *data); int drm_gem_name_info(struct seq_file *m, void *data);
......
...@@ -778,7 +778,7 @@ static struct timeval get_drm_timestamp(void) ...@@ -778,7 +778,7 @@ static struct timeval get_drm_timestamp(void)
/** /**
* drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent
* vblank interval * vblank interval
* @dev: DRM device * @dev: DRM device
* @crtc: which CRTC's vblank timestamp to retrieve * @crtc: which CRTC's vblank timestamp to retrieve
* @tvblank: Pointer to target struct timeval which should receive the timestamp * @tvblank: Pointer to target struct timeval which should receive the timestamp
...@@ -933,6 +933,7 @@ void drm_send_vblank_event(struct drm_device *dev, int crtc, ...@@ -933,6 +933,7 @@ void drm_send_vblank_event(struct drm_device *dev, int crtc,
{ {
struct timeval now; struct timeval now;
unsigned int seq; unsigned int seq;
if (crtc >= 0) { if (crtc >= 0) {
seq = drm_vblank_count_and_time(dev, crtc, &now); seq = drm_vblank_count_and_time(dev, crtc, &now);
} else { } else {
...@@ -1422,7 +1423,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, ...@@ -1422,7 +1423,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
unsigned int seq; unsigned int seq;
int ret; int ret;
e = kzalloc(sizeof *e, GFP_KERNEL); e = kzalloc(sizeof(*e), GFP_KERNEL);
if (e == NULL) { if (e == NULL) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_put; goto err_put;
...@@ -1431,7 +1432,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, ...@@ -1431,7 +1432,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
e->pipe = pipe; e->pipe = pipe;
e->base.pid = current->pid; e->base.pid = current->pid;
e->event.base.type = DRM_EVENT_VBLANK; e->event.base.type = DRM_EVENT_VBLANK;
e->event.base.length = sizeof e->event; e->event.base.length = sizeof(e->event);
e->event.user_data = vblwait->request.signal; e->event.user_data = vblwait->request.signal;
e->base.event = &e->event.base; e->base.event = &e->event.base;
e->base.file_priv = file_priv; e->base.file_priv = file_priv;
...@@ -1451,12 +1452,12 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, ...@@ -1451,12 +1452,12 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
goto err_unlock; goto err_unlock;
} }
if (file_priv->event_space < sizeof e->event) { if (file_priv->event_space < sizeof(e->event)) {
ret = -EBUSY; ret = -EBUSY;
goto err_unlock; goto err_unlock;
} }
file_priv->event_space -= sizeof e->event; file_priv->event_space -= sizeof(e->event);
seq = drm_vblank_count_and_time(dev, pipe, &now); seq = drm_vblank_count_and_time(dev, pipe, &now);
if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) && if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) &&
......
...@@ -905,10 +905,41 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, ...@@ -905,10 +905,41 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
} }
EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo);
/**
* drm_mode_validate_basic - make sure the mode is somewhat sane
* @mode: mode to check
*
* Check that the mode timings are at least somewhat reasonable.
* Any hardware specific limits are left up for each driver to check.
*
* Returns:
* The mode status
*/
enum drm_mode_status
drm_mode_validate_basic(const struct drm_display_mode *mode)
{
if (mode->clock == 0)
return MODE_CLOCK_LOW;
if (mode->hdisplay == 0 ||
mode->hsync_start < mode->hdisplay ||
mode->hsync_end < mode->hsync_start ||
mode->htotal < mode->hsync_end)
return MODE_H_ILLEGAL;
if (mode->vdisplay == 0 ||
mode->vsync_start < mode->vdisplay ||
mode->vsync_end < mode->vsync_start ||
mode->vtotal < mode->vsync_end)
return MODE_V_ILLEGAL;
return MODE_OK;
}
EXPORT_SYMBOL(drm_mode_validate_basic);
/** /**
* drm_mode_validate_size - make sure modes adhere to size constraints * drm_mode_validate_size - make sure modes adhere to size constraints
* @dev: DRM device * @mode: mode to check
* @mode_list: list of modes to check
* @maxX: maximum width * @maxX: maximum width
* @maxY: maximum height * @maxY: maximum height
* *
...@@ -916,20 +947,21 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); ...@@ -916,20 +947,21 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo);
* limitations of the DRM device/connector. If a mode is too big its status * limitations of the DRM device/connector. If a mode is too big its status
* member is updated with the appropriate validation failure code. The list * member is updated with the appropriate validation failure code. The list
* itself is not changed. * itself is not changed.
*
* Returns:
* The mode status
*/ */
void drm_mode_validate_size(struct drm_device *dev, enum drm_mode_status
struct list_head *mode_list, drm_mode_validate_size(const struct drm_display_mode *mode,
int maxX, int maxY) int maxX, int maxY)
{ {
struct drm_display_mode *mode; if (maxX > 0 && mode->hdisplay > maxX)
return MODE_VIRTUAL_X;
list_for_each_entry(mode, mode_list, head) { if (maxY > 0 && mode->vdisplay > maxY)
if (maxX > 0 && mode->hdisplay > maxX) return MODE_VIRTUAL_Y;
mode->status = MODE_VIRTUAL_X;
if (maxY > 0 && mode->vdisplay > maxY) return MODE_OK;
mode->status = MODE_VIRTUAL_Y;
}
} }
EXPORT_SYMBOL(drm_mode_validate_size); EXPORT_SYMBOL(drm_mode_validate_size);
......
...@@ -142,6 +142,17 @@ int drm_plane_helper_check_update(struct drm_plane *plane, ...@@ -142,6 +142,17 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
{ {
int hscale, vscale; int hscale, vscale;
if (!fb) {
*visible = false;
return 0;
}
/* crtc should only be NULL when disabling (i.e., !fb) */
if (WARN_ON(!crtc)) {
*visible = false;
return 0;
}
if (!crtc->enabled && !can_update_disabled) { if (!crtc->enabled && !can_update_disabled) {
DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n"); DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n");
return -EINVAL; return -EINVAL;
...@@ -155,11 +166,6 @@ int drm_plane_helper_check_update(struct drm_plane *plane, ...@@ -155,11 +166,6 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
return -ERANGE; return -ERANGE;
} }
if (!fb) {
*visible = false;
return 0;
}
*visible = drm_rect_clip_scaled(src, dest, clip, hscale, vscale); *visible = drm_rect_clip_scaled(src, dest, clip, hscale, vscale);
if (!*visible) if (!*visible)
/* /*
......
...@@ -58,28 +58,23 @@ ...@@ -58,28 +58,23 @@
static bool drm_kms_helper_poll = true; static bool drm_kms_helper_poll = true;
module_param_named(poll, drm_kms_helper_poll, bool, 0600); module_param_named(poll, drm_kms_helper_poll, bool, 0600);
static void drm_mode_validate_flag(struct drm_connector *connector, static enum drm_mode_status
int flags) drm_mode_validate_flag(const struct drm_display_mode *mode,
int flags)
{ {
struct drm_display_mode *mode; if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
!(flags & DRM_MODE_FLAG_INTERLACE))
return MODE_NO_INTERLACE;
if (flags == (DRM_MODE_FLAG_DBLSCAN | DRM_MODE_FLAG_INTERLACE | if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
DRM_MODE_FLAG_3D_MASK)) !(flags & DRM_MODE_FLAG_DBLSCAN))
return; return MODE_NO_DBLESCAN;
list_for_each_entry(mode, &connector->modes, head) { if ((mode->flags & DRM_MODE_FLAG_3D_MASK) &&
if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && !(flags & DRM_MODE_FLAG_3D_MASK))
!(flags & DRM_MODE_FLAG_INTERLACE)) return MODE_NO_STEREO;
mode->status = MODE_NO_INTERLACE;
if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
!(flags & DRM_MODE_FLAG_DBLSCAN))
mode->status = MODE_NO_DBLESCAN;
if ((mode->flags & DRM_MODE_FLAG_3D_MASK) &&
!(flags & DRM_MODE_FLAG_3D_MASK))
mode->status = MODE_NO_STEREO;
}
return; return MODE_OK;
} }
static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector) static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)
...@@ -164,18 +159,22 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect ...@@ -164,18 +159,22 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
drm_mode_connector_list_update(connector, merge_type_bits); drm_mode_connector_list_update(connector, merge_type_bits);
if (maxX && maxY)
drm_mode_validate_size(dev, &connector->modes, maxX, maxY);
if (connector->interlace_allowed) if (connector->interlace_allowed)
mode_flags |= DRM_MODE_FLAG_INTERLACE; mode_flags |= DRM_MODE_FLAG_INTERLACE;
if (connector->doublescan_allowed) if (connector->doublescan_allowed)
mode_flags |= DRM_MODE_FLAG_DBLSCAN; mode_flags |= DRM_MODE_FLAG_DBLSCAN;
if (connector->stereo_allowed) if (connector->stereo_allowed)
mode_flags |= DRM_MODE_FLAG_3D_MASK; mode_flags |= DRM_MODE_FLAG_3D_MASK;
drm_mode_validate_flag(connector, mode_flags);
list_for_each_entry(mode, &connector->modes, head) { list_for_each_entry(mode, &connector->modes, head) {
mode->status = drm_mode_validate_basic(mode);
if (mode->status == MODE_OK)
mode->status = drm_mode_validate_size(mode, maxX, maxY);
if (mode->status == MODE_OK)
mode->status = drm_mode_validate_flag(mode, mode_flags);
if (mode->status == MODE_OK && connector_funcs->mode_valid) if (mode->status == MODE_OK && connector_funcs->mode_valid)
mode->status = connector_funcs->mode_valid(connector, mode->status = connector_funcs->mode_valid(connector,
mode); mode);
......
...@@ -323,10 +323,6 @@ static void mdp4_crtc_commit(struct drm_crtc *crtc) ...@@ -323,10 +323,6 @@ static void mdp4_crtc_commit(struct drm_crtc *crtc)
drm_crtc_vblank_put(crtc); drm_crtc_vblank_put(crtc);
} }
static void mdp4_crtc_load_lut(struct drm_crtc *crtc)
{
}
static int mdp4_crtc_atomic_check(struct drm_crtc *crtc, static int mdp4_crtc_atomic_check(struct drm_crtc *crtc,
struct drm_crtc_state *state) struct drm_crtc_state *state)
{ {
...@@ -515,7 +511,6 @@ static const struct drm_crtc_helper_funcs mdp4_crtc_helper_funcs = { ...@@ -515,7 +511,6 @@ static const struct drm_crtc_helper_funcs mdp4_crtc_helper_funcs = {
.mode_set_base = drm_helper_crtc_mode_set_base, .mode_set_base = drm_helper_crtc_mode_set_base,
.prepare = mdp4_crtc_prepare, .prepare = mdp4_crtc_prepare,
.commit = mdp4_crtc_commit, .commit = mdp4_crtc_commit,
.load_lut = mdp4_crtc_load_lut,
.atomic_check = mdp4_crtc_atomic_check, .atomic_check = mdp4_crtc_atomic_check,
.atomic_begin = mdp4_crtc_atomic_begin, .atomic_begin = mdp4_crtc_atomic_begin,
.atomic_flush = mdp4_crtc_atomic_flush, .atomic_flush = mdp4_crtc_atomic_flush,
......
...@@ -275,10 +275,6 @@ static void mdp5_crtc_commit(struct drm_crtc *crtc) ...@@ -275,10 +275,6 @@ static void mdp5_crtc_commit(struct drm_crtc *crtc)
mdp5_disable(get_kms(crtc)); mdp5_disable(get_kms(crtc));
} }
static void mdp5_crtc_load_lut(struct drm_crtc *crtc)
{
}
struct plane_state { struct plane_state {
struct drm_plane *plane; struct drm_plane *plane;
struct mdp5_plane_state *state; struct mdp5_plane_state *state;
...@@ -402,7 +398,6 @@ static const struct drm_crtc_helper_funcs mdp5_crtc_helper_funcs = { ...@@ -402,7 +398,6 @@ static const struct drm_crtc_helper_funcs mdp5_crtc_helper_funcs = {
.mode_set_base = drm_helper_crtc_mode_set_base, .mode_set_base = drm_helper_crtc_mode_set_base,
.prepare = mdp5_crtc_prepare, .prepare = mdp5_crtc_prepare,
.commit = mdp5_crtc_commit, .commit = mdp5_crtc_commit,
.load_lut = mdp5_crtc_load_lut,
.atomic_check = mdp5_crtc_atomic_check, .atomic_check = mdp5_crtc_atomic_check,
.atomic_begin = mdp5_crtc_atomic_begin, .atomic_begin = mdp5_crtc_atomic_begin,
.atomic_flush = mdp5_crtc_atomic_flush, .atomic_flush = mdp5_crtc_atomic_flush,
......
...@@ -190,11 +190,6 @@ static int sti_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, ...@@ -190,11 +190,6 @@ static int sti_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
return ret; return ret;
} }
static void sti_drm_crtc_load_lut(struct drm_crtc *crtc)
{
/* do nothing */
}
static void sti_drm_crtc_disable(struct drm_crtc *crtc) static void sti_drm_crtc_disable(struct drm_crtc *crtc)
{ {
struct sti_mixer *mixer = to_sti_mixer(crtc); struct sti_mixer *mixer = to_sti_mixer(crtc);
...@@ -249,7 +244,6 @@ static struct drm_crtc_helper_funcs sti_crtc_helper_funcs = { ...@@ -249,7 +244,6 @@ static struct drm_crtc_helper_funcs sti_crtc_helper_funcs = {
.mode_fixup = sti_drm_crtc_mode_fixup, .mode_fixup = sti_drm_crtc_mode_fixup,
.mode_set = sti_drm_crtc_mode_set, .mode_set = sti_drm_crtc_mode_set,
.mode_set_base = sti_drm_crtc_mode_set_base, .mode_set_base = sti_drm_crtc_mode_set_base,
.load_lut = sti_drm_crtc_load_lut,
.disable = sti_drm_crtc_disable, .disable = sti_drm_crtc_disable,
}; };
......
...@@ -1119,10 +1119,6 @@ static void tegra_crtc_commit(struct drm_crtc *crtc) ...@@ -1119,10 +1119,6 @@ static void tegra_crtc_commit(struct drm_crtc *crtc)
tegra_dc_commit(dc); tegra_dc_commit(dc);
} }
static void tegra_crtc_load_lut(struct drm_crtc *crtc)
{
}
static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = { static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
.disable = tegra_crtc_disable, .disable = tegra_crtc_disable,
.mode_fixup = tegra_crtc_mode_fixup, .mode_fixup = tegra_crtc_mode_fixup,
...@@ -1130,7 +1126,6 @@ static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = { ...@@ -1130,7 +1126,6 @@ static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
.mode_set_base = tegra_crtc_mode_set_base, .mode_set_base = tegra_crtc_mode_set_base,
.prepare = tegra_crtc_prepare, .prepare = tegra_crtc_prepare,
.commit = tegra_crtc_commit, .commit = tegra_crtc_commit,
.load_lut = tegra_crtc_load_lut,
}; };
static irqreturn_t tegra_dc_irq(int irq, void *data) static irqreturn_t tegra_dc_irq(int irq, void *data)
......
...@@ -744,8 +744,6 @@ struct drm_device { ...@@ -744,8 +744,6 @@ struct drm_device {
/** \name Context support */ /** \name Context support */
/*@{ */ /*@{ */
bool irq_enabled; /**< True if irq handler is enabled */
int irq;
__volatile__ long context_flag; /**< Context swapping flag */ __volatile__ long context_flag; /**< Context swapping flag */
int last_context; /**< Last current context */ int last_context; /**< Last current context */
...@@ -753,6 +751,8 @@ struct drm_device { ...@@ -753,6 +751,8 @@ struct drm_device {
/** \name VBLANK IRQ support */ /** \name VBLANK IRQ support */
/*@{ */ /*@{ */
bool irq_enabled;
int irq;
/* /*
* At load time, disabling the vblank interrupt won't be allowed since * At load time, disabling the vblank interrupt won't be allowed since
......
...@@ -463,7 +463,7 @@ struct drm_connector_state { ...@@ -463,7 +463,7 @@ struct drm_connector_state {
/** /**
* struct drm_connector_funcs - control connectors on a given device * struct drm_connector_funcs - control connectors on a given device
* @dpms: set power state (see drm_crtc_funcs above) * @dpms: set power state
* @save: save connector state * @save: save connector state
* @restore: restore connector state * @restore: restore connector state
* @reset: reset connector after state has been invalidated (e.g. resume) * @reset: reset connector after state has been invalidated (e.g. resume)
......
...@@ -39,15 +39,28 @@ ...@@ -39,15 +39,28 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <drm/drm_crtc.h>
enum mode_set_atomic { enum mode_set_atomic {
LEAVE_ATOMIC_MODE_SET, LEAVE_ATOMIC_MODE_SET,
ENTER_ATOMIC_MODE_SET, ENTER_ATOMIC_MODE_SET,
}; };
/** /**
* drm_crtc_helper_funcs - helper operations for CRTCs * struct drm_crtc_helper_funcs - helper operations for CRTCs
* @mode_fixup: try to fixup proposed mode for this connector * @dpms: set power state
* @prepare: prepare the CRTC, called before @mode_set
* @commit: commit changes to CRTC, called after @mode_set
* @mode_fixup: try to fixup proposed mode for this CRTC
* @mode_set: set this mode * @mode_set: set this mode
* @mode_set_nofb: set mode only (no scanout buffer attached)
* @mode_set_base: update the scanout buffer
* @mode_set_base_atomic: non-blocking mode set (used for kgdb support)
* @load_lut: load color palette
* @disable: disable CRTC when no longer in use
* @atomic_check: check for validity of an atomic state
* @atomic_begin: begin atomic update
* @atomic_flush: flush atomic update
* *
* The helper operations are called by the mid-layer CRTC helper. * The helper operations are called by the mid-layer CRTC helper.
*/ */
...@@ -91,9 +104,17 @@ struct drm_crtc_helper_funcs { ...@@ -91,9 +104,17 @@ struct drm_crtc_helper_funcs {
}; };
/** /**
* drm_encoder_helper_funcs - helper operations for encoders * struct drm_encoder_helper_funcs - helper operations for encoders
* @dpms: set power state
* @save: save connector state
* @restore: restore connector state
* @mode_fixup: try to fixup proposed mode for this connector * @mode_fixup: try to fixup proposed mode for this connector
* @prepare: part of the disable sequence, called before the CRTC modeset
* @commit: called after the CRTC modeset
* @mode_set: set this mode * @mode_set: set this mode
* @get_crtc: return CRTC that the encoder is currently attached to
* @detect: connection status detection
* @disable: disable encoder when not in use (overrides DPMS off)
* *
* The helper operations are called by the mid-layer CRTC helper. * The helper operations are called by the mid-layer CRTC helper.
*/ */
...@@ -119,9 +140,10 @@ struct drm_encoder_helper_funcs { ...@@ -119,9 +140,10 @@ struct drm_encoder_helper_funcs {
}; };
/** /**
* drm_connector_helper_funcs - helper operations for connectors * struct drm_connector_helper_funcs - helper operations for connectors
* @get_modes: get mode list for this connector * @get_modes: get mode list for this connector
* @mode_valid (optional): is this mode valid on the given connector? * @mode_valid: is this mode valid on the given connector? (optional)
* @best_encoder: return the preferred encoder for this connector
* *
* The helper operations are called by the mid-layer CRTC helper. * The helper operations are called by the mid-layer CRTC helper.
*/ */
......
...@@ -217,9 +217,9 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, ...@@ -217,9 +217,9 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
const struct drm_display_mode *mode2); const struct drm_display_mode *mode2);
/* for use by the crtc helper probe functions */ /* for use by the crtc helper probe functions */
void drm_mode_validate_size(struct drm_device *dev, enum drm_mode_status drm_mode_validate_basic(const struct drm_display_mode *mode);
struct list_head *mode_list, enum drm_mode_status drm_mode_validate_size(const struct drm_display_mode *mode,
int maxX, int maxY); int maxX, int maxY);
void drm_mode_prune_invalid(struct drm_device *dev, void drm_mode_prune_invalid(struct drm_device *dev,
struct list_head *mode_list, bool verbose); struct list_head *mode_list, bool verbose);
void drm_mode_sort(struct list_head *mode_list); void drm_mode_sort(struct list_head *mode_list);
......
...@@ -338,7 +338,7 @@ struct drm_mode_fb_cmd2 { ...@@ -338,7 +338,7 @@ struct drm_mode_fb_cmd2 {
/* /*
* In case of planar formats, this ioctl allows up to 4 * In case of planar formats, this ioctl allows up to 4
* buffer objects with offets and pitches per plane. * buffer objects with offsets and pitches per plane.
* The pitch and offset order is dictated by the fourcc, * The pitch and offset order is dictated by the fourcc,
* e.g. NV12 (http://fourcc.org/yuv.php#NV12) is described as: * e.g. NV12 (http://fourcc.org/yuv.php#NV12) is described as:
* *
...@@ -346,9 +346,9 @@ struct drm_mode_fb_cmd2 { ...@@ -346,9 +346,9 @@ struct drm_mode_fb_cmd2 {
* followed by an interleaved U/V plane containing * followed by an interleaved U/V plane containing
* 8 bit 2x2 subsampled colour difference samples. * 8 bit 2x2 subsampled colour difference samples.
* *
* So it would consist of Y as offset[0] and UV as * So it would consist of Y as offsets[0] and UV as
* offeset[1]. Note that offset[0] will generally * offsets[1]. Note that offsets[0] will generally
* be 0. * be 0 (but this is not required).
*/ */
__u32 handles[4]; __u32 handles[4];
__u32 pitches[4]; /* pitch for each plane */ __u32 pitches[4]; /* pitch for each plane */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment