diff --git a/build/jam/ArchitectureRules b/build/jam/ArchitectureRules index e4170febb5..1b316221ff 100644 --- a/build/jam/ArchitectureRules +++ b/build/jam/ArchitectureRules @@ -676,7 +676,7 @@ rule ArchitectureSetupWarnings architecture EnableWerror src add-ons kernel debugger ; # EnableWerror src add-ons kernel drivers audio ac97 ; EnableWerror src add-ons kernel drivers audio ac97 auich ; -# EnableWerror src add-ons kernel drivers audio ac97 auvia ; + EnableWerror src add-ons kernel drivers audio ac97 auvia ; # EnableWerror src add-ons kernel drivers audio ac97 es1370 ; # EnableWerror src add-ons kernel drivers audio ac97 geode ; # EnableWerror src add-ons kernel drivers audio ac97 ich ; diff --git a/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.c b/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.c index 3a698e561a..63bbec115b 100644 --- a/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.c +++ b/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.c @@ -73,7 +73,7 @@ auvia_mem_new(auvia_dev *card, size_t size) if ((mem = malloc(sizeof(*mem))) == NULL) return (NULL); - mem->area = alloc_mem(&mem->phy_base, &mem->log_base, size, "auvia buffer"); + mem->area = alloc_mem(&mem->phy_base, &mem->log_base, size, "auvia buffer", false); mem->size = size; if (mem->area < B_OK) { free(mem); @@ -145,14 +145,14 @@ auvia_stream_set_audioparms(auvia_stream *stream, uint8 channels, sample_size = stream->b16 + 1; frame_size = sample_size * stream->channels; - + stream->buffer = auvia_mem_alloc(stream->card, stream->bufframes * frame_size * stream->bufcount); - + stream->trigblk = 0; /* This shouldn't be needed */ stream->blkmod = stream->bufcount; stream->blksize = stream->bufframes * frame_size; - + return B_OK; } @@ -160,50 +160,49 @@ auvia_stream_set_audioparms(auvia_stream *stream, uint8 channels, status_t auvia_stream_commit_parms(auvia_stream *stream) { - int i; - uint32 *page; - uint32 value; + int i; + uint32* page; + uint32 value; LOG(("auvia_stream_commit_parms\n")); - + page = stream->dmaops_log_base; - + for(i = 0; i < stream->bufcount; i++) { - page[2*i] = ((uint32)stream->buffer->phy_base) + - i * stream->blksize; - page[2*i + 1] = AUVIA_DMAOP_FLAG | stream->blksize; + page[2 * i] = stream->buffer->phy_base + i * stream->blksize; + page[2 * i + 1] = AUVIA_DMAOP_FLAG | stream->blksize; } - - page[2*stream->bufcount - 1] &= ~AUVIA_DMAOP_FLAG; - page[2*stream->bufcount - 1] |= AUVIA_DMAOP_EOL; - - auvia_reg_write_32(&stream->card->config, stream->base + AUVIA_RP_DMAOPS_BASE, - (uint32)stream->dmaops_phy_base); - + + page[2 * stream->bufcount - 1] &= ~AUVIA_DMAOP_FLAG; + page[2 * stream->bufcount - 1] |= AUVIA_DMAOP_EOL; + + auvia_reg_write_32(&stream->card->config, stream->base + AUVIA_RP_DMAOPS_BASE, + stream->dmaops_phy_base); + if(stream->use & AUVIA_USE_RECORD) - auvia_codec_write(&stream->card->config, AC97_PCM_L_R_ADC_RATE, + auvia_codec_write(&stream->card->config, AC97_PCM_L_R_ADC_RATE, (uint16)stream->sample_rate); else - auvia_codec_write(&stream->card->config, AC97_PCM_FRONT_DAC_RATE, + auvia_codec_write(&stream->card->config, AC97_PCM_FRONT_DAC_RATE, (uint16)stream->sample_rate); - + if(IS_8233(&stream->card->config)) { if(stream->base != AUVIA_8233_MP_BASE) { - value = auvia_reg_read_32(&stream->card->config, stream->base + value = auvia_reg_read_32(&stream->card->config, stream->base + AUVIA_8233_RP_RATEFMT); - value &= ~(AUVIA_8233_RATEFMT_48K | AUVIA_8233_RATEFMT_STEREO + value &= ~(AUVIA_8233_RATEFMT_48K | AUVIA_8233_RATEFMT_STEREO | AUVIA_8233_RATEFMT_16BIT); if(stream->use & AUVIA_USE_PLAY) - value |= AUVIA_8233_RATEFMT_48K * (stream->sample_rate / 20) + value |= AUVIA_8233_RATEFMT_48K * (stream->sample_rate / 20) / (48000 / 20); value |= (stream->channels == 2 ? AUVIA_8233_RATEFMT_STEREO : 0) | (stream->b16 ? AUVIA_8233_RATEFMT_16BIT : 0); - auvia_reg_write_32(&stream->card->config, stream->base + auvia_reg_write_32(&stream->card->config, stream->base + AUVIA_8233_RP_RATEFMT, value); } else { - static const uint32 slottab[7] = {0, 0xff000011, 0xff000021, + static const uint32 slottab[7] = {0, 0xff000011, 0xff000021, 0xff000521, 0xff004321, 0xff054321, 0xff654321}; value = (stream->b16 ? AUVIA_8233_MP_FORMAT_16BIT : AUVIA_8233_MP_FORMAT_8BIT) - | ((stream->channels << 4) & AUVIA_8233_MP_FORMAT_CHANNEL_MASK) ; + | ((stream->channels << 4) & AUVIA_8233_MP_FORMAT_CHANNEL_MASK); auvia_reg_write_8(&stream->card->config, stream->base + AUVIA_8233_OFF_MP_FORMAT, value); auvia_reg_write_32(&stream->card->config, stream->base @@ -211,7 +210,7 @@ auvia_stream_commit_parms(auvia_stream *stream) } } //auvia_codec_write(&stream->card->config, AC97_SPDIF_CONTROL, (uint16)stream->sample_rate); - + return B_OK; } @@ -226,7 +225,7 @@ auvia_stream_get_nth_buffer(auvia_stream *stream, uint8 chan, uint8 buf, sample_size = stream->b16 + 1; frame_size = sample_size * stream->channels; - *buffer = stream->buffer->log_base + (buf * stream->bufframes * frame_size) + *buffer =(char *)((addr_t)stream->buffer->log_base + (uintptr_t)(buf * stream->bufframes * frame_size)) + chan * sample_size; *stride = frame_size; @@ -240,12 +239,12 @@ auvia_stream_curaddr(auvia_stream *stream) uint32 addr; if(IS_8233(&stream->card->config)) { addr = auvia_reg_read_32(&stream->card->config, stream->base + AUVIA_RP_DMAOPS_BASE); - TRACE(("stream_curaddr %p, phy_base %p\n", addr, (uint32)stream->dmaops_phy_base)); - return (addr - (uint32)stream->dmaops_phy_base - 4) / 8; + TRACE(("stream_curaddr %p, phy_base %p\n", addr, stream->dmaops_phy_base)); + return (addr - stream->dmaops_phy_base - 4) / 8; } else { addr = auvia_reg_read_32(&stream->card->config, stream->base + AUVIA_RP_DMAOPS_BASE); - TRACE(("stream_curaddr %p, phy_base %p\n", addr, (uint32)stream->dmaops_phy_base)); - return (addr - (uint32)stream->dmaops_phy_base - 8) / 8; + TRACE(("stream_curaddr %p, phy_base %p\n", addr, stream->dmaops_phy_base)); + return (addr - stream->dmaops_phy_base - 8) / 8; } } @@ -336,7 +335,7 @@ auvia_stream_new(auvia_dev *card, uint8 use, uint32 bufframes, uint8 bufcount) /* allocate memory for our dma ops */ stream->dmaops_area = alloc_mem(&stream->dmaops_phy_base, &stream->dmaops_log_base, - VIA_TABLE_SIZE, "auvia dmaops"); + VIA_TABLE_SIZE, "auvia dmaops", false); if (stream->dmaops_area < B_OK) { PRINT(("couldn't allocate memory\n")); diff --git a/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.h b/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.h index 3cc0138cdd..26b6b9090d 100644 --- a/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.h +++ b/src/add-ons/kernel/drivers/audio/ac97/auvia/auvia.h @@ -82,10 +82,10 @@ typedef struct _auvia_mem { LIST_ENTRY(_auvia_mem) next; - void *log_base; - void *phy_base; - area_id area; - size_t size; + void* log_base; + phys_addr_t phy_base; + area_id area; + size_t size; } auvia_mem; /* @@ -93,37 +93,37 @@ typedef struct _auvia_mem { */ typedef struct _auvia_stream { - struct _auvia_dev *card; - uint8 use; - uint8 state; - uint8 b16; - uint32 sample_rate; + struct _auvia_dev *card; + uint8 use; + uint8 state; + uint8 b16; + uint32 sample_rate; uint8 channels; - uint32 bufframes; - uint8 bufcount; + uint32 bufframes; + uint8 bufcount; uint32 base; LIST_ENTRY(_auvia_stream) next; - void (*inth) (void *); - void *inthparam; + void (*inth) (void *); + void *inthparam; - void *dmaops_log_base; - void *dmaops_phy_base; - area_id dmaops_area; + void* dmaops_log_base; + phys_addr_t dmaops_phy_base; + area_id dmaops_area; - auvia_mem *buffer; - uint16 blksize; /* in samples */ - uint16 trigblk; /* blk on which to trigger inth */ - uint16 blkmod; /* Modulo value to wrap trigblk */ + auvia_mem* buffer; + uint16 blksize; /* in samples */ + uint16 trigblk; /* blk on which to trigger inth */ + uint16 blkmod; /* Modulo value to wrap trigblk */ /* multi_audio */ - volatile int64 frames_count; // for play or record - volatile bigtime_t real_time; // for play or record - volatile int32 buffer_cycle; // for play or record - int32 first_channel; - bool update_needed; + volatile int64 frames_count; // for play or record + volatile bigtime_t real_time; // for play or record + volatile int32 buffer_cycle; // for play or record + int32 first_channel; + bool update_needed; } auvia_stream; /* diff --git a/src/add-ons/kernel/drivers/audio/ac97/auvia/multi.c b/src/add-ons/kernel/drivers/audio/ac97/auvia/multi.c index f5af596814..94b1c76dcb 100644 --- a/src/add-ons/kernel/drivers/audio/ac97/auvia/multi.c +++ b/src/add-ons/kernel/drivers/audio/ac97/auvia/multi.c @@ -176,8 +176,8 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) { static int32 -auvia_create_group_control(multi_dev *multi, int32 *index, int32 parent, - int32 string, const char* name) +auvia_create_group_control(multi_dev* multi, uint32* index, int32 parent, int32 string, + const char* name) { int32 i = *index; (*index)++; @@ -186,9 +186,10 @@ auvia_create_group_control(multi_dev *multi, int32 *index, int32 parent, multi->controls[i].mix_control.flags = B_MULTI_MIX_GROUP; multi->controls[i].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[i].mix_control.string = string; - if (name) + if (name) { strlcpy(multi->controls[i].mix_control.name, name, sizeof(multi->controls[i].mix_control.name)); + } return multi->controls[i].mix_control.id; } @@ -198,7 +199,6 @@ static status_t auvia_create_controls_list(multi_dev *multi) { uint32 i = 0, index = 0, count, id, parent, parent2, parent3; - auvia_dev *card = (auvia_dev*)multi->card; const ac97_source_info *info; parent = auvia_create_group_control(multi, &index, 0, 0, "Record"); @@ -402,7 +402,7 @@ auvia_get_mix(auvia_dev *card, multi_mix_value_info * mmvi) multi_mixer_control *control = NULL; for (i = 0; i < mmvi->item_count; i++) { id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID; - if (id < 0 || id >= card->multi.control_count) { + if (id < 0 || (uint32)id >= card->multi.control_count) { PRINT(("auvia_get_mix : " "invalid control id requested : %" B_PRIi32 "\n", id)); continue; @@ -443,7 +443,7 @@ auvia_set_mix(auvia_dev *card, multi_mix_value_info * mmvi) multi_mixer_control *control = NULL; for (i = 0; i < mmvi->item_count; i++) { id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID; - if (id < 0 || id >= card->multi.control_count) { + if (id < 0 || (uint32)id >= card->multi.control_count) { PRINT(("auvia_set_mix : " "invalid control id requested : %" B_PRIi32 "\n", id)); continue; @@ -454,7 +454,7 @@ auvia_set_mix(auvia_dev *card, multi_mix_value_info * mmvi) multi_mixer_control *control2 = NULL; if (i + 1 < mmvi->item_count) { id = mmvi->values[i + 1].id - EMU_MULTI_CONTROL_FIRSTID; - if (id < 0 || id >= card->multi.control_count) { + if (id < 0 || (uint32)id >= card->multi.control_count) { PRINT(("auvia_set_mix : " "invalid control id requested : %" B_PRIi32 "\n", id)); } else { @@ -506,7 +506,7 @@ static status_t auvia_list_mix_controls(auvia_dev *card, multi_mix_control_info * mmci) { multi_mix_control *mmc; - int32 i; + uint32 i; mmc = mmci->controls; if (mmci->control_count < 24) @@ -573,7 +573,8 @@ static void auvia_create_channels_list(multi_dev *multi) { auvia_stream *stream; - uint32 index, i, mode, designations; + uint32 index, i, designations; + int32 mode; multi_channel_info *chans; uint32 chan_designations[] = { B_CHANNEL_LEFT, @@ -600,7 +601,8 @@ auvia_create_channels_list(multi_dev *multi) for (i = 0; i < stream->channels; i++) { chans[index].channel_id = index; - chans[index].kind = (mode == AUVIA_USE_PLAY) ? B_MULTI_OUTPUT_CHANNEL : B_MULTI_INPUT_CHANNEL; + chans[index].kind = + (mode == AUVIA_USE_PLAY) ? B_MULTI_OUTPUT_CHANNEL : B_MULTI_INPUT_CHANNEL; chans[index].designations = designations | chan_designations[i]; chans[index].connectors = 0; index++; @@ -706,7 +708,7 @@ auvia_get_description(auvia_dev *card, multi_description *data) // channels and input bus channels and finally auxillary channels, LOG(("request_channel_count = %d\n",data->request_channel_count)); - if (data->request_channel_count >= size) { + if (data->request_channel_count >= (int32)size) { LOG(("copying data\n")); memcpy(data->channels, card->multi.chans, size * sizeof(card->multi.chans[0])); } @@ -799,10 +801,10 @@ auvia_get_buffers(auvia_dev *card, multi_buffer_list *data) pchannels = card->pstream->channels; rchannels = card->rstream->channels; - if (data->request_playback_buffers < BUFFER_COUNT || - data->request_playback_channels < (pchannels) || - data->request_record_buffers < BUFFER_COUNT || - data->request_record_channels < (rchannels)) { + if (data->request_playback_buffers < BUFFER_COUNT + || data->request_playback_channels < (int32)(pchannels) + || data->request_record_buffers < BUFFER_COUNT + || data->request_record_channels < (int32)(rchannels)) { LOG(("not enough channels/buffers\n")); } diff --git a/src/add-ons/kernel/drivers/audio/ac97/auvia/util.c b/src/add-ons/kernel/drivers/audio/ac97/auvia/util.c deleted file mode 100644 index 25394fd919..0000000000 --- a/src/add-ons/kernel/drivers/audio/ac97/auvia/util.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * BeOS Driver for Intel ICH AC'97 Link interface - * - * Copyright (c) 2002, Marcus Overhagen - * - * All rights reserved. - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include -#include -#include - -//#define DEBUG 2 - -#include "debug.h" -#include "util.h" - -spinlock slock = B_SPINLOCK_INITIALIZER; - -uint32 round_to_pagesize(uint32 size); - - -cpu_status -lock(void) -{ - cpu_status status = disable_interrupts(); - acquire_spinlock(&slock); - return status; -} - - -void -unlock(cpu_status status) -{ - release_spinlock(&slock); - restore_interrupts(status); -} - - -uint32 -round_to_pagesize(uint32 size) -{ - return (size + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); -} - - -area_id -alloc_mem(void **phy, void **log, size_t size, const char *name) -{ -// TODO: phy should be phys_addr_t*! - physical_entry pe; - void * logadr; - area_id areaid; - status_t rv; - - LOG(("allocating %d bytes for %s\n",size,name)); - - size = round_to_pagesize(size); - areaid = create_area(name, &logadr, B_ANY_KERNEL_ADDRESS, size, - B_32_BIT_CONTIGUOUS, B_READ_AREA | B_WRITE_AREA); - // TODO: The rest of the code doesn't deal correctly with physical - // addresses > 4 GB, so we have to force 32 bit addresses here. - if (areaid < B_OK) { - PRINT(("couldn't allocate area %s\n",name)); - return B_ERROR; - } - rv = get_memory_map(logadr,size,&pe,1); - if (rv < B_OK) { - delete_area(areaid); - PRINT(("couldn't map %s\n",name)); - return B_ERROR; - } - memset(logadr,0,size); - if (log) - *log = logadr; - if (phy) - *phy = (void*)(addr_t)pe.address; - LOG(("area = %d, size = %d, log = %#08X, phy = %#08X\n",areaid,size,logadr,pe.address)); - return areaid; -} - diff --git a/src/add-ons/kernel/drivers/audio/ac97/auvia/util.h b/src/add-ons/kernel/drivers/audio/ac97/auvia/util.h deleted file mode 100644 index 7a367042ca..0000000000 --- a/src/add-ons/kernel/drivers/audio/ac97/auvia/util.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * BeOS Driver for Intel ICH AC'97 Link interface - * - * Copyright (c) 2002, Marcus Overhagen - * - * All rights reserved. - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef _UTIL_H_ -#define _UTIL_H_ - -#include - -area_id alloc_mem(void **phy, void **log, size_t size, const char *name); - -cpu_status lock(void); -void unlock(cpu_status status); - -extern spinlock slock; - -#endif diff --git a/src/add-ons/kernel/drivers/audio/ac97/auich/util.c b/src/add-ons/kernel/drivers/audio/ac97/util.c similarity index 100% rename from src/add-ons/kernel/drivers/audio/ac97/auich/util.c rename to src/add-ons/kernel/drivers/audio/ac97/util.c diff --git a/src/add-ons/kernel/drivers/audio/ac97/auich/util.h b/src/add-ons/kernel/drivers/audio/ac97/util.h similarity index 100% rename from src/add-ons/kernel/drivers/audio/ac97/auich/util.h rename to src/add-ons/kernel/drivers/audio/ac97/util.h