hdac.c (d90a1cd31883f7710baf3fc655e52d9d0d61f9a5) hdac.c (1042342ad88d654b6a7faf5d36510d36023d5329)
1/*-
2 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
3 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 66 unchanged lines hidden (view full) ---

75
76#include <dev/sound/pci/hda/hdac_private.h>
77#include <dev/sound/pci/hda/hdac_reg.h>
78#include <dev/sound/pci/hda/hda_reg.h>
79#include <dev/sound/pci/hda/hdac.h>
80
81#include "mixer_if.h"
82
1/*-
2 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
3 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 66 unchanged lines hidden (view full) ---

75
76#include <dev/sound/pci/hda/hdac_private.h>
77#include <dev/sound/pci/hda/hdac_reg.h>
78#include <dev/sound/pci/hda/hda_reg.h>
79#include <dev/sound/pci/hda/hdac.h>
80
81#include "mixer_if.h"
82
83#define HDA_DRV_TEST_REV "20070316_0041"
83#define HDA_DRV_TEST_REV "20070317_0042"
84#define HDA_WIDGET_PARSER_REV 1
85
86SND_DECLARE_FILE("$FreeBSD$");
87
88#undef HDA_DEBUG_ENABLED
89#define HDA_DEBUG_ENABLED 1
90
91#ifdef HDA_DEBUG_ENABLED

--- 104 unchanged lines hidden (view full) ---

196/* Asus */
197#define ASUS_VENDORID 0x1043
198#define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
199#define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
200#define ASUS_A8JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1153)
201#define ASUS_P1AH2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb)
202#define ASUS_A7M_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1323)
203#define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2)
84#define HDA_WIDGET_PARSER_REV 1
85
86SND_DECLARE_FILE("$FreeBSD$");
87
88#undef HDA_DEBUG_ENABLED
89#define HDA_DEBUG_ENABLED 1
90
91#ifdef HDA_DEBUG_ENABLED

--- 104 unchanged lines hidden (view full) ---

196/* Asus */
197#define ASUS_VENDORID 0x1043
198#define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
199#define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
200#define ASUS_A8JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1153)
201#define ASUS_P1AH2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb)
202#define ASUS_A7M_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1323)
203#define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2)
204#define ASUS_W6F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
204#define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff)
205
206/* IBM / Lenovo */
207#define IBM_VENDORID 0x1014
208#define IBM_M52_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0x02f6)
209#define IBM_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0xffff)
210
211/* Lenovo */

--- 84 unchanged lines hidden (view full) ---

296};
297#define HDAC_QUIRKS_TAB_LEN \
298 (sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0]))
299
300#define HDA_BDL_MIN 2
301#define HDA_BDL_MAX 256
302#define HDA_BDL_DEFAULT HDA_BDL_MIN
303
205#define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff)
206
207/* IBM / Lenovo */
208#define IBM_VENDORID 0x1014
209#define IBM_M52_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0x02f6)
210#define IBM_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0xffff)
211
212/* Lenovo */

--- 84 unchanged lines hidden (view full) ---

297};
298#define HDAC_QUIRKS_TAB_LEN \
299 (sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0]))
300
301#define HDA_BDL_MIN 2
302#define HDA_BDL_MAX 256
303#define HDA_BDL_DEFAULT HDA_BDL_MIN
304
305#define HDA_BLK_MIN 128
306#define HDA_BLK_ALIGN (~(HDA_BLK_MIN - 1))
307
304#define HDA_BUFSZ_MIN 4096
305#define HDA_BUFSZ_MAX 65536
306#define HDA_BUFSZ_DEFAULT 16384
307
308#define HDA_PARSE_MAXDEPTH 10
309
310#define HDAC_UNSOLTAG_EVENT_HP 0x00
311

--- 2447 unchanged lines hidden (view full) ---

2759 HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad);
2760 hdac_command(sc,
2761 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i],
2762 ch->sid << 4), cad);
2763 }
2764}
2765
2766static int
308#define HDA_BUFSZ_MIN 4096
309#define HDA_BUFSZ_MAX 65536
310#define HDA_BUFSZ_DEFAULT 16384
311
312#define HDA_PARSE_MAXDEPTH 10
313
314#define HDAC_UNSOLTAG_EVENT_HP 0x00
315

--- 2447 unchanged lines hidden (view full) ---

2763 HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad);
2764 hdac_command(sc,
2765 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i],
2766 ch->sid << 4), cad);
2767 }
2768}
2769
2770static int
2767hdac_channel_setblocksize(kobj_t obj, void *data, uint32_t blksz)
2771hdac_channel_setfragments(kobj_t obj, void *data,
2772 uint32_t blksz, uint32_t blkcnt)
2768{
2769 struct hdac_chan *ch = data;
2770 struct hdac_softc *sc = ch->devinfo->codec->sc;
2771
2773{
2774 struct hdac_chan *ch = data;
2775 struct hdac_softc *sc = ch->devinfo->codec->sc;
2776
2772 blksz &= ~0x7f;
2773 if (blksz < 0x80)
2774 blksz = 0x80;
2777 blksz &= HDA_BLK_ALIGN;
2775
2778
2776 if ((blksz * ch->blkcnt) > sndbuf_getmaxsize(ch->b))
2777 blksz = sndbuf_getmaxsize(ch->b) / ch->blkcnt;
2779 if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN))
2780 blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN;
2781 if (blksz < HDA_BLK_MIN)
2782 blksz = HDA_BLK_MIN;
2783 if (blkcnt > HDA_BDL_MAX)
2784 blkcnt = HDA_BDL_MAX;
2785 if (blkcnt < HDA_BDL_MIN)
2786 blkcnt = HDA_BDL_MIN;
2778
2787
2788 while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->b)) {
2789 if ((blkcnt >> 1) >= HDA_BDL_MIN)
2790 blkcnt >>= 1;
2791 else if ((blksz >> 1) >= HDA_BLK_MIN)
2792 blksz >>= 1;
2793 else
2794 break;
2795 }
2796
2779 if ((sndbuf_getblksz(ch->b) != blksz ||
2797 if ((sndbuf_getblksz(ch->b) != blksz ||
2780 sndbuf_getblkcnt(ch->b) != ch->blkcnt) &&
2781 sndbuf_resize(ch->b, ch->blkcnt, blksz) != 0)
2798 sndbuf_getblkcnt(ch->b) != blkcnt) &&
2799 sndbuf_resize(ch->b, blkcnt, blksz) != 0)
2782 device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n",
2800 device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n",
2783 __func__, blksz, ch->blkcnt);
2801 __func__, blksz, blkcnt);
2784
2785 ch->blksz = sndbuf_getblksz(ch->b);
2802
2803 ch->blksz = sndbuf_getblksz(ch->b);
2804 ch->blkcnt = sndbuf_getblkcnt(ch->b);
2786
2805
2806 return (1);
2807}
2808
2809static int
2810hdac_channel_setblocksize(kobj_t obj, void *data, uint32_t blksz)
2811{
2812 struct hdac_chan *ch = data;
2813 struct hdac_softc *sc = ch->devinfo->codec->sc;
2814
2815 hdac_channel_setfragments(obj, data, blksz, sc->chan_blkcnt);
2816
2787 return (ch->blksz);
2788}
2789
2790static void
2791hdac_channel_stop(struct hdac_softc *sc, struct hdac_chan *ch)
2792{
2793 struct hdac_devinfo *devinfo = ch->devinfo;
2794 nid_t cad = devinfo->codec->cad;

--- 57 unchanged lines hidden (view full) ---

2852 else
2853 ptr = HDAC_READ_4(&sc->mem, ch->off + HDAC_SDLPIB);
2854 hdac_unlock(sc);
2855
2856 /*
2857 * Round to available space and force 128 bytes aligment.
2858 */
2859 ptr %= ch->blksz * ch->blkcnt;
2817 return (ch->blksz);
2818}
2819
2820static void
2821hdac_channel_stop(struct hdac_softc *sc, struct hdac_chan *ch)
2822{
2823 struct hdac_devinfo *devinfo = ch->devinfo;
2824 nid_t cad = devinfo->codec->cad;

--- 57 unchanged lines hidden (view full) ---

2882 else
2883 ptr = HDAC_READ_4(&sc->mem, ch->off + HDAC_SDLPIB);
2884 hdac_unlock(sc);
2885
2886 /*
2887 * Round to available space and force 128 bytes aligment.
2888 */
2889 ptr %= ch->blksz * ch->blkcnt;
2860 ptr &= ~0x7f;
2890 ptr &= HDA_BLK_ALIGN;
2861
2862 return (ptr);
2863}
2864
2865static struct pcmchan_caps *
2866hdac_channel_getcaps(kobj_t obj, void *data)
2867{
2868 return (&((struct hdac_chan *)data)->caps);
2869}
2870
2871static kobj_method_t hdac_channel_methods[] = {
2872 KOBJMETHOD(channel_init, hdac_channel_init),
2873 KOBJMETHOD(channel_setformat, hdac_channel_setformat),
2874 KOBJMETHOD(channel_setspeed, hdac_channel_setspeed),
2875 KOBJMETHOD(channel_setblocksize, hdac_channel_setblocksize),
2891
2892 return (ptr);
2893}
2894
2895static struct pcmchan_caps *
2896hdac_channel_getcaps(kobj_t obj, void *data)
2897{
2898 return (&((struct hdac_chan *)data)->caps);
2899}
2900
2901static kobj_method_t hdac_channel_methods[] = {
2902 KOBJMETHOD(channel_init, hdac_channel_init),
2903 KOBJMETHOD(channel_setformat, hdac_channel_setformat),
2904 KOBJMETHOD(channel_setspeed, hdac_channel_setspeed),
2905 KOBJMETHOD(channel_setblocksize, hdac_channel_setblocksize),
2906 KOBJMETHOD(channel_setfragments, hdac_channel_setfragments),
2876 KOBJMETHOD(channel_trigger, hdac_channel_trigger),
2877 KOBJMETHOD(channel_getptr, hdac_channel_getptr),
2878 KOBJMETHOD(channel_getcaps, hdac_channel_getcaps),
2879 { 0, 0 }
2880};
2881CHANNEL_DECLARE(hdac_channel);
2882
2883static int

