Source-Changes-HG archive

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

[src/trunk]: src/sys Merge jmcneill-audiomp3 branch, which is derived from ad...



details:   https://anonhg.NetBSD.org/src/rev/bd153de94c11
branches:  trunk
changeset: 771504:bd153de94c11
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Wed Nov 23 23:07:28 2011 +0000

description:
Merge jmcneill-audiomp3 branch, which is derived from ad-audiomp2. From
the original ad-audiomp branch notes:

  Add MP locking to the audio drivers.

  Making the audio drivers MP safe is necessary before efforts
  can be made to make the VM system MP safe.

  The are two locks per device instance, an ISR lock and
  a character device lock. The ISR lock replaces calls to
  splaudio()/splx(), and will be held across calls to device
  methods which were called at splaudio() before (e.g.
  trigger_output). The character device lock is held across
  calls to nearly all of the methods, excluding some only
  used for initialization, e.g. get_locks.

Welcome to 5.99.57.

diffstat:

 sys/arch/amiga/dev/aucc.c            |    30 +-
 sys/arch/amiga/dev/melody.c          |     8 +-
 sys/arch/amiga/dev/repulse.c         |    27 +-
 sys/arch/amiga/dev/toccata.c         |    33 +-
 sys/arch/amigappc/amigappc/machdep.c |     6 +-
 sys/arch/arm/iomd/vidcaudio.c        |    46 +-
 sys/arch/arm/xscale/pxa2x0_ac97.c    |    84 +-
 sys/arch/arm/xscale/pxa2x0_dmac.c    |    11 +-
 sys/arch/arm/xscale/pxa2x0_dmac.h    |     4 +-
 sys/arch/arm/xscale/pxa2x0_i2s.c     |    50 +-
 sys/arch/arm/xscale/pxa2x0_i2s.h     |     7 +-
 sys/arch/arm/xscale/pxa2x0_mci.c     |     8 +-
 sys/arch/dreamcast/dev/g2/aica.c     |    27 +-
 sys/arch/hp700/gsc/harmony.c         |    70 +-
 sys/arch/hp700/gsc/harmonyvar.h      |     4 +-
 sys/arch/hpcmips/dev/ucbsnd.c        |    14 +-
 sys/arch/hpcmips/vr/vraiu.c          |    42 +-
 sys/arch/i386/pnpbios/joy_pnpbios.c  |    17 +-
 sys/arch/macppc/dev/awacs.c          |    53 +-
 sys/arch/macppc/dev/snapper.c        |    45 +-
 sys/arch/prep/isa/paud_isa.c         |    26 +-
 sys/arch/sgimips/hpc/haltwo.c        |    62 +-
 sys/arch/sgimips/hpc/haltwovar.h     |     4 +-
 sys/arch/sgimips/mace/mavb.c         |    49 +-
 sys/arch/shark/ofw/ofw.c             |     8 +-
 sys/arch/sparc/dev/audioamd.c        |    24 +-
 sys/arch/x68k/dev/vs.c               |    58 +-
 sys/arch/x68k/dev/vsvar.h            |     4 +-
 sys/arch/zaurus/dev/zaudio.c         |    37 +-
 sys/dev/TODO.audiomp                 |    58 +
 sys/dev/acpi/joy_acpi.c              |     8 +-
 sys/dev/acpi/mpu_acpi.c              |     6 +-
 sys/dev/auconv.c                     |    24 +-
 sys/dev/auconv.h                     |     4 +-
 sys/dev/audio.c                      |  1132 ++++++++++++++++++++-------------
 sys/dev/audio_if.h                   |    16 +-
 sys/dev/audiovar.h                   |    27 +-
 sys/dev/aurateconv.c                 |    12 +-
 sys/dev/bluetooth/btsco.c            |    60 +-
 sys/dev/ebus/cs4231_ebus.c           |    22 +-
 sys/dev/ic/ac97.c                    |    87 ++-
 sys/dev/ic/ac97var.h                 |     6 +-
 sys/dev/ic/ad1848.c                  |    43 +-
 sys/dev/ic/ad1848var.h               |     9 +-
 sys/dev/ic/am7930.c                  |    12 +-
 sys/dev/ic/am7930var.h               |     5 +-
 sys/dev/ic/attimer.c                 |    13 +-
 sys/dev/ic/cs4231.c                  |    18 +-
 sys/dev/ic/cs4231var.h               |     6 +-
 sys/dev/ic/interwave.c               |    50 +-
 sys/dev/ic/interwavevar.h            |    11 +-
 sys/dev/ic/joy.c                     |    97 ++-
 sys/dev/ic/joyvar.h                  |     3 +-
 sys/dev/ic/mpu.c                     |    47 +-
 sys/dev/ic/mpuvar.h                  |     3 +-
 sys/dev/ic/msm6258.c                 |    30 +-
 sys/dev/ic/opl.c                     |    54 +-
 sys/dev/ic/oplvar.h                  |     5 +-
 sys/dev/ic/tms320av110.c             |    39 +-
 sys/dev/ic/tms320av110var.h          |     5 +-
 sys/dev/isa/ad1848_isa.c             |    37 +-
 sys/dev/isa/ad1848var.h              |     6 +-
 sys/dev/isa/aria.c                   |    38 +-
 sys/dev/isa/cms.c                    |     5 +-
 sys/dev/isa/ess.c                    |   130 ++-
 sys/dev/isa/essvar.h                 |    10 +-
 sys/dev/isa/gus.c                    |   198 +++--
 sys/dev/isa/ics2101.c                |     9 +-
 sys/dev/isa/joy_ess.c                |     5 +-
 sys/dev/isa/joy_isa.c                |    15 +-
 sys/dev/isa/midi_pcppi.c             |    45 +-
 sys/dev/isa/mpu_isa.c                |    13 +-
 sys/dev/isa/mpu_sb.c                 |     9 +-
 sys/dev/isa/mpu_ym.c                 |     8 +-
 sys/dev/isa/opl_ess.c                |     7 +-
 sys/dev/isa/opl_isa.c                |    18 +-
 sys/dev/isa/opl_sb.c                 |     9 +-
 sys/dev/isa/pas.c                    |    11 +-
 sys/dev/isa/pcppi.c                  |    86 +-
 sys/dev/isa/pcppivar.h               |    10 +-
 sys/dev/isa/sb.c                     |     7 +-
 sys/dev/isa/sb_isa.c                 |     9 +-
 sys/dev/isa/sbdsp.c                  |   196 ++++-
 sys/dev/isa/sbdspvar.h               |    10 +-
 sys/dev/isa/wss.c                    |    38 +-
 sys/dev/isa/ym.c                     |   112 +-
 sys/dev/isa/ymvar.h                  |     7 +-
 sys/dev/isapnp/gus_isapnp.c          |    19 +-
 sys/dev/isapnp/joy_isapnp.c          |    17 +-
 sys/dev/isapnp/mpu_isapnp.c          |    16 +-
 sys/dev/midi.c                       |   961 +++++++++++++--------------
 sys/dev/midi_if.h                    |     5 +-
 sys/dev/midictl.c                    |   418 +++++------
 sys/dev/midictl.h                    |     9 +-
 sys/dev/midisyn.c                    |   148 +++-
 sys/dev/midisynvar.h                 |     3 +-
 sys/dev/midivar.h                    |    44 +-
 sys/dev/mulaw.c                      |    25 +-
 sys/dev/ofisa/joy_ofisa.c            |    19 +-
 sys/dev/pad/pad.c                    |   126 ++-
 sys/dev/pad/padvar.h                 |     7 +-
 sys/dev/pad/padvol.c                 |    11 +-
 sys/dev/pad/padvol.h                 |    13 +-
 sys/dev/pci/auacer.c                 |    84 +-
 sys/dev/pci/auich.c                  |   106 ++-
 sys/dev/pci/auixp.c                  |   111 ++-
 sys/dev/pci/auixpvar.h               |     4 +-
 sys/dev/pci/autri.c                  |    90 +-
 sys/dev/pci/autrivar.h               |     4 +-
 sys/dev/pci/auvia.c                  |   214 ++++-
 sys/dev/pci/auviavar.h               |     6 +-
 sys/dev/pci/azalia.c                 |   121 ++-
 sys/dev/pci/azalia.h                 |     7 +-
 sys/dev/pci/azalia_codec.c           |    58 +-
 sys/dev/pci/cmpci.c                  |    83 +-
 sys/dev/pci/cmpcivar.h               |     6 +-
 sys/dev/pci/cs4280.c                 |    70 +-
 sys/dev/pci/cs4281.c                 |    42 +-
 sys/dev/pci/cs428x.c                 |    57 +-
 sys/dev/pci/cs428x.h                 |    12 +-
 sys/dev/pci/eap.c                    |   177 +---
 sys/dev/pci/eapvar.h                 |    81 ++-
 sys/dev/pci/emuxki.c                 |   297 ++++----
 sys/dev/pci/emuxkivar.h              |     6 +-
 sys/dev/pci/esa.c                    |   134 ++-
 sys/dev/pci/esavar.h                 |     5 +-
 sys/dev/pci/esm.c                    |   103 ++-
 sys/dev/pci/esmvar.h                 |     9 +-
 sys/dev/pci/eso.c                    |   298 ++++++--
 sys/dev/pci/esovar.h                 |     7 +-
 sys/dev/pci/fms.c                    |    86 +-
 sys/dev/pci/fmsvar.h                 |     6 +-
 sys/dev/pci/gcscaudio.c              |    81 +-
 sys/dev/pci/hdaudio/hdafg.c          |    51 +-
 sys/dev/pci/hdaudio/hdaudio.c        |     8 +-
 sys/dev/pci/hdaudio/hdaudio_pci.c    |     6 +-
 sys/dev/pci/joy_eap.c                |    10 +-
 sys/dev/pci/joy_eso.c                |     7 +-
 sys/dev/pci/joy_pci.c                |    29 +-
 sys/dev/pci/mpu_cmpci.c              |     7 +-
 sys/dev/pci/mpu_eso.c                |     7 +-
 sys/dev/pci/mpu_fms.c                |     7 +-
 sys/dev/pci/mpu_yds.c                |     7 +-
 sys/dev/pci/neo.c                    |    77 +-
 sys/dev/pci/opl_eso.c                |     5 +-
 sys/dev/pci/sv.c                     |   214 +++--
 sys/dev/pci/svvar.h                  |     4 +-
 sys/dev/pci/yds.c                    |    82 +-
 sys/dev/pci/ydsvar.h                 |     4 +-
 sys/dev/sbus/cs4231_sbus.c           |    23 +-
 sys/dev/sbus/dbri.c                  |    97 +-
 sys/dev/sbus/dbrivar.h               |     5 +-
 sys/dev/sequencer.c                  |   759 ++++++++++++++--------
 sys/dev/sequencervar.h               |    25 +-
 sys/dev/tc/bba.c                     |    64 +-
 sys/dev/usb/uaudio.c                 |   105 ++-
 sys/dev/usb/umidi.c                  |    35 +-
 sys/dev/usb/umidivar.h               |     5 +-
 sys/sys/intr.h                       |     7 +-
 sys/sys/param.h                      |     4 +-
 160 files changed, 6020 insertions(+), 3658 deletions(-)

diffs (truncated from 25620 to 300 lines):

diff -r 6523379fe8f3 -r bd153de94c11 sys/arch/amiga/dev/aucc.c
--- a/sys/arch/amiga/dev/aucc.c Wed Nov 23 22:57:24 2011 +0000
+++ b/sys/arch/amiga/dev/aucc.c Wed Nov 23 23:07:28 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: aucc.c,v 1.40 2006/03/08 23:46:22 lukem Exp $ */
+/*     $NetBSD: aucc.c,v 1.41 2011/11/23 23:07:28 jmcneill Exp $ */
 
 /*
  * Copyright (c) 1999 Bernardo Innocenti
@@ -53,7 +53,7 @@
 #if NAUCC > 0
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.40 2006/03/08 23:46:22 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: aucc.c,v 1.41 2011/11/23 23:07:28 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -91,12 +91,6 @@
 #define DPRINTF(x)
 #endif
 
-#ifdef splaudio
-#undef splaudio
-#endif
-
-#define splaudio() spl4();
-
 /* clock frequency.. */
 extern int eclockfreq;
 
@@ -122,6 +116,9 @@
        int     sc_channelmask;         /* which channels are used ? */
        void (*sc_decodefunc)(u_char **, u_char *, int);
                                /* pointer to format conversion routine */
