Commit 647128f1 authored by Mike Travis's avatar Mike Travis Committed by Borislav Petkov

x86/platform/uv: Update UV MMRs for UV5

Update UV MMRs in uv_mmrs.h for UV5 based on Verilog output from the
UV Hub hardware design files.  This is the next UV architecture with
a new class (UVY) being defined for 52 bit physical address masks.
Uses a bitmask for UV arch identification so a single test can cover
multiple versions.  Includes other adjustments to match the uv_mmrs.h
file to keep from encountering compile errors.  New UV5 functionality
is added in the patches that follow.

[ Fix W=1 build warnings. ]
Reported-by: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarMike Travis <mike.travis@hpe.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarSteve Wahl <steve.wahl@hpe.com>
Link: https://lkml.kernel.org/r/20201005203929.148656-5-mike.travis@hpe.com
parent 788b66e3
...@@ -144,6 +144,8 @@ struct uv_gam_range_s { ...@@ -144,6 +144,8 @@ struct uv_gam_range_s {
* available in the L3 cache on the cpu socket for the node. * available in the L3 cache on the cpu socket for the node.
*/ */
struct uv_hub_info_s { struct uv_hub_info_s {
unsigned int hub_type;
unsigned char hub_revision;
unsigned long global_mmr_base; unsigned long global_mmr_base;
unsigned long global_mmr_shift; unsigned long global_mmr_shift;
unsigned long gpa_mask; unsigned long gpa_mask;
...@@ -156,7 +158,6 @@ struct uv_hub_info_s { ...@@ -156,7 +158,6 @@ struct uv_hub_info_s {
unsigned char m_val; unsigned char m_val;
unsigned char n_val; unsigned char n_val;
unsigned char gr_table_len; unsigned char gr_table_len;
unsigned char hub_revision;
unsigned char apic_pnode_shift; unsigned char apic_pnode_shift;
unsigned char gpa_shift; unsigned char gpa_shift;
unsigned char m_shift; unsigned char m_shift;
...@@ -205,6 +206,17 @@ static inline struct uv_hub_info_s *uv_cpu_hub_info(int cpu) ...@@ -205,6 +206,17 @@ static inline struct uv_hub_info_s *uv_cpu_hub_info(int cpu)
return (struct uv_hub_info_s *)uv_cpu_info_per(cpu)->p_uv_hub_info; return (struct uv_hub_info_s *)uv_cpu_info_per(cpu)->p_uv_hub_info;
} }
static inline int uv_hub_type(void)
{
return uv_hub_info->hub_type;
}
static inline __init void uv_hub_type_set(int uvmask)
{
uv_hub_info->hub_type = uvmask;
}
/* /*
* HUB revision ranges for each UV HUB architecture. * HUB revision ranges for each UV HUB architecture.
* This is a software convention - NOT the hardware revision numbers in * This is a software convention - NOT the hardware revision numbers in
...@@ -215,38 +227,29 @@ static inline struct uv_hub_info_s *uv_cpu_hub_info(int cpu) ...@@ -215,38 +227,29 @@ static inline struct uv_hub_info_s *uv_cpu_hub_info(int cpu)
#define UV4_HUB_REVISION_BASE 7 #define UV4_HUB_REVISION_BASE 7
#define UV4A_HUB_REVISION_BASE 8 /* UV4 (fixed) rev 2 */ #define UV4A_HUB_REVISION_BASE 8 /* UV4 (fixed) rev 2 */
static inline int is_uv2_hub(void) static inline int is_uv(int uvmask) { return uv_hub_type() & uvmask; }
{ static inline int is_uv1_hub(void) { return 0; }
return is_uv_hubbed(uv(2)); static inline int is_uv2_hub(void) { return is_uv(UV2); }
} static inline int is_uv3_hub(void) { return is_uv(UV3); }
static inline int is_uv4a_hub(void) { return is_uv(UV4A); }
static inline int is_uv3_hub(void) static inline int is_uv4_hub(void) { return is_uv(UV4); }
{ static inline int is_uv5_hub(void) { return 0; }
return is_uv_hubbed(uv(3));
}
/* First test "is UV4A", then "is UV4" */ /*
static inline int is_uv4a_hub(void) * UV4A is a revision of UV4. So on UV4A, both is_uv4_hub() and
{ * is_uv4a_hub() return true, While on UV4, only is_uv4_hub()
if (is_uv_hubbed(uv(4))) * returns true. So to get true results, first test if is UV4A,
return (uv_hub_info->hub_revision == UV4A_HUB_REVISION_BASE); * then test if is UV4.
return 0; */
}
static inline int is_uv4_hub(void) /* UVX class: UV2,3,4 */
{ static inline int is_uvx_hub(void) { return is_uv(UVX); }
return is_uv_hubbed(uv(4));
}
static inline int is_uvx_hub(void) /* UVY class: UV5,..? */
{ static inline int is_uvy_hub(void) { return 0; }
return (is_uv_hubbed(-2) >= uv(2));
}
static inline int is_uv_hub(void) /* Any UV Hubbed System */
{ static inline int is_uv_hub(void) { return is_uv(UV_ANY); }
return is_uvx_hub();
}
union uvh_apicid { union uvh_apicid {
unsigned long v; unsigned long v;
......
This diff is collapsed.
This diff is collapsed.
...@@ -84,10 +84,8 @@ static void uv_rtc_send_IPI(int cpu) ...@@ -84,10 +84,8 @@ static void uv_rtc_send_IPI(int cpu)
/* Check for an RTC interrupt pending */ /* Check for an RTC interrupt pending */
static int uv_intr_pending(int pnode) static int uv_intr_pending(int pnode)
{ {
if (is_uvx_hub()) return uv_read_global_mmr64(pnode, UVH_EVENT_OCCURRED2) &
return uv_read_global_mmr64(pnode, UVXH_EVENT_OCCURRED2) & UVH_EVENT_OCCURRED2_RTC_1_MASK;
UVXH_EVENT_OCCURRED2_RTC_1_MASK;
return 0;
} }
/* Setup interrupt and return non-zero if early expiration occurred. */ /* Setup interrupt and return non-zero if early expiration occurred. */
...@@ -101,8 +99,8 @@ static int uv_setup_intr(int cpu, u64 expires) ...@@ -101,8 +99,8 @@ static int uv_setup_intr(int cpu, u64 expires)
UVH_RTC1_INT_CONFIG_M_MASK); UVH_RTC1_INT_CONFIG_M_MASK);
uv_write_global_mmr64(pnode, UVH_INT_CMPB, -1L); uv_write_global_mmr64(pnode, UVH_INT_CMPB, -1L);
uv_write_global_mmr64(pnode, UVXH_EVENT_OCCURRED2_ALIAS, uv_write_global_mmr64(pnode, UVH_EVENT_OCCURRED2_ALIAS,
UVXH_EVENT_OCCURRED2_RTC_1_MASK); UVH_EVENT_OCCURRED2_RTC_1_MASK);
val = (X86_PLATFORM_IPI_VECTOR << UVH_RTC1_INT_CONFIG_VECTOR_SHFT) | val = (X86_PLATFORM_IPI_VECTOR << UVH_RTC1_INT_CONFIG_VECTOR_SHFT) |
((u64)apicid << UVH_RTC1_INT_CONFIG_APIC_ID_SHFT); ((u64)apicid << UVH_RTC1_INT_CONFIG_APIC_ID_SHFT);
......
...@@ -516,7 +516,7 @@ static int __init gru_init(void) ...@@ -516,7 +516,7 @@ static int __init gru_init(void)
#if defined CONFIG_IA64 #if defined CONFIG_IA64
gru_start_paddr = 0xd000000000UL; /* ZZZZZZZZZZZZZZZZZZZ fixme */ gru_start_paddr = 0xd000000000UL; /* ZZZZZZZZZZZZZZZZZZZ fixme */
#else #else
gru_start_paddr = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR) & gru_start_paddr = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG) &
0x7fffffffffffUL; 0x7fffffffffffUL;
#endif #endif
gru_start_vaddr = __va(gru_start_paddr); gru_start_vaddr = __va(gru_start_paddr);
......
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