| .. | .. |
|---|
| 70 | 70 | #include "sisusb.h" |
|---|
| 71 | 71 | #include "sisusb_init.h" |
|---|
| 72 | 72 | |
|---|
| 73 | | -#ifdef INCL_SISUSB_CON |
|---|
| 74 | | - |
|---|
| 75 | | -#define sisusbcon_writew(val, addr) (*(addr) = (val)) |
|---|
| 76 | | -#define sisusbcon_readw(addr) (*(addr)) |
|---|
| 77 | | -#define sisusbcon_memmovew(d, s, c) memmove(d, s, c) |
|---|
| 78 | | -#define sisusbcon_memcpyw(d, s, c) memcpy(d, s, c) |
|---|
| 79 | | - |
|---|
| 80 | 73 | /* vc_data -> sisusb conversion table */ |
|---|
| 81 | 74 | static struct sisusb_usb_data *mysisusbs[MAX_NR_CONSOLES]; |
|---|
| 82 | 75 | |
|---|
| .. | .. |
|---|
| 86 | 79 | static inline void |
|---|
| 87 | 80 | sisusbcon_memsetw(u16 *s, u16 c, unsigned int count) |
|---|
| 88 | 81 | { |
|---|
| 89 | | - count /= 2; |
|---|
| 90 | | - while (count--) |
|---|
| 91 | | - sisusbcon_writew(c, s++); |
|---|
| 82 | + memset16(s, c, count / 2); |
|---|
| 92 | 83 | } |
|---|
| 93 | 84 | |
|---|
| 94 | 85 | static inline void |
|---|
| .. | .. |
|---|
| 311 | 302 | |
|---|
| 312 | 303 | /* interface routine */ |
|---|
| 313 | 304 | static u8 |
|---|
| 314 | | -sisusbcon_build_attr(struct vc_data *c, u8 color, u8 intensity, |
|---|
| 315 | | - u8 blink, u8 underline, u8 reverse, u8 unused) |
|---|
| 305 | +sisusbcon_build_attr(struct vc_data *c, u8 color, enum vc_intensity intensity, |
|---|
| 306 | + bool blink, bool underline, bool reverse, |
|---|
| 307 | + bool unused) |
|---|
| 316 | 308 | { |
|---|
| 317 | 309 | u8 attr = color; |
|---|
| 318 | 310 | |
|---|
| 319 | 311 | if (underline) |
|---|
| 320 | 312 | attr = (attr & 0xf0) | c->vc_ulcolor; |
|---|
| 321 | | - else if (intensity == 0) |
|---|
| 313 | + else if (intensity == VCI_HALF_BRIGHT) |
|---|
| 322 | 314 | attr = (attr & 0xf0) | c->vc_halfcolor; |
|---|
| 323 | 315 | |
|---|
| 324 | 316 | if (reverse) |
|---|
| .. | .. |
|---|
| 329 | 321 | if (blink) |
|---|
| 330 | 322 | attr ^= 0x80; |
|---|
| 331 | 323 | |
|---|
| 332 | | - if (intensity == 2) |
|---|
| 324 | + if (intensity == VCI_BOLD) |
|---|
| 333 | 325 | attr ^= 0x08; |
|---|
| 334 | 326 | |
|---|
| 335 | 327 | return attr; |
|---|
| .. | .. |
|---|
| 346 | 338 | */ |
|---|
| 347 | 339 | |
|---|
| 348 | 340 | while (count--) { |
|---|
| 349 | | - u16 a = sisusbcon_readw(p); |
|---|
| 341 | + u16 a = *p; |
|---|
| 350 | 342 | |
|---|
| 351 | | - a = ((a) & 0x88ff) | |
|---|
| 352 | | - (((a) & 0x7000) >> 4) | |
|---|
| 353 | | - (((a) & 0x0700) << 4); |
|---|
| 354 | | - |
|---|
| 355 | | - sisusbcon_writew(a, p++); |
|---|
| 343 | + *p++ = ((a) & 0x88ff) | |
|---|
| 344 | + (((a) & 0x7000) >> 4) | |
|---|
| 345 | + (((a) & 0x0700) << 4); |
|---|
| 356 | 346 | } |
|---|
| 357 | 347 | } |
|---|
| 358 | 348 | |
|---|
| 359 | | -#define SISUSB_VADDR(x,y) \ |
|---|
| 360 | | - ((u16 *)c->vc_origin + \ |
|---|
| 361 | | - (y) * sisusb->sisusb_num_columns + \ |
|---|
| 362 | | - (x)) |
|---|
| 349 | +static inline void *sisusb_vaddr(const struct sisusb_usb_data *sisusb, |
|---|
| 350 | + const struct vc_data *c, unsigned int x, unsigned int y) |
|---|
| 351 | +{ |
|---|
| 352 | + return (u16 *)c->vc_origin + y * sisusb->sisusb_num_columns + x; |
|---|
| 353 | +} |
|---|
| 363 | 354 | |
|---|
| 364 | | -#define SISUSB_HADDR(x,y) \ |
|---|
| 365 | | - ((u16 *)(sisusb->vrambase + (c->vc_origin - sisusb->scrbuf)) + \ |
|---|
| 366 | | - (y) * sisusb->sisusb_num_columns + \ |
|---|
| 367 | | - (x)) |
|---|
| 355 | +static inline unsigned long sisusb_haddr(const struct sisusb_usb_data *sisusb, |
|---|
| 356 | + const struct vc_data *c, unsigned int x, unsigned int y) |
|---|
| 357 | +{ |
|---|
| 358 | + unsigned long offset = c->vc_origin - sisusb->scrbuf; |
|---|
| 359 | + |
|---|
| 360 | + /* 2 bytes per each character */ |
|---|
| 361 | + offset += 2 * (y * sisusb->sisusb_num_columns + x); |
|---|
| 362 | + |
|---|
| 363 | + return sisusb->vrambase + offset; |
|---|
| 364 | +} |
|---|
| 368 | 365 | |
|---|
| 369 | 366 | /* Interface routine */ |
|---|
| 370 | 367 | static void |
|---|
| .. | .. |
|---|
| 382 | 379 | return; |
|---|
| 383 | 380 | } |
|---|
| 384 | 381 | |
|---|
| 385 | | - |
|---|
| 386 | | - sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), |
|---|
| 387 | | - (long)SISUSB_HADDR(x, y), 2); |
|---|
| 382 | + sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y), |
|---|
| 383 | + sisusb_haddr(sisusb, c, x, y), 2); |
|---|
| 388 | 384 | |
|---|
| 389 | 385 | mutex_unlock(&sisusb->lock); |
|---|
| 390 | 386 | } |
|---|
| .. | .. |
|---|
| 395 | 391 | int count, int y, int x) |
|---|
| 396 | 392 | { |
|---|
| 397 | 393 | struct sisusb_usb_data *sisusb; |
|---|
| 398 | | - u16 *dest; |
|---|
| 399 | | - int i; |
|---|
| 400 | 394 | |
|---|
| 401 | 395 | sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num); |
|---|
| 402 | 396 | if (!sisusb) |
|---|
| .. | .. |
|---|
| 408 | 402 | * because the vt does this AFTER calling us. |
|---|
| 409 | 403 | */ |
|---|
| 410 | 404 | |
|---|
| 411 | | - dest = SISUSB_VADDR(x, y); |
|---|
| 412 | | - |
|---|
| 413 | | - for (i = count; i > 0; i--) |
|---|
| 414 | | - sisusbcon_writew(sisusbcon_readw(s++), dest++); |
|---|
| 405 | + memcpy(sisusb_vaddr(sisusb, c, x, y), s, count * 2); |
|---|
| 415 | 406 | |
|---|
| 416 | 407 | if (sisusb_is_inactive(c, sisusb)) { |
|---|
| 417 | 408 | mutex_unlock(&sisusb->lock); |
|---|
| 418 | 409 | return; |
|---|
| 419 | 410 | } |
|---|
| 420 | 411 | |
|---|
| 421 | | - sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), |
|---|
| 422 | | - (long)SISUSB_HADDR(x, y), count * 2); |
|---|
| 412 | + sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y), |
|---|
| 413 | + sisusb_haddr(sisusb, c, x, y), count * 2); |
|---|
| 423 | 414 | |
|---|
| 424 | 415 | mutex_unlock(&sisusb->lock); |
|---|
| 425 | 416 | } |
|---|
| .. | .. |
|---|
| 446 | 437 | * this AFTER calling us. |
|---|
| 447 | 438 | */ |
|---|
| 448 | 439 | |
|---|
| 449 | | - dest = SISUSB_VADDR(x, y); |
|---|
| 440 | + dest = sisusb_vaddr(sisusb, c, x, y); |
|---|
| 450 | 441 | |
|---|
| 451 | 442 | cols = sisusb->sisusb_num_columns; |
|---|
| 452 | 443 | |
|---|
| .. | .. |
|---|
| 472 | 463 | length = ((height * cols) - x - (cols - width - x)) * 2; |
|---|
| 473 | 464 | |
|---|
| 474 | 465 | |
|---|
| 475 | | - sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y), |
|---|
| 476 | | - (long)SISUSB_HADDR(x, y), length); |
|---|
| 466 | + sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y), |
|---|
| 467 | + sisusb_haddr(sisusb, c, x, y), length); |
|---|
| 477 | 468 | |
|---|
| 478 | 469 | mutex_unlock(&sisusb->lock); |
|---|
| 479 | 470 | } |
|---|
| .. | .. |
|---|
| 517 | 508 | (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin)); |
|---|
| 518 | 509 | |
|---|
| 519 | 510 | /* Restore the screen contents */ |
|---|
| 520 | | - sisusbcon_memcpyw((u16 *)c->vc_origin, (u16 *)c->vc_screenbuf, |
|---|
| 521 | | - length); |
|---|
| 511 | + memcpy((u16 *)c->vc_origin, (u16 *)c->vc_screenbuf, length); |
|---|
| 522 | 512 | |
|---|
| 523 | | - sisusb_copy_memory(sisusb, (unsigned char *)c->vc_origin, |
|---|
| 524 | | - (long)SISUSB_HADDR(0, 0), |
|---|
| 525 | | - length); |
|---|
| 513 | + sisusb_copy_memory(sisusb, (u8 *)c->vc_origin, |
|---|
| 514 | + sisusb_haddr(sisusb, c, 0, 0), length); |
|---|
| 526 | 515 | |
|---|
| 527 | 516 | mutex_unlock(&sisusb->lock); |
|---|
| 528 | 517 | |
|---|
| .. | .. |
|---|
| 556 | 545 | (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin)); |
|---|
| 557 | 546 | |
|---|
| 558 | 547 | /* Save the screen contents to vc's private buffer */ |
|---|
| 559 | | - sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, |
|---|
| 560 | | - length); |
|---|
| 548 | + memcpy((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, length); |
|---|
| 561 | 549 | |
|---|
| 562 | 550 | mutex_unlock(&sisusb->lock); |
|---|
| 563 | 551 | } |
|---|
| .. | .. |
|---|
| 628 | 616 | sisusbcon_memsetw((u16 *)c->vc_origin, |
|---|
| 629 | 617 | c->vc_video_erase_char, |
|---|
| 630 | 618 | c->vc_screenbuf_size); |
|---|
| 631 | | - sisusb_copy_memory(sisusb, |
|---|
| 632 | | - (unsigned char *)c->vc_origin, |
|---|
| 633 | | - (u32)(sisusb->vrambase + |
|---|
| 634 | | - (c->vc_origin - sisusb->scrbuf)), |
|---|
| 619 | + sisusb_copy_memory(sisusb, (u8 *)c->vc_origin, |
|---|
| 620 | + sisusb_haddr(sisusb, c, 0, 0), |
|---|
| 635 | 621 | c->vc_screenbuf_size); |
|---|
| 636 | 622 | sisusb->con_blanked = 1; |
|---|
| 637 | 623 | ret = 1; |
|---|
| .. | .. |
|---|
| 741 | 727 | |
|---|
| 742 | 728 | baseline = c->vc_font.height - (c->vc_font.height < 10 ? 1 : 2); |
|---|
| 743 | 729 | |
|---|
| 744 | | - switch (c->vc_cursor_type & 0x0f) { |
|---|
| 730 | + switch (CUR_SIZE(c->vc_cursor_type)) { |
|---|
| 745 | 731 | case CUR_BLOCK: from = 1; |
|---|
| 746 | 732 | to = c->vc_font.height; |
|---|
| 747 | 733 | break; |
|---|
| .. | .. |
|---|
| 796 | 782 | switch (dir) { |
|---|
| 797 | 783 | |
|---|
| 798 | 784 | case SM_UP: |
|---|
| 799 | | - sisusbcon_memmovew(SISUSB_VADDR(0, t), |
|---|
| 800 | | - SISUSB_VADDR(0, t + lines), |
|---|
| 785 | + memmove(sisusb_vaddr(sisusb, c, 0, t), |
|---|
| 786 | + sisusb_vaddr(sisusb, c, 0, t + lines), |
|---|
| 801 | 787 | (b - t - lines) * cols * 2); |
|---|
| 802 | | - sisusbcon_memsetw(SISUSB_VADDR(0, b - lines), eattr, |
|---|
| 803 | | - lines * cols * 2); |
|---|
| 788 | + sisusbcon_memsetw(sisusb_vaddr(sisusb, c, 0, b - lines), |
|---|
| 789 | + eattr, lines * cols * 2); |
|---|
| 804 | 790 | break; |
|---|
| 805 | 791 | |
|---|
| 806 | 792 | case SM_DOWN: |
|---|
| 807 | | - sisusbcon_memmovew(SISUSB_VADDR(0, t + lines), |
|---|
| 808 | | - SISUSB_VADDR(0, t), |
|---|
| 793 | + memmove(sisusb_vaddr(sisusb, c, 0, t + lines), |
|---|
| 794 | + sisusb_vaddr(sisusb, c, 0, t), |
|---|
| 809 | 795 | (b - t - lines) * cols * 2); |
|---|
| 810 | | - sisusbcon_memsetw(SISUSB_VADDR(0, t), eattr, |
|---|
| 796 | + sisusbcon_memsetw(sisusb_vaddr(sisusb, c, 0, t), eattr, |
|---|
| 811 | 797 | lines * cols * 2); |
|---|
| 812 | 798 | break; |
|---|
| 813 | 799 | } |
|---|
| 814 | 800 | |
|---|
| 815 | | - sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t), |
|---|
| 816 | | - (long)SISUSB_HADDR(0, t), length); |
|---|
| 801 | + sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, 0, t), |
|---|
| 802 | + sisusb_haddr(sisusb, c, 0, t), length); |
|---|
| 817 | 803 | |
|---|
| 818 | 804 | mutex_unlock(&sisusb->lock); |
|---|
| 819 | 805 | |
|---|
| .. | .. |
|---|
| 830 | 816 | int copyall = 0; |
|---|
| 831 | 817 | unsigned long oldorigin; |
|---|
| 832 | 818 | unsigned int delta = lines * c->vc_size_row; |
|---|
| 833 | | - u32 originoffset; |
|---|
| 834 | 819 | |
|---|
| 835 | 820 | /* Returning != 0 means we have done the scrolling successfully. |
|---|
| 836 | 821 | * Returning 0 makes vt do the scrolling on its own. |
|---|
| .. | .. |
|---|
| 874 | 859 | |
|---|
| 875 | 860 | if (c->vc_scr_end + delta >= |
|---|
| 876 | 861 | sisusb->scrbuf + sisusb->scrbuf_size) { |
|---|
| 877 | | - sisusbcon_memcpyw((u16 *)sisusb->scrbuf, |
|---|
| 862 | + memcpy((u16 *)sisusb->scrbuf, |
|---|
| 878 | 863 | (u16 *)(oldorigin + delta), |
|---|
| 879 | 864 | c->vc_screenbuf_size - delta); |
|---|
| 880 | 865 | c->vc_origin = sisusb->scrbuf; |
|---|
| .. | .. |
|---|
| 892 | 877 | case SM_DOWN: |
|---|
| 893 | 878 | |
|---|
| 894 | 879 | if (oldorigin - delta < sisusb->scrbuf) { |
|---|
| 895 | | - sisusbcon_memmovew((u16 *)(sisusb->scrbuf + |
|---|
| 896 | | - sisusb->scrbuf_size - |
|---|
| 897 | | - c->vc_screenbuf_size + |
|---|
| 898 | | - delta), |
|---|
| 899 | | - (u16 *)oldorigin, |
|---|
| 900 | | - c->vc_screenbuf_size - delta); |
|---|
| 880 | + memmove((void *)sisusb->scrbuf + sisusb->scrbuf_size - |
|---|
| 881 | + c->vc_screenbuf_size + delta, |
|---|
| 882 | + (u16 *)oldorigin, |
|---|
| 883 | + c->vc_screenbuf_size - delta); |
|---|
| 901 | 884 | c->vc_origin = sisusb->scrbuf + |
|---|
| 902 | 885 | sisusb->scrbuf_size - |
|---|
| 903 | 886 | c->vc_screenbuf_size; |
|---|
| .. | .. |
|---|
| 913 | 896 | break; |
|---|
| 914 | 897 | } |
|---|
| 915 | 898 | |
|---|
| 916 | | - originoffset = (u32)(c->vc_origin - sisusb->scrbuf); |
|---|
| 917 | | - |
|---|
| 918 | 899 | if (copyall) |
|---|
| 919 | 900 | sisusb_copy_memory(sisusb, |
|---|
| 920 | | - (char *)c->vc_origin, |
|---|
| 921 | | - (u32)(sisusb->vrambase + originoffset), |
|---|
| 901 | + (u8 *)c->vc_origin, |
|---|
| 902 | + sisusb_haddr(sisusb, c, 0, 0), |
|---|
| 922 | 903 | c->vc_screenbuf_size); |
|---|
| 923 | 904 | else if (dir == SM_UP) |
|---|
| 924 | 905 | sisusb_copy_memory(sisusb, |
|---|
| 925 | | - (char *)c->vc_origin + c->vc_screenbuf_size - delta, |
|---|
| 926 | | - (u32)sisusb->vrambase + originoffset + |
|---|
| 906 | + (u8 *)c->vc_origin + c->vc_screenbuf_size - delta, |
|---|
| 907 | + sisusb_haddr(sisusb, c, 0, 0) + |
|---|
| 927 | 908 | c->vc_screenbuf_size - delta, |
|---|
| 928 | 909 | delta); |
|---|
| 929 | 910 | else |
|---|
| 930 | 911 | sisusb_copy_memory(sisusb, |
|---|
| 931 | | - (char *)c->vc_origin, |
|---|
| 932 | | - (u32)(sisusb->vrambase + originoffset), |
|---|
| 912 | + (u8 *)c->vc_origin, |
|---|
| 913 | + sisusb_haddr(sisusb, c, 0, 0), |
|---|
| 933 | 914 | delta); |
|---|
| 934 | 915 | |
|---|
| 935 | 916 | c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; |
|---|
| .. | .. |
|---|
| 1246 | 1227 | sisusb->font_backup = vmalloc(array_size(charcount, 32)); |
|---|
| 1247 | 1228 | |
|---|
| 1248 | 1229 | if (sisusb->font_backup) { |
|---|
| 1249 | | - memcpy(sisusb->font_backup, font->data, charcount * 32); |
|---|
| 1230 | + memcpy(sisusb->font_backup, font->data, array_size(charcount, 32)); |
|---|
| 1250 | 1231 | sisusb->font_backup_size = charcount; |
|---|
| 1251 | 1232 | sisusb->font_backup_height = font->height; |
|---|
| 1252 | 1233 | sisusb->font_backup_512 = (charcount == 512) ? 1 : 0; |
|---|
| .. | .. |
|---|
| 1534 | 1515 | for (i = 0; i < MAX_NR_CONSOLES; i++) |
|---|
| 1535 | 1516 | mysisusbs[i] = NULL; |
|---|
| 1536 | 1517 | } |
|---|
| 1537 | | - |
|---|
| 1538 | | -#endif /* INCL_CON */ |
|---|
| 1539 | | - |
|---|
| 1540 | | - |
|---|
| 1541 | | - |
|---|