Commit 4a112488 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'topic/drm-misc-2015-04-15' of git://anongit.freedesktop.org/drm-intel into drm-next

One more drm-misch pull for 4.1 with mostly simple stuff and boring
refactoring. Even the cursor fix from Matt is just to make a really anal
igt happy.

* tag 'topic/drm-misc-2015-04-15' of git://anongit.freedesktop.org/drm-intel:
  drm: fix trivial typo mistake
  drm: Make integer overflow checking cover universal cursor updates (v2)
  drm: make crtc/encoder/connector/plane helper_private a const pointer
  drm/armada: constify struct drm_encoder_helper_funcs pointer
  drm/radeon: constify more struct drm_*_helper funcs pointers
  drm/edid: add #defines for ELD versions
  drm/atomic: Add for_each_{connector,crtc,plane}_in_state helper macros
  drm: Use kref_put_mutex in drm_gem_object_unreference_unlocked
  drm/drm: constify all struct drm_*_helper funcs pointers
  drm/qxl: constify all struct drm_*_helper funcs pointers
  drm/nouveau: constify all struct drm_*_helper funcs pointers
  drm/radeon: constify all struct drm_*_helper funcs pointers
  drm/gma500: constify all struct drm_*_helper funcs pointers
  drm/mgag200: constify all struct drm_*_helper funcs pointers
  drm/exynos: constify all struct drm_*_helper funcs pointers
  drm: Fix some typos
parents 52139bde 2b1193d5
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#define ARMADA_CONNETOR_H #define ARMADA_CONNETOR_H
#define encoder_helper_funcs(encoder) \ #define encoder_helper_funcs(encoder) \
((struct drm_encoder_helper_funcs *)encoder->helper_private) ((const struct drm_encoder_helper_funcs *)encoder->helper_private)
struct armada_output_type { struct armada_output_type {
int connector_type; int connector_type;
......
...@@ -780,7 +780,7 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, ...@@ -780,7 +780,7 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
EXPORT_SYMBOL(drm_atomic_set_crtc_for_plane); EXPORT_SYMBOL(drm_atomic_set_crtc_for_plane);
/** /**
* drm_atomic_set_fb_for_plane - set crtc for plane * drm_atomic_set_fb_for_plane - set framebuffer for plane
* @plane_state: atomic state object for the plane * @plane_state: atomic state object for the plane
* @fb: fb to use for the plane * @fb: fb to use for the plane
* *
...@@ -909,14 +909,13 @@ int ...@@ -909,14 +909,13 @@ int
drm_atomic_connectors_for_crtc(struct drm_atomic_state *state, drm_atomic_connectors_for_crtc(struct drm_atomic_state *state,
struct drm_crtc *crtc) struct drm_crtc *crtc)
{ {
int i, num_connected_connectors = 0; struct drm_connector *connector;
for (i = 0; i < state->num_connector; i++) {
struct drm_connector_state *conn_state; struct drm_connector_state *conn_state;
conn_state = state->connector_states[i]; int i, num_connected_connectors = 0;
if (conn_state && conn_state->crtc == crtc) for_each_connector_in_state(state, connector, conn_state, i) {
if (conn_state->crtc == crtc)
num_connected_connectors++; num_connected_connectors++;
} }
...@@ -968,19 +967,16 @@ int drm_atomic_check_only(struct drm_atomic_state *state) ...@@ -968,19 +967,16 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
{ {
struct drm_device *dev = state->dev; struct drm_device *dev = state->dev;
struct drm_mode_config *config = &dev->mode_config; struct drm_mode_config *config = &dev->mode_config;
int nplanes = config->num_total_plane; struct drm_plane *plane;
int ncrtcs = config->num_crtc; struct drm_plane_state *plane_state;
struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state;
int i, ret = 0; int i, ret = 0;
DRM_DEBUG_ATOMIC("checking %p\n", state); DRM_DEBUG_ATOMIC("checking %p\n", state);
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(state, plane, plane_state, i) {
struct drm_plane *plane = state->planes[i]; ret = drm_atomic_plane_check(plane, plane_state);
if (!plane)
continue;
ret = drm_atomic_plane_check(plane, state->plane_states[i]);
if (ret) { if (ret) {
DRM_DEBUG_ATOMIC("[PLANE:%d] atomic core check failed\n", DRM_DEBUG_ATOMIC("[PLANE:%d] atomic core check failed\n",
plane->base.id); plane->base.id);
...@@ -988,13 +984,8 @@ int drm_atomic_check_only(struct drm_atomic_state *state) ...@@ -988,13 +984,8 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
} }
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
struct drm_crtc *crtc = state->crtcs[i]; ret = drm_atomic_crtc_check(crtc, crtc_state);
if (!crtc)
continue;
ret = drm_atomic_crtc_check(crtc, state->crtc_states[i]);
if (ret) { if (ret) {
DRM_DEBUG_ATOMIC("[CRTC:%d] atomic core check failed\n", DRM_DEBUG_ATOMIC("[CRTC:%d] atomic core check failed\n",
crtc->base.id); crtc->base.id);
...@@ -1006,13 +997,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state) ...@@ -1006,13 +997,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
ret = config->funcs->atomic_check(state->dev, state); ret = config->funcs->atomic_check(state->dev, state);
if (!state->allow_modeset) { if (!state->allow_modeset) {
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
struct drm_crtc *crtc = state->crtcs[i];
struct drm_crtc_state *crtc_state = state->crtc_states[i];
if (!crtc)
continue;
if (crtc_state->mode_changed || if (crtc_state->mode_changed ||
crtc_state->active_changed) { crtc_state->active_changed) {
DRM_DEBUG_ATOMIC("[CRTC:%d] requires full modeset\n", DRM_DEBUG_ATOMIC("[CRTC:%d] requires full modeset\n",
...@@ -1210,6 +1195,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, ...@@ -1210,6 +1195,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
struct drm_atomic_state *state; struct drm_atomic_state *state;
struct drm_modeset_acquire_ctx ctx; struct drm_modeset_acquire_ctx ctx;
struct drm_plane *plane; struct drm_plane *plane;
struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state;
unsigned plane_mask = 0; unsigned plane_mask = 0;
int ret = 0; int ret = 0;
unsigned int i, j; unsigned int i, j;
...@@ -1313,15 +1300,9 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, ...@@ -1313,15 +1300,9 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
} }
if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
int ncrtcs = dev->mode_config.num_crtc; for_each_crtc_in_state(state, crtc, crtc_state, i) {
for (i = 0; i < ncrtcs; i++) {
struct drm_crtc_state *crtc_state = state->crtc_states[i];
struct drm_pending_vblank_event *e; struct drm_pending_vblank_event *e;
if (!crtc_state)
continue;
e = create_vblank_event(dev, file_priv, arg->user_data); e = create_vblank_event(dev, file_priv, arg->user_data);
if (!e) { if (!e) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -1373,14 +1354,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, ...@@ -1373,14 +1354,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
goto backoff; goto backoff;
if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
int ncrtcs = dev->mode_config.num_crtc; for_each_crtc_in_state(state, crtc, crtc_state, i) {
for (i = 0; i < ncrtcs; i++) {
struct drm_crtc_state *crtc_state = state->crtc_states[i];
if (!crtc_state)
continue;
destroy_vblank_event(dev, file_priv, crtc_state->event); destroy_vblank_event(dev, file_priv, crtc_state->event);
crtc_state->event = NULL; crtc_state->event = NULL;
} }
......
...@@ -248,30 +248,24 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx) ...@@ -248,30 +248,24 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx)
static int static int
mode_fixup(struct drm_atomic_state *state) mode_fixup(struct drm_atomic_state *state)
{ {
int ncrtcs = state->dev->mode_config.num_crtc; struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
struct drm_connector *connector;
struct drm_connector_state *conn_state; struct drm_connector_state *conn_state;
int i; int i;
bool ret; bool ret;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
crtc_state = state->crtc_states[i]; if (!crtc_state->mode_changed)
if (!crtc_state || !crtc_state->mode_changed)
continue; continue;
drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode); drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
} }
for (i = 0; i < state->num_connector; i++) { for_each_connector_in_state(state, connector, conn_state, i) {
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_encoder *encoder; struct drm_encoder *encoder;
conn_state = state->connector_states[i];
if (!conn_state)
continue;
WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc); WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
if (!conn_state->crtc || !conn_state->best_encoder) if (!conn_state->crtc || !conn_state->best_encoder)
...@@ -316,14 +310,10 @@ mode_fixup(struct drm_atomic_state *state) ...@@ -316,14 +310,10 @@ mode_fixup(struct drm_atomic_state *state)
} }
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc;
crtc_state = state->crtc_states[i]; if (!crtc_state->mode_changed)
crtc = state->crtcs[i];
if (!crtc_state || !crtc_state->mode_changed)
continue; continue;
funcs = crtc->helper_private; funcs = crtc->helper_private;
...@@ -371,18 +361,13 @@ int ...@@ -371,18 +361,13 @@ int
drm_atomic_helper_check_modeset(struct drm_device *dev, drm_atomic_helper_check_modeset(struct drm_device *dev,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
int ncrtcs = dev->mode_config.num_crtc;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
struct drm_connector *connector;
struct drm_connector_state *connector_state;
int i, ret; int i, ret;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
crtc = state->crtcs[i];
crtc_state = state->crtc_states[i];
if (!crtc)
continue;
if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) { if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
DRM_DEBUG_ATOMIC("[CRTC:%d] mode changed\n", DRM_DEBUG_ATOMIC("[CRTC:%d] mode changed\n",
crtc->base.id); crtc->base.id);
...@@ -396,7 +381,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, ...@@ -396,7 +381,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
} }
} }
for (i = 0; i < state->num_connector; i++) { for_each_connector_in_state(state, connector, connector_state, i) {
/* /*
* This only sets crtc->mode_changed for routing changes, * This only sets crtc->mode_changed for routing changes,
* drivers must set crtc->mode_changed themselves when connector * drivers must set crtc->mode_changed themselves when connector
...@@ -413,15 +398,9 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, ...@@ -413,15 +398,9 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
* configuration. This must be done before calling mode_fixup in case a * configuration. This must be done before calling mode_fixup in case a
* crtc only changed its mode but has the same set of connectors. * crtc only changed its mode but has the same set of connectors.
*/ */
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
int num_connectors; int num_connectors;
crtc = state->crtcs[i];
crtc_state = state->crtc_states[i];
if (!crtc)
continue;
/* /*
* We must set ->active_changed after walking connectors for * We must set ->active_changed after walking connectors for
* otherwise an update that only changes active would result in * otherwise an update that only changes active would result in
...@@ -476,17 +455,14 @@ int ...@@ -476,17 +455,14 @@ int
drm_atomic_helper_check_planes(struct drm_device *dev, drm_atomic_helper_check_planes(struct drm_device *dev,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
int nplanes = dev->mode_config.num_total_plane; struct drm_crtc *crtc;
int ncrtcs = dev->mode_config.num_crtc; struct drm_crtc_state *crtc_state;
struct drm_plane *plane;
struct drm_plane_state *plane_state;
int i, ret = 0; int i, ret = 0;
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs; const struct drm_plane_helper_funcs *funcs;
struct drm_plane *plane = state->planes[i];
struct drm_plane_state *plane_state = state->plane_states[i];
if (!plane)
continue;
funcs = plane->helper_private; funcs = plane->helper_private;
...@@ -503,12 +479,8 @@ drm_atomic_helper_check_planes(struct drm_device *dev, ...@@ -503,12 +479,8 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
} }
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc = state->crtcs[i];
if (!crtc)
continue;
funcs = crtc->helper_private; funcs = crtc->helper_private;
...@@ -567,22 +539,20 @@ EXPORT_SYMBOL(drm_atomic_helper_check); ...@@ -567,22 +539,20 @@ EXPORT_SYMBOL(drm_atomic_helper_check);
static void static void
disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
{ {
int ncrtcs = old_state->dev->mode_config.num_crtc; struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
int i; int i;
for (i = 0; i < old_state->num_connector; i++) { for_each_connector_in_state(old_state, connector, old_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_connector_state *old_conn_state;
struct drm_connector *connector;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_crtc_state *old_crtc_state; struct drm_crtc_state *old_crtc_state;
old_conn_state = old_state->connector_states[i];
connector = old_state->connectors[i];
/* Shut down everything that's in the changeset and currently /* Shut down everything that's in the changeset and currently
* still on. So need to check the old, saved state. */ * still on. So need to check the old, saved state. */
if (!old_conn_state || !old_conn_state->crtc) if (!old_conn_state->crtc)
continue; continue;
old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)]; old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)];
...@@ -623,16 +593,11 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -623,16 +593,11 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
encoder->bridge->funcs->post_disable(encoder->bridge); encoder->bridge->funcs->post_disable(encoder->bridge);
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
crtc = old_state->crtcs[i];
old_crtc_state = old_state->crtc_states[i];
/* Shut down everything that needs a full modeset. */ /* Shut down everything that needs a full modeset. */
if (!crtc || !needs_modeset(crtc->state)) if (!needs_modeset(crtc->state))
continue; continue;
if (!old_crtc_state->active) if (!old_crtc_state->active)
...@@ -657,16 +622,15 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -657,16 +622,15 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
static void static void
set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state) set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
{ {
int ncrtcs = old_state->dev->mode_config.num_crtc; struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
int i; int i;
/* clear out existing links */ /* clear out existing links */
for (i = 0; i < old_state->num_connector; i++) { for_each_connector_in_state(old_state, connector, old_conn_state, i) {
struct drm_connector *connector; if (!connector->encoder)
connector = old_state->connectors[i];
if (!connector || !connector->encoder)
continue; continue;
WARN_ON(!connector->encoder->crtc); WARN_ON(!connector->encoder->crtc);
...@@ -676,12 +640,8 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -676,12 +640,8 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
} }
/* set new links */ /* set new links */
for (i = 0; i < old_state->num_connector; i++) { for_each_connector_in_state(old_state, connector, old_conn_state, i) {
struct drm_connector *connector; if (!connector->state->crtc)
connector = old_state->connectors[i];
if (!connector || !connector->state->crtc)
continue; continue;
if (WARN_ON(!connector->state->best_encoder)) if (WARN_ON(!connector->state->best_encoder))
...@@ -692,14 +652,7 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -692,14 +652,7 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
} }
/* set legacy state in the crtc structure */ /* set legacy state in the crtc structure */
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
struct drm_crtc *crtc;
crtc = old_state->crtcs[i];
if (!crtc)
continue;
crtc->mode = crtc->state->mode; crtc->mode = crtc->state->mode;
crtc->enabled = crtc->state->enable; crtc->enabled = crtc->state->enable;
crtc->x = crtc->primary->state->src_x >> 16; crtc->x = crtc->primary->state->src_x >> 16;
...@@ -710,16 +663,16 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -710,16 +663,16 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
static void static void
crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
{ {
int ncrtcs = old_state->dev->mode_config.num_crtc; struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
int i; int i;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc;
crtc = old_state->crtcs[i];
if (!crtc || !crtc->state->mode_changed) if (!crtc->state->mode_changed)
continue; continue;
funcs = crtc->helper_private; funcs = crtc->helper_private;
...@@ -732,16 +685,13 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -732,16 +685,13 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
} }
} }
for (i = 0; i < old_state->num_connector; i++) { for_each_connector_in_state(old_state, connector, old_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_connector *connector;
struct drm_crtc_state *new_crtc_state; struct drm_crtc_state *new_crtc_state;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_display_mode *mode, *adjusted_mode; struct drm_display_mode *mode, *adjusted_mode;
connector = old_state->connectors[i]; if (!connector->state->best_encoder)
if (!connector || !connector->state->best_encoder)
continue; continue;
encoder = connector->state->best_encoder; encoder = connector->state->best_encoder;
...@@ -809,17 +759,17 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables); ...@@ -809,17 +759,17 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
struct drm_atomic_state *old_state) struct drm_atomic_state *old_state)
{ {
int ncrtcs = old_state->dev->mode_config.num_crtc; struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
int i; int i;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc;
crtc = old_state->crtcs[i];
/* Need to filter out CRTCs where only planes change. */ /* Need to filter out CRTCs where only planes change. */
if (!crtc || !needs_modeset(crtc->state)) if (!needs_modeset(crtc->state))
continue; continue;
if (!crtc->state->active) if (!crtc->state->active)
...@@ -838,14 +788,11 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, ...@@ -838,14 +788,11 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
} }
} }
for (i = 0; i < old_state->num_connector; i++) { for_each_connector_in_state(old_state, connector, old_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs; const struct drm_encoder_helper_funcs *funcs;
struct drm_connector *connector;
struct drm_encoder *encoder; struct drm_encoder *encoder;
connector = old_state->connectors[i]; if (!connector->state->best_encoder)
if (!connector || !connector->state->best_encoder)
continue; continue;
if (!connector->state->crtc->state->active || if (!connector->state->crtc->state->active ||
...@@ -879,13 +826,12 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables); ...@@ -879,13 +826,12 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
static void wait_for_fences(struct drm_device *dev, static void wait_for_fences(struct drm_device *dev,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
int nplanes = dev->mode_config.num_total_plane; struct drm_plane *plane;
struct drm_plane_state *plane_state;
int i; int i;
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(state, plane, plane_state, i) {
struct drm_plane *plane = state->planes[i]; if (!plane->state->fence)
if (!plane || !plane->state->fence)
continue; continue;
WARN_ON(!plane->state->fb); WARN_ON(!plane->state->fb);
...@@ -902,16 +848,9 @@ static bool framebuffer_changed(struct drm_device *dev, ...@@ -902,16 +848,9 @@ static bool framebuffer_changed(struct drm_device *dev,
{ {
struct drm_plane *plane; struct drm_plane *plane;
struct drm_plane_state *old_plane_state; struct drm_plane_state *old_plane_state;
int nplanes = old_state->dev->mode_config.num_total_plane;
int i; int i;
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(old_state, plane, old_plane_state, i) {
plane = old_state->planes[i];
old_plane_state = old_state->plane_states[i];
if (!plane)
continue;
if (plane->state->crtc != crtc && if (plane->state->crtc != crtc &&
old_plane_state->crtc != crtc) old_plane_state->crtc != crtc)
continue; continue;
...@@ -940,16 +879,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev, ...@@ -940,16 +879,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
{ {
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state; struct drm_crtc_state *old_crtc_state;
int ncrtcs = old_state->dev->mode_config.num_crtc;
int i, ret; int i, ret;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
crtc = old_state->crtcs[i];
old_crtc_state = old_state->crtc_states[i];
if (!crtc)
continue;
/* No one cares about the old state, so abuse it for tracking /* No one cares about the old state, so abuse it for tracking
* and store whether we hold a vblank reference (and should do a * and store whether we hold a vblank reference (and should do a
* vblank wait) in the ->enable boolean. */ * vblank wait) in the ->enable boolean. */
...@@ -974,11 +906,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev, ...@@ -974,11 +906,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
old_crtc_state->last_vblank_count = drm_vblank_count(dev, i); old_crtc_state->last_vblank_count = drm_vblank_count(dev, i);
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
crtc = old_state->crtcs[i]; if (!old_crtc_state->enable)
old_crtc_state = old_state->crtc_states[i];
if (!crtc || !old_crtc_state->enable)
continue; continue;
ret = wait_event_timeout(dev->vblank[i].queue, ret = wait_event_timeout(dev->vblank[i].queue,
...@@ -1176,16 +1105,14 @@ EXPORT_SYMBOL(drm_atomic_helper_prepare_planes); ...@@ -1176,16 +1105,14 @@ EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
void drm_atomic_helper_commit_planes(struct drm_device *dev, void drm_atomic_helper_commit_planes(struct drm_device *dev,
struct drm_atomic_state *old_state) struct drm_atomic_state *old_state)
{ {
int nplanes = dev->mode_config.num_total_plane; struct drm_crtc *crtc;
int ncrtcs = dev->mode_config.num_crtc; struct drm_crtc_state *old_crtc_state;
struct drm_plane *plane;
struct drm_plane_state *old_plane_state;
int i; int i;
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc = old_state->crtcs[i];
if (!crtc)
continue;
funcs = crtc->helper_private; funcs = crtc->helper_private;
...@@ -1195,13 +1122,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev, ...@@ -1195,13 +1122,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
funcs->atomic_begin(crtc); funcs->atomic_begin(crtc);
} }
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(old_state, plane, old_plane_state, i) {
const struct drm_plane_helper_funcs *funcs; const struct drm_plane_helper_funcs *funcs;
struct drm_plane *plane = old_state->planes[i];
struct drm_plane_state *old_plane_state;
if (!plane)
continue;
funcs = plane->helper_private; funcs = plane->helper_private;
...@@ -1220,12 +1142,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev, ...@@ -1220,12 +1142,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
funcs->atomic_update(plane, old_plane_state); funcs->atomic_update(plane, old_plane_state);
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_crtc *crtc = old_state->crtcs[i];
if (!crtc)
continue;
funcs = crtc->helper_private; funcs = crtc->helper_private;
...@@ -1252,18 +1170,14 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_planes); ...@@ -1252,18 +1170,14 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
void drm_atomic_helper_cleanup_planes(struct drm_device *dev, void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
struct drm_atomic_state *old_state) struct drm_atomic_state *old_state)
{ {
int nplanes = dev->mode_config.num_total_plane; struct drm_plane *plane;
struct drm_plane_state *plane_state;
int i; int i;
for (i = 0; i < nplanes; i++) { for_each_plane_in_state(old_state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs; const struct drm_plane_helper_funcs *funcs;
struct drm_plane *plane = old_state->planes[i];
struct drm_plane_state *plane_state = old_state->plane_states[i];
struct drm_framebuffer *old_fb; struct drm_framebuffer *old_fb;
if (!plane)
continue;
funcs = plane->helper_private; funcs = plane->helper_private;
old_fb = plane_state->fb; old_fb = plane_state->fb;
...@@ -1512,8 +1426,10 @@ static int update_output_state(struct drm_atomic_state *state, ...@@ -1512,8 +1426,10 @@ static int update_output_state(struct drm_atomic_state *state,
struct drm_mode_set *set) struct drm_mode_set *set)
{ {
struct drm_device *dev = set->crtc->dev; struct drm_device *dev = set->crtc->dev;
struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state;
struct drm_connector *connector;
struct drm_connector_state *conn_state; struct drm_connector_state *conn_state;
int ncrtcs = state->dev->mode_config.num_crtc;
int ret, i, j; int ret, i, j;
ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
...@@ -1529,27 +1445,14 @@ static int update_output_state(struct drm_atomic_state *state, ...@@ -1529,27 +1445,14 @@ static int update_output_state(struct drm_atomic_state *state,
return PTR_ERR(conn_state); return PTR_ERR(conn_state);
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
struct drm_crtc *crtc = state->crtcs[i];
if (!crtc)
continue;
ret = drm_atomic_add_affected_connectors(state, crtc); ret = drm_atomic_add_affected_connectors(state, crtc);
if (ret) if (ret)
return ret; return ret;
} }
/* Then recompute connector->crtc links and crtc enabling state. */ /* Then recompute connector->crtc links and crtc enabling state. */
for (i = 0; i < state->num_connector; i++) { for_each_connector_in_state(state, connector, conn_state, i) {
struct drm_connector *connector;
connector = state->connectors[i];
conn_state = state->connector_states[i];
if (!connector)
continue;
if (conn_state->crtc == set->crtc) { if (conn_state->crtc == set->crtc) {
ret = drm_atomic_set_crtc_for_connector(conn_state, ret = drm_atomic_set_crtc_for_connector(conn_state,
NULL); NULL);
...@@ -1568,13 +1471,7 @@ static int update_output_state(struct drm_atomic_state *state, ...@@ -1568,13 +1471,7 @@ static int update_output_state(struct drm_atomic_state *state,
} }
} }
for (i = 0; i < ncrtcs; i++) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
struct drm_crtc *crtc = state->crtcs[i];
struct drm_crtc_state *crtc_state = state->crtc_states[i];
if (!crtc)
continue;
/* Don't update ->enable for the CRTC in the set_config request, /* Don't update ->enable for the CRTC in the set_config request,
* since a mismatch would indicate a bug in the upper layers. * since a mismatch would indicate a bug in the upper layers.
* The actual modeset code later on will catch any * The actual modeset code later on will catch any
......
...@@ -2482,6 +2482,17 @@ static int __setplane_internal(struct drm_plane *plane, ...@@ -2482,6 +2482,17 @@ static int __setplane_internal(struct drm_plane *plane,
goto out; goto out;
} }
/* Give drivers some help against integer overflows */
if (crtc_w > INT_MAX ||
crtc_x > INT_MAX - (int32_t) crtc_w ||
crtc_h > INT_MAX ||
crtc_y > INT_MAX - (int32_t) crtc_h) {
DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n",
crtc_w, crtc_h, crtc_x, crtc_y);
return -ERANGE;
}
fb_width = fb->width << 16; fb_width = fb->width << 16;
fb_height = fb->height << 16; fb_height = fb->height << 16;
...@@ -2566,17 +2577,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data, ...@@ -2566,17 +2577,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
if (!drm_core_check_feature(dev, DRIVER_MODESET)) if (!drm_core_check_feature(dev, DRIVER_MODESET))
return -EINVAL; return -EINVAL;
/* Give drivers some help against integer overflows */
if (plane_req->crtc_w > INT_MAX ||
plane_req->crtc_x > INT_MAX - (int32_t) plane_req->crtc_w ||
plane_req->crtc_h > INT_MAX ||
plane_req->crtc_y > INT_MAX - (int32_t) plane_req->crtc_h) {
DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n",
plane_req->crtc_w, plane_req->crtc_h,
plane_req->crtc_x, plane_req->crtc_y);
return -ERANGE;
}
/* /*
* First, find the plane, crtc, and fb objects. If not available, * First, find the plane, crtc, and fb objects. If not available,
* we don't bother to call the driver. * we don't bother to call the driver.
......
...@@ -161,7 +161,7 @@ EXPORT_SYMBOL(drm_helper_crtc_in_use); ...@@ -161,7 +161,7 @@ EXPORT_SYMBOL(drm_helper_crtc_in_use);
static void static void
drm_encoder_disable(struct drm_encoder *encoder) drm_encoder_disable(struct drm_encoder *encoder)
{ {
struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
if (encoder->bridge) if (encoder->bridge)
encoder->bridge->funcs->disable(encoder->bridge); encoder->bridge->funcs->disable(encoder->bridge);
...@@ -191,7 +191,7 @@ static void __drm_helper_disable_unused_functions(struct drm_device *dev) ...@@ -191,7 +191,7 @@ static void __drm_helper_disable_unused_functions(struct drm_device *dev)
} }
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
crtc->enabled = drm_helper_crtc_in_use(crtc); crtc->enabled = drm_helper_crtc_in_use(crtc);
if (!crtc->enabled) { if (!crtc->enabled) {
if (crtc_funcs->disable) if (crtc_funcs->disable)
...@@ -229,7 +229,7 @@ EXPORT_SYMBOL(drm_helper_disable_unused_functions); ...@@ -229,7 +229,7 @@ EXPORT_SYMBOL(drm_helper_disable_unused_functions);
static void static void
drm_crtc_prepare_encoders(struct drm_device *dev) drm_crtc_prepare_encoders(struct drm_device *dev)
{ {
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
struct drm_encoder *encoder; struct drm_encoder *encoder;
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
...@@ -271,8 +271,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, ...@@ -271,8 +271,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode; struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
int saved_x, saved_y; int saved_x, saved_y;
bool saved_enabled; bool saved_enabled;
struct drm_encoder *encoder; struct drm_encoder *encoder;
...@@ -473,7 +473,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) ...@@ -473,7 +473,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
bool fb_changed = false; /* if true and !mode_changed just do a flip */ bool fb_changed = false; /* if true and !mode_changed just do a flip */
struct drm_connector *save_connectors, *connector; struct drm_connector *save_connectors, *connector;
int count = 0, ro, fail = 0; int count = 0, ro, fail = 0;
struct drm_crtc_helper_funcs *crtc_funcs; const struct drm_crtc_helper_funcs *crtc_funcs;
struct drm_mode_set save_set; struct drm_mode_set save_set;
int ret; int ret;
int i; int i;
...@@ -573,7 +573,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) ...@@ -573,7 +573,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
/* a) traverse passed in connector list and get encoders for them */ /* a) traverse passed in connector list and get encoders for them */
count = 0; count = 0;
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
struct drm_connector_helper_funcs *connector_funcs = const struct drm_connector_helper_funcs *connector_funcs =
connector->helper_private; connector->helper_private;
new_encoder = connector->encoder; new_encoder = connector->encoder;
for (ro = 0; ro < set->num_connectors; ro++) { for (ro = 0; ro < set->num_connectors; ro++) {
...@@ -733,7 +733,7 @@ static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder) ...@@ -733,7 +733,7 @@ static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
static void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode) static void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode)
{ {
struct drm_bridge *bridge = encoder->bridge; struct drm_bridge *bridge = encoder->bridge;
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
if (bridge) { if (bridge) {
if (mode == DRM_MODE_DPMS_ON) if (mode == DRM_MODE_DPMS_ON)
...@@ -795,7 +795,7 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode) ...@@ -795,7 +795,7 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
/* from off to on, do crtc then encoder */ /* from off to on, do crtc then encoder */
if (mode < old_dpms) { if (mode < old_dpms) {
if (crtc) { if (crtc) {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
if (crtc_funcs->dpms) if (crtc_funcs->dpms)
(*crtc_funcs->dpms) (crtc, (*crtc_funcs->dpms) (crtc,
drm_helper_choose_crtc_dpms(crtc)); drm_helper_choose_crtc_dpms(crtc));
...@@ -809,7 +809,7 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode) ...@@ -809,7 +809,7 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
if (encoder) if (encoder)
drm_helper_encoder_dpms(encoder, encoder_dpms); drm_helper_encoder_dpms(encoder, encoder_dpms);
if (crtc) { if (crtc) {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
if (crtc_funcs->dpms) if (crtc_funcs->dpms)
(*crtc_funcs->dpms) (crtc, (*crtc_funcs->dpms) (crtc,
drm_helper_choose_crtc_dpms(crtc)); drm_helper_choose_crtc_dpms(crtc));
...@@ -871,7 +871,7 @@ void drm_helper_resume_force_mode(struct drm_device *dev) ...@@ -871,7 +871,7 @@ void drm_helper_resume_force_mode(struct drm_device *dev)
{ {
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_crtc_helper_funcs *crtc_funcs; const struct drm_crtc_helper_funcs *crtc_funcs;
int encoder_dpms; int encoder_dpms;
bool ret; bool ret;
...@@ -936,7 +936,7 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod ...@@ -936,7 +936,7 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod
struct drm_framebuffer *old_fb) struct drm_framebuffer *old_fb)
{ {
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
int ret; int ret;
if (crtc->funcs->atomic_duplicate_state) if (crtc->funcs->atomic_duplicate_state)
......
...@@ -238,7 +238,7 @@ static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc) ...@@ -238,7 +238,7 @@ static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
int drm_fb_helper_debug_enter(struct fb_info *info) int drm_fb_helper_debug_enter(struct fb_info *info)
{ {
struct drm_fb_helper *helper = info->par; struct drm_fb_helper *helper = info->par;
struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
int i; int i;
list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
...@@ -285,7 +285,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info) ...@@ -285,7 +285,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
{ {
struct drm_fb_helper *helper = info->par; struct drm_fb_helper *helper = info->par;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_helper_funcs *funcs; const struct drm_crtc_helper_funcs *funcs;
struct drm_framebuffer *fb; struct drm_framebuffer *fb;
int i; int i;
...@@ -765,7 +765,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) ...@@ -765,7 +765,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
{ {
struct drm_fb_helper *fb_helper = info->par; struct drm_fb_helper *fb_helper = info->par;
struct drm_device *dev = fb_helper->dev; struct drm_device *dev = fb_helper->dev;
struct drm_crtc_helper_funcs *crtc_funcs; const struct drm_crtc_helper_funcs *crtc_funcs;
u16 *red, *green, *blue, *transp; u16 *red, *green, *blue, *transp;
struct drm_crtc *crtc; struct drm_crtc *crtc;
int i, j, rc = 0; int i, j, rc = 0;
...@@ -1551,7 +1551,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, ...@@ -1551,7 +1551,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
int c, o; int c, o;
struct drm_device *dev = fb_helper->dev; struct drm_device *dev = fb_helper->dev;
struct drm_connector *connector; struct drm_connector *connector;
struct drm_connector_helper_funcs *connector_funcs; const struct drm_connector_helper_funcs *connector_funcs;
struct drm_encoder *encoder; struct drm_encoder *encoder;
int my_score, best_score, score; int my_score, best_score, score;
struct drm_fb_helper_crtc **crtcs, *crtc; struct drm_fb_helper_crtc **crtcs, *crtc;
......
...@@ -401,9 +401,9 @@ int drm_plane_helper_commit(struct drm_plane *plane, ...@@ -401,9 +401,9 @@ int drm_plane_helper_commit(struct drm_plane *plane,
struct drm_plane_state *plane_state, struct drm_plane_state *plane_state,
struct drm_framebuffer *old_fb) struct drm_framebuffer *old_fb)
{ {
struct drm_plane_helper_funcs *plane_funcs; const struct drm_plane_helper_funcs *plane_funcs;
struct drm_crtc *crtc[2]; struct drm_crtc *crtc[2];
struct drm_crtc_helper_funcs *crtc_funcs[2]; const struct drm_crtc_helper_funcs *crtc_funcs[2];
int i, ret = 0; int i, ret = 0;
plane_funcs = plane->helper_private; plane_funcs = plane->helper_private;
......
...@@ -98,7 +98,7 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect ...@@ -98,7 +98,7 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct drm_display_mode *mode; struct drm_display_mode *mode;
struct drm_connector_helper_funcs *connector_funcs = const struct drm_connector_helper_funcs *connector_funcs =
connector->helper_private; connector->helper_private;
int count = 0; int count = 0;
int mode_flags = 0; int mode_flags = 0;
......
...@@ -2101,7 +2101,7 @@ static void hdmi_dpms(struct exynos_drm_display *display, int mode) ...@@ -2101,7 +2101,7 @@ static void hdmi_dpms(struct exynos_drm_display *display, int mode)
struct hdmi_context *hdata = display_to_hdmi(display); struct hdmi_context *hdata = display_to_hdmi(display);
struct drm_encoder *encoder = hdata->encoder; struct drm_encoder *encoder = hdata->encoder;
struct drm_crtc *crtc = encoder->crtc; struct drm_crtc *crtc = encoder->crtc;
struct drm_crtc_helper_funcs *funcs = NULL; const struct drm_crtc_helper_funcs *funcs = NULL;
DRM_DEBUG_KMS("mode %d\n", mode); DRM_DEBUG_KMS("mode %d\n", mode);
......
...@@ -823,7 +823,7 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -823,7 +823,7 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
/* Flush the plane changes */ /* Flush the plane changes */
{ {
struct drm_crtc_helper_funcs *crtc_funcs = const struct drm_crtc_helper_funcs *crtc_funcs =
crtc->helper_private; crtc->helper_private;
crtc_funcs->mode_set_base(crtc, x, y, old_fb); crtc_funcs->mode_set_base(crtc, x, y, old_fb);
} }
......
...@@ -195,7 +195,7 @@ static int cdv_hdmi_set_property(struct drm_connector *connector, ...@@ -195,7 +195,7 @@ static int cdv_hdmi_set_property(struct drm_connector *connector,
encoder->crtc->x, encoder->crtc->y, encoder->crtc->primary->fb)) encoder->crtc->x, encoder->crtc->y, encoder->crtc->primary->fb))
return -1; return -1;
} else { } else {
struct drm_encoder_helper_funcs *helpers const struct drm_encoder_helper_funcs *helpers
= encoder->helper_private; = encoder->helper_private;
helpers->mode_set(encoder, &crtc->saved_mode, helpers->mode_set(encoder, &crtc->saved_mode,
&crtc->saved_adjusted_mode); &crtc->saved_adjusted_mode);
......
...@@ -505,7 +505,7 @@ static int cdv_intel_lvds_set_property(struct drm_connector *connector, ...@@ -505,7 +505,7 @@ static int cdv_intel_lvds_set_property(struct drm_connector *connector,
else else
gma_backlight_set(encoder->dev, value); gma_backlight_set(encoder->dev, value);
} else if (!strcmp(property->name, "DPMS") && encoder) { } else if (!strcmp(property->name, "DPMS") && encoder) {
struct drm_encoder_helper_funcs *helpers = const struct drm_encoder_helper_funcs *helpers =
encoder->helper_private; encoder->helper_private;
helpers->dpms(encoder, value); helpers->dpms(encoder, value);
} }
......
...@@ -501,20 +501,20 @@ bool gma_crtc_mode_fixup(struct drm_crtc *crtc, ...@@ -501,20 +501,20 @@ bool gma_crtc_mode_fixup(struct drm_crtc *crtc,
void gma_crtc_prepare(struct drm_crtc *crtc) void gma_crtc_prepare(struct drm_crtc *crtc)
{ {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
} }
void gma_crtc_commit(struct drm_crtc *crtc) void gma_crtc_commit(struct drm_crtc *crtc)
{ {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
} }
void gma_crtc_disable(struct drm_crtc *crtc) void gma_crtc_disable(struct drm_crtc *crtc)
{ {
struct gtt_range *gt; struct gtt_range *gt;
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
...@@ -656,7 +656,7 @@ void gma_crtc_restore(struct drm_crtc *crtc) ...@@ -656,7 +656,7 @@ void gma_crtc_restore(struct drm_crtc *crtc)
void gma_encoder_prepare(struct drm_encoder *encoder) void gma_encoder_prepare(struct drm_encoder *encoder)
{ {
struct drm_encoder_helper_funcs *encoder_funcs = const struct drm_encoder_helper_funcs *encoder_funcs =
encoder->helper_private; encoder->helper_private;
/* lvds has its own version of prepare see psb_intel_lvds_prepare */ /* lvds has its own version of prepare see psb_intel_lvds_prepare */
encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
...@@ -664,7 +664,7 @@ void gma_encoder_prepare(struct drm_encoder *encoder) ...@@ -664,7 +664,7 @@ void gma_encoder_prepare(struct drm_encoder *encoder)
void gma_encoder_commit(struct drm_encoder *encoder) void gma_encoder_commit(struct drm_encoder *encoder)
{ {
struct drm_encoder_helper_funcs *encoder_funcs = const struct drm_encoder_helper_funcs *encoder_funcs =
encoder->helper_private; encoder->helper_private;
/* lvds has its own version of commit see psb_intel_lvds_commit */ /* lvds has its own version of commit see psb_intel_lvds_commit */
encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
......
...@@ -290,7 +290,7 @@ static int mdfld_dsi_connector_set_property(struct drm_connector *connector, ...@@ -290,7 +290,7 @@ static int mdfld_dsi_connector_set_property(struct drm_connector *connector,
encoder->crtc->primary->fb)) encoder->crtc->primary->fb))
goto set_prop_error; goto set_prop_error;
} else { } else {
struct drm_encoder_helper_funcs *funcs = const struct drm_encoder_helper_funcs *funcs =
encoder->helper_private; encoder->helper_private;
funcs->mode_set(encoder, funcs->mode_set(encoder,
&gma_crtc->saved_mode, &gma_crtc->saved_mode,
......
...@@ -849,7 +849,7 @@ static int mdfld_crtc_mode_set(struct drm_crtc *crtc, ...@@ -849,7 +849,7 @@ static int mdfld_crtc_mode_set(struct drm_crtc *crtc,
/* Flush the plane changes */ /* Flush the plane changes */
{ {
struct drm_crtc_helper_funcs *crtc_funcs = const struct drm_crtc_helper_funcs *crtc_funcs =
crtc->helper_private; crtc->helper_private;
crtc_funcs->mode_set_base(crtc, x, y, old_fb); crtc_funcs->mode_set_base(crtc, x, y, old_fb);
} }
......
...@@ -483,7 +483,7 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc, ...@@ -483,7 +483,7 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
/* Flush the plane changes */ /* Flush the plane changes */
{ {
struct drm_crtc_helper_funcs *crtc_funcs = const struct drm_crtc_helper_funcs *crtc_funcs =
crtc->helper_private; crtc->helper_private;
crtc_funcs->mode_set_base(crtc, x, y, old_fb); crtc_funcs->mode_set_base(crtc, x, y, old_fb);
} }
......
...@@ -347,7 +347,7 @@ int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc, ...@@ -347,7 +347,7 @@ int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc,
/* Flush the plane changes */ /* Flush the plane changes */
{ {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
crtc_funcs->mode_set_base(crtc, x, y, old_fb); crtc_funcs->mode_set_base(crtc, x, y, old_fb);
} }
......
...@@ -108,7 +108,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -108,7 +108,7 @@ static int psb_intel_crtc_mode_set(struct drm_crtc *crtc,
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct drm_psb_private *dev_priv = dev->dev_private; struct drm_psb_private *dev_priv = dev->dev_private;
struct gma_crtc *gma_crtc = to_gma_crtc(crtc); struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
int pipe = gma_crtc->pipe; int pipe = gma_crtc->pipe;
const struct psb_offset *map = &dev_priv->regmap[pipe]; const struct psb_offset *map = &dev_priv->regmap[pipe];
int refclk; int refclk;
......
...@@ -625,7 +625,7 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, ...@@ -625,7 +625,7 @@ int psb_intel_lvds_set_property(struct drm_connector *connector,
else else
gma_backlight_set(encoder->dev, value); gma_backlight_set(encoder->dev, value);
} else if (!strcmp(property->name, "DPMS")) { } else if (!strcmp(property->name, "DPMS")) {
struct drm_encoder_helper_funcs *hfuncs const struct drm_encoder_helper_funcs *hfuncs
= encoder->helper_private; = encoder->helper_private;
hfuncs->dpms(encoder, value); hfuncs->dpms(encoder, value);
} }
......
...@@ -1222,7 +1222,7 @@ static void mga_crtc_commit(struct drm_crtc *crtc) ...@@ -1222,7 +1222,7 @@ static void mga_crtc_commit(struct drm_crtc *crtc)
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct mga_device *mdev = dev->dev_private; struct mga_device *mdev = dev->dev_private;
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
u8 tmp; u8 tmp;
if (mdev->type == G200_WB) if (mdev->type == G200_WB)
......
...@@ -703,7 +703,7 @@ static void nv_crtc_prepare(struct drm_crtc *crtc) ...@@ -703,7 +703,7 @@ static void nv_crtc_prepare(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
struct drm_crtc_helper_funcs *funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *funcs = crtc->helper_private;
if (nv_two_heads(dev)) if (nv_two_heads(dev))
NVSetOwner(dev, nv_crtc->index); NVSetOwner(dev, nv_crtc->index);
...@@ -724,7 +724,7 @@ static void nv_crtc_prepare(struct drm_crtc *crtc) ...@@ -724,7 +724,7 @@ static void nv_crtc_prepare(struct drm_crtc *crtc)
static void nv_crtc_commit(struct drm_crtc *crtc) static void nv_crtc_commit(struct drm_crtc *crtc)
{ {
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct drm_crtc_helper_funcs *funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *funcs = crtc->helper_private;
struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
nouveau_hw_load_state(dev, nv_crtc->index, &nv04_display(dev)->mode_reg); nouveau_hw_load_state(dev, nv_crtc->index, &nv04_display(dev)->mode_reg);
......
...@@ -358,7 +358,7 @@ static bool nv04_dac_mode_fixup(struct drm_encoder *encoder, ...@@ -358,7 +358,7 @@ static bool nv04_dac_mode_fixup(struct drm_encoder *encoder,
static void nv04_dac_prepare(struct drm_encoder *encoder) static void nv04_dac_prepare(struct drm_encoder *encoder)
{ {
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
int head = nouveau_crtc(encoder->crtc)->index; int head = nouveau_crtc(encoder->crtc)->index;
...@@ -409,7 +409,7 @@ static void nv04_dac_commit(struct drm_encoder *encoder) ...@@ -409,7 +409,7 @@ static void nv04_dac_commit(struct drm_encoder *encoder)
struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
struct nouveau_drm *drm = nouveau_drm(encoder->dev); struct nouveau_drm *drm = nouveau_drm(encoder->dev);
struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
helper->dpms(encoder, DRM_MODE_DPMS_ON); helper->dpms(encoder, DRM_MODE_DPMS_ON);
......
...@@ -244,7 +244,7 @@ static void nv04_dfp_prepare_sel_clk(struct drm_device *dev, ...@@ -244,7 +244,7 @@ static void nv04_dfp_prepare_sel_clk(struct drm_device *dev,
static void nv04_dfp_prepare(struct drm_encoder *encoder) static void nv04_dfp_prepare(struct drm_encoder *encoder)
{ {
struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
int head = nouveau_crtc(encoder->crtc)->index; int head = nouveau_crtc(encoder->crtc)->index;
struct nv04_crtc_reg *crtcstate = nv04_display(dev)->mode_reg.crtc_reg; struct nv04_crtc_reg *crtcstate = nv04_display(dev)->mode_reg.crtc_reg;
...@@ -445,7 +445,7 @@ static void nv04_dfp_commit(struct drm_encoder *encoder) ...@@ -445,7 +445,7 @@ static void nv04_dfp_commit(struct drm_encoder *encoder)
{ {
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
struct dcb_output *dcbe = nv_encoder->dcb; struct dcb_output *dcbe = nv_encoder->dcb;
......
...@@ -109,7 +109,7 @@ nv04_display_create(struct drm_device *dev) ...@@ -109,7 +109,7 @@ nv04_display_create(struct drm_device *dev)
crtc->funcs->save(crtc); crtc->funcs->save(crtc);
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
struct drm_encoder_helper_funcs *func = encoder->helper_private; const struct drm_encoder_helper_funcs *func = encoder->helper_private;
func->save(encoder); func->save(encoder);
} }
...@@ -138,7 +138,7 @@ nv04_display_destroy(struct drm_device *dev) ...@@ -138,7 +138,7 @@ nv04_display_destroy(struct drm_device *dev)
/* Restore state */ /* Restore state */
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
struct drm_encoder_helper_funcs *func = encoder->helper_private; const struct drm_encoder_helper_funcs *func = encoder->helper_private;
func->restore(encoder); func->restore(encoder);
} }
...@@ -169,7 +169,7 @@ nv04_display_init(struct drm_device *dev) ...@@ -169,7 +169,7 @@ nv04_display_init(struct drm_device *dev)
* on suspend too. * on suspend too.
*/ */
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
struct drm_encoder_helper_funcs *func = encoder->helper_private; const struct drm_encoder_helper_funcs *func = encoder->helper_private;
func->restore(encoder); func->restore(encoder);
} }
......
...@@ -122,7 +122,7 @@ static void nv04_tv_prepare(struct drm_encoder *encoder) ...@@ -122,7 +122,7 @@ static void nv04_tv_prepare(struct drm_encoder *encoder)
{ {
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
int head = nouveau_crtc(encoder->crtc)->index; int head = nouveau_crtc(encoder->crtc)->index;
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
helper->dpms(encoder, DRM_MODE_DPMS_OFF); helper->dpms(encoder, DRM_MODE_DPMS_OFF);
...@@ -164,7 +164,7 @@ static void nv04_tv_commit(struct drm_encoder *encoder) ...@@ -164,7 +164,7 @@ static void nv04_tv_commit(struct drm_encoder *encoder)
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
helper->dpms(encoder, DRM_MODE_DPMS_ON); helper->dpms(encoder, DRM_MODE_DPMS_ON);
......
...@@ -405,7 +405,7 @@ static void nv17_tv_prepare(struct drm_encoder *encoder) ...@@ -405,7 +405,7 @@ static void nv17_tv_prepare(struct drm_encoder *encoder)
{ {
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder); struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
int head = nouveau_crtc(encoder->crtc)->index; int head = nouveau_crtc(encoder->crtc)->index;
uint8_t *cr_lcd = &nv04_display(dev)->mode_reg.crtc_reg[head].CRTC[ uint8_t *cr_lcd = &nv04_display(dev)->mode_reg.crtc_reg[head].CRTC[
...@@ -583,7 +583,7 @@ static void nv17_tv_commit(struct drm_encoder *encoder) ...@@ -583,7 +583,7 @@ static void nv17_tv_commit(struct drm_encoder *encoder)
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc); struct nouveau_crtc *nv_crtc = nouveau_crtc(encoder->crtc);
struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
struct drm_encoder_helper_funcs *helper = encoder->helper_private; const struct drm_encoder_helper_funcs *helper = encoder->helper_private;
if (get_tv_norm(encoder)->kind == TV_ENC_MODE) { if (get_tv_norm(encoder)->kind == TV_ENC_MODE) {
nv17_tv_update_rescaler(encoder); nv17_tv_update_rescaler(encoder);
......
...@@ -309,7 +309,7 @@ nouveau_connector_detect(struct drm_connector *connector, bool force) ...@@ -309,7 +309,7 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
nv_encoder = find_encoder(connector, DCB_OUTPUT_TV); nv_encoder = find_encoder(connector, DCB_OUTPUT_TV);
if (nv_encoder && force) { if (nv_encoder && force) {
struct drm_encoder *encoder = to_drm_encoder(nv_encoder); struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
struct drm_encoder_helper_funcs *helper = const struct drm_encoder_helper_funcs *helper =
encoder->helper_private; encoder->helper_private;
if (helper->detect(encoder, connector) == if (helper->detect(encoder, connector) ==
...@@ -592,7 +592,7 @@ nouveau_connector_set_property(struct drm_connector *connector, ...@@ -592,7 +592,7 @@ nouveau_connector_set_property(struct drm_connector *connector,
static struct drm_display_mode * static struct drm_display_mode *
nouveau_connector_native_mode(struct drm_connector *connector) nouveau_connector_native_mode(struct drm_connector *connector)
{ {
struct drm_connector_helper_funcs *helper = connector->helper_private; const struct drm_connector_helper_funcs *helper = connector->helper_private;
struct nouveau_drm *drm = nouveau_drm(connector->dev); struct nouveau_drm *drm = nouveau_drm(connector->dev);
struct nouveau_connector *nv_connector = nouveau_connector(connector); struct nouveau_connector *nv_connector = nouveau_connector(connector);
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
......
...@@ -102,7 +102,7 @@ static int qxl_drm_freeze(struct drm_device *dev) ...@@ -102,7 +102,7 @@ static int qxl_drm_freeze(struct drm_device *dev)
/* unpin the front buffers */ /* unpin the front buffers */
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
if (crtc->enabled) if (crtc->enabled)
(*crtc_funcs->disable)(crtc); (*crtc_funcs->disable)(crtc);
} }
......
...@@ -157,7 +157,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector) ...@@ -157,7 +157,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
if (connector->display_info.bpc) if (connector->display_info.bpc)
bpc = connector->display_info.bpc; bpc = connector->display_info.bpc;
else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
struct drm_connector_helper_funcs *connector_funcs = const struct drm_connector_helper_funcs *connector_funcs =
connector->helper_private; connector->helper_private;
struct drm_encoder *encoder = connector_funcs->best_encoder(connector); struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
...@@ -247,7 +247,7 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c ...@@ -247,7 +247,7 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
struct drm_encoder *best_encoder = NULL; struct drm_encoder *best_encoder = NULL;
struct drm_encoder *encoder = NULL; struct drm_encoder *encoder = NULL;
struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
bool connected; bool connected;
int i; int i;
...@@ -724,7 +724,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct ...@@ -724,7 +724,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
if (connector->encoder) if (connector->encoder)
radeon_encoder = to_radeon_encoder(connector->encoder); radeon_encoder = to_radeon_encoder(connector->encoder);
else { else {
struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
} }
...@@ -751,7 +751,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct ...@@ -751,7 +751,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
if (connector->encoder) if (connector->encoder)
radeon_encoder = to_radeon_encoder(connector->encoder); radeon_encoder = to_radeon_encoder(connector->encoder);
else { else {
struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
} }
...@@ -762,7 +762,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct ...@@ -762,7 +762,7 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
if (connector->encoder->crtc) { if (connector->encoder->crtc) {
struct drm_crtc *crtc = connector->encoder->crtc; struct drm_crtc *crtc = connector->encoder->crtc;
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
radeon_crtc->output_csc = radeon_encoder->output_csc; radeon_crtc->output_csc = radeon_encoder->output_csc;
...@@ -942,7 +942,7 @@ static int radeon_lvds_set_property(struct drm_connector *connector, ...@@ -942,7 +942,7 @@ static int radeon_lvds_set_property(struct drm_connector *connector,
if (connector->encoder) if (connector->encoder)
radeon_encoder = to_radeon_encoder(connector->encoder); radeon_encoder = to_radeon_encoder(connector->encoder);
else { else {
struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
} }
...@@ -1010,7 +1010,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) ...@@ -1010,7 +1010,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector *radeon_connector = to_radeon_connector(connector);
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
bool dret = false; bool dret = false;
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;
int r; int r;
...@@ -1140,7 +1140,7 @@ static enum drm_connector_status ...@@ -1140,7 +1140,7 @@ static enum drm_connector_status
radeon_tv_detect(struct drm_connector *connector, bool force) radeon_tv_detect(struct drm_connector *connector, bool force)
{ {
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector *radeon_connector = to_radeon_connector(connector);
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;
int r; int r;
...@@ -1220,7 +1220,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) ...@@ -1220,7 +1220,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector *radeon_connector = to_radeon_connector(connector);
struct drm_encoder *encoder = NULL; struct drm_encoder *encoder = NULL;
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
int i, r; int i, r;
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;
bool dret = false, broken_edid = false; bool dret = false, broken_edid = false;
...@@ -1684,7 +1684,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force) ...@@ -1684,7 +1684,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */
ret = connector_status_connected; ret = connector_status_connected;
else if (radeon_connector->dac_load_detect) { /* try load detection */ else if (radeon_connector->dac_load_detect) { /* try load detection */
struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
ret = encoder_funcs->detect(encoder, connector); ret = encoder_funcs->detect(encoder, connector);
} }
} }
......
...@@ -604,7 +604,7 @@ radeon_dp_create_fake_mst_encoder(struct radeon_connector *connector) ...@@ -604,7 +604,7 @@ radeon_dp_create_fake_mst_encoder(struct radeon_connector *connector)
struct radeon_encoder *radeon_encoder; struct radeon_encoder *radeon_encoder;
struct radeon_encoder_mst *mst_enc; struct radeon_encoder_mst *mst_enc;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct drm_connector_helper_funcs *connector_funcs = connector->base.helper_private; const struct drm_connector_helper_funcs *connector_funcs = connector->base.helper_private;
struct drm_encoder *enc_master = connector_funcs->best_encoder(&connector->base); struct drm_encoder *enc_master = connector_funcs->best_encoder(&connector->base);
DRM_DEBUG_KMS("enc master is %p\n", enc_master); DRM_DEBUG_KMS("enc master is %p\n", enc_master);
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) static void radeon_legacy_encoder_disable(struct drm_encoder *encoder)
{ {
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct drm_encoder_helper_funcs *encoder_funcs; const struct drm_encoder_helper_funcs *encoder_funcs;
encoder_funcs = encoder->helper_private; encoder_funcs = encoder->helper_private;
encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
......
...@@ -75,4 +75,28 @@ int __must_check drm_atomic_check_only(struct drm_atomic_state *state); ...@@ -75,4 +75,28 @@ int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
int __must_check drm_atomic_commit(struct drm_atomic_state *state); int __must_check drm_atomic_commit(struct drm_atomic_state *state);
int __must_check drm_atomic_async_commit(struct drm_atomic_state *state); int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
#define for_each_connector_in_state(state, connector, connector_state, __i) \
for ((__i) = 0; \
(connector) = (state)->connectors[__i], \
(connector_state) = (state)->connector_states[__i], \
(__i) < (state)->num_connector; \
(__i)++) \
if (connector)
#define for_each_crtc_in_state(state, crtc, crtc_state, __i) \
for ((__i) = 0; \
(crtc) = (state)->crtcs[__i], \
(crtc_state) = (state)->crtc_states[__i], \
(__i) < (state)->dev->mode_config.num_crtc; \
(__i)++) \
if (crtc_state)
#define for_each_plane_in_state(state, plane, plane_state, __i) \
for ((__i) = 0; \
(plane) = (state)->planes[__i], \
(plane_state) = (state)->plane_states[__i], \
(__i) < (state)->dev->mode_config.num_total_plane; \
(__i)++) \
if (plane_state)
#endif /* DRM_ATOMIC_H_ */ #endif /* DRM_ATOMIC_H_ */
...@@ -466,7 +466,7 @@ struct drm_crtc { ...@@ -466,7 +466,7 @@ struct drm_crtc {
int framedur_ns, linedur_ns, pixeldur_ns; int framedur_ns, linedur_ns, pixeldur_ns;
/* if you are using the helper */ /* if you are using the helper */
void *helper_private; const void *helper_private;
struct drm_object_properties properties; struct drm_object_properties properties;
...@@ -596,7 +596,7 @@ struct drm_encoder { ...@@ -596,7 +596,7 @@ struct drm_encoder {
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_bridge *bridge; struct drm_bridge *bridge;
const struct drm_encoder_funcs *funcs; const struct drm_encoder_funcs *funcs;
void *helper_private; const void *helper_private;
}; };
/* should we poll this connector for connects and disconnects */ /* should we poll this connector for connects and disconnects */
...@@ -700,7 +700,7 @@ struct drm_connector { ...@@ -700,7 +700,7 @@ struct drm_connector {
/* requested DPMS state */ /* requested DPMS state */
int dpms; int dpms;
void *helper_private; const void *helper_private;
/* forced on connector */ /* forced on connector */
struct drm_cmdline_mode cmdline_mode; struct drm_cmdline_mode cmdline_mode;
...@@ -863,7 +863,7 @@ struct drm_plane { ...@@ -863,7 +863,7 @@ struct drm_plane {
enum drm_plane_type type; enum drm_plane_type type;
void *helper_private; const void *helper_private;
struct drm_plane_state *state; struct drm_plane_state *state;
}; };
...@@ -974,7 +974,7 @@ struct drm_mode_set { ...@@ -974,7 +974,7 @@ struct drm_mode_set {
* struct drm_mode_config_funcs - basic driver provided mode setting functions * struct drm_mode_config_funcs - basic driver provided mode setting functions
* @fb_create: create a new framebuffer object * @fb_create: create a new framebuffer object
* @output_poll_changed: function to handle output configuration changes * @output_poll_changed: function to handle output configuration changes
* @atomic_check: check whether a give atomic state update is possible * @atomic_check: check whether a given atomic state update is possible
* @atomic_commit: commit an atomic state update previously verified with * @atomic_commit: commit an atomic state update previously verified with
* atomic_check() * atomic_check()
* *
......
...@@ -197,19 +197,19 @@ extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, ...@@ -197,19 +197,19 @@ extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
static inline void drm_crtc_helper_add(struct drm_crtc *crtc, static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
const struct drm_crtc_helper_funcs *funcs) const struct drm_crtc_helper_funcs *funcs)
{ {
crtc->helper_private = (void *)funcs; crtc->helper_private = funcs;
} }
static inline void drm_encoder_helper_add(struct drm_encoder *encoder, static inline void drm_encoder_helper_add(struct drm_encoder *encoder,
const struct drm_encoder_helper_funcs *funcs) const struct drm_encoder_helper_funcs *funcs)
{ {
encoder->helper_private = (void *)funcs; encoder->helper_private = funcs;
} }
static inline void drm_connector_helper_add(struct drm_connector *connector, static inline void drm_connector_helper_add(struct drm_connector *connector,
const struct drm_connector_helper_funcs *funcs) const struct drm_connector_helper_funcs *funcs)
{ {
connector->helper_private = (void *)funcs; connector->helper_private = funcs;
} }
extern void drm_helper_resume_force_mode(struct drm_device *dev); extern void drm_helper_resume_force_mode(struct drm_device *dev);
......
...@@ -215,6 +215,8 @@ struct detailed_timing { ...@@ -215,6 +215,8 @@ struct detailed_timing {
#define DRM_ELD_VER 0 #define DRM_ELD_VER 0
# define DRM_ELD_VER_SHIFT 3 # define DRM_ELD_VER_SHIFT 3
# define DRM_ELD_VER_MASK (0x1f << 3) # define DRM_ELD_VER_MASK (0x1f << 3)
# define DRM_ELD_VER_CEA861D (2 << 3) /* supports 861D or below */
# define DRM_ELD_VER_CANNED (0x1f << 3)
#define DRM_ELD_BASELINE_ELD_LEN 2 /* in dwords! */ #define DRM_ELD_BASELINE_ELD_LEN 2 /* in dwords! */
......
...@@ -149,14 +149,16 @@ drm_gem_object_unreference(struct drm_gem_object *obj) ...@@ -149,14 +149,16 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
static inline void static inline void
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
{ {
if (obj && !atomic_add_unless(&obj->refcount.refcount, -1, 1)) { struct drm_device *dev;
struct drm_device *dev = obj->dev;
if (!obj)
return;
mutex_lock(&dev->struct_mutex); dev = obj->dev;
if (likely(atomic_dec_and_test(&obj->refcount.refcount))) if (kref_put_mutex(&obj->refcount, drm_gem_object_free, &dev->struct_mutex))
drm_gem_object_free(&obj->refcount);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
} else
might_lock(&dev->struct_mutex);
} }
int drm_gem_handle_create(struct drm_file *file_priv, int drm_gem_handle_create(struct drm_file *file_priv,
......
...@@ -76,7 +76,7 @@ struct drm_plane_helper_funcs { ...@@ -76,7 +76,7 @@ struct drm_plane_helper_funcs {
static inline void drm_plane_helper_add(struct drm_plane *plane, static inline void drm_plane_helper_add(struct drm_plane *plane,
const struct drm_plane_helper_funcs *funcs) const struct drm_plane_helper_funcs *funcs)
{ {
plane->helper_private = (void *)funcs; plane->helper_private = funcs;
} }
extern int drm_plane_helper_check_update(struct drm_plane *plane, extern int drm_plane_helper_check_update(struct drm_plane *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