Path: blob/master/arch/powerpc/platforms/powernv/ultravisor.c
26481 views
// SPDX-License-Identifier: GPL-2.01/*2* Ultravisor high level interfaces3*4* Copyright 2019, IBM Corporation.5*6*/7#include <linux/init.h>8#include <linux/printk.h>9#include <linux/of_fdt.h>10#include <linux/of.h>1112#include <asm/ultravisor.h>13#include <asm/firmware.h>14#include <asm/machdep.h>1516#include "powernv.h"1718static struct kobject *ultravisor_kobj;1920int __init early_init_dt_scan_ultravisor(unsigned long node, const char *uname,21int depth, void *data)22{23if (!of_flat_dt_is_compatible(node, "ibm,ultravisor"))24return 0;2526powerpc_firmware_features |= FW_FEATURE_ULTRAVISOR;27pr_debug("Ultravisor detected!\n");28return 1;29}3031static struct memcons *uv_memcons;3233static ssize_t uv_msglog_read(struct file *file, struct kobject *kobj,34const struct bin_attribute *bin_attr, char *to,35loff_t pos, size_t count)36{37return memcons_copy(uv_memcons, to, pos, count);38}3940static struct bin_attribute uv_msglog_attr __ro_after_init = {41.attr = {.name = "msglog", .mode = 0400},42.read = uv_msglog_read43};4445static int __init uv_init(void)46{47struct device_node *node;4849if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR))50return 0;5152node = of_find_compatible_node(NULL, NULL, "ibm,uv-firmware");53if (!node)54return -ENODEV;5556uv_memcons = memcons_init(node, "memcons");57of_node_put(node);58if (!uv_memcons)59return -ENOENT;6061uv_msglog_attr.size = memcons_get_size(uv_memcons);6263ultravisor_kobj = kobject_create_and_add("ultravisor", firmware_kobj);64if (!ultravisor_kobj)65return -ENOMEM;6667return sysfs_create_bin_file(ultravisor_kobj, &uv_msglog_attr);68}69machine_subsys_initcall(powernv, uv_init);707172