Module Name: src Committed By: msaitoh Date: Sat Jul 9 11:44:57 UTC 2022
Modified Files: src/sys/dev/ic: mfireg.h src/sys/dev/pci: mfii.c Log Message: Add preliminary support for Aero. - Aero supports 32bit descriptor. - Even if the Aero card supports 32bit descriptor, 64bit descriptor access is required for MFI_CMD_INIT. - Add quirk for Aero to retry register read. - The PCI ID table for Aero is disabled. Even if it's enabled, any logical volumes are not found. Perhaps the reason is that our mfii driver is currently not supports more than 64 logical volumes and MR_DCMD_LD_GET_LIST returns incorrect value. Tested by Mark Daies' H750. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/dev/ic/mfireg.h cvs rdiff -u -r1.22 -r1.23 src/sys/dev/pci/mfii.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/mfireg.h diff -u src/sys/dev/ic/mfireg.h:1.22 src/sys/dev/ic/mfireg.h:1.23 --- src/sys/dev/ic/mfireg.h:1.22 Wed Jun 29 13:03:20 2022 +++ src/sys/dev/ic/mfireg.h Sat Jul 9 11:44:57 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: mfireg.h,v 1.22 2022/06/29 13:03:20 msaitoh Exp $ */ +/* $NetBSD: mfireg.h,v 1.23 2022/07/09 11:44:57 msaitoh Exp $ */ /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */ /* * Copyright (c) 2006 Marco Peereboom <ma...@peereboom.us> @@ -82,6 +82,9 @@ #define MFI_ILQP 0xc0 /* inbound_low_queue_port */ #define MFI_IHQP 0xc4 /* inbound_high_queue_port */ +/* Aero specific Register */ +#define MFI_ISQP 0xc8 /* inbound_single_queue_port */ + /* OCR registers */ #define MFI_WSR 0x004 /* write sequence register */ #define MFI_HDR 0x008 /* host diagnostic register */ @@ -124,6 +127,9 @@ #define MFI_STATE_TB_OPERATIONAL 0x20000000 #define MFI_STATE_TB_FAULT 0x40000000 +/* Aero Support */ +#define MFI_STATE_ATOMIC_DESCRIPTOR 0x01000000 + /* command reset register */ #define MFI_INIT_ABORT 0x00000001 #define MFI_INIT_READY 0x00000002 Index: src/sys/dev/pci/mfii.c diff -u src/sys/dev/pci/mfii.c:1.22 src/sys/dev/pci/mfii.c:1.23 --- src/sys/dev/pci/mfii.c:1.22 Sat Jul 9 11:41:56 2022 +++ src/sys/dev/pci/mfii.c Sat Jul 9 11:44:57 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: mfii.c,v 1.22 2022/07/09 11:41:56 msaitoh Exp $ */ +/* $NetBSD: mfii.c,v 1.23 2022/07/09 11:44:57 msaitoh Exp $ */ /* $OpenBSD: mfii.c,v 1.58 2018/08/14 05:22:21 jmatthew Exp $ */ /* @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.22 2022/07/09 11:41:56 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mfii.c,v 1.23 2022/07/09 11:44:57 msaitoh Exp $"); #include "bio.h" @@ -279,6 +279,9 @@ struct mfii_iop { u_int8_t ldio_ctx_type_nseg; u_int8_t sge_flag_chain; u_int8_t sge_flag_eol; + u_int8_t iop_flag; +#define MFII_IOP_QUIRK_REGREAD 0x01 +#define MFII_IOP_HAS_32BITDESC_BIT 0x02 }; struct mfii_softc { @@ -287,6 +290,8 @@ struct mfii_softc { struct scsipi_adapter sc_adapt; const struct mfii_iop *sc_iop; + u_int sc_iop_flag; +#define MFII_IOP_DESC_32BIT 0x01 pci_chipset_tag_t sc_pc; pcitag_t sc_tag; @@ -422,6 +427,9 @@ static int mfii_initialise_firmware(str static int mfii_get_info(struct mfii_softc *); static void mfii_start(struct mfii_softc *, struct mfii_ccb *); +static void mfii_start64(struct mfii_softc *, struct mfii_ccb *); +static void mfii_start_common(struct mfii_softc *, + struct mfii_ccb *, bool); static void mfii_done(struct mfii_softc *, struct mfii_ccb *); static int mfii_poll(struct mfii_softc *, struct mfii_ccb *); static void mfii_poll_done(struct mfii_softc *, struct mfii_ccb *); @@ -554,6 +562,7 @@ static const struct mfii_iop mfii_iop_th MFII_REQ_TYPE_LDIO, 0, MFII_SGE_CHAIN_ELEMENT | MFII_SGE_ADDR_IOCPLBNTA, + 0, 0 }; @@ -567,7 +576,8 @@ static const struct mfii_iop mfii_iop_25 MFII_REQ_TYPE_NO_LOCK, MFII_RAID_CTX_TYPE_CUDA | 0x1, MFII_SGE_CHAIN_ELEMENT, - MFII_SGE_END_OF_LIST + MFII_SGE_END_OF_LIST, + 0 }; static const struct mfii_iop mfii_iop_35 = { @@ -577,9 +587,23 @@ static const struct mfii_iop mfii_iop_35 MFII_REQ_TYPE_NO_LOCK, MFII_RAID_CTX_TYPE_CUDA | 0x1, MFII_SGE_CHAIN_ELEMENT, - MFII_SGE_END_OF_LIST + MFII_SGE_END_OF_LIST, + 0 }; +#if 0 +static const struct mfii_iop mfii_iop_aero = { + MFII_BAR_35, + MFII_IOP_NUM_SGE_LOC_35, + MFII_RAID_CTX_ROUTING_FLAGS_CPU0, /* | MFII_RAID_CTX_ROUTING_FLAGS_SQN */ + MFII_REQ_TYPE_NO_LOCK, + MFII_RAID_CTX_TYPE_CUDA | 0x1, + MFII_SGE_CHAIN_ELEMENT, + MFII_SGE_END_OF_LIST, + MFII_IOP_QUIRK_REGREAD | MFII_IOP_HAS_32BITDESC_BIT +}; +#endif + struct mfii_device { pcireg_t mpd_vendor; pcireg_t mpd_product; @@ -621,7 +645,18 @@ static const struct mfii_device mfii_dev &mfii_iop_35 }, /* Harpoon */ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_3508, - &mfii_iop_35 } + &mfii_iop_35 }, +#if 0 + /* Aero */ + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_39XX_2, + &mfii_iop_aero }, + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_39XX_3, + &mfii_iop_aero }, + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_38XX_2, + &mfii_iop_aero }, + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_38XX_3, + &mfii_iop_aero } +#endif }; static const struct mfii_iop *mfii_find_iop(struct pci_attach_args *); @@ -747,6 +782,11 @@ mfii_attach(device_t parent, device_t se while ((sc->sc_max_sgl << 1) <= (nsge_in_io + nsge_in_chain)) sc->sc_max_sgl <<= 1; + /* Check for atomic(32bit) descriptor */ + if (((sc->sc_iop->iop_flag & MFII_IOP_HAS_32BITDESC_BIT) != 0) && + ((scpad2 & MFI_STATE_ATOMIC_DESCRIPTOR) != 0)) + sc->sc_iop_flag |= MFII_IOP_DESC_32BIT; + DNPRINTF(MFII_D_MISC, "%s: OSP 0x%08x, OSP2 0x%08x, OSP3 0x%08x\n", DEVNAME(sc), status, scpad2, scpad3); DNPRINTF(MFII_D_MISC, "%s: max_fw_cmds %d, max_cmds %d\n", @@ -1089,14 +1129,32 @@ fail: return rv; } -static u_int32_t -mfii_read(struct mfii_softc *sc, bus_size_t r) +/* Register read function without retry */ +static inline u_int32_t +mfii_read_wor(struct mfii_softc *sc, bus_size_t r) { bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4, BUS_SPACE_BARRIER_READ); return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, r)); } +static u_int32_t +mfii_read(struct mfii_softc *sc, bus_size_t r) +{ + uint32_t rv; + int i = 0; + + if ((sc->sc_iop->iop_flag & MFII_IOP_QUIRK_REGREAD) != 0) { + do { + rv = mfii_read_wor(sc, r); + i++; + } while ((rv == 0) && (i < 3)); + } else + rv = mfii_read_wor(sc, r); + + return rv; +} + static void mfii_write(struct mfii_softc *sc, bus_size_t r, u_int32_t v) { @@ -1626,7 +1684,12 @@ mfii_mfa_poll(struct mfii_softc *sc, str r = MFII_REQ_MFA(ccb->ccb_request_dva); memcpy(&ccb->ccb_req, &r, sizeof(ccb->ccb_req)); - mfii_start(sc, ccb); + /* + * Even if the Aero card supports 32bit descriptor, 64bit descriptor + * access is required for MFI_CMD_INIT. + * Currently, mfii_mfa_poll() is called for MFI_CMD_INIT only. + */ + mfii_start64(sc, ccb); for (;;) { bus_dmamap_sync(sc->sc_dmat, MFII_DMA_MAP(sc->sc_requests), @@ -1862,26 +1925,44 @@ mfii_load_mfa(struct mfii_softc *sc, str static void mfii_start(struct mfii_softc *sc, struct mfii_ccb *ccb) { + + mfii_start_common(sc, ccb, + ((sc->sc_iop_flag & MFII_IOP_DESC_32BIT) != 0) ? true : false); +} + +static void +mfii_start64(struct mfii_softc *sc, struct mfii_ccb *ccb) +{ + + mfii_start_common(sc, ccb, false); +} + +static void +mfii_start_common(struct mfii_softc *sc, struct mfii_ccb *ccb, bool do32) +{ uint32_t *r = (uint32_t *)&ccb->ccb_req; -#if defined(__LP64__) - uint64_t buf; -#endif bus_dmamap_sync(sc->sc_dmat, MFII_DMA_MAP(sc->sc_requests), ccb->ccb_request_offset, MFII_REQUEST_SIZE, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + if (do32) + bus_space_write_4(sc->sc_iot, sc->sc_ioh, MFI_ISQP, r[0]); + else { #if defined(__LP64__) - buf = ((uint64_t)r[1] << 32) | r[0]; - bus_space_write_8(sc->sc_iot, sc->sc_ioh, MFI_IQPL, buf); + uint64_t buf; + + buf = ((uint64_t)r[1] << 32) | r[0]; + bus_space_write_8(sc->sc_iot, sc->sc_ioh, MFI_IQPL, buf); #else - mutex_enter(&sc->sc_post_mtx); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, MFI_IQPL, r[0]); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, MFI_IQPH, r[1]); - bus_space_barrier(sc->sc_iot, sc->sc_ioh, - MFI_IQPL, 8, BUS_SPACE_BARRIER_WRITE); - mutex_exit(&sc->sc_post_mtx); + mutex_enter(&sc->sc_post_mtx); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, MFI_IQPL, r[0]); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, MFI_IQPH, r[1]); + bus_space_barrier(sc->sc_iot, sc->sc_ioh, + MFI_IQPL, 8, BUS_SPACE_BARRIER_WRITE); + mutex_exit(&sc->sc_post_mtx); #endif + } } static void