diff options
Diffstat (limited to 'drivers/misc/modem_if/modem_link_device_dpram.h')
-rw-r--r-- | drivers/misc/modem_if/modem_link_device_dpram.h | 390 |
1 files changed, 226 insertions, 164 deletions
diff --git a/drivers/misc/modem_if/modem_link_device_dpram.h b/drivers/misc/modem_if/modem_link_device_dpram.h index d61da83..c651e51 100644 --- a/drivers/misc/modem_if/modem_link_device_dpram.h +++ b/drivers/misc/modem_if/modem_link_device_dpram.h @@ -23,44 +23,61 @@ #include "modem_prj.h" -/* for DPRAM hostboot */ -#define CMC22x_AP_BOOT_DOWN_DONE 0x54329876 -#define CMC22x_CP_REQ_MAIN_BIN 0xA5A5A5A5 -#define CMC22x_CP_REQ_NV_DATA 0x5A5A5A5A -#define CMC22x_CP_DUMP_MAGIC 0xDEADDEAD - -#define CMC22x_HOST_DOWN_START 0x1234 -#define CMC22x_HOST_DOWN_END 0x4321 -#define CMC22x_REG_NV_DOWN_END 0xABCD -#define CMC22x_CAL_NV_DOWN_END 0xDCBA - -#define CMC22x_1ST_BUFF_READY 0xAAAA -#define CMC22x_2ND_BUFF_READY 0xBBBB -#define CMC22x_1ST_BUFF_FULL 0x1111 -#define CMC22x_2ND_BUFF_FULL 0x2222 - -#define CMC22x_CP_RECV_NV_END 0x8888 -#define CMC22x_CP_CAL_OK 0x4F4B -#define CMC22x_CP_CAL_BAD 0x4552 -#define CMC22x_CP_DUMP_END 0xFADE - -#define CMC22x_DUMP_BUFF_SIZE 8192 /* 8 KB */ -#define CMC22x_DUMP_WAIT_TIMEOVER 1 /* 1 ms */ +#define DPRAM_MAGIC_CODE 0xAA /* interrupt masks.*/ -#define INT_MASK_VALID 0x0080 -#define INT_MASK_CMD 0x0040 -#define INT_VALID(x) ((x) & INT_MASK_VALID) +#define INT_MASK_VALID 0x0080 +#define INT_MASK_CMD 0x0040 +#define INT_VALID(x) ((x) & INT_MASK_VALID) #define INT_CMD_VALID(x) ((x) & INT_MASK_CMD) -#define INT_NON_CMD(x) (INT_MASK_VALID | (x)) -#define INT_CMD(x) (INT_MASK_VALID | INT_MASK_CMD | (x)) +#define INT_NON_CMD(x) (INT_MASK_VALID | (x)) +#define INT_CMD(x) (INT_MASK_VALID | INT_MASK_CMD | (x)) +#define EXT_UDL_MASK 0xF000 +#define EXT_UDL_CMD(x) ((x) & EXT_UDL_MASK) #define EXT_INT_VALID_MASK 0x8000 #define EXT_CMD_VALID_MASK 0x4000 +#define UDL_CMD_VALID_MASK 0x2000 #define EXT_INT_VALID(x) ((x) & EXT_INT_VALID_MASK) #define EXT_CMD_VALID(x) ((x) & EXT_CMD_VALID_MASK) +#define UDL_CMD_VALID(x) ((x) & UDL_CMD_VALID_MASK) #define INT_EXT_CMD(x) (EXT_INT_VALID_MASK | EXT_CMD_VALID_MASK | (x)) +#define EXT_CMD_MASK(x) ((x) & 0x0FFF) +#define EXT_CMD_SET_SPEED_LOW 0x0011 +#define EXT_CMD_SET_SPEED_MID 0x0012 +#define EXT_CMD_SET_SPEED_HIGH 0x0013 + +#define UDL_RESULT_SUCCESS 0x1 +#define UDL_RESULT_FAIL 0x2 + +#define UDL_CMD_MASK(x) (((x) >> 8) & 0xF) +#define UDL_CMD_RECV_READY 0x1 +#define UDL_CMD_DL_START_REQ 0x2 +#define UDL_CMD_DL_START_RESP 0x3 +#define UDL_CMD_IMAGE_SEND_REQ 0x4 +#define UDL_CMD_SEND_DONE_RESP 0x5 +#define UDL_CMD_SEND_DONE_REQ 0x6 +#define UDL_CMD_UPDATE_DONE 0x7 +#define UDL_CMD_STATUS_UPDATE 0x8 +#define UDL_CMD_IMAGE_SEND_RESP 0x9 +#define UDL_CMD_EFS_CLEAR_RESP 0xB +#define UDL_CMD_ALARM_BOOT_OK 0xC +#define UDL_CMD_ALARM_BOOT_FAIL 0xD + +#define CMD_IMG_START_REQ 0x9200 +#define CMD_IMG_SEND_REQ 0x9400 +#define CMD_DL_SEND_DONE_REQ 0x9600 +#define CMD_UL_RECV_RESP 0x9601 +#define CMD_UL_RECV_DONE_RESP 0x9801 + +/* special interrupt cmd indicating modem boot failure. */ +#define INT_POWERSAFE_FAIL 0xDEAD + +#define INT_MASK_REQ_ACK_RFS 0x0400 /* Request RES_ACK_RFS */ +#define INT_MASK_RES_ACK_RFS 0x0200 /* Response of REQ_ACK_RFS */ +#define INT_MASK_SEND_RFS 0x0100 /* Indicate sending RFS data */ + #define INT_MASK_REQ_ACK_F 0x0020 #define INT_MASK_REQ_ACK_R 0x0010 #define INT_MASK_RES_ACK_F 0x0008 @@ -68,10 +85,6 @@ #define INT_MASK_SEND_F 0x0002 #define INT_MASK_SEND_R 0x0001 -#define INT_MASK_REQ_ACK_RFS 0x0400 /* Request RES_ACK_RFS */ -#define INT_MASK_RES_ACK_RFS 0x0200 /* Response of REQ_ACK_RFS */ -#define INT_MASK_SEND_RFS 0x0100 /* Indicate sending RFS data */ - #define INT_MASK_RES_ACK_SET \ (INT_MASK_RES_ACK_F | INT_MASK_RES_ACK_R | INT_MASK_RES_ACK_RFS) @@ -95,59 +108,26 @@ #define INT_CMD_SILENT_NV_REBUILDING 0xE #define INT_CMD_NORMAL_PWR_OFF 0xF -#define EXT_CMD_MASK(x) ((x) & 0x3FFF) -#define EXT_CMD_SET_SPEED_LOW 0x0011 -#define EXT_CMD_SET_SPEED_MID 0x0012 -#define EXT_CMD_SET_SPEED_HIGH 0x0013 - -/* special interrupt cmd indicating modem boot failure. */ -#define INT_POWERSAFE_FAIL 0xDEAD - -#define UDL_CMD_VALID(x) (((x) & 0xA000) == 0xA000) -#define UDL_RESULT_FAIL 0x2 -#define UDL_RESULT_SUCCESS 0x1 -#define UDL_CMD_MASK(x) (((x) >> 8) & 0xF) -#define UDL_CMD_RECEIVE_READY 0x1 -#define UDL_CMD_DOWNLOAD_START_REQ 0x2 -#define UDL_CMD_DOWNLOAD_START_RESP 0x3 -#define UDL_CMD_IMAGE_SEND_REQ 0x4 -/* change dpram download flow */ -#define UDL_CMD_IMAGE_SEND_RESP 0x9 - -#define UDL_CMD_SEND_DONE_RESP 0x5 -#define UDL_CMD_SEND_DONE_REQ 0x6 -#define UDL_CMD_UPDATE_DONE 0x7 - -#define UDL_CMD_STATUS_UPDATE 0x8 -#define UDL_CMD_EFS_CLEAR_RESP 0xB -#define UDL_CMD_ALARM_BOOT_OK 0xC -#define UDL_CMD_ALARM_BOOT_FAIL 0xD - -#define CMD_IMG_START_REQ 0x9200 -#define CMD_IMG_SEND_REQ 0x9400 -#define CMD_DL_SEND_DONE_REQ 0x9600 -#define CMD_UL_RECEIVE_RESP 0x9601 -#define CMD_UL_RECEIVE_DONE_RESP 0x9801 - -#define START_INDEX 0x7F -#define END_INDEX 0x7E - -#define DP_MAGIC_DMDL 0x4445444C -#define DP_MAGIC_UMDL 0x4445444D -#define DP_DPRAM_SIZE 0x4000 -#define DP_DEFAULT_WRITE_LEN 8168 -#define DP_DEFAULT_DUMP_LEN 16128 -#define DP_DUMP_HEADER_SIZE 7 - -#define UDL_TIMEOUT (50 * HZ) -#define UDL_SEND_TIMEOUT (200 * HZ) -#define FORCE_CRASH_TIMEOUT (3 * HZ) -#define DUMP_TIMEOUT (30 * HZ) -#define DUMP_START_TIMEOUT (100 * HZ) - -enum cmc22x_boot_mode { - CMC22x_BOOT_MODE_NORMAL, - CMC22x_BOOT_MODE_DUMP, +#define START_FLAG 0x7F +#define END_FLAG 0x7E + +#define DP_MAGIC_DMDL 0x4445444C +#define DP_MAGIC_UMDL 0x4445444D +#define DP_DPRAM_SIZE 0x4000 +#define DP_DEFAULT_WRITE_LEN 8168 +#define DP_DEFAULT_DUMP_LEN 16128 +#define DP_DUMP_HEADER_SIZE 7 + +#define UDL_TIMEOUT (50 * HZ) +#define UDL_SEND_TIMEOUT (200 * HZ) +#define FORCE_CRASH_ACK_TIMEOUT (5 * HZ) +#define DUMP_TIMEOUT (30 * HZ) +#define DUMP_START_TIMEOUT (100 * HZ) +#define DUMP_WAIT_TIMEOUT (HZ >> 10) /* 1/1024 second */ + +enum host_boot_mode { + HOST_BOOT_MODE_NORMAL, + HOST_BOOT_MODE_DUMP, }; enum dpram_init_status { @@ -158,40 +138,27 @@ enum dpram_init_status { struct dpram_boot_img { char *addr; int size; - enum cmc22x_boot_mode mode; + enum host_boot_mode mode; unsigned req; unsigned resp; }; #define MAX_PAYLOAD_SIZE 0x2000 struct dpram_boot_frame { - unsigned request; /* AP to CP Message */ - unsigned response; /* CP to AP Response */ - ssize_t len; /* request size*/ - unsigned offset; /* offset to write */ + unsigned req; /* AP->CP request */ + unsigned resp; /* response expected by AP */ + ssize_t len; /* data size in the buffer */ + unsigned offset; /* offset to write into DPRAM */ char data[MAX_PAYLOAD_SIZE]; }; /* buffer type for modem image */ struct dpram_dump_arg { - char *buff; - int buff_size;/* AP->CP: Buffer size */ - unsigned req; /* AP->CP request */ - unsigned resp; /* CP->AP response */ - bool cmd; /* AP->CP command */ -}; - -struct dpram_firmware { - char *firmware; - int size; - int is_delta; -}; -enum dpram_link_mode { - DPRAM_LINK_MODE_INVALID = 0, - DPRAM_LINK_MODE_IPC, - DPRAM_LINK_MODE_BOOT, - DPRAM_LINK_MODE_DLOAD, - DPRAM_LINK_MODE_ULOAD, + char *buff; /* pointer to the buffer */ + int buff_size; /* buffer size */ + unsigned req; /* AP->CP request */ + unsigned resp; /* CP->AP response */ + bool cmd; /* AP->CP command */ }; struct dpram_boot_map { @@ -202,6 +169,13 @@ struct dpram_boot_map { u32 size; }; +struct qc_dpram_boot_map { + u8 __iomem *buff; + u16 __iomem *frame_size; + u16 __iomem *tag; + u16 __iomem *count; +}; + struct dpram_dload_map { u32 __iomem *magic; u8 __iomem *buff; @@ -212,20 +186,54 @@ struct dpram_uload_map { u8 __iomem *buff; }; -struct dpram_ota_header { - u8 start_index; - u16 nframes; - u16 curframe; - u16 len; - -} __packed; - struct ul_header { u8 bop; u16 total_frame; u16 curr_frame; u16 len; } __packed; + +struct dpram_udl_param { + unsigned char *addr; + unsigned int size; + unsigned int count; + unsigned int tag; +}; + +struct dpram_udl_check { + unsigned int total_size; + unsigned int rest_size; + unsigned int send_size; + unsigned int copy_start; + unsigned int copy_complete; + unsigned int boot_complete; +}; + +#define DP_BOOT_BUFF_OFFSET 4 +#define DP_DLOAD_BUFF_OFFSET 4 +#define DP_ULOAD_BUFF_OFFSET 4 +#define DP_BOOT_REQ_OFFSET 0 +#define DP_BOOT_RESP_OFFSET 8 + +#define MAX_WQ_NAME_LENGTH 64 + +#define DPRAM_MAX_RXBQ_SIZE 256 + +struct dpram_rxb { + u8 *buff; + unsigned size; + + u8 *data; + unsigned len; +}; + +struct dpram_rxb_queue { + int size; + int in; + int out; + struct dpram_rxb *rxb; +}; + /* magic_code + access_enable + @@ -245,89 +253,72 @@ struct ul_header { 2 = 16384 */ +#define DP_16K_FMT_TX_BUFF_SZ 1336 +#define DP_16K_RAW_TX_BUFF_SZ 4564 +#define DP_16K_FMT_RX_BUFF_SZ 1336 +#define DP_16K_RAW_RX_BUFF_SZ 9124 -#define SIPC5_DP_FMT_TX_BUFF_SZ 1336 -#define SIPC5_DP_RAW_TX_BUFF_SZ 4564 -#define SIPC5_DP_FMT_RX_BUFF_SZ 1336 -#define SIPC5_DP_RAW_RX_BUFF_SZ 9124 - -struct sipc5_dpram_ipc_cfg { +struct dpram_ipc_16k_map { u16 magic; u16 access; u16 fmt_tx_head; u16 fmt_tx_tail; - u8 fmt_tx_buff[SIPC5_DP_FMT_TX_BUFF_SZ]; + u8 fmt_tx_buff[DP_16K_FMT_TX_BUFF_SZ]; u16 raw_tx_head; u16 raw_tx_tail; - u8 raw_tx_buff[SIPC5_DP_RAW_TX_BUFF_SZ]; + u8 raw_tx_buff[DP_16K_RAW_TX_BUFF_SZ]; u16 fmt_rx_head; u16 fmt_rx_tail; - u8 fmt_rx_buff[SIPC5_DP_FMT_RX_BUFF_SZ]; + u8 fmt_rx_buff[DP_16K_FMT_RX_BUFF_SZ]; u16 raw_rx_head; u16 raw_rx_tail; - u8 raw_rx_buff[SIPC5_DP_RAW_RX_BUFF_SZ]; + u8 raw_rx_buff[DP_16K_RAW_RX_BUFF_SZ]; u16 mbx_cp2ap; u16 mbx_ap2cp; }; -#define DPRAM_MAX_SKB_SIZE 3072 /* 3 KB */ +#define DP_MAX_NAME_LEN 32 -#define DP_BOOT_REQ_OFFSET 0 -#define DP_BOOT_BUFF_OFFSET 4 -#define DP_BOOT_RESP_OFFSET 8 -#define DP_DLOAD_BUFF_OFFSET 4 -#define DP_ULOAD_BUFF_OFFSET 4 - -#define MAX_WQ_NAME_LENGTH 64 - -#define DPRAM_MAX_RXBQ_SIZE 256 - -struct dpram_rxb { - u8 *buff; - unsigned size; - - u8 *data; - unsigned len; -}; - -struct dpram_rxb_queue { - int size; - int in; - int out; - struct dpram_rxb *rxb; -}; +struct dpram_ext_op; struct dpram_link_device { struct link_device ld; - /* The mode of this DPRAM link device */ - enum dpram_link_mode mode; - /* DPRAM address and size */ - u32 dp_size; /* DPRAM size */ u8 __iomem *dp_base; /* DPRAM base virtual address */ + u32 dp_size; /* DPRAM size */ enum dpram_type dp_type; /* DPRAM type */ + /* DPRAM IRQ GPIO# */ + unsigned gpio_dpram_int; + /* DPRAM IRQ from CP */ int irq; + unsigned long irq_flags; + char irq_name[DP_MAX_NAME_LEN]; /* Link to DPRAM control functions dependent on each platform */ int max_ipc_dev; struct modemlink_dpram_control *dpctl; /* Physical configuration -> logical configuration */ - struct dpram_boot_map bt_map; + union { + struct dpram_boot_map bt_map; + struct qc_dpram_boot_map qc_bt_map; + }; + struct dpram_dload_map dl_map; struct dpram_uload_map ul_map; /* IPC device map */ - struct dpram_ipc_map *ipc_map; + struct dpram_ipc_map ipc_map; + /* Pointers (aliases) to IPC device map */ u16 __iomem *magic; u16 __iomem *access; struct dpram_ipc_device *dev[MAX_IPC_DEV]; @@ -335,45 +326,116 @@ struct dpram_link_device { u16 __iomem *mbx2cp; /* Wakelock for DPRAM device */ - struct wake_lock dpram_wake_lock; + struct wake_lock wlock; + char wlock_name[DP_MAX_NAME_LEN]; /* For booting */ + unsigned boot_start_complete; struct completion dpram_init_cmd; struct completion modem_pif_init_done; /* For UDL */ + struct tasklet_struct ul_tsk; + struct tasklet_struct dl_tsk; struct completion udl_start_complete; struct completion udl_cmd_complete; + struct dpram_udl_check udl_check; + struct dpram_udl_param udl_param; /* For CP RAM dump */ - struct completion crash_start_complete; + struct timer_list crash_ack_timer; struct completion dump_start_complete; struct completion dump_recv_done; struct timer_list dump_timer; int dump_rcvd; /* Count of dump packets received */ - /* For locking Tx process */ - spinlock_t tx_lock; + /* For locking TX process */ + spinlock_t tx_lock[MAX_IPC_DEV]; /* For efficient RX process */ struct tasklet_struct rx_tsk; struct dpram_rxb_queue rxbq[MAX_IPC_DEV]; - - /* For wake-up/sleep control */ - atomic_t accessing; + struct io_device *iod[MAX_IPC_DEV]; + bool use_skb; + struct sk_buff_head skb_rxq[MAX_IPC_DEV]; /* For retransmission after buffer full state */ atomic_t res_required[MAX_IPC_DEV]; + /* For wake-up/sleep control */ + atomic_t accessing; + /* Multi-purpose miscellaneous buffer */ u8 *buff; /* DPRAM IPC initialization status */ int dpram_init_status; + + /* Alias to device-specific IOCTL function */ + int (*ext_ioctl)(struct dpram_link_device *dpld, struct io_device *iod, + unsigned int cmd, unsigned long arg); + + /* Alias to DPRAM IRQ handler */ + irqreturn_t (*irq_handler)(int irq, void *data); + + /* For DPRAM dump */ + void (*dpram_dump)(struct link_device *ld, char *buff); + + /* Common operations for each DPRAM */ + void (*clear_intr)(struct dpram_link_device *dpld); + u16 (*recv_intr)(struct dpram_link_device *dpld); + void (*send_intr)(struct dpram_link_device *dpld, u16 mask); + u16 (*get_magic)(struct dpram_link_device *dpld); + void (*set_magic)(struct dpram_link_device *dpld, u16 value); + u16 (*get_access)(struct dpram_link_device *dpld); + void (*set_access)(struct dpram_link_device *dpld, u16 value); + u32 (*get_tx_head)(struct dpram_link_device *dpld, int id); + u32 (*get_tx_tail)(struct dpram_link_device *dpld, int id); + void (*set_tx_head)(struct dpram_link_device *dpld, int id, u32 head); + void (*set_tx_tail)(struct dpram_link_device *dpld, int id, u32 tail); + u8 *(*get_tx_buff)(struct dpram_link_device *dpld, int id); + u32 (*get_tx_buff_size)(struct dpram_link_device *dpld, int id); + u32 (*get_rx_head)(struct dpram_link_device *dpld, int id); + u32 (*get_rx_tail)(struct dpram_link_device *dpld, int id); + void (*set_rx_head)(struct dpram_link_device *dpld, int id, u32 head); + void (*set_rx_tail)(struct dpram_link_device *dpld, int id, u32 tail); + u8 *(*get_rx_buff)(struct dpram_link_device *dpld, int id); + u32 (*get_rx_buff_size)(struct dpram_link_device *dpld, int id); + u16 (*get_mask_req_ack)(struct dpram_link_device *dpld, int id); + u16 (*get_mask_res_ack)(struct dpram_link_device *dpld, int id); + u16 (*get_mask_send)(struct dpram_link_device *dpld, int id); + void (*ipc_rx_handler)(struct dpram_link_device *dpld, u16 int2ap); + + /* Extended operations for various modems */ + struct dpram_ext_op *ext_op; }; /* converts from struct link_device* to struct xxx_link_device* */ #define to_dpram_link_device(linkdev) \ container_of(linkdev, struct dpram_link_device, ld) +struct dpram_ext_op { + int exist; + + void (*init_boot_map)(struct dpram_link_device *dpld); + void (*init_dl_map)(struct dpram_link_device *dpld); + void (*init_ul_map)(struct dpram_link_device *dpld); + + int (*download_binary)(struct dpram_link_device *dpld, + struct sk_buff *skb); + + void (*cp_start_handler)(struct dpram_link_device *dpld); + + void (*crash_log)(struct dpram_link_device *dpld); + int (*dump_start)(struct dpram_link_device *dpld); + int (*dump_update)(struct dpram_link_device *dpld, void *arg); + + int (*ioctl)(struct dpram_link_device *dpld, struct io_device *iod, + unsigned int cmd, unsigned long arg); + + irqreturn_t (*irq_handler)(int irq, void *data); +}; + +struct dpram_ext_op *dpram_get_ext_op(enum modem_t modem); + #endif |