x86, uv, uv3: Update Hub Info for SGI UV3

This patch updates the UV HUB info for UV3.  The "is_uv3_hub" and
"is_uvx_hub" (UV2 or UV3) functions are added as well as the addresses
and sizes of the MMR regions for UV3.

Signed-off-by: Mike Travis <travis@sgi.com>
Link: http://lkml.kernel.org/r/20130211194508.610723192@gulag1.americas.sgi.com
Acked-by: Russ Anderson <rja@sgi.com>
Reviewed-by: Dimitri Sivanich <sivanich@sgi.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
Mike Travis 2013-02-11 13:45:11 -06:00 committed by H. Peter Anvin
parent 526018bc5e
commit 6edbd4714e

View File

@ -5,7 +5,7 @@
* *
* SGI UV architectural definitions * SGI UV architectural definitions
* *
* Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. * Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved.
*/ */
#ifndef _ASM_X86_UV_UV_HUB_H #ifndef _ASM_X86_UV_UV_HUB_H
@ -175,6 +175,7 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
*/ */
#define UV1_HUB_REVISION_BASE 1 #define UV1_HUB_REVISION_BASE 1
#define UV2_HUB_REVISION_BASE 3 #define UV2_HUB_REVISION_BASE 3
#define UV3_HUB_REVISION_BASE 5
static inline int is_uv1_hub(void) static inline int is_uv1_hub(void)
{ {
@ -182,6 +183,23 @@ static inline int is_uv1_hub(void)
} }
static inline int is_uv2_hub(void) static inline int is_uv2_hub(void)
{
return ((uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE) &&
(uv_hub_info->hub_revision < UV3_HUB_REVISION_BASE));
}
static inline int is_uv3_hub(void)
{
return uv_hub_info->hub_revision >= UV3_HUB_REVISION_BASE;
}
static inline int is_uv_hub(void)
{
return uv_hub_info->hub_revision;
}
/* code common to uv2 and uv3 only */
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;
} }
@ -230,14 +248,23 @@ union uvh_apicid {
#define UV2_LOCAL_MMR_SIZE (32UL * 1024 * 1024) #define UV2_LOCAL_MMR_SIZE (32UL * 1024 * 1024)
#define UV2_GLOBAL_MMR32_SIZE (32UL * 1024 * 1024) #define UV2_GLOBAL_MMR32_SIZE (32UL * 1024 * 1024)
#define UV_LOCAL_MMR_BASE (is_uv1_hub() ? UV1_LOCAL_MMR_BASE \ #define UV3_LOCAL_MMR_BASE 0xfa000000UL
: UV2_LOCAL_MMR_BASE) #define UV3_GLOBAL_MMR32_BASE 0xfc000000UL
#define UV_GLOBAL_MMR32_BASE (is_uv1_hub() ? UV1_GLOBAL_MMR32_BASE \ #define UV3_LOCAL_MMR_SIZE (32UL * 1024 * 1024)
: UV2_GLOBAL_MMR32_BASE) #define UV3_GLOBAL_MMR32_SIZE (32UL * 1024 * 1024)
#define UV_LOCAL_MMR_SIZE (is_uv1_hub() ? UV1_LOCAL_MMR_SIZE : \
UV2_LOCAL_MMR_SIZE) #define UV_LOCAL_MMR_BASE (is_uv1_hub() ? UV1_LOCAL_MMR_BASE : \
(is_uv2_hub() ? UV2_LOCAL_MMR_BASE : \
UV3_LOCAL_MMR_BASE))
#define UV_GLOBAL_MMR32_BASE (is_uv1_hub() ? UV1_GLOBAL_MMR32_BASE :\
(is_uv2_hub() ? UV2_GLOBAL_MMR32_BASE :\
UV3_GLOBAL_MMR32_BASE))
#define UV_LOCAL_MMR_SIZE (is_uv1_hub() ? UV1_LOCAL_MMR_SIZE : \
(is_uv2_hub() ? UV2_LOCAL_MMR_SIZE : \
UV3_LOCAL_MMR_SIZE))
#define UV_GLOBAL_MMR32_SIZE (is_uv1_hub() ? UV1_GLOBAL_MMR32_SIZE :\ #define UV_GLOBAL_MMR32_SIZE (is_uv1_hub() ? UV1_GLOBAL_MMR32_SIZE :\
UV2_GLOBAL_MMR32_SIZE) (is_uv2_hub() ? UV2_GLOBAL_MMR32_SIZE :\
UV3_GLOBAL_MMR32_SIZE))
#define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base)
#define UV_GLOBAL_GRU_MMR_BASE 0x4000000 #define UV_GLOBAL_GRU_MMR_BASE 0x4000000
@ -599,6 +626,7 @@ static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)
* 1 - UV1 rev 1.0 initial silicon * 1 - UV1 rev 1.0 initial silicon
* 2 - UV1 rev 2.0 production silicon * 2 - UV1 rev 2.0 production silicon
* 3 - UV2 rev 1.0 initial silicon * 3 - UV2 rev 1.0 initial silicon
* 5 - UV3 rev 1.0 initial silicon
*/ */
static inline int uv_get_min_hub_revision_id(void) static inline int uv_get_min_hub_revision_id(void)
{ {