Skip to content

DOCSIS 4.0: BCM33940/BCM33941 #80

@andrewjlamarche

Description

@andrewjlamarche

Hi, DOCSIS 4.0 is here. Broadcom's DOCSIS 4.0 chip is the BCM33940/BCM33941. The associated R-PHY chip appears to be BCM3162/BCM3163. I found a kernel patch referencing these chips: https://lore.kernel.org/all/[email protected]/

BCM3394x is a quad-core ARM cortex a53 chip, but Broadcom calls it a b53 core. It has a separate co-processor called "SMC", probably "Secure Monitor Coprocessor" or something. The unique part about this SoC is the entire flash appears encrypted, including the boot loaders.

From what I can tell, the bootROM contains the logic and keys to decrypt and verify each flash partition, and there are a lot:

flash-smcnvo              LUN   0 124KB
flash-smcnvb              LUN   1 124KB
flash-bolto               LUN   2   1MB
flash-boltb               LUN   3   1MB
flash-kernelo             LUN   4  16MB
flash-kernelb             LUN   5  16MB
flash-rgo                 LUN   6 1023MB
flash-rgb                 LUN   7 1023MB
flash-cmblo               LUN   8   1MB
flash-cmblb               LUN   9   1MB
flash-cmo                 LUN  10  20MB
flash-cmb                 LUN  11  20MB
flash-nvramo              LUN  12 124KB
flash-nvramb              LUN  13 124KB
flash-devtreeo            LUN  14 512KB
flash-devtreeb            LUN  15 512KB
flash-rgnonvolo           LUN  16  39MB
flash-rgnonvolb           LUN  17  39MB
flash-rdknvramo           LUN  18  99MB
flash-rdknvramb           LUN  19  99MB
flash-cmnvpo              LUN  20   1MB
flash-cmnvpb              LUN  21   1MB
flash-cmnvdo              LUN  22   1MB
flash-cmnvdb              LUN  23   1MB
flash-smcblo              LUN  24 256KB
flash-smcblb              LUN  25 256KB
flash-smcoso              LUN  26   1MB
flash-smcosb              LUN  27   1MB
flash-gfapo               LUN  28   1MB
flash-gfapb               LUN  29   1MB
flash-macadro             LUN  30 124KB
flash-macadrb             LUN  31 124KB
flash-reservedo           LUN  32   1MB
flash-reservedb           LUN  33   1MB
flash-asfo                LUN  34   8MB
flash-asfb                LUN  35   8MB
flash-custcfgpo           LUN  36 128KB
flash-custcfgpb           LUN  37 128KB
flash-stao                LUN  38 256MB
flash-stab                LUN  39 256MB
flash-debugo              LUN  40   3MB
flash-ramlogo             LUN  41   4MB
flash-amso                LUN  42   2MB
flash-amsb                LUN  43   2MB
flash-atao                LUN  44   8MB
flash-atab                LUN  45   8MB
flash-bp3lico             LUN  46  31MB
flash-bp3licb             LUN  47  31MB
flash-smcnvexto           LUN  48 252KB
flash-smcnvextb           LUN  49 252KB
flash-custcfgdo           LUN  50 256KB
flash-custcfgdb           LUN  51 256KB
flash-customo             LUN  52   2GB
flash-customb             LUN  53   2GB

The partitions are also exposed to the kernel via a Logical Unit Number (LUN) rather than directly as an eMMC storage device. The kernel can see all the partitions, but many it cannot ready (SMC*) and many are encrypted even when booted.

BOLT is still used as the application processor's boot loader. Here's the soc_base device tree:

SoC Base Device Tree
/dts-v1/;

