iommu/amd: Do not clear event/ppr log buffer when snp is enabled
authorTom Lendacky <thomas.lendacky@amd.com>
Tue, 17 Jan 2023 04:40:38 +0000 (04:40 +0000)
committerJoerg Roedel <jroedel@suse.de>
Fri, 20 Jan 2023 09:41:57 +0000 (10:41 +0100)
Current code clears event log and ppr log entry after processing it due
to hardware errata ([1]  erratum #732, #733). We do not have hardware
issue on SNP enabled system.

When SNP is enabled, the event logs, PPR log and completion wait buffer
are read-only to the host (see SNP FW ABI spec [2]). Clearing those entry
will result in a kernel #PF for an RMP violation. Hence do not clear
event and ppr log entry after processing it.

[1] http://developer.amd.com/wordpress/media/2012/10/48931_15h_Mod_10h-1Fh_Rev_Guide.pdf
[2] https://www.amd.com/system/files/TechDocs/56860.pdf

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Link: https://lore.kernel.org/r/20230117044038.5728-1-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index 7b4390a..33c134a 100644 (file)
@@ -667,7 +667,14 @@ retry:
                        event[0], event[1], event[2], event[3]);
        }
 
-       memset(__evt, 0, 4 * sizeof(u32));
+       /*
+        * To detect the hardware errata 732 we need to clear the
+        * entry back to zero. This issue does not exist on SNP
+        * enabled system. Also this buffer is not writeable on
+        * SNP enabled system.
+        */
+       if (!amd_iommu_snp_en)
+               memset(__evt, 0, 4 * sizeof(u32));
 }
 
 static void iommu_poll_events(struct amd_iommu *iommu)
@@ -736,10 +743,13 @@ static void iommu_poll_ppr_log(struct amd_iommu *iommu)
                entry[1] = raw[1];
 
                /*
-                * To detect the hardware bug we need to clear the entry
-                * back to zero.
+                * To detect the hardware errata 733 we need to clear the
+                * entry back to zero. This issue does not exist on SNP
+                * enabled system. Also this buffer is not writeable on
+                * SNP enabled system.
                 */
-               raw[0] = raw[1] = 0UL;
+               if (!amd_iommu_snp_en)
+                       raw[0] = raw[1] = 0UL;
 
                /* Update head pointer of hardware ring-buffer */
                head = (head + PPR_ENTRY_SIZE) % PPR_LOG_SIZE;