Changes in uspace/drv/audio/hdaudio/stream.c [0e4c5f0:57a2208] in mainline
- File:
-
- 1 edited
-
uspace/drv/audio/hdaudio/stream.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/audio/hdaudio/stream.c
r0e4c5f0 r57a2208 48 48 #include "stream.h" 49 49 50 int hda_stream_buffers_alloc(hda_t *hda, hda_stream_buffers_t **rbufs)50 static int hda_stream_buffers_alloc(hda_stream_t *stream) 51 51 { 52 52 void *bdl; 53 53 void *buffer; 54 54 uintptr_t buffer_phys; 55 hda_stream_buffers_t *bufs = NULL;56 55 size_t i; 57 56 // size_t j, k; 58 57 int rc; 59 58 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; 68 61 69 62 /* … … 72 65 */ 73 66 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); 77 70 if (rc != EOK) 78 71 goto error; 79 72 80 bufs->bdl = bdl;73 stream->bdl = bdl; 81 74 82 75 /* Allocate arrays of buffer pointers */ 83 76 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) 90 83 goto error; 91 84 92 85 /* Allocate buffers */ 93 86 /* 94 for (i = 0; i < bufs->nbuffers; i++) {87 for (i = 0; i < stream->nbuffers; i++) { 95 88 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, 98 91 0, &buffer_phys, &buffer); 99 92 if (rc != EOK) … … 103 96 (unsigned long long)buffer_phys, buffer); 104 97 105 bufs->buf[i] = buffer;106 bufs->buf_phys[i] = buffer_phys;98 stream->buf[i] = buffer; 99 stream->buf_phys[i] = buffer_phys; 107 100 108 101 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]; 111 104 bp[j] = (k > 128) ? -100 : 100; 112 105 ++k; … … 118 111 /* audio_pcm_iface requires a single contiguous buffer */ 119 112 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, 122 115 0, &buffer_phys, &buffer); 123 116 if (rc != EOK) { … … 126 119 } 127 120 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; 131 124 132 125 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]); 135 128 /* 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]; 138 131 bp[j] = (k > 128) ? -10000 : 10000; 139 132 ++k; … … 145 138 146 139 /* 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 154 146 return EOK; 155 147 error: 156 hda_stream_buffers_free(bufs);157 148 return ENOMEM; 158 149 } 159 150 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 169 151 static void hda_stream_desc_configure(hda_stream_t *stream) 170 152 { 171 153 hda_sdesc_regs_t *sdregs; 172 hda_stream_buffers_t *bufs = stream->buffers;173 154 uint8_t ctl1; 174 155 uint8_t ctl3; … … 180 161 hda_reg8_write(&sdregs->ctl3, ctl3); 181 162 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); 184 165 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)); 187 168 } 188 169 … … 224 205 225 206 hda_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) 227 208 { 228 209 hda_stream_t *stream; 229 uint8_t sdid;210 int rc; 230 211 231 212 stream = calloc(1, sizeof(hda_stream_t)); … … 233 214 return NULL; 234 215 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 249 216 stream->hda = hda; 250 217 stream->dir = dir; 251 218 stream->sid = 1; /* XXX Allocate this */ 252 stream->sdid = sdid;219 stream->sdid = hda->ctl->iss; /* XXX Allocate - First output SDESC */ 253 220 stream->fmt = fmt; 254 stream->buffers = bufs;255 221 256 222 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; 257 228 258 229 ddf_msg(LVL_NOTE, "Configure stream descriptor"); 259 230 hda_stream_desc_configure(stream); 260 231 return stream; 232 error: 233 return NULL; 261 234 } 262 235
Note:
See TracChangeset
for help on using the changeset viewer.
