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 49*60e1cb55SPekka Enberg /* 50*60e1cb55SPekka Enberg * The "fast A20 gate" 51*60e1cb55SPekka Enberg */ 52*60e1cb55SPekka Enberg 53*60e1cb55SPekka Enberg static bool ps2_control_a_io_in(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size) 54*60e1cb55SPekka Enberg { 55*60e1cb55SPekka Enberg /* 56*60e1cb55SPekka Enberg * A20 is always enabled. 57*60e1cb55SPekka Enberg */ 58*60e1cb55SPekka Enberg ioport__write8(data, 0x02); 59*60e1cb55SPekka Enberg 60*60e1cb55SPekka Enberg return true; 61*60e1cb55SPekka Enberg } 62*60e1cb55SPekka Enberg 63*60e1cb55SPekka Enberg static struct ioport_operations ps2_control_a_ops = { 64*60e1cb55SPekka Enberg .io_in = ps2_control_a_io_in, 65*60e1cb55SPekka Enberg .io_out = dummy_io_out, 66*60e1cb55SPekka Enberg }; 67*60e1cb55SPekka Enberg 684346fd8fSSasha Levin void ioport__setup_arch(struct kvm *kvm) 69af7b0868SMatt Evans { 70af7b0868SMatt Evans /* Legacy ioport setup */ 71af7b0868SMatt Evans 72af7b0868SMatt Evans /* 0x0020 - 0x003F - 8259A PIC 1 */ 734346fd8fSSasha Levin ioport__register(kvm, 0x0020, &dummy_read_write_ioport_ops, 2, NULL); 74af7b0868SMatt Evans 75af7b0868SMatt Evans /* PORT 0040-005F - PIT - PROGRAMMABLE INTERVAL TIMER (8253, 8254) */ 764346fd8fSSasha Levin ioport__register(kvm, 0x0040, &dummy_read_write_ioport_ops, 4, NULL); 77af7b0868SMatt Evans 78*60e1cb55SPekka Enberg /* 0092 - PS/2 system control port A */ 79*60e1cb55SPekka Enberg ioport__register(kvm, 0x0092, &ps2_control_a_ops, 1, NULL); 80*60e1cb55SPekka Enberg 81af7b0868SMatt Evans /* 0x00A0 - 0x00AF - 8259A PIC 2 */ 824346fd8fSSasha Levin ioport__register(kvm, 0x00A0, &dummy_read_write_ioport_ops, 2, NULL); 83af7b0868SMatt Evans 84af7b0868SMatt Evans /* PORT 00E0-00EF are 'motherboard specific' so we use them for our 85af7b0868SMatt Evans internal debugging purposes. */ 864346fd8fSSasha Levin ioport__register(kvm, IOPORT_DBG, &debug_ops, 1, NULL); 87af7b0868SMatt Evans 88af7b0868SMatt Evans /* PORT 00ED - DUMMY PORT FOR DELAY??? */ 894346fd8fSSasha Levin ioport__register(kvm, 0x00ED, &dummy_write_only_ioport_ops, 1, NULL); 90af7b0868SMatt Evans 91af7b0868SMatt Evans /* 0x00F0 - 0x00FF - Math co-processor */ 924346fd8fSSasha Levin ioport__register(kvm, 0x00F0, &dummy_write_only_ioport_ops, 2, NULL); 93af7b0868SMatt Evans 94af7b0868SMatt Evans /* PORT 03D4-03D5 - COLOR VIDEO - CRT CONTROL REGISTERS */ 954346fd8fSSasha Levin ioport__register(kvm, 0x03D4, &dummy_read_write_ioport_ops, 1, NULL); 964346fd8fSSasha Levin ioport__register(kvm, 0x03D5, &dummy_write_only_ioport_ops, 1, NULL); 97ce08f2afSPekka Enberg 984346fd8fSSasha Levin ioport__register(kvm, 0x402, &seabios_debug_ops, 1, NULL); 99af7b0868SMatt Evans } 100