Nikolai Vladychevski wrote:
>
> J. J. Baribeau writes:
>
> > I just had a look at
> > http://www.sis.com/products/chipsets/integrated/socketa/730s.htm and the
> > block diagram shows the two PHY's
> what's PHY ??? where could I read about it?
>
> > one to a HomePNA
> here in Mexico nobody knows what it is..... I guess it's still a high
> technology for us ....
>
> > and one to what looks like a mother board add on!
> > I hope this problem can be solved since I just ordered the board yesterday.
>
> really? welcome to the club!!! :) Now you gonna suffer like me, hehehe :)
>
> I finaly got rid of sis900, but I couldn't do it in linuxbios, I had to
> modify the kernel so it will refuse to configure that device. I would like
> to know if Sis900 can be disabled from hadware, using the sis730 chipset,
> but only Ollie can tell us how, isn't it?
>
> Well, since I disconfigured sis900, my modem looks like now get the
> interrupts and is receiving data, but it still can't read from it anything.
>
> I beleive that unregistering sis900 at hardware level will make my modem
> work. Ollie, please help !!!!
>
Disabling SiS900 (and other integrated device) in the hardware level is
the most dark side undocumented stuff. I can tell you but I have to kill
you. See the attached ipl.S
Ollie
/*
* ipl.S: Initial Program Loader (IPL) for SiS 730 and M-System DoC Millennium
*
*
* Copyright 2000 Silicon Integrated Systems Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
* Reference:
* 1. SiS 730 Specification
* 2. System Management Bus Specification Rev 1.1
* 3. PC SDRAM Serial Presence Detect (SPD) Specification Rev 1.2B
* 4. Booting From the DiskOnChip Millennium, M-Systems Application Note
Ap-DOC-044
* APR-2000, 93-SR-001-44-7L REV. 1.0
*
* $Id: ipl.S,v 1.6 2001/07/19 03:10:50 ollie Exp $
*/
#include "ipl.h"
.code16
#ifdef STD_FLASH
.org 0xfe00
#endif
#define SIZE_ALL
#define REALLY_COMPACT
sis730spd_start:
cli # Disables the maskable
# hardware interrupts.
movw %cs, %ax # makes data segment ==
movw %ax, %ds # code segment
movw $0x408a, %ax # ACPI Enable.
CALL_SP(write_lpc_register) # (for use of SMBus)
movw $0x7550, %ax # Store ACPI Base Address.
CALL_SP(write_lpc_register) # (for use of SMBus)
#ifdef DISABLE_INTERNAL_DEVICES
movw $0x7c0e, %ax # Writting undocumented LPC register
CALL_SP(write_lpc_register) # 0x7c to disable intergrated devices.
#endif /* DISABLE_INTERNAL_DEVICES */
movw $0x5501, %ax # Mode# enable, this bit
CALL_SP(write_pci_register) # should be set before sizing.
#ifdef SIZE_ALL
xorw %bx, %bx # clear %fs, %fs is used as "bitmap" of
movw %bx, %fs # install DIMM slot
#endif /* SIZE_ALL */
spd_sizing_start:
#ifndef REALLY_COMPACT
movw $0x0320, %ax # Issue an SMB_Kill command to
CALL_BP(sis_set_smbus) # stop all SMBus operation
#endif /* REALLY_COMPACT */
movw $0x04a1, %ax # SPD is on SMBUS Address 1010 xyz1
# where xyz are DIMM Slot Number
#ifdef SIZE_ALL
addb %bh, %al # FIXME, %bh == 0 ??
addb %bh, %al # Select the DIMM to be SPD-sized.
#endif /* SIZE_ALL*/
CALL_BP(sis_set_smbus)
movb $0x02, %al # Read the RAM Type (SPD byte 2)
CALL_SP(read_spd) # of the dram on current DIMM.
cmpb $0x04, %bl # If the RAM Type = SDRAM ??
jne no_sdram # no, exit
movb $0x03, %al # Read the Row number (SPD byte 3)
CALL_SP(read_spd) # of the dram on current DIMM.
movb %bl, %ch # save the Row number in CH.
movb $0x04, %al # Read the Column number (SPD byte 4)
CALL_SP(read_spd) # of the dram on current DIMM.
movb %bl, %cl # Save the Column number in CL.
movb $0x11, %al # Read the Bank number (SPD byte 17)
CALL_SP(read_spd) # of the dram on current DIMM.
#ifdef SIZE_ALL
movb %bh, %ah # Save the current DIMM slot number in
AH
#endif
cmpb $0x01, %bl
je one_bank
movw $sdram_type_bank_2, %si
jmp check_row_column
one_bank:
movw $sdram_type_bank_1, %si
check_row_column:
#ifdef SAFTY_CHECK
cmpb $0x0b, %ch # Row number too small, unsupported.
jb no_sdram
cmpb $0x0d, %ch # Row number too big, unsupported.
jl no_sdram
cmpb $0x08, %cl # Col number too small, unsupported.
jb no_sdram
cmpb $0x0b, %cl # Col number too big, unsupported.
jl no_sdram
#endif /* SAFTY_CHECK */
#if 0
subb $0x0b, %ch # row = row - 11
shlb $0x02, %ch # row * 4
addb %ch, %cl # column + row *4
movzbw %cl, %bx # Get the SDRAM type.
addw %bx, %si # sdram_type_bank[column + row * 4]
movb -8(%si), %cl # sdram_type_bank[column + row * 4 - 8]
#else
/* This one is DANGEROUS TOO, be careful about OVERFLOW !!! */
shlb $0x02, %ch # row * 4
addb %ch, %cl # column + row *4
xorb %ch, %ch
addw %cx, %si # sdram_type_bank[column + row * 4]
movb -52(%si), %cl # sdram_type_bank[column + row * 4 -
52]
#endif
#ifdef SIZE_ALL
movb %ah, %bh # Restore DIMM slot number from AH to
BH
#endif /* SIZE_ALL */
#ifdef SAFTY_CHECK
cmpb $0xff, %cl # SDRAM type supported ??
je no_sdram # no, exit
#endif /* SAFTY_CHECK */
movb $0x05, %al # Read the Side number (SPD byte 5)
CALL_SP(read_spd) # of the dram on current DIMM.
cmpb $0x02, %bl # single or double sided ??
jne single_side
orb $0x20, %cl # set double side bit
# (reg 0x60~0x62 bit 5)
single_side:
movb %cl, %al # store DRAM type in al
movb $0x60, %ah # select register 0x60
#ifdef SIZE_ALL
addb %bh, %ah # select register 0x61, 0x62, accroding
# to DIMM slot number (in BH)
#endif /* SIZE_ALL */
CALL_SP(write_pci_register) # write register 0x60~0x62 for each
# DIMM slot
#ifdef SIZE_ALL
movw %fs, %ax # enable DIMMx on reg. 63h and save
# it in FS
movb $0x01, %bl
movb %bh, %cl
shlb %cl, %bl
orb %bl, %al
movw %ax, %fs
no_sdram:
incb %bh
cmpb $0x03, %bh # total 3 DIMM slots supported
jb spd_sizing_start
movw %fs, %ax
movb $0x63, %ah
#ifdef HAVE_FRAMEBUFFER
orb $SMA_SIZE, %al # enable SMA 8 MB for VGA
#endif /* HAVE_FRAMEBUFFER */
#else /* !SIZE_ALL */
no_sdram:
#ifdef HAVE_FRAMEBUFFER
movb $0x63, %ah # enable DIMM 0 and
movb $(SMA_SIZE + 0x01), %al # enable SMA 8 MB for VGA
#else /* HAVE_FRAMEBUFFER */
movw $0x6301, %ax # enable DIMM 0
#endif /* HAVE_FRAMEBUFFER */
#endif /* SIZE_ALL */
CALL_SP(write_pci_register) # write register 0x63
movw $pci_init_table, %si
init_sdram:
lodsw (%si), %ax
testw %ax, %ax
jz init_complete
CALL_SP(write_pci_register)
jmp init_sdram
init_complete:
sis730ipl_start:
/* O.K. we have DRAM now, so set up STACK for CALL/RET */
movw $DOC_STACK_SEG, %ax
movw %ax, %ss
movw $SPL_RAM_SEG, %ax
movw %ax, %es
#ifdef STD_FLASH
movw $0xf000, %ax
movw %ax, %ds
xorw %sp, %sp # clear %sp
xorw %si, %si
xorw %di, %di
movw $0xffff, %cx
rep
movsb
movw $DOC_WIN_SEG, %ax
movw %ax, %ds
#else /* !STD_FLASH */
movw $sis950_init_table, %si # unlock SiS 950 LPC
movw $0x05, %cx # select Clock Selection
movw $0x2e, %dx # and Flash ROM I/F
rep
outsb
movb $0xfd, %al # enable write, CLKIN = 24 MHZ
outb %al, $0x2f
xorw %sp, %sp # clear %sp
xorw %dx, %dx # clear %dx, start of RAM
movw $0x800, %si # point %si to CDSN Data area
movw $0x1000, %di # point %di to CDSN Control area
movw $DOC_SPL_START_BLK, %bp # start page of LinuxBIOS
movb $0x84, %al # Reset DOC Millennium
call doc_reset
movb $0x85, %al # Turn into Normal Mode
call doc_reset
read_next_page:
movw $0x1000, %di # point %di to CDSN Control area
flash_command:
movb $0x03, 0x04(%di) # start command cycle
movb $0x00, (%si) # issue flash command Read00
call doc_cycle_end
movw %bp, %bx # %bp is current page number
flash_address:
shll $0x08, %ebx
movb $0x03, %cl # this one is DANGEROUS but I am
# sure the upper 3 bytes == 0x00
movb $0x05, 0x04(%di) # start address cycle
0:
movb %bl, (%si) # write address to CDSNIO
shrw $0x08, %bx # shift next address byte
loop 0b
call doc_cycle_end
wait_for_flash_ready:
/* delay by reding NOP register before polling the FLASH READY bit,
this is inlined to save a call/ret pair */
doc_delay:
movb $0x04, %cl # this one is DANGEROUS but I am
# sure the upper 3 bytes == 0x00
0:
movb 0x20(%di), %al # read DOC NOP retisger
loop 0b # four times
testb $0x80, 0x04(%di) # is flash ready ?
jz wait_for_flash_ready
movb 0x1d(%di), %al # init read pipeline
movw $0x100, %cx # 1 page = 512 bytes
movw $0x800, %si # point %si to CDSN Data area
movw %dx, %di # restore saved current destination
rep
movsw
movw %di, %dx # save current destination
incw %bp # increse current page number
cmpw $128, %bp # moved 63 KB ??
jl read_next_page # no, read next page
#endif /* STD_FLASH */
sis730ipl_end:
jmp spl_vector # jump to SPL vector
/*
------------------------------------------------------------------------------------------*/
write_lpc_register:
/* Input: AH - register number. AL - register value. */
movl $LPC_BRIDGE_BASE_ADDR, %edx
jmp write_common
write_pci_register:
/* Input: AH - register number. AL - register value. */
movl $NORTH_BRIDGE_BASE_ADDR, %edx
write_common:
movw %ax, %cx # Save %ax to %cx.
movzbl %ch, %eax # add register address to
addl %edx, %eax # PCI base address
movw $PCI_COMMAND_PORT, %dx
outl %eax, %dx
movw $PCI_DATA_PORT, %dx
andb $0x03, %al
addb %al, %dl
movb %cl, %al
outb %al, %dx
RET_SP # End of write_[lpc|pci]_reg
read_spd:
/* Input: AH = 05h, AL = byte number of SPD to be read.
Output: BL = The value of specified SPD byte. */
movb $0x05, %ah # set SMB Command == byte address
CALL_BP(sis_set_smbus)
movw $0x0312, %ax # Start, R/W byte Data
CALL_BP(sis_set_smbus)
wait_for_smbus_read:
movb $0x80, %dl # Read SMBus status
inb %dx, %al
testb $0x02, %al # if device errors
jnz read_spd_fail # then skip read SPD
testb $0x08, %al # if not complete
jz wait_for_smbus_read # then wait SPD data complete
read_spd_fail:
movb $0x08, %ah
sis_get_smbus:
/* Input: AH - register index.
Output: AL - register value. */
addb %ah, %dl # read SMBus byte 0
inb %dx, %al
movb %al, %bl # return result in BL
movw $0x00ff, %ax
CALL_BP(sis_set_smbus) # clear ACPI 80h status
RET_SP # End of read_spd
sis_set_smbus:
/* Input: AH - register index. AL - register value. */
movw $SMB_BASE_ADDR, %dx
addb %ah, %dl
outb %al, %dx
RET_BP # End of sis_set_smbus
doc_reset:
/* Input: AL = value write to DOC_CONTROL register
Clobberd: CX */
movb %al, 0x02(%di) # write DoC Control retister
movb %al, 0x02(%di) # twice
ret # End of doc_reset
doc_cycle_end:
movb $0x00, 0x1e(%di) # flush write pepeline
movb $0x01, 0x04(%di) # end command cycle
ret
sdram_type_bank_1:
# Column Number 8 9 10 11 Row Number
.byte 0b0000, 0b0100, 0b1000, 0xff # 11
.byte 0xff, 0xff, 0xff, 0xff # 12
.byte 0b0001, 0b0101, 0b1001, 0b1101 # 13
sdram_type_bank_2:
# Column Number 8 9 10 11 Row Number
.byte 0b1100, 0xff, 0xff, 0xff # 11
.byte 0b0010, 0b0110, 0b1010, 0b1110 # 12
.byte 0b0011, 0b0111, 0b1011, 0b1111 # 13
pci_init_table:
# High Byte -> Register Low Byte -> Value
#include "dll.inc"
.word 0x0407 # Turn on Bus Master, Memory/IO Space
.word 0x5280 # Set Memory Connamd Output Timming to Delay 1T
.word 0x5680 # Precharge
.word 0x5640 # Mode Register Set
.word 0x5620 # Refresh
.word 0x5620 # Refresh
.word 0x5620 # Refresh
.word 0x50c5 # Refresh Cycle Enable
#.byte 0x5601 # CAS = 3T
.word 0x0000 /* Null, End of table */
#ifdef STD_FLASH
.org 0xfff0
reset_vector:
.byte 0xea # jmp to f000:fe00, where IPL
.word 0xfe00, 0xf000 # starts in Standard Flash
#else /* !STD_FLASH i.e. DoC Mil */
.org 0x1f0
reset_vector:
.byte 0xea # jmp to fe00:0000, where IPL
.word 0x0000, DOC_WIN_SEG # starts in DoC
#endif /* STD_FLASH */
spl_vector:
.byte 0xea # jmp to 8000:0000, where SPL
.word 0x0000, SPL_RAM_SEG # (LinuxBIOS) starts in RAM
sis950_init_table:
.byte 0x87, 0x01, 0x55, 0x55, 0x24
end:
hlt