32 #include <linux/list.h>
33 #include <linux/slab.h>
34 #include <linux/export.h>
41 #define DRM_ENUM_NAME_FN(fnname, list) \
42 char *fnname(int val) \
45 for (i = 0; i < ARRAY_SIZE(list); i++) { \
46 if (list[i].type == val) \
47 return list[i].name; \
102 drm_dvi_i_subconnector_enum_list)
125 drm_tv_subconnector_enum_list)
134 drm_dirty_info_enum_list)
136 struct drm_conn_prop_enum_list {
145 static struct drm_conn_prop_enum_list drm_connector_enum_list[] =
200 return "disconnected";
228 DRM_ERROR(
"Ran out memory getting a mode number\n");
241 obj->
type = obj_type;
255 static void drm_mode_object_put(
struct drm_device *dev,
269 obj =
idr_find(&dev->mode_config.crtc_idr,
id);
270 if (!obj || (obj->
type != type) || (obj->
id !=
id))
304 dev->mode_config.num_fb++;
305 list_add(&fb->
head, &dev->mode_config.fb_list);
311 static void drm_framebuffer_free(
struct kref *
kref)
315 fb->
funcs->destroy(fb);
327 DRM_DEBUG(
"FB ID: %d\n", fb->
base.id);
328 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
329 kref_put(&fb->
refcount, drm_framebuffer_free);
338 DRM_DEBUG(
"FB ID: %d\n", fb->
base.id);
363 drm_mode_object_put(dev, &fb->
base);
365 dev->mode_config.num_fb--;
389 if (crtc->
fb == fb) {
394 ret = crtc->
funcs->set_config(&
set);
396 DRM_ERROR(
"failed to reset crtc %p when fb was deleted\n", crtc);
401 if (plane->
fb == fb) {
403 ret = plane->
funcs->disable_plane(plane);
405 DRM_ERROR(
"failed to disable plane with busy fb\n");
450 dev->mode_config.num_crtc++;
478 drm_mode_object_put(dev, &crtc->
base);
480 dev->mode_config.num_crtc--;
550 connector->
funcs = funcs;
553 ++drm_connector_enum_list[connector_type].count;
556 INIT_LIST_HEAD(&connector->
modes);
560 dev->mode_config.num_connector++;
564 dev->mode_config.edid_property,
568 dev->mode_config.dpms_property, 0);
601 drm_mode_object_put(dev, &connector->
base);
603 dev->mode_config.num_connector--;
637 dev->mode_config.num_encoder++;
650 drm_mode_object_put(dev, &encoder->
base);
652 dev->mode_config.num_encoder--;
658 unsigned long possible_crtcs,
673 plane->
funcs = funcs;
677 DRM_DEBUG_KMS(
"out of memory when allocating plane\n");
678 drm_mode_object_put(dev, &plane->
base);
693 dev->mode_config.num_plane++;
695 INIT_LIST_HEAD(&plane->
head);
711 drm_mode_object_put(dev, &plane->
base);
713 if (!list_empty(&plane->
head)) {
715 dev->mode_config.num_plane--;
765 drm_mode_object_put(dev, &mode->
base);
771 static int drm_mode_create_standard_connector_properties(
struct drm_device *dev)
782 dev->mode_config.edid_property = edid;
785 "DPMS", drm_dpms_enum_list,
787 dev->mode_config.dpms_property = dpms;
803 if (dev->mode_config.dvi_i_select_subconnector_property)
808 "select subconnector",
809 drm_dvi_i_select_enum_list,
811 dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector;
815 drm_dvi_i_subconnector_enum_list,
816 ARRAY_SIZE(drm_dvi_i_subconnector_enum_list));
817 dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector;
841 if (dev->mode_config.tv_select_subconnector_property)
848 "select subconnector",
849 drm_tv_select_enum_list,
851 dev->mode_config.tv_select_subconnector_property = tv_selector;
856 drm_tv_subconnector_enum_list,
858 dev->mode_config.tv_subconnector_property = tv_subconnector;
863 dev->mode_config.tv_left_margin_property =
866 dev->mode_config.tv_right_margin_property =
869 dev->mode_config.tv_top_margin_property =
872 dev->mode_config.tv_bottom_margin_property =
875 dev->mode_config.tv_mode_property =
878 for (i = 0; i < num_modes; i++)
882 dev->mode_config.tv_brightness_property =
885 dev->mode_config.tv_contrast_property =
888 dev->mode_config.tv_flicker_reduction_property =
891 dev->mode_config.tv_overscan_property =
894 dev->mode_config.tv_saturation_property =
897 dev->mode_config.tv_hue_property =
915 if (dev->mode_config.scaling_mode_property)
920 drm_scaling_mode_enum_list,
923 dev->mode_config.scaling_mode_property = scaling_mode;
940 if (dev->mode_config.dithering_mode_property)
945 drm_dithering_mode_enum_list,
947 dev->mode_config.dithering_mode_property = dithering_mode;
964 if (dev->mode_config.dirty_info_property)
970 drm_dirty_info_enum_list,
972 dev->mode_config.dirty_info_property = dirty_info;
992 INIT_LIST_HEAD(&dev->mode_config.fb_list);
993 INIT_LIST_HEAD(&dev->mode_config.crtc_list);
994 INIT_LIST_HEAD(&dev->mode_config.connector_list);
995 INIT_LIST_HEAD(&dev->mode_config.encoder_list);
996 INIT_LIST_HEAD(&dev->mode_config.property_list);
997 INIT_LIST_HEAD(&dev->mode_config.property_blob_list);
998 INIT_LIST_HEAD(&dev->mode_config.plane_list);
999 idr_init(&dev->mode_config.crtc_idr);
1002 drm_mode_create_standard_connector_properties(dev);
1006 dev->mode_config.num_fb = 0;
1007 dev->mode_config.num_connector = 0;
1008 dev->mode_config.num_crtc = 0;
1009 dev->mode_config.num_encoder = 0;
1017 total_objects += dev->mode_config.num_crtc;
1018 total_objects += dev->mode_config.num_connector;
1019 total_objects += dev->mode_config.num_encoder;
1080 encoder->
funcs->destroy(encoder);
1084 &dev->mode_config.connector_list,
head) {
1085 connector->
funcs->destroy(connector);
1099 plane->
funcs->destroy(plane);
1103 crtc->
funcs->destroy(crtc);
1130 "timing values too large for mode info\n");
1209 struct drm_file *file_priv)
1218 int connector_count = 0;
1221 int encoder_count = 0;
1229 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1241 mode_group = &file_priv->master->minor->mode_group;
1242 if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
1259 card_res->
max_height = dev->mode_config.max_height;
1260 card_res->
min_height = dev->mode_config.min_height;
1261 card_res->
max_width = dev->mode_config.max_width;
1262 card_res->
min_width = dev->mode_config.min_width;
1283 if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
1286 DRM_DEBUG_KMS(
"[CRTC:%d]\n", crtc->
base.id);
1296 crtc_id + copied)) {
1310 if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
1312 &dev->mode_config.encoder_list,
1314 DRM_DEBUG_KMS(
"[ENCODER:%d:%s]\n", encoder->
base.id,
1326 encoder_id + copied)) {
1341 if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
1343 &dev->mode_config.connector_list,
1345 DRM_DEBUG_KMS(
"[CONNECTOR:%d:%s]\n",
1349 connector_id + copied)) {
1360 connector_id + copied)) {
1370 DRM_DEBUG_KMS(
"CRTC[%d] CONNECTORS[%d] ENCODERS[%d]\n", card_res->
count_crtcs,
1396 void *
data,
struct drm_file *file_priv)
1403 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1416 crtc_resp->
x = crtc->
x;
1417 crtc_resp->
y = crtc->
y;
1420 crtc_resp->
fb_id = crtc->
fb->base.id;
1422 crtc_resp->
fb_id = 0;
1426 drm_crtc_convert_to_umode(&crtc_resp->
mode, &crtc->
mode);
1456 struct drm_file *file_priv)
1463 int props_count = 0;
1464 int encoders_count = 0;
1474 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1479 DRM_DEBUG_KMS(
"[CONNECTOR:%d:?]\n", out_resp->
connector_id);
1500 connector->
funcs->fill_modes(connector,
1501 dev->mode_config.max_width,
1502 dev->mode_config.max_height);
1525 if ((out_resp->
count_modes >= mode_count) && mode_count) {
1529 drm_crtc_convert_to_umode(&u_mode, mode);
1531 &u_mode,
sizeof(u_mode))) {
1540 if ((out_resp->
count_props >= props_count) && props_count) {
1544 for (i = 0; i < connector->
properties.count; i++) {
1546 prop_ptr + copied)) {
1552 prop_values + copied)) {
1561 if ((out_resp->
count_encoders >= encoders_count) && encoders_count) {
1567 encoder_ptr + copied)) {
1583 struct drm_file *file_priv)
1590 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1628 struct drm_file *file_priv)
1634 int copied = 0, ret = 0;
1636 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1640 config = &dev->mode_config;
1678 struct drm_file *file_priv)
1686 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1704 plane_resp->
fb_id = plane->
fb->base.id;
1706 plane_resp->
fb_id = 0;
1746 struct drm_file *file_priv)
1754 unsigned int fb_width, fb_height;
1757 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1769 DRM_DEBUG_KMS(
"Unknown plane ID %d\n",
1777 if (!plane_req->
fb_id) {
1778 plane->
funcs->disable_plane(plane);
1787 DRM_DEBUG_KMS(
"Unknown crtc ID %d\n",
1797 DRM_DEBUG_KMS(
"Unknown framebuffer ID %d\n",
1809 DRM_DEBUG_KMS(
"Invalid pixel format 0x%08x\n", fb->
pixel_format);
1814 fb_width = fb->
width << 16;
1815 fb_height = fb->
height << 16;
1818 if (plane_req->
src_w > fb_width ||
1819 plane_req->
src_x > fb_width - plane_req->
src_w ||
1820 plane_req->
src_h > fb_height ||
1821 plane_req->
src_y > fb_height - plane_req->
src_h) {
1822 DRM_DEBUG_KMS(
"Invalid source coordinates "
1823 "%u.%06ux%u.%06u+%u.%06u+%u.%06u\n",
1824 plane_req->
src_w >> 16,
1825 ((plane_req->
src_w & 0xffff) * 15625) >> 10,
1826 plane_req->
src_h >> 16,
1827 ((plane_req->
src_h & 0xffff) * 15625) >> 10,
1828 plane_req->
src_x >> 16,
1829 ((plane_req->
src_x & 0xffff) * 15625) >> 10,
1830 plane_req->
src_y >> 16,
1831 ((plane_req->
src_y & 0xffff) * 15625) >> 10);
1841 DRM_DEBUG_KMS(
"Invalid CRTC coordinates %ux%u+%d+%d\n",
1848 ret = plane->
funcs->update_plane(plane, crtc, fb,
1882 struct drm_file *file_priv)
1896 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1907 DRM_DEBUG_KMS(
"Unknown CRTC ID %d\n", crtc_req->
crtc_id);
1912 DRM_DEBUG_KMS(
"[CRTC:%d]\n", crtc->
base.id);
1915 int hdisplay, vdisplay;
1918 if (crtc_req->
fb_id == -1) {
1920 DRM_DEBUG_KMS(
"CRTC doesn't have current FB\n");
1929 DRM_DEBUG_KMS(
"Unknown FB ID%d\n",
1943 ret = drm_crtc_convert_umode(mode, &crtc_req->
mode);
1945 DRM_DEBUG_KMS(
"Invalid mode\n");
1955 swap(hdisplay, vdisplay);
1957 if (hdisplay > fb->
width ||
1959 crtc_req->
x > fb->
width - hdisplay ||
1960 crtc_req->
y > fb->
height - vdisplay) {
1961 DRM_DEBUG_KMS(
"Invalid fb size %ux%u for CRTC viewport %ux%u+%d+%d%s.\n",
1963 hdisplay, vdisplay, crtc_req->
x, crtc_req->
y,
1971 DRM_DEBUG_KMS(
"Count connectors is 0 but mode set\n");
1977 DRM_DEBUG_KMS(
"Count connectors is %d but no mode or fb set\n",
1995 if (!connector_set) {
2002 if (
get_user(out_id, &set_connectors_ptr[i])) {
2010 DRM_DEBUG_KMS(
"Connector id %d unknown\n",
2016 DRM_DEBUG_KMS(
"[CONNECTOR:%d:%s]\n",
2025 set.x = crtc_req->
x;
2026 set.y = crtc_req->
y;
2028 set.connectors = connector_set;
2031 ret = crtc->
funcs->set_config(&
set);
2034 kfree(connector_set);
2041 void *
data,
struct drm_file *file_priv)
2048 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2057 DRM_DEBUG_KMS(
"Unknown CRTC ID %d\n", req->
crtc_id);
2064 if (!crtc->
funcs->cursor_set) {
2069 ret = crtc->
funcs->cursor_set(crtc, file_priv, req->
handle,
2074 if (crtc->
funcs->cursor_move) {
2075 ret = crtc->
funcs->cursor_move(crtc, req->
x, req->
y);
2107 else if (depth == 30)
2113 DRM_ERROR(
"bad bpp, assuming x8r8g8b8 pixel format\n");
2140 void *
data,
struct drm_file *file_priv)
2156 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2170 fb = dev->mode_config.
funcs->fb_create(dev, file_priv, &r);
2172 DRM_DEBUG_KMS(
"could not create framebuffer\n");
2178 list_add(&fb->
filp_head, &file_priv->fbs);
2179 DRM_DEBUG_KMS(
"[FB:%d]\n", fb->
base.id);
2261 ret = format_check(r);
2263 DRM_DEBUG_KMS(
"bad framebuffer format 0x%08x\n", r->
pixel_format);
2272 DRM_DEBUG_KMS(
"bad framebuffer width %u\n", r->
height);
2277 DRM_DEBUG_KMS(
"bad framebuffer height %u\n", r->
height);
2282 unsigned int width = r->
width / (i != 0 ? hsub : 1);
2285 DRM_DEBUG_KMS(
"no buffer object handle for plane %d\n", i);
2290 DRM_DEBUG_KMS(
"bad pitch %u for plane %d\n", r->
pitches[i], i);
2316 void *
data,
struct drm_file *file_priv)
2323 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2327 DRM_DEBUG_KMS(
"bad framebuffer width %d, should be >= %d && <= %d\n",
2332 DRM_DEBUG_KMS(
"bad framebuffer height %d, should be >= %d && <= %d\n",
2337 ret = framebuffer_check(r);
2343 fb = dev->mode_config.
funcs->fb_create(dev, file_priv, r);
2345 DRM_DEBUG_KMS(
"could not create framebuffer\n");
2351 list_add(&fb->
filp_head, &file_priv->fbs);
2352 DRM_DEBUG_KMS(
"[FB:%d]\n", fb->
base.id);
2377 void *
data,
struct drm_file *file_priv)
2386 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2432 void *
data,
struct drm_file *file_priv)
2439 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2455 fb->
funcs->create_handle(fb, file_priv, &r->
handle);
2463 void *
data,
struct drm_file *file_priv)
2474 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2488 if (!num_clips != !clips_ptr) {
2501 if (num_clips && clips_ptr) {
2506 clips = kzalloc(num_clips *
sizeof(*clips),
GFP_KERNEL);
2513 num_clips *
sizeof(*clips));
2520 if (fb->
funcs->dirty) {
2521 ret = fb->
funcs->dirty(fb, file_priv, flags, r->
color,
2570 static void drm_mode_attachmode(
struct drm_device *dev,
2588 if (connector->
encoder->crtc == crtc) {
2601 if (connector->
encoder->crtc == crtc)
2615 static int drm_mode_detachmode(
struct drm_device *dev,
2643 drm_mode_detachmode(dev, connector, mode);
2663 void *
data,
struct drm_file *file_priv)
2672 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2690 ret = drm_crtc_convert_umode(mode, umode);
2692 DRM_DEBUG_KMS(
"Invalid mode\n");
2697 drm_mode_attachmode(dev, connector, mode);
2717 void *
data,
struct drm_file *file_priv)
2726 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2738 ret = drm_crtc_convert_umode(&mode, umode);
2740 DRM_DEBUG_KMS(
"Invalid mode\n");
2744 ret = drm_mode_detachmode(dev, connector, &mode);
2770 property->flags =
flags;
2772 INIT_LIST_HEAD(&
property->enum_blob_list);
2856 property->values[0] =
min;
2857 property->values[1] =
max;
2880 if (prop_enum->
value == value) {
2913 drm_mode_object_put(dev, &property->
base);
2947 WARN(1,
"Failed to attach object property (type: 0x%x). Please "
2948 "increase DRM_OBJECT_MAX_PROPERTY by 1 for each time "
2949 "you see this message on the same object type.\n",
2965 for (i = 0; i < obj->
properties->count; i++) {
2981 for (i = 0; i < obj->
properties->count; i++) {
2993 void *
data,
struct drm_file *file_priv)
3000 int value_count = 0;
3010 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3029 value_count =
property->num_values;
3033 out_resp->
flags =
property->flags;
3035 if ((out_resp->
count_values >= value_count) && value_count) {
3037 for (i = 0; i < value_count; i++) {
3075 if (
put_user(prop_blob->
base.id, blob_id_ptr + copied)) {
3101 if (!length || !data)
3122 static void drm_property_destroy_blob(
struct drm_device *dev,
3125 drm_mode_object_put(dev, &blob->
base);
3131 void *data,
struct drm_file *file_priv)
3139 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3151 blob_ptr = (
void __user *)(
unsigned long)out_resp->
data;
3185 dev->mode_config.edid_property,
3198 if (value < property->
values[0] || value > property->
values[1])
3204 for (i = 0; i <
property->num_values; i++)
3205 valid_mask |= (1ULL << property->
values[i]);
3206 return !(value & ~valid_mask);
3209 for (i = 0; i <
property->num_values; i++)
3210 if (property->
values[i] == value)
3217 void *data,
struct drm_file *file_priv)
3222 .prop_id = conn_set_prop->
prop_id,
3231 static int drm_mode_connector_set_obj_prop(
struct drm_mode_object *obj,
3239 if (property == connector->
dev->mode_config.dpms_property) {
3240 if (connector->
funcs->dpms)
3241 (*connector->
funcs->dpms)(connector, (
int)
value);
3243 }
else if (connector->
funcs->set_property)
3244 ret = connector->
funcs->set_property(connector, property, value);
3259 if (crtc->
funcs->set_property)
3260 ret = crtc->
funcs->set_property(crtc, property, value);
3274 if (plane->
funcs->set_property)
3275 ret = plane->
funcs->set_property(plane, property, value);
3283 struct drm_file *file_priv)
3290 int props_count = 0;
3294 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3313 if ((arg->
count_props >= props_count) && props_count) {
3318 for (i = 0; i < props_count; i++) {
3320 props_ptr + copied)) {
3325 prop_values_ptr + copied)) {
3339 struct drm_file *file_priv)
3348 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3359 for (i = 0; i < arg_obj->
properties->count; i++)
3372 if (!drm_property_change_is_valid(property, arg->
value))
3375 switch (arg_obj->
type) {
3377 ret = drm_mode_connector_set_obj_prop(arg_obj, property,
3381 ret = drm_mode_crtc_set_obj_prop(arg_obj, property, arg->
value);
3384 ret = drm_mode_plane_set_obj_prop(arg_obj, property, arg->
value);
3415 if (connector->
encoder == encoder)
3439 void *data,
struct drm_file *file_priv)
3444 void *
r_base, *g_base, *b_base;
3448 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3477 g_base = r_base +
size;
3483 b_base = g_base +
size;
3489 crtc->
funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->
gamma_size);
3498 void *data,
struct drm_file *file_priv)
3503 void *
r_base, *g_base, *b_base;
3507 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3531 g_base = r_base +
size;
3537 b_base = g_base +
size;
3548 void *data,
struct drm_file *file_priv)
3554 struct drm_pending_vblank_event *
e =
NULL;
3555 unsigned long flags;
3556 int hdisplay, vdisplay;
3586 hdisplay = crtc->
mode.hdisplay;
3587 vdisplay = crtc->
mode.vdisplay;
3590 swap(hdisplay, vdisplay);
3592 if (hdisplay > fb->
width ||
3594 crtc->
x > fb->
width - hdisplay ||
3595 crtc->
y > fb->
height - vdisplay) {
3596 DRM_DEBUG_KMS(
"Invalid fb size %ux%u for CRTC viewport %ux%u+%d+%d%s.\n",
3597 fb->
width, fb->
height, hdisplay, vdisplay, crtc->
x, crtc->
y,
3606 if (file_priv->event_space <
sizeof e->event) {
3607 spin_unlock_irqrestore(&dev->event_lock, flags);
3610 file_priv->event_space -=
sizeof e->event;
3611 spin_unlock_irqrestore(&dev->event_lock, flags);
3616 file_priv->event_space +=
sizeof e->event;
3617 spin_unlock_irqrestore(&dev->event_lock, flags);
3622 e->event.base.length =
sizeof e->event;
3623 e->event.user_data = page_flip->
user_data;
3624 e->base.event = &e->event.base;
3625 e->base.file_priv = file_priv;
3627 (
void (*) (
struct drm_pending_event *))
kfree;
3630 ret = crtc->
funcs->page_flip(crtc, fb, e);
3634 file_priv->event_space +=
sizeof e->event;
3635 spin_unlock_irqrestore(&dev->event_lock, flags);
3652 if (crtc->
funcs->reset)
3653 crtc->
funcs->reset(crtc);
3656 if (encoder->
funcs->reset)
3657 encoder->
funcs->reset(encoder);
3660 if (connector->
funcs->reset)
3661 connector->
funcs->reset(connector);
3666 void *data,
struct drm_file *file_priv)
3670 if (!dev->driver->dumb_create)
3672 return dev->driver->dumb_create(file_priv, dev, args);
3676 void *data,
struct drm_file *file_priv)
3681 if (!dev->driver->dumb_map_offset)
3684 return dev->driver->dumb_map_offset(file_priv, dev, args->
handle, &args->
offset);
3688 void *data,
struct drm_file *file_priv)
3692 if (!dev->driver->dumb_destroy)
3695 return dev->driver->dumb_destroy(file_priv, dev, args->
handle);
3758 DRM_DEBUG_KMS(
"unsupported pixel format\n");
3828 return plane ? 2 : 1;