sb/intel/bd82x6x: Add and use more RCBA defines

Taken from
"Intel 6 Series Chipset and Intel C200 Series Chipset"
Document Number: 324645-006 and
"Intel 5 Series Chipset and Intel 3400 Series Chipset"
Document Number: 322169-004 and
"Intel 6 Series Chipset"
Document Number: 324645-001.

UPDCR was found in GNU/Linux's drivers/pci/quirks.c.
DMC2 was guessed as it's close to DMC and defined for 5 series chipset.

Test:
Run BUILD_TIMELESS=1 and compared the coreboot.roms, no differences.

Change-Id: I4fed7c38078cabd4308424c7547416e87c9e6fa7
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34334
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Patrick Rudolph 2019-07-14 11:54:58 +02:00 committed by Patrick Rudolph
parent 44443696af
commit 4f8b108288
7 changed files with 176 additions and 115 deletions

View File

@ -242,11 +242,11 @@ static void azalia_init(struct device *dev)
base = res2mmio(res, 0, 0);
printk(BIOS_DEBUG, "Azalia: base = %08x\n", (u32)base);
if (RCBA32(0x2030) & (1 << 31)) {
if (RCBA32(CIR31) & (1 << 31)) {
reg32 = pci_read_config32(dev, 0x120);
reg32 &= 0xf8ffff01;
reg32 |= (1 << 24); // 2 << 24 for server
reg32 |= RCBA32(0x2030) & 0xfe;
reg32 |= RCBA32(CIR31) & 0xfe;
pci_write_config32(dev, 0x120, reg32);
reg16 = pci_read_config16(dev, 0x78);

View File

@ -72,24 +72,24 @@ write_iobp(u32 address, u32 val)
void early_pch_init_native_dmi_pre(void)
{
/* Link Capabilities Register */
RCBA32(0x21a4) = (RCBA32(0x21a4) & ~0x3fc00) |
RCBA32(LCAP) = (RCBA32(LCAP) & ~0x3fc00) |
(3 << 10) | // L0s and L1 entry supported
(2 << 12) | // L0s 128 ns to less than 256 ns
(2 << 15); // L1 2 us to less than 4 us
RCBA32(0x2340) = (RCBA32(0x2340) & ~0xff0000) | (0x3a << 16);
RCBA8(0x21b0) = (RCBA8(0x21b0) & ~0xf) | 2;
RCBA8(DLCTL2) = (RCBA8(DLCTL2) & ~0xf) | 2;
}
void early_pch_init_native_dmi_post(void)
{
RCBA32(0x0050); // !!! = 0x01200654
RCBA32(0x0050) = 0x01200654;
RCBA32(0x0050); // !!! = 0x01200654
RCBA32(0x0050) = 0x012a0654;
RCBA32(0x0050); // !!! = 0x012a0654
RCBA8(0x1114); // !!! = 0x00
RCBA8(0x1114) = 0x05;
RCBA32(CIR0); // !!! = 0x01200654
RCBA32(CIR0) = 0x01200654;
RCBA32(CIR0); // !!! = 0x01200654
RCBA32(CIR0) = 0x012a0654;
RCBA32(CIR0); // !!! = 0x012a0654
RCBA8(UPDCR); // !!! = 0x00
RCBA8(UPDCR) = 0x05;
/*
* Virtual Channel resources must match settings in DMIBAR!
@ -106,42 +106,42 @@ void early_pch_init_native_dmi_post(void)
* Map TC0 and TC3 and TC4 to VC0.
*/
RCBA32(0x2014) = (1 << 31) | (0 << 24) | (0x0c << 1) | 1;
RCBA32(V0CTL) = (1 << 31) | (0 << 24) | (0x0c << 1) | 1;
/* Virtual Channel 1 Resource Control Register.
* Enable channel.
* Set Virtual Channel Identifier.
* Map TC1 and TC5 to VC1.
*/
RCBA32(0x2020) = (1 << 31) | (1 << 24) | (0x11 << 1);
RCBA32(V1CTL) = (1 << 31) | (1 << 24) | (0x11 << 1);
/* Read back register */
RCBA32(0x2020);
RCBA32(V1CTL);
/* Virtual Channel private Resource Control Register.
* Enable channel.
* Set Virtual Channel Identifier.
* Map TC2 and TC6 to VCp.
*/
RCBA32(0x2030) = (1 << 31) | (2 << 24) | (0x22 << 1);
RCBA32(CIR31) = (1 << 31) | (2 << 24) | (0x22 << 1);
/* Read back register */
RCBA32(0x2030);
RCBA32(CIR31);
/* Virtual Channel ME Resource Control Register.
* Enable channel.
* Set Virtual Channel Identifier.
* Map TC7 to VCm.
*/
RCBA32(0x2040) = (1 << 31) | (7 << 24) | (0x40 << 1);
RCBA32(CIR32) = (1 << 31) | (7 << 24) | (0x40 << 1);
/* Lock Virtual Channel Resource control register. */
RCBA32(0x0050) |= 0x80000000;
RCBA32(CIR0) |= TCLOCKDN;
/* Read back register */
RCBA32(0x0050);
RCBA32(CIR0);
/* Wait for virtual channels negotiation pending */
while (RCBA16(0x201a) & VCNEGPND)
while (RCBA16(V0STS) & VCNEGPND)
;
while (RCBA16(0x2026) & VCNEGPND)
while (RCBA16(V1STS) & VCNEGPND)
;
while (RCBA16(0x2036) & VCNEGPND)
;
@ -155,17 +155,17 @@ early_pch_init_native (void)
pci_write_config8 (SOUTHBRIDGE, 0xa6,
pci_read_config8 (SOUTHBRIDGE, 0xa6) | 2);
RCBA32(0x2088) = 0x00109000;
RCBA32(0x20ac); // !!! = 0x00000000
RCBA32(0x20ac) = 0x40000000;
RCBA32(CIR1) = 0x00109000;
RCBA32(REC); // !!! = 0x00000000
RCBA32(REC) = 0x40000000;
RCBA32(0x100c) = 0x01110000;
RCBA8(0x2340) = 0x1b;
RCBA32(0x2314); // !!! = 0x0a080000
RCBA32(0x2314) = 0x0a280000;
RCBA32(CIR6); // !!! = 0x0a080000
RCBA32(CIR6) = 0x0a280000;
RCBA32(0x2310); // !!! = 0xc809605b
RCBA32(0x2310) = 0xa809605b;
RCBA32(0x2324) = 0x00854c74;
RCBA8(0x0400); // !!! = 0x00
RCBA32(DMC2) = 0x00854c74;
RCBA8(RPC); // !!! = 0x00
RCBA32(0x2310); // !!! = 0xa809605b
RCBA32(0x2310) = 0xa809605b;
RCBA32(0x2310); // !!! = 0xa809605b

View File

@ -39,7 +39,7 @@ void early_usb_init(const struct southbridge_usb_port *portmap)
write_pmbase16(UPRWC, read_pmbase16(UPRWC) | UPRWC_WR_EN);
for (i = 0; i < 14; i++)
RCBA32(0x3500 + 4 * i) = currents[portmap[i].current];
RCBA32(USBIR0 + 4 * i) = currents[portmap[i].current];
for (i = 0; i < 10; i++)
RCBA32(0x3538 + 4 * i) = 0;

View File

@ -269,9 +269,9 @@ static void pch_power_options(struct device *dev)
outl(reg32, pmbase + 0x04);
/* Clear magic status bits to prevent unexpected wake */
reg32 = RCBA32(0x3310);
reg32 = RCBA32(PRSTS);
reg32 |= (1 << 4)|(1 << 5)|(1 << 0);
RCBA32(0x3310) = reg32;
RCBA32(PRSTS) = reg32;
reg32 = RCBA32(0x3f02);
reg32 &= ~0xf;
@ -283,40 +283,40 @@ static void cpt_pm_init(struct device *dev)
{
printk(BIOS_DEBUG, "CougarPoint PM init\n");
pci_write_config8(dev, 0xa9, 0x47);
RCBA32_AND_OR(0x2238, ~0UL, (1 << 6)|(1 << 0));
RCBA32_AND_OR(0x228c, ~0UL, (1 << 0));
RCBA16_AND_OR(0x1100, ~0UL, (1 << 13)|(1 << 14));
RCBA16_AND_OR(0x0900, ~0UL, (1 << 14));
RCBA32(0x2304) = 0xc0388400;
RCBA32_AND_OR(0x2314, ~0UL, (1 << 5)|(1 << 18));
RCBA32_AND_OR(0x2320, ~0UL, (1 << 15)|(1 << 1));
RCBA32_AND_OR(0x3314, ~0x1f, 0xf);
RCBA32(0x3318) = 0x050f0000;
RCBA32(0x3324) = 0x04000000;
RCBA32_AND_OR(0x3340, ~0UL, 0xfffff);
RCBA32_AND_OR(0x3344, ~0UL, (1 << 1));
RCBA32(0x3360) = 0x0001c000;
RCBA32(0x3368) = 0x00061100;
RCBA32(0x3378) = 0x7f8fdfff;
RCBA32(0x337c) = 0x000003fc;
RCBA32(0x3388) = 0x00001000;
RCBA32(0x3390) = 0x0001c000;
RCBA32(0x33a0) = 0x00000800;
RCBA32(0x33b0) = 0x00001000;
RCBA32(0x33c0) = 0x00093900;
RCBA32(0x33cc) = 0x24653002;
RCBA32(0x33d0) = 0x062108fe;
RCBA32_AND_OR(0x33d4, 0xf000f000, 0x00670060);
RCBA32(0x3a28) = 0x01010000;
RCBA32(0x3a2c) = 0x01010404;
RCBA32(0x3a80) = 0x01041041;
RCBA32_AND_OR(0x3a84, ~0x0000ffff, 0x00001001);
RCBA32_AND_OR(0x3a84, ~0UL, (1 << 24)); /* SATA 2/3 disabled */
RCBA32_AND_OR(0x3a88, ~0UL, (1 << 0)); /* SATA 4/5 disabled */
RCBA32(0x3a6c) = 0x00000001;
RCBA32_AND_OR(CIR30, ~0UL, (1 << 6)|(1 << 0));
RCBA32_AND_OR(CIR5, ~0UL, (1 << 0));
RCBA16_AND_OR(CIR3, ~0UL, (1 << 13)|(1 << 14));
RCBA16_AND_OR(CIR2, ~0UL, (1 << 14));
RCBA32(DMC) = 0xc0388400;
RCBA32_AND_OR(CIR6, ~0UL, (1 << 5)|(1 << 18));
RCBA32_AND_OR(CIR9, ~0UL, (1 << 15)|(1 << 1));
RCBA32_AND_OR(CIR7, ~0x1f, 0xf);
RCBA32(PM_CFG) = 0x050f0000;
RCBA32(CIR8) = 0x04000000;
RCBA32_AND_OR(CIR10, ~0UL, 0xfffff);
RCBA32_AND_OR(CIR11, ~0UL, (1 << 1));
RCBA32(CIR12) = 0x0001c000;
RCBA32(CIR14) = 0x00061100;
RCBA32(CIR15) = 0x7f8fdfff;
RCBA32(CIR13) = 0x000003fc;
RCBA32(CIR16) = 0x00001000;
RCBA32(CIR18) = 0x0001c000;
RCBA32(CIR17) = 0x00000800;
RCBA32(CIR23) = 0x00001000;
RCBA32(CIR19) = 0x00093900;
RCBA32(CIR20) = 0x24653002;
RCBA32(CIR21) = 0x062108fe;
RCBA32_AND_OR(CIR22, 0xf000f000, 0x00670060);
RCBA32(CIR24) = 0x01010000;
RCBA32(CIR25) = 0x01010404;
RCBA32(CIR27) = 0x01041041;
RCBA32_AND_OR(CIR28, ~0x0000ffff, 0x00001001);
RCBA32_AND_OR(CIR28, ~0UL, (1 << 24)); /* SATA 2/3 disabled */
RCBA32_AND_OR(CIR29, ~0UL, (1 << 0)); /* SATA 4/5 disabled */
RCBA32(CIR26) = 0x00000001;
RCBA32_AND_OR(0x2344, 0x00ffff00, 0xff00000c);
RCBA32_AND_OR(0x80c, ~(0xff << 20), 0x11 << 20);
RCBA32(0x33c8) = 0;
RCBA32(PMSYNC_CFG) = 0;
RCBA32_AND_OR(0x21b0, ~0UL, 0xf);
}
@ -325,41 +325,41 @@ static void ppt_pm_init(struct device *dev)
{
printk(BIOS_DEBUG, "PantherPoint PM init\n");
pci_write_config8(dev, 0xa9, 0x47);
RCBA32_AND_OR(0x2238, ~0UL, (1 << 0));
RCBA32_AND_OR(0x228c, ~0UL, (1 << 0));
RCBA16_AND_OR(0x1100, ~0UL, (1 << 13)|(1 << 14));
RCBA16_AND_OR(0x0900, ~0UL, (1 << 14));
RCBA32(0x2304) = 0xc03b8400;
RCBA32_AND_OR(0x2314, ~0UL, (1 << 5)|(1 << 18));
RCBA32_AND_OR(0x2320, ~0UL, (1 << 15)|(1 << 1));
RCBA32_AND_OR(0x3314, ~0x1f, 0xf);
RCBA32(0x3318) = 0x054f0000;
RCBA32(0x3324) = 0x04000000;
RCBA32_AND_OR(0x3340, ~0UL, 0xfffff);
RCBA32_AND_OR(0x3344, ~0UL, (1 << 1)|(1 << 0));
RCBA32(0x3360) = 0x0001c000;
RCBA32(0x3368) = 0x00061100;
RCBA32(0x3378) = 0x7f8fdfff;
RCBA32(0x337c) = 0x000003fd;
RCBA32(0x3388) = 0x00001000;
RCBA32(0x3390) = 0x0001c000;
RCBA32(0x33a0) = 0x00000800;
RCBA32(0x33b0) = 0x00001000;
RCBA32(0x33c0) = 0x00093900;
RCBA32(0x33cc) = 0x24653002;
RCBA32(0x33d0) = 0x067388fe;
RCBA32_AND_OR(0x33d4, 0xf000f000, 0x00670060);
RCBA32(0x3a28) = 0x01010000;
RCBA32(0x3a2c) = 0x01010404;
RCBA32(0x3a80) = 0x01040000;
RCBA32_AND_OR(0x3a84, ~0x0000ffff, 0x00001001);
RCBA32_AND_OR(0x3a84, ~0UL, (1 << 24)); /* SATA 2/3 disabled */
RCBA32_AND_OR(0x3a88, ~0UL, (1 << 0)); /* SATA 4/5 disabled */
RCBA32(0x3a6c) = 0x00000001;
RCBA32_AND_OR(CIR30, ~0UL, (1 << 0));
RCBA32_AND_OR(CIR5, ~0UL, (1 << 0));
RCBA16_AND_OR(CIR3, ~0UL, (1 << 13)|(1 << 14));
RCBA16_AND_OR(CIR2, ~0UL, (1 << 14));
RCBA32(DMC) = 0xc03b8400;
RCBA32_AND_OR(CIR6, ~0UL, (1 << 5)|(1 << 18));
RCBA32_AND_OR(CIR9, ~0UL, (1 << 15)|(1 << 1));
RCBA32_AND_OR(CIR7, ~0x1f, 0xf);
RCBA32(PM_CFG) = 0x054f0000;
RCBA32(CIR8) = 0x04000000;
RCBA32_AND_OR(CIR10, ~0UL, 0xfffff);
RCBA32_AND_OR(CIR11, ~0UL, (1 << 1)|(1 << 0));
RCBA32(CIR12) = 0x0001c000;
RCBA32(CIR14) = 0x00061100;
RCBA32(CIR15) = 0x7f8fdfff;
RCBA32(CIR13) = 0x000003fd;
RCBA32(CIR16) = 0x00001000;
RCBA32(CIR18) = 0x0001c000;
RCBA32(CIR17) = 0x00000800;
RCBA32(CIR23) = 0x00001000;
RCBA32(CIR19) = 0x00093900;
RCBA32(CIR20) = 0x24653002;
RCBA32(CIR21) = 0x067388fe;
RCBA32_AND_OR(CIR22, 0xf000f000, 0x00670060);
RCBA32(CIR24) = 0x01010000;
RCBA32(CIR25) = 0x01010404;
RCBA32(CIR27) = 0x01040000;
RCBA32_AND_OR(CIR28, ~0x0000ffff, 0x00001001);
RCBA32_AND_OR(CIR28, ~0UL, (1 << 24)); /* SATA 2/3 disabled */
RCBA32_AND_OR(CIR29, ~0UL, (1 << 0)); /* SATA 4/5 disabled */
RCBA32(CIR26) = 0x00000001;
RCBA32_AND_OR(0x2344, 0x00ffff00, 0xff00000c);
RCBA32_AND_OR(0x80c, ~(0xff << 20), 0x11 << 20);
RCBA32_AND_OR(0x33a4, ~0UL, (1 << 0));
RCBA32(0x33c8) = 0;
RCBA32(PMSYNC_CFG) = 0;
RCBA32_AND_OR(0x21b0, ~0UL, 0xf);
}
@ -385,7 +385,7 @@ static void enable_clock_gating(struct device *dev)
u32 reg32;
u16 reg16;
RCBA32_AND_OR(0x2234, ~0UL, 0xf);
RCBA32_AND_OR(DMIC, ~0UL, 0xf);
reg16 = pci_read_config16(dev, GEN_PMCON_1);
reg16 |= (1 << 2) | (1 << 11);
@ -453,9 +453,9 @@ static void pch_fixups(struct device *dev)
/*
* Enable DMI ASPM in the PCH
*/
RCBA32_AND_OR(0x2304, ~(1 << 10), 0);
RCBA32_OR(0x21a4, (1 << 11)|(1 << 10));
RCBA32_OR(0x21a8, 0x3);
RCBA32_AND_OR(DMC, ~(1 << 10), 0);
RCBA32_OR(LCAP, (1 << 11)|(1 << 10));
RCBA32_OR(LCTL, 0x3);
}
static void pch_decode_init(struct device *dev)

View File

@ -256,19 +256,8 @@ early_usb_init (const struct southbridge_usb_port *portmap);
#define PMBASE 0x40
#define VCH 0x0000 /* 32bit */
#define VCAP1 0x0004 /* 32bit */
#define VCAP2 0x0008 /* 32bit */
#define PVC 0x000c /* 16bit */
#define PVS 0x000e /* 16bit */
#define V0CAP 0x0010 /* 32bit */
#define V0CTL 0x0014 /* 32bit */
#define V0STS 0x001a /* 16bit */
#define V1CAP 0x001c /* 32bit */
#define V1CTL 0x0020 /* 32bit */
#define V1STS 0x0026 /* 16bit */
#define CIR0 0x0050 /* 32bit */
#define TCLOCKDN (1u << 31)
#define RCTCL 0x0100 /* 32bit */
#define ESD 0x0104 /* 32bit */
@ -293,6 +282,10 @@ early_usb_init (const struct southbridge_usb_port *portmap);
#define RPC 0x0400 /* 32bit */
#define RPFN 0x0404 /* 32bit */
#define CIR2 0x900 /* 16bit */
#define CIR3 0x1100 /* 16bit */
#define UPDCR 0x1114 /* 32bit */
/* Root Port configuratinon space hide */
#define RPFN_HIDE(port) (1 << (((port) * 4) + 3))
/* Get the function number assigned to a Root Port */
@ -335,6 +328,27 @@ early_usb_init (const struct southbridge_usb_port *portmap);
#define PIRQG 6
#define PIRQH 7
/* DMI control */
#define V0CTL 0x2014 /* 32bit */
#define V0STS 0x201a /* 16bit */
#define V1CTL 0x2020 /* 32bit */
#define V1STS 0x2026 /* 16bit */
#define CIR31 0x2030 /* 32bit */
#define CIR32 0x2040 /* 32bit */
#define CIR1 0x2088 /* 32bit */
#define REC 0x20ac /* 32bit */
#define LCAP 0x21a4 /* 32bit */
#define LCTL 0x21a8 /* 16bit */
#define LSTS 0x21aa /* 16bit */
#define DLCTL2 0x21b0 /* 16bit */
#define DMIC 0x2234 /* 32bit */
#define CIR30 0x2238 /* 32bit */
#define CIR5 0x228c /* 32bit */
#define DMC 0x2304 /* 32bit */
#define CIR6 0x2314 /* 32bit */
#define CIR9 0x2320 /* 32bit */
#define DMC2 0x2324 /* 32bit - name guessed */
/* IO Buffer Programming */
#define IOBPIRI 0x2330
#define IOBPD 0x2334
@ -391,6 +405,26 @@ early_usb_init (const struct southbridge_usb_port *portmap);
RCBA16(x) = (((d) << DIR_IDR) | ((c) << DIR_ICR) | \
((b) << DIR_IBR) | ((a) << DIR_IAR))
#define PRSTS 0x3310 /* 32bit */
#define CIR7 0x3314 /* 32bit */
#define PM_CFG 0x3318 /* 32bit */
#define CIR8 0x3324 /* 32bit */
#define CIR10 0x3340 /* 32bit */
#define CIR11 0x3344 /* 32bit */
#define CIR12 0x3360 /* 32bit */
#define CIR14 0x3368 /* 32bit */
#define CIR15 0x3378 /* 32bit */
#define CIR13 0x337c /* 32bit */
#define CIR16 0x3388 /* 32bit */
#define CIR18 0x3390 /* 32bit */
#define CIR17 0x33a0 /* 32bit */
#define CIR23 0x33b0 /* 32bit */
#define CIR19 0x33c0 /* 32bit */
#define PMSYNC_CFG 0x33c8 /* 32bit */
#define CIR20 0x33cc /* 32bit */
#define CIR21 0x33d0 /* 32bit */
#define CIR22 0x33d4 /* 32bit */
#define RC 0x3400 /* 32bit */
#define HPTC 0x3404 /* 32bit */
#define GCS 0x3410 /* 32bit */
@ -422,11 +456,38 @@ early_usb_init (const struct southbridge_usb_port *portmap);
#define PCH_DISABLE_MEI1 (1 << 1)
#define PCH_ENABLE_DBDF (1 << 0)
/* USB Initialization Registers[13:0] */
#define USBIR0 0x3500 /* 32bit */
#define USBIR1 0x3504 /* 32bit */
#define USBIR2 0x3508 /* 32bit */
#define USBIR3 0x350c /* 32bit */
#define USBIR4 0x3510 /* 32bit */
#define USBIR5 0x3514 /* 32bit */
#define USBIR6 0x3518 /* 32bit */
#define USBIR7 0x351c /* 32bit */
#define USBIR8 0x3520 /* 32bit */
#define USBIR9 0x3524 /* 32bit */
#define USBIR10 0x3528 /* 32bit */
#define USBIR11 0x352c /* 32bit */
#define USBIR12 0x3530 /* 32bit */
#define USBIR13 0x3534 /* 32bit */
/* Miscellaneous Control Register */
#define MISCCTL 0x3590 /* 32bit */
/* USB Port Disable Override */
#define USBPDO 0x359c /* 32bit */
/* USB Overcurrent MAP Register */
#define USBOCM1 0x35a0 /* 32bit */
#define USBOCM2 0x35a4 /* 32bit */
/* Rate Matching Hub Wake Control Register */
#define RMHWKCTL 0x35b0 /* 32bit */
#define CIR24 0x3a28 /* 32bit */
#define CIR25 0x3a2c /* 32bit */
#define CIR26 0x3a6c /* 32bit */
#define CIR27 0x3a80 /* 32bit */
#define CIR28 0x3a84 /* 32bit */
#define CIR29 0x3a88 /* 32bit */
/* XHCI USB 3.0 */
#define XOCM 0xc0 /* 32bit */

View File

@ -114,7 +114,7 @@ static void pch_pcie_pm_early(struct device *dev)
/* Adjust ASPM L1 exit latency */
reg32 = pci_read_config32(dev, 0x4c);
reg32 &= ~((1 << 17) | (1 << 16) | (1 << 15));
if (RCBA32(0x2320) & (1 << 16)) {
if (RCBA32(CIR9) & (1 << 16)) {
/* If RCBA+2320[15]=1 set ASPM L1 to 8-16us */
reg32 |= (1 << 17);
} else {

View File

@ -28,9 +28,9 @@ static void usb_ehci_init(struct device *dev)
u32 reg32;
/* Disable Wake on Disconnect in RMH */
reg32 = RCBA32(0x35b0);
reg32 = RCBA32(RMHWKCTL);
reg32 |= 0x22;
RCBA32(0x35b0) = reg32;
RCBA32(RMHWKCTL) = reg32;
printk(BIOS_DEBUG, "EHCI: Setting up controller.. ");