2020-11-18 16:51:56

by Ernst, Justin

[permalink] [raw]
Subject: [PATCH v2 0/5] Add uv_sysfs platform driver

Introduce a new platform driver to gather topology information from UV systems
and expose that information via a sysfs interface at /sys/firmware/sgi_uv/.

This is version 2 with these changes since version 1:

* Re-introduced /sys/firmware/sgi_uv/coherence_id file in the new driver after
removing it in Patch 1/5. This keeps the userspace API unbroken.

Justin Ernst (5):
x86/platform/uv: Remove existing /sys/firmware/sgi_uv/ interface
x86/platform/uv: Add and export uv_bios_* functions
x86/platform/uv: Add new uv_sysfs platform driver
x86/platform/uv: Update ABI documentation of /sys/firmware/sgi_uv/
x86/platform/uv: Update MAINTAINERS for uv_sysfs driver

.../ABI/testing/sysfs-firmware-sgi_uv | 141 ++-
MAINTAINERS | 6 +
arch/x86/include/asm/uv/bios.h | 49 +
arch/x86/include/asm/uv/uv_geo.h | 103 +++
arch/x86/platform/uv/Makefile | 2 +-
arch/x86/platform/uv/bios_uv.c | 54 ++
arch/x86/platform/uv/uv_sysfs.c | 63 --
drivers/platform/x86/Kconfig | 11 +
drivers/platform/x86/Makefile | 3 +
drivers/platform/x86/uv_sysfs.c | 862 ++++++++++++++++++
10 files changed, 1216 insertions(+), 78 deletions(-)
create mode 100644 arch/x86/include/asm/uv/uv_geo.h
delete mode 100644 arch/x86/platform/uv/uv_sysfs.c
create mode 100644 drivers/platform/x86/uv_sysfs.c


base-commit: 4ef8451b332662d004df269d4cdeb7d9f31419b5
--
2.26.2


2020-11-18 16:52:01

by Ernst, Justin

[permalink] [raw]
Subject: [PATCH v2 2/5] x86/platform/uv: Add and export uv_bios_* functions

Add additional uv_bios_call variant functions to expose information
needed by the new uv_sysfs driver. This includes the addition of several
new data types defined by UV BIOS and used in the new functions.

Signed-off-by: Justin Ernst <[email protected]>
Reviewed-by: Steve Wahl <[email protected]>
---
arch/x86/include/asm/uv/bios.h | 49 +++++++++++++++
arch/x86/include/asm/uv/uv_geo.h | 103 +++++++++++++++++++++++++++++++
arch/x86/platform/uv/bios_uv.c | 54 ++++++++++++++++
3 files changed, 206 insertions(+)
create mode 100644 arch/x86/include/asm/uv/uv_geo.h

diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h
index 08b3d810dfba..01ba080887b3 100644
--- a/arch/x86/include/asm/uv/bios.h
+++ b/arch/x86/include/asm/uv/bios.h
@@ -28,6 +28,20 @@ enum uv_bios_cmd {
UV_BIOS_SET_LEGACY_VGA_TARGET
};

+#define UV_BIOS_EXTRA 0x10000
+#define UV_BIOS_GET_PCI_TOPOLOGY 0x10001
+#define UV_BIOS_GET_GEOINFO 0x10003
+
+#define UV_BIOS_EXTRA_OP_MEM_COPYIN 0x1000
+#define UV_BIOS_EXTRA_OP_MEM_COPYOUT 0x2000
+#define UV_BIOS_EXTRA_OP_MASK 0x0fff
+#define UV_BIOS_EXTRA_GET_HEAPSIZE 1
+#define UV_BIOS_EXTRA_INSTALL_HEAP 2
+#define UV_BIOS_EXTRA_MASTER_NASID 3
+#define UV_BIOS_EXTRA_OBJECT_COUNT (10|UV_BIOS_EXTRA_OP_MEM_COPYOUT)
+#define UV_BIOS_EXTRA_ENUM_OBJECTS (12|UV_BIOS_EXTRA_OP_MEM_COPYOUT)
+#define UV_BIOS_EXTRA_ENUM_PORTS (13|UV_BIOS_EXTRA_OP_MEM_COPYOUT)
+
/*
* Status values returned from a BIOS call.
*/
@@ -109,6 +123,32 @@ struct uv_systab {
} entry[1]; /* additional entries follow */
};
extern struct uv_systab *uv_systab;
+
+#define UV_BIOS_MAXSTRING 128
+struct uv_bios_hub_info {
+ unsigned int id;
+ union {
+ struct {
+ unsigned long long this_part:1;
+ unsigned long long is_shared:1;
+ unsigned long long is_disabled:1;
+ } fields;
+ struct {
+ unsigned long long flags;
+ unsigned long long reserved;
+ } b;
+ } f;
+ char name[UV_BIOS_MAXSTRING];
+ char location[UV_BIOS_MAXSTRING];
+ unsigned int ports;
+};
+
+struct uv_bios_port_info {
+ unsigned int port;
+ unsigned int conn_id;
+ unsigned int conn_port;
+};
+
/* (... end of definitions from UV BIOS ...) */

