Broadcom Devicetree Selection

When loading a devicetree blob from flash, BOLT will first check the flash
partition to determine if it contains a gzip'd tarball of blobs or a single
blob. If a single blob is present it will load that blob and continue while
if a gzip'd tarball is present then BOLT will decompress the tarball and
scan each blob in it logically evaluating the child nodes of the root node
named "identifier@N" (N is a #). The first blob found in which the identifier
nodes evaluate to a logical true will be used.

An identifier node is evaluated by performing operations as described below
on the values in following property groups within the node. The operations
on the property groups result in a logical true or false. The identifier
node result is the logical AND of the results of the property groups.

Identifier node properties:
- chipid_reg, chip_mask, chip_val
	While the "chipid" string in the name of each of these properties
	implies that they only relate to chip ID, they are used more broadly
	to read a register at the address specified by chip_reg, apply the
	mask specified by chipid_mask to the value read, and compare the
	result to the value specified in the chip_id property. Each of
	these properties can contain multiple 32-bit integers, but
	they must all contain the same number of integers as a 3-tuple of
	one integer from each property is necessary to perform the read,
	mask, and compare operation. The result of the operations on each
	tuple is logically AND'd to determine the logical result for these
	3 properties. The chipid_reg values are an offset from base address
	0xd0000000.

- boardid_mask, boardid_val
	These properties may contain multiple 8-bit integers, but they must
	both contain the same qualtity of integers. Similar to the chipid_...
	properties, a single integer at the same index is taken from each
	property to form a 2-tuple. The platform's board ID is read from
	the hardware, the boardid_mask is applied to the value read, and
	the result is compared to the boardid_val value. The results for each
	index are AND'd to arrive at the logical result for these properties.


When  a single identifier@0 node exists it must evaluate to a logical true
for the blob to be selected. If multiple identifier@N nodes exist then each
is logically evaluated and the results logically OR'd to determine the blob
selection. Thus the blob will be selected if any of the identifier nodes is
true.

Example:
	identifier@0 {
			    /* chip id    mfg id     a/c pwr    don't park */
		chipid_reg = < 0x20404000 0x204e6120 0x03800080 0x20410068 >;
		chipid_msk = < 0xffffffff 0x0000e000 0x00000008 0x00000001 >;
		chipid_val = < 0x33900010 0x0000c000 0x00000000 0x00000000 >;
			     /* SMWVG */
		boardid_msk = < 0xf0 >;
		boardid_val = < 0x40 >;
	};

	identifier@1 {
			    /* chip id    mfg id     a/c pwr    don't park */
		chipid_reg = < 0x20404000 0x204e6120 0x03800080 0x20410068 >;
		chipid_msk = < 0xffffffff 0x0000f000 0x00000008 0x00000001 >;
		chipid_val = < 0x33900010 0x00008000 0x00000000 0x00000000 >;
			     /* SMWVG */
		boardid_msk = < 0xf0 >;
		boardid_val = < 0x40 >;
	};

	identifier@2 {
			    /* chip id    mfg id     a/c pwr    don't park */
		chipid_reg = < 0x20404000 0x204e6120 0x03800080 0x20410068 >;
		chipid_msk = < 0xffffffff 0x0000e000 0x00000008 0x00000001 >;
		chipid_val = < 0x33900010 0x00006000 0x00000000 0x00000000 >;
			     /* SMWVG */
		boardid_msk = < 0xf0 >;
		boardid_val = < 0x40 >;
	};
