Hi Liming & Star, > -----Original Message----- > From: Gao, Liming > Sent: Friday, August 16, 2019 11:44 AM > To: Dong, Eric <eric.d...@intel.com>; Zeng, Star <star.z...@intel.com>; > devel@edk2.groups.io > Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com>; Yao, > Jiewen <jiewen....@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test > Then Write" Macros. > > Eric: > > >-----Original Message----- > >From: Dong, Eric > >Sent: Friday, August 16, 2019 10:20 AM > >To: Zeng, Star <star.z...@intel.com>; devel@edk2.groups.io > >Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com>; Yao, > >Jiewen <jiewen....@intel.com>; Gao, Liming <liming....@intel.com>; > >Kinney, Michael D <michael.d.kin...@intel.com> > >Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add > >"Test Then Write" Macros. > > > > > > > >> -----Original Message----- > >> From: Zeng, Star > >> Sent: Friday, August 16, 2019 10:08 AM > >> To: Dong, Eric <eric.d...@intel.com>; devel@edk2.groups.io > >> Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com>; > >> Yao, Jiewen <jiewen....@intel.com>; Gao, Liming > >> <liming....@intel.com>; > >Kinney, > >> Michael D <michael.d.kin...@intel.com>; Zeng, Star > >> <star.z...@intel.com> > >> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add > >> "Test Then Write" Macros. > >> > >> > >> > >> > -----Original Message----- > >> > From: Dong, Eric > >> > Sent: Friday, August 16, 2019 9:27 AM > >> > To: Zeng, Star <star.z...@intel.com>; devel@edk2.groups.io > >> > Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com> > >> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add > >> > "Test Then Write" Macros. > >> > > >> > > -----Original Message----- > >> > > From: Zeng, Star > >> > > Sent: Friday, August 16, 2019 9:15 AM > >> > > To: Dong, Eric <eric.d...@intel.com>; devel@edk2.groups.io > >> > > Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com>; > >> > > Zeng, Star <star.z...@intel.com> > >> > > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: > >> > > Add "Test Then Write" Macros. > >> > > > >> > > > >> > > > >> > > > -----Original Message----- > >> > > > From: Dong, Eric > >> > > > Sent: Thursday, August 15, 2019 10:51 AM > >> > > > To: devel@edk2.groups.io > >> > > > Cc: Ni, Ray <ray...@intel.com>; Laszlo Ersek > >> > > > <ler...@redhat.com>; Zeng, Star <star.z...@intel.com> > >> > > > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add > >> > > > "Test Then Write" Macros. > >> > > > > >> > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040 > >> > > > > >> > > > Add below new micros which test the current value before write > >> > > > the new value. Only write new value when current value not same > >> > > > as new > >> > value. > >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE32 > >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE64 > >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD > >> > > > > >> > > > Also add below API: > >> > > > CpuRegisterTableTestThenWrite > >> > > > > >> > > > Signed-off-by: Eric Dong <eric.d...@intel.com> > >> > > > Cc: Ray Ni <ray...@intel.com> > >> > > > Cc: Laszlo Ersek <ler...@redhat.com> > >> > > > Cc: Star Zeng <star.z...@intel.com> > >> > > > --- > >> > > > UefiCpuPkg/Include/AcpiCpuData.h | 1 + > >> > > > .../Include/Library/RegisterCpuFeaturesLib.h | 91 > >> > +++++++++++++++++++ > >> > > > .../RegisterCpuFeaturesLib.c | 45 ++++++++- > >> > > > 3 files changed, 134 insertions(+), 3 deletions(-) > >> > > > > >> > > > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h > >> > > > b/UefiCpuPkg/Include/AcpiCpuData.h > >> > > > index b963a2f592..472a1a8070 100644 > >> > > > --- a/UefiCpuPkg/Include/AcpiCpuData.h > >> > > > +++ b/UefiCpuPkg/Include/AcpiCpuData.h > >> > > > @@ -81,6 +81,7 @@ typedef struct { > >> > > > UINT16 Reserved; // offset 10 - 11 > >> > > > UINT32 HighIndex; // offset 12-15, only valid > >> > > > for > >> > MemoryMapped > >> > > > UINT64 Value; // offset 16-23 > >> > > > + UINT8 TestThenWrite; // 0ffset 24 > >> > > > >> > > Could we use one byte of the Reserved field, but not add new field? > >> > > And use BOOLEAN type for it? > >> > > >> > I'm not sure whether use the Reserved field is an correct approach, > >> > do you have samples which use the reserved fields? > >> > But I think add new field is a more safe one. > >> > >> What "more safe" means here? Adding new field extends the structure, > >from > >> the structure layout view of point, it is an incompatible change, the > >> structure size is not just from 24 to 25 bytes, but to be nature > >> aligned, the structure > >size > >> will be (24 + 8) 32. Since there is Reserved field can be reused, > >> that size > >impact > >> can be removed. > > > >Yes, agree the size impact. I'm just not clear whether the Reserved > >field can be used. Whether it has compatible impact. > > > >> > >> FspGlobalData.h: > >> SHA-1: a2e61f341d26a78751b2f19b5004c6bbfc8b4fa9 > >> * IntelFsp2Pkg: Support FSP Dispatch mode > >> > >> MemoryProfile.h > >> SHA-1: 072a3ca1d36a42aec97f871c808776ee7038ca06 (related to > >> 94092aa60341a3e4b1e1ea7c362781b8404ac538) > >> * MdeModulePkg MemoryProfile.h:two bytes of Reserved[4] as > >> ActionStringOffset > >> > > > >If so many examples already did it. I think we can also do it. > > > >> > >> If needed, more comments from Ray, Laszlo, Jiewen, Liming and Mike > >> will > >be > >> better. > > > >Yes, I think we need get more comments from them. > > I think to reuse the reserved field is a good solution. >
Thanks for this valuable input, I will send V4 patch to use Reserved field. Thanks, Eric > Thanks > Liming > > > >Thanks, > >Eric > >> > >> > >> Thanks, > >> Star > >> > >> > > >> > Thanks, > >> > Eric > >> > > > >> > > Thanks, > >> > > Star > >> > > > >> > > > } CPU_REGISTER_TABLE_ENTRY; > >> > > > > >> > > > // > >> > > > diff --git > >> > > > a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h > >> > > > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h > >> > > > index e420e7f075..5bd464b32e 100644 > >> > > > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h > >> > > > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h > >> > > > @@ -348,6 +348,32 @@ CpuRegisterTableWrite ( > >> > > > IN UINT64 Value > >> > > > ); > >> > > > > >> > > > +/** > >> > > > + Adds an entry in specified register table. > >> > > > + > >> > > > + This function adds an entry in specified register table, > >> > > > + with given register type, register index, bit section and value. > >> > > > + > >> > > > + Driver will test the current value before setting new value. > >> > > > + > >> > > > + @param[in] ProcessorNumber The index of the CPU to add a > >> > > > + register > >> > > > table entry > >> > > > + @param[in] RegisterType Type of the register to program > >> > > > + @param[in] Index Index of the register to program > >> > > > + @param[in] ValueMask Mask of bits in register to write > >> > > > + @param[in] Value Value to write > >> > > > + > >> > > > + @note This service could be called by BSP only. > >> > > > +**/ > >> > > > +VOID > >> > > > +EFIAPI > >> > > > +CpuRegisterTableTestThenWrite ( > >> > > > + IN UINTN ProcessorNumber, > >> > > > + IN REGISTER_TYPE RegisterType, > >> > > > + IN UINT64 Index, > >> > > > + IN UINT64 ValueMask, > >> > > > + IN UINT64 Value > >> > > > + ); > >> > > > + > >> > > > /** > >> > > > Adds an entry in specified Pre-SMM register table. > >> > > > > >> > > > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite ( > >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, > >> > > > Index, MAX_UINT32, Value); \ > >> > > > } while(FALSE); > >> > > > > >> > > > +/** > >> > > > + Adds a 32-bit register write entry in specified register table. > >> > > > + > >> > > > + This macro adds an entry in specified register table, with > >> > > > + given register type, register index, and value. > >> > > > + > >> > > > + Driver will test the current value before setting new value. > >> > > > + > >> > > > + @param[in] ProcessorNumber The index of the CPU to add a > >> > > > + register > >> > > > table entry. > >> > > > + @param[in] RegisterType Type of the register to program > >> > > > + @param[in] Index Index of the register to program > >> > > > + @param[in] Value Value to write > >> > > > + > >> > > > + @note This service could be called by BSP only. > >> > > > +**/ > >> > > > +#define > >> > CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber, > >> > > > RegisterType, Index, Value) \ > >> > > > + do { > >> > > > \ > >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, > >> > > > +RegisterType, Index, MAX_UINT32, Value); \ > >> > > > + } while(FALSE); > >> > > > + > >> > > > /** > >> > > > Adds a 64-bit register write entry in specified register table. > >> > > > > >> > > > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite ( > >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, > >> > > > Index, MAX_UINT64, Value); \ > >> > > > } while(FALSE); > >> > > > > >> > > > +/** > >> > > > + Adds a 64-bit register write entry in specified register table. > >> > > > + > >> > > > + This macro adds an entry in specified register table, with > >> > > > + given register type, register index, and value. > >> > > > + > >> > > > + Driver will test the current value before setting new value. > >> > > > + > >> > > > + @param[in] ProcessorNumber The index of the CPU to add a > >> > > > + register > >> > > > table entry. > >> > > > + @param[in] RegisterType Type of the register to program > >> > > > + @param[in] Index Index of the register to program > >> > > > + @param[in] Value Value to write > >> > > > + > >> > > > + @note This service could be called by BSP only. > >> > > > +**/ > >> > > > +#define > >> > CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber, > >> > > > RegisterType, Index, Value) \ > >> > > > + do { > >> > > > \ > >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, > >> > > > +RegisterType, Index, MAX_UINT64, Value); \ > >> > > > + } while(FALSE); > >> > > > + > >> > > > /** > >> > > > Adds a bit field write entry in specified register table. > >> > > > > >> > > > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite ( > >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, > >> > > > ~ValueMask, Value); \ > >> > > > } while(FALSE); > >> > > > > >> > > > +/** > >> > > > + Adds a bit field write entry in specified register table. > >> > > > + > >> > > > + This macro adds an entry in specified register table, with > >> > > > + given register type, register index, bit field section, and value. > >> > > > + > >> > > > + Driver will test the current value before setting new value. > >> > > > + > >> > > > + @param[in] ProcessorNumber The index of the CPU to add a > >> > > > + register > >> > > > table entry. > >> > > > + @param[in] RegisterType Type of the register to program. > >> > > > + @param[in] Index Index of the register to program. > >> > > > + @param[in] Type The data type name of a register > >> > > > structure. > >> > > > + @param[in] Field The bit fiel name in register > >> > > > structure to > >write. > >> > > > + @param[in] Value Value to write to the bit field. > >> > > > + > >> > > > + @note This service could be called by BSP only. > >> > > > +**/ > >> > > > +#define > >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber, > >> > > > RegisterType, Index, Type, Field, Value) \ > >> > > > + do { > >> > > > \ > >> > > > + UINT64 ValueMask; > >> > > > \ > >> > > > + ValueMask = MAX_UINT64; > >> \ > >> > > > + ((Type *)(&ValueMask))->Field = 0; > >> > \ > >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, > >> > > > + RegisterType, Index, > >> > > > ~ValueMask, Value); \ > >> > > > + } while(FALSE); > >> > > > + > >> > > > /** > >> > > > Adds a 32-bit register write entry in specified register table. > >> > > > > >> > > > diff --git > >> > > > > >a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib > >> > > > .c > >> > > > > >b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib > >> > > > .c index 67885bf69b..e9769882b9 100644 > >> > > > --- > >> > > > > >a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib > >> > > > .c > >> > > > +++ > >> > > > > >b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib > >> > > > .c @@ -1025,6 +1025,8 @@ EnlargeRegisterTable ( > >> > > > @param[in] ValidBitStart Start of the bit section > >> > > > @param[in] ValidBitLength Length of the bit section > >> > > > @param[in] Value Value to write > >> > > > + @param[in] TestThenWrite Whether need to test current Value > >> > before > >> > > > writing. > >> > > > + > >> > > > **/ > >> > > > VOID > >> > > > CpuRegisterTableWriteWorker ( > >> > > > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker ( > >> > > > IN UINT64 Index, > >> > > > IN UINT8 ValidBitStart, > >> > > > IN UINT8 ValidBitLength, > >> > > > - IN UINT64 Value > >> > > > + IN UINT64 Value, > >> > > > + IN UINT8 TestThenWrite > >> > > > ) > >> > > > { > >> > > > CPU_FEATURES_DATA *CpuFeaturesData; > >> > > > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker ( > >> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart > >> > > > = ValidBitStart; > >> > > > > >> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength = > ValidBitLength; > >> > > > RegisterTableEntry[RegisterTable->TableLength].Value = > >> > > > Value; > >> > > > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite > >> > > > + = TestThenWrite; > >> > > > > >> > > > RegisterTable->TableLength++; } @@ -1105,7 +1109,42 @@ > >> > > > CpuRegisterTableWrite ( > >> > > > Start = (UINT8)LowBitSet64 (ValueMask); > >> > > > End = (UINT8)HighBitSet64 (ValueMask); > >> > > > Length = End - Start + 1; > >> > > > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, > >> > > > RegisterType, Index, Start, Length, Value); > >> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, > >> > > > +RegisterType, Index, Start, Length, Value, FALSE); } > >> > > > + > >> > > > +/** > >> > > > + Adds an entry in specified register table. > >> > > > + > >> > > > + This function adds an entry in specified register table, > >> > > > + with given register type, register index, bit section and value. > >> > > > + > >> > > > + @param[in] ProcessorNumber The index of the CPU to add a > >> > > > + register > >> > > > table entry > >> > > > + @param[in] RegisterType Type of the register to program > >> > > > + @param[in] Index Index of the register to program > >> > > > + @param[in] ValueMask Mask of bits in register to write > >> > > > + @param[in] Value Value to write > >> > > > + @param[in] TestThenWrite Whether need to test current Value > >> > before > >> > > > writing. > >> > > > + > >> > > > + @note This service could be called by BSP only. > >> > > > +**/ > >> > > > +VOID > >> > > > +EFIAPI > >> > > > +CpuRegisterTableTestThenWrite ( > >> > > > + IN UINTN ProcessorNumber, > >> > > > + IN REGISTER_TYPE RegisterType, > >> > > > + IN UINT64 Index, > >> > > > + IN UINT64 ValueMask, > >> > > > + IN UINT64 Value > >> > > > + ) > >> > > > +{ > >> > > > + UINT8 Start; > >> > > > + UINT8 End; > >> > > > + UINT8 Length; > >> > > > + > >> > > > + Start = (UINT8)LowBitSet64 (ValueMask); > >> > > > + End = (UINT8)HighBitSet64 (ValueMask); > >> > > > + Length = End - Start + 1; > >> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, > >> > > > + RegisterType, Index, Start, Length, Value, TRUE); > >> > > > } > >> > > > > >> > > > /** > >> > > > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite ( > >> > > > Start = (UINT8)LowBitSet64 (ValueMask); > >> > > > End = (UINT8)HighBitSet64 (ValueMask); > >> > > > Length = End - Start + 1; > >> > > > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, > >> > > > RegisterType, Index, Start, Length, Value); > >> > > > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, > >> > > > + RegisterType, Index, Start, Length, Value, FALSE); > >> > > > } > >> > > > > >> > > > /** > >> > > > -- > >> > > > 2.21.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#45780): https://edk2.groups.io/g/devel/message/45780 Mute This Topic: https://groups.io/mt/32882705/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-