Page MenuHomeFreeBSD

D19833.id56019.diff
No OneTemporary

D19833.id56019.diff

Index: head/sys/amd64/pci/pci_cfgreg.c
===================================================================
--- head/sys/amd64/pci/pci_cfgreg.c
+++ head/sys/amd64/pci/pci_cfgreg.c
@@ -44,12 +44,6 @@
#include <vm/pmap.h>
#include <machine/pci_cfgreg.h>
-enum {
- CFGMECH_NONE = 0,
- CFGMECH_1,
- CFGMECH_PCIE,
-};
-
static uint32_t pci_docfgregread(int bus, int slot, int func, int reg,
int bytes);
static int pciereg_cfgread(int bus, unsigned slot, unsigned func,
@@ -61,7 +55,13 @@
SYSCTL_DECL(_hw_pci);
-static int cfgmech;
+/*
+ * For amd64 we assume that type 1 I/O port-based access always works.
+ * If an ACPI MCFG table exists, pcie_cfgregopen() will be called to
+ * switch to memory-mapped access.
+ */
+int cfgmech = CFGMECH_1;
+
static vm_offset_t pcie_base;
static int pcie_minbus, pcie_maxbus;
static uint32_t pcie_badslots;
@@ -71,47 +71,10 @@
SYSCTL_INT(_hw_pci, OID_AUTO, mcfg, CTLFLAG_RDTUN, &mcfg_enable, 0,
"Enable support for PCI-e memory mapped config access");
-/*
- * Initialise access to PCI configuration space
- */
int
pci_cfgregopen(void)
{
- uint64_t pciebar;
- uint16_t did, vid;
- if (cfgmech != CFGMECH_NONE)
- return (1);
- cfgmech = CFGMECH_1;
-
- /*
- * Grope around in the PCI config space to see if this is a
- * chipset that is capable of doing memory-mapped config cycles.
- * This also implies that it can do PCIe extended config cycles.
- */
-
- /* Check for supported chipsets */
- vid = pci_cfgregread(0, 0, 0, PCIR_VENDOR, 2);
- did = pci_cfgregread(0, 0, 0, PCIR_DEVICE, 2);
- switch (vid) {
- case 0x8086:
- switch (did) {
- case 0x3590:
- case 0x3592:
- /* Intel 7520 or 7320 */
- pciebar = pci_cfgregread(0, 0, 0, 0xce, 2) << 16;
- pcie_cfgregopen(pciebar, 0, 255);
- break;
- case 0x2580:
- case 0x2584:
- case 0x2590:
- /* Intel 915, 925, or 915GM */
- pciebar = pci_cfgregread(0, 0, 0, 0x48, 4);
- pcie_cfgregopen(pciebar, 0, 255);
- break;
- }
- }
-
return (1);
}
@@ -135,9 +98,6 @@
{
uint32_t line;
- if (cfgmech == CFGMECH_NONE)
- return (0xffffffff);
-
/*
* Some BIOS writers seem to want to ignore the spec and put
* 0 in the intline rather than 255 to indicate none. Some use
@@ -161,9 +121,6 @@
void
pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes)
{
-
- if (cfgmech == CFGMECH_NONE)
- return;
if (cfgmech == CFGMECH_PCIE &&
(bus >= pcie_minbus && bus <= pcie_maxbus) &&
Index: head/sys/i386/pci/pci_cfgreg.c
===================================================================
--- head/sys/i386/pci/pci_cfgreg.c
+++ head/sys/i386/pci/pci_cfgreg.c
@@ -64,20 +64,13 @@
vm_paddr_t papage;
};
-enum {
- CFGMECH_NONE = 0,
- CFGMECH_1,
- CFGMECH_2,
- CFGMECH_PCIE,
-};
-
SYSCTL_DECL(_hw_pci);
static TAILQ_HEAD(pcie_cfg_list, pcie_cfg_elem) pcie_list[MAXCPU];
static uint64_t pcie_base;
static int pcie_minbus, pcie_maxbus;
static uint32_t pcie_badslots;
-static int cfgmech;
+int cfgmech;
static int devmax;
static struct mtx pcicfg_mtx;
static int mcfg_enable = 1;
@@ -136,10 +129,8 @@
int
pci_cfgregopen(void)
{
- static int opened = 0;
- uint64_t pciebar;
- u_int16_t vid, did;
- u_int16_t v;
+ uint16_t v;
+ static int opened = 0;
if (opened)
return (1);
@@ -158,38 +149,7 @@
if (v >= 0x0210)
pci_pir_open();
- if (cfgmech == CFGMECH_PCIE)
- return (1);
-
- /*
- * Grope around in the PCI config space to see if this is a
- * chipset that is capable of doing memory-mapped config cycles.
- * This also implies that it can do PCIe extended config cycles.
- */
-
- /* Check for supported chipsets */
- vid = pci_cfgregread(0, 0, 0, PCIR_VENDOR, 2);
- did = pci_cfgregread(0, 0, 0, PCIR_DEVICE, 2);
- switch (vid) {
- case 0x8086:
- switch (did) {
- case 0x3590:
- case 0x3592:
- /* Intel 7520 or 7320 */
- pciebar = pci_cfgregread(0, 0, 0, 0xce, 2) << 16;
- pcie_cfgregopen(pciebar, 0, 255);
- break;
- case 0x2580:
- case 0x2584:
- case 0x2590:
- /* Intel 915, 925, or 915GM */
- pciebar = pci_cfgregread(0, 0, 0, 0x48, 4);
- pcie_cfgregopen(pciebar, 0, 255);
- break;
- }
- }
-
- return(1);
+ return (1);
}
static uint32_t
Index: head/sys/x86/include/pci_cfgreg.h
===================================================================
--- head/sys/x86/include/pci_cfgreg.h
+++ head/sys/x86/include/pci_cfgreg.h
@@ -48,6 +48,15 @@
#define CONF2_ENABLE_CHK 0x0e
#define CONF2_ENABLE_RES 0x0e
+enum {
+ CFGMECH_NONE = 0,
+ CFGMECH_1,
+ CFGMECH_2,
+ CFGMECH_PCIE,
+};
+
+extern int cfgmech;
+
rman_res_t hostb_alloc_start(int type, rman_res_t start, rman_res_t end, rman_res_t count);
int pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus);
int pci_cfgregopen(void);
Index: head/sys/x86/x86/legacy.c
===================================================================
--- head/sys/x86/x86/legacy.c
+++ head/sys/x86/x86/legacy.c
@@ -46,8 +46,10 @@
#include <sys/pcpu.h>
#include <sys/rman.h>
#include <sys/smp.h>
+#include <dev/pci/pcireg.h>
#include <machine/clock.h>
+#include <machine/pci_cfgreg.h>
#include <machine/resource.h>
#include <x86/legacyvar.h>
@@ -111,10 +113,52 @@
return (0);
}
+/*
+ * Grope around in the PCI config space to see if this is a chipset
+ * that is capable of doing memory-mapped config cycles. This also
+ * implies that it can do PCIe extended config cycles.
+ */
+static void
+legacy_pci_cfgregopen(device_t dev)
+{
+ uint64_t pciebar;
+ u_int16_t did, vid;
+
+ if (cfgmech == CFGMECH_NONE || cfgmech == CFGMECH_PCIE)
+ return;
+
+ /* Check for supported chipsets */
+ vid = pci_cfgregread(0, 0, 0, PCIR_VENDOR, 2);
+ did = pci_cfgregread(0, 0, 0, PCIR_DEVICE, 2);
+ switch (vid) {
+ case 0x8086:
+ switch (did) {
+ case 0x3590:
+ case 0x3592:
+ /* Intel 7520 or 7320 */
+ pciebar = pci_cfgregread(0, 0, 0, 0xce, 2) << 16;
+ pcie_cfgregopen(pciebar, 0, 255);
+ break;
+ case 0x2580:
+ case 0x2584:
+ case 0x2590:
+ /* Intel 915, 925, or 915GM */
+ pciebar = pci_cfgregread(0, 0, 0, 0x48, 4);
+ pcie_cfgregopen(pciebar, 0, 255);
+ break;
+ }
+ }
+
+ if (bootverbose && cfgmech == CFGMECH_PCIE)
+ device_printf(dev, "Enabled ECAM PCIe accesses\n");
+}
+
static int
legacy_attach(device_t dev)
{
device_t child;
+
+ legacy_pci_cfgregopen(dev);
/*
* Let our child drivers identify any child devices that they

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 27, 11:26 PM (58 m, 36 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26266126
Default Alt Text
D19833.id56019.diff (6 KB)

Event Timeline