Minor comments below.

On Fri, Feb 16, 2018 at 02:20:32PM +0530, Meenakshi wrote:
> From: Meenakshi Aggarwal <[email protected]>
> 
> Add support of DWC3 controller driver which
> Performs DWC3 controller initialization and
> Register itself as NonDiscoverableMmioDevice
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <[email protected]>
> ---
>  Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c   | 219 
> +++++++++++++++++++++++++++
>  Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h   | 142 +++++++++++++++++
>  Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf |  48 ++++++
>  Silicon/NXP/NxpQoriqLs.dec                   |   5 +
>  4 files changed, 414 insertions(+)
>  create mode 100644 Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c
>  create mode 100644 Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h
>  create mode 100644 Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf
> 
> diff --git a/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c 
> b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c
> new file mode 100644
> index 0000000..b08e19c
> --- /dev/null
> +++ b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c
> @@ -0,0 +1,219 @@
> +/** @file
> +
> +  Copyright 2017 NXP
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD 
> License
> +  which accompanies this distribution.  The full text of the license may be 
> found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +
> +**/
> +
> +#include <Bitops.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/NonDiscoverableDeviceRegistrationLib.h>
> +
> +#include "UsbHcd.h"
> +
> +STATIC
> +VOID
> +XhciSetBeatBurstLength (
> +  IN  UINTN  UsbReg
> +  )
> +{
> +  Dwc3       *Dwc3Reg;
> +
> +  Dwc3Reg = (VOID *)(UsbReg + DWC3_REG_OFFSET);
> +
> +  MmioAndThenOr32 ((UINTN)&Dwc3Reg->GSBusCfg0, ~USB3_ENABLE_BEAT_BURST_MASK,
> +                                              USB3_ENABLE_BEAT_BURST);
> +  MmioOr32 ((UINTN)&Dwc3Reg->GSBusCfg1, USB3_SET_BEAT_BURST_LIMIT);
> +
> +  return;
> +}
> +
> +STATIC
> +VOID
> +Dwc3SetFladj (
> +  IN  Dwc3   *Dwc3Reg,
> +  IN  UINT32 Val
> +  )
> +{
> +  MmioOr32 ((UINTN)&Dwc3Reg->GFLAdj, GFLADJ_30MHZ_REG_SEL |
> +                        GFLADJ_30MHZ(Val));
> +}
> +
> +VOID
> +Dwc3SetMode (
> +  IN  Dwc3   *Dwc3Reg,
> +  IN  UINT32 Mode
> +  )
> +{
> +  MmioAndThenOr32 ((UINTN)&Dwc3Reg->GCtl,
> +               ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG)),
> +               DWC3_GCTL_PRTCAPDIR(Mode));
> +}
> +
> +STATIC
> +VOID
> +Dwc3CoreSoftReset (
> +  IN  Dwc3   *Dwc3Reg
> +  )
> +{
> +  MmioOr32 ((UINTN)&Dwc3Reg->GCtl, DWC3_GCTL_CORESOFTRESET);
> +  MmioOr32 ((UINTN)&Dwc3Reg->GUsb3PipeCtl[0], DWC3_GUSB3PIPECTL_PHYSOFTRST);
> +  MmioOr32 ((UINTN)&Dwc3Reg->GUsb2PhyCfg, DWC3_GUSB2PHYCFG_PHYSOFTRST);
> +  MmioAnd32 ((UINTN)&Dwc3Reg->GUsb3PipeCtl[0], 
> ~DWC3_GUSB3PIPECTL_PHYSOFTRST);
> +  MmioAnd32 ((UINTN)&Dwc3Reg->GUsb2PhyCfg, ~DWC3_GUSB2PHYCFG_PHYSOFTRST);
> +  MmioAnd32 ((UINTN)&Dwc3Reg->GCtl, ~DWC3_GCTL_CORESOFTRESET);
> +
> +  return;
> +}
> +
> +STATIC
> +EFI_STATUS
> +Dwc3CoreInit (
> +  IN  Dwc3   *Dwc3Reg
> +  )
> +{
> +  UINT32     Revision;
> +  UINT32     Reg;
> +  UINTN      Dwc3Hwparams1;
> +
> +  Revision = MmioRead32 ((UINTN)&Dwc3Reg->GSnpsId);
> +  //
> +  // This should read as 0x5533, ascii of U3(DWC_usb3) followed by revision 
> number
> +  //
> +  if ((Revision & DWC3_GSNPSID_MASK) != DWC3_SYNOPSIS_ID) {

Should this be _SYNOPSYS_ rather than _SYNOPSIS_?

> +    DEBUG ((DEBUG_ERROR,"This is not a DesignWare USB3 DRD Core.\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Dwc3CoreSoftReset (Dwc3Reg);
> +
> +  Reg = MmioRead32 ((UINTN)&Dwc3Reg->GCtl);
> +  Reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
> +  Reg &= ~DWC3_GCTL_DISSCRAMBLE;
> +
> +  Dwc3Hwparams1 = MmioRead32 ((UINTN)&Dwc3Reg->GHwParams1);
> +
> +  if (DWC3_GHWPARAMS1_EN_PWROPT(Dwc3Hwparams1) == 
> DWC3_GHWPARAMS1_EN_PWROPT_CLK) {
> +    Reg &= ~DWC3_GCTL_DSBLCLKGTNG;
> +  } else {
> +    DEBUG ((DEBUG_ERROR,"No power optimization available.\n"));
> +  }
> +
> +  if ((Revision & DWC3_RELEASE_MASK) < DWC3_RELEASE_190a) {
> +    Reg |= DWC3_GCTL_U2RSTECN;
> +  }
> +
> +  MmioWrite32 ((UINTN)&Dwc3Reg->GCtl, Reg);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +STATIC
> +EFI_STATUS
> +XhciCoreInit (
> +  IN  UINTN  UsbReg
> +  )
> +{
> +  EFI_STATUS Status;
> +  Dwc3       *Dwc3Reg;
> +
> +  Dwc3Reg = (VOID *)(UsbReg + DWC3_REG_OFFSET);
> +
> +  Status = Dwc3CoreInit (Dwc3Reg);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "Dwc3CoreInit Failed for controller 0x%x (0x%x) \n",
> +                  UsbReg, Status));
> +    return Status;
> +  }
> +
> +  Dwc3SetMode (Dwc3Reg, DWC3_GCTL_PRTCAP_HOST);
> +
> +  Dwc3SetFladj (Dwc3Reg, GFLADJ_30MHZ_DEFAULT);
> +
> +  return Status;
> +}
> +
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +InitializeUsbController (
> +  IN  UINTN  UsbReg
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  Status = XhciCoreInit (UsbReg);
> +
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  //
> +  // Change beat burst and outstanding pipelined transfers requests
> +  //
> +  XhciSetBeatBurstLength (UsbReg);
> +
> +  return Status;
> +}
> +
> +/**
> +  The Entry Point of module. It follows the standard UEFI driver model.
> +
> +  @param[in] ImageHandle   The firmware allocated handle for the EFI image.
> +  @param[in] SystemTable   A pointer to the EFI System Table.
> +
> +  @retval EFI_SUCCESS      The entry point is executed successfully.
> +  @retval other            Some error occurs when executing this entry point.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InitializeUsbHcd (
> +  IN EFI_HANDLE            ImageHandle,
> +  IN EFI_SYSTEM_TABLE      *SystemTable
> +  )
> +{
> +  EFI_STATUS               Status;
> +  UINT32                   NumUsbController;
> +  UINT32                   ControllerAddr;
> +
> +  Status = EFI_SUCCESS;
> +  NumUsbController = PcdGet32 (PcdNumUsbController);
> +
> +  while (NumUsbController) {
> +    NumUsbController--;
> +    ControllerAddr = PcdGet32 (PcdUsbBaseAddr) +
> +                     (NumUsbController * PcdGet32 (PcdUsbSize));
> +
> +    Status = InitializeUsbController (ControllerAddr);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "USB Controller initialization Failed for %d 
> (0x%x)\n",
> +                            ControllerAddr, Status));
> +      continue;
> +    }
> +
> +    Status = RegisterNonDiscoverableMmioDevice (
> +               NonDiscoverableDeviceTypeXhci,
> +               NonDiscoverableDeviceDmaTypeNonCoherent,
> +               NULL,
> +               NULL,
> +               1,
> +               ControllerAddr, PcdGet32 (PcdUsbSize)
> +             );
> +
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failed to register USB device (0x%x) with error 
> 0x%x \n",
> +                           ControllerAddr, Status));
> +    }
> +  }
> +
> +  return Status;
> +}
> diff --git a/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h 
> b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h
> new file mode 100644
> index 0000000..3237f5d
> --- /dev/null
> +++ b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h
> @@ -0,0 +1,142 @@
> +/** @file
> +
> +  Copyright 2017 NXP
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD 
> License
> +  which accompanies this distribution.  The full text of the license may be 
> found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +
> +**/
> +
> +#ifndef __USB_HCD__
> +#define __USB_HCD__
> +
> +/* Global constants */
> +#define DWC3_GSNPSID_MASK                      0xffff0000
> +#define DWC3_SYNOPSIS_ID                       0x55330000
> +#define DWC3_RELEASE_MASK                      0xffff
> +#define DWC3_REG_OFFSET                        0xC100
> +#define DWC3_RELEASE_190a                      0x190a
> +
> +/* Global Configuration Register */
> +#define DWC3_GCTL_U2RSTECN                     BIT(16)
> +#define DWC3_GCTL_PRTCAPDIR(n)                 ((n) << 12)
> +#define DWC3_GCTL_PRTCAP_HOST                  1
> +#define DWC3_GCTL_PRTCAP_OTG                   3
> +#define DWC3_GCTL_CORESOFTRESET                BIT(11)
> +#define DWC3_GCTL_SCALEDOWN(n)                 ((n) << 4)
> +#define DWC3_GCTL_SCALEDOWN_MASK               DWC3_GCTL_SCALEDOWN(3)
> +#define DWC3_GCTL_DISSCRAMBLE                  BIT(3)
> +#define DWC3_GCTL_DSBLCLKGTNG                  BIT(0)
> +
> +/* Global HWPARAMS1 Register */
> +#define DWC3_GHWPARAMS1_EN_PWROPT(n)           (((n) & (3 << 24)) >> 24)
> +#define DWC3_GHWPARAMS1_EN_PWROPT_CLK          1
> +
> +/* Global USB2 PHY Configuration Register */
> +#define DWC3_GUSB2PHYCFG_PHYSOFTRST            BIT(31)
> +
> +/* Global USB3 PIPE Control Register */
> +#define DWC3_GUSB3PIPECTL_PHYSOFTRST           BIT(31)
> +
> +/* Global Frame Length Adjustment Register */
> +#define GFLADJ_30MHZ_REG_SEL                   BIT(7)
> +#define GFLADJ_30MHZ(n)                        ((n) & 0x3f)
> +#define GFLADJ_30MHZ_DEFAULT                   0x20
> +
> +/* Default to the FSL XHCI defines */
> +#define USB3_ENABLE_BEAT_BURST                 0xF
> +#define USB3_ENABLE_BEAT_BURST_MASK            0xFF
> +#define USB3_SET_BEAT_BURST_LIMIT              0xF00
> +
> +typedef struct {
> +  UINT32 GEvntAdrLo;
> +  UINT32 GEvntAdrHi;
> +  UINT32 GEvntSiz;
> +  UINT32 GEvntCount;
> +} GEventBuffer;

Generally, typedeffed structs are given
UPPERCASE_NAMES_WITH_UNDERSCORES in edk2.
(Applies throughout.)

> +
> +typedef struct {
> +  UINT32 DDepCmdPar2;
> +  UINT32 DDepCmdPar1;
> +  UINT32 DDepCmdPar0;
> +  UINT32 DDepCmd;
> +} DPhysicalEndpoint;
> +
> +typedef struct {
> +  UINT32 GSBusCfg0;
> +  UINT32 GSBusCfg1;
> +  UINT32 GTxThrCfg;
> +  UINT32 GRxThrCfg;
> +  UINT32 GCtl;
> +  UINT32 Res1;
> +  UINT32 GSts;
> +  UINT32 Res2;
> +  UINT32 GSnpsId;
> +  UINT32 GGpio;
> +  UINT32 GUid;
> +  UINT32 GUctl;
> +  UINT64 GBusErrAddr;
> +  UINT64 GPrtbImap;
> +  UINT32 GHwParams0;
> +  UINT32 GHwParams1;
> +  UINT32 GHwParams2;
> +  UINT32 GHwParams3;
> +  UINT32 GHwParams4;
> +  UINT32 GHwParams5;
> +  UINT32 GHwParams6;
> +  UINT32 GHwParams7;
> +  UINT32 GDbgFifoSpace;
> +  UINT32 GDbgLtssm;
> +  UINT32 GDbgLnmcc;
> +  UINT32 GDbgBmu;
> +  UINT32 GDbgLspMux;
> +  UINT32 GDbgLsp;
> +  UINT32 GDbgEpInfo0;
> +  UINT32 GDbgEpInfo1;
> +  UINT64 GPrtbImapHs;
> +  UINT64 GPrtbImapFs;
> +  UINT32 Res3[28];
> +  UINT32 GUsb2PhyCfg[16];
> +  UINT32 GUsb2I2cCtl[16];
> +  UINT32 GUsb2PhyAcc[16];
> +  UINT32 GUsb3PipeCtl[16];
> +  UINT32 GTxFifoSiz[32];
> +  UINT32 GRxFifoSiz[32];
> +  GEventBuffer GEvntBuf[32];
> +  UINT32 GHwParams8;
> +  UINT32 Res4[11];
> +  UINT32 GFLAdj;
> +  UINT32 Res5[51];
> +  UINT32 DCfg;
> +  UINT32 DCtl;
> +  UINT32 DEvten;
> +  UINT32 DSts;
> +  UINT32 DGCmdPar;
> +  UINT32 DGCmd;
> +  UINT32 Res6[2];
> +  UINT32 DAlepena;
> +  UINT32 Res7[55];
> +  DPhysicalEndpoint DPhyEpCmd[32];
> +  UINT32 Res8[128];
> +  UINT32 OCfg;
> +  UINT32 OCtl;
> +  UINT32 OEvt;
> +  UINT32 OEvtEn;
> +  UINT32 OSts;
> +  UINT32 Res9[3];
> +  UINT32 AdpCfg;
> +  UINT32 AdpCtl;
> +  UINT32 AdpEvt;
> +  UINT32 AdpEvten;
> +  UINT32 BcCfg;
> +  UINT32 Res10;
> +  UINT32 BcEvt;
> +  UINT32 BcEvten;
> +} Dwc3;
> +
> +#endif
> diff --git a/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf 
> b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf
> new file mode 100644
> index 0000000..cefb8bd
> --- /dev/null
> +++ b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf
> @@ -0,0 +1,48 @@
> +#  UsbHcd.inf
> +#
> +#  Copyright 2017 NXP
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD 
> License
> +#  which accompanies this distribution. The full text of the license may be 
> found
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +#
> +#
> +
> +[Defines]
> +  INF_VERSION                     = 0x0001000A

0x0001001a

/
    Leif

> +  BASE_NAME                       = UsbHcdDxe
> +  FILE_GUID                       = 196e7c2a-37b2-4b85-8683-718588952449
> +  MODULE_TYPE                     = DXE_DRIVER
> +  VERSION_STRING                  = 1.0
> +  ENTRY_POINT                     = InitializeUsbHcd
> +
> +[Sources.common]
> +  UsbHcd.c
> +
> +[Packages]
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/NXP/NxpQoriqLs.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  IoLib
> +  MemoryAllocationLib
> +  NonDiscoverableDeviceRegistrationLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +
> +[FixedPcd]
> +  gNxpQoriqLsTokenSpaceGuid.PcdNumUsbController
> +  gNxpQoriqLsTokenSpaceGuid.PcdUsbBaseAddr
> +  gNxpQoriqLsTokenSpaceGuid.PcdUsbSize
> +
> +[Depex]
> +  TRUE
> diff --git a/Silicon/NXP/NxpQoriqLs.dec b/Silicon/NXP/NxpQoriqLs.dec
> index a3508b5..90e9957 100644
> --- a/Silicon/NXP/NxpQoriqLs.dec
> +++ b/Silicon/NXP/NxpQoriqLs.dec
> @@ -83,6 +83,11 @@
>    gNxpQoriqLsTokenSpaceGuid.PcdRomSize|0x0|UINT64|0x0000012D
>  
>    #
> +  # USB PCDs
> +  #
> +  gNxpQoriqLsTokenSpaceGuid.PcdNumUsbController|0|UINT32|0x00000170
> +
> +  #
>    # PCI PCDs
>    #
>    gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase|0x0|UINT32|0x000001D0
> -- 
> 1.9.1
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to