/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2018, The Linux Foundation.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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.
 */

#ifndef _SOC_QUALCOMM_QCLIB_COMMON_H__
#define _SOC_QUALCOMM_QCLIB_COMMON_H__

/* coreboot & QCLib I/F definitions */

/* string field lengths */
#define QCLIB_MAGIC_NUMBER_LENGTH 8
#define QCLIB_FMAP_NAME_LENGTH 24
#define QCLIB_TE_NAME_LENGTH 24

/* FMAP_REGION names */
#define QCLIB_FR_DDR_TRAINING_DATA "RW_DDR_TRAINING"
#define QCLIB_FR_LIMITS_CFG_DATA   "RO_LIMITS_CFG"

/* TE_NAME (table entry name) */
#define QCLIB_TE_DDR_INFORMATION   "ddr_information"
#define QCLIB_TE_QCLIB_LOG_BUFFER  "qclib_log_buffer"
#define QCLIB_TE_DCB_SETTINGS      "dcb_settings"
#define QCLIB_TE_CDT_SETTINGS      "cdt_settings"
#define QCLIB_TE_PMIC_SETTINGS     "pmic_settings"
#define QCLIB_TE_DDR_TRAINING_DATA "ddr_training_data"
#define QCLIB_TE_LIMITS_CFG_DATA   "limits_cfg_data"
#define QCLIB_TE_QCSDI             "qcsdi"
#define QCLIB_TE_BOARD_CONFIG	   "board_config"

/* BA_BMASK_VALUES (blob_attributes bit mask values) */
#define QCLIB_BA_SAVE_TO_STORAGE 0x00000001

struct qclib_cb_if_table_entry {
	char       name[QCLIB_TE_NAME_LENGTH];  /* 0x00 TE_NAME */
	uint64_t   blob_address;		/* 0x18 blob addr in SRAM */
	uint32_t   size;                        /* 0x20 blob size in SRAM */
	uint32_t   blob_attributes;		/* 0x24 BA_BMASK_VALUES */
};

/* GA_BMASK_VALUES (global_attributes bit mask values) */
#define QCLIB_GA_ENABLE_UART_LOGGING   0x00000001

#define QCLIB_INTERFACE_VERSION 0x00000001
#define QCLIB_MAX_NUMBER_OF_ENTRIES 16

#define QCLIB_MAGIC_NUMBER "QCLIB_CB"

struct qclib_cb_if_table {
	char          magic[8];				/* 0x00 */
	uint32_t      version;				/* 0x08 */
	uint32_t      num_entries;			/* 0x0C */
	uint32_t      max_entries;			/* 0x10 */
	uint32_t      global_attributes;		/* 0x14 */
	uint64_t      reserved;				/* 0x18 */
	struct qclib_cb_if_table_entry
		te[QCLIB_MAX_NUMBER_OF_ENTRIES];	/* 0x20 */
};

extern struct qclib_cb_if_table qclib_cb_if_table;

void qclib_add_if_table_entry(const char *name, void *base,
			      uint32_t size, uint32_t attrs);
void qclib_load_and_run(void);
int  qclib_soc_blob_load(void);
void qclib_set_buck_type(void);

#endif  // _SOC_QUALCOMM_QCLIB_COMMON_H_
