| .. | .. |
|---|
| 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; |
|---|