Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os 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>

+66 -1
+8 -1
Documentation/DocBook/drm.tmpl
··· 2551 2551 </tr> 2552 2552 <tr> 2553 2553 <td rowspan="23" valign="top" >DRM</td> 2554 - <td rowspan="3" valign="top" >Generic</td> 2554 + <td rowspan="4" valign="top" >Generic</td> 2555 2555 <td valign="top" >“EDID”</td> 2556 2556 <td valign="top" >BLOB | IMMUTABLE</td> 2557 2557 <td valign="top" >0</td> ··· 2571 2571 <td valign="top" >0</td> 2572 2572 <td valign="top" >Connector</td> 2573 2573 <td valign="top" >Contains topology path to a connector.</td> 2574 + </tr> 2575 + <tr> 2576 + <td valign="top" >“TILE”</td> 2577 + <td valign="top" >BLOB | IMMUTABLE</td> 2578 + <td valign="top" >0</td> 2579 + <td valign="top" >Connector</td> 2580 + <td valign="top" >Contains tiling information for a connector.</td> 2574 2581 </tr> 2575 2582 <tr> 2576 2583 <td rowspan="1" valign="top" >Plane</td>
+51
drivers/gpu/drm/drm_crtc.c
··· 1344 1344 "PATH", 0); 1345 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 1352 return 0; 1348 1353 } 1349 1354 ··· 4091 4086 return ret; 4092 4087 } 4093 4088 EXPORT_SYMBOL(drm_mode_connector_set_path_property); 4089 + 4090 + /** 4091 + * drm_mode_connector_set_tile_property - set tile property on connector 4092 + * @connector: connector to set property on. 4093 + * 4094 + * This looks up the tile information for a connector, and creates a 4095 + * property for userspace to parse if it exists. The property is of 4096 + * the form of 8 integers using ':' as a separator. 4097 + * 4098 + * Returns: 4099 + * Zero on success, errno on failure. 4100 + */ 4101 + int drm_mode_connector_set_tile_property(struct drm_connector *connector) 4102 + { 4103 + struct drm_device *dev = connector->dev; 4104 + int ret, size; 4105 + char tile[256]; 4106 + 4107 + if (connector->tile_blob_ptr) 4108 + drm_property_destroy_blob(dev, connector->tile_blob_ptr); 4109 + 4110 + if (!connector->has_tile) { 4111 + connector->tile_blob_ptr = NULL; 4112 + ret = drm_object_property_set_value(&connector->base, 4113 + dev->mode_config.tile_property, 0); 4114 + return ret; 4115 + } 4116 + 4117 + snprintf(tile, 256, "%d:%d:%d:%d:%d:%d:%d:%d", 4118 + connector->tile_group->id, connector->tile_is_single_monitor, 4119 + connector->num_h_tile, connector->num_v_tile, 4120 + connector->tile_h_loc, connector->tile_v_loc, 4121 + connector->tile_h_size, connector->tile_v_size); 4122 + size = strlen(tile) + 1; 4123 + 4124 + connector->tile_blob_ptr = drm_property_create_blob(connector->dev, 4125 + size, tile); 4126 + if (!connector->tile_blob_ptr) 4127 + return -EINVAL; 4128 + 4129 + ret = drm_object_property_set_value(&connector->base, 4130 + dev->mode_config.tile_property, 4131 + connector->tile_blob_ptr->base.id); 4132 + return ret; 4133 + } 4134 + EXPORT_SYMBOL(drm_mode_connector_set_tile_property); 4094 4135 4095 4136 /** 4096 4137 * drm_mode_connector_update_edid_property - update the edid property of a connector
+1
drivers/gpu/drm/drm_dp_mst_topology.c
··· 2236 2236 else 2237 2237 edid = drm_get_edid(connector, &port->aux.ddc); 2238 2238 2239 + drm_mode_connector_set_tile_property(connector); 2239 2240 drm_dp_put_port(port); 2240 2241 return edid; 2241 2242 }
+2
drivers/gpu/drm/i915/intel_dp_mst.c
··· 414 414 intel_dp_add_properties(intel_dp, connector); 415 415 416 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 419 drm_mode_connector_set_path_property(connector, pathprop); 418 420 drm_reinit_primary_mode_group(dev); 419 421 mutex_lock(&dev->mode_config.mutex);
+4
include/drm/drm_crtc.h
··· 651 651 652 652 struct drm_property_blob *path_blob_ptr; 653 653 654 + struct drm_property_blob *tile_blob_ptr; 655 + 654 656 uint8_t polled; /* DRM_CONNECTOR_POLL_* */ 655 657 656 658 /* requested DPMS state */ ··· 1050 1048 struct drm_property *edid_property; 1051 1049 struct drm_property *dpms_property; 1052 1050 struct drm_property *path_property; 1051 + struct drm_property *tile_property; 1053 1052 struct drm_property *plane_type_property; 1054 1053 struct drm_property *rotation_property; 1055 1054 ··· 1220 1217 1221 1218 extern int drm_mode_connector_set_path_property(struct drm_connector *connector, 1222 1219 const char *path); 1220 + int drm_mode_connector_set_tile_property(struct drm_connector *connector); 1223 1221 extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, 1224 1222 const struct edid *edid); 1225 1223