1af7b0868SMatt Evans #include "kvm/ioport.h" 2af7b0868SMatt Evans 3af7b0868SMatt Evans #include <stdlib.h> 4ce08f2afSPekka Enberg #include <stdio.h> 5af7b0868SMatt Evans 6af7b0868SMatt Evans static bool debug_io_out(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 7af7b0868SMatt Evans { 8b0822113SSasha Levin return 0; 9af7b0868SMatt Evans } 10af7b0868SMatt Evans 11af7b0868SMatt Evans static struct ioport_operations debug_ops = { 12af7b0868SMatt Evans .io_out = debug_io_out, 13af7b0868SMatt Evans }; 14af7b0868SMatt Evans 15ce08f2afSPekka Enberg static bool seabios_debug_io_out(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 16ce08f2afSPekka Enberg { 17ce08f2afSPekka Enberg char ch; 18ce08f2afSPekka Enberg 19ce08f2afSPekka Enberg ch = ioport__read8(data); 20ce08f2afSPekka Enberg 21ce08f2afSPekka Enberg putchar(ch); 22ce08f2afSPekka Enberg 23ce08f2afSPekka Enberg return true; 24ce08f2afSPekka Enberg } 25ce08f2afSPekka Enberg 26ce08f2afSPekka Enberg static struct ioport_operations seabios_debug_ops = { 27ce08f2afSPekka Enberg .io_out = seabios_debug_io_out, 28ce08f2afSPekka Enberg }; 29ce08f2afSPekka Enberg 30af7b0868SMatt Evans static bool dummy_io_in(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 31af7b0868SMatt Evans { 32af7b0868SMatt Evans return true; 33af7b0868SMatt Evans } 34af7b0868SMatt Evans 35af7b0868SMatt Evans static bool dummy_io_out(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 36af7b0868SMatt Evans { 37af7b0868SMatt Evans return true; 38af7b0868SMatt Evans } 39af7b0868SMatt Evans 40af7b0868SMatt Evans static struct ioport_operations dummy_read_write_ioport_ops = { 41af7b0868SMatt Evans .io_in = dummy_io_in, 42af7b0868SMatt Evans .io_out = dummy_io_out, 43af7b0868SMatt Evans }; 44af7b0868SMatt Evans 45af7b0868SMatt Evans static struct ioport_operations dummy_write_only_ioport_ops = { 46af7b0868SMatt Evans .io_out = dummy_io_out, 47af7b0868SMatt Evans }; 48af7b0868SMatt Evans 4960e1cb55SPekka Enberg /* 5060e1cb55SPekka Enberg * The "fast A20 gate" 5160e1cb55SPekka Enberg */ 5260e1cb55SPekka Enberg 5360e1cb55SPekka Enberg static bool ps2_control_a_io_in(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 5460e1cb55SPekka Enberg { 5560e1cb55SPekka Enberg /* 5660e1cb55SPekka Enberg * A20 is always enabled. 5760e1cb55SPekka Enberg */ 5860e1cb55SPekka Enberg ioport__write8(data, 0x02); 5960e1cb55SPekka Enberg 6060e1cb55SPekka Enberg return true; 6160e1cb55SPekka Enberg } 6260e1cb55SPekka Enberg 6360e1cb55SPekka Enberg static struct ioport_operations ps2_control_a_ops = { 6460e1cb55SPekka Enberg .io_in = ps2_control_a_io_in, 6560e1cb55SPekka Enberg .io_out = dummy_io_out, 6660e1cb55SPekka Enberg }; 6760e1cb55SPekka Enberg 68*206c41f4SWill Deacon void ioport__map_irq(u8 *irq) 69*206c41f4SWill Deacon { 70*206c41f4SWill Deacon } 71*206c41f4SWill Deacon 724346fd8fSSasha Levin void ioport__setup_arch(struct kvm *kvm) 73af7b0868SMatt Evans { 74af7b0868SMatt Evans /* Legacy ioport setup */ 75af7b0868SMatt Evans 76af7b0868SMatt Evans /* 0x0020 - 0x003F - 8259A PIC 1 */ 774346fd8fSSasha Levin ioport__register(kvm, 0x0020, &dummy_read_write_ioport_ops, 2, NULL); 78af7b0868SMatt Evans 79af7b0868SMatt Evans /* PORT 0040-005F - PIT - PROGRAMMABLE INTERVAL TIMER (8253, 8254) */ 804346fd8fSSasha Levin ioport__register(kvm, 0x0040, &dummy_read_write_ioport_ops, 4, NULL); 81af7b0868SMatt Evans 8260e1cb55SPekka Enberg /* 0092 - PS/2 system control port A */ 8360e1cb55SPekka Enberg ioport__register(kvm, 0x0092, &ps2_control_a_ops, 1, NULL); 8460e1cb55SPekka Enberg 85af7b0868SMatt Evans /* 0x00A0 - 0x00AF - 8259A PIC 2 */ 864346fd8fSSasha Levin ioport__register(kvm, 0x00A0, &dummy_read_write_ioport_ops, 2, NULL); 87af7b0868SMatt Evans 88af7b0868SMatt Evans /* PORT 00E0-00EF are 'motherboard specific' so we use them for our 89af7b0868SMatt Evans internal debugging purposes. */ 904346fd8fSSasha Levin ioport__register(kvm, IOPORT_DBG, &debug_ops, 1, NULL); 91af7b0868SMatt Evans 92af7b0868SMatt Evans /* PORT 00ED - DUMMY PORT FOR DELAY??? */ 934346fd8fSSasha Levin ioport__register(kvm, 0x00ED, &dummy_write_only_ioport_ops, 1, NULL); 94af7b0868SMatt Evans 95af7b0868SMatt Evans /* 0x00F0 - 0x00FF - Math co-processor */ 964346fd8fSSasha Levin ioport__register(kvm, 0x00F0, &dummy_write_only_ioport_ops, 2, NULL); 97af7b0868SMatt Evans 98af7b0868SMatt Evans /* PORT 03D4-03D5 - COLOR VIDEO - CRT CONTROL REGISTERS */ 994346fd8fSSasha Levin ioport__register(kvm, 0x03D4, &dummy_read_write_ioport_ops, 1, NULL); 1004346fd8fSSasha Levin ioport__register(kvm, 0x03D5, &dummy_write_only_ioport_ops, 1, NULL); 101ce08f2afSPekka Enberg 1024346fd8fSSasha Levin ioport__register(kvm, 0x402, &seabios_debug_ops, 1, NULL); 103af7b0868SMatt Evans } 104