pinctrl: tegra20: detect unknown/invalid pin/func configurations
authorArtur Kowalski <arturkow2000@gmail.com>
Sun, 30 Mar 2025 19:11:54 +0000 (21:11 +0200)
committerSvyatoslav Ryhel <clamor95@gmail.com>
Sat, 12 Apr 2025 06:47:42 +0000 (09:47 +0300)
Tegra20 driver doesn't know about some pin configurations and even about
some pins. In case when pin configuration is unknown the pin would be
muxed to whatever is under function 0, in case when pin itself is
unknown, it could cause out-of-bounds array access in pinmux_set_func
and pinmux_set_pullupdown.

Signed-off-by: Artur Kowalski <arturkow2000@gmail.com>
Reviewed-by: Svyatoslav Ryhel <clamor95@gmail.com>
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/pinctrl/tegra/pinctrl-tegra20.c

index d59b3ec..c32d590 100644 (file)
@@ -37,6 +37,11 @@ static void tegra_pinctrl_set_pin(struct udevice *config)
                                if (!strcmp(pins[i], tegra_pinctrl_to_pingrp[pin_id]))
                                        break;
 
+               if (pin_id == PMUX_PINGRP_COUNT) {
+                       log_debug("%s: %s(%d) is not valid\n", __func__, pins[i], pin_id);
+                       continue;
+               }
+
                if (pull >= 0)
                        pinmux_set_pullupdown(pin_id, pull);
 
@@ -58,13 +63,16 @@ static void tegra_pinctrl_set_func(struct udevice *config)
        const char **pins;
 
        function = dev_read_string(config, "nvidia,function");
-       if (function)
+       if (function) {
                for (i = 0; i < PMUX_FUNC_COUNT; i++)
                        if (tegra_pinctrl_to_func[i])
                                if (!strcmp(function, tegra_pinctrl_to_func[i]))
                                        break;
 
-       func_id = i;
+               func_id = i;
+       } else {
+               func_id = PMUX_FUNC_COUNT;
+       }
 
        count = dev_read_string_list(config, "nvidia,pins", &pins);
        if (count < 0) {
@@ -78,6 +86,12 @@ static void tegra_pinctrl_set_func(struct udevice *config)
                                if (!strcmp(pins[i], tegra_pinctrl_to_pingrp[pin_id]))
                                        break;
 
+               if (func_id == PMUX_FUNC_COUNT || pin_id == PMUX_PINGRP_COUNT) {
+                       log_debug("%s: pin %s(%d) or function %s(%d) is not valid\n",
+                                 __func__, pins[i], pin_id, function, func_id);
+                       continue;
+               }
+
                debug("%s(%d) muxed to %s(%d)\n", pins[i], pin_id, function, func_id);
 
                pinmux_set_func(pin_id, func_id);