* [PATCH v4 0/2] pci/lspci: Identify Enhanced Allocation (EA) Resources @ 2016-02-12 0:52 Sean O. Stalley 2016-02-12 0:52 ` [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources Sean O. Stalley 2016-02-12 0:52 ` [PATCH v4 2/2] Add support for enhanced allocation regions Sean O. Stalley 0 siblings, 2 replies; 7+ messages in thread From: Sean O. Stalley @ 2016-02-12 0:52 UTC (permalink / raw) To: linux-pci, mj, bhelgaas, alex.williamson; +Cc: sean.stalley, david.daney Identify BAR-equivalent resources that are described by EA entries with the IORESOURCE_PCI_EA_BEI flag. lspci cannot distinguish between resources from VF BARs and resources from EA. This results in EA Resources being incorrectly identified as [virtual]. Adding this flag allows EA resources to be marked more accurately as [enhanced]. Although this patchset only add support for this flag to lspci, there are other use cases (such as vfio) where knowing a resource comes from EA would be useful. [PATCH 1/2] is for the kernel, [PATCH 2/2] is for lspci. Changes from V1: -Rewrote commit message for linux changes Changes from V2: - Rewrote commit message for linux, fixing spelling :) - Added warning about resource flags being exposed in sysfs Changes from V3 (only lspci changes): - Incremented libpci API version number - append new flag variables to the end of struct pci_dev (so we don't break binary compatiblity) - expanded comment for the resource flags - removed brackets around 1 line conditionals Alex Williamson (1): pci: Identify Enhanced Allocation (EA) BAR Equivalent resources Sean O. Stalley (1): Add support for enhanced allocation regions linux changes: drivers/pci/pci.c | 2 +- include/linux/ioport.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) lspci changes: lib/access.c | 18 ++++++++++-------- lib/caps.c | 2 +- lib/filter.c | 2 +- lib/header.h | 4 ++++ lib/libpci.ver | 5 +++++ lib/pci.h | 3 +++ lib/sysfs.c | 7 +++++-- lspci.c | 12 +++++++++--- 8 files changed, 38 insertions(+), 15 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources 2016-02-12 0:52 [PATCH v4 0/2] pci/lspci: Identify Enhanced Allocation (EA) Resources Sean O. Stalley @ 2016-02-12 0:52 ` Sean O. Stalley 2016-05-16 20:31 ` Bjorn Helgaas 2016-02-12 0:52 ` [PATCH v4 2/2] Add support for enhanced allocation regions Sean O. Stalley 1 sibling, 1 reply; 7+ messages in thread From: Sean O. Stalley @ 2016-02-12 0:52 UTC (permalink / raw) To: linux-pci, mj, bhelgaas, alex.williamson; +Cc: sean.stalley, david.daney From: Alex Williamson <alex.williamson@redhat.com> Resource flags are exposed to userspace via the sysfs "resource" file. lspci reads the sysfs file to determine resource properties. Adding this flag allows lspci to distinguish between [virtual] and [enhanced] resources. If the resource is not aligned, userspace could deduce where the resource is EA based on the size & address fields. However, a flag indicating whether a PCI resource is a traditional BAR or BAR equivalent seems like a much simpler solution and works if the EA resource is aligned. Although this patchset only improves lspci, other uses for this flag have been identified. For example, vfio makes assumptions about alignment and sizing, and runs into problems when attempting to emulate a BAR Equivalent EA resource. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Sean O. Stalley <sean.stalley@intel.com> --- drivers/pci/pci.c | 2 +- include/linux/ioport.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d1a7105..8ff678c 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -2229,7 +2229,7 @@ void pci_pm_init(struct pci_dev *dev) static unsigned long pci_ea_flags(struct pci_dev *dev, u8 prop) { - unsigned long flags = IORESOURCE_PCI_FIXED; + unsigned long flags = IORESOURCE_PCI_FIXED | IORESOURCE_PCI_EA_BEI; switch (prop) { case PCI_EA_P_MEM: diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 24bea08..88816f9 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -25,7 +25,11 @@ struct resource { /* * IO resources have these defined flags. + * + * PCI devices expose these flags to userspace in the "resource" sysfs file, + * Moving them around could break stuff, so don't do it. */ + #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */ #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */ @@ -97,6 +101,7 @@ struct resource { #define IORESOURCE_IO_SPARSE (1<<2) /* PCI ROM control bits (IORESOURCE_BITS) */ + #define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ #define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at C000:0 */ #define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */ @@ -105,6 +110,8 @@ struct resource { /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */ +/* PCI Enhanced Allocation defined BAR equivalent resource */ +#define IORESOURCE_PCI_EA_BEI (1<<5) /* helpers to define resources */ #define DEFINE_RES_NAMED(_start, _size, _name, _flags) \ -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources 2016-02-12 0:52 ` [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources Sean O. Stalley @ 2016-05-16 20:31 ` Bjorn Helgaas 2016-05-16 22:07 ` Stalley, Sean 0 siblings, 1 reply; 7+ messages in thread From: Bjorn Helgaas @ 2016-05-16 20:31 UTC (permalink / raw) To: Sean O. Stalley; +Cc: linux-pci, mj, bhelgaas, alex.williamson, david.daney On Thu, Feb 11, 2016 at 04:52:24PM -0800, Sean O. Stalley wrote: > From: Alex Williamson <alex.williamson@redhat.com> > > Resource flags are exposed to userspace via the sysfs "resource" file. > lspci reads the sysfs file to determine resource properties. > Adding this flag allows lspci to distinguish between [virtual] > and [enhanced] resources. > > If the resource is not aligned, userspace could deduce where > the resource is EA based on the size & address fields. > However, a flag indicating whether a PCI resource is a traditional BAR > or BAR equivalent seems like a much simpler solution and works if the > EA resource is aligned. > > Although this patchset only improves lspci, other uses for this > flag have been identified. For example, vfio makes assumptions > about alignment and sizing, and runs into problems when attempting > to emulate a BAR Equivalent EA resource. > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > Signed-off-by: Sean O. Stalley <sean.stalley@intel.com> I applied this to pci/resource and intend to merge it for v4.7. > --- > drivers/pci/pci.c | 2 +- > include/linux/ioport.h | 7 +++++++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index d1a7105..8ff678c 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -2229,7 +2229,7 @@ void pci_pm_init(struct pci_dev *dev) > > static unsigned long pci_ea_flags(struct pci_dev *dev, u8 prop) > { > - unsigned long flags = IORESOURCE_PCI_FIXED; > + unsigned long flags = IORESOURCE_PCI_FIXED | IORESOURCE_PCI_EA_BEI; > > switch (prop) { > case PCI_EA_P_MEM: > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index 24bea08..88816f9 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -25,7 +25,11 @@ struct resource { > > /* > * IO resources have these defined flags. > + * > + * PCI devices expose these flags to userspace in the "resource" sysfs file, > + * Moving them around could break stuff, so don't do it. > */ > + > #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */ > > #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */ > @@ -97,6 +101,7 @@ struct resource { > #define IORESOURCE_IO_SPARSE (1<<2) > > /* PCI ROM control bits (IORESOURCE_BITS) */ > + > #define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ > #define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at C000:0 */ > #define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */ > @@ -105,6 +110,8 @@ struct resource { > /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ > #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */ > > +/* PCI Enhanced Allocation defined BAR equivalent resource */ > +#define IORESOURCE_PCI_EA_BEI (1<<5) > > /* helpers to define resources */ > #define DEFINE_RES_NAMED(_start, _size, _name, _flags) \ > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources 2016-05-16 20:31 ` Bjorn Helgaas @ 2016-05-16 22:07 ` Stalley, Sean 0 siblings, 0 replies; 7+ messages in thread From: Stalley, Sean @ 2016-05-16 22:07 UTC (permalink / raw) To: Bjorn Helgaas Cc: linux-pci@vger.kernel.org, mj@ucw.cz, bhelgaas@google.com, alex.williamson@redhat.com, david.daney@cavium.com Thanks Bjorn & Martin! -Sean > -----Original Message----- > From: Bjorn Helgaas [mailto:helgaas@kernel.org] > Sent: Monday, May 16, 2016 1:32 PM > To: Stalley, Sean <sean.stalley@intel.com> > Cc: linux-pci@vger.kernel.org; mj@ucw.cz; bhelgaas@google.com; > alex.williamson@redhat.com; david.daney@cavium.com > Subject: Re: [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR > Equivalent resources >=20 > On Thu, Feb 11, 2016 at 04:52:24PM -0800, Sean O. Stalley wrote: > > From: Alex Williamson <alex.williamson@redhat.com> > > > > Resource flags are exposed to userspace via the sysfs "resource" file. > > lspci reads the sysfs file to determine resource properties. > > Adding this flag allows lspci to distinguish between [virtual] and > > [enhanced] resources. > > > > If the resource is not aligned, userspace could deduce where the > > resource is EA based on the size & address fields. > > However, a flag indicating whether a PCI resource is a traditional BAR > > or BAR equivalent seems like a much simpler solution and works if the > > EA resource is aligned. > > > > Although this patchset only improves lspci, other uses for this flag > > have been identified. For example, vfio makes assumptions about > > alignment and sizing, and runs into problems when attempting to > > emulate a BAR Equivalent EA resource. > > > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > > Signed-off-by: Sean O. Stalley <sean.stalley@intel.com> >=20 > I applied this to pci/resource and intend to merge it for v4.7. >=20 > > --- > > drivers/pci/pci.c | 2 +- > > include/linux/ioport.h | 7 +++++++ > > 2 files changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index > > d1a7105..8ff678c 100644 > > --- a/drivers/pci/pci.c > > +++ b/drivers/pci/pci.c > > @@ -2229,7 +2229,7 @@ void pci_pm_init(struct pci_dev *dev) > > > > static unsigned long pci_ea_flags(struct pci_dev *dev, u8 prop) { > > - unsigned long flags =3D IORESOURCE_PCI_FIXED; > > + unsigned long flags =3D IORESOURCE_PCI_FIXED | > IORESOURCE_PCI_EA_BEI; > > > > switch (prop) { > > case PCI_EA_P_MEM: > > diff --git a/include/linux/ioport.h b/include/linux/ioport.h index > > 24bea08..88816f9 100644 > > --- a/include/linux/ioport.h > > +++ b/include/linux/ioport.h > > @@ -25,7 +25,11 @@ struct resource { > > > > /* > > * IO resources have these defined flags. > > + * > > + * PCI devices expose these flags to userspace in the "resource" > > + sysfs file, > > + * Moving them around could break stuff, so don't do it. > > */ > > + > > #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */ > > > > #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */ > > @@ -97,6 +101,7 @@ struct resource { > > #define IORESOURCE_IO_SPARSE (1<<2) > > > > /* PCI ROM control bits (IORESOURCE_BITS) */ > > + > > #define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, > same as PCI_ROM_ADDRESS_ENABLE */ > > #define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at > C000:0 */ > > #define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, > resource field overlaid */ > > @@ -105,6 +110,8 @@ struct resource { > > /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ > > #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move > resource */ > > > > +/* PCI Enhanced Allocation defined BAR equivalent resource */ > > +#define IORESOURCE_PCI_EA_BEI (1<<5) > > > > /* helpers to define resources */ > > #define DEFINE_RES_NAMED(_start, _size, _name, _flags) > \ > > -- > > 1.9.1 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-pci" > > in the body of a message to majordomo@vger.kernel.org More majordomo > > info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 2/2] Add support for enhanced allocation regions 2016-02-12 0:52 [PATCH v4 0/2] pci/lspci: Identify Enhanced Allocation (EA) Resources Sean O. Stalley 2016-02-12 0:52 ` [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources Sean O. Stalley @ 2016-02-12 0:52 ` Sean O. Stalley 2016-04-10 22:22 ` Bjorn Helgaas 1 sibling, 1 reply; 7+ messages in thread From: Sean O. Stalley @ 2016-02-12 0:52 UTC (permalink / raw) To: linux-pci, mj, bhelgaas, alex.williamson; +Cc: sean.stalley, david.daney Append [enhanced] to Regions that contain the BEI flag in sysfs. To do this, we need to add the resource flags to the pci_dev struct. This struct is passed through the libpci API, so we increment the API version number. Don't tuncate least significant bits of the region size. ex: a 2000 byte region should display [size=2000] instead of [size=1K] Signed-off-by: Sean O. Stalley <sean.stalley@intel.com> --- lib/access.c | 18 ++++++++++-------- lib/caps.c | 2 +- lib/filter.c | 2 +- lib/header.h | 4 ++++ lib/libpci.ver | 5 +++++ lib/pci.h | 3 +++ lib/sysfs.c | 7 +++++-- lspci.c | 12 +++++++++--- 8 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/access.c b/lib/access.c index 5994008..17b8bed 100644 --- a/lib/access.c +++ b/lib/access.c @@ -155,7 +155,7 @@ pci_write_block(struct pci_dev *d, int pos, byte *buf, int len) } int -pci_fill_info_v34(struct pci_dev *d, int flags) +pci_fill_info_v35(struct pci_dev *d, int flags) { if (flags & PCI_FILL_RESCAN) { @@ -169,17 +169,19 @@ pci_fill_info_v34(struct pci_dev *d, int flags) } /* In version 3.1, pci_fill_info got new flags => versioned alias */ -/* In versions 3.2, 3.3 and 3.4, the same has happened */ -STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v34(d, flags)); -DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v34); -DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v34); -DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v34); -DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v34); +/* In versions 3.2, 3.3, 3.4 and 3.5, the same has happened */ +STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v35(d, flags)); +DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v35); +DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v35); +DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v35); +DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v35); +DEFINE_ALIAS(int pci_fill_info_v34(struct pci_dev *d, int flags), pci_fill_info_v35); SYMBOL_VERSION(pci_fill_info_v30, pci_fill_info@LIBPCI_3.0); SYMBOL_VERSION(pci_fill_info_v31, pci_fill_info@LIBPCI_3.1); SYMBOL_VERSION(pci_fill_info_v32, pci_fill_info@LIBPCI_3.2); SYMBOL_VERSION(pci_fill_info_v33, pci_fill_info@LIBPCI_3.3); -SYMBOL_VERSION(pci_fill_info_v34, pci_fill_info@@LIBPCI_3.4); +SYMBOL_VERSION(pci_fill_info_v34, pci_fill_info@LIBPCI_3.4); +SYMBOL_VERSION(pci_fill_info_v35, pci_fill_info@@LIBPCI_3.5); void pci_setup_cache(struct pci_dev *d, byte *cache, int len) diff --git a/lib/caps.c b/lib/caps.c index a812fb9..9a2e0a5 100644 --- a/lib/caps.c +++ b/lib/caps.c @@ -106,7 +106,7 @@ pci_find_cap(struct pci_dev *d, unsigned int id, unsigned int type) { struct pci_cap *c; - pci_fill_info_v34(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); + pci_fill_info_v35(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); for (c=d->first_cap; c; c=c->next) if (c->type == type && c->id == id) return c; diff --git a/lib/filter.c b/lib/filter.c index d4254a0..ab1476f 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -129,7 +129,7 @@ pci_filter_match_v33(struct pci_filter *f, struct pci_dev *d) return 0; if (f->device >= 0 || f->vendor >= 0) { - pci_fill_info_v34(d, PCI_FILL_IDENT); + pci_fill_info_v35(d, PCI_FILL_IDENT); if ((f->device >= 0 && f->device != d->device_id) || (f->vendor >= 0 && f->vendor != d->vendor_id)) return 0; diff --git a/lib/header.h b/lib/header.h index b8f7dc1..7b9a803 100644 --- a/lib/header.h +++ b/lib/header.h @@ -1235,3 +1235,7 @@ #define PCI_VENDOR_ID_INTEL 0x8086 #define PCI_VENDOR_ID_COMPAQ 0x0e11 + +/* taken from <include/linux/ioport.h> */ + +#define IORESOURCE_PCI_EA_BEI (1<<5) diff --git a/lib/libpci.ver b/lib/libpci.ver index 7ac8d34..83f3c50 100644 --- a/lib/libpci.ver +++ b/lib/libpci.ver @@ -66,3 +66,8 @@ LIBPCI_3.4 { global: pci_fill_info; }; + +LIBPCI_3.5 { + global: + pci_fill_info; +}; diff --git a/lib/pci.h b/lib/pci.h index 9c1e281..a86bfd7 100644 --- a/lib/pci.h +++ b/lib/pci.h @@ -136,6 +136,8 @@ struct pci_dev { char *module_alias; /* Linux kernel module alias */ char *label; /* Device name as exported by BIOS */ int numa_node; /* NUMA node */ + pciaddr_t flags[6]; /* Region IORESOURCE flags */ + pciaddr_t rom_flags; /* Expansion ROM IORESOURCE flags */ /* Fields used internally: */ struct pci_access *access; @@ -174,6 +176,7 @@ int pci_fill_info(struct pci_dev *, int flags) PCI_ABI; /* Fill in device inform #define PCI_FILL_MODULE_ALIAS 0x0200 #define PCI_FILL_LABEL 0x0400 #define PCI_FILL_NUMA_NODE 0x0800 +#define PCI_FILL_IO_FLAGS 0x1000 #define PCI_FILL_RESCAN 0x00010000 void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI; diff --git a/lib/sysfs.c b/lib/sysfs.c index 986ecc9..65f58bf 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -153,14 +153,17 @@ sysfs_get_resources(struct pci_dev *d) size = end - start + 1; else size = 0; - flags &= PCI_ADDR_FLAG_MASK; if (i < 6) { + d->flags[i] = flags; + flags &= PCI_ADDR_FLAG_MASK; d->base_addr[i] = start | flags; d->size[i] = size; } else { + d->rom_flags = flags; + flags &= PCI_ADDR_FLAG_MASK; d->rom_base_addr = start | flags; d->rom_size = size; } @@ -208,7 +211,7 @@ static void sysfs_scan(struct pci_access *a) d->vendor_id = sysfs_get_value(d, "vendor", 1); d->device_id = sysfs_get_value(d, "device", 1); d->device_class = sysfs_get_value(d, "class", 1) >> 8; - d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES; + d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES | PCI_FILL_IO_FLAGS; } pci_link_dev(a, d); } diff --git a/lspci.c b/lspci.c index fe7b7fe..52d14f3 100644 --- a/lspci.c +++ b/lspci.c @@ -336,7 +336,7 @@ show_size(pciaddr_t x) if (!x) return; for (i = 0; i < (sizeof(suffix) / sizeof(*suffix) - 1); i++) { - if (x < 1024) + if (x % 1024) break; x /= 1024; } @@ -355,6 +355,7 @@ show_bases(struct device *d, int cnt) { pciaddr_t pos = p->base_addr[i]; pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->size[i] : 0; + pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->flags[i] : 0; u32 flg = get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i); if (flg == 0xffffffff) flg = 0; @@ -364,7 +365,9 @@ show_bases(struct device *d, int cnt) printf("\tRegion %d: ", i); else putchar('\t'); - if (pos && !flg) /* Reported by the OS, but not by the device */ + if (ioflg & IORESOURCE_PCI_EA_BEI) + printf("[enhanced] "); + else if (pos && !flg) /* Reported by the OS, but not by the device */ { printf("[virtual] "); flg = pos; @@ -430,6 +433,7 @@ show_rom(struct device *d, int reg) struct pci_dev *p = d->dev; pciaddr_t rom = p->rom_base_addr; pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->rom_size : 0; + pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->rom_flags : 0; u32 flg = get_conf_long(d, reg); word cmd = get_conf_word(d, PCI_COMMAND); int virtual = 0; @@ -437,7 +441,9 @@ show_rom(struct device *d, int reg) if (!rom && !flg && !len) return; putchar('\t'); - if ((rom & PCI_ROM_ADDRESS_MASK) && !(flg & PCI_ROM_ADDRESS_MASK)) + if (ioflg & IORESOURCE_PCI_EA_BEI) + printf("[enhanced] "); + else if ((rom & PCI_ROM_ADDRESS_MASK) && !(flg & PCI_ROM_ADDRESS_MASK)) { printf("[virtual] "); flg = rom; -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/2] Add support for enhanced allocation regions 2016-02-12 0:52 ` [PATCH v4 2/2] Add support for enhanced allocation regions Sean O. Stalley @ 2016-04-10 22:22 ` Bjorn Helgaas 2016-05-14 9:28 ` Martin Mares 0 siblings, 1 reply; 7+ messages in thread From: Bjorn Helgaas @ 2016-04-10 22:22 UTC (permalink / raw) To: Sean O. Stalley; +Cc: linux-pci, mj, bhelgaas, alex.williamson, david.daney Hi Martin, On Thu, Feb 11, 2016 at 04:52:25PM -0800, Sean O. Stalley wrote: > Append [enhanced] to Regions that contain the BEI flag in sysfs. > To do this, we need to add the resource flags to the pci_dev struct. > This struct is passed through the libpci API, so we increment the API version number. > > Don't tuncate least significant bits of the region size. s/tuncate/truncate/ > ex: a 2000 byte region should display [size=2000] instead of [size=1K] What do you think of this? I don't object to the kernel PCI part of it, but I don't want to apply it unless you plan to make lspci make use of it. Bjorn > Signed-off-by: Sean O. Stalley <sean.stalley@intel.com> > --- > lib/access.c | 18 ++++++++++-------- > lib/caps.c | 2 +- > lib/filter.c | 2 +- > lib/header.h | 4 ++++ > lib/libpci.ver | 5 +++++ > lib/pci.h | 3 +++ > lib/sysfs.c | 7 +++++-- > lspci.c | 12 +++++++++--- > 8 files changed, 38 insertions(+), 15 deletions(-) > > diff --git a/lib/access.c b/lib/access.c > index 5994008..17b8bed 100644 > --- a/lib/access.c > +++ b/lib/access.c > @@ -155,7 +155,7 @@ pci_write_block(struct pci_dev *d, int pos, byte *buf, int len) > } > > int > -pci_fill_info_v34(struct pci_dev *d, int flags) > +pci_fill_info_v35(struct pci_dev *d, int flags) > { > if (flags & PCI_FILL_RESCAN) > { > @@ -169,17 +169,19 @@ pci_fill_info_v34(struct pci_dev *d, int flags) > } > > /* In version 3.1, pci_fill_info got new flags => versioned alias */ > -/* In versions 3.2, 3.3 and 3.4, the same has happened */ > -STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v34(d, flags)); > -DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v34); > -DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v34); > -DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v34); > -DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v34); > +/* In versions 3.2, 3.3, 3.4 and 3.5, the same has happened */ > +STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v35(d, flags)); > +DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v35); > +DEFINE_ALIAS(int pci_fill_info_v31(struct pci_dev *d, int flags), pci_fill_info_v35); > +DEFINE_ALIAS(int pci_fill_info_v32(struct pci_dev *d, int flags), pci_fill_info_v35); > +DEFINE_ALIAS(int pci_fill_info_v33(struct pci_dev *d, int flags), pci_fill_info_v35); > +DEFINE_ALIAS(int pci_fill_info_v34(struct pci_dev *d, int flags), pci_fill_info_v35); > SYMBOL_VERSION(pci_fill_info_v30, pci_fill_info@LIBPCI_3.0); > SYMBOL_VERSION(pci_fill_info_v31, pci_fill_info@LIBPCI_3.1); > SYMBOL_VERSION(pci_fill_info_v32, pci_fill_info@LIBPCI_3.2); > SYMBOL_VERSION(pci_fill_info_v33, pci_fill_info@LIBPCI_3.3); > -SYMBOL_VERSION(pci_fill_info_v34, pci_fill_info@@LIBPCI_3.4); > +SYMBOL_VERSION(pci_fill_info_v34, pci_fill_info@LIBPCI_3.4); > +SYMBOL_VERSION(pci_fill_info_v35, pci_fill_info@@LIBPCI_3.5); > > void > pci_setup_cache(struct pci_dev *d, byte *cache, int len) > diff --git a/lib/caps.c b/lib/caps.c > index a812fb9..9a2e0a5 100644 > --- a/lib/caps.c > +++ b/lib/caps.c > @@ -106,7 +106,7 @@ pci_find_cap(struct pci_dev *d, unsigned int id, unsigned int type) > { > struct pci_cap *c; > > - pci_fill_info_v34(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); > + pci_fill_info_v35(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS)); > for (c=d->first_cap; c; c=c->next) > if (c->type == type && c->id == id) > return c; > diff --git a/lib/filter.c b/lib/filter.c > index d4254a0..ab1476f 100644 > --- a/lib/filter.c > +++ b/lib/filter.c > @@ -129,7 +129,7 @@ pci_filter_match_v33(struct pci_filter *f, struct pci_dev *d) > return 0; > if (f->device >= 0 || f->vendor >= 0) > { > - pci_fill_info_v34(d, PCI_FILL_IDENT); > + pci_fill_info_v35(d, PCI_FILL_IDENT); > if ((f->device >= 0 && f->device != d->device_id) || > (f->vendor >= 0 && f->vendor != d->vendor_id)) > return 0; > diff --git a/lib/header.h b/lib/header.h > index b8f7dc1..7b9a803 100644 > --- a/lib/header.h > +++ b/lib/header.h > @@ -1235,3 +1235,7 @@ > > #define PCI_VENDOR_ID_INTEL 0x8086 > #define PCI_VENDOR_ID_COMPAQ 0x0e11 > + > +/* taken from <include/linux/ioport.h> */ > + > +#define IORESOURCE_PCI_EA_BEI (1<<5) > diff --git a/lib/libpci.ver b/lib/libpci.ver > index 7ac8d34..83f3c50 100644 > --- a/lib/libpci.ver > +++ b/lib/libpci.ver > @@ -66,3 +66,8 @@ LIBPCI_3.4 { > global: > pci_fill_info; > }; > + > +LIBPCI_3.5 { > + global: > + pci_fill_info; > +}; > diff --git a/lib/pci.h b/lib/pci.h > index 9c1e281..a86bfd7 100644 > --- a/lib/pci.h > +++ b/lib/pci.h > @@ -136,6 +136,8 @@ struct pci_dev { > char *module_alias; /* Linux kernel module alias */ > char *label; /* Device name as exported by BIOS */ > int numa_node; /* NUMA node */ > + pciaddr_t flags[6]; /* Region IORESOURCE flags */ > + pciaddr_t rom_flags; /* Expansion ROM IORESOURCE flags */ > > /* Fields used internally: */ > struct pci_access *access; > @@ -174,6 +176,7 @@ int pci_fill_info(struct pci_dev *, int flags) PCI_ABI; /* Fill in device inform > #define PCI_FILL_MODULE_ALIAS 0x0200 > #define PCI_FILL_LABEL 0x0400 > #define PCI_FILL_NUMA_NODE 0x0800 > +#define PCI_FILL_IO_FLAGS 0x1000 > #define PCI_FILL_RESCAN 0x00010000 > > void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI; > diff --git a/lib/sysfs.c b/lib/sysfs.c > index 986ecc9..65f58bf 100644 > --- a/lib/sysfs.c > +++ b/lib/sysfs.c > @@ -153,14 +153,17 @@ sysfs_get_resources(struct pci_dev *d) > size = end - start + 1; > else > size = 0; > - flags &= PCI_ADDR_FLAG_MASK; > if (i < 6) > { > + d->flags[i] = flags; > + flags &= PCI_ADDR_FLAG_MASK; > d->base_addr[i] = start | flags; > d->size[i] = size; > } > else > { > + d->rom_flags = flags; > + flags &= PCI_ADDR_FLAG_MASK; > d->rom_base_addr = start | flags; > d->rom_size = size; > } > @@ -208,7 +211,7 @@ static void sysfs_scan(struct pci_access *a) > d->vendor_id = sysfs_get_value(d, "vendor", 1); > d->device_id = sysfs_get_value(d, "device", 1); > d->device_class = sysfs_get_value(d, "class", 1) >> 8; > - d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES; > + d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES | PCI_FILL_IO_FLAGS; > } > pci_link_dev(a, d); > } > diff --git a/lspci.c b/lspci.c > index fe7b7fe..52d14f3 100644 > --- a/lspci.c > +++ b/lspci.c > @@ -336,7 +336,7 @@ show_size(pciaddr_t x) > if (!x) > return; > for (i = 0; i < (sizeof(suffix) / sizeof(*suffix) - 1); i++) { > - if (x < 1024) > + if (x % 1024) > break; > x /= 1024; > } > @@ -355,6 +355,7 @@ show_bases(struct device *d, int cnt) > { > pciaddr_t pos = p->base_addr[i]; > pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->size[i] : 0; > + pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->flags[i] : 0; > u32 flg = get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i); > if (flg == 0xffffffff) > flg = 0; > @@ -364,7 +365,9 @@ show_bases(struct device *d, int cnt) > printf("\tRegion %d: ", i); > else > putchar('\t'); > - if (pos && !flg) /* Reported by the OS, but not by the device */ > + if (ioflg & IORESOURCE_PCI_EA_BEI) > + printf("[enhanced] "); > + else if (pos && !flg) /* Reported by the OS, but not by the device */ > { > printf("[virtual] "); > flg = pos; > @@ -430,6 +433,7 @@ show_rom(struct device *d, int reg) > struct pci_dev *p = d->dev; > pciaddr_t rom = p->rom_base_addr; > pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->rom_size : 0; > + pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->rom_flags : 0; > u32 flg = get_conf_long(d, reg); > word cmd = get_conf_word(d, PCI_COMMAND); > int virtual = 0; > @@ -437,7 +441,9 @@ show_rom(struct device *d, int reg) > if (!rom && !flg && !len) > return; > putchar('\t'); > - if ((rom & PCI_ROM_ADDRESS_MASK) && !(flg & PCI_ROM_ADDRESS_MASK)) > + if (ioflg & IORESOURCE_PCI_EA_BEI) > + printf("[enhanced] "); > + else if ((rom & PCI_ROM_ADDRESS_MASK) && !(flg & PCI_ROM_ADDRESS_MASK)) > { > printf("[virtual] "); > flg = rom; > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/2] Add support for enhanced allocation regions 2016-04-10 22:22 ` Bjorn Helgaas @ 2016-05-14 9:28 ` Martin Mares 0 siblings, 0 replies; 7+ messages in thread From: Martin Mares @ 2016-05-14 9:28 UTC (permalink / raw) To: Bjorn Helgaas Cc: Sean O. Stalley, linux-pci, bhelgaas, alex.williamson, david.daney Hi Bjorn, sorry for the delay, I was too busy with rebuilding my house :) > > ex: a 2000 byte region should display [size=2000] instead of [size=1K] > > What do you think of this? I don't object to the kernel PCI part of > it, but I don't want to apply it unless you plan to make lspci make > use of it. I like it. Applied to pciutils.git. Have a nice fortnight -- Martin `MJ' Mares <mj@ucw.cz> http://mj.ucw.cz/ Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth Nothing is smiple enough to be not screwed up. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-05-16 22:07 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-02-12 0:52 [PATCH v4 0/2] pci/lspci: Identify Enhanced Allocation (EA) Resources Sean O. Stalley 2016-02-12 0:52 ` [PATCH v4 1/2] pci: Identify Enhanced Allocation (EA) BAR Equivalent resources Sean O. Stalley 2016-05-16 20:31 ` Bjorn Helgaas 2016-05-16 22:07 ` Stalley, Sean 2016-02-12 0:52 ` [PATCH v4 2/2] Add support for enhanced allocation regions Sean O. Stalley 2016-04-10 22:22 ` Bjorn Helgaas 2016-05-14 9:28 ` Martin Mares
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).