/ {
#address-cells = <0x02>;
#size-cells = <0x02>;
interrupt-parent = <0x01>;
compatible = "brcm,soc_base", "brcm,brcmcm", "brcm,brcmstb";

platform-match {
	layer = <0x00>;
	match = "!((e & !f) | g | h | i | j)";

	e {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0x316200>;
	};

	f {
		type = "env";
		env-var = "CMTS_TYPE";
	};

	g {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf5790000>;
	};

	h {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf9fc0000>;
	};

	i {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf6510000>;
	};

	j {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf2b00000>;
	};
};

chosen {
	bootargs = "root=/dev/flash-rgo earlycon debug bhpa=0@0 nr_cpus=1";
	stdout-path = "/dbg-uarta:115200";
	phandle = <0x1a>;
};

reserved-memory {
	#address-cells = <0x02>;
	#size-cells = <0x02>;
	ranges;
	phandle = <0x1b>;

	reserved-nodma@0 {
		reg = <0x00 0x00 0x00 0x1000>;
	};

	NWMBOX {
		compatible = "arm,scmi-shmem";
		phandle = <0x04>;
	};
};

cpus {
	#address-cells = <0x01>;
	#size-cells = <0x00>;

	cpu@0 {
		device_type = "cpu";
		enable-method = "brcm,brahma-b53";
		compatible = "brcm,brahma-b53", "arm,cortex-a53";
		reg = <0x00>;
		next-level-cache = <0x02>;
		clocks = <0x03 0x00>;
		clock-names = "cpu";
	};

	cpu@1 {
		device_type = "cpu";
		enable-method = "brcm,brahma-b53";
		compatible = "brcm,brahma-b53", "arm,cortex-a53";
		reg = <0x01>;
		next-level-cache = <0x02>;
		clocks = <0x03 0x00>;
		clock-names = "cpu";
	};

	cpu@2 {
		device_type = "cpu";
		enable-method = "brcm,brahma-b53";
		compatible = "brcm,brahma-b53", "arm,cortex-a53";
		reg = <0x02>;
		next-level-cache = <0x02>;
		clocks = <0x03 0x00>;
		clock-names = "cpu";
	};

	cpu@3 {
		device_type = "cpu";
		enable-method = "brcm,brahma-b53";
		compatible = "brcm,brahma-b53", "arm,cortex-a53";
		reg = <0x03>;
		next-level-cache = <0x02>;
		clocks = <0x03 0x00>;
		clock-names = "cpu";
	};

	cache {
		compatible = "cache";
		phandle = <0x02>;
	};
};

psci {
	compatible = "arm,psci-0.2", "arm,psci";
	method = "smc";
	cpu_suspend = <0xc4000001>;
	cpu_off = <0x84000002>;
	cpu_on = <0xc4000003>;
};

timer {
	compatible = "arm,armv8-timer";
	interrupt-parent = <0x01>;
	interrupts = <0x01 0x0d 0xff08 0x01 0x0e 0xff08 0x01 0x0b 0xff08 0x01 0x0a 0xff08>;
	clock-frequency = <0x19bfcc0>;
	arm,cpu-registers-not-fw-configured;
	always-on;
};

pmu {
	compatible = "arm,cortex-a53-pmu", "arm,armv8-pmuv3", "arm,cortex-a15-pmu", "arm,cortex-a9-pmu";
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x09 0xf04 0x00 0x0a 0xf04 0x00 0x0b 0xf04 0x00 0x0c 0xf04>;
	interrupt-names = "cpu_pmuirq_0", "cpu_pmuirq_1", "cpu_pmuirq_2", "cpu_pmuirq_3";
};

brcm_bogus_clk {
	#clock-cells = <0x01>;
	compatible = "fixed-clock";
	clock-frequency = <0xbc614e>;
	phandle = <0x03>;
};

brcm-scmi-mailbox0 {
	#mbox-cells = <0x01>;
	compatible = "brcm,brcmstb-mbox";
	status = "disabled";
	phandle = <0x1c>;
};

power {
	compatible = "brcm,brcm-pwr-rpc";
	reg = <0x00 0xd1240100 0x00 0x80 0x00 0xd1240000 0x00 0xb8>;
	interrupts = <0x00 0xc5 0x04>;
	interrupt-names = "cpucomm_1_toB53_irq";
	mbox-irq-read-mask = <0x01>;
	boot-state = "ac";
	phandle = <0x1d>;
};

ba-rpc {
	compatible = "brcm,brcm-ba-rpc";
	rg-batt-mode = "cpu-on";
	phandle = <0x1e>;
};

brcm-scmi0 {
	compatible = "arm,scmi-smc";
	shmem = <0x04>;
	arm,smc-id = <0x83000400>;
	interrupt-names = "a2p";
	#address-cells = <0x01>;
	#size-cells = <0x00>;
	phandle = <0x1f>;

	protocol@13 {
		reg = <0x13>;
		#clock-cells = <0x01>;
		phandle = <0x20>;
	};

	protocol@14 {
		reg = <0x14>;
		#clock-cells = <0x01>;
		phandle = <0x21>;
	};

	protocol@15 {
		reg = <0x15>;
		#sensor-cells = <0x01>;
		#thermal-sensor-cells = <0x01>;
		phandle = <0x22>;
	};

	protocol@80 {
		reg = <0x80>;
		#clock-cells = <0x01>;
		phandle = <0x23>;
	};
};

gic-intc {
	compatible = "arm,gic-400";
	interrupt-controller;
	#interrupt-cells = <0x03>;
	reg = <0x00 0xd0101000 0x00 0x1000 0x00 0xd0102000 0x00 0x2000>;
	reg-names = "dist", "cpu";
	phandle = <0x01>;
};

dbg-uarta {
	compatible = "ns16550a";
	reg = <0x00 0xd121c000 0x00 0x20>;
	reg-shift = <0x02>;
	reg-io-width = <0x04>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x1a 0x04>;
	interrupt-names = "upg_uart_dbg0";
	clock-frequency = <0x4d3f640>;
	fifo-size = <0x20>;
	auto-flow-control;
	phandle = <0x24>;
};

uarta {
	compatible = "ns16550a";
	reg = <0x00 0xd1219000 0x00 0x20>;
	reg-shift = <0x02>;
	reg-io-width = <0x04>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x2c 0x04>;
	interrupt-names = "upg_uart_0";
	clock-frequency = <0x4d3f640>;
	fifo-size = <0x20>;
	auto-flow-control;
	phandle = <0x25>;
};

uartd {
	compatible = "ns16550a";
	reg = <0x00 0xd121a200 0x00 0x20>;
	reg-shift = <0x02>;
	reg-io-width = <0x04>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x2f 0x04>;
	interrupt-names = "upg_uart_3";
	clock-frequency = <0x4d3f640>;
	fifo-size = <0x20>;
	auto-flow-control;
	phandle = <0x26>;
};

upg-intc {
	#interrupt-cells = <0x01>;
	compatible = "brcm,bcm7271-l2-intc";
	reg = <0x00 0xd1213980 0x00 0x10>;
	interrupt-controller;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x1c 0x04>;
	interrupt-names = "upg_main";
	phandle = <0x08>;
};

i2c-a {
	clock-frequency = <0xc350>;
	compatible = "brcm,brcmper-i2c";
	reg = <0x00 0xd1213100 0x00 0x58>;
	interrupt-parent = <0x05>;
	interrupts = <0x00>;
	interrupt-names = "iica";
	phandle = <0x27>;
};

i2c-d {
	clock-frequency = <0xc350>;
	compatible = "brcm,brcmper-i2c";
	reg = <0x00 0xd1213280 0x00 0x58>;
	interrupt-parent = <0x05>;
	interrupts = <0x03>;
	interrupt-names = "iicd";
	phandle = <0x28>;
};

upg-bsc-intc {
	#interrupt-cells = <0x01>;
	compatible = "brcm,bcm7271-l2-intc";
	reg = <0x00 0xd1213500 0x00 0x10>;
	interrupt-controller;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x20 0x04>;
	interrupt-names = "upg_bsc";
	phandle = <0x05>;
};

spi0 {
	#address-cells = <0x01>;
	#size-cells = <0x00>;
	clock-frequency = <0x19bfcc0>;
	compatible = "brcm,spi-bcm7216-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi";
	reg = <0x00 0xd1217000 0x00 0x180>;
	reg-names = "mspi";
	interrupts = <0x00>;
	interrupt-parent = <0x06>;
	interrupt-names = "mspi_done";
	phandle = <0x29>;
};

spi1 {
	#address-cells = <0x01>;
	#size-cells = <0x00>;
	clock-frequency = <0x19bfcc0>;
	compatible = "brcm,spi-bcm7216-qspi", "brcm,spi-bcm-qspi", "brcm,spi-brcmstb-mspi";
	reg = <0x00 0xd1217400 0x00 0x180>;
	reg-names = "mspi";
	interrupts = <0x01>;
	interrupt-parent = <0x06>;
	interrupt-names = "mspi_done";
	phandle = <0x2a>;
};

upg-spi-intc {
	#interrupt-cells = <0x01>;
	compatible = "brcm,bcm7271-l2-intc";
	reg = <0x00 0xd1217800 0x00 0x10>;
	interrupt-controller;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x24 0x04>;
	interrupt-names = "upg_spi";
	phandle = <0x06>;
};

upg-clk {
	#clock-cells = <0x01>;
	compatible = "fixed-clock";
	clock-frequency = <0x19bfcc0>;
	phandle = <0x07>;
};

upg_pwm0 {
	#pwm-cells = <0x02>;
	clocks = <0x07 0x00>;
	compatible = "brcm,bcm7038-pwm", "brcm,brcmstb-pwm";
	reg = <0x00 0xd1213040 0x00 0x28>;
};

watchdog0 {
	clock-frequency = <0x19bfcc0>;
	compatible = "brcm,bcm3390-wdt";
	reg = <0x00 0xd1213700 0x00 0x40>;
	interrupts = <0x00 0x28 0x04>;
	interrupt-parent = <0x01>;
	interrupt-names = "wd_timeout";
};

pinctrl-gpio {
	compatible = "brcm,bcmrpc-pinctrl-gpio";
	#gpio-cells = <0x02>;
	#interrupt-cells = <0x02>;
	gpio-controller;
	interrupt-controller;
	reg = <0x00 0xd1214000 0x00 0x100>;
	gpio-names = "gpio";
	gpio-pins-info = <0x00 0x100 0x03 0x07>;
	interrupts = <0x00>;
	interrupt-parent = <0x08>;
	interrupt-names = "gio";
	brcm,gpio-bank-widths = <0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20>;
	rpc-channel = <0x09>;
	phandle = <0x19>;
};

fpm {
	compatible = "brcm,fpm";
	reg = <0x00 0xdde00000 0x00 0x70000>;
	track-tokens = <0x01>;
	track-on-err = <0x00>;
	lwm-watchdog-timeout = <0x493e0>;
	phandle = <0x2b>;
};

dqmsmc {
	compatible = "brcm,dqm";
	reg = <0x00 0xd1000000 0x00 0x120790>;
	dev-name = "smc";
	q-data-base-offset = <0x105000>;
	q-status-base-offset = <0x102800>;
	q-mib-base-offset = <0x103000>;
	q-count = <0x20>;
	qsm-size = <0x8000>;
	legacy-irq;
	restricted-access;
	phandle = <0x2c>;

	dqmintc0 {
		interrupt-parent = <0x01>;
		interrupts = <0x00 0x16 0x04>;
		interrupt-controller;
		#interrupt-cells = <0x01>;
		l1-irq-mask-offset = <0x120728>;
		l1-irq-status-offset = <0x120724>;
		l1-irq-type-offset = <0x12072c>;
		l1-irq-dqm-mask = <0x02>;
		lwm-irq-mask-offset = <0x101d3c>;
		lwm-irq-status-offset = <0x101d34>;
		ne-irq-mask-offset = <0x101d0c>;
		ne-irq-status-offset = <0x101d04>;
		ne-status-offset = <0x101d00>;
		phandle = <0x0a>;
	};

	dqm0 {
		qname = "RPC RG-->SMC (non-secure)";
		id = <0x00>;
		words = <0x04>;
		depth = <0x10>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0a>;
		interrupts = <0x00>;
		phandle = <0x2d>;
	};

	dqm1 {
		qname = "RPC SMC-->RG (non-secure)";
		id = <0x01>;
		words = <0x04>;
		depth = <0x10>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0a>;
		interrupts = <0x01>;
		phandle = <0x2e>;
	};

	dqm10 {
		qname = "RPC RG APPS-->SMC";
		id = <0x0a>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0a>;
		interrupts = <0x0a>;
		phandle = <0x2f>;
	};

	dqm11 {
		qname = "RPC SMC-->RG APPS";
		id = <0x0b>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0a>;
		interrupts = <0x0b>;
		phandle = <0x30>;
	};
};

gfap-dev {
	compatible = "brcm,gfap";
	gfap-top-base = <0x00 0xd2000000>;
	phandle = <0x31>;
};

dqmgfap {
	compatible = "brcm,dqm";
	reg = <0x00 0xde100000 0x00 0x16800>;
	dev-name = "gfap";
	cfg-offset = <0x10000>;
	q-ctl-base-offset = <0x12000 0x12400>;
	q-tmr-base-offset = <0x10800 0x10900>;
	q-data-base-offset = <0x14000 0x14400>;
	q-status-base-offset = <0x10400 0x10480>;
	q-mib-base-offset = <0x11000 0x11200>;
	q-count = <0x40>;
	offload;
	live-irq;
	interrupt-parent = <0x01>;
	phandle = <0x32>;

	dqmpc0 {
		id = <0x00>;
		phandle = <0x33>;
	};

	dqmpc1 {
		id = <0x01>;
		phandle = <0x34>;
	};

	dqmpc2 {
		id = <0x02>;
		phandle = <0x35>;
	};

	dqmpc3 {
		id = <0x03>;
		phandle = <0x36>;
	};

	dqmpc4 {
		id = <0x04>;
		phandle = <0x37>;
	};

	dqmpc5 {
		id = <0x05>;
		phandle = <0x38>;
	};

	dqmpc6 {
		id = <0x06>;
		phandle = <0x39>;
	};

	dqmpc7 {
		id = <0x07>;
		phandle = <0x3a>;
	};

	dqmpc8 {
		id = <0x08>;
		phandle = <0x3b>;
	};

	dqmpc9 {
		id = <0x09>;
		phandle = <0x3c>;
	};

	dqmpc10 {
		id = <0x0a>;
		phandle = <0x3d>;
	};

	dqmpc11 {
		id = <0x0b>;
		phandle = <0x3e>;
	};

	dqmpc12 {
		id = <0x0c>;
		phandle = <0x3f>;
	};

	dqmpc13 {
		id = <0x0d>;
		phandle = <0x40>;
	};

	dqmpc14 {
		id = <0x0e>;
		phandle = <0x41>;
	};

	dqmpc15 {
		id = <0x0f>;
		phandle = <0x42>;
	};

	dqmpc16 {
		id = <0x10>;
		interrupts = <0x00 0x90 0x01>;
		live-irq-status-offset = <0x9040>;
		live-irq-mask-offset = <0x9140 0x9240 0x9340>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x43>;
	};

	dqmpc17 {
		id = <0x11>;
		interrupts = <0x00 0x91 0x01>;
		live-irq-status-offset = <0x9044>;
		live-irq-mask-offset = <0x9144 0x9244 0x9344>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x44>;
	};

	dqmpc18 {
		id = <0x12>;
		interrupts = <0x00 0x92 0x01>;
		live-irq-status-offset = <0x9048>;
		live-irq-mask-offset = <0x9148 0x9248 0x9348>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x45>;
	};

	dqmpc19 {
		id = <0x13>;
		interrupts = <0x00 0x93 0x01>;
		live-irq-status-offset = <0x904c>;
		live-irq-mask-offset = <0x914c 0x924c 0x934c>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x46>;
	};

	dqmpc20 {
		id = <0x14>;
		interrupts = <0x00 0x94 0x01>;
		live-irq-status-offset = <0x9050>;
		live-irq-mask-offset = <0x9150 0x9250 0x9350>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x47>;
	};

	dqmpc21 {
		id = <0x15>;
		interrupts = <0x00 0x95 0x01>;
		live-irq-status-offset = <0x9054>;
		live-irq-mask-offset = <0x9154 0x9254 0x9354>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x48>;
	};

	dqmpc22 {
		id = <0x16>;
		interrupts = <0x00 0x96 0x01>;
		live-irq-status-offset = <0x9058>;
		live-irq-mask-offset = <0x9158 0x9258 0x9358>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x49>;
	};

	dqmpc23 {
		id = <0x17>;
		interrupts = <0x00 0x97 0x01>;
		live-irq-status-offset = <0x905c>;
		live-irq-mask-offset = <0x915c 0x925c 0x935c>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4a>;
	};

	dqmpc24 {
		id = <0x18>;
		interrupts = <0x00 0x98 0x01>;
		live-irq-status-offset = <0x9060>;
		live-irq-mask-offset = <0x9160 0x9260 0x9360>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4b>;
	};

	dqmpc25 {
		id = <0x19>;
		interrupts = <0x00 0x99 0x01>;
		live-irq-status-offset = <0x9064>;
		live-irq-mask-offset = <0x9164 0x9264 0x9364>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4c>;
	};

	dqmpc26 {
		id = <0x1a>;
		interrupts = <0x00 0x9a 0x01>;
		live-irq-status-offset = <0x9068>;
		live-irq-mask-offset = <0x9168 0x9268 0x9368>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4d>;
	};

	dqmpc27 {
		id = <0x1b>;
		interrupts = <0x00 0x9b 0x01>;
		live-irq-status-offset = <0x906c>;
		live-irq-mask-offset = <0x916c 0x926c 0x936c>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4e>;
	};

	dqmpc28 {
		id = <0x1c>;
		interrupts = <0x00 0x9c 0x01>;
		live-irq-status-offset = <0x9070>;
		live-irq-mask-offset = <0x9170 0x9270 0x9370>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x4f>;
	};

	dqmpc29 {
		id = <0x1d>;
		interrupts = <0x00 0x9d 0x01>;
		live-irq-status-offset = <0x9074>;
		live-irq-mask-offset = <0x9174 0x9274 0x9374>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x50>;
	};

	dqmpc30 {
		id = <0x1e>;
		interrupts = <0x00 0x9e 0x01>;
		live-irq-status-offset = <0x9078>;
		live-irq-mask-offset = <0x9178 0x9278 0x9378>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x51>;
	};

	dqmpc31 {
		id = <0x1f>;
		interrupts = <0x00 0x9f 0x01>;
		live-irq-status-offset = <0x907c>;
		live-irq-mask-offset = <0x917c 0x927c 0x937c>;
		live-irq-tmr-status-offset = <0x10248 0x10250 0x10258>;
		phandle = <0x52>;
	};

	dqmpc32 {
		id = <0x20>;
		phandle = <0x53>;
	};

	dqmpc33 {
		id = <0x21>;
		phandle = <0x54>;
	};

	dqmpc34 {
		id = <0x22>;
		phandle = <0x55>;
	};

	dqmpc35 {
		id = <0x23>;
		phandle = <0x56>;
	};

	dqmpc36 {
		id = <0x24>;
		phandle = <0x57>;
	};

	dqmpc37 {
		id = <0x25>;
		phandle = <0x58>;
	};

	dqmpc38 {
		id = <0x26>;
		phandle = <0x59>;
	};

	dqmpc39 {
		id = <0x27>;
		phandle = <0x5a>;
	};

	dqmpc40 {
		id = <0x28>;
		interrupts = <0x00 0xa8 0x01>;
		live-irq-status-offset = <0x90a0>;
		live-irq-mask-offset = <0x91a0 0x92a0 0x93a0>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x5b>;
	};

	dqmpc41 {
		id = <0x29>;
		interrupts = <0x00 0xa9 0x01>;
		live-irq-status-offset = <0x90a4>;
		live-irq-mask-offset = <0x91a4 0x92a4 0x93a4>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x5c>;
	};

	dqmpc42 {
		id = <0x2a>;
		interrupts = <0x00 0xaa 0x01>;
		live-irq-status-offset = <0x90a8>;
		live-irq-mask-offset = <0x91a8 0x92a8 0x93a8>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x5d>;
	};

	dqmpc43 {
		id = <0x2b>;
		interrupts = <0x00 0xab 0x01>;
		live-irq-status-offset = <0x90ac>;
		live-irq-mask-offset = <0x91ac 0x92ac 0x93ac>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x5e>;
	};

	dqmpc44 {
		id = <0x2c>;
		interrupts = <0x00 0xac 0x01>;
		live-irq-status-offset = <0x90b0>;
		live-irq-mask-offset = <0x91b0 0x92b0 0x93b0>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x5f>;
	};

	dqmpc45 {
		id = <0x2d>;
		interrupts = <0x00 0xad 0x01>;
		live-irq-status-offset = <0x90b4>;
		live-irq-mask-offset = <0x91b4 0x92b4 0x93b4>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x60>;
	};

	dqmpc46 {
		id = <0x2e>;
		interrupts = <0x00 0xae 0x01>;
		live-irq-status-offset = <0x90b8>;
		live-irq-mask-offset = <0x91b8 0x92b8 0x93b8>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x61>;
	};

	dqmpc47 {
		id = <0x2f>;
		interrupts = <0x00 0xaf 0x01>;
		live-irq-status-offset = <0x90bc>;
		live-irq-mask-offset = <0x91bc 0x92bc 0x93bc>;
		live-irq-tmr-status-offset = <0x1024c 0x10254 0x1025c>;
		phandle = <0x62>;
	};
};

dqmep5 {
	compatible = "brcm,dqm";
	reg = <0x00 0xdad00000 0x00 0xf080>;
	dev-name = "ep5";
	cfg-offset = <0x8000>;
	q-ctl-base-offset = <0xa000>;
	q-tmr-base-offset = <0x8800>;
	q-data-base-offset = <0xc000>;
	q-status-base-offset = <0x8400>;
	q-mib-base-offset = <0x9000>;
	q-count = <0x20>;
	offload;
	ext-irq;
	phandle = <0x63>;

	dqmep5intc0 {
		interrupt-parent = <0x01>;
		interrupts = <0x00 0x6c 0x04>;
		interrupt-controller;
		#interrupt-cells = <0x01>;
		l1-irq-dqm-mask = <0x36>;
		l1-irq-status-offset = <0x1800>;
		ne-irq-mask-offset = <0x18e0 0x1900 0x1920>;
		ne-irq-status-offset = <0x1618 0x1620 0x1628>;
		tmr-irq-mask-offset = <0x1940 0x1960 0x1980>;
		tmr-irq-status-offset = <0x1648 0x1650 0x1658>;
		lwm-irq-mask-offset = <0x19a0 0x19c0 0x19e0>;
		lwm-irq-status-offset = <0x1678 0x1680 0x1688>;
		hwm-irq-mask-offset = <0x1a00 0x1a20 0x1a40>;
		hwm-irq-status-offset = <0x16a8 0x16b0 0x16b8>;
		phandle = <0x0b>;
	};

	dqmep50 {
		qname = "Ep5ToHost_CtrlSlot";
		id = <0x00>;
		phandle = <0x64>;
	};

	dqmep51 {
		qname = "HostToEp5_CtrlSlot";
		id = <0x01>;
		phandle = <0x65>;
	};

	dqmep52 {
		qname = "HostToEp5_REQ";
		id = <0x02>;
		phandle = <0x66>;
	};

	dqmep53 {
		qname = "HostToEp5_RSP";
		id = <0x03>;
		phandle = <0x67>;
	};

	dqmep54 {
		qname = "HostToEp5_Event";
		id = <0x04>;
		phandle = <0x68>;
	};

	dqmep55 {
		qname = "Ep5ToHost_REQ";
		id = <0x05>;
		words = <0x01>;
		interrupt-parent = <0x0b>;
		interrupts = <0x05 0x04>;
		phandle = <0x69>;
	};

	dqmep56 {
		qname = "Ep5ToHost_RSP";
		id = <0x06>;
		words = <0x01>;
		interrupt-parent = <0x0b>;
		interrupts = <0x06 0x04>;
		phandle = <0x6a>;
	};

	dqmep57 {
		qname = "Ep5ToHost_Event";
		id = <0x07>;
		words = <0x01>;
		interrupt-parent = <0x0b>;
		interrupts = <0x07 0x04>;
		phandle = <0x6b>;
	};
};

dqmcpuc {
	compatible = "brcm,dqm";
	reg = <0x00 0xd1240000 0x00 0xa180>;
	offload;
	dev-name = "cpucomm";
	cfg-offset = <0x1c00>;
	q-ctl-base-offset = <0x8000>;
	q-tmr-base-offset = <0x2000>;
	q-data-base-offset = <0x9000>;
	q-status-base-offset = <0x7400>;
	q-mib-base-offset = <0xa000>;
	q-count = <0x20>;
	qsm-size = <0xc000>;
	legacy-irq;
	phandle = <0x6c>;

	cdqmintc0 {
		interrupts = <0x00 0xc4 0x04>;
		interrupt-controller;
		#interrupt-cells = <0x01>;
		interrupt-parent = <0x01>;
		l1-irq-mask-offset = <0x50>;
		l1-irq-status-offset = <0x54>;
		l1-irq-dqm-mask = <0x400000>;
		lwm-irq-mask-offset = <0x1cb0>;
		lwm-irq-status-offset = <0x1ca0>;
		ne-irq-mask-offset = <0x1c20>;
		ne-irq-status-offset = <0x1c10>;
		ne-status-offset = <0x1c14>;
		hwm-irq-mask-offset = <0x1c80>;
		hwm-irq-status-offset = <0x1c70>;
		tmr-irq-mask-offset = <0x1c50>;
		tmr-irq-status-offset = <0x1c40>;
		phandle = <0x0c>;
	};

	dqm2 {
		qname = "RPC RG-->CM";
		id = <0x02>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x02>;
		phandle = <0x6d>;
	};

	dqm3 {
		qname = "RPC RG<--CM";
		id = <0x03>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x03>;
		phandle = <0x6e>;
	};

	dqm14 {
		qname = "Private Network RG-->CM";
		id = <0x0e>;
		words = <0x02>;
		depth = <0x10>;
		lwm = <0x04>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x0e>;
		phandle = <0x6f>;
	};

	dqm15 {
		qname = "Private Network RG<--CM";
		id = <0x0f>;
		words = <0x02>;
		depth = <0x40>;
		lwm = <0x04>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x0f>;
		phandle = <0x70>;
	};

	dqm20 {
		qname = "RPC SVM-->CM";
		id = <0x14>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x14>;
		phandle = <0x71>;
	};

	dqm21 {
		qname = "RPC SVM<--CM";
		id = <0x15>;
		words = <0x04>;
		depth = <0x08>;
		lwm = <0x02>;
		hwm = <0x01>;
		interrupt-parent = <0x0c>;
		interrupts = <0x15>;
		phandle = <0x72>;
	};
};

netport {
	compatible = "brcm,netport";
	reg = <0x00 0xe3800000 0x00 0x5c00>;
	dev-name = "netport";
	phandle = <0x73>;
};

merlin {
	status = "disabled";
	compatible = "brcm,merlin16-shasta";
	reg = <0x00 0xe3805c00 0x00 0x60>;
	dev-name = "merlin";
	merlin-refsel = "CML refclk";
	merlin-pllclk = "54 MHz";
	merlin-plldiv = "190.97222";
	phandle = <0x74>;
};

netport-mdio {
	compatible = "brcm,unimac-mdio";
	reg = <0x00 0xe3805400 0x00 0x08>;
	dev-name = "Netport MII bus";
	reg-names = "netport_mdio";
	clock-frequency = <0xad6534>;
	phandle = <0x75>;
};

miimdiomux {
	compatible = "brcm,miimdiomux339x";
	reg = <0x00 0xe38041b0 0x00 0x04>;
	mdio_c_en = "disable";
	mdio_b_en = "disable";
	mdio_a_en = "disable";
	alt_rgmii = "a";
	phandle = <0x76>;
};

unimac0 {
	status = "disabled";
	compatible = "brcm,unimac";
	reg = <0x00 0xe3802000 0x00 0x1000>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x79 0x04 0x00 0x7a 0x04>;
	unimac_core_offset = <0x400>;
	unimac_iface_offset = <0x00>;
	unimac_mib_offset = <0x800>;
	dev-name = "unimac0";
	phandle = <0x77>;
};

unimac1 {
	status = "disabled";
	compatible = "brcm,unimac";
	reg = <0x00 0xe3803000 0x00 0x1000>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x79 0x04 0x00 0x7a 0x04>;
	unimac_core_offset = <0x400>;
	unimac_iface_offset = <0x00>;
	unimac_mib_offset = <0x800>;
	dev-name = "unimac1";
	phandle = <0x78>;
};

xlmac0 {
	status = "disabled";
	compatible = "brcm,xlmac";
	mac-access = "mac-dir0-access";
	mib-access = "mib-dir0-access";
	dev-name = "xlmac0";
	phandle = <0x79>;
};

xlmac1 {
	status = "disabled";
	compatible = "brcm,xlmac";
	mac-access = "mac-dir0-access";
	mib-access = "mib-dir0-access";
	dev-name = "xlmac1";
	phandle = <0x7a>;
};

xlmac2 {
	status = "disabled";
	compatible = "brcm,xlmac";
	mac-access = "mac-dir0-access";
	mib-access = "mib-dir0-access";
	dev-name = "xlmac2";
	phandle = <0x7b>;
};

xlmac3 {
	status = "disabled";
	compatible = "brcm,xlmac";
	mac-access = "mac-dir0-access";
	mib-access = "mib-dir0-access";
	dev-name = "xlmac3";
	phandle = <0x7c>;
};

dgphy0 {
	status = "disabled";
	compatible = "brcm,dgphy";
	dev-name = "dgphy0";
	phandle = <0x7d>;
};

dgphy1 {
	status = "disabled";
	compatible = "brcm,dgphy";
	dev-name = "dgphy1";
	phandle = <0x7e>;
};

rgmii0 {
	status = "disabled";
	compatible = "brcm,rgmii";
	dev-name = "rgmii0";
	phandle = <0x7f>;
};

rgmii1 {
	status = "disabled";
	compatible = "brcm,rgmii";
	dev-name = "rgmii1";
	phandle = <0x80>;
};

lane0 {
	status = "disabled";
	compatible = "brcm,merlin16-shasta-lane";
	serdes-access = "serdes-ind0-access";
	dev-name = "serdes0";
	phandle = <0x81>;
};

lane1 {
	status = "disabled";
	compatible = "brcm,merlin16-shasta-lane";
	serdes-access = "serdes-ind1-access";
	dev-name = "serdes1";
	phandle = <0x82>;
};

lane2 {
	status = "disabled";
	compatible = "brcm,merlin16-shasta-lane";
	serdes-access = "serdes-ind0-access";
	dev-name = "serdes2";
	phandle = <0x83>;
};

lane3 {
	status = "disabled";
	compatible = "brcm,merlin16-shasta-lane";
	serdes-access = "serdes-ind1-access";
	dev-name = "serdes3";
	phandle = <0x84>;
};

pcie0-l2-intc {
	status = "disabled";
	reg = <0x00 0xc0009400 0x00 0x10>;
	compatible = "brcm,bcm7271-l2-intc";
	interrupt-controller;
	#interrupt-cells = <0x01>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x76 0x04>;
	interrupt-names = "pcie_0";
	phandle = <0x0f>;
};

pcie1-l2-intc {
	status = "disabled";
	reg = <0x00 0xc4009400 0x00 0x10>;
	compatible = "brcm,bcm7271-l2-intc";
	interrupt-controller;
	#interrupt-cells = <0x01>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x77 0x04>;
	interrupt-names = "pcie_1";
	phandle = <0x11>;
};

pcie2-l2-intc {
	status = "disabled";
	reg = <0x00 0xc8009400 0x00 0x10>;
	compatible = "brcm,bcm7271-l2-intc";
	interrupt-controller;
	#interrupt-cells = <0x01>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x78 0x04>;
	interrupt-names = "pcie_2";
	phandle = <0x13>;
};

pcie3-l2-intc {
	status = "disabled";
	reg = <0x00 0xcc009400 0x00 0x10>;
	compatible = "brcm,bcm7271-l2-intc";
	interrupt-controller;
	#interrupt-cells = <0x01>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x79 0x04>;
	interrupt-names = "pcie_3";
	phandle = <0x15>;
};

iproc-pdc {
	compatible = "brcm,iproc-pdc-mbox";
	reg = <0x00 0xddc00000 0x00 0x448>;
	interrupts = <0x00 0x3d 0x04>;
	#mbox-cells = <0x01>;
	brcm,rx-status-len = <0x04>;
	brcm,use-bcm-hdr;
	phandle = <0x0d>;
};

crypto {
	compatible = "brcm,spum-crypto";
	reg = <0x00 0xddc01000 0x00 0x1010>;
	mboxes = <0x0d 0x00>;
};

spu_pdc {
	status = "disabled";
	compatible = "brcm,spu-pdc";
	reg = <0x00 0xddc00000 0x00 0x448>;
	interrupts = <0x00 0x3d 0x04>;
	brcm,num_chan = <0x01>;
	phandle = <0x85>;
};

spu_crypto {
	status = "disabled";
	compatible = "brcm,spu-crypto";
	reg = <0x00 0xddc01000 0x00 0x1010>;
	brcm,num_spu = <0x01>;
	brcm,spu_type = <0x01>;
	phandle = <0x86>;
};

spu_flexrm {
	status = "disabled";
	compatible = "brcm,spu-flexrm";
	reg = <0x00 0xd1800000 0x00 0x2810b0>;
	interrupts = <0x00 0xc9 0x04 0x00 0xca 0x04 0x00 0xcb 0x04 0x00 0xcc 0x04>;
	brcm,num_chan = <0x04>;
	brcm,num_ae = <0x02>;
	phandle = <0x87>;
};

spu_crypto2 {
	status = "disabled";
	compatible = "brcm,spu-crypto";
	reg = <0x00 0xd1ac0000 0x00 0x8f>;
	brcm,num_spu = <0x01>;
	brcm,spu_type = <0x02>;
	phandle = <0x88>;
};

usbphy-0 {
	reg = <0x00 0xdf80f200 0x00 0x200 0x00 0xdf80c100 0x00 0x544 0x00 0xdf80fc00 0x00 0xff>;
	reg-names = "ctrl", "xhci_gbl", "usb_tca";
	#address-cells = <0x02>;
	#size-cells = <0x02>;
	status = "disabled";
	compatible = "brcm,bcm33940xc0-usb-phy", "brcm,brcmstb-usb-phy", "brcm,usb-phy";
	#phy-cells = <0x01>;
	ranges;
	has_xhci_only;
	brcm,has-xhci;
	brcm,tx_preempamp_tune0 = <0x03>;
	phandle = <0x0e>;
};

xhci-v2-0 {
	compatible = "brcm,xhci-brcm-v2", "generic-xhci";
	status = "disabled";
	reg = <0x00 0xdf800000 0x00 0x2004>;
	interrupts = <0x00 0x7b 0x04>;
	interrupt-names = "usb0_xhci_0";
	phys = <0x0e 0x01>;
	phy-names = "usbphy";
	phandle = <0x89>;
};

system_bus {
	compatible = "simple-bus";
	#address-cells = <0x02>;
	#size-cells = <0x02>;
	ranges;

	sdhci-0 {
		status = "disabled";
		compatible = "brcm,bcm33940-sdhci", "brcm,bcm3392-sdhci", "brcm,bcm7216-sdhci", "brcm,bcm7445-sdhci", "brcm,sdhci-brcmstb";
		reg = <0x00 0xd1200000 0x00 0x260 0x00 0xd1200400 0x00 0x200>;
		reg-names = "host", "cfg";
		interrupt-parent = <0x01>;
		interrupts = <0x00 0x30 0x04>;
		interrupt-names = "sdio0_0";
		sd-uhs-ddr50;
		sd-uhs-sdr50;
		sd-uhs-sdr104;
		sdhci,auto-cmd12;
		phandle = <0x8a>;
	};
};

pcie@c0000000 {
	status = "disabled";
	reg = <0x00 0xc0000000 0x00 0x9508>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	ranges = <0x3000000 0x00 0x00 0x03 0x00 0x00 0x40000000>;
	dma-ranges = <0x3000000 0x06 0x00 0x06 0x00 0x01 0x00 0x3000000 0x05 0x00 0x05 0x00 0x01 0x00 0x3000000 0x04 0x00 0x04 0x00 0x01 0x00 0x3000000 0x12 0x80000000 0x02 0x80000000 0x00 0x40000000 0x3000000 0x12 0x00 0x02 0x00 0x00 0x80000000 0x3000000 0x11 0x00 0x01 0x00 0x00 0x80000000 0x3000000 0x10 0xda000000 0x00 0xda000000 0x00 0x1000000 0x3000000 0x10 0x80000000 0x00 0x80000000 0x00 0x40000000 0x3000000 0x10 0x00 0x00 0x00 0x00 0x80000000>;
	tot-num-pcie = <0x01>;
	interrupt-parent = <0x0f>;
	interrupts = <0x05 0x09>;
	interrupt-names = "pcie0", "pcie0_msi";
	msi-parent = <0x10>;
	msi-controller;
	#interrupt-cells = <0x01>;
	interrupt-map-mask = <0xf800 0x00 0x00 0x07>;
	interrupt-map = <0x00 0x00 0x00 0x01 0x0f 0x01 0x00 0x00 0x00 0x02 0x0f 0x02 0x00 0x00 0x00 0x03 0x0f 0x03 0x00 0x00 0x00 0x04 0x0f 0x04>;
	max-link-speed = <0x03>;
	device_type = "pci";
	bus-range = <0x00 0xff>;
	linux,pci-domain = <0x00>;
	phandle = <0x10>;

	pci@0,0 {
		reg = <0x00 0x00 0x00 0x00 0x00>;
		compatible = "pciclass,0604";
		device_type = "pci";
		#address-cells = <0x03>;
		#size-cells = <0x02>;
	};
};

pcie@c4000000 {
	status = "disabled";
	reg = <0x00 0xc4000000 0x00 0x9508>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	ranges = <0x3000000 0x00 0x00 0x04 0x00 0x00 0x40000000>;
	dma-ranges = <0x3000000 0x06 0x00 0x06 0x00 0x01 0x00 0x3000000 0x05 0x00 0x05 0x00 0x01 0x00 0x3000000 0x03 0x00 0x03 0x00 0x01 0x00 0x3000000 0x12 0x80000000 0x02 0x80000000 0x00 0x40000000 0x3000000 0x12 0x00 0x02 0x00 0x00 0x80000000 0x3000000 0x11 0x00 0x01 0x00 0x00 0x80000000 0x3000000 0x10 0xda000000 0x00 0xda000000 0x00 0x1000000 0x3000000 0x10 0x80000000 0x00 0x80000000 0x00 0x40000000 0x3000000 0x10 0x00 0x00 0x00 0x00 0x80000000>;
	tot-num-pcie = <0x01>;
	interrupt-parent = <0x11>;
	interrupts = <0x05 0x09>;
	interrupt-names = "pcie1", "pcie1_msi";
	msi-parent = <0x12>;
	msi-controller;
	#interrupt-cells = <0x01>;
	interrupt-map-mask = <0xf800 0x00 0x00 0x07>;
	interrupt-map = <0x00 0x00 0x00 0x01 0x11 0x01 0x00 0x00 0x00 0x02 0x11 0x02 0x00 0x00 0x00 0x03 0x11 0x03 0x00 0x00 0x00 0x04 0x11 0x04>;
	max-link-speed = <0x03>;
	device_type = "pci";
	bus-range = <0x00 0xff>;
	linux,pci-domain = <0x01>;
	phandle = <0x12>;

	pci@0,0 {
		reg = <0x00 0x00 0x00 0x00 0x00>;
		compatible = "pciclass,0604";
		device_type = "pci";
		#address-cells = <0x03>;
		#size-cells = <0x02>;
	};
};

pcie@c8000000 {
	status = "disabled";
	reg = <0x00 0xc8000000 0x00 0x9508>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	ranges = <0x3000000 0x00 0x00 0x05 0x00 0x00 0x40000000>;
	dma-ranges = <0x3000000 0x06 0x00 0x06 0x00 0x01 0x00 0x3000000 0x04 0x00 0x04 0x00 0x01 0x00 0x3000000 0x03 0x00 0x03 0x00 0x01 0x00 0x3000000 0x12 0x80000000 0x02 0x80000000 0x00 0x40000000 0x3000000 0x12 0x00 0x02 0x00 0x00 0x80000000 0x3000000 0x11 0x00 0x01 0x00 0x00 0x80000000 0x3000000 0x10 0xda000000 0x00 0xda000000 0x00 0x1000000 0x3000000 0x10 0x80000000 0x00 0x80000000 0x00 0x40000000 0x3000000 0x10 0x00 0x00 0x00 0x00 0x80000000>;
	tot-num-pcie = <0x01>;
	interrupt-parent = <0x13>;
	interrupts = <0x05 0x09>;
	interrupt-names = "pcie2", "pcie2_msi";
	msi-parent = <0x14>;
	msi-controller;
	#interrupt-cells = <0x01>;
	interrupt-map-mask = <0xf800 0x00 0x00 0x07>;
	interrupt-map = <0x00 0x00 0x00 0x01 0x13 0x01 0x00 0x00 0x00 0x02 0x13 0x02 0x00 0x00 0x00 0x03 0x13 0x03 0x00 0x00 0x00 0x04 0x13 0x04>;
	max-link-speed = <0x03>;
	device_type = "pci";
	bus-range = <0x00 0xff>;
	linux,pci-domain = <0x02>;
	phandle = <0x14>;

	pci@0,0 {
		reg = <0x00 0x00 0x00 0x00 0x00>;
		compatible = "pciclass,0604";
		device_type = "pci";
		#address-cells = <0x03>;
		#size-cells = <0x02>;
	};
};

pcie@cc000000 {
	status = "disabled";
	reg = <0x00 0xcc000000 0x00 0x9508>;
	#address-cells = <0x03>;
	#size-cells = <0x02>;
	ranges = <0x3000000 0x00 0x00 0x06 0x00 0x00 0x40000000>;
	dma-ranges = <0x3000000 0x05 0x00 0x05 0x00 0x01 0x00 0x3000000 0x04 0x00 0x04 0x00 0x01 0x00 0x3000000 0x03 0x00 0x03 0x00 0x01 0x00 0x3000000 0x12 0x80000000 0x02 0x80000000 0x00 0x40000000 0x3000000 0x12 0x00 0x02 0x00 0x00 0x80000000 0x3000000 0x11 0x00 0x01 0x00 0x00 0x80000000 0x3000000 0x10 0xda000000 0x00 0xda000000 0x00 0x1000000 0x3000000 0x10 0x80000000 0x00 0x80000000 0x00 0x40000000 0x3000000 0x10 0x00 0x00 0x00 0x00 0x80000000>;
	tot-num-pcie = <0x01>;
	interrupt-parent = <0x15>;
	interrupts = <0x05 0x09>;
	interrupt-names = "pcie3", "pcie3_msi";
	msi-parent = <0x16>;
	msi-controller;
	#interrupt-cells = <0x01>;
	interrupt-map-mask = <0xf800 0x00 0x00 0x07>;
	interrupt-map = <0x00 0x00 0x00 0x01 0x15 0x01 0x00 0x00 0x00 0x02 0x15 0x02 0x00 0x00 0x00 0x03 0x15 0x03 0x00 0x00 0x00 0x04 0x15 0x04>;
	max-link-speed = <0x03>;
	device_type = "pci";
	bus-range = <0x00 0xff>;
	linux,pci-domain = <0x03>;
	phandle = <0x16>;

	pci@0,0 {
		reg = <0x00 0x00 0x00 0x00 0x00>;
		compatible = "pciclass,0604";
		device_type = "pci";
		#address-cells = <0x03>;
		#size-cells = <0x02>;
	};
};

q-channel0 {
	dev-name = "exc-eth0";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x8b>;
};

q-channel1 {
	dev-name = "exc-eth1";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x8c>;
};

q-channel2 {
	dev-name = "exc-eth2";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x8d>;
};

q-channel3 {
	dev-name = "exc-eth3";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x8e>;
};

q-channel4 {
	dev-name = "exc-eth4";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x8f>;
};

q-channel5 {
	dev-name = "exc-eth5";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x90>;
};

q-channel6 {
	dev-name = "exp-wl0";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x91>;
};

q-channel7 {
	dev-name = "exp-wl1";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x92>;
};

q-channel8 {
	dev-name = "exp-wl2";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-exception";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x93>;
};

q-channel9 {
	dev-name = "exc-cm0";
	dqm = "gfap";
	tx-q = <0xff>;
	rx-q = <0xff>;
	type = "fap-host";
	q-msg-fmt = "gfap3-fpm";
	phandle = <0x94>;
};

q-channelpriv0 {
	dev-name = "cm-rg-priv0";
	dqm = "cpucomm";
	tx-q = <0x0e>;
	rx-q = <0x0f>;
	type = "point-to-point";
	q-msg-fmt = "gfap-fpm";
	phandle = <0x17>;
};

priv0 {
	compatible = "brcm,dqnet";
	channel = <0x17>;
	dev-name = "priv0";
	demux = "none";
	link-type = "rpc";
	rpc-channel = <0x18>;
	phandle = <0x95>;
};

rpc {
	compatible = "simple-bus";
	#address-cells = <0x01>;
	#size-cells = <0x00>;
	rpc-version = <0x204>;

	rpcrgsmc@0 {
		reg = <0x00>;
		compatible = "brcm,itc-rpc";
		dev-name = "rg-smc";
		fifo-dev = "smc";
		tx-fifo = <0x00>;
		rx-fifo = <0x01>;
		phandle = <0x09>;
	};

	rpcrgappsmc@a {
		reg = <0x0a>;
		compatible = "brcm,itc-rpc";
		dev-name = "rg-app-smc";
		fifo-dev = "smc";
		tx-fifo = <0x0a>;
		rx-fifo = <0x0b>;
		phandle = <0x96>;
	};

	rpcrgcm@2 {
		reg = <0x02>;
		compatible = "brcm,itc-rpc";
		dev-name = "rg-cm";
		fifo-dev = "cpucomm";
		tx-fifo = <0x02>;
		rx-fifo = <0x03>;
		phandle = <0x18>;
	};
};

rpcsmcramlog {
	compatible = "brcm,smcramlog-rpc";
	rpc-channel = <0x09>;
	phandle = <0x97>;
};

bstm {
	status = "disabled";
	compatible = "brcm,bstm-v1.0.0.1";
	reg = <0x00 0xdf000000 0x00 0xb030>;
	interrupt-parent = <0x01>;
	interrupts = <0x00 0x3e 0x04>;
	interrupt-names = "bstm";
	phandle = <0x98>;
};

gpu {
	status = "disabled";
	compatible = "brcm,bcm33940-gpu", "brcm,gpu-v7.1.6.4";
	reg = <0x00 0xdfa00000 0x00 0x30f00>;
	reg-names = "v3d";
	interrupt-parent = <0x01>;
	interrupts = <0x00 0xc0 0x04 0x00 0xc1 0x04>;
	interrupt-names = "v3d", "v3d_hub";
};

gpu-mmu {
	status = "disabled";
	compatible = "brcm,bcm33940-v3d", "brcm,v3d-v7.1.6.4";
};

aliases {
	pcie0 = "/pcie0";
	pcie1 = "/pcie1";
	pcie2 = "/pcie2";
	serial0 = "/dbg-uarta";
	watchdog1 = "/watchdog0";
};

tch_tacho1 {
	compatible = "tch,tacho1-gpio";
	dev-name = "tacho1-gpio";
	tacho1-gpio = <0x19 0x13 0x00>;
	interrupt-parent = <0x19>;
	interrupts = <0x13 0x03>;
};

__symbols__ {
	chosen = "/chosen";
	reserved_memory = "/reserved-memory";
	NWMBOX = "/reserved-memory/NWMBOX";
	l2_cache = "/cpus/cache";
	brcm_bogus_clk = "/brcm_bogus_clk";
	brcm_scmi_mailbox = "/brcm-scmi-mailbox0";
	brcm_pwr_rpc = "/power";
	brcm_ba_rpc = "/ba-rpc";
	brcm_scmi = "/brcm-scmi0";
	scmi_dvfs = "/brcm-scmi0/protocol@13";
	scmi_clock = "/brcm-scmi0/protocol@14";
	scmi_sensor = "/brcm-scmi0/protocol@15";
	scmi_brcm = "/brcm-scmi0/protocol@80";
	gic = "/gic-intc";
	dbg_uarta = "/dbg-uarta";
	uarta = "/uarta";
	uartd = "/uartd";
	upg_intc = "/upg-intc";
	i2c_a = "/i2c-a";
	i2c_d = "/i2c-d";
	upg_bsc_intc = "/upg-bsc-intc";
	spi0 = "/spi0";
	spi1 = "/spi1";
	upg_spi_intc = "/upg-spi-intc";
	upg_clk = "/upg-clk";
	pinctrl_gpio = "/pinctrl-gpio";
	fpm = "/fpm";
	dqmsmc = "/dqmsmc";
	dqmintc0 = "/dqmsmc/dqmintc0";
	dqm0 = "/dqmsmc/dqm0";
	dqm1 = "/dqmsmc/dqm1";
	dqm10 = "/dqmsmc/dqm10";
	dqm11 = "/dqmsmc/dqm11";
	gfap_dev = "/gfap-dev";
	dqmgfap = "/dqmgfap";
	dqmpc0 = "/dqmgfap/dqmpc0";
	dqmpc1 = "/dqmgfap/dqmpc1";
	dqmpc2 = "/dqmgfap/dqmpc2";
	dqmpc3 = "/dqmgfap/dqmpc3";
	dqmpc4 = "/dqmgfap/dqmpc4";
	dqmpc5 = "/dqmgfap/dqmpc5";
	dqmpc6 = "/dqmgfap/dqmpc6";
	dqmpc7 = "/dqmgfap/dqmpc7";
	dqmpc8 = "/dqmgfap/dqmpc8";
	dqmpc9 = "/dqmgfap/dqmpc9";
	dqmpc10 = "/dqmgfap/dqmpc10";
	dqmpc11 = "/dqmgfap/dqmpc11";
	dqmpc12 = "/dqmgfap/dqmpc12";
	dqmpc13 = "/dqmgfap/dqmpc13";
	dqmpc14 = "/dqmgfap/dqmpc14";
	dqmpc15 = "/dqmgfap/dqmpc15";
	dqmpc16 = "/dqmgfap/dqmpc16";
	dqmpc17 = "/dqmgfap/dqmpc17";
	dqmpc18 = "/dqmgfap/dqmpc18";
	dqmpc19 = "/dqmgfap/dqmpc19";
	dqmpc20 = "/dqmgfap/dqmpc20";
	dqmpc21 = "/dqmgfap/dqmpc21";
	dqmpc22 = "/dqmgfap/dqmpc22";
	dqmpc23 = "/dqmgfap/dqmpc23";
	dqmpc24 = "/dqmgfap/dqmpc24";
	dqmpc25 = "/dqmgfap/dqmpc25";
	dqmpc26 = "/dqmgfap/dqmpc26";
	dqmpc27 = "/dqmgfap/dqmpc27";
	dqmpc28 = "/dqmgfap/dqmpc28";
	dqmpc29 = "/dqmgfap/dqmpc29";
	dqmpc30 = "/dqmgfap/dqmpc30";
	dqmpc31 = "/dqmgfap/dqmpc31";
	dqmpc32 = "/dqmgfap/dqmpc32";
	dqmpc33 = "/dqmgfap/dqmpc33";
	dqmpc34 = "/dqmgfap/dqmpc34";
	dqmpc35 = "/dqmgfap/dqmpc35";
	dqmpc36 = "/dqmgfap/dqmpc36";
	dqmpc37 = "/dqmgfap/dqmpc37";
	dqmpc38 = "/dqmgfap/dqmpc38";
	dqmpc39 = "/dqmgfap/dqmpc39";
	dqmpc40 = "/dqmgfap/dqmpc40";
	dqmpc41 = "/dqmgfap/dqmpc41";
	dqmpc42 = "/dqmgfap/dqmpc42";
	dqmpc43 = "/dqmgfap/dqmpc43";
	dqmpc44 = "/dqmgfap/dqmpc44";
	dqmpc45 = "/dqmgfap/dqmpc45";
	dqmpc46 = "/dqmgfap/dqmpc46";
	dqmpc47 = "/dqmgfap/dqmpc47";
	dqmep5 = "/dqmep5";
	dqmep5intc0 = "/dqmep5/dqmep5intc0";
	dqmep50 = "/dqmep5/dqmep50";
	dqmep51 = "/dqmep5/dqmep51";
	dqmep52 = "/dqmep5/dqmep52";
	dqmep53 = "/dqmep5/dqmep53";
	dqmep54 = "/dqmep5/dqmep54";
	dqmep55 = "/dqmep5/dqmep55";
	dqmep56 = "/dqmep5/dqmep56";
	dqmep57 = "/dqmep5/dqmep57";
	dqmcpuc = "/dqmcpuc";
	cdqmintc0 = "/dqmcpuc/cdqmintc0";
	dqm2 = "/dqmcpuc/dqm2";
	dqm3 = "/dqmcpuc/dqm3";
	dqm14 = "/dqmcpuc/dqm14";
	dqm15 = "/dqmcpuc/dqm15";
	dqm20 = "/dqmcpuc/dqm20";
	dqm21 = "/dqmcpuc/dqm21";
	netport = "/netport";
	merlin = "/merlin";
	netport_mdio = "/netport-mdio";
	miimdiomux = "/miimdiomux";
	unimac0 = "/unimac0";
	unimac1 = "/unimac1";
	xlmac0 = "/xlmac0";
	xlmac1 = "/xlmac1";
	xlmac2 = "/xlmac2";
	xlmac3 = "/xlmac3";
	dgphy0 = "/dgphy0";
	dgphy1 = "/dgphy1";
	rgmii0 = "/rgmii0";
	rgmii1 = "/rgmii1";
	xgmii0 = "/lane0";
	xgmii1 = "/lane1";
	xgmii2 = "/lane2";
	xgmii3 = "/lane3";
	pcie0_l2_intc = "/pcie0-l2-intc";
	pcie1_l2_intc = "/pcie1-l2-intc";
	pcie2_l2_intc = "/pcie2-l2-intc";
	pcie3_l2_intc = "/pcie3-l2-intc";
	pdc = "/iproc-pdc";
	spu_pdc = "/spu_pdc";
	spu_crypto = "/spu_crypto";
	spu_flexrm = "/spu_flexrm";
	spu_crypto2 = "/spu_crypto2";
	usbphy_0 = "/usbphy-0";
	xhci_0_0 = "/xhci-v2-0";
	sdhci_0 = "/system_bus/sdhci-0";
	pcie0 = "/pcie@c0000000";
	pcie1 = "/pcie@c4000000";
	pcie2 = "/pcie@c8000000";
	pcie3 = "/pcie@cc000000";
	qchan0 = "/q-channel0";
	qchan1 = "/q-channel1";
	qchan2 = "/q-channel2";
	qchan3 = "/q-channel3";
	qchan4 = "/q-channel4";
	qchan5 = "/q-channel5";
	qchan6 = "/q-channel6";
	qchan7 = "/q-channel7";
	qchan8 = "/q-channel8";
	qchan9 = "/q-channel9";
	qchanpriv0 = "/q-channelpriv0";
	priv0 = "/priv0";
	rpcrgsmc = "/rpc/rpcrgsmc@0";
	rpcrgappsmc = "/rpc/rpcrgappsmc@a";
	rpcrgcm = "/rpc/rpcrgcm@2";
	rpcsmcramlog = "/rpcsmcramlog";
	bstm = "/bstm";
};

};

