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

ls2k-reset.c (1133B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *  Copyright (C) 2021, Qing Zhang <zhangqing@loongson.cn>
      4 *  Loongson-2K1000 reset support
      5 */
      6
      7#include <linux/of_address.h>
      8#include <linux/pm.h>
      9#include <asm/reboot.h>
     10
     11#define	PM1_STS		0x0c /* Power Management 1 Status Register */
     12#define	PM1_CNT		0x14 /* Power Management 1 Control Register */
     13#define	RST_CNT		0x30 /* Reset Control Register */
     14
     15static void __iomem *base;
     16
     17static void ls2k_restart(char *command)
     18{
     19	writel(0x1, base + RST_CNT);
     20}
     21
     22static void ls2k_poweroff(void)
     23{
     24	/* Clear */
     25	writel((readl(base + PM1_STS) & 0xffffffff), base + PM1_STS);
     26	/* Sleep Enable | Soft Off*/
     27	writel(GENMASK(12, 10) | BIT(13), base + PM1_CNT);
     28}
     29
     30static int ls2k_reset_init(void)
     31{
     32	struct device_node *np;
     33
     34	np = of_find_compatible_node(NULL, NULL, "loongson,ls2k-pm");
     35	if (!np) {
     36		pr_info("Failed to get PM node\n");
     37		return -ENODEV;
     38	}
     39
     40	base = of_iomap(np, 0);
     41	of_node_put(np);
     42	if (!base) {
     43		pr_info("Failed to map PM register base address\n");
     44		return -ENOMEM;
     45	}
     46
     47	_machine_restart = ls2k_restart;
     48	pm_power_off = ls2k_poweroff;
     49
     50	return 0;
     51}
     52
     53arch_initcall(ls2k_reset_init);