blob: a62e81044e2fe5f26a5c0bf066d248926ef3fd3e [file] [log] [blame]
/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#ifndef GOLDFISH_DEVICE_H
#define GOLDFISH_DEVICE_H
#include "config.h"
#include "exec/cpu-common.h"
#include "hw/irq.h"
struct goldfish_device {
struct goldfish_device *next;
struct goldfish_device *prev;
uint32_t reported_state;
void *cookie;
const char *name;
uint32_t id;
uint32_t base; // filled in by goldfish_device_add if 0
uint32_t size;
uint32_t irq; // filled in by goldfish_device_add if 0
uint32_t irq_count;
};
void goldfish_device_set_irq(struct goldfish_device *dev, int irq, int level);
int goldfish_device_add(struct goldfish_device *dev,
CPUReadMemoryFunc **mem_read,
CPUWriteMemoryFunc **mem_write,
void *opaque);
int goldfish_add_device_no_io(struct goldfish_device *dev);
void goldfish_device_init(qemu_irq *pic, uint32_t base, uint32_t size, uint32_t irq, uint32_t irq_count);
int goldfish_device_bus_init(uint32_t base, uint32_t irq);
// device init functions:
qemu_irq *goldfish_interrupt_init(uint32_t base, qemu_irq parent_irq, qemu_irq parent_fiq);
void goldfish_timer_and_rtc_init(uint32_t timerbase, int timerirq);
int goldfish_tty_add(CharDriverState *cs, int id, uint32_t base, int irq);
void goldfish_fb_init(int id);
void goldfish_audio_init(uint32_t base, int id, const char* input_source);
void goldfish_battery_init(int has_battery);
void goldfish_battery_set_prop(int ac, int property, int value);
void goldfish_battery_display(void (* callback)(void *data, const char* string), void *data);
void goldfish_mmc_init(uint32_t base, int id, BlockDriverState* bs);
int goldfish_guest_is_64bit();
// these do not add a device
void trace_dev_init();
void events_dev_init(uint32_t base, qemu_irq irq);
void nand_dev_init(uint32_t base);
#ifdef TARGET_I386
/* Maximum IRQ number available for a device on x86. */
#define GFD_MAX_IRQ 16
/* IRQ reserved for keyboard. */
#define GFD_KBD_IRQ 1
/* IRQ reserved for RTC. */
#define GFD_RTC_IRQ 8
/* IRQ reserved for mouse. */
#define GFD_MOUSE_IRQ 12
/* IRQ reserved for error (raising an exception in TB code). */
#define GFD_ERR_IRQ 13
#else
/* Maximum IRQ number available for a device on ARM. */
#define GFD_MAX_IRQ 32
#endif
static inline void uint64_set_low(uint64_t *addr, uint32 value)
{
*addr = (*addr & ~(0xFFFFFFFFULL)) | value;
}
static inline void uint64_set_high(uint64_t *addr, uint32 value)
{
*addr = (*addr & 0xFFFFFFFFULL) | ((uint64_t)value << 32);
}
#endif /* GOLDFISH_DEVICE_H */