cros_bundle_firmware: Support early-firmware-selection blob types

When early-firmware-selection is enabled, we use the 'type,efs' field instead
of 'type'. This allows us to specify different blobs in that case.

Enable 'early-firmware-selection' as a boolean property in /chromeos-config
and provide a --efs option to force it to be enabled for convenience during
development.

BUG=chrome-os-partner:21115
TEST=FEATURES=test sudo -E  emerge cros-devutils
Not specifically tested yet. Tested by later commits.

Change-Id: I7d77508d7c8cdc7fcd243b4240476a9c34231532
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/62962
diff --git a/host/lib/bundle_firmware.py b/host/lib/bundle_firmware.py
index 13dacde..cf73204 100644
--- a/host/lib/bundle_firmware.py
+++ b/host/lib/bundle_firmware.py
@@ -223,6 +223,7 @@
     self._board = None          # Board name, e.g. tegra2_seaboard.
     self._fdt_fname = None      # Filename of our FDT.
     self._force_rw = None
+    self._force_efs = None
     self._gbb_flags = None
     self._keydir = None
     self._small = False
@@ -289,7 +290,7 @@
     self.kernel_fname = kernel
     self.blobs = dict(blobs or ())
 
-  def SetOptions(self, small, gbb_flags, force_rw=False):
+  def SetOptions(self, small, gbb_flags, force_rw=False, force_efs=False):
     """Set up options supported by Bundle.
 
     Args:
@@ -298,10 +299,13 @@
           U-Boot part while keeping the keys, gbb, etc. the same.
       gbb_flags: Specification for string containing adjustments to make.
       force_rw: Force firmware into RW mode.
+      force_efs: Force firmware to use 'early firmware selection' feature,
+          where RW firmware is selected before SDRAM is initialized.
     """
     self._small = small
     self._gbb_flags = gbb_flags
     self._force_rw = force_rw
+    self._force_efs = force_efs
 
   def _GetBuildRoot(self):
     """Get the path to this board's 'firmware' directory.
@@ -905,6 +909,8 @@
     if self._force_rw:
       fdt.PutInteger('/flash/rw-a-vblock', 'preamble-flags', 0)
       fdt.PutInteger('/flash/rw-b-vblock', 'preamble-flags', 0)
+    if self._force_efs:
+      fdt.PutInteger('/chromeos-config', 'early-firmware-selection', 1)
 
     if not fdt.GetProp('/flash', 'reg', ''):
       fdt.InsertNodes(default_flashmap)