| NXP i.MX System Controller Firmware (SCFW) |
| -------------------------------------------------------------------- |
| |
| The System Controller Firmware (SCFW) is a low-level system function |
| which runs on a dedicated Cortex-M core to provide power, clock, and |
| resource management. It exists on some i.MX8 processors. e.g. i.MX8QM |
| (QM, QP), and i.MX8QX (QXP, DX). |
| |
| The AP communicates with the SC using a multi-ported MU module found |
| in the LSIO subsystem. The current definition of this MU module provides |
| 5 remote AP connections to the SC to support up to 5 execution environments |
| (TZ, HV, standard Linux, etc.). The SC side of this MU module interfaces |
| with the LSIO DSC IP bus. The SC firmware will communicate with this MU |
| using the MSI bus. |
| |
| System Controller Device Node: |
| ============================================================ |
| |
| The scu node with the following properties shall be under the /firmware/ node. |
| |
| Required properties: |
| ------------------- |
| - compatible: should be "fsl,imx-scu". |
| - mbox-names: should include "tx0", "tx1", "tx2", "tx3", |
| "rx0", "rx1", "rx2", "rx3"; |
| include "gip3" if want to support general MU interrupt. |
| - mboxes: List of phandle of 4 MU channels for tx, 4 MU channels for |
| rx, and 1 optional MU channel for general interrupt. |
| All MU channels must be in the same MU instance. |
| Cross instances are not allowed. The MU instance can only |
| be one of LSIO MU0~M4 for imx8qxp and imx8qm. Users need |
| to make sure use the one which is not conflict with other |
| execution environments. e.g. ATF. |
| Note: |
| Channel 0 must be "tx0" or "rx0". |
| Channel 1 must be "tx1" or "rx1". |
| Channel 2 must be "tx2" or "rx2". |
| Channel 3 must be "tx3" or "rx3". |
| General interrupt rx channel must be "gip3". |
| e.g. |
| mboxes = <&lsio_mu1 0 0 |
| &lsio_mu1 0 1 |
| &lsio_mu1 0 2 |
| &lsio_mu1 0 3 |
| &lsio_mu1 1 0 |
| &lsio_mu1 1 1 |
| &lsio_mu1 1 2 |
| &lsio_mu1 1 3 |
| &lsio_mu1 3 3>; |
| See Documentation/devicetree/bindings/mailbox/fsl,mu.yaml |
| for detailed mailbox binding. |
| |
| Note: Each mu which supports general interrupt should have an alias correctly |
| numbered in "aliases" node. |
| e.g. |
| aliases { |
| mu1 = &lsio_mu1; |
| }; |
| |
| i.MX SCU Client Device Node: |
| ============================================================ |
| |
| Client nodes are maintained as children of the relevant IMX-SCU device node. |
| |
| Power domain bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| This binding for the SCU power domain providers uses the generic power |
| domain binding[2]. |
| |
| Required properties: |
| - compatible: Should be one of: |
| "fsl,imx8qm-scu-pd", |
| "fsl,imx8qxp-scu-pd" |
| followed by "fsl,scu-pd" |
| |
| - #power-domain-cells: Must be 1. Contains the Resource ID used by |
| SCU commands. |
| See detailed Resource ID list from: |
| include/dt-bindings/firmware/imx/rsrc.h |
| |
| Clock bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| This binding uses the common clock binding[1]. |
| |
| Required properties: |
| - compatible: Should be one of: |
| "fsl,imx8qm-clk" |
| "fsl,imx8qxp-clk" |
| followed by "fsl,scu-clk" |
| - #clock-cells: Should be 2. |
| Contains the Resource and Clock ID value. |
| - clocks: List of clock specifiers, must contain an entry for |
| each required entry in clock-names |
| - clock-names: Should include entries "xtal_32KHz", "xtal_24MHz" |
| |
| The clock consumer should specify the desired clock by having the clock |
| ID in its "clocks" phandle cell. |
| |
| See the full list of clock IDs from: |
| include/dt-bindings/clock/imx8qxp-clock.h |
| |
| Pinctrl bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| This binding uses the i.MX common pinctrl binding[3]. |
| |
| Required properties: |
| - compatible: Should be one of: |
| "fsl,imx8qm-iomuxc", |
| "fsl,imx8qxp-iomuxc", |
| "fsl,imx8dxl-iomuxc". |
| |
| Required properties for Pinctrl sub nodes: |
| - fsl,pins: Each entry consists of 3 integers which represents |
| the mux and config setting for one pin. The first 2 |
| integers <pin_id mux_mode> are specified using a |
| PIN_FUNC_ID macro, which can be found in |
| <dt-bindings/pinctrl/pads-imx8qm.h>, |
| <dt-bindings/pinctrl/pads-imx8qxp.h>, |
| <dt-bindings/pinctrl/pads-imx8dxl.h>. |
| The last integer CONFIG is the pad setting value like |
| pull-up on this pin. |
| |
| Please refer to i.MX8QXP Reference Manual for detailed |
| CONFIG settings. |
| |
| [1] Documentation/devicetree/bindings/clock/clock-bindings.txt |
| [2] Documentation/devicetree/bindings/power/power-domain.yaml |
| [3] Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt |
| |
| RTC bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| Required properties: |
| - compatible: should be "fsl,imx8qxp-sc-rtc"; |
| |
| OCOTP bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| Required properties: |
| - compatible: Should be one of: |
| "fsl,imx8qm-scu-ocotp", |
| "fsl,imx8qxp-scu-ocotp". |
| - #address-cells: Must be 1. Contains byte index |
| - #size-cells: Must be 1. Contains byte length |
| |
| Optional Child nodes: |
| |
| - Data cells of ocotp: |
| Detailed bindings are described in bindings/nvmem/nvmem.txt |
| |
| Watchdog bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| Required properties: |
| - compatible: should be: |
| "fsl,imx8qxp-sc-wdt" |
| followed by "fsl,imx-sc-wdt"; |
| Optional properties: |
| - timeout-sec: contains the watchdog timeout in seconds. |
| |
| SCU key bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| Required properties: |
| - compatible: should be: |
| "fsl,imx8qxp-sc-key" |
| followed by "fsl,imx-sc-key"; |
| - linux,keycodes: See Documentation/devicetree/bindings/input/input.yaml |
| |
| Thermal bindings based on SCU Message Protocol |
| ------------------------------------------------------------ |
| |
| Required properties: |
| - compatible: Should be : |
| "fsl,imx8qxp-sc-thermal" |
| followed by "fsl,imx-sc-thermal"; |
| |
| - #thermal-sensor-cells: See Documentation/devicetree/bindings/thermal/thermal-sensor.yaml |
| for a description. |
| |
| Example (imx8qxp): |
| ------------- |
| aliases { |
| mu1 = &lsio_mu1; |
| }; |
| |
| lsio_mu1: mailbox@5d1c0000 { |
| ... |
| #mbox-cells = <2>; |
| }; |
| |
| firmware { |
| scu { |
| compatible = "fsl,imx-scu"; |
| mbox-names = "tx0", "tx1", "tx2", "tx3", |
| "rx0", "rx1", "rx2", "rx3", |
| "gip3"; |
| mboxes = <&lsio_mu1 0 0 |
| &lsio_mu1 0 1 |
| &lsio_mu1 0 2 |
| &lsio_mu1 0 3 |
| &lsio_mu1 1 0 |
| &lsio_mu1 1 1 |
| &lsio_mu1 1 2 |
| &lsio_mu1 1 3 |
| &lsio_mu1 3 3>; |
| |
| clk: clk { |
| compatible = "fsl,imx8qxp-clk", "fsl,scu-clk"; |
| #clock-cells = <2>; |
| }; |
| |
| iomuxc { |
| compatible = "fsl,imx8qxp-iomuxc"; |
| |
| pinctrl_lpuart0: lpuart0grp { |
| fsl,pins = < |
| SC_P_UART0_RX_ADMA_UART0_RX 0x06000020 |
| SC_P_UART0_TX_ADMA_UART0_TX 0x06000020 |
| >; |
| }; |
| ... |
| }; |
| |
| ocotp: imx8qx-ocotp { |
| compatible = "fsl,imx8qxp-scu-ocotp"; |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| fec_mac0: mac@2c4 { |
| reg = <0x2c4 8>; |
| }; |
| }; |
| |
| pd: imx8qx-pd { |
| compatible = "fsl,imx8qxp-scu-pd", "fsl,scu-pd"; |
| #power-domain-cells = <1>; |
| }; |
| |
| rtc: rtc { |
| compatible = "fsl,imx8qxp-sc-rtc"; |
| }; |
| |
| scu_key: scu-key { |
| compatible = "fsl,imx8qxp-sc-key", "fsl,imx-sc-key"; |
| linux,keycodes = <KEY_POWER>; |
| }; |
| |
| watchdog { |
| compatible = "fsl,imx8qxp-sc-wdt", "fsl,imx-sc-wdt"; |
| timeout-sec = <60>; |
| }; |
| |
| tsens: thermal-sensor { |
| compatible = "fsl,imx8qxp-sc-thermal", "fsl,imx-sc-thermal"; |
| #thermal-sensor-cells = <1>; |
| }; |
| }; |
| }; |
| |
| serial@5a060000 { |
| ... |
| pinctrl-names = "default"; |
| pinctrl-0 = <&pinctrl_lpuart0>; |
| clocks = <&uart0_clk IMX_SC_R_UART_0 IMX_SC_PM_CLK_PER>; |
| clock-names = "ipg"; |
| power-domains = <&pd IMX_SC_R_UART_0>; |
| }; |