1*4882a593Smuzhiyun // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2*4882a593Smuzhiyun /* Copyright(c) 2014 - 2020 Intel Corporation */
3*4882a593Smuzhiyun #include <linux/types.h>
4*4882a593Smuzhiyun #include <linux/mutex.h>
5*4882a593Smuzhiyun #include <linux/slab.h>
6*4882a593Smuzhiyun #include <linux/iopoll.h>
7*4882a593Smuzhiyun #include <linux/pci.h>
8*4882a593Smuzhiyun #include <linux/dma-mapping.h>
9*4882a593Smuzhiyun #include "adf_accel_devices.h"
10*4882a593Smuzhiyun #include "adf_common_drv.h"
11*4882a593Smuzhiyun #include "icp_qat_fw_init_admin.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun /* Admin Messages Registers */
14*4882a593Smuzhiyun #define ADF_DH895XCC_ADMINMSGUR_OFFSET (0x3A000 + 0x574)
15*4882a593Smuzhiyun #define ADF_DH895XCC_ADMINMSGLR_OFFSET (0x3A000 + 0x578)
16*4882a593Smuzhiyun #define ADF_DH895XCC_MAILBOX_BASE_OFFSET 0x20970
17*4882a593Smuzhiyun #define ADF_DH895XCC_MAILBOX_STRIDE 0x1000
18*4882a593Smuzhiyun #define ADF_ADMINMSG_LEN 32
19*4882a593Smuzhiyun #define ADF_CONST_TABLE_SIZE 1024
20*4882a593Smuzhiyun #define ADF_ADMIN_POLL_DELAY_US 20
21*4882a593Smuzhiyun #define ADF_ADMIN_POLL_TIMEOUT_US (5 * USEC_PER_SEC)
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun static const u8 const_tab[1024] __aligned(1024) = {
24*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
25*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
27*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
30*4882a593Smuzhiyun 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
31*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32*4882a593Smuzhiyun 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
33*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01,
34*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
35*4882a593Smuzhiyun 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00,
36*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13,
37*4882a593Smuzhiyun 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
38*4882a593Smuzhiyun 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
39*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
47*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48*4882a593Smuzhiyun 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76,
49*4882a593Smuzhiyun 0x54, 0x32, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab,
51*4882a593Smuzhiyun 0x89, 0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0,
52*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53*4882a593Smuzhiyun 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
54*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x05, 0x9e,
55*4882a593Smuzhiyun 0xd8, 0x36, 0x7c, 0xd5, 0x07, 0x30, 0x70, 0xdd, 0x17, 0xf7, 0x0e, 0x59, 0x39,
56*4882a593Smuzhiyun 0xff, 0xc0, 0x0b, 0x31, 0x68, 0x58, 0x15, 0x11, 0x64, 0xf9, 0x8f, 0xa7, 0xbe,
57*4882a593Smuzhiyun 0xfa, 0x4f, 0xa4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xbb, 0x67, 0xae,
59*4882a593Smuzhiyun 0x85, 0x3c, 0x6e, 0xf3, 0x72, 0xa5, 0x4f, 0xf5, 0x3a, 0x51, 0x0e, 0x52, 0x7f,
60*4882a593Smuzhiyun 0x9b, 0x05, 0x68, 0x8c, 0x1f, 0x83, 0xd9, 0xab, 0x5b, 0xe0, 0xcd, 0x19, 0x05,
61*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62*4882a593Smuzhiyun 0x00, 0x00, 0xcb, 0xbb, 0x9d, 0x5d, 0xc1, 0x05, 0x9e, 0xd8, 0x62, 0x9a, 0x29,
63*4882a593Smuzhiyun 0x2a, 0x36, 0x7c, 0xd5, 0x07, 0x91, 0x59, 0x01, 0x5a, 0x30, 0x70, 0xdd, 0x17,
64*4882a593Smuzhiyun 0x15, 0x2f, 0xec, 0xd8, 0xf7, 0x0e, 0x59, 0x39, 0x67, 0x33, 0x26, 0x67, 0xff,
65*4882a593Smuzhiyun 0xc0, 0x0b, 0x31, 0x8e, 0xb4, 0x4a, 0x87, 0x68, 0x58, 0x15, 0x11, 0xdb, 0x0c,
66*4882a593Smuzhiyun 0x2e, 0x0d, 0x64, 0xf9, 0x8f, 0xa7, 0x47, 0xb5, 0x48, 0x1d, 0xbe, 0xfa, 0x4f,
67*4882a593Smuzhiyun 0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb,
69*4882a593Smuzhiyun 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94,
70*4882a593Smuzhiyun 0xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52,
71*4882a593Smuzhiyun 0x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f,
72*4882a593Smuzhiyun 0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13,
73*4882a593Smuzhiyun 0x7e, 0x21, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun struct adf_admin_comms {
105*4882a593Smuzhiyun dma_addr_t phy_addr;
106*4882a593Smuzhiyun dma_addr_t const_tbl_addr;
107*4882a593Smuzhiyun void *virt_addr;
108*4882a593Smuzhiyun void *virt_tbl_addr;
109*4882a593Smuzhiyun void __iomem *mailbox_addr;
110*4882a593Smuzhiyun struct mutex lock; /* protects adf_admin_comms struct */
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun
adf_put_admin_msg_sync(struct adf_accel_dev * accel_dev,u32 ae,void * in,void * out)113*4882a593Smuzhiyun static int adf_put_admin_msg_sync(struct adf_accel_dev *accel_dev, u32 ae,
114*4882a593Smuzhiyun void *in, void *out)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun int ret;
117*4882a593Smuzhiyun u32 status;
118*4882a593Smuzhiyun struct adf_admin_comms *admin = accel_dev->admin;
119*4882a593Smuzhiyun int offset = ae * ADF_ADMINMSG_LEN * 2;
120*4882a593Smuzhiyun void __iomem *mailbox = admin->mailbox_addr;
121*4882a593Smuzhiyun int mb_offset = ae * ADF_DH895XCC_MAILBOX_STRIDE;
122*4882a593Smuzhiyun struct icp_qat_fw_init_admin_req *request = in;
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun mutex_lock(&admin->lock);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun if (ADF_CSR_RD(mailbox, mb_offset) == 1) {
127*4882a593Smuzhiyun mutex_unlock(&admin->lock);
128*4882a593Smuzhiyun return -EAGAIN;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun memcpy(admin->virt_addr + offset, in, ADF_ADMINMSG_LEN);
132*4882a593Smuzhiyun ADF_CSR_WR(mailbox, mb_offset, 1);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun ret = read_poll_timeout(ADF_CSR_RD, status, status == 0,
135*4882a593Smuzhiyun ADF_ADMIN_POLL_DELAY_US,
136*4882a593Smuzhiyun ADF_ADMIN_POLL_TIMEOUT_US, true,
137*4882a593Smuzhiyun mailbox, mb_offset);
138*4882a593Smuzhiyun if (ret < 0) {
139*4882a593Smuzhiyun /* Response timeout */
140*4882a593Smuzhiyun dev_err(&GET_DEV(accel_dev),
141*4882a593Smuzhiyun "Failed to send admin msg %d to accelerator %d\n",
142*4882a593Smuzhiyun request->cmd_id, ae);
143*4882a593Smuzhiyun } else {
144*4882a593Smuzhiyun /* Response received from admin message, we can now
145*4882a593Smuzhiyun * make response data available in "out" parameter.
146*4882a593Smuzhiyun */
147*4882a593Smuzhiyun memcpy(out, admin->virt_addr + offset +
148*4882a593Smuzhiyun ADF_ADMINMSG_LEN, ADF_ADMINMSG_LEN);
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun mutex_unlock(&admin->lock);
152*4882a593Smuzhiyun return ret;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
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,const unsigned long ae_mask)155*4882a593Smuzhiyun static int adf_send_admin(struct adf_accel_dev *accel_dev,
156*4882a593Smuzhiyun struct icp_qat_fw_init_admin_req *req,
157*4882a593Smuzhiyun struct icp_qat_fw_init_admin_resp *resp,
158*4882a593Smuzhiyun const unsigned long ae_mask)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun u32 ae;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun for_each_set_bit(ae, &ae_mask, ICP_QAT_HW_AE_DELIMITER)
163*4882a593Smuzhiyun if (adf_put_admin_msg_sync(accel_dev, ae, req, resp) ||
164*4882a593Smuzhiyun resp->status)
165*4882a593Smuzhiyun return -EFAULT;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun return 0;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
adf_init_me(struct adf_accel_dev * accel_dev)170*4882a593Smuzhiyun static int adf_init_me(struct adf_accel_dev *accel_dev)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct icp_qat_fw_init_admin_req req;
173*4882a593Smuzhiyun struct icp_qat_fw_init_admin_resp resp;
174*4882a593Smuzhiyun struct adf_hw_device_data *hw_device = accel_dev->hw_device;
175*4882a593Smuzhiyun u32 ae_mask = hw_device->ae_mask;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun memset(&req, 0, sizeof(req));
178*4882a593Smuzhiyun memset(&resp, 0, sizeof(resp));
179*4882a593Smuzhiyun req.cmd_id = ICP_QAT_FW_INIT_ME;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return adf_send_admin(accel_dev, &req, &resp, ae_mask);
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
adf_set_fw_constants(struct adf_accel_dev * accel_dev)184*4882a593Smuzhiyun static int adf_set_fw_constants(struct adf_accel_dev *accel_dev)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun struct icp_qat_fw_init_admin_req req;
187*4882a593Smuzhiyun struct icp_qat_fw_init_admin_resp resp;
188*4882a593Smuzhiyun struct adf_hw_device_data *hw_device = accel_dev->hw_device;
189*4882a593Smuzhiyun u32 ae_mask = hw_device->ae_mask;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun memset(&req, 0, sizeof(req));
192*4882a593Smuzhiyun memset(&resp, 0, sizeof(resp));
193*4882a593Smuzhiyun req.cmd_id = ICP_QAT_FW_CONSTANTS_CFG;
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun req.init_cfg_sz = ADF_CONST_TABLE_SIZE;
196*4882a593Smuzhiyun req.init_cfg_ptr = accel_dev->admin->const_tbl_addr;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun return adf_send_admin(accel_dev, &req, &resp, ae_mask);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /**
202*4882a593Smuzhiyun * adf_send_admin_init() - Function sends init message to FW
203*4882a593Smuzhiyun * @accel_dev: Pointer to acceleration device.
204*4882a593Smuzhiyun *
205*4882a593Smuzhiyun * Function sends admin init message to the FW
206*4882a593Smuzhiyun *
207*4882a593Smuzhiyun * Return: 0 on success, error code otherwise.
208*4882a593Smuzhiyun */
adf_send_admin_init(struct adf_accel_dev * accel_dev)209*4882a593Smuzhiyun int adf_send_admin_init(struct adf_accel_dev *accel_dev)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun int ret;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun ret = adf_init_me(accel_dev);
214*4882a593Smuzhiyun if (ret)
215*4882a593Smuzhiyun return ret;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun return adf_set_fw_constants(accel_dev);
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(adf_send_admin_init);
220*4882a593Smuzhiyun
adf_init_admin_comms(struct adf_accel_dev * accel_dev)221*4882a593Smuzhiyun int adf_init_admin_comms(struct adf_accel_dev *accel_dev)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun struct adf_admin_comms *admin;
224*4882a593Smuzhiyun struct adf_hw_device_data *hw_data = accel_dev->hw_device;
225*4882a593Smuzhiyun struct adf_bar *pmisc =
226*4882a593Smuzhiyun &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
227*4882a593Smuzhiyun void __iomem *csr = pmisc->virt_addr;
228*4882a593Smuzhiyun void __iomem *mailbox = (void __iomem *)((uintptr_t)csr +
229*4882a593Smuzhiyun ADF_DH895XCC_MAILBOX_BASE_OFFSET);
230*4882a593Smuzhiyun u64 reg_val;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun admin = kzalloc_node(sizeof(*accel_dev->admin), GFP_KERNEL,
233*4882a593Smuzhiyun dev_to_node(&GET_DEV(accel_dev)));
234*4882a593Smuzhiyun if (!admin)
235*4882a593Smuzhiyun return -ENOMEM;
236*4882a593Smuzhiyun admin->virt_addr = dma_alloc_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
237*4882a593Smuzhiyun &admin->phy_addr, GFP_KERNEL);
238*4882a593Smuzhiyun if (!admin->virt_addr) {
239*4882a593Smuzhiyun dev_err(&GET_DEV(accel_dev), "Failed to allocate dma buff\n");
240*4882a593Smuzhiyun kfree(admin);
241*4882a593Smuzhiyun return -ENOMEM;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun admin->virt_tbl_addr = dma_alloc_coherent(&GET_DEV(accel_dev),
245*4882a593Smuzhiyun PAGE_SIZE,
246*4882a593Smuzhiyun &admin->const_tbl_addr,
247*4882a593Smuzhiyun GFP_KERNEL);
248*4882a593Smuzhiyun if (!admin->virt_tbl_addr) {
249*4882a593Smuzhiyun dev_err(&GET_DEV(accel_dev), "Failed to allocate const_tbl\n");
250*4882a593Smuzhiyun dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
251*4882a593Smuzhiyun admin->virt_addr, admin->phy_addr);
252*4882a593Smuzhiyun kfree(admin);
253*4882a593Smuzhiyun return -ENOMEM;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun memcpy(admin->virt_tbl_addr, const_tab, sizeof(const_tab));
257*4882a593Smuzhiyun reg_val = (u64)admin->phy_addr;
258*4882a593Smuzhiyun ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32);
259*4882a593Smuzhiyun ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGLR_OFFSET, reg_val);
260*4882a593Smuzhiyun mutex_init(&admin->lock);
261*4882a593Smuzhiyun admin->mailbox_addr = mailbox;
262*4882a593Smuzhiyun accel_dev->admin = admin;
263*4882a593Smuzhiyun return 0;
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(adf_init_admin_comms);
266*4882a593Smuzhiyun
adf_exit_admin_comms(struct adf_accel_dev * accel_dev)267*4882a593Smuzhiyun void adf_exit_admin_comms(struct adf_accel_dev *accel_dev)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun struct adf_admin_comms *admin = accel_dev->admin;
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun if (!admin)
272*4882a593Smuzhiyun return;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun if (admin->virt_addr)
275*4882a593Smuzhiyun dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
276*4882a593Smuzhiyun admin->virt_addr, admin->phy_addr);
277*4882a593Smuzhiyun if (admin->virt_tbl_addr)
278*4882a593Smuzhiyun dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
279*4882a593Smuzhiyun admin->virt_tbl_addr, admin->const_tbl_addr);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun mutex_destroy(&admin->lock);
282*4882a593Smuzhiyun kfree(admin);
283*4882a593Smuzhiyun accel_dev->admin = NULL;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(adf_exit_admin_comms);
286