/*
 * 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");
