1af7b0868SMatt Evans #include "kvm/ioport.h" 2af7b0868SMatt Evans 3af7b0868SMatt Evans #include <stdlib.h> 4ce08f2afSPekka Enberg #include <stdio.h> 5af7b0868SMatt Evans 64123ca55SMarc Zyngier static bool debug_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, 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 154123ca55SMarc Zyngier static bool seabios_debug_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, 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 304123ca55SMarc Zyngier static bool dummy_io_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) 31af7b0868SMatt Evans { 32af7b0868SMatt Evans return true; 33af7b0868SMatt Evans } 34af7b0868SMatt Evans 354123ca55SMarc Zyngier static bool dummy_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, 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 534123ca55SMarc Zyngier static bool ps2_control_a_io_in(struct ioport *ioport, struct kvm_cpu *vcpu, 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 68206c41f4SWill Deacon void ioport__map_irq(u8 *irq) 69206c41f4SWill Deacon { 70206c41f4SWill Deacon } 71206c41f4SWill Deacon 72*8f160708SAlexandru Elisei int ioport__setup_arch(struct kvm *kvm) 73af7b0868SMatt Evans { 74*8f160708SAlexandru Elisei int r; 75*8f160708SAlexandru Elisei 76af7b0868SMatt Evans /* Legacy ioport setup */ 77af7b0868SMatt Evans 7848bed025SPekka Enberg /* 0000 - 001F - DMA1 controller */ 79*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0000, &dummy_read_write_ioport_ops, 32, NULL); 80*8f160708SAlexandru Elisei if (r < 0) 81*8f160708SAlexandru Elisei return r; 8248bed025SPekka Enberg 83af7b0868SMatt Evans /* 0x0020 - 0x003F - 8259A PIC 1 */ 84*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0020, &dummy_read_write_ioport_ops, 2, NULL); 85*8f160708SAlexandru Elisei if (r < 0) 86*8f160708SAlexandru Elisei return r; 87af7b0868SMatt Evans 88af7b0868SMatt Evans /* PORT 0040-005F - PIT - PROGRAMMABLE INTERVAL TIMER (8253, 8254) */ 89*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0040, &dummy_read_write_ioport_ops, 4, NULL); 90*8f160708SAlexandru Elisei if (r < 0) 91*8f160708SAlexandru Elisei return r; 92af7b0868SMatt Evans 9360e1cb55SPekka Enberg /* 0092 - PS/2 system control port A */ 94*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0092, &ps2_control_a_ops, 1, NULL); 95*8f160708SAlexandru Elisei if (r < 0) 96*8f160708SAlexandru Elisei return r; 9760e1cb55SPekka Enberg 98af7b0868SMatt Evans /* 0x00A0 - 0x00AF - 8259A PIC 2 */ 99*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x00A0, &dummy_read_write_ioport_ops, 2, NULL); 100*8f160708SAlexandru Elisei if (r < 0) 101*8f160708SAlexandru Elisei return r; 102af7b0868SMatt Evans 10348bed025SPekka Enberg /* 00C0 - 001F - DMA2 controller */ 104*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x00C0, &dummy_read_write_ioport_ops, 32, NULL); 105*8f160708SAlexandru Elisei if (r < 0) 106*8f160708SAlexandru Elisei return r; 10748bed025SPekka Enberg 108af7b0868SMatt Evans /* PORT 00E0-00EF are 'motherboard specific' so we use them for our 109af7b0868SMatt Evans internal debugging purposes. */ 110*8f160708SAlexandru Elisei r = ioport__register(kvm, IOPORT_DBG, &debug_ops, 1, NULL); 111*8f160708SAlexandru Elisei if (r < 0) 112*8f160708SAlexandru Elisei return r; 113af7b0868SMatt Evans 114af7b0868SMatt Evans /* PORT 00ED - DUMMY PORT FOR DELAY??? */ 115*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x00ED, &dummy_write_only_ioport_ops, 1, NULL); 116*8f160708SAlexandru Elisei if (r < 0) 117*8f160708SAlexandru Elisei return r; 118af7b0868SMatt Evans 119af7b0868SMatt Evans /* 0x00F0 - 0x00FF - Math co-processor */ 120*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x00F0, &dummy_write_only_ioport_ops, 2, NULL); 121*8f160708SAlexandru Elisei if (r < 0) 122*8f160708SAlexandru Elisei return r; 123af7b0868SMatt Evans 12448bed025SPekka Enberg /* PORT 0278-027A - PARALLEL PRINTER PORT (usually LPT1, sometimes LPT2) */ 125*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0278, &dummy_read_write_ioport_ops, 3, NULL); 126*8f160708SAlexandru Elisei if (r < 0) 127*8f160708SAlexandru Elisei return r; 12848bed025SPekka Enberg 12948bed025SPekka Enberg /* PORT 0378-037A - PARALLEL PRINTER PORT (usually LPT2, sometimes LPT3) */ 130*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x0378, &dummy_read_write_ioport_ops, 3, NULL); 131*8f160708SAlexandru Elisei if (r < 0) 132*8f160708SAlexandru Elisei return r; 13348bed025SPekka Enberg 134af7b0868SMatt Evans /* PORT 03D4-03D5 - COLOR VIDEO - CRT CONTROL REGISTERS */ 135*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x03D4, &dummy_read_write_ioport_ops, 1, NULL); 136*8f160708SAlexandru Elisei if (r < 0) 137*8f160708SAlexandru Elisei return r; 138*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x03D5, &dummy_write_only_ioport_ops, 1, NULL); 139*8f160708SAlexandru Elisei if (r < 0) 140*8f160708SAlexandru Elisei return r; 141ce08f2afSPekka Enberg 142*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x402, &seabios_debug_ops, 1, NULL); 143*8f160708SAlexandru Elisei if (r < 0) 144*8f160708SAlexandru Elisei return r; 14548bed025SPekka Enberg 14648bed025SPekka Enberg /* 0510 - QEMU BIOS configuration register */ 147*8f160708SAlexandru Elisei r = ioport__register(kvm, 0x510, &dummy_read_write_ioport_ops, 2, NULL); 148*8f160708SAlexandru Elisei if (r < 0) 149*8f160708SAlexandru Elisei return r; 150*8f160708SAlexandru Elisei 151*8f160708SAlexandru Elisei return 0; 152af7b0868SMatt Evans } 153