178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "qat_freebsd.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg.h"
578ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
678ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
778ee8d1cSJulian Grajkowski #include "icp_qat_uclo.h"
878ee8d1cSJulian Grajkowski #include "icp_qat_fw.h"
978ee8d1cSJulian Grajkowski #include "icp_qat_fw_init_admin.h"
1078ee8d1cSJulian Grajkowski #include "adf_cfg_strings.h"
1178ee8d1cSJulian Grajkowski #include "adf_transport_access_macros.h"
1278ee8d1cSJulian Grajkowski #include "adf_transport_internal.h"
1378ee8d1cSJulian Grajkowski #include "adf_heartbeat.h"
1478ee8d1cSJulian Grajkowski #include <sys/types.h>
1578ee8d1cSJulian Grajkowski #include <sys/lock.h>
1678ee8d1cSJulian Grajkowski #include <sys/sx.h>
1778ee8d1cSJulian Grajkowski #include <sys/malloc.h>
1878ee8d1cSJulian Grajkowski #include <sys/systm.h>
1978ee8d1cSJulian Grajkowski #include <dev/pci/pcivar.h>
2078ee8d1cSJulian Grajkowski #include <machine/bus_dma.h>
2178ee8d1cSJulian Grajkowski 
2278ee8d1cSJulian Grajkowski #include <linux/delay.h>
2378ee8d1cSJulian Grajkowski 
2478ee8d1cSJulian Grajkowski #define ADF_CONST_TABLE_VERSION_BYTE (0)
2578ee8d1cSJulian Grajkowski /* Keep version number in range 0-255 */
2678ee8d1cSJulian Grajkowski #define ADF_CONST_TABLE_VERSION (1)
2778ee8d1cSJulian Grajkowski 
2878ee8d1cSJulian Grajkowski /* Admin Messages Registers */
29a977168cSMichal Gulbicki #define ADF_MAILBOX_STRIDE 0x1000
3078ee8d1cSJulian Grajkowski #define ADF_ADMINMSG_LEN 32
3178ee8d1cSJulian Grajkowski #define FREEBSD_ALLIGNMENT_SIZE 64
3278ee8d1cSJulian Grajkowski #define ADF_INIT_CONFIG_SIZE 1024
3378ee8d1cSJulian Grajkowski 
3478ee8d1cSJulian Grajkowski static u8 const_tab[1024] __aligned(1024) = {
3578ee8d1cSJulian Grajkowski ADF_CONST_TABLE_VERSION,
3678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3778ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3978ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4178ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
4278ee8d1cSJulian Grajkowski 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
4378ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4478ee8d1cSJulian Grajkowski 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
4578ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01,
4678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
4778ee8d1cSJulian Grajkowski 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00,
4878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13,
4978ee8d1cSJulian Grajkowski 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
5078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
5178ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5278ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5378ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5478ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5578ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5778ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
5978ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6078ee8d1cSJulian Grajkowski 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76,
6178ee8d1cSJulian Grajkowski 0x54, 0x32, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6278ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab,
6378ee8d1cSJulian Grajkowski 0x89, 0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0,
6478ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6578ee8d1cSJulian Grajkowski 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
6678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x05, 0x9e,
6778ee8d1cSJulian Grajkowski 0xd8, 0x36, 0x7c, 0xd5, 0x07, 0x30, 0x70, 0xdd, 0x17, 0xf7, 0x0e, 0x59, 0x39,
6878ee8d1cSJulian Grajkowski 0xff, 0xc0, 0x0b, 0x31, 0x68, 0x58, 0x15, 0x11, 0x64, 0xf9, 0x8f, 0xa7, 0xbe,
6978ee8d1cSJulian Grajkowski 0xfa, 0x4f, 0xa4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xbb, 0x67, 0xae,
7178ee8d1cSJulian Grajkowski 0x85, 0x3c, 0x6e, 0xf3, 0x72, 0xa5, 0x4f, 0xf5, 0x3a, 0x51, 0x0e, 0x52, 0x7f,
7278ee8d1cSJulian Grajkowski 0x9b, 0x05, 0x68, 0x8c, 0x1f, 0x83, 0xd9, 0xab, 0x5b, 0xe0, 0xcd, 0x19, 0x05,
7378ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7478ee8d1cSJulian Grajkowski 0x00, 0x00, 0xcb, 0xbb, 0x9d, 0x5d, 0xc1, 0x05, 0x9e, 0xd8, 0x62, 0x9a, 0x29,
7578ee8d1cSJulian Grajkowski 0x2a, 0x36, 0x7c, 0xd5, 0x07, 0x91, 0x59, 0x01, 0x5a, 0x30, 0x70, 0xdd, 0x17,
7678ee8d1cSJulian Grajkowski 0x15, 0x2f, 0xec, 0xd8, 0xf7, 0x0e, 0x59, 0x39, 0x67, 0x33, 0x26, 0x67, 0xff,
7778ee8d1cSJulian Grajkowski 0xc0, 0x0b, 0x31, 0x8e, 0xb4, 0x4a, 0x87, 0x68, 0x58, 0x15, 0x11, 0xdb, 0x0c,
7878ee8d1cSJulian Grajkowski 0x2e, 0x0d, 0x64, 0xf9, 0x8f, 0xa7, 0x47, 0xb5, 0x48, 0x1d, 0xbe, 0xfa, 0x4f,
7978ee8d1cSJulian Grajkowski 0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb,
8178ee8d1cSJulian Grajkowski 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94,
8278ee8d1cSJulian Grajkowski 0xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52,
8378ee8d1cSJulian Grajkowski 0x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f,
8478ee8d1cSJulian Grajkowski 0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13,
8578ee8d1cSJulian Grajkowski 0x7e, 0x21, 0x79, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8678ee8d1cSJulian Grajkowski 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8778ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
8878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18,
8978ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00,
9178ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9278ee8d1cSJulian Grajkowski 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x00,
9378ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x02,
9478ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
9578ee8d1cSJulian Grajkowski 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
9678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25,
9778ee8d1cSJulian Grajkowski 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
9878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00,
9978ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10078ee8d1cSJulian Grajkowski 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00,
10178ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x01,
10278ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10378ee8d1cSJulian Grajkowski 0x00, 0x2B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
10478ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10578ee8d1cSJulian Grajkowski 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00,
10678ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
10778ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10878ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10978ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11078ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11178ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11278ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11378ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11478ee8d1cSJulian Grajkowski 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
11578ee8d1cSJulian Grajkowski 
11678ee8d1cSJulian Grajkowski #define ADF_ADMIN_POLL_INTERVAL_US 20
11778ee8d1cSJulian Grajkowski #define ADF_ADMIN_POLL_RETRIES 5000
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski static void
dma_callback(void * arg,bus_dma_segment_t * segs,int nseg,int error)12078ee8d1cSJulian Grajkowski dma_callback(void *arg, bus_dma_segment_t *segs, int nseg, int error)
12178ee8d1cSJulian Grajkowski {
12278ee8d1cSJulian Grajkowski 	bus_addr_t *addr;
12378ee8d1cSJulian Grajkowski 
12478ee8d1cSJulian Grajkowski 	addr = arg;
12578ee8d1cSJulian Grajkowski 	if (error == 0 && nseg == 1)
12678ee8d1cSJulian Grajkowski 		*addr = segs[0].ds_addr;
12778ee8d1cSJulian Grajkowski 	else
12878ee8d1cSJulian Grajkowski 		*addr = 0;
12978ee8d1cSJulian Grajkowski }
13078ee8d1cSJulian Grajkowski 
13178ee8d1cSJulian Grajkowski int
adf_put_admin_msg_sync(struct adf_accel_dev * accel_dev,u32 ae,void * in,void * out)13278ee8d1cSJulian Grajkowski adf_put_admin_msg_sync(struct adf_accel_dev *accel_dev,
13378ee8d1cSJulian Grajkowski 		       u32 ae,
13478ee8d1cSJulian Grajkowski 		       void *in,
13578ee8d1cSJulian Grajkowski 		       void *out)
13678ee8d1cSJulian Grajkowski {
13778ee8d1cSJulian Grajkowski 	struct adf_admin_comms *admin = accel_dev->admin;
13878ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
13978ee8d1cSJulian Grajkowski 	struct resource *mailbox = admin->mailbox_addr;
14078ee8d1cSJulian Grajkowski 	struct admin_info admin_csrs_info;
14178ee8d1cSJulian Grajkowski 
14278ee8d1cSJulian Grajkowski 	hw_data->get_admin_info(&admin_csrs_info);
14378ee8d1cSJulian Grajkowski 	int offset = ae * ADF_ADMINMSG_LEN * 2;
14478ee8d1cSJulian Grajkowski 	int mb_offset =
145a977168cSMichal Gulbicki 	    ae * ADF_MAILBOX_STRIDE + admin_csrs_info.mailbox_offset;
14678ee8d1cSJulian Grajkowski 
14778ee8d1cSJulian Grajkowski 	int times, received;
14878ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req *request = in;
14978ee8d1cSJulian Grajkowski 
15078ee8d1cSJulian Grajkowski 	sx_xlock(&admin->lock);
15178ee8d1cSJulian Grajkowski 
15278ee8d1cSJulian Grajkowski 	if (ADF_CSR_RD(mailbox, mb_offset) == 1) {
15378ee8d1cSJulian Grajkowski 		sx_xunlock(&admin->lock);
15478ee8d1cSJulian Grajkowski 		return EAGAIN;
15578ee8d1cSJulian Grajkowski 	}
15678ee8d1cSJulian Grajkowski 
15778ee8d1cSJulian Grajkowski 	memcpy(admin->virt_addr + offset, in, ADF_ADMINMSG_LEN);
15878ee8d1cSJulian Grajkowski 	ADF_CSR_WR(mailbox, mb_offset, 1);
15978ee8d1cSJulian Grajkowski 	received = 0;
16078ee8d1cSJulian Grajkowski 	for (times = 0; times < ADF_ADMIN_POLL_RETRIES; times++) {
16178ee8d1cSJulian Grajkowski 		usleep_range(ADF_ADMIN_POLL_INTERVAL_US,
16278ee8d1cSJulian Grajkowski 			     ADF_ADMIN_POLL_INTERVAL_US * 2);
16378ee8d1cSJulian Grajkowski 		if (ADF_CSR_RD(mailbox, mb_offset) == 0) {
16478ee8d1cSJulian Grajkowski 			received = 1;
16578ee8d1cSJulian Grajkowski 			break;
16678ee8d1cSJulian Grajkowski 		}
16778ee8d1cSJulian Grajkowski 	}
16878ee8d1cSJulian Grajkowski 	if (received)
16978ee8d1cSJulian Grajkowski 		memcpy(out,
17078ee8d1cSJulian Grajkowski 		       admin->virt_addr + offset + ADF_ADMINMSG_LEN,
17178ee8d1cSJulian Grajkowski 		       ADF_ADMINMSG_LEN);
17278ee8d1cSJulian Grajkowski 	else
17378ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
17478ee8d1cSJulian Grajkowski 			      "Failed to send admin msg %d to accelerator %d\n",
17578ee8d1cSJulian Grajkowski 			      request->cmd_id,
17678ee8d1cSJulian Grajkowski 			      ae);
17778ee8d1cSJulian Grajkowski 
17878ee8d1cSJulian Grajkowski 	sx_xunlock(&admin->lock);
17978ee8d1cSJulian Grajkowski 	return received ? 0 : EFAULT;
18078ee8d1cSJulian Grajkowski }
18178ee8d1cSJulian Grajkowski 
18278ee8d1cSJulian Grajkowski static inline int
adf_set_dc_ibuf(struct adf_accel_dev * accel_dev,struct icp_qat_fw_init_admin_req * req)18378ee8d1cSJulian Grajkowski adf_set_dc_ibuf(struct adf_accel_dev *accel_dev,
18478ee8d1cSJulian Grajkowski 		struct icp_qat_fw_init_admin_req *req)
18578ee8d1cSJulian Grajkowski {
18678ee8d1cSJulian Grajkowski 	char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
18778ee8d1cSJulian Grajkowski 	unsigned long ibuf_size = 0;
18878ee8d1cSJulian Grajkowski 
18978ee8d1cSJulian Grajkowski 	if (!adf_cfg_get_param_value(
19078ee8d1cSJulian Grajkowski 		accel_dev, ADF_GENERAL_SEC, ADF_INTER_BUF_SIZE, val)) {
19178ee8d1cSJulian Grajkowski 		if (compat_strtoul(val, 0, &ibuf_size))
19278ee8d1cSJulian Grajkowski 			return EFAULT;
19378ee8d1cSJulian Grajkowski 	}
19478ee8d1cSJulian Grajkowski 
19578ee8d1cSJulian Grajkowski 	if (ibuf_size != 32 && ibuf_size != 64)
19678ee8d1cSJulian Grajkowski 		ibuf_size = 64;
19778ee8d1cSJulian Grajkowski 
19878ee8d1cSJulian Grajkowski 	req->ibuf_size_in_kb = ibuf_size;
19978ee8d1cSJulian Grajkowski 
20078ee8d1cSJulian Grajkowski 	return 0;
20178ee8d1cSJulian Grajkowski }
20278ee8d1cSJulian Grajkowski 
20378ee8d1cSJulian Grajkowski int
adf_send_admin(struct adf_accel_dev * accel_dev,struct icp_qat_fw_init_admin_req * req,struct icp_qat_fw_init_admin_resp * resp,u32 ae_mask)20478ee8d1cSJulian Grajkowski adf_send_admin(struct adf_accel_dev *accel_dev,
20578ee8d1cSJulian Grajkowski 	       struct icp_qat_fw_init_admin_req *req,
20678ee8d1cSJulian Grajkowski 	       struct icp_qat_fw_init_admin_resp *resp,
20778ee8d1cSJulian Grajkowski 	       u32 ae_mask)
20878ee8d1cSJulian Grajkowski {
20978ee8d1cSJulian Grajkowski 	int i;
21078ee8d1cSJulian Grajkowski 	unsigned int mask;
21178ee8d1cSJulian Grajkowski 
21278ee8d1cSJulian Grajkowski 	for (i = 0, mask = ae_mask; mask; i++, mask >>= 1) {
21378ee8d1cSJulian Grajkowski 		if (!(mask & 1))
21478ee8d1cSJulian Grajkowski 			continue;
21578ee8d1cSJulian Grajkowski 		if (adf_put_admin_msg_sync(accel_dev, i, req, resp) ||
21678ee8d1cSJulian Grajkowski 		    resp->status)
21778ee8d1cSJulian Grajkowski 			return EFAULT;
21878ee8d1cSJulian Grajkowski 	}
21978ee8d1cSJulian Grajkowski 
22078ee8d1cSJulian Grajkowski 	return 0;
22178ee8d1cSJulian Grajkowski }
22278ee8d1cSJulian Grajkowski 
22378ee8d1cSJulian Grajkowski static int
adf_init_me(struct adf_accel_dev * accel_dev)22478ee8d1cSJulian Grajkowski adf_init_me(struct adf_accel_dev *accel_dev)
22578ee8d1cSJulian Grajkowski {
22678ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
22778ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp;
22878ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_device = accel_dev->hw_device;
22978ee8d1cSJulian Grajkowski 	u32 ae_mask = hw_device->ae_mask;
23078ee8d1cSJulian Grajkowski 
23178ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
23278ee8d1cSJulian Grajkowski 	explicit_bzero(&resp, sizeof(resp));
23378ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_INIT_ME;
23478ee8d1cSJulian Grajkowski 
23578ee8d1cSJulian Grajkowski 	if (adf_set_dc_ibuf(accel_dev, &req))
23678ee8d1cSJulian Grajkowski 		return EFAULT;
23778ee8d1cSJulian Grajkowski 	if (accel_dev->aram_info) {
23878ee8d1cSJulian Grajkowski 		req.init_cfg_sz = sizeof(*accel_dev->aram_info);
23978ee8d1cSJulian Grajkowski 		req.init_cfg_ptr = (u64)accel_dev->admin->aram_map_phys_addr;
24078ee8d1cSJulian Grajkowski 	}
24178ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &resp, ae_mask))
24278ee8d1cSJulian Grajkowski 		return EFAULT;
24378ee8d1cSJulian Grajkowski 
24478ee8d1cSJulian Grajkowski 	return 0;
24578ee8d1cSJulian Grajkowski }
24678ee8d1cSJulian Grajkowski 
24778ee8d1cSJulian Grajkowski static int
adf_set_heartbeat_timer(struct adf_accel_dev * accel_dev)24878ee8d1cSJulian Grajkowski adf_set_heartbeat_timer(struct adf_accel_dev *accel_dev)
24978ee8d1cSJulian Grajkowski {
25078ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
25178ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp;
25278ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_device = accel_dev->hw_device;
25378ee8d1cSJulian Grajkowski 	u32 ae_mask = hw_device->ae_mask;
25478ee8d1cSJulian Grajkowski 	u32 heartbeat_ticks;
25578ee8d1cSJulian Grajkowski 
25678ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
25778ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_HEARTBEAT_TIMER_SET;
25878ee8d1cSJulian Grajkowski 	req.hb_cfg_ptr = accel_dev->admin->phy_hb_addr;
25978ee8d1cSJulian Grajkowski 	if (adf_get_hb_timer(accel_dev, &heartbeat_ticks))
26078ee8d1cSJulian Grajkowski 		return EINVAL;
26178ee8d1cSJulian Grajkowski 	req.heartbeat_ticks = heartbeat_ticks;
26278ee8d1cSJulian Grajkowski 
26378ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &resp, ae_mask))
26478ee8d1cSJulian Grajkowski 		return EFAULT;
26578ee8d1cSJulian Grajkowski 
26678ee8d1cSJulian Grajkowski 	return 0;
26778ee8d1cSJulian Grajkowski }
26878ee8d1cSJulian Grajkowski 
26978ee8d1cSJulian Grajkowski static int
adf_get_dc_capabilities(struct adf_accel_dev * accel_dev,u32 * capabilities)27078ee8d1cSJulian Grajkowski adf_get_dc_capabilities(struct adf_accel_dev *accel_dev, u32 *capabilities)
27178ee8d1cSJulian Grajkowski {
27278ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
27378ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp;
27478ee8d1cSJulian Grajkowski 	u32 ae_mask = 1;
27578ee8d1cSJulian Grajkowski 
27678ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
27778ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_COMP_CAPABILITY_GET;
27878ee8d1cSJulian Grajkowski 
27978ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &resp, ae_mask))
28078ee8d1cSJulian Grajkowski 		return EFAULT;
28178ee8d1cSJulian Grajkowski 
28278ee8d1cSJulian Grajkowski 	*capabilities = resp.extended_features;
28378ee8d1cSJulian Grajkowski 
28478ee8d1cSJulian Grajkowski 	return 0;
28578ee8d1cSJulian Grajkowski }
28678ee8d1cSJulian Grajkowski 
28778ee8d1cSJulian Grajkowski static int
adf_set_fw_constants(struct adf_accel_dev * accel_dev)28878ee8d1cSJulian Grajkowski adf_set_fw_constants(struct adf_accel_dev *accel_dev)
28978ee8d1cSJulian Grajkowski {
29078ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
29178ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp;
29278ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_device = accel_dev->hw_device;
293a977168cSMichal Gulbicki 	u32 ae_mask = hw_device->admin_ae_mask;
29478ee8d1cSJulian Grajkowski 
29578ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
29678ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_CONSTANTS_CFG;
29778ee8d1cSJulian Grajkowski 
29878ee8d1cSJulian Grajkowski 	req.init_cfg_sz = sizeof(const_tab);
29978ee8d1cSJulian Grajkowski 	req.init_cfg_ptr = accel_dev->admin->const_tbl_addr;
30078ee8d1cSJulian Grajkowski 
30178ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &resp, ae_mask))
30278ee8d1cSJulian Grajkowski 		return EFAULT;
30378ee8d1cSJulian Grajkowski 
30478ee8d1cSJulian Grajkowski 	return 0;
30578ee8d1cSJulian Grajkowski }
30678ee8d1cSJulian Grajkowski 
30778ee8d1cSJulian Grajkowski static int
adf_get_fw_status(struct adf_accel_dev * accel_dev,u8 * major,u8 * minor,u8 * patch)30878ee8d1cSJulian Grajkowski adf_get_fw_status(struct adf_accel_dev *accel_dev,
30978ee8d1cSJulian Grajkowski 		  u8 *major,
31078ee8d1cSJulian Grajkowski 		  u8 *minor,
31178ee8d1cSJulian Grajkowski 		  u8 *patch)
31278ee8d1cSJulian Grajkowski {
31378ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
31478ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp;
31578ee8d1cSJulian Grajkowski 	u32 ae_mask = 1;
31678ee8d1cSJulian Grajkowski 
31778ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
31878ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_STATUS_GET;
31978ee8d1cSJulian Grajkowski 
32078ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &resp, ae_mask))
32178ee8d1cSJulian Grajkowski 		return EFAULT;
32278ee8d1cSJulian Grajkowski 
32378ee8d1cSJulian Grajkowski 	*major = resp.version_major_num;
32478ee8d1cSJulian Grajkowski 	*minor = resp.version_minor_num;
32578ee8d1cSJulian Grajkowski 	*patch = resp.version_patch_num;
32678ee8d1cSJulian Grajkowski 
32778ee8d1cSJulian Grajkowski 	return 0;
32878ee8d1cSJulian Grajkowski }
32978ee8d1cSJulian Grajkowski 
33078ee8d1cSJulian Grajkowski int
adf_get_fw_timestamp(struct adf_accel_dev * accel_dev,u64 * timestamp)33178ee8d1cSJulian Grajkowski adf_get_fw_timestamp(struct adf_accel_dev *accel_dev, u64 *timestamp)
33278ee8d1cSJulian Grajkowski {
33378ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req;
33478ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp rsp;
33578ee8d1cSJulian Grajkowski 	unsigned int ae_mask = 1;
33678ee8d1cSJulian Grajkowski 
33778ee8d1cSJulian Grajkowski 	if (!accel_dev || !timestamp)
33878ee8d1cSJulian Grajkowski 		return EFAULT;
33978ee8d1cSJulian Grajkowski 
34078ee8d1cSJulian Grajkowski 	explicit_bzero(&req, sizeof(req));
34178ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_TIMER_GET;
34278ee8d1cSJulian Grajkowski 
34378ee8d1cSJulian Grajkowski 	if (adf_send_admin(accel_dev, &req, &rsp, ae_mask))
34478ee8d1cSJulian Grajkowski 		return EFAULT;
34578ee8d1cSJulian Grajkowski 
34678ee8d1cSJulian Grajkowski 	*timestamp = rsp.timestamp;
34778ee8d1cSJulian Grajkowski 	return 0;
34878ee8d1cSJulian Grajkowski }
34978ee8d1cSJulian Grajkowski 
35078ee8d1cSJulian Grajkowski int
adf_get_fw_pke_stats(struct adf_accel_dev * accel_dev,u64 * suc_count,u64 * unsuc_count)35178ee8d1cSJulian Grajkowski adf_get_fw_pke_stats(struct adf_accel_dev *accel_dev,
35278ee8d1cSJulian Grajkowski 		     u64 *suc_count,
35378ee8d1cSJulian Grajkowski 		     u64 *unsuc_count)
35478ee8d1cSJulian Grajkowski {
35578ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_req req = { 0 };
35678ee8d1cSJulian Grajkowski 	struct icp_qat_fw_init_admin_resp resp = { 0 };
35778ee8d1cSJulian Grajkowski 	unsigned long sym_ae_msk = 0;
35878ee8d1cSJulian Grajkowski 	u8 sym_ae_msk_size = 0;
35978ee8d1cSJulian Grajkowski 	u8 i = 0;
36078ee8d1cSJulian Grajkowski 
36178ee8d1cSJulian Grajkowski 	if (!suc_count || !unsuc_count)
36278ee8d1cSJulian Grajkowski 		return EFAULT;
36378ee8d1cSJulian Grajkowski 
36478ee8d1cSJulian Grajkowski 	sym_ae_msk = accel_dev->au_info->sym_ae_msk;
36578ee8d1cSJulian Grajkowski 	sym_ae_msk_size =
36678ee8d1cSJulian Grajkowski 	    sizeof(accel_dev->au_info->sym_ae_msk) * BITS_PER_BYTE;
36778ee8d1cSJulian Grajkowski 
36878ee8d1cSJulian Grajkowski 	req.cmd_id = ICP_QAT_FW_PKE_REPLAY_STATS_GET;
36978ee8d1cSJulian Grajkowski 	for_each_set_bit(i, &sym_ae_msk, sym_ae_msk_size)
37078ee8d1cSJulian Grajkowski 	{
37178ee8d1cSJulian Grajkowski 		memset(&resp, 0, sizeof(struct icp_qat_fw_init_admin_resp));
37278ee8d1cSJulian Grajkowski 		if (adf_put_admin_msg_sync(accel_dev, i, &req, &resp) ||
37378ee8d1cSJulian Grajkowski 		    resp.status) {
37478ee8d1cSJulian Grajkowski 			return EFAULT;
37578ee8d1cSJulian Grajkowski 		}
37678ee8d1cSJulian Grajkowski 		*suc_count += resp.successful_count;
37778ee8d1cSJulian Grajkowski 		*unsuc_count += resp.unsuccessful_count;
37878ee8d1cSJulian Grajkowski 	}
37978ee8d1cSJulian Grajkowski 	return 0;
38078ee8d1cSJulian Grajkowski }
38178ee8d1cSJulian Grajkowski 
38278ee8d1cSJulian Grajkowski /**
38378ee8d1cSJulian Grajkowski  * adf_send_admin_init() - Function sends init message to FW
38478ee8d1cSJulian Grajkowski  * @accel_dev: Pointer to acceleration device.
38578ee8d1cSJulian Grajkowski  *
38678ee8d1cSJulian Grajkowski  * Function sends admin init message to the FW
38778ee8d1cSJulian Grajkowski  *
38878ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
38978ee8d1cSJulian Grajkowski  */
39078ee8d1cSJulian Grajkowski int
adf_send_admin_init(struct adf_accel_dev * accel_dev)39178ee8d1cSJulian Grajkowski adf_send_admin_init(struct adf_accel_dev *accel_dev)
39278ee8d1cSJulian Grajkowski {
39378ee8d1cSJulian Grajkowski 	int ret;
39478ee8d1cSJulian Grajkowski 	u32 dc_capabilities = 0;
39578ee8d1cSJulian Grajkowski 	unsigned int storage_enabled = 0;
39678ee8d1cSJulian Grajkowski 
39778ee8d1cSJulian Grajkowski 	if (GET_HW_DATA(accel_dev)->query_storage_cap) {
39878ee8d1cSJulian Grajkowski 		ret = adf_get_dc_capabilities(accel_dev, &dc_capabilities);
39978ee8d1cSJulian Grajkowski 		if (ret) {
40078ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
40178ee8d1cSJulian Grajkowski 				      "Cannot get dc capabilities\n");
40278ee8d1cSJulian Grajkowski 			return ret;
40378ee8d1cSJulian Grajkowski 		}
40478ee8d1cSJulian Grajkowski 		accel_dev->hw_device->extended_dc_capabilities =
40578ee8d1cSJulian Grajkowski 		    dc_capabilities;
40678ee8d1cSJulian Grajkowski 	} else {
40778ee8d1cSJulian Grajkowski 		ret = GET_HW_DATA(accel_dev)->get_storage_enabled(
40878ee8d1cSJulian Grajkowski 		    accel_dev, &storage_enabled);
40978ee8d1cSJulian Grajkowski 		if (ret) {
41078ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
41178ee8d1cSJulian Grajkowski 				      "Cannot get storage enabled\n");
41278ee8d1cSJulian Grajkowski 			return ret;
41378ee8d1cSJulian Grajkowski 		}
41478ee8d1cSJulian Grajkowski 	}
41578ee8d1cSJulian Grajkowski 
41678ee8d1cSJulian Grajkowski 	ret = adf_set_heartbeat_timer(accel_dev);
41778ee8d1cSJulian Grajkowski 	if (ret) {
41878ee8d1cSJulian Grajkowski 		if (ret == EINVAL) {
41978ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
42078ee8d1cSJulian Grajkowski 				      "Cannot set heartbeat timer\n");
42178ee8d1cSJulian Grajkowski 			return ret;
42278ee8d1cSJulian Grajkowski 		}
42378ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
42478ee8d1cSJulian Grajkowski 			      "Heartbeat is not supported\n");
42578ee8d1cSJulian Grajkowski 	}
42678ee8d1cSJulian Grajkowski 
42778ee8d1cSJulian Grajkowski 	ret = adf_get_fw_status(accel_dev,
42878ee8d1cSJulian Grajkowski 				&accel_dev->fw_versions.fw_version_major,
42978ee8d1cSJulian Grajkowski 				&accel_dev->fw_versions.fw_version_minor,
43078ee8d1cSJulian Grajkowski 				&accel_dev->fw_versions.fw_version_patch);
43178ee8d1cSJulian Grajkowski 	if (ret) {
43278ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "Cannot get fw version\n");
43378ee8d1cSJulian Grajkowski 		return ret;
43478ee8d1cSJulian Grajkowski 	}
43578ee8d1cSJulian Grajkowski 
43678ee8d1cSJulian Grajkowski 	device_printf(GET_DEV(accel_dev),
43778ee8d1cSJulian Grajkowski 		      "FW version: %d.%d.%d\n",
43878ee8d1cSJulian Grajkowski 		      accel_dev->fw_versions.fw_version_major,
43978ee8d1cSJulian Grajkowski 		      accel_dev->fw_versions.fw_version_minor,
44078ee8d1cSJulian Grajkowski 		      accel_dev->fw_versions.fw_version_patch);
44178ee8d1cSJulian Grajkowski 
44278ee8d1cSJulian Grajkowski 	ret = adf_set_fw_constants(accel_dev);
44378ee8d1cSJulian Grajkowski 	if (ret) {
44478ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "Cannot set fw constants\n");
44578ee8d1cSJulian Grajkowski 		return ret;
44678ee8d1cSJulian Grajkowski 	}
44778ee8d1cSJulian Grajkowski 
44878ee8d1cSJulian Grajkowski 	ret = adf_init_me(accel_dev);
44978ee8d1cSJulian Grajkowski 	if (ret)
45078ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "Cannot init AE\n");
45178ee8d1cSJulian Grajkowski 
45278ee8d1cSJulian Grajkowski 	return ret;
45378ee8d1cSJulian Grajkowski }
45478ee8d1cSJulian Grajkowski 
45578ee8d1cSJulian Grajkowski int
adf_init_admin_comms(struct adf_accel_dev * accel_dev)45678ee8d1cSJulian Grajkowski adf_init_admin_comms(struct adf_accel_dev *accel_dev)
45778ee8d1cSJulian Grajkowski {
45878ee8d1cSJulian Grajkowski 	struct adf_admin_comms *admin = NULL;
45978ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = NULL;
46078ee8d1cSJulian Grajkowski 	struct adf_bar *pmisc = NULL;
46178ee8d1cSJulian Grajkowski 	struct resource *csr = NULL;
46278ee8d1cSJulian Grajkowski 	struct admin_info admin_csrs_info;
46378ee8d1cSJulian Grajkowski 	unsigned int adminmsg_u, adminmsg_l;
46478ee8d1cSJulian Grajkowski 	u64 reg_val = 0;
46578ee8d1cSJulian Grajkowski 	int ret = 0;
46678ee8d1cSJulian Grajkowski 
46778ee8d1cSJulian Grajkowski 	admin = kzalloc_node(sizeof(*accel_dev->admin),
46878ee8d1cSJulian Grajkowski 			     M_WAITOK | M_ZERO,
46978ee8d1cSJulian Grajkowski 			     dev_to_node(GET_DEV(accel_dev)));
47078ee8d1cSJulian Grajkowski 	hw_data = accel_dev->hw_device;
47178ee8d1cSJulian Grajkowski 	pmisc = &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
47278ee8d1cSJulian Grajkowski 	csr = pmisc->virt_addr;
47378ee8d1cSJulian Grajkowski 	ret = bus_dma_mem_create(&admin->dma_mem,
47478ee8d1cSJulian Grajkowski 				 accel_dev->dma_tag,
47578ee8d1cSJulian Grajkowski 				 FREEBSD_ALLIGNMENT_SIZE,
47678ee8d1cSJulian Grajkowski 				 BUS_SPACE_MAXADDR,
47778ee8d1cSJulian Grajkowski 				 PAGE_SIZE,
47878ee8d1cSJulian Grajkowski 				 0);
47978ee8d1cSJulian Grajkowski 	if (ret != 0) {
48078ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
48178ee8d1cSJulian Grajkowski 			      "Failed to allocate dma buff\n");
48278ee8d1cSJulian Grajkowski 		kfree(admin);
48378ee8d1cSJulian Grajkowski 		return ret;
48478ee8d1cSJulian Grajkowski 	}
48578ee8d1cSJulian Grajkowski 	admin->virt_addr = admin->dma_mem.dma_vaddr;
48678ee8d1cSJulian Grajkowski 	admin->phy_addr = admin->dma_mem.dma_baddr;
48778ee8d1cSJulian Grajkowski 	bzero(admin->virt_addr, PAGE_SIZE);
48878ee8d1cSJulian Grajkowski 
48978ee8d1cSJulian Grajkowski 	ret = bus_dmamap_create(accel_dev->dma_tag, 0, &admin->const_tbl_map);
49078ee8d1cSJulian Grajkowski 	if (ret != 0) {
49178ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "Failed to create DMA map\n");
49278ee8d1cSJulian Grajkowski 		bus_dma_mem_free(&admin->dma_mem);
49378ee8d1cSJulian Grajkowski 		kfree(admin);
49478ee8d1cSJulian Grajkowski 		return ret;
49578ee8d1cSJulian Grajkowski 	}
49678ee8d1cSJulian Grajkowski 
49778ee8d1cSJulian Grajkowski 	ret = bus_dmamap_load(accel_dev->dma_tag,
49878ee8d1cSJulian Grajkowski 			      admin->const_tbl_map,
49978ee8d1cSJulian Grajkowski 			      (void *)const_tab,
50078ee8d1cSJulian Grajkowski 			      1024,
50178ee8d1cSJulian Grajkowski 			      dma_callback,
50278ee8d1cSJulian Grajkowski 			      &admin->const_tbl_addr,
50378ee8d1cSJulian Grajkowski 			      BUS_DMA_NOWAIT);
50478ee8d1cSJulian Grajkowski 	if (ret == 0 && admin->const_tbl_addr == 0)
50578ee8d1cSJulian Grajkowski 		ret = EFBIG;
50678ee8d1cSJulian Grajkowski 	if (ret != 0) {
50778ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
50878ee8d1cSJulian Grajkowski 			      "Failed to map const table for DMA\n");
50978ee8d1cSJulian Grajkowski 		bus_dmamap_destroy(accel_dev->dma_tag, admin->const_tbl_map);
51078ee8d1cSJulian Grajkowski 		bus_dma_mem_free(&admin->dma_mem);
51178ee8d1cSJulian Grajkowski 		kfree(admin);
51278ee8d1cSJulian Grajkowski 		return ret;
51378ee8d1cSJulian Grajkowski 	}
51478ee8d1cSJulian Grajkowski 
51578ee8d1cSJulian Grajkowski 	/* DMA ARAM address map */
51678ee8d1cSJulian Grajkowski 	if (accel_dev->aram_info) {
51778ee8d1cSJulian Grajkowski 		ret =
51878ee8d1cSJulian Grajkowski 		    bus_dmamap_create(accel_dev->dma_tag, 0, &admin->aram_map);
51978ee8d1cSJulian Grajkowski 		if (ret != 0) {
52078ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
52178ee8d1cSJulian Grajkowski 				      "Failed to create DMA map\n");
52278ee8d1cSJulian Grajkowski 			bus_dma_mem_free(&admin->dma_mem);
52378ee8d1cSJulian Grajkowski 			kfree(admin);
52478ee8d1cSJulian Grajkowski 			return ret;
52578ee8d1cSJulian Grajkowski 		}
52678ee8d1cSJulian Grajkowski 		ret = bus_dmamap_load(accel_dev->dma_tag,
52778ee8d1cSJulian Grajkowski 				      admin->aram_map,
52878ee8d1cSJulian Grajkowski 				      (void *)accel_dev->aram_info,
52978ee8d1cSJulian Grajkowski 				      sizeof(*accel_dev->aram_info),
53078ee8d1cSJulian Grajkowski 				      dma_callback,
53178ee8d1cSJulian Grajkowski 				      &admin->aram_map_phys_addr,
53278ee8d1cSJulian Grajkowski 				      BUS_DMA_NOWAIT);
53378ee8d1cSJulian Grajkowski 
53478ee8d1cSJulian Grajkowski 		if (ret == 0 && admin->aram_map_phys_addr == 0)
53578ee8d1cSJulian Grajkowski 			ret = EFBIG;
53678ee8d1cSJulian Grajkowski 		if (ret != 0) {
53778ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
53878ee8d1cSJulian Grajkowski 				      "Failed to map aram phys addr for DMA\n");
53978ee8d1cSJulian Grajkowski 			bus_dmamap_destroy(accel_dev->dma_tag, admin->aram_map);
54078ee8d1cSJulian Grajkowski 			bus_dma_mem_free(&admin->dma_mem);
54178ee8d1cSJulian Grajkowski 			kfree(admin);
54278ee8d1cSJulian Grajkowski 			return ret;
54378ee8d1cSJulian Grajkowski 		}
54478ee8d1cSJulian Grajkowski 	}
54578ee8d1cSJulian Grajkowski 
54678ee8d1cSJulian Grajkowski 	ret = bus_dma_mem_create(&admin->dma_hb,
54778ee8d1cSJulian Grajkowski 				 accel_dev->dma_tag,
54878ee8d1cSJulian Grajkowski 				 FREEBSD_ALLIGNMENT_SIZE,
54978ee8d1cSJulian Grajkowski 				 BUS_SPACE_MAXADDR,
55078ee8d1cSJulian Grajkowski 				 PAGE_SIZE,
55178ee8d1cSJulian Grajkowski 				 0);
55278ee8d1cSJulian Grajkowski 	if (ret != 0) {
55378ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
55478ee8d1cSJulian Grajkowski 			      "Failed to allocate dma buff\n");
55578ee8d1cSJulian Grajkowski 		bus_dmamap_unload(accel_dev->dma_tag, admin->const_tbl_map);
55678ee8d1cSJulian Grajkowski 		bus_dmamap_destroy(accel_dev->dma_tag, admin->const_tbl_map);
55778ee8d1cSJulian Grajkowski 		bus_dma_mem_free(&admin->dma_mem);
55878ee8d1cSJulian Grajkowski 		kfree(admin);
55978ee8d1cSJulian Grajkowski 		return ret;
56078ee8d1cSJulian Grajkowski 	}
56178ee8d1cSJulian Grajkowski 
56278ee8d1cSJulian Grajkowski 	admin->virt_hb_addr = admin->dma_hb.dma_vaddr;
56378ee8d1cSJulian Grajkowski 	admin->phy_hb_addr = admin->dma_hb.dma_baddr;
56478ee8d1cSJulian Grajkowski 	bzero(admin->virt_hb_addr, PAGE_SIZE);
56578ee8d1cSJulian Grajkowski 
56678ee8d1cSJulian Grajkowski 	hw_data->get_admin_info(&admin_csrs_info);
56778ee8d1cSJulian Grajkowski 
56878ee8d1cSJulian Grajkowski 	adminmsg_u = admin_csrs_info.admin_msg_ur;
56978ee8d1cSJulian Grajkowski 	adminmsg_l = admin_csrs_info.admin_msg_lr;
57078ee8d1cSJulian Grajkowski 	reg_val = (u64)admin->phy_addr;
57178ee8d1cSJulian Grajkowski 	ADF_CSR_WR(csr, adminmsg_u, reg_val >> 32);
57278ee8d1cSJulian Grajkowski 	ADF_CSR_WR(csr, adminmsg_l, reg_val);
57378ee8d1cSJulian Grajkowski 	sx_init(&admin->lock, "qat admin");
57478ee8d1cSJulian Grajkowski 	admin->mailbox_addr = csr;
57578ee8d1cSJulian Grajkowski 	accel_dev->admin = admin;
57678ee8d1cSJulian Grajkowski 	return 0;
57778ee8d1cSJulian Grajkowski }
57878ee8d1cSJulian Grajkowski 
57978ee8d1cSJulian Grajkowski void
adf_exit_admin_comms(struct adf_accel_dev * accel_dev)58078ee8d1cSJulian Grajkowski adf_exit_admin_comms(struct adf_accel_dev *accel_dev)
58178ee8d1cSJulian Grajkowski {
58278ee8d1cSJulian Grajkowski 	struct adf_admin_comms *admin = accel_dev->admin;
58378ee8d1cSJulian Grajkowski 
58478ee8d1cSJulian Grajkowski 	if (!admin)
58578ee8d1cSJulian Grajkowski 		return;
58678ee8d1cSJulian Grajkowski 
58778ee8d1cSJulian Grajkowski 	if (admin->virt_addr)
58878ee8d1cSJulian Grajkowski 		bus_dma_mem_free(&admin->dma_mem);
58978ee8d1cSJulian Grajkowski 
59078ee8d1cSJulian Grajkowski 	if (admin->virt_hb_addr)
59178ee8d1cSJulian Grajkowski 		bus_dma_mem_free(&admin->dma_hb);
59278ee8d1cSJulian Grajkowski 
59378ee8d1cSJulian Grajkowski 	bus_dmamap_unload(accel_dev->dma_tag, admin->const_tbl_map);
59478ee8d1cSJulian Grajkowski 	bus_dmamap_destroy(accel_dev->dma_tag, admin->const_tbl_map);
59578ee8d1cSJulian Grajkowski 	sx_destroy(&admin->lock);
59678ee8d1cSJulian Grajkowski 	kfree(admin);
59778ee8d1cSJulian Grajkowski 	accel_dev->admin = NULL;
59878ee8d1cSJulian Grajkowski }
599