1867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 2867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copyright 2010 Tilera Corporation. All Rights Reserved. 3867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 4867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is free software; you can redistribute it and/or 5867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * modify it under the terms of the GNU General Public License 6867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * as published by the Free Software Foundation, version 2. 7867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 8867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is distributed in the hope that it will be useful, but 9867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * WITHOUT ANY WARRANTY; without even the implied warranty of 10867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * NON INFRINGEMENT. See the GNU General Public License for 12867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * more details. 13867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 14867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 15867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef _ASM_TILE_SMP_H 16867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define _ASM_TILE_SMP_H 17867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 18867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef CONFIG_SMP 19867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 20867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <asm/processor.h> 21867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/cpumask.h> 22867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/irqreturn.h> 23fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf#include <hv/hypervisor.h> 24867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 25867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Set up this tile to support receiving hypervisor messages */ 26867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid init_messaging(void); 27867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 28867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Set up this tile to support receiving device interrupts and IPIs. */ 29867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid init_per_tile_IRQs(void); 30867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 31867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Send a message to processors specified in mask */ 32867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid send_IPI_many(const struct cpumask *mask, int tag); 33867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 34867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Send a message to all but the sending processor */ 35867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid send_IPI_allbutself(int tag); 36867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 37867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Send a message to a specific processor */ 38867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid send_IPI_single(int dest, int tag); 39867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 40867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Process an IPI message */ 41867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid evaluate_message(int tag); 42867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 43867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Boot a secondary cpu */ 44867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid online_secondary(void); 45867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 46867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Topology of the supervisor tile grid, and coordinates of boot processor */ 47867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern HV_Topology smp_topology; 48867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 49867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Accessors for grid size */ 50867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define smp_height (smp_topology.height) 51867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define smp_width (smp_topology.width) 52867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 53fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf/* Convenience functions for converting cpu <-> coords. */ 54fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalfstatic inline int cpu_x(int cpu) 55fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf{ 56fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf return cpu % smp_width; 57fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf} 58fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalfstatic inline int cpu_y(int cpu) 59fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf{ 60fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf return cpu / smp_width; 61fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf} 62fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalfstatic inline int xy_to_cpu(int x, int y) 63fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf{ 64fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf return y * smp_width + x; 65fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf} 66fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf 67867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Hypervisor message tags sent via the tile send_IPI*() routines. */ 68867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MSG_TAG_START_CPU 1 69867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MSG_TAG_STOP_CPU 2 70867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MSG_TAG_CALL_FUNCTION_MANY 3 71867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MSG_TAG_CALL_FUNCTION_SINGLE 4 72867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 73867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Hook for the generic smp_call_function_many() routine. */ 74867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void arch_send_call_function_ipi_mask(struct cpumask *mask) 75867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 76867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf send_IPI_many(mask, MSG_TAG_CALL_FUNCTION_MANY); 77867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 78867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 79867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Hook for the generic smp_call_function_single() routine. */ 80867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void arch_send_call_function_single_ipi(int cpu) 81867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 82867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf send_IPI_single(cpu, MSG_TAG_CALL_FUNCTION_SINGLE); 83867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 84867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 85867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Print out the boot string describing which cpus were disabled. */ 86867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfvoid print_disabled_cpus(void); 87867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 88867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else /* !CONFIG_SMP */ 89867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 90867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define smp_master_cpu 0 91867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define smp_height 1 92867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define smp_width 1 93fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf#define cpu_x(cpu) 0 94fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf#define cpu_y(cpu) 0 95fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf#define xy_to_cpu(x, y) 0 96867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 97867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* !CONFIG_SMP */ 98867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 99867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 100867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Which cpus may be used as the lotar in a page table entry. */ 101867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern struct cpumask cpu_lotar_map; 102867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define cpu_is_valid_lotar(cpu) cpumask_test_cpu((cpu), &cpu_lotar_map) 103867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 104867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Which processors are used for hash-for-home mapping */ 105867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern struct cpumask hash_for_home_map; 106867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 107867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Which cpus can have their cache flushed by hv_flush_remote(). */ 108867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern struct cpumask cpu_cacheable_map; 109867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define cpu_cacheable(cpu) cpumask_test_cpu((cpu), &cpu_cacheable_map) 110867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 111867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Convert an HV_LOTAR value into a cpu. */ 112867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline int hv_lotar_to_cpu(HV_LOTAR lotar) 113867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 114867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return HV_LOTAR_X(lotar) + (HV_LOTAR_Y(lotar) * smp_width); 115867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 116867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 117867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 118867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Extension of <linux/cpumask.h> functionality when you just want 119867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to express a mask or suppression or inclusion region without 120867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * being too concerned about exactly which cpus are valid in that region. 121867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 122867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfint bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits); 123867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 124867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define cpulist_parse_crop(buf, dst) \ 125867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __cpulist_parse_crop((buf), (dst), NR_CPUS) 126867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline int __cpulist_parse_crop(const char *buf, struct cpumask *dstp, 127867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int nbits) 128867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 129867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return bitmap_parselist_crop(buf, cpumask_bits(dstp), nbits); 130867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 131867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 132fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf/* Initialize the IPI subsystem. */ 133fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalfvoid ipi_init(void); 134fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf 135fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf/* Function for start-cpu message to cause us to jump to. */ 136fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalfextern unsigned long start_cpu_function_addr; 137fb702b942bf638baa6cbbbda9f76794db62921efChris Metcalf 138867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* _ASM_TILE_SMP_H */ 139