.. | .. |
---|
8 | 8 | * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. |
---|
9 | 9 | */ |
---|
10 | 10 | |
---|
| 11 | +#include <linux/acpi.h> |
---|
| 12 | +#include <linux/efi.h> |
---|
11 | 13 | #include <linux/module.h> |
---|
12 | 14 | #include <linux/percpu.h> |
---|
13 | | -#include <asm/sn/simulator.h> |
---|
| 15 | +#include <asm/uv/uv.h> |
---|
14 | 16 | #include <asm/uv/uv_mmrs.h> |
---|
15 | 17 | #include <asm/uv/uv_hub.h> |
---|
16 | 18 | |
---|
| 19 | +bool ia64_is_uv; |
---|
| 20 | +EXPORT_SYMBOL_GPL(ia64_is_uv); |
---|
| 21 | + |
---|
17 | 22 | DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); |
---|
18 | 23 | EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info); |
---|
19 | | - |
---|
20 | | -#ifdef CONFIG_IA64_SGI_UV |
---|
21 | | -int sn_prom_type; |
---|
22 | | -long sn_partition_id; |
---|
23 | | -EXPORT_SYMBOL(sn_partition_id); |
---|
24 | | -long sn_coherency_id; |
---|
25 | | -EXPORT_SYMBOL_GPL(sn_coherency_id); |
---|
26 | | -long sn_region_size; |
---|
27 | | -EXPORT_SYMBOL(sn_region_size); |
---|
28 | | -#endif |
---|
29 | 24 | |
---|
30 | 25 | struct redir_addr { |
---|
31 | 26 | unsigned long redirect; |
---|
.. | .. |
---|
58 | 53 | BUG(); |
---|
59 | 54 | } |
---|
60 | 55 | |
---|
| 56 | +void __init uv_probe_system_type(void) |
---|
| 57 | +{ |
---|
| 58 | + struct acpi_table_rsdp *rsdp; |
---|
| 59 | + struct acpi_table_xsdt *xsdt; |
---|
| 60 | + |
---|
| 61 | + if (efi.acpi20 == EFI_INVALID_TABLE_ADDR) { |
---|
| 62 | + pr_err("ACPI 2.0 RSDP not found.\n"); |
---|
| 63 | + return; |
---|
| 64 | + } |
---|
| 65 | + |
---|
| 66 | + rsdp = (struct acpi_table_rsdp *)__va(efi.acpi20); |
---|
| 67 | + if (strncmp(rsdp->signature, ACPI_SIG_RSDP, sizeof(ACPI_SIG_RSDP) - 1)) { |
---|
| 68 | + pr_err("ACPI 2.0 RSDP signature incorrect.\n"); |
---|
| 69 | + return; |
---|
| 70 | + } |
---|
| 71 | + |
---|
| 72 | + xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_physical_address); |
---|
| 73 | + if (strncmp(xsdt->header.signature, ACPI_SIG_XSDT, |
---|
| 74 | + sizeof(ACPI_SIG_XSDT) - 1)) { |
---|
| 75 | + pr_err("ACPI 2.0 XSDT signature incorrect.\n"); |
---|
| 76 | + return; |
---|
| 77 | + } |
---|
| 78 | + |
---|
| 79 | + if (!strcmp(xsdt->header.oem_id, "SGI") && |
---|
| 80 | + !strcmp(xsdt->header.oem_table_id + 4, "UV")) |
---|
| 81 | + ia64_is_uv = true; |
---|
| 82 | +} |
---|
| 83 | + |
---|
61 | 84 | void __init uv_setup(char **cmdline_p) |
---|
62 | 85 | { |
---|
63 | 86 | union uvh_si_addr_map_config_u m_n_config; |
---|
.. | .. |
---|
66 | 89 | int nid, cpu, m_val, n_val; |
---|
67 | 90 | unsigned long mmr_base, lowmem_redir_base, lowmem_redir_size; |
---|
68 | 91 | |
---|
69 | | - if (IS_MEDUSA()) { |
---|
70 | | - lowmem_redir_base = 0; |
---|
71 | | - lowmem_redir_size = 0; |
---|
72 | | - node_id.v = 0; |
---|
73 | | - m_n_config.s.m_skt = 37; |
---|
74 | | - m_n_config.s.n_skt = 0; |
---|
75 | | - mmr_base = 0; |
---|
76 | | -#if 0 |
---|
77 | | - /* Need BIOS calls - TDB */ |
---|
78 | | - if (!ia64_sn_is_fake_prom()) |
---|
79 | | - sn_prom_type = 1; |
---|
80 | | - else |
---|
81 | | -#endif |
---|
82 | | - sn_prom_type = 2; |
---|
83 | | - printk(KERN_INFO "Running on medusa with %s PROM\n", |
---|
84 | | - (sn_prom_type == 1) ? "real" : "fake"); |
---|
85 | | - } else { |
---|
86 | | - get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); |
---|
87 | | - node_id.v = uv_read_local_mmr(UVH_NODE_ID); |
---|
88 | | - m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); |
---|
89 | | - mmr_base = |
---|
90 | | - uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & |
---|
91 | | - ~UV_MMR_ENABLE; |
---|
92 | | - } |
---|
| 92 | + get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); |
---|
| 93 | + node_id.v = uv_read_local_mmr(UVH_NODE_ID); |
---|
| 94 | + m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); |
---|
| 95 | + mmr_base = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & |
---|
| 96 | + ~UV_MMR_ENABLE; |
---|
93 | 97 | |
---|
94 | 98 | m_val = m_n_config.s.m_skt; |
---|
95 | 99 | n_val = m_n_config.s.n_skt; |
---|