Message ID | 20240412172349.544064-4-jithu.joseph@intel.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | Miscelleanous In Field Scan changes | expand |
On 4/12/24 10:23 AM, Jithu Joseph wrote: > One of the stages in IFS image loading process involves loading individual > chunks (test patterns) from test image file to secure memory. > > Driver issues a WRMSR(MSR_AUTHENTICATE_AND_COPY_CHUNK) operation to do > this. This operation can take up to 5 msec, and if an interrupt occurs > in between, the AUTH_AND_COPY_CHUNK u-code implementation aborts the > operation. > > Interrupt sources such as NMI or SMI are handled by retrying. Regular > interrupts may occur frequently enough to prevent this operation from ever > completing. Disable irq on local cpu around the aforementioned WRMSR to > allow the operation to complete. > > Signed-off-by: Jithu Joseph <jithu.joseph@intel.com> > Reviewed-by: Tony Luck <tony.luck@intel.com> > Reviewed-by: Ashok Raj <ashok.raj@intel.com> > --- Looks good to me. Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > drivers/platform/x86/intel/ifs/load.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/platform/x86/intel/ifs/load.c b/drivers/platform/x86/intel/ifs/load.c > index 584c44387e10..39f19cb51749 100644 > --- a/drivers/platform/x86/intel/ifs/load.c > +++ b/drivers/platform/x86/intel/ifs/load.c > @@ -233,7 +233,9 @@ static int copy_hashes_authenticate_chunks_gen2(struct device *dev) > chunk_table[0] = starting_chunk_nr + i; > chunk_table[1] = linear_addr; > do { > + local_irq_disable(); > wrmsrl(MSR_AUTHENTICATE_AND_COPY_CHUNK, (u64)chunk_table); > + local_irq_enable(); > rdmsrl(MSR_CHUNKS_AUTHENTICATION_STATUS, chunk_status.data); > err_code = chunk_status.error_code; > } while (err_code == AUTH_INTERRUPTED_ERROR && --retry_count);
diff --git a/drivers/platform/x86/intel/ifs/load.c b/drivers/platform/x86/intel/ifs/load.c index 584c44387e10..39f19cb51749 100644 --- a/drivers/platform/x86/intel/ifs/load.c +++ b/drivers/platform/x86/intel/ifs/load.c @@ -233,7 +233,9 @@ static int copy_hashes_authenticate_chunks_gen2(struct device *dev) chunk_table[0] = starting_chunk_nr + i; chunk_table[1] = linear_addr; do { + local_irq_disable(); wrmsrl(MSR_AUTHENTICATE_AND_COPY_CHUNK, (u64)chunk_table); + local_irq_enable(); rdmsrl(MSR_CHUNKS_AUTHENTICATION_STATUS, chunk_status.data); err_code = chunk_status.error_code; } while (err_code == AUTH_INTERRUPTED_ERROR && --retry_count);