diff --git a/common/hwconfig.c b/common/hwconfig.c
index 1f9f4a09b4b5a2293c995a9ef4a714b7a60099d0..3c9759fc557547fa8a2f0bc16fa87658fa166e23 100644
--- a/common/hwconfig.c
+++ b/common/hwconfig.c
@@ -26,6 +26,8 @@
 #define min(a, b) (((a) < (b)) ? (a) : (b))
 #endif /* HWCONFIG_TEST */
 
+DECLARE_GLOBAL_DATA_PTR;
+
 static const char *hwconfig_parse(const char *opts, size_t maxlen,
 				  const char *opt, char *stopchs, char eqch,
 				  size_t *arglen)
@@ -69,9 +71,26 @@ next:
 const char *cpu_hwconfig __attribute__((weak));
 const char *board_hwconfig __attribute__((weak));
 
+#define HWCONFIG_PRE_RELOC_BUF_SIZE	128
+
 static const char *__hwconfig(const char *opt, size_t *arglen)
 {
-	const char *env_hwconfig = getenv("hwconfig");
+	const char *env_hwconfig = NULL;
+	char buf[HWCONFIG_PRE_RELOC_BUF_SIZE];
+
+	if (gd->flags & GD_FLG_ENV_READY) {
+		env_hwconfig = getenv("hwconfig");
+	} else {
+		/*
+		 * Use our own on stack based buffer before relocation to allow
+		 * accessing longer hwconfig strings that might be in the
+		 * environment before we've relocated.  This is pretty fragile
+		 * on both the use of stack and if the buffer is big enough.
+		 * However we will get a warning from getenv_f for the later.
+		 */
+		if ((getenv_f("hwconfig", buf, sizeof(buf))) > 0)
+			env_hwconfig = buf;
+	}
 
 	if (env_hwconfig)
 		return hwconfig_parse(env_hwconfig, strlen(env_hwconfig),