@@ -164,6 +164,7 @@ static void adjust_resources_sorted(struct resource_list_x *add_head,
164
164
idx = res - & list -> dev -> resource [0 ];
165
165
add_size = list -> add_size ;
166
166
if (!resource_size (res )) {
167
+ res -> start = list -> start ;
167
168
res -> end = res -> start + add_size - 1 ;
168
169
if (pci_assign_resource (list -> dev , idx ))
169
170
reset_resource (res );
@@ -223,7 +224,7 @@ static void __assign_resources_sorted(struct resource_list *head,
223
224
/* Satisfy the must-have resource requests */
224
225
assign_requested_resources_sorted (head , fail_head );
225
226
226
- /* Try to satisfy any additional nice-to-have resource
227
+ /* Try to satisfy any additional optional resource
227
228
requests */
228
229
if (add_head )
229
230
adjust_resources_sorted (add_head , head );
@@ -678,7 +679,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
678
679
if (add_head && i >= PCI_IOV_RESOURCES &&
679
680
i <= PCI_IOV_RESOURCE_END ) {
680
681
r -> end = r -> start - 1 ;
681
- add_to_list (add_head , dev , r , r_size , 1 );
682
+ add_to_list (add_head , dev , r , r_size , 0 /* dont' care */ );
682
683
children_add_size += r_size ;
683
684
continue ;
684
685
}
@@ -743,7 +744,17 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
743
744
return 1 ;
744
745
}
745
746
746
- static void pci_bus_size_cardbus (struct pci_bus * bus )
747
+ unsigned long pci_cardbus_resource_alignment (struct resource * res )
748
+ {
749
+ if (res -> flags & IORESOURCE_IO )
750
+ return pci_cardbus_io_size ;
751
+ if (res -> flags & IORESOURCE_MEM )
752
+ return pci_cardbus_mem_size ;
753
+ return 0 ;
754
+ }
755
+
756
+ static void pci_bus_size_cardbus (struct pci_bus * bus ,
757
+ struct resource_list_x * add_head )
747
758
{
748
759
struct pci_dev * bridge = bus -> self ;
749
760
struct resource * b_res = & bridge -> resource [PCI_BRIDGE_RESOURCES ];
@@ -754,12 +765,14 @@ static void pci_bus_size_cardbus(struct pci_bus *bus)
754
765
* a fixed amount of bus space for CardBus bridges.
755
766
*/
756
767
b_res [0 ].start = 0 ;
757
- b_res [0 ].end = pci_cardbus_io_size - 1 ;
758
768
b_res [0 ].flags |= IORESOURCE_IO | IORESOURCE_SIZEALIGN ;
769
+ if (add_head )
770
+ add_to_list (add_head , bridge , b_res , pci_cardbus_io_size , 0 /* dont care */ );
759
771
760
772
b_res [1 ].start = 0 ;
761
- b_res [1 ].end = pci_cardbus_io_size - 1 ;
762
773
b_res [1 ].flags |= IORESOURCE_IO | IORESOURCE_SIZEALIGN ;
774
+ if (add_head )
775
+ add_to_list (add_head , bridge , b_res + 1 , pci_cardbus_io_size , 0 /* dont care */ );
763
776
764
777
/*
765
778
* Check whether prefetchable memory is supported
@@ -779,17 +792,27 @@ static void pci_bus_size_cardbus(struct pci_bus *bus)
779
792
*/
780
793
if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 ) {
781
794
b_res [2 ].start = 0 ;
782
- b_res [2 ].end = pci_cardbus_mem_size - 1 ;
783
795
b_res [2 ].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_SIZEALIGN ;
796
+ if (add_head )
797
+ add_to_list (add_head , bridge , b_res + 2 , pci_cardbus_mem_size , 0 /* dont care */ );
784
798
785
799
b_res [3 ].start = 0 ;
786
- b_res [3 ].end = pci_cardbus_mem_size - 1 ;
787
800
b_res [3 ].flags |= IORESOURCE_MEM | IORESOURCE_SIZEALIGN ;
801
+ if (add_head )
802
+ add_to_list (add_head , bridge , b_res + 3 , pci_cardbus_mem_size , 0 /* dont care */ );
788
803
} else {
789
804
b_res [3 ].start = 0 ;
790
- b_res [3 ].end = pci_cardbus_mem_size * 2 - 1 ;
791
805
b_res [3 ].flags |= IORESOURCE_MEM | IORESOURCE_SIZEALIGN ;
806
+ if (add_head )
807
+ add_to_list (add_head , bridge , b_res + 3 , pci_cardbus_mem_size * 2 , 0 /* dont care */ );
792
808
}
809
+
810
+ /* set the size of the resource to zero, so that the resource does not
811
+ * get assigned during required-resource allocation cycle but gets assigned
812
+ * during the optional-resource allocation cycle.
813
+ */
814
+ b_res [0 ].start = b_res [1 ].start = b_res [2 ].start = b_res [3 ].start = 1 ;
815
+ b_res [0 ].end = b_res [1 ].end = b_res [2 ].end = b_res [3 ].end = 0 ;
793
816
}
794
817
795
818
void __ref __pci_bus_size_bridges (struct pci_bus * bus ,
@@ -806,7 +829,7 @@ void __ref __pci_bus_size_bridges(struct pci_bus *bus,
806
829
807
830
switch (dev -> class >> 8 ) {
808
831
case PCI_CLASS_BRIDGE_CARDBUS :
809
- pci_bus_size_cardbus (b );
832
+ pci_bus_size_cardbus (b , add_head );
810
833
break ;
811
834
812
835
case PCI_CLASS_BRIDGE_PCI :
0 commit comments