[PATCH 3/6] imx: imx8mp: disable fused IP for UltraLite
Peng Fan (OSS)
peng.fan at oss.nxp.com
Thu Apr 7 09:55:53 CEST 2022
From: Peng Fan <peng.fan at nxp.com>
Beside the fused modules on iMX8MP Lite, this part has also fused
GPU3D/2D, LVDS and MIPI DSI.
So we have to disable them for kernel and also disable MIPI DSI
in u-boot DTS for splash screen at runtime.
Signed-off-by: Ye Li <ye.li at nxp.com>
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
arch/arm/mach-imx/imx8m/soc.c | 147 ++++++++++++++++++++++++++++++++--
1 file changed, 142 insertions(+), 5 deletions(-)
diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index f88296f7311..0ab55765c7c 100644
--- a/arch/arm/mach-imx/imx8m/soc.c
+++ b/arch/arm/mach-imx/imx8m/soc.c
@@ -907,6 +907,90 @@ static int low_drive_gpu_freq(void *blob)
}
#endif
+static bool check_remote_endpoint(void *blob, const char *ep1, const char *ep2)
+{
+ int lookup_node;
+ int nodeoff;
+
+ nodeoff = fdt_path_offset(blob, ep1);
+ if (nodeoff) {
+ lookup_node = fdtdec_lookup_phandle(blob, nodeoff, "remote-endpoint");
+ nodeoff = fdt_path_offset(blob, ep2);
+
+ if (nodeoff > 0 && nodeoff == lookup_node)
+ return true;
+ }
+
+ return false;
+}
+
+int disable_dsi_lcdif_nodes(void *blob)
+{
+ int ret;
+
+ static const char * const dsi_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/mipi_dsi at 32e60000"
+ };
+
+ static const char * const lcdif_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e80000"
+ };
+
+ static const char * const lcdif_ep_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e80000/port at 0/endpoint"
+ };
+ static const char * const dsi_ep_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/mipi_dsi at 32e60000/port at 0/endpoint"
+ };
+
+ ret = disable_fdt_nodes(blob, dsi_path_8mp, ARRAY_SIZE(dsi_path_8mp));
+ if (ret)
+ return ret;
+
+ if (check_remote_endpoint(blob, dsi_ep_path_8mp[0], lcdif_ep_path_8mp[0])) {
+ /* Disable lcdif node */
+ return disable_fdt_nodes(blob, lcdif_path_8mp, ARRAY_SIZE(lcdif_path_8mp));
+ }
+
+ return 0;
+}
+
+int disable_lvds_lcdif_nodes(void *blob)
+{
+ int ret, i;
+
+ static const char * const ldb_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/ldb at 32ec005c",
+ "/soc at 0/bus at 32c00000/phy at 32ec0128"
+ };
+
+ static const char * const lcdif_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e90000"
+ };
+
+ static const char * const lcdif_ep_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e90000/port at 0/endpoint at 0",
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e90000/port at 0/endpoint at 1"
+ };
+ static const char * const ldb_ep_path_8mp[] = {
+ "/soc at 0/bus at 32c00000/ldb at 32ec005c/lvds-channel at 0/port at 0/endpoint",
+ "/soc at 0/bus at 32c00000/ldb at 32ec005c/lvds-channel at 1/port at 0/endpoint"
+ };
+
+ ret = disable_fdt_nodes(blob, ldb_path_8mp, ARRAY_SIZE(ldb_path_8mp));
+ if (ret)
+ return ret;
+
+ for (i = 0; i < ARRAY_SIZE(ldb_ep_path_8mp); i++) {
+ if (check_remote_endpoint(blob, ldb_ep_path_8mp[i], lcdif_ep_path_8mp[i])) {
+ /* Disable lcdif node */
+ return disable_fdt_nodes(blob, lcdif_path_8mp, ARRAY_SIZE(lcdif_path_8mp));
+ }
+ }
+
+ return 0;
+}
+
int disable_gpu_nodes(void *blob)
{
static const char * const nodes_path_8mn[] = {
@@ -914,7 +998,15 @@ int disable_gpu_nodes(void *blob)
"/soc@/gpu at 38000000"
};
- return disable_fdt_nodes(blob, nodes_path_8mn, ARRAY_SIZE(nodes_path_8mn));
+ static const char * const nodes_path_8mp[] = {
+ "/gpu3d at 38000000",
+ "/gpu2d at 38008000"
+ };
+
+ if (is_imx8mp())
+ return disable_fdt_nodes(blob, nodes_path_8mp, ARRAY_SIZE(nodes_path_8mp));
+ else
+ return disable_fdt_nodes(blob, nodes_path_8mn, ARRAY_SIZE(nodes_path_8mn));
}
int disable_npu_nodes(void *blob)
@@ -1170,16 +1262,27 @@ usb_modify_speed:
disable_cpu_nodes(blob, 3);
#elif defined(CONFIG_IMX8MP)
- if (is_imx8mpl())
+ if (is_imx8mpul()) {
+ /* Disable GPU */
+ disable_gpu_nodes(blob);
+
+ /* Disable DSI */
+ disable_dsi_lcdif_nodes(blob);
+
+ /* Disable LVDS */
+ disable_lvds_lcdif_nodes(blob);
+ }
+
+ if (is_imx8mpul() || is_imx8mpl())
disable_vpu_nodes(blob);
- if (is_imx8mpl() || is_imx8mp6())
+ if (is_imx8mpul() || is_imx8mpl() || is_imx8mp6())
disable_npu_nodes(blob);
- if (is_imx8mpl())
+ if (is_imx8mpul() || is_imx8mpl())
disable_isp_nodes(blob);
- if (is_imx8mpl() || is_imx8mp6())
+ if (is_imx8mpul() || is_imx8mpl() || is_imx8mp6())
disable_dsp_nodes(blob);
if (is_imx8mpd())
@@ -1190,6 +1293,40 @@ usb_modify_speed:
}
#endif
+#ifdef CONFIG_OF_BOARD_FIXUP
+#ifndef CONFIG_SPL_BUILD
+int board_fix_fdt(void *fdt)
+{
+ if (is_imx8mpul()) {
+ int i = 0;
+ int nodeoff, ret;
+ const char *status = "disabled";
+ static const char * const dsi_nodes[] = {
+ "/soc at 0/bus at 32c00000/mipi_dsi at 32e60000",
+ "/soc at 0/bus at 32c00000/lcd-controller at 32e80000",
+ "/dsi-host"
+ };
+
+ for (i = 0; i < ARRAY_SIZE(dsi_nodes); i++) {
+ nodeoff = fdt_path_offset(fdt, dsi_nodes[i]);
+ if (nodeoff > 0) {
+set_status:
+ ret = fdt_setprop(fdt, nodeoff, "status", status,
+ strlen(status) + 1);
+ if (ret == -FDT_ERR_NOSPACE) {
+ ret = fdt_increase_size(fdt, 512);
+ if (!ret)
+ goto set_status;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+#endif
+
#if !CONFIG_IS_ENABLED(SYSRESET)
void reset_cpu(void)
{
--
2.35.1
More information about the U-Boot
mailing list