update HOWTO fos sis.
ipl for 3com905 on dell 350 Working on new superio
This commit is contained in:
parent
688d211896
commit
d8582a896b
3 changed files with 159 additions and 105 deletions
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue