/******************************************************************************
 *
 * Module Name: tbconvrt - ACPI Table conversion utilities
 *
 *****************************************************************************/

/*
 * Copyright (C) 2000 - 2006, R. Byron Moore
 * All rights reserved.
 *
 * 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,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES.
 */

#include <acpi/acpi.h>
#include <acpi/actables.h>

#define _COMPONENT          ACPI_TABLES
ACPI_MODULE_NAME("tbconvrt")

/* Local prototypes */
static void
acpi_tb_init_generic_address(struct acpi_generic_address *new_gas_struct,
			     u8 register_bit_width,
			     acpi_physical_address address);

static void
acpi_tb_convert_fadt1(struct fadt_descriptor_rev2 *local_fadt,
		      struct fadt_descriptor_rev1 *original_fadt);

static void
acpi_tb_convert_fadt2(struct fadt_descriptor_rev2 *local_fadt,
		      struct fadt_descriptor_rev2 *original_fadt);

u8 acpi_fadt_is_v1;
ACPI_EXPORT_SYMBOL(acpi_fadt_is_v1)

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_get_table_count
 *
 * PARAMETERS:  RSDP            - Pointer to the RSDP
 *              RSDT            - Pointer to the RSDT/XSDT
 *
 * RETURN:      The number of tables pointed to by the RSDT or XSDT.
 *
 * DESCRIPTION: Calculate the number of tables.  Automatically handles either
 *              an RSDT or XSDT.
 *
 ******************************************************************************/

u32
acpi_tb_get_table_count(struct rsdp_descriptor *RSDP,
			struct acpi_table_header *RSDT)
{
	u32 pointer_size;

	ACPI_FUNCTION_ENTRY();

	/* RSDT pointers are 32 bits, XSDT pointers are 64 bits */

	if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) {
		pointer_size = sizeof(u32);
	} else {
		pointer_size = sizeof(u64);
	}

	/*
	 * Determine the number of tables pointed to by the RSDT/XSDT.
	 * This is defined by the ACPI Specification to be the number of
	 * pointers contained within the RSDT/XSDT.  The size of the pointers
	 * is architecture-dependent.
	 */
	return ((RSDT->length -
		 sizeof(struct acpi_table_header)) / pointer_size);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_convert_to_xsdt
 *
 * PARAMETERS:  table_info      - Info about the RSDT
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Convert an RSDT to an XSDT (internal common format)
 *
 ******************************************************************************/

acpi_status acpi_tb_convert_to_xsdt(struct acpi_table_desc *table_info)
{
	acpi_size table_size;
	u32 i;
	XSDT_DESCRIPTOR *new_table;

	ACPI_FUNCTION_ENTRY();

	/* Compute size of the converted XSDT */

	table_size = ((acpi_size) acpi_gbl_rsdt_table_count * sizeof(u64)) +
	    sizeof(struct acpi_table_header);

	/* Allocate an XSDT */

	new_table = ACPI_ALLOCATE_ZEROED(table_size);
	if (!new_table) {
		return (AE_NO_MEMORY);
	}

	/* Copy the header and set the length */

	ACPI_MEMCPY(new_table, table_info->pointer,
		    sizeof(struct acpi_table_header));
	new_table->length = (u32) table_size;

	/* Copy the table pointers */

	for (i = 0; i < acpi_gbl_rsdt_table_count; i++) {

		/* RSDT pointers are 32 bits, XSDT pointers are 64 bits */

		if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) {
			ACPI_STORE_ADDRESS(new_table->table_offset_entry[i],
					   (ACPI_CAST_PTR
					    (struct rsdt_descriptor_rev1,
					     table_info->pointer))->
					   table_offset_entry[i]);
		} else {
			new_table->table_offset_entry[i] =
			    (ACPI_CAST_PTR(XSDT_DESCRIPTOR,
					   table_info->pointer))->
			    table_offset_entry[i];
		}
	}

	/* Delete the original table (either mapped or in a buffer) */

	acpi_tb_delete_single_table(table_info);

	/* Point the table descriptor to the new table */

	table_info->pointer =
	    ACPI_CAST_PTR(struct acpi_table_header, new_table);
	table_info->length = table_size;
	table_info->allocation = ACPI_MEM_ALLOCATED;

	return (AE_OK);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_init_generic_address
 *
 * PARAMETERS:  new_gas_struct      - GAS struct to be initialized
 *              register_bit_width  - Width of this register
 *              Address             - Address of the register
 *
 * RETURN:      None
 *
 * DESCRIPTION: Initialize a GAS structure.
 *
 ******************************************************************************/

static void
acpi_tb_init_generic_address(struct acpi_generic_address *new_gas_struct,
			     u8 register_bit_width,
			     acpi_physical_address address)
{

	ACPI_STORE_ADDRESS(new_gas_struct->address, address);

	new_gas_struct->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
	new_gas_struct->register_bit_width = register_bit_width;
	new_gas_struct->register_bit_offset = 0;
	new_gas_struct->access_width = 0;
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_convert_fadt1
 *
 * PARAMETERS:  local_fadt      - Pointer to new FADT
 *              original_fadt   - Pointer to old FADT
 *
 * RETURN:      None, populates local_fadt
 *
 * DESCRIPTION: Convert an ACPI 1.0 FADT to common internal format
 *
 ******************************************************************************/

static void
acpi_tb_convert_fadt1(struct fadt_descriptor_rev2 *local_fadt,
		      struct fadt_descriptor_rev1 *original_fadt)
{

	/* ACPI 1.0 FACS */
	/* The BIOS stored FADT should agree with Revision 1.0 */
	acpi_fadt_is_v1 = 1;

	/*
	 * Copy the table header and the common part of the tables.
	 *
	 * The 2.0 table is an extension of the 1.0 table, so the entire 1.0
	 * table can be copied first, then expand some fields to 64 bits.
	 */
	ACPI_MEMCPY(local_fadt, original_fadt,
		    sizeof(struct fadt_descriptor_rev1));

	/* Convert table pointers to 64-bit fields */

	ACPI_STORE_ADDRESS(local_fadt->xfirmware_ctrl,
			   local_fadt->V1_firmware_ctrl);
	ACPI_STORE_ADDRESS(local_fadt->Xdsdt, local_fadt->V1_dsdt);

	/*
	 * System Interrupt Model isn't used in ACPI 2.0
	 * (local_fadt->Reserved1 = 0;)
	 */

	/*
	 * This field is set by the OEM to convey the preferred power management
	 * profile to OSPM. It doesn't have any 1.0 equivalence.  Since we don't
	 * know what kind of 32-bit system this is, we will use "unspecified".
	 */
	local_fadt->prefer_PM_profile = PM_UNSPECIFIED;

	/*
	 * Processor Performance State Control. This is the value OSPM writes to
	 * the SMI_CMD register to assume processor performance state control
	 * responsibility. There isn't any equivalence in 1.0, but as many 1.x
	 * ACPI tables contain _PCT and _PSS we also keep this value, unless
	 * acpi_strict is set.
	 */
	if (acpi_strict)
		local_fadt->pstate_cnt = 0;

	/*
	 * Support for the _CST object and C States change notification.
	 * This data item hasn't any 1.0 equivalence so leave it zero.
	 */
	local_fadt->cst_cnt = 0;

	/*
	 * FADT Rev 2 was an interim FADT released between ACPI 1.0 and ACPI 2.0.
	 * It primarily adds the FADT reset mechanism.
	 */
	if ((original_fadt->revision == 2) &&
	    (original_fadt->length ==
	     sizeof(struct fadt_descriptor_rev2_minus))) {
		/*
		 * Grab the entire generic address struct, plus the 1-byte reset value
		 * that immediately follows.
		 */
		ACPI_MEMCPY(&local_fadt->reset_register,
			    &(ACPI_CAST_PTR(struct fadt_descriptor_rev2_minus,
					    original_fadt))->reset_register,
			    sizeof(struct acpi_generic_address) + 1);
	} else {
		/*
		 * Since there isn't any equivalence in 1.0 and since it is highly
		 * likely that a 1.0 system has legacy support.
		 */
		local_fadt->iapc_boot_arch = BAF_LEGACY_DEVICES;
	}

	/*
	 * Convert the V1.0 block addresses to V2.0 GAS structures
	 */
	acpi_tb_init_generic_address(&local_fadt->xpm1a_evt_blk,
				     local_fadt->pm1_evt_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm1a_evt_blk);
	acpi_tb_init_generic_address(&local_fadt->xpm1b_evt_blk,
				     local_fadt->pm1_evt_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm1b_evt_blk);
	acpi_tb_init_generic_address(&local_fadt->xpm1a_cnt_blk,
				     local_fadt->pm1_cnt_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm1a_cnt_blk);
	acpi_tb_init_generic_address(&local_fadt->xpm1b_cnt_blk,
				     local_fadt->pm1_cnt_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm1b_cnt_blk);
	acpi_tb_init_generic_address(&local_fadt->xpm2_cnt_blk,
				     local_fadt->pm2_cnt_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm2_cnt_blk);
	acpi_tb_init_generic_address(&local_fadt->xpm_tmr_blk,
				     local_fadt->pm_tm_len,
				     (acpi_physical_address) local_fadt->
				     V1_pm_tmr_blk);
	acpi_tb_init_generic_address(&local_fadt->xgpe0_blk, 0,
				     (acpi_physical_address) local_fadt->
				     V1_gpe0_blk);
	acpi_tb_init_generic_address(&local_fadt->xgpe1_blk, 0,
				     (acpi_physical_address) local_fadt->
				     V1_gpe1_blk);

	/* Create separate GAS structs for the PM1 Enable registers */

	acpi_tb_init_generic_address(&acpi_gbl_xpm1a_enable,
				     (u8) ACPI_DIV_2(acpi_gbl_FADT->
						     pm1_evt_len),
				     (acpi_physical_address)
				     (local_fadt->xpm1a_evt_blk.address +
				      ACPI_DIV_2(acpi_gbl_FADT->pm1_evt_len)));

	/* PM1B is optional; leave null if not present */

	if (local_fadt->xpm1b_evt_blk.address) {
		acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable,
					     (u8) ACPI_DIV_2(acpi_gbl_FADT->
							     pm1_evt_len),
					     (acpi_physical_address)
					     (local_fadt->xpm1b_evt_blk.
					      address +
					      ACPI_DIV_2(acpi_gbl_FADT->
							 pm1_evt_len)));
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_convert_fadt2
 *
 * PARAMETERS:  local_fadt      - Pointer to new FADT
 *              original_fadt   - Pointer to old FADT
 *
 * RETURN:      None, populates local_fadt
 *
 * DESCRIPTION: Convert an ACPI 2.0 FADT to common internal format.
 *              Handles optional "X" fields.
 *
 ******************************************************************************/

static void
acpi_tb_convert_fadt2(struct fadt_descriptor_rev2 *local_fadt,
		      struct fadt_descriptor_rev2 *original_fadt)
{

	/* We have an ACPI 2.0 FADT but we must copy it to our local buffer */

	ACPI_MEMCPY(local_fadt, original_fadt,
		    sizeof(struct fadt_descriptor_rev2));

	/*
	 * "X" fields are optional extensions to the original V1.0 fields, so
	 * we must selectively expand V1.0 fields if the corresponding X field
	 * is zero.
	 */
	if (!(local_fadt->xfirmware_ctrl)) {
		ACPI_STORE_ADDRESS(local_fadt->xfirmware_ctrl,
				   local_fadt->V1_firmware_ctrl);
	}

	if (!(local_fadt->Xdsdt)) {
		ACPI_STORE_ADDRESS(local_fadt->Xdsdt, local_fadt->V1_dsdt);
	}

	if (!(local_fadt->xpm1a_evt_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm1a_evt_blk,
					     local_fadt->pm1_evt_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm1a_evt_blk);
	}

	if (!(local_fadt->xpm1b_evt_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm1b_evt_blk,
					     local_fadt->pm1_evt_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm1b_evt_blk);
	}

	if (!(local_fadt->xpm1a_cnt_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm1a_cnt_blk,
					     local_fadt->pm1_cnt_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm1a_cnt_blk);
	}

	if (!(local_fadt->xpm1b_cnt_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm1b_cnt_blk,
					     local_fadt->pm1_cnt_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm1b_cnt_blk);
	}

	if (!(local_fadt->xpm2_cnt_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm2_cnt_blk,
					     local_fadt->pm2_cnt_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm2_cnt_blk);
	}

	if (!(local_fadt->xpm_tmr_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xpm_tmr_blk,
					     local_fadt->pm_tm_len,
					     (acpi_physical_address)
					     local_fadt->V1_pm_tmr_blk);
	}

	if (!(local_fadt->xgpe0_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xgpe0_blk,
					     0,
					     (acpi_physical_address)
					     local_fadt->V1_gpe0_blk);
	}

	if (!(local_fadt->xgpe1_blk.address)) {
		acpi_tb_init_generic_address(&local_fadt->xgpe1_blk,
					     0,
					     (acpi_physical_address)
					     local_fadt->V1_gpe1_blk);
	}

	/* Create separate GAS structs for the PM1 Enable registers */

	acpi_tb_init_generic_address(&acpi_gbl_xpm1a_enable,
				     (u8) ACPI_DIV_2(acpi_gbl_FADT->
						     pm1_evt_len),
				     (acpi_physical_address)
				     (local_fadt->xpm1a_evt_blk.address +
				      ACPI_DIV_2(acpi_gbl_FADT->pm1_evt_len)));

	acpi_gbl_xpm1a_enable.address_space_id =
	    local_fadt->xpm1a_evt_blk.address_space_id;

	/* PM1B is optional; leave null if not present */

	if (local_fadt->xpm1b_evt_blk.address) {
		acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable,
					     (u8) ACPI_DIV_2(acpi_gbl_FADT->
							     pm1_evt_len),
					     (acpi_physical_address)
					     (local_fadt->xpm1b_evt_blk.
					      address +
					      ACPI_DIV_2(acpi_gbl_FADT->
							 pm1_evt_len)));

		acpi_gbl_xpm1b_enable.address_space_id =
		    local_fadt->xpm1b_evt_blk.address_space_id;
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_convert_table_fadt
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Converts a BIOS supplied ACPI 1.0 FADT to a local
 *              ACPI 2.0 FADT. If the BIOS supplied a 2.0 FADT then it is simply
 *              copied to the local FADT.  The ACPI CA software uses this
 *              local FADT. Thus a significant amount of special #ifdef
 *              type codeing is saved.
 *
 ******************************************************************************/

acpi_status acpi_tb_convert_table_fadt(void)
{
	struct fadt_descriptor_rev2 *local_fadt;
	struct acpi_table_desc *table_desc;

	ACPI_FUNCTION_TRACE("tb_convert_table_fadt");

	/*
	 * acpi_gbl_FADT is valid. Validate the FADT length. The table must be
	 * at least as long as the version 1.0 FADT
	 */
	if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev1)) {
		ACPI_ERROR((AE_INFO, "FADT is invalid, too short: 0x%X",
			    acpi_gbl_FADT->length));
		return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
	}

	/* Allocate buffer for the ACPI 2.0(+) FADT */

	local_fadt = ACPI_ALLOCATE_ZEROED(sizeof(struct fadt_descriptor_rev2));
	if (!local_fadt) {
		return_ACPI_STATUS(AE_NO_MEMORY);
	}

	if (acpi_gbl_FADT->revision >= FADT2_REVISION_ID) {
		if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev2)) {

			/* Length is too short to be a V2.0 table */

			ACPI_WARNING((AE_INFO,
				      "Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table",
				      acpi_gbl_FADT->length,
				      acpi_gbl_FADT->revision));

			acpi_tb_convert_fadt1(local_fadt,
					      (void *)acpi_gbl_FADT);
		} else {
			/* Valid V2.0 table */

			acpi_tb_convert_fadt2(local_fadt, acpi_gbl_FADT);
		}
	} else {
		/* Valid V1.0 table */

		acpi_tb_convert_fadt1(local_fadt, (void *)acpi_gbl_FADT);
	}

	/* Global FADT pointer will point to the new common V2.0 FADT */

	acpi_gbl_FADT = local_fadt;
	acpi_gbl_FADT->length = sizeof(FADT_DESCRIPTOR);

	/* Free the original table */

	table_desc = acpi_gbl_table_lists[ACPI_TABLE_FADT].next;
	acpi_tb_delete_single_table(table_desc);

	/* Install the new table */

	table_desc->pointer =
	    ACPI_CAST_PTR(struct acpi_table_header, acpi_gbl_FADT);
	table_desc->allocation = ACPI_MEM_ALLOCATED;
	table_desc->length = sizeof(struct fadt_descriptor_rev2);

	/* Dump the entire FADT */

	ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
			  "Hex dump of common internal FADT, size %d (%X)\n",
			  acpi_gbl_FADT->length, acpi_gbl_FADT->length));

	ACPI_DUMP_BUFFER(ACPI_CAST_PTR(u8, acpi_gbl_FADT),
			 acpi_gbl_FADT->length);

	return_ACPI_STATUS(AE_OK);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_build_common_facs
 *
 * PARAMETERS:  table_info      - Info for currently installed FACS
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Convert ACPI 1.0 and ACPI 2.0 FACS to a common internal
 *              table format.
 *
 ******************************************************************************/

