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