+
+       kmutex_t sc_lock;
+       kmutex_t sc_intr_lock;
 };
 
 /* interrupt interfaces */
@@ -205,6 +202,7 @@
 int    aucc_set_params(void *, int, int, audio_params_t *, audio_params_t *,
                        stream_filter_list_t *, stream_filter_list_t *);
 int    aucc_get_props(void *);
+void   aucc_get_locks(void *, kmutex_t **, kmutex_t **);
 
 
 static void aucc_decode_slinear8_1ch(u_char **, u_char *, int);
@@ -262,6 +260,7 @@
        NULL,
        NULL,
        NULL,
+       aucc_get_locks,
 };
 
 /* autoconfig routines */
@@ -343,6 +342,9 @@
        custom.intena = AUCC_ALLINTF;
        custom.dmacon = AUCC_ALLDMAF;
 
+       mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
        return err;
 }
 
@@ -907,6 +909,16 @@
        return 0;
 }
 
+
+void
+aucc_get_locks(void *opaque, kmutex_t **intr, kmutex_t **thread)
+{
+       struct aucc_softc *sc = opaque;
+
+       *intr = &sc->sc_intr_lock;
+       *thread = &sc->sc_lock;
+}
+
 int
 aucc_query_devinfo(void *addr, register mixer_devinfo_t *dip)
 {
@@ -958,6 +970,7 @@
        int i;
        int mask;
 
+       mutex_spin_enter(&aucc->sc_intr_lock);
        mask = aucc->sc_channel[ch].nd_mask;
        /*
         * for all channels in this maskgroup:
@@ -991,6 +1004,7 @@
                    (aucc->sc_channel[ch].nd_intrdata);
        } else
                DPRINTF(("zero int handler\n"));
+       mutex_spin_exit(&aucc->sc_intr_lock);
        DPRINTF(("ints done\n"));
 }
 
diff -r 6523379fe8f3 -r bd153de94c11 sys/arch/amiga/dev/melody.c
--- a/sys/arch/amiga/dev/melody.c       Wed Nov 23 22:57:24 2011 +0000
+++ b/sys/arch/amiga/dev/melody.c       Wed Nov 23 23:07:28 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: melody.c,v 1.16 2011/07/19 15:55:27 dyoung Exp $ */
+/*     $NetBSD: melody.c,v 1.17 2011/11/23 23:07:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: melody.c,v 1.16 2011/07/19 15:55:27 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: melody.c,v 1.17 2011/11/23 23:07:28 jmcneill Exp $");
 
 /*
  * Melody audio driver.
@@ -111,6 +111,10 @@
        sc->sc_tav.sc_dif = 0;
        sc->sc_tav.sc_pcm_div = 12;
 
+       mutex_init(&sc->sc_tav.sc_lock, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_tav.sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+       cv_init(&sc->sc_tav.sc_cv, device_xname(self));
+
        /*
         * Attach option boards now. They might provide additional
         * functionality to our audio part.
diff -r 6523379fe8f3 -r bd153de94c11 sys/arch/amiga/dev/repulse.c
--- a/sys/arch/amiga/dev/repulse.c      Wed Nov 23 22:57:24 2011 +0000
+++ b/sys/arch/amiga/dev/repulse.c      Wed Nov 23 23:07:28 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: repulse.c,v 1.17 2011/07/19 15:55:27 dyoung Exp $ */
+/*     $NetBSD: repulse.c,v 1.18 2011/11/23 23:07:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: repulse.c,v 1.17 2011/07/19 15:55:27 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: repulse.c,v 1.18 2011/11/23 23:07:28 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -85,6 +85,7 @@
 int rep_get_port(void *, mixer_ctrl_t *);
 int rep_query_devinfo(void *, mixer_devinfo_t *);
 size_t rep_round_buffersize(void *, int, size_t);
+void rep_get_locks(void *, kmutex_t **, kmutex_t **);
 
 int rep_start_input(void *, void *, int, void (*)(void *), void *);
 int rep_start_output(void *, void *, int, void (*)(void *), void *);
@@ -122,6 +123,7 @@
        /* trigger_output */ 0,
        /* trigger_input */ 0,
        /* dev_ioctl */ 0,
+       rep_get_locks,
 };
 
 /* hardware registers */
