|
@@ -39,15 +39,7 @@
|
|
#include "qemu/range.h"
|
|
#include "qemu/range.h"
|
|
#include "ui/pixel_ops.h"
|
|
#include "ui/pixel_ops.h"
|
|
#include "qemu/bswap.h"
|
|
#include "qemu/bswap.h"
|
|
-
|
|
|
|
-/*#define DEBUG_SM501*/
|
|
|
|
-/*#define DEBUG_BITBLT*/
|
|
|
|
-
|
|
|
|
-#ifdef DEBUG_SM501
|
|
|
|
-#define SM501_DPRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__)
|
|
|
|
-#else
|
|
|
|
-#define SM501_DPRINTF(fmt, ...) do {} while (0)
|
|
|
|
-#endif
|
|
|
|
|
|
+#include "trace.h"
|
|
|
|
|
|
#define MMIO_BASE_OFFSET 0x3e00000
|
|
#define MMIO_BASE_OFFSET 0x3e00000
|
|
#define MMIO_SIZE 0x200000
|
|
#define MMIO_SIZE 0x200000
|
|
@@ -871,7 +863,6 @@ static uint64_t sm501_system_config_read(void *opaque, hwaddr addr,
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
uint32_t ret = 0;
|
|
uint32_t ret = 0;
|
|
- SM501_DPRINTF("sm501 system config regs : read addr=%x\n", (int)addr);
|
|
|
|
|
|
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_SYSTEM_CONTROL:
|
|
case SM501_SYSTEM_CONTROL:
|
|
@@ -923,7 +914,7 @@ static uint64_t sm501_system_config_read(void *opaque, hwaddr addr,
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented system config"
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented system config"
|
|
"register read. addr=%" HWADDR_PRIx "\n", addr);
|
|
"register read. addr=%" HWADDR_PRIx "\n", addr);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ trace_sm501_system_config_read(addr, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -931,9 +922,8 @@ static void sm501_system_config_write(void *opaque, hwaddr addr,
|
|
uint64_t value, unsigned size)
|
|
uint64_t value, unsigned size)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 system config regs : write addr=%x, val=%x\n",
|
|
|
|
- (uint32_t)addr, (uint32_t)value);
|
|
|
|
|
|
|
|
|
|
+ trace_sm501_system_config_write((uint32_t)addr, (uint32_t)value);
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_SYSTEM_CONTROL:
|
|
case SM501_SYSTEM_CONTROL:
|
|
s->system_control &= 0x10DB0000;
|
|
s->system_control &= 0x10DB0000;
|
|
@@ -1019,9 +1009,7 @@ static uint64_t sm501_i2c_read(void *opaque, hwaddr addr, unsigned size)
|
|
qemu_log_mask(LOG_UNIMP, "sm501 i2c : not implemented register read."
|
|
qemu_log_mask(LOG_UNIMP, "sm501 i2c : not implemented register read."
|
|
" addr=0x%" HWADDR_PRIx "\n", addr);
|
|
" addr=0x%" HWADDR_PRIx "\n", addr);
|
|
}
|
|
}
|
|
-
|
|
|
|
- SM501_DPRINTF("sm501 i2c regs : read addr=%" HWADDR_PRIx " val=%x\n",
|
|
|
|
- addr, ret);
|
|
|
|
|
|
+ trace_sm501_i2c_read((uint32_t)addr, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1029,9 +1017,8 @@ static void sm501_i2c_write(void *opaque, hwaddr addr, uint64_t value,
|
|
unsigned size)
|
|
unsigned size)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 i2c regs : write addr=%" HWADDR_PRIx
|
|
|
|
- " val=%" PRIx64 "\n", addr, value);
|
|
|
|
|
|
|
|
|
|
+ trace_sm501_i2c_write((uint32_t)addr, (uint32_t)value);
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_I2C_BYTE_COUNT:
|
|
case SM501_I2C_BYTE_COUNT:
|
|
s->i2c_byte_count = value & 0xf;
|
|
s->i2c_byte_count = value & 0xf;
|
|
@@ -1045,25 +1032,19 @@ static void sm501_i2c_write(void *opaque, hwaddr addr, uint64_t value,
|
|
s->i2c_status |= (res ? SM501_I2C_STATUS_ERROR : 0);
|
|
s->i2c_status |= (res ? SM501_I2C_STATUS_ERROR : 0);
|
|
if (!res) {
|
|
if (!res) {
|
|
int i;
|
|
int i;
|
|
- SM501_DPRINTF("sm501 i2c : transferring %d bytes to 0x%x\n",
|
|
|
|
- s->i2c_byte_count + 1, s->i2c_addr >> 1);
|
|
|
|
for (i = 0; i <= s->i2c_byte_count; i++) {
|
|
for (i = 0; i <= s->i2c_byte_count; i++) {
|
|
res = i2c_send_recv(s->i2c_bus, &s->i2c_data[i],
|
|
res = i2c_send_recv(s->i2c_bus, &s->i2c_data[i],
|
|
!(s->i2c_addr & 1));
|
|
!(s->i2c_addr & 1));
|
|
if (res) {
|
|
if (res) {
|
|
- SM501_DPRINTF("sm501 i2c : transfer failed"
|
|
|
|
- " i=%d, res=%d\n", i, res);
|
|
|
|
s->i2c_status |= SM501_I2C_STATUS_ERROR;
|
|
s->i2c_status |= SM501_I2C_STATUS_ERROR;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (i) {
|
|
if (i) {
|
|
- SM501_DPRINTF("sm501 i2c : transferred %d bytes\n", i);
|
|
|
|
s->i2c_status = SM501_I2C_STATUS_COMPLETE;
|
|
s->i2c_status = SM501_I2C_STATUS_COMPLETE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- SM501_DPRINTF("sm501 i2c : end transfer\n");
|
|
|
|
i2c_end_transfer(s->i2c_bus);
|
|
i2c_end_transfer(s->i2c_bus);
|
|
s->i2c_status &= ~SM501_I2C_STATUS_ERROR;
|
|
s->i2c_status &= ~SM501_I2C_STATUS_ERROR;
|
|
}
|
|
}
|
|
@@ -1103,7 +1084,8 @@ static const MemoryRegionOps sm501_i2c_ops = {
|
|
static uint32_t sm501_palette_read(void *opaque, hwaddr addr)
|
|
static uint32_t sm501_palette_read(void *opaque, hwaddr addr)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 palette read addr=%x\n", (int)addr);
|
|
|
|
|
|
+
|
|
|
|
+ trace_sm501_palette_read((uint32_t)addr);
|
|
|
|
|
|
/* TODO : consider BYTE/WORD access */
|
|
/* TODO : consider BYTE/WORD access */
|
|
/* TODO : consider endian */
|
|
/* TODO : consider endian */
|
|
@@ -1116,8 +1098,8 @@ static void sm501_palette_write(void *opaque, hwaddr addr,
|
|
uint32_t value)
|
|
uint32_t value)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 palette write addr=%x, val=%x\n",
|
|
|
|
- (int)addr, value);
|
|
|
|
|
|
+
|
|
|
|
+ trace_sm501_palette_write((uint32_t)addr, value);
|
|
|
|
|
|
/* TODO : consider BYTE/WORD access */
|
|
/* TODO : consider BYTE/WORD access */
|
|
/* TODO : consider endian */
|
|
/* TODO : consider endian */
|
|
@@ -1132,7 +1114,6 @@ static uint64_t sm501_disp_ctrl_read(void *opaque, hwaddr addr,
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
uint32_t ret = 0;
|
|
uint32_t ret = 0;
|
|
- SM501_DPRINTF("sm501 disp ctrl regs : read addr=%x\n", (int)addr);
|
|
|
|
|
|
|
|
switch (addr) {
|
|
switch (addr) {
|
|
|
|
|
|
@@ -1237,7 +1218,7 @@ static uint64_t sm501_disp_ctrl_read(void *opaque, hwaddr addr,
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented disp ctrl register "
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented disp ctrl register "
|
|
"read. addr=%" HWADDR_PRIx "\n", addr);
|
|
"read. addr=%" HWADDR_PRIx "\n", addr);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ trace_sm501_disp_ctrl_read((uint32_t)addr, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1245,9 +1226,8 @@ static void sm501_disp_ctrl_write(void *opaque, hwaddr addr,
|
|
uint64_t value, unsigned size)
|
|
uint64_t value, unsigned size)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 disp ctrl regs : write addr=%x, val=%x\n",
|
|
|
|
- (unsigned)addr, (unsigned)value);
|
|
|
|
|
|
|
|
|
|
+ trace_sm501_disp_ctrl_write((uint32_t)addr, (uint32_t)value);
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_DC_PANEL_CONTROL:
|
|
case SM501_DC_PANEL_CONTROL:
|
|
s->dc_panel_control = value & 0x0FFF73FF;
|
|
s->dc_panel_control = value & 0x0FFF73FF;
|
|
@@ -1392,7 +1372,6 @@ static uint64_t sm501_2d_engine_read(void *opaque, hwaddr addr,
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
uint32_t ret = 0;
|
|
uint32_t ret = 0;
|
|
- SM501_DPRINTF("sm501 2d engine regs : read addr=%x\n", (int)addr);
|
|
|
|
|
|
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_2D_SOURCE:
|
|
case SM501_2D_SOURCE:
|
|
@@ -1462,7 +1441,7 @@ static uint64_t sm501_2d_engine_read(void *opaque, hwaddr addr,
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented disp ctrl register "
|
|
qemu_log_mask(LOG_UNIMP, "sm501: not implemented disp ctrl register "
|
|
"read. addr=%" HWADDR_PRIx "\n", addr);
|
|
"read. addr=%" HWADDR_PRIx "\n", addr);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ trace_sm501_2d_engine_read((uint32_t)addr, ret);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1470,9 +1449,8 @@ static void sm501_2d_engine_write(void *opaque, hwaddr addr,
|
|
uint64_t value, unsigned size)
|
|
uint64_t value, unsigned size)
|
|
{
|
|
{
|
|
SM501State *s = (SM501State *)opaque;
|
|
SM501State *s = (SM501State *)opaque;
|
|
- SM501_DPRINTF("sm501 2d engine regs : write addr=%x, val=%x\n",
|
|
|
|
- (unsigned)addr, (unsigned)value);
|
|
|
|
|
|
|
|
|
|
+ trace_sm501_2d_engine_write((uint32_t)addr, (uint32_t)value);
|
|
switch (addr) {
|
|
switch (addr) {
|
|
case SM501_2D_SOURCE:
|
|
case SM501_2D_SOURCE:
|
|
s->twoD_source = value;
|
|
s->twoD_source = value;
|
|
@@ -1830,8 +1808,6 @@ static void sm501_init(SM501State *s, DeviceState *dev,
|
|
uint32_t local_mem_bytes)
|
|
uint32_t local_mem_bytes)
|
|
{
|
|
{
|
|
s->local_mem_size_index = get_local_mem_size_index(local_mem_bytes);
|
|
s->local_mem_size_index = get_local_mem_size_index(local_mem_bytes);
|
|
- SM501_DPRINTF("sm501 local mem size=%x. index=%d\n", get_local_mem_size(s),
|
|
|
|
- s->local_mem_size_index);
|
|
|
|
|
|
|
|
/* local memory */
|
|
/* local memory */
|
|
memory_region_init_ram(&s->local_mem_region, OBJECT(dev), "sm501.local",
|
|
memory_region_init_ram(&s->local_mem_region, OBJECT(dev), "sm501.local",
|