diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2018-11-01 19:25:54 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-11-02 07:34:43 +0100 |
commit | fe1901c17fbe16497a3c2b129b45b37f03564cfe (patch) | |
tree | 7ecc32a83ab6aa9f983a329fdf6799008940c8b2 | |
parent | c8e09aaad36cdb2a7ca99607d20f2c949ca755e6 (diff) | |
download | barebox-fe1901c17fbe16497a3c2b129b45b37f03564cfe.tar.gz barebox-fe1901c17fbe16497a3c2b129b45b37f03564cfe.tar.xz |
ARM: rdu2: program e1000 iNVM
Check if the iNVM is already correctly written. If it isn't write
the correct value in, so the device uses the correct PCI ID for the
Linux driver.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/boards/zii-imx6q-rdu2/board.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/boards/zii-imx6q-rdu2/board.c b/arch/arm/boards/zii-imx6q-rdu2/board.c index 49cc234c02..960c5ba533 100644 --- a/arch/arm/boards/zii-imx6q-rdu2/board.c +++ b/arch/arm/boards/zii-imx6q-rdu2/board.c @@ -15,6 +15,7 @@ #include <common.h> #include <envfs.h> +#include <fs.h> #include <gpio.h> #include <i2c/i2c.h> #include <init.h> @@ -226,3 +227,32 @@ static int rdu2_ethernet_init(void) return 0; } late_initcall(rdu2_ethernet_init); + +#define I210_CFGWORD_PCIID_157B 0x157b1a11 +static int rdu2_i210_invm(void) +{ + int fd; + u32 val; + + if (!of_machine_is_compatible("zii,imx6q-zii-rdu2") && + !of_machine_is_compatible("zii,imx6qp-zii-rdu2")) + return 0; + + fd = open("/dev/e1000-invm0", O_RDWR); + if (fd < 0) { + pr_err("could not open e1000 iNVM device!\n"); + return fd; + } + + pread(fd, &val, sizeof(val), 0); + if (val == I210_CFGWORD_PCIID_157B) { + pr_debug("i210 already programmed correctly\n"); + return 0; + } + + val = I210_CFGWORD_PCIID_157B; + pwrite(fd, &val, sizeof(val), 0); + + return 0; +} +late_initcall(rdu2_i210_invm); |