1/* 2 * Written by: Patricia Gaughen, IBM Corporation 3 * 4 * Copyright (C) 2002, IBM Corp. 5 * 6 * All rights reserved. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 16 * NON INFRINGEMENT. See the GNU General Public License for more 17 * details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 * 23 * Send feedback to <gone@us.ibm.com> 24 */ 25 26#include <linux/mm.h> 27#include <linux/bootmem.h> 28#include <linux/mmzone.h> 29#include <linux/module.h> 30#include <linux/nodemask.h> 31#include <asm/numaq.h> 32#include <asm/topology.h> 33#include <asm/processor.h> 34 35#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT)) 36 37/* 38 * Function: smp_dump_qct() 39 * 40 * Description: gets memory layout from the quad config table. This 41 * function also updates node_online_map with the nodes (quads) present. 42 */ 43static void __init smp_dump_qct(void) 44{ 45 int node; 46 struct eachquadmem *eq; 47 struct sys_cfg_data *scd = 48 (struct sys_cfg_data *)__va(SYS_CFG_DATA_PRIV_ADDR); 49 50 nodes_clear(node_online_map); 51 for_each_node(node) { 52 if (scd->quads_present31_0 & (1 << node)) { 53 node_set_online(node); 54 eq = &scd->eq[node]; 55 /* Convert to pages */ 56 node_start_pfn[node] = MB_TO_PAGES( 57 eq->hi_shrd_mem_start - eq->priv_mem_size); 58 node_end_pfn[node] = MB_TO_PAGES( 59 eq->hi_shrd_mem_start + eq->hi_shrd_mem_size); 60 61 memory_present(node, 62 node_start_pfn[node], node_end_pfn[node]); 63 node_remap_size[node] = node_memmap_size_bytes(node, 64 node_start_pfn[node], 65 node_end_pfn[node]); 66 } 67 } 68} 69 70/* 71 * Unlike Summit, we don't really care to let the NUMA-Q 72 * fall back to flat mode. Don't compile for NUMA-Q 73 * unless you really need it! 74 */ 75int __init get_memcfg_numaq(void) 76{ 77 smp_dump_qct(); 78 return 1; 79} 80 81static int __init numaq_tsc_disable(void) 82{ 83 if (num_online_nodes() > 1) { 84 printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); 85 tsc_disable = 1; 86 } 87 return 0; 88} 89arch_initcall(numaq_tsc_disable); 90