xref: /freebsd/sys/dev/qat/qat_common/qat_freebsd.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1*78ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
2*78ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
3*78ee8d1cSJulian Grajkowski #include "qat_freebsd.h"
4*78ee8d1cSJulian Grajkowski #include "adf_cfg.h"
5*78ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
6*78ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
7*78ee8d1cSJulian Grajkowski #include "icp_qat_uclo.h"
8*78ee8d1cSJulian Grajkowski #include "icp_qat_fw.h"
9*78ee8d1cSJulian Grajkowski #include "icp_qat_fw_init_admin.h"
10*78ee8d1cSJulian Grajkowski #include "adf_cfg_strings.h"
11*78ee8d1cSJulian Grajkowski #include "adf_transport_access_macros.h"
12*78ee8d1cSJulian Grajkowski #include "adf_transport_internal.h"
13*78ee8d1cSJulian Grajkowski #include <sys/types.h>
14*78ee8d1cSJulian Grajkowski #include <sys/limits.h>
15*78ee8d1cSJulian Grajkowski #include <sys/kernel.h>
16*78ee8d1cSJulian Grajkowski #include <sys/systm.h>
17*78ee8d1cSJulian Grajkowski #include <machine/bus_dma.h>
18*78ee8d1cSJulian Grajkowski #include <dev/pci/pcireg.h>
19*78ee8d1cSJulian Grajkowski 
20*78ee8d1cSJulian Grajkowski MALLOC_DEFINE(M_QAT, "qat", "qat");
21*78ee8d1cSJulian Grajkowski 
22*78ee8d1cSJulian Grajkowski struct bus_dma_mem_cb_data {
23*78ee8d1cSJulian Grajkowski 	struct bus_dmamem *mem;
24*78ee8d1cSJulian Grajkowski 	int error;
25*78ee8d1cSJulian Grajkowski };
26*78ee8d1cSJulian Grajkowski 
27*78ee8d1cSJulian Grajkowski static void
bus_dma_mem_cb(void * arg,bus_dma_segment_t * segs,int nseg,int error)28*78ee8d1cSJulian Grajkowski bus_dma_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
29*78ee8d1cSJulian Grajkowski {
30*78ee8d1cSJulian Grajkowski 	struct bus_dma_mem_cb_data *d;
31*78ee8d1cSJulian Grajkowski 
32*78ee8d1cSJulian Grajkowski 	d = arg;
33*78ee8d1cSJulian Grajkowski 	d->error = error;
34*78ee8d1cSJulian Grajkowski 	if (error)
35*78ee8d1cSJulian Grajkowski 		return;
36*78ee8d1cSJulian Grajkowski 	d->mem->dma_baddr = segs[0].ds_addr;
37*78ee8d1cSJulian Grajkowski }
38*78ee8d1cSJulian Grajkowski 
39*78ee8d1cSJulian Grajkowski int
bus_dma_mem_create(struct bus_dmamem * mem,bus_dma_tag_t parent,bus_size_t alignment,bus_addr_t lowaddr,bus_size_t len,int flags)40*78ee8d1cSJulian Grajkowski bus_dma_mem_create(struct bus_dmamem *mem,
41*78ee8d1cSJulian Grajkowski 		   bus_dma_tag_t parent,
42*78ee8d1cSJulian Grajkowski 		   bus_size_t alignment,
43*78ee8d1cSJulian Grajkowski 		   bus_addr_t lowaddr,
44*78ee8d1cSJulian Grajkowski 		   bus_size_t len,
45*78ee8d1cSJulian Grajkowski 		   int flags)
46*78ee8d1cSJulian Grajkowski {
47*78ee8d1cSJulian Grajkowski 	struct bus_dma_mem_cb_data d;
48*78ee8d1cSJulian Grajkowski 	int error;
49*78ee8d1cSJulian Grajkowski 
50*78ee8d1cSJulian Grajkowski 	bzero(mem, sizeof(*mem));
51*78ee8d1cSJulian Grajkowski 	error = bus_dma_tag_create(parent,
52*78ee8d1cSJulian Grajkowski 				   alignment,
53*78ee8d1cSJulian Grajkowski 				   0,
54*78ee8d1cSJulian Grajkowski 				   lowaddr,
55*78ee8d1cSJulian Grajkowski 				   BUS_SPACE_MAXADDR,
56*78ee8d1cSJulian Grajkowski 				   NULL,
57*78ee8d1cSJulian Grajkowski 				   NULL,
58*78ee8d1cSJulian Grajkowski 				   len,
59*78ee8d1cSJulian Grajkowski 				   1,
60*78ee8d1cSJulian Grajkowski 				   len,
61*78ee8d1cSJulian Grajkowski 				   0,
62*78ee8d1cSJulian Grajkowski 				   NULL,
63*78ee8d1cSJulian Grajkowski 				   NULL,
64*78ee8d1cSJulian Grajkowski 				   &mem->dma_tag);
65*78ee8d1cSJulian Grajkowski 	if (error) {
66*78ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
67*78ee8d1cSJulian Grajkowski 		return (error);
68*78ee8d1cSJulian Grajkowski 	}
69*78ee8d1cSJulian Grajkowski 	error = bus_dmamem_alloc(mem->dma_tag,
70*78ee8d1cSJulian Grajkowski 				 &mem->dma_vaddr,
71*78ee8d1cSJulian Grajkowski 				 flags,
72*78ee8d1cSJulian Grajkowski 				 &mem->dma_map);
73*78ee8d1cSJulian Grajkowski 	if (error) {
74*78ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
75*78ee8d1cSJulian Grajkowski 		return (error);
76*78ee8d1cSJulian Grajkowski 	}
77*78ee8d1cSJulian Grajkowski 	d.mem = mem;
78*78ee8d1cSJulian Grajkowski 	error = bus_dmamap_load(mem->dma_tag,
79*78ee8d1cSJulian Grajkowski 				mem->dma_map,
80*78ee8d1cSJulian Grajkowski 				mem->dma_vaddr,
81*78ee8d1cSJulian Grajkowski 				len,
82*78ee8d1cSJulian Grajkowski 				bus_dma_mem_cb,
83*78ee8d1cSJulian Grajkowski 				&d,
84*78ee8d1cSJulian Grajkowski 				BUS_DMA_NOWAIT);
85*78ee8d1cSJulian Grajkowski 	if (error == 0)
86*78ee8d1cSJulian Grajkowski 		error = d.error;
87*78ee8d1cSJulian Grajkowski 	if (error) {
88*78ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
89*78ee8d1cSJulian Grajkowski 		return (error);
90*78ee8d1cSJulian Grajkowski 	}
91*78ee8d1cSJulian Grajkowski 	return (0);
92*78ee8d1cSJulian Grajkowski }
93*78ee8d1cSJulian Grajkowski 
94*78ee8d1cSJulian Grajkowski void
bus_dma_mem_free(struct bus_dmamem * mem)95*78ee8d1cSJulian Grajkowski bus_dma_mem_free(struct bus_dmamem *mem)
96*78ee8d1cSJulian Grajkowski {
97*78ee8d1cSJulian Grajkowski 
98*78ee8d1cSJulian Grajkowski 	if (mem->dma_baddr != 0)
99*78ee8d1cSJulian Grajkowski 		bus_dmamap_unload(mem->dma_tag, mem->dma_map);
100*78ee8d1cSJulian Grajkowski 	if (mem->dma_vaddr != NULL)
101*78ee8d1cSJulian Grajkowski 		bus_dmamem_free(mem->dma_tag, mem->dma_vaddr, mem->dma_map);
102*78ee8d1cSJulian Grajkowski 	if (mem->dma_tag != NULL)
103*78ee8d1cSJulian Grajkowski 		bus_dma_tag_destroy(mem->dma_tag);
104*78ee8d1cSJulian Grajkowski 	bzero(mem, sizeof(*mem));
105*78ee8d1cSJulian Grajkowski }
106*78ee8d1cSJulian Grajkowski 
107*78ee8d1cSJulian Grajkowski device_t
pci_find_pf(device_t vf)108*78ee8d1cSJulian Grajkowski pci_find_pf(device_t vf)
109*78ee8d1cSJulian Grajkowski {
110*78ee8d1cSJulian Grajkowski 	return (NULL);
111*78ee8d1cSJulian Grajkowski }
112*78ee8d1cSJulian Grajkowski 
113*78ee8d1cSJulian Grajkowski int
pci_set_max_payload(device_t dev,int payload_size)114*78ee8d1cSJulian Grajkowski pci_set_max_payload(device_t dev, int payload_size)
115*78ee8d1cSJulian Grajkowski {
116*78ee8d1cSJulian Grajkowski 	const int packet_sizes[6] = { 128, 256, 512, 1024, 2048, 4096 };
117*78ee8d1cSJulian Grajkowski 	int cap_reg = 0, reg_value = 0, mask = 0;
118*78ee8d1cSJulian Grajkowski 
119*78ee8d1cSJulian Grajkowski 	for (mask = 0; mask < 6; mask++) {
120*78ee8d1cSJulian Grajkowski 		if (payload_size == packet_sizes[mask])
121*78ee8d1cSJulian Grajkowski 			break;
122*78ee8d1cSJulian Grajkowski 	}
123*78ee8d1cSJulian Grajkowski 	if (mask == 6)
124*78ee8d1cSJulian Grajkowski 		return -1;
125*78ee8d1cSJulian Grajkowski 
126*78ee8d1cSJulian Grajkowski 	if (pci_find_cap(dev, PCIY_EXPRESS, &cap_reg) != 0)
127*78ee8d1cSJulian Grajkowski 		return -1;
128*78ee8d1cSJulian Grajkowski 
129*78ee8d1cSJulian Grajkowski 	cap_reg += PCIER_DEVICE_CTL; /* Offset for Device Control Register. */
130*78ee8d1cSJulian Grajkowski 	reg_value = pci_read_config(dev, cap_reg, 1);
131*78ee8d1cSJulian Grajkowski 	reg_value = (reg_value & 0x1f) | (mask << 5);
132*78ee8d1cSJulian Grajkowski 	pci_write_config(dev, cap_reg, reg_value, 1);
133*78ee8d1cSJulian Grajkowski 	return 0;
134*78ee8d1cSJulian Grajkowski }
135