Lines Matching +full:op +full:- +full:panel

4  * Copyright (c) 2008 Shin-ichiro KAWASAKI
5 * Copyright (c) 2016-2020 BALATON Zoltan
29 #include "qemu/error-report.h"
32 #include "hw/usb/hcd-ohci.h"
33 #include "hw/char/serial-mm.h"
38 #include "hw/qdev-properties.h"
40 #include "hw/display/i2c-ddc.h"
51 /* SM501 register definitions taken from "linux/include/linux/sm501-regs.h" */
156 /* panel clock */
241 /* common registers for panel and the crt */
457 #define get_local_mem_size(s) sm501_mem_local_size[(s)->local_mem_size_index]
576 return (crt ? s->dc_crt_fb_addr : s->dc_panel_fb_addr) & 0x3FFFFF0; in get_fb_addr()
581 int width = crt ? s->dc_crt_h_total : s->dc_panel_h_total; in get_width()
587 int height = crt ? s->dc_crt_v_total : s->dc_panel_v_total; in get_height()
593 int bpp = crt ? s->dc_crt_control : s->dc_panel_control; in get_bpp()
599 * @param crt 0 for PANEL, 1 for CRT.
603 uint32_t addr = crt ? state->dc_crt_hwc_addr : state->dc_panel_hwc_addr; in is_hwc_enabled()
609 * @param crt 0 for PANEL, 1 for CRT.
613 uint32_t addr = crt ? state->dc_crt_hwc_addr : state->dc_panel_hwc_addr; in get_hwc_address()
614 return state->local_mem + (addr & 0x03FFFFF0); in get_hwc_address()
619 * @param crt 0 for PANEL, 1 for CRT.
623 uint32_t location = crt ? state->dc_crt_hwc_location in get_hwc_y()
624 : state->dc_panel_hwc_location; in get_hwc_y()
630 * @param crt 0 for PANEL, 1 for CRT.
634 uint32_t location = crt ? state->dc_crt_hwc_location in get_hwc_x()
635 : state->dc_panel_hwc_location; in get_hwc_x()
641 * @param crt 0 for PANEL, 1 for CRT.
652 color_reg = crt ? state->dc_crt_hwc_color_3 in get_hwc_palette()
653 : state->dc_panel_hwc_color_3; in get_hwc_palette()
655 color_reg = crt ? state->dc_crt_hwc_color_1_2 in get_hwc_palette()
656 : state->dc_panel_hwc_color_1_2; in get_hwc_palette()
681 memory_region_set_dirty(&s->local_mem_region, in hwc_invalidate()
682 get_fb_addr(s, crt) + start, end - start); in hwc_invalidate()
687 int cmd = (s->twoD_control >> 16) & 0x1F; in sm501_2d_operation()
688 int rtl = s->twoD_control & BIT(27); in sm501_2d_operation()
689 int format = (s->twoD_stretch >> 20) & 3; in sm501_2d_operation()
691 int rop_mode = (s->twoD_control >> 15) & 1; /* 1 for rop2, else rop3 */ in sm501_2d_operation()
693 int rop2_source_is_pattern = (s->twoD_control >> 14) & 1; in sm501_2d_operation()
694 int rop = s->twoD_control & 0xFF; in sm501_2d_operation()
695 unsigned int dst_x = (s->twoD_destination >> 16) & 0x01FFF; in sm501_2d_operation()
696 unsigned int dst_y = s->twoD_destination & 0xFFFF; in sm501_2d_operation()
697 unsigned int width = (s->twoD_dimension >> 16) & 0x1FFF; in sm501_2d_operation()
698 unsigned int height = s->twoD_dimension & 0xFFFF; in sm501_2d_operation()
699 uint32_t dst_base = s->twoD_destination_base & 0x03FFFFFF; in sm501_2d_operation()
700 unsigned int dst_pitch = (s->twoD_pitch >> 16) & 0x1FFF; in sm501_2d_operation()
701 int crt = (s->dc_crt_control & SM501_DC_CRT_CONTROL_SEL) ? 1 : 0; in sm501_2d_operation()
705 if ((s->twoD_stretch >> 16) & 0xF) { in sm501_2d_operation()
710 if (s->twoD_source_base & BIT(27) || s->twoD_destination_base & BIT(27)) { in sm501_2d_operation()
721 qemu_log_mask(LOG_GUEST_ERROR, "sm501: Zero size 2D op.\n"); in sm501_2d_operation()
726 dst_x -= width - 1; in sm501_2d_operation()
727 dst_y -= height - 1; in sm501_2d_operation()
733 qemu_log_mask(LOG_GUEST_ERROR, "sm501: 2D op dest is outside vram.\n"); in sm501_2d_operation()
740 unsigned int src_x = (s->twoD_source >> 16) & 0x01FFF; in sm501_2d_operation()
741 unsigned int src_y = s->twoD_source & 0xFFFF; in sm501_2d_operation()
742 uint32_t src_base = s->twoD_source_base & 0x03FFFFFF; in sm501_2d_operation()
743 unsigned int src_pitch = s->twoD_pitch & 0x1FFF; in sm501_2d_operation()
751 src_x -= width - 1; in sm501_2d_operation()
752 src_y -= height - 1; in sm501_2d_operation()
759 "sm501: 2D op src is outside vram.\n"); in sm501_2d_operation()
766 uint8_t *d = s->local_mem + dst_base; in sm501_2d_operation()
777 uint8_t *sp = s->local_mem + src_base; in sm501_2d_operation()
778 uint8_t *d = s->local_mem + dst_base; in sm501_2d_operation()
791 uint8_t *sp = s->local_mem + src_base; in sm501_2d_operation()
792 uint8_t *d = s->local_mem + dst_base; in sm501_2d_operation()
807 "sm501: rop%d op %x%s not implemented\n", in sm501_2d_operation()
812 /* Ignore no-op blits, some guests seem to do this */ in sm501_2d_operation()
821 stn_he_p(&s->local_mem[dst_base + di], bypp, in sm501_2d_operation()
822 ldn_he_p(&s->local_mem[src_base + si], bypp)); in sm501_2d_operation()
832 se = sb + (width + (height - 1) * src_pitch) * bypp; in sm501_2d_operation()
834 de = db + (width + (height - 1) * dst_pitch) * bypp; in sm501_2d_operation()
838 if (overlap && (s->use_pixman & BIT(2))) { in sm501_2d_operation()
847 fallback = !pixman_blt((uint32_t *)&s->local_mem[src_base], in sm501_2d_operation()
855 (uint32_t *)&s->local_mem[dst_base], in sm501_2d_operation()
864 } else if (!overlap && (s->use_pixman & BIT(1))) { in sm501_2d_operation()
865 fallback = !pixman_blt((uint32_t *)&s->local_mem[src_base], in sm501_2d_operation()
866 (uint32_t *)&s->local_mem[dst_base], in sm501_2d_operation()
877 uint8_t *sp = s->local_mem + src_base; in sm501_2d_operation()
878 uint8_t *d = s->local_mem + dst_base; in sm501_2d_operation()
882 i = (dst_y + height - 1 - y) * dst_pitch; in sm501_2d_operation()
884 j = (src_y + height - 1 - y) * src_pitch; in sm501_2d_operation()
899 uint32_t color = s->twoD_foreground; in sm501_2d_operation()
908 if (!(s->use_pixman & BIT(0)) || (width == 1 && height == 1) || in sm501_2d_operation()
909 !pixman_fill((uint32_t *)&s->local_mem[dst_base], in sm501_2d_operation()
915 uint8_t *d = s->local_mem + dst_base; in sm501_2d_operation()
934 int dst_len = MIN(fb_len, ((dst_y + height - 1) * dst_pitch + in sm501_2d_operation()
937 memory_region_set_dirty(&s->local_mem_region, dst_base, dst_len); in sm501_2d_operation()
950 ret = s->system_control; in sm501_system_config_read()
953 ret = s->misc_control; in sm501_system_config_read()
956 ret = s->gpio_31_0_control; in sm501_system_config_read()
959 ret = s->gpio_63_32_control; in sm501_system_config_read()
965 ret = (s->dram_control & 0x07F107C0) | s->local_mem_size_index << 13; in sm501_system_config_read()
968 ret = s->arbitration_control; in sm501_system_config_read()
974 ret = s->irq_mask; in sm501_system_config_read()
978 ret = s->misc_timing; in sm501_system_config_read()
988 ret = s->power_mode_control; in sm501_system_config_read()
1010 s->system_control &= 0x10DB0000; in sm501_system_config_write()
1011 s->system_control |= value & 0xEF00B8F7; in sm501_system_config_write()
1014 s->misc_control &= 0xEF; in sm501_system_config_write()
1015 s->misc_control |= value & 0xFF7FFF10; in sm501_system_config_write()
1018 s->gpio_31_0_control = value; in sm501_system_config_write()
1021 s->gpio_63_32_control = value & 0xFF80FFFF; in sm501_system_config_write()
1024 s->local_mem_size_index = (value >> 13) & 0x7; in sm501_system_config_write()
1026 s->dram_control &= 0x80000000; in sm501_system_config_write()
1027 s->dram_control |= value & 0x7FFFFFC3; in sm501_system_config_write()
1030 s->arbitration_control = value & 0x37777777; in sm501_system_config_write()
1033 s->irq_mask = value & 0xFFDF3F5F; in sm501_system_config_write()
1036 s->misc_timing = value & 0xF31F1FFF; in sm501_system_config_write()
1045 s->power_mode_control = value & 0x00000003; in sm501_system_config_write()
1078 ret = s->i2c_byte_count; in sm501_i2c_read()
1081 ret = s->i2c_status; in sm501_i2c_read()
1084 ret = s->i2c_addr; in sm501_i2c_read()
1087 ret = s->i2c_data[addr - SM501_I2C_DATA]; in sm501_i2c_read()
1105 s->i2c_byte_count = value & 0xf; in sm501_i2c_write()
1110 bool is_recv = s->i2c_addr & 1; in sm501_i2c_write()
1111 int res = i2c_start_transfer(s->i2c_bus, in sm501_i2c_write()
1112 s->i2c_addr >> 1, in sm501_i2c_write()
1115 s->i2c_status |= SM501_I2C_STATUS_ERROR; in sm501_i2c_write()
1118 for (i = 0; i <= s->i2c_byte_count; i++) { in sm501_i2c_write()
1120 s->i2c_data[i] = i2c_recv(s->i2c_bus); in sm501_i2c_write()
1121 } else if (i2c_send(s->i2c_bus, s->i2c_data[i]) < 0) { in sm501_i2c_write()
1122 s->i2c_status |= SM501_I2C_STATUS_ERROR; in sm501_i2c_write()
1127 s->i2c_status = SM501_I2C_STATUS_COMPLETE; in sm501_i2c_write()
1131 i2c_end_transfer(s->i2c_bus); in sm501_i2c_write()
1132 s->i2c_status &= ~SM501_I2C_STATUS_ERROR; in sm501_i2c_write()
1138 s->i2c_status &= ~SM501_I2C_STATUS_ERROR; in sm501_i2c_write()
1142 s->i2c_addr = value & 0xff; in sm501_i2c_write()
1145 s->i2c_data[addr - SM501_I2C_DATA] = value & 0xff; in sm501_i2c_write()
1177 return *(uint32_t *)&s->dc_palette[addr]; in sm501_palette_read()
1191 *(uint32_t *)&s->dc_palette[addr] = value; in sm501_palette_write()
1192 s->do_full_update = true; in sm501_palette_write()
1204 ret = s->dc_panel_control; in sm501_disp_ctrl_read()
1207 ret = s->dc_panel_panning_control; in sm501_disp_ctrl_read()
1213 ret = s->dc_panel_fb_addr; in sm501_disp_ctrl_read()
1216 ret = s->dc_panel_fb_offset; in sm501_disp_ctrl_read()
1219 ret = s->dc_panel_fb_width; in sm501_disp_ctrl_read()
1222 ret = s->dc_panel_fb_height; in sm501_disp_ctrl_read()
1225 ret = s->dc_panel_tl_location; in sm501_disp_ctrl_read()
1228 ret = s->dc_panel_br_location; in sm501_disp_ctrl_read()
1232 ret = s->dc_panel_h_total; in sm501_disp_ctrl_read()
1235 ret = s->dc_panel_h_sync; in sm501_disp_ctrl_read()
1238 ret = s->dc_panel_v_total; in sm501_disp_ctrl_read()
1241 ret = s->dc_panel_v_sync; in sm501_disp_ctrl_read()
1245 ret = s->dc_panel_hwc_addr; in sm501_disp_ctrl_read()
1248 ret = s->dc_panel_hwc_location; in sm501_disp_ctrl_read()
1251 ret = s->dc_panel_hwc_color_1_2; in sm501_disp_ctrl_read()
1254 ret = s->dc_panel_hwc_color_3; in sm501_disp_ctrl_read()
1258 ret = s->dc_video_control; in sm501_disp_ctrl_read()
1262 ret = s->dc_crt_control; in sm501_disp_ctrl_read()
1265 ret = s->dc_crt_fb_addr; in sm501_disp_ctrl_read()
1268 ret = s->dc_crt_fb_offset; in sm501_disp_ctrl_read()
1271 ret = s->dc_crt_h_total; in sm501_disp_ctrl_read()
1274 ret = s->dc_crt_h_sync; in sm501_disp_ctrl_read()
1277 ret = s->dc_crt_v_total; in sm501_disp_ctrl_read()
1280 ret = s->dc_crt_v_sync; in sm501_disp_ctrl_read()
1284 ret = s->dc_crt_hwc_addr; in sm501_disp_ctrl_read()
1287 ret = s->dc_crt_hwc_location; in sm501_disp_ctrl_read()
1290 ret = s->dc_crt_hwc_color_1_2; in sm501_disp_ctrl_read()
1293 ret = s->dc_crt_hwc_color_3; in sm501_disp_ctrl_read()
1296 case SM501_DC_PANEL_PALETTE ... SM501_DC_PANEL_PALETTE + 0x400 * 3 - 4: in sm501_disp_ctrl_read()
1297 ret = sm501_palette_read(opaque, addr - SM501_DC_PANEL_PALETTE); in sm501_disp_ctrl_read()
1316 s->dc_panel_control = value & 0x0FFF73FF; in sm501_disp_ctrl_write()
1319 s->dc_panel_panning_control = value & 0xFF3FFF3F; in sm501_disp_ctrl_write()
1325 s->dc_panel_fb_addr = value & 0x8FFFFFF0; in sm501_disp_ctrl_write()
1327 qemu_log_mask(LOG_UNIMP, "Panel external memory not supported\n"); in sm501_disp_ctrl_write()
1329 s->do_full_update = true; in sm501_disp_ctrl_write()
1332 s->dc_panel_fb_offset = value & 0x3FF03FF0; in sm501_disp_ctrl_write()
1335 s->dc_panel_fb_width = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1338 s->dc_panel_fb_height = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1341 s->dc_panel_tl_location = value & 0x07FF07FF; in sm501_disp_ctrl_write()
1344 s->dc_panel_br_location = value & 0x07FF07FF; in sm501_disp_ctrl_write()
1348 s->dc_panel_h_total = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1351 s->dc_panel_h_sync = value & 0x00FF0FFF; in sm501_disp_ctrl_write()
1354 s->dc_panel_v_total = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1357 s->dc_panel_v_sync = value & 0x003F0FFF; in sm501_disp_ctrl_write()
1362 if (value != s->dc_panel_hwc_addr) { in sm501_disp_ctrl_write()
1364 s->dc_panel_hwc_addr = value; in sm501_disp_ctrl_write()
1369 if (value != s->dc_panel_hwc_location) { in sm501_disp_ctrl_write()
1371 s->dc_panel_hwc_location = value; in sm501_disp_ctrl_write()
1375 s->dc_panel_hwc_color_1_2 = value; in sm501_disp_ctrl_write()
1378 s->dc_panel_hwc_color_3 = value & 0x0000FFFF; in sm501_disp_ctrl_write()
1382 s->dc_video_control = value & 0x00037FFF; in sm501_disp_ctrl_write()
1386 s->dc_crt_control = value & 0x0003FFFF; in sm501_disp_ctrl_write()
1389 s->dc_crt_fb_addr = value & 0x8FFFFFF0; in sm501_disp_ctrl_write()
1393 s->do_full_update = true; in sm501_disp_ctrl_write()
1396 s->dc_crt_fb_offset = value & 0x3FF03FF0; in sm501_disp_ctrl_write()
1399 s->dc_crt_h_total = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1402 s->dc_crt_h_sync = value & 0x00FF0FFF; in sm501_disp_ctrl_write()
1405 s->dc_crt_v_total = value & 0x0FFF0FFF; in sm501_disp_ctrl_write()
1408 s->dc_crt_v_sync = value & 0x003F0FFF; in sm501_disp_ctrl_write()
1413 if (value != s->dc_crt_hwc_addr) { in sm501_disp_ctrl_write()
1415 s->dc_crt_hwc_addr = value; in sm501_disp_ctrl_write()
1420 if (value != s->dc_crt_hwc_location) { in sm501_disp_ctrl_write()
1422 s->dc_crt_hwc_location = value; in sm501_disp_ctrl_write()
1426 s->dc_crt_hwc_color_1_2 = value; in sm501_disp_ctrl_write()
1429 s->dc_crt_hwc_color_3 = value & 0x0000FFFF; in sm501_disp_ctrl_write()
1432 case SM501_DC_PANEL_PALETTE ... SM501_DC_PANEL_PALETTE + 0x400 * 3 - 4: in sm501_disp_ctrl_write()
1433 sm501_palette_write(opaque, addr - SM501_DC_PANEL_PALETTE, value); in sm501_disp_ctrl_write()
1461 ret = s->twoD_source; in sm501_2d_engine_read()
1464 ret = s->twoD_destination; in sm501_2d_engine_read()
1467 ret = s->twoD_dimension; in sm501_2d_engine_read()
1470 ret = s->twoD_control; in sm501_2d_engine_read()
1473 ret = s->twoD_pitch; in sm501_2d_engine_read()
1476 ret = s->twoD_foreground; in sm501_2d_engine_read()
1479 ret = s->twoD_background; in sm501_2d_engine_read()
1482 ret = s->twoD_stretch; in sm501_2d_engine_read()
1485 ret = s->twoD_color_compare; in sm501_2d_engine_read()
1488 ret = s->twoD_color_compare_mask; in sm501_2d_engine_read()
1491 ret = s->twoD_mask; in sm501_2d_engine_read()
1494 ret = s->twoD_clip_tl; in sm501_2d_engine_read()
1497 ret = s->twoD_clip_br; in sm501_2d_engine_read()
1500 ret = s->twoD_mono_pattern_low; in sm501_2d_engine_read()
1503 ret = s->twoD_mono_pattern_high; in sm501_2d_engine_read()
1506 ret = s->twoD_window_width; in sm501_2d_engine_read()
1509 ret = s->twoD_source_base; in sm501_2d_engine_read()
1512 ret = s->twoD_destination_base; in sm501_2d_engine_read()
1515 ret = s->twoD_alpha; in sm501_2d_engine_read()
1518 ret = s->twoD_wrap; in sm501_2d_engine_read()
1539 s->twoD_source = value; in sm501_2d_engine_write()
1542 s->twoD_destination = value; in sm501_2d_engine_write()
1545 s->twoD_dimension = value; in sm501_2d_engine_write()
1548 s->twoD_control = value; in sm501_2d_engine_write()
1553 s->twoD_control &= ~0x80000000; /* start flag down */ in sm501_2d_engine_write()
1558 s->twoD_pitch = value; in sm501_2d_engine_write()
1561 s->twoD_foreground = value; in sm501_2d_engine_write()
1564 s->twoD_background = value; in sm501_2d_engine_write()
1570 s->twoD_stretch = value; in sm501_2d_engine_write()
1573 s->twoD_color_compare = value; in sm501_2d_engine_write()
1576 s->twoD_color_compare_mask = value; in sm501_2d_engine_write()
1579 s->twoD_mask = value; in sm501_2d_engine_write()
1582 s->twoD_clip_tl = value; in sm501_2d_engine_write()
1585 s->twoD_clip_br = value; in sm501_2d_engine_write()
1588 s->twoD_mono_pattern_low = value; in sm501_2d_engine_write()
1591 s->twoD_mono_pattern_high = value; in sm501_2d_engine_write()
1594 s->twoD_window_width = value; in sm501_2d_engine_write()
1597 s->twoD_source_base = value; in sm501_2d_engine_write()
1600 s->twoD_destination_base = value; in sm501_2d_engine_write()
1603 s->twoD_alpha = value; in sm501_2d_engine_write()
1606 s->twoD_wrap = value; in sm501_2d_engine_write()
1649 } while (--width != 0); in draw_line8_32()
1666 } while (--width != 0); in draw_line16_32()
1681 } while (--width != 0); in draw_line32_32()
1709 v--; in draw_hwc_line_32()
1722 DisplaySurface *surface = qemu_console_surface(s->con); in sm501_update_display()
1725 int crt = (s->dc_crt_control & SM501_DC_CRT_CONTROL_SEL) ? 1 : 0; in sm501_update_display()
1733 int y_start = -1; in sm501_update_display()
1739 assert(dst_bpp == 4); /* Output is always 32-bit RGB */ in sm501_update_display()
1741 if (!((crt ? s->dc_crt_control : s->dc_panel_control) in sm501_update_display()
1746 palette = (uint32_t *)(crt ? &s->dc_palette[SM501_DC_CRT_PALETTE - in sm501_update_display()
1748 : &s->dc_palette[0]); in sm501_update_display()
1778 if (s->last_width != width || s->last_height != height) { in sm501_update_display()
1779 qemu_console_resize(s->con, width, height); in sm501_update_display()
1780 surface = qemu_console_surface(s->con); in sm501_update_display()
1781 s->last_width = width; in sm501_update_display()
1782 s->last_height = height; in sm501_update_display()
1787 if (s->do_full_update) { in sm501_update_display()
1788 s->do_full_update = false; in sm501_update_display()
1794 snap = memory_region_snapshot_and_clear_dirty(&s->local_mem_region, in sm501_update_display()
1803 update |= memory_region_snapshot_get_dirty(&s->local_mem_region, snap, in sm501_update_display()
1812 draw_line(d, s->local_mem + offset, width, palette); in sm501_update_display()
1816 draw_hwc_line(d, hwc_src, width, hwc_palette, c_x, y - c_y); in sm501_update_display()
1825 dpy_gfx_update(s->con, 0, y_start, width, y - y_start); in sm501_update_display()
1826 y_start = -1; in sm501_update_display()
1834 dpy_gfx_update(s->con, 0, y_start, width, y - y_start); in sm501_update_display()
1844 s->system_control = 0x00100000; /* 2D engine FIFO empty */ in sm501_reset()
1854 s->misc_control = SM501_MISC_DAC_POWER; in sm501_reset()
1855 s->gpio_31_0_control = 0; in sm501_reset()
1856 s->gpio_63_32_control = 0; in sm501_reset()
1857 s->dram_control = 0; in sm501_reset()
1858 s->arbitration_control = 0x05146732; in sm501_reset()
1859 s->irq_mask = 0; in sm501_reset()
1860 s->misc_timing = 0; in sm501_reset()
1861 s->power_mode_control = 0; in sm501_reset()
1862 s->i2c_byte_count = 0; in sm501_reset()
1863 s->i2c_status = 0; in sm501_reset()
1864 s->i2c_addr = 0; in sm501_reset()
1865 memset(s->i2c_data, 0, 16); in sm501_reset()
1866 s->dc_panel_control = 0x00010000; /* FIFO level 3 */ in sm501_reset()
1867 s->dc_video_control = 0; in sm501_reset()
1868 s->dc_crt_control = 0x00010000; in sm501_reset()
1869 s->twoD_source = 0; in sm501_reset()
1870 s->twoD_destination = 0; in sm501_reset()
1871 s->twoD_dimension = 0; in sm501_reset()
1872 s->twoD_control = 0; in sm501_reset()
1873 s->twoD_pitch = 0; in sm501_reset()
1874 s->twoD_foreground = 0; in sm501_reset()
1875 s->twoD_background = 0; in sm501_reset()
1876 s->twoD_stretch = 0; in sm501_reset()
1877 s->twoD_color_compare = 0; in sm501_reset()
1878 s->twoD_color_compare_mask = 0; in sm501_reset()
1879 s->twoD_mask = 0; in sm501_reset()
1880 s->twoD_clip_tl = 0; in sm501_reset()
1881 s->twoD_clip_br = 0; in sm501_reset()
1882 s->twoD_mono_pattern_low = 0; in sm501_reset()
1883 s->twoD_mono_pattern_high = 0; in sm501_reset()
1884 s->twoD_window_width = 0; in sm501_reset()
1885 s->twoD_source_base = 0; in sm501_reset()
1886 s->twoD_destination_base = 0; in sm501_reset()
1887 s->twoD_alpha = 0; in sm501_reset()
1888 s->twoD_wrap = 0; in sm501_reset()
1895 if (s->use_pixman != 0) { in sm501_init()
1896 warn_report("x-pixman != 0, not effective without PIXMAN"); in sm501_init()
1900 s->local_mem_size_index = get_local_mem_size_index(local_mem_bytes); in sm501_init()
1903 memory_region_init_ram(&s->local_mem_region, OBJECT(dev), "sm501.local", in sm501_init()
1905 memory_region_set_log(&s->local_mem_region, true, DIRTY_MEMORY_VGA); in sm501_init()
1906 s->local_mem = memory_region_get_ram_ptr(&s->local_mem_region); in sm501_init()
1909 s->i2c_bus = i2c_init_bus(dev, "sm501.i2c"); in sm501_init()
1913 qdev_realize_and_unref(DEVICE(ddc), BUS(s->i2c_bus), &error_abort); in sm501_init()
1916 memory_region_init(&s->mmio_region, OBJECT(dev), "sm501.mmio", MMIO_SIZE); in sm501_init()
1917 memory_region_init_io(&s->system_config_region, OBJECT(dev), in sm501_init()
1919 "sm501-system-config", 0x6c); in sm501_init()
1920 memory_region_add_subregion(&s->mmio_region, SM501_SYS_CONFIG, in sm501_init()
1921 &s->system_config_region); in sm501_init()
1922 memory_region_init_io(&s->i2c_region, OBJECT(dev), &sm501_i2c_ops, s, in sm501_init()
1923 "sm501-i2c", 0x14); in sm501_init()
1924 memory_region_add_subregion(&s->mmio_region, SM501_I2C, &s->i2c_region); in sm501_init()
1925 memory_region_init_io(&s->disp_ctrl_region, OBJECT(dev), in sm501_init()
1927 "sm501-disp-ctrl", 0x1000); in sm501_init()
1928 memory_region_add_subregion(&s->mmio_region, SM501_DC, in sm501_init()
1929 &s->disp_ctrl_region); in sm501_init()
1930 memory_region_init_io(&s->twoD_engine_region, OBJECT(dev), in sm501_init()
1932 "sm501-2d-engine", 0x54); in sm501_init()
1933 memory_region_add_subregion(&s->mmio_region, SM501_2D_ENGINE, in sm501_init()
1934 &s->twoD_engine_region); in sm501_init()
1937 s->con = graphic_console_init(dev, 0, &sm501_ops, s); in sm501_init()
1941 .name = "sm501-state",
2017 #define TYPE_SYSBUS_SM501 "sysbus-sm501"
2036 sm501_init(&s->state, dev, s->vram_size); in sm501_realize_sysbus()
2037 if (get_local_mem_size(&s->state) != s->vram_size) { in sm501_realize_sysbus()
2039 get_local_mem_size(&s->state)); in sm501_realize_sysbus()
2042 sysbus_init_mmio(sbd, &s->state.local_mem_region); in sm501_realize_sysbus()
2043 sysbus_init_mmio(sbd, &s->state.mmio_region); in sm501_realize_sysbus()
2046 sysbus_realize_and_unref(SYS_BUS_DEVICE(&s->ohci), &error_fatal); in sm501_realize_sysbus()
2047 memory_region_add_subregion(&s->state.mmio_region, SM501_USB_HOST, in sm501_realize_sysbus()
2048 sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->ohci), 0)); in sm501_realize_sysbus()
2049 sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->ohci)); in sm501_realize_sysbus()
2052 sysbus_realize(SYS_BUS_DEVICE(&s->serial), &error_fatal); in sm501_realize_sysbus()
2053 mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->serial), 0); in sm501_realize_sysbus()
2054 memory_region_add_subregion(&s->state.mmio_region, SM501_UART0, mr); in sm501_realize_sysbus()
2059 DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0),
2061 DEFINE_PROP_UINT8("x-pixman", SM501SysBusState, state.use_pixman, DEFAULT_X_PIXMAN),
2067 sm501_reset(&s->state); in sm501_reset_sysbus()
2085 dc->realize = sm501_realize_sysbus; in sm501_sysbus_class_init()
2086 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); in sm501_sysbus_class_init()
2087 dc->desc = "SM501 Multimedia Companion"; in sm501_sysbus_class_init()
2090 dc->vmsd = &vmstate_sm501_sysbus; in sm501_sysbus_class_init()
2096 OHCISysBusState *ohci = &sm501->ohci; in sm501_sysbus_init()
2097 SerialMM *smm = &sm501->serial; in sm501_sysbus_init()
2100 object_property_add_alias(o, "dma-offset", OBJECT(ohci), "dma-offset"); in sm501_sysbus_init()
2101 qdev_prop_set_uint32(DEVICE(ohci), "num-ports", 2); in sm501_sysbus_init()
2134 sm501_init(&s->state, DEVICE(dev), s->vram_size); in sm501_realize_pci()
2135 if (get_local_mem_size(&s->state) != s->vram_size) { in sm501_realize_pci()
2137 get_local_mem_size(&s->state)); in sm501_realize_pci()
2141 &s->state.local_mem_region); in sm501_realize_pci()
2143 &s->state.mmio_region); in sm501_realize_pci()
2147 DEFINE_PROP_UINT32("vram-size", SM501PCIState, vram_size, 64 * MiB),
2148 DEFINE_PROP_UINT8("x-pixman", SM501PCIState, state.use_pixman, DEFAULT_X_PIXMAN),
2154 sm501_reset(&s->state); in sm501_reset_pci()
2156 s->state.misc_control |= 1; in sm501_reset_pci()
2176 k->realize = sm501_realize_pci; in sm501_pci_class_init()
2177 k->vendor_id = PCI_VENDOR_ID_SILICON_MOTION; in sm501_pci_class_init()
2178 k->device_id = PCI_DEVICE_ID_SM501; in sm501_pci_class_init()
2179 k->class_id = PCI_CLASS_DISPLAY_OTHER; in sm501_pci_class_init()
2180 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); in sm501_pci_class_init()
2181 dc->desc = "SM501 Display Controller"; in sm501_pci_class_init()
2184 dc->hotpluggable = false; in sm501_pci_class_init()
2185 dc->vmsd = &vmstate_sm501_pci; in sm501_pci_class_init()
2190 object_property_set_description(o, "x-pixman", "Use pixman for: " in sm501_pci_init()