| # SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause |
| """ |
| Document renderer class for preloader source files |
| |
| Each document renderer takes care of a full construction of |
| a specific file format using the required data model. |
| |
| Copyright (C) 2022 Intel Corporation <www.intel.com> |
| |
| Author: Lee, Kah Jing <kah.jing.lee@intel.com> |
| """ |
| import collections |
| import doc |
| |
| class pll_config_h: |
| """ |
| pll_config.h renderer. |
| """ |
| |
| def __init__(self, hpsModel, emifModel): |
| """ renderer initialization """ |
| self.hpsModel = hpsModel |
| self.emifModel = emifModel |
| self.doc = doc.generated_c_source("__SOCFPGA_PLL_CONFIG_H__") |
| |
| def createContent(self): |
| """ add the content based on settings parsed. eventually it will be |
| written to pll_config.h file |
| """ |
| doc.c_source.line(self.doc) |
| id = "CFG_HPS_DBCTRL_STAYOSC1" |
| valueString = self.hpsModel.getSystemConfig("dbctrl_stayosc1") |
| # Unfortunately hps.xml never tells us the data type of values |
| # attributes. Here we workaround this type of problem, often |
| # this is case-by-case, i.e. having to know which parameter that |
| # we're dealing with, hence this ugly parameter-specific |
| # if-statement needs here to workaround the data type inconsistency |
| if valueString.lower() == "true": |
| value = "1" |
| else: |
| value = "0" |
| doc.c_source.define(self.doc, id, value ) |
| doc.c_source.line(self.doc) |
| self.addMainPllSettings() |
| doc.c_source.line(self.doc) |
| self.addPeriphPllSettings() |
| doc.c_source.line(self.doc) |
| self.addSdramPllSettings() |
| doc.c_source.line(self.doc) |
| self.addClockFreq() |
| doc.c_source.line(self.doc) |
| self.addAlteraSettings() |
| doc.c_source.line(self.doc) |
| |
| def addMainPllSettings(self): |
| """ add pll settings to the file """ |
| paramMap = collections.OrderedDict() |
| paramMap["VCO_DENOM"] = "main_pll_n" |
| paramMap["VCO_NUMER"] = "main_pll_m" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_MAINPLLGRP_" + key |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| # main_pll_c0, main_pll_c1, main_pll_c2 are fixed counters, |
| doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_MPUCLK_CNT", "0") |
| doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_MAINCLK_CNT", "0") |
| doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_DBGATCLK_CNT", "0") |
| |
| paramMap = collections.OrderedDict() |
| |
| paramMap["MAINQSPICLK_CNT"] = "main_pll_c3" |
| paramMap["MAINNANDSDMMCCLK_CNT"] = "main_pll_c4" |
| paramMap["CFGS2FUSER0CLK_CNT"] = "main_pll_c5" |
| paramMap["MAINDIV_L3MPCLK"] = "l3_mp_clk_div" |
| paramMap["MAINDIV_L3SPCLK"] = "l3_sp_clk_div" |
| paramMap["MAINDIV_L4MPCLK"] = "l4_mp_clk_div" |
| paramMap["MAINDIV_L4SPCLK"] = "l4_sp_clk_div" |
| paramMap["DBGDIV_DBGATCLK"] = "dbg_at_clk_div" |
| paramMap["DBGDIV_DBGCLK"] = "dbg_clk_div" |
| paramMap["TRACEDIV_TRACECLK"] = "dbg_trace_clk_div" |
| paramMap["L4SRC_L4MP"] = "l4_mp_clk_source" |
| paramMap["L4SRC_L4SP"] = "l4_sp_clk_source" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_MAINPLLGRP_" + key |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| def addPeriphPllSettings(self): |
| """ add peripheral pll settings to the file """ |
| paramMap = collections.OrderedDict() |
| paramMap["VCO_DENOM"] = "periph_pll_n" |
| paramMap["VCO_NUMER"] = "periph_pll_m" |
| paramMap["VCO_PSRC"] = "periph_pll_source" |
| paramMap["EMAC0CLK_CNT"] = "periph_pll_c0" |
| paramMap["EMAC1CLK_CNT"] = "periph_pll_c1" |
| paramMap["PERQSPICLK_CNT"] = "periph_pll_c2" |
| paramMap["PERNANDSDMMCCLK_CNT"] = "periph_pll_c3" |
| paramMap["PERBASECLK_CNT"] = "periph_pll_c4" |
| paramMap["S2FUSER1CLK_CNT"] = "periph_pll_c5" |
| paramMap["DIV_USBCLK"] = "usb_mp_clk_div" |
| paramMap["DIV_SPIMCLK"] = "spi_m_clk_div" |
| paramMap["DIV_CAN0CLK"] = "can0_clk_div" |
| paramMap["DIV_CAN1CLK"] = "can1_clk_div" |
| paramMap["GPIODIV_GPIODBCLK"] = "gpio_db_clk_div" |
| paramMap["SRC_SDMMC"] = "sdmmc_clk_source" |
| paramMap["SRC_NAND"] = "nand_clk_source" |
| paramMap["SRC_QSPI"] = "qspi_clk_source" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_PERPLLGRP_" + key |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| def addSdramPllSettings(self): |
| """ add sdram pll settings to the file """ |
| value = self.emifModel.getPllDefine("PLL_MEM_CLK_DIV") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_DENOM", value ) |
| value = self.emifModel.getPllDefine("PLL_MEM_CLK_MULT") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_NUMER", value ) |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_SSRC", "0") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQSCLK_CNT", "1") |
| value = self.emifModel.getPllDefine("PLL_MEM_CLK_PHASE_DEG") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQSCLK_PHASE", value ) |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDR2XDQSCLK_CNT", "0") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDR2XDQSCLK_PHASE", "0") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQCLK_CNT", "1") |
| value = self.emifModel.getPllDefine("PLL_WRITE_CLK_PHASE_DEG") |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQCLK_PHASE", value ) |
| |
| try: |
| value = self.hpsModel.getSystemConfig("sdram_pll_c5") |
| except ValueError: |
| value = "5" |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_S2FUSER2CLK_CNT", value ) |
| doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_S2FUSER2CLK_PHASE", "0") |
| |
| def addClockFreq(self): |
| """ add clock frequency settings to the file """ |
| paramMap = collections.OrderedDict() |
| paramMap["OSC1"] = "eosc1_clk_hz" |
| paramMap["OSC2"] = "eosc2_clk_hz" |
| paramMap["F2S_SDR_REF"] = "F2SCLK_SDRAMCLK_FREQ" |
| paramMap["F2S_PER_REF"] = "F2SCLK_PERIPHCLK_FREQ" |
| paramMap["MAINVCO"] = "main_pll_vco_hz" |
| paramMap["PERVCO"] = "periph_pll_vco_hz" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_CLK_" + key + "_HZ" |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| eosc1 = int(self.hpsModel.getSystemConfig("eosc1_clk_hz")) |
| eosc2 = int(self.hpsModel.getSystemConfig("eosc2_clk_hz")) |
| m = int(self.emifModel.getPllDefine("PLL_MEM_CLK_MULT")) |
| n = int(self.emifModel.getPllDefine("PLL_MEM_CLK_DIV")) |
| vco = int(round(eosc1 * (m + 1) / (n + 1))) |
| doc.c_source.define(self.doc, "CFG_HPS_CLK_SDRVCO_HZ", str(vco) ) |
| |
| paramMap = collections.OrderedDict() |
| paramMap["EMAC0"] = "emac0_clk_hz" |
| paramMap["EMAC1"] = "emac1_clk_hz" |
| paramMap["USBCLK"] = "usb_mp_clk_hz" |
| paramMap["NAND"] = "nand_clk_hz" |
| paramMap["SDMMC"] = "sdmmc_clk_hz" |
| paramMap["QSPI"] = "qspi_clk_hz" |
| paramMap["SPIM"] = "spi_m_clk_hz" |
| paramMap["CAN0"] = "can0_clk_hz" |
| paramMap["CAN1"] = "can1_clk_hz" |
| paramMap["GPIODB"] = "gpio_db_clk_hz" |
| paramMap["L4_MP"] = "l4_mp_clk_hz" |
| paramMap["L4_SP"] = "l4_sp_clk_hz" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_CLK_" + key + "_HZ" |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| def addAlteraSettings(self): |
| """ add Altera-related settings to the file """ |
| paramMap = collections.OrderedDict() |
| paramMap["MPUCLK"] = "main_pll_c0_internal" |
| paramMap["MAINCLK"] = "main_pll_c1_internal" |
| paramMap["DBGATCLK"] = "main_pll_c2_internal" |
| |
| for key in paramMap.keys(): |
| id = "CFG_HPS_ALTERAGRP_" + key |
| value = self.hpsModel.getSystemConfig(paramMap[key]) |
| doc.c_source.define(self.doc, id, value ) |
| |
| def __str__(self): |
| """ convert to string """ |
| self.createContent() |
| return str(self.doc) |