update HOWTO fos sis.

ipl for 3com905 on dell 350

Working on new superio
This commit is contained in:
Ronald G. Minnich 2001-07-18 14:18:30 +00:00
commit d8582a896b
3 changed files with 159 additions and 105 deletions

View file

@ -164,6 +164,9 @@ o You now need to figure out where you want to put your build images.
# We're using disk on chip. Tell it where to find the docipl code
docipl northsouthbridge/sis/630
# Tell Config that we're going to use DOC Millenium as the source
# of the compressed image
option USE_DOC_MIL

View file

@ -31,9 +31,55 @@
#include "ipl.h"
.org 0xfe000
.code16
.org 0xfe00
_start: jmp _realstart
gdt: //GDT entry 0 (null segment)
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
// GDT 1
.word 0xffff, 0x0000 /* flat code segment */
.byte 0x0, 0x9a, 0xcf, 0x0
.word 0xffff, 0x0000 /* flat data segment */
.byte 0x0, 0x92, 0xcf, 0x0
gdtptr:
.word 4*8-1
.long gdt /* we know the offset */
.long 0
_realstart:
cli
movw %cs, %ax
movw %ax, %es
.byte 0x66 /* prefix */
.byte 0x26
.byte 0x0f, 0x01, 0x16 /* lgdt [es:offset]*/
.word gdtptr - EXT(_start) /* offset in segment */
movl %cr0, %eax
andl $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */
orl $0x60000001, %eax /* CD, NW, PE = 1 */
movl %eax, %cr0
/* invalidate the cache */
invd
data32 ljmp $0x10, $.Lprotected
.Lprotected:
.code32
movw $0x18, %bx
movw %bx, %ds
movw %bx, %es
/*
movw %bx, %fs
movw %bx, %gs
*/
movw %bx, %ss
// ALL CODE BELOW THIS POINT SUCKS
dell350_3com905_start:
cli # Disables the maskable
# hardware interrupts.

View file

