summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2016-06-14 17:59:31 +0200
committerPhilipp Zabel <p.zabel@pengutronix.de>2016-06-14 18:11:00 +0200
commita18ce726195dcd1c5d3055c3c7423f60545fd1f7 (patch)
treefbb364149830912df2a0b6b1d220b9c3ef178944
parenta6783c65943af7ff695c3769e2fd7597b9181e52 (diff)
downloadkmsfbwrap-a18ce726195dcd1c5d3055c3c7423f60545fd1f7.tar.gz
kmsfbwrap-a18ce726195dcd1c5d3055c3c7423f60545fd1f7.tar.xz
add fallback-connector support
This allows to add a fallback-connector parameter to windesc that is used in place of the primary connector if it doesn't have any modes. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--src/kmsfb-manage.c17
-rw-r--r--src/kmsfb.h2
2 files changed, 18 insertions, 1 deletions
diff --git a/src/kmsfb-manage.c b/src/kmsfb-manage.c
index 82eeb57..754d22f 100644
--- a/src/kmsfb-manage.c
+++ b/src/kmsfb-manage.c
@@ -189,6 +189,14 @@ static int kms_data_val_set(struct kms_data *kd, const char *key, const char *va
kd->connector_name = value;
kd->connector = 0;
}
+ } else if (!strcmp(key, "fallback-connector")) {
+ char *end;
+
+ kd->fallback_connector = strtoul(value, &end, 0);
+ if (end == value) {
+ kd->fallback_connector_name = value;
+ kd->fallback_connector = 0;
+ }
} else if (!strcmp(key, "encoder"))
kd->encoder = strtoul(value, NULL, 0);
else if (!strcmp(key, "3d"))
@@ -1059,6 +1067,11 @@ static int create_window(struct drm_resource *res, const char *in)
}
drmcon = drm_find_connector(res, kd.connector, kd.connector_name);
+ if (drmcon && (drmcon->num_modes == 0)) {
+ kd.connector = kd.fallback_connector;
+ kd.connector_name = kd.fallback_connector_name;
+ drmcon = drm_find_connector(res, kd.connector, kd.connector_name);
+ }
if (!drmcon) {
if (kd.connector) {
printf("specified connector %d does not exist\n",
@@ -1069,7 +1082,8 @@ static int create_window(struct drm_resource *res, const char *in)
}
return -1;
}
- if (!kd.connector && !kd.connector_name) {
+ if ((!kd.connector && !kd.connector_name) || kd.fallback_connector ||
+ kd.fallback_connector_name) {
print("using connector %d (%s)\n", drmcon->id,
drm_connector_name(drmcon));
}
@@ -1615,6 +1629,7 @@ static void usage(const char *prgname)
" recognized variables for <windesc>:\n"
" fbid [required]: ID of the FB created with -f\n"
" connector, encoder, crtc [required]: chain of DRM object IDs onto which the window should be bound\n"
+ " fallback-connector [optional]: used in place of connector if it has no modes\n"
" xres, yres [optional]: resolution of the window (default: full resolution of referenced FB)\n"
" xofs, yofs [optional]: offset in pixels into the FB\n"
" fps [optional]: select a frame rate in Hz\n"
diff --git a/src/kmsfb.h b/src/kmsfb.h
index 3cdc2c1..29a586d 100644
--- a/src/kmsfb.h
+++ b/src/kmsfb.h
@@ -96,6 +96,8 @@ struct kms_data {
uint32_t plane;
uint32_t connector;
const char *connector_name;
+ uint32_t fallback_connector;
+ const char *fallback_connector_name;
uint32_t encoder;
struct kms_fb *kms_fb;