forked from Minki/linux
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>
This commit is contained in:
parent
40d9b043a8
commit
6f134d7bb4
@ -2551,7 +2551,7 @@ void intel_crt_init(struct drm_device *dev)
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="23" valign="top" >DRM</td>
|
||||
<td rowspan="3" valign="top" >Generic</td>
|
||||
<td rowspan="4" valign="top" >Generic</td>
|
||||
<td valign="top" >“EDID”</td>
|
||||
<td valign="top" >BLOB | IMMUTABLE</td>
|
||||
<td valign="top" >0</td>
|
||||
@ -2573,6 +2573,13 @@ void intel_crt_init(struct drm_device *dev)
|
||||
<td valign="top" >Contains topology path to a connector.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" >“TILE”</td>
|
||||
<td valign="top" >BLOB | IMMUTABLE</td>
|
||||
<td valign="top" >0</td>
|
||||
<td valign="top" >Connector</td>
|
||||
<td valign="top" >Contains tiling information for a connector.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="1" valign="top" >Plane</td>
|
||||
<td valign="top" >“type”</td>
|
||||
<td valign="top" >ENUM | IMMUTABLE</td>
|
||||
|
@ -1344,6 +1344,11 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
|
||||
"PATH", 0);
|
||||
dev->mode_config.path_property = dev_path;
|
||||
|
||||
dev->mode_config.tile_property = drm_property_create(dev,
|
||||
DRM_MODE_PROP_BLOB |
|
||||
DRM_MODE_PROP_IMMUTABLE,
|
||||
"TILE", 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4087,6 +4092,52 @@ int drm_mode_connector_set_path_property(struct drm_connector *connector,
|
||||
}
|
||||
EXPORT_SYMBOL(drm_mode_connector_set_path_property);
|
||||
|
||||
/**
|
||||
* drm_mode_connector_set_tile_property - set tile property on connector
|
||||
* @connector: connector to set property on.
|
||||
*
|
||||
* This looks up the tile information for a connector, and creates a
|
||||
* property for userspace to parse if it exists. The property is of
|
||||
* the form of 8 integers using ':' as a separator.
|
||||
*
|
||||
* Returns:
|
||||
* Zero on success, errno on failure.
|
||||
*/
|
||||
int drm_mode_connector_set_tile_property(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
int ret, size;
|
||||
char tile[256];
|
||||
|
||||
if (connector->tile_blob_ptr)
|
||||
drm_property_destroy_blob(dev, connector->tile_blob_ptr);
|
||||
|
||||
if (!connector->has_tile) {
|
||||
connector->tile_blob_ptr = NULL;
|
||||
ret = drm_object_property_set_value(&connector->base,
|
||||
dev->mode_config.tile_property, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
snprintf(tile, 256, "%d:%d:%d:%d:%d:%d:%d:%d",
|
||||
connector->tile_group->id, connector->tile_is_single_monitor,
|
||||
connector->num_h_tile, connector->num_v_tile,
|
||||
connector->tile_h_loc, connector->tile_v_loc,
|
||||
connector->tile_h_size, connector->tile_v_size);
|
||||
size = strlen(tile) + 1;
|
||||
|
||||
connector->tile_blob_ptr = drm_property_create_blob(connector->dev,
|
||||
size, tile);
|
||||
if (!connector->tile_blob_ptr)
|
||||
return -EINVAL;
|
||||
|
||||
ret = drm_object_property_set_value(&connector->base,
|
||||
dev->mode_config.tile_property,
|
||||
connector->tile_blob_ptr->base.id);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_mode_connector_set_tile_property);
|
||||
|
||||
/**
|
||||
* drm_mode_connector_update_edid_property - update the edid property of a connector
|
||||
* @connector: drm connector
|
||||
|
@ -2236,6 +2236,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
|
||||
else
|
||||
edid = drm_get_edid(connector, &port->aux.ddc);
|
||||
|
||||
drm_mode_connector_set_tile_property(connector);
|
||||
drm_dp_put_port(port);
|
||||
return edid;
|
||||
}
|
||||
|
@ -414,6 +414,8 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
|
||||
intel_dp_add_properties(intel_dp, connector);
|
||||
|
||||
drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0);
|
||||
drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0);
|
||||
|
||||
drm_mode_connector_set_path_property(connector, pathprop);
|
||||
drm_reinit_primary_mode_group(dev);
|
||||
mutex_lock(&dev->mode_config.mutex);
|
||||
|
@ -651,6 +651,8 @@ struct drm_connector {
|
||||
|
||||
struct drm_property_blob *path_blob_ptr;
|
||||
|
||||
struct drm_property_blob *tile_blob_ptr;
|
||||
|
||||
uint8_t polled; /* DRM_CONNECTOR_POLL_* */
|
||||
|
||||
/* requested DPMS state */
|
||||
@ -1048,6 +1050,7 @@ struct drm_mode_config {
|
||||
struct drm_property *edid_property;
|
||||
struct drm_property *dpms_property;
|
||||
struct drm_property *path_property;
|
||||
struct drm_property *tile_property;
|
||||
struct drm_property *plane_type_property;
|
||||
struct drm_property *rotation_property;
|
||||
|
||||
@ -1217,6 +1220,7 @@ extern void drm_mode_config_cleanup(struct drm_device *dev);
|
||||
|
||||
extern int drm_mode_connector_set_path_property(struct drm_connector *connector,
|
||||
const char *path);
|
||||
int drm_mode_connector_set_tile_property(struct drm_connector *connector);
|
||||
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
|
||||
const struct edid *edid);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user