@ -28,131 +28,136 @@ smc_configuration_state(struct superio *s, int state)
addr = s->port;
if (state) {
outb(0x55, addr);
return(0);
}
else {
outb(0xAA, addr);
return(0);
}
return(0);
}
else {
outb(0xAA, addr);
return(0);
}
return(-1);
return(-1);
}
static int smc_write(struct superio *s, unsigned char data,
unsigned char index) {
unsigned char index)
{
unsigned char addr;
addr = s->port;
outb(index, addr);
outb(data, addr+1);
return(0);
outb(index, addr);
outb(data, addr+1);
return(0);
}
static int smc_read(struct superio *s,
unsigned char index, unsigned char *data) {
unsigned char index, unsigned char *data)
{
unsigned char addr;
addr = s->port;
if ((addr!=0x370) && (addr!=0x3f0)) return(-1);
if ((addr!=0x370) && (addr!=0x3f0)) return(-1);
outb(index, addr);
*data = inb(addr+1);
return(0);
outb(index, addr);
*data = inb(addr+1);
return(0);
}
static int smc_uart_setup(struct superio *s,
int addr1, int irq1,
int addr2, int irq2) {
int addr1, int irq1,
int addr2, int irq2)
{
unsigned char addr = s->port;
int rv;
unsigned char int1, int2;
unsigned char data;
int rv;
unsigned char int1, int2;
unsigned char data;
/*
* Warning:
* Board specifc mapping of IRQs here.
* A configuration mechanism is needed.
*/
/*
* Warning:
* Board specifc mapping of IRQs here.
* A configuration mechanism is needed.
*/
switch (irq1) {
case 3: int1 = 1; break;
case 4: int1 = 2; break;
case 5: int1 = 3; break;
case 6: int1 = 4; break;
case 7: int1 = 5; break;
case 10: int1 = 6; break;
case 11: int1 = 8; break;
default: int1 = 0;
}
switch (irq1) {
case 3: int1 = 1; break;
case 4: int1 = 2; break;
case 5: int1 = 3; break;
case 6: int1 = 4; break;
case 7: int1 = 5; break;
case 10: int1 = 6; break;
case 11: int1 = 8; break;
default: int1 = 0;
}
switch (irq2) {
case 3: int2 = 1; break;
case 4: int2 = 2; break;
case 5: int2 = 3; break;
case 6: int2 = 4; break;
case 7: int2 = 5; break;
case 10: int2 = 6; break;
case 11: int2 = 8; break;
default: int2 = 0;
}
switch (irq2) {
case 3: int2 = 1; break;
case 4: int2 = 2; break;
case 5: int2 = 3; break;
case 6: int2 = 4; break;
case 7: int2 = 5; break;
case 10: int2 = 6; break;
case 11: int2 = 8; break;
default: int2 = 0;
}
if (int1 == int2) {
int2 = 0x0f;
}
if (int1 == int2) {
int2 = 0x0f;
}
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_write(addr, (addr1>>2) & 0xfe, 0x24); if (rv) return(rv);
rv = smc_write(addr, (addr2>>2) & 0xfe, 0x25); if (rv) return(rv);
rv = smc_write(addr, (int1<<4) | int2, 0x28); if (rv) return(rv);
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_write(addr, (addr1>>2) & 0xfe, 0x24); if (rv) return(rv);
rv = smc_write(addr, (addr2>>2) & 0xfe, 0x25); if (rv) return(rv);
rv = smc_write(addr, (int1<<4) | int2, 0x28); if (rv) return(rv);
/* Enable INTB output */
/* Enable INTB output */
if ((int1==2) || (int2==2)) {
rv = smc_read(addr, 0x03, &data); if (rv) return(rv);
rv = smc_write(addr, data | 0x84, 0x03); if (rv) return(rv);
}
if ((int1==2) || (int2==2)) {
rv = smc_read(addr, 0x03, &data); if (rv) return(rv);
rv = smc_write(addr, data | 0x84, 0x03); if (rv) return(rv);
}
rv = smc_configuration_state(addr, 0); return(rv);
rv = smc_configuration_state(addr, 0); return(rv);
}
static int smc_pp_setup(struct superio *s, int pp_addr, int mode) {
static int smc_pp_setup(struct superio *s, int pp_addr, int mode)
{
unsigned char addr = s->port;
int rv;
unsigned char data;
int rv;
unsigned char data;
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_read(addr, 0x04, &data); if (rv) return(rv);
data = (data & (~0x03)) | (mode & 0x03);
rv = smc_write(addr, data, 0x04); if (rv) return(rv);
rv = smc_read(addr, 0x04, &data); if (rv) return(rv);
data = (data & (~0x03)) | (mode & 0x03);
rv = smc_write(addr, data, 0x04); if (rv) return(rv);
rv = smc_read(addr, 0x01, &data); if (rv) return(rv);
data = data & (~0x08);
rv = smc_write(addr, data, 0x01); if (rv) return(rv);
rv = smc_read(addr, 0x01, &data); if (rv) return(rv);
data = data & (~0x08);
rv = smc_write(addr, data, 0x01); if (rv) return(rv);
rv = smc_write(addr, (pp_addr>>2) & 0xff, 0x23); if (rv) return(rv);
rv = smc_write(addr, (pp_addr>>2) & 0xff, 0x23); if (rv) return(rv);
rv = smc_configuration_state(addr, 0); return(rv);
rv = smc_configuration_state(addr, 0); return(rv);
}
static int smc_validbit(struct superio *s, int valid) {
static int smc_validbit(struct superio *s, int valid)
{
unsigned short addr = s->port;
int rv;
unsigned char data;
int rv;
unsigned char data;
if ((addr!=0x370) && (addr!=0x3f0)) return(-1);
if ((addr!=0x370) && (addr!=0x3f0)) return(-1);
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_read(addr, 0x00, &data); if (rv) return(rv);
rv = smc_configuration_state(addr, 1); if (rv) return(rv);
rv = smc_read(addr, 0x00, &data); if (rv) return(rv);
if (valid) {
data = data | 0x80;
}
else {
data = data & (~0x80);
}
if (valid) {
data = data | 0x80;
}
else {
data = data & (~0x80);
}
rv = smc_write(addr, data, 0x00); if (rv) return(rv);
rv = smc_configuration_state(addr, 0); return(rv);
rv = smc_write(addr, data, 0x00); if (rv) return(rv);
rv = smc_configuration_state(addr, 0); return(rv);
}
static void
@ -160,27 +165,27 @@ finishup(struct superio *s)
{
#if 0
// fix me later
enter_pnp(s);
enter_pnp(s);
// don't fool with IDE just yet ...
// don't fool with IDE just yet ...
// if (s->floppy)
// enable_floppy(s);
if (s->com1.enable)
enable_com(s, PNP_COM1_DEVICE);
if (s->com2.enable)
enable_com(s, PNP_COM2_DEVICE);
if (s->com1.enable)
enable_com(s, PNP_COM1_DEVICE);
if (s->com2.enable)
enable_com(s, PNP_COM2_DEVICE);
if (s->lpt)
enable_lpt(s);
if (s->lpt)
enable_lpt(s);
exit_pnp(s);
exit_pnp(s);
#endif
}
struct superio_control superio_sis_950_control = {
(void *)0, (void *)0, finishup, 0x2e, "SiS 950"
(void *)0, (void *)0, finishup, 0x370, "SMC fdc37b807"
};