I installed Windows7 on a sata hdd and the last seabios git boots, so vista on sata hdd will using dma config. The ata_try_dma seems to loop indefinitely. Is it normal ? Maybe it slows my pata hdd during boot.
I will try your patch tomorrow. I'll be back soon. > Message du 18/01/10 à 22h24 > De : "Kevin O'Connor" <[email protected]> > A : [email protected] > Copie à : [email protected], "coreboot" <[email protected]> > Objet : Re: [coreboot] Seabios problems > > > On Mon, Jan 18, 2010 at 07:07:55PM +0100, [email protected] wrote: > > The report tells the keyboard is initialized, but I wasn't able to > > use my keyboard. The ps2 timeout seems to be the problem no? > > The earlier patch was just a test. Can you remove the old patches and > try again with the patch below applied to the latest SeaBIOS git? > > -Kevin > > > diff --git a/src/biosvar.h b/src/biosvar.h > index b6e061b..2e43f8b 100644 > --- a/src/biosvar.h > +++ b/src/biosvar.h > @@ -97,7 +97,7 @@ struct bios_data_area_s { > u8 floppy_media_state[4]; > u8 floppy_track[2]; > u8 kbd_flag2; > - u8 kbd_led; > + u8 kbd_flag3; > struct segoff_s user_wait_complete_flag; > u32 user_wait_timeout; > // 40:A0 > @@ -123,6 +123,33 @@ struct bios_data_area_s { > #define FMS_DOUBLE_STEPPING (1<<5) > #define FMS_DATA_RATE_MASK (0xc0) > > +// Bit definitions for kbd_flag[0123] > +#define KF0_RSHIFT (1<<0) > +#define KF0_LSHIFT (1<<1) > +#define KF0_CTRLACTIVE (1<<2) > +#define KF0_ALTACTIVE (1<<3) > +#define KF0_SCROLLACTIVE (1<<4) > +#define KF0_NUMACTIVE (1<<5) > +#define KF0_CAPSACTIVE (1<<6) > + > +#define KF1_LCTRL (1<<0) > +#define KF1_LALT (1<<1) > +#define KF1_PAUSEACTIVE (1<<3) > +#define KF1_SCROLL (1<<4) > +#define KF1_NUM (1<<5) > +#define KF1_CAPS (1<<6) > + > +#define KF2_LAST_E1 (1<<0) > +#define KF2_LAST_E0 (1<<1) > +#define KF2_RCTRL (1<<2) > +#define KF2_RALT (1<<3) > +#define KF2_101KBD (1<<4) > + > +#define KF3_SCROLL_LED (1<<0) > +#define KF3_NUM_LED (1<<1) > +#define KF3_CAPS_LED (1<<2) > +#define KF3_CMD_PENDING (1<<6) > + > // Accessor functions > #define GET_BDA(var) \ > GET_FARVAR(SEG_BDA, ((struct bios_data_area_s *)0)->var) > @@ -205,7 +232,6 @@ struct extended_bios_data_area_s { > u8 other2[0xC4]; > > // 0x121 - Begin custom storage. > - u8 ps2ctr; > int RTCusers; > > // El Torito Emulation data > diff --git a/src/kbd.c b/src/kbd.c > index 6f3ae15..44dce57 100644 > --- a/src/kbd.c > +++ b/src/kbd.c > @@ -11,28 +11,6 @@ > #include "bregs.h" // struct bregs > #include "ps2port.h" // kbd_command > > -// Bit definitions for BDA kbd_flag[012] > -#define KF0_RSHIFT (1<<0) > -#define KF0_LSHIFT (1<<1) > -#define KF0_CTRLACTIVE (1<<2) > -#define KF0_ALTACTIVE (1<<3) > -#define KF0_SCROLLACTIVE (1<<4) > -#define KF0_NUMACTIVE (1<<5) > -#define KF0_CAPSACTIVE (1<<6) > - > -#define KF1_LCTRL (1<<0) > -#define KF1_LALT (1<<1) > -#define KF1_PAUSEACTIVE (1<<3) > -#define KF1_SCROLL (1<<4) > -#define KF1_NUM (1<<5) > -#define KF1_CAPS (1<<6) > - > -#define KF2_LAST_E1 (1<<0) > -#define KF2_LAST_E0 (1<<1) > -#define KF2_RCTRL (1<<2) > -#define KF2_RALT (1<<3) > -#define KF2_101KBD (1<<4) > - > void > kbd_setup(void) > { > @@ -223,7 +201,7 @@ static void > set_leds(void) > { > u8 shift_flags = (GET_BDA(kbd_flag0) >> 4) & 0x07; > - u8 kbd_led = GET_BDA(kbd_led); > + u8 kbd_led = GET_BDA(kbd_flag3); > u8 led_flags = kbd_led & 0x07; > if (shift_flags == led_flags) > return; > @@ -233,7 +211,7 @@ set_leds(void) > // Error > return; > kbd_led = (kbd_led & ~0x07) | shift_flags; > - SET_BDA(kbd_led, kbd_led); > + SET_BDA(kbd_flag3, kbd_led); > } > > // INT 16h Keyboard Service Entry Point > diff --git a/src/mouse.c b/src/mouse.c > index 52e225c..888d32d 100644 > --- a/src/mouse.c > +++ b/src/mouse.c > @@ -29,13 +29,8 @@ mouse_setup(void) > #define RET_ENOHANDLER 0x05 > > static int > -disable_mouse(u16 ebda_seg) > +disable_mouse(void) > { > - u8 ps2ctr = GET_EBDA2(ebda_seg, ps2ctr); > - ps2ctr |= I8042_CTR_AUXDIS; > - ps2ctr &= ~I8042_CTR_AUXINT; > - SET_EBDA2(ebda_seg, ps2ctr, ps2ctr); > - > return aux_command(PSMOUSE_CMD_DISABLE, NULL); > } > > @@ -43,8 +38,7 @@ disable_mouse(u16 ebda_seg) > static void > mouse_15c20000(struct bregs *regs) > { > - u16 ebda_seg = get_ebda_seg(); > - int ret = disable_mouse(ebda_seg); > + int ret = disable_mouse(); > if (ret) > set_code_invalid(regs, RET_ENEEDRESEND); > else > @@ -55,18 +49,12 @@ mouse_15c20000(struct bregs *regs) > static void > mouse_15c20001(struct bregs *regs) > { > - u16 ebda_seg = get_ebda_seg(); > - u8 mouse_flags_2 = GET_EBDA2(ebda_seg, mouse_flag2); > + u8 mouse_flags_2 = GET_EBDA(mouse_flag2); > if ((mouse_flags_2 & 0x80) == 0) { > set_code_invalid(regs, RET_ENOHANDLER); > return; > } > > - u8 ps2ctr = GET_EBDA2(ebda_seg, ps2ctr); > - ps2ctr &= ~I8042_CTR_AUXDIS; > - ps2ctr |= I8042_CTR_AUXINT; > - SET_EBDA2(ebda_seg, ps2ctr, ps2ctr); > - > int ret = aux_command(PSMOUSE_CMD_ENABLE, NULL); > if (ret) > set_code_invalid(regs, RET_ENEEDRESEND); > @@ -241,7 +229,7 @@ mouse_15c207(struct bregs *regs) > /* remove handler */ > if ((mouse_flags_2 & 0x80) != 0) { > mouse_flags_2 &= ~0x80; > - disable_mouse(ebda_seg); > + disable_mouse(); > } > } else { > /* install handler */ > diff --git a/src/ps2port.c b/src/ps2port.c > index fb9d24a..b52f994 100644 > --- a/src/ps2port.c > +++ b/src/ps2port.c > @@ -151,6 +151,18 @@ process_ps2byte(u8 status, u8 data) > process_key(data); > } > > +static void > +process_ps2bytes(void) > +{ > + for (;;) { > + u8 status = inb(PORT_PS2_STATUS); > + if (!(status & I8042_STR_OBF)) > + return; > + u8 data = inb(PORT_PS2_DATA); > + process_ps2byte(status, data); > + } > +} > + > static int > ps2_recvbyte(int aux, int needack, int timeout) > { > @@ -209,22 +221,13 @@ ps2_sendbyte(int aux, u8 command, int timeout) > static int > ps2_command(int aux, int command, u8 *param) > { > - int ret2; > + int ret; > int receive = (command >> 8) & 0xf; > int send = (command >> 12) & 0xf; > > - // Disable interrupts and keyboard/mouse. > - u8 ps2ctr = GET_EBDA(ps2ctr); > - u8 newctr = ps2ctr; > - if (aux) > - newctr |= I8042_CTR_KBDDIS; > - else > - newctr |= I8042_CTR_AUXDIS; > - newctr &= ~(I8042_CTR_KBDINT|I8042_CTR_AUXINT); > - dprintf(6, "i8042 ctr old=%x new=%x\n", ps2ctr, newctr); > - int ret = i8042_command(I8042_CMD_CTL_WCTR, &newctr); > - if (ret) > - return ret; > + // Disable processing of interrupts. > + u8 kbdflag = GET_BDA(kbd_flag3); > + SET_BDA(kbd_flag3, kbdflag | KF3_CMD_PENDING); > > if (command == ATKBD_CMD_RESET_BAT) { > // Reset is special wrt timeouts. > @@ -270,10 +273,10 @@ ps2_command(int aux, int command, u8 *param) > ret = 0; > > fail: > - // Restore interrupts and keyboard/mouse. > - ret2 = i8042_command(I8042_CMD_CTL_WCTR, &ps2ctr); > - if (ret2) > - return ret2; > + // Restore processing of interrupts. > + if (!(kbdflag & KF3_CMD_PENDING)) > + process_ps2bytes(); > + SET_BDA(kbd_flag3, kbdflag); > > return ret; > } > @@ -306,14 +309,10 @@ aux_command(int command, u8 *param) > static void > process_ps2irq(void) > { > - u8 status = inb(PORT_PS2_STATUS); > - if (!(status & I8042_STR_OBF)) { > - dprintf(1, "ps2 irq but no data.\n"); > + if (GET_BDA(kbd_flag3) & KF3_CMD_PENDING) > + // PS/2 command in progress - it will handle this event. > return; > - } > - u8 data = inb(PORT_PS2_DATA); > - > - process_ps2byte(status, data); > + process_ps2bytes(); > } > > // INT74h : PS/2 mouse hardware interrupt > @@ -402,8 +401,12 @@ keyboard_init(void *data) > if (ret) > return; > > - // Keyboard Mode: scan code convert, disable mouse, enable IRQ 1 > - SET_EBDA(ps2ctr, I8042_CTR_AUXDIS | I8042_CTR_XLATE | I8042_CTR_KBDINT); > + // Mode: scan code convert, enable IRQ 1, enable IRQ 12 > + param[0] = I8042_CTR_XLATE | I8042_CTR_KBDINT | I8042_CTR_AUXINT; > + ret = i8042_command(I8042_CMD_CTL_WCTR, param); > + if (ret) > + return; > + CLEARBITS_BDA(kbd_flag3, KF3_CMD_PENDING); > > /* Enable keyboard */ > ret = kbd_command(ATKBD_CMD_ENABLE, NULL); > @@ -420,6 +423,8 @@ ps2port_setup(void) > return; > dprintf(3, "init ps2port\n"); > > + // Setup irqs, but disable them until init complete. > + SETBITS_BDA(kbd_flag3, KF3_CMD_PENDING); > enable_hwirq(1, entry_09); > enable_hwirq(12, entry_74); > > > -- > coreboot mailing list: [email protected] > http://www.coreboot.org/mailman/listinfo/coreboot > > ____________________________________________________ Je m’évite la cohue dans les magasins et je profite des petits prix sur http://shopping.voila.fr -- coreboot mailing list: [email protected] http://www.coreboot.org/mailman/listinfo/coreboot

