modesetting: Use helper to fetch drmModeProperty(Blob)s
Replace the various loops to lookup drmModeProperty(Blob)s by introducing helper functions. Signed-off-by: Daniel Martin <consume.noise@gmail.com>
This commit is contained in:
parent
6abdb54a11
commit
f44935cdb7
|
@ -1187,13 +1187,57 @@ drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
|
||||||
return MODE_OK;
|
return MODE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
koutput_get_prop_idx(int fd, drmModeConnectorPtr koutput,
|
||||||
|
int type, const char *name)
|
||||||
|
{
|
||||||
|
int idx = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < koutput->count_props; i++) {
|
||||||
|
drmModePropertyPtr prop = drmModeGetProperty(fd, koutput->props[i]);
|
||||||
|
|
||||||
|
if (!prop)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (drm_property_type_is(prop, type) && !strcmp(prop->name, name))
|
||||||
|
idx = i;
|
||||||
|
|
||||||
|
drmModeFreeProperty(prop);
|
||||||
|
|
||||||
|
if (idx > -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
koutput_get_prop_id(int fd, drmModeConnectorPtr koutput,
|
||||||
|
int type, const char *name)
|
||||||
|
{
|
||||||
|
int idx = koutput_get_prop_idx(fd, koutput, type, name);
|
||||||
|
|
||||||
|
return (idx > -1) ? koutput->props[idx] : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static drmModePropertyBlobPtr
|
||||||
|
koutput_get_prop_blob(int fd, drmModeConnectorPtr koutput, const char *name)
|
||||||
|
{
|
||||||
|
drmModePropertyBlobPtr blob = NULL;
|
||||||
|
int idx = koutput_get_prop_idx(fd, koutput, DRM_MODE_PROP_BLOB, name);
|
||||||
|
|
||||||
|
if (idx > -1)
|
||||||
|
blob = drmModeGetPropertyBlob(fd, koutput->prop_values[idx]);
|
||||||
|
|
||||||
|
return blob;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drmmode_output_attach_tile(xf86OutputPtr output)
|
drmmode_output_attach_tile(xf86OutputPtr output)
|
||||||
{
|
{
|
||||||
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
||||||
drmModeConnectorPtr koutput = drmmode_output->mode_output;
|
drmModeConnectorPtr koutput = drmmode_output->mode_output;
|
||||||
drmmode_ptr drmmode = drmmode_output->drmmode;
|
drmmode_ptr drmmode = drmmode_output->drmmode;
|
||||||
int i;
|
|
||||||
struct xf86CrtcTileInfo tile_info, *set = NULL;
|
struct xf86CrtcTileInfo tile_info, *set = NULL;
|
||||||
|
|
||||||
if (!koutput) {
|
if (!koutput) {
|
||||||
|
@ -1201,25 +1245,12 @@ drmmode_output_attach_tile(xf86OutputPtr output)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drmModeFreePropertyBlob(drmmode_output->tile_blob);
|
||||||
|
|
||||||
/* look for a TILE property */
|
/* look for a TILE property */
|
||||||
for (i = 0; i < koutput->count_props; i++) {
|
drmmode_output->tile_blob =
|
||||||
drmModePropertyPtr props;
|
koutput_get_prop_blob(drmmode->fd, koutput, "TILE");
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
|
|
||||||
if (!props)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(props->flags & DRM_MODE_PROP_BLOB)) {
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp(props->name, "TILE")) {
|
|
||||||
drmModeFreePropertyBlob(drmmode_output->tile_blob);
|
|
||||||
drmmode_output->tile_blob =
|
|
||||||
drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]);
|
|
||||||
}
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
}
|
|
||||||
if (drmmode_output->tile_blob) {
|
if (drmmode_output->tile_blob) {
|
||||||
if (xf86OutputParseKMSTile(drmmode_output->tile_blob->data, drmmode_output->tile_blob->length, &tile_info) == TRUE)
|
if (xf86OutputParseKMSTile(drmmode_output->tile_blob->data, drmmode_output->tile_blob->length, &tile_info) == TRUE)
|
||||||
set = &tile_info;
|
set = &tile_info;
|
||||||
|
@ -1233,26 +1264,15 @@ has_panel_fitter(xf86OutputPtr output)
|
||||||
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
||||||
drmModeConnectorPtr koutput = drmmode_output->mode_output;
|
drmModeConnectorPtr koutput = drmmode_output->mode_output;
|
||||||
drmmode_ptr drmmode = drmmode_output->drmmode;
|
drmmode_ptr drmmode = drmmode_output->drmmode;
|
||||||
int i;
|
int idx;
|
||||||
|
|
||||||
/* Presume that if the output supports scaling, then we have a
|
/* Presume that if the output supports scaling, then we have a
|
||||||
* panel fitter capable of adjust any mode to suit.
|
* panel fitter capable of adjust any mode to suit.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < koutput->count_props; i++) {
|
idx = koutput_get_prop_idx(drmmode->fd, koutput,
|
||||||
drmModePropertyPtr props;
|
DRM_MODE_PROP_ENUM, "scaling mode");
|
||||||
Bool found = FALSE;
|
|
||||||
|
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
|
return (idx > -1);
|
||||||
if (props) {
|
|
||||||
found = strcmp(props->name, "scaling mode") == 0;
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DisplayModePtr
|
static DisplayModePtr
|
||||||
|
@ -1306,26 +1326,16 @@ drmmode_output_get_modes(xf86OutputPtr output)
|
||||||
drmmode_ptr drmmode = drmmode_output->drmmode;
|
drmmode_ptr drmmode = drmmode_output->drmmode;
|
||||||
int i;
|
int i;
|
||||||
DisplayModePtr Modes = NULL, Mode;
|
DisplayModePtr Modes = NULL, Mode;
|
||||||
drmModePropertyPtr props;
|
|
||||||
xf86MonPtr mon = NULL;
|
xf86MonPtr mon = NULL;
|
||||||
|
|
||||||
if (!koutput)
|
if (!koutput)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
drmModeFreePropertyBlob(drmmode_output->edid_blob);
|
||||||
|
|
||||||
/* look for an EDID property */
|
/* look for an EDID property */
|
||||||
for (i = 0; i < koutput->count_props; i++) {
|
drmmode_output->edid_blob =
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
|
koutput_get_prop_blob(drmmode->fd, koutput, "EDID");
|
||||||
if (props && (props->flags & DRM_MODE_PROP_BLOB)) {
|
|
||||||
if (!strcmp(props->name, "EDID")) {
|
|
||||||
if (drmmode_output->edid_blob)
|
|
||||||
drmModeFreePropertyBlob(drmmode_output->edid_blob);
|
|
||||||
drmmode_output->edid_blob =
|
|
||||||
drmModeGetPropertyBlob(drmmode->fd,
|
|
||||||
koutput->prop_values[i]);
|
|
||||||
}
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (drmmode_output->edid_blob) {
|
if (drmmode_output->edid_blob) {
|
||||||
mon = xf86InterpretEDID(output->scrn->scrnIndex,
|
mon = xf86InterpretEDID(output->scrn->scrnIndex,
|
||||||
|
@ -1706,7 +1716,6 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
|
||||||
drmModeConnectorPtr koutput;
|
drmModeConnectorPtr koutput;
|
||||||
drmModeEncoderPtr *kencoders = NULL;
|
drmModeEncoderPtr *kencoders = NULL;
|
||||||
drmmode_output_private_ptr drmmode_output;
|
drmmode_output_private_ptr drmmode_output;
|
||||||
drmModePropertyPtr props;
|
|
||||||
char name[32];
|
char name[32];
|
||||||
int i;
|
int i;
|
||||||
drmModePropertyBlobPtr path_blob = NULL;
|
drmModePropertyBlobPtr path_blob = NULL;
|
||||||
|
@ -1716,17 +1725,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
|
||||||
if (!koutput)
|
if (!koutput)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < koutput->count_props; i++) {
|
path_blob = koutput_get_prop_blob(drmmode->fd, koutput, "PATH");
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
|
|
||||||
if (props && (props->flags & DRM_MODE_PROP_BLOB)) {
|
|
||||||
if (!strcmp(props->name, "PATH")) {
|
|
||||||
path_blob = drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]);
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drmmode_create_name(pScrn, koutput, name, path_blob);
|
drmmode_create_name(pScrn, koutput, name, path_blob);
|
||||||
|
|
||||||
|
@ -1803,17 +1802,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
|
||||||
/* work out the possible clones later */
|
/* work out the possible clones later */
|
||||||
output->possible_clones = 0;
|
output->possible_clones = 0;
|
||||||
|
|
||||||
for (i = 0; i < koutput->count_props; i++) {
|
drmmode_output->dpms_enum_id =
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
|
koutput_get_prop_id(drmmode->fd, koutput, DRM_MODE_PROP_ENUM, "DPMS");
|
||||||
if (props && (props->flags & DRM_MODE_PROP_ENUM)) {
|
|
||||||
if (!strcmp(props->name, "DPMS")) {
|
|
||||||
drmmode_output->dpms_enum_id = koutput->props[i];
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
drmModeFreeProperty(props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dynamic)
|
if (dynamic)
|
||||||
output->randr_output = RROutputCreate(xf86ScrnToScreen(pScrn), output->name, strlen(output->name), output);
|
output->randr_output = RROutputCreate(xf86ScrnToScreen(pScrn), output->name, strlen(output->name), output);
|
||||||
|
@ -2273,7 +2263,7 @@ drmmode_handle_uevents(int fd, void *closure)
|
||||||
xf86OutputPtr output = config->output[i];
|
xf86OutputPtr output = config->output[i];
|
||||||
xf86CrtcPtr crtc = output->crtc;
|
xf86CrtcPtr crtc = output->crtc;
|
||||||
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
drmmode_output_private_ptr drmmode_output = output->driver_private;
|
||||||
uint32_t con_id;
|
uint32_t con_id, idx;
|
||||||
drmModeConnectorPtr koutput;
|
drmModeConnectorPtr koutput;
|
||||||
|
|
||||||
if (crtc == NULL || drmmode_output->mode_output == NULL)
|
if (crtc == NULL || drmmode_output->mode_output == NULL)
|
||||||
|
@ -2284,23 +2274,24 @@ drmmode_handle_uevents(int fd, void *closure)
|
||||||
* look for the link-status property
|
* look for the link-status property
|
||||||
*/
|
*/
|
||||||
koutput = drmModeGetConnectorCurrent(drmmode->fd, con_id);
|
koutput = drmModeGetConnectorCurrent(drmmode->fd, con_id);
|
||||||
for (j = 0; koutput && j < koutput->count_props; j++) {
|
if (!koutput)
|
||||||
drmModePropertyPtr props;
|
continue;
|
||||||
props = drmModeGetProperty(drmmode->fd, koutput->props[j]);
|
|
||||||
if (props && props->flags & DRM_MODE_PROP_ENUM &&
|
|
||||||
!strcmp(props->name, "link-status") &&
|
|
||||||
koutput->prop_values[j] == DRM_MODE_LINK_STATUS_BAD) {
|
|
||||||
/* the connector got a link failure, re-set the current mode */
|
|
||||||
drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation,
|
|
||||||
crtc->x, crtc->y);
|
|
||||||
|
|
||||||
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
idx = koutput_get_prop_idx(drmmode->fd, koutput,
|
||||||
"hotplug event: connector %u's link-state is BAD, "
|
DRM_MODE_PROP_ENUM, "link-status");
|
||||||
"tried resetting the current mode. You may be left"
|
|
||||||
"with a black screen if this fails...\n", con_id);
|
if ((idx > -1) &&
|
||||||
}
|
(koutput->prop_values[idx] == DRM_MODE_LINK_STATUS_BAD)) {
|
||||||
drmModeFreeProperty(props);
|
/* the connector got a link failure, re-set the current mode */
|
||||||
|
drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation,
|
||||||
|
crtc->x, crtc->y);
|
||||||
|
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
|
||||||
|
"hotplug event: connector %u's link-state is BAD, "
|
||||||
|
"tried resetting the current mode. You may be left"
|
||||||
|
"with a black screen if this fails...\n", con_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
drmModeFreeConnector(koutput);
|
drmModeFreeConnector(koutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue