Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci - Use BUS_ADDR_{LO, HI}32(), and rather than forc...



details:   https://anonhg.NetBSD.org/src/rev/ff6be69f19e1
branches:  trunk
changeset: 745674:ff6be69f19e1
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Mar 08 19:02:03 2020 +0000

description:
- Use BUS_ADDR_{LO,HI}32(), and rather than forcing the descriptor
  DMA addresses into a 64-bit value (and thus using 64-bit shifts
  when unnecessary), just reference the address from the DMA map
  directly.
- Add some missing byte-swaps.

diffstat:

 sys/dev/pci/if_txp.c    |  82 ++++++++++++++++++++++++++----------------------
 sys/dev/pci/if_txpreg.h |   4 +-
 2 files changed, 47 insertions(+), 39 deletions(-)

diffs (221 lines):

diff -r e5087e8bc28e -r ff6be69f19e1 sys/dev/pci/if_txp.c
--- a/sys/dev/pci/if_txp.c      Sun Mar 08 18:40:29 2020 +0000
+++ b/sys/dev/pci/if_txp.c      Sun Mar 08 19:02:03 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_txp.c,v 1.64 2020/02/29 21:31:55 thorpej Exp $ */
+/* $NetBSD: if_txp.c,v 1.65 2020/03/08 19:02:03 thorpej Exp $ */
 
 /*
  * Copyright (c) 2001
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.64 2020/02/29 21:31:55 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.65 2020/03/08 19:02:03 thorpej Exp $");
 
 #include "opt_inet.h"
 
@@ -589,8 +589,8 @@
        WRITE_REG(sc, TXP_H2A_1, le32toh(sect->nbytes));
        WRITE_REG(sc, TXP_H2A_2, le32toh(sect->cksum));
        WRITE_REG(sc, TXP_H2A_3, le32toh(sect->addr));
-       WRITE_REG(sc, TXP_H2A_4, dma.dma_paddr >> 32);
-       WRITE_REG(sc, TXP_H2A_5, dma.dma_paddr & 0xffffffff);
+       WRITE_REG(sc, TXP_H2A_4, BUS_ADDR_HI32(dma.dma_paddr));
+       WRITE_REG(sc, TXP_H2A_5, BUS_ADDR_LO32(dma.dma_paddr));
        WRITE_REG(sc, TXP_H2A_0, TXP_BOOTCMD_SEGMENT_AVAILABLE);
 
        if (txp_download_fw_wait(sc)) {
@@ -825,10 +825,10 @@
                /* stash away pointer */
                memcpy(__UNVOLATILE(&rbd->rb_vaddrlo), &sd, sizeof(sd));
 
-               rbd->rb_paddrlo = ((uint64_t)sd->sd_map->dm_segs[0].ds_addr)
-                   & 0xffffffff;
-               rbd->rb_paddrhi = ((uint64_t)sd->sd_map->dm_segs[0].ds_addr)
-                   >> 32;
+               rbd->rb_paddrlo =
+                   htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[0].ds_addr));
+               rbd->rb_paddrhi =
+                   htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[0].ds_addr));
 
                bus_dmamap_sync(sc->sc_dmat, sd->sd_map, 0,
                    sd->sd_map->dm_mapsize, BUS_DMASYNC_PREREAD);
@@ -955,8 +955,8 @@
                goto bail_boot;
        }
        memset(sc->sc_host_dma.dma_vaddr, 0, sizeof(struct txp_hostvar));
-       boot->br_hostvar_lo = htole32(sc->sc_host_dma.dma_paddr & 0xffffffff);
-       boot->br_hostvar_hi = htole32(sc->sc_host_dma.dma_paddr >> 32);
+       boot->br_hostvar_lo = htole32(BUS_ADDR_LO32(sc->sc_host_dma.dma_paddr));
+       boot->br_hostvar_hi = htole32(BUS_ADDR_HI32(sc->sc_host_dma.dma_paddr));
        sc->sc_hostvar = (struct txp_hostvar *)sc->sc_host_dma.dma_vaddr;
 
        /* high priority tx ring */