@@ -219,6 +221,8 @@
        int       sc_playscale;
        unsigned  sc_playflags;
 
+       kmutex_t  sc_lock;
+       kmutex_t  sc_intr_lock;
 };
 
 int repulse_match (struct device *, struct cfdata *, void *);
@@ -310,7 +314,10 @@
        sc->sc_achost.attach = repac_attach;
        sc->sc_achost.flags = 0;
 
-       if (ac97_attach(&sc->sc_achost, self)) {
+       mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
+       if (ac97_attach(&sc->sc_achost, self, &sc->sc_lock)) {
                printf("%s: error attaching codec\n", self->dv_xname);
                return;
        }
@@ -579,6 +586,15 @@
        return size;
 }
 
+void
+rep_get_locks(void *opaque, kmutex_t **intr, kmutex_t **thread)
+{
+       struct repulse_softc *sc = opaque;
+
+       *intr = &sc->sc_intr_lock;
+       *thread = &sc->sc_lock;
+}
+
 
 int
 rep_set_params(void *addr, int setmode, int usemode,
@@ -948,6 +964,9 @@
        foundone = 0;
 
        sc = tag;
+
+       mutex_spin_enter(&sc->sc_intr_lock);
+
        bp = sc->sc_boardp;
        status = bp->rhw_status;
 
@@ -967,5 +986,7 @@
                (*sc->sc_captmore)(sc->sc_captarg);
        }
 
