91,7 → 91,7 |
*/ |
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
drm_for_each_connector(connector, dev) { |
if (connector->encoder && connector->encoder->crtc == crtc) { |
if (connector_list != NULL && count < num_connectors) |
*(connector_list++) = connector; |
98,6 → 98,7 |
|
count++; |
} |
} |
|
return count; |
} |
142,6 → 143,17 |
{ |
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) { |
DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n"); |
return -EINVAL; |
155,11 → 167,6 |
return -ERANGE; |
} |
|
if (!fb) { |
*visible = false; |
return 0; |
} |
|
*visible = drm_rect_clip_scaled(src, dest, clip, hscale, vscale); |
if (!*visible) |
/* |
338,20 → 345,7 |
}; |
EXPORT_SYMBOL(drm_primary_helper_funcs); |
|
/** |
* drm_primary_helper_create_plane() - Create a generic primary plane |
* @dev: drm device |
* @formats: pixel formats supported, or NULL for a default safe list |
* @num_formats: size of @formats; ignored if @formats is NULL |
* |
* Allocates and initializes a primary plane that can be used with the primary |
* plane helpers. Drivers that wish to use driver-specific plane structures or |
* provide custom handler functions may perform their own allocation and |
* initialization rather than calling this function. |
*/ |
struct drm_plane *drm_primary_helper_create_plane(struct drm_device *dev, |
const uint32_t *formats, |
int num_formats) |
static struct drm_plane *create_primary_plane(struct drm_device *dev) |
{ |
struct drm_plane *primary; |
int ret; |
362,15 → 356,17 |
return NULL; |
} |
|
if (formats == NULL) { |
formats = safe_modeset_formats; |
num_formats = ARRAY_SIZE(safe_modeset_formats); |
} |
/* |
* Remove the format_default field from drm_plane when dropping |
* this helper. |
*/ |
primary->format_default = true; |
|
/* possible_crtc's will be filled in later by crtc_init */ |
ret = drm_universal_plane_init(dev, primary, 0, |
&drm_primary_helper_funcs, |
formats, num_formats, |
safe_modeset_formats, |
ARRAY_SIZE(safe_modeset_formats), |
DRM_PLANE_TYPE_PRIMARY); |
if (ret) { |
kfree(primary); |
379,7 → 375,6 |
|
return primary; |
} |
EXPORT_SYMBOL(drm_primary_helper_create_plane); |
|
/** |
* drm_crtc_init - Legacy CRTC initialization function |
398,7 → 393,7 |
{ |
struct drm_plane *primary; |
|
primary = drm_primary_helper_create_plane(dev, NULL, 0); |
primary = create_primary_plane(dev); |
return drm_crtc_init_with_planes(dev, crtc, primary, NULL, funcs); |
} |
EXPORT_SYMBOL(drm_crtc_init); |
407,9 → 402,9 |
struct drm_plane_state *plane_state, |
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_helper_funcs *crtc_funcs[2]; |
const struct drm_crtc_helper_funcs *crtc_funcs[2]; |
int i, ret = 0; |
|
plane_funcs = plane->helper_private; |
429,8 → 424,10 |
goto out; |
} |
|
if (plane_funcs->prepare_fb && plane_state->fb) { |
ret = plane_funcs->prepare_fb(plane, plane_state->fb); |
if (plane_funcs->prepare_fb && plane_state->fb && |
plane_state->fb != old_fb) { |
ret = plane_funcs->prepare_fb(plane, |
plane_state); |
if (ret) |
goto out; |
} |
440,20 → 437,38 |
|
for (i = 0; i < 2; i++) { |
if (crtc_funcs[i] && crtc_funcs[i]->atomic_begin) |
crtc_funcs[i]->atomic_begin(crtc[i]); |
crtc_funcs[i]->atomic_begin(crtc[i], crtc[i]->state); |
} |
|
/* |
* Drivers may optionally implement the ->atomic_disable callback, so |
* special-case that here. |
*/ |
if (drm_atomic_plane_disabling(plane, plane_state) && |
plane_funcs->atomic_disable) |
plane_funcs->atomic_disable(plane, plane_state); |
else |
plane_funcs->atomic_update(plane, plane_state); |
|
for (i = 0; i < 2; i++) { |
if (crtc_funcs[i] && crtc_funcs[i]->atomic_flush) |
crtc_funcs[i]->atomic_flush(crtc[i]); |
crtc_funcs[i]->atomic_flush(crtc[i], crtc[i]->state); |
} |
|
/* |
* If we only moved the plane and didn't change fb's, there's no need to |
* wait for vblank. |
*/ |
if (plane->state->fb == old_fb) |
goto out; |
|
for (i = 0; i < 2; i++) { |
if (!crtc[i]) |
continue; |
|
if (crtc[i]->cursor == plane) |
continue; |
|
/* There's no other way to figure out whether the crtc is running. */ |
ret = drm_crtc_vblank_get(crtc[i]); |
if (ret == 0) { |
464,8 → 479,8 |
ret = 0; |
} |
|
if (plane_funcs->cleanup_fb && old_fb) |
plane_funcs->cleanup_fb(plane, old_fb); |
if (plane_funcs->cleanup_fb) |
plane_funcs->cleanup_fb(plane, plane_state); |
out: |
if (plane_state) { |
if (plane->funcs->atomic_destroy_state) |
478,7 → 493,7 |
} |
|
/** |
* drm_plane_helper_update() - Helper for primary plane update |
* drm_plane_helper_update() - Transitional helper for plane update |
* @plane: plane object to update |
* @crtc: owning CRTC of owning plane |
* @fb: framebuffer to flip onto plane |
511,12 → 526,15 |
|
if (plane->funcs->atomic_duplicate_state) |
plane_state = plane->funcs->atomic_duplicate_state(plane); |
else if (plane->state) |
else { |
if (!plane->state) |
drm_atomic_helper_plane_reset(plane); |
|
plane_state = drm_atomic_helper_plane_duplicate_state(plane); |
else |
plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL); |
} |
if (!plane_state) |
return -ENOMEM; |
plane_state->plane = plane; |
|
plane_state->crtc = crtc; |
drm_atomic_set_fb_for_plane(plane_state, fb); |
534,7 → 552,7 |
EXPORT_SYMBOL(drm_plane_helper_update); |
|
/** |
* drm_plane_helper_disable() - Helper for primary plane disable |
* drm_plane_helper_disable() - Transitional helper for plane disable |
* @plane: plane to disable |
* |
* Provides a default plane disable handler using the atomic plane update |
557,12 → 575,15 |
|
if (plane->funcs->atomic_duplicate_state) |
plane_state = plane->funcs->atomic_duplicate_state(plane); |
else if (plane->state) |
else { |
if (!plane->state) |
drm_atomic_helper_plane_reset(plane); |
|
plane_state = drm_atomic_helper_plane_duplicate_state(plane); |
else |
plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL); |
} |
if (!plane_state) |
return -ENOMEM; |
plane_state->plane = plane; |
|
plane_state->crtc = NULL; |
drm_atomic_set_fb_for_plane(plane_state, NULL); |