#define NO_FURTHER_WRITE_ACTION -1
 
-struct capsule_info {
-       efi_capsule_header_t    header;
-       int                     reset_type;
-       long                    index;
-       size_t                  count;
-       size_t                  total_size;
-       struct page             **pages;
-       size_t                  page_bytes_remain;
-};
-
 /**
  * efi_free_all_buff_pages - free all previous allocated buffer pages
  * @cap_info: pointer to current instance of capsule_info structure
        cap_info->index = NO_FURTHER_WRITE_ACTION;
 }
 
-/**
- * efi_capsule_setup_info - obtain the efi capsule header in the binary and
- *                         setup capsule_info structure
- * @cap_info: pointer to current instance of capsule_info structure
- * @kbuff: a mapped first page buffer pointer
- * @hdr_bytes: the total received number of bytes for efi header
- **/
-static int efi_capsule_setup_info(struct capsule_info *cap_info,
-                                 void *kbuff, size_t hdr_bytes)
+int __efi_capsule_setup_info(struct capsule_info *cap_info)
 {
        size_t pages_needed;
        int ret;
        void *temp_page;
 
-       /* Only process data block that is larger than efi header size */
-       if (hdr_bytes < sizeof(efi_capsule_header_t))
-               return 0;
-
-       /* Reset back to the correct offset of header */
-       kbuff -= cap_info->count;
-       memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
-       pages_needed = ALIGN(cap_info->header.imagesize, PAGE_SIZE) / PAGE_SIZE;
+       pages_needed = ALIGN(cap_info->total_size, PAGE_SIZE) / PAGE_SIZE;
 
        if (pages_needed == 0) {
                pr_err("invalid capsule size");
                return ret;
        }
 
-       cap_info->total_size = cap_info->header.imagesize;
        temp_page = krealloc(cap_info->pages,
                             pages_needed * sizeof(void *),
                             GFP_KERNEL | __GFP_ZERO);
        return 0;
 }
 
+/**
+ * efi_capsule_setup_info - obtain the efi capsule header in the binary and
+ *                         setup capsule_info structure
+ * @cap_info: pointer to current instance of capsule_info structure
+ * @kbuff: a mapped first page buffer pointer
+ * @hdr_bytes: the total received number of bytes for efi header
+ *
+ * Platforms with non-standard capsule update mechanisms can override
+ * this __weak function so they can perform any required capsule
+ * image munging. See quark_quirk_function() for an example.
+ **/
+int __weak efi_capsule_setup_info(struct capsule_info *cap_info, void *kbuff,
+                                 size_t hdr_bytes)
+{
+       /* Only process data block that is larger than efi header size */
+       if (hdr_bytes < sizeof(efi_capsule_header_t))
+               return 0;
+
+       memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
+       cap_info->total_size = cap_info->header.imagesize;
+
+       return __efi_capsule_setup_info(cap_info);
+}
+
 /**
  * efi_capsule_submit_update - invoke the efi_capsule_update API once binary
  *                            upload done
 
        /* Setup capsule binary info structure */
        if (cap_info->header.headersize == 0) {
-               ret = efi_capsule_setup_info(cap_info, kbuff,
+               ret = efi_capsule_setup_info(cap_info, kbuff - cap_info->count,
                                             cap_info->count + write_byte);
                if (ret)
                        goto fail_unmap;