blob: 61e4f3547dc42da35ff69d900fd9e16dffec572d [file] [log] [blame]
/*
* Copyright 2012 Google Inc. All Rights Reserved.
* Author: kedong@google.com (Ke Dong)
*
* This file is released under the GPLv2.
*
* Implements a BRUNO platform specific error handler.
*/
#include <linux/err.h>
#include <linux/genhd.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/device-mapper.h>
#include <linux/brcmstb/brcmstb.h>
#include <asm/page.h>
#include "dm-verity.h"
#define DM_MSG_PREFIX "verity-bruno"
#define BCHP_AON_CTRL_FAILURE_COUNT BCHP_AON_CTRL_SYSTEM_DATA_RAMi_ARRAY_BASE + 4*127
static int error_handler(struct notifier_block *nb, unsigned long transient,
void *opaque_err)
{
struct dm_verity_error_state *err =
(struct dm_verity_error_state *) opaque_err;
u32 failure_count = 0;
err->behavior = DM_VERITY_ERROR_BEHAVIOR_PANIC;
if (transient)
return 0;
failure_count = BDEV_RD(BCHP_AON_CTRL_FAILURE_COUNT) + 1;
BDEV_WR_RB(BCHP_AON_CTRL_FAILURE_COUNT, (u32)failure_count);
return 0;
}
static struct notifier_block bruno_nb = {
.notifier_call = &error_handler,
.next = NULL,
.priority = 1,
};
static int __init dm_verity_bruno_init(void)
{
int r;
r = dm_verity_register_error_notifier(&bruno_nb);
if (r < 0)
DMERR("failed to register handler: %d", r);
else
DMINFO("registered");
return r;
}
static void __exit dm_verity_bruno_exit(void)
{
dm_verity_unregister_error_notifier(&bruno_nb);
}
module_init(dm_verity_bruno_init);
module_exit(dm_verity_bruno_exit);
MODULE_AUTHOR("Ke Dong <kedong@google.com>");
MODULE_DESCRIPTION("bruno-specific error handler for dm-verity");
MODULE_LICENSE("GPL");