diff options
author | Dave Airlie <airlied@redhat.com> | 2014-10-20 02:30:50 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-12-08 18:56:48 -0500 |
commit | 6f134d7bb4347ab4c66ef123efb838fedb54186f (patch) | |
tree | 4e7d66d7668fef9e6d1a5714b2bba2280613418c /drivers/gpu/drm | |
parent | 40d9b043a89e2301e1f97ade055a73ecc28e9afe (diff) |
drm/tile: expose the tile property to userspace (v3)
This takes the tiling info from the connector and
exposes it to userspace, as a blob object in a
connector property.
The contents of the blob is ABI.
v2: add property + function documentation.
v3: move property setup from previous patch.
add boilerplate + fix long line (Daniel)
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 51 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_dp_mst_topology.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 2 |
3 files changed, 54 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index eb89327fb737..4a44f894f631 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -1344,6 +1344,11 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev) | |||
1344 | "PATH", 0); | 1344 | "PATH", 0); |
1345 | dev->mode_config.path_property = dev_path; | 1345 | dev->mode_config.path_property = dev_path; |
1346 | 1346 | ||
1347 | dev->mode_config.tile_property = drm_property_create(dev, | ||
1348 | DRM_MODE_PROP_BLOB | | ||
1349 | DRM_MODE_PROP_IMMUTABLE, | ||
1350 | "TILE", 0); | ||
1351 | |||
1347 | return 0; | 1352 | return 0; |
1348 | } | 1353 | } |
1349 | 1354 | ||
@@ -4088,6 +4093,52 @@ int drm_mode_connector_set_path_property(struct drm_connector *connector, | |||
4088 | EXPORT_SYMBOL(drm_mode_connector_set_path_property); | 4093 | EXPORT_SYMBOL(drm_mode_connector_set_path_property); |
4089 | 4094 | ||
4090 | /** | 4095 | /** |
4096 | * drm_mode_connector_set_tile_property - set tile property on connector | ||
4097 | * @connector: connector to set property on. | ||
4098 | * | ||
4099 | * This looks up the tile information for a connector, and creates a | ||
4100 | * property for userspace to parse if it exists. The property is of | ||
4101 | * the form of 8 integers using ':' as a separator. | ||
4102 | * | ||
4103 | * Returns: | ||
4104 | * Zero on success, errno on failure. | ||
4105 | */ | ||
4106 | int drm_mode_connector_set_tile_property(struct drm_connector *connector) | ||
4107 | { | ||
4108 | struct drm_device *dev = connector->dev; | ||
4109 | int ret, size; | ||
4110 | char tile[256]; | ||
4111 | |||
4112 | if (connector->tile_blob_ptr) | ||
4113 | drm_property_destroy_blob(dev, connector->tile_blob_ptr); | ||
4114 | |||
4115 | if (!connector->has_tile) { | ||
4116 | connector->tile_blob_ptr = NULL; | ||
4117 | ret = drm_object_property_set_value(&connector->base, | ||
4118 | dev->mode_config.tile_property, 0); | ||
4119 | return ret; | ||
4120 | } | ||
4121 | |||
4122 | snprintf(tile, 256, "%d:%d:%d:%d:%d:%d:%d:%d", | ||
4123 | connector->tile_group->id, connector->tile_is_single_monitor, | ||
4124 | connector->num_h_tile, connector->num_v_tile, | ||
4125 | connector->tile_h_loc, connector->tile_v_loc, | ||
4126 | connector->tile_h_size, connector->tile_v_size); | ||
4127 | size = strlen(tile) + 1; | ||
4128 | |||
4129 | connector->tile_blob_ptr = drm_property_create_blob(connector->dev, | ||
4130 | size, tile); | ||
4131 | if (!connector->tile_blob_ptr) | ||
4132 | return -EINVAL; | ||
4133 | |||
4134 | ret = drm_object_property_set_value(&connector->base, | ||
4135 | dev->mode_config.tile_property, | ||
4136 | connector->tile_blob_ptr->base.id); | ||
4137 | return ret; | ||
4138 | } | ||
4139 | EXPORT_SYMBOL(drm_mode_connector_set_tile_property); | ||
4140 | |||
4141 | /** | ||
4091 | * drm_mode_connector_update_edid_property - update the edid property of a connector | 4142 | * drm_mode_connector_update_edid_property - update the edid property of a connector |
4092 | * @connector: drm connector | 4143 | * @connector: drm connector |
4093 | * @edid: new value of the edid property | 4144 | * @edid: new value of the edid property |
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index 0a9d3aad3cba..9a5b68717ec8 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | |||
@@ -2236,6 +2236,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ | |||
2236 | else | 2236 | else |
2237 | edid = drm_get_edid(connector, &port->aux.ddc); | 2237 | edid = drm_get_edid(connector, &port->aux.ddc); |
2238 | 2238 | ||
2239 | drm_mode_connector_set_tile_property(connector); | ||
2239 | drm_dp_put_port(port); | 2240 | drm_dp_put_port(port); |
2240 | return edid; | 2241 | return edid; |
2241 | } | 2242 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 428bb3041621..7f8c6a66680a 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -414,6 +414,8 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo | |||
414 | intel_dp_add_properties(intel_dp, connector); | 414 | intel_dp_add_properties(intel_dp, connector); |
415 | 415 | ||
416 | drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); | 416 | drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); |
417 | drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0); | ||
418 | |||
417 | drm_mode_connector_set_path_property(connector, pathprop); | 419 | drm_mode_connector_set_path_property(connector, pathprop); |
418 | drm_reinit_primary_mode_group(dev); | 420 | drm_reinit_primary_mode_group(dev); |
419 | mutex_lock(&dev->mode_config.mutex); | 421 | mutex_lock(&dev->mode_config.mutex); |