QModem/rooter/0optionalapps/qlog/src/sahara_protocol.h
2023-04-01 10:00:13 +08:00

511 lines
17 KiB
C

/*===========================================================================
* FILE:
* sahara_packet.h
*
* DESCRIPTION:
* Sahara protocol states and structure declaration.
*
* Copyright (C) 2012 Qualcomm Technologies, Inc. All rights reserved.
* Qualcomm Technologies Proprietary/GTDR
*
* All data and information contained in or disclosed by this document is
* confidential and proprietary information of Qualcomm Technologies, Inc. and all
* rights therein are expressly reserved. By accepting this material the
* recipient agrees that this material and the information contained therein
* is held in confidence and in trust and will not be used, copied, reproduced
* in whole or in part, nor its contents revealed in any manner to others
* without the express written permission of Qualcomm Technologies, Inc.
* ===========================================================================
*
* sahara_packet.h : Sahara protocol states and structure declaration.
* ==========================================================================================
* $Header: //components/rel/boot.bf/3.1.4/boot_images/core/storage/tools/QSaharaServer/src/sahara_protocol.h#1 $
* $DateTime: 2017/02/21 04:58:32 $
* $Author: pwbldsvc $
*
* Edit History:
* YYYY-MM-DD who why
* -----------------------------------------------------------------------------
* 2010-09-28 ng Added command mode support
* 2010-10-18 ab Added memory debug mode support
*
* Copyright 2012 by Qualcomm Technologies, Inc. All Rights Reserved.
*
*==========================================================================================
*/
#ifndef SAHARA_PROTOCOL_H
#define SAHARA_PROTOCOL_H
/*===========================================================================
*
* INCLUDE FILES
*
* ===========================================================================*/
/*===========================================================================
*
* PUBLIC DATA DECLARATIONS
*
* ===========================================================================*/
// Sahara Protocol Version
#define SAHARA_VERSION 2
#define SAHARA_VERSION_SUPPORTED 4
/*Maximum 1 megabyte tx buffer size*/
#define SAHARA_RAW_BUFFER_SIZE (64*1024)
// Sahara command IDs
typedef enum
{
SAHARA_NO_CMD_ID = 0x00,
SAHARA_HELLO_ID = 0x01, // sent from target to host
SAHARA_HELLO_RESP_ID = 0x02, // sent from host to target
SAHARA_READ_DATA_ID = 0x03, // sent from target to host
SAHARA_END_IMAGE_TX_ID = 0x04, // sent from target to host
SAHARA_DONE_ID = 0x05, // sent from host to target
SAHARA_DONE_RESP_ID = 0x06, // sent from target to host
SAHARA_RESET_ID = 0x07, // sent from host to target
SAHARA_RESET_RESP_ID = 0x08, // sent from target to host
SAHARA_MEMORY_DEBUG_ID = 0x09, // sent from target to host
SAHARA_MEMORY_READ_ID = 0x0A, // sent from host to target
SAHARA_CMD_READY_ID = 0x0B, // sent from target to host
SAHARA_CMD_SWITCH_MODE_ID = 0x0C, // sent from host to target
SAHARA_CMD_EXEC_ID = 0x0D, // sent from host to target
SAHARA_CMD_EXEC_RESP_ID = 0x0E, // sent from target to host
SAHARA_CMD_EXEC_DATA_ID = 0x0F, // sent from host to target
SAHARA_64_BITS_MEMORY_DEBUG_ID = 0x10, // sent from target to host
SAHARA_64_BITS_MEMORY_READ_ID = 0x11, // sent from host to target
SAHARA_64_BITS_READ_DATA_ID = 0x12,
// place all new commands above this
SAHARA_LAST_CMD_ID,
SAHARA_MAX_CMD_ID = 0x7FFFFFFF // To ensure 32-bits wide
} boot_sahara_cmd_id;
typedef enum {
SAHARA_IMAGE_TYPE_BINARY = 0, /* Binary format */
SAHARA_IMAGE_TYPE_ELF, /* ELF format */
SAHARA_IMAGE_UNKNOWN = 0x7FFFFFFF /* To ensure 32-bits wide */
} boot_sahara_image;
// Status codes for Sahara
typedef enum
{
// Success
SAHARA_STATUS_SUCCESS = 0x00,
// Invalid command received in current state
SAHARA_NAK_INVALID_CMD = 0x01,
// Protocol mismatch between host and target
SAHARA_NAK_PROTOCOL_MISMATCH = 0x02,
// Invalid target protocol version
SAHARA_NAK_INVALID_TARGET_PROTOCOL = 0x03,
// Invalid host protocol version
SAHARA_NAK_INVALID_HOST_PROTOCOL = 0x04,
// Invalid packet size received
SAHARA_NAK_INVALID_PACKET_SIZE = 0x05,
// Unexpected image ID received
SAHARA_NAK_UNEXPECTED_IMAGE_ID = 0x06,
// Invalid image header size received
SAHARA_NAK_INVALID_HEADER_SIZE = 0x07,
// Invalid image data size received
SAHARA_NAK_INVALID_DATA_SIZE = 0x08,
// Invalid image type received
SAHARA_NAK_INVALID_IMAGE_TYPE = 0x09,
// Invalid tranmission length
SAHARA_NAK_INVALID_TX_LENGTH = 0x0A,
// Invalid reception length
SAHARA_NAK_INVALID_RX_LENGTH = 0x0B,
// General transmission or reception error
SAHARA_NAK_GENERAL_TX_RX_ERROR = 0x0C,
// Error while transmitting READ_DATA packet
SAHARA_NAK_READ_DATA_ERROR = 0x0D,
// Cannot receive specified number of program headers
SAHARA_NAK_UNSUPPORTED_NUM_PHDRS = 0x0E,
// Invalid data length received for program headers
SAHARA_NAK_INVALID_PDHR_SIZE = 0x0F,
// Multiple shared segments found in ELF image
SAHARA_NAK_MULTIPLE_SHARED_SEG = 0x10,
// Uninitialized program header location
SAHARA_NAK_UNINIT_PHDR_LOC = 0x11,
// Invalid destination address
SAHARA_NAK_INVALID_DEST_ADDR = 0x12,
// Invalid data size receieved in image header
SAHARA_NAK_INVALID_IMG_HDR_DATA_SIZE = 0x13,
// Invalid ELF header received
SAHARA_NAK_INVALID_ELF_HDR = 0x14,
// Unknown host error received in HELLO_RESP
SAHARA_NAK_UNKNOWN_HOST_ERROR = 0x15,
// Timeout while receiving data
SAHARA_NAK_TIMEOUT_RX = 0x16,
// Timeout while transmitting data
SAHARA_NAK_TIMEOUT_TX = 0x17,
// Invalid mode received from host
SAHARA_NAK_INVALID_HOST_MODE = 0x18,
// Invalid memory read access
SAHARA_NAK_INVALID_MEMORY_READ = 0x19,
// Host cannot handle read data size requested
SAHARA_NAK_INVALID_DATA_SIZE_REQUEST = 0x1A,
// Memory debug not supported
SAHARA_NAK_MEMORY_DEBUG_NOT_SUPPORTED = 0x1B,
// Invalid mode switch
SAHARA_NAK_INVALID_MODE_SWITCH = 0x1C,
// Failed to execute command
SAHARA_NAK_CMD_EXEC_FAILURE = 0x1D,
// Invalid parameter passed to command execution
SAHARA_NAK_EXEC_CMD_INVALID_PARAM = 0x1E,
// Unsupported client command received
SAHARA_NAK_EXEC_CMD_UNSUPPORTED = 0x1F,
// Invalid client command received for data response
SAHARA_NAK_EXEC_DATA_INVALID_CLIENT_CMD = 0x20,
// Failed to authenticate hash table
SAHARA_NAK_HASH_TABLE_AUTH_FAILURE = 0x21,
// Failed to verify hash for a given segment of ELF image
SAHARA_NAK_HASH_VERIFICATION_FAILURE = 0x22,
// Failed to find hash table in ELF image
SAHARA_NAK_HASH_TABLE_NOT_FOUND = 0x23,
// Place all new error codes above this
SAHARA_NAK_LAST_CODE,
SAHARA_NAK_MAX_CODE = 0x7FFFFFFF // To ensure 32-bits wide
} boot_sahara_status;
// Status of all image transfers
typedef enum
{
SAHARA_MODE_IMAGE_TX_PENDING = 0x0,
SAHARA_MODE_IMAGE_TX_COMPLETE = 0x1,
SAHARA_MODE_MEMORY_DEBUG = 0x2,
SAHARA_MODE_COMMAND = 0x3,
// place all new commands above this
SAHARA_MODE_LAST,
SAHARA_MODE_MAX = 0x7FFFFFFF
} boot_sahara_mode;
// Executable commands when target is in command mode
typedef enum
{
SAHARA_EXEC_CMD_NOP = 0x00,
SAHARA_EXEC_CMD_SERIAL_NUM_READ = 0x01,
SAHARA_EXEC_CMD_MSM_HW_ID_READ = 0x02,
SAHARA_EXEC_CMD_OEM_PK_HASH_READ = 0x03,
SAHARA_EXEC_CMD_SWITCH_DMSS = 0x04,
SAHARA_EXEC_CMD_SWITCH_STREAMING = 0x05,
SAHARA_EXEC_CMD_READ_DEBUG_DATA = 0x06,
// place all new commands above this
SAHARA_EXEC_CMD_LAST,
SAHARA_EXEC_CMD_MAX = 0x7FFFFFFF
} boot_sahara_exec_cmd_id;
/* Sahara Protocol states */
typedef enum {
SAHARA_WAIT_HELLO,
SAHARA_WAIT_COMMAND,
SAHARA_WAIT_RESET_RESP,
SAHARA_WAIT_DONE_RESP,
SAHARA_WAIT_MEMORY_READ,
SAHARA_WAIT_CMD_EXEC_RESP,
SAHARA_WAIT_MEMORY_TABLE,
SAHARA_WAIT_MEMORY_REGION,
} boot_sahara_state;
/* ============================================================================= */
/* Sahara protocol packet defintions */
/* ============================================================================= */
typedef struct
{
uint32_t command; // command ID
uint32_t length; // packet length incl command and length
} sahara_packet_header;
// HELLO command packet type - sent from target to host
// indicates start of protocol on target side
typedef struct
{
sahara_packet_header header;
uint32_t version; // target protocol version number
uint32_t version_supported; // minimum protocol version number supported
// on target
uint32_t cmd_packet_length; // maximum packet size supported for command
// packets
uint32_t mode; // expected mode of target operation
uint32_t reserved0; // reserved field
uint32_t reserved1; // reserved field
uint32_t reserved2; // reserved field
uint32_t reserved3; // reserved field
uint32_t reserved4; // reserved field
uint32_t reserved5; // reserved field
} sahara_packet_hello;
// HELLO_RESP command packet type - sent from host to target
// response to hello, protocol version running on host and status sent
typedef struct
{
sahara_packet_header header;
uint32_t version; // host protocol version number
uint32_t version_supported; // minimum protocol version number supported
// on host
uint32_t status; // OK or error condition
uint32_t mode; // mode of operation for target to execute
uint32_t reserved0; // reserved field
uint32_t reserved1; // reserved field
uint32_t reserved2; // reserved field
uint32_t reserved3; // reserved field
uint32_t reserved4; // reserved field
uint32_t reserved5; // reserved field
} sahara_packet_hello_resp;
// READ_DATA command packet type - sent from target to host
// sends data segment offset and length to be read from current host
// image file
typedef struct
{
sahara_packet_header header;
uint32_t image_id; // ID of image to be transferred
uint32_t data_offset; // offset into image file to read data from
uint32_t data_length; // length of data segment to be retreived
// from image file
} sahara_packet_read_data;
// READ_DATA_64 command packet type - sent from target to host
// sends data segment offset and length to be read from current host
// image file
/*
#ifdef WINDOWSPC
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
PACK(
typedef struct // note for gcc use __attribute__((__packed__))
{
sahara_packet_header header;
uint32_t image_id; // ID of image to be transferred
uint64_t data_offset; // offset into image file to read data from
uint32_t data_length; // length of data segment to be retreived
// from image file
} sahara_packet_read_data_64bit;
);
#else
typedef __attribute__((__packed__)) struct
{
sahara_packet_header header;
uint32_t image_id; // ID of image to be transferred
uint64_t data_offset; // offset into image file to read data from
uint32_t data_length; // length of data segment to be retreived
// from image file
} sahara_packet_read_data_64bit;
#endif
*/
typedef struct
{
sahara_packet_header header;
uint64_t image_id; // ID of image to be transferred
uint64_t data_offset; // offset into image file to read data from
uint64_t data_length; // length of data segment to be retreived
// from image file
} sahara_packet_read_data_64bit;
// END_IMAGE_TX command packet type - sent from target to host
// indicates end of a single image transfer and status of transfer
typedef struct
{
sahara_packet_header header;
uint32_t image_id; // ID of image to be transferred
uint32_t status; // OK or error condition
} sahara_packet_end_image_tx;
// DONE packet type - sent from host to target
// indicates end of single image transfer
typedef struct
{
sahara_packet_header header;
} sahara_packet_done;
// DONE_RESP packet type - sent from target to host
// indicates end of all image transfers
typedef struct
{
sahara_packet_header header;
uint32_t image_tx_status; // indicates if all images have been
// transferred;
// 0 = IMAGE_TX_PENDING
// 1 = IMAGE_TX_COMPLETE
} sahara_packet_done_resp;
// RESET packet type - sent from host to target
// indicates to target to reset
typedef struct
{
sahara_packet_header header;
} sahara_packet_reset;
// RESET_RESP packet type - sent from target to host
// indicates to host that target has reset
typedef struct
{
sahara_packet_header header;
} sahara_packet_reset_resp;
// MEMORY_DEBUG packet type - sent from target to host
// sends host the location and length of memory region table
typedef struct
{
sahara_packet_header header;
uint32_t memory_table_addr; // location of memory region table
uint32_t memory_table_length; // length of memory table
} sahara_packet_memory_debug;
typedef struct
{
sahara_packet_header header;
uint64_t memory_table_addr; // location of memory region table
uint64_t memory_table_length; // length of memory table
} sahara_packet_memory_debug_64bit;
// MEMORY_READ packet type - sent from host to target
// sends memory address and length to read from target memory
typedef struct
{
sahara_packet_header header;
uint32_t memory_addr; // memory location to read from
uint32_t memory_length; // length of data to send
} sahara_packet_memory_read;
typedef struct
{
sahara_packet_header header;
uint64_t memory_addr; // memory location to read from
uint64_t memory_length; // length of data to send
} sahara_packet_memory_read_64bit;
// CMD_READY packet type - sent from target to host
// indicates to host that target is ready to accept commands
typedef struct
{
sahara_packet_header header;
} sahara_packet_cmd_ready;
// CMD_SWITCH_MODE packet type - sent from host to target
// indicates to target to switch modes
typedef struct
{
sahara_packet_header header;
uint32_t mode; // mode of operation for target to execute
} sahara_packet_cmd_switch_mode;
// CMD_EXEC packet type - sent from host to target
// indicates to target to execute given client_command
typedef struct
{
sahara_packet_header header;
uint32_t client_command; // command ID for target Sahara client to
// execute
} sahara_packet_cmd_exec;
// CMD_EXEC_RESP packet type - sent from host to target
// indicates to host that target has successfully executed command
// and length of data response
typedef struct
{
sahara_packet_header header;
uint32_t client_command; // command ID for target Sahara client to
// execute
uint32_t resp_length; // length of response returned from command
// execution
} sahara_packet_cmd_exec_resp;
// CMD_EXEC_DATA packet type - sent from target to host
// indicates that host is ready to receive data after command execution
typedef struct
{
sahara_packet_header header;
uint32_t client_command; // command ID for target Sahara client to
// execute
} sahara_packet_cmd_exec_data;
#define DLOAD_DEBUG_STRLEN_BYTES 20
typedef struct
{
uint32_t save_pref;
uint32_t mem_base;
uint32_t length;
char desc[DLOAD_DEBUG_STRLEN_BYTES];
char filename[DLOAD_DEBUG_STRLEN_BYTES];
} dload_debug_type;
typedef struct
{
uint64_t save_pref; //force 8 bytes alignment
uint64_t mem_base;
uint64_t length;
char desc[DLOAD_DEBUG_STRLEN_BYTES];
char filename[DLOAD_DEBUG_STRLEN_BYTES];
} dload_debug_type_64bit;
typedef struct {
/* buffer for sahara rx */
void* rx_buffer;
/* buffer for sahara tx */
void* tx_buffer;
/* buffer for memory table */
void* misc_buffer;
/* Sahara state */
boot_sahara_state state;
size_t timed_data_size;
// handle to input image
int fd;
int ram_dump_image;
int max_ram_dump_retries;
uint32_t max_ram_dump_read;
boot_sahara_mode mode;
boot_sahara_mode prev_mode;
unsigned int command;
bool ram_dump_64bit;
} sahara_data_t;
#endif /* SAHARA_PACKET_H */