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 --- |