Sorry for the noise. Once I sent this question I understood this code. I overlooked UTP_TRD and UTP_TR_PRD declarations where lower 32-bit of a physical address declared as a bitfield... There are no shifts when HCI programmed via MMIO.
On Sat, Dec 22, 2018 at 1:43 AM Mike M <[email protected]> wrote: > Dear MdeModulePkg maintainers, I'm a bit baffled about a way > physical addresses passed to UFS HCI at UfsPassThruDxe driver. > For example, UFS HCI V.2.1 declares Data Base Address in PRDT structure as > two 32 bit words, > where bits 0 and 1 of a physical address are reserved. > As well UTP Command Descriptor Base Address (UCDBA) shall be aligned to > 128-byte address, > i.e. bits [06:00] are reserved. > In common such reserved bits are being cleared by AND operation > with appropriate mask, while in UfsPassThruDxe right shift operator is > used as below: > Prdt[PrdtIndex].DbAddr = (UINT32)RShiftU64 ((UINT64)(UINTN)Remaining, > 2); > Prdt[PrdtIndex].DbAddrU = (UINT32)RShiftU64 ((UINT64)(UINTN)Remaining, > 32); > and > Trd->UcdBa = (UINT32)RShiftU64 ((UINT64)CmdDescPhyAddr, 7); > Trd->UcdBaU = (UINT32)RShiftU64 ((UINT64)CmdDescPhyAddr, 32); > > How does UFS HCI deal with such values? This doesn't look correct. > Would you like I prepare a patch replacing RShiftU64 operator with bitwise > AND operator > for lower 32-bit of a physical address value? > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

