mirror of
https://github.com/hanwckf/immortalwrt-mt798x.git
synced 2025-01-10 11:09:57 +08:00
bcm27xx: sync 5.4 patches with RPi Foundation
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
835d1c68a0
commit
6c9b5d6972
@ -108,7 +108,7 @@ Signed-off-by: Serge Schneider <serge@raspberrypi.org>
|
||||
+the fan to the user space through the hwmon sysfs interface.
|
||||
--- a/drivers/hwmon/Kconfig
|
||||
+++ b/drivers/hwmon/Kconfig
|
||||
@@ -1346,6 +1346,17 @@ config SENSORS_RASPBERRYPI_HWMON
|
||||
@@ -1356,6 +1356,17 @@ config SENSORS_RASPBERRYPI_HWMON
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called raspberrypi-hwmon.
|
||||
|
||||
@ -128,7 +128,7 @@ Signed-off-by: Serge Schneider <serge@raspberrypi.org>
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
--- a/drivers/hwmon/Makefile
|
||||
+++ b/drivers/hwmon/Makefile
|
||||
@@ -144,6 +144,7 @@ obj-$(CONFIG_SENSORS_PCF8591) += pcf8591
|
||||
@@ -145,6 +145,7 @@ obj-$(CONFIG_SENSORS_PCF8591) += pcf8591
|
||||
obj-$(CONFIG_SENSORS_POWR1220) += powr1220.o
|
||||
obj-$(CONFIG_SENSORS_PWM_FAN) += pwm-fan.o
|
||||
obj-$(CONFIG_SENSORS_RASPBERRYPI_HWMON) += raspberrypi-hwmon.o
|
||||
|
@ -0,0 +1,45 @@
|
||||
From e253d03936265dc4ab8ae9ae89d2a885e80a45a6 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Fri, 6 Mar 2020 11:08:10 +0100
|
||||
Subject: [PATCH] gpio-ir-overlay: add parameter to configure signal
|
||||
polarity (#3490)
|
||||
|
||||
Standard IR receivers use inverted / active-low signalling
|
||||
and the gpio-ir overlay configures the GPIO appropriately
|
||||
as GPIO_ACTIVE_LOW (1).
|
||||
|
||||
In order to support (rather rare) non-inverted / active-high
|
||||
signalling the GPIO needs to be configured as GPIO_ACTIVE_HIGH (0).
|
||||
|
||||
Add an "invert" parameter to override this like in the gpio-ir-tx
|
||||
overlay.
|
||||
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
arch/arm/boot/dts/overlays/README | 4 ++++
|
||||
arch/arm/boot/dts/overlays/gpio-ir-overlay.dts | 1 +
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/overlays/README
|
||||
+++ b/arch/arm/boot/dts/overlays/README
|
||||
@@ -754,6 +754,10 @@ Params: gpio_pin Input pi
|
||||
gpio_pull Desired pull-up/down state (off, down, up)
|
||||
Default is "up".
|
||||
|
||||
+ invert "1" = invert the input (active-low signalling).
|
||||
+ "0" = non-inverted input (active-high
|
||||
+ signalling). Default is "1".
|
||||
+
|
||||
rc-map-name Default rc keymap (can also be changed by
|
||||
ir-keytable), defaults to "rc-rc6-mce"
|
||||
|
||||
--- a/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
|
||||
+++ b/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
|
||||
@@ -42,6 +42,7 @@
|
||||
<&gpio_ir_pins>,"brcm,pins:0",
|
||||
<&gpio_ir_pins>,"reg:0";
|
||||
gpio_pull = <&gpio_ir_pins>,"brcm,pull:0"; // pull-up/down state
|
||||
+ invert = <&gpio_ir>,"gpios:8"; // 0 = active high input
|
||||
|
||||
rc-map-name = <&gpio_ir>,"linux,rc-map-name"; // default rc map
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,27 @@
|
||||
From e25d9a93812847b4ddc9e883d0cd45b32f8e2f76 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Tue, 17 Mar 2020 16:39:07 +0000
|
||||
Subject: [PATCH] ARM: dts: bcm2711: Add 32-bit PMU compatibility
|
||||
|
||||
The "arm" architecture has no support for the cortex-a72 as such, but
|
||||
the performance and measurement unit from the cortex-a15 seems to be
|
||||
compatible.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2711-rpi.dtsi | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2711-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2711-rpi.dtsi
|
||||
@@ -12,6 +12,10 @@
|
||||
sd_poll_once = <&emmc2>, "non-removable?";
|
||||
};
|
||||
|
||||
+ arm-pmu {
|
||||
+ compatible = "arm,cortex-a72-pmu", "arm,cortex-a15-pmu";
|
||||
+ };
|
||||
+
|
||||
v3dbus {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
@ -0,0 +1,67 @@
|
||||
From 70b0d5d07426e1b9c34ddd6ab4ee99b8c2fb81a6 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 19 Mar 2020 10:04:46 +0000
|
||||
Subject: [PATCH] ARM: dts: bcm271x: Use a53 pmu, drop RPI364
|
||||
|
||||
The upstream bcm2837.dtsi uses cortex-a53-pmu, so we can do the same
|
||||
but with a fallback to the cortex-a7-pmu which is supported by the
|
||||
32-bit kernel.
|
||||
|
||||
Now that we're using the natural fallback mechanism of compatible
|
||||
strings, the RPI364 macro no longer serves any purpose - remove it.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2710.dtsi | 6 +-----
|
||||
arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts | 2 --
|
||||
arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts | 2 --
|
||||
arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts | 2 --
|
||||
arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts | 2 --
|
||||
arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts | 2 --
|
||||
6 files changed, 1 insertion(+), 15 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm2710.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2710.dtsi
|
||||
@@ -5,11 +5,7 @@
|
||||
compatible = "brcm,bcm2837", "brcm,bcm2836";
|
||||
|
||||
arm-pmu {
|
||||
-#ifdef RPI364
|
||||
- compatible = "arm,armv8-pmuv3", "arm,cortex-a7-pmu";
|
||||
-#else
|
||||
- compatible = "arm,cortex-a7-pmu";
|
||||
-#endif
|
||||
+ compatible = "arm,cortex-a53-pmu", "arm,cortex-a7-pmu";
|
||||
};
|
||||
|
||||
soc {
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts
|
||||
@@ -1,3 +1 @@
|
||||
-#define RPI364
|
||||
-
|
||||
#include "../../../../arm/boot/dts/bcm2710-rpi-2-b.dts"
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts
|
||||
@@ -1,3 +1 @@
|
||||
-#define RPI364
|
||||
-
|
||||
#include "../../../../arm/boot/dts/bcm2710-rpi-3-b-plus.dts"
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts
|
||||
@@ -1,3 +1 @@
|
||||
-#define RPI364
|
||||
-
|
||||
#include "../../../../arm/boot/dts/bcm2710-rpi-3-b.dts"
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts
|
||||
@@ -1,3 +1 @@
|
||||
-#define RPI364
|
||||
-
|
||||
#include "../../../../arm/boot/dts/bcm2710-rpi-cm3.dts"
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts
|
||||
@@ -1,3 +1 @@
|
||||
-#define RPI364
|
||||
-
|
||||
#include "../../../../arm/boot/dts/bcm2711-rpi-4-b.dts"
|
@ -0,0 +1,32 @@
|
||||
From cff8c5c2a95a4afd65bfa3198258d03bc790cddb Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Date: Tue, 25 Feb 2020 14:11:59 +0100
|
||||
Subject: [PATCH] net: bcmgenet: Clear ID_MODE_DIS in
|
||||
EXT_RGMII_OOB_CTRL when not needed
|
||||
|
||||
commit 402482a6a78e5c61d8a2ec6311fc5b4aca392cd6 upstream.
|
||||
|
||||
Outdated Raspberry Pi 4 firmware might configure the external PHY as
|
||||
rgmii although the kernel currently sets it as rgmii-rxid. This makes
|
||||
connections unreliable as ID_MODE_DIS is left enabled. To avoid this,
|
||||
explicitly clear that bit whenever we don't need it.
|
||||
|
||||
Fixes: da38802211cc ("net: bcmgenet: Add RGMII_RXID support")
|
||||
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/genet/bcmmii.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
|
||||
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
|
||||
@@ -292,6 +292,7 @@ int bcmgenet_mii_config(struct net_devic
|
||||
*/
|
||||
if (priv->ext_phy) {
|
||||
reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL);
|
||||
+ reg &= ~ID_MODE_DIS;
|
||||
reg |= id_mode_dis;
|
||||
if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv))
|
||||
reg |= RGMII_MODE_EN_V123;
|
@ -0,0 +1,141 @@
|
||||
From fade8b3cf37785297b4f8a9bbd13ab107208af5a Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:22 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Fix possible reference past
|
||||
end of string
|
||||
|
||||
Commit 8582e244e5fe72d2e9ace186fa8f3ed3bb4122e1 upstream.
|
||||
|
||||
Before this commit, if the last option of a video=... option is for
|
||||
example "rotate" without a "=<value>" after it then delim will point to
|
||||
the terminating 0 of the string, and value which is sets to <delim + 1>
|
||||
will point one position past the end of the string.
|
||||
|
||||
This commit fixes this by enforcing that the contents of delim equals '='
|
||||
as it should be for options which take a value, this check is done in a
|
||||
new drm_mode_parse_cmdline_int helper function which factors out the
|
||||
common integer parsing code for all the options which take an int.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-1-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 68 ++++++++++++++++---------------------
|
||||
1 file changed, 30 insertions(+), 38 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1568,11 +1568,34 @@ static int drm_mode_parse_cmdline_res_mo
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_mode_parse_cmdline_int(const char *delim, unsigned int *int_ret)
|
||||
+{
|
||||
+ const char *value;
|
||||
+ char *endp;
|
||||
+
|
||||
+ /*
|
||||
+ * delim must point to the '=', otherwise it is a syntax error and
|
||||
+ * if delim points to the terminating zero, then delim + 1 wil point
|
||||
+ * past the end of the string.
|
||||
+ */
|
||||
+ if (*delim != '=')
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ value = delim + 1;
|
||||
+ *int_ret = simple_strtol(value, &endp, 10);
|
||||
+
|
||||
+ /* Make sure we have parsed something */
|
||||
+ if (endp == value)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int drm_mode_parse_cmdline_options(char *str, size_t len,
|
||||
const struct drm_connector *connector,
|
||||
struct drm_cmdline_mode *mode)
|
||||
{
|
||||
- unsigned int rotation = 0;
|
||||
+ unsigned int deg, margin, rotation = 0;
|
||||
char *sep = str;
|
||||
|
||||
while ((sep = strchr(sep, ','))) {
|
||||
@@ -1588,13 +1611,7 @@ static int drm_mode_parse_cmdline_option
|
||||
}
|
||||
|
||||
if (!strncmp(option, "rotate", delim - option)) {
|
||||
- const char *value = delim + 1;
|
||||
- unsigned int deg;
|
||||
-
|
||||
- deg = simple_strtol(value, &sep, 10);
|
||||
-
|
||||
- /* Make sure we have parsed something */
|
||||
- if (sep == value)
|
||||
+ if (drm_mode_parse_cmdline_int(delim, °))
|
||||
return -EINVAL;
|
||||
|
||||
switch (deg) {
|
||||
@@ -1619,57 +1636,32 @@ static int drm_mode_parse_cmdline_option
|
||||
}
|
||||
} else if (!strncmp(option, "reflect_x", delim - option)) {
|
||||
rotation |= DRM_MODE_REFLECT_X;
|
||||
- sep = delim;
|
||||
} else if (!strncmp(option, "reflect_y", delim - option)) {
|
||||
rotation |= DRM_MODE_REFLECT_Y;
|
||||
- sep = delim;
|
||||
} else if (!strncmp(option, "margin_right", delim - option)) {
|
||||
- const char *value = delim + 1;
|
||||
- unsigned int margin;
|
||||
-
|
||||
- margin = simple_strtol(value, &sep, 10);
|
||||
-
|
||||
- /* Make sure we have parsed something */
|
||||
- if (sep == value)
|
||||
+ if (drm_mode_parse_cmdline_int(delim, &margin))
|
||||
return -EINVAL;
|
||||
|
||||
mode->tv_margins.right = margin;
|
||||
} else if (!strncmp(option, "margin_left", delim - option)) {
|
||||
- const char *value = delim + 1;
|
||||
- unsigned int margin;
|
||||
-
|
||||
- margin = simple_strtol(value, &sep, 10);
|
||||
-
|
||||
- /* Make sure we have parsed something */
|
||||
- if (sep == value)
|
||||
+ if (drm_mode_parse_cmdline_int(delim, &margin))
|
||||
return -EINVAL;
|
||||
|
||||
mode->tv_margins.left = margin;
|
||||
} else if (!strncmp(option, "margin_top", delim - option)) {
|
||||
- const char *value = delim + 1;
|
||||
- unsigned int margin;
|
||||
-
|
||||
- margin = simple_strtol(value, &sep, 10);
|
||||
-
|
||||
- /* Make sure we have parsed something */
|
||||
- if (sep == value)
|
||||
+ if (drm_mode_parse_cmdline_int(delim, &margin))
|
||||
return -EINVAL;
|
||||
|
||||
mode->tv_margins.top = margin;
|
||||
} else if (!strncmp(option, "margin_bottom", delim - option)) {
|
||||
- const char *value = delim + 1;
|
||||
- unsigned int margin;
|
||||
-
|
||||
- margin = simple_strtol(value, &sep, 10);
|
||||
-
|
||||
- /* Make sure we have parsed something */
|
||||
- if (sep == value)
|
||||
+ if (drm_mode_parse_cmdline_int(delim, &margin))
|
||||
return -EINVAL;
|
||||
|
||||
mode->tv_margins.bottom = margin;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
+ sep = delim;
|
||||
}
|
||||
|
||||
mode->rotation_reflection = rotation;
|
@ -0,0 +1,50 @@
|
||||
From 250363a413cd08e723789e1b8821608ff5eebfe6 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:23 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Make various char pointers
|
||||
const
|
||||
|
||||
Commit 83e14ea3a64f00897cc31974d3ae4e27e5a7405b upstream.
|
||||
|
||||
We are not supposed to modify the passed in string, make char pointers
|
||||
used in drm_mode_parse_cmdline_options() const char * where possible.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-2-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1591,15 +1591,15 @@ static int drm_mode_parse_cmdline_int(co
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int drm_mode_parse_cmdline_options(char *str, size_t len,
|
||||
+static int drm_mode_parse_cmdline_options(const char *str, size_t len,
|
||||
const struct drm_connector *connector,
|
||||
struct drm_cmdline_mode *mode)
|
||||
{
|
||||
unsigned int deg, margin, rotation = 0;
|
||||
- char *sep = str;
|
||||
+ const char *sep = str;
|
||||
|
||||
while ((sep = strchr(sep, ','))) {
|
||||
- char *delim, *option;
|
||||
+ const char *delim, *option;
|
||||
|
||||
option = sep + 1;
|
||||
delim = strchr(option, '=');
|
||||
@@ -1718,8 +1718,8 @@ bool drm_mode_parse_command_line_for_con
|
||||
bool named_mode = false, parse_extras = false;
|
||||
unsigned int bpp_off = 0, refresh_off = 0, options_off = 0;
|
||||
unsigned int mode_end = 0;
|
||||
- char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
|
||||
- char *options_ptr = NULL;
|
||||
+ const char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
|
||||
+ const char *options_ptr = NULL;
|
||||
char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
|
||||
int ret;
|
||||
|
@ -0,0 +1,95 @@
|
||||
From 0e7c5e80d8d310a881d723a426762e8822d5bf35 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:24 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Stop parsing extras after
|
||||
bpp / refresh at ', '
|
||||
|
||||
Commit c2ed3e941901810ad3d55ce1935fa22c5007fee4 upstream.
|
||||
|
||||
Before this commit it was impossible to add an extra mode argument after
|
||||
a bpp or refresh specifier, combined with an option, e.g.
|
||||
video=HDMI-1:720x480-24e,rotate=180 would not work, either the "e" to
|
||||
force enable would need to be dropped or the ",rotate=180", otherwise
|
||||
the mode_option would not be accepted.
|
||||
|
||||
This commit fixes this by fixing the length calculation if extras_ptr
|
||||
is set to stop the extra parsing at the start of the options (stop at the
|
||||
',' options_ptr points to).
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-3-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 10 ++++---
|
||||
.../gpu/drm/selftests/drm_cmdline_selftests.h | 1 +
|
||||
.../drm/selftests/test-drm_cmdline_parser.c | 26 +++++++++++++++++++
|
||||
3 files changed, 33 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1721,7 +1721,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
const char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
|
||||
const char *options_ptr = NULL;
|
||||
char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
|
||||
- int ret;
|
||||
+ int i, len, ret;
|
||||
|
||||
#ifdef CONFIG_FB
|
||||
if (!mode_option)
|
||||
@@ -1841,9 +1841,11 @@ bool drm_mode_parse_command_line_for_con
|
||||
else if (refresh_ptr)
|
||||
extra_ptr = refresh_end_ptr;
|
||||
|
||||
- if (extra_ptr &&
|
||||
- extra_ptr != options_ptr) {
|
||||
- int len = strlen(name) - (extra_ptr - name);
|
||||
+ if (extra_ptr) {
|
||||
+ if (options_ptr)
|
||||
+ len = options_ptr - extra_ptr;
|
||||
+ else
|
||||
+ len = strlen(extra_ptr);
|
||||
|
||||
ret = drm_mode_parse_cmdline_extra(extra_ptr, len, false,
|
||||
connector, mode);
|
||||
--- a/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
+++ b/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
@@ -60,3 +60,4 @@ cmdline_test(drm_cmdline_test_vmirror)
|
||||
cmdline_test(drm_cmdline_test_margin_options)
|
||||
cmdline_test(drm_cmdline_test_multiple_options)
|
||||
cmdline_test(drm_cmdline_test_invalid_option)
|
||||
+cmdline_test(drm_cmdline_test_bpp_extra_and_option)
|
||||
--- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
+++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
@@ -992,6 +992,32 @@ static int drm_cmdline_test_invalid_opti
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_cmdline_test_bpp_extra_and_option(void *ignored)
|
||||
+{
|
||||
+ struct drm_cmdline_mode mode = { };
|
||||
+
|
||||
+ FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24e,rotate=180",
|
||||
+ &no_connector,
|
||||
+ &mode));
|
||||
+ FAIL_ON(!mode.specified);
|
||||
+ FAIL_ON(mode.xres != 720);
|
||||
+ FAIL_ON(mode.yres != 480);
|
||||
+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
|
||||
+
|
||||
+ FAIL_ON(mode.refresh_specified);
|
||||
+
|
||||
+ FAIL_ON(!mode.bpp_specified);
|
||||
+ FAIL_ON(mode.bpp != 24);
|
||||
+
|
||||
+ FAIL_ON(mode.rb);
|
||||
+ FAIL_ON(mode.cvt);
|
||||
+ FAIL_ON(mode.interlace);
|
||||
+ FAIL_ON(mode.margins);
|
||||
+ FAIL_ON(mode.force != DRM_FORCE_ON);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#include "drm_selftest.c"
|
||||
|
||||
static int __init test_drm_cmdline_init(void)
|
@ -0,0 +1,77 @@
|
||||
From bc4d8c5519c74b9bdf4d35369ba76bac01be8ca2 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:25 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Accept extras directly
|
||||
after mode combined with options
|
||||
|
||||
Commit cfb0881b8f621b656a9e23b31944a5db94cf5842 upstream.
|
||||
|
||||
Before this commit it was impossible to combine an extra mode argument
|
||||
specified directly after the resolution with an option, e.g.
|
||||
video=HDMI-1:720x480e,rotate=180 would not work, either the "e" to force
|
||||
enable would need to be dropped or the ",rotate=180", otherwise the
|
||||
mode_option would not be accepted.
|
||||
|
||||
This commit fixes this by setting parse_extras to true in this case, so
|
||||
that drm_mode_parse_cmdline_res_mode() parses the extra arguments directly
|
||||
after the resolution.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-4-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 1 +
|
||||
.../gpu/drm/selftests/drm_cmdline_selftests.h | 1 +
|
||||
.../drm/selftests/test-drm_cmdline_parser.c | 24 +++++++++++++++++++
|
||||
3 files changed, 26 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1794,6 +1794,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
mode_end = refresh_off;
|
||||
} else if (options_ptr) {
|
||||
mode_end = options_off;
|
||||
+ parse_extras = true;
|
||||
} else {
|
||||
mode_end = strlen(name);
|
||||
parse_extras = true;
|
||||
--- a/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
+++ b/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
@@ -61,3 +61,4 @@ cmdline_test(drm_cmdline_test_margin_opt
|
||||
cmdline_test(drm_cmdline_test_multiple_options)
|
||||
cmdline_test(drm_cmdline_test_invalid_option)
|
||||
cmdline_test(drm_cmdline_test_bpp_extra_and_option)
|
||||
+cmdline_test(drm_cmdline_test_extra_and_option)
|
||||
--- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
+++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
@@ -1018,6 +1018,30 @@ static int drm_cmdline_test_bpp_extra_an
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_cmdline_test_extra_and_option(void *ignored)
|
||||
+{
|
||||
+ struct drm_cmdline_mode mode = { };
|
||||
+
|
||||
+ FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480e,rotate=180",
|
||||
+ &no_connector,
|
||||
+ &mode));
|
||||
+ FAIL_ON(!mode.specified);
|
||||
+ FAIL_ON(mode.xres != 720);
|
||||
+ FAIL_ON(mode.yres != 480);
|
||||
+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
|
||||
+
|
||||
+ FAIL_ON(mode.refresh_specified);
|
||||
+ FAIL_ON(mode.bpp_specified);
|
||||
+
|
||||
+ FAIL_ON(mode.rb);
|
||||
+ FAIL_ON(mode.cvt);
|
||||
+ FAIL_ON(mode.interlace);
|
||||
+ FAIL_ON(mode.margins);
|
||||
+ FAIL_ON(mode.force != DRM_FORCE_ON);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#include "drm_selftest.c"
|
||||
|
||||
static int __init test_drm_cmdline_init(void)
|
@ -0,0 +1,76 @@
|
||||
From 5b6257773b43e7a7b28f86359d2e9ebe15346b78 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:26 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Rework
|
||||
drm_mode_parse_cmdline_options()
|
||||
|
||||
Commit 739b200c2edcaaa7a86f37b0c11db57956433dfb upstream.
|
||||
|
||||
Refactor drm_mode_parse_cmdline_options() so that it takes a pointer
|
||||
to the first option, rather then a pointer to the ',' before the first
|
||||
option.
|
||||
|
||||
This is a preparation patch for allowing parsing of stand-alone options
|
||||
without a mode before them, e.g.: video=HDMI-1:margin_right=14,...
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-5-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 21 +++++++++------------
|
||||
1 file changed, 9 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1591,23 +1591,21 @@ static int drm_mode_parse_cmdline_int(co
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int drm_mode_parse_cmdline_options(const char *str, size_t len,
|
||||
+static int drm_mode_parse_cmdline_options(const char *str,
|
||||
const struct drm_connector *connector,
|
||||
struct drm_cmdline_mode *mode)
|
||||
{
|
||||
unsigned int deg, margin, rotation = 0;
|
||||
- const char *sep = str;
|
||||
+ const char *delim, *option, *sep;
|
||||
|
||||
- while ((sep = strchr(sep, ','))) {
|
||||
- const char *delim, *option;
|
||||
-
|
||||
- option = sep + 1;
|
||||
+ option = str;
|
||||
+ do {
|
||||
delim = strchr(option, '=');
|
||||
if (!delim) {
|
||||
delim = strchr(option, ',');
|
||||
|
||||
if (!delim)
|
||||
- delim = str + len;
|
||||
+ delim = option + strlen(option);
|
||||
}
|
||||
|
||||
if (!strncmp(option, "rotate", delim - option)) {
|
||||
@@ -1661,8 +1659,9 @@ static int drm_mode_parse_cmdline_option
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
- sep = delim;
|
||||
- }
|
||||
+ sep = strchr(delim, ',');
|
||||
+ option = sep + 1;
|
||||
+ } while (sep);
|
||||
|
||||
mode->rotation_reflection = rotation;
|
||||
|
||||
@@ -1855,9 +1854,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
}
|
||||
|
||||
if (options_ptr) {
|
||||
- int len = strlen(name) - (options_ptr - name);
|
||||
-
|
||||
- ret = drm_mode_parse_cmdline_options(options_ptr, len,
|
||||
+ ret = drm_mode_parse_cmdline_options(options_ptr + 1,
|
||||
connector, mode);
|
||||
if (ret)
|
||||
return false;
|
@ -0,0 +1,49 @@
|
||||
From d3c76025a7de614fade5ffcaa8c1d88d8d64213e Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:27 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Add freestanding argument
|
||||
to drm_mode_parse_cmdline_options()
|
||||
|
||||
Commit 99e2716e053734b70434502867be24d20a3e2d84 upstream.
|
||||
|
||||
Add a freestanding function argument to drm_mode_parse_cmdline_options()
|
||||
similar to how drm_mode_parse_cmdline_extra() already has this.
|
||||
|
||||
This is a preparation patch for allowing parsing of stand-alone options
|
||||
without a mode before them, e.g.: video=HDMI-1:margin_right=14,...
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-6-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1592,6 +1592,7 @@ static int drm_mode_parse_cmdline_int(co
|
||||
}
|
||||
|
||||
static int drm_mode_parse_cmdline_options(const char *str,
|
||||
+ bool freestanding,
|
||||
const struct drm_connector *connector,
|
||||
struct drm_cmdline_mode *mode)
|
||||
{
|
||||
@@ -1663,6 +1664,9 @@ static int drm_mode_parse_cmdline_option
|
||||
option = sep + 1;
|
||||
} while (sep);
|
||||
|
||||
+ if (rotation && freestanding)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
mode->rotation_reflection = rotation;
|
||||
|
||||
return 0;
|
||||
@@ -1855,6 +1859,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
|
||||
if (options_ptr) {
|
||||
ret = drm_mode_parse_cmdline_options(options_ptr + 1,
|
||||
+ false,
|
||||
connector, mode);
|
||||
if (ret)
|
||||
return false;
|
@ -0,0 +1,64 @@
|
||||
From 5b7efd2fa0c75164373d6faf28fec4b89065d39c Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:28 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Set bpp/refresh_specified
|
||||
after successful parsing
|
||||
|
||||
Commit 6a2d163756545aa3180d7851d5f8322b865e72be upstream.
|
||||
|
||||
drm_connector_get_cmdline_mode() calls
|
||||
drm_mode_parse_command_line_for_connector() with &connector->cmdline_mode
|
||||
as mode argument, so anything which we store in the mode arguments gets
|
||||
kept even if we return false.
|
||||
|
||||
Avoid storing a possibly false-postive bpp/refresh_specified setting
|
||||
in connector->cmdline_mode by moving the setting of these to after
|
||||
successful parsing of the bpp/refresh parts of the video= argument.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-7-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1771,10 +1771,8 @@ bool drm_mode_parse_command_line_for_con
|
||||
|
||||
/* Try to locate the bpp and refresh specifiers, if any */
|
||||
bpp_ptr = strchr(name, '-');
|
||||
- if (bpp_ptr) {
|
||||
+ if (bpp_ptr)
|
||||
bpp_off = bpp_ptr - name;
|
||||
- mode->bpp_specified = true;
|
||||
- }
|
||||
|
||||
refresh_ptr = strchr(name, '@');
|
||||
if (refresh_ptr) {
|
||||
@@ -1782,7 +1780,6 @@ bool drm_mode_parse_command_line_for_con
|
||||
return false;
|
||||
|
||||
refresh_off = refresh_ptr - name;
|
||||
- mode->refresh_specified = true;
|
||||
}
|
||||
|
||||
/* Locate the start of named options */
|
||||
@@ -1825,6 +1822,8 @@ bool drm_mode_parse_command_line_for_con
|
||||
ret = drm_mode_parse_cmdline_bpp(bpp_ptr, &bpp_end_ptr, mode);
|
||||
if (ret)
|
||||
return false;
|
||||
+
|
||||
+ mode->bpp_specified = true;
|
||||
}
|
||||
|
||||
if (refresh_ptr) {
|
||||
@@ -1832,6 +1831,8 @@ bool drm_mode_parse_command_line_for_con
|
||||
&refresh_end_ptr, mode);
|
||||
if (ret)
|
||||
return false;
|
||||
+
|
||||
+ mode->refresh_specified = true;
|
||||
}
|
||||
|
||||
/*
|
@ -0,0 +1,247 @@
|
||||
From b3212eba63b541206e12c8dc31fc0d99d916b210 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:29 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Allow specifying
|
||||
stand-alone options
|
||||
|
||||
Commit 7b1cce760afe38b40f0989cdf10b2190dccf9815 upstream.
|
||||
|
||||
Some options which can be specified on the commandline, such as
|
||||
margin_right=..., margin_left=..., etc. are applied not only to the
|
||||
specified mode, but to all modes. As such it would be nice if the user
|
||||
can simply say e.g.
|
||||
video=HDMI-1:margin_right=14,margin_left=24,margin_bottom=36,margin_top=42
|
||||
|
||||
This commit refactors drm_mode_parse_command_line_for_connector() to
|
||||
add support for this, and as a nice side effect also cleans up the
|
||||
function a bit.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-8-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 92 +++++++------------
|
||||
.../gpu/drm/selftests/drm_cmdline_selftests.h | 2 +
|
||||
.../drm/selftests/test-drm_cmdline_parser.c | 50 ++++++++++
|
||||
3 files changed, 86 insertions(+), 58 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1677,17 +1677,6 @@ static const char * const drm_named_mode
|
||||
"PAL",
|
||||
};
|
||||
|
||||
-static bool drm_named_mode_is_in_whitelist(const char *mode, unsigned int size)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < ARRAY_SIZE(drm_named_modes_whitelist); i++)
|
||||
- if (!strncmp(mode, drm_named_modes_whitelist[i], size))
|
||||
- return true;
|
||||
-
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* drm_mode_parse_command_line_for_connector - parse command line modeline for connector
|
||||
* @mode_option: optional per connector mode option
|
||||
@@ -1718,7 +1707,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
struct drm_cmdline_mode *mode)
|
||||
{
|
||||
const char *name;
|
||||
- bool named_mode = false, parse_extras = false;
|
||||
+ bool freestanding = false, parse_extras = false;
|
||||
unsigned int bpp_off = 0, refresh_off = 0, options_off = 0;
|
||||
unsigned int mode_end = 0;
|
||||
const char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
|
||||
@@ -1738,49 +1727,14 @@ bool drm_mode_parse_command_line_for_con
|
||||
|
||||
name = mode_option;
|
||||
|
||||
- /*
|
||||
- * This is a bit convoluted. To differentiate between the
|
||||
- * named modes and poorly formatted resolutions, we need a
|
||||
- * bunch of things:
|
||||
- * - We need to make sure that the first character (which
|
||||
- * would be our resolution in X) is a digit.
|
||||
- * - If not, then it's either a named mode or a force on/off.
|
||||
- * To distinguish between the two, we need to run the
|
||||
- * extra parsing function, and if not, then we consider it
|
||||
- * a named mode.
|
||||
- *
|
||||
- * If this isn't enough, we should add more heuristics here,
|
||||
- * and matching unit-tests.
|
||||
- */
|
||||
- if (!isdigit(name[0]) && name[0] != 'x') {
|
||||
- unsigned int namelen = strlen(name);
|
||||
-
|
||||
- /*
|
||||
- * Only the force on/off options can be in that case,
|
||||
- * and they all take a single character.
|
||||
- */
|
||||
- if (namelen == 1) {
|
||||
- ret = drm_mode_parse_cmdline_extra(name, namelen, true,
|
||||
- connector, mode);
|
||||
- if (!ret)
|
||||
- return true;
|
||||
- }
|
||||
-
|
||||
- named_mode = true;
|
||||
- }
|
||||
-
|
||||
/* Try to locate the bpp and refresh specifiers, if any */
|
||||
bpp_ptr = strchr(name, '-');
|
||||
if (bpp_ptr)
|
||||
bpp_off = bpp_ptr - name;
|
||||
|
||||
refresh_ptr = strchr(name, '@');
|
||||
- if (refresh_ptr) {
|
||||
- if (named_mode)
|
||||
- return false;
|
||||
-
|
||||
+ if (refresh_ptr)
|
||||
refresh_off = refresh_ptr - name;
|
||||
- }
|
||||
|
||||
/* Locate the start of named options */
|
||||
options_ptr = strchr(name, ',');
|
||||
@@ -1800,23 +1754,45 @@ bool drm_mode_parse_command_line_for_con
|
||||
parse_extras = true;
|
||||
}
|
||||
|
||||
- if (named_mode) {
|
||||
- if (mode_end + 1 > DRM_DISPLAY_MODE_LEN)
|
||||
- return false;
|
||||
-
|
||||
- if (!drm_named_mode_is_in_whitelist(name, mode_end))
|
||||
- return false;
|
||||
+ /* First check for a named mode */
|
||||
+ for (i = 0; i < ARRAY_SIZE(drm_named_modes_whitelist); i++) {
|
||||
+ ret = str_has_prefix(name, drm_named_modes_whitelist[i]);
|
||||
+ if (ret == mode_end) {
|
||||
+ if (refresh_ptr)
|
||||
+ return false; /* named + refresh is invalid */
|
||||
+
|
||||
+ strcpy(mode->name, drm_named_modes_whitelist[i]);
|
||||
+ mode->specified = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- strscpy(mode->name, name, mode_end + 1);
|
||||
- } else {
|
||||
+ /* No named mode? Check for a normal mode argument, e.g. 1024x768 */
|
||||
+ if (!mode->specified && isdigit(name[0])) {
|
||||
ret = drm_mode_parse_cmdline_res_mode(name, mode_end,
|
||||
parse_extras,
|
||||
connector,
|
||||
mode);
|
||||
if (ret)
|
||||
return false;
|
||||
+
|
||||
+ mode->specified = true;
|
||||
+ }
|
||||
+
|
||||
+ /* No mode? Check for freestanding extras and/or options */
|
||||
+ if (!mode->specified) {
|
||||
+ unsigned int len = strlen(mode_option);
|
||||
+
|
||||
+ if (bpp_ptr || refresh_ptr)
|
||||
+ return false; /* syntax error */
|
||||
+
|
||||
+ if (len == 1 || (len >= 2 && mode_option[1] == ','))
|
||||
+ extra_ptr = mode_option;
|
||||
+ else
|
||||
+ options_ptr = mode_option - 1;
|
||||
+
|
||||
+ freestanding = true;
|
||||
}
|
||||
- mode->specified = true;
|
||||
|
||||
if (bpp_ptr) {
|
||||
ret = drm_mode_parse_cmdline_bpp(bpp_ptr, &bpp_end_ptr, mode);
|
||||
@@ -1852,7 +1828,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
else
|
||||
len = strlen(extra_ptr);
|
||||
|
||||
- ret = drm_mode_parse_cmdline_extra(extra_ptr, len, false,
|
||||
+ ret = drm_mode_parse_cmdline_extra(extra_ptr, len, freestanding,
|
||||
connector, mode);
|
||||
if (ret)
|
||||
return false;
|
||||
@@ -1860,7 +1836,7 @@ bool drm_mode_parse_command_line_for_con
|
||||
|
||||
if (options_ptr) {
|
||||
ret = drm_mode_parse_cmdline_options(options_ptr + 1,
|
||||
- false,
|
||||
+ freestanding,
|
||||
connector, mode);
|
||||
if (ret)
|
||||
return false;
|
||||
--- a/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
+++ b/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
@@ -62,3 +62,5 @@ cmdline_test(drm_cmdline_test_multiple_o
|
||||
cmdline_test(drm_cmdline_test_invalid_option)
|
||||
cmdline_test(drm_cmdline_test_bpp_extra_and_option)
|
||||
cmdline_test(drm_cmdline_test_extra_and_option)
|
||||
+cmdline_test(drm_cmdline_test_freestanding_options)
|
||||
+cmdline_test(drm_cmdline_test_freestanding_force_e_and_options)
|
||||
--- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
+++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
@@ -1042,6 +1042,56 @@ static int drm_cmdline_test_extra_and_op
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_cmdline_test_freestanding_options(void *ignored)
|
||||
+{
|
||||
+ struct drm_cmdline_mode mode = { };
|
||||
+
|
||||
+ FAIL_ON(!drm_mode_parse_command_line_for_connector("margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
|
||||
+ &no_connector,
|
||||
+ &mode));
|
||||
+ FAIL_ON(mode.specified);
|
||||
+ FAIL_ON(mode.refresh_specified);
|
||||
+ FAIL_ON(mode.bpp_specified);
|
||||
+
|
||||
+ FAIL_ON(mode.tv_margins.right != 14);
|
||||
+ FAIL_ON(mode.tv_margins.left != 24);
|
||||
+ FAIL_ON(mode.tv_margins.bottom != 36);
|
||||
+ FAIL_ON(mode.tv_margins.top != 42);
|
||||
+
|
||||
+ FAIL_ON(mode.rb);
|
||||
+ FAIL_ON(mode.cvt);
|
||||
+ FAIL_ON(mode.interlace);
|
||||
+ FAIL_ON(mode.margins);
|
||||
+ FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int drm_cmdline_test_freestanding_force_e_and_options(void *ignored)
|
||||
+{
|
||||
+ struct drm_cmdline_mode mode = { };
|
||||
+
|
||||
+ FAIL_ON(!drm_mode_parse_command_line_for_connector("e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
|
||||
+ &no_connector,
|
||||
+ &mode));
|
||||
+ FAIL_ON(mode.specified);
|
||||
+ FAIL_ON(mode.refresh_specified);
|
||||
+ FAIL_ON(mode.bpp_specified);
|
||||
+
|
||||
+ FAIL_ON(mode.tv_margins.right != 14);
|
||||
+ FAIL_ON(mode.tv_margins.left != 24);
|
||||
+ FAIL_ON(mode.tv_margins.bottom != 36);
|
||||
+ FAIL_ON(mode.tv_margins.top != 42);
|
||||
+
|
||||
+ FAIL_ON(mode.rb);
|
||||
+ FAIL_ON(mode.cvt);
|
||||
+ FAIL_ON(mode.interlace);
|
||||
+ FAIL_ON(mode.margins);
|
||||
+ FAIL_ON(mode.force != DRM_FORCE_ON);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#include "drm_selftest.c"
|
||||
|
||||
static int __init test_drm_cmdline_init(void)
|
@ -0,0 +1,157 @@
|
||||
From 7d395633947fa6595a117f40e0f27ba87be77d6c Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:30 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Add support for specifying
|
||||
panel_orientation (v2)
|
||||
|
||||
Commit 4e7a4a6fbdc669c44e6079f9d5eb25673749455f upstream.
|
||||
|
||||
Sometimes we want to override a connector's panel_orientation from the
|
||||
kernel commandline. Either for testing and for special cases, e.g. a kiosk
|
||||
like setup which uses a TV mounted in portrait mode.
|
||||
|
||||
Users can already specify a "rotate" option through a video= kernel cmdline
|
||||
option. But that only supports 0/180 degrees (see drm_client_modeset TODO)
|
||||
and only works for in kernel modeset clients, not for userspace kms users.
|
||||
|
||||
The "panel-orientation" connector property OTOH does support 90/270 degrees
|
||||
as it leaves dealing with the rotation up to userspace and this does work
|
||||
for userspace kms clients (at least those which support this property).
|
||||
|
||||
Changes in v2:
|
||||
-Add missing ':' after @panel_orientation (reported by kbuild test robot)
|
||||
|
||||
BugLink: https://gitlab.freedesktop.org/plymouth/plymouth/merge_requests/83
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-9-hdegoede@redhat.com
|
||||
---
|
||||
Documentation/fb/modedb.rst | 3 ++
|
||||
drivers/gpu/drm/drm_modes.c | 32 +++++++++++++++++++
|
||||
.../gpu/drm/selftests/drm_cmdline_selftests.h | 1 +
|
||||
.../drm/selftests/test-drm_cmdline_parser.c | 22 +++++++++++++
|
||||
include/drm/drm_connector.h | 8 +++++
|
||||
5 files changed, 66 insertions(+)
|
||||
|
||||
--- a/Documentation/fb/modedb.rst
|
||||
+++ b/Documentation/fb/modedb.rst
|
||||
@@ -65,6 +65,9 @@ Valid options are::
|
||||
- reflect_y (boolean): Perform an axial symmetry on the Y axis
|
||||
- rotate (integer): Rotate the initial framebuffer by x
|
||||
degrees. Valid values are 0, 90, 180 and 270.
|
||||
+ - panel_orientation, one of "normal", "upside_down", "left_side_up", or
|
||||
+ "right_side_up". For KMS drivers only, this sets the "panel orientation"
|
||||
+ property on the kms connector as hint for kms users.
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1591,6 +1591,33 @@ static int drm_mode_parse_cmdline_int(co
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_mode_parse_panel_orientation(const char *delim,
|
||||
+ struct drm_cmdline_mode *mode)
|
||||
+{
|
||||
+ const char *value;
|
||||
+
|
||||
+ if (*delim != '=')
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ value = delim + 1;
|
||||
+ delim = strchr(value, ',');
|
||||
+ if (!delim)
|
||||
+ delim = value + strlen(value);
|
||||
+
|
||||
+ if (!strncmp(value, "normal", delim - value))
|
||||
+ mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
|
||||
+ else if (!strncmp(value, "upside_down", delim - value))
|
||||
+ mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
|
||||
+ else if (!strncmp(value, "left_side_up", delim - value))
|
||||
+ mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
|
||||
+ else if (!strncmp(value, "right_side_up", delim - value))
|
||||
+ mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
|
||||
+ else
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int drm_mode_parse_cmdline_options(const char *str,
|
||||
bool freestanding,
|
||||
const struct drm_connector *connector,
|
||||
@@ -1657,6 +1684,9 @@ static int drm_mode_parse_cmdline_option
|
||||
return -EINVAL;
|
||||
|
||||
mode->tv_margins.bottom = margin;
|
||||
+ } else if (!strncmp(option, "panel_orientation", delim - option)) {
|
||||
+ if (drm_mode_parse_panel_orientation(delim, mode))
|
||||
+ return -EINVAL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1715,6 +1745,8 @@ bool drm_mode_parse_command_line_for_con
|
||||
char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
|
||||
int i, len, ret;
|
||||
|
||||
+ mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
||||
+
|
||||
#ifdef CONFIG_FB
|
||||
if (!mode_option)
|
||||
mode_option = fb_mode_option;
|
||||
--- a/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
+++ b/drivers/gpu/drm/selftests/drm_cmdline_selftests.h
|
||||
@@ -64,3 +64,4 @@ cmdline_test(drm_cmdline_test_bpp_extra_
|
||||
cmdline_test(drm_cmdline_test_extra_and_option)
|
||||
cmdline_test(drm_cmdline_test_freestanding_options)
|
||||
cmdline_test(drm_cmdline_test_freestanding_force_e_and_options)
|
||||
+cmdline_test(drm_cmdline_test_panel_orientation)
|
||||
--- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
+++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
|
||||
@@ -1092,6 +1092,28 @@ static int drm_cmdline_test_freestanding
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int drm_cmdline_test_panel_orientation(void *ignored)
|
||||
+{
|
||||
+ struct drm_cmdline_mode mode = { };
|
||||
+
|
||||
+ FAIL_ON(!drm_mode_parse_command_line_for_connector("panel_orientation=upside_down",
|
||||
+ &no_connector,
|
||||
+ &mode));
|
||||
+ FAIL_ON(mode.specified);
|
||||
+ FAIL_ON(mode.refresh_specified);
|
||||
+ FAIL_ON(mode.bpp_specified);
|
||||
+
|
||||
+ FAIL_ON(mode.panel_orientation != DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
|
||||
+
|
||||
+ FAIL_ON(mode.rb);
|
||||
+ FAIL_ON(mode.cvt);
|
||||
+ FAIL_ON(mode.interlace);
|
||||
+ FAIL_ON(mode.margins);
|
||||
+ FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#include "drm_selftest.c"
|
||||
|
||||
static int __init test_drm_cmdline_init(void)
|
||||
--- a/include/drm/drm_connector.h
|
||||
+++ b/include/drm/drm_connector.h
|
||||
@@ -1066,6 +1066,14 @@ struct drm_cmdline_mode {
|
||||
unsigned int rotation_reflection;
|
||||
|
||||
/**
|
||||
+ * @panel_orientation:
|
||||
+ *
|
||||
+ * drm-connector "panel orientation" property override value,
|
||||
+ * DRM_MODE_PANEL_ORIENTATION_UNKNOWN if not set.
|
||||
+ */
|
||||
+ enum drm_panel_orientation panel_orientation;
|
||||
+
|
||||
+ /**
|
||||
* @tv_margins: TV margins to apply to the mode.
|
||||
*/
|
||||
struct drm_connector_tv_margins tv_margins;
|
@ -0,0 +1,38 @@
|
||||
From 339666068713986cfe1456175dd8a7514f6ed2ab Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:31 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Remove some unnecessary
|
||||
code (v2)
|
||||
|
||||
Commit 5b926617cdef41ce0696e09834991194b1759e28 upstream.
|
||||
|
||||
fb_get_options() will return fb_mode_option if no video=<connector-name>
|
||||
argument is present on the kernel commandline, so there is no need to also
|
||||
do this in drm_mode_parse_command_line_for_connector() as our only caller
|
||||
uses fb_get_options() to get the mode_option argument.
|
||||
|
||||
Changes in v2:
|
||||
-Split out the changes dealing with the initialization of the mode struct
|
||||
into a separate patch
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-10-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 5 -----
|
||||
1 file changed, 5 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1747,11 +1747,6 @@ bool drm_mode_parse_command_line_for_con
|
||||
|
||||
mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
||||
|
||||
-#ifdef CONFIG_FB
|
||||
- if (!mode_option)
|
||||
- mode_option = fb_mode_option;
|
||||
-#endif
|
||||
-
|
||||
if (!mode_option) {
|
||||
mode->specified = false;
|
||||
return false;
|
@ -0,0 +1,41 @@
|
||||
From d89b3f22cf7b6bba8081f6d16c9087019fdcf586 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 18 Nov 2019 16:51:32 +0100
|
||||
Subject: [PATCH] drm/modes: parse_cmdline: Explicitly memset the
|
||||
passed in drm_cmdline_mode struct
|
||||
|
||||
Commit d1fe276b5115f0d581c3cfe6154633b3547e8aab upstream.
|
||||
|
||||
Instead of only setting mode->specified on false on an early exit and
|
||||
leaving e.g. mode->bpp_specified and mode->refresh_specified as is,
|
||||
lets be consistent and just zero out the entire passed in struct at
|
||||
the top of drm_mode_parse_command_line_for_connector()
|
||||
|
||||
Changes in v3:
|
||||
-Drop "mode->specified = false;" line instead of the "return false;" (oops)
|
||||
This crasher was reported-by: kernel test robot <lkp@intel.com>
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20191118155134.30468-11-hdegoede@redhat.com
|
||||
---
|
||||
drivers/gpu/drm/drm_modes.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_modes.c
|
||||
+++ b/drivers/gpu/drm/drm_modes.c
|
||||
@@ -1745,12 +1745,11 @@ bool drm_mode_parse_command_line_for_con
|
||||
char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
|
||||
int i, len, ret;
|
||||
|
||||
+ memset(mode, 0, sizeof(*mode));
|
||||
mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
||||
|
||||
- if (!mode_option) {
|
||||
- mode->specified = false;
|
||||
+ if (!mode_option)
|
||||
return false;
|
||||
- }
|
||||
|
||||
name = mode_option;
|
||||
|
Loading…
x
Reference in New Issue
Block a user