Module Name: src
Committed By: skrll
Date: Tue Dec 29 15:49:13 UTC 2020
Modified Files:
src/sys/dev/pci: pci_map.c
Log Message:
More of the patch that adds support for Enhanced Allocations as seen in
the Cavium ThunderX based GIGABYTE MT30-GS2-00
>From thorpej@. Thanks!
(botched the copying of this from a branch previously)
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/pci/pci_map.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/pci_map.c
diff -u src/sys/dev/pci/pci_map.c:1.42 src/sys/dev/pci/pci_map.c:1.43
--- src/sys/dev/pci/pci_map.c:1.42 Tue Dec 29 15:39:59 2020
+++ src/sys/dev/pci/pci_map.c Tue Dec 29 15:49:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_map.c,v 1.42 2020/12/29 15:39:59 skrll Exp $ */
+/* $NetBSD: pci_map.c,v 1.43 2020/12/29 15:49:13 skrll Exp $ */
/*-
* Copyright (c) 1998, 2000, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.42 2020/12/29 15:39:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_map.c,v 1.43 2020/12/29 15:49:13 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -575,31 +575,65 @@ pci_mapreg_submap(const struct pci_attac
bus_size_t realmaxsize;
pcireg_t csr;
int flags, s;
+ int ea_cap_ptr;
+ bool have_ea = false;
+ struct pci_ea_entry entry;
if (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) {
if ((pa->pa_flags & PCI_FLAGS_IO_OKAY) == 0)
return 1;
- if (pci_io_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
- &realmaxsize, &flags))
- return 1;
tag = pa->pa_iot;
} else {
if ((pa->pa_flags & PCI_FLAGS_MEM_OKAY) == 0)
return 1;
- if (pci_mem_find(pa->pa_pc, pa->pa_tag, reg, type, &base,
- &realmaxsize, &flags))
- return 1;
tag = pa->pa_memt;
}
+ if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_EA, &ea_cap_ptr,
+ NULL)) {
+ have_ea = true;
+ if (pci_ea_find(pa->pa_pc, pa->pa_tag, ea_cap_ptr, reg, type,
+ &base, &realmaxsize, &flags, &entry))
+ return 1;
+ if (reg != PCI_MAPREG_ROM && !entry.enabled) {
+ /* Entry not enabled. Try the regular BAR? */
+ have_ea = false;
+ }
+ }
+
+ if (!have_ea) {
+ if (PCI_MAPREG_TYPE(type) == PCI_MAPREG_TYPE_IO) {
+ if (pci_io_find(pa->pa_pc, pa->pa_tag, reg, type,
+ &base, &realmaxsize, &flags))
+ return 1;
+ } else {
+ if (pci_mem_find(pa->pa_pc, pa->pa_tag, reg, type,
+ &base, &realmaxsize, &flags))
+ return 1;
+ }
+ }
+
if (reg == PCI_MAPREG_ROM) {
- pcireg_t mask;
- /* we have to enable the ROM address decoder... */
- s = splhigh();
- mask = pci_conf_read(pa->pa_pc, pa->pa_tag, reg);
- mask |= PCI_MAPREG_ROM_ENABLE;
- pci_conf_write(pa->pa_pc, pa->pa_tag, reg, mask);
- splx(s);
+ /* Enable the ROM address decoder, if necessary. */
+ if (have_ea) {
+ if (!entry.enabled) {
+ entry.dw0 |= PCI_EA_E;
+ pci_conf_write(pa->pa_pc, pa->pa_tag,
+ entry.ea_ptrs[EA_ptr_dw0],
+ entry.dw0);
+ entry.enabled = true;
+ }
+ } else {
+ s = splhigh();
+ pcireg_t mask =
+ pci_conf_read(pa->pa_pc, pa->pa_tag, reg);
+ if ((mask & PCI_MAPREG_ROM_ENABLE) == 0) {
+ mask |= PCI_MAPREG_ROM_ENABLE;
+ pci_conf_write(pa->pa_pc, pa->pa_tag, reg,
+ mask);
+ }
+ splx(s);
+ }
}
/* If we're called with maxsize/offset of 0, behave like