summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Martin <consume.noise@gmail.com>2017-10-23 10:31:21 +0200
committerMichel Dänzer <michel@daenzer.net>2018-03-02 12:00:05 +0100
commitfb58e06acd6c6bd59de2dbdadbca27eb1dd0025b (patch)
tree30375047a2c9d1ab407ca112f90f590073fad8e5 /src
parent7854ace03f12207600ec8159ef8b2c5a562c4aee (diff)
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> (Ported from xserver commit f44935cdb7321af242ce9f242975f096807b97f7) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src')
-rw-r--r--src/drmmode_display.c128
1 files changed, 70 insertions, 58 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index db4f15c..98d2039 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1402,6 +1402,51 @@ drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
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 DisplayModePtr drmmode_output_get_modes(xf86OutputPtr output)
{
drmmode_output_private_ptr drmmode_output = output->driver_private;
@@ -1409,29 +1454,16 @@ static DisplayModePtr drmmode_output_get_modes(xf86OutputPtr output)
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(output->scrn);
int i;
DisplayModePtr Modes = NULL, Mode;
- drmModePropertyPtr props;
xf86MonPtr mon = NULL;
if (!koutput)
return NULL;
+ drmModeFreePropertyBlob(drmmode_output->edid_blob);
+
/* look for an EDID property */
- for (i = 0; i < koutput->count_props; i++) {
- props = drmModeGetProperty(pAMDGPUEnt->fd, koutput->props[i]);
- 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(pAMDGPUEnt->fd,
- koutput->prop_values
- [i]);
- }
- }
- if (props)
- drmModeFreeProperty(props);
- }
+ drmmode_output->edid_blob =
+ koutput_get_prop_blob(pAMDGPUEnt->fd, koutput, "EDID");
if (drmmode_output->edid_blob) {
mon = xf86InterpretEDID(output->scrn->scrnIndex,
@@ -1875,7 +1907,6 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
drmModeConnectorPtr koutput;
drmModeEncoderPtr *kencoders = NULL;
drmmode_output_private_ptr drmmode_output;
- drmModePropertyPtr props;
drmModePropertyBlobPtr path_blob = NULL;
char name[32];
int i;
@@ -1887,17 +1918,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
if (!koutput)
return 0;
- for (i = 0; i < koutput->count_props; i++) {
- props = drmModeGetProperty(pAMDGPUEnt->fd, koutput->props[i]);
- if (props && (props->flags & DRM_MODE_PROP_BLOB)) {
- if (!strcmp(props->name, "PATH")) {
- path_blob = drmModeGetPropertyBlob(pAMDGPUEnt->fd, koutput->prop_values[i]);
- drmModeFreeProperty(props);
- break;
- }
- }
- drmModeFreeProperty(props);
- }
+ path_blob = koutput_get_prop_blob(pAMDGPUEnt->fd, koutput, "PATH");
kencoders = calloc(sizeof(drmModeEncoderPtr), koutput->count_encoders);
if (!kencoders) {
@@ -1981,18 +2002,9 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
/* work out the possible clones later */
output->possible_clones = 0;
- for (i = 0; i < koutput->count_props; i++) {
- props = drmModeGetProperty(pAMDGPUEnt->fd, koutput->props[i]);
- 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);
- }
+ drmmode_output->dpms_enum_id =
+ koutput_get_prop_id(pAMDGPUEnt->fd, koutput, DRM_MODE_PROP_ENUM,
+ "DPMS");
if (dynamic) {
output->randr_output = RROutputCreate(xf86ScrnToScreen(pScrn), output->name, strlen(output->name), output);
@@ -2693,7 +2705,7 @@ amdgpu_mode_hotplug(ScrnInfoPtr scrn, drmmode_ptr drmmode)
xf86OutputPtr output = config->output[i];
xf86CrtcPtr crtc = output->crtc;
drmmode_output_private_ptr drmmode_output = output->driver_private;
- uint32_t con_id;
+ uint32_t con_id, idx;
drmModeConnectorPtr koutput;
if (!crtc || !drmmode_output->mode_output)
@@ -2704,22 +2716,22 @@ amdgpu_mode_hotplug(ScrnInfoPtr scrn, drmmode_ptr drmmode)
* look for the link-status property
*/
koutput = drmModeGetConnectorCurrent(pAMDGPUEnt->fd, con_id);
- for (j = 0; koutput && j < koutput->count_props; j++) {
- drmModePropertyPtr props;
- props = drmModeGetProperty(pAMDGPUEnt->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,
- "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);
- }
- drmModeFreeProperty(props);
+ if (!koutput)
+ continue;
+
+ idx = koutput_get_prop_idx(pAMDGPUEnt->fd, koutput,
+ DRM_MODE_PROP_ENUM, "link-status");
+
+ if ((idx > -1) &&
+ (koutput->prop_values[idx] == 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,
+ "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);
}