|
@@ -1809,7 +1809,11 @@ struct pci_fixup {
|
|
|
u16 device; /* Or PCI_ANY_ID */
|
|
|
u32 class; /* Or PCI_ANY_ID */
|
|
|
unsigned int class_shift; /* should be 0, 8, 16 */
|
|
|
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
|
|
+ int hook_offset;
|
|
|
+#else
|
|
|
void (*hook)(struct pci_dev *dev);
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
enum pci_fixup_pass {
|
|
@@ -1823,12 +1827,28 @@ enum pci_fixup_pass {
|
|
|
pci_fixup_suspend_late, /* pci_device_suspend_late() */
|
|
|
};
|
|
|
|
|
|
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
|
|
+#define __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
|
|
|
+ class_shift, hook) \
|
|
|
+ __ADDRESSABLE(hook) \
|
|
|
+ asm(".section " #sec ", \"a\" \n" \
|
|
|
+ ".balign 16 \n" \
|
|
|
+ ".short " #vendor ", " #device " \n" \
|
|
|
+ ".long " #class ", " #class_shift " \n" \
|
|
|
+ ".long " #hook " - . \n" \
|
|
|
+ ".previous \n");
|
|
|
+#define DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
|
|
|
+ class_shift, hook) \
|
|
|
+ __DECLARE_PCI_FIXUP_SECTION(sec, name, vendor, device, class, \
|
|
|
+ class_shift, hook)
|
|
|
+#else
|
|
|
/* Anonymous variables would be nice... */
|
|
|
#define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, class, \
|
|
|
class_shift, hook) \
|
|
|
static const struct pci_fixup __PASTE(__pci_fixup_##name,__LINE__) __used \
|
|
|
__attribute__((__section__(#section), aligned((sizeof(void *))))) \
|
|
|
= { vendor, device, class, class_shift, hook };
|
|
|
+#endif
|
|
|
|
|
|
#define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class, \
|
|
|
class_shift, hook) \
|