acpi_status acpi_tb_build_common_facs(struct acpi_table_desc *table_info)
{

	ACPI_FUNCTION_TRACE("tb_build_common_facs");

	/* Absolute minimum length is 24, but the ACPI spec says 64 */

	if (acpi_gbl_FACS->length < 24) {
		ACPI_ERROR((AE_INFO, "Invalid FACS table length: 0x%X",
			    acpi_gbl_FACS->length));
		return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
	}

	if (acpi_gbl_FACS->length < 64) {
		ACPI_WARNING((AE_INFO,
			      "FACS is shorter than the ACPI specification allows: 0x%X, using anyway",
			      acpi_gbl_FACS->length));
	}

	/* Copy fields to the new FACS */

	acpi_gbl_common_fACS.global_lock = &(acpi_gbl_FACS->global_lock);

	if ((acpi_gbl_RSDP->revision < 2) ||
	    (acpi_gbl_FACS->length < 32) ||
	    (!(acpi_gbl_FACS->xfirmware_waking_vector))) {

		/* ACPI 1.0 FACS or short table or optional X_ field is zero */

		acpi_gbl_common_fACS.firmware_waking_vector = ACPI_CAST_PTR(u64,
									    &
									    (acpi_gbl_FACS->
									     firmware_waking_vector));
		acpi_gbl_common_fACS.vector_width = 32;
	} else {
		/* ACPI 2.0 FACS with valid X_ field */

		acpi_gbl_common_fACS.firmware_waking_vector =
		    &acpi_gbl_FACS->xfirmware_waking_vector;
		acpi_gbl_common_fACS.vector_width = 64;
	}

	return_ACPI_STATUS(AE_OK);
}
