Message ID | 1479544691-59575-52-git-send-email-heyi.guo@linaro.org |
---|---|
State | Superseded |
Headers | show |
On Sat, Nov 19, 2016 at 04:38:06PM +0800, Heyi Guo wrote: > Read reference clock from ARCH timer frequency and set it into DT. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Heyi Guo <heyi.guo@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> > --- > .../D03/Library/FdtUpdateLib/FdtUpdateLib.c | 60 ++++++++++++++++++++++ > .../D03/Library/FdtUpdateLib/FdtUpdateLib.inf | 2 + > 2 files changed, 62 insertions(+) > > diff --git a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c > index b8b9503..d00cb9b 100755 > --- a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c > +++ b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c > @@ -14,6 +14,7 @@ > **/ > > #include <Uefi.h> > +#include <Library/ArmArchTimer.h> > #include <Library/BaseLib.h> > #include <libfdt.h> > #include <Library/IoLib.h> > @@ -183,6 +184,61 @@ DelPhyhandleUpdateMacAddress(IN VOID* Fdt) > return Status; > } > > +STATIC > +EFI_STATUS > +UpdateRefClk (IN VOID* Fdt) > +{ > + INTN node; > + INTN Error; > + struct fdt_property *m_prop; > + int m_oldlen; > + UINTN ArchTimerFreq = 0; > + UINT32 Data; > + CONST CHAR8 *Property = "clock-frequency"; > + > + ArmArchTimerReadReg (CntFrq, &ArchTimerFreq); > + if (!ArchTimerFreq) { > + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Get timer frequency failed!\n", __FUNCTION__, __LINE__)); > + return EFI_INVALID_PARAMETER; > + } > + > + node = fdt_subnode_offset(Fdt, 0, "soc"); > + if (node < 0) { > + DEBUG ((DEBUG_ERROR, "can not find soc node\n")); > + return EFI_INVALID_PARAMETER; > + } > + > + node = fdt_subnode_offset(Fdt, node, "refclk"); > + if (node < 0) { > + DEBUG ((DEBUG_ERROR, "can not find refclk node\n")); > + return EFI_INVALID_PARAMETER; > + } > + > + m_prop = fdt_get_property_w(Fdt, node, Property, &m_oldlen); > + if(!m_prop) { > + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Can't find property %a\n", __FUNCTION__, __LINE__, Property)); > + return EFI_INVALID_PARAMETER; > + } > + > + Error = fdt_delprop(Fdt, node, Property); > + if (Error) { > + DEBUG ((DEBUG_ERROR, "ERROR: fdt_delprop() %a: %a\n", Property, fdt_strerror (Error))); > + return EFI_INVALID_PARAMETER; > + } > + > + // UINT32 is enough for refclk data length > + Data = (UINT32) ArchTimerFreq; > + Data = cpu_to_fdt32 (Data); > + Error = fdt_setprop(Fdt, node, Property, &Data, sizeof(Data)); > + if (Error) { > + DEBUG ((DEBUG_ERROR, "ERROR:fdt_setprop() %a: %a\n", Property, fdt_strerror (Error))); > + return EFI_INVALID_PARAMETER; > + } > + > + DEBUG ((DEBUG_INFO, "Update refclk successfully.\n")); > + return EFI_SUCCESS; > +} > + > INTN > GetMemoryNode(VOID* Fdt) > { > @@ -401,6 +457,10 @@ EFI_STATUS EFIFdtUpdate(UINTN FdtFileAddr) > Status = EFI_SUCCESS; > } > > + Status = UpdateRefClk (Fdt); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "UpdateiRefClk fail.\n")); > + } > > Status = UpdateMemoryNode(Fdt); > if (EFI_ERROR (Status)) > diff --git a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf > index b885eae..9569b91 100755 > --- a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf > +++ b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf > @@ -27,12 +27,14 @@ > > > [Packages] > + ArmPkg/ArmPkg.dec > MdePkg/MdePkg.dec > MdeModulePkg/MdeModulePkg.dec > EmbeddedPkg/EmbeddedPkg.dec > OpenPlatformPkg/Chips/Hisilicon/HisiPkg.dec > > [LibraryClasses] > + ArmLib > FdtLib > PlatformSysCtrlLib > OemMiscLib > -- > 1.9.1 >
diff --git a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c index b8b9503..d00cb9b 100755 --- a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c +++ b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.c @@ -14,6 +14,7 @@ **/ #include <Uefi.h> +#include <Library/ArmArchTimer.h> #include <Library/BaseLib.h> #include <libfdt.h> #include <Library/IoLib.h> @@ -183,6 +184,61 @@ DelPhyhandleUpdateMacAddress(IN VOID* Fdt) return Status; } +STATIC +EFI_STATUS +UpdateRefClk (IN VOID* Fdt) +{ + INTN node; + INTN Error; + struct fdt_property *m_prop; + int m_oldlen; + UINTN ArchTimerFreq = 0; + UINT32 Data; + CONST CHAR8 *Property = "clock-frequency"; + + ArmArchTimerReadReg (CntFrq, &ArchTimerFreq); + if (!ArchTimerFreq) { + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Get timer frequency failed!\n", __FUNCTION__, __LINE__)); + return EFI_INVALID_PARAMETER; + } + + node = fdt_subnode_offset(Fdt, 0, "soc"); + if (node < 0) { + DEBUG ((DEBUG_ERROR, "can not find soc node\n")); + return EFI_INVALID_PARAMETER; + } + + node = fdt_subnode_offset(Fdt, node, "refclk"); + if (node < 0) { + DEBUG ((DEBUG_ERROR, "can not find refclk node\n")); + return EFI_INVALID_PARAMETER; + } + + m_prop = fdt_get_property_w(Fdt, node, Property, &m_oldlen); + if(!m_prop) { + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Can't find property %a\n", __FUNCTION__, __LINE__, Property)); + return EFI_INVALID_PARAMETER; + } + + Error = fdt_delprop(Fdt, node, Property); + if (Error) { + DEBUG ((DEBUG_ERROR, "ERROR: fdt_delprop() %a: %a\n", Property, fdt_strerror (Error))); + return EFI_INVALID_PARAMETER; + } + + // UINT32 is enough for refclk data length + Data = (UINT32) ArchTimerFreq; + Data = cpu_to_fdt32 (Data); + Error = fdt_setprop(Fdt, node, Property, &Data, sizeof(Data)); + if (Error) { + DEBUG ((DEBUG_ERROR, "ERROR:fdt_setprop() %a: %a\n", Property, fdt_strerror (Error))); + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_INFO, "Update refclk successfully.\n")); + return EFI_SUCCESS; +} + INTN GetMemoryNode(VOID* Fdt) { @@ -401,6 +457,10 @@ EFI_STATUS EFIFdtUpdate(UINTN FdtFileAddr) Status = EFI_SUCCESS; } + Status = UpdateRefClk (Fdt); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "UpdateiRefClk fail.\n")); + } Status = UpdateMemoryNode(Fdt); if (EFI_ERROR (Status)) diff --git a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf index b885eae..9569b91 100755 --- a/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf +++ b/Platforms/Hisilicon/D03/Library/FdtUpdateLib/FdtUpdateLib.inf @@ -27,12 +27,14 @@ [Packages] + ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec OpenPlatformPkg/Chips/Hisilicon/HisiPkg.dec [LibraryClasses] + ArmLib FdtLib PlatformSysCtrlLib OemMiscLib
Read reference clock from ARCH timer frequency and set it into DT. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Heyi Guo <heyi.guo@linaro.org> --- .../D03/Library/FdtUpdateLib/FdtUpdateLib.c | 60 ++++++++++++++++++++++ .../D03/Library/FdtUpdateLib/FdtUpdateLib.inf | 2 + 2 files changed, 62 insertions(+)