mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: barebox@lists.infradead.org
Subject: [PATCH] net/e1000: allow to overwrite flash size from device tree
Date: Thu, 12 Jul 2018 11:29:11 +0200	[thread overview]
Message-ID: <20180712092911.8475-1-u.kleine-koenig@pengutronix.de> (raw)

When barebox probes the e1000 driver and the flash on the i210 device is
unprogrammed, the driver assumes the flash has a size of only 4 kiB.
This is annoying because to program the flash an image must be written
that is bigger than 4 kiB. So you first have to flash the first sector
to make barebox detect the right size on the next boot. Then reset the
board to be able to write the remaining data.

To work around that limitation, try to read the actual size from the
device tree. (Note however that barebox' pci code currently doesn't use
the device tree and so currently this try always fails without further
patching.)

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/net/e1000/eeprom.c | 57 ++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 14 deletions(-)

diff --git a/drivers/net/e1000/eeprom.c b/drivers/net/e1000/eeprom.c
index 3f39db7164db..97cb09a718f9 100644
--- a/drivers/net/e1000/eeprom.c
+++ b/drivers/net/e1000/eeprom.c
@@ -3,6 +3,8 @@
 #include <malloc.h>
 #include <linux/math64.h>
 #include <linux/sizes.h>
+#include <of_device.h>
+#include <linux/pci.h>
 #include <linux/mtd/spi-nor.h>
 
 #include "e1000.h"
@@ -406,6 +408,46 @@ static void e1000_eeprom_uses_microwire(struct e1000_eeprom_info *eeprom,
 }
 
 
+size_t e1000_igb_get_flash_size(struct e1000_hw *hw)
+{
+	struct device_node *node =
+		hw->pdev->dev.device_node;
+	u32 flash_size;
+	uint32_t fla;
+	int ret = 0;
+
+	/*
+	 * There are two potential places where the size of the flash can be
+	 * specified. In the device tree, and in the flash itself.  Use the
+	 * first that looks valid.
+	 */
+
+	ret = of_property_read_u32(node, "flash-size", &flash_size);
+	if (ret == 0) {
+		dev_info(hw->dev,
+			 "Determined flash size from device tree (%u)\n",
+			 flash_size);
+		return flash_size;
+	}
+
+	fla = e1000_read_reg(hw, E1000_FLA);
+	fla &= E1000_FLA_FL_SIZE_MASK;
+	fla >>= E1000_FLA_FL_SIZE_SHIFT;
+
+	if (fla) {
+		flash_size = SZ_64K << fla;
+		dev_info(hw->dev,
+			 "Determined flash size from E1000_FLA.FL_SIZE (%u)\n",
+			 flash_size);
+		return flash_size;
+	}
+
+	dev_info(hw->dev,
+		 "Unprogrammed Flash detected and no flash-size found in device tree, limiting access to first 4 kiB\n");
+
+	return 4096;
+}
+
 /******************************************************************************
  * Sets up eeprom variables in the hw struct.  Must be called after mac_type
  * is configured.  Additionally, if this is ICH8, the flash controller GbE
@@ -480,20 +522,7 @@ int32_t e1000_init_eeprom_params(struct e1000_hw *hw)
 
 	case e1000_igb:
 		if (eecd & E1000_EECD_I210_FLASH_DETECTED) {
-			uint32_t fla;
-
-			fla  = e1000_read_reg(hw, E1000_FLA);
-			fla &= E1000_FLA_FL_SIZE_MASK;
-			fla >>= E1000_FLA_FL_SIZE_SHIFT;
-
-			if (fla) {
-				eeprom->word_size = (SZ_64K << fla) / 2;
-			} else {
-				eeprom->word_size = 2048;
-				dev_info(hw->dev, "Unprogrammed Flash detected, "
-					 "limiting access to first 4KB\n");
-			}
-
+			eeprom->word_size = e1000_igb_get_flash_size(hw) / 2;
 			eeprom->acquire = e1000_acquire_eeprom_flash;
 			eeprom->release = e1000_release_eeprom_flash;
 		}
-- 
2.18.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

             reply	other threads:[~2018-07-12  9:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-12  9:29 Uwe Kleine-König [this message]
2018-07-12  9:39 ` [PATCH] fixup! " Uwe Kleine-König
2018-07-13  6:24 ` [PATCH] " Sascha Hauer

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=20180712092911.8475-1-u.kleine-koenig@pengutronix.de \
    --to=u.kleine-koenig@pengutronix.de \
    --cc=barebox@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox