Commit 3de0ef8d authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next

Pull x86/UV changes from Ingo Molnar:
 "Continued updates for SGI UV 3 hardware support"

* 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/UV: Fix conditional in gru_exit()
  x86/UV: Set n_lshift based on GAM_GR_CONFIG MMR for UV3
parents 06b77b97 fe455b17
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* SGI UV architectural definitions * SGI UV architectural definitions
* *
* Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2007-2014 Silicon Graphics, Inc. All rights reserved.
*/ */
#ifndef _ASM_X86_UV_UV_HUB_H #ifndef _ASM_X86_UV_UV_HUB_H
...@@ -204,16 +204,6 @@ static inline int is_uvx_hub(void) ...@@ -204,16 +204,6 @@ static inline int is_uvx_hub(void)
return uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE; return uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE;
} }
static inline int is_uv2_1_hub(void)
{
return uv_hub_info->hub_revision == UV2_HUB_REVISION_BASE;
}
static inline int is_uv2_2_hub(void)
{
return uv_hub_info->hub_revision == UV2_HUB_REVISION_BASE + 1;
}
union uvh_apicid { union uvh_apicid {
unsigned long v; unsigned long v;
struct uvh_apicid_s { struct uvh_apicid_s {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* SGI UV MMR definitions * SGI UV MMR definitions
* *
* Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2007-2014 Silicon Graphics, Inc. All rights reserved.
*/ */
#ifndef _ASM_X86_UV_UV_MMRS_H #ifndef _ASM_X86_UV_UV_MMRS_H
...@@ -2802,6 +2802,46 @@ union uv1h_lb_target_physical_apic_id_mask_u { ...@@ -2802,6 +2802,46 @@ union uv1h_lb_target_physical_apic_id_mask_u {
} s1; } s1;
}; };
/* ========================================================================= */
/* UV3H_GR0_GAM_GR_CONFIG */
/* ========================================================================= */
#define UV3H_GR0_GAM_GR_CONFIG 0xc00028UL
#define UV3H_GR0_GAM_GR_CONFIG_M_SKT_SHFT 0
#define UV3H_GR0_GAM_GR_CONFIG_SUBSPACE_SHFT 10
#define UV3H_GR0_GAM_GR_CONFIG_M_SKT_MASK 0x000000000000003fUL
#define UV3H_GR0_GAM_GR_CONFIG_SUBSPACE_MASK 0x0000000000000400UL
union uv3h_gr0_gam_gr_config_u {
unsigned long v;
struct uv3h_gr0_gam_gr_config_s {
unsigned long m_skt:6; /* RW */
unsigned long undef_6_9:4; /* Undefined */
unsigned long subspace:1; /* RW */
unsigned long reserved:53;
} s3;
};
/* ========================================================================= */
/* UV3H_GR1_GAM_GR_CONFIG */
/* ========================================================================= */
#define UV3H_GR1_GAM_GR_CONFIG 0x1000028UL
#define UV3H_GR1_GAM_GR_CONFIG_M_SKT_SHFT 0
#define UV3H_GR1_GAM_GR_CONFIG_SUBSPACE_SHFT 10
#define UV3H_GR1_GAM_GR_CONFIG_M_SKT_MASK 0x000000000000003fUL
#define UV3H_GR1_GAM_GR_CONFIG_SUBSPACE_MASK 0x0000000000000400UL
union uv3h_gr1_gam_gr_config_u {
unsigned long v;
struct uv3h_gr1_gam_gr_config_s {
unsigned long m_skt:6; /* RW */
unsigned long undef_6_9:4; /* Undefined */
unsigned long subspace:1; /* RW */
unsigned long reserved:53;
} s3;
};
/* ========================================================================= */ /* ========================================================================= */
/* UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR */ /* UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR */
/* ========================================================================= */ /* ========================================================================= */
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* SGI UV APIC functions (note: not an Intel compatible APIC) * SGI UV APIC functions (note: not an Intel compatible APIC)
* *
* Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2007-2014 Silicon Graphics, Inc. All rights reserved.
*/ */
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/hardirq.h> #include <linux/hardirq.h>
...@@ -440,6 +440,20 @@ static __initdata struct redir_addr redir_addrs[] = { ...@@ -440,6 +440,20 @@ static __initdata struct redir_addr redir_addrs[] = {
{UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR}, {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR},
}; };
static unsigned char get_n_lshift(int m_val)
{
union uv3h_gr0_gam_gr_config_u m_gr_config;
if (is_uv1_hub())
return m_val;
if (is_uv2_hub())
return m_val == 40 ? 40 : 39;
m_gr_config.v = uv_read_local_mmr(UV3H_GR0_GAM_GR_CONFIG);
return m_gr_config.s3.m_skt;
}
static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
{ {
union uvh_rh_gam_alias210_overlay_config_2_mmr_u alias; union uvh_rh_gam_alias210_overlay_config_2_mmr_u alias;
...@@ -849,6 +863,7 @@ void __init uv_system_init(void) ...@@ -849,6 +863,7 @@ void __init uv_system_init(void)
int gnode_extra, min_pnode = 999999, max_pnode = -1; int gnode_extra, min_pnode = 999999, max_pnode = -1;
unsigned long mmr_base, present, paddr; unsigned long mmr_base, present, paddr;
unsigned short pnode_mask; unsigned short pnode_mask;
unsigned char n_lshift;
char *hub = (is_uv1_hub() ? "UV1" : char *hub = (is_uv1_hub() ? "UV1" :
(is_uv2_hub() ? "UV2" : (is_uv2_hub() ? "UV2" :
"UV3")); "UV3"));
...@@ -860,6 +875,7 @@ void __init uv_system_init(void) ...@@ -860,6 +875,7 @@ void __init uv_system_init(void)
m_val = m_n_config.s.m_skt; m_val = m_n_config.s.m_skt;
n_val = m_n_config.s.n_skt; n_val = m_n_config.s.n_skt;
pnode_mask = (1 << n_val) - 1; pnode_mask = (1 << n_val) - 1;
n_lshift = get_n_lshift(m_val);
mmr_base = mmr_base =
uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) &
~UV_MMR_ENABLE; ~UV_MMR_ENABLE;
...@@ -867,8 +883,9 @@ void __init uv_system_init(void) ...@@ -867,8 +883,9 @@ void __init uv_system_init(void)
node_id.v = uv_read_local_mmr(UVH_NODE_ID); node_id.v = uv_read_local_mmr(UVH_NODE_ID);
gnode_extra = (node_id.s.node_id & ~((1 << n_val) - 1)) >> 1; gnode_extra = (node_id.s.node_id & ~((1 << n_val) - 1)) >> 1;
gnode_upper = ((unsigned long)gnode_extra << m_val); gnode_upper = ((unsigned long)gnode_extra << m_val);
pr_info("UV: N:%d M:%d pnode_mask:0x%x gnode_upper/extra:0x%lx/0x%x\n", pr_info("UV: N:%d M:%d pnode_mask:0x%x gnode_upper/extra:0x%lx/0x%x n_lshift 0x%x\n",
n_val, m_val, pnode_mask, gnode_upper, gnode_extra); n_val, m_val, pnode_mask, gnode_upper, gnode_extra,
n_lshift);
pr_info("UV: global MMR base 0x%lx\n", mmr_base); pr_info("UV: global MMR base 0x%lx\n", mmr_base);
...@@ -935,8 +952,7 @@ void __init uv_system_init(void) ...@@ -935,8 +952,7 @@ void __init uv_system_init(void)
uv_cpu_hub_info(cpu)->hub_revision = uv_hub_info->hub_revision; uv_cpu_hub_info(cpu)->hub_revision = uv_hub_info->hub_revision;
uv_cpu_hub_info(cpu)->m_shift = 64 - m_val; uv_cpu_hub_info(cpu)->m_shift = 64 - m_val;
uv_cpu_hub_info(cpu)->n_lshift = is_uv2_1_hub() ? uv_cpu_hub_info(cpu)->n_lshift = n_lshift;
(m_val == 40 ? 40 : 39) : m_val;
pnode = uv_apicid_to_pnode(apicid); pnode = uv_apicid_to_pnode(apicid);
blade = boot_pnode_to_blade(pnode); blade = boot_pnode_to_blade(pnode);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* This file supports the user system call for file open, close, mmap, etc. * This file supports the user system call for file open, close, mmap, etc.
* This also incudes the driver initialization code. * This also incudes the driver initialization code.
* *
* Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. * Copyright (c) 2008-2014 Silicon Graphics, Inc. All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -58,6 +58,11 @@ static int max_user_cbrs, max_user_dsr_bytes; ...@@ -58,6 +58,11 @@ static int max_user_cbrs, max_user_dsr_bytes;
static struct miscdevice gru_miscdev; static struct miscdevice gru_miscdev;
static int gru_supported(void)
{
return is_uv_system() &&
(uv_hub_info->hub_revision < UV3_HUB_REVISION_BASE);
}
/* /*
* gru_vma_close * gru_vma_close
...@@ -518,7 +523,7 @@ static int __init gru_init(void) ...@@ -518,7 +523,7 @@ static int __init gru_init(void)
{ {
int ret; int ret;
if (!is_uv_system() || (is_uvx_hub() && !is_uv2_hub())) if (!gru_supported())
return 0; return 0;
#if defined CONFIG_IA64 #if defined CONFIG_IA64
...@@ -573,7 +578,7 @@ static int __init gru_init(void) ...@@ -573,7 +578,7 @@ static int __init gru_init(void)
static void __exit gru_exit(void) static void __exit gru_exit(void)
{ {
if (!is_uv_system()) if (!gru_supported())
return; return;
gru_teardown_tlb_irqs(); gru_teardown_tlb_irqs();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment