cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hotplug.c (1711B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  Copyright (C) 2002 ARM Ltd.
      4 *  All Rights Reserved
      5 *  Copyright (c) 2010, 2012-2013, NVIDIA Corporation. All rights reserved.
      6 */
      7
      8#include <linux/clk/tegra.h>
      9#include <linux/kernel.h>
     10#include <linux/smp.h>
     11
     12#include <soc/tegra/common.h>
     13#include <soc/tegra/fuse.h>
     14
     15#include <asm/smp_plat.h>
     16
     17#include "common.h"
     18#include "sleep.h"
     19
     20static void (*tegra_hotplug_shutdown)(void);
     21
     22int tegra_cpu_kill(unsigned cpu)
     23{
     24	cpu = cpu_logical_map(cpu);
     25
     26	/* Clock gate the CPU */
     27	tegra_wait_cpu_in_reset(cpu);
     28	tegra_disable_cpu_clock(cpu);
     29
     30	return 1;
     31}
     32
     33/*
     34 * platform-specific code to shutdown a CPU
     35 *
     36 * Called with IRQs disabled
     37 */
     38void tegra_cpu_die(unsigned int cpu)
     39{
     40	if (!tegra_hotplug_shutdown) {
     41		WARN(1, "hotplug is not yet initialized\n");
     42		return;
     43	}
     44
     45	/* Clean L1 data cache */
     46	tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS);
     47
     48	/* Shut down the current CPU. */
     49	tegra_hotplug_shutdown();
     50
     51	/* Should never return here. */
     52	BUG();
     53}
     54
     55static int __init tegra_hotplug_init(void)
     56{
     57	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
     58		return 0;
     59
     60	if (!soc_is_tegra())
     61		return 0;
     62
     63	if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_get_chip_id() == TEGRA20)
     64		tegra_hotplug_shutdown = tegra20_hotplug_shutdown;
     65	if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_get_chip_id() == TEGRA30)
     66		tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
     67	if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_get_chip_id() == TEGRA114)
     68		tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
     69	if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_get_chip_id() == TEGRA124)
     70		tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
     71
     72	return 0;
     73}
     74pure_initcall(tegra_hotplug_init);