/*
 * Copyright 2018 NXP
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include "fsl-imx8qm-lpddr4-arm2.dts"
#include "fsl-imx8qm-xen.dtsi"

/ {
	chosen {
		#address-cells = <2>;
		#size-cells = <2>;

		/* Could be updated by U-Boot */
		module@0 {
			bootargs = "earlycon=xen console=hvc0 loglevel=8 root=/dev/mmcblk1p2 rw  rootwait";
			compatible = "xen,linux-zimage", "xen,multiboot-module";
			reg = <0x00000000 0x80a00000 0x00000000 0xf93a00>;
               };
	};

	domu {
		/*
		 * There are 5 MUs, 0A is used by Dom0, 1A is used
		 * by ATF, so for DomU, 2A/3A/4A could be used.
		 * SC_R_MU_0A
		 * SC_R_MU_1A
		 * SC_R_MU_2A
		 * SC_R_MU_3A
		 * SC_R_MU_4A
		 * The rsrcs and pads will be configured by uboot scu_rm cmd
		 */
		#address-cells = <1>;
		#size-cells = <0>;
		doma {
			compatible = "xen,domu";
			/*
			 * The name entry in VM configuration file
			 * needs to be same as here.
			 */
			domain_name = "DomU";
			/*
			 * The reg property will be updated by U-Boot to
			 * reflect the partition id.
			 */
			reg = <0>;
			init_on_rsrcs = <
				SC_R_MU_2A
			>;
			rsrcs = <
				SC_R_GPU_1_PID0
				SC_R_GPU_1_PID1
				SC_R_GPU_1_PID2
				SC_R_GPU_1_PID3
				SC_R_LVDS_1
				SC_R_LVDS_1_I2C_0
				SC_R_LVDS_1_PWM_0
				SC_R_DC_1
				SC_R_DC_1_BLIT0
				SC_R_DC_1_BLIT1
				SC_R_DC_1_BLIT2
				SC_R_DC_1_BLIT_OUT
				SC_R_UNUSED9
				SC_R_UNUSED10
				SC_R_DC_1_WARP
				SC_R_UNUSED11
				SC_R_UNUSED12
				SC_R_DC_1_VIDEO0
				SC_R_DC_1_VIDEO1
				SC_R_DC_1_FRAC0
				SC_R_UNUSED13
				SC_R_DC_1_PLL_0
				SC_R_DC_1_PLL_1
				SC_R_MIPI_1
				SC_R_MIPI_1_I2C_0
				SC_R_MIPI_1_I2C_1
				SC_R_MIPI_1_PWM_0
				SC_R_HDMI
				SC_R_HDMI_I2C_0
				SC_R_SDHC_0
				SC_R_USB_0
				SC_R_USB_0_PHY
				SC_R_UART_1
				SC_R_DMA_0_CH14
				SC_R_DMA_0_CH15
				SC_R_MU_2A
				>;
			pads = <
				/* i2c1_lvds1 */
				SC_P_LVDS1_I2C1_SCL
				SC_P_LVDS1_I2C1_SDA
				/* emmc */
				SC_P_EMMC0_CLK
				SC_P_EMMC0_CMD
				SC_P_EMMC0_DATA0
				SC_P_EMMC0_DATA1
				SC_P_EMMC0_DATA2
				SC_P_EMMC0_DATA3
				SC_P_EMMC0_DATA4
				SC_P_EMMC0_DATA5
				SC_P_EMMC0_DATA6
				SC_P_EMMC0_DATA7
				SC_P_EMMC0_STROBE
				SC_P_EMMC0_RESET_B
				/* usb otg */
				SC_P_USB_SS3_TC0
				/* uart1 */
				SC_P_UART1_RX
				SC_P_UART1_TX
				SC_P_UART1_CTS_B
				SC_P_UART1_RTS_B
				SC_P_QSPI1A_DQS
				>;
		};
	};

	reserved-memory {
		/* global autoconfigured region for contiguous allocations */
		linux,cma {
			compatible = "shared-dma-pool";
			reusable;
			size = <0 0x28000000>;
			alloc-ranges = <0 0xd0000000 0 0x28000000>;
			linux,cma-default;
		};
	};

	display-subsystem {
		compatible = "fsl,imx-display-subsystem";
		ports = <&dpu1_disp0>, <&dpu1_disp1>;
	};

	/* Passthrough to domu */
	mu2: mu@5d1d0000 {
		compatible = "fsl,imx8-mu";
		reg = <0x0 0x5d1d0000 0x0 0x10000>;
		interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
		fsl,scu_ap_mu_id = <0>;
		xen,passthrough;
		status = "disabled";
	};

};

&usbotg1_lpcg {
	xen,passthrough;
};

&sdhc1_lpcg {
	xen,passthrough;
};

&lpuart1 {
	xen,passthrough;
};

&lpuart1_lpcg {
	xen,passthrough;
};

&di_lvds1_lpcg {
	xen,passthrough;
};

&dc_1_lpcg {
	xen,passthrough;
};

&edma01 {
	#stream-id-cells = <1>;
	xen,passthrough;
	fsl,sc_rsrc_id = <SC_R_DMA_0_CH14>,
			 <SC_R_DMA_0_CH15>;
};

/* SMMU */
&smmu {
	mmu-masters = <&dpu2 0x13>, <&gpu_3d1 0x15>,
		      <&usdhc1 0x12>, <&usbotg1 0x11>,
		      <&edma01 0x10>;
};

&lvds_region2 {
	xen,passthrough;
};

&irqsteer_lvds1 {
	xen,passthrough;
};

&i2c1_lvds1 {
	xen,passthrough;
};

&ldb2_phy {
	xen,passthrough;
};

&ldb2 {
	xen,passthrough;
};

&crypto {
	/* Met CAAM failure on A0, disable it first */
	status = "disabled";
};

&dpu2_intsteer {
	xen,passthrough;
};

&dpu2 {
	xen,passthrough;
	#stream-id-cells = <1>;
	iommus = <&smmu>;
};

&prg10 {
	xen,passthrough;
};

&prg11 {
	xen,passthrough;
};

&prg12 {
	xen,passthrough;
};

&prg13 {
	xen,passthrough;
};

&prg14 {
	xen,passthrough;
};

&prg15 {
	xen,passthrough;
};

&prg16 {
	xen,passthrough;
};

&prg17 {
	xen,passthrough;
};

&prg18 {
	xen,passthrough;
};

&dpr3_channel1 {
	xen,passthrough;
};

&dpr3_channel2 {
	xen,passthrough;
};

&dpr3_channel3 {
	xen,passthrough;
};

&dpr4_channel1 {
	xen,passthrough;
};

&dpr4_channel2 {
	xen,passthrough;
};

&dpr4_channel3 {
	xen,passthrough;
};

/* GPU */
&pd_gpu1 {
	xen,passthrough;
};

&gpu_3d1 {
	xen,passthrough;
	#stream-id-cells = <1>;
	iommus = <&smmu>;
};

&imx8_gpu_ss {
	cores = <&gpu_3d0>;
	/delete-property/ reg;
	/delete-property/ reg-names;
};

&sata {
	status = "disabled";
};

&usdhc1 {
	xen,passthrough;
	#stream-id-cells = <1>;
	iommus = <&smmu>;
};

&usbotg1 {
	/* Hack reg */
	reg = <0x0 0x5b0d0000 0x0 0x1000>;
	xen,passthrough;
	#stream-id-cells = <1>;
	iommus = <&smmu>;
};

&usbmisc1 {
	/* Hack */
	/delete-property/ reg;
	status = "disabled";
};

&usbphy1 {
	reg = <0x0 0x5b100000 0x0 0x1000>;
	xen,passthrough;
};