And the BCM33940/BCM33941 specific trees:

BCM33940/BCM33941 Device Tree
/dts-v1/;

/ {
compatible = "brcm,bcm33940", "brcm,bcm33941";

platform-match {
	layer = <0x20>;
	match = "a | b | c | d | e | f | g | h | i | j | k | l | m | n";

	a {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xfb350000>;
	};

	b {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf9390000>;
	};

	c {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf0a90000>;
	};

	d {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xff4c0000>;
	};

	e {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf0c40000>;
	};

	f {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf0c70000>;
	};

	g {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xfecb0000>;
	};

	h {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf0600000>;
	};

	i {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xfa890000>;
	};

	j {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf22c0000>;
	};

	k {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xff130000>;
	};

	l {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf8440000>;
	};

	m {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf4f30000>;
	};

	n {
		type = "rpc";
		request = <0x20f1000 0x00 0x00 0x00>;
		mask = <0xffffff00 0x00 0x00 0xffffff00>;
		val = <0x30f1000 0x00 0x00 0xf7300000>;
	};
};

fragment@0 {
	target = <0xffffffff>;

	__overlay__ {
		compatible = "brcm,bcm33940-pcie";
	};
};

fragment@1 {
	target = <0xffffffff>;

	__overlay__ {
		compatible = "brcm,bcm33940-pcie";
	};
};

fragment@2 {
	target = <0xffffffff>;

	__overlay__ {
		compatible = "brcm,bcm33940-pcie";
	};
};

fragment@3 {
	target = <0xffffffff>;

	__overlay__ {
		compatible = "brcm,bcm33940-pcie";
	};
};

__fixups__ {
	pcie0 = "/fragment@0:target:0";
	pcie1 = "/fragment@1:target:0";
	pcie2 = "/fragment@2:target:0";
	pcie3 = "/fragment@3:target:0";
};

};

Image

Image

So far, these chips are found in the CGM601TCOM and SG417DBCT from Comcast. The firmware updates are fully encrypted as well.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions