target-arm queue:

* fix a wrong variable type for A64 SYS_HEAPINFO semihosting call
  * xlnx_dp: fix iffy xlnx_dp_aux_push_tx_fifo
  * aux: fix break that wanted to break two levels out
  * aux: Rename aux.[ch] to auxbus.[ch] for the benefit of Windows
  * hw/block/m25p80: fix resource leak
  * i.MX: split the GPT timer implementation into per SOC definitions
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJXfl2ZAAoJEDwlJe0UNgzeQx0P/15MNaL0oWCEAqowiqr5dNb1
 NTFE41NZprRmUcLIGzL28xekWLKZyZRawAoQJbFFTFhm6dkYdQuq1p9Y12nM+SS4
 rUPe3CjUNaK0JC1A2ObKuuP7891C5/gBP1m67p0rVkhmsxZpPhmftuDSPRNT3XaQ
 2y4uyEr+YCoCA684VkOMgqx+Nw9v1mZaDcbjPoQ97U00+wJ9I9lh5Z3jITV/XpkD
 YWESCC6E9g158tZmcmiaCOe+OCfLqM4mEHK/b6pq82SfMG5m0MRuDw0LTo6oOO2f
 T8UW+WPVhaOUQARYQls93jkrxlVbmf3xZySLUPasEMdUQSdCmy0nVdAxh/w78oxV
 sNGG+TC9XPPGRZiAfp96ccYSqFNzYUT5GYqpycJ+dyc2FzHHfQdez/sYtGsv75cF
 4V/OHHeO+msNj8J5wYhKZTbrBnCPpB/CFxh5tl12YYZDDba/voTgeZt6D259gzVa
 xtvab7dGjbCfs5T5+tbaPhI155DBzhwvTOEfl4JKMRSJeyK3F75iOR/TFXJbzFgO
 NBZpkKWeJaX5zrPFPgwYtI8KyLZtzSgy8c1xYmAKMiqY6f2Hl/E2NMKfIFOUb8h8
 apFG2KAdCkSW9qft2KUExfEdhOmn2ZWrjBxqxLCRbbZK5RnL8+UTEytmZymbmEoi
 QSNtyWgD2hIXILlUfh+S
 =uKU5
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20160707' into staging

target-arm queue:
 * fix a wrong variable type for A64 SYS_HEAPINFO semihosting call
 * xlnx_dp: fix iffy xlnx_dp_aux_push_tx_fifo
 * aux: fix break that wanted to break two levels out
 * aux: Rename aux.[ch] to auxbus.[ch] for the benefit of Windows
 * hw/block/m25p80: fix resource leak
 * i.MX: split the GPT timer implementation into per SOC definitions

# gpg: Signature made Thu 07 Jul 2016 14:48:09 BST
# gpg:                using RSA key 0x3C2525ED14360CDE
# gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>"
# gpg:                 aka "Peter Maydell <pmaydell@gmail.com>"
# gpg:                 aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>"
# Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83  15CF 3C25 25ED 1436 0CDE

* remotes/pmaydell/tags/pull-target-arm-20160707:
  i.MX: split the GPT timer implementation into per SOC definitions
  hw/block/m25p80: fix resource leak
  aux: Rename aux.[ch] to auxbus.[ch] for the benefit of Windows
  aux: fix break that wanted to break two levels out
  xlnx_dp: fix iffy xlnx_dp_aux_push_tx_fifo
  target-arm/arm-semi.c: In SYS_HEAPINFO use correct type for 'limit'

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
master
Peter Maydell 2016-07-07 14:49:38 +01:00
commit 4f4a9ca4a4
15 changed files with 107 additions and 30 deletions

View File

@ -51,7 +51,7 @@ static void fsl_imx25_init(Object *obj)
} }
for (i = 0; i < FSL_IMX25_NUM_GPTS; i++) { for (i = 0; i < FSL_IMX25_NUM_GPTS; i++) {
object_initialize(&s->gpt[i], sizeof(s->gpt[i]), TYPE_IMX_GPT); object_initialize(&s->gpt[i], sizeof(s->gpt[i]), TYPE_IMX25_GPT);
qdev_set_parent_bus(DEVICE(&s->gpt[i]), sysbus_get_default()); qdev_set_parent_bus(DEVICE(&s->gpt[i]), sysbus_get_default());
} }

View File

@ -47,7 +47,7 @@ static void fsl_imx31_init(Object *obj)
qdev_set_parent_bus(DEVICE(&s->uart[i]), sysbus_get_default()); qdev_set_parent_bus(DEVICE(&s->uart[i]), sysbus_get_default());
} }
object_initialize(&s->gpt, sizeof(s->gpt), TYPE_IMX_GPT); object_initialize(&s->gpt, sizeof(s->gpt), TYPE_IMX31_GPT);
qdev_set_parent_bus(DEVICE(&s->gpt), sysbus_get_default()); qdev_set_parent_bus(DEVICE(&s->gpt), sysbus_get_default());
for (i = 0; i < FSL_IMX31_NUM_EPITS; i++) { for (i = 0; i < FSL_IMX31_NUM_EPITS; i++) {

View File

@ -67,7 +67,7 @@ static void fsl_imx6_init(Object *obj)
object_property_add_child(obj, name, OBJECT(&s->uart[i]), NULL); object_property_add_child(obj, name, OBJECT(&s->uart[i]), NULL);
} }
object_initialize(&s->gpt, sizeof(s->gpt), TYPE_IMX_GPT); object_initialize(&s->gpt, sizeof(s->gpt), TYPE_IMX6_GPT);
qdev_set_parent_bus(DEVICE(&s->gpt), sysbus_get_default()); qdev_set_parent_bus(DEVICE(&s->gpt), sysbus_get_default());
object_property_add_child(obj, "gpt", OBJECT(&s->gpt), NULL); object_property_add_child(obj, "gpt", OBJECT(&s->gpt), NULL);

View File

@ -459,12 +459,13 @@ static void blk_sync_complete(void *opaque, int ret)
static void flash_sync_page(Flash *s, int page) static void flash_sync_page(Flash *s, int page)
{ {
QEMUIOVector *iov = g_new(QEMUIOVector, 1); QEMUIOVector *iov;
if (!s->blk || blk_is_read_only(s->blk)) { if (!s->blk || blk_is_read_only(s->blk)) {
return; return;
} }
iov = g_new(QEMUIOVector, 1);
qemu_iovec_init(iov, 1); qemu_iovec_init(iov, 1);
qemu_iovec_add(iov, s->storage + page * s->pi->page_size, qemu_iovec_add(iov, s->storage + page * s->pi->page_size,
s->pi->page_size); s->pi->page_size);
@ -474,13 +475,14 @@ static void flash_sync_page(Flash *s, int page)
static inline void flash_sync_area(Flash *s, int64_t off, int64_t len) static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
{ {
QEMUIOVector *iov = g_new(QEMUIOVector, 1); QEMUIOVector *iov;
if (!s->blk || blk_is_read_only(s->blk)) { if (!s->blk || blk_is_read_only(s->blk)) {
return; return;
} }
assert(!(len % BDRV_SECTOR_SIZE)); assert(!(len % BDRV_SECTOR_SIZE));
iov = g_new(QEMUIOVector, 1);
qemu_iovec_init(iov, 1); qemu_iovec_init(iov, 1);
qemu_iovec_add(iov, s->storage + off, len); qemu_iovec_add(iov, s->storage + off, len);
blk_aio_pwritev(s->blk, off, iov, 0, blk_sync_complete, iov); blk_aio_pwritev(s->blk, off, iov, 0, blk_sync_complete, iov);

View File

@ -28,7 +28,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/misc/aux.h" #include "hw/misc/auxbus.h"
#include "hw/display/dpcd.h" #include "hw/display/dpcd.h"
#ifndef DEBUG_DPCD #ifndef DEBUG_DPCD

View File

@ -438,10 +438,10 @@ static void xlnx_dp_aux_clear_tx_fifo(XlnxDPState *s)
fifo8_reset(&s->tx_fifo); fifo8_reset(&s->tx_fifo);
} }
static void xlnx_dp_aux_push_tx_fifo(XlnxDPState *s, uint8_t val, size_t len) static void xlnx_dp_aux_push_tx_fifo(XlnxDPState *s, uint8_t *buf, size_t len)
{ {
DPRINTF("Push %u data in tx_fifo\n", (unsigned)len); DPRINTF("Push %u data in tx_fifo\n", (unsigned)len);
fifo8_push_all(&s->tx_fifo, &val, len); fifo8_push_all(&s->tx_fifo, buf, len);
} }
static uint8_t xlnx_dp_aux_pop_tx_fifo(XlnxDPState *s) static uint8_t xlnx_dp_aux_pop_tx_fifo(XlnxDPState *s)
@ -806,9 +806,11 @@ static void xlnx_dp_write(void *opaque, hwaddr offset, uint64_t value,
* TODO: Power down things? * TODO: Power down things?
*/ */
break; break;
case DP_AUX_WRITE_FIFO: case DP_AUX_WRITE_FIFO: {
xlnx_dp_aux_push_tx_fifo(s, value, 1); uint8_t c = value;
xlnx_dp_aux_push_tx_fifo(s, &c, 1);
break; break;
}
case DP_AUX_CLOCK_DIVIDER: case DP_AUX_CLOCK_DIVIDER:
break; break;
case DP_AUX_REPLY_COUNT: case DP_AUX_REPLY_COUNT:

View File

@ -51,5 +51,5 @@ obj-$(CONFIG_MIPS_ITU) += mips_itu.o
obj-$(CONFIG_PVPANIC) += pvpanic.o obj-$(CONFIG_PVPANIC) += pvpanic.o
obj-$(CONFIG_EDU) += edu.o obj-$(CONFIG_EDU) += edu.o
obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
obj-$(CONFIG_AUX) += aux.o obj-$(CONFIG_AUX) += auxbus.o
obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o

View File

@ -1,5 +1,5 @@
/* /*
* aux.c * auxbus.c
* *
* Copyright 2015 : GreenSocs Ltd * Copyright 2015 : GreenSocs Ltd
* http://www.greensocs.com/ , email: info@greensocs.com * http://www.greensocs.com/ , email: info@greensocs.com
@ -28,7 +28,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/misc/aux.h" #include "hw/misc/auxbus.h"
#include "hw/i2c/i2c.h" #include "hw/i2c/i2c.h"
#include "monitor/monitor.h" #include "monitor/monitor.h"
@ -153,12 +153,12 @@ AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address,
case WRITE_I2C_MOT: case WRITE_I2C_MOT:
case READ_I2C_MOT: case READ_I2C_MOT:
is_write = cmd == READ_I2C_MOT ? false : true; is_write = cmd == READ_I2C_MOT ? false : true;
ret = AUX_I2C_NACK;
if (!i2c_bus_busy(i2c_bus)) { if (!i2c_bus_busy(i2c_bus)) {
/* /*
* No transactions started.. * No transactions started..
*/ */
if (i2c_start_transfer(i2c_bus, address, is_write)) { if (i2c_start_transfer(i2c_bus, address, is_write)) {
ret = AUX_I2C_NACK;
break; break;
} }
} else if ((address != bus->last_i2c_address) || } else if ((address != bus->last_i2c_address) ||
@ -168,22 +168,22 @@ AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address,
*/ */
i2c_end_transfer(i2c_bus); i2c_end_transfer(i2c_bus);
if (i2c_start_transfer(i2c_bus, address, is_write)) { if (i2c_start_transfer(i2c_bus, address, is_write)) {
ret = AUX_I2C_NACK;
break; break;
} }
} }
bus->last_transaction = cmd;
bus->last_i2c_address = address;
while (len > 0) { while (len > 0) {
if (i2c_send_recv(i2c_bus, data++, is_write) < 0) { if (i2c_send_recv(i2c_bus, data++, is_write) < 0) {
ret = AUX_I2C_NACK;
i2c_end_transfer(i2c_bus); i2c_end_transfer(i2c_bus);
break; break;
} }
len--; len--;
} }
bus->last_transaction = cmd; if (len == 0) {
bus->last_i2c_address = address; ret = AUX_I2C_ACK;
ret = AUX_I2C_ACK; }
break; break;
default: default:
DPRINTF("Not implemented!\n"); DPRINTF("Not implemented!\n");

View File

@ -371,6 +371,12 @@ static uint32_t imx6_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
case CLK_32k: case CLK_32k:
freq = CKIL_FREQ; freq = CKIL_FREQ;
break; break;
case CLK_HIGH:
freq = 24000000;
break;
case CLK_HIGH_DIV:
freq = 24000000 / 8;
break;
default: default:
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: unsupported clock %d\n", qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: unsupported clock %d\n",
TYPE_IMX6_CCM, __func__, clock); TYPE_IMX6_CCM, __func__, clock);

View File

@ -14,7 +14,6 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "hw/timer/imx_gpt.h" #include "hw/timer/imx_gpt.h"
#include "hw/misc/imx_ccm.h"
#include "qemu/main-loop.h" #include "qemu/main-loop.h"
#include "qemu/log.h" #include "qemu/log.h"
@ -81,7 +80,18 @@ static const VMStateDescription vmstate_imx_timer_gpt = {
} }
}; };
static const IMXClk imx_gpt_clocks[] = { static const IMXClk imx25_gpt_clocks[] = {
CLK_NONE, /* 000 No clock source */
CLK_IPG, /* 001 ipg_clk, 532MHz*/
CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */
CLK_NONE, /* 011 not defined */
CLK_32k, /* 100 ipg_clk_32k */
CLK_32k, /* 101 ipg_clk_32k */
CLK_32k, /* 110 ipg_clk_32k */
CLK_32k, /* 111 ipg_clk_32k */
};
static const IMXClk imx31_gpt_clocks[] = {
CLK_NONE, /* 000 No clock source */ CLK_NONE, /* 000 No clock source */
CLK_IPG, /* 001 ipg_clk, 532MHz*/ CLK_IPG, /* 001 ipg_clk, 532MHz*/
CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */ CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */
@ -92,12 +102,23 @@ static const IMXClk imx_gpt_clocks[] = {
CLK_NONE, /* 111 not defined */ CLK_NONE, /* 111 not defined */
}; };
static const IMXClk imx6_gpt_clocks[] = {
CLK_NONE, /* 000 No clock source */
CLK_IPG, /* 001 ipg_clk, 532MHz*/
CLK_IPG_HIGH, /* 010 ipg_clk_highfreq */
CLK_EXT, /* 011 External clock */
CLK_32k, /* 100 ipg_clk_32k */
CLK_HIGH_DIV, /* 101 reference clock / 8 */
CLK_NONE, /* 110 not defined */
CLK_HIGH, /* 111 reference clock */
};
static void imx_gpt_set_freq(IMXGPTState *s) static void imx_gpt_set_freq(IMXGPTState *s)
{ {
uint32_t clksrc = extract32(s->cr, GPT_CR_CLKSRC_SHIFT, 3); uint32_t clksrc = extract32(s->cr, GPT_CR_CLKSRC_SHIFT, 3);
s->freq = imx_ccm_get_clock_frequency(s->ccm, s->freq = imx_ccm_get_clock_frequency(s->ccm,
imx_gpt_clocks[clksrc]) / (1 + s->pr); s->clocks[clksrc]) / (1 + s->pr);
DPRINTF("Setting clksrc %d to frequency %d\n", clksrc, s->freq); DPRINTF("Setting clksrc %d to frequency %d\n", clksrc, s->freq);
@ -453,16 +474,52 @@ static void imx_gpt_class_init(ObjectClass *klass, void *data)
dc->desc = "i.MX general timer"; dc->desc = "i.MX general timer";
} }
static const TypeInfo imx_gpt_info = { static void imx25_gpt_init(Object *obj)
.name = TYPE_IMX_GPT, {
IMXGPTState *s = IMX_GPT(obj);
s->clocks = imx25_gpt_clocks;
}
static void imx31_gpt_init(Object *obj)
{
IMXGPTState *s = IMX_GPT(obj);
s->clocks = imx31_gpt_clocks;
}
static void imx6_gpt_init(Object *obj)
{
IMXGPTState *s = IMX_GPT(obj);
s->clocks = imx6_gpt_clocks;
}
static const TypeInfo imx25_gpt_info = {
.name = TYPE_IMX25_GPT,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(IMXGPTState), .instance_size = sizeof(IMXGPTState),
.instance_init = imx25_gpt_init,
.class_init = imx_gpt_class_init, .class_init = imx_gpt_class_init,
}; };
static const TypeInfo imx31_gpt_info = {
.name = TYPE_IMX31_GPT,
.parent = TYPE_IMX25_GPT,
.instance_init = imx31_gpt_init,
};
static const TypeInfo imx6_gpt_info = {
.name = TYPE_IMX6_GPT,
.parent = TYPE_IMX25_GPT,
.instance_init = imx6_gpt_init,
};
static void imx_gpt_register_types(void) static void imx_gpt_register_types(void)
{ {
type_register_static(&imx_gpt_info); type_register_static(&imx25_gpt_info);
type_register_static(&imx31_gpt_info);
type_register_static(&imx6_gpt_info);
} }
type_init(imx_gpt_register_types) type_init(imx_gpt_register_types)

View File

@ -24,7 +24,7 @@
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "ui/console.h" #include "ui/console.h"
#include "hw/misc/aux.h" #include "hw/misc/auxbus.h"
#include "hw/i2c/i2c.h" #include "hw/i2c/i2c.h"
#include "hw/display/dpcd.h" #include "hw/display/dpcd.h"
#include "hw/i2c/i2c-ddc.h" #include "hw/i2c/i2c-ddc.h"

View File

@ -1,5 +1,5 @@
/* /*
* aux.h * auxbus.h
* *
* Copyright (C)2014 : GreenSocs Ltd * Copyright (C)2014 : GreenSocs Ltd
* http://www.greensocs.com/ , email: info@greensocs.com * http://www.greensocs.com/ , email: info@greensocs.com

View File

@ -46,7 +46,10 @@ typedef enum {
CLK_NONE, CLK_NONE,
CLK_IPG, CLK_IPG,
CLK_IPG_HIGH, CLK_IPG_HIGH,
CLK_32k CLK_32k,
CLK_EXT,
CLK_HIGH_DIV,
CLK_HIGH,
} IMXClk; } IMXClk;
typedef struct IMXCCMClass { typedef struct IMXCCMClass {

View File

@ -74,7 +74,12 @@
#define GPT_IR_OF3IE (1 << 2) #define GPT_IR_OF3IE (1 << 2)
#define GPT_IR_ROVIE (1 << 5) #define GPT_IR_ROVIE (1 << 5)
#define TYPE_IMX_GPT "imx.gpt" #define TYPE_IMX25_GPT "imx25.gpt"
#define TYPE_IMX31_GPT "imx31.gpt"
#define TYPE_IMX6_GPT "imx6.gpt"
#define TYPE_IMX_GPT TYPE_IMX25_GPT
#define IMX_GPT(obj) OBJECT_CHECK(IMXGPTState, (obj), TYPE_IMX_GPT) #define IMX_GPT(obj) OBJECT_CHECK(IMXGPTState, (obj), TYPE_IMX_GPT)
typedef struct IMXGPTState{ typedef struct IMXGPTState{
@ -103,6 +108,8 @@ typedef struct IMXGPTState{
uint32_t freq; uint32_t freq;
qemu_irq irq; qemu_irq irq;
const IMXClk *clocks;
} IMXGPTState; } IMXGPTState;
#endif /* IMX_GPT_H */ #endif /* IMX_GPT_H */

View File

@ -565,7 +565,7 @@ target_ulong do_arm_semihosting(CPUARMState *env)
case TARGET_SYS_HEAPINFO: case TARGET_SYS_HEAPINFO:
{ {
target_ulong retvals[4]; target_ulong retvals[4];
uint32_t limit; target_ulong limit;
int i; int i;
GET_ARG(0); GET_ARG(0);