/*
 * Copyright (C) 2008 Uwe Hermann <uwe@hermann-uwe.de>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * Datasheet:
 *  - Name: MC146818: Real-time Clock Plus RAM (RTC)
 *  - PDF: http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC146818.pdf
 *  - Order number: MC146818/D
 */

/*
 * See also:
 * http://bochs.sourceforge.net/techspec/CMOS-reference.txt
 * http://www.bioscentral.com/misc/cmosmap.htm
 */

#include <stdint.h>

#include "base/io.h"

/**
 * PCs can have either 64 (very old ones), 128, or 256 bytes of CMOS RAM.
 *
 * Usually you access the lower 128 CMOS bytes via I/O port 0x70/0x71.
 * For more recent chipsets with 256 bytes, you have to access the upper
 * 128 bytes (128-255) using two different registers, usually 0x72/0x73.
 *
 * On some chipsets this can be different, though. The VIA VT8237R for example
 * only recognizes the ports 0x74/0x75 for accessing the high 128 CMOS bytes
 * (as seems to be the case for multiple VIA chipsets).
 *
 * It's very chipset-specific if and how the upper 128 bytes are enabled at
 * all, but this work should be done in coreboot anyway. Libpayload assumes
 * that coreboot has properly enabled access to the upper 128 bytes and
 * doesn't try to do this on its own.
 */

enum {
	Cmos_PortStandard = 0x70,
	Cmos_PortExtended = 0x72,
};

uint8_t cmos_read(uint8_t addr)
{
	uint16_t port = addr < 128 ? Cmos_PortStandard : Cmos_PortExtended;

	outb(addr, port);
	return inb(port + 1);
}

void cmos_write(uint8_t val, uint8_t addr)
{
	uint16_t port = addr < 128 ? Cmos_PortStandard : Cmos_PortExtended;

	outb(addr, port);
	outb(val, port + 1);
}
