152 lines
5.5 KiB
C
152 lines
5.5 KiB
C
|
/*
|
||
|
* Copyright (C) 2011-2013 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.
|
||
|
*/
|
||
|
#ifndef __CSI_PRIVATE_H
|
||
|
#define __CSI_PRIVATE_H
|
||
|
|
||
|
#include <drivers/csi.h>
|
||
|
#include <debug.h>
|
||
|
|
||
|
// NOTE: The following header file is expected to be found via the search paths expressed in
|
||
|
// rules.mk via the GLOBAL_INCLUDES macro.
|
||
|
#include <csi_prot_common.h>
|
||
|
#include <csi_platform_defines.h>
|
||
|
#include <csi_system.h>
|
||
|
|
||
|
// build-time CSI protocol version range check
|
||
|
// Make sure you could this in sync with the protoc
|
||
|
#define EXPECTED_RANGE_MIN_PROTOCOL_VER_MAJOR 9
|
||
|
#define EXPECTED_RANGE_MAX_PROTOCOL_VER_MAJOR 9
|
||
|
|
||
|
#if !((EXPECTED_RANGE_MIN_PROTOCOL_VER_MAJOR <= APPLE_CSI_PROTOCOL_VER_MAJOR) && (EXPECTED_RANGE_MAX_PROTOCOL_VER_MAJOR >= APPLE_CSI_PROTOCOL_VER_MAJOR))
|
||
|
#error ERROR: This iBoot is not compatible with your AppleStorageProcessor firmware
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// explicitly specify task stack sizes
|
||
|
// empirically derived stack high watermark measurements
|
||
|
// csi inbox_not_e: 512
|
||
|
// csi ep mgmt: 416
|
||
|
// csi ep crashlog: 1728
|
||
|
// csi ep console: 448
|
||
|
// csi ep syslog: 1424
|
||
|
|
||
|
// request 8 kb to cover with a healthy margin
|
||
|
// further tuning will be handled with <rdar://problem/15208515> Analyze stack usage and tune stack size for csi iBoot tasks
|
||
|
|
||
|
#define kTaskStackSize_inbox_not_empty 0x2000
|
||
|
#define kTaskStackSize_endpoints 0x2000
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// default send message time out
|
||
|
#define CSI_SEND_MESSAGE_TIMEOUT (10 * 1000 * 1000) // 10s
|
||
|
|
||
|
|
||
|
#define roundup(x,y) ((((x)+(y)-1)/(y))*(y))
|
||
|
|
||
|
#define is_power_of_2(x) (((x)==((x)&~((x)-1)))&&((x)!=0))
|
||
|
|
||
|
|
||
|
#ifndef REQUIRE
|
||
|
#define REQUIRE(_expr) \
|
||
|
do { \
|
||
|
if (__builtin_expect(!(_expr), 0)) \
|
||
|
panic("%s:%s:%u: REQUIRE failed: %s\n", \
|
||
|
__FILE__, \
|
||
|
__PRETTY_FUNCTION__, \
|
||
|
__LINE__, #_expr); \
|
||
|
} while(0);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define COPROC_STATE(s) \
|
||
|
(((s)==MGMT_INITIALIZED) ? "Initialized" : \
|
||
|
(((s)==MGMT_QUIESCED) ? "Quiesced" : \
|
||
|
(((s)==MGMT_WAITING_FOR_ACK) ? "Waiting For Hello" : \
|
||
|
(((s)==MGMT_VERSION_OK) ? "Running" : \
|
||
|
(((s)==MGMT_UNSUPPORTED_PROTOCOL_VERSION) ? "Running - Unsupported Protocol Version" : \
|
||
|
(((s)==MGMT_NONEXISTENT) ? "Uninitialized" : "???"))))))
|
||
|
|
||
|
|
||
|
|
||
|
// CS_LOG levels are passed through to dprintf() and compared against DEBUG_LEVEL.
|
||
|
// <debug.h> defines { DEBUG_SILENT DEBUG_CRITICAL DEBUG_INFO DEBUG_SPEW }
|
||
|
// one may use DEBUG_LEVEL to enable output and (DEBUG_LEVEL+1) to stifle output
|
||
|
|
||
|
// these levels should probably be enabled by default
|
||
|
#define CSI_LOG_LEVEL_CRITICAL DEBUG_CRITICAL // indication of a serious problem
|
||
|
|
||
|
// these levels *may* be enabled by default
|
||
|
#define CSI_LOG_LEVEL_CRASHLOG DEBUG_CRITICAL // coproc crashlog output
|
||
|
#define CSI_LOG_LEVEL_CONSOLE DEBUG_INFO // coproc console output
|
||
|
#define CSI_LOG_LEVEL_SYSLOG DEBUG_CRITICAL // coproc syslog output
|
||
|
#define CSI_LOG_LEVEL_DEBUG_SPEW DEBUG_SPEW // verbose debug output
|
||
|
|
||
|
// these levels are disabled by default
|
||
|
#if DEBUG_BUILD
|
||
|
#define CSI_LOG_LEVEL_DEBUG DEBUG_INFO
|
||
|
#else
|
||
|
#define CSI_LOG_LEVEL_DEBUG DEBUG_CRITICAL // every little operational detail - TMI - useful for debugging only
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// csi log formatting macros
|
||
|
#define CSI_LOG_RAW(lev, x...) \
|
||
|
do { dprintf(CSI_LOG_LEVEL_##lev, x); } while(0)
|
||
|
|
||
|
#define CSI_LOG(lev, cop, x...) \
|
||
|
do { dprintf(CSI_LOG_LEVEL_##lev, "%s: ", IOP_NAME(cop)); dprintf(CSI_LOG_LEVEL_##lev, x); } while(0)
|
||
|
|
||
|
#define CSI_EP_LOG(lev, cop, ep_name, x...) \
|
||
|
do { dprintf(CSI_LOG_LEVEL_##lev, "[%s %s] ", IOP_NAME(cop), ep_name); dprintf(CSI_LOG_LEVEL_##lev, x); } while(0)
|
||
|
|
||
|
|
||
|
// firmware api
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t alignment_req;
|
||
|
void *fw_address;
|
||
|
uint32_t fw_size;
|
||
|
void *heap_address;
|
||
|
uint32_t heap_size;
|
||
|
addr_t region_base;
|
||
|
uint32_t region_size;
|
||
|
} fw_desc_t;
|
||
|
|
||
|
csi_status_t fw_fixup_and_relocate (csi_coproc_t which_coproc, fw_desc_t *fw_desc);
|
||
|
void fw_print_version (csi_coproc_t coproc, fw_desc_t *fw_desc);
|
||
|
|
||
|
csi_status_t csi_start (csi_coproc_t which_coproc);
|
||
|
csi_status_t csi_stop (csi_coproc_t which_coproc);
|
||
|
csi_status_t csi_panic_recover (csi_coproc_t which_coproc);
|
||
|
csi_status_t quiesce_iop (csi_coproc_t which_coproc);
|
||
|
csi_status_t hibernate_iop (csi_coproc_t which_coproc);
|
||
|
csi_status_t request_iop_power_state (csi_coproc_t which_coproc, csi_power_state_t ps);
|
||
|
csi_status_t set_send_timeout (csi_coproc_t which_coproc, uint32_t timeout);
|
||
|
uint32_t get_send_timeout (csi_coproc_t which_coproc);
|
||
|
void csi_info (csi_coproc_t which_coproc);
|
||
|
|
||
|
|
||
|
csi_status_t csi_set_feature (csi_coproc_t which_coproc, coproc_feature_t feature);
|
||
|
csi_status_t csi_clr_feature (csi_coproc_t which_coproc, coproc_feature_t feature);
|
||
|
|
||
|
void maybe_do_cache_operation(int operation, void *address, u_int32_t length);
|
||
|
|
||
|
|
||
|
//
|
||
|
// built-in endpoint api
|
||
|
//
|
||
|
|
||
|
csi_status_t bi_ep_send_message (void *token, msg_payload_t msg_payload);
|
||
|
|
||
|
#endif /* !defined(__CSI_PRIVATE_H) */
|