aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Ning <yu.ning@intel.com>2015-04-01 17:08:45 +0800
committerYu Ning <yu.ning@intel.com>2015-04-28 17:59:54 +0800
commit7e51381dd851cc7cc5fcb462f9c4430b6e41141a (patch)
treee805989c7c6bb20cd399c78242e9d02a8e9eb2f7
parenta931717d2d5ed5c65deb6f9d6bd184c0b75c7891 (diff)
downloadqemu-android-7e51381dd851cc7cc5fcb462f9c4430b6e41141a.tar.gz
goldfish_audio: Support 64-bit guests
Support receiving 64-bit buffer addresses from the driver. Code is adapted from external/qemu/hw/android/goldfish/audio.c. Change-Id: I3efffc670267d206561319865f46248f449f5f62 Signed-off-by: Yu Ning <yu.ning@intel.com>
-rw-r--r--hw/audio/goldfish_audio.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/hw/audio/goldfish_audio.c b/hw/audio/goldfish_audio.c
index b25e38a747..aff8397b7a 100644
--- a/hw/audio/goldfish_audio.c
+++ b/hw/audio/goldfish_audio.c
@@ -41,6 +41,11 @@ enum {
/* number of bytes available in read buffer */
AUDIO_READ_BUFFER_AVAILABLE = 0x24,
+ /* for 64-bit guest CPUs only */
+ AUDIO_SET_WRITE_BUFFER_1_HIGH = 0x28,
+ AUDIO_SET_WRITE_BUFFER_2_HIGH = 0x30,
+ AUDIO_SET_READ_BUFFER_HIGH = 0x34,
+
/* AUDIO_INT_STATUS bits */
/* this bit set when it is safe to write more bytes to the buffer */
@@ -50,7 +55,7 @@ enum {
};
struct goldfish_audio_buff {
- uint32_t address;
+ uint64_t address;
uint32_t length;
uint8* data;
uint32_t capacity;
@@ -123,7 +128,14 @@ goldfish_audio_buff_ensure( struct goldfish_audio_buff* b, uint32_t size )
static void
goldfish_audio_buff_set_address( struct goldfish_audio_buff* b, uint32_t addr )
{
- b->address = addr;
+ b->address = deposit64(b->address, 0, 32, addr);
+}
+
+static void
+goldfish_audio_buff_set_address_high( struct goldfish_audio_buff* b,
+ uint32_t addr )
+{
+ b->address = deposit64(b->address, 32, 32, addr);
}
static void
@@ -181,7 +193,7 @@ static const VMStateDescription goldfish_audio_buff_vmsd = {
.minimum_version_id = AUDIO_STATE_SAVE_VERSION,
.minimum_version_id_old = AUDIO_STATE_SAVE_VERSION,
.fields = (VMStateField[]) {
- VMSTATE_UINT32(address, struct goldfish_audio_buff),
+ VMSTATE_UINT64(address, struct goldfish_audio_buff),
VMSTATE_UINT32(length, struct goldfish_audio_buff),
VMSTATE_UINT32(offset, struct goldfish_audio_buff),
VMSTATE_VARRAY_UINT32(data, struct goldfish_audio_buff, length,
@@ -289,11 +301,23 @@ static void goldfish_audio_write(void *opaque, hwaddr offset, uint64_t val,
trace_goldfish_audio_memory_write("AUDIO_SET_WRITE_BUFFER_1", val);
goldfish_audio_buff_set_address( &s->out_buffs[0], val );
break;
+ case AUDIO_SET_WRITE_BUFFER_1_HIGH:
+ /* save pointer to buffer 1 */
+ trace_goldfish_audio_memory_write("AUDIO_SET_WRITE_BUFFER_1_HIGH",
+ val);
+ goldfish_audio_buff_set_address_high( &s->out_buffs[0], val );
+ break;
case AUDIO_SET_WRITE_BUFFER_2:
/* save pointer to buffer 2 */
trace_goldfish_audio_memory_write("AUDIO_SET_WRITE_BUFFER_2", val);
goldfish_audio_buff_set_address( &s->out_buffs[1], val );
break;
+ case AUDIO_SET_WRITE_BUFFER_2_HIGH:
+ /* save pointer to buffer 2 */
+ trace_goldfish_audio_memory_write("AUDIO_SET_WRITE_BUFFER_2_HIGH",
+ val);
+ goldfish_audio_buff_set_address_high( &s->out_buffs[1], val );
+ break;
case AUDIO_WRITE_BUFFER_1:
/* record that data in buffer 1 is ready to write */
trace_goldfish_audio_memory_write("AUDIO_WRITE_BUFFER_1", val);
@@ -320,6 +344,13 @@ static void goldfish_audio_write(void *opaque, hwaddr offset, uint64_t val,
qemu_set_irq(s->irq, s->int_status & s->int_enable);
break;
+ case AUDIO_SET_READ_BUFFER_HIGH:
+ /* save pointer to the read buffer */
+ goldfish_audio_buff_set_address_high( &s->in_buff, val );
+ trace_goldfish_audio_memory_write("AUDIO_SET_READ_BUFFER_HIGH",
+ val);
+ break;
+
default:
error_report ("goldfish_audio_write: Bad offset 0x" TARGET_FMT_plx,
offset);