enum {
@@ -142,6 +182,15 @@ extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);
extern s64 uv_bios_reserved_page_pa(u64, u64 *, u64 *, u64 *);
extern int uv_bios_set_legacy_vga_target(bool decode, int domain, int bus);

+extern s64 uv_bios_get_master_nasid(u64 sz, u64 *nasid);
+extern s64 uv_bios_get_heapsize(u64 nasid, u64 sz, u64 *heap_sz);
+extern s64 uv_bios_install_heap(u64 nasid, u64 sz, u64 *heap);
+extern s64 uv_bios_obj_count(u64 nasid, u64 sz, u64 *objcnt);
+extern s64 uv_bios_enum_objs(u64 nasid, u64 sz, u64 *objbuf);
+extern s64 uv_bios_enum_ports(u64 nasid, u64 obj_id, u64 sz, u64 *portbuf);
+extern s64 uv_bios_get_geoinfo(u64 nasid, u64 sz, u64 *geo);
+extern s64 uv_bios_get_pci_topology(u64 sz, u64 *buf);
+
extern int uv_bios_init(void);
extern unsigned long get_uv_systab_phys(bool msg);

diff --git a/arch/x86/include/asm/uv/uv_geo.h b/arch/x86/include/asm/uv/uv_geo.h
new file mode 100644
index 000000000000..f241451035fb
--- /dev/null
+++ b/arch/x86/include/asm/uv/uv_geo.h
@@ -0,0 +1,103 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2020 Hewlett Packard Enterprise Development LP. All rights reserved.
+ */
+
+#ifndef _ASM_UV_GEO_H
+#define _ASM_UV_GEO_H
+
+/* Type declaractions */
+
+/* Size of a geoid_s structure (must be before decl. of geoid_u) */
+#define GEOID_SIZE 8
+
+/* Fields common to all substructures */
+struct geo_common_s {
+ unsigned char type; /* What type of h/w is named by this geoid_s */
+ unsigned char blade;
+ unsigned char slot; /* slot is IRU */
+ unsigned char upos;
+ unsigned char rack;
+};
+
+/* Additional fields for particular types of hardware */
+struct geo_node_s {
+ struct geo_common_s common; /* No additional fields needed */
+};
+
+struct geo_rtr_s {
+ struct geo_common_s common; /* No additional fields needed */
+};
+
+struct geo_iocntl_s {
+ struct geo_common_s common; /* No additional fields needed */
+};
+
+struct geo_pcicard_s {
+ struct geo_iocntl_s common;
+ char bus; /* Bus/widget number */
+ char slot; /* PCI slot number */
+};
+
+/* Subcomponents of a node */
+struct geo_cpu_s {
+ struct geo_node_s node;
+ unsigned char socket:4, /* Which CPU on the node */
+ thread:4;
+ unsigned char core;
+};
+
+struct geo_mem_s {
+ struct geo_node_s node;
+ char membus; /* The memory bus on the node */
+ char memslot; /* The memory slot on the bus */
+};
+
+union geoid_u {
+ struct geo_common_s common;
+ struct geo_node_s node;
+ struct geo_iocntl_s iocntl;
+ struct geo_pcicard_s pcicard;
+ struct geo_rtr_s rtr;
+ struct geo_cpu_s cpu;
+ struct geo_mem_s mem;
+ char padsize[GEOID_SIZE];
+};
+
+/* Defined constants */
+
+#define GEO_MAX_LEN 48
+
+#define GEO_TYPE_INVALID 0
+#define GEO_TYPE_MODULE 1
+#define GEO_TYPE_NODE 2
+#define GEO_TYPE_RTR 3
+#define GEO_TYPE_IOCNTL 4
+#define GEO_TYPE_IOCARD 5
+#define GEO_TYPE_CPU 6
+#define GEO_TYPE_MEM 7
+#define GEO_TYPE_MAX (GEO_TYPE_MEM+1)
+
+static inline int geo_rack(union geoid_u g)
+{
+ return (g.common.type == GEO_TYPE_INVALID) ?
+ -1 : g.common.rack;
+}
+
+static inline int geo_slot(union geoid_u g)
+{
+ return (g.common.type == GEO_TYPE_INVALID) ?
+ -1 : g.common.upos;
+}
+
+static inline int geo_blade(union geoid_u g)
+{
+ return (g.common.type == GEO_TYPE_INVALID) ?
+ -1 : g.common.blade * 2 + g.common.slot;
+}
+
+#endif /* _ASM_UV_GEO_H */
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
index 54511eaccf4d..7f4c5e32c1ca 100644
--- a/arch/x86/platform/uv/bios_uv.c
+++ b/arch/x86/platform/uv/bios_uv.c
@@ -171,6 +171,60 @@ int uv_bios_set_legacy_vga_target(bool decode, int domain, int bus)
(u64)decode, (u64)domain, (u64)bus, 0, 0);
}

+extern s64 uv_bios_get_master_nasid(u64 size, u64 *master_nasid)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, 0, UV_BIOS_EXTRA_MASTER_NASID, 0,
+ size, (u64)master_nasid);
+}
+EXPORT_SYMBOL_GPL(uv_bios_get_master_nasid);
+
+extern s64 uv_bios_get_heapsize(u64 nasid, u64 size, u64 *heap_size)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, nasid, UV_BIOS_EXTRA_GET_HEAPSIZE,
+ 0, size, (u64)heap_size);
+}
+EXPORT_SYMBOL_GPL(uv_bios_get_heapsize);
+
+extern s64 uv_bios_install_heap(u64 nasid, u64 heap_size, u64 *bios_heap)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, nasid, UV_BIOS_EXTRA_INSTALL_HEAP,
+ 0, heap_size, (u64)bios_heap);
+}
+EXPORT_SYMBOL_GPL(uv_bios_install_heap);
+
+extern s64 uv_bios_obj_count(u64 nasid, u64 size, u64 *objcnt)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, nasid, UV_BIOS_EXTRA_OBJECT_COUNT,
+ 0, size, (u64)objcnt);
+}
+EXPORT_SYMBOL_GPL(uv_bios_obj_count);
+
+extern s64 uv_bios_enum_objs(u64 nasid, u64 size, u64 *objbuf)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, nasid, UV_BIOS_EXTRA_ENUM_OBJECTS,
+ 0, size, (u64)objbuf);
+}
+EXPORT_SYMBOL_GPL(uv_bios_enum_objs);
+
+extern s64 uv_bios_enum_ports(u64 nasid, u64 obj_id, u64 size, u64 *portbuf)
+{
+ return uv_bios_call(UV_BIOS_EXTRA, nasid, UV_BIOS_EXTRA_ENUM_PORTS,
+ obj_id, size, (u64)portbuf);
+}
+EXPORT_SYMBOL_GPL(uv_bios_enum_ports);
+
+extern s64 uv_bios_get_geoinfo(u64 nasid, u64 size, u64 *buf)
+{
+ return uv_bios_call(UV_BIOS_GET_GEOINFO, nasid, (u64)buf, size, 0, 0);
+}
+EXPORT_SYMBOL_GPL(uv_bios_get_geoinfo);
+
+extern s64 uv_bios_get_pci_topology(u64 size, u64 *buf)
+{
+ return uv_bios_call(UV_BIOS_GET_PCI_TOPOLOGY, (u64)buf, size, 0, 0, 0);
+}
+EXPORT_SYMBOL_GPL(uv_bios_get_pci_topology);
+
unsigned long get_uv_systab_phys(bool msg)
{
if ((uv_systab_phys == EFI_INVALID_TABLE_ADDR) ||
--
2.26.2

2020-11-24 21:29:07

by Hans de Goede

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] Add uv_sysfs platform driver

Hi,

Quick self intro for the x86/tip maintainers: I have take over
drivers/platform/x86 maintainership from Andy.

On 11/18/20 5:47 PM, Justin Ernst wrote:
> Introduce a new platform driver to gather topology information from UV systems
> and expose that information via a sysfs interface at /sys/firmware/sgi_uv/.
>
> This is version 2 with these changes since version 1:
>
> * Re-introduced /sys/firmware/sgi_uv/coherence_id file in the new driver after
> removing it in Patch 1/5. This keeps the userspace API unbroken.
>
> Justin Ernst (5):
> x86/platform/uv: Remove existing /sys/firmware/sgi_uv/ interface
> x86/platform/uv: Add and export uv_bios_* functions
> x86/platform/uv: Add new uv_sysfs platform driver
> x86/platform/uv: Update ABI documentation of /sys/firmware/sgi_uv/
> x86/platform/uv: Update MAINTAINERS for uv_sysfs driver>
> .../ABI/testing/sysfs-firmware-sgi_uv | 141 ++-
> MAINTAINERS | 6 +
> arch/x86/include/asm/uv/bios.h | 49 +
> arch/x86/include/asm/uv/uv_geo.h | 103 +++
> arch/x86/platform/uv/Makefile | 2 +-
> arch/x86/platform/uv/bios_uv.c | 54 ++
> arch/x86/platform/uv/uv_sysfs.c | 63 --
> drivers/platform/x86/Kconfig | 11 +
> drivers/platform/x86/Makefile | 3 +
> drivers/platform/x86/uv_sysfs.c | 862 ++++++++++++++++++
> 10 files changed, 1216 insertions(+), 78 deletions(-)
> create mode 100644 arch/x86/include/asm/uv/uv_geo.h
> delete mode 100644 arch/x86/platform/uv/uv_sysfs.c
> create mode 100644 drivers/platform/x86/uv_sysfs.c

So this touches files under both arch/x86/ and drivers/platform/x86/ ,
I believe this is best merged through the x86/tip tree and I don't
expect conflicts for the drivers/platform/x86/{Kconfig,Makefile} changes.

So here is my ack for merging this series through the x86/tip tree:

Acked-by: Hans de Goede <[email protected]>

Regards,

Hans


2020-11-25 17:38:42

by Ernst, Justin

[permalink] [raw]
Subject: RE: [PATCH v2 0/5] Add uv_sysfs platform driver

Hans,
Thank you for your Ack of my patch set.

I've found a couple bugs that need fixing:

1. In my re-introduction of /sys/firmware/sgi_uv/coherence_id, I failed to export the associated sn_coherency_id variable, causing the build to fail when UV_SYSFS=m

2. A null pointer dereference in drivers/platform/x86/uv_sysfs.c:uv_ports_exit() caused by calling kobject_put() on an out of range index value.

I will be resubmitting the patch series shortly as v3.

I apologize for the hiccup.

Thanks,
Justin

> -----Original Message-----
> From: Hans de Goede [mailto:[email protected]]
> Sent: Tuesday, November 24, 2020 5:30 AM
> To: Ernst, Justin <[email protected]>; Borislav Petkov <[email protected]>; Ingo Molnar
> <[email protected]>; Mark Gross <[email protected]>; Thomas Gleixner <[email protected]>; Wahl,
> Steve <[email protected]>; [email protected]
> Cc: Andy Shevchenko <[email protected]>; Darren Hart <[email protected]>; Sivanich, Dimitri
> <[email protected]>; H . Peter Anvin <[email protected]>; Anderson, Russ <[email protected]>;
> [email protected]; [email protected]; Cezary Rojewski
> <[email protected]>; Ilya Dryomov <[email protected]>; Jonathan Cameron
> <[email protected]>; Mauro Carvalho Chehab <[email protected]>; Vaibhav Jain
> <[email protected]>
> Subject: Re: [PATCH v2 0/5] Add uv_sysfs platform driver
>
> Hi,
>
> Quick self intro for the x86/tip maintainers: I have take over
> drivers/platform/x86 maintainership from Andy.
>
> On 11/18/20 5:47 PM, Justin Ernst wrote:
> > Introduce a new platform driver to gather topology information from UV systems
> > and expose that information via a sysfs interface at /sys/firmware/sgi_uv/.
> >
> > This is version 2 with these changes since version 1:
> >
> > * Re-introduced /sys/firmware/sgi_uv/coherence_id file in the new driver after
> > removing it in Patch 1/5. This keeps the userspace API unbroken.
> >
> > Justin Ernst (5):
> > x86/platform/uv: Remove existing /sys/firmware/sgi_uv/ interface
> > x86/platform/uv: Add and export uv_bios_* functions
> > x86/platform/uv: Add new uv_sysfs platform driver
> > x86/platform/uv: Update ABI documentation of /sys/firmware/sgi_uv/
> > x86/platform/uv: Update MAINTAINERS for uv_sysfs driver>
> > .../ABI/testing/sysfs-firmware-sgi_uv | 141 ++-
> > MAINTAINERS | 6 +
> > arch/x86/include/asm/uv/bios.h | 49 +
> > arch/x86/include/asm/uv/uv_geo.h | 103 +++
> > arch/x86/platform/uv/Makefile | 2 +-
> > arch/x86/platform/uv/bios_uv.c | 54 ++
> > arch/x86/platform/uv/uv_sysfs.c | 63 --
> > drivers/platform/x86/Kconfig | 11 +
> > drivers/platform/x86/Makefile | 3 +
> > drivers/platform/x86/uv_sysfs.c | 862 ++++++++++++++++++
> > 10 files changed, 1216 insertions(+), 78 deletions(-)
> > create mode 100644 arch/x86/include/asm/uv/uv_geo.h
> > delete mode 100644 arch/x86/platform/uv/uv_sysfs.c
> > create mode 100644 drivers/platform/x86/uv_sysfs.c
>
> So this touches files under both arch/x86/ and drivers/platform/x86/ ,
> I believe this is best merged through the x86/tip tree and I don't
> expect conflicts for the drivers/platform/x86/{Kconfig,Makefile} changes.
>
> So here is my ack for merging this series through the x86/tip tree:
>
> Acked-by: Hans de Goede <[email protected]>
>
> Regards,
>
> Hans
>