/*
 * 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 <asm/page.h>
#include <asm/brcmstb/brcmstb.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");
