PERFORCE change 103762 for review
Roman Divacky
rdivacky at FreeBSD.org
Sun Aug 13 13:34:19 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103762
Change 103762 by rdivacky at rdivacky_witten on 2006/08/13 13:34:05
IFC
Affected files ...
.. //depot/projects/soc2006/rdivacky_linuxolator/amd64/acpica/madt.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/amd64/amd64/pmap.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/amd64/include/pmap.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/conf/files#8 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/contrib/dev/acpica/acfreebsd.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/Osd/OsdMemory.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/acpi_hpet.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ata/ata-chipset.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ata/ata-pci.h#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/exca/excareg.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/hme/if_hme.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/mii/rgephy.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/pccbb/pccbb.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/pccbb/pccbb_pci.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/pccbb/pccbbreg.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/sk/if_sk.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/stge/if_stge.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ti/if_ti.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/eli/g_eli.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/eli/g_eli.h#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/label/g_label.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/label/g_label_msdosfs.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/label/g_label_msdosfs.h#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/acpica/acpi_machdep.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/acpica/madt.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/i386/pmap.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/include/pmap.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/ia64/include/pmap.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/kern_subr.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/uipc_socket.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/libkern/strstr.c#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/net/bridgestp.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net/if_vlan.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netinet/tcp_input.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netinet/tcp_subr.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netinet/tcp_timer.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netinet/tcp_timer.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/pci/agp.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/pci/if_xl.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/libkern.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/sysctl.h#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/device_pager.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_fault.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_object.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_page.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_page.h#3 integrate
Differences ...
==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/acpica/madt.c#2 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.20 2006/03/27 15:59:48 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.21 2006/08/11 19:22:55 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -203,15 +203,15 @@
/*
* Map in the RSDP. Since ACPI uses AcpiOsMapMemory() which in turn
- * calls pmap_mapdev() to find the RSDP, we assume that we can use
- * pmap_mapdev() to map the RSDP.
+ * calls pmap_mapbios() to find the RSDP, we assume that we can use
+ * pmap_mapbios() to map the RSDP.
*/
if (AcpiOsGetRootPointer(ACPI_LOGICAL_ADDRESSING, &rsdp_ptr) != AE_OK)
return (ENXIO);
#ifdef __i386__
KASSERT(rsdp_ptr.Pointer.Physical < KERNLOAD, ("RSDP too high"));
#endif
- rsdp = pmap_mapdev(rsdp_ptr.Pointer.Physical, sizeof(RSDP_DESCRIPTOR));
+ rsdp = pmap_mapbios(rsdp_ptr.Pointer.Physical, sizeof(RSDP_DESCRIPTOR));
if (rsdp == NULL) {
if (bootverbose)
printf("MADT: Failed to map RSDP\n");
@@ -261,7 +261,7 @@
break;
madt_unmap_table(rsdt);
}
- pmap_unmapdev((vm_offset_t)rsdp, sizeof(RSDP_DESCRIPTOR));
+ pmap_unmapbios((vm_offset_t)rsdp, sizeof(RSDP_DESCRIPTOR));
if (madt_physaddr == 0) {
if (bootverbose)
printf("MADT: No MADT table found\n");
@@ -335,7 +335,7 @@
madt_setup_local(void)
{
- madt = pmap_mapdev(madt_physaddr, madt_length);
+ madt = pmap_mapbios(madt_physaddr, madt_length);
lapic_init((uintptr_t)madt->LocalApicAddress);
printf("ACPI APIC Table: <%.*s %.*s>\n",
(int)sizeof(madt->OemId), madt->OemId,
==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/amd64/pmap.c#7 (text+ko) ====
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.569 2006/08/06 06:29:16 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.570 2006/08/11 19:22:55 jhb Exp $");
/*
* Manages physical address maps.
@@ -665,6 +665,84 @@
* Low level helper routines.....
***************************************************/
+/*
+ * Determine the appropriate bits to set in a PTE or PDE for a specified
+ * caching mode.
+ */
+static int
+pmap_cache_bits(int mode, boolean_t is_pde)
+{
+ int pat_flag, pat_index, cache_bits;
+
+ /* The PAT bit is different for PTE's and PDE's. */
+ pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT;
+
+ /* If we don't support PAT, map extended modes to older ones. */
+ if (!(cpu_feature & CPUID_PAT)) {
+ switch (mode) {
+ case PAT_UNCACHEABLE:
+ case PAT_WRITE_THROUGH:
+ case PAT_WRITE_BACK:
+ break;
+ case PAT_UNCACHED:
+ case PAT_WRITE_COMBINING:
+ case PAT_WRITE_PROTECTED:
+ mode = PAT_UNCACHEABLE;
+ break;
+ }
+ }
+
+ /* Map the caching mode to a PAT index. */
+ switch (mode) {
+#ifdef PAT_WORKS
+ case PAT_UNCACHEABLE:
+ pat_index = 3;
+ break;
+ case PAT_WRITE_THROUGH:
+ pat_index = 1;
+ break;
+ case PAT_WRITE_BACK:
+ pat_index = 0;
+ break;
+ case PAT_UNCACHED:
+ pat_index = 2;
+ break;
+ case PAT_WRITE_COMBINING:
+ pat_index = 5;
+ break;
+ case PAT_WRITE_PROTECTED:
+ pat_index = 4;
+ break;
+#else
+ case PAT_UNCACHED:
+ case PAT_UNCACHEABLE:
+ case PAT_WRITE_PROTECTED:
+ pat_index = 3;
+ break;
+ case PAT_WRITE_THROUGH:
+ pat_index = 1;
+ break;
+ case PAT_WRITE_BACK:
+ pat_index = 0;
+ break;
+ case PAT_WRITE_COMBINING:
+ pat_index = 2;
+ break;
+#endif
+ default:
+ panic("Unknown caching mode %d\n", mode);
+ }
+
+ /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
+ cache_bits = 0;
+ if (pat_index & 0x4)
+ cache_bits |= pat_flag;
+ if (pat_index & 0x2)
+ cache_bits |= PG_NC_PCD;
+ if (pat_index & 0x1)
+ cache_bits |= PG_NC_PWT;
+ return (cache_bits);
+}
#ifdef SMP
/*
* For SMP, these functions have to use the IPI mechanism for coherence.
@@ -962,6 +1040,15 @@
pte_store(pte, pa | PG_RW | PG_V | PG_G);
}
+PMAP_INLINE void
+pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
+{
+ pt_entry_t *pte;
+
+ pte = vtopte(va);
+ pte_store(pte, pa | PG_RW | PG_V | PG_G | pmap_cache_bits(mode, 0));
+}
+
/*
* Remove a page from the kernel pagetables.
* Note: not SMP coherent.
@@ -2281,6 +2368,10 @@
if (pmap == kernel_pmap)
newpte |= PG_G;
+ /* Preserve any caching attributes. */
+ /* XXX: Should this be conditional on something? */
+ newpte |= (origpte & (PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT));
+
/*
* if the mapping or permission bits are different, we need
* to update the pte.
@@ -3101,6 +3192,46 @@
* Miscellaneous support routines follow
*/
+/* Adjust the cache mode for a 4KB page mapped via a PTE. */
+static __inline void
+pmap_pte_attr(vm_offset_t va, int mode)
+{
+ pt_entry_t *pte;
+ u_int opte, npte;
+
+ pte = vtopte(va);
+
+ /*
+ * The cache mode bits are all in the low 32-bits of the
+ * PTE, so we can just spin on updating the low 32-bits.
+ */
+ do {
+ opte = *(u_int *)pte;
+ npte = opte & ~(PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT);
+ npte |= pmap_cache_bits(mode, 0);
+ } while (npte != opte && !atomic_cmpset_int((u_int *)pte, opte, npte));
+}
+
+/* Adjust the cache mode for a 2MB page mapped via a PDE. */
+static __inline void
+pmap_pde_attr(vm_offset_t va, int mode)
+{
+ pd_entry_t *pde;
+ u_int opde, npde;
+
+ pde = pmap_pde(kernel_pmap, va);
+
+ /*
+ * The cache mode bits are all in the low 32-bits of the
+ * PDE, so we can just spin on updating the low 32-bits.
+ */
+ do {
+ opde = *(u_int *)pde;
+ npde = opde & ~(PG_PDE_PAT | PG_NC_PCD | PG_NC_PWT);
+ npde |= pmap_cache_bits(mode, 1);
+ } while (npde != opde && !atomic_cmpset_int((u_int *)pde, opde, npde));
+}
+
/*
* Map a set of physical memory pages into the kernel virtual
* address space. Return a pointer to where it is mapped. This
@@ -3108,12 +3239,15 @@
* NOT real memory.
*/
void *
-pmap_mapdev(vm_paddr_t pa, vm_size_t size)
+pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
{
vm_offset_t va, tmpva, offset;
- /* If this fits within the direct map window, use it */
- if (pa < dmaplimit && (pa + size) < dmaplimit)
+ /*
+ * If this fits within the direct map window and use WB caching
+ * mode, use the direct map.
+ */
+ if (pa < dmaplimit && (pa + size) < dmaplimit && mode == PAT_WRITE_BACK)
return ((void *)PHYS_TO_DMAP(pa));
offset = pa & PAGE_MASK;
size = roundup(offset + size, PAGE_SIZE);
@@ -3122,15 +3256,30 @@
panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
pa = trunc_page(pa);
for (tmpva = va; size > 0; ) {
- pmap_kenter(tmpva, pa);
+ pmap_kenter_attr(tmpva, pa, mode);
size -= PAGE_SIZE;
tmpva += PAGE_SIZE;
pa += PAGE_SIZE;
}
pmap_invalidate_range(kernel_pmap, va, tmpva);
+ pmap_invalidate_cache();
return ((void *)(va + offset));
}
+void *
+pmap_mapdev(vm_paddr_t pa, vm_size_t size)
+{
+
+ return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
+}
+
+void *
+pmap_mapbios(vm_paddr_t pa, vm_size_t size)
+{
+
+ return (pmap_mapdev_attr(pa, size, PAT_WRITE_BACK));
+}
+
void
pmap_unmapdev(vm_offset_t va, vm_size_t size)
{
@@ -3148,6 +3297,73 @@
kmem_free(kernel_map, base, size);
}
+int
+pmap_change_attr(va, size, mode)
+ vm_offset_t va;
+ vm_size_t size;
+ int mode;
+{
+ vm_offset_t base, offset, tmpva;
+ pd_entry_t *pde;
+ pt_entry_t *pte;
+
+ base = va & PG_FRAME;
+ offset = va & PAGE_MASK;
+ size = roundup(offset + size, PAGE_SIZE);
+
+ /* Only supported on kernel virtual addresses. */
+ if (base <= VM_MAXUSER_ADDRESS)
+ return (EINVAL);
+
+ /*
+ * XXX: We have to support tearing 2MB pages down into 4k pages if
+ * needed here.
+ */
+ /* Pages that aren't mapped aren't supported. */
+ for (tmpva = base; tmpva < (base + size); ) {
+ pde = pmap_pde(kernel_pmap, tmpva);
+ if (*pde == 0)
+ return (EINVAL);
+ if (*pde & PG_PS) {
+ /* Handle 2MB pages that are completely contained. */
+ if (size >= NBPDR) {
+ tmpva += NBPDR;
+ continue;
+ }
+ return (EINVAL);
+ }
+ pte = vtopte(va);
+ if (*pte == 0)
+ return (EINVAL);
+ tmpva += PAGE_SIZE;
+ }
+
+ /*
+ * Ok, all the pages exist, so run through them updating their
+ * cache mode.
+ */
+ for (tmpva = base; size > 0; ) {
+ pde = pmap_pde(kernel_pmap, tmpva);
+ if (*pde & PG_PS) {
+ pmap_pde_attr(tmpva, mode);
+ tmpva += NBPDR;
+ size -= NBPDR;
+ } else {
+ pmap_pte_attr(tmpva, mode);
+ tmpva += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+ }
+
+ /*
+ * Flush CPU caches to make sure any data isn't cached that shouldn't
+ * be, etc.
+ */
+ pmap_invalidate_range(kernel_pmap, base, tmpva);
+ pmap_invalidate_cache();
+ return (0);
+}
+
/*
* perform the pmap work for mincore
*/
==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/include/pmap.h#3 (text+ko) ====
@@ -39,7 +39,7 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.133 2006/08/02 16:24:23 alc Exp $
+ * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.134 2006/08/11 19:22:56 jhb Exp $
*/
#ifndef _MACHINE_PMAP_H_
@@ -302,14 +302,19 @@
extern vm_offset_t virtual_end;
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
+#define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz))
void pmap_bootstrap(vm_paddr_t *);
+int pmap_change_attr(vm_offset_t, vm_size_t, int);
void pmap_init_pat(void);
void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
+void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
void *pmap_kenter_temporary(vm_paddr_t pa, int i);
vm_paddr_t pmap_kextract(vm_offset_t);
void pmap_kremove(vm_offset_t);
+void *pmap_mapbios(vm_paddr_t, vm_size_t);
void *pmap_mapdev(vm_paddr_t, vm_size_t);
+void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int);
void pmap_unmapdev(vm_offset_t, vm_size_t);
void pmap_invalidate_page(pmap_t, vm_offset_t);
void pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t);
==== //depot/projects/soc2006/rdivacky_linuxolator/conf/files#8 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1137 2006/08/07 12:02:42 rwatson Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1139 2006/08/12 18:29:49 pjd Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -1477,6 +1477,7 @@
libkern/strncpy.c standard
libkern/strsep.c standard
libkern/strspn.c standard
+libkern/strstr.c standard
libkern/strtol.c standard
libkern/strtoq.c standard
libkern/strtoul.c standard
==== //depot/projects/soc2006/rdivacky_linuxolator/contrib/dev/acpica/acfreebsd.h#2 (text+ko) ====
@@ -169,26 +169,4 @@
/* Always use FreeBSD code over our local versions */
#define ACPI_USE_SYSTEM_CLIBRARY
-#ifdef _KERNEL
-/* Or strstr (used in debugging mode, also move to libkern) */
-static __inline char *
-strstr(char *s, char *find)
-{
- char c, sc;
- size_t len;
-
- if ((c = *find++) != 0) {
- len = strlen(find);
- do {
- do {
- if ((sc = *s++) == 0)
- return (NULL);
- } while (sc != c);
- } while (strncmp(s, find, len) != 0);
- s--;
- }
- return ((char *)s);
-}
-#endif /* _KERNEL */
-
#endif /* __ACFREEBSD_H__ */
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/Osd/OsdMemory.c#2 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdMemory.c,v 1.13 2005/09/11 18:39:02 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdMemory.c,v 1.14 2006/08/11 19:22:56 jhb Exp $");
#include <contrib/dev/acpica/acpi.h>
@@ -58,7 +58,7 @@
AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length,
void **LogicalAddress)
{
- *LogicalAddress = pmap_mapdev((vm_offset_t)PhysicalAddress, Length);
+ *LogicalAddress = pmap_mapbios((vm_offset_t)PhysicalAddress, Length);
if (*LogicalAddress == NULL)
return (AE_BAD_ADDRESS);
return (AE_OK);
@@ -67,7 +67,7 @@
void
AcpiOsUnmapMemory(void *LogicalAddress, ACPI_SIZE Length)
{
- pmap_unmapdev((vm_offset_t)LogicalAddress, Length);
+ pmap_unmapbios((vm_offset_t)LogicalAddress, Length);
}
ACPI_STATUS
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/acpi_hpet.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_hpet.c,v 1.4 2006/06/04 08:04:19 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_hpet.c,v 1.5 2006/08/11 17:12:16 des Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -66,7 +66,7 @@
.tc_get_timecount = hpet_get_timecount,
.tc_counter_mask = ~0u,
.tc_name = "HPET",
- .tc_quality = -200,
+ .tc_quality = 2000,
};
static u_int
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/ata/ata-chipset.c#6 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.167 2006/08/05 11:41:46 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.168 2006/08/11 21:19:29 sos Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -2778,11 +2778,11 @@
{ ATA_NFORCE_CK804_S1, 0, 0, NV4, ATA_SA300, "nForce CK804" },
{ ATA_NFORCE_CK804_S2, 0, 0, NV4, ATA_SA300, "nForce CK804" },
{ ATA_NFORCE_MCP51, 0, AMDNVIDIA, NVIDIA, ATA_UDMA6, "nForce MCP51" },
- { ATA_NFORCE_MCP51_S1, 0, 0, NV4LONG, ATA_SA300, "nForce MCP51" },
- { ATA_NFORCE_MCP51_S2, 0, 0, NV4LONG, ATA_SA300, "nForce MCP51" },
+ { ATA_NFORCE_MCP51_S1, 0, 0, NV4|NVQ, ATA_SA300, "nForce MCP51" },
+ { ATA_NFORCE_MCP51_S2, 0, 0, NV4|NVQ, ATA_SA300, "nForce MCP51" },
{ ATA_NFORCE_MCP55, 0, AMDNVIDIA, NVIDIA, ATA_UDMA6, "nForce MCP55" },
- { ATA_NFORCE_MCP55_S1, 0, 0, NV4LONG, ATA_SA300, "nForce MCP55" },
- { ATA_NFORCE_MCP55_S2, 0, 0, NV4LONG, ATA_SA300, "nForce MCP55" },
+ { ATA_NFORCE_MCP55_S1, 0, 0, NV4|NVQ, ATA_SA300, "nForce MCP55" },
+ { ATA_NFORCE_MCP55_S2, 0, 0, NV4|NVQ, ATA_SA300, "nForce MCP55" },
{ 0, 0, 0, 0, 0, 0}} ;
char buffer[64] ;
@@ -2821,7 +2821,7 @@
/* enable control access */
pci_write_config(dev, 0x50, pci_read_config(dev, 0x50, 1) | 0x04,1);
- if (ctlr->chip->cfg2 & NV4LONG) {
+ if (ctlr->chip->cfg2 & NVQ) {
/* clear interrupt status */
ATA_OUTL(ctlr->r_res2, offset, 0x00ff00ff);
@@ -2881,11 +2881,11 @@
struct ata_channel *ch = device_get_softc(dev);
int offset = ctlr->chip->cfg2 & NV4 ? 0x0440 : 0x0010;
struct ata_connect_task *tp;
- int shift = ch->unit << (ctlr->chip->cfg2 & NV4LONG ? 4 : 2);
+ int shift = ch->unit << (ctlr->chip->cfg2 & NVQ ? 4 : 2);
u_int32_t status;
/* get and clear interrupt status */
- if (ctlr->chip->cfg2 & NV4LONG) {
+ if (ctlr->chip->cfg2 & NVQ) {
status = ATA_INL(ctlr->r_res2, offset);
ATA_OUTL(ctlr->r_res2, offset, (0x0f << shift));
}
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/ata/ata-pci.h#5 (text+ko) ====
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.67 2006/08/05 11:41:46 sos Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.68 2006/08/11 21:19:29 sos Exp $
*/
/* structure holding chipset config info */
@@ -392,7 +392,7 @@
#define AMDBUG 0x0002
#define NVIDIA 0x0004
#define NV4 0x0010
-#define NV4LONG 0x0030
+#define NVQ 0x0020
#define VIACLK 0x0100
#define VIABUG 0x0200
#define VIABAR 0x0400
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/exca/excareg.h#2 (text+ko) ====
@@ -1,5 +1,5 @@
/* $NetBSD: i82365reg.h,v 1.3 1998/12/20 17:53:28 nathanw Exp $ */
-/* $FreeBSD: src/sys/dev/exca/excareg.h,v 1.5 2005/01/06 01:42:40 imp Exp $ */
+/* $FreeBSD: src/sys/dev/exca/excareg.h,v 1.6 2006/08/12 08:53:54 imp Exp $ */
/*-
* Copyright (c) 2002 M Warner Losh. All rights reserved.
@@ -402,6 +402,12 @@
#define EXCA_O2CC_IREQ_INTC 0x80
#define EXCA_O2CC_STSCHG_INTC 0x20
+/*
+ * TOPIC specific registers
+ */
+#define EXCA_TOPIC97_CTRL 0x3e
+#define EXCA_TOPIC97_CTRL_LV_MASK 0x03
+
/* Plug and play */
#define EXCA_PNP_ACTIONTEC 0x1802A904 /* AEI0218 */
#define EXCA_PNP_IBM3765 0x65374d24 /* IBM3765 */
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/hme/if_hme.c#2 (text+ko) ====
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/hme/if_hme.c,v 1.48 2006/05/27 09:28:59 simon Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/hme/if_hme.c,v 1.49 2006/08/12 01:19:37 yongari Exp $");
/*
* HME Ethernet module driver.
@@ -936,7 +936,6 @@
hme_load_txmbuf(struct hme_softc *sc, struct mbuf **m0)
{
struct hme_txdesc *htx;
- struct mbuf *m, *n;
caddr_t txd;
int i, pci, si, ri, nseg;
u_int32_t flags, cflags = 0;
@@ -944,31 +943,30 @@
if ((htx = STAILQ_FIRST(&sc->sc_rb.rb_txfreeq)) == NULL)
return (-1);
- m = *m0;
- if ((m->m_pkthdr.csum_flags & sc->sc_csum_features) != 0)
- hme_txcksum(m, &cflags);
error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, htx->htx_dmamap,
- m, sc->sc_rb.rb_txsegs, &nseg, 0);
+ *m0, sc->sc_rb.rb_txsegs, &nseg, 0);
if (error == EFBIG) {
- n = m_defrag(m, M_DONTWAIT);
- if (n == NULL) {
- m_freem(m);
- m = NULL;
+ struct mbuf *m;
+
+ m = m_defrag(*m0, M_DONTWAIT);
+ if (m == NULL) {
+ m_freem(*m0);
+ *m0 = NULL;
return (ENOMEM);
}
- m = n;
+ *m0 = m;
error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, htx->htx_dmamap,
- m, sc->sc_rb.rb_txsegs, &nseg, 0);
+ *m0, sc->sc_rb.rb_txsegs, &nseg, 0);
if (error != 0) {
- m_freem(m);
- m = NULL;
+ m_freem(*m0);
+ *m0 = NULL;
return (error);
}
} else if (error != 0)
return (error);
if (nseg == 0) {
- m_freem(m);
- m = NULL;
+ m_freem(*m0);
+ *m0 = NULL;
return (EIO);
}
if (sc->sc_rb.rb_td_nbusy + nseg >= HME_NTXDESC) {
@@ -976,6 +974,8 @@
/* retry with m_defrag(9)? */
return (-2);
}
+ if (((*m0)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0)
+ hme_txcksum(*m0, &cflags);
bus_dmamap_sync(sc->sc_tdmatag, htx->htx_dmamap, BUS_DMASYNC_PREWRITE);
si = ri = sc->sc_rb.rb_tdhead;
@@ -1017,7 +1017,7 @@
STAILQ_REMOVE_HEAD(&sc->sc_rb.rb_txfreeq, htx_q);
STAILQ_INSERT_TAIL(&sc->sc_rb.rb_txbusyq, htx, htx_q);
- htx->htx_m = m;
+ htx->htx_m = *m0;
/* start the transmission. */
HME_ETX_WRITE_4(sc, HME_ETXI_PENDING, HME_ETX_TP_DMAWAKEUP);
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/mii/rgephy.c#4 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/rgephy.c,v 1.10 2006/07/03 02:53:39 yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mii/rgephy.c,v 1.11 2006/08/12 01:38:49 yongari Exp $");
/*
* Driver for the RealTek 8169S/8110S internal 10/100/1000 PHY.
@@ -166,7 +166,7 @@
rgephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
{
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
- int reg, speed, gig;
+ int reg, speed, gig, anar;
switch (cmd) {
case MII_POLLSTAT:
@@ -196,6 +196,10 @@
rgephy_reset(sc); /* XXX hardware bug work-around */
+ anar = PHY_READ(sc, RGEPHY_MII_ANAR);
+ anar &= ~(RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_TX |
+ RGEPHY_ANAR_10_FD | RGEPHY_ANAR_10);
+
switch (IFM_SUBTYPE(ife->ifm_media)) {
case IFM_AUTO:
#ifdef foo
@@ -212,29 +216,31 @@
goto setit;
case IFM_100_TX:
speed = RGEPHY_S100;
+ anar |= RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_TX;
goto setit;
case IFM_10_T:
speed = RGEPHY_S10;
+ anar |= RGEPHY_ANAR_10_FD | RGEPHY_ANAR_10;
setit:
rgephy_loop(sc);
if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
speed |= RGEPHY_BMCR_FDX;
gig = RGEPHY_1000CTL_AFD;
+ anar &= ~(RGEPHY_ANAR_TX | RGEPHY_ANAR_10);
} else {
gig = RGEPHY_1000CTL_AHD;
+ anar &=
+ ~(RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_10_FD);
}
- PHY_WRITE(sc, RGEPHY_MII_1000CTL, 0);
- PHY_WRITE(sc, RGEPHY_MII_BMCR, speed);
- PHY_WRITE(sc, RGEPHY_MII_ANAR, RGEPHY_SEL_TYPE);
-
- if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T)
+ if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) {
+ PHY_WRITE(sc, RGEPHY_MII_1000CTL, 0);
+ PHY_WRITE(sc, RGEPHY_MII_ANAR, anar);
+ PHY_WRITE(sc, RGEPHY_MII_BMCR, speed |
+ RGEPHY_BMCR_AUTOEN | RGEPHY_BMCR_STARTNEG);
break;
+ }
- PHY_WRITE(sc, RGEPHY_MII_1000CTL, gig);
- PHY_WRITE(sc, RGEPHY_MII_BMCR,
- speed|RGEPHY_BMCR_AUTOEN|RGEPHY_BMCR_STARTNEG);
-
/*
* When settning the link manually, one side must
* be the master and the other the slave. However
@@ -250,6 +256,8 @@
PHY_WRITE(sc, RGEPHY_MII_1000CTL,
gig|RGEPHY_1000CTL_MSE);
}
+ PHY_WRITE(sc, RGEPHY_MII_BMCR, speed |
+ RGEPHY_BMCR_AUTOEN | RGEPHY_BMCR_STARTNEG);
break;
#ifdef foo
case IFM_NONE:
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/pccbb/pccbb.c#3 (text+ko) ====
@@ -75,7 +75,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb.c,v 1.150 2006/06/03 21:05:36 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb.c,v 1.151 2006/08/12 09:06:55 imp Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -700,7 +700,7 @@
int
cbb_power(device_t brdev, int volts)
{
- uint32_t status, sock_ctrl, mask;
+ uint32_t status, sock_ctrl, reg_ctrl, mask;
struct cbb_softc *sc = device_get_softc(brdev);
int cnt, sane;
int retval = 0;
@@ -744,14 +744,15 @@
reg = cbb_o2micro_power_hack(sc);
/*
- * We have to mask the card change detect interrupt while we're
- * messing with the power. It is allowed to bounce while we're
- * messing with power as things settle down. In addition, we mask off
- * the card's function interrupt by routing it via the ISA bus. This
- * bit generally only affects 16bit cards. Some bridges allow one to
- * set another bit to have it also affect 32bit cards. Since 32bit
- * cards are required to be better behaved, we don't bother to get
- * into those bridge specific features.
+ * We have to mask the card change detect interrupt while
+ * we're messing with the power. It is allowed to bounce
+ * while we're messing with power as things settle down. In
+ * addition, we mask off the card's function interrupt by
+ * routing it via the ISA bus. This bit generally only
+ * affects 16-bit cards. Some bridges allow one to set
+ * another bit to have it also affect 32-bit cards. Since
+ * 32-bit cards are required to be better behaved, we don't
+ * bother to get into those bridge specific features.
*/
mask = cbb_get(sc, CBB_SOCKET_MASK);
mask |= CBB_SOCKET_MASK_POWER;
@@ -763,13 +764,29 @@
if (on) {
mtx_lock(&sc->mtx);
cnt = sc->powerintr;
- sane = 200;
+ /*
+ * We have a shortish timeout of 500ms here. Some
+ * bridges do not generate a POWER_CYCLE event for
+ * 16-bit cards. In those cases, we have to cope the
+ * best we can, and having only a short delay is
+ * better than the alternatives.
+ */
+ sane = 10;
while (!(cbb_get(sc, CBB_SOCKET_STATE) & CBB_STATE_POWER_CYCLE) &&
cnt == sc->powerintr && sane-- > 0)
- cv_timedwait(&sc->powercv, &sc->mtx, hz / 10);
+ cv_timedwait(&sc->powercv, &sc->mtx, hz / 20);
mtx_unlock(&sc->mtx);
- if (sane <= 0)
+ /*
+ * The TOPIC95B requires a little bit extra time to get
+ * its act together, so delay for an additional 100ms. Also
+ * as documented below, it doesn't seem to set the POWER_CYCLE
+ * bit, so don't whine if it never came on.
+ */
+ if (sc->chipset == CB_TOPIC95) {
+ tsleep(sc, PZERO, "cbb95B", hz / 10);
+ } else if (sane <= 0) {
device_printf(sc->dev, "power timeout, doom?\n");
+ }
}
/*
@@ -782,10 +799,13 @@
* we're called from the card insertion code, in which case the cbb
* thread will turn it on for us before it waits to be woken by a
* change event.
+ *
+ * NB: Topic95B doesn't set the power cycle bit. we assume that
+ * both it and the TOPIC95 behave the same.
*/
cbb_clrb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_POWER);
status = cbb_get(sc, CBB_SOCKET_STATE);
- if (on) {
+ if (on && sc->chipset != CB_TOPIC95) {
if ((status & CBB_STATE_POWER_CYCLE) == 0)
device_printf(sc->dev, "Power not on?\n");
}
@@ -794,6 +814,15 @@
/* XXX Do we want to do something to mitigate things here? */
goto done;
}
+ if (sc->chipset == CB_TOPIC97) {
+ reg_ctrl = pci_read_config(sc->dev, TOPIC_REG_CTRL, 4);
+ reg_ctrl &= ~TOPIC97_REG_CTRL_TESTMODE;
+ if (on)
+ reg_ctrl |= TOPIC97_REG_CTRL_CLKRUN_ENA;
+ else
+ reg_ctrl &= ~TOPIC97_REG_CTRL_CLKRUN_ENA;
+ pci_write_config(sc->dev, TOPIC_REG_CTRL, reg_ctrl, 4);
+ }
PCI_MASK_CONFIG(brdev, CBBR_BRIDGECTRL,
& ~CBBM_BRIDGECTRL_INTR_IREQ_ISA_EN, 2);
retval = 1;
==== //depot/projects/soc2006/rdivacky_linuxolator/dev/pccbb/pccbb_pci.c#3 (text+ko) ====
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb_pci.c,v 1.21 2006/06/03 19:16:45 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb_pci.c,v 1.22 2006/08/12 09:06:55 imp Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -302,10 +302,11 @@
{
static int curr_bus_number = 2; /* XXX EVILE BAD (see below) */
struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(brdev);
+ struct sysctl_ctx_list *sctx;
+ struct sysctl_oid *soid;
int rid;
device_t parent;
- struct sysctl_ctx_list *sctx;
- struct sysctl_oid *soid;
+ uint32_t pribus;
parent = device_get_parent(brdev);
mtx_init(&sc->mtx, device_get_nameunit(brdev), "cbb", MTX_DEF);
@@ -317,7 +318,7 @@
sc->exca[0].pccarddev = NULL;
sc->secbus = pci_read_config(brdev, PCIR_SECBUS_2, 1);
sc->subbus = pci_read_config(brdev, PCIR_SUBBUS_2, 1);
- sc->pribus = pci_read_config(brdev, PCIR_PRIBUS_2, 1);
+ sc->pribus = pcib_get_bus(parent);
SLIST_INIT(&sc->rl);
cbb_powerstate_d0(brdev);
@@ -359,10 +360,11 @@
* are in an appropriate range.
*/
DEVPRINTF((brdev, "Secondary bus is %d\n", sc->secbus));
- if (sc->secbus == 0) {
+ pribus = pci_read_config(brdev, PCIR_PRIBUS_2, 1);
+ if (sc->secbus == 0 || sc->pribus != pribus) {
if (curr_bus_number <= sc->pribus)
curr_bus_number = sc->pribus + 1;
- if (pci_read_config(brdev, PCIR_PRIBUS_2, 1) != sc->pribus) {
+ if (pribus != sc->pribus) {
DEVPRINTF((brdev, "Setting primary bus to %d\n",
sc->pribus));
pci_write_config(brdev, PCIR_PRIBUS_2, sc->pribus, 1);
@@ -553,27 +555,32 @@
reg = (reg & 0x0f) |
EXCA_O2CC_IREQ_INTC | EXCA_O2CC_STSCHG_INTC;
exca_putb(&sc->exca[0], EXCA_O2MICRO_CTRL_C, reg);
-
break;
case CB_TOPIC97:
/*
* Disable Zoom Video, ToPIC 97, 100.
*/
- pci_write_config(sc->dev, CBBR_TOPIC_ZV_CONTROL, 0, 1);
+ pci_write_config(sc->dev, TOPIC97_ZV_CONTROL, 0, 1);
/*
* ToPIC 97, 100
* At offset 0xa1: INTERRUPT CONTROL register
* 0x1: Turn on INT interrupts.
*/
- PCI_MASK_CONFIG(sc->dev, CBBR_TOPIC_INTCTRL,
- | CBBM_TOPIC_INTCTRL_INTIRQSEL, 1);
+ PCI_MASK_CONFIG(sc->dev, TOPIC_INTCTRL,
+ | TOPIC97_INTCTRL_INTIRQSEL, 1);
+ /*
+ * ToPIC97, 100
+ * Need to assert support for low voltage cards
+ */
+ exca_setb(&sc->exca[0], EXCA_TOPIC97_CTRL,
+ EXCA_TOPIC97_CTRL_LV_MASK);
goto topic_common;
case CB_TOPIC95:
/*
* SOCKETCTRL appears to be TOPIC 95/B specific
*/
- PCI_MASK_CONFIG(sc->dev, CBBR_TOPIC_SOCKETCTRL,
- | CBBM_TOPIC_SOCKETCTRL_SCR_IRQSEL, 4);
+ PCI_MASK_CONFIG(sc->dev, TOPIC95_SOCKETCTRL,
+ | TOPIC95_SOCKETCTRL_SCR_IRQSEL, 4);
topic_common:;
/*
@@ -586,20 +593,19 @@
* in legacy mode to 0x3e0 and offset 0. (legacy
* mode is determined elsewhere)
*/
- pci_write_config(sc->dev, CBBR_TOPIC_SLOTCTRL,
- CBBM_TOPIC_SLOTCTRL_SLOTON |
- CBBM_TOPIC_SLOTCTRL_SLOTEN |
- CBBM_TOPIC_SLOTCTRL_ID_LOCK |
- CBBM_TOPIC_SLOTCTRL_ID_WP, 1);
+ pci_write_config(sc->dev, TOPIC_SLOTCTRL,
+ TOPIC_SLOTCTRL_SLOTON |
+ TOPIC_SLOTCTRL_SLOTEN |
+ TOPIC_SLOTCTRL_ID_LOCK |
+ TOPIC_SLOTCTRL_ID_WP, 1);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list