PATCH: display MSI-X table and pba offsets from "pciconf -c"
Neel Natu
neelnatu at gmail.com
Fri Feb 1 00:37:56 UTC 2013
Hi Jim,
On Thu, Jan 31, 2013 at 3:13 PM, Jim Harris <jim.harris at gmail.com> wrote:
>
>
> On Thu, Jan 31, 2013 at 3:52 PM, Neel Natu <neelnatu at gmail.com> wrote:
>>
>> Hi,
>>
>> The following patch teaches pciconf(8) to display the table and pba
>> offsets when it displays the MSI-X capability.
>>
>> The new output format will look like:
>>
>> cap 11[70] = MSI-X supports 10 messages in map 0x1c[0x0][0x2000] enabled
>> OR
>> cap 11[70] = MSI-X supports 10 messages in maps 0x10[0x0] and
>> 0x14[0x1000] enabled
>>
>> Any objections to committing the patch?
>
>
> Functionally I think this is a good addition. More information from pciconf
> the better.
>
> Other comments below.
>
>>
>> best
>> Neel
>>
>> Index: usr.sbin/pciconf/cap.c
>> ===================================================================
>> --- cap.c (revision 246087)
>> +++ cap.c (working copy)
>> @@ -449,22 +449,30 @@
>> static void
>> cap_msix(int fd, struct pci_conf *p, uint8_t ptr)
>> {
>> - uint32_t val;
>> + uint32_t val, table_offset, pba_offset;
>
>
> Variables should be in alphabetical order.
>
Ok.
>>
>> uint16_t ctrl;
>> int msgnum, table_bar, pba_bar;
>>
>> ctrl = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_CTRL, 2);
>> msgnum = (ctrl & PCIM_MSIXCTRL_TABLE_SIZE) + 1;
>> +
>
>
> Newline added intentionally?
>
Yes.
>>
>> val = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_TABLE, 4);
>> table_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
>> + table_offset = val & ~PCIM_MSIX_BIR_MASK;
>> +
>> val = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_PBA, 4);
>> - pba_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
>> + pba_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
>
>
> Looks like these two lines only have whitespace difference.
>
Yes, there was trailing whitespace there previously.
>>
>> + pba_offset = val & ~PCIM_MSIX_BIR_MASK;
>> +
>> printf("MSI-X supports %d message%s ", msgnum,
>> (msgnum == 1) ? "" : "s");
>> - if (table_bar == pba_bar)
>> - printf("in map 0x%x", table_bar);
>> - else
>> - printf("in maps 0x%x and 0x%x", table_bar, pba_bar);
>> + if (table_bar == pba_bar) {
>> + printf("in map 0x%x[0x%x][0x%x]",
>> + table_bar, table_offset, pba_offset);
>> + } else {
>> + printf("in maps 0x%x[0x%x] and 0x%x[0x%x]",
>> + table_bar, table_offset, pba_bar, pba_offset);
>> + }
>
>
> Seems like at least for the case where the table and pba are behind
> different BARs, this will exceed 80 characters. So maybe the maps always go
> on a new line? Similar to what's done at the end of cap_express for
> printing the link speed.
>
Ok, the new format will look like:
cap 11[70] = MSI-X supports 10 messages, enabled
Table in map 0x1c[0x0], PBA in map 0x1c[0x2000]
Updated patch at the end of the email.
best
Neel
>>
>> if (ctrl & PCIM_MSIXCTRL_MSIX_ENABLE)
>> printf(" enabled");
>> }
Index: usr.sbin/pciconf/cap.c
===================================================================
--- usr.sbin/pciconf/cap.c (revision 246087)
+++ usr.sbin/pciconf/cap.c (working copy)
@@ -449,24 +449,28 @@
static void
cap_msix(int fd, struct pci_conf *p, uint8_t ptr)
{
- uint32_t val;
+ uint32_t pba_offset, table_offset, val;
+ int msgnum, pba_bar, table_bar;
uint16_t ctrl;
- int msgnum, table_bar, pba_bar;
ctrl = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_CTRL, 2);
msgnum = (ctrl & PCIM_MSIXCTRL_TABLE_SIZE) + 1;
+
val = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_TABLE, 4);
table_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
+ table_offset = val & ~PCIM_MSIX_BIR_MASK;
+
val = read_config(fd, &p->pc_sel, ptr + PCIR_MSIX_PBA, 4);
- pba_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
- printf("MSI-X supports %d message%s ", msgnum,
- (msgnum == 1) ? "" : "s");
- if (table_bar == pba_bar)
- printf("in map 0x%x", table_bar);
- else
- printf("in maps 0x%x and 0x%x", table_bar, pba_bar);
- if (ctrl & PCIM_MSIXCTRL_MSIX_ENABLE)
- printf(" enabled");
+ pba_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
+ pba_offset = val & ~PCIM_MSIX_BIR_MASK;
+
+ printf("MSI-X supports %d message%s%s\n", msgnum,
+ (msgnum == 1) ? "" : "s",
+ (ctrl & PCIM_MSIXCTRL_MSIX_ENABLE) ? ", enabled" : "");
+
+ printf(" ");
+ printf("Table in map 0x%x[0x%x], PBA in map 0x%x[0x%x]",
+ table_bar, table_offset, pba_bar, pba_offset);
}
static void
More information about the freebsd-current
mailing list