i386/139743: [ichsmb] [patch] ichsmb driver doesn't detects SMB bus on Asus P4B533/P4PE motherboards
Takefu
takefu at airport.fm
Tue Feb 12 10:10:04 UTC 2013
The following reply was made to PR i386/139743; it has been noted by GNATS.
From: Takefu <takefu at airport.fm>
To: bug-followup at FreeBSD.org
Cc:
Subject: Re: i386/139743: [ichsmb] [patch] ichsmb driver doesn't detects SMB
bus on Asus P4B533/P4PE motherboards
Date: Tue, 12 Feb 2013 19:06:25 +0900
quick hack RELENG_9_1
I think that it is a patch that looks alike.
PR#kern/70810
Old PR is thrown away, and it wishes the adoption of new PR.
PR#i386/139743
--- pci.c.patch begins here ---
--- sys/dev/pci/pci.c.orig 2012-11-17 17:47:51.000000000 +0900
+++ sys/dev/pci/pci.c 2013-02-12 17:24:51.000000000 +0900
@@ -134,6 +134,7 @@
static void pci_resume_msix(device_t dev);
static int pci_remap_intr_method(device_t bus, device_t dev,
u_int irq);
+static void pci_fix_asus_smbus(device_t dev);
static device_method_t pci_methods[] = {
/* Device interface */
@@ -206,53 +207,55 @@
#define PCI_QUIRK_DISABLE_MSI 2 /* MSI/MSI-X doesn't work */
#define PCI_QUIRK_ENABLE_MSI_VM 3 /* Older chipset in VM where MSI works */
#define PCI_QUIRK_UNMAP_REG 4 /* Ignore PCI map register */
+#define PCI_QUIRK_FIXUP_ROUTINE 5 /* PCI needs a fix to continue */
int arg1;
int arg2;
+void (*fixup_func)(device_t dev);
};
static const struct pci_quirk const pci_quirks[] = {
/* The Intel 82371AB and 82443MX has a map register at offset 0x90. */
- { 0x71138086, PCI_QUIRK_MAP_REG, 0x90, 0 },
- { 0x719b8086, PCI_QUIRK_MAP_REG, 0x90, 0 },
+ { 0x71138086, PCI_QUIRK_MAP_REG, 0x90, 0, NULL },
+ { 0x719b8086, PCI_QUIRK_MAP_REG, 0x90, 0, NULL },
/* As does the Serverworks OSB4 (the SMBus mapping register) */
- { 0x02001166, PCI_QUIRK_MAP_REG, 0x90, 0 },
+ { 0x02001166, PCI_QUIRK_MAP_REG, 0x90, 0, NULL },
/*
* MSI doesn't work with the ServerWorks CNB20-HE Host Bridge
* or the CMIC-SL (AKA ServerWorks GC_LE).
*/
- { 0x00141166, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x00171166, PCI_QUIRK_DISABLE_MSI, 0, 0 },
+ { 0x00141166, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x00171166, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
/*
* MSI doesn't work on earlier Intel chipsets including
* E7500, E7501, E7505, 845, 865, 875/E7210, and 855.
*/
- { 0x25408086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x254c8086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x25508086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x25608086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x25708086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x25788086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
- { 0x35808086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
+ { 0x25408086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x254c8086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x25508086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x25608086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x25708086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x25788086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
+ { 0x35808086, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
/*
* MSI doesn't work with devices behind the AMD 8131 HT-PCIX
* bridge.
*/
- { 0x74501022, PCI_QUIRK_DISABLE_MSI, 0, 0 },
+ { 0x74501022, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
/*
* MSI-X doesn't work with at least LSI SAS1068E passed through by
* VMware.
*/
- { 0x079015ad, PCI_QUIRK_DISABLE_MSI, 0, 0 },
+ { 0x079015ad, PCI_QUIRK_DISABLE_MSI, 0, 0, NULL },
/*
* Some virtualization environments emulate an older chipset
* but support MSI just fine. QEMU uses the Intel 82440.
*/
- { 0x12378086, PCI_QUIRK_ENABLE_MSI_VM, 0, 0 },
+ { 0x12378086, PCI_QUIRK_ENABLE_MSI_VM, 0, 0, NULL },
/*
* HPET MMIO base address may appear in Bar1 for AMD SB600 SMBus
@@ -262,7 +265,16 @@
* For SB600 A21 and later, firmware must set the bit to hide it.
* For SB700 and later, it is unused and hardcoded to zero.
*/
- { 0x43851002, PCI_QUIRK_UNMAP_REG, 0x14, 0 },
+ { 0x43851002, PCI_QUIRK_UNMAP_REG, 0x14, 0, NULL },
+
+ /*
+ * kern/70810: [pci] [patch] Enable SMBus device on Asus P4B series motherboards
+ { 0x24408086, PCI_QUIRK_CLEAR_BITS, 0xf2, 0x0108, NULL },
+ * i386/139743: [ichsmb] [patch] ichsmb driver doesn't detects SMB bus on Asus P4B533/P4PE motherboards
+ */
+ /* The ASUS P4B-motherboards needs a hack to enable the Intel 801SMBus */
+ { 0x24408086, PCI_QUIRK_FIXUP_ROUTINE, 0, 0, &pci_fix_asus_smbus },
+ { 0x24C08086, PCI_QUIRK_FIXUP_ROUTINE, 0, 0, &pci_fix_asus_smbus },
{ 0 }
};
@@ -518,6 +530,27 @@
cfg->hdrtype = PCIM_HDRTYPE_BRIDGE;
}
+/* asus p4b/p4pe hack */
+
+static void
+pci_fix_asus_smbus(device_t dev)
+{
+ int pmccfg;
+
+ /* read subsystem vendor-id */
+ pmccfg = pci_read_config(dev, 0xF2, 2);
+ printf(" [-] pmccfg: %.4x\n",pmccfg);
+ if( pmccfg & 0x8 ){
+ pmccfg &= ~0x8;
+ pci_write_config(dev, 0xF2, pmccfg, 2);
+ pmccfg = pci_read_config(dev, 0xF2, 2);
+ if( pmccfg & 0x8 )
+ printf("Could not enable Intel 801SMBus!\n");
+ else
+ printf("Enabled Intel 801SMBus\n");
+ }
+}
+
/* extract header type specific config data */
static void
@@ -3091,8 +3124,12 @@
* Add additional, quirked resources.
*/
for (q = &pci_quirks[0]; q->devid != 0; q++)
- if (q->devid == devid && q->type == PCI_QUIRK_MAP_REG)
+ if (q->devid == ((cfg->device << 16) | cfg->vendor) ){
+ if( q->type == PCI_QUIRK_MAP_REG )
pci_add_map(bus, dev, q->arg1, rl, force, 0);
+ else if( q->type == PCI_QUIRK_FIXUP_ROUTINE )
+ q->fixup_func(dev);
+ }
if (cfg->intpin > 0 && PCI_INTERRUPT_VALID(cfg->intline)) {
#ifdef __PCI_REROUTE_INTERRUPT
--- pci.c.patch ends here ---
More information about the freebsd-i386
mailing list