511 lines
17 KiB
C
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 */
|