From: Andy Walls <awalls@md.metrocast.net>
To: linux-kernel@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org, Dave Airlie <airlied@redhat.com>,
Jon Smirl <jonsmirl@gmail.com>,
Greg Kroah-Hartman <greg@kroah.com>
Subject: [PATCH] drm/sysfs: Provide per connector control of DRM KMS polling
Date: Mon, 20 Sep 2010 08:59:00 -0400 [thread overview]
Message-ID: <1284987540.2242.29.camel@morgan.silverblock.net> (raw)
DRM KMS polling of connections providing errant EDID responses, or
polling of "connectors" that have chips responding on DDC I2C bus
address 0xA0/0xA1 with no actual physical connector nor EDID EEPROM,
will create perpetual noise in dmesg and the system log every 10
seconds. Currently the user has apparently little recourse to silence
these messages aside from replacing the offending cable, monitor, or
graphics adapter. That recourse is impossible for an unused DVI-D
"connector" of an internal graphics processor on a motherboard that
provides no physical DVI-D connector.
This change allows the root user to disable (and re-enable) DRM KMS
connector polling on a per connector basis via sysfs, like so:
# cat /sys/class/drm/card0/card0-DVI-D-1/polled
[hotplug_detectable] connect disconnect
# echo > /sys/class/drm/card0/card0-DVI-D-1/polled
# cat /sys/class/drm/card0/card0-DVI-D-1/polled
hotplug_detectable connect disconnect
# echo " connect hotplug_detectable " > \
/sys/class/drm/card0/card0-DVI-D-1/polled
# cat /sys/class/drm/card0/card0-DVI-D-1/polled
[hotplug_detectable] [connect] disconnect
# echo > /sys/class/drm/card0/card0-DVI-D-1/polled
# cat /sys/class/drm/card0/card0-DVI-D-1/polled
hotplug_detectable connect disconnect
with the enabled poll types for the connector denoted in brackets: [].
This allows the root user to silence DRM KMS log spam for locally known
uncorrectable conditions.
Signed-off-by Andy Walls <awalls@md.metrocast.net>
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index 86118a7..8e0807d 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -318,11 +318,80 @@ static ssize_t select_subconnector_show(struct device *device,
drm_get_dvi_i_select_name((int)subconnector));
}
+static const struct {
+ uint8_t mask;
+ const char *name;
+} polled_bit_names[] = {
+ { DRM_CONNECTOR_POLL_HPD, "hotplug_detectable" },
+ { DRM_CONNECTOR_POLL_CONNECT, "connect" },
+ { DRM_CONNECTOR_POLL_DISCONNECT, "disconnect" },
+};
+
+/*
+ * Return the decoded contents of connector->polled, using the names of the
+ * all the bit masks. Bits that are set, have their names enclosed in brackets.
+ */
+static ssize_t polled_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct drm_connector *connector = to_drm_connector(dev);
+ char *tmp;
+ int i;
+
+ tmp = buf;
+ for (i = 0; i < ARRAY_SIZE(polled_bit_names); i++) {
+ if (connector->polled & polled_bit_names[i].mask)
+ tmp += sprintf(tmp, "[%s] ", polled_bit_names[i].name);
+ else
+ tmp += sprintf(tmp, "%s ", polled_bit_names[i].name);
+ }
+
+ if (tmp != buf)
+ *(tmp - 1) = '\n';
+ return tmp - buf;
+}
+
+/*
+ * Change the state of connector->polled, given input bit-mask name-strings
+ * that are separated by space or newline.
+ */
+static ssize_t polled_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct drm_connector *connector = to_drm_connector(dev);
+ const char *tmp;
+ int i;
+ uint8_t polled;
+
+ /* Polling of this connector will cease, if no match is made below */
+ polled = 0;
+
+ /* Incrementally split and parse the input */
+ while ((tmp = strsep((char **) &buf, " \n")) != NULL) {
+
+ /* Don't waste effort on multiple adjacent separators */
+ if (*tmp == '\0')
+ continue;
+
+ /* Check for a match with a connector poll type name */
+ for (i = 0; i < ARRAY_SIZE(polled_bit_names); i++) {
+ if (!strncasecmp(tmp, polled_bit_names[i].name,
+ strlen(polled_bit_names[i].name))) {
+ polled |= polled_bit_names[i].mask;
+ break;
+ }
+ }
+ }
+ connector->polled = polled;
+ return count;
+}
+
static struct device_attribute connector_attrs[] = {
__ATTR_RO(status),
__ATTR_RO(enabled),
__ATTR_RO(dpms),
__ATTR_RO(modes),
+ __ATTR(polled, 0644, polled_show, polled_store),
};
/* These attributes are for both DVI-I connectors and all types of tv-out. */
next reply other threads:[~2010-09-20 12:59 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-20 12:59 Andy Walls [this message]
2010-09-20 18:29 ` [PATCH] drm/sysfs: Provide per connector control of DRM KMS polling Rafał Miłecki
2010-09-20 18:29 ` Rafał Miłecki
2010-09-20 23:02 ` Andy Walls
2010-09-21 4:26 ` Alex Deucher
2010-09-21 17:30 ` Andy Walls
2010-09-22 5:30 ` Alex Deucher
2010-09-22 12:31 ` Andy Walls
2010-09-22 12:31 ` Andy Walls
2010-09-22 20:16 ` Andy Walls
2010-09-22 20:16 ` Andy Walls
2010-09-22 13:33 ` Jon Smirl
2010-09-22 21:07 ` Andy Walls
2010-09-22 22:05 ` Jon Smirl
2010-09-24 19:12 ` Alex Deucher
2010-09-26 18:12 ` Andy Walls
2010-09-26 18:12 ` Andy Walls
2010-09-27 15:45 ` Alex Deucher
2010-09-27 15:45 ` Alex Deucher
2010-09-22 3:20 ` [PATCH v2 0/2] " Andy Walls
2010-09-22 3:20 ` Andy Walls
2010-09-22 3:20 ` [PATCH v2 1/2] " Andy Walls
2010-09-22 3:20 ` [PATCH v2 2/2] Doc/ABI: sysfs-drm initial document; "polled" entry Andy Walls
2010-09-22 15:06 ` Greg KH
2010-09-22 15:06 ` Greg KH
2010-09-22 16:36 ` Andy Walls
2010-09-22 16:36 ` Andy Walls
2010-09-22 19:23 ` Greg KH
2010-09-22 19:23 ` Greg KH
2010-09-20 18:52 ` [PATCH] drm/sysfs: Provide per connector control of DRM KMS polling Greg KH
2010-09-20 21:11 ` Andy Walls
2010-09-22 9:44 ` Florian Mickler
2010-09-22 12:49 ` Andy Walls
2010-09-22 12:49 ` Andy Walls
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1284987540.2242.29.camel@morgan.silverblock.net \
--to=awalls@md.metrocast.net \
--cc=airlied@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=greg@kroah.com \
--cc=jonsmirl@gmail.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.