lib/igt_kms, tests/testdisplay: allow probing of new connector modes

Fixup some fallout from the connector probing changes so testdisplay -m
will pick up newly hotplugged displays correctly.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org.
This commit is contained in:
Jesse Barnes 2016-01-14 14:03:53 -08:00
parent e2c9a023f2
commit e28acefc5c
5 changed files with 67 additions and 14 deletions

View File

@ -533,18 +533,20 @@ bool kmstest_get_connector_default_mode(int drm_fd, drmModeConnector *connector,
} }
/** /**
* kmstest_get_connector_config: * _kmstest_connector_config:
* @drm_fd: DRM fd * @drm_fd: DRM fd
* @connector_id: DRM connector id * @connector_id: DRM connector id
* @crtc_idx_mask: mask of allowed DRM CRTC indices * @crtc_idx_mask: mask of allowed DRM CRTC indices
* @config: structure filled with the possible configuration * @config: structure filled with the possible configuration
* @probe: whether to fully re-probe mode list or not
* *
* This tries to find a suitable configuration for the given connector and CRTC * This tries to find a suitable configuration for the given connector and CRTC
* constraint and fills it into @config. * constraint and fills it into @config.
*/ */
bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id, static bool _kmstest_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask, unsigned long crtc_idx_mask,
struct kmstest_connector_config *config) struct kmstest_connector_config *config,
bool probe)
{ {
drmModeRes *resources; drmModeRes *resources;
drmModeConnector *connector; drmModeConnector *connector;
@ -558,7 +560,11 @@ bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
} }
/* First, find the connector & mode */ /* First, find the connector & mode */
connector = drmModeGetConnectorCurrent(drm_fd, connector_id); if (probe)
connector = drmModeGetConnector(drm_fd, connector_id);
else
connector = drmModeGetConnectorCurrent(drm_fd, connector_id);
if (!connector) if (!connector)
goto err2; goto err2;
@ -633,6 +639,43 @@ err1:
return false; return false;
} }
/**
* kmstest_get_connector_config:
* @drm_fd: DRM fd
* @connector_id: DRM connector id
* @crtc_idx_mask: mask of allowed DRM CRTC indices
* @config: structure filled with the possible configuration
*
* This tries to find a suitable configuration for the given connector and CRTC
* constraint and fills it into @config.
*/
bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask,
struct kmstest_connector_config *config)
{
return _kmstest_connector_config(drm_fd, connector_id, crtc_idx_mask,
config, 0);
}
/**
* kmstest_probe_connector_config:
* @drm_fd: DRM fd
* @connector_id: DRM connector id
* @crtc_idx_mask: mask of allowed DRM CRTC indices
* @config: structure filled with the possible configuration
*
* This tries to find a suitable configuration for the given connector and CRTC
* constraint and fills it into @config, fully probing the connector in the
* process.
*/
bool kmstest_probe_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask,
struct kmstest_connector_config *config)
{
return _kmstest_connector_config(drm_fd, connector_id, crtc_idx_mask,
config, 1);
}
/** /**
* kmstest_free_connector_config: * kmstest_free_connector_config:
* @config: connector configuration structure * @config: connector configuration structure

View File

@ -140,6 +140,9 @@ bool kmstest_get_connector_default_mode(int drm_fd, drmModeConnector *connector,
bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id, bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask, unsigned long crtc_idx_mask,
struct kmstest_connector_config *config); struct kmstest_connector_config *config);
bool kmstest_probe_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask,
struct kmstest_connector_config *config);
void kmstest_free_connector_config(struct kmstest_connector_config *config); void kmstest_free_connector_config(struct kmstest_connector_config *config);
void kmstest_set_connector_dpms(int fd, drmModeConnector *connector, int mode); void kmstest_set_connector_dpms(int fd, drmModeConnector *connector, int mode);

View File

@ -191,12 +191,19 @@ static void dump_info(void)
static void connector_find_preferred_mode(uint32_t connector_id, static void connector_find_preferred_mode(uint32_t connector_id,
unsigned long crtc_idx_mask, unsigned long crtc_idx_mask,
int mode_num, struct connector *c) int mode_num, struct connector *c,
bool probe)
{ {
struct kmstest_connector_config config; struct kmstest_connector_config config;
bool ret;
if (!kmstest_get_connector_config(drm_fd, connector_id, crtc_idx_mask, if (probe)
&config)) { ret = kmstest_probe_connector_config(drm_fd, connector_id,
crtc_idx_mask, &config);
else
ret = kmstest_get_connector_config(drm_fd, connector_id,
crtc_idx_mask, &config);
if (!ret) {
c->mode_valid = 0; c->mode_valid = 0;
return; return;
} }
@ -456,7 +463,7 @@ set_stereo_mode(struct connector *c)
* Each connector has a corresponding encoder, except in the SDVO case * Each connector has a corresponding encoder, except in the SDVO case
* where an encoder may have multiple connectors. * where an encoder may have multiple connectors.
*/ */
int update_display(void) int update_display(bool probe)
{ {
struct connector *connectors; struct connector *connectors;
int c; int c;
@ -488,7 +495,7 @@ int update_display(void)
connector_find_preferred_mode(connector->id, connector_find_preferred_mode(connector->id,
crtc_idx_mask, crtc_idx_mask,
specified_mode_num, specified_mode_num,
connector); connector, probe);
if (!connector->mode_valid) if (!connector->mode_valid)
continue; continue;
@ -513,7 +520,7 @@ int update_display(void)
connector_find_preferred_mode(connector->id, connector_find_preferred_mode(connector->id,
-1UL, -1UL,
specified_mode_num, specified_mode_num,
connector); connector, probe);
if (!connector->mode_valid) if (!connector->mode_valid)
continue; continue;
@ -765,7 +772,7 @@ int main(int argc, char **argv)
ret = 0; ret = 0;
if (!update_display()) { if (!update_display(false)) {
ret = 1; ret = 1;
goto out_stdio; goto out_stdio;
} }

View File

@ -32,4 +32,4 @@ gboolean testdisplay_setup_hotplug(void);
void testdisplay_cleanup_hotplug(void); void testdisplay_cleanup_hotplug(void);
/* called by the hotplug code */ /* called by the hotplug code */
int update_display(void); int update_display(bool probe);

View File

@ -59,7 +59,7 @@ static gboolean hotplug_event(GIOChannel *source, GIOCondition condition,
if (memcmp(&s.st_rdev, &udev_devnum, sizeof(dev_t)) == 0 && if (memcmp(&s.st_rdev, &udev_devnum, sizeof(dev_t)) == 0 &&
hotplug && atoi(hotplug) == 1) hotplug && atoi(hotplug) == 1)
update_display(); update_display(true);
udev_device_unref(dev); udev_device_unref(dev);
out: out: