Skip to content

Commit

Permalink
x86/platform/uv: Add UV Hubbed/Hubless Proc FS Files
Browse files Browse the repository at this point in the history
Indicate to UV user utilities that UV hubless support is available on
this system via the existing /proc infterface.  The current interface is
maintained with the addition of new /proc leaves ("hubbed", "hubless",
and "oemid") that contain the specific type of UV arch this one is.

Signed-off-by: Mike Travis <mike.travis@hpe.com>
Reviewed-by: Steve Wahl <steve.wahl@hpe.com>
Reviewed-by: Dimitri Sivanich <dimitri.sivanich@hpe.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Hedi Berriche <hedi.berriche@hpe.com>
Cc: Justin Ernst <justin.ernst@hpe.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russ Anderson <russ.anderson@hpe.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20190910145840.055590900@stormcage.eag.rdlabs.hpecorp.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Mike Travis authored and Ingo Molnar committed Oct 7, 2019
1 parent 2bcf265 commit 8785968
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 1 deletion.
4 changes: 4 additions & 0 deletions arch/x86/include/asm/uv/uv.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ struct mm_struct;
#ifdef CONFIG_X86_UV
#include <linux/efi.h>

#define UV_PROC_NODE "sgi_uv"

static inline int uv(int uvtype)
{
/* uv(0) is "any" */
Expand All @@ -28,6 +30,7 @@ static inline bool is_early_uv_system(void)
return uv_systab_phys && uv_systab_phys != EFI_INVALID_TABLE_ADDR;
}
extern int is_uv_system(void);
extern int is_uv_hubbed(int uvtype);
extern int is_uv_hubless(int uvtype);
extern void uv_cpu_init(void);
extern void uv_nmi_init(void);
Expand All @@ -40,6 +43,7 @@ extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
static inline bool is_early_uv_system(void) { return 0; }
static inline int is_uv_system(void) { return 0; }
static inline int is_uv_hubbed(int uv) { return 0; }
static inline int is_uv_hubless(int uv) { return 0; }
static inline void uv_cpu_init(void) { }
static inline void uv_system_init(void) { }
Expand Down
93 changes: 92 additions & 1 deletion arch/x86/kernel/apic/x2apic_uv_x.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
static DEFINE_PER_CPU(int, x2apic_extra_bits);

static enum uv_system_type uv_system_type;
static int uv_hubbed_system;
static int uv_hubless_system;
static u64 gru_start_paddr, gru_end_paddr;
static u64 gru_dist_base, gru_first_node_paddr = -1LL, gru_last_node_paddr;
Expand Down Expand Up @@ -309,6 +310,24 @@ static int __init uv_acpi_madt_oem_check(char *_oem_id, char *_oem_table_id)
if (uv_hub_info->hub_revision == 0)
goto badbios;

switch (uv_hub_info->hub_revision) {
case UV4_HUB_REVISION_BASE:
uv_hubbed_system = 0x11;
break;

case UV3_HUB_REVISION_BASE:
uv_hubbed_system = 0x9;
break;

case UV2_HUB_REVISION_BASE:
uv_hubbed_system = 0x5;
break;

case UV1_HUB_REVISION_BASE:
uv_hubbed_system = 0x3;
break;
}

pnodeid = early_get_pnodeid();
early_get_apic_socketid_shift();

Expand Down Expand Up @@ -359,6 +378,12 @@ int is_uv_system(void)
}
EXPORT_SYMBOL_GPL(is_uv_system);

int is_uv_hubbed(int uvtype)
{
return (uv_hubbed_system & uvtype);
}
EXPORT_SYMBOL_GPL(is_uv_hubbed);

int is_uv_hubless(int uvtype)
{
return (uv_hubless_system & uvtype);
Expand Down Expand Up @@ -1457,6 +1482,68 @@ static void __init build_socket_tables(void)
}
}

/* Setup user proc fs files */
static int proc_hubbed_show(struct seq_file *file, void *data)
{
seq_printf(file, "0x%x\n", uv_hubbed_system);
return 0;
}

static int proc_hubless_show(struct seq_file *file, void *data)
{
seq_printf(file, "0x%x\n", uv_hubless_system);
return 0;
}

static int proc_oemid_show(struct seq_file *file, void *data)
{
seq_printf(file, "%s/%s\n", oem_id, oem_table_id);
return 0;
}

static int proc_hubbed_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_hubbed_show, (void *)NULL);
}

static int proc_hubless_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_hubless_show, (void *)NULL);
}

static int proc_oemid_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_oemid_show, (void *)NULL);
}

/* (struct is "non-const" as open function is set at runtime) */
static struct file_operations proc_version_fops = {
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};

static const struct file_operations proc_oemid_fops = {
.open = proc_oemid_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};

static __init void uv_setup_proc_files(int hubless)
{
struct proc_dir_entry *pde;
char *name = hubless ? "hubless" : "hubbed";

pde = proc_mkdir(UV_PROC_NODE, NULL);
proc_create("oemid", 0, pde, &proc_oemid_fops);
proc_create(name, 0, pde, &proc_version_fops);
if (hubless)
proc_version_fops.open = proc_hubless_open;
else
proc_version_fops.open = proc_hubbed_open;
}

/* Initialize UV hubless systems */
static __init int uv_system_init_hubless(void)
{
Expand All @@ -1468,6 +1555,10 @@ static __init int uv_system_init_hubless(void)
/* Init kernel/BIOS interface */
rc = uv_bios_init();

/* Create user access node if UVsystab available */
if (rc >= 0)
uv_setup_proc_files(1);

return rc;
}

Expand Down Expand Up @@ -1596,7 +1687,7 @@ static void __init uv_system_init_hub(void)
uv_nmi_setup();
uv_cpu_init();
uv_scir_register_cpu_notifier();
proc_mkdir("sgi_uv", NULL);
uv_setup_proc_files(0);

/* Register Legacy VGA I/O redirection handler: */
pci_register_set_vga_state(uv_set_vga_state);
Expand Down

0 comments on commit 8785968

Please sign in to comment.