198,6 → 198,7 |
{ DRM_MODE_CONNECTOR_TV, "TV" }, |
{ DRM_MODE_CONNECTOR_eDP, "eDP" }, |
{ DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" }, |
{ DRM_MODE_CONNECTOR_DSI, "DSI" }, |
}; |
|
static const struct drm_prop_enum_list drm_encoder_enum_list[] = |
207,6 → 208,7 |
{ DRM_MODE_ENCODER_LVDS, "LVDS" }, |
{ DRM_MODE_ENCODER_TVDAC, "TV" }, |
{ DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, |
{ DRM_MODE_ENCODER_DSI, "DSI" }, |
}; |
|
void drm_connector_ida_init(void) |
669,6 → 671,29 |
EXPORT_SYMBOL(drm_crtc_cleanup); |
|
/** |
* drm_crtc_index - find the index of a registered CRTC |
* @crtc: CRTC to find index for |
* |
* Given a registered CRTC, return the index of that CRTC within a DRM |
* device's list of CRTCs. |
*/ |
unsigned int drm_crtc_index(struct drm_crtc *crtc) |
{ |
unsigned int index = 0; |
struct drm_crtc *tmp; |
|
list_for_each_entry(tmp, &crtc->dev->mode_config.crtc_list, head) { |
if (tmp == crtc) |
return index; |
|
index++; |
} |
|
BUG(); |
} |
EXPORT_SYMBOL(drm_crtc_index); |
|
/** |
* drm_mode_probed_add - add a mode to a connector's probed mode list |
* @connector: connector the new mode |
* @mode: mode data |
1297,7 → 1322,7 |
} |
|
/** |
* drm_crtc_convert_to_umode - convert a modeinfo into a drm_display_mode |
* drm_crtc_convert_umode - convert a modeinfo into a drm_display_mode |
* @out: drm_display_mode to return to the user |
* @in: drm_mode_modeinfo to use |
* |
1313,6 → 1338,9 |
if (in->clock > INT_MAX || in->vrefresh > INT_MAX) |
return -ERANGE; |
|
if ((in->flags & DRM_MODE_FLAG_3D_MASK) > DRM_MODE_FLAG_3D_MAX) |
return -EINVAL; |
|
out->clock = in->clock; |
out->hdisplay = in->hdisplay; |
out->hsync_start = in->hsync_start; |
1550,7 → 1578,7 |
obj = drm_mode_object_find(dev, crtc_resp->crtc_id, |
DRM_MODE_OBJECT_CRTC); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
crtc = obj_to_crtc(obj); |
1577,6 → 1605,19 |
return ret; |
} |
|
static bool drm_mode_expose_to_userspace(const struct drm_display_mode *mode, |
const struct drm_file *file_priv) |
{ |
/* |
* If user-space hasn't configured the driver to expose the stereo 3D |
* modes, don't expose them. |
*/ |
if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode)) |
return false; |
|
return true; |
} |
|
/** |
* drm_mode_getconnector - get connector configuration |
* @dev: drm device for the ioctl |
1621,7 → 1662,7 |
obj = drm_mode_object_find(dev, out_resp->connector_id, |
DRM_MODE_OBJECT_CONNECTOR); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
connector = obj_to_connector(obj); |
1642,6 → 1683,7 |
|
/* delayed so we get modes regardless of pre-fill_modes state */ |
list_for_each_entry(mode, &connector->modes, head) |
if (drm_mode_expose_to_userspace(mode, file_priv)) |
mode_count++; |
|
out_resp->connector_id = connector->base.id; |
1664,6 → 1706,9 |
copied = 0; |
mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr; |
list_for_each_entry(mode, &connector->modes, head) { |
if (!drm_mode_expose_to_userspace(mode, file_priv)) |
continue; |
|
drm_crtc_convert_to_umode(&u_mode, mode); |
if (copy_to_user(mode_ptr + copied, |
&u_mode, sizeof(u_mode))) { |
1733,7 → 1778,7 |
obj = drm_mode_object_find(dev, enc_resp->encoder_id, |
DRM_MODE_OBJECT_ENCODER); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
encoder = obj_to_encoder(obj); |
2040,6 → 2085,45 |
EXPORT_SYMBOL(drm_mode_set_config_internal); |
|
#if 0 |
/* |
* Checks that the framebuffer is big enough for the CRTC viewport |
* (x, y, hdisplay, vdisplay) |
*/ |
static int drm_crtc_check_viewport(const struct drm_crtc *crtc, |
int x, int y, |
const struct drm_display_mode *mode, |
const struct drm_framebuffer *fb) |
|
{ |
int hdisplay, vdisplay; |
|
hdisplay = mode->hdisplay; |
vdisplay = mode->vdisplay; |
|
if (drm_mode_is_stereo(mode)) { |
struct drm_display_mode adjusted = *mode; |
|
drm_mode_set_crtcinfo(&adjusted, CRTC_STEREO_DOUBLE); |
hdisplay = adjusted.crtc_hdisplay; |
vdisplay = adjusted.crtc_vdisplay; |
} |
|
if (crtc->invert_dimensions) |
swap(hdisplay, vdisplay); |
|
if (hdisplay > fb->width || |
vdisplay > fb->height || |
x > fb->width - hdisplay || |
y > fb->height - vdisplay) { |
DRM_DEBUG_KMS("Invalid fb size %ux%u for CRTC viewport %ux%u+%d+%d%s.\n", |
fb->width, fb->height, hdisplay, vdisplay, x, y, |
crtc->invert_dimensions ? " (inverted)" : ""); |
return -ENOSPC; |
} |
|
return 0; |
} |
|
/** |
* drm_mode_setcrtc - set CRTC configuration |
* @dev: drm device for the ioctl |
2080,7 → 2164,7 |
DRM_MODE_OBJECT_CRTC); |
if (!obj) { |
DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id); |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
crtc = obj_to_crtc(obj); |
2087,7 → 2171,6 |
DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); |
|
if (crtc_req->mode_valid) { |
int hdisplay, vdisplay; |
/* If we have a mode we need a framebuffer. */ |
/* If we pass -1, set the mode with the currently bound fb */ |
if (crtc_req->fb_id == -1) { |
2104,7 → 2187,7 |
if (!fb) { |
DRM_DEBUG_KMS("Unknown FB ID%d\n", |
crtc_req->fb_id); |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
} |
2123,24 → 2206,12 |
|
drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
|
hdisplay = mode->hdisplay; |
vdisplay = mode->vdisplay; |
ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y, |
mode, fb); |
if (ret) |
goto out; |
|
if (crtc->invert_dimensions) |
swap(hdisplay, vdisplay); |
|
if (hdisplay > fb->width || |
vdisplay > fb->height || |
crtc_req->x > fb->width - hdisplay || |
crtc_req->y > fb->height - vdisplay) { |
DRM_DEBUG_KMS("Invalid fb size %ux%u for CRTC viewport %ux%u+%d+%d%s.\n", |
fb->width, fb->height, |
hdisplay, vdisplay, crtc_req->x, crtc_req->y, |
crtc->invert_dimensions ? " (inverted)" : ""); |
ret = -ENOSPC; |
goto out; |
} |
} |
|
if (crtc_req->count_connectors == 0 && mode) { |
DRM_DEBUG_KMS("Count connectors is 0 but mode set\n"); |
2184,7 → 2255,7 |
if (!obj) { |
DRM_DEBUG_KMS("Connector id %d unknown\n", |
out_id); |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
connector = obj_to_connector(obj); |
2232,7 → 2303,7 |
obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC); |
if (!obj) { |
DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id); |
return -EINVAL; |
return -ENOENT; |
} |
crtc = obj_to_crtc(obj); |
|
2284,6 → 2355,7 |
return drm_mode_cursor_common(dev, req, file_priv); |
} |
#endif |
|
/* Original addfb only supported RGB formats, so figure out which one */ |
uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth) |
{ |
2441,6 → 2513,8 |
case DRM_FORMAT_YVU444: |
return 0; |
default: |
DRM_DEBUG_KMS("invalid pixel format %s\n", |
drm_get_format_name(r->pixel_format)); |
return -EINVAL; |
} |
} |
2606,7 → 2680,7 |
mutex_unlock(&dev->mode_config.fb_lock); |
mutex_unlock(&file_priv->fbs_lock); |
|
return -EINVAL; |
return -ENOENT; |
} |
|
/** |
2634,7 → 2708,7 |
|
fb = drm_framebuffer_lookup(dev, r->fb_id); |
if (!fb) |
return -EINVAL; |
return -ENOENT; |
|
r->height = fb->height; |
r->width = fb->width; |
2679,7 → 2753,7 |
|
fb = drm_framebuffer_lookup(dev, r->fb_id); |
if (!fb) |
return -EINVAL; |
return -ENOENT; |
|
num_clips = r->num_clips; |
clips_ptr = (struct drm_clip_rect __user *)(unsigned long)r->clips_ptr; |
2717,10 → 2791,8 |
} |
|
if (fb->funcs->dirty) { |
drm_modeset_lock_all(dev); |
ret = fb->funcs->dirty(fb, file_priv, flags, r->color, |
clips, num_clips); |
drm_modeset_unlock_all(dev); |
} else { |
ret = -ENOSYS; |
} |
3014,7 → 3086,7 |
drm_modeset_lock_all(dev); |
obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto done; |
} |
property = obj_to_property(obj); |
3145,7 → 3217,7 |
drm_modeset_lock_all(dev); |
obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto done; |
} |
blob = obj_to_blob(obj); |
3267,7 → 3339,7 |
|
obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
if (!obj->properties) { |
3320,8 → 3392,10 |
drm_modeset_lock_all(dev); |
|
arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type); |
if (!arg_obj) |
if (!arg_obj) { |
ret = -ENOENT; |
goto out; |
} |
if (!arg_obj->properties) |
goto out; |
|
3334,8 → 3408,10 |
|
prop_obj = drm_mode_object_find(dev, arg->prop_id, |
DRM_MODE_OBJECT_PROPERTY); |
if (!prop_obj) |
if (!prop_obj) { |
ret = -ENOENT; |
goto out; |
} |
property = obj_to_property(prop_obj); |
|
if (!drm_property_change_is_valid(property, arg->value)) |
3422,7 → 3498,7 |
drm_modeset_lock_all(dev); |
obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
crtc = obj_to_crtc(obj); |
3481,7 → 3557,7 |
drm_modeset_lock_all(dev); |
obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
if (!obj) { |
ret = -EINVAL; |
ret = -ENOENT; |
goto out; |
} |
crtc = obj_to_crtc(obj); |
3601,7 → 3677,8 |
*bpp = 32; |
break; |
default: |
DRM_DEBUG_KMS("unsupported pixel format\n"); |
DRM_DEBUG_KMS("unsupported pixel format %s\n", |
drm_get_format_name(format)); |
*depth = 0; |
*bpp = 0; |
break; |