iBoot/platform/t8010/chipid/operating_point.c

77 lines
3.5 KiB
C

/*
* Copyright (C) 2014 Apple Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
/*
* This file is only a database of the frequencies used by CPU and GPU, it has no access
* To the chip.
*/
#include <platform.h>
#include <platform/soc/operating_point.h>
#define CHIP_ID_ALL 0
#define DELIMITER CHIPID_ALL_VOLTAGE_LAST
static const struct operating_point_params operating_point_params[] = {
// T8010
{.voltage_index = DELIMITER, .chip_id = 0x8010, .voltage_type = CHIPID_GPU_VOLTAGE},
// voltage_index P M S
{.gpu = {CHIPID_GPU_VOLTAGE_OFF, 0, 0, 0}},
// T8010
{.voltage_index = DELIMITER, .chip_id = 0x8010, .voltage_type = CHIPID_CPU_VOLTAGE},
// bypass
// | clkSrc
// | | fcwInt
// | | | fcwFrac
// | | | | pstDivS
// | | | | | migDivS
// | | | | | | coreTyp
// | | | | | | | biuDiv4HiVol
// | | | | | | | | biuDiv4LoVol
// | | | | | | | | | dvmrMaxWgt
// | | | | | | | | | | iexrfCfgWrData
// | | | | | | | | | | | iexrfCfgWrIdxa
// | | | | | | | | | | | | iexrfCfgWrIdxb
// | | | | | | | | | | | | | exrfCfgWrIdxmuxsel
// | | | | | | | | | | | | | |
{.cpu = {CHIPID_CPU_VOLTAGE_BYPASS, 1, 0, 125, 0, 7, 7, kACC_CORETYP_FUSED, 2, 2, 0xf, 0, 0, 0, 0}}, // 24 MHz
{.cpu = {CHIPID_CPU_VOLTAGE_SECUREROM,1, 1, 125, 0, 4, 7, kACC_CORETYP_FUSED, 2, 2, 0xf, 0, 0, 0, 0}}, // 300 MHz
{.cpu = {CHIPID_CPU_VOLTAGE_396, 0, 0, 0, 0, 0, 0, kACC_CORETYP_ECORE, 2, 2, 0xf, 0, 0, 0, 0}}, // 396 MHz !!!FIXME!!! Get correct settings
};
const struct operating_point_params *operating_point_get_params(enum chipid_voltage_index voltage_index, enum chipid_voltage_type voltage_type)
{
uint64_t chip_id = chipid_get_chip_id();
uint64_t chip_id_in_array = 0;
size_t size = sizeof(operating_point_params)/sizeof(operating_point_params[0]);
enum chipid_voltage_type voltage_type_in_array = CHIPID_CPU_VOLTAGE;
size_t found = size;
for (size_t i = 0; i < size; i++) {
if (operating_point_params[i].voltage_index == DELIMITER) {
chip_id_in_array = operating_point_params[i].chip_id;
voltage_type_in_array = operating_point_params[i].voltage_type;
continue;
}
if ((voltage_type_in_array != voltage_type)) {
continue;
}
if ((operating_point_params[i].voltage_index == voltage_index) && ((chip_id_in_array == CHIP_ID_ALL) || (chip_id_in_array == chip_id))) {
found = i;
}
}
if (found == size) {
panic("%s Index %d not found for chipId 0x%llx\n",
__func__, voltage_index, chip_id);
}
return &operating_point_params[found];
}