From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::441; helo=mail-wr1-x441.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 2BB5D2119681D for ; Fri, 21 Dec 2018 11:03:06 -0800 (PST) Received: by mail-wr1-x441.google.com with SMTP id p4so6322369wrt.7 for ; Fri, 21 Dec 2018 11:03:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=ZlMxdplyivkipqaCKTNVJ/DIqqFehyQBuxCy8rIWduc=; b=Y50cNxIMIPGGb+aw+GKsxMI3JQJ7EVVJkWsyBYxXumx81N0fpIRH5aEiQs0CiSylIF vJdvgvZ0v1X1E46T+X8HlC6NJInbWhFhQMY5WRypND3sQAh6Y5dxQ3QLJlbiPlMcQAD8 bv1FDZGE0WCXaSmcN4Orn9zlIBfl4C+OmYeFk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=ZlMxdplyivkipqaCKTNVJ/DIqqFehyQBuxCy8rIWduc=; b=Tqk1cN/REQtzTI/puTPOum+jzeqhNGozNenhXdU4pbB60of9mEMt+Qi/kw7Dxtvs5w 5hBaLg8UMsbJ5pqOCzhS8DfBdGODpxCO5cw5nGJRAeG3wFptcj9nGwWj9R4cKoDSQ2FJ eRQXz/kLQMm2IXldKsKmsRQy4SrWokvmaJhQJ83VCLCX+Rbk7DKo5lIQsdjnfXPuNRc+ GSxAMiudOvGkeP/zlVcrKDuKVMVsR092D23FDbbi8LIx2YSni8J3ZpY26bvcAPw04/qk LK0Q8InzncqbCnDRCLgisqoP8jnQfBNfNlD5P4fBAwgFU3fFe3RLHPuIMUUlhsqEX6gG RBnA== X-Gm-Message-State: AJcUukd0VThhLv+R7u5e+3SIolLKOuptJVuXqQPvdcMwmE+Bd9NJgP4Z L9iX0kim1J1OrYUChMMUUNWbEQ== X-Google-Smtp-Source: ALg8bN45HKTsc8wjVuc/Ics6tgEJfxRSkxkApC297rqJ4jY22UPlwZK79H213dDABSGb0nh2ki2w5g== X-Received: by 2002:a5d:4250:: with SMTP id s16mr3843787wrr.253.1545418985237; Fri, 21 Dec 2018 11:03:05 -0800 (PST) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id z17sm12402982wrv.2.2018.12.21.11.03.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 21 Dec 2018 11:03:04 -0800 (PST) Date: Fri, 21 Dec 2018 19:03:02 +0000 From: Leif Lindholm To: Meenakshi Aggarwal Cc: ard.biesheuvel@linaro.org, michael.d.kinney@intel.com, edk2-devel@lists.01.org, udit.kumar@nxp.com, v.sethi@nxp.com Message-ID: <20181221190302.rw6kmo7b4m5n7me3@bivouac.eciton.net> References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> <1543417315-5763-1-git-send-email-meenakshi.aggarwal@nxp.com> <1543417315-5763-39-git-send-email-meenakshi.aggarwal@nxp.com> MIME-Version: 1.0 In-Reply-To: <1543417315-5763-39-git-send-email-meenakshi.aggarwal@nxp.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH edk2-platforms 38/41] DWC3 : Add DWC3 USB controller initialization driver. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 X-List-Received-Date: Fri, 21 Dec 2018 19:03:07 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 28, 2018 at 08:31:52PM +0530, Meenakshi Aggarwal wrote: > Add support of DWC3 controller driver which > Performs DWC3 controller initialization and > Register itself as NonDiscoverableMmioDevice So this is just a platform hook to load a memory mapped USB controller that turns Xhci compliant once properly enabled? I'm not going to insist on it, but this looks like half of it should go into Silicon/Synopsys, and the other half be part of the platform initialisation library. / Leif > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Meenakshi Aggarwal > --- > Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c | 218 +++++++++++++++++++++++++++ > Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h | 144 ++++++++++++++++++ > Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.inf | 48 ++++++ > Silicon/NXP/NxpQoriqLs.dec | 5 + > 4 files changed, 415 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..0a9c821 > --- /dev/null > +++ b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.c > @@ -0,0 +1,218 @@ > +/** @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 > +#include > +#include > + > +#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_SYNOPSYS_ID) { > + 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..99d86dc > --- /dev/null > +++ b/Silicon/NXP/Drivers/UsbHcdInitDxe/UsbHcd.h > @@ -0,0 +1,144 @@ > +/** @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__ > + > +#include > + > +/* Global constants */ > +#define DWC3_GSNPSID_MASK 0xffff0000 > +#define DWC3_SYNOPSYS_ID 0x55330000 > +#define DWC3_RELEASE_MASK 0xffff > +#define DWC3_REG_OFFSET 0xC100 > +#define DWC3_RELEASE_190a 0x190a > + > +/* Global Configuration Register */ > +#define DWC3_GCTL_U2RSTECN BIT16 > +#define DWC3_GCTL_PRTCAPDIR(N) ((N) << 12) > +#define DWC3_GCTL_PRTCAP_HOST 1 > +#define DWC3_GCTL_PRTCAP_OTG 3 > +#define DWC3_GCTL_CORESOFTRESET BIT11 > +#define DWC3_GCTL_SCALEDOWN(N) ((N) << 4) > +#define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3) > +#define DWC3_GCTL_DISSCRAMBLE BIT3 > +#define DWC3_GCTL_DSBLCLKGTNG BIT0 > + > +/* 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 BIT31 > + > +/* Global USB3 PIPE Control Register */ > +#define DWC3_GUSB3PIPECTL_PHYSOFTRST BIT31 > + > +/* Global Frame Length Adjustment Register */ > +#define GFLADJ_30MHZ_REG_SEL BIT7 > +#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; > +} G_EVENT_BUFFER; > + > +typedef struct { > + UINT32 DDepCmdPar2; > + UINT32 DDepCmdPar1; > + UINT32 DDepCmdPar0; > + UINT32 DDepCmd; > +} D_PHYSICAL_EP; > + > +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]; > + G_EVENT_BUFFER 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]; > + D_PHYSICAL_EP 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..ac74bc6 > --- /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 = 0x0001001a > + 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 aae0a34..dd2c314 100644 > --- a/Silicon/NXP/NxpQoriqLs.dec > +++ b/Silicon/NXP/NxpQoriqLs.dec > @@ -82,6 +82,11 @@ > gNxpQoriqLsTokenSpaceGuid.PcdRomSize|0x0|UINT64|0x0000012D > > # > + # USB PCDs > + # > + gNxpQoriqLsTokenSpaceGuid.PcdNumUsbController|0|UINT32|0x00000170 > + > + # > # PCI PCDs > # > gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase|0x0|UINT32|0x000001D0 > -- > 1.9.1 >