18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2013 John Crispin <john@phrozen.org> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/debugfs.h> 88c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define BOOTROM_OFFSET 0x10118000 118c2ecf20Sopenharmony_ci#define BOOTROM_SIZE 0x8000 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic void __iomem *membase = (void __iomem *) KSEG1ADDR(BOOTROM_OFFSET); 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic int bootrom_show(struct seq_file *s, void *unused) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci seq_write(s, membase, BOOTROM_SIZE); 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci return 0; 208c2ecf20Sopenharmony_ci} 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic int bootrom_open(struct inode *inode, struct file *file) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci return single_open(file, bootrom_show, NULL); 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic const struct file_operations bootrom_file_ops = { 288c2ecf20Sopenharmony_ci .open = bootrom_open, 298c2ecf20Sopenharmony_ci .read = seq_read, 308c2ecf20Sopenharmony_ci .llseek = seq_lseek, 318c2ecf20Sopenharmony_ci .release = single_release, 328c2ecf20Sopenharmony_ci}; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic int __init bootrom_setup(void) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci debugfs_create_file("bootrom", 0444, NULL, NULL, &bootrom_file_ops); 378c2ecf20Sopenharmony_ci return 0; 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cipostcore_initcall(bootrom_setup); 41