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