Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *  Copyright (C) 2018 Chelsio Communications.  All rights reserved.
0004  */
0005 
0006 #include <linux/zlib.h>
0007 
0008 #include "cxgb4.h"
0009 #include "cudbg_if.h"
0010 #include "cudbg_lib_common.h"
0011 #include "cudbg_zlib.h"
0012 
0013 static int cudbg_get_compress_hdr(struct cudbg_buffer *pdbg_buff,
0014                   struct cudbg_buffer *pin_buff)
0015 {
0016     if (pdbg_buff->offset + sizeof(struct cudbg_compress_hdr) >
0017         pdbg_buff->size)
0018         return CUDBG_STATUS_NO_MEM;
0019 
0020     pin_buff->data = (char *)pdbg_buff->data + pdbg_buff->offset;
0021     pin_buff->offset = 0;
0022     pin_buff->size = sizeof(struct cudbg_compress_hdr);
0023     pdbg_buff->offset += sizeof(struct cudbg_compress_hdr);
0024     return 0;
0025 }
0026 
0027 int cudbg_compress_buff(struct cudbg_init *pdbg_init,
0028             struct cudbg_buffer *pin_buff,
0029             struct cudbg_buffer *pout_buff)
0030 {
0031     struct cudbg_buffer temp_buff = { 0 };
0032     struct z_stream_s compress_stream;
0033     struct cudbg_compress_hdr *c_hdr;
0034     int rc;
0035 
0036     /* Write compression header to output buffer before compression */
0037     rc = cudbg_get_compress_hdr(pout_buff, &temp_buff);
0038     if (rc)
0039         return rc;
0040 
0041     c_hdr = (struct cudbg_compress_hdr *)temp_buff.data;
0042     c_hdr->compress_id = CUDBG_ZLIB_COMPRESS_ID;
0043 
0044     memset(&compress_stream, 0, sizeof(struct z_stream_s));
0045     compress_stream.workspace = pdbg_init->workspace;
0046     rc = zlib_deflateInit2(&compress_stream, Z_DEFAULT_COMPRESSION,
0047                    Z_DEFLATED, CUDBG_ZLIB_WIN_BITS,
0048                    CUDBG_ZLIB_MEM_LVL, Z_DEFAULT_STRATEGY);
0049     if (rc != Z_OK)
0050         return CUDBG_SYSTEM_ERROR;
0051 
0052     compress_stream.next_in = pin_buff->data;
0053     compress_stream.avail_in = pin_buff->size;
0054     compress_stream.next_out = pout_buff->data + pout_buff->offset;
0055     compress_stream.avail_out = pout_buff->size - pout_buff->offset;
0056 
0057     rc = zlib_deflate(&compress_stream, Z_FINISH);
0058     if (rc != Z_STREAM_END)
0059         return CUDBG_SYSTEM_ERROR;
0060 
0061     rc = zlib_deflateEnd(&compress_stream);
0062     if (rc != Z_OK)
0063         return CUDBG_SYSTEM_ERROR;
0064 
0065     c_hdr->compress_size = compress_stream.total_out;
0066     c_hdr->decompress_size = pin_buff->size;
0067     pout_buff->offset += compress_stream.total_out;
0068 
0069     return 0;
0070 }