Broadcom FPM

The Free Pool Manager (FPM) is a block of hardware that manages a pool of
memory. This memory pool and its management is done via hardware, outside
the knowledge of Linux's memory management. The FPM hardware can support 1
or 2 memory pools depending on the specific SoC.

Required properties:

- compatible:
    Must be "brcm,fpm"

- reg:
    entry    description
    1        Defines the base and size of the I/O address space of FPM memory
             pool 0.
    2        Defines the base and size of the I/O address space of the FPM
             registers.

- interrupts:
    The interrupt of the FPM hardware block.

- interrupt-parent:
    phandle of the parent interrupt controller.

- init:
    Whether the driver should init the FPM hardware (1) or not (0). On some
    system configurations the FPM hardware block may have already been
    initialized by another CPU or virtual machine instance.

- track-tokens:
    Specifies whether to enable (1) or disable (0) the drivers token tracking
    feature.

- track-on-err:
    Specifies whether the token tracking should begin when the drivers is
    initialized or when an error is first detected by the FPM hardware.

Optional Properties:

- pool-alloc-weight, pool-free-weight:
    On SoC's that support multiple pools these specify the weighting to be
    applied to each pool by the allocation and free algorithm in the FPM
    hardware.

- reg:
    On SoC's that support multiple pools and/or have UBUS capture engines the
    following entries can be added to the reg property.

    entry    description
    3        Defines the base and size of the I/O address space of FPM memory
             pool 1.
    4        Defines the base and size of the I/O address space of UBUS capture
             engine 0's registers.
    5        Defines the base and size of the I/O address space of UBUS capture
             engine 1's registers.

BCM3390 example:

        fpm@0xd3a00000 {
                compatible = "brcm,fpm";
                reg = <0x0 0x0BC00000 0x0 0x02000000>,  /* Free Pool 0                  */
                      <0x0 0xd3a00000 0x0 0x30133>;     /* Registers                    */
                      <0x0 0x86000000 0x0 0x02000000>,  /* Free Pool 1                  */
                      <0x0 0xd7e00000 0x0 0x1000>,      /* UBUS capture engines 0       */
                      <0x0 0xd3e00000 0x0 0x1000>;      /* UBUS capture engines 1       */
                interrupts = <0 127 0>;
                init = <1>;
                pool-alloc-weight       = <1 1>;
                pool-free-weight        = <1 1>;
                track-tokens = <1>;
                track-on-err = <0>;
        };

BCM3384 example:

        fpm@0x12200000 {
                compatible = "brcm,fpm";
                reg = <0x06000000 0x02000000>,  /* Free Pool 0  */
                      <0x12200000 0x14000>;     /* Registers    */
                interrupt-parent = <&periph_intc>;
                interrupts = <49>;
                init = <1>;
                track-tokens = <1>;
                track-on-err = <0>;
        };
