blob: e3b2980e97105f0d7df7c62597f4f13b337e3aa6 [file] [log] [blame]
/** @file
* Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
#include "val_target.h"
#include "target_database.h"
#ifdef USE_RAW_PRINT_FOR_DRIVER_PARTITION
#define val_print(x, y, z) \
do { \
if (x >= VERBOSE) \
val_print_sf(y,z); \
} while(0)
#else
__UNUSED STATIC_DECLARE val_status_t val_print
(print_verbosity_t verbosity, char *string, uint32_t data);
#endif
/**
@brief - Returns the base address of target configuration block database.
@param - blob : Populates the base address
@return - val_status_t
**/
STATIC_DECLARE val_status_t val_target_cfg_get_next(void **blob)
{
val_status_t status = VAL_STATUS_SUCCESS;
target_cfg_hdr_t *hdr;
uint32_t size;
if (*blob == NULL)
{
*blob = (void *) &target_database;
if (blob == NULL)
{
return VAL_STATUS_NOT_FOUND;
}
hdr = *blob;
/* Sanity check signature and version here */
if ((hdr->version != 1) || (hdr->size == 0))
{
val_print(PRINT_ERROR, "Target config database Error. \n", 0);
return status;
}
hdr++;
*blob = hdr; // skip the header. start with the first record.
return status;
}
size = (((cfg_type_t *)*blob)->size) & 0xFFFFFF;
if (size)
{
*blob = (void *)((uint8_t *)*blob + size);
return VAL_STATUS_SUCCESS;
}
return VAL_STATUS_ERROR;
}
/**
@brief - This function checks for the given configuration ID with the block in
target configuration database.
@param - cfg_id : Configuration ID of a block
- data : Returns block base address
- size : Block size
@return - val_status_t
**/
STATIC_DECLARE val_status_t val_target_get_cfg_blob(cfg_id_t cfg_id, uint8_t **data, uint32_t *size)
{
val_status_t status;
void *config_blob = NULL;
val_print(PRINT_INFO, "Input id is %x \n", cfg_id);
do
{
status = val_target_cfg_get_next(&config_blob);
if (VAL_ERROR(status))
{
break;
}
if (((cfg_type_t *)config_blob)->cfg_id == cfg_id)
{
*data = (uint8_t *)config_blob;
status = VAL_STATUS_SUCCESS;
break;
}
else if (((((cfg_type_t *)config_blob)->cfg_id & VAL_TEST_MAJOR_GROUP_MASK) == \
(cfg_id & VAL_TEST_MAJOR_GROUP_MASK)) && \
!(((cfg_type_t *)config_blob)->cfg_id & \
(VAL_TEST_MINOR_GROUP_MASK | VAL_TEST_CFG_INSTANCE_MASK)))
{
config_blob = (void *)((uint8_t *)config_blob + sizeof(memory_hdr_t));
if (((cfg_type_t *)config_blob)->cfg_id == cfg_id)
{
*data = (uint8_t *)config_blob;
status = VAL_STATUS_SUCCESS;
break;
}
}
else if (((cfg_type_t *)config_blob)->cfg_id == VAL_TEST_INVALID_CFG_ID)
{
status = VAL_STATUS_NOT_FOUND;
break;
}
} while(1);
return status;
}
/**
@brief - This function returns the data associated with a given
config ID.
@param - size - if the input size is less than the data size to
returned, the size is updated with the actual data size and
error is returned.
@return - data contains the information of type specific to a
config id.
**/
STATIC_DECLARE val_status_t val_target_get_config(cfg_id_t cfg_id, uint8_t **data, uint32_t *size)
{
val_status_t status;
if ((cfg_id < TARGET_MIN_CFG_ID) || (cfg_id > TARGET_MAX_CFG_ID))
{
val_print(PRINT_ERROR, "Invalid Target data config ID = %x \n", cfg_id);
return VAL_STATUS_INSUFFICIENT_SIZE;
}
status = val_target_get_cfg_blob(cfg_id, data, size);
if (VAL_ERROR(status))
{
val_print(PRINT_ERROR, "\n Get Config failed with status = %x", status);
val_print(PRINT_ERROR, " for cfg_id = %x", cfg_id);
return status;
}
return VAL_STATUS_SUCCESS;
}