1*7e6ad469SVishal Kulkarni /*
2*7e6ad469SVishal Kulkarni  * This file and its contents are supplied under the terms of the
3*7e6ad469SVishal Kulkarni  * Common Development and Distribution License ("CDDL"), version 1.0.
4*7e6ad469SVishal Kulkarni  * You may only use this file in accordance with the terms of version
5*7e6ad469SVishal Kulkarni  * 1.0 of the CDDL.
6*7e6ad469SVishal Kulkarni  *
7*7e6ad469SVishal Kulkarni  * A full copy of the text of the CDDL should have accompanied this
8*7e6ad469SVishal Kulkarni  * source. A copy of the CDDL is also available via the Internet at
9*7e6ad469SVishal Kulkarni  * http://www.illumos.org/license/CDDL.
10*7e6ad469SVishal Kulkarni  */
11*7e6ad469SVishal Kulkarni 
12*7e6ad469SVishal Kulkarni /*-
13*7e6ad469SVishal Kulkarni  * Copyright (c) 2017 Chelsio Communications, Inc.
14*7e6ad469SVishal Kulkarni  * All rights reserved.
15*7e6ad469SVishal Kulkarni  *
16*7e6ad469SVishal Kulkarni  * Redistribution and use in source and binary forms, with or without
17*7e6ad469SVishal Kulkarni  * modification, are permitted provided that the following conditions
18*7e6ad469SVishal Kulkarni  * are met:
19*7e6ad469SVishal Kulkarni  * 1. Redistributions of source code must retain the above copyright
20*7e6ad469SVishal Kulkarni  *    notice, this list of conditions and the following disclaimer.
21*7e6ad469SVishal Kulkarni  * 2. Redistributions in binary form must reproduce the above copyright
22*7e6ad469SVishal Kulkarni  *    notice, this list of conditions and the following disclaimer in the
23*7e6ad469SVishal Kulkarni  *    documentation and/or other materials provided with the distribution.
24*7e6ad469SVishal Kulkarni  *
25*7e6ad469SVishal Kulkarni  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
26*7e6ad469SVishal Kulkarni  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27*7e6ad469SVishal Kulkarni  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28*7e6ad469SVishal Kulkarni  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
29*7e6ad469SVishal Kulkarni  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30*7e6ad469SVishal Kulkarni  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31*7e6ad469SVishal Kulkarni  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32*7e6ad469SVishal Kulkarni  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33*7e6ad469SVishal Kulkarni  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34*7e6ad469SVishal Kulkarni  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35*7e6ad469SVishal Kulkarni  * SUCH DAMAGE.
36*7e6ad469SVishal Kulkarni  *
37*7e6ad469SVishal Kulkarni  */
38*7e6ad469SVishal Kulkarni 
39*7e6ad469SVishal Kulkarni #ifndef __CUDBG_LIB_COMMON_H__
40*7e6ad469SVishal Kulkarni #define __CUDBG_LIB_COMMON_H__
41*7e6ad469SVishal Kulkarni 
42*7e6ad469SVishal Kulkarni #define CUDBG_EXT_DATA_BIT          0
43*7e6ad469SVishal Kulkarni #define CUDBG_EXT_DATA_VALID        (1 << CUDBG_EXT_DATA_BIT)
44*7e6ad469SVishal Kulkarni 
45*7e6ad469SVishal Kulkarni #ifdef _KERNEL
46*7e6ad469SVishal Kulkarni #include "common/t4_hw.h"
47*7e6ad469SVishal Kulkarni 
48*7e6ad469SVishal Kulkarni #define CUDBG_SF_MAX_SECTOR         (FLASH_CUDBG_START_SEC + FLASH_CUDBG_NSECS)
49*7e6ad469SVishal Kulkarni #define CUDBG_SF_SECTOR_SIZE        SF_SEC_SIZE
50*7e6ad469SVishal Kulkarni #define CUDBG_START_SEC             FLASH_CUDBG_START_SEC
51*7e6ad469SVishal Kulkarni #define CUDBG_FLASH_SIZE            FLASH_CUDBG_MAX_SIZE
52*7e6ad469SVishal Kulkarni 
53*7e6ad469SVishal Kulkarni struct cudbg_flash_sec_info {
54*7e6ad469SVishal Kulkarni 	int par_sec;		   /* Represent partially filled sector no */
55*7e6ad469SVishal Kulkarni 	int par_sec_offset;	   /* Offset in partially filled sector */
56*7e6ad469SVishal Kulkarni 	int cur_seq_no;
57*7e6ad469SVishal Kulkarni 	u32 max_seq_no;
58*7e6ad469SVishal Kulkarni 	u32 max_seq_sec;
59*7e6ad469SVishal Kulkarni 	u32 hdr_data_len;	   /* Total data */
60*7e6ad469SVishal Kulkarni 	u32 skip_size;		   /* Total size of large entities. */
61*7e6ad469SVishal Kulkarni 	u64 max_timestamp;
62*7e6ad469SVishal Kulkarni 	char sec_data[CUDBG_SF_SECTOR_SIZE];
63*7e6ad469SVishal Kulkarni 	u8 sec_bitmap[8];
64*7e6ad469SVishal Kulkarni };
65*7e6ad469SVishal Kulkarni 
66*7e6ad469SVishal Kulkarni void update_skip_size(struct cudbg_flash_sec_info *, u32);
67*7e6ad469SVishal Kulkarni #endif
68*7e6ad469SVishal Kulkarni #include "osdep.h"
69*7e6ad469SVishal Kulkarni 
70*7e6ad469SVishal Kulkarni struct cudbg_hdr {
71*7e6ad469SVishal Kulkarni 	u32 signature;
72*7e6ad469SVishal Kulkarni 	u32 hdr_len;
73*7e6ad469SVishal Kulkarni 	u16 major_ver;
74*7e6ad469SVishal Kulkarni 	u16 minor_ver;
75*7e6ad469SVishal Kulkarni 	u32 data_len;
76*7e6ad469SVishal Kulkarni 	u32 hdr_flags;
77*7e6ad469SVishal Kulkarni 	u16 max_entities;
78*7e6ad469SVishal Kulkarni 	u8 chip_ver;
79*7e6ad469SVishal Kulkarni 	u8 reserved1;
80*7e6ad469SVishal Kulkarni 	u32 reserved[8];
81*7e6ad469SVishal Kulkarni };
82*7e6ad469SVishal Kulkarni 
83*7e6ad469SVishal Kulkarni struct cudbg_entity_hdr {
84*7e6ad469SVishal Kulkarni 	u32 entity_type;
85*7e6ad469SVishal Kulkarni 	u32 start_offset;
86*7e6ad469SVishal Kulkarni 	u32 size;
87*7e6ad469SVishal Kulkarni 	int hdr_flags;
88*7e6ad469SVishal Kulkarni 	u32 sys_warn;
89*7e6ad469SVishal Kulkarni 	u32 sys_err;
90*7e6ad469SVishal Kulkarni 	u8 num_pad;
91*7e6ad469SVishal Kulkarni 	u8 flag;		/* bit 0 is used to indicate ext data */
92*7e6ad469SVishal Kulkarni 	u8 reserved1[2];
93*7e6ad469SVishal Kulkarni 	u32 next_ext_offset;	/* pointer to next extended entity meta data */
94*7e6ad469SVishal Kulkarni 	u32 reserved[5];
95*7e6ad469SVishal Kulkarni };
96*7e6ad469SVishal Kulkarni 
97*7e6ad469SVishal Kulkarni struct cudbg_ver_hdr {
98*7e6ad469SVishal Kulkarni 	u32 signature;
99*7e6ad469SVishal Kulkarni 	u16 revision;
100*7e6ad469SVishal Kulkarni 	u16 size;
101*7e6ad469SVishal Kulkarni };
102*7e6ad469SVishal Kulkarni 
103*7e6ad469SVishal Kulkarni struct cudbg_buffer {
104*7e6ad469SVishal Kulkarni 	u32 size;
105*7e6ad469SVishal Kulkarni 	u32 offset;
106*7e6ad469SVishal Kulkarni 	char *data;
107*7e6ad469SVishal Kulkarni };
108*7e6ad469SVishal Kulkarni 
109*7e6ad469SVishal Kulkarni struct cudbg_error {
110*7e6ad469SVishal Kulkarni 	int sys_err;
111*7e6ad469SVishal Kulkarni 	int sys_warn;
112*7e6ad469SVishal Kulkarni 	int app_err;
113*7e6ad469SVishal Kulkarni };
114*7e6ad469SVishal Kulkarni 
115*7e6ad469SVishal Kulkarni #define HTONL_NIBBLE(data) ( \
116*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) >> 28) & 0x0000000F) | \
117*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) >> 20)  & 0x000000F0) | \
118*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) >> 12)  & 0x00000F00) | \
119*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) >> 4) & 0x0000F000) | \
120*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) << 4) & 0x000F0000) | \
121*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) << 12)  & 0x00F00000) | \
122*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) << 20)  & 0x0F000000) | \
123*7e6ad469SVishal Kulkarni 			    (((uint32_t)(data) << 28) & 0xF0000000))
124*7e6ad469SVishal Kulkarni 
125*7e6ad469SVishal Kulkarni #define CDUMP_MAX_COMP_BUF_SIZE    ((64 * 1024) - 1)
126*7e6ad469SVishal Kulkarni #define CUDBG_CHUNK_SIZE  ((CDUMP_MAX_COMP_BUF_SIZE/1024) * 1024)
127*7e6ad469SVishal Kulkarni 
128*7e6ad469SVishal Kulkarni #define CUDBG_LEGACY_SIGNATURE 123
129*7e6ad469SVishal Kulkarni #define CUDBG_SIGNATURE 67856866 /* CUDB in ascii */
130*7e6ad469SVishal Kulkarni #define CUDBG_FL_SIGNATURE 0x4355464c /* CUFL in ascii */
131*7e6ad469SVishal Kulkarni 
132*7e6ad469SVishal Kulkarni #define CUDBG_FL_MAJOR_VERSION	    1
133*7e6ad469SVishal Kulkarni #define CUDBG_FL_MINOR_VERSION	    1
134*7e6ad469SVishal Kulkarni #define CUDBG_FL_BUILD_VERSION	    0
135*7e6ad469SVishal Kulkarni 
136*7e6ad469SVishal Kulkarni int write_compression_hdr(struct cudbg_buffer *, struct cudbg_buffer *);
137*7e6ad469SVishal Kulkarni int compress_buff(struct cudbg_buffer *, struct cudbg_buffer *);
138*7e6ad469SVishal Kulkarni int get_scratch_buff(struct cudbg_buffer *, u32, struct cudbg_buffer *);
139*7e6ad469SVishal Kulkarni void release_scratch_buff(struct cudbg_buffer *, struct cudbg_buffer *);
140*7e6ad469SVishal Kulkarni int decompress_buffer(struct cudbg_buffer *, struct cudbg_buffer *);
141*7e6ad469SVishal Kulkarni int validate_buffer(struct cudbg_buffer *compressed_buffer);
142*7e6ad469SVishal Kulkarni int decompress_buffer_wrapper(struct cudbg_buffer *pc_buff,
143*7e6ad469SVishal Kulkarni 			      struct cudbg_buffer *pdc_buff);
144*7e6ad469SVishal Kulkarni int get_entity_rev(struct cudbg_ver_hdr *ver_hdr);
145*7e6ad469SVishal Kulkarni void sort_t(void *base, int num, int size,
146*7e6ad469SVishal Kulkarni 	    int (*cmp_func)(const void *, const void *),
147*7e6ad469SVishal Kulkarni 	    void (*swap_func)(void *, void *, int size));
148*7e6ad469SVishal Kulkarni int cudbg_read_flash(void *handle, void *data, u32 size, int data_flag);
149*7e6ad469SVishal Kulkarni int cudbg_write_flash(void *handle, u64 timestamp, void *data,
150*7e6ad469SVishal Kulkarni 		      u32 start_offset, u32 start_hdr_offset,
151*7e6ad469SVishal Kulkarni 		      u32 cur_entity_size,
152*7e6ad469SVishal Kulkarni 		      u32 ext_size);
153*7e6ad469SVishal Kulkarni #endif
154