diff options
Diffstat (limited to 'arch/powerpc/platforms/powermac/pci.c')
-rw-r--r-- | arch/powerpc/platforms/powermac/pci.c | 210 |
1 files changed, 179 insertions, 31 deletions
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 5aab261075de..f671ed253901 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Support for PCI bridges found on Power Macintoshes. | 2 | * Support for PCI bridges found on Power Macintoshes. |
3 | * | 3 | * |
4 | * Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org) | 4 | * Copyright (C) 2003-2005 Benjamin Herrenschmuidt (benh@kernel.crashing.org) |
5 | * Copyright (C) 1997 Paul Mackerras (paulus@samba.org) | 5 | * Copyright (C) 1997 Paul Mackerras (paulus@samba.org) |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
@@ -25,7 +25,7 @@ | |||
25 | #include <asm/pmac_feature.h> | 25 | #include <asm/pmac_feature.h> |
26 | #include <asm/grackle.h> | 26 | #include <asm/grackle.h> |
27 | #ifdef CONFIG_PPC64 | 27 | #ifdef CONFIG_PPC64 |
28 | #include <asm/iommu.h> | 28 | //#include <asm/iommu.h> |
29 | #include <asm/ppc-pci.h> | 29 | #include <asm/ppc-pci.h> |
30 | #endif | 30 | #endif |
31 | 31 | ||
@@ -44,6 +44,7 @@ static int add_bridge(struct device_node *dev); | |||
44 | static int has_uninorth; | 44 | static int has_uninorth; |
45 | #ifdef CONFIG_PPC64 | 45 | #ifdef CONFIG_PPC64 |
46 | static struct pci_controller *u3_agp; | 46 | static struct pci_controller *u3_agp; |
47 | static struct pci_controller *u4_pcie; | ||
47 | static struct pci_controller *u3_ht; | 48 | static struct pci_controller *u3_ht; |
48 | #endif /* CONFIG_PPC64 */ | 49 | #endif /* CONFIG_PPC64 */ |
49 | 50 | ||
@@ -97,11 +98,8 @@ static void __init fixup_bus_range(struct device_node *bridge) | |||
97 | 98 | ||
98 | /* Lookup the "bus-range" property for the hose */ | 99 | /* Lookup the "bus-range" property for the hose */ |
99 | bus_range = (int *) get_property(bridge, "bus-range", &len); | 100 | bus_range = (int *) get_property(bridge, "bus-range", &len); |
100 | if (bus_range == NULL || len < 2 * sizeof(int)) { | 101 | if (bus_range == NULL || len < 2 * sizeof(int)) |
101 | printk(KERN_WARNING "Can't get bus-range for %s\n", | ||
102 | bridge->full_name); | ||
103 | return; | 102 | return; |
104 | } | ||
105 | bus_range[1] = fixup_one_level_bus_range(bridge->child, bus_range[1]); | 103 | bus_range[1] = fixup_one_level_bus_range(bridge->child, bus_range[1]); |
106 | } | 104 | } |
107 | 105 | ||
@@ -128,14 +126,14 @@ static void __init fixup_bus_range(struct device_node *bridge) | |||
128 | */ | 126 | */ |
129 | 127 | ||
130 | #define MACRISC_CFA0(devfn, off) \ | 128 | #define MACRISC_CFA0(devfn, off) \ |
131 | ((1 << (unsigned long)PCI_SLOT(dev_fn)) \ | 129 | ((1 << (unsigned int)PCI_SLOT(dev_fn)) \ |
132 | | (((unsigned long)PCI_FUNC(dev_fn)) << 8) \ | 130 | | (((unsigned int)PCI_FUNC(dev_fn)) << 8) \ |
133 | | (((unsigned long)(off)) & 0xFCUL)) | 131 | | (((unsigned int)(off)) & 0xFCUL)) |
134 | 132 | ||
135 | #define MACRISC_CFA1(bus, devfn, off) \ | 133 | #define MACRISC_CFA1(bus, devfn, off) \ |
136 | ((((unsigned long)(bus)) << 16) \ | 134 | ((((unsigned int)(bus)) << 16) \ |
137 | |(((unsigned long)(devfn)) << 8) \ | 135 | |(((unsigned int)(devfn)) << 8) \ |
138 | |(((unsigned long)(off)) & 0xFCUL) \ | 136 | |(((unsigned int)(off)) & 0xFCUL) \ |
139 | |1UL) | 137 | |1UL) |
140 | 138 | ||
141 | static unsigned long macrisc_cfg_access(struct pci_controller* hose, | 139 | static unsigned long macrisc_cfg_access(struct pci_controller* hose, |
@@ -168,7 +166,8 @@ static int macrisc_read_config(struct pci_bus *bus, unsigned int devfn, | |||
168 | hose = pci_bus_to_host(bus); | 166 | hose = pci_bus_to_host(bus); |
169 | if (hose == NULL) | 167 | if (hose == NULL) |
170 | return PCIBIOS_DEVICE_NOT_FOUND; | 168 | return PCIBIOS_DEVICE_NOT_FOUND; |
171 | 169 | if (offset >= 0x100) | |
170 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
172 | addr = macrisc_cfg_access(hose, bus->number, devfn, offset); | 171 | addr = macrisc_cfg_access(hose, bus->number, devfn, offset); |
173 | if (!addr) | 172 | if (!addr) |
174 | return PCIBIOS_DEVICE_NOT_FOUND; | 173 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -199,7 +198,8 @@ static int macrisc_write_config(struct pci_bus *bus, unsigned int devfn, | |||
199 | hose = pci_bus_to_host(bus); | 198 | hose = pci_bus_to_host(bus); |
200 | if (hose == NULL) | 199 | if (hose == NULL) |
201 | return PCIBIOS_DEVICE_NOT_FOUND; | 200 | return PCIBIOS_DEVICE_NOT_FOUND; |
202 | 201 | if (offset >= 0x100) | |
202 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
203 | addr = macrisc_cfg_access(hose, bus->number, devfn, offset); | 203 | addr = macrisc_cfg_access(hose, bus->number, devfn, offset); |
204 | if (!addr) | 204 | if (!addr) |
205 | return PCIBIOS_DEVICE_NOT_FOUND; | 205 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -234,12 +234,13 @@ static struct pci_ops macrisc_pci_ops = | |||
234 | /* | 234 | /* |
235 | * Verify that a specific (bus, dev_fn) exists on chaos | 235 | * Verify that a specific (bus, dev_fn) exists on chaos |
236 | */ | 236 | */ |
237 | static int | 237 | static int chaos_validate_dev(struct pci_bus *bus, int devfn, int offset) |
238 | chaos_validate_dev(struct pci_bus *bus, int devfn, int offset) | ||
239 | { | 238 | { |
240 | struct device_node *np; | 239 | struct device_node *np; |
241 | u32 *vendor, *device; | 240 | u32 *vendor, *device; |
242 | 241 | ||
242 | if (offset >= 0x100) | ||
243 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
243 | np = pci_busdev_to_OF_node(bus, devfn); | 244 | np = pci_busdev_to_OF_node(bus, devfn); |
244 | if (np == NULL) | 245 | if (np == NULL) |
245 | return PCIBIOS_DEVICE_NOT_FOUND; | 246 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -341,10 +342,10 @@ static int u3_ht_skip_device(struct pci_controller *hose, | |||
341 | } | 342 | } |
342 | 343 | ||
343 | #define U3_HT_CFA0(devfn, off) \ | 344 | #define U3_HT_CFA0(devfn, off) \ |
344 | ((((unsigned long)devfn) << 8) | offset) | 345 | ((((unsigned int)devfn) << 8) | offset) |
345 | #define U3_HT_CFA1(bus, devfn, off) \ | 346 | #define U3_HT_CFA1(bus, devfn, off) \ |
346 | (U3_HT_CFA0(devfn, off) \ | 347 | (U3_HT_CFA0(devfn, off) \ |
347 | + (((unsigned long)bus) << 16) \ | 348 | + (((unsigned int)bus) << 16) \ |
348 | + 0x01000000UL) | 349 | + 0x01000000UL) |
349 | 350 | ||
350 | static unsigned long u3_ht_cfg_access(struct pci_controller* hose, | 351 | static unsigned long u3_ht_cfg_access(struct pci_controller* hose, |
@@ -370,7 +371,8 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, | |||
370 | hose = pci_bus_to_host(bus); | 371 | hose = pci_bus_to_host(bus); |
371 | if (hose == NULL) | 372 | if (hose == NULL) |
372 | return PCIBIOS_DEVICE_NOT_FOUND; | 373 | return PCIBIOS_DEVICE_NOT_FOUND; |
373 | 374 | if (offset >= 0x100) | |
375 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
374 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); | 376 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); |
375 | if (!addr) | 377 | if (!addr) |
376 | return PCIBIOS_DEVICE_NOT_FOUND; | 378 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -419,7 +421,8 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, | |||
419 | hose = pci_bus_to_host(bus); | 421 | hose = pci_bus_to_host(bus); |
420 | if (hose == NULL) | 422 | if (hose == NULL) |
421 | return PCIBIOS_DEVICE_NOT_FOUND; | 423 | return PCIBIOS_DEVICE_NOT_FOUND; |
422 | 424 | if (offset >= 0x100) | |
425 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
423 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); | 426 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); |
424 | if (!addr) | 427 | if (!addr) |
425 | return PCIBIOS_DEVICE_NOT_FOUND; | 428 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -459,6 +462,112 @@ static struct pci_ops u3_ht_pci_ops = | |||
459 | u3_ht_read_config, | 462 | u3_ht_read_config, |
460 | u3_ht_write_config | 463 | u3_ht_write_config |
461 | }; | 464 | }; |
465 | |||
466 | #define U4_PCIE_CFA0(devfn, off) \ | ||
467 | ((1 << ((unsigned int)PCI_SLOT(dev_fn))) \ | ||
468 | | (((unsigned int)PCI_FUNC(dev_fn)) << 8) \ | ||
469 | | ((((unsigned int)(off)) >> 8) << 28) \ | ||
470 | | (((unsigned int)(off)) & 0xfcU)) | ||
471 | |||
472 | #define U4_PCIE_CFA1(bus, devfn, off) \ | ||
473 | ((((unsigned int)(bus)) << 16) \ | ||
474 | |(((unsigned int)(devfn)) << 8) \ | ||
475 | | ((((unsigned int)(off)) >> 8) << 28) \ | ||
476 | |(((unsigned int)(off)) & 0xfcU) \ | ||
477 | |1UL) | ||
478 | |||
479 | static unsigned long u4_pcie_cfg_access(struct pci_controller* hose, | ||
480 | u8 bus, u8 dev_fn, int offset) | ||
481 | { | ||
482 | unsigned int caddr; | ||
483 | |||
484 | if (bus == hose->first_busno) { | ||
485 | caddr = U4_PCIE_CFA0(dev_fn, offset); | ||
486 | } else | ||
487 | caddr = U4_PCIE_CFA1(bus, dev_fn, offset); | ||
488 | |||
489 | /* Uninorth will return garbage if we don't read back the value ! */ | ||
490 | do { | ||
491 | out_le32(hose->cfg_addr, caddr); | ||
492 | } while (in_le32(hose->cfg_addr) != caddr); | ||
493 | |||
494 | offset &= 0x03; | ||
495 | return ((unsigned long)hose->cfg_data) + offset; | ||
496 | } | ||
497 | |||
498 | static int u4_pcie_read_config(struct pci_bus *bus, unsigned int devfn, | ||
499 | int offset, int len, u32 *val) | ||
500 | { | ||
501 | struct pci_controller *hose; | ||
502 | unsigned long addr; | ||
503 | |||
504 | hose = pci_bus_to_host(bus); | ||
505 | if (hose == NULL) | ||
506 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
507 | if (offset >= 0x1000) | ||
508 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
509 | addr = u4_pcie_cfg_access(hose, bus->number, devfn, offset); | ||
510 | if (!addr) | ||
511 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
512 | /* | ||
513 | * Note: the caller has already checked that offset is | ||
514 | * suitably aligned and that len is 1, 2 or 4. | ||
515 | */ | ||
516 | switch (len) { | ||
517 | case 1: | ||
518 | *val = in_8((u8 *)addr); | ||
519 | break; | ||
520 | case 2: | ||
521 | *val = in_le16((u16 *)addr); | ||
522 | break; | ||
523 | default: | ||
524 | *val = in_le32((u32 *)addr); | ||
525 | break; | ||
526 | } | ||
527 | return PCIBIOS_SUCCESSFUL; | ||
528 | } | ||
529 | |||
530 | static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn, | ||
531 | int offset, int len, u32 val) | ||
532 | { | ||
533 | struct pci_controller *hose; | ||
534 | unsigned long addr; | ||
535 | |||
536 | hose = pci_bus_to_host(bus); | ||
537 | if (hose == NULL) | ||
538 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
539 | if (offset >= 0x1000) | ||
540 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
541 | addr = u4_pcie_cfg_access(hose, bus->number, devfn, offset); | ||
542 | if (!addr) | ||
543 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
544 | /* | ||
545 | * Note: the caller has already checked that offset is | ||
546 | * suitably aligned and that len is 1, 2 or 4. | ||
547 | */ | ||
548 | switch (len) { | ||
549 | case 1: | ||
550 | out_8((u8 *)addr, val); | ||
551 | (void) in_8((u8 *)addr); | ||
552 | break; | ||
553 | case 2: | ||
554 | out_le16((u16 *)addr, val); | ||
555 | (void) in_le16((u16 *)addr); | ||
556 | break; | ||
557 | default: | ||
558 | out_le32((u32 *)addr, val); | ||
559 | (void) in_le32((u32 *)addr); | ||
560 | break; | ||
561 | } | ||
562 | return PCIBIOS_SUCCESSFUL; | ||
563 | } | ||
564 | |||
565 | static struct pci_ops u4_pcie_pci_ops = | ||
566 | { | ||
567 | u4_pcie_read_config, | ||
568 | u4_pcie_write_config | ||
569 | }; | ||
570 | |||
462 | #endif /* CONFIG_PPC64 */ | 571 | #endif /* CONFIG_PPC64 */ |
463 | 572 | ||
464 | #ifdef CONFIG_PPC32 | 573 | #ifdef CONFIG_PPC32 |
@@ -628,15 +737,36 @@ static void __init setup_u3_agp(struct pci_controller* hose) | |||
628 | hose->ops = ¯isc_pci_ops; | 737 | hose->ops = ¯isc_pci_ops; |
629 | hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000); | 738 | hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000); |
630 | hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000); | 739 | hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000); |
631 | |||
632 | u3_agp = hose; | 740 | u3_agp = hose; |
633 | } | 741 | } |
634 | 742 | ||
743 | static void __init setup_u4_pcie(struct pci_controller* hose) | ||
744 | { | ||
745 | /* We currently only implement the "non-atomic" config space, to | ||
746 | * be optimised later. | ||
747 | */ | ||
748 | hose->ops = &u4_pcie_pci_ops; | ||
749 | hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000); | ||
750 | hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000); | ||
751 | |||
752 | /* The bus contains a bridge from root -> device, we need to | ||
753 | * make it visible on bus 0 so that we pick the right type | ||
754 | * of config cycles. If we didn't, we would have to force all | ||
755 | * config cycles to be type 1. So we override the "bus-range" | ||
756 | * property here | ||
757 | */ | ||
758 | hose->first_busno = 0x00; | ||
759 | hose->last_busno = 0xff; | ||
760 | u4_pcie = hose; | ||
761 | } | ||
762 | |||
635 | static void __init setup_u3_ht(struct pci_controller* hose) | 763 | static void __init setup_u3_ht(struct pci_controller* hose) |
636 | { | 764 | { |
637 | struct device_node *np = (struct device_node *)hose->arch_data; | 765 | struct device_node *np = (struct device_node *)hose->arch_data; |
766 | struct pci_controller *other = NULL; | ||
638 | int i, cur; | 767 | int i, cur; |
639 | 768 | ||
769 | |||
640 | hose->ops = &u3_ht_pci_ops; | 770 | hose->ops = &u3_ht_pci_ops; |
641 | 771 | ||
642 | /* We hard code the address because of the different size of | 772 | /* We hard code the address because of the different size of |
@@ -670,11 +800,20 @@ static void __init setup_u3_ht(struct pci_controller* hose) | |||
670 | 800 | ||
671 | u3_ht = hose; | 801 | u3_ht = hose; |
672 | 802 | ||
673 | if (u3_agp == NULL) { | 803 | if (u3_agp != NULL) |
674 | DBG("U3 has no AGP, using full resource range\n"); | 804 | other = u3_agp; |
805 | else if (u4_pcie != NULL) | ||
806 | other = u4_pcie; | ||
807 | |||
808 | if (other == NULL) { | ||
809 | DBG("U3/4 has no AGP/PCIE, using full resource range\n"); | ||
675 | return; | 810 | return; |
676 | } | 811 | } |
677 | 812 | ||
813 | /* Fixup bus range vs. PCIE */ | ||
814 | if (u4_pcie) | ||
815 | hose->last_busno = u4_pcie->first_busno - 1; | ||
816 | |||
678 | /* We "remove" the AGP resources from the resources allocated to HT, | 817 | /* We "remove" the AGP resources from the resources allocated to HT, |
679 | * that is we create "holes". However, that code does assumptions | 818 | * that is we create "holes". However, that code does assumptions |
680 | * that so far happen to be true (cross fingers...), typically that | 819 | * that so far happen to be true (cross fingers...), typically that |
@@ -682,7 +821,7 @@ static void __init setup_u3_ht(struct pci_controller* hose) | |||
682 | */ | 821 | */ |
683 | cur = 0; | 822 | cur = 0; |
684 | for (i=0; i<3; i++) { | 823 | for (i=0; i<3; i++) { |
685 | struct resource *res = &u3_agp->mem_resources[i]; | 824 | struct resource *res = &other->mem_resources[i]; |
686 | if (res->flags != IORESOURCE_MEM) | 825 | if (res->flags != IORESOURCE_MEM) |
687 | continue; | 826 | continue; |
688 | /* We don't care about "fine" resources */ | 827 | /* We don't care about "fine" resources */ |
@@ -777,9 +916,13 @@ static int __init add_bridge(struct device_node *dev) | |||
777 | setup_u3_ht(hose); | 916 | setup_u3_ht(hose); |
778 | disp_name = "U3-HT"; | 917 | disp_name = "U3-HT"; |
779 | primary = 1; | 918 | primary = 1; |
919 | } else if (device_is_compatible(dev, "u4-pcie")) { | ||
920 | setup_u4_pcie(hose); | ||
921 | disp_name = "U4-PCIE"; | ||
922 | primary = 0; | ||
780 | } | 923 | } |
781 | printk(KERN_INFO "Found %s PCI host bridge. Firmware bus number: %d->%d\n", | 924 | printk(KERN_INFO "Found %s PCI host bridge. Firmware bus number:" |
782 | disp_name, hose->first_busno, hose->last_busno); | 925 | " %d->%d\n", disp_name, hose->first_busno, hose->last_busno); |
783 | #endif /* CONFIG_PPC64 */ | 926 | #endif /* CONFIG_PPC64 */ |
784 | 927 | ||
785 | /* 32 bits only bridges */ | 928 | /* 32 bits only bridges */ |
@@ -900,6 +1043,8 @@ void __init pmac_pci_init(void) | |||
900 | pci_setup_phb_io(u3_ht, 1); | 1043 | pci_setup_phb_io(u3_ht, 1); |
901 | if (u3_agp) | 1044 | if (u3_agp) |
902 | pci_setup_phb_io(u3_agp, 0); | 1045 | pci_setup_phb_io(u3_agp, 0); |
1046 | if (u4_pcie) | ||
1047 | pci_setup_phb_io(u4_pcie, 0); | ||
903 | 1048 | ||
904 | /* | 1049 | /* |
905 | * On ppc64, fixup the IO resources on our host bridges as | 1050 | * On ppc64, fixup the IO resources on our host bridges as |
@@ -912,7 +1057,8 @@ void __init pmac_pci_init(void) | |||
912 | 1057 | ||
913 | /* Fixup the PCI<->OF mapping for U3 AGP due to bus renumbering. We | 1058 | /* Fixup the PCI<->OF mapping for U3 AGP due to bus renumbering. We |
914 | * assume there is no P2P bridge on the AGP bus, which should be a | 1059 | * assume there is no P2P bridge on the AGP bus, which should be a |
915 | * safe assumptions hopefully. | 1060 | * safe assumptions for now. We should do something better in the |
1061 | * future though | ||
916 | */ | 1062 | */ |
917 | if (u3_agp) { | 1063 | if (u3_agp) { |
918 | struct device_node *np = u3_agp->arch_data; | 1064 | struct device_node *np = u3_agp->arch_data; |
@@ -920,7 +1066,6 @@ void __init pmac_pci_init(void) | |||
920 | for (np = np->child; np; np = np->sibling) | 1066 | for (np = np->child; np; np = np->sibling) |
921 | PCI_DN(np)->busno = 0xf0; | 1067 | PCI_DN(np)->busno = 0xf0; |
922 | } | 1068 | } |
923 | |||
924 | /* pmac_check_ht_link(); */ | 1069 | /* pmac_check_ht_link(); */ |
925 | 1070 | ||
926 | /* Tell pci.c to not use the common resource allocation mechanism */ | 1071 | /* Tell pci.c to not use the common resource allocation mechanism */ |
@@ -1127,7 +1272,8 @@ void pmac_pci_fixup_pciata(struct pci_dev* dev) | |||
1127 | good: | 1272 | good: |
1128 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); | 1273 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); |
1129 | if ((progif & 5) != 5) { | 1274 | if ((progif & 5) != 5) { |
1130 | printk(KERN_INFO "Forcing PCI IDE into native mode: %s\n", pci_name(dev)); | 1275 | printk(KERN_INFO "Forcing PCI IDE into native mode: %s\n", |
1276 | pci_name(dev)); | ||
1131 | (void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5); | 1277 | (void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5); |
1132 | if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || | 1278 | if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || |
1133 | (progif & 5) != 5) | 1279 | (progif & 5) != 5) |
@@ -1153,7 +1299,8 @@ static void fixup_k2_sata(struct pci_dev* dev) | |||
1153 | for (i = 0; i < 6; i++) { | 1299 | for (i = 0; i < 6; i++) { |
1154 | dev->resource[i].start = dev->resource[i].end = 0; | 1300 | dev->resource[i].start = dev->resource[i].end = 0; |
1155 | dev->resource[i].flags = 0; | 1301 | dev->resource[i].flags = 0; |
1156 | pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); | 1302 | pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, |
1303 | 0); | ||
1157 | } | 1304 | } |
1158 | } else { | 1305 | } else { |
1159 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | 1306 | pci_read_config_word(dev, PCI_COMMAND, &cmd); |
@@ -1162,7 +1309,8 @@ static void fixup_k2_sata(struct pci_dev* dev) | |||
1162 | for (i = 0; i < 5; i++) { | 1309 | for (i = 0; i < 5; i++) { |
1163 | dev->resource[i].start = dev->resource[i].end = 0; | 1310 | dev->resource[i].start = dev->resource[i].end = 0; |
1164 | dev->resource[i].flags = 0; | 1311 | dev->resource[i].flags = 0; |
1165 | pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, 0); | 1312 | pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, |
1313 | 0); | ||
1166 | } | 1314 | } |
1167 | } | 1315 | } |
1168 | } | 1316 | } |