mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-30 19:06:14 +00:00
drm: Move tile group code into drm_connector.c
And also put the overview section into the KMS Properties part of the docs, instead of randomly-placed within the helpers - this is part of the uabi. With this patch I think drm_crtc.[hc] is cleaned up and entirely documented. Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
This commit is contained in:
parent
28575f165d
commit
9498c19b3f
6 changed files with 134 additions and 122 deletions
|
@ -261,14 +261,6 @@ Plane Helper Reference
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_plane_helper.c
|
.. kernel-doc:: drivers/gpu/drm/drm_plane_helper.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
Tile group
|
|
||||||
==========
|
|
||||||
|
|
||||||
# FIXME: This should probably be moved into a property documentation section
|
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
|
|
||||||
:doc: Tile group
|
|
||||||
|
|
||||||
Auxiliary Modeset Helpers
|
Auxiliary Modeset Helpers
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
|
|
|
@ -281,6 +281,12 @@ Color Management Properties
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
|
.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
Tile Group Property
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_connector.c
|
||||||
|
:doc: Tile group
|
||||||
|
|
||||||
Existing KMS Properties
|
Existing KMS Properties
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|
|
@ -1121,3 +1121,107 @@ out_unlock:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DOC: Tile group
|
||||||
|
*
|
||||||
|
* Tile groups are used to represent tiled monitors with a unique integer
|
||||||
|
* identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
|
||||||
|
* we store this in a tile group, so we have a common identifier for all tiles
|
||||||
|
* in a monitor group. The property is called "TILE". Drivers can manage tile
|
||||||
|
* groups using drm_mode_create_tile_group(), drm_mode_put_tile_group() and
|
||||||
|
* drm_mode_get_tile_group(). But this is only needed for internal panels where
|
||||||
|
* the tile group information is exposed through a non-standard way.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void drm_tile_group_free(struct kref *kref)
|
||||||
|
{
|
||||||
|
struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
|
||||||
|
struct drm_device *dev = tg->dev;
|
||||||
|
mutex_lock(&dev->mode_config.idr_mutex);
|
||||||
|
idr_remove(&dev->mode_config.tile_idr, tg->id);
|
||||||
|
mutex_unlock(&dev->mode_config.idr_mutex);
|
||||||
|
kfree(tg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_mode_put_tile_group - drop a reference to a tile group.
|
||||||
|
* @dev: DRM device
|
||||||
|
* @tg: tile group to drop reference to.
|
||||||
|
*
|
||||||
|
* drop reference to tile group and free if 0.
|
||||||
|
*/
|
||||||
|
void drm_mode_put_tile_group(struct drm_device *dev,
|
||||||
|
struct drm_tile_group *tg)
|
||||||
|
{
|
||||||
|
kref_put(&tg->refcount, drm_tile_group_free);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_mode_put_tile_group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_mode_get_tile_group - get a reference to an existing tile group
|
||||||
|
* @dev: DRM device
|
||||||
|
* @topology: 8-bytes unique per monitor.
|
||||||
|
*
|
||||||
|
* Use the unique bytes to get a reference to an existing tile group.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* tile group or NULL if not found.
|
||||||
|
*/
|
||||||
|
struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
|
||||||
|
char topology[8])
|
||||||
|
{
|
||||||
|
struct drm_tile_group *tg;
|
||||||
|
int id;
|
||||||
|
mutex_lock(&dev->mode_config.idr_mutex);
|
||||||
|
idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
|
||||||
|
if (!memcmp(tg->group_data, topology, 8)) {
|
||||||
|
if (!kref_get_unless_zero(&tg->refcount))
|
||||||
|
tg = NULL;
|
||||||
|
mutex_unlock(&dev->mode_config.idr_mutex);
|
||||||
|
return tg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex_unlock(&dev->mode_config.idr_mutex);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_mode_get_tile_group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_mode_create_tile_group - create a tile group from a displayid description
|
||||||
|
* @dev: DRM device
|
||||||
|
* @topology: 8-bytes unique per monitor.
|
||||||
|
*
|
||||||
|
* Create a tile group for the unique monitor, and get a unique
|
||||||
|
* identifier for the tile group.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* new tile group or error.
|
||||||
|
*/
|
||||||
|
struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
|
||||||
|
char topology[8])
|
||||||
|
{
|
||||||
|
struct drm_tile_group *tg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
tg = kzalloc(sizeof(*tg), GFP_KERNEL);
|
||||||
|
if (!tg)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
kref_init(&tg->refcount);
|
||||||
|
memcpy(tg->group_data, topology, 8);
|
||||||
|
tg->dev = dev;
|
||||||
|
|
||||||
|
mutex_lock(&dev->mode_config.idr_mutex);
|
||||||
|
ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
|
||||||
|
if (ret >= 0) {
|
||||||
|
tg->id = ret;
|
||||||
|
} else {
|
||||||
|
kfree(tg);
|
||||||
|
tg = ERR_PTR(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&dev->mode_config.idr_mutex);
|
||||||
|
return tg;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_mode_create_tile_group);
|
||||||
|
|
|
@ -625,102 +625,3 @@ int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* DOC: Tile group
|
|
||||||
*
|
|
||||||
* Tile groups are used to represent tiled monitors with a unique
|
|
||||||
* integer identifier. Tiled monitors using DisplayID v1.3 have
|
|
||||||
* a unique 8-byte handle, we store this in a tile group, so we
|
|
||||||
* have a common identifier for all tiles in a monitor group.
|
|
||||||
*/
|
|
||||||
static void drm_tile_group_free(struct kref *kref)
|
|
||||||
{
|
|
||||||
struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
|
|
||||||
struct drm_device *dev = tg->dev;
|
|
||||||
mutex_lock(&dev->mode_config.idr_mutex);
|
|
||||||
idr_remove(&dev->mode_config.tile_idr, tg->id);
|
|
||||||
mutex_unlock(&dev->mode_config.idr_mutex);
|
|
||||||
kfree(tg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_mode_put_tile_group - drop a reference to a tile group.
|
|
||||||
* @dev: DRM device
|
|
||||||
* @tg: tile group to drop reference to.
|
|
||||||
*
|
|
||||||
* drop reference to tile group and free if 0.
|
|
||||||
*/
|
|
||||||
void drm_mode_put_tile_group(struct drm_device *dev,
|
|
||||||
struct drm_tile_group *tg)
|
|
||||||
{
|
|
||||||
kref_put(&tg->refcount, drm_tile_group_free);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_mode_get_tile_group - get a reference to an existing tile group
|
|
||||||
* @dev: DRM device
|
|
||||||
* @topology: 8-bytes unique per monitor.
|
|
||||||
*
|
|
||||||
* Use the unique bytes to get a reference to an existing tile group.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* tile group or NULL if not found.
|
|
||||||
*/
|
|
||||||
struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
|
|
||||||
char topology[8])
|
|
||||||
{
|
|
||||||
struct drm_tile_group *tg;
|
|
||||||
int id;
|
|
||||||
mutex_lock(&dev->mode_config.idr_mutex);
|
|
||||||
idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
|
|
||||||
if (!memcmp(tg->group_data, topology, 8)) {
|
|
||||||
if (!kref_get_unless_zero(&tg->refcount))
|
|
||||||
tg = NULL;
|
|
||||||
mutex_unlock(&dev->mode_config.idr_mutex);
|
|
||||||
return tg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&dev->mode_config.idr_mutex);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_mode_get_tile_group);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_mode_create_tile_group - create a tile group from a displayid description
|
|
||||||
* @dev: DRM device
|
|
||||||
* @topology: 8-bytes unique per monitor.
|
|
||||||
*
|
|
||||||
* Create a tile group for the unique monitor, and get a unique
|
|
||||||
* identifier for the tile group.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* new tile group or error.
|
|
||||||
*/
|
|
||||||
struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
|
|
||||||
char topology[8])
|
|
||||||
{
|
|
||||||
struct drm_tile_group *tg;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
tg = kzalloc(sizeof(*tg), GFP_KERNEL);
|
|
||||||
if (!tg)
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
|
|
||||||
kref_init(&tg->refcount);
|
|
||||||
memcpy(tg->group_data, topology, 8);
|
|
||||||
tg->dev = dev;
|
|
||||||
|
|
||||||
mutex_lock(&dev->mode_config.idr_mutex);
|
|
||||||
ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
|
|
||||||
if (ret >= 0) {
|
|
||||||
tg->id = ret;
|
|
||||||
} else {
|
|
||||||
kfree(tg);
|
|
||||||
tg = ERR_PTR(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_unlock(&dev->mode_config.idr_mutex);
|
|
||||||
return tg;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_mode_create_tile_group);
|
|
||||||
|
|
|
@ -774,6 +774,30 @@ int drm_mode_connector_set_tile_property(struct drm_connector *connector);
|
||||||
int drm_mode_connector_update_edid_property(struct drm_connector *connector,
|
int drm_mode_connector_update_edid_property(struct drm_connector *connector,
|
||||||
const struct edid *edid);
|
const struct edid *edid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct drm_tile_group - Tile group metadata
|
||||||
|
* @refcount: reference count
|
||||||
|
* @dev: DRM device
|
||||||
|
* @id: tile group id exposed to userspace
|
||||||
|
* @group_data: Sink-private data identifying this group
|
||||||
|
*
|
||||||
|
* @group_data corresponds to displayid vend/prod/serial for external screens
|
||||||
|
* with an EDID.
|
||||||
|
*/
|
||||||
|
struct drm_tile_group {
|
||||||
|
struct kref refcount;
|
||||||
|
struct drm_device *dev;
|
||||||
|
int id;
|
||||||
|
u8 group_data[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
|
||||||
|
char topology[8]);
|
||||||
|
struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
|
||||||
|
char topology[8]);
|
||||||
|
void drm_mode_put_tile_group(struct drm_device *dev,
|
||||||
|
struct drm_tile_group *tg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_for_each_connector - iterate over all connectors
|
* drm_for_each_connector - iterate over all connectors
|
||||||
* @connector: the loop cursor
|
* @connector: the loop cursor
|
||||||
|
|
|
@ -67,14 +67,6 @@ static inline uint64_t I642U64(int64_t val)
|
||||||
return (uint64_t)*((uint64_t *)&val);
|
return (uint64_t)*((uint64_t *)&val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* data corresponds to displayid vend/prod/serial */
|
|
||||||
struct drm_tile_group {
|
|
||||||
struct kref refcount;
|
|
||||||
struct drm_device *dev;
|
|
||||||
int id;
|
|
||||||
u8 group_data[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct drm_crtc;
|
struct drm_crtc;
|
||||||
struct drm_encoder;
|
struct drm_encoder;
|
||||||
struct drm_pending_vblank_event;
|
struct drm_pending_vblank_event;
|
||||||
|
@ -810,13 +802,6 @@ extern int drm_crtc_force_disable_all(struct drm_device *dev);
|
||||||
|
|
||||||
extern int drm_mode_set_config_internal(struct drm_mode_set *set);
|
extern int drm_mode_set_config_internal(struct drm_mode_set *set);
|
||||||
|
|
||||||
extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
|
|
||||||
char topology[8]);
|
|
||||||
extern struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
|
|
||||||
char topology[8]);
|
|
||||||
extern void drm_mode_put_tile_group(struct drm_device *dev,
|
|
||||||
struct drm_tile_group *tg);
|
|
||||||
|
|
||||||
/* Helpers */
|
/* Helpers */
|
||||||
static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
|
static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
|
||||||
uint32_t id)
|
uint32_t id)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue