xref: /freebsd/sys/dev/qat/qat_common/qat_freebsd.c (revision 71625ec9)
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 <sys/types.h>
1478ee8d1cSJulian Grajkowski #include <sys/limits.h>
1578ee8d1cSJulian Grajkowski #include <sys/kernel.h>
1678ee8d1cSJulian Grajkowski #include <sys/systm.h>
1778ee8d1cSJulian Grajkowski #include <machine/bus_dma.h>
1878ee8d1cSJulian Grajkowski #include <dev/pci/pcireg.h>
1978ee8d1cSJulian Grajkowski 
2078ee8d1cSJulian Grajkowski MALLOC_DEFINE(M_QAT, "qat", "qat");
2178ee8d1cSJulian Grajkowski 
2278ee8d1cSJulian Grajkowski struct bus_dma_mem_cb_data {
2378ee8d1cSJulian Grajkowski 	struct bus_dmamem *mem;
2478ee8d1cSJulian Grajkowski 	int error;
2578ee8d1cSJulian Grajkowski };
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski static void
bus_dma_mem_cb(void * arg,bus_dma_segment_t * segs,int nseg,int error)2878ee8d1cSJulian Grajkowski bus_dma_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2978ee8d1cSJulian Grajkowski {
3078ee8d1cSJulian Grajkowski 	struct bus_dma_mem_cb_data *d;
3178ee8d1cSJulian Grajkowski 
3278ee8d1cSJulian Grajkowski 	d = arg;
3378ee8d1cSJulian Grajkowski 	d->error = error;
3478ee8d1cSJulian Grajkowski 	if (error)
3578ee8d1cSJulian Grajkowski 		return;
3678ee8d1cSJulian Grajkowski 	d->mem->dma_baddr = segs[0].ds_addr;
3778ee8d1cSJulian Grajkowski }
3878ee8d1cSJulian Grajkowski 
3978ee8d1cSJulian 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)4078ee8d1cSJulian Grajkowski bus_dma_mem_create(struct bus_dmamem *mem,
4178ee8d1cSJulian Grajkowski 		   bus_dma_tag_t parent,
4278ee8d1cSJulian Grajkowski 		   bus_size_t alignment,
4378ee8d1cSJulian Grajkowski 		   bus_addr_t lowaddr,
4478ee8d1cSJulian Grajkowski 		   bus_size_t len,
4578ee8d1cSJulian Grajkowski 		   int flags)
4678ee8d1cSJulian Grajkowski {
4778ee8d1cSJulian Grajkowski 	struct bus_dma_mem_cb_data d;
4878ee8d1cSJulian Grajkowski 	int error;
4978ee8d1cSJulian Grajkowski 
5078ee8d1cSJulian Grajkowski 	bzero(mem, sizeof(*mem));
5178ee8d1cSJulian Grajkowski 	error = bus_dma_tag_create(parent,
5278ee8d1cSJulian Grajkowski 				   alignment,
5378ee8d1cSJulian Grajkowski 				   0,
5478ee8d1cSJulian Grajkowski 				   lowaddr,
5578ee8d1cSJulian Grajkowski 				   BUS_SPACE_MAXADDR,
5678ee8d1cSJulian Grajkowski 				   NULL,
5778ee8d1cSJulian Grajkowski 				   NULL,
5878ee8d1cSJulian Grajkowski 				   len,
5978ee8d1cSJulian Grajkowski 				   1,
6078ee8d1cSJulian Grajkowski 				   len,
6178ee8d1cSJulian Grajkowski 				   0,
6278ee8d1cSJulian Grajkowski 				   NULL,
6378ee8d1cSJulian Grajkowski 				   NULL,
6478ee8d1cSJulian Grajkowski 				   &mem->dma_tag);
6578ee8d1cSJulian Grajkowski 	if (error) {
6678ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
6778ee8d1cSJulian Grajkowski 		return (error);
6878ee8d1cSJulian Grajkowski 	}
6978ee8d1cSJulian Grajkowski 	error = bus_dmamem_alloc(mem->dma_tag,
7078ee8d1cSJulian Grajkowski 				 &mem->dma_vaddr,
7178ee8d1cSJulian Grajkowski 				 flags,
7278ee8d1cSJulian Grajkowski 				 &mem->dma_map);
7378ee8d1cSJulian Grajkowski 	if (error) {
7478ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
7578ee8d1cSJulian Grajkowski 		return (error);
7678ee8d1cSJulian Grajkowski 	}
7778ee8d1cSJulian Grajkowski 	d.mem = mem;
7878ee8d1cSJulian Grajkowski 	error = bus_dmamap_load(mem->dma_tag,
7978ee8d1cSJulian Grajkowski 				mem->dma_map,
8078ee8d1cSJulian Grajkowski 				mem->dma_vaddr,
8178ee8d1cSJulian Grajkowski 				len,
8278ee8d1cSJulian Grajkowski 				bus_dma_mem_cb,
8378ee8d1cSJulian Grajkowski 				&d,
8478ee8d1cSJulian Grajkowski 				BUS_DMA_NOWAIT);
8578ee8d1cSJulian Grajkowski 	if (error == 0)
8678ee8d1cSJulian Grajkowski 		error = d.error;
8778ee8d1cSJulian Grajkowski 	if (error) {
8878ee8d1cSJulian Grajkowski 		bus_dma_mem_free(mem);
8978ee8d1cSJulian Grajkowski 		return (error);
9078ee8d1cSJulian Grajkowski 	}
9178ee8d1cSJulian Grajkowski 	return (0);
9278ee8d1cSJulian Grajkowski }
9378ee8d1cSJulian Grajkowski 
9478ee8d1cSJulian Grajkowski void
bus_dma_mem_free(struct bus_dmamem * mem)9578ee8d1cSJulian Grajkowski bus_dma_mem_free(struct bus_dmamem *mem)
9678ee8d1cSJulian Grajkowski {
9778ee8d1cSJulian Grajkowski 
9878ee8d1cSJulian Grajkowski 	if (mem->dma_baddr != 0)
9978ee8d1cSJulian Grajkowski 		bus_dmamap_unload(mem->dma_tag, mem->dma_map);
10078ee8d1cSJulian Grajkowski 	if (mem->dma_vaddr != NULL)
10178ee8d1cSJulian Grajkowski 		bus_dmamem_free(mem->dma_tag, mem->dma_vaddr, mem->dma_map);
10278ee8d1cSJulian Grajkowski 	if (mem->dma_tag != NULL)
10378ee8d1cSJulian Grajkowski 		bus_dma_tag_destroy(mem->dma_tag);
10478ee8d1cSJulian Grajkowski 	bzero(mem, sizeof(*mem));
10578ee8d1cSJulian Grajkowski }
10678ee8d1cSJulian Grajkowski 
10778ee8d1cSJulian Grajkowski device_t
pci_find_pf(device_t vf)10878ee8d1cSJulian Grajkowski pci_find_pf(device_t vf)
10978ee8d1cSJulian Grajkowski {
11078ee8d1cSJulian Grajkowski 	return (NULL);
11178ee8d1cSJulian Grajkowski }
11278ee8d1cSJulian Grajkowski 
11378ee8d1cSJulian Grajkowski int
pci_set_max_payload(device_t dev,int payload_size)11478ee8d1cSJulian Grajkowski pci_set_max_payload(device_t dev, int payload_size)
11578ee8d1cSJulian Grajkowski {
11678ee8d1cSJulian Grajkowski 	const int packet_sizes[6] = { 128, 256, 512, 1024, 2048, 4096 };
11778ee8d1cSJulian Grajkowski 	int cap_reg = 0, reg_value = 0, mask = 0;
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski 	for (mask = 0; mask < 6; mask++) {
12078ee8d1cSJulian Grajkowski 		if (payload_size == packet_sizes[mask])
12178ee8d1cSJulian Grajkowski 			break;
12278ee8d1cSJulian Grajkowski 	}
12378ee8d1cSJulian Grajkowski 	if (mask == 6)
12478ee8d1cSJulian Grajkowski 		return -1;
12578ee8d1cSJulian Grajkowski 
12678ee8d1cSJulian Grajkowski 	if (pci_find_cap(dev, PCIY_EXPRESS, &cap_reg) != 0)
12778ee8d1cSJulian Grajkowski 		return -1;
12878ee8d1cSJulian Grajkowski 
12978ee8d1cSJulian Grajkowski 	cap_reg += PCIER_DEVICE_CTL; /* Offset for Device Control Register. */
13078ee8d1cSJulian Grajkowski 	reg_value = pci_read_config(dev, cap_reg, 1);
13178ee8d1cSJulian Grajkowski 	reg_value = (reg_value & 0x1f) | (mask << 5);
13278ee8d1cSJulian Grajkowski 	pci_write_config(dev, cap_reg, reg_value, 1);
13378ee8d1cSJulian Grajkowski 	return 0;
13478ee8d1cSJulian Grajkowski }
135