/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2009 coresystems GmbH
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 * Copyright (C) 2003 Ollie Lo <ollielo@hotmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc.
 */

#include <console/console.h>
#include <pc80/keyboard.h>
#include <device/device.h>
#include <arch/io.h>
#include <delay.h>
#include <types.h>
#include <arch/acpi.h>

#define KBD_DATA	0x60
#define KBD_COMMAND	0x64
#define KBD_STATUS	0x64
#define KBD_IBF	(1 << 1)	// 1: input buffer full (data ready for ec)
#define KBD_OBF	(1 << 0)	// 1: output buffer full (data ready for host)

// Keyboard Controller Commands
#define KBC_CMD_READ_COMMAND	0x20	// Read command byte
#define KBC_CMD_WRITE_COMMAND	0x60	// Write command byte
#define KBC_CMD_SELF_TEST	0xAA	// Controller self-test
#define KBC_CMD_KBD_TEST	0xAB	// Keyboard Interface test

/* The Keyboard controller command byte
 *  BIT	| Description
 *  ----+-------------------------------------------------------
 *   7  | reserved, must be zero
 *   6  | XT Translation, (1 = on, 0 = off)
 *   5  | Disable Mouse Port (1 = disable, 0 = enable)
 *   4  | Disable Keyboard Port (1 = disable, 0 = enable)
 *   3  | reserved, must be zero
 *   2  | System Flag (1 = self-test passed. DO NOT SET TO ZERO)
 *   1  | Mouse Port Interrupts (1 = enable, 0 = disable)
 *   0  | Keyboard Port Interrupts (1 = enable, 0 = disable)
 */

// Keyboard Controller Replies
#define KBC_REPLY_SELFTEST_OK	0x55	// controller self-test succeeded

//
// Keyboard Replies
//
#define KBD_REPLY_POR		0xAA	// Power on reset
#define KBD_REPLY_ACK		0xFA	// Command ACK
#define KBD_REPLY_RESEND	0xFE	// Command NACK, send command again

/* Wait 400ms for keyboard controller answers */
#define KBC_TIMEOUT_IN_MS 400

static int kbc_input_buffer_empty(void)
{
	u32 timeout;
	for (timeout = KBC_TIMEOUT_IN_MS;
	     timeout && (inb(KBD_STATUS) & KBD_IBF); timeout--)
		mdelay(1);

	if (!timeout)
		printk(BIOS_WARNING,
		       "Unexpected Keyboard controller input buffer full\n");
	return !!timeout;
}

static int kbc_output_buffer_full(void)
{
	u32 timeout;
	for (timeout = KBC_TIMEOUT_IN_MS;
	     timeout && ((inb(KBD_STATUS) & KBD_OBF) == 0); timeout--)
		mdelay(1);

	if (!timeout)
		printk(BIOS_INFO,
		       "Keyboard controller output buffer result timeout\n");
	return !!timeout;
}

static int kbc_cleanup_buffers(void)
{
	u32 timeout;
	for (timeout = KBC_TIMEOUT_IN_MS;
	     timeout && (inb(KBD_STATUS) & (KBD_OBF | KBD_IBF)); timeout--) {
		mdelay(1);
		inb(KBD_DATA);
	}

	if (!timeout) {
		printk(BIOS_ERR,
		       "Couldn't cleanup the keyboard controller buffers\n");
		printk(BIOS_ERR, "Status (0x%x): 0x%x, Buffer (0x%x): 0x%x\n",
		       KBD_STATUS, inb(KBD_STATUS), KBD_DATA, inb(KBD_DATA));
	}

	return !!timeout;
}

static enum cb_err kbc_self_test(void)
{
	u8 self_test;

	/* Clean up any junk that might have been in the KBC.
	 * Both input and output buffers must be empty.
	 */
	if (!kbc_cleanup_buffers())
		return CB_KBD_CONTROLLER_FAILURE;

	/* reset/self test 8042 - send cmd 0xAA */
	outb(KBC_CMD_SELF_TEST, KBD_COMMAND);

	if (!kbc_output_buffer_full()) {
		/* There probably is no keyboard controller. */
		printk(BIOS_ERR, "Could not reset keyboard controller.\n");
		return CB_KBD_CONTROLLER_FAILURE;
	}

	/* read self-test result, 0x55 is returned in the output buffer */
	self_test = inb(KBD_DATA);

	if (self_test != 0x55) {
		printk(BIOS_ERR, "Keyboard Controller self-test failed: 0x%x\n",
		       self_test);
		return CB_KBD_CONTROLLER_FAILURE;
	}

	/* ensure the buffers are empty */
	kbc_cleanup_buffers();

	/* keyboard interface test */
	outb(KBC_CMD_KBD_TEST, KBD_COMMAND);

	if (!kbc_output_buffer_full()) {
		printk(BIOS_ERR, "Keyboard Interface test timed out.\n");
		return CB_KBD_CONTROLLER_FAILURE;
	}

	/* read test result, 0x00 should be returned in case of no failures */
	self_test = inb(KBD_DATA);

	if (self_test != 0x00) {
		printk(BIOS_ERR, "Keyboard Interface test failed: 0x%x\n",
		       self_test);
		return CB_KBD_INTERFACE_FAILURE;
	}

