Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/hdaudio/stream.c

    r0e4c5f0 r57a2208  
    4848#include "stream.h"
    4949
    50 int hda_stream_buffers_alloc(hda_t *hda, hda_stream_buffers_t **rbufs)
     50static int hda_stream_buffers_alloc(hda_stream_t *stream)
    5151{
    5252        void *bdl;
    5353        void *buffer;
    5454        uintptr_t buffer_phys;
    55         hda_stream_buffers_t *bufs = NULL;
    5655        size_t i;
    5756//      size_t j, k;
    5857        int rc;
    5958
    60         bufs = calloc(1, sizeof(hda_stream_buffers_t));
    61         if (bufs == NULL) {
    62                 rc = ENOMEM;
    63                 goto error;
    64         }
    65 
    66         bufs->nbuffers = 4;
    67         bufs->bufsize = 16384;
     59        stream->nbuffers = 4;
     60        stream->bufsize = 16384;
    6861
    6962        /*
     
    7265         */
    7366        bdl = AS_AREA_ANY;
    74         rc = dmamem_map_anonymous(bufs->nbuffers * sizeof(hda_buffer_desc_t),
    75             hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
    76             0, &bufs->bdl_phys, &bdl);
     67        rc = dmamem_map_anonymous(stream->nbuffers * sizeof(hda_buffer_desc_t),
     68            stream->hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
     69            0, &stream->bdl_phys, &bdl);
    7770        if (rc != EOK)
    7871                goto error;
    7972
    80         bufs->bdl = bdl;
     73        stream->bdl = bdl;
    8174
    8275        /* Allocate arrays of buffer pointers */
    8376
    84         bufs->buf = calloc(bufs->nbuffers, sizeof(void *));
    85         if (bufs->buf == NULL)
    86                 goto error;
    87 
    88         bufs->buf_phys = calloc(bufs->nbuffers, sizeof(uintptr_t));
    89         if (bufs->buf_phys == NULL)
     77        stream->buf = calloc(stream->nbuffers, sizeof(void *));
     78        if (stream->buf == NULL)
     79                goto error;
     80
     81        stream->buf_phys = calloc(stream->nbuffers, sizeof(uintptr_t));
     82        if (stream->buf_phys == NULL)
    9083                goto error;
    9184
    9285        /* Allocate buffers */
    9386/*
    94         for (i = 0; i < bufs->nbuffers; i++) {
     87        for (i = 0; i < stream->nbuffers; i++) {
    9588                buffer = AS_AREA_ANY;
    96                 rc = dmamem_map_anonymous(bufs->bufsize,
    97                     bufs->hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
     89                rc = dmamem_map_anonymous(stream->bufsize,
     90                    stream->hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
    9891                    0, &buffer_phys, &buffer);
    9992                if (rc != EOK)
     
    10396                    (unsigned long long)buffer_phys, buffer);
    10497
    105                 bufs->buf[i] = buffer;
    106                 bufs->buf_phys[i] = buffer_phys;
     98                stream->buf[i] = buffer;
     99                stream->buf_phys[i] = buffer_phys;
    107100
    108101                k = 0;
    109                 for (j = 0; j < bufs->bufsize / 2; j++) {
    110                         int16_t *bp = bufs->buf[i];
     102                for (j = 0; j < stream->bufsize / 2; j++) {
     103                        int16_t *bp = stream->buf[i];
    111104                        bp[j] = (k > 128) ? -100 : 100;
    112105                        ++k;
     
    118111        /* audio_pcm_iface requires a single contiguous buffer */
    119112        buffer = AS_AREA_ANY;
    120         rc = dmamem_map_anonymous(bufs->bufsize * bufs->nbuffers,
    121             hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
     113        rc = dmamem_map_anonymous(stream->bufsize * stream->nbuffers,
     114            stream->hda->ctl->ok64bit ? 0 : DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE,
    122115            0, &buffer_phys, &buffer);
    123116        if (rc != EOK) {
     
    126119        }
    127120
    128         for (i = 0; i < bufs->nbuffers; i++) {
    129                 bufs->buf[i] = buffer + i * bufs->bufsize;
    130                 bufs->buf_phys[i] = buffer_phys + i * bufs->bufsize;
     121        for (i = 0; i < stream->nbuffers; i++) {
     122                stream->buf[i] = buffer + i * stream->bufsize;
     123                stream->buf_phys[i] = buffer_phys + i * stream->bufsize;
    131124
    132125                ddf_msg(LVL_NOTE, "Stream buf phys=0x%llx virt=%p",
    133                     (long long unsigned)(uintptr_t)bufs->buf[i],
    134                     (void *)bufs->buf_phys[i]);
     126                    (long long unsigned)(uintptr_t)stream->buf[i],
     127                    (void *)stream->buf_phys[i]);
    135128/*              k = 0;
    136                 for (j = 0; j < bufs->bufsize / 2; j++) {
    137                         int16_t *bp = bufs->buf[i];
     129                for (j = 0; j < stream->bufsize / 2; j++) {
     130                        int16_t *bp = stream->buf[i];
    138131                        bp[j] = (k > 128) ? -10000 : 10000;
    139132                        ++k;
     
    145138
    146139        /* Fill in BDL */
    147         for (i = 0; i < bufs->nbuffers; i++) {
    148                 bufs->bdl[i].address = host2uint64_t_le(bufs->buf_phys[i]);
    149                 bufs->bdl[i].length = host2uint32_t_le(bufs->bufsize);
    150                 bufs->bdl[i].flags = BIT_V(uint32_t, bdf_ioc);
    151         }
    152 
    153         *rbufs = bufs;
     140        for (i = 0; i < stream->nbuffers; i++) {
     141                stream->bdl[i].address = host2uint64_t_le(stream->buf_phys[i]);
     142                stream->bdl[i].length = host2uint32_t_le(stream->bufsize);
     143                stream->bdl[i].flags = BIT_V(uint32_t, bdf_ioc);
     144        }
     145
    154146        return EOK;
    155147error:
    156         hda_stream_buffers_free(bufs);
    157148        return ENOMEM;
    158149}
    159150
    160 void hda_stream_buffers_free(hda_stream_buffers_t *bufs)
    161 {
    162         if (bufs == NULL)
    163                 return;
    164 
    165         /* XXX */
    166         free(bufs);
    167 }
    168 
    169151static void hda_stream_desc_configure(hda_stream_t *stream)
    170152{
    171153        hda_sdesc_regs_t *sdregs;
    172         hda_stream_buffers_t *bufs = stream->buffers;
    173154        uint8_t ctl1;
    174155        uint8_t ctl3;
     
    180161        hda_reg8_write(&sdregs->ctl3, ctl3);
    181162        hda_reg8_write(&sdregs->ctl1, ctl1);
    182         hda_reg32_write(&sdregs->cbl, bufs->nbuffers * bufs->bufsize);
    183         hda_reg16_write(&sdregs->lvi, bufs->nbuffers - 1);
     163        hda_reg32_write(&sdregs->cbl, stream->nbuffers * stream->bufsize);
     164        hda_reg16_write(&sdregs->lvi, stream->nbuffers - 1);
    184165        hda_reg16_write(&sdregs->fmt, stream->fmt);
    185         hda_reg32_write(&sdregs->bdpl, LOWER32(bufs->bdl_phys));
    186         hda_reg32_write(&sdregs->bdpu, UPPER32(bufs->bdl_phys));
     166        hda_reg32_write(&sdregs->bdpl, LOWER32(stream->bdl_phys));
     167        hda_reg32_write(&sdregs->bdpu, UPPER32(stream->bdl_phys));
    187168}
    188169
     
    224205
    225206hda_stream_t *hda_stream_create(hda_t *hda, hda_stream_dir_t dir,
    226     hda_stream_buffers_t *bufs, uint32_t fmt)
     207    uint32_t fmt)
    227208{
    228209        hda_stream_t *stream;
    229         uint8_t sdid;
     210        int rc;
    230211
    231212        stream = calloc(1, sizeof(hda_stream_t));
     
    233214                return NULL;
    234215
    235         sdid = 0;
    236 
    237         switch (dir) {
    238         case sdir_input:
    239                 sdid = 0; /* XXX Allocate - first input SDESC */
    240                 break;
    241         case sdir_output:
    242                 sdid = hda->ctl->iss; /* XXX Allocate - First output SDESC */
    243                 break;
    244         case sdir_bidi:
    245                 sdid = hda->ctl->iss + hda->ctl->oss; /* XXX Allocate - First bidi SDESC */
    246                 break;
    247         }
    248 
    249216        stream->hda = hda;
    250217        stream->dir = dir;
    251218        stream->sid = 1; /* XXX Allocate this */
    252         stream->sdid = sdid;
     219        stream->sdid = hda->ctl->iss; /* XXX Allocate - First output SDESC */
    253220        stream->fmt = fmt;
    254         stream->buffers = bufs;
    255221
    256222        ddf_msg(LVL_NOTE, "snum=%d sdidx=%d", stream->sid, stream->sdid);
     223
     224        ddf_msg(LVL_NOTE, "Allocate buffers");
     225        rc = hda_stream_buffers_alloc(stream);
     226        if (rc != EOK)
     227                goto error;
    257228
    258229        ddf_msg(LVL_NOTE, "Configure stream descriptor");
    259230        hda_stream_desc_configure(stream);
    260231        return stream;
     232error:
     233        return NULL;
    261234}
    262235
Note: See TracChangeset for help on using the changeset viewer.