> After printing information via "doas pcidump -v" on device PCI
> 0:0:27:0 "Intel 82801GB HD Audio", kernel panics. Sorry, I used OCR
> software to recognize the text from the photo of the screen, maybe
> there are some errors in hex numbers. Photo is attached.

The following diff, while not fixing the cause of the problem, ought to
prevent the kernel from panicing.

Does audio (azalia0) work correctly on your system?

Miod

Index: amd64/pci/pci_machdep.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/amd64/pci/pci_machdep.c,v
retrieving revision 1.77
diff -u -p -r1.77 pci_machdep.c
--- amd64/pci/pci_machdep.c     11 Mar 2021 11:16:55 -0000      1.77
+++ amd64/pci/pci_machdep.c     4 Feb 2022 19:31:36 -0000
@@ -213,15 +213,14 @@ pci_conf_size(pci_chipset_tag_t pc, pcit
        return PCI_CONFIG_SPACE_SIZE;
 }
 
-void
+int
 pci_mcfg_map_bus(int bus)
 {
        if (pci_mcfgh[bus])
-               return;
+               return 0;
 
-       if (bus_space_map(pci_mcfgt, pci_mcfg_addr + (bus << 20), 1 << 20,
-           0, &pci_mcfgh[bus]))
-               panic("pci_conf_read: cannot map mcfg space");
+       return bus_space_map(pci_mcfgt, pci_mcfg_addr + (bus << 20), 1 << 20,
+           0, &pci_mcfgh[bus]);
 }
 
 pcireg_t
@@ -235,7 +234,8 @@ pci_conf_read(pci_chipset_tag_t pc, pcit
        if (pci_mcfg_addr && reg >= PCI_CONFIG_SPACE_SIZE) {
                pci_decompose_tag(pc, tag, &bus, NULL, NULL);
                if (bus >= pci_mcfg_min_bus && bus <= pci_mcfg_max_bus) {
-                       pci_mcfg_map_bus(bus);
+                       if (pci_mcfg_map_bus(bus) != 0)
+                               return 0xffffffff;
                        data = bus_space_read_4(pci_mcfgt, pci_mcfgh[bus],
                            (tag & 0x000ff00) << 4 | reg);
                        return data;
@@ -261,7 +261,8 @@ pci_conf_write(pci_chipset_tag_t pc, pci
        if (pci_mcfg_addr && reg >= PCI_CONFIG_SPACE_SIZE) {
                pci_decompose_tag(pc, tag, &bus, NULL, NULL);
                if (bus >= pci_mcfg_min_bus && bus <= pci_mcfg_max_bus) {
-                       pci_mcfg_map_bus(bus);
+                       if (pci_mcfg_map_bus(bus) != 0)
+                               return;
                        bus_space_write_4(pci_mcfgt, pci_mcfgh[bus],
                            (tag & 0x000ff00) << 4 | reg, data);
                        return;
Index: i386/pci/pci_machdep.c
===================================================================
RCS file: /OpenBSD/src/sys/arch/i386/pci/pci_machdep.c,v
retrieving revision 1.87
diff -u -p -r1.87 pci_machdep.c
--- i386/pci/pci_machdep.c      11 Mar 2021 11:16:57 -0000      1.87
+++ i386/pci/pci_machdep.c      4 Feb 2022 19:31:36 -0000
@@ -127,7 +127,7 @@ bus_addr_t pci_mcfg_addr;
 int pci_mcfg_min_bus, pci_mcfg_max_bus;
 bus_space_tag_t pci_mcfgt = I386_BUS_SPACE_MEM;
 bus_space_handle_t pci_mcfgh[256];
-void pci_mcfg_map_bus(int);
+int pci_mcfg_map_bus(int);
 
 struct mutex pci_conf_lock = MUTEX_INITIALIZER(IPL_HIGH);
 
@@ -420,15 +420,14 @@ pci_conf_size(pci_chipset_tag_t pc, pcit
        return PCI_CONFIG_SPACE_SIZE;
 }
 
-void
+int
 pci_mcfg_map_bus(int bus)
 {
        if (pci_mcfgh[bus])
-               return;
+               return 0;
 
-       if (bus_space_map(pci_mcfgt, pci_mcfg_addr + (bus << 20), 1 << 20,
-           0, &pci_mcfgh[bus]))
-               panic("pci_conf_read: cannot map mcfg space");
+       return bus_space_map(pci_mcfgt, pci_mcfg_addr + (bus << 20), 1 << 20,
+           0, &pci_mcfgh[bus]);
 }
 
 pcireg_t
@@ -442,7 +441,8 @@ pci_conf_read(pci_chipset_tag_t pc, pcit
        if (pci_mcfg_addr && reg >= PCI_CONFIG_SPACE_SIZE) {
                pci_decompose_tag(pc, tag, &bus, NULL, NULL);
                if (bus >= pci_mcfg_min_bus && bus <= pci_mcfg_max_bus) {
-                       pci_mcfg_map_bus(bus);
+                       if (pci_mcfg_map_bus(bus) != 0)
+                               return 0xffffffff;
                        data = bus_space_read_4(pci_mcfgt, pci_mcfgh[bus],
                            (tag.mode1 & 0x000ff00) << 4 | reg);
                        return data;
@@ -480,7 +480,8 @@ pci_conf_write(pci_chipset_tag_t pc, pci
        if (pci_mcfg_addr && reg >= PCI_CONFIG_SPACE_SIZE) {
                pci_decompose_tag(pc, tag, &bus, NULL, NULL);
                if (bus >= pci_mcfg_min_bus && bus <= pci_mcfg_max_bus) {
-                       pci_mcfg_map_bus(bus);
+                       if (pci_mcfg_map_bus(bus) != 0)
+                               return;
                        bus_space_write_4(pci_mcfgt, pci_mcfgh[bus],
                            (tag.mode1 & 0x000ff00) << 4 | reg, data);
                        return;

Reply via email to