Re: [PATCH] Add lspci support for Enhanced Allocation Capability.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 11, 2015 at 05:30:30PM -0800, David Daney wrote:
> On 12/11/2015 05:13 PM, Sean O. Stalley wrote:
> >Thanks for doing this. I tried it out & everything worked well for me.
> >Only a couple things:
> >
> >The memory regions described by EA also show up before the EA Capability
> >and appear as virtual, ex:
> >	Region 0: [virtual] Memory at 80000000 ...
> 
> We are just dumping out the config space.  lspci doesn't really know
> where the kernel gets the reported BAR values.
> 
> I don't think we want to suppress the dumping of the BARs, or the
> kernel's interpretation thereof.

That's a good point. I guess we should keep dumping the BARs.
I still think we should change the [virtual] flag though.

lspci assumes that if the OS reports a region and configspace doesn't,
that the region came from an SR-IOV entry.

Before EA, this was a safe assumption. Now regions can come from EA entries,
we can't assume that a region with no BAR is always virtual.


Also, I just noticed that show_size() assumes power-of-2 sizes for regions.
It doesn't look like it will display some EA-supported sizes correctly
(Ex: 1110 bytes would get truncated and show up as " [size=1K]").

> >I don't think we want these regions to be flagged as virtual.
> >I think this happens because lspci can't read/write to the BAR region,
> >and so it assumes it's looking at a VF.
> >
> >The rest of my gripes are minor syntax stuff. see inline.
> >
> >Thanks again,
> >Sean
> >
> >On Fri, Dec 11, 2015 at 02:27:25PM -0800, David Daney wrote:
> >>From: David Daney <david.daney@xxxxxxxxxx>
> >>
> [...]
> >>--- a/ls-caps.c
> >>+++ b/ls-caps.c
> >>@@ -1254,6 +1254,145 @@ cap_sata_hba(struct device *d, int where, int cap)
> >>      printf(" BAR??%d\n", bar);
> >>  }
> >>
> [...]
> >>+static void cap_ea(struct device *d, int where, int cap)
> >>+{
> >>+  unsigned int entry;
> >>+  int entry_base = where + 4;
> >>+  unsigned int num_entries = BITS((unsigned int)cap, 0, 6);
> >>+  u8 htype = get_conf_byte(d, PCI_HEADER_TYPE) & 0x7f;
> >>+
> >>+  printf("Enhanced Allocation: Num Entries=%u", num_entries);
> >CamelCase.
> 
> Those are the names from the specification, I would like to keep
> them in some form.  As noted below, it may be desirable to squash it
> to "NumEntries"

Agreed. see below.

> >>+  if (htype == PCI_HEADER_TYPE_BRIDGE) {
> >>+    byte fixed_sub, fixed_sec;
> >>+
> >>+    entry_base += 4;
> >>+    if (!config_fetch(d, where + 4, 2)) {
> >>+      printf("\n");
> >>+      return;
> >>+    }
> >>+    fixed_sec = get_conf_byte(d, where + 4);
> >>+    fixed_sub = get_conf_byte(d, where + 4);
> >>+    printf(", secondary=%d, subordinate=%d", fixed_sec, fixed_sub);
> >>+  }
> >>+  printf("\n");
> >>+  if (verbose < 2)
> >>+    return;
> >>+
> >>+  for (entry = 0; entry < num_entries; entry++) {
> >>+    int max_offset_high_pos, has_base_high, has_max_offset_high;
> >>+    u32 entry_header;
> >>+    u32 base, max_offset;
> >>+    unsigned int es, bei, pp, sp, e, w;
> >>+
> >>+    if (!config_fetch(d, entry_base, 4))
> >>+      return;
> >>+    entry_header = get_conf_long(d, entry_base);
> >>+    es = BITS(entry_header, 0, 3);
> >>+    bei = BITS(entry_header, 4, 4);
> >>+    pp = BITS(entry_header, 8, 8);
> >>+    sp = BITS(entry_header, 16, 8);
> >>+    w = BITS(entry_header, 30, 1);
> >>+    e = BITS(entry_header, 31, 1);
> >>+    if (!config_fetch(d, entry_base + 4, es * 4))
> >>+      return;
> >>+    printf("\t\tEntry-%u: Enable%c Writable%c, Entry Size=%u\n", entry,
> >I would change this line to:
> >	printf("\t\tEntry %u: Enable%c Writable%c, EntrySize=%u\n", ...);
> 
> We could do that.  I would let others decide if squashing "Entry
> Size" to "EntrySize" is desirable.

Sounds good. Lets see what others want.
I don't care too much either way,
I just thought CamelCase would make EA stuff slightly easier to grep.

> >	Changes:         ^                              ^
> >	"-" after Entry to a " " (to match the "Region %i" used for BARs)
> >	make EntrySize CamelCase (to match the other fields in lspci)
> [...]
> >>+    printf("\n");
> >>+    printf("\t\t\t Primary Properties (PP): %s\n", cap_ea_property(pp));
> >>+    printf("\t\t\t Secondary Properties (SP): %s\n", cap_ea_property(sp));
> >"PP" & "SP" are probably sufficient, I don't think we need to write the whole thing out.
> >
> >Also, for the case where the Primary property is valid, can we hide the Secondary property if it is 0xFF?
> >My concern is that people may read the "entry unavailable for use" line as a warning and think something is wrong.
> >Maybe it would be better to make it say "Secondary Properties (SP): Not Present", or something similar.
> >
> 
> That is a good point.  I will try something like that.
> 
> >>+
> >>+    base = get_conf_long(d, entry_base + 4);
> >>+    has_base_high = ((base & 2) != 0);
> >>+    base &= ~3;
> >>+
> >>+    max_offset = get_conf_long(d, entry_base + 8);
> >>+    has_max_offset_high = ((max_offset & 2) != 0);
> >>+    max_offset |= 3;
> >>+    max_offset_high_pos = entry_base + 12;
> >>+
> >>+    printf("\t\t\t Base: ");
> >>+    if (has_base_high) {
> >>+      u32 base_high = get_conf_long(d, entry_base + 12);
> >>+
> >>+      printf("%x", base_high);
> >>+      max_offset_high_pos += 4;
> >>+    }
> >>+    printf("%08x\n", base);
> >>+
> >>+    printf("\t\t\t Max Offset: ");
> >CamelCase.
> 
> Again, I am trying to match the wording of the specification.
> Although in this case I think I got it wrong.  It should probably be
> squashed to "MaxOffset'
> 
> [...]
> 
> Thanks for reviewing it.
> 
> David Daney
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux