Thread (9 messages) flat view 9 messages, 4 authors, 2012-07-19

Re: [PATCH 05/15] pci: resource assignment based on p2p alignment

From: Ram Pai <hidden>
Date: 2012-07-17 05:57:25
Also in: linux-pci

On Tue, Jul 17, 2012 at 01:36:49PM +0800, Gavin Shan wrote:
On Tue, Jul 17, 2012 at 01:23:33PM +0800, Ram Pai wrote:
quoted
On Tue, Jul 17, 2012 at 01:05:47PM +0800, Ram Pai wrote:
quoted
On Tue, Jul 17, 2012 at 10:23:17AM +0800, Gavin Shan wrote:
quoted
The patch changes function pbus_size_io() and pbus_size_mem() to
do resource (I/O, memory and prefetchable memory) reassignment
based on the minimal alignments for the p2p bridge, which was
retrieved by function window_alignment().

Signed-off-by: Gavin Shan <redacted>
[snip]
quoted
quoted
quoted
@@ -772,11 +775,11 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,
 		return;
 	}
 	/* Alignment of the IO window is always 4K */
-	b_res->start = 4096;
+	b_res->start = io_align;
 	b_res->end = b_res->start + size0 - 1;
 	b_res->flags |= IORESOURCE_STARTALIGN;
 	if (size1 > size0 && realloc_head) {
-		add_to_list(realloc_head, bus->self, b_res, size1-size0, 4096);
+		add_to_list(realloc_head, bus->self, b_res, size1-size0, io_align);
 		dev_printk(KERN_DEBUG, &bus->self->dev, "bridge window "
 				 "%pR to [bus %02x-%02x] add_size %lx\n", b_res,
 				 bus->secondary, bus->subordinate, size1-size0);
@@ -875,6 +878,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
 			min_align = align1 >> 1;
 		align += aligns[order];
 	}
+
+	min_align = max(min_align, window_alignment(bus, type));
  'type' can sometimes be (IORESOURCE_MEM | IORESOURCE_PREFETCH), which
  can lead to unpredictable results depending on how window_alignment()
  is implemented... Hence to be on the safer side I suggest

	min_align = max(min_align, window_alignment(bus, b_res->flags & mask));
Sorry, Ram. I didn't see your concern in last reply. So I have to
cover your conver in this reply.

I think it'd better to pass "type" directly because platform (e.g. powernv)
expects both IORESOURCE_MEM as well as IORESOURCE_PREFETCH. 
In future, powernv platform will return M32 segment size for IORESOURCE_MEM, but
might return M64 segment size for (IORESOURCE_MEM | IORESOURCE_PREFETCH).
Hmm.. this code is not about determining what kind of segment the
platform is returning. This code is about using the right alignment
constraints for the type of segment from which resource will be
allocated. right?

b_res is the resource that is being sized. b_res already knows
what kind of resource it is, i.e IORESOURCE_MEM or IORESOURCE_PREFETCH.
Hence we should be exactly using the same alignment constraints as
that dictated by the type of b_res. no?

RP
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help