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