169018ce2SKumar Gala /* 269018ce2SKumar Gala * Copyright 2008 Freescale Semiconductor, Inc. 369018ce2SKumar Gala * 469018ce2SKumar Gala * (C) Copyright 2000 569018ce2SKumar Gala * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 669018ce2SKumar Gala * 71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 869018ce2SKumar Gala */ 969018ce2SKumar Gala 1069018ce2SKumar Gala #include <common.h> 1169018ce2SKumar Gala #include <libfdt.h> 1269018ce2SKumar Gala #include <fdt_support.h> 1369018ce2SKumar Gala #include "qe.h" 1469018ce2SKumar Gala 15*93d33204SZhao Qiang #ifdef CONFIG_QE 1669018ce2SKumar Gala DECLARE_GLOBAL_DATA_PTR; 1769018ce2SKumar Gala 1869018ce2SKumar Gala /* 1969018ce2SKumar Gala * If a QE firmware has been uploaded, then add the 'firmware' node under 2069018ce2SKumar Gala * the 'qe' node. 2169018ce2SKumar Gala */ 2269018ce2SKumar Gala void fdt_fixup_qe_firmware(void *blob) 2369018ce2SKumar Gala { 2469018ce2SKumar Gala struct qe_firmware_info *qe_fw_info; 2569018ce2SKumar Gala int node, ret; 2669018ce2SKumar Gala 2769018ce2SKumar Gala qe_fw_info = qe_get_firmware_info(); 2869018ce2SKumar Gala if (!qe_fw_info) 2969018ce2SKumar Gala return; 3069018ce2SKumar Gala 3169018ce2SKumar Gala node = fdt_path_offset(blob, "/qe"); 3269018ce2SKumar Gala if (node < 0) 3369018ce2SKumar Gala return; 3469018ce2SKumar Gala 3569018ce2SKumar Gala /* We assume the node doesn't exist yet */ 3669018ce2SKumar Gala node = fdt_add_subnode(blob, node, "firmware"); 3769018ce2SKumar Gala if (node < 0) 3869018ce2SKumar Gala return; 3969018ce2SKumar Gala 4069018ce2SKumar Gala ret = fdt_setprop(blob, node, "extended-modes", 4169018ce2SKumar Gala &qe_fw_info->extended_modes, sizeof(u64)); 4269018ce2SKumar Gala if (ret < 0) 4369018ce2SKumar Gala goto error; 4469018ce2SKumar Gala 4569018ce2SKumar Gala ret = fdt_setprop_string(blob, node, "id", qe_fw_info->id); 4669018ce2SKumar Gala if (ret < 0) 4769018ce2SKumar Gala goto error; 4869018ce2SKumar Gala 4969018ce2SKumar Gala ret = fdt_setprop(blob, node, "virtual-traps", qe_fw_info->vtraps, 5069018ce2SKumar Gala sizeof(qe_fw_info->vtraps)); 5169018ce2SKumar Gala if (ret < 0) 5269018ce2SKumar Gala goto error; 5369018ce2SKumar Gala 5469018ce2SKumar Gala return; 5569018ce2SKumar Gala 5669018ce2SKumar Gala error: 5769018ce2SKumar Gala fdt_del_node(blob, node); 5869018ce2SKumar Gala } 5969018ce2SKumar Gala 6069018ce2SKumar Gala void ft_qe_setup(void *blob) 6169018ce2SKumar Gala { 6269018ce2SKumar Gala do_fixup_by_prop_u32(blob, "device_type", "qe", 4, 6345bae2e3SSimon Glass "bus-frequency", gd->arch.qe_clk, 1); 6469018ce2SKumar Gala do_fixup_by_prop_u32(blob, "device_type", "qe", 4, 651206c184SSimon Glass "brg-frequency", gd->arch.brg_clk, 1); 6669018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe", 6745bae2e3SSimon Glass "clock-frequency", gd->arch.qe_clk, 1); 6869018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe", 6945bae2e3SSimon Glass "bus-frequency", gd->arch.qe_clk, 1); 7069018ce2SKumar Gala do_fixup_by_compat_u32(blob, "fsl,qe", 711206c184SSimon Glass "brg-frequency", gd->arch.brg_clk, 1); 723fca8037SAnton Vorontsov do_fixup_by_compat_u32(blob, "fsl,qe-gtm", 7345bae2e3SSimon Glass "clock-frequency", gd->arch.qe_clk / 2, 1); 7469018ce2SKumar Gala fdt_fixup_qe_firmware(blob); 7569018ce2SKumar Gala } 76*93d33204SZhao Qiang #endif 77