	return CB_SUCCESS;
}

static u8 send_keyboard(u8 command)
{
	u8 regval = 0;
	u8 resend = 10;

	do {
		if (!kbc_input_buffer_empty())
			return 0;
		outb(command, KBD_DATA);
		/* the reset command takes much longer then normal commands and
		 * even worse, some keyboards do send the ACK _after_ doing the
		 * reset */
		if (command == 0xFF) {
			u8 retries;
			for (retries = 9; retries && !kbc_output_buffer_full();
			     retries--) ;
		}
		if (!kbc_output_buffer_full()) {
			printk(BIOS_ERR,
			       "Could not send keyboard command %02x\n",
			       command);
			return 0;
		}
		regval = inb(KBD_DATA);
		--resend;
	} while (regval == KBD_REPLY_RESEND && resend > 0);

	return regval;
}

void pc_keyboard_init(void)
{
	u8 retries;
	u8 regval;
	enum cb_err err;

	if (!CONFIG_DRIVERS_PS2_KEYBOARD)
		return;

	if (acpi_is_wakeup_s3())
		return;

	printk(BIOS_DEBUG, "Keyboard init...\n");

	/* Run a keyboard controller self-test */
	err = kbc_self_test();
	/* Ignore iterface failure as it's non-fatal.  */
	if (err != CB_SUCCESS && err != CB_KBD_INTERFACE_FAILURE)
		return;

	/* Enable keyboard interface - No IRQ */
	if (!kbc_input_buffer_empty())
		return;
	outb(0x60, KBD_COMMAND);
	if (!kbc_input_buffer_empty())
		return;
	outb(0x20, KBD_DATA);	/* send cmd: enable keyboard */
	if (!kbc_input_buffer_empty()) {
		printk(BIOS_INFO, "Timeout while enabling keyboard\n");
		return;
	}

	/* clean up any junk that might have been in the keyboard */
	if (!kbc_cleanup_buffers())
		return;

	/* reset keyboard and self test (keyboard side) */
	regval = send_keyboard(0xFF);
	if (regval == KBD_REPLY_RESEND) {
		/* keeps sending RESENDs, probably no keyboard. */
		printk(BIOS_INFO, "No PS/2 keyboard detected.\n");
		return;
	}

	if (regval != KBD_REPLY_ACK) {
		printk(BIOS_ERR, "Keyboard reset failed ACK: 0x%x\n", regval);
		return;
	}

	/* the reset command takes some time, so wait a little longer */
	for (retries = 9; retries && !kbc_output_buffer_full(); retries--) ;

	if (!kbc_output_buffer_full()) {
		printk(BIOS_ERR, "Timeout waiting for keyboard after reset.\n");
		return;
	}

	regval = inb(KBD_DATA);
	if (regval != 0xAA) {
		printk(BIOS_ERR, "Keyboard reset selftest failed: 0x%x\n",
		       regval);
		return;
	}

	/*
	 * The following set scancode stuff is what normal BIOS do. It could be
	 * argued that coreboot shouldn't set the scan code.....
	 */

	/* disable the keyboard */
	regval = send_keyboard(0xF5);
	if (regval != KBD_REPLY_ACK) {
		printk(BIOS_ERR, "Keyboard disable failed ACK: 0x%x\n", regval);
		return;
	}

	/* Set scancode command */
	regval = send_keyboard(0xF0);
	if (regval != KBD_REPLY_ACK) {
		printk(BIOS_ERR, "Keyboard set scancode cmd failed ACK: 0x%x\n",
		       regval);
		return;
	}
	/* Set scancode mode 2 */
	regval = send_keyboard(0x02);
	if (regval != KBD_REPLY_ACK) {
		printk(BIOS_ERR,
		       "Keyboard set scancode mode failed ACK: 0x%x\n", regval);
		return;
	}

	/* All is well - enable keyboard interface */
	if (!kbc_input_buffer_empty())
		return;
	outb(0x60, KBD_COMMAND);
	if (!kbc_input_buffer_empty())
		return;
	outb(0x65, KBD_DATA);	/* send cmd: enable keyboard and IRQ 1 */
	if (!kbc_input_buffer_empty()) {
		printk(BIOS_ERR, "Timeout during keyboard enable\n");
		return;
	}

	/* enable the keyboard */
	regval = send_keyboard(0xF4);
	if (regval != KBD_REPLY_ACK) {
		printk(BIOS_ERR, "Keyboard enable failed ACK: 0x%x\n", regval);
		return;
	}
}

/*
 * Support PS/2 mode -  oddball SIOs(KBC) need this setup
 * Not well documented. Google - 0xcb keyboard controller
 * This is called before pc_keyboard_init().
 */
void set_kbc_ps2_mode(void)
{
	enum cb_err err;

	/* Run a keyboard controller self-test */
	err = kbc_self_test();
	/* Ignore iterface failure as it's non-fatal.  */
	if (err != CB_SUCCESS && err != CB_KBD_INTERFACE_FAILURE)
		return;

	/* Support PS/2 mode */
	if (!kbc_input_buffer_empty())
		return;
	outb(0xcb, KBD_COMMAND);

	if (!kbc_input_buffer_empty())
		return;
	outb(0x01, KBD_DATA);

	kbc_cleanup_buffers();
}
