vga: virtio fixes, bitbang i2c asan fix, install ati vgabios.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJdHG0YAAoJEEy22O7T6HE46qAP/1JrYFrl6TolodRhgijmwLsD +7NCxEnYdSQYZUT/GkYIrT3/uHlCrM5UcV/fuTcKULJxGVoEK2bjxG+5dxmy9Cnf j6Urs7Trnb8Ygl2Wx6HYMEwNkkUxmgdyxbmWhElBjVMdOhrGaykKgLRoGITebcGH pDlFhU0J/XwBa6PL4itCeMwRM9ITPYKQ/g+x25QfgyvzZESNJ2zc1WA1eRPhvWSz EfrXa+diV2vyrdG3BFl7IJ/uO/xFFccXSoW6NhvKF+R5NZ/2agzpOF1h5LVuQxLI fGGUqsTcJ8r2/VaXMZD9VmzlCo5V92vpy4Cb7mCzSR8xjt04Utv/RORPlIC5Ierl a1pqVdrc7nEAaS/cvDV9ew0/zDtW97ScxnMhTWN1zDAEEdmhg1v5Tj7/F/JYlZ3x MErytHox8pmbpFgLnazqRepp79W9wjAQjKgHZ8UgnFh+M2IbQ6xo/BfIFUVCGtzb d07ooaZkOxC+fXE7bma4rWmsnSNfTRv83zWHjgbUukTAg7EkkiDlLldifqSnez4G Z6583/xR80SQF9IFUJ8INLKIckxOCzcz2CZfuNsW4IhBdzBpny3YOFwLw+EIFNb5 prVi8xmyPP8UbklK51DbZFl8ILncdywUfW8TuO91noELz/GqJH92uNKR/mmFowsq XhkQc2T2xo7trVRWw+vs =Grh1 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/vga-20190703-pull-request' into staging vga: virtio fixes, bitbang i2c asan fix, install ati vgabios. # gpg: Signature made Wed 03 Jul 2019 09:53:44 BST # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full] # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" [full] # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full] # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/vga-20190703-pull-request: Add ati vgabios to INSTALL_BLOBS. hw/i2c/bitbang_i2c: Use in-place rather than malloc'd bitbang_i2c_interface struct virtio-gpu: check if the resource already exists in virtio_gpu_load() virtio-gpu: fix unmap in error path Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
f0577c616c
2
Makefile
2
Makefile
@ -750,7 +750,7 @@ bepo cz
|
||||
ifdef INSTALL_BLOBS
|
||||
BLOBS=bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
|
||||
vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
|
||||
vgabios-ramfb.bin vgabios-bochs-display.bin \
|
||||
vgabios-ramfb.bin vgabios-bochs-display.bin vgabios-ati.bin \
|
||||
ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
|
||||
pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
|
||||
pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
|
||||
|
@ -538,7 +538,7 @@ static void ati_mm_write(void *opaque, hwaddr addr,
|
||||
break;
|
||||
case GPIO_DVI_DDC:
|
||||
if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) {
|
||||
s->regs.gpio_dvi_ddc = ati_i2c(s->bbi2c, data, 0);
|
||||
s->regs.gpio_dvi_ddc = ati_i2c(&s->bbi2c, data, 0);
|
||||
}
|
||||
break;
|
||||
case GPIO_MONID ... GPIO_MONID + 3:
|
||||
@ -554,7 +554,7 @@ static void ati_mm_write(void *opaque, hwaddr addr,
|
||||
*/
|
||||
if ((s->regs.gpio_monid & BIT(25)) &&
|
||||
addr <= GPIO_MONID + 2 && addr + size > GPIO_MONID + 2) {
|
||||
s->regs.gpio_monid = ati_i2c(s->bbi2c, s->regs.gpio_monid, 1);
|
||||
s->regs.gpio_monid = ati_i2c(&s->bbi2c, s->regs.gpio_monid, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -856,7 +856,7 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp)
|
||||
|
||||
/* ddc, edid */
|
||||
I2CBus *i2cbus = i2c_init_bus(DEVICE(s), "ati-vga.ddc");
|
||||
s->bbi2c = bitbang_i2c_init(i2cbus);
|
||||
bitbang_i2c_init(&s->bbi2c, i2cbus);
|
||||
I2CSlave *i2cddc = I2C_SLAVE(qdev_create(BUS(i2cbus), TYPE_I2CDDC));
|
||||
i2c_set_slave_address(i2cddc, 0x50);
|
||||
|
||||
@ -885,7 +885,6 @@ static void ati_vga_exit(PCIDevice *dev)
|
||||
ATIVGAState *s = ATI_VGA(dev);
|
||||
|
||||
graphic_console_close(s->vga.con);
|
||||
g_free(s->bbi2c);
|
||||
}
|
||||
|
||||
static Property ati_vga_properties[] = {
|
||||
|
@ -88,7 +88,7 @@ typedef struct ATIVGAState {
|
||||
uint16_t cursor_size;
|
||||
uint32_t cursor_offset;
|
||||
QEMUCursor *cursor;
|
||||
bitbang_i2c_interface *bbi2c;
|
||||
bitbang_i2c_interface bbi2c;
|
||||
MemoryRegion io;
|
||||
MemoryRegion mm;
|
||||
ATIVGARegs regs;
|
||||
|
@ -1002,6 +1002,11 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
||||
|
||||
resource_id = qemu_get_be32(f);
|
||||
while (resource_id != 0) {
|
||||
res = virtio_gpu_find_resource(g, resource_id);
|
||||
if (res) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
res = g_new0(struct virtio_gpu_simple_resource, 1);
|
||||
res->resource_id = resource_id;
|
||||
res->width = qemu_get_be32(f);
|
||||
@ -1048,9 +1053,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
|
||||
if (res->iov[i].iov_base) {
|
||||
dma_memory_unmap(VIRTIO_DEVICE(g)->dma_as,
|
||||
res->iov[i].iov_base,
|
||||
res->iov[i].iov_len,
|
||||
len,
|
||||
DMA_DIRECTION_TO_DEVICE,
|
||||
res->iov[i].iov_len);
|
||||
0);
|
||||
}
|
||||
/* ...and the mappings for previous loop iterations */
|
||||
res->iov_cnt = i;
|
||||
|
@ -25,39 +25,6 @@ do { printf("bitbang_i2c: " fmt , ## __VA_ARGS__); } while (0)
|
||||
#define DPRINTF(fmt, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
typedef enum bitbang_i2c_state {
|
||||
STOPPED = 0,
|
||||
SENDING_BIT7,
|
||||
SENDING_BIT6,
|
||||
SENDING_BIT5,
|
||||
SENDING_BIT4,
|
||||
SENDING_BIT3,
|
||||
SENDING_BIT2,
|
||||
SENDING_BIT1,
|
||||
SENDING_BIT0,
|
||||
WAITING_FOR_ACK,
|
||||
RECEIVING_BIT7,
|
||||
RECEIVING_BIT6,
|
||||
RECEIVING_BIT5,
|
||||
RECEIVING_BIT4,
|
||||
RECEIVING_BIT3,
|
||||
RECEIVING_BIT2,
|
||||
RECEIVING_BIT1,
|
||||
RECEIVING_BIT0,
|
||||
SENDING_ACK,
|
||||
SENT_NACK
|
||||
} bitbang_i2c_state;
|
||||
|
||||
struct bitbang_i2c_interface {
|
||||
I2CBus *bus;
|
||||
bitbang_i2c_state state;
|
||||
int last_data;
|
||||
int last_clock;
|
||||
int device_out;
|
||||
uint8_t buffer;
|
||||
int current_addr;
|
||||
};
|
||||
|
||||
static void bitbang_i2c_enter_stop(bitbang_i2c_interface *i2c)
|
||||
{
|
||||
DPRINTF("STOP\n");
|
||||
@ -184,18 +151,12 @@ int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level)
|
||||
abort();
|
||||
}
|
||||
|
||||
bitbang_i2c_interface *bitbang_i2c_init(I2CBus *bus)
|
||||
void bitbang_i2c_init(bitbang_i2c_interface *s, I2CBus *bus)
|
||||
{
|
||||
bitbang_i2c_interface *s;
|
||||
|
||||
s = g_malloc0(sizeof(bitbang_i2c_interface));
|
||||
|
||||
s->bus = bus;
|
||||
s->last_data = 1;
|
||||
s->last_clock = 1;
|
||||
s->device_out = 1;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/* GPIO interface. */
|
||||
@ -207,7 +168,7 @@ typedef struct GPIOI2CState {
|
||||
SysBusDevice parent_obj;
|
||||
|
||||
MemoryRegion dummy_iomem;
|
||||
bitbang_i2c_interface *bitbang;
|
||||
bitbang_i2c_interface bitbang;
|
||||
int last_level;
|
||||
qemu_irq out;
|
||||
} GPIOI2CState;
|
||||
@ -216,7 +177,7 @@ static void bitbang_i2c_gpio_set(void *opaque, int irq, int level)
|
||||
{
|
||||
GPIOI2CState *s = opaque;
|
||||
|
||||
level = bitbang_i2c_set(s->bitbang, irq, level);
|
||||
level = bitbang_i2c_set(&s->bitbang, irq, level);
|
||||
if (level != s->last_level) {
|
||||
s->last_level = level;
|
||||
qemu_set_irq(s->out, level);
|
||||
@ -234,7 +195,7 @@ static void gpio_i2c_init(Object *obj)
|
||||
sysbus_init_mmio(sbd, &s->dummy_iomem);
|
||||
|
||||
bus = i2c_init_bus(dev, "i2c");
|
||||
s->bitbang = bitbang_i2c_init(bus);
|
||||
bitbang_i2c_init(&s->bitbang, bus);
|
||||
|
||||
qdev_init_gpio_in(dev, bitbang_i2c_gpio_set, 2);
|
||||
qdev_init_gpio_out(dev, &s->out, 1);
|
||||
|
@ -311,9 +311,9 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value,
|
||||
case IIC_DIRECTCNTL:
|
||||
i2c->directcntl = value & (IIC_DIRECTCNTL_SDAC & IIC_DIRECTCNTL_SCLC);
|
||||
i2c->directcntl |= (value & IIC_DIRECTCNTL_SCLC ? 1 : 0);
|
||||
bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SCL,
|
||||
bitbang_i2c_set(&i2c->bitbang, BITBANG_I2C_SCL,
|
||||
i2c->directcntl & IIC_DIRECTCNTL_MSCL);
|
||||
i2c->directcntl |= bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SDA,
|
||||
i2c->directcntl |= bitbang_i2c_set(&i2c->bitbang, BITBANG_I2C_SDA,
|
||||
(value & IIC_DIRECTCNTL_SDAC) != 0) << 1;
|
||||
break;
|
||||
default:
|
||||
@ -347,7 +347,7 @@ static void ppc4xx_i2c_init(Object *o)
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq);
|
||||
s->bus = i2c_init_bus(DEVICE(s), "i2c");
|
||||
s->bitbang = bitbang_i2c_init(s->bus);
|
||||
bitbang_i2c_init(&s->bitbang, s->bus);
|
||||
}
|
||||
|
||||
static void ppc4xx_i2c_class_init(ObjectClass *klass, void *data)
|
||||
|
@ -35,7 +35,7 @@ typedef struct VersatileI2CState {
|
||||
SysBusDevice parent_obj;
|
||||
|
||||
MemoryRegion iomem;
|
||||
bitbang_i2c_interface *bitbang;
|
||||
bitbang_i2c_interface bitbang;
|
||||
int out;
|
||||
int in;
|
||||
} VersatileI2CState;
|
||||
@ -70,8 +70,8 @@ static void versatile_i2c_write(void *opaque, hwaddr offset,
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Bad offset 0x%x\n", __func__, (int)offset);
|
||||
}
|
||||
bitbang_i2c_set(s->bitbang, BITBANG_I2C_SCL, (s->out & 1) != 0);
|
||||
s->in = bitbang_i2c_set(s->bitbang, BITBANG_I2C_SDA, (s->out & 2) != 0);
|
||||
bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SCL, (s->out & 1) != 0);
|
||||
s->in = bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SDA, (s->out & 2) != 0);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps versatile_i2c_ops = {
|
||||
@ -88,7 +88,7 @@ static void versatile_i2c_init(Object *obj)
|
||||
I2CBus *bus;
|
||||
|
||||
bus = i2c_init_bus(dev, "i2c");
|
||||
s->bitbang = bitbang_i2c_init(bus);
|
||||
bitbang_i2c_init(&s->bitbang, bus);
|
||||
memory_region_init_io(&s->iomem, obj, &versatile_i2c_ops, s,
|
||||
"versatile_i2c", 0x1000);
|
||||
sysbus_init_mmio(sbd, &s->iomem);
|
||||
|
@ -8,7 +8,43 @@ typedef struct bitbang_i2c_interface bitbang_i2c_interface;
|
||||
#define BITBANG_I2C_SDA 0
|
||||
#define BITBANG_I2C_SCL 1
|
||||
|
||||
bitbang_i2c_interface *bitbang_i2c_init(I2CBus *bus);
|
||||
typedef enum bitbang_i2c_state {
|
||||
STOPPED = 0,
|
||||
SENDING_BIT7,
|
||||
SENDING_BIT6,
|
||||
SENDING_BIT5,
|
||||
SENDING_BIT4,
|
||||
SENDING_BIT3,
|
||||
SENDING_BIT2,
|
||||
SENDING_BIT1,
|
||||
SENDING_BIT0,
|
||||
WAITING_FOR_ACK,
|
||||
RECEIVING_BIT7,
|
||||
RECEIVING_BIT6,
|
||||
RECEIVING_BIT5,
|
||||
RECEIVING_BIT4,
|
||||
RECEIVING_BIT3,
|
||||
RECEIVING_BIT2,
|
||||
RECEIVING_BIT1,
|
||||
RECEIVING_BIT0,
|
||||
SENDING_ACK,
|
||||
SENT_NACK
|
||||
} bitbang_i2c_state;
|
||||
|
||||
struct bitbang_i2c_interface {
|
||||
I2CBus *bus;
|
||||
bitbang_i2c_state state;
|
||||
int last_data;
|
||||
int last_clock;
|
||||
int device_out;
|
||||
uint8_t buffer;
|
||||
int current_addr;
|
||||
};
|
||||
|
||||
/**
|
||||
* bitbang_i2c_init: in-place initialize the bitbang_i2c_interface struct
|
||||
*/
|
||||
void bitbang_i2c_init(bitbang_i2c_interface *s, I2CBus *bus);
|
||||
int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level);
|
||||
|
||||
#endif
|
||||
|
@ -41,7 +41,7 @@ typedef struct PPC4xxI2CState {
|
||||
I2CBus *bus;
|
||||
qemu_irq irq;
|
||||
MemoryRegion iomem;
|
||||
bitbang_i2c_interface *bitbang;
|
||||
bitbang_i2c_interface bitbang;
|
||||
int mdidx;
|
||||
uint8_t mdata[4];
|
||||
uint8_t lmadr;
|
||||
|
Loading…
Reference in New Issue
Block a user