[coreboot-gerrit] New patch to review for coreboot: ff79c3e nvidia/tegra*: check bus number for i2c driver APIs

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Tue Apr 21 15:19:09 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9913

-gerrit

commit ff79c3eba9f5f527cd0caec4446e0ddc51875c83
Author: Yen Lin <yelin at nvidia.com>
Date:   Fri Apr 3 16:32:26 2015 -0700

    nvidia/tegra*: check bus number for i2c driver APIs
    
    BRANCH=None
    BUG=None
    TEST=emerge-foster coreboot
    
    Change-Id: I383d2b5f269ed348065a9f270f80514a2ff45742
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: fba6973c304e1612a9869c2e78a08650b6e5fe66
    Original-Change-Id: I6d5d0098db8dbfb21529bf112a04b97779a0f381
    Original-Signed-off-by: Yen Lin <yelin at nvidia.com>
    Original-Reviewed-on: https://chromium-review.googlesource.com/264027
    Original-Reviewed-by: Furquan Shaikh <furquan at chromium.org>
---
 src/soc/nvidia/tegra/i2c.c    | 18 ++++++++++++++++--
 src/soc/nvidia/tegra/i2c.h    |  2 ++
 src/soc/nvidia/tegra124/i2c.c |  2 ++
 src/soc/nvidia/tegra132/i2c.c |  2 ++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/soc/nvidia/tegra/i2c.c b/src/soc/nvidia/tegra/i2c.c
index 1d5df3c..2ba1700 100644
--- a/src/soc/nvidia/tegra/i2c.c
+++ b/src/soc/nvidia/tegra/i2c.c
@@ -194,8 +194,14 @@ static int i2c_transfer_segment(unsigned bus, unsigned chip, int restart,
 int platform_i2c_transfer(unsigned bus, struct i2c_seg *segments, int count)
 {
 	struct i2c_seg *seg = segments;
-
 	int i;
+
+	if (bus >= g_num_i2c_buses) {
+		printk(BIOS_ERR, "%s: ERROR: invalid I2C bus (%u)\n", __func__,
+		       bus);
+		return -1;
+	}
+
 	for (i = 0; i < count; seg++, i++) {
 		if (i2c_transfer_segment(bus, seg->chip, i < count - 1,
 					 seg->read, seg->buf, seg->len))
@@ -206,7 +212,15 @@ int platform_i2c_transfer(unsigned bus, struct i2c_seg *segments, int count)
 
 void i2c_init(unsigned bus)
 {
-	struct tegra_i2c_regs * const regs = tegra_i2c_info[bus].base;
+	struct tegra_i2c_regs *regs;
+
+	if (bus >= g_num_i2c_buses) {
+                printk(BIOS_ERR, "%s: ERROR: invalid I2C bus (%u)\n", __func__,
+		       bus);
+		return;
+	}
+
+	regs = tegra_i2c_info[bus].base;
 
 	write32(&regs->cnfg, I2C_CNFG_PACKET_MODE_EN);
 }
diff --git a/src/soc/nvidia/tegra/i2c.h b/src/soc/nvidia/tegra/i2c.h
index 9d7de14..e81fd1c 100644
--- a/src/soc/nvidia/tegra/i2c.h
+++ b/src/soc/nvidia/tegra/i2c.h
@@ -172,4 +172,6 @@ struct tegra_i2c_regs {
 };
 check_member(tegra_i2c_regs, config_load, 0x8C);
 
+extern unsigned g_num_i2c_buses;
+
 #endif	/* __SOC_NVIDIA_TEGRA_I2C_H__ */
diff --git a/src/soc/nvidia/tegra124/i2c.c b/src/soc/nvidia/tegra124/i2c.c
index a7eee68..824862b 100644
--- a/src/soc/nvidia/tegra124/i2c.c
+++ b/src/soc/nvidia/tegra124/i2c.c
@@ -53,3 +53,5 @@ struct tegra_i2c_bus_info tegra_i2c_info[] = {
 		.reset_func = &clock_reset_x
 	}
 };
+
+unsigned g_num_i2c_buses = ARRAY_SIZE(tegra_i2c_info);
diff --git a/src/soc/nvidia/tegra132/i2c.c b/src/soc/nvidia/tegra132/i2c.c
index dc85806..b0ab31a 100644
--- a/src/soc/nvidia/tegra132/i2c.c
+++ b/src/soc/nvidia/tegra132/i2c.c
@@ -53,3 +53,5 @@ struct tegra_i2c_bus_info tegra_i2c_info[] = {
 		.reset_func = &clock_reset_x
 	}
 };
+
+unsigned g_num_i2c_buses = ARRAY_SIZE(tegra_i2c_info);



More information about the coreboot-gerrit mailing list