Hector Martin has added support for the BCM4388 that is found on the
last generation of Apple Macs.  Based on his commits I've managed to
get it working on my M2 Pro mini.  I still have to clean up some of
that stuff, but here is a forst batch of two diffs.

The changes to dev/ic/bwfm.c correspond to:

https://github.com/AsahiLinux/linux/commit/81e3cc7bec8b9d9c436f63662d8fcfda4f637807

The changes to dev/pci/if_bwfm_pci.c corrspond to:

https://github.com/AsahiLinux/linux/commit/8190add8671fc49c12d04b5ac8fced70f835e69f

Both changes seem to be a good idea and potentially affect other chips
as well.  So if you have a machine with bwfm(4), please test.

ok?


Index: dev/ic/bwfm.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/bwfm.c,v
retrieving revision 1.109
diff -u -p -r1.109 bwfm.c
--- dev/ic/bwfm.c       28 Mar 2023 14:01:42 -0000      1.109
+++ dev/ic/bwfm.c       8 Oct 2023 17:29:35 -0000
@@ -1089,15 +1089,9 @@ void
 bwfm_chip_ai_reset(struct bwfm_softc *sc, struct bwfm_core *core,
     uint32_t prereset, uint32_t reset, uint32_t postreset)
 {
-       struct bwfm_core *core2 = NULL;
        int i;
 
-       if (core->co_id == BWFM_AGENT_CORE_80211)
-               core2 = bwfm_chip_get_core_idx(sc, BWFM_AGENT_CORE_80211, 1);
-
        bwfm_chip_ai_disable(sc, core, prereset, reset);
-       if (core2)
-               bwfm_chip_ai_disable(sc, core2, prereset, reset);
 
        for (i = 50; i > 0; i--) {
                if ((sc->sc_buscore_ops->bc_read(sc,
@@ -1110,32 +1104,12 @@ bwfm_chip_ai_reset(struct bwfm_softc *sc
        }
        if (i == 0)
                printf("%s: timeout on core reset\n", DEVNAME(sc));
-       if (core2) {
-               for (i = 50; i > 0; i--) {
-                       if ((sc->sc_buscore_ops->bc_read(sc,
-                           core2->co_wrapbase + BWFM_AGENT_RESET_CTL) &
-                           BWFM_AGENT_RESET_CTL_RESET) == 0)
-                               break;
-                       sc->sc_buscore_ops->bc_write(sc,
-                           core2->co_wrapbase + BWFM_AGENT_RESET_CTL, 0);
-                       delay(60);
-               }
-               if (i == 0)
-                       printf("%s: timeout on core reset\n", DEVNAME(sc));
-       }
 
        sc->sc_buscore_ops->bc_write(sc,
            core->co_wrapbase + BWFM_AGENT_IOCTL,
            postreset | BWFM_AGENT_IOCTL_CLK);
        sc->sc_buscore_ops->bc_read(sc,
            core->co_wrapbase + BWFM_AGENT_IOCTL);
-       if (core2) {
-               sc->sc_buscore_ops->bc_write(sc,
-                   core2->co_wrapbase + BWFM_AGENT_IOCTL,
-                   postreset | BWFM_AGENT_IOCTL_CLK);
-               sc->sc_buscore_ops->bc_read(sc,
-                   core2->co_wrapbase + BWFM_AGENT_IOCTL);
-       }
 }
 
 void
@@ -1338,6 +1312,7 @@ bwfm_chip_ca7_set_passive(struct bwfm_so
 {
        struct bwfm_core *core;
        uint32_t val;
+       int i = 0;
 
        core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7);
        val = sc->sc_buscore_ops->bc_read(sc,
@@ -1347,10 +1322,11 @@ bwfm_chip_ca7_set_passive(struct bwfm_so
            BWFM_AGENT_IOCTL_ARMCR4_CPUHALT,
            BWFM_AGENT_IOCTL_ARMCR4_CPUHALT);
 
-       core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_80211);
-       sc->sc_chip.ch_core_reset(sc, core, BWFM_AGENT_D11_IOCTL_PHYRESET |
-           BWFM_AGENT_D11_IOCTL_PHYCLOCKEN, BWFM_AGENT_D11_IOCTL_PHYCLOCKEN,
-           BWFM_AGENT_D11_IOCTL_PHYCLOCKEN);
+       while ((core = bwfm_chip_get_core_idx(sc, BWFM_AGENT_CORE_80211, i++)))
+               sc->sc_chip.ch_core_disable(sc, core,
+                   BWFM_AGENT_D11_IOCTL_PHYRESET |
+                   BWFM_AGENT_D11_IOCTL_PHYCLOCKEN,
+                   BWFM_AGENT_D11_IOCTL_PHYCLOCKEN);
 }
 
 int
Index: dev/pci/if_bwfm_pci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bwfm_pci.c,v
retrieving revision 1.75
diff -u -p -r1.75 if_bwfm_pci.c
--- dev/pci/if_bwfm_pci.c       30 Dec 2022 14:10:17 -0000      1.75
+++ dev/pci/if_bwfm_pci.c       8 Oct 2023 17:29:35 -0000
@@ -134,6 +134,10 @@ struct bwfm_pci_softc {
        bus_space_handle_t       sc_reg_ioh;
        bus_size_t               sc_reg_ios;
 
+       bus_space_tag_t          sc_pcie_iot;
+       bus_space_handle_t       sc_pcie_ioh;
+       bus_size_t               sc_pcie_ios;
+
        bus_space_tag_t          sc_tcm_iot;
        bus_space_handle_t       sc_tcm_ioh;
        bus_size_t               sc_tcm_ios;
@@ -379,6 +383,10 @@ bwfm_pci_attach(struct device *parent, s
                goto bar1;
        }
 
+       sc->sc_pcie_iot = sc->sc_reg_iot;
+       bus_space_subregion(sc->sc_reg_iot, sc->sc_reg_ioh, 0x2000,
+           sc->sc_reg_ios - 0x2000, &sc->sc_pcie_ioh);
+
        sc->sc_pc = pa->pa_pc;
        sc->sc_tag = pa->pa_tag;
        sc->sc_id = pa->pa_id;
@@ -458,11 +466,11 @@ bwfm_pci_preinit(struct bwfm_softc *bwfm
 #endif
 
        bwfm_pci_select_core(sc, BWFM_AGENT_CORE_PCIE2);
-       bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+       bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
            BWFM_PCI_PCIE2REG_CONFIGADDR, 0x4e0);
-       reg = bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+       reg = bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
            BWFM_PCI_PCIE2REG_CONFIGDATA);
-       bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+       bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
            BWFM_PCI_PCIE2REG_CONFIGDATA, reg);
 
        switch (bwfm->sc_chip.ch_chip) {
@@ -1438,10 +1446,10 @@ bwfm_pci_ring_bell(struct bwfm_pci_softc
     struct bwfm_pci_msgring *ring)
 {
        if (sc->sc_shared_flags & BWFM_SHARED_INFO_SHARED_DAR)
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_H2D_MAILBOX_0, 1);
        else
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_H2D_MAILBOX_0, 1);
 }
 
@@ -1889,13 +1897,13 @@ bwfm_pci_buscore_reset(struct bwfm_softc
                };
 
                for (i = 0; i < nitems(cfg_offset); i++) {
-                       bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+                       bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                            BWFM_PCI_PCIE2REG_CONFIGADDR, cfg_offset[i]);
-                       reg = bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+                       reg = bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                            BWFM_PCI_PCIE2REG_CONFIGDATA);
                        DPRINTFN(3, ("%s: config offset 0x%04x, value 0x%04x\n",
                            DEVNAME(sc), cfg_offset[i], reg));
-                       bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+                       bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                            BWFM_PCI_PCIE2REG_CONFIGDATA, reg);
                }
        }
@@ -2389,11 +2397,11 @@ void
 bwfm_pci_intr_enable(struct bwfm_pci_softc *sc)
 {
        if (sc->sc_pcireg64)
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_MAILBOXMASK,
                    BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H_DB);
        else
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_MAILBOXMASK,
                    BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_0 |
                    BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_1 |
@@ -2404,10 +2412,10 @@ void
 bwfm_pci_intr_disable(struct bwfm_pci_softc *sc)
 {
        if (sc->sc_pcireg64)
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_MAILBOXMASK, 0);
        else
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_MAILBOXMASK, 0);
 }
 
@@ -2415,10 +2423,10 @@ uint32_t
 bwfm_pci_intr_status(struct bwfm_pci_softc *sc)
 {
        if (sc->sc_pcireg64)
-               return bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               return bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_MAILBOXINT);
        else
-               return bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               return bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_MAILBOXINT);
 }
 
@@ -2426,10 +2434,10 @@ void
 bwfm_pci_intr_ack(struct bwfm_pci_softc *sc, uint32_t status)
 {
        if (sc->sc_pcireg64)
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_MAILBOXINT, status);
        else
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_MAILBOXINT, status);
 }
 
@@ -2437,10 +2445,10 @@ uint32_t
 bwfm_pci_intmask(struct bwfm_pci_softc *sc)
 {
        if (sc->sc_pcireg64)
-               return bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               return bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_INTMASK);
        else
-               return bus_space_read_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               return bus_space_read_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_INTMASK);
 }
 
@@ -2451,10 +2459,10 @@ bwfm_pci_hostready(struct bwfm_pci_softc
                return;
 
        if (sc->sc_shared_flags & BWFM_SHARED_INFO_SHARED_DAR)
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_64_PCIE2REG_H2D_MAILBOX_1, 1);
        else
-               bus_space_write_4(sc->sc_reg_iot, sc->sc_reg_ioh,
+               bus_space_write_4(sc->sc_pcie_iot, sc->sc_pcie_ioh,
                    BWFM_PCI_PCIE2REG_H2D_MAILBOX_1, 1);
 }
 

Reply via email to