@@ -967,11 +967,14 @@
        }
        memset(sc->sc_txhiring_dma.dma_vaddr, 0,
            sizeof(struct txp_tx_desc) * TX_ENTRIES);
-       boot->br_txhipri_lo = htole32(sc->sc_txhiring_dma.dma_paddr & 0xffffffff);
-       boot->br_txhipri_hi = htole32(sc->sc_txhiring_dma.dma_paddr >> 32);
+       boot->br_txhipri_lo =
+           htole32(BUS_ADDR_LO32(sc->sc_txhiring_dma.dma_paddr));
+       boot->br_txhipri_hi =
+           htole32(BUS_ADDR_HI32(sc->sc_txhiring_dma.dma_paddr));
        boot->br_txhipri_siz = htole32(TX_ENTRIES * sizeof(struct txp_tx_desc));
        sc->sc_txhir.r_reg = TXP_H2A_1;
-       sc->sc_txhir.r_desc = (struct txp_tx_desc *)sc->sc_txhiring_dma.dma_vaddr;
+       sc->sc_txhir.r_desc =
+           (struct txp_tx_desc *)sc->sc_txhiring_dma.dma_vaddr;
        sc->sc_txhir.r_cons = sc->sc_txhir.r_prod = sc->sc_txhir.r_cnt = 0;
        sc->sc_txhir.r_off = &sc->sc_hostvar->hv_tx_hi_desc_read_idx;
        for (i = 0; i < TX_ENTRIES; i++) {
@@ -995,11 +998,14 @@
        }
        memset(sc->sc_txloring_dma.dma_vaddr, 0,
            sizeof(struct txp_tx_desc) * TX_ENTRIES);
-       boot->br_txlopri_lo = htole32(sc->sc_txloring_dma.dma_paddr & 0xffffffff);
-       boot->br_txlopri_hi = htole32(sc->sc_txloring_dma.dma_paddr >> 32);
+       boot->br_txlopri_lo =
+           htole32(BUS_ADDR_LO32(sc->sc_txloring_dma.dma_paddr));
+       boot->br_txlopri_hi =
+           htole32(BUS_ADDR_HI32(sc->sc_txloring_dma.dma_paddr));
        boot->br_txlopri_siz = htole32(TX_ENTRIES * sizeof(struct txp_tx_desc));
        sc->sc_txlor.r_reg = TXP_H2A_3;
-       sc->sc_txlor.r_desc = (struct txp_tx_desc *)sc->sc_txloring_dma.dma_vaddr;
+       sc->sc_txlor.r_desc =
+           (struct txp_tx_desc *)sc->sc_txloring_dma.dma_vaddr;
        sc->sc_txlor.r_cons = sc->sc_txlor.r_prod = sc->sc_txlor.r_cnt = 0;
        sc->sc_txlor.r_off = &sc->sc_hostvar->hv_tx_lo_desc_read_idx;
 
@@ -1011,8 +1017,10 @@
        }
        memset(sc->sc_rxhiring_dma.dma_vaddr, 0,
            sizeof(struct txp_rx_desc) * RX_ENTRIES);
-       boot->br_rxhipri_lo = htole32(sc->sc_rxhiring_dma.dma_paddr & 0xffffffff);
-       boot->br_rxhipri_hi = htole32(sc->sc_rxhiring_dma.dma_paddr >> 32);
+       boot->br_rxhipri_lo =
+           htole32(BUS_ADDR_LO32(sc->sc_rxhiring_dma.dma_paddr));
+       boot->br_rxhipri_hi =
+           htole32(BUS_ADDR_HI32(sc->sc_rxhiring_dma.dma_paddr));
        boot->br_rxhipri_siz = htole32(RX_ENTRIES * sizeof(struct txp_rx_desc));
        sc->sc_rxhir.r_desc =
            (struct txp_rx_desc *)sc->sc_rxhiring_dma.dma_vaddr;
@@ -1029,8 +1037,10 @@
        }
        memset(sc->sc_rxloring_dma.dma_vaddr, 0,
            sizeof(struct txp_rx_desc) * RX_ENTRIES);