--- 370 unchanged lines hidden (view full) ---

3254 else
3255 sc->polling = 0;
3256
3257 sc->chan_size = pcm_getbuffersize(dev,
3258 HDA_BUFSZ_MIN, HDA_BUFSZ_DEFAULT, HDA_BUFSZ_MAX);
3259
3260 if (resource_int_value(device_get_name(sc->dev),
3261 device_get_unit(sc->dev), "blocksize", &i) == 0 && i > 0) {
2907 KOBJMETHOD(channel_trigger, hdac_channel_trigger),
2908 KOBJMETHOD(channel_getptr, hdac_channel_getptr),
2909 KOBJMETHOD(channel_getcaps, hdac_channel_getcaps),
2910 { 0, 0 }
2911};
2912CHANNEL_DECLARE(hdac_channel);
2913
2914static int

--- 370 unchanged lines hidden (view full) ---

3285 else
3286 sc->polling = 0;
3287
3288 sc->chan_size = pcm_getbuffersize(dev,
3289 HDA_BUFSZ_MIN, HDA_BUFSZ_DEFAULT, HDA_BUFSZ_MAX);
3290
3291 if (resource_int_value(device_get_name(sc->dev),
3292 device_get_unit(sc->dev), "blocksize", &i) == 0 && i > 0) {
3262 i &= ~0x7f;
3263 if (i < 0x80)
3264 i = 0x80;
3293 i &= HDA_BLK_ALIGN;
3294 if (i < HDA_BLK_MIN)
3295 i = HDA_BLK_MIN;
3265 sc->chan_blkcnt = sc->chan_size / i;
3266 i = 0;
3267 while (sc->chan_blkcnt >> i)
3268 i++;
3269 sc->chan_blkcnt = 1 << (i - 1);
3270 if (sc->chan_blkcnt < HDA_BDL_MIN)
3271 sc->chan_blkcnt = HDA_BDL_MIN;
3272 else if (sc->chan_blkcnt > HDA_BDL_MAX)

--- 2219 unchanged lines hidden ---
3296 sc->chan_blkcnt = sc->chan_size / i;
3297 i = 0;
3298 while (sc->chan_blkcnt >> i)
3299 i++;
3300 sc->chan_blkcnt = 1 << (i - 1);
3301 if (sc->chan_blkcnt < HDA_BDL_MIN)
3302 sc->chan_blkcnt = HDA_BDL_MIN;
3303 else if (sc->chan_blkcnt > HDA_BDL_MAX)

--- 2219 unchanged lines hidden ---