erst_base = xhci_read_64(xhci, &ir->ir_set->erst_base);
        erst_base &= ERST_BASE_RSVDP;
        erst_base |= ir->erst.erst_dma_addr & ~ERST_BASE_RSVDP;
-       xhci_write_64(xhci, erst_base, &ir->ir_set->erst_base);
+       if (xhci->quirks & XHCI_WRITE_64_HI_LO)
+               hi_lo_writeq(erst_base, &ir->ir_set->erst_base);
+       else
+               xhci_write_64(xhci, erst_base, &ir->ir_set->erst_base);
 
        /* Set the event ring dequeue address of this interrupter */
        xhci_set_hc_event_deq(xhci, ir);
 
 #include <linux/kernel.h>
 #include <linux/usb/hcd.h>
 #include <linux/io-64-nonatomic-lo-hi.h>
+#include <linux/io-64-nonatomic-hi-lo.h>
 
 /* Code sharing between pci-quirks and xhci hcd */
 #include       "xhci-ext-caps.h"
 #define XHCI_RESET_TO_DEFAULT  BIT_ULL(44)
 #define XHCI_ZHAOXIN_TRB_FETCH BIT_ULL(45)
 #define XHCI_ZHAOXIN_HOST      BIT_ULL(46)
+#define XHCI_WRITE_64_HI_LO    BIT_ULL(47)
 
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;