> -----Original Message----- > From: platform-driver-x86-owner@xxxxxxxxxxxxxxx [mailto:platform-driver-x86- > owner@xxxxxxxxxxxxxxx] On Behalf Of Stuart Hayes > Sent: Friday, July 6, 2018 11:19 AM > To: linux-kernel@xxxxxxxxxxxxxxx > Cc: Takashi Iwai; Andy Shevchenko; dvhart@xxxxxxxxxxxxx; Platform Driver > Subject: [PATCH resend v4] dell_rbu: make firmware payload memory uncachable > > The dell_rbu driver takes firmware update payloads and puts them in memory so > the system BIOS can find them after a reboot. This sometimes fails (though > rarely), because the memory containing the payload is in the CPU cache but > never gets written back to main memory before the system is rebooted (CPU > cache contents are lost on reboot). > > With this patch, the payload memory will be changed to uncachable to ensure > that the payload is actually in main memory before the system is rebooted. > > Signed-off-by: Stuart Hayes <stuart.w.hayes@xxxxxxxxx> > Reviewed-by: Takashi Iwai <tiwai@xxxxxxx> > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> Reviewed-by: Mario Limonciello <mario.limonciello@xxxxxxxx> > --- > v2 Added include, removed extra parentheses > v3 Corrected formatting and include line > v4 Moved set_memory_uc() outside the while loop so that the memory is > definitely allocated before it is set to uncachable > > This driver has no maintainer. Stuart, Outside of this patch, I think it would make sense to send some follow up patch series that do the following: 1) Let you take over as maintainer (Update MAINTAINERS) 2) Move this driver to platform-x86 3) Update dell_rbu.txt with the correct URLs and mention that it's only for enterprise hardware. Client hardware has instead opted to support UEFI capsules for updates from Linux. Since it's really a platform feature and specific to only Dell enterprise hardware I think it makes sense to move over to an area with subsystem maintainers that can help to review patches as needed. > > > diff --git a/drivers/firmware/dell_rbu.c b/drivers/firmware/dell_rbu.c > index 2f452f1f7c8a..53f27a6e2d76 100644 > --- a/drivers/firmware/dell_rbu.c > +++ b/drivers/firmware/dell_rbu.c > @@ -45,6 +45,7 @@ > #include <linux/moduleparam.h> > #include <linux/firmware.h> > #include <linux/dma-mapping.h> > +#include <asm/set_memory.h> > > MODULE_AUTHOR("Abhay Salunke <abhay_salunke@xxxxxxxx>"); > MODULE_DESCRIPTION("Driver for updating BIOS image on DELL systems"); > @@ -181,6 +182,11 @@ static int create_packet(void *data, size_t length) > packet_data_temp_buf = NULL; > } > } > + /* > + * set to uncachable or it may never get written back before reboot > + */ > + set_memory_uc((unsigned long)packet_data_temp_buf, 1 << ordernum); > + > spin_lock(&rbu_data.lock); > > newpacket->data = packet_data_temp_buf; > @@ -349,6 +355,8 @@ static void packet_empty_list(void) > * to make sure there are no stale RBU packets left in memory > */ > memset(newpacket->data, 0, rbu_data.packetsize); > + set_memory_wb((unsigned long)newpacket->data, > + 1 << newpacket->ordernum); > free_pages((unsigned long) newpacket->data, > newpacket->ordernum); > kfree(newpacket);