-       boot->br_rxlopri_lo = htole32(sc->sc_rxloring_dma.dma_paddr & 0xffffffff);
-       boot->br_rxlopri_hi = htole32(sc->sc_rxloring_dma.dma_paddr >> 32);
+       boot->br_rxlopri_lo =
+           htole32(BUS_ADDR_LO32(sc->sc_rxloring_dma.dma_paddr));
+       boot->br_rxlopri_hi =
+           htole32(BUS_ADDR_HI32(sc->sc_rxloring_dma.dma_paddr));
        boot->br_rxlopri_siz = htole32(RX_ENTRIES * sizeof(struct txp_rx_desc));
        sc->sc_rxlor.r_desc =
            (struct txp_rx_desc *)sc->sc_rxloring_dma.dma_vaddr;
@@ -1047,8 +1057,8 @@
        }
        memset(sc->sc_cmdring_dma.dma_vaddr, 0,
            sizeof(struct txp_cmd_desc) * CMD_ENTRIES);
-       boot->br_cmd_lo = htole32(sc->sc_cmdring_dma.dma_paddr & 0xffffffff);
-       boot->br_cmd_hi = htole32(sc->sc_cmdring_dma.dma_paddr >> 32);
+       boot->br_cmd_lo = htole32(BUS_ADDR_LO32(sc->sc_cmdring_dma.dma_paddr));
+       boot->br_cmd_hi = htole32(BUS_ADDR_HI32(sc->sc_cmdring_dma.dma_paddr));
        boot->br_cmd_siz = htole32(CMD_ENTRIES * sizeof(struct txp_cmd_desc));
        sc->sc_cmdring.base = (struct txp_cmd_desc *)sc->sc_cmdring_dma.dma_vaddr;
        sc->sc_cmdring.size = CMD_ENTRIES * sizeof(struct txp_cmd_desc);
@@ -1062,8 +1072,8 @@
        }
        memset(sc->sc_rspring_dma.dma_vaddr, 0,
            sizeof(struct txp_rsp_desc) * RSP_ENTRIES);
-       boot->br_resp_lo = htole32(sc->sc_rspring_dma.dma_paddr & 0xffffffff);
-       boot->br_resp_hi = htole32(sc->sc_rspring_dma.dma_paddr >> 32);
+       boot->br_resp_lo = htole32(BUS_ADDR_LO32(sc->sc_rspring_dma.dma_paddr));
+       boot->br_resp_hi = htole32(BUS_ADDR_HI32(sc->sc_rspring_dma.dma_paddr));
        boot->br_resp_siz = htole32(CMD_ENTRIES * sizeof(struct txp_rsp_desc));
        sc->sc_rspring.base = (struct txp_rsp_desc *)sc->sc_rspring_dma.dma_vaddr;
        sc->sc_rspring.size = RSP_ENTRIES * sizeof(struct txp_rsp_desc);
@@ -1077,8 +1087,8 @@
        }
        memset(sc->sc_rxbufring_dma.dma_vaddr, 0,
            sizeof(struct txp_rxbuf_desc) * RXBUF_ENTRIES);
-       boot->br_rxbuf_lo = htole32(sc->sc_rxbufring_dma.dma_paddr & 0xffffffff);
-       boot->br_rxbuf_hi = htole32(sc->sc_rxbufring_dma.dma_paddr >> 32);
+       boot->br_rxbuf_lo = htole32(BUS_ADDR_LO32(sc->sc_rxbufring_dma.dma_paddr));
+       boot->br_rxbuf_hi = htole32(BUS_ADDR_HI32(sc->sc_rxbufring_dma.dma_paddr));
        boot->br_rxbuf_siz = htole32(RXBUF_ENTRIES * sizeof(struct txp_rxbuf_desc));
        sc->sc_rxbufs = (struct txp_rxbuf_desc *)sc->sc_rxbufring_dma.dma_vaddr;
        for (nb = 0; nb < RXBUF_ENTRIES; nb++) {
@@ -1112,9 +1122,9 @@
 
 
                sc->sc_rxbufs[nb].rb_paddrlo =
-                   ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) & 0xffffffff;
+                   htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[0].ds_addr));
                sc->sc_rxbufs[nb].rb_paddrhi =
-                   ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) >> 32;
+                   htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[0].ds_addr));
        }
        bus_dmamap_sync(sc->sc_dmat, sc->sc_rxbufring_dma.dma_map,
            0, sc->sc_rxbufring_dma.dma_map->dm_mapsize,
@@ -1129,8 +1139,8 @@
                goto bail_rxbufring;
        }
        memset(sc->sc_zero_dma.dma_vaddr, 0, sizeof(uint32_t));
-       boot->br_zero_lo = htole32(sc->sc_zero_dma.dma_paddr & 0xffffffff);
-       boot->br_zero_hi = htole32(sc->sc_zero_dma.dma_paddr >> 32);
+       boot->br_zero_lo = htole32(BUS_ADDR_LO32(sc->sc_zero_dma.dma_paddr));
+       boot->br_zero_hi = htole32(BUS_ADDR_HI32(sc->sc_zero_dma.dma_paddr));
 
        /* See if it's waiting for boot, and try to boot it */
        for (i = 0; i < 10000; i++) {
@@ -1143,8 +1153,8 @@
                printf(": not waiting for boot\n");
                goto bail;
        }
-       WRITE_REG(sc, TXP_H2A_2, sc->sc_boot_dma.dma_paddr >> 32);
-       WRITE_REG(sc, TXP_H2A_1, sc->sc_boot_dma.dma_paddr & 0xffffffff);
+       WRITE_REG(sc, TXP_H2A_2, BUS_ADDR_HI32(sc->sc_boot_dma.dma_paddr));
+       WRITE_REG(sc, TXP_H2A_1, BUS_ADDR_LO32(sc->sc_boot_dma.dma_paddr));
        WRITE_REG(sc, TXP_H2A_0, TXP_BOOTCMD_REGISTER_BOOT_RECORD);
 
        /* See if it booted */
@@ -1485,13 +1495,11 @@
                        fxd->frag_flags = FRAG_FLAGS_TYPE_FRAG |
                            FRAG_FLAGS_VALID;
                        fxd->frag_rsvd1 = 0;
-                       fxd->frag_len = sd->sd_map->dm_segs[i].ds_len;
+                       fxd->frag_len = htole16(sd->sd_map->dm_segs[i].ds_len);
                        fxd->frag_addrlo =
-                           ((uint64_t)sd->sd_map->dm_segs[i].ds_addr) &
-                           0xffffffff;
+                           htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[i].ds_addr));
                        fxd->frag_addrhi =
-                           ((uint64_t)sd->sd_map->dm_segs[i].ds_addr) >>
-                           32;
+                           htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[i].ds_addr));
                        fxd->frag_rsvd2 = 0;
 
                        bus_dmamap_sync(sc->sc_dmat,
diff -r e5087e8bc28e -r ff6be69f19e1 sys/dev/pci/if_txpreg.h
--- a/sys/dev/pci/if_txpreg.h   Sun Mar 08 18:40:29 2020 +0000
+++ b/sys/dev/pci/if_txpreg.h   Sun Mar 08 19:02:03 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_txpreg.h,v 1.6 2012/10/27 17:18:34 chs Exp $ */
+/* $NetBSD: if_txpreg.h,v 1.7 2020/03/08 19:02:03 thorpej Exp $ */
 
 /*
  * Copyright (c) 2001 Aaron Campbell <aaron%monkey.org@localhost>.
@@ -525,9 +525,9 @@
 #define        TXP_OFFSET2IDX(off)     ((off) >> 4)
 
 struct txp_dma_alloc {
-       u_int64_t               dma_paddr;
        void *                  dma_vaddr;
        bus_dmamap_t            dma_map;
+#define        dma_paddr               dma_map->dm_segs[0].ds_addr
        bus_dma_segment_t       dma_seg;
        int                     dma_nseg;
 };



Home | Main Index | Thread Index | Old Index