[Midnightbsd-cvs] src [8367] trunk/sys: pciereg_cfg* use assembly to access the mem-mapped cfg space
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun Sep 18 15:00:30 EDT 2016
Revision: 8367
http://svnweb.midnightbsd.org/src/?rev=8367
Author: laffer1
Date: 2016-09-18 15:00:30 -0400 (Sun, 18 Sep 2016)
Log Message:
-----------
pciereg_cfg* use assembly to access the mem-mapped cfg space
Modified Paths:
--------------
trunk/sys/amd64/pci/pci_cfgreg.c
trunk/sys/i386/pci/pci_cfgreg.c
Modified: trunk/sys/amd64/pci/pci_cfgreg.c
===================================================================
--- trunk/sys/amd64/pci/pci_cfgreg.c 2016-09-18 18:59:03 UTC (rev 8366)
+++ trunk/sys/amd64/pci/pci_cfgreg.c 2016-09-18 19:00:30 UTC (rev 8367)
@@ -295,6 +295,13 @@
return (1);
}
+/*
+ * AMD BIOS And Kernel Developer's Guides for CPU families starting with 10h
+ * have a requirement that all accesses to the memory mapped PCI configuration
+ * space are done using AX class of registers.
+ * Since other vendors do not currently have any contradicting requirements
+ * the AMD access pattern is applied universally.
+ */
#define PCIE_VADDR(base, reg, bus, slot, func) \
((base) + \
((((bus) & 0xff) << 20) | \
@@ -317,13 +324,16 @@
switch (bytes) {
case 4:
- data = *(volatile uint32_t *)(va);
+ __asm __volatile("mov %1, %%eax" : "=a" (data)
+ : "m" (*(uint32_t *)va));
break;
case 2:
- data = *(volatile uint16_t *)(va);
+ __asm __volatile("movzwl %1, %%eax" : "=a" (data)
+ : "m" (*(uint16_t *)va));
break;
case 1:
- data = *(volatile uint8_t *)(va);
+ __asm __volatile("movzbl %1, %%eax" : "=a" (data)
+ : "m" (*(uint8_t *)va));
break;
}
@@ -344,13 +354,16 @@
switch (bytes) {
case 4:
- *(volatile uint32_t *)(va) = data;
+ __asm __volatile("mov %%eax, %0" : "=m" (*(uint32_t *)va)
+ : "a" (data));
break;
case 2:
- *(volatile uint16_t *)(va) = data;
+ __asm __volatile("mov %%ax, %0" : "=m" (*(uint16_t *)va)
+ : "a" (data));
break;
case 1:
- *(volatile uint8_t *)(va) = data;
+ __asm __volatile("mov %%al, %0" : "=m" (*(uint8_t *)va)
+ : "a" (data));
break;
}
}
Modified: trunk/sys/i386/pci/pci_cfgreg.c
===================================================================
--- trunk/sys/i386/pci/pci_cfgreg.c 2016-09-18 18:59:03 UTC (rev 8366)
+++ trunk/sys/i386/pci/pci_cfgreg.c 2016-09-18 19:00:30 UTC (rev 8367)
@@ -652,6 +652,14 @@
return (elem);
}
+/*
+ * AMD BIOS And Kernel Developer's Guides for CPU families starting with 10h
+ * have a requirement that all accesses to the memory mapped PCI configuration
+ * space are done using AX class of registers.
+ * Since other vendors do not currently have any contradicting requirements
+ * the AMD access pattern is applied universally.
+ */
+
static int
pciereg_cfgread(int bus, unsigned slot, unsigned func, unsigned reg,
unsigned bytes)
@@ -673,13 +681,16 @@
switch (bytes) {
case 4:
- data = *(volatile uint32_t *)(va);
+ __asm __volatile("mov %1, %%eax" : "=a" (data)
+ : "m" (*(uint32_t *)va));
break;
case 2:
- data = *(volatile uint16_t *)(va);
+ __asm __volatile("movzwl %1, %%eax" : "=a" (data)
+ : "m" (*(uint16_t *)va));
break;
case 1:
- data = *(volatile uint8_t *)(va);
+ __asm __volatile("movzbl %1, %%eax" : "=a" (data)
+ : "m" (*(uint8_t *)va));
break;
}
@@ -707,13 +718,16 @@
switch (bytes) {
case 4:
- *(volatile uint32_t *)(va) = data;
+ __asm __volatile("mov %%eax, %0" : "=m" (*(uint32_t *)va)
+ : "a" (data));
break;
case 2:
- *(volatile uint16_t *)(va) = data;
+ __asm __volatile("mov %%ax, %0" : "=m" (*(uint16_t *)va)
+ : "a" (data));
break;
case 1:
- *(volatile uint8_t *)(va) = data;
+ __asm __volatile("mov %%al, %0" : "=m" (*(uint8_t *)va)
+ : "a" (data));
break;
}
More information about the Midnightbsd-cvs
mailing list