+       mutex_spin_exit(&sc->sc_intr_lock);
+
        return foundone;
 }
diff -r 6523379fe8f3 -r bd153de94c11 sys/arch/amiga/dev/toccata.c
--- a/sys/arch/amiga/dev/toccata.c      Wed Nov 23 22:57:24 2011 +0000
+++ b/sys/arch/amiga/dev/toccata.c      Wed Nov 23 23:07:28 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: toccata.c,v 1.14 2011/07/19 15:55:27 dyoung Exp $ */
+/* $NetBSD: toccata.c,v 1.15 2011/11/23 23:07:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2001, 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: toccata.c,v 1.14 2011/07/19 15:55:27 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: toccata.c,v 1.15 2011/11/23 23:07:28 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -174,6 +174,8 @@
 int toccata_get_port(void *, mixer_ctrl_t *);
 int toccata_query_devinfo(void *, mixer_devinfo_t *);
 
+void toccata_get_locks(void *, kmutex_t **, kmutex_t **);
+
 const struct audio_hw_if audiocs_hw_if = {
        toccata_open,
        toccata_close,
@@ -205,6 +207,8 @@
        toccata_get_props,
        0,      /* trigger_output */
        0,
+       0,
+       toccata_get_locks,
 };
 
 struct toccata_softc {
@@ -219,6 +223,9 @@
 
        void                    (*sc_playmore)(void *);
        void                     *sc_playarg;
+
+       kmutex_t                sc_lock;
+       kmutex_t                sc_intr_lock;
 };
 
 int toccata_match(device_t, cfdata_t, void *);
@@ -275,6 +282,9 @@
        sc->sc_captbuf = 0;
        sc->sc_playmore = 0;
 
+       mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
        sc->sc_isr.isr_ipl = 6;
        sc->sc_isr.isr_arg = sc;
        sc->sc_isr.isr_intr = toccata_intr;
@@ -294,14 +304,20 @@
        int i;
 
        sc = tag;
+
+       mutex_spin_enter(&sc->sc_intr_lock);
+
        status = *(sc->sc_boardp);
 
-       if (status & TOCC_FIFO_INT)     /* active low */
+       if (status & TOCC_FIFO_INT) {   /* active low */
+               mutex_spin_exit(&sc->sc_intr_lock);
                return 0;
+       }
 
        if (status & TOCC_FIFO_PBHE) {
                if (sc->sc_playmore) {
                        (*sc->sc_playmore)(sc->sc_playarg);
+                       mutex_spin_exit(&sc->sc_intr_lock);
                        return 1;
                }
        } else if (status & TOCC_FIFO_CPHF) {
@@ -318,6 +334,7 @@
 
                        /* XXX if (sc->sc_captmore) { */
                        (*sc->sc_captmore)(sc->sc_captarg);



Home | Main Index | Thread Index | Old Index