linux_pci.c revision 1.25
1/*	$NetBSD: linux_pci.c,v 1.25 2022/10/17 03:05:32 mrg Exp $	*/
2
3/*-
4 * Copyright (c) 2013 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifdef _KERNEL_OPT
33#include "acpica.h"
34#include "opt_pci.h"
35#endif
36
37#include <sys/cdefs.h>
38__KERNEL_RCSID(0, "$NetBSD: linux_pci.c,v 1.25 2022/10/17 03:05:32 mrg Exp $");
39
40#if NACPICA > 0
41#include <dev/acpi/acpivar.h>
42#include <dev/acpi/acpi_pci.h>
43#endif
44
45#include <linux/pci.h>
46
47#include <drm/drm_agp_netbsd.h>
48
49device_t
50pci_dev_dev(struct pci_dev *pdev)
51{
52
53	return pdev->pd_dev;
54}
55
56void
57pci_set_drvdata(struct pci_dev *pdev, void *drvdata)
58{
59	pdev->pd_drvdata = drvdata;
60}
61
62void *
63pci_get_drvdata(struct pci_dev *pdev)
64{
65	return pdev->pd_drvdata;
66}
67
68const char *
69pci_name(struct pci_dev *pdev)
70{
71
72	/* XXX not sure this has the right format */
73	return device_xname(pci_dev_dev(pdev));
74}
75
76/*
77 * Setup enough of a parent that we can access config space.
78 * This is gross and grovels pci(4) and ppb(4) internals.
79 */
80static struct pci_dev *
81alloc_fake_parent_device(device_t parent, const struct pci_attach_args *pa)
82{
83
84	if (parent == NULL || !device_is_a(parent, "pci"))
85		return NULL;
86
87	device_t pparent = device_parent(parent);
88	if (pparent == NULL || !device_is_a(pparent, "ppb"))
89		return NULL;
90
91	struct pci_softc *pcisc = device_private(parent);
92	struct ppb_softc *ppbsc = device_private(pparent);
93
94	struct pci_dev *parentdev = kmem_zalloc(sizeof(*parentdev), KM_SLEEP);
95
96	/* Copy this device's pci_attach_args{} as a base-line. */
97	struct pci_attach_args *npa = &parentdev->pd_pa;
98	*npa = *pa;
99
100	/* Now update with stuff found in parent. */
101	npa->pa_iot = pcisc->sc_iot;
102	npa->pa_memt = pcisc->sc_memt;
103	npa->pa_dmat = pcisc->sc_dmat;
104	npa->pa_dmat64 = pcisc->sc_dmat64;
105	npa->pa_pc = pcisc->sc_pc;
106	npa->pa_flags = 0;	/* XXX? */
107
108	/* Copy the parent tag, and read some info about it. */
109	npa->pa_tag = ppbsc->sc_tag;
110	pcireg_t id = pci_conf_read(npa->pa_pc, npa->pa_tag, PCI_ID_REG);
111	pcireg_t subid = pci_conf_read(npa->pa_pc, npa->pa_tag,
112	    PCI_SUBSYS_ID_REG);
113	pcireg_t class = pci_conf_read(npa->pa_pc, npa->pa_tag, PCI_CLASS_REG);
114
115	/*
116	 * Fill in as much of pci_attach_args and pci_dev as reasonably possible.
117	 * Most of this is not used currently.
118	 */
119	int bus, device, function;
120	pci_decompose_tag(npa->pa_pc, npa->pa_tag, &bus, &device, &function);
121	npa->pa_device = device;
122	npa->pa_function = function;
123	npa->pa_bus = bus;
124	npa->pa_id = id;
125	npa->pa_class = class;
126	npa->pa_intrswiz = pcisc->sc_intrswiz;
127	npa->pa_intrtag = pcisc->sc_intrtag;
128	npa->pa_intrpin = PCI_INTERRUPT_PIN_NONE;
129
130	parentdev->pd_dev = parent;
131
132	parentdev->bus = NULL;
133	parentdev->devfn = device << 3 | function;
134	parentdev->vendor = PCI_VENDOR(id);
135	parentdev->device = PCI_PRODUCT(id);
136	parentdev->subsystem_vendor = PCI_SUBSYS_VENDOR(subid);
137	parentdev->subsystem_device = PCI_SUBSYS_ID(subid);
138	parentdev->revision = PCI_REVISION(class);
139	parentdev->class = __SHIFTOUT(class, 0xffffff00UL); /* ? */
140
141	return parentdev;
142}
143
144void
145linux_pci_dev_init(struct pci_dev *pdev, device_t dev, device_t parent,
146    const struct pci_attach_args *pa, int kludges)
147{
148	const uint32_t subsystem_id = pci_conf_read(pa->pa_pc, pa->pa_tag,
149	    PCI_SUBSYS_ID_REG);
150	unsigned i;
151
152	memset(pdev, 0, sizeof(*pdev)); /* paranoia */
153
154	pdev->pd_pa = *pa;
155	pdev->pd_kludges = kludges;
156	pdev->pd_rom_vaddr = NULL;
157	pdev->pd_dev = dev;
158#if (NACPICA > 0)
159	const int seg = pci_get_segment(pa->pa_pc);
160	pdev->pd_ad = acpi_pcidev_find(seg, pa->pa_bus,
161	    pa->pa_device, pa->pa_function);
162#else
163	pdev->pd_ad = NULL;
164#endif
165	pdev->pd_saved_state = NULL;
166	pdev->pd_intr_handles = NULL;
167	pdev->pd_drvdata = NULL;
168	pdev->bus = kmem_zalloc(sizeof(*pdev->bus), KM_NOSLEEP);
169	pdev->bus->pb_pc = pa->pa_pc;
170	pdev->bus->pb_dev = parent;
171	pdev->bus->number = pa->pa_bus;
172	pdev->bus->self = alloc_fake_parent_device(parent, pa);
173	pdev->devfn = PCI_DEVFN(pa->pa_device, pa->pa_function);
174	pdev->vendor = PCI_VENDOR(pa->pa_id);
175	pdev->device = PCI_PRODUCT(pa->pa_id);
176	pdev->subsystem_vendor = PCI_SUBSYS_VENDOR(subsystem_id);
177	pdev->subsystem_device = PCI_SUBSYS_ID(subsystem_id);
178	pdev->revision = PCI_REVISION(pa->pa_class);
179	pdev->class = __SHIFTOUT(pa->pa_class, 0xffffff00UL); /* ? */
180
181	CTASSERT(__arraycount(pdev->pd_resources) == PCI_NUM_RESOURCES);
182	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
183		const int reg = PCI_BAR(i);
184
185		pdev->pd_resources[i].type = pci_mapreg_type(pa->pa_pc,
186		    pa->pa_tag, reg);
187		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, reg,
188			pdev->pd_resources[i].type,
189			&pdev->pd_resources[i].addr,
190			&pdev->pd_resources[i].size,
191			&pdev->pd_resources[i].flags)) {
192			pdev->pd_resources[i].addr = 0;
193			pdev->pd_resources[i].size = 0;
194			pdev->pd_resources[i].flags = 0;
195		}
196		pdev->pd_resources[i].kva = NULL;
197		pdev->pd_resources[i].mapped = false;
198	}
199}
200
201int
202pci_find_capability(struct pci_dev *pdev, int cap)
203{
204
205	return pci_get_capability(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, cap,
206	    NULL, NULL);
207}
208
209int
210pci_read_config_dword(struct pci_dev *pdev, int reg, uint32_t *valuep)
211{
212
213	KASSERT(!ISSET(reg, 3));
214	*valuep = pci_conf_read(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, reg);
215	return 0;
216}
217
218int
219pci_read_config_word(struct pci_dev *pdev, int reg, uint16_t *valuep)
220{
221
222	KASSERT(!ISSET(reg, 1));
223	*valuep = pci_conf_read(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
224	    (reg &~ 2)) >> (8 * (reg & 2));
225	return 0;
226}
227
228int
229pci_read_config_byte(struct pci_dev *pdev, int reg, uint8_t *valuep)
230{
231
232	*valuep = pci_conf_read(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
233	    (reg &~ 3)) >> (8 * (reg & 3));
234	return 0;
235}
236
237int
238pci_write_config_dword(struct pci_dev *pdev, int reg, uint32_t value)
239{
240
241	KASSERT(!ISSET(reg, 3));
242	pci_conf_write(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, reg, value);
243	return 0;
244}
245
246int
247pci_bus_read_config_dword(struct pci_bus *bus, unsigned devfn, int reg,
248    uint32_t *valuep)
249{
250	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
251	    PCI_FUNC(devfn));
252
253	KASSERT(!ISSET(reg, 1));
254	*valuep = pci_conf_read(bus->pb_pc, tag, reg & ~3) >> (8 * (reg & 3));
255	return 0;
256}
257
258int
259pci_bus_read_config_word(struct pci_bus *bus, unsigned devfn, int reg,
260    uint16_t *valuep)
261{
262	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
263	    PCI_FUNC(devfn));
264
265	KASSERT(!ISSET(reg, 1));
266	*valuep = pci_conf_read(bus->pb_pc, tag, reg &~ 2) >> (8 * (reg & 2));
267	return 0;
268}
269
270int
271pci_bus_read_config_byte(struct pci_bus *bus, unsigned devfn, int reg,
272    uint8_t *valuep)
273{
274	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
275	    PCI_FUNC(devfn));
276
277	*valuep = pci_conf_read(bus->pb_pc, tag, reg &~ 3) >> (8 * (reg & 3));
278	return 0;
279}
280
281int
282pci_bus_write_config_dword(struct pci_bus *bus, unsigned devfn, int reg,
283    uint32_t value)
284{
285	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
286	    PCI_FUNC(devfn));
287
288	KASSERT(!ISSET(reg, 3));
289	pci_conf_write(bus->pb_pc, tag, reg, value);
290	return 0;
291}
292
293static void
294pci_rmw_config(pci_chipset_tag_t pc, pcitag_t tag, int reg, unsigned int bytes,
295    uint32_t value)
296{
297	const uint32_t mask = ~((~0UL) << (8 * bytes));
298	const int reg32 = (reg &~ 3);
299	const unsigned int shift = (8 * (reg & 3));
300	uint32_t value32;
301
302	KASSERT(bytes <= 4);
303	KASSERT(!ISSET(value, ~mask));
304	value32 = pci_conf_read(pc, tag, reg32);
305	value32 &=~ (mask << shift);
306	value32 |= (value << shift);
307	pci_conf_write(pc, tag, reg32, value32);
308}
309
310int
311pci_write_config_word(struct pci_dev *pdev, int reg, uint16_t value)
312{
313
314	KASSERT(!ISSET(reg, 1));
315	pci_rmw_config(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, reg, 2, value);
316	return 0;
317}
318
319int
320pci_write_config_byte(struct pci_dev *pdev, int reg, uint8_t value)
321{
322
323	pci_rmw_config(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, reg, 1, value);
324	return 0;
325}
326
327int
328pci_bus_write_config_word(struct pci_bus *bus, unsigned devfn, int reg,
329    uint16_t value)
330{
331	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
332	    PCI_FUNC(devfn));
333
334	KASSERT(!ISSET(reg, 1));
335	pci_rmw_config(bus->pb_pc, tag, reg, 2, value);
336	return 0;
337}
338
339int
340pci_bus_write_config_byte(struct pci_bus *bus, unsigned devfn, int reg,
341    uint8_t value)
342{
343	pcitag_t tag = pci_make_tag(bus->pb_pc, bus->number, PCI_SLOT(devfn),
344	    PCI_FUNC(devfn));
345
346	pci_rmw_config(bus->pb_pc, tag, reg, 1, value);
347	return 0;
348}
349
350int
351pci_enable_msi(struct pci_dev *pdev)
352{
353	const struct pci_attach_args *const pa = &pdev->pd_pa;
354
355	if (pci_msi_alloc_exact(pa, &pdev->pd_intr_handles, 1))
356		return -EINVAL;
357
358	pdev->msi_enabled = 1;
359	return 0;
360}
361
362void
363pci_disable_msi(struct pci_dev *pdev __unused)
364{
365	const struct pci_attach_args *const pa = &pdev->pd_pa;
366
367	if (pdev->pd_intr_handles != NULL) {
368		pci_intr_release(pa->pa_pc, pdev->pd_intr_handles, 1);
369		pdev->pd_intr_handles = NULL;
370	}
371	pdev->msi_enabled = 0;
372}
373
374void
375pci_set_master(struct pci_dev *pdev)
376{
377	pcireg_t csr;
378
379	csr = pci_conf_read(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
380	    PCI_COMMAND_STATUS_REG);
381	csr |= PCI_COMMAND_MASTER_ENABLE;
382	pci_conf_write(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
383	    PCI_COMMAND_STATUS_REG, csr);
384}
385
386void
387pci_clear_master(struct pci_dev *pdev)
388{
389	pcireg_t csr;
390
391	csr = pci_conf_read(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
392	    PCI_COMMAND_STATUS_REG);
393	csr &= ~(pcireg_t)PCI_COMMAND_MASTER_ENABLE;
394	pci_conf_write(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
395	    PCI_COMMAND_STATUS_REG, csr);
396}
397
398int
399pcie_capability_read_dword(struct pci_dev *pdev, int reg, uint32_t *valuep)
400{
401	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
402	pcitag_t tag = pdev->pd_pa.pa_tag;
403	int off;
404
405	*valuep = 0;
406
407	/* Must have capabilities. */
408	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
409		return 1;
410
411	*valuep = pci_conf_read(pc, tag, off + reg);
412
413	return 0;
414}
415
416int
417pcie_capability_read_word(struct pci_dev *pdev, int reg, uint16_t *valuep)
418{
419	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
420	pcitag_t tag = pdev->pd_pa.pa_tag;
421	int off;
422
423	*valuep = 0;
424
425	/* Must have capabilities. */
426	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
427		return 1;
428
429	*valuep = pci_conf_read(pc, tag, off + (reg &~ 2)) >> (8 * (reg & 2));
430
431	return 0;
432}
433
434int
435pcie_capability_write_dword(struct pci_dev *pdev, int reg, uint32_t value)
436{
437	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
438	pcitag_t tag = pdev->pd_pa.pa_tag;
439	int off;
440
441	/* Must have capabilities. */
442	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
443		return 1;
444
445	pci_conf_write(pc, tag, off + reg, value);
446
447	return 0;
448}
449
450int
451pcie_capability_write_word(struct pci_dev *pdev, int reg, uint16_t value)
452{
453	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
454	pcitag_t tag = pdev->pd_pa.pa_tag;
455	int off;
456
457	/* Must have capabilities. */
458	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
459		return 1;
460
461	pci_rmw_config(pc, tag, off + reg, 2, value);
462
463	return 0;
464}
465
466/* From PCIe 5.0 7.5.3.4 "Device Control Register" */
467static const unsigned readrqmax[] = {
468	128,
469	256,
470	512,
471	1024,
472	2048,
473	4096,
474};
475
476int
477pcie_get_readrq(struct pci_dev *pdev)
478{
479	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
480	pcitag_t tag = pdev->pd_pa.pa_tag;
481	unsigned val;
482	int off;
483
484	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
485		return -EINVAL; /* XXX NetBSD->Linux */
486
487	val = __SHIFTOUT(pci_conf_read(pc, tag, off + PCIE_DCSR),
488	    PCIE_DCSR_MAX_READ_REQ);
489
490	if (val >= __arraycount(readrqmax))
491		val = 0;
492	return readrqmax[val];
493}
494
495int
496pcie_set_readrq(struct pci_dev *pdev, int val)
497{
498	pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
499	pcitag_t tag = pdev->pd_pa.pa_tag;
500	pcireg_t reg, newval = 0;
501	unsigned i;
502	int off;
503
504	for (i = 0; i < __arraycount(readrqmax); i++) {
505		if (readrqmax[i] == val) {
506			newval = i;
507			break;
508		}
509	}
510
511	if (i == __arraycount(readrqmax))
512		return -EINVAL;
513
514	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
515		return -EINVAL; /* XXX NetBSD->Linux */
516
517	reg = pci_conf_read(pc, tag, off + PCIE_DCSR);
518	reg &= ~PCIE_DCSR_MAX_READ_REQ | (newval << 12);
519	pci_conf_write(pc, tag, off + PCIE_DCSR, reg);
520
521	return 0;
522}
523
524bus_addr_t
525pcibios_align_resource(void *p, const struct resource *resource,
526    bus_addr_t addr, bus_size_t size)
527{
528	panic("pcibios_align_resource has accessed unaligned neurons!");
529}
530
531int
532pci_bus_alloc_resource(struct pci_bus *bus, struct resource *resource,
533    bus_size_t size, bus_size_t align, bus_addr_t start, int type __unused,
534    bus_addr_t (*align_fn)(void *, const struct resource *, bus_addr_t,
535	bus_size_t) __unused,
536    struct pci_dev *pdev)
537{
538	const struct pci_attach_args *const pa = &pdev->pd_pa;
539	bus_space_tag_t bst;
540	int error;
541
542	switch (resource->flags) {
543	case IORESOURCE_MEM:
544		bst = pa->pa_memt;
545		break;
546
547	case IORESOURCE_IO:
548		bst = pa->pa_iot;
549		break;
550
551	default:
552		panic("I don't know what kind of resource you want!");
553	}
554
555	resource->r_bst = bst;
556	error = bus_space_alloc(bst, start, __type_max(bus_addr_t),
557	    size, align, 0, 0, &resource->start, &resource->r_bsh);
558	if (error)
559		return error;
560
561	resource->end = start + (size - 1);
562	return 0;
563}
564
565/*
566 * XXX Mega-kludgerific!  pci_get_bus_and_slot and pci_get_class are
567 * defined only for their single purposes in i915drm, in
568 * i915_get_bridge_dev and intel_detect_pch.  We can't define them more
569 * generally without adapting pci_find_device (and pci_enumerate_bus
570 * internally) to pass a cookie through.
571 */
572
573static int
574pci_kludgey_match_bus0_dev0_func0(const struct pci_attach_args *pa)
575{
576
577	/* XXX domain */
578	if (pa->pa_bus != 0)
579		return 0;
580	if (pa->pa_device != 0)
581		return 0;
582	if (pa->pa_function != 0)
583		return 0;
584
585	return 1;
586}
587
588struct pci_dev *
589pci_get_domain_bus_and_slot(int domain, int bus, int slot)
590{
591	struct pci_attach_args pa;
592
593	KASSERT(domain == 0);
594	KASSERT(bus == 0);
595	KASSERT(slot == PCI_DEVFN(0, 0));
596
597	if (!pci_find_device(&pa, &pci_kludgey_match_bus0_dev0_func0))
598		return NULL;
599
600	struct pci_dev *const pdev = kmem_zalloc(sizeof(*pdev), KM_SLEEP);
601	linux_pci_dev_init(pdev, NULL, NULL, &pa, NBPCI_KLUDGE_GET_MUMBLE);
602
603	return pdev;
604}
605
606static int
607pci_kludgey_match_isa_bridge(const struct pci_attach_args *pa)
608{
609
610	if (PCI_CLASS(pa->pa_class) != PCI_CLASS_BRIDGE)
611		return 0;
612	if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_BRIDGE_ISA)
613		return 0;
614
615	return 1;
616}
617
618void
619pci_dev_put(struct pci_dev *pdev)
620{
621
622	if (pdev == NULL)
623		return;
624
625	KASSERT(ISSET(pdev->pd_kludges, NBPCI_KLUDGE_GET_MUMBLE));
626	kmem_free(pdev->bus, sizeof(*pdev->bus));
627	kmem_free(pdev, sizeof(*pdev));
628}
629
630struct pci_dev *		/* XXX i915 kludge */
631pci_get_class(uint32_t class_subclass_shifted __unused, struct pci_dev *from)
632{
633	struct pci_attach_args pa;
634
635	KASSERT(class_subclass_shifted == (PCI_CLASS_BRIDGE_ISA << 8));
636
637	if (from != NULL) {
638		pci_dev_put(from);
639		return NULL;
640	}
641
642	if (!pci_find_device(&pa, &pci_kludgey_match_isa_bridge))
643		return NULL;
644
645	struct pci_dev *const pdev = kmem_zalloc(sizeof(*pdev), KM_SLEEP);
646	linux_pci_dev_init(pdev, NULL, NULL, &pa, NBPCI_KLUDGE_GET_MUMBLE);
647
648	return pdev;
649}
650
651int
652pci_dev_present(const struct pci_device_id *ids)
653{
654
655	/* XXX implement me -- pci_find_device doesn't pass a cookie */
656	return 0;
657}
658
659void
660pci_unmap_rom(struct pci_dev *pdev, void __pci_rom_iomem *vaddr __unused)
661{
662
663	/* XXX Disable the ROM address decoder.  */
664	KASSERT(ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM));
665	KASSERT(vaddr == pdev->pd_rom_vaddr);
666	bus_space_unmap(pdev->pd_rom_bst, pdev->pd_rom_bsh, pdev->pd_rom_size);
667	pdev->pd_kludges &= ~NBPCI_KLUDGE_MAP_ROM;
668	pdev->pd_rom_vaddr = NULL;
669}
670
671/* XXX Whattakludge!  Should move this in sys/arch/.  */
672static int
673pci_map_rom_md(struct pci_dev *pdev)
674{
675#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
676	const bus_addr_t rom_base = 0xc0000;
677	const bus_size_t rom_size = 0x20000;
678	bus_space_handle_t rom_bsh;
679	int error;
680
681	if (PCI_CLASS(pdev->pd_pa.pa_class) != PCI_CLASS_DISPLAY)
682		return ENXIO;
683	if (PCI_SUBCLASS(pdev->pd_pa.pa_class) != PCI_SUBCLASS_DISPLAY_VGA)
684		return ENXIO;
685	/* XXX Check whether this is the primary VGA card?  */
686	error = bus_space_map(pdev->pd_pa.pa_memt, rom_base, rom_size,
687	    (BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE), &rom_bsh);
688	if (error)
689		return ENXIO;
690
691	pdev->pd_rom_bst = pdev->pd_pa.pa_memt;
692	pdev->pd_rom_bsh = rom_bsh;
693	pdev->pd_rom_size = rom_size;
694	pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM;
695
696	return 0;
697#else
698	return ENXIO;
699#endif
700}
701
702void __pci_rom_iomem *
703pci_map_rom(struct pci_dev *pdev, size_t *sizep)
704{
705
706	KASSERT(!ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM));
707
708	if (pci_mapreg_map(&pdev->pd_pa, PCI_MAPREG_ROM, PCI_MAPREG_TYPE_ROM,
709		(BUS_SPACE_MAP_PREFETCHABLE | BUS_SPACE_MAP_LINEAR),
710		&pdev->pd_rom_bst, &pdev->pd_rom_bsh, NULL, &pdev->pd_rom_size)
711	    != 0)
712		goto fail_mi;
713	pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM;
714
715	/* XXX This type is obviously wrong in general...  */
716	if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh,
717		pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86,
718		&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) {
719		pci_unmap_rom(pdev, NULL);
720		goto fail_mi;
721	}
722	goto success;
723
724fail_mi:
725	if (pci_map_rom_md(pdev) != 0)
726		goto fail_md;
727
728	/* XXX This type is obviously wrong in general...  */
729	if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh,
730		pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86,
731		&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) {
732		pci_unmap_rom(pdev, NULL);
733		goto fail_md;
734	}
735
736success:
737	KASSERT(pdev->pd_rom_found_size <= SIZE_T_MAX);
738	*sizep = pdev->pd_rom_found_size;
739	pdev->pd_rom_vaddr = bus_space_vaddr(pdev->pd_rom_bst,
740	    pdev->pd_rom_found_bsh);
741	return pdev->pd_rom_vaddr;
742
743fail_md:
744	return NULL;
745}
746
747void __pci_rom_iomem *
748pci_platform_rom(struct pci_dev *pdev __unused, size_t *sizep)
749{
750
751	*sizep = 0;
752	return NULL;
753}
754
755int
756pci_enable_rom(struct pci_dev *pdev)
757{
758	const pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
759	const pcitag_t tag = pdev->pd_pa.pa_tag;
760	pcireg_t addr;
761	int s;
762
763	/* XXX Don't do anything if the ROM isn't there.  */
764
765	s = splhigh();
766	addr = pci_conf_read(pc, tag, PCI_MAPREG_ROM);
767	addr |= PCI_MAPREG_ROM_ENABLE;
768	pci_conf_write(pc, tag, PCI_MAPREG_ROM, addr);
769	splx(s);
770
771	return 0;
772}
773
774void
775pci_disable_rom(struct pci_dev *pdev)
776{
777	const pci_chipset_tag_t pc = pdev->pd_pa.pa_pc;
778	const pcitag_t tag = pdev->pd_pa.pa_tag;
779	pcireg_t addr;
780	int s;
781
782	s = splhigh();
783	addr = pci_conf_read(pc, tag, PCI_MAPREG_ROM);
784	addr &= ~(pcireg_t)PCI_MAPREG_ROM_ENABLE;
785	pci_conf_write(pc, tag, PCI_MAPREG_ROM, addr);
786	splx(s);
787}
788
789bus_addr_t
790pci_resource_start(struct pci_dev *pdev, unsigned i)
791{
792
793	KASSERT(i < PCI_NUM_RESOURCES);
794	return pdev->pd_resources[i].addr;
795}
796
797bus_size_t
798pci_resource_len(struct pci_dev *pdev, unsigned i)
799{
800
801	KASSERT(i < PCI_NUM_RESOURCES);
802	return pdev->pd_resources[i].size;
803}
804
805bus_addr_t
806pci_resource_end(struct pci_dev *pdev, unsigned i)
807{
808
809	return pci_resource_start(pdev, i) + (pci_resource_len(pdev, i) - 1);
810}
811
812int
813pci_resource_flags(struct pci_dev *pdev, unsigned i)
814{
815
816	KASSERT(i < PCI_NUM_RESOURCES);
817	return pdev->pd_resources[i].flags;
818}
819
820void __pci_iomem *
821pci_iomap(struct pci_dev *pdev, unsigned i, bus_size_t size)
822{
823	int error;
824
825	KASSERT(i < PCI_NUM_RESOURCES);
826	KASSERT(pdev->pd_resources[i].kva == NULL);
827
828	if (PCI_MAPREG_TYPE(pdev->pd_resources[i].type) != PCI_MAPREG_TYPE_MEM)
829		return NULL;
830	if (pdev->pd_resources[i].size < size)
831		return NULL;
832	error = bus_space_map(pdev->pd_pa.pa_memt, pdev->pd_resources[i].addr,
833	    size, BUS_SPACE_MAP_LINEAR | pdev->pd_resources[i].flags,
834	    &pdev->pd_resources[i].bsh);
835	if (error)
836		return NULL;
837	pdev->pd_resources[i].bst = pdev->pd_pa.pa_memt;
838	pdev->pd_resources[i].kva = bus_space_vaddr(pdev->pd_resources[i].bst,
839	    pdev->pd_resources[i].bsh);
840	pdev->pd_resources[i].mapped = true;
841
842	return pdev->pd_resources[i].kva;
843}
844
845void
846pci_iounmap(struct pci_dev *pdev, void __pci_iomem *kva)
847{
848	unsigned i;
849
850	CTASSERT(__arraycount(pdev->pd_resources) == PCI_NUM_RESOURCES);
851	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
852		if (pdev->pd_resources[i].kva == kva)
853			break;
854	}
855	KASSERT(i < PCI_NUM_RESOURCES);
856
857	pdev->pd_resources[i].kva = NULL;
858	bus_space_unmap(pdev->pd_resources[i].bst, pdev->pd_resources[i].bsh,
859	    pdev->pd_resources[i].size);
860}
861
862void
863pci_save_state(struct pci_dev *pdev)
864{
865
866	KASSERT(pdev->pd_saved_state == NULL);
867	pdev->pd_saved_state = kmem_alloc(sizeof(*pdev->pd_saved_state),
868	    KM_SLEEP);
869	pci_conf_capture(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
870	    pdev->pd_saved_state);
871}
872
873void
874pci_restore_state(struct pci_dev *pdev)
875{
876
877	KASSERT(pdev->pd_saved_state != NULL);
878	pci_conf_restore(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag,
879	    pdev->pd_saved_state);
880	kmem_free(pdev->pd_saved_state, sizeof(*pdev->pd_saved_state));
881	pdev->pd_saved_state = NULL;
882}
883
884bool
885pci_is_pcie(struct pci_dev *pdev)
886{
887
888	return (pci_find_capability(pdev, PCI_CAP_PCIEXPRESS) != 0);
889}
890
891bool
892pci_dma_supported(struct pci_dev *pdev, uintmax_t mask)
893{
894
895	/* XXX Cop-out.  */
896	if (mask > DMA_BIT_MASK(32))
897		return pci_dma64_available(&pdev->pd_pa);
898	else
899		return true;
900}
901
902bool
903pci_is_thunderbolt_attached(struct pci_dev *pdev)
904{
905
906	/* XXX Cop-out.  */
907	return false;
908}
909
910bool
911pci_is_root_bus(struct pci_bus *bus)
912{
913
914	return bus->number == 0;
915}
916
917int
918pci_domain_nr(struct pci_bus *bus)
919{
920
921	return pci_get_segment(bus->pb_pc);
922}
923
924/*
925 * We explicitly rename pci_enable/disable_device so that you have to
926 * review each use of them, since NetBSD's PCI API does _not_ respect
927 * our local enablecnt here, but there are different parts of NetBSD
928 * that automatically enable/disable like PMF, so you have to decide
929 * for each one whether to call it or not.
930 */
931
932int
933linux_pci_enable_device(struct pci_dev *pdev)
934{
935	const struct pci_attach_args *pa = &pdev->pd_pa;
936	pcireg_t csr;
937	int s;
938
939	if (pdev->pd_enablecnt++)
940		return 0;
941
942	s = splhigh();
943	csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
944	/* If someone else (firmware) already enabled it, credit them.  */
945	if (csr & (PCI_COMMAND_IO_ENABLE|PCI_COMMAND_MEM_ENABLE))
946		pdev->pd_enablecnt++;
947	csr |= PCI_COMMAND_IO_ENABLE;
948	csr |= PCI_COMMAND_MEM_ENABLE;
949	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
950	splx(s);
951
952	return 0;
953}
954
955void
956linux_pci_disable_device(struct pci_dev *pdev)
957{
958	const struct pci_attach_args *pa = &pdev->pd_pa;
959	pcireg_t csr;
960	int s;
961
962	if (--pdev->pd_enablecnt)
963		return;
964
965	s = splhigh();
966	csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
967	csr &= ~PCI_COMMAND_IO_ENABLE;
968	csr &= ~PCI_COMMAND_MEM_ENABLE;
969	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
970	splx(s);
971}
972
973void
974linux_pci_dev_destroy(struct pci_dev *pdev)
975{
976	unsigned i;
977
978	if (pdev->bus->self != NULL) {
979		kmem_free(pdev->bus->self, sizeof(*pdev->bus->self));
980	}
981	if (pdev->bus != NULL) {
982		kmem_free(pdev->bus, sizeof(*pdev->bus));
983		pdev->bus = NULL;
984	}
985	if (ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM)) {
986		pci_unmap_rom(pdev, pdev->pd_rom_vaddr);
987		pdev->pd_rom_vaddr = 0;
988	}
989	for (i = 0; i < __arraycount(pdev->pd_resources); i++) {
990		if (!pdev->pd_resources[i].mapped)
991			continue;
992		bus_space_unmap(pdev->pd_resources[i].bst,
993		    pdev->pd_resources[i].bsh, pdev->pd_resources[i].size);
994	}
995
996	/* There is no way these should be still in use.  */
997	KASSERT(pdev->pd_saved_state == NULL);
998	KASSERT(pdev->pd_intr_handles == NULL);
999}
1000
1001enum pci_bus_speed
1002pcie_get_speed_cap(struct pci_dev *dev)
1003{
1004	pci_chipset_tag_t pc = dev->pd_pa.pa_pc;
1005	pcitag_t tag = dev->pd_pa.pa_tag;
1006	pcireg_t lcap, lcap2, xcap;
1007	int off;
1008
1009	/* Must have capabilities. */
1010	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
1011		return PCI_SPEED_UNKNOWN;
1012
1013	/* Only PCIe 3.x has LCAP2. */
1014	xcap = pci_conf_read(pc, tag, off + PCIE_XCAP);
1015	if (__SHIFTOUT(xcap, PCIE_XCAP_VER_MASK) >= 2) {
1016		lcap2 = pci_conf_read(pc, tag, off + PCIE_LCAP2);
1017		if (lcap2) {
1018			if ((lcap2 & PCIE_LCAP2_SUP_LNKS64) != 0) {
1019				return PCIE_SPEED_64_0GT;
1020			}
1021			if ((lcap2 & PCIE_LCAP2_SUP_LNKS32) != 0) {
1022				return PCIE_SPEED_32_0GT;
1023			}
1024			if ((lcap2 & PCIE_LCAP2_SUP_LNKS16) != 0) {
1025				return PCIE_SPEED_16_0GT;
1026			}
1027			if ((lcap2 & PCIE_LCAP2_SUP_LNKS8) != 0) {
1028				return PCIE_SPEED_8_0GT;
1029			}
1030			if ((lcap2 & PCIE_LCAP2_SUP_LNKS5) != 0) {
1031				return PCIE_SPEED_5_0GT;
1032			}
1033			if ((lcap2 & PCIE_LCAP2_SUP_LNKS2) != 0) {
1034				return PCIE_SPEED_2_5GT;
1035			}
1036		}
1037	}
1038
1039	lcap = pci_conf_read(pc, tag, off + PCIE_LCAP);
1040	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_64) {
1041		return PCIE_SPEED_64_0GT;
1042	}
1043	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_32) {
1044		return PCIE_SPEED_32_0GT;
1045	}
1046	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_16) {
1047		return PCIE_SPEED_16_0GT;
1048	}
1049	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_8) {
1050		return PCIE_SPEED_8_0GT;
1051	}
1052	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_5) {
1053		return PCIE_SPEED_5_0GT;
1054	}
1055	if ((lcap & PCIE_LCAP_MAX_SPEED) == PCIE_LCAP_MAX_SPEED_2) {
1056		return PCIE_SPEED_2_5GT;
1057	}
1058
1059	return PCI_SPEED_UNKNOWN;
1060}
1061
1062/*
1063 * This should walk the tree, it only checks this device currently.
1064 * It also does not write to limiting_dev (the only caller in drm2
1065 * currently does not use it.)
1066 */
1067unsigned
1068pcie_bandwidth_available(struct pci_dev *dev,
1069    struct pci_dev **limiting_dev,
1070    enum pci_bus_speed *speed,
1071    enum pcie_link_width *width)
1072{
1073	pci_chipset_tag_t pc = dev->pd_pa.pa_pc;
1074	pcitag_t tag = dev->pd_pa.pa_tag;
1075	pcireg_t lcsr;
1076	unsigned per_line_speed, num_lanes;
1077	int off;
1078
1079	/* Must have capabilities. */
1080	if (pci_get_capability(pc, tag, PCI_CAP_PCIEXPRESS, &off, NULL) == 0)
1081		return 0;
1082
1083	if (speed)
1084		*speed = PCI_SPEED_UNKNOWN;
1085	if (width)
1086		*width = 0;
1087
1088	lcsr = pci_conf_read(pc, tag, off + PCIE_LCSR);
1089
1090	switch (lcsr & PCIE_LCSR_NLW) {
1091	case PCIE_LCSR_NLW_X1:
1092	case PCIE_LCSR_NLW_X2:
1093	case PCIE_LCSR_NLW_X4:
1094	case PCIE_LCSR_NLW_X8:
1095	case PCIE_LCSR_NLW_X12:
1096	case PCIE_LCSR_NLW_X16:
1097	case PCIE_LCSR_NLW_X32:
1098		num_lanes = __SHIFTOUT(lcsr, PCIE_LCSR_NLW);
1099		if (width)
1100			*width = num_lanes;
1101		break;
1102	default:
1103		num_lanes = 0;
1104		break;
1105	}
1106
1107	switch (__SHIFTOUT(lcsr, PCIE_LCSR_LINKSPEED)) {
1108	case PCIE_LCSR_LINKSPEED_2:
1109		*speed = PCIE_SPEED_2_5GT;
1110		per_line_speed = 2500 * 8 / 10;
1111		break;
1112	case PCIE_LCSR_LINKSPEED_5:
1113		*speed = PCIE_SPEED_5_0GT;
1114		per_line_speed = 5000 * 8 / 10;
1115		break;
1116	case PCIE_LCSR_LINKSPEED_8:
1117		*speed = PCIE_SPEED_8_0GT;
1118		per_line_speed = 8000 * 128 / 130;
1119		break;
1120	case PCIE_LCSR_LINKSPEED_16:
1121		*speed = PCIE_SPEED_16_0GT;
1122		per_line_speed = 16000 * 128 / 130;
1123		break;
1124	case PCIE_LCSR_LINKSPEED_32:
1125		*speed = PCIE_SPEED_32_0GT;
1126		per_line_speed = 32000 * 128 / 130;
1127		break;
1128	case PCIE_LCSR_LINKSPEED_64:
1129		*speed = PCIE_SPEED_64_0GT;
1130		per_line_speed = 64000 * 128 / 130;
1131		break;
1132	default:
1133		per_line_speed = 0;
1134	}
1135
1136	return num_lanes * per_line_speed;
1137}
1138