Merge branch 'linus' into sched/urgent
This commit is contained in:
commit
198bb971e2
@ -542,7 +542,7 @@ otherwise initial value -1 that indicates the cpuset has no request.
|
||||
2 : search cores in a package.
|
||||
3 : search cpus in a node [= system wide on non-NUMA system]
|
||||
( 4 : search nodes in a chunk of node [on NUMA system] )
|
||||
( 5~ : search system wide [on NUMA system])
|
||||
( 5 : search system wide [on NUMA system] )
|
||||
|
||||
This file is per-cpuset and affect the sched domain where the cpuset
|
||||
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
||||
|
@ -2,17 +2,12 @@ Naming and data format standards for sysfs files
|
||||
------------------------------------------------
|
||||
|
||||
The libsensors library offers an interface to the raw sensors data
|
||||
through the sysfs interface. See libsensors documentation and source for
|
||||
further information. As of writing this document, libsensors
|
||||
(from lm_sensors 2.8.3) is heavily chip-dependent. Adding or updating
|
||||
support for any given chip requires modifying the library's code.
|
||||
This is because libsensors was written for the procfs interface
|
||||
older kernel modules were using, which wasn't standardized enough.
|
||||
Recent versions of libsensors (from lm_sensors 2.8.2 and later) have
|
||||
support for the sysfs interface, though.
|
||||
|
||||
The new sysfs interface was designed to be as chip-independent as
|
||||
possible.
|
||||
through the sysfs interface. Since lm-sensors 3.0.0, libsensors is
|
||||
completely chip-independent. It assumes that all the kernel drivers
|
||||
implement the standard sysfs interface described in this document.
|
||||
This makes adding or updating support for any given chip very easy, as
|
||||
libsensors, and applications using it, do not need to be modified.
|
||||
This is a major improvement compared to lm-sensors 2.
|
||||
|
||||
Note that motherboards vary widely in the connections to sensor chips.
|
||||
There is no standard that ensures, for example, that the second
|
||||
@ -35,19 +30,17 @@ access this data in a simple and consistent way. That said, such programs
|
||||
will have to implement conversion, labeling and hiding of inputs. For
|
||||
this reason, it is still not recommended to bypass the library.
|
||||
|
||||
If you are developing a userspace application please send us feedback on
|
||||
this standard.
|
||||
|
||||
Note that this standard isn't completely established yet, so it is subject
|
||||
to changes. If you are writing a new hardware monitoring driver those
|
||||
features can't seem to fit in this interface, please contact us with your
|
||||
extension proposal. Keep in mind that backward compatibility must be
|
||||
preserved.
|
||||
|
||||
Each chip gets its own directory in the sysfs /sys/devices tree. To
|
||||
find all sensor chips, it is easier to follow the device symlinks from
|
||||
/sys/class/hwmon/hwmon*.
|
||||
|
||||
Up to lm-sensors 3.0.0, libsensors looks for hardware monitoring attributes
|
||||
in the "physical" device directory. Since lm-sensors 3.0.1, attributes found
|
||||
in the hwmon "class" device directory are also supported. Complex drivers
|
||||
(e.g. drivers for multifunction chips) may want to use this possibility to
|
||||
avoid namespace pollution. The only drawback will be that older versions of
|
||||
libsensors won't support the driver in question.
|
||||
|
||||
All sysfs values are fixed point numbers.
|
||||
|
||||
There is only one value per file, unlike the older /proc specification.
|
||||
|
@ -4431,10 +4431,10 @@ M: johnpol@2ka.mipt.ru
|
||||
S: Maintained
|
||||
|
||||
W83791D HARDWARE MONITORING DRIVER
|
||||
P: Charles Spirakis
|
||||
M: bezaur@gmail.com
|
||||
P: Marc Hulsman
|
||||
M: m.hulsman@tudelft.nl
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Odd Fixes
|
||||
S: Maintained
|
||||
|
||||
W83793 HARDWARE MONITORING DRIVER
|
||||
P: Rudolf Marek
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -13,6 +13,7 @@ NM := $(NM) -B
|
||||
LDFLAGS_vmlinux := -static -N #-relax
|
||||
CHECKFLAGS += -D__alpha__ -m64
|
||||
cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data
|
||||
cflags-y += $(call cc-option, -fno-jump-tables)
|
||||
|
||||
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
||||
cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5
|
||||
|
@ -74,6 +74,8 @@
|
||||
# define DBG(args)
|
||||
#endif
|
||||
|
||||
DEFINE_SPINLOCK(t2_hae_lock);
|
||||
|
||||
static volatile unsigned int t2_mcheck_any_expected;
|
||||
static volatile unsigned int t2_mcheck_last_taken;
|
||||
|
||||
|
@ -71,6 +71,23 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_i
|
||||
static void __init
|
||||
quirk_cypress(struct pci_dev *dev)
|
||||
{
|
||||
/* The Notorious Cy82C693 chip. */
|
||||
|
||||
/* The generic legacy mode IDE fixup in drivers/pci/probe.c
|
||||
doesn't work correctly with the Cypress IDE controller as
|
||||
it has non-standard register layout. Fix that. */
|
||||
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE) {
|
||||
dev->resource[2].start = dev->resource[3].start = 0;
|
||||
dev->resource[2].end = dev->resource[3].end = 0;
|
||||
dev->resource[2].flags = dev->resource[3].flags = 0;
|
||||
if (PCI_FUNC(dev->devfn) == 2) {
|
||||
dev->resource[0].start = 0x170;
|
||||
dev->resource[0].end = 0x177;
|
||||
dev->resource[1].start = 0x376;
|
||||
dev->resource[1].end = 0x376;
|
||||
}
|
||||
}
|
||||
|
||||
/* The Cypress bridge responds on the PCI bus in the address range
|
||||
0xffff0000-0xffffffff (conventional x86 BIOS ROM). There is no
|
||||
way to turn this off. The bridge also supports several extended
|
||||
|
@ -447,7 +447,7 @@ struct unaligned_stat {
|
||||
|
||||
|
||||
/* Macro for exception fixup code to access integer registers. */
|
||||
#define una_reg(r) (regs->regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)])
|
||||
#define una_reg(r) (_regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)])
|
||||
|
||||
|
||||
asmlinkage void
|
||||
@ -456,6 +456,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
|
||||
{
|
||||
long error, tmp1, tmp2, tmp3, tmp4;
|
||||
unsigned long pc = regs->pc - 4;
|
||||
unsigned long *_regs = regs->regs;
|
||||
const struct exception_table_entry *fixup;
|
||||
|
||||
unaligned[0].count++;
|
||||
|
@ -512,6 +512,8 @@ static ssize_t sn2_ptc_proc_write(struct file *file, const char __user *user, si
|
||||
int cpu;
|
||||
char optstr[64];
|
||||
|
||||
if (count > sizeof(optstr))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(optstr, user, count))
|
||||
return -EFAULT;
|
||||
optstr[count - 1] = '\0';
|
||||
|
@ -142,7 +142,7 @@ static void dump_one_vdso_page(struct page *pg, struct page *upg)
|
||||
printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT),
|
||||
page_count(pg),
|
||||
pg->flags);
|
||||
if (upg/* && pg != upg*/) {
|
||||
if (upg && !IS_ERR(upg) /* && pg != upg*/) {
|
||||
printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)
|
||||
<< PAGE_SHIFT),
|
||||
page_count(upg),
|
||||
|
@ -166,6 +166,8 @@ int geode_has_vsa2(void)
|
||||
static int has_vsa2 = -1;
|
||||
|
||||
if (has_vsa2 == -1) {
|
||||
u16 val;
|
||||
|
||||
/*
|
||||
* The VSA has virtual registers that we can query for a
|
||||
* signature.
|
||||
@ -173,7 +175,8 @@ int geode_has_vsa2(void)
|
||||
outw(VSA_VR_UNLOCK, VSA_VRC_INDEX);
|
||||
outw(VSA_VR_SIGNATURE, VSA_VRC_INDEX);
|
||||
|
||||
has_vsa2 = (inw(VSA_VRC_DATA) == VSA_SIG);
|
||||
val = inw(VSA_VRC_DATA);
|
||||
has_vsa2 = (val == AMD_VSA_SIG || val == GSW_VSA_SIG);
|
||||
}
|
||||
|
||||
return has_vsa2;
|
||||
|
@ -333,6 +333,7 @@ void flush_thread(void)
|
||||
/*
|
||||
* Forget coprocessor state..
|
||||
*/
|
||||
tsk->fpu_counter = 0;
|
||||
clear_fpu(tsk);
|
||||
clear_used_math();
|
||||
}
|
||||
|
@ -294,6 +294,7 @@ void flush_thread(void)
|
||||
/*
|
||||
* Forget coprocessor state..
|
||||
*/
|
||||
tsk->fpu_counter = 0;
|
||||
clear_fpu(tsk);
|
||||
clear_used_math();
|
||||
}
|
||||
|
@ -532,10 +532,16 @@ static void __init reserve_crashkernel(void)
|
||||
(unsigned long)(crash_size >> 20),
|
||||
(unsigned long)(crash_base >> 20),
|
||||
(unsigned long)(total_mem >> 20));
|
||||
|
||||
if (reserve_bootmem(crash_base, crash_size,
|
||||
BOOTMEM_EXCLUSIVE) < 0) {
|
||||
printk(KERN_INFO "crashkernel reservation "
|
||||
"failed - memory is in use\n");
|
||||
return;
|
||||
}
|
||||
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
reserve_bootmem(crash_base, crash_size,
|
||||
BOOTMEM_DEFAULT);
|
||||
} else
|
||||
printk(KERN_INFO "crashkernel reservation failed - "
|
||||
"you have to specify a base address\n");
|
||||
|
@ -14,7 +14,10 @@
|
||||
|
||||
#include "mach_timer.h"
|
||||
|
||||
static int tsc_disabled;
|
||||
/* native_sched_clock() is called before tsc_init(), so
|
||||
we must start with the TSC soft disabled to prevent
|
||||
erroneous rdtsc usage on !cpu_has_tsc processors */
|
||||
static int tsc_disabled = -1;
|
||||
|
||||
/*
|
||||
* On some systems the TSC frequency does not
|
||||
@ -402,25 +405,20 @@ void __init tsc_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
if (!cpu_has_tsc || tsc_disabled) {
|
||||
/* Disable the TSC in case of !cpu_has_tsc */
|
||||
tsc_disabled = 1;
|
||||
if (!cpu_has_tsc || tsc_disabled > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
cpu_khz = calculate_cpu_khz();
|
||||
tsc_khz = cpu_khz;
|
||||
|
||||
if (!cpu_khz) {
|
||||
mark_tsc_unstable("could not calculate TSC khz");
|
||||
/*
|
||||
* We need to disable the TSC completely in this case
|
||||
* to prevent sched_clock() from using it.
|
||||
*/
|
||||
tsc_disabled = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
/* now allow native_sched_clock() to use rdtsc */
|
||||
tsc_disabled = 0;
|
||||
|
||||
printk("Detected %lu.%03lu MHz processor.\n",
|
||||
(unsigned long)cpu_khz / 1000,
|
||||
(unsigned long)cpu_khz % 1000);
|
||||
|
@ -233,6 +233,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
|
||||
|
||||
device = ac->device;
|
||||
switch (event) {
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Unsupported event [0x%x]\n", event));
|
||||
case ACPI_AC_NOTIFY_STATUS:
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
@ -244,11 +247,6 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Unsupported event [0x%x]\n", event));
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -1713,7 +1713,8 @@ acpi_video_bus_get_devices(struct acpi_video_bus *video,
|
||||
|
||||
status = acpi_video_bus_get_one_device(dev, video);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Cant attach device"));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_WARN,
|
||||
"Cant attach device"));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -651,9 +651,17 @@ config PATA_WINBOND_VLB
|
||||
Support for the Winbond W83759A controller on Vesa Local Bus
|
||||
systems.
|
||||
|
||||
config HAVE_PATA_PLATFORM
|
||||
bool
|
||||
help
|
||||
This is an internal configuration node for any machine that
|
||||
uses pata-platform driver to enable the relevant driver in the
|
||||
configuration structure without having to submit endless patches
|
||||
to update the PATA_PLATFORM entry.
|
||||
|
||||
config PATA_PLATFORM
|
||||
tristate "Generic platform device PATA support"
|
||||
depends on EMBEDDED || ARCH_RPC || PPC
|
||||
depends on EMBEDDED || ARCH_RPC || PPC || HAVE_PATA_PLATFORM
|
||||
help
|
||||
This option enables support for generic directly connected ATA
|
||||
devices commonly found on embedded systems.
|
||||
|
@ -90,6 +90,7 @@ enum {
|
||||
board_ahci_mv = 4,
|
||||
board_ahci_sb700 = 5,
|
||||
board_ahci_mcp65 = 6,
|
||||
board_ahci_nopmp = 7,
|
||||
|
||||
/* global controller registers */
|
||||
HOST_CAP = 0x00, /* host capabilities */
|
||||
@ -401,6 +402,14 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
/* board_ahci_nopmp */
|
||||
{
|
||||
AHCI_HFLAGS (AHCI_HFLAG_NO_PMP),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
.pio_mask = 0x1f, /* pio0-4 */
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
@ -525,9 +534,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */
|
||||
|
||||
/* SiS */
|
||||
{ PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
|
||||
{ PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 966 */
|
||||
{ PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
|
||||
{ PCI_VDEVICE(SI, 0x1184), board_ahci_nopmp }, /* SiS 966 */
|
||||
{ PCI_VDEVICE(SI, 0x1185), board_ahci_nopmp }, /* SiS 968 */
|
||||
{ PCI_VDEVICE(SI, 0x0186), board_ahci_nopmp }, /* SiS 968 */
|
||||
|
||||
/* Marvell */
|
||||
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
||||
@ -653,6 +662,14 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||
cap &= ~HOST_CAP_PMP;
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361 &&
|
||||
port_map != 1) {
|
||||
dev_printk(KERN_INFO, &pdev->dev,
|
||||
"JMB361 has only one port, port_map 0x%x -> 0x%x\n",
|
||||
port_map, 1);
|
||||
port_map = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Temporary Marvell 6145 hack: PATA port presence
|
||||
* is asserted through the standard AHCI port
|
||||
|
@ -1042,6 +1042,13 @@ static int piix_broken_suspend(void)
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Tecra M4"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "TECRA M4",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TECRA M4"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "TECRA M5",
|
||||
.matches = {
|
||||
|
@ -4297,7 +4297,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc)
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_check_atapi_dma - Check whether ATAPI DMA can be supported
|
||||
* atapi_check_dma - Check whether ATAPI DMA can be supported
|
||||
* @qc: Metadata associated with taskfile to check
|
||||
*
|
||||
* Allow low-level driver to filter ATA PACKET commands, returning
|
||||
@ -4310,7 +4310,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc)
|
||||
* RETURNS: 0 when ATAPI DMA can be used
|
||||
* nonzero otherwise
|
||||
*/
|
||||
int ata_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||
int atapi_check_dma(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
|
||||
|
@ -2343,8 +2343,8 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct scsi_cmnd *scmd = qc->scsicmd;
|
||||
struct ata_device *dev = qc->dev;
|
||||
int using_pio = (dev->flags & ATA_DFLAG_PIO);
|
||||
int nodata = (scmd->sc_data_direction == DMA_NONE);
|
||||
int using_pio = !nodata && (dev->flags & ATA_DFLAG_PIO);
|
||||
unsigned int nbytes;
|
||||
|
||||
memset(qc->cdb, 0, dev->cdb_len);
|
||||
@ -2362,7 +2362,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
||||
ata_qc_set_pc_nbytes(qc);
|
||||
|
||||
/* check whether ATAPI DMA is safe */
|
||||
if (!using_pio && ata_check_atapi_dma(qc))
|
||||
if (!nodata && !using_pio && atapi_check_dma(qc))
|
||||
using_pio = 1;
|
||||
|
||||
/* Some controller variants snoop this value for Packet
|
||||
@ -2402,13 +2402,11 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
||||
qc->tf.lbam = (nbytes & 0xFF);
|
||||
qc->tf.lbah = (nbytes >> 8);
|
||||
|
||||
if (using_pio || nodata) {
|
||||
/* no data, or PIO data xfer */
|
||||
if (nodata)
|
||||
qc->tf.protocol = ATAPI_PROT_NODATA;
|
||||
else
|
||||
qc->tf.protocol = ATAPI_PROT_PIO;
|
||||
} else {
|
||||
if (nodata)
|
||||
qc->tf.protocol = ATAPI_PROT_NODATA;
|
||||
else if (using_pio)
|
||||
qc->tf.protocol = ATAPI_PROT_PIO;
|
||||
else {
|
||||
/* DMA data xfer */
|
||||
qc->tf.protocol = ATAPI_PROT_DMA;
|
||||
qc->tf.feature |= ATAPI_PKT_DMA;
|
||||
|
@ -106,7 +106,7 @@ extern void ata_sg_clean(struct ata_queued_cmd *qc);
|
||||
extern void ata_qc_free(struct ata_queued_cmd *qc);
|
||||
extern void ata_qc_issue(struct ata_queued_cmd *qc);
|
||||
extern void __ata_qc_complete(struct ata_queued_cmd *qc);
|
||||
extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||
extern int atapi_check_dma(struct ata_queued_cmd *qc);
|
||||
extern void swap_buf_le16(u16 *buf, unsigned int buf_words);
|
||||
extern void ata_dev_init(struct ata_device *dev);
|
||||
extern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp);
|
||||
|
@ -414,6 +414,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
|
||||
PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b),
|
||||
PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF300", 0x7ed2ad87, 0x7e9e78ee),
|
||||
PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF500", 0x7ed2ad87, 0x7a13045c),
|
||||
PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
|
||||
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
|
||||
@ -424,6 +425,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("SMI VENDOR", "SMI PRODUCT", 0x30896c92, 0x703cc5f6),
|
||||
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
||||
PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF45", 0x709b1bf1, 0xf68b6f32),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF80", 0x709b1bf1, 0x2a54d4b1),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS2GCF120", 0x709b1bf1, 0x969aa4f2),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
|
||||
|
@ -1322,6 +1322,9 @@ static int mv_port_start(struct ata_port *ap)
|
||||
goto out_port_free_dma_mem;
|
||||
memset(pp->crpb, 0, MV_CRPB_Q_SZ);
|
||||
|
||||
/* 6041/6081 Rev. "C0" (and newer) are okay with async notify */
|
||||
if (hpriv->hp_flags & MV_HP_ERRATA_60X1C0)
|
||||
ap->flags |= ATA_FLAG_AN;
|
||||
/*
|
||||
* For GEN_I, there's no NCQ, so we only allocate a single sg_tbl.
|
||||
* For later hardware, we need one unique sg_tbl per NCQ tag.
|
||||
@ -1592,6 +1595,24 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
||||
|
||||
if ((qc->tf.protocol != ATA_PROT_DMA) &&
|
||||
(qc->tf.protocol != ATA_PROT_NCQ)) {
|
||||
static int limit_warnings = 10;
|
||||
/*
|
||||
* Errata SATA#16, SATA#24: warn if multiple DRQs expected.
|
||||
*
|
||||
* Someday, we might implement special polling workarounds
|
||||
* for these, but it all seems rather unnecessary since we
|
||||
* normally use only DMA for commands which transfer more
|
||||
* than a single block of data.
|
||||
*
|
||||
* Much of the time, this could just work regardless.
|
||||
* So for now, just log the incident, and allow the attempt.
|
||||
*/
|
||||
if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) {
|
||||
--limit_warnings;
|
||||
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
||||
": attempting PIO w/multiple DRQ: "
|
||||
"this may fail due to h/w errata\n");
|
||||
}
|
||||
/*
|
||||
* We're about to send a non-EDMA capable command to the
|
||||
* port. Turn off EDMA so there won't be problems accessing
|
||||
|
@ -948,7 +948,7 @@ static void intel_i9xx_setup_flush(void)
|
||||
intel_private.ifp_resource.flags = IORESOURCE_MEM;
|
||||
|
||||
/* Setup chipset flush for 915 */
|
||||
if (IS_I965 || IS_G33) {
|
||||
if (IS_I965 || IS_G33 || IS_G4X) {
|
||||
intel_i965_g33_setup_chipset_flush();
|
||||
} else {
|
||||
intel_i915_setup_chipset_flush();
|
||||
|
@ -76,7 +76,7 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
|
||||
for (i = 0; i < pages; i++) {
|
||||
if (!entry->busaddr[i])
|
||||
break;
|
||||
pci_unmap_single(dev->pdev, entry->busaddr[i],
|
||||
pci_unmap_page(dev->pdev, entry->busaddr[i],
|
||||
PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||
}
|
||||
|
||||
@ -137,10 +137,8 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
/* we need to support large memory configurations */
|
||||
entry->busaddr[i] = pci_map_single(dev->pdev,
|
||||
page_address(entry->
|
||||
pagelist[i]),
|
||||
PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||
entry->busaddr[i] = pci_map_page(dev->pdev, entry->pagelist[i],
|
||||
0, PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||
if (entry->busaddr[i] == 0) {
|
||||
DRM_ERROR("unable to map PCIGART pages!\n");
|
||||
drm_ati_pcigart_cleanup(dev, gart_info);
|
||||
|
@ -628,7 +628,7 @@ struct drm_set_version {
|
||||
#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, struct drm_agp_binding)
|
||||
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, struct drm_agp_binding)
|
||||
|
||||
#define DRM_IOCTL_SG_ALLOC DRM_IOW( 0x38, struct drm_scatter_gather)
|
||||
#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather)
|
||||
#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, struct drm_scatter_gather)
|
||||
|
||||
#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
|
||||
|
@ -470,17 +470,18 @@ int drm_ioctl(struct inode *inode, struct file *filp,
|
||||
if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) &&
|
||||
(nr < DRM_COMMAND_BASE + dev->driver->num_ioctls))
|
||||
ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
|
||||
else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE))
|
||||
else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) {
|
||||
ioctl = &drm_ioctls[nr];
|
||||
else
|
||||
cmd = ioctl->cmd;
|
||||
} else
|
||||
goto err_i1;
|
||||
|
||||
/* Do not trust userspace, use our own definition */
|
||||
func = ioctl->func;
|
||||
/* is there a local override? */
|
||||
if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)
|
||||
func = dev->driver->dma_ioctl;
|
||||
|
||||
|
||||
if (!func) {
|
||||
DRM_DEBUG("no function\n");
|
||||
retcode = -EINVAL;
|
||||
|
@ -103,20 +103,18 @@
|
||||
{0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \
|
||||
{0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5974, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5974, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
|
||||
{0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
@ -411,4 +409,7 @@
|
||||
{0x8086, 0x2a02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x8086, 0x2a12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x8086, 0x2a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0, 0, 0}
|
||||
|
@ -1112,12 +1112,19 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
|
||||
(dev)->pci_device == 0x29A2 || \
|
||||
(dev)->pci_device == 0x2A02 || \
|
||||
(dev)->pci_device == 0x2A12 || \
|
||||
(dev)->pci_device == 0x2A42)
|
||||
(dev)->pci_device == 0x2A42 || \
|
||||
(dev)->pci_device == 0x2E02 || \
|
||||
(dev)->pci_device == 0x2E12 || \
|
||||
(dev)->pci_device == 0x2E22)
|
||||
|
||||
#define IS_I965GM(dev) ((dev)->pci_device == 0x2A02)
|
||||
|
||||
#define IS_IGD_GM(dev) ((dev)->pci_device == 0x2A42)
|
||||
|
||||
#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
|
||||
(dev)->pci_device == 0x2E12 || \
|
||||
(dev)->pci_device == 0x2E22)
|
||||
|
||||
#define IS_G33(dev) ((dev)->pci_device == 0x29C2 || \
|
||||
(dev)->pci_device == 0x29B2 || \
|
||||
(dev)->pci_device == 0x29D2)
|
||||
@ -1128,7 +1135,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
|
||||
#define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
|
||||
IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev))
|
||||
|
||||
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev))
|
||||
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev) || IS_G4X(dev))
|
||||
|
||||
#define PRIMARY_RINGBUFFER_SIZE (128*1024)
|
||||
|
||||
|
@ -189,18 +189,12 @@ void r300_init_reg_flags(struct drm_device *dev)
|
||||
ADD_RANGE(R300_RE_CULL_CNTL, 1);
|
||||
ADD_RANGE(0x42C0, 2);
|
||||
ADD_RANGE(R300_RS_CNTL_0, 2);
|
||||
ADD_RANGE(R300_RS_INTERP_0, 8);
|
||||
ADD_RANGE(R300_RS_ROUTE_0, 8);
|
||||
ADD_RANGE(0x43A4, 2);
|
||||
|
||||
ADD_RANGE(R300_SC_HYPERZ, 2);
|
||||
ADD_RANGE(0x43E8, 1);
|
||||
ADD_RANGE(R300_PFS_CNTL_0, 3);
|
||||
ADD_RANGE(R300_PFS_NODE_0, 4);
|
||||
ADD_RANGE(R300_PFS_TEXI_0, 64);
|
||||
|
||||
ADD_RANGE(0x46A4, 5);
|
||||
ADD_RANGE(R300_PFS_INSTR0_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR1_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR2_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR3_0, 64);
|
||||
|
||||
ADD_RANGE(R300_RE_FOG_STATE, 1);
|
||||
ADD_RANGE(R300_FOG_COLOR_R, 3);
|
||||
ADD_RANGE(R300_PP_ALPHA_TEST, 2);
|
||||
@ -215,14 +209,12 @@ void r300_init_reg_flags(struct drm_device *dev)
|
||||
ADD_RANGE(0x4E50, 9);
|
||||
ADD_RANGE(0x4E88, 1);
|
||||
ADD_RANGE(0x4EA0, 2);
|
||||
ADD_RANGE(R300_RB3D_ZSTENCIL_CNTL_0, 3);
|
||||
ADD_RANGE(R300_RB3D_ZSTENCIL_FORMAT, 4);
|
||||
ADD_RANGE_MARK(R300_RB3D_DEPTHOFFSET, 1, MARK_CHECK_OFFSET); /* check offset */
|
||||
ADD_RANGE(R300_RB3D_DEPTHPITCH, 1);
|
||||
ADD_RANGE(0x4F28, 1);
|
||||
ADD_RANGE(0x4F30, 2);
|
||||
ADD_RANGE(0x4F44, 1);
|
||||
ADD_RANGE(0x4F54, 1);
|
||||
ADD_RANGE(R300_ZB_CNTL, 3);
|
||||
ADD_RANGE(R300_ZB_FORMAT, 4);
|
||||
ADD_RANGE_MARK(R300_ZB_DEPTHOFFSET, 1, MARK_CHECK_OFFSET); /* check offset */
|
||||
ADD_RANGE(R300_ZB_DEPTHPITCH, 1);
|
||||
ADD_RANGE(R300_ZB_DEPTHCLEARVALUE, 1);
|
||||
ADD_RANGE(R300_ZB_ZMASK_OFFSET, 13);
|
||||
|
||||
ADD_RANGE(R300_TX_FILTER_0, 16);
|
||||
ADD_RANGE(R300_TX_FILTER1_0, 16);
|
||||
@ -235,13 +227,32 @@ void r300_init_reg_flags(struct drm_device *dev)
|
||||
ADD_RANGE(R300_TX_BORDER_COLOR_0, 16);
|
||||
|
||||
/* Sporadic registers used as primitives are emitted */
|
||||
ADD_RANGE(R300_RB3D_ZCACHE_CTLSTAT, 1);
|
||||
ADD_RANGE(R300_ZB_ZCACHE_CTLSTAT, 1);
|
||||
ADD_RANGE(R300_RB3D_DSTCACHE_CTLSTAT, 1);
|
||||
ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8);
|
||||
ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8);
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
|
||||
ADD_RANGE(0x4074, 16);
|
||||
ADD_RANGE(R500_VAP_INDEX_OFFSET, 1);
|
||||
ADD_RANGE(R500_US_CONFIG, 2);
|
||||
ADD_RANGE(R500_US_CODE_ADDR, 3);
|
||||
ADD_RANGE(R500_US_FC_CTRL, 1);
|
||||
ADD_RANGE(R500_RS_IP_0, 16);
|
||||
ADD_RANGE(R500_RS_INST_0, 16);
|
||||
ADD_RANGE(R500_RB3D_COLOR_CLEAR_VALUE_AR, 2);
|
||||
ADD_RANGE(R500_RB3D_CONSTANT_COLOR_AR, 2);
|
||||
ADD_RANGE(R500_ZB_FIFO_SIZE, 2);
|
||||
} else {
|
||||
ADD_RANGE(R300_PFS_CNTL_0, 3);
|
||||
ADD_RANGE(R300_PFS_NODE_0, 4);
|
||||
ADD_RANGE(R300_PFS_TEXI_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR0_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR1_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR2_0, 64);
|
||||
ADD_RANGE(R300_PFS_INSTR3_0, 64);
|
||||
ADD_RANGE(R300_RS_INTERP_0, 8);
|
||||
ADD_RANGE(R300_RS_ROUTE_0, 8);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -707,8 +718,9 @@ static __inline__ void r300_pacify(drm_radeon_private_t *dev_priv)
|
||||
BEGIN_RING(6);
|
||||
OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
|
||||
OUT_RING(R300_RB3D_DSTCACHE_UNKNOWN_0A);
|
||||
OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
|
||||
OUT_RING(R300_RB3D_ZCACHE_UNKNOWN_03);
|
||||
OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0));
|
||||
OUT_RING(R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE|
|
||||
R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
|
||||
OUT_RING(CP_PACKET3(RADEON_CP_NOP, 0));
|
||||
OUT_RING(0x0);
|
||||
ADVANCE_RING();
|
||||
@ -828,6 +840,54 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads user-supplied vertex program instructions or parameters onto
|
||||
* the graphics card.
|
||||
* Called by r300_do_cp_cmdbuf.
|
||||
*/
|
||||
static inline int r300_emit_r500fp(drm_radeon_private_t *dev_priv,
|
||||
drm_radeon_kcmd_buffer_t *cmdbuf,
|
||||
drm_r300_cmd_header_t header)
|
||||
{
|
||||
int sz;
|
||||
int addr;
|
||||
int type;
|
||||
int clamp;
|
||||
int stride;
|
||||
RING_LOCALS;
|
||||
|
||||
sz = header.r500fp.count;
|
||||
/* address is 9 bits 0 - 8, bit 1 of flags is part of address */
|
||||
addr = ((header.r500fp.adrhi_flags & 1) << 8) | header.r500fp.adrlo;
|
||||
|
||||
type = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
|
||||
clamp = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
|
||||
|
||||
addr |= (type << 16);
|
||||
addr |= (clamp << 17);
|
||||
|
||||
stride = type ? 4 : 6;
|
||||
|
||||
DRM_DEBUG("r500fp %d %d type: %d\n", sz, addr, type);
|
||||
if (!sz)
|
||||
return 0;
|
||||
if (sz * stride * 4 > cmdbuf->bufsz)
|
||||
return -EINVAL;
|
||||
|
||||
BEGIN_RING(3 + sz * stride);
|
||||
OUT_RING_REG(R500_GA_US_VECTOR_INDEX, addr);
|
||||
OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * stride - 1));
|
||||
OUT_RING_TABLE((int *)cmdbuf->buf, sz * stride);
|
||||
|
||||
ADVANCE_RING();
|
||||
|
||||
cmdbuf->buf += sz * stride * 4;
|
||||
cmdbuf->bufsz -= sz * stride * 4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parses and validates a user-supplied command buffer and emits appropriate
|
||||
* commands on the DMA ring buffer.
|
||||
@ -963,6 +1023,19 @@ int r300_do_cp_cmdbuf(struct drm_device *dev,
|
||||
}
|
||||
break;
|
||||
|
||||
case R300_CMD_R500FP:
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_RV515) {
|
||||
DRM_ERROR("Calling r500 command on r300 card\n");
|
||||
ret = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
DRM_DEBUG("R300_CMD_R500FP\n");
|
||||
ret = r300_emit_r500fp(dev_priv, cmdbuf, header);
|
||||
if (ret) {
|
||||
DRM_ERROR("r300_emit_r500fp failed\n");
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("bad cmd_type %i at %p\n",
|
||||
header.header.cmd_type,
|
||||
|
@ -702,6 +702,27 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
# define R300_RS_ROUTE_1_UNKNOWN11 (1 << 11)
|
||||
/* END: Rasterization / Interpolators - many guesses */
|
||||
|
||||
/* Hierarchical Z Enable */
|
||||
#define R300_SC_HYPERZ 0x43a4
|
||||
# define R300_SC_HYPERZ_DISABLE (0 << 0)
|
||||
# define R300_SC_HYPERZ_ENABLE (1 << 0)
|
||||
# define R300_SC_HYPERZ_MIN (0 << 1)
|
||||
# define R300_SC_HYPERZ_MAX (1 << 1)
|
||||
# define R300_SC_HYPERZ_ADJ_256 (0 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_128 (1 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_64 (2 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_32 (3 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_16 (4 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_8 (5 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_4 (6 << 2)
|
||||
# define R300_SC_HYPERZ_ADJ_2 (7 << 2)
|
||||
# define R300_SC_HYPERZ_HZ_Z0MIN_NO (0 << 5)
|
||||
# define R300_SC_HYPERZ_HZ_Z0MIN (1 << 5)
|
||||
# define R300_SC_HYPERZ_HZ_Z0MAX_NO (0 << 6)
|
||||
# define R300_SC_HYPERZ_HZ_Z0MAX (1 << 6)
|
||||
|
||||
#define R300_SC_EDGERULE 0x43a8
|
||||
|
||||
/* BEGIN: Scissors and cliprects */
|
||||
|
||||
/* There are four clipping rectangles. Their corner coordinates are inclusive.
|
||||
@ -1346,7 +1367,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
/* Guess by Vladimir.
|
||||
* Set to 0A before 3D operations, set to 02 afterwards.
|
||||
*/
|
||||
#define R300_RB3D_DSTCACHE_CTLSTAT 0x4E4C
|
||||
/*#define R300_RB3D_DSTCACHE_CTLSTAT 0x4E4C*/
|
||||
# define R300_RB3D_DSTCACHE_UNKNOWN_02 0x00000002
|
||||
# define R300_RB3D_DSTCACHE_UNKNOWN_0A 0x0000000A
|
||||
|
||||
@ -1355,19 +1376,14 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* for this.
|
||||
* Bit (1<<8) is the "test" bit. so plain write is 6 - vd
|
||||
*/
|
||||
#define R300_RB3D_ZSTENCIL_CNTL_0 0x4F00
|
||||
# define R300_RB3D_Z_DISABLED_1 0x00000010
|
||||
# define R300_RB3D_Z_DISABLED_2 0x00000014
|
||||
# define R300_RB3D_Z_TEST 0x00000012
|
||||
# define R300_RB3D_Z_TEST_AND_WRITE 0x00000016
|
||||
# define R300_RB3D_Z_WRITE_ONLY 0x00000006
|
||||
#define R300_ZB_CNTL 0x4F00
|
||||
# define R300_STENCIL_ENABLE (1 << 0)
|
||||
# define R300_Z_ENABLE (1 << 1)
|
||||
# define R300_Z_WRITE_ENABLE (1 << 2)
|
||||
# define R300_Z_SIGNED_COMPARE (1 << 3)
|
||||
# define R300_STENCIL_FRONT_BACK (1 << 4)
|
||||
|
||||
# define R300_RB3D_Z_TEST 0x00000012
|
||||
# define R300_RB3D_Z_TEST_AND_WRITE 0x00000016
|
||||
# define R300_RB3D_Z_WRITE_ONLY 0x00000006
|
||||
# define R300_RB3D_STENCIL_ENABLE 0x00000001
|
||||
|
||||
#define R300_RB3D_ZSTENCIL_CNTL_1 0x4F04
|
||||
#define R300_ZB_ZSTENCILCNTL 0x4f04
|
||||
/* functions */
|
||||
# define R300_ZS_NEVER 0
|
||||
# define R300_ZS_LESS 1
|
||||
@ -1387,52 +1403,166 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
# define R300_ZS_INVERT 5
|
||||
# define R300_ZS_INCR_WRAP 6
|
||||
# define R300_ZS_DECR_WRAP 7
|
||||
# define R300_Z_FUNC_SHIFT 0
|
||||
/* front and back refer to operations done for front
|
||||
and back faces, i.e. separate stencil function support */
|
||||
# define R300_RB3D_ZS1_DEPTH_FUNC_SHIFT 0
|
||||
# define R300_RB3D_ZS1_FRONT_FUNC_SHIFT 3
|
||||
# define R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT 6
|
||||
# define R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT 9
|
||||
# define R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT 12
|
||||
# define R300_RB3D_ZS1_BACK_FUNC_SHIFT 15
|
||||
# define R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT 18
|
||||
# define R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT 21
|
||||
# define R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT 24
|
||||
# define R300_S_FRONT_FUNC_SHIFT 3
|
||||
# define R300_S_FRONT_SFAIL_OP_SHIFT 6
|
||||
# define R300_S_FRONT_ZPASS_OP_SHIFT 9
|
||||
# define R300_S_FRONT_ZFAIL_OP_SHIFT 12
|
||||
# define R300_S_BACK_FUNC_SHIFT 15
|
||||
# define R300_S_BACK_SFAIL_OP_SHIFT 18
|
||||
# define R300_S_BACK_ZPASS_OP_SHIFT 21
|
||||
# define R300_S_BACK_ZFAIL_OP_SHIFT 24
|
||||
|
||||
#define R300_RB3D_ZSTENCIL_CNTL_2 0x4F08
|
||||
# define R300_RB3D_ZS2_STENCIL_REF_SHIFT 0
|
||||
# define R300_RB3D_ZS2_STENCIL_MASK 0xFF
|
||||
# define R300_RB3D_ZS2_STENCIL_MASK_SHIFT 8
|
||||
# define R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT 16
|
||||
#define R300_ZB_STENCILREFMASK 0x4f08
|
||||
# define R300_STENCILREF_SHIFT 0
|
||||
# define R300_STENCILREF_MASK 0x000000ff
|
||||
# define R300_STENCILMASK_SHIFT 8
|
||||
# define R300_STENCILMASK_MASK 0x0000ff00
|
||||
# define R300_STENCILWRITEMASK_SHIFT 16
|
||||
# define R300_STENCILWRITEMASK_MASK 0x00ff0000
|
||||
|
||||
/* gap */
|
||||
|
||||
#define R300_RB3D_ZSTENCIL_FORMAT 0x4F10
|
||||
# define R300_DEPTH_FORMAT_16BIT_INT_Z (0 << 0)
|
||||
# define R300_DEPTH_FORMAT_24BIT_INT_Z (2 << 0)
|
||||
/* 16 bit format or some aditional bit ? */
|
||||
# define R300_DEPTH_FORMAT_UNK32 (32 << 0)
|
||||
#define R300_ZB_FORMAT 0x4f10
|
||||
# define R300_DEPTHFORMAT_16BIT_INT_Z (0 << 0)
|
||||
# define R300_DEPTHFORMAT_16BIT_13E3 (1 << 0)
|
||||
# define R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL (2 << 0)
|
||||
/* reserved up to (15 << 0) */
|
||||
# define R300_INVERT_13E3_LEADING_ONES (0 << 4)
|
||||
# define R300_INVERT_13E3_LEADING_ZEROS (1 << 4)
|
||||
|
||||
#define R300_RB3D_EARLY_Z 0x4F14
|
||||
# define R300_EARLY_Z_DISABLE (0 << 0)
|
||||
# define R300_EARLY_Z_ENABLE (1 << 0)
|
||||
#define R300_ZB_ZTOP 0x4F14
|
||||
# define R300_ZTOP_DISABLE (0 << 0)
|
||||
# define R300_ZTOP_ENABLE (1 << 0)
|
||||
|
||||
/* gap */
|
||||
|
||||
#define R300_RB3D_ZCACHE_CTLSTAT 0x4F18 /* GUESS */
|
||||
# define R300_RB3D_ZCACHE_UNKNOWN_01 0x1
|
||||
# define R300_RB3D_ZCACHE_UNKNOWN_03 0x3
|
||||
#define R300_ZB_ZCACHE_CTLSTAT 0x4f18
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_NO_EFFECT (0 << 0)
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE (1 << 0)
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_NO_EFFECT (0 << 1)
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE (1 << 1)
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_IDLE (0 << 31)
|
||||
# define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_BUSY (1 << 31)
|
||||
|
||||
#define R300_ZB_BW_CNTL 0x4f1c
|
||||
# define R300_HIZ_DISABLE (0 << 0)
|
||||
# define R300_HIZ_ENABLE (1 << 0)
|
||||
# define R300_HIZ_MIN (0 << 1)
|
||||
# define R300_HIZ_MAX (1 << 1)
|
||||
# define R300_FAST_FILL_DISABLE (0 << 2)
|
||||
# define R300_FAST_FILL_ENABLE (1 << 2)
|
||||
# define R300_RD_COMP_DISABLE (0 << 3)
|
||||
# define R300_RD_COMP_ENABLE (1 << 3)
|
||||
# define R300_WR_COMP_DISABLE (0 << 4)
|
||||
# define R300_WR_COMP_ENABLE (1 << 4)
|
||||
# define R300_ZB_CB_CLEAR_RMW (0 << 5)
|
||||
# define R300_ZB_CB_CLEAR_CACHE_LINEAR (1 << 5)
|
||||
# define R300_FORCE_COMPRESSED_STENCIL_VALUE_DISABLE (0 << 6)
|
||||
# define R300_FORCE_COMPRESSED_STENCIL_VALUE_ENABLE (1 << 6)
|
||||
|
||||
# define R500_ZEQUAL_OPTIMIZE_ENABLE (0 << 7)
|
||||
# define R500_ZEQUAL_OPTIMIZE_DISABLE (1 << 7)
|
||||
# define R500_SEQUAL_OPTIMIZE_ENABLE (0 << 8)
|
||||
# define R500_SEQUAL_OPTIMIZE_DISABLE (1 << 8)
|
||||
|
||||
# define R500_BMASK_ENABLE (0 << 10)
|
||||
# define R500_BMASK_DISABLE (1 << 10)
|
||||
# define R500_HIZ_EQUAL_REJECT_DISABLE (0 << 11)
|
||||
# define R500_HIZ_EQUAL_REJECT_ENABLE (1 << 11)
|
||||
# define R500_HIZ_FP_EXP_BITS_DISABLE (0 << 12)
|
||||
# define R500_HIZ_FP_EXP_BITS_1 (1 << 12)
|
||||
# define R500_HIZ_FP_EXP_BITS_2 (2 << 12)
|
||||
# define R500_HIZ_FP_EXP_BITS_3 (3 << 12)
|
||||
# define R500_HIZ_FP_EXP_BITS_4 (4 << 12)
|
||||
# define R500_HIZ_FP_EXP_BITS_5 (5 << 12)
|
||||
# define R500_HIZ_FP_INVERT_LEADING_ONES (0 << 15)
|
||||
# define R500_HIZ_FP_INVERT_LEADING_ZEROS (1 << 15)
|
||||
# define R500_TILE_OVERWRITE_RECOMPRESSION_ENABLE (0 << 16)
|
||||
# define R500_TILE_OVERWRITE_RECOMPRESSION_DISABLE (1 << 16)
|
||||
# define R500_CONTIGUOUS_6XAA_SAMPLES_ENABLE (0 << 17)
|
||||
# define R500_CONTIGUOUS_6XAA_SAMPLES_DISABLE (1 << 17)
|
||||
# define R500_PEQ_PACKING_DISABLE (0 << 18)
|
||||
# define R500_PEQ_PACKING_ENABLE (1 << 18)
|
||||
# define R500_COVERED_PTR_MASKING_DISABLE (0 << 18)
|
||||
# define R500_COVERED_PTR_MASKING_ENABLE (1 << 18)
|
||||
|
||||
|
||||
/* gap */
|
||||
|
||||
#define R300_RB3D_DEPTHOFFSET 0x4F20
|
||||
#define R300_RB3D_DEPTHPITCH 0x4F24
|
||||
# define R300_DEPTHPITCH_MASK 0x00001FF8 /* GUESS */
|
||||
# define R300_DEPTH_TILE_ENABLE (1 << 16) /* GUESS */
|
||||
# define R300_DEPTH_MICROTILE_ENABLE (1 << 17) /* GUESS */
|
||||
# define R300_DEPTH_ENDIAN_NO_SWAP (0 << 18) /* GUESS */
|
||||
# define R300_DEPTH_ENDIAN_WORD_SWAP (1 << 18) /* GUESS */
|
||||
# define R300_DEPTH_ENDIAN_DWORD_SWAP (2 << 18) /* GUESS */
|
||||
/* Z Buffer Address Offset.
|
||||
* Bits 31 to 5 are used for aligned Z buffer address offset for macro tiles.
|
||||
*/
|
||||
#define R300_ZB_DEPTHOFFSET 0x4f20
|
||||
|
||||
/* Z Buffer Pitch and Endian Control */
|
||||
#define R300_ZB_DEPTHPITCH 0x4f24
|
||||
# define R300_DEPTHPITCH_MASK 0x00003FFC
|
||||
# define R300_DEPTHMACROTILE_DISABLE (0 << 16)
|
||||
# define R300_DEPTHMACROTILE_ENABLE (1 << 16)
|
||||
# define R300_DEPTHMICROTILE_LINEAR (0 << 17)
|
||||
# define R300_DEPTHMICROTILE_TILED (1 << 17)
|
||||
# define R300_DEPTHMICROTILE_TILED_SQUARE (2 << 17)
|
||||
# define R300_DEPTHENDIAN_NO_SWAP (0 << 18)
|
||||
# define R300_DEPTHENDIAN_WORD_SWAP (1 << 18)
|
||||
# define R300_DEPTHENDIAN_DWORD_SWAP (2 << 18)
|
||||
# define R300_DEPTHENDIAN_HALF_DWORD_SWAP (3 << 18)
|
||||
|
||||
/* Z Buffer Clear Value */
|
||||
#define R300_ZB_DEPTHCLEARVALUE 0x4f28
|
||||
|
||||
#define R300_ZB_ZMASK_OFFSET 0x4f30
|
||||
#define R300_ZB_ZMASK_PITCH 0x4f34
|
||||
#define R300_ZB_ZMASK_WRINDEX 0x4f38
|
||||
#define R300_ZB_ZMASK_DWORD 0x4f3c
|
||||
#define R300_ZB_ZMASK_RDINDEX 0x4f40
|
||||
|
||||
/* Hierarchical Z Memory Offset */
|
||||
#define R300_ZB_HIZ_OFFSET 0x4f44
|
||||
|
||||
/* Hierarchical Z Write Index */
|
||||
#define R300_ZB_HIZ_WRINDEX 0x4f48
|
||||
|
||||
/* Hierarchical Z Data */
|
||||
#define R300_ZB_HIZ_DWORD 0x4f4c
|
||||
|
||||
/* Hierarchical Z Read Index */
|
||||
#define R300_ZB_HIZ_RDINDEX 0x4f50
|
||||
|
||||
/* Hierarchical Z Pitch */
|
||||
#define R300_ZB_HIZ_PITCH 0x4f54
|
||||
|
||||
/* Z Buffer Z Pass Counter Data */
|
||||
#define R300_ZB_ZPASS_DATA 0x4f58
|
||||
|
||||
/* Z Buffer Z Pass Counter Address */
|
||||
#define R300_ZB_ZPASS_ADDR 0x4f5c
|
||||
|
||||
/* Depth buffer X and Y coordinate offset */
|
||||
#define R300_ZB_DEPTHXY_OFFSET 0x4f60
|
||||
# define R300_DEPTHX_OFFSET_SHIFT 1
|
||||
# define R300_DEPTHX_OFFSET_MASK 0x000007FE
|
||||
# define R300_DEPTHY_OFFSET_SHIFT 17
|
||||
# define R300_DEPTHY_OFFSET_MASK 0x07FE0000
|
||||
|
||||
/* Sets the fifo sizes */
|
||||
#define R500_ZB_FIFO_SIZE 0x4fd0
|
||||
# define R500_OP_FIFO_SIZE_FULL (0 << 0)
|
||||
# define R500_OP_FIFO_SIZE_HALF (1 << 0)
|
||||
# define R500_OP_FIFO_SIZE_QUATER (2 << 0)
|
||||
# define R500_OP_FIFO_SIZE_EIGTHS (4 << 0)
|
||||
|
||||
/* Stencil Reference Value and Mask for backfacing quads */
|
||||
/* R300_ZB_STENCILREFMASK handles front face */
|
||||
#define R500_ZB_STENCILREFMASK_BF 0x4fd4
|
||||
# define R500_STENCILREF_SHIFT 0
|
||||
# define R500_STENCILREF_MASK 0x000000ff
|
||||
# define R500_STENCILMASK_SHIFT 8
|
||||
# define R500_STENCILMASK_MASK 0x0000ff00
|
||||
# define R500_STENCILWRITEMASK_SHIFT 16
|
||||
# define R500_STENCILWRITEMASK_MASK 0x00ff0000
|
||||
|
||||
/* BEGIN: Vertex program instruction set */
|
||||
|
||||
@ -1623,4 +1753,20 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#define R300_CP_CMD_BITBLT_MULTI 0xC0009B00
|
||||
|
||||
#define R500_VAP_INDEX_OFFSET 0x208c
|
||||
|
||||
#define R500_GA_US_VECTOR_INDEX 0x4250
|
||||
#define R500_GA_US_VECTOR_DATA 0x4254
|
||||
|
||||
#define R500_RS_IP_0 0x4074
|
||||
#define R500_RS_INST_0 0x4320
|
||||
|
||||
#define R500_US_CONFIG 0x4600
|
||||
|
||||
#define R500_US_FC_CTRL 0x4624
|
||||
#define R500_US_CODE_ADDR 0x4630
|
||||
|
||||
#define R500_RB3D_COLOR_CLEAR_VALUE_AR 0x46c0
|
||||
#define R500_RB3D_CONSTANT_COLOR_AR 0x4ef8
|
||||
|
||||
#endif /* _R300_REG_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -240,6 +240,7 @@ typedef union {
|
||||
# define R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN 0x8
|
||||
|
||||
#define R300_CMD_SCRATCH 8
|
||||
#define R300_CMD_R500FP 9
|
||||
|
||||
typedef union {
|
||||
unsigned int u;
|
||||
@ -268,6 +269,9 @@ typedef union {
|
||||
struct {
|
||||
unsigned char cmd_type, reg, n_bufs, flags;
|
||||
} scratch;
|
||||
struct {
|
||||
unsigned char cmd_type, count, adrlo, adrhi_flags;
|
||||
} r500fp;
|
||||
} drm_r300_cmd_header_t;
|
||||
|
||||
#define RADEON_FRONT 0x1
|
||||
@ -278,6 +282,9 @@ typedef union {
|
||||
#define RADEON_USE_HIERZ 0x40000000
|
||||
#define RADEON_USE_COMP_ZBUF 0x20000000
|
||||
|
||||
#define R500FP_CONSTANT_TYPE (1 << 1)
|
||||
#define R500FP_CONSTANT_CLAMP (1 << 2)
|
||||
|
||||
/* Primitive types
|
||||
*/
|
||||
#define RADEON_POINTS 0x1
|
||||
@ -669,6 +676,7 @@ typedef struct drm_radeon_indirect {
|
||||
#define RADEON_PARAM_CARD_TYPE 12
|
||||
#define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */
|
||||
#define RADEON_PARAM_FB_LOCATION 14 /* FB location */
|
||||
#define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */
|
||||
|
||||
typedef struct drm_radeon_getparam {
|
||||
int param;
|
||||
|
@ -38,7 +38,7 @@
|
||||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20060524"
|
||||
#define DRIVER_DATE "20080528"
|
||||
|
||||
/* Interface history:
|
||||
*
|
||||
@ -98,9 +98,10 @@
|
||||
* 1.26- Add support for variable size PCI(E) gart aperture
|
||||
* 1.27- Add support for IGP GART
|
||||
* 1.28- Add support for VBL on CRTC2
|
||||
* 1.29- R500 3D cmd buffer support
|
||||
*/
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 28
|
||||
#define DRIVER_MINOR 29
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
|
||||
/*
|
||||
@ -122,7 +123,7 @@ enum radeon_family {
|
||||
CHIP_RV380,
|
||||
CHIP_R420,
|
||||
CHIP_RV410,
|
||||
CHIP_RS400,
|
||||
CHIP_RS480,
|
||||
CHIP_RS690,
|
||||
CHIP_RV515,
|
||||
CHIP_R520,
|
||||
@ -294,6 +295,7 @@ typedef struct drm_radeon_private {
|
||||
int vblank_crtc;
|
||||
uint32_t irq_enable_reg;
|
||||
int irq_enabled;
|
||||
uint32_t r500_disp_irq_reg;
|
||||
|
||||
struct radeon_surface surfaces[RADEON_MAX_SURFACES];
|
||||
struct radeon_virt_surface virt_surfaces[2 * RADEON_MAX_SURFACES];
|
||||
@ -307,6 +309,8 @@ typedef struct drm_radeon_private {
|
||||
/* starting from here on, data is preserved accross an open */
|
||||
uint32_t flags; /* see radeon_chip_flags */
|
||||
unsigned long fb_aper_offset;
|
||||
|
||||
int num_gb_pipes;
|
||||
} drm_radeon_private_t;
|
||||
|
||||
typedef struct drm_radeon_buf_priv {
|
||||
@ -382,6 +386,7 @@ extern irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS);
|
||||
extern void radeon_driver_irq_preinstall(struct drm_device * dev);
|
||||
extern void radeon_driver_irq_postinstall(struct drm_device * dev);
|
||||
extern void radeon_driver_irq_uninstall(struct drm_device * dev);
|
||||
extern void radeon_enable_interrupt(struct drm_device *dev);
|
||||
extern int radeon_vblank_crtc_get(struct drm_device *dev);
|
||||
extern int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value);
|
||||
|
||||
@ -444,13 +449,13 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
#define RADEON_PCIE_DATA 0x0034
|
||||
#define RADEON_PCIE_TX_GART_CNTL 0x10
|
||||
# define RADEON_PCIE_TX_GART_EN (1 << 0)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_PASS_THRU (0<<1)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_CLAMP_LO (1<<1)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD (3<<1)
|
||||
# define RADEON_PCIE_TX_GART_MODE_32_128_CACHE (0<<3)
|
||||
# define RADEON_PCIE_TX_GART_MODE_8_4_128_CACHE (1<<3)
|
||||
# define RADEON_PCIE_TX_GART_CHK_RW_VALID_EN (1<<5)
|
||||
# define RADEON_PCIE_TX_GART_INVALIDATE_TLB (1<<8)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_PASS_THRU (0 << 1)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_CLAMP_LO (1 << 1)
|
||||
# define RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD (3 << 1)
|
||||
# define RADEON_PCIE_TX_GART_MODE_32_128_CACHE (0 << 3)
|
||||
# define RADEON_PCIE_TX_GART_MODE_8_4_128_CACHE (1 << 3)
|
||||
# define RADEON_PCIE_TX_GART_CHK_RW_VALID_EN (1 << 5)
|
||||
# define RADEON_PCIE_TX_GART_INVALIDATE_TLB (1 << 8)
|
||||
#define RADEON_PCIE_TX_DISCARD_RD_ADDR_LO 0x11
|
||||
#define RADEON_PCIE_TX_DISCARD_RD_ADDR_HI 0x12
|
||||
#define RADEON_PCIE_TX_GART_BASE 0x13
|
||||
@ -459,14 +464,9 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
#define RADEON_PCIE_TX_GART_END_LO 0x16
|
||||
#define RADEON_PCIE_TX_GART_END_HI 0x17
|
||||
|
||||
#define RADEON_IGPGART_INDEX 0x168
|
||||
#define RADEON_IGPGART_DATA 0x16c
|
||||
#define RADEON_IGPGART_UNK_18 0x18
|
||||
#define RADEON_IGPGART_CTRL 0x2b
|
||||
#define RADEON_IGPGART_BASE_ADDR 0x2c
|
||||
#define RADEON_IGPGART_FLUSH 0x2e
|
||||
#define RADEON_IGPGART_ENABLE 0x38
|
||||
#define RADEON_IGPGART_UNK_39 0x39
|
||||
#define RS480_NB_MC_INDEX 0x168
|
||||
# define RS480_NB_MC_IND_WR_EN (1 << 8)
|
||||
#define RS480_NB_MC_DATA 0x16c
|
||||
|
||||
#define RS690_MC_INDEX 0x78
|
||||
# define RS690_MC_INDEX_MASK 0x1ff
|
||||
@ -474,45 +474,91 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
# define RS690_MC_INDEX_WR_ACK 0x7f
|
||||
#define RS690_MC_DATA 0x7c
|
||||
|
||||
#define RS690_MC_MISC_CNTL 0x18
|
||||
#define RS690_MC_GART_FEATURE_ID 0x2b
|
||||
#define RS690_MC_GART_BASE 0x2c
|
||||
#define RS690_MC_GART_CACHE_CNTL 0x2e
|
||||
# define RS690_MC_GART_CC_NO_CHANGE 0x0
|
||||
# define RS690_MC_GART_CC_CLEAR 0x1
|
||||
# define RS690_MC_GART_CLEAR_STATUS (1 << 1)
|
||||
# define RS690_MC_GART_CLEAR_DONE (0 << 1)
|
||||
# define RS690_MC_GART_CLEAR_PENDING (1 << 1)
|
||||
#define RS690_MC_AGP_SIZE 0x38
|
||||
# define RS690_MC_GART_DIS 0x0
|
||||
# define RS690_MC_GART_EN 0x1
|
||||
# define RS690_MC_AGP_SIZE_32MB (0 << 1)
|
||||
# define RS690_MC_AGP_SIZE_64MB (1 << 1)
|
||||
# define RS690_MC_AGP_SIZE_128MB (2 << 1)
|
||||
# define RS690_MC_AGP_SIZE_256MB (3 << 1)
|
||||
# define RS690_MC_AGP_SIZE_512MB (4 << 1)
|
||||
# define RS690_MC_AGP_SIZE_1GB (5 << 1)
|
||||
# define RS690_MC_AGP_SIZE_2GB (6 << 1)
|
||||
#define RS690_MC_AGP_MODE_CONTROL 0x39
|
||||
/* MC indirect registers */
|
||||
#define RS480_MC_MISC_CNTL 0x18
|
||||
# define RS480_DISABLE_GTW (1 << 1)
|
||||
/* switch between MCIND GART and MM GART registers. 0 = mmgart, 1 = mcind gart */
|
||||
# define RS480_GART_INDEX_REG_EN (1 << 12)
|
||||
# define RS690_BLOCK_GFX_D3_EN (1 << 14)
|
||||
#define RS480_K8_FB_LOCATION 0x1e
|
||||
#define RS480_GART_FEATURE_ID 0x2b
|
||||
# define RS480_HANG_EN (1 << 11)
|
||||
# define RS480_TLB_ENABLE (1 << 18)
|
||||
# define RS480_P2P_ENABLE (1 << 19)
|
||||
# define RS480_GTW_LAC_EN (1 << 25)
|
||||
# define RS480_2LEVEL_GART (0 << 30)
|
||||
# define RS480_1LEVEL_GART (1 << 30)
|
||||
# define RS480_PDC_EN (1 << 31)
|
||||
#define RS480_GART_BASE 0x2c
|
||||
#define RS480_GART_CACHE_CNTRL 0x2e
|
||||
# define RS480_GART_CACHE_INVALIDATE (1 << 0) /* wait for it to clear */
|
||||
#define RS480_AGP_ADDRESS_SPACE_SIZE 0x38
|
||||
# define RS480_GART_EN (1 << 0)
|
||||
# define RS480_VA_SIZE_32MB (0 << 1)
|
||||
# define RS480_VA_SIZE_64MB (1 << 1)
|
||||
# define RS480_VA_SIZE_128MB (2 << 1)
|
||||
# define RS480_VA_SIZE_256MB (3 << 1)
|
||||
# define RS480_VA_SIZE_512MB (4 << 1)
|
||||
# define RS480_VA_SIZE_1GB (5 << 1)
|
||||
# define RS480_VA_SIZE_2GB (6 << 1)
|
||||
#define RS480_AGP_MODE_CNTL 0x39
|
||||
# define RS480_POST_GART_Q_SIZE (1 << 18)
|
||||
# define RS480_NONGART_SNOOP (1 << 19)
|
||||
# define RS480_AGP_RD_BUF_SIZE (1 << 20)
|
||||
# define RS480_REQ_TYPE_SNOOP_SHIFT 22
|
||||
# define RS480_REQ_TYPE_SNOOP_MASK 0x3
|
||||
# define RS480_REQ_TYPE_SNOOP_DIS (1 << 24)
|
||||
#define RS480_MC_MISC_UMA_CNTL 0x5f
|
||||
#define RS480_MC_MCLK_CNTL 0x7a
|
||||
#define RS480_MC_UMA_DUALCH_CNTL 0x86
|
||||
|
||||
#define RS690_MC_FB_LOCATION 0x100
|
||||
#define RS690_MC_AGP_LOCATION 0x101
|
||||
#define RS690_MC_AGP_BASE 0x102
|
||||
#define RS690_MC_AGP_BASE_2 0x103
|
||||
|
||||
#define R520_MC_IND_INDEX 0x70
|
||||
#define R520_MC_IND_WR_EN (1<<24)
|
||||
#define R520_MC_IND_WR_EN (1 << 24)
|
||||
#define R520_MC_IND_DATA 0x74
|
||||
|
||||
#define RV515_MC_FB_LOCATION 0x01
|
||||
#define RV515_MC_AGP_LOCATION 0x02
|
||||
#define RV515_MC_AGP_BASE 0x03
|
||||
#define RV515_MC_AGP_BASE_2 0x04
|
||||
|
||||
#define R520_MC_FB_LOCATION 0x04
|
||||
#define R520_MC_AGP_LOCATION 0x05
|
||||
#define R520_MC_AGP_BASE 0x06
|
||||
#define R520_MC_AGP_BASE_2 0x07
|
||||
|
||||
#define RADEON_MPP_TB_CONFIG 0x01c0
|
||||
#define RADEON_MEM_CNTL 0x0140
|
||||
#define RADEON_MEM_SDRAM_MODE_REG 0x0158
|
||||
#define RADEON_AGP_BASE_2 0x015c /* r200+ only */
|
||||
#define RS480_AGP_BASE_2 0x0164
|
||||
#define RADEON_AGP_BASE 0x0170
|
||||
|
||||
/* pipe config regs */
|
||||
#define R400_GB_PIPE_SELECT 0x402c
|
||||
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
|
||||
#define R500_SU_REG_DEST 0x42c8
|
||||
#define R300_GB_TILE_CONFIG 0x4018
|
||||
# define R300_ENABLE_TILING (1 << 0)
|
||||
# define R300_PIPE_COUNT_RV350 (0 << 1)
|
||||
# define R300_PIPE_COUNT_R300 (3 << 1)
|
||||
# define R300_PIPE_COUNT_R420_3P (6 << 1)
|
||||
# define R300_PIPE_COUNT_R420 (7 << 1)
|
||||
# define R300_TILE_SIZE_8 (0 << 4)
|
||||
# define R300_TILE_SIZE_16 (1 << 4)
|
||||
# define R300_TILE_SIZE_32 (2 << 4)
|
||||
# define R300_SUBPIXEL_1_12 (0 << 16)
|
||||
# define R300_SUBPIXEL_1_16 (1 << 16)
|
||||
#define R300_DST_PIPE_CONFIG 0x170c
|
||||
# define R300_PIPE_AUTO_CONFIG (1 << 31)
|
||||
#define R300_RB2D_DSTCACHE_MODE 0x3428
|
||||
# define R300_DC_AUTOFLUSH_ENABLE (1 << 8)
|
||||
# define R300_DC_DC_DISABLE_IGNORE_PE (1 << 17)
|
||||
|
||||
#define RADEON_RB3D_COLOROFFSET 0x1c40
|
||||
#define RADEON_RB3D_COLORPITCH 0x1c48
|
||||
|
||||
@ -616,11 +662,12 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
#define RADEON_PP_TXFILTER_1 0x1c6c
|
||||
#define RADEON_PP_TXFILTER_2 0x1c84
|
||||
|
||||
#define RADEON_RB2D_DSTCACHE_CTLSTAT 0x342c
|
||||
# define RADEON_RB2D_DC_FLUSH (3 << 0)
|
||||
# define RADEON_RB2D_DC_FREE (3 << 2)
|
||||
# define RADEON_RB2D_DC_FLUSH_ALL 0xf
|
||||
# define RADEON_RB2D_DC_BUSY (1 << 31)
|
||||
#define R300_RB2D_DSTCACHE_CTLSTAT 0x342c /* use R300_DSTCACHE_CTLSTAT */
|
||||
#define R300_DSTCACHE_CTLSTAT 0x1714
|
||||
# define R300_RB2D_DC_FLUSH (3 << 0)
|
||||
# define R300_RB2D_DC_FREE (3 << 2)
|
||||
# define R300_RB2D_DC_FLUSH_ALL 0xf
|
||||
# define R300_RB2D_DC_BUSY (1 << 31)
|
||||
#define RADEON_RB3D_CNTL 0x1c3c
|
||||
# define RADEON_ALPHA_BLEND_ENABLE (1 << 0)
|
||||
# define RADEON_PLANE_MASK_ENABLE (1 << 1)
|
||||
@ -643,11 +690,18 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
# define RADEON_RB3D_ZC_FREE (1 << 2)
|
||||
# define RADEON_RB3D_ZC_FLUSH_ALL 0x5
|
||||
# define RADEON_RB3D_ZC_BUSY (1 << 31)
|
||||
#define R300_ZB_ZCACHE_CTLSTAT 0x4f18
|
||||
# define R300_ZC_FLUSH (1 << 0)
|
||||
# define R300_ZC_FREE (1 << 1)
|
||||
# define R300_ZC_FLUSH_ALL 0x3
|
||||
# define R300_ZC_BUSY (1 << 31)
|
||||
#define RADEON_RB3D_DSTCACHE_CTLSTAT 0x325c
|
||||
# define RADEON_RB3D_DC_FLUSH (3 << 0)
|
||||
# define RADEON_RB3D_DC_FREE (3 << 2)
|
||||
# define RADEON_RB3D_DC_FLUSH_ALL 0xf
|
||||
# define RADEON_RB3D_DC_BUSY (1 << 31)
|
||||
#define R300_RB3D_DSTCACHE_CTLSTAT 0x4e4c
|
||||
# define R300_RB3D_DC_FINISH (1 << 4)
|
||||
#define RADEON_RB3D_ZSTENCILCNTL 0x1c2c
|
||||
# define RADEON_Z_TEST_MASK (7 << 4)
|
||||
# define RADEON_Z_TEST_ALWAYS (7 << 4)
|
||||
@ -1057,6 +1111,31 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
|
||||
#define R200_VAP_PVS_CNTL_1 0x22D0
|
||||
|
||||
#define R500_D1CRTC_STATUS 0x609c
|
||||
#define R500_D2CRTC_STATUS 0x689c
|
||||
#define R500_CRTC_V_BLANK (1<<0)
|
||||
|
||||
#define R500_D1CRTC_FRAME_COUNT 0x60a4
|
||||
#define R500_D2CRTC_FRAME_COUNT 0x68a4
|
||||
|
||||
#define R500_D1MODE_V_COUNTER 0x6530
|
||||
#define R500_D2MODE_V_COUNTER 0x6d30
|
||||
|
||||
#define R500_D1MODE_VBLANK_STATUS 0x6534
|
||||
#define R500_D2MODE_VBLANK_STATUS 0x6d34
|
||||
#define R500_VBLANK_OCCURED (1<<0)
|
||||
#define R500_VBLANK_ACK (1<<4)
|
||||
#define R500_VBLANK_STAT (1<<12)
|
||||
#define R500_VBLANK_INT (1<<16)
|
||||
|
||||
#define R500_DxMODE_INT_MASK 0x6540
|
||||
#define R500_D1MODE_INT_MASK (1<<0)
|
||||
#define R500_D2MODE_INT_MASK (1<<8)
|
||||
|
||||
#define R500_DISP_INTERRUPT_STATUS 0x7edc
|
||||
#define R500_D1_VBLANK_INTERRUPT (1 << 4)
|
||||
#define R500_D2_VBLANK_INTERRUPT (1 << 5)
|
||||
|
||||
/* Constants */
|
||||
#define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */
|
||||
|
||||
@ -1078,42 +1157,50 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
|
||||
#define RADEON_READ8(reg) DRM_READ8( dev_priv->mmio, (reg) )
|
||||
#define RADEON_WRITE8(reg,val) DRM_WRITE8( dev_priv->mmio, (reg), (val) )
|
||||
|
||||
#define RADEON_WRITE_PLL( addr, val ) \
|
||||
#define RADEON_WRITE_PLL(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE8( RADEON_CLOCK_CNTL_INDEX, \
|
||||
RADEON_WRITE8(RADEON_CLOCK_CNTL_INDEX, \
|
||||
((addr) & 0x1f) | RADEON_PLL_WR_EN ); \
|
||||
RADEON_WRITE( RADEON_CLOCK_CNTL_DATA, (val) ); \
|
||||
RADEON_WRITE(RADEON_CLOCK_CNTL_DATA, (val)); \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_WRITE_IGPGART( addr, val ) \
|
||||
#define RADEON_WRITE_PCIE(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE( RADEON_IGPGART_INDEX, \
|
||||
((addr) & 0x7f) | (1 << 8)); \
|
||||
RADEON_WRITE( RADEON_IGPGART_DATA, (val) ); \
|
||||
RADEON_WRITE( RADEON_IGPGART_INDEX, 0x7f ); \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_WRITE_PCIE( addr, val ) \
|
||||
do { \
|
||||
RADEON_WRITE8( RADEON_PCIE_INDEX, \
|
||||
RADEON_WRITE8(RADEON_PCIE_INDEX, \
|
||||
((addr) & 0xff)); \
|
||||
RADEON_WRITE( RADEON_PCIE_DATA, (val) ); \
|
||||
RADEON_WRITE(RADEON_PCIE_DATA, (val)); \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_WRITE_MCIND( addr, val ) \
|
||||
do { \
|
||||
RADEON_WRITE(R520_MC_IND_INDEX, 0xff0000 | ((addr) & 0xff)); \
|
||||
RADEON_WRITE(R520_MC_IND_DATA, (val)); \
|
||||
RADEON_WRITE(R520_MC_IND_INDEX, 0); \
|
||||
} while (0)
|
||||
#define R500_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE(R520_MC_IND_INDEX, 0xff0000 | ((addr) & 0xff)); \
|
||||
RADEON_WRITE(R520_MC_IND_DATA, (val)); \
|
||||
RADEON_WRITE(R520_MC_IND_INDEX, 0); \
|
||||
} while (0)
|
||||
|
||||
#define RS690_WRITE_MCIND( addr, val ) \
|
||||
#define RS480_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE(RS480_NB_MC_INDEX, \
|
||||
((addr) & 0xff) | RS480_NB_MC_IND_WR_EN); \
|
||||
RADEON_WRITE(RS480_NB_MC_DATA, (val)); \
|
||||
RADEON_WRITE(RS480_NB_MC_INDEX, 0xff); \
|
||||
} while (0)
|
||||
|
||||
#define RS690_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE(RS690_MC_INDEX, RS690_MC_INDEX_WR_EN | ((addr) & RS690_MC_INDEX_MASK)); \
|
||||
RADEON_WRITE(RS690_MC_DATA, val); \
|
||||
RADEON_WRITE(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); \
|
||||
} while (0)
|
||||
|
||||
#define IGP_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) \
|
||||
RS690_WRITE_MCIND(addr, val); \
|
||||
else \
|
||||
RS480_WRITE_MCIND(addr, val); \
|
||||
} while (0)
|
||||
|
||||
#define CP_PACKET0( reg, n ) \
|
||||
(RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
|
||||
#define CP_PACKET0_TABLE( reg, n ) \
|
||||
@ -1154,23 +1241,43 @@ do { \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_FLUSH_CACHE() do { \
|
||||
OUT_RING( CP_PACKET0( RADEON_RB3D_DSTCACHE_CTLSTAT, 0 ) ); \
|
||||
OUT_RING( RADEON_RB3D_DC_FLUSH ); \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \
|
||||
OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_DC_FLUSH); \
|
||||
} else { \
|
||||
OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_DC_FLUSH); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_PURGE_CACHE() do { \
|
||||
OUT_RING( CP_PACKET0( RADEON_RB3D_DSTCACHE_CTLSTAT, 0 ) ); \
|
||||
OUT_RING( RADEON_RB3D_DC_FLUSH_ALL ); \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \
|
||||
OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \
|
||||
} else { \
|
||||
OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_FLUSH_ZCACHE() do { \
|
||||
OUT_RING( CP_PACKET0( RADEON_RB3D_ZCACHE_CTLSTAT, 0 ) ); \
|
||||
OUT_RING( RADEON_RB3D_ZC_FLUSH ); \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \
|
||||
OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_ZC_FLUSH); \
|
||||
} else { \
|
||||
OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(R300_ZC_FLUSH); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define RADEON_PURGE_ZCACHE() do { \
|
||||
OUT_RING( CP_PACKET0( RADEON_RB3D_ZCACHE_CTLSTAT, 0 ) ); \
|
||||
OUT_RING( RADEON_RB3D_ZC_FLUSH_ALL ); \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV280) { \
|
||||
OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \
|
||||
} else { \
|
||||
OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \
|
||||
OUT_RING(R300_ZC_FLUSH_ALL); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* ================================================================
|
||||
|
@ -234,7 +234,7 @@ int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_pr
|
||||
return radeon_wait_irq(dev, irqwait->irq_seq);
|
||||
}
|
||||
|
||||
static void radeon_enable_interrupt(struct drm_device *dev)
|
||||
void radeon_enable_interrupt(struct drm_device *dev)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
|
||||
|
||||
|
1844
drivers/char/drm/radeon_microcode.h
Normal file
1844
drivers/char/drm/radeon_microcode.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -1662,7 +1662,7 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev,
|
||||
u32 height;
|
||||
int i;
|
||||
u32 texpitch, microtile;
|
||||
u32 offset;
|
||||
u32 offset, byte_offset;
|
||||
RING_LOCALS;
|
||||
|
||||
if (radeon_check_and_fixup_offset(dev_priv, file_priv, &tex->offset)) {
|
||||
@ -1727,6 +1727,13 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev,
|
||||
} else
|
||||
microtile = 0;
|
||||
|
||||
/* this might fail for zero-sized uploads - are those illegal? */
|
||||
if (!radeon_check_offset(dev_priv, tex->offset + image->height *
|
||||
blit_width - 1)) {
|
||||
DRM_ERROR("Invalid final destination offset\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
DRM_DEBUG("tex=%dx%d blit=%d\n", tex_width, tex->height, blit_width);
|
||||
|
||||
do {
|
||||
@ -1840,6 +1847,7 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev,
|
||||
}
|
||||
|
||||
#undef RADEON_COPY_MT
|
||||
byte_offset = (image->y & ~2047) * blit_width;
|
||||
buf->file_priv = file_priv;
|
||||
buf->used = size;
|
||||
offset = dev_priv->gart_buffers_offset + buf->offset;
|
||||
@ -1854,9 +1862,9 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev,
|
||||
RADEON_DP_SRC_SOURCE_MEMORY |
|
||||
RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS);
|
||||
OUT_RING((spitch << 22) | (offset >> 10));
|
||||
OUT_RING((texpitch << 22) | (tex->offset >> 10));
|
||||
OUT_RING((texpitch << 22) | ((tex->offset >> 10) + (byte_offset >> 10)));
|
||||
OUT_RING(0);
|
||||
OUT_RING((image->x << 16) | image->y);
|
||||
OUT_RING((image->x << 16) | (image->y % 2048));
|
||||
OUT_RING((image->width << 16) | height);
|
||||
RADEON_WAIT_UNTIL_2D_IDLE();
|
||||
ADVANCE_RING();
|
||||
@ -3037,6 +3045,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
|
||||
case RADEON_PARAM_FB_LOCATION:
|
||||
value = radeon_read_fb_location(dev_priv);
|
||||
break;
|
||||
case RADEON_PARAM_NUM_GB_PIPES:
|
||||
value = dev_priv->num_gb_pipes;
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG("Invalid parameter %d\n", param->param);
|
||||
return -EINVAL;
|
||||
|
@ -1,28 +1,26 @@
|
||||
comment "An alternative FireWire stack is available with EXPERIMENTAL=y"
|
||||
comment "A new alternative FireWire stack is available with EXPERIMENTAL=y"
|
||||
depends on EXPERIMENTAL=n
|
||||
|
||||
comment "Enable only one of the two stacks, unless you know what you are doing"
|
||||
depends on EXPERIMENTAL
|
||||
|
||||
config FIREWIRE
|
||||
tristate "IEEE 1394 (FireWire) support - alternative stack, EXPERIMENTAL"
|
||||
tristate "New FireWire stack, EXPERIMENTAL"
|
||||
depends on EXPERIMENTAL
|
||||
select CRC_ITU_T
|
||||
help
|
||||
This is the "Juju" FireWire stack, a new alternative implementation
|
||||
designed for robustness and simplicity. You can build either this
|
||||
stack, or the classic stack (the ieee1394 driver, ohci1394 etc.)
|
||||
or both. Please read http://wiki.linux1394.org/JujuMigration before
|
||||
you enable the new stack.
|
||||
stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both.
|
||||
Please read http://wiki.linux1394.org/JujuMigration before you
|
||||
enable the new stack.
|
||||
|
||||
To compile this driver as a module, say M here: the module will be
|
||||
called firewire-core. It functionally replaces ieee1394, raw1394,
|
||||
and video1394.
|
||||
|
||||
NOTE:
|
||||
|
||||
You should only build ONE of the stacks, unless you REALLY know what
|
||||
you are doing.
|
||||
|
||||
config FIREWIRE_OHCI
|
||||
tristate "Support for OHCI FireWire host controllers"
|
||||
tristate "OHCI-1394 controllers"
|
||||
depends on PCI && FIREWIRE
|
||||
help
|
||||
Enable this driver if you have a FireWire controller based
|
||||
@ -33,12 +31,12 @@ config FIREWIRE_OHCI
|
||||
called firewire-ohci. It replaces ohci1394 of the classic IEEE 1394
|
||||
stack.
|
||||
|
||||
NOTE:
|
||||
NOTE:
|
||||
|
||||
You should only build ohci1394 or firewire-ohci, but not both.
|
||||
If you nevertheless want to install both, you should configure them
|
||||
only as modules and blacklist the driver(s) which you don't want to
|
||||
have auto-loaded. Add either
|
||||
You should only build either firewire-ohci or the old ohci1394 driver,
|
||||
but not both. If you nevertheless want to install both, you should
|
||||
configure them only as modules and blacklist the driver(s) which you
|
||||
don't want to have auto-loaded. Add either
|
||||
|
||||
blacklist firewire-ohci
|
||||
or
|
||||
@ -60,7 +58,7 @@ config FIREWIRE_OHCI_DEBUG
|
||||
default y
|
||||
|
||||
config FIREWIRE_SBP2
|
||||
tristate "Support for storage devices (SBP-2 protocol driver)"
|
||||
tristate "Storage devices (SBP-2 protocol)"
|
||||
depends on FIREWIRE && SCSI
|
||||
help
|
||||
This option enables you to use SBP-2 devices connected to a
|
||||
|
@ -205,6 +205,7 @@ fw_device_op_read(struct file *file,
|
||||
return dequeue_event(client, buffer, count);
|
||||
}
|
||||
|
||||
/* caller must hold card->lock so that node pointers can be dereferenced here */
|
||||
static void
|
||||
fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
|
||||
struct client *client)
|
||||
@ -214,7 +215,6 @@ fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
|
||||
event->closure = client->bus_reset_closure;
|
||||
event->type = FW_CDEV_EVENT_BUS_RESET;
|
||||
event->generation = client->device->generation;
|
||||
smp_rmb(); /* node_id must not be older than generation */
|
||||
event->node_id = client->device->node_id;
|
||||
event->local_node_id = card->local_node->node_id;
|
||||
event->bm_node_id = 0; /* FIXME: We don't track the BM. */
|
||||
@ -274,6 +274,7 @@ static int ioctl_get_info(struct client *client, void *buffer)
|
||||
{
|
||||
struct fw_cdev_get_info *get_info = buffer;
|
||||
struct fw_cdev_event_bus_reset bus_reset;
|
||||
struct fw_card *card = client->device->card;
|
||||
unsigned long ret = 0;
|
||||
|
||||
client->version = get_info->version;
|
||||
@ -299,13 +300,17 @@ static int ioctl_get_info(struct client *client, void *buffer)
|
||||
client->bus_reset_closure = get_info->bus_reset_closure;
|
||||
if (get_info->bus_reset != 0) {
|
||||
void __user *uptr = u64_to_uptr(get_info->bus_reset);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&card->lock, flags);
|
||||
fill_bus_reset_event(&bus_reset, client);
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
|
||||
if (copy_to_user(uptr, &bus_reset, sizeof(bus_reset)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
get_info->card = client->device->card->index;
|
||||
get_info->card = card->index;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -265,27 +265,25 @@ static void log_irqs(u32 evt)
|
||||
!(evt & OHCI1394_busReset))
|
||||
return;
|
||||
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ": IRQ "
|
||||
"%08x%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||
evt,
|
||||
evt & OHCI1394_selfIDComplete ? " selfID" : "",
|
||||
evt & OHCI1394_RQPkt ? " AR_req" : "",
|
||||
evt & OHCI1394_RSPkt ? " AR_resp" : "",
|
||||
evt & OHCI1394_reqTxComplete ? " AT_req" : "",
|
||||
evt & OHCI1394_respTxComplete ? " AT_resp" : "",
|
||||
evt & OHCI1394_isochRx ? " IR" : "",
|
||||
evt & OHCI1394_isochTx ? " IT" : "",
|
||||
evt & OHCI1394_postedWriteErr ? " postedWriteErr" : "",
|
||||
evt & OHCI1394_cycleTooLong ? " cycleTooLong" : "",
|
||||
evt & OHCI1394_cycle64Seconds ? " cycle64Seconds" : "",
|
||||
evt & OHCI1394_regAccessFail ? " regAccessFail" : "",
|
||||
evt & OHCI1394_busReset ? " busReset" : "",
|
||||
evt & ~(OHCI1394_selfIDComplete | OHCI1394_RQPkt |
|
||||
OHCI1394_RSPkt | OHCI1394_reqTxComplete |
|
||||
OHCI1394_respTxComplete | OHCI1394_isochRx |
|
||||
OHCI1394_isochTx | OHCI1394_postedWriteErr |
|
||||
OHCI1394_cycleTooLong | OHCI1394_cycle64Seconds |
|
||||
OHCI1394_regAccessFail | OHCI1394_busReset)
|
||||
fw_notify("IRQ %08x%s%s%s%s%s%s%s%s%s%s%s%s%s\n", evt,
|
||||
evt & OHCI1394_selfIDComplete ? " selfID" : "",
|
||||
evt & OHCI1394_RQPkt ? " AR_req" : "",
|
||||
evt & OHCI1394_RSPkt ? " AR_resp" : "",
|
||||
evt & OHCI1394_reqTxComplete ? " AT_req" : "",
|
||||
evt & OHCI1394_respTxComplete ? " AT_resp" : "",
|
||||
evt & OHCI1394_isochRx ? " IR" : "",
|
||||
evt & OHCI1394_isochTx ? " IT" : "",
|
||||
evt & OHCI1394_postedWriteErr ? " postedWriteErr" : "",
|
||||
evt & OHCI1394_cycleTooLong ? " cycleTooLong" : "",
|
||||
evt & OHCI1394_cycle64Seconds ? " cycle64Seconds" : "",
|
||||
evt & OHCI1394_regAccessFail ? " regAccessFail" : "",
|
||||
evt & OHCI1394_busReset ? " busReset" : "",
|
||||
evt & ~(OHCI1394_selfIDComplete | OHCI1394_RQPkt |
|
||||
OHCI1394_RSPkt | OHCI1394_reqTxComplete |
|
||||
OHCI1394_respTxComplete | OHCI1394_isochRx |
|
||||
OHCI1394_isochTx | OHCI1394_postedWriteErr |
|
||||
OHCI1394_cycleTooLong | OHCI1394_cycle64Seconds |
|
||||
OHCI1394_regAccessFail | OHCI1394_busReset)
|
||||
? " ?" : "");
|
||||
}
|
||||
|
||||
@ -308,23 +306,22 @@ static void log_selfids(int node_id, int generation, int self_id_count, u32 *s)
|
||||
if (likely(!(param_debug & OHCI_PARAM_DEBUG_SELFIDS)))
|
||||
return;
|
||||
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ": %d selfIDs, generation %d, "
|
||||
"local node ID %04x\n", self_id_count, generation, node_id);
|
||||
fw_notify("%d selfIDs, generation %d, local node ID %04x\n",
|
||||
self_id_count, generation, node_id);
|
||||
|
||||
for (; self_id_count--; ++s)
|
||||
if ((*s & 1 << 23) == 0)
|
||||
printk(KERN_DEBUG "selfID 0: %08x, phy %d [%c%c%c] "
|
||||
"%s gc=%d %s %s%s%s\n",
|
||||
*s, *s >> 24 & 63, _p(s, 6), _p(s, 4), _p(s, 2),
|
||||
speed[*s >> 14 & 3], *s >> 16 & 63,
|
||||
power[*s >> 8 & 7], *s >> 22 & 1 ? "L" : "",
|
||||
*s >> 11 & 1 ? "c" : "", *s & 2 ? "i" : "");
|
||||
fw_notify("selfID 0: %08x, phy %d [%c%c%c] "
|
||||
"%s gc=%d %s %s%s%s\n",
|
||||
*s, *s >> 24 & 63, _p(s, 6), _p(s, 4), _p(s, 2),
|
||||
speed[*s >> 14 & 3], *s >> 16 & 63,
|
||||
power[*s >> 8 & 7], *s >> 22 & 1 ? "L" : "",
|
||||
*s >> 11 & 1 ? "c" : "", *s & 2 ? "i" : "");
|
||||
else
|
||||
printk(KERN_DEBUG "selfID n: %08x, phy %d "
|
||||
"[%c%c%c%c%c%c%c%c]\n",
|
||||
*s, *s >> 24 & 63,
|
||||
_p(s, 16), _p(s, 14), _p(s, 12), _p(s, 10),
|
||||
_p(s, 8), _p(s, 6), _p(s, 4), _p(s, 2));
|
||||
fw_notify("selfID n: %08x, phy %d [%c%c%c%c%c%c%c%c]\n",
|
||||
*s, *s >> 24 & 63,
|
||||
_p(s, 16), _p(s, 14), _p(s, 12), _p(s, 10),
|
||||
_p(s, 8), _p(s, 6), _p(s, 4), _p(s, 2));
|
||||
}
|
||||
|
||||
static const char *evts[] = {
|
||||
@ -373,15 +370,14 @@ static void log_ar_at_event(char dir, int speed, u32 *header, int evt)
|
||||
evt = 0x1f;
|
||||
|
||||
if (evt == OHCI1394_evt_bus_reset) {
|
||||
printk(KERN_DEBUG "A%c evt_bus_reset, generation %d\n",
|
||||
dir, (header[2] >> 16) & 0xff);
|
||||
fw_notify("A%c evt_bus_reset, generation %d\n",
|
||||
dir, (header[2] >> 16) & 0xff);
|
||||
return;
|
||||
}
|
||||
|
||||
if (header[0] == ~header[1]) {
|
||||
printk(KERN_DEBUG "A%c %s, %s, %08x\n",
|
||||
dir, evts[evt], phys[header[0] >> 30 & 0x3],
|
||||
header[0]);
|
||||
fw_notify("A%c %s, %s, %08x\n",
|
||||
dir, evts[evt], phys[header[0] >> 30 & 0x3], header[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -400,24 +396,23 @@ static void log_ar_at_event(char dir, int speed, u32 *header, int evt)
|
||||
|
||||
switch (tcode) {
|
||||
case 0xe: case 0xa:
|
||||
printk(KERN_DEBUG "A%c %s, %s\n",
|
||||
dir, evts[evt], tcodes[tcode]);
|
||||
fw_notify("A%c %s, %s\n", dir, evts[evt], tcodes[tcode]);
|
||||
break;
|
||||
case 0x0: case 0x1: case 0x4: case 0x5: case 0x9:
|
||||
printk(KERN_DEBUG "A%c spd %x tl %02x, "
|
||||
"%04x -> %04x, %s, "
|
||||
"%s, %04x%08x%s\n",
|
||||
dir, speed, header[0] >> 10 & 0x3f,
|
||||
header[1] >> 16, header[0] >> 16, evts[evt],
|
||||
tcodes[tcode], header[1] & 0xffff, header[2], specific);
|
||||
fw_notify("A%c spd %x tl %02x, "
|
||||
"%04x -> %04x, %s, "
|
||||
"%s, %04x%08x%s\n",
|
||||
dir, speed, header[0] >> 10 & 0x3f,
|
||||
header[1] >> 16, header[0] >> 16, evts[evt],
|
||||
tcodes[tcode], header[1] & 0xffff, header[2], specific);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_DEBUG "A%c spd %x tl %02x, "
|
||||
"%04x -> %04x, %s, "
|
||||
"%s%s\n",
|
||||
dir, speed, header[0] >> 10 & 0x3f,
|
||||
header[1] >> 16, header[0] >> 16, evts[evt],
|
||||
tcodes[tcode], specific);
|
||||
fw_notify("A%c spd %x tl %02x, "
|
||||
"%04x -> %04x, %s, "
|
||||
"%s%s\n",
|
||||
dir, speed, header[0] >> 10 & 0x3f,
|
||||
header[1] >> 16, header[0] >> 16, evts[evt],
|
||||
tcodes[tcode], specific);
|
||||
}
|
||||
}
|
||||
|
||||
@ -548,6 +543,11 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||
p.header_length = 12;
|
||||
p.payload_length = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* FIXME: Stop context, discard everything, and restart? */
|
||||
p.header_length = 0;
|
||||
p.payload_length = 0;
|
||||
}
|
||||
|
||||
p.payload = (void *) buffer + p.header_length;
|
||||
@ -1468,6 +1468,9 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
|
||||
reg_write(ohci, OHCI1394_HCControlClear,
|
||||
OHCI1394_HCControl_noByteSwapData);
|
||||
|
||||
reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus);
|
||||
reg_write(ohci, OHCI1394_LinkControlClear,
|
||||
OHCI1394_LinkControl_rcvPhyPkt);
|
||||
reg_write(ohci, OHCI1394_LinkControlSet,
|
||||
OHCI1394_LinkControl_rcvSelfID |
|
||||
OHCI1394_LinkControl_cycleTimerEnable |
|
||||
@ -1481,7 +1484,6 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
|
||||
ar_context_run(&ohci->ar_request_ctx);
|
||||
ar_context_run(&ohci->ar_response_ctx);
|
||||
|
||||
reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus);
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
|
||||
reg_write(ohci, OHCI1394_IntEventClear, ~0);
|
||||
reg_write(ohci, OHCI1394_IntMaskClear, ~0);
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
@ -297,37 +298,55 @@ EXPORT_SYMBOL(fw_send_request);
|
||||
struct fw_phy_packet {
|
||||
struct fw_packet packet;
|
||||
struct completion done;
|
||||
struct kref kref;
|
||||
};
|
||||
|
||||
static void
|
||||
transmit_phy_packet_callback(struct fw_packet *packet,
|
||||
struct fw_card *card, int status)
|
||||
static void phy_packet_release(struct kref *kref)
|
||||
{
|
||||
struct fw_phy_packet *p =
|
||||
container_of(kref, struct fw_phy_packet, kref);
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
static void transmit_phy_packet_callback(struct fw_packet *packet,
|
||||
struct fw_card *card, int status)
|
||||
{
|
||||
struct fw_phy_packet *p =
|
||||
container_of(packet, struct fw_phy_packet, packet);
|
||||
|
||||
complete(&p->done);
|
||||
kref_put(&p->kref, phy_packet_release);
|
||||
}
|
||||
|
||||
void fw_send_phy_config(struct fw_card *card,
|
||||
int node_id, int generation, int gap_count)
|
||||
{
|
||||
struct fw_phy_packet p;
|
||||
struct fw_phy_packet *p;
|
||||
long timeout = DIV_ROUND_UP(HZ, 10);
|
||||
u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG) |
|
||||
PHY_CONFIG_ROOT_ID(node_id) |
|
||||
PHY_CONFIG_GAP_COUNT(gap_count);
|
||||
|
||||
p.packet.header[0] = data;
|
||||
p.packet.header[1] = ~data;
|
||||
p.packet.header_length = 8;
|
||||
p.packet.payload_length = 0;
|
||||
p.packet.speed = SCODE_100;
|
||||
p.packet.generation = generation;
|
||||
p.packet.callback = transmit_phy_packet_callback;
|
||||
init_completion(&p.done);
|
||||
p = kmalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (p == NULL)
|
||||
return;
|
||||
|
||||
card->driver->send_request(card, &p.packet);
|
||||
wait_for_completion(&p.done);
|
||||
p->packet.header[0] = data;
|
||||
p->packet.header[1] = ~data;
|
||||
p->packet.header_length = 8;
|
||||
p->packet.payload_length = 0;
|
||||
p->packet.speed = SCODE_100;
|
||||
p->packet.generation = generation;
|
||||
p->packet.callback = transmit_phy_packet_callback;
|
||||
init_completion(&p->done);
|
||||
kref_set(&p->kref, 2);
|
||||
|
||||
card->driver->send_request(card, &p->packet);
|
||||
timeout = wait_for_completion_timeout(&p->done, timeout);
|
||||
kref_put(&p->kref, phy_packet_release);
|
||||
|
||||
/* will leak p if the callback is never executed */
|
||||
WARN_ON(timeout == 0);
|
||||
}
|
||||
|
||||
void fw_flush_transactions(struct fw_card *card)
|
||||
@ -572,7 +591,8 @@ allocate_request(struct fw_packet *p)
|
||||
break;
|
||||
|
||||
default:
|
||||
BUG();
|
||||
fw_error("ERROR - corrupt request received - %08x %08x %08x\n",
|
||||
p->header[0], p->header[1], p->header[2]);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* uGuru3 bank addresses */
|
||||
@ -323,7 +324,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
|
||||
{ "AUX1 Fan", 36, 2, 60, 1, 0 },
|
||||
{ NULL, 0, 0, 0, 0, 0 } }
|
||||
},
|
||||
{ 0x0013, "unknown", {
|
||||
{ 0x0013, "Abit AW8D", {
|
||||
{ "CPU Core", 0, 0, 10, 1, 0 },
|
||||
{ "DDR", 1, 0, 10, 1, 0 },
|
||||
{ "DDR VTT", 2, 0, 10, 1, 0 },
|
||||
@ -349,6 +350,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
|
||||
{ "AUX2 Fan", 36, 2, 60, 1, 0 },
|
||||
{ "AUX3 Fan", 37, 2, 60, 1, 0 },
|
||||
{ "AUX4 Fan", 38, 2, 60, 1, 0 },
|
||||
{ "AUX5 Fan", 39, 2, 60, 1, 0 },
|
||||
{ NULL, 0, 0, 0, 0, 0 } }
|
||||
},
|
||||
{ 0x0014, "Abit AB9 Pro", {
|
||||
@ -1111,11 +1113,12 @@ static int __init abituguru3_detect(void)
|
||||
{
|
||||
/* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or
|
||||
0x08 at DATA and 0xAC at CMD. Sometimes the uGuru3 will hold 0x05
|
||||
at CMD instead, why is unknown. So we test for 0x05 too. */
|
||||
or 0x55 at CMD instead, why is unknown. */
|
||||
u8 data_val = inb_p(ABIT_UGURU3_BASE + ABIT_UGURU3_DATA);
|
||||
u8 cmd_val = inb_p(ABIT_UGURU3_BASE + ABIT_UGURU3_CMD);
|
||||
if (((data_val == 0x00) || (data_val == 0x08)) &&
|
||||
((cmd_val == 0xAC) || (cmd_val == 0x05)))
|
||||
((cmd_val == 0xAC) || (cmd_val == 0x05) ||
|
||||
(cmd_val == 0x55)))
|
||||
return ABIT_UGURU3_BASE;
|
||||
|
||||
ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = "
|
||||
@ -1138,6 +1141,15 @@ static int __init abituguru3_init(void)
|
||||
int address, err;
|
||||
struct resource res = { .flags = IORESOURCE_IO };
|
||||
|
||||
#ifdef CONFIG_DMI
|
||||
const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
|
||||
|
||||
/* safety check, refuse to load on non Abit motherboards */
|
||||
if (!force && (!board_vendor ||
|
||||
strcmp(board_vendor, "http://www.abit.com.tw/")))
|
||||
return -ENODEV;
|
||||
#endif
|
||||
|
||||
address = abituguru3_detect();
|
||||
if (address < 0)
|
||||
return address;
|
||||
|
@ -309,6 +309,9 @@ no_sensor_update:
|
||||
ADT7473_REG_PWM_BHVR(i));
|
||||
}
|
||||
|
||||
i = i2c_smbus_read_byte_data(client, ADT7473_REG_CFG4);
|
||||
data->max_duty_at_overheat = !!(i & ADT7473_CFG4_MAX_DUTY_AT_OVT);
|
||||
|
||||
data->limits_last_updated = local_jiffies;
|
||||
data->limits_valid = 1;
|
||||
|
||||
|
@ -251,10 +251,13 @@ static int lm75_detach_client(struct i2c_client *client)
|
||||
the SMBus standard. */
|
||||
static int lm75_read_value(struct i2c_client *client, u8 reg)
|
||||
{
|
||||
int value;
|
||||
|
||||
if (reg == LM75_REG_CONF)
|
||||
return i2c_smbus_read_byte_data(client, reg);
|
||||
else
|
||||
return swab16(i2c_smbus_read_word_data(client, reg));
|
||||
|
||||
value = i2c_smbus_read_word_data(client, reg);
|
||||
return (value < 0) ? value : swab16(value);
|
||||
}
|
||||
|
||||
static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
|
||||
@ -287,9 +290,16 @@ static struct lm75_data *lm75_update_device(struct device *dev)
|
||||
int i;
|
||||
dev_dbg(&client->dev, "Starting lm75 update\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(data->temp); i++)
|
||||
data->temp[i] = lm75_read_value(client,
|
||||
LM75_REG_TEMP[i]);
|
||||
for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
|
||||
int status;
|
||||
|
||||
status = lm75_read_value(client, LM75_REG_TEMP[i]);
|
||||
if (status < 0)
|
||||
dev_dbg(&client->dev, "reg %d, err %d\n",
|
||||
LM75_REG_TEMP[i], status);
|
||||
else
|
||||
data->temp[i] = status;
|
||||
}
|
||||
data->last_updated = jiffies;
|
||||
data->valid = 1;
|
||||
}
|
||||
|
@ -192,23 +192,20 @@ static int RANGE_TO_REG( int range )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( range < lm85_range_map[0] ) {
|
||||
return 0 ;
|
||||
} else if ( range > lm85_range_map[15] ) {
|
||||
if (range >= lm85_range_map[15])
|
||||
return 15 ;
|
||||
} else { /* find closest match */
|
||||
for ( i = 14 ; i >= 0 ; --i ) {
|
||||
if ( range > lm85_range_map[i] ) { /* range bracketed */
|
||||
if ((lm85_range_map[i+1] - range) <
|
||||
(range - lm85_range_map[i])) {
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Find the closest match */
|
||||
for (i = 14; i >= 0; --i) {
|
||||
if (range >= lm85_range_map[i]) {
|
||||
if ((lm85_range_map[i + 1] - range) <
|
||||
(range - lm85_range_map[i]))
|
||||
return i + 1;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return( i & 0x0f );
|
||||
|
||||
return 0;
|
||||
}
|
||||
#define RANGE_FROM_REG(val) (lm85_range_map[(val)&0x0f])
|
||||
|
||||
|
@ -823,13 +823,6 @@ config BLK_DEV_IDE_RAPIDE
|
||||
Say Y here if you want to support the Yellowstone RapIDE controller
|
||||
manufactured for use with Acorn computers.
|
||||
|
||||
config BLK_DEV_IDE_BAST
|
||||
tristate "Simtec BAST / Thorcom VR1000 IDE support"
|
||||
depends on ARM && (ARCH_BAST || MACH_VR1000)
|
||||
help
|
||||
Say Y here if you want to support the onboard IDE channels on the
|
||||
Simtec BAST or the Thorcom VR1000
|
||||
|
||||
config IDE_H8300
|
||||
tristate "H8300 IDE support"
|
||||
depends on H8300
|
||||
|
@ -1,7 +1,6 @@
|
||||
|
||||
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
|
||||
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
|
||||
obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
|
||||
obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o
|
||||
|
||||
ifeq ($(CONFIG_IDE_ARM), m)
|
||||
|
@ -1,90 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/arch/map.h>
|
||||
#include <asm/arch/bast-map.h>
|
||||
#include <asm/arch/bast-irq.h>
|
||||
|
||||
#define DRV_NAME "bast-ide"
|
||||
|
||||
static int __init bastide_register(unsigned int base, unsigned int aux, int irq)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
hw_regs_t hw;
|
||||
int i;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
|
||||
base += BAST_IDE_CS;
|
||||
aux += BAST_IDE_CS;
|
||||
|
||||
for (i = 0; i <= 7; i++) {
|
||||
hw.io_ports_array[i] = (unsigned long)base;
|
||||
base += 0x20;
|
||||
}
|
||||
|
||||
hw.io_ports.ctl_addr = aux + (6 * 0x20);
|
||||
hw.irq = irq;
|
||||
hw.chipset = ide_generic;
|
||||
|
||||
hwif = ide_find_port();
|
||||
if (hwif == NULL)
|
||||
goto out;
|
||||
|
||||
i = hwif->index;
|
||||
|
||||
ide_init_port_data(hwif, i);
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->port_ops = NULL;
|
||||
|
||||
idx[0] = i;
|
||||
|
||||
ide_device_add(idx, NULL);
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init bastide_init(void)
|
||||
{
|
||||
unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS;
|
||||
|
||||
/* we can treat the VR1000 and the BAST the same */
|
||||
|
||||
if (!(machine_is_bast() || machine_is_vr1000()))
|
||||
return 0;
|
||||
|
||||
printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n");
|
||||
|
||||
if (!request_mem_region(base, 0x400000, DRV_NAME)) {
|
||||
printk(KERN_ERR "%s: resources busy\n", DRV_NAME);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0);
|
||||
bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(bastide_init);
|
||||
|
||||
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver");
|
@ -353,8 +353,8 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
|
||||
struct clk *clkp;
|
||||
struct resource *mem, *irq;
|
||||
ide_hwif_t *hwif;
|
||||
void __iomem *base;
|
||||
int pribase, i;
|
||||
unsigned long base;
|
||||
int i;
|
||||
hw_regs_t hw;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
@ -374,22 +374,27 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
|
||||
printk(KERN_ERR "failed to get memory region resource\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (irq == NULL) {
|
||||
printk(KERN_ERR "failed to get IRQ resource\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
base = (void *)mem->start;
|
||||
if (request_mem_region(mem->start, mem->end - mem->start + 1,
|
||||
"palm_bk3710") == NULL) {
|
||||
printk(KERN_ERR "failed to request memory region\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
base = IO_ADDRESS(mem->start);
|
||||
|
||||
/* Configure the Palm Chip controller */
|
||||
palm_bk3710_chipinit(base);
|
||||
palm_bk3710_chipinit((void __iomem *)base);
|
||||
|
||||
pribase = mem->start + IDE_PALM_ATA_PRI_REG_OFFSET;
|
||||
for (i = 0; i < IDE_NR_PORTS - 2; i++)
|
||||
hw.io_ports_array[i] = pribase + i;
|
||||
hw.io_ports.ctl_addr = mem->start +
|
||||
IDE_PALM_ATA_PRI_CTL_OFFSET;
|
||||
hw.io_ports_array[i] = base + IDE_PALM_ATA_PRI_REG_OFFSET + i;
|
||||
hw.io_ports.ctl_addr = base + IDE_PALM_ATA_PRI_CTL_OFFSET;
|
||||
hw.irq = irq->start;
|
||||
hw.chipset = ide_palm3710;
|
||||
|
||||
@ -434,4 +439,3 @@ static int __init palm_bk3710_init(void)
|
||||
|
||||
module_init(palm_bk3710_init);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
|
@ -225,10 +225,10 @@ static u8 wait_drive_not_busy(ide_drive_t *drive)
|
||||
u8 stat;
|
||||
|
||||
/*
|
||||
* Last sector was transfered, wait until drive is ready.
|
||||
* This can take up to 10 usec, but we will wait max 1 ms.
|
||||
* Last sector was transfered, wait until device is ready. This can
|
||||
* take up to 6 ms on some ATAPI devices, so we will wait max 10 ms.
|
||||
*/
|
||||
for (retries = 0; retries < 100; retries++) {
|
||||
for (retries = 0; retries < 1000; retries++) {
|
||||
stat = ide_read_status(drive);
|
||||
|
||||
if (stat & BUSY_STAT)
|
||||
|
@ -410,6 +410,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
||||
PCMCIA_DEVICE_MANF_CARD(0x001c, 0x0001), /* Mitsubishi CFA */
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */
|
||||
PCMCIA_DEVICE_MANF_CARD(0x004f, 0x0000), /* Kingston */
|
||||
PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */
|
||||
PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */
|
||||
@ -439,6 +440,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
|
||||
PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b),
|
||||
PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF300", 0x7ed2ad87, 0x7e9e78ee),
|
||||
PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF500", 0x7ed2ad87, 0x7a13045c),
|
||||
PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
|
||||
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
|
||||
@ -449,6 +451,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("SMI VENDOR", "SMI PRODUCT", 0x30896c92, 0x703cc5f6),
|
||||
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
||||
PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF45", 0x709b1bf1, 0xf68b6f32),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF80", 0x709b1bf1, 0x2a54d4b1),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS2GCF120", 0x709b1bf1, 0x969aa4f2),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
|
||||
|
@ -4,7 +4,7 @@ menu "IEEE 1394 (FireWire) support"
|
||||
source "drivers/firewire/Kconfig"
|
||||
|
||||
config IEEE1394
|
||||
tristate "IEEE 1394 (FireWire) support"
|
||||
tristate "Stable FireWire stack"
|
||||
depends on PCI || BROKEN
|
||||
help
|
||||
IEEE 1394 describes a high performance serial bus, which is also
|
||||
@ -19,30 +19,45 @@ config IEEE1394
|
||||
To compile this driver as a module, say M here: the
|
||||
module will be called ieee1394.
|
||||
|
||||
comment "Subsystem Options"
|
||||
depends on IEEE1394
|
||||
|
||||
config IEEE1394_VERBOSEDEBUG
|
||||
bool "Excessive debugging output"
|
||||
depends on IEEE1394
|
||||
config IEEE1394_OHCI1394
|
||||
tristate "OHCI-1394 controllers"
|
||||
depends on PCI && IEEE1394
|
||||
help
|
||||
If you say Y here, you will get very verbose debugging logs from
|
||||
the subsystem which includes a dump of the header of every sent
|
||||
and received packet. This can amount to a high amount of data
|
||||
collected in a very short time which is usually also saved to
|
||||
disk by the system logging daemons.
|
||||
Enable this driver if you have an IEEE 1394 controller based on the
|
||||
OHCI-1394 specification. The current driver is only tested with OHCI
|
||||
chipsets made by Texas Instruments and NEC. Most third-party vendors
|
||||
use one of these chipsets. It should work with any OHCI-1394
|
||||
compliant card, however.
|
||||
|
||||
Say Y if you really want or need the debugging output, everyone
|
||||
else says N.
|
||||
To compile this driver as a module, say M here: the
|
||||
module will be called ohci1394.
|
||||
|
||||
comment "Controllers"
|
||||
depends on IEEE1394
|
||||
NOTE:
|
||||
|
||||
comment "Texas Instruments PCILynx requires I2C"
|
||||
You should only build either ohci1394 or the new firewire-ohci driver,
|
||||
but not both. If you nevertheless want to install both, you should
|
||||
configure them only as modules and blacklist the driver(s) which you
|
||||
don't want to have auto-loaded. Add either
|
||||
|
||||
blacklist firewire-ohci
|
||||
or
|
||||
blacklist ohci1394
|
||||
blacklist video1394
|
||||
blacklist dv1394
|
||||
|
||||
to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf
|
||||
depending on your distribution. The latter two modules should be
|
||||
blacklisted together with ohci1394 because they depend on ohci1394.
|
||||
|
||||
If you have an old modprobe which doesn't implement the blacklist
|
||||
directive, use "install modulename /bin/true" for the modules to be
|
||||
blacklisted.
|
||||
|
||||
comment "PCILynx controller requires I2C"
|
||||
depends on IEEE1394 && I2C=n
|
||||
|
||||
config IEEE1394_PCILYNX
|
||||
tristate "Texas Instruments PCILynx support"
|
||||
tristate "PCILynx controller"
|
||||
depends on PCI && IEEE1394 && I2C
|
||||
select I2C_ALGOBIT
|
||||
help
|
||||
@ -57,35 +72,11 @@ config IEEE1394_PCILYNX
|
||||
PowerMacs G3 B&W contain the PCILynx controller. Therefore
|
||||
almost everybody can say N here.
|
||||
|
||||
config IEEE1394_OHCI1394
|
||||
tristate "OHCI-1394 support"
|
||||
depends on PCI && IEEE1394
|
||||
help
|
||||
Enable this driver if you have an IEEE 1394 controller based on the
|
||||
OHCI-1394 specification. The current driver is only tested with OHCI
|
||||
chipsets made by Texas Instruments and NEC. Most third-party vendors
|
||||
use one of these chipsets. It should work with any OHCI-1394
|
||||
compliant card, however.
|
||||
|
||||
To compile this driver as a module, say M here: the
|
||||
module will be called ohci1394.
|
||||
|
||||
comment "Protocols"
|
||||
depends on IEEE1394
|
||||
|
||||
config IEEE1394_VIDEO1394
|
||||
tristate "OHCI-1394 Video support"
|
||||
depends on IEEE1394 && IEEE1394_OHCI1394
|
||||
help
|
||||
This option enables video device usage for OHCI-1394 cards. Enable
|
||||
this option only if you have an IEEE 1394 video device connected to
|
||||
an OHCI-1394 card.
|
||||
|
||||
comment "SBP-2 support (for storage devices) requires SCSI"
|
||||
depends on IEEE1394 && SCSI=n
|
||||
|
||||
config IEEE1394_SBP2
|
||||
tristate "SBP-2 support (Harddisks etc.)"
|
||||
tristate "Storage devices (SBP-2 protocol)"
|
||||
depends on IEEE1394 && SCSI
|
||||
help
|
||||
This option enables you to use SBP-2 devices connected to an IEEE
|
||||
@ -127,24 +118,47 @@ config IEEE1394_ETH1394
|
||||
|
||||
The module is called eth1394 although it does not emulate Ethernet.
|
||||
|
||||
config IEEE1394_RAWIO
|
||||
tristate "raw1394 userspace interface"
|
||||
depends on IEEE1394
|
||||
help
|
||||
This option adds support for the raw1394 device file which enables
|
||||
direct communication of user programs with IEEE 1394 devices
|
||||
(isochronous and asynchronous). Almost all application programs
|
||||
which access FireWire require this option.
|
||||
|
||||
To compile this driver as a module, say M here: the module will be
|
||||
called raw1394.
|
||||
|
||||
config IEEE1394_VIDEO1394
|
||||
tristate "video1394 userspace interface"
|
||||
depends on IEEE1394 && IEEE1394_OHCI1394
|
||||
help
|
||||
This option adds support for the video1394 device files which enable
|
||||
isochronous communication of user programs with IEEE 1394 devices,
|
||||
especially video capture or export. This interface is used by all
|
||||
libdc1394 based programs and by several other programs, in addition to
|
||||
the raw1394 interface. It is generally not required for DV capture.
|
||||
|
||||
To compile this driver as a module, say M here: the module will be
|
||||
called video1394.
|
||||
|
||||
config IEEE1394_DV1394
|
||||
tristate "OHCI-DV I/O support (deprecated)"
|
||||
tristate "dv1394 userspace interface (deprecated)"
|
||||
depends on IEEE1394 && IEEE1394_OHCI1394
|
||||
help
|
||||
The dv1394 driver is unsupported and may be removed from Linux in a
|
||||
future release. Its functionality is now provided by raw1394 together
|
||||
with libraries such as libiec61883.
|
||||
|
||||
config IEEE1394_RAWIO
|
||||
tristate "Raw IEEE1394 I/O support"
|
||||
config IEEE1394_VERBOSEDEBUG
|
||||
bool "Excessive debugging output"
|
||||
depends on IEEE1394
|
||||
help
|
||||
This option adds support for the raw1394 device file which enables
|
||||
direct communication of user programs with the IEEE 1394 bus and thus
|
||||
with the attached peripherals. Almost all application programs which
|
||||
access FireWire require this option.
|
||||
If you say Y here, you will get very verbose debugging logs from the
|
||||
ieee1394 drivers, including sent and received packet headers. This
|
||||
will quickly result in large amounts of data sent to the system log.
|
||||
|
||||
To compile this driver as a module, say M here: the module will be
|
||||
called raw1394.
|
||||
Say Y if you really need the debugging output. Everyone else says N.
|
||||
|
||||
endmenu
|
||||
|
@ -942,7 +942,7 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
m->msg_namelen = 0;
|
||||
|
||||
if (skb) {
|
||||
total_len = min(total_len, skb->len);
|
||||
total_len = min_t(size_t, total_len, skb->len);
|
||||
error = skb_copy_datagram_iovec(skb, 0, m->msg_iov, total_len);
|
||||
if (error == 0)
|
||||
error = total_len;
|
||||
|
@ -49,6 +49,7 @@
|
||||
#define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT)
|
||||
|
||||
#define DMA_RX_FLUSH_JIFFIES (HZ / 50)
|
||||
#define CTS_CHECK_JIFFIES (HZ / 50)
|
||||
|
||||
#ifdef CONFIG_SERIAL_BFIN_DMA
|
||||
static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart);
|
||||
@ -290,11 +291,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
|
||||
{
|
||||
struct circ_buf *xmit = &uart->port.info->xmit;
|
||||
|
||||
if (uart->port.x_char) {
|
||||
UART_PUT_CHAR(uart, uart->port.x_char);
|
||||
uart->port.icount.tx++;
|
||||
uart->port.x_char = 0;
|
||||
}
|
||||
/*
|
||||
* Check the modem control lines before
|
||||
* transmitting anything.
|
||||
@ -306,6 +302,12 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
|
||||
return;
|
||||
}
|
||||
|
||||
if (uart->port.x_char) {
|
||||
UART_PUT_CHAR(uart, uart->port.x_char);
|
||||
uart->port.icount.tx++;
|
||||
uart->port.x_char = 0;
|
||||
}
|
||||
|
||||
while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) {
|
||||
UART_PUT_CHAR(uart, xmit->buf[xmit->tail]);
|
||||
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
||||
@ -345,15 +347,6 @@ static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
static void bfin_serial_do_work(struct work_struct *work)
|
||||
{
|
||||
struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue);
|
||||
|
||||
bfin_serial_mctrl_check(uart);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SERIAL_BFIN_DMA
|
||||
static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
|
||||
{
|
||||
@ -361,6 +354,12 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
|
||||
|
||||
uart->tx_done = 0;
|
||||
|
||||
/*
|
||||
* Check the modem control lines before
|
||||
* transmitting anything.
|
||||
*/
|
||||
bfin_serial_mctrl_check(uart);
|
||||
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
|
||||
uart->tx_count = 0;
|
||||
uart->tx_done = 1;
|
||||
@ -373,12 +372,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
|
||||
uart->port.x_char = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the modem control lines before
|
||||
* transmitting anything.
|
||||
*/
|
||||
bfin_serial_mctrl_check(uart);
|
||||
|
||||
uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE);
|
||||
if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail))
|
||||
uart->tx_count = UART_XMIT_SIZE - xmit->tail;
|
||||
@ -565,7 +558,10 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart)
|
||||
uart_handle_cts_change(&uart->port, status & TIOCM_CTS);
|
||||
if (!(status & TIOCM_CTS)) {
|
||||
tty->hw_stopped = 1;
|
||||
schedule_work(&uart->cts_workqueue);
|
||||
uart->cts_timer.data = (unsigned long)(uart);
|
||||
uart->cts_timer.function = (void *)bfin_serial_mctrl_check;
|
||||
uart->cts_timer.expires = jiffies + CTS_CHECK_JIFFIES;
|
||||
add_timer(&(uart->cts_timer));
|
||||
} else {
|
||||
tty->hw_stopped = 0;
|
||||
}
|
||||
@ -885,7 +881,7 @@ static void __init bfin_serial_init_ports(void)
|
||||
init_timer(&(bfin_serial_ports[i].rx_dma_timer));
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work);
|
||||
init_timer(&(bfin_serial_ports[i].cts_timer));
|
||||
bfin_serial_ports[i].cts_pin =
|
||||
bfin_serial_resource[i].uart_cts_pin;
|
||||
bfin_serial_ports[i].rts_pin =
|
||||
|
@ -140,49 +140,53 @@ static struct pci_device_id hpwdt_devices[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, hpwdt_devices);
|
||||
|
||||
extern asmlinkage void asminline_call(struct cmn_registers *pi86Regs, unsigned long *pRomEntry);
|
||||
|
||||
#ifndef CONFIG_X86_64
|
||||
/* --32 Bit Bios------------------------------------------------------------ */
|
||||
|
||||
#define HPWDT_ARCH 32
|
||||
|
||||
asmlinkage void asminline_call(struct cmn_registers *pi86Regs,
|
||||
unsigned long *pRomEntry)
|
||||
{
|
||||
asm("pushl %ebp \n\t"
|
||||
"movl %esp, %ebp \n\t"
|
||||
"pusha \n\t"
|
||||
"pushf \n\t"
|
||||
"push %es \n\t"
|
||||
"push %ds \n\t"
|
||||
"pop %es \n\t"
|
||||
"movl 8(%ebp),%eax \n\t"
|
||||
"movl 4(%eax),%ebx \n\t"
|
||||
"movl 8(%eax),%ecx \n\t"
|
||||
"movl 12(%eax),%edx \n\t"
|
||||
"movl 16(%eax),%esi \n\t"
|
||||
"movl 20(%eax),%edi \n\t"
|
||||
"movl (%eax),%eax \n\t"
|
||||
"push %cs \n\t"
|
||||
"call *12(%ebp) \n\t"
|
||||
"pushf \n\t"
|
||||
"pushl %eax \n\t"
|
||||
"movl 8(%ebp),%eax \n\t"
|
||||
"movl %ebx,4(%eax) \n\t"
|
||||
"movl %ecx,8(%eax) \n\t"
|
||||
"movl %edx,12(%eax) \n\t"
|
||||
"movl %esi,16(%eax) \n\t"
|
||||
"movl %edi,20(%eax) \n\t"
|
||||
"movw %ds,24(%eax) \n\t"
|
||||
"movw %es,26(%eax) \n\t"
|
||||
"popl %ebx \n\t"
|
||||
"movl %ebx,(%eax) \n\t"
|
||||
"popl %ebx \n\t"
|
||||
"movl %ebx,28(%eax) \n\t"
|
||||
"pop %es \n\t"
|
||||
"popf \n\t"
|
||||
"popa \n\t"
|
||||
"leave \n\t" "ret");
|
||||
}
|
||||
asm(".text \n\t"
|
||||
".align 4 \n"
|
||||
"asminline_call: \n\t"
|
||||
"pushl %ebp \n\t"
|
||||
"movl %esp, %ebp \n\t"
|
||||
"pusha \n\t"
|
||||
"pushf \n\t"
|
||||
"push %es \n\t"
|
||||
"push %ds \n\t"
|
||||
"pop %es \n\t"
|
||||
"movl 8(%ebp),%eax \n\t"
|
||||
"movl 4(%eax),%ebx \n\t"
|
||||
"movl 8(%eax),%ecx \n\t"
|
||||
"movl 12(%eax),%edx \n\t"
|
||||
"movl 16(%eax),%esi \n\t"
|
||||
"movl 20(%eax),%edi \n\t"
|
||||
"movl (%eax),%eax \n\t"
|
||||
"push %cs \n\t"
|
||||
"call *12(%ebp) \n\t"
|
||||
"pushf \n\t"
|
||||
"pushl %eax \n\t"
|
||||
"movl 8(%ebp),%eax \n\t"
|
||||
"movl %ebx,4(%eax) \n\t"
|
||||
"movl %ecx,8(%eax) \n\t"
|
||||
"movl %edx,12(%eax) \n\t"
|
||||
"movl %esi,16(%eax) \n\t"
|
||||
"movl %edi,20(%eax) \n\t"
|
||||
"movw %ds,24(%eax) \n\t"
|
||||
"movw %es,26(%eax) \n\t"
|
||||
"popl %ebx \n\t"
|
||||
"movl %ebx,(%eax) \n\t"
|
||||
"popl %ebx \n\t"
|
||||
"movl %ebx,28(%eax) \n\t"
|
||||
"pop %es \n\t"
|
||||
"popf \n\t"
|
||||
"popa \n\t"
|
||||
"leave \n\t"
|
||||
"ret \n\t"
|
||||
".previous");
|
||||
|
||||
|
||||
/*
|
||||
* cru_detect
|
||||
@ -333,43 +337,44 @@ static int __devinit detect_cru_service(void)
|
||||
|
||||
#define HPWDT_ARCH 64
|
||||
|
||||
asmlinkage void asminline_call(struct cmn_registers *pi86Regs,
|
||||
unsigned long *pRomEntry)
|
||||
{
|
||||
asm("pushq %rbp \n\t"
|
||||
"movq %rsp, %rbp \n\t"
|
||||
"pushq %rax \n\t"
|
||||
"pushq %rbx \n\t"
|
||||
"pushq %rdx \n\t"
|
||||
"pushq %r12 \n\t"
|
||||
"pushq %r9 \n\t"
|
||||
"movq %rsi, %r12 \n\t"
|
||||
"movq %rdi, %r9 \n\t"
|
||||
"movl 4(%r9),%ebx \n\t"
|
||||
"movl 8(%r9),%ecx \n\t"
|
||||
"movl 12(%r9),%edx \n\t"
|
||||
"movl 16(%r9),%esi \n\t"
|
||||
"movl 20(%r9),%edi \n\t"
|
||||
"movl (%r9),%eax \n\t"
|
||||
"call *%r12 \n\t"
|
||||
"pushfq \n\t"
|
||||
"popq %r12 \n\t"
|
||||
"popfq \n\t"
|
||||
"movl %eax, (%r9) \n\t"
|
||||
"movl %ebx, 4(%r9) \n\t"
|
||||
"movl %ecx, 8(%r9) \n\t"
|
||||
"movl %edx, 12(%r9) \n\t"
|
||||
"movl %esi, 16(%r9) \n\t"
|
||||
"movl %edi, 20(%r9) \n\t"
|
||||
"movq %r12, %rax \n\t"
|
||||
"movl %eax, 28(%r9) \n\t"
|
||||
"popq %r9 \n\t"
|
||||
"popq %r12 \n\t"
|
||||
"popq %rdx \n\t"
|
||||
"popq %rbx \n\t"
|
||||
"popq %rax \n\t"
|
||||
"leave \n\t" "ret");
|
||||
}
|
||||
asm(".text \n\t"
|
||||
".align 4 \n"
|
||||
"asminline_call: \n\t"
|
||||
"pushq %rbp \n\t"
|
||||
"movq %rsp, %rbp \n\t"
|
||||
"pushq %rax \n\t"
|
||||
"pushq %rbx \n\t"
|
||||
"pushq %rdx \n\t"
|
||||
"pushq %r12 \n\t"
|
||||
"pushq %r9 \n\t"
|
||||
"movq %rsi, %r12 \n\t"
|
||||
"movq %rdi, %r9 \n\t"
|
||||
"movl 4(%r9),%ebx \n\t"
|
||||
"movl 8(%r9),%ecx \n\t"
|
||||
"movl 12(%r9),%edx \n\t"
|
||||
"movl 16(%r9),%esi \n\t"
|
||||
"movl 20(%r9),%edi \n\t"
|
||||
"movl (%r9),%eax \n\t"
|
||||
"call *%r12 \n\t"
|
||||
"pushfq \n\t"
|
||||
"popq %r12 \n\t"
|
||||
"popfq \n\t"
|
||||
"movl %eax, (%r9) \n\t"
|
||||
"movl %ebx, 4(%r9) \n\t"
|
||||
"movl %ecx, 8(%r9) \n\t"
|
||||
"movl %edx, 12(%r9) \n\t"
|
||||
"movl %esi, 16(%r9) \n\t"
|
||||
"movl %edi, 20(%r9) \n\t"
|
||||
"movq %r12, %rax \n\t"
|
||||
"movl %eax, 28(%r9) \n\t"
|
||||
"popq %r9 \n\t"
|
||||
"popq %r12 \n\t"
|
||||
"popq %rdx \n\t"
|
||||
"popq %rbx \n\t"
|
||||
"popq %rax \n\t"
|
||||
"leave \n\t"
|
||||
"ret \n\t"
|
||||
".previous");
|
||||
|
||||
/*
|
||||
* dmi_find_cru
|
||||
|
@ -855,7 +855,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
|
||||
*/
|
||||
|
||||
/* Update group descriptor block for new group */
|
||||
gdp = (struct ext4_group_desc *)primary->b_data + gdb_off;
|
||||
gdp = (struct ext4_group_desc *)((char *)primary->b_data +
|
||||
gdb_off * EXT4_DESC_SIZE(sb));
|
||||
|
||||
ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
|
||||
ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
|
||||
|
@ -261,7 +261,7 @@ struct el_MCPCIA_uncorrected_frame_mcheck {
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int __mcpcia_is_mmio(unsigned long addr)
|
||||
extern inline int __mcpcia_is_mmio(unsigned long addr)
|
||||
{
|
||||
return (addr & 0x80000000UL) == 0;
|
||||
}
|
||||
|
@ -356,13 +356,13 @@ struct el_t2_frame_corrected {
|
||||
#define vip volatile int *
|
||||
#define vuip volatile unsigned int *
|
||||
|
||||
static inline u8 t2_inb(unsigned long addr)
|
||||
extern inline u8 t2_inb(unsigned long addr)
|
||||
{
|
||||
long result = *(vip) ((addr << 5) + T2_IO + 0x00);
|
||||
return __kernel_extbl(result, addr & 3);
|
||||
}
|
||||
|
||||
static inline void t2_outb(u8 b, unsigned long addr)
|
||||
extern inline void t2_outb(u8 b, unsigned long addr)
|
||||
{
|
||||
unsigned long w;
|
||||
|
||||
@ -371,13 +371,13 @@ static inline void t2_outb(u8 b, unsigned long addr)
|
||||
mb();
|
||||
}
|
||||
|
||||
static inline u16 t2_inw(unsigned long addr)
|
||||
extern inline u16 t2_inw(unsigned long addr)
|
||||
{
|
||||
long result = *(vip) ((addr << 5) + T2_IO + 0x08);
|
||||
return __kernel_extwl(result, addr & 3);
|
||||
}
|
||||
|
||||
static inline void t2_outw(u16 b, unsigned long addr)
|
||||
extern inline void t2_outw(u16 b, unsigned long addr)
|
||||
{
|
||||
unsigned long w;
|
||||
|
||||
@ -386,12 +386,12 @@ static inline void t2_outw(u16 b, unsigned long addr)
|
||||
mb();
|
||||
}
|
||||
|
||||
static inline u32 t2_inl(unsigned long addr)
|
||||
extern inline u32 t2_inl(unsigned long addr)
|
||||
{
|
||||
return *(vuip) ((addr << 5) + T2_IO + 0x18);
|
||||
}
|
||||
|
||||
static inline void t2_outl(u32 b, unsigned long addr)
|
||||
extern inline void t2_outl(u32 b, unsigned long addr)
|
||||
{
|
||||
*(vuip) ((addr << 5) + T2_IO + 0x18) = b;
|
||||
mb();
|
||||
@ -435,7 +435,7 @@ static inline void t2_outl(u32 b, unsigned long addr)
|
||||
set_hae(msb); \
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(t2_hae_lock);
|
||||
extern spinlock_t t2_hae_lock;
|
||||
|
||||
/*
|
||||
* NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
|
||||
|
@ -35,7 +35,7 @@
|
||||
* register not being up-to-date with respect to the hardware
|
||||
* value.
|
||||
*/
|
||||
static inline void __set_hae(unsigned long new_hae)
|
||||
extern inline void __set_hae(unsigned long new_hae)
|
||||
{
|
||||
unsigned long flags;
|
||||
local_irq_save(flags);
|
||||
@ -49,7 +49,7 @@ static inline void __set_hae(unsigned long new_hae)
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void set_hae(unsigned long new_hae)
|
||||
extern inline void set_hae(unsigned long new_hae)
|
||||
{
|
||||
if (new_hae != alpha_mv.hae_cache)
|
||||
__set_hae(new_hae);
|
||||
@ -176,7 +176,7 @@ REMAP2(u64, writeq, volatile)
|
||||
#undef REMAP1
|
||||
#undef REMAP2
|
||||
|
||||
static inline void __iomem *generic_ioportmap(unsigned long a)
|
||||
extern inline void __iomem *generic_ioportmap(unsigned long a)
|
||||
{
|
||||
return alpha_mv.mv_ioportmap(a);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
#endif
|
||||
|
||||
|
||||
extern inline unsigned long
|
||||
static inline unsigned long
|
||||
__reload_thread(struct pcb_struct *pcb)
|
||||
{
|
||||
register unsigned long a0 __asm__("$16");
|
||||
@ -114,7 +114,7 @@ extern unsigned long last_asn;
|
||||
#define __MMU_EXTERN_INLINE
|
||||
#endif
|
||||
|
||||
static inline unsigned long
|
||||
extern inline unsigned long
|
||||
__get_new_mm_context(struct mm_struct *mm, long cpu)
|
||||
{
|
||||
unsigned long asn = cpu_last_asn(cpu);
|
||||
@ -226,7 +226,7 @@ ev4_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
extern inline int
|
||||
static inline int
|
||||
init_new_context(struct task_struct *tsk, struct mm_struct *mm)
|
||||
{
|
||||
int i;
|
||||
|
@ -1,6 +1,76 @@
|
||||
#ifndef __ALPHA_PERCPU_H
|
||||
#define __ALPHA_PERCPU_H
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
#include <asm-generic/percpu.h>
|
||||
/*
|
||||
* Determine the real variable name from the name visible in the
|
||||
* kernel sources.
|
||||
*/
|
||||
#define per_cpu_var(var) per_cpu__##var
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/*
|
||||
* per_cpu_offset() is the offset that has to be added to a
|
||||
* percpu variable to get to the instance for a certain processor.
|
||||
*/
|
||||
extern unsigned long __per_cpu_offset[NR_CPUS];
|
||||
|
||||
#define per_cpu_offset(x) (__per_cpu_offset[x])
|
||||
|
||||
#define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
|
||||
#ifdef CONFIG_DEBUG_PREEMPT
|
||||
#define my_cpu_offset per_cpu_offset(smp_processor_id())
|
||||
#else
|
||||
#define my_cpu_offset __my_cpu_offset
|
||||
#endif
|
||||
|
||||
#ifndef MODULE
|
||||
#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
|
||||
#define PER_CPU_ATTRIBUTES
|
||||
#else
|
||||
/*
|
||||
* To calculate addresses of locally defined variables, GCC uses 32-bit
|
||||
* displacement from the GP. Which doesn't work for per cpu variables in
|
||||
* modules, as an offset to the kernel per cpu area is way above 4G.
|
||||
*
|
||||
* This forces allocation of a GOT entry for per cpu variable using
|
||||
* ldq instruction with a 'literal' relocation.
|
||||
*/
|
||||
#define SHIFT_PERCPU_PTR(var, offset) ({ \
|
||||
extern int simple_identifier_##var(void); \
|
||||
unsigned long __ptr, tmp_gp; \
|
||||
asm ( "br %1, 1f \n\
|
||||
1: ldgp %1, 0(%1) \n\
|
||||
ldq %0, per_cpu__" #var"(%1)\t!literal" \
|
||||
: "=&r"(__ptr), "=&r"(tmp_gp)); \
|
||||
(typeof(&per_cpu_var(var)))(__ptr + (offset)); })
|
||||
|
||||
#define PER_CPU_ATTRIBUTES __used
|
||||
|
||||
#endif /* MODULE */
|
||||
|
||||
/*
|
||||
* A percpu variable may point to a discarded regions. The following are
|
||||
* established ways to produce a usable pointer from the percpu variable
|
||||
* offset.
|
||||
*/
|
||||
#define per_cpu(var, cpu) \
|
||||
(*SHIFT_PERCPU_PTR(var, per_cpu_offset(cpu)))
|
||||
#define __get_cpu_var(var) \
|
||||
(*SHIFT_PERCPU_PTR(var, my_cpu_offset))
|
||||
#define __raw_get_cpu_var(var) \
|
||||
(*SHIFT_PERCPU_PTR(var, __my_cpu_offset))
|
||||
|
||||
#else /* ! SMP */
|
||||
|
||||
#define per_cpu(var, cpu) (*((void)(cpu), &per_cpu_var(var)))
|
||||
#define __get_cpu_var(var) per_cpu_var(var)
|
||||
#define __raw_get_cpu_var(var) per_cpu_var(var)
|
||||
|
||||
#endif /* SMP */
|
||||
|
||||
#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu_var(name)
|
||||
|
||||
#endif /* __ALPHA_PERCPU_H */
|
||||
|
@ -184,7 +184,7 @@ enum amask_enum {
|
||||
__amask; })
|
||||
|
||||
#define __CALL_PAL_R0(NAME, TYPE) \
|
||||
static inline TYPE NAME(void) \
|
||||
extern inline TYPE NAME(void) \
|
||||
{ \
|
||||
register TYPE __r0 __asm__("$0"); \
|
||||
__asm__ __volatile__( \
|
||||
@ -196,7 +196,7 @@ static inline TYPE NAME(void) \
|
||||
}
|
||||
|
||||
#define __CALL_PAL_W1(NAME, TYPE0) \
|
||||
static inline void NAME(TYPE0 arg0) \
|
||||
extern inline void NAME(TYPE0 arg0) \
|
||||
{ \
|
||||
register TYPE0 __r16 __asm__("$16") = arg0; \
|
||||
__asm__ __volatile__( \
|
||||
@ -207,7 +207,7 @@ static inline void NAME(TYPE0 arg0) \
|
||||
}
|
||||
|
||||
#define __CALL_PAL_W2(NAME, TYPE0, TYPE1) \
|
||||
static inline void NAME(TYPE0 arg0, TYPE1 arg1) \
|
||||
extern inline void NAME(TYPE0 arg0, TYPE1 arg1) \
|
||||
{ \
|
||||
register TYPE0 __r16 __asm__("$16") = arg0; \
|
||||
register TYPE1 __r17 __asm__("$17") = arg1; \
|
||||
@ -219,7 +219,7 @@ static inline void NAME(TYPE0 arg0, TYPE1 arg1) \
|
||||
}
|
||||
|
||||
#define __CALL_PAL_RW1(NAME, RTYPE, TYPE0) \
|
||||
static inline RTYPE NAME(TYPE0 arg0) \
|
||||
extern inline RTYPE NAME(TYPE0 arg0) \
|
||||
{ \
|
||||
register RTYPE __r0 __asm__("$0"); \
|
||||
register TYPE0 __r16 __asm__("$16") = arg0; \
|
||||
@ -232,7 +232,7 @@ static inline RTYPE NAME(TYPE0 arg0) \
|
||||
}
|
||||
|
||||
#define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1) \
|
||||
static inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \
|
||||
extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \
|
||||
{ \
|
||||
register RTYPE __r0 __asm__("$0"); \
|
||||
register TYPE0 __r16 __asm__("$16") = arg0; \
|
||||
|
@ -13,7 +13,7 @@
|
||||
#define VT_BUF_HAVE_MEMSETW
|
||||
#define VT_BUF_HAVE_MEMCPYW
|
||||
|
||||
extern inline void scr_writew(u16 val, volatile u16 *addr)
|
||||
static inline void scr_writew(u16 val, volatile u16 *addr)
|
||||
{
|
||||
if (__is_ioaddr(addr))
|
||||
__raw_writew(val, (volatile u16 __iomem *) addr);
|
||||
@ -21,7 +21,7 @@ extern inline void scr_writew(u16 val, volatile u16 *addr)
|
||||
*addr = val;
|
||||
}
|
||||
|
||||
extern inline u16 scr_readw(volatile const u16 *addr)
|
||||
static inline u16 scr_readw(volatile const u16 *addr)
|
||||
{
|
||||
if (__is_ioaddr(addr))
|
||||
return __raw_readw((volatile const u16 __iomem *) addr);
|
||||
@ -29,7 +29,7 @@ extern inline u16 scr_readw(volatile const u16 *addr)
|
||||
return *addr;
|
||||
}
|
||||
|
||||
extern inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
|
||||
static inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
|
||||
{
|
||||
if (__is_ioaddr(s))
|
||||
memsetw_io((u16 __iomem *) s, c, count);
|
||||
|
@ -96,7 +96,7 @@ struct bfin_serial_port {
|
||||
struct work_struct tx_dma_workqueue;
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
struct work_struct cts_workqueue;
|
||||
struct timer_list cts_timer;
|
||||
int cts_pin;
|
||||
int rts_pin;
|
||||
#endif
|
||||
|
@ -88,7 +88,7 @@ struct bfin_serial_port {
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
struct work_struct cts_workqueue;
|
||||
struct timer_list cts_timer;
|
||||
int cts_pin;
|
||||
int rts_pin;
|
||||
#endif
|
||||
|
@ -96,7 +96,7 @@ struct bfin_serial_port {
|
||||
struct work_struct tx_dma_workqueue;
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
struct work_struct cts_workqueue;
|
||||
struct timer_list cts_timer;
|
||||
int cts_pin;
|
||||
int rts_pin;
|
||||
#endif
|
||||
|
@ -99,7 +99,7 @@ struct bfin_serial_port {
|
||||
struct work_struct tx_dma_workqueue;
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
struct work_struct cts_workqueue;
|
||||
struct timer_list cts_timer;
|
||||
int cts_pin;
|
||||
int rts_pin;
|
||||
#endif
|
||||
@ -187,7 +187,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
|
||||
|
||||
#ifdef CONFIG_BFIN_UART1_CTSRTS
|
||||
peripheral_request(P_UART1_RTS, DRIVER_NAME);
|
||||
peripheral_request(P_UART1_CTS DRIVER_NAME);
|
||||
peripheral_request(P_UART1_CTS, DRIVER_NAME);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -202,7 +202,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
|
||||
|
||||
#ifdef CONFIG_BFIN_UART3_CTSRTS
|
||||
peripheral_request(P_UART3_RTS, DRIVER_NAME);
|
||||
peripheral_request(P_UART3_CTS DRIVER_NAME);
|
||||
peripheral_request(P_UART3_CTS, DRIVER_NAME);
|
||||
#endif
|
||||
#endif
|
||||
SSYNC();
|
||||
|
@ -88,7 +88,7 @@ struct bfin_serial_port {
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
struct work_struct cts_workqueue;
|
||||
struct timer_list cts_timer;
|
||||
int cts_pin;
|
||||
int rts_pin;
|
||||
#endif
|
||||
|
@ -112,8 +112,8 @@ extern int geode_get_dev_base(unsigned int dev);
|
||||
#define VSA_VR_UNLOCK 0xFC53 /* unlock virtual register */
|
||||
#define VSA_VR_SIGNATURE 0x0003
|
||||
#define VSA_VR_MEM_SIZE 0x0200
|
||||
#define VSA_SIG 0x4132 /* signature is ascii 'VSA2' */
|
||||
|
||||
#define AMD_VSA_SIG 0x4132 /* signature is ascii 'VSA2' */
|
||||
#define GSW_VSA_SIG 0x534d /* General Software signature */
|
||||
/* GPIO */
|
||||
|
||||
#define GPIO_OUTPUT_VAL 0x00
|
||||
|
@ -14,7 +14,8 @@
|
||||
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
||||
|
||||
#ifdef CONFIG_X86_PAE
|
||||
#define __PHYSICAL_MASK_SHIFT 36
|
||||
/* 44=32+12, the limit we can fit into an unsigned long pfn */
|
||||
#define __PHYSICAL_MASK_SHIFT 44
|
||||
#define __VIRTUAL_MASK_SHIFT 32
|
||||
#define PAGETABLE_LEVELS 3
|
||||
|
||||
|
@ -94,7 +94,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat,
|
||||
unsigned long freepfn,
|
||||
unsigned long startpfn,
|
||||
unsigned long endpfn);
|
||||
extern void reserve_bootmem_node(pg_data_t *pgdat,
|
||||
extern int reserve_bootmem_node(pg_data_t *pgdat,
|
||||
unsigned long physaddr,
|
||||
unsigned long size,
|
||||
int flags);
|
||||
|
@ -367,6 +367,12 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
|
||||
a->s6_addr32[2] | a->s6_addr32[3] ) == 0);
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_loopback(const struct in6_addr *a)
|
||||
{
|
||||
return ((a->s6_addr32[0] | a->s6_addr32[1] |
|
||||
a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0);
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
|
||||
{
|
||||
return ((a->s6_addr32[0] | a->s6_addr32[1] |
|
||||
|
@ -95,6 +95,11 @@ extern struct list_head net_namespace_list;
|
||||
#ifdef CONFIG_NET_NS
|
||||
extern void __put_net(struct net *net);
|
||||
|
||||
static inline int net_alive(struct net *net)
|
||||
{
|
||||
return net && atomic_read(&net->count);
|
||||
}
|
||||
|
||||
static inline struct net *get_net(struct net *net)
|
||||
{
|
||||
atomic_inc(&net->count);
|
||||
@ -125,6 +130,12 @@ int net_eq(const struct net *net1, const struct net *net2)
|
||||
return net1 == net2;
|
||||
}
|
||||
#else
|
||||
|
||||
static inline int net_alive(struct net *net)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline struct net *get_net(struct net *net)
|
||||
{
|
||||
return net;
|
||||
|
@ -1037,8 +1037,8 @@ int current_cpuset_is_being_rebound(void)
|
||||
|
||||
static int update_relax_domain_level(struct cpuset *cs, s64 val)
|
||||
{
|
||||
if ((int)val < 0)
|
||||
val = -1;
|
||||
if (val < -1 || val >= SD_LV_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (val != cs->relax_domain_level) {
|
||||
cs->relax_domain_level = val;
|
||||
|
@ -217,8 +217,6 @@ long rcu_batches_completed(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rcu_batches_completed);
|
||||
|
||||
EXPORT_SYMBOL_GPL(rcu_batches_completed_bh);
|
||||
|
||||
void __rcu_read_lock(void)
|
||||
{
|
||||
int idx;
|
||||
|
@ -6877,7 +6877,12 @@ static int default_relax_domain_level = -1;
|
||||
|
||||
static int __init setup_relax_domain_level(char *str)
|
||||
{
|
||||
default_relax_domain_level = simple_strtoul(str, NULL, 0);
|
||||
unsigned long val;
|
||||
|
||||
val = simple_strtoul(str, NULL, 0);
|
||||
if (val < SD_LV_MAX)
|
||||
default_relax_domain_level = val;
|
||||
|
||||
return 1;
|
||||
}
|
||||
__setup("relax_domain_level=", setup_relax_domain_level);
|
||||
|
@ -49,12 +49,17 @@ static unsigned long get_timestamp(int this_cpu)
|
||||
return cpu_clock(this_cpu) >> 30LL; /* 2^30 ~= 10^9 */
|
||||
}
|
||||
|
||||
void touch_softlockup_watchdog(void)
|
||||
static void __touch_softlockup_watchdog(void)
|
||||
{
|
||||
int this_cpu = raw_smp_processor_id();
|
||||
|
||||
__raw_get_cpu_var(touch_timestamp) = get_timestamp(this_cpu);
|
||||
}
|
||||
|
||||
void touch_softlockup_watchdog(void)
|
||||
{
|
||||
__raw_get_cpu_var(touch_timestamp) = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(touch_softlockup_watchdog);
|
||||
|
||||
void touch_all_softlockup_watchdogs(void)
|
||||
@ -80,7 +85,7 @@ void softlockup_tick(void)
|
||||
unsigned long now;
|
||||
|
||||
if (touch_timestamp == 0) {
|
||||
touch_softlockup_watchdog();
|
||||
__touch_softlockup_watchdog();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -95,7 +100,7 @@ void softlockup_tick(void)
|
||||
|
||||
/* do not print during early bootup: */
|
||||
if (unlikely(system_state != SYSTEM_RUNNING)) {
|
||||
touch_softlockup_watchdog();
|
||||
__touch_softlockup_watchdog();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -214,7 +219,7 @@ static int watchdog(void *__bind_cpu)
|
||||
sched_setscheduler(current, SCHED_FIFO, ¶m);
|
||||
|
||||
/* initialize timestamp */
|
||||
touch_softlockup_watchdog();
|
||||
__touch_softlockup_watchdog();
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
/*
|
||||
@ -223,7 +228,7 @@ static int watchdog(void *__bind_cpu)
|
||||
* debug-printout triggers in softlockup_tick().
|
||||
*/
|
||||
while (!kthread_should_stop()) {
|
||||
touch_softlockup_watchdog();
|
||||
__touch_softlockup_watchdog();
|
||||
schedule();
|
||||
|
||||
if (kthread_should_stop())
|
||||
|
@ -442,15 +442,17 @@ unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn,
|
||||
return init_bootmem_core(pgdat, freepfn, startpfn, endpfn);
|
||||
}
|
||||
|
||||
void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
||||
int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
||||
unsigned long size, int flags)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = can_reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
|
||||
if (ret < 0)
|
||||
return;
|
||||
return -ENOMEM;
|
||||
reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
|
||||
|
17
mm/memory.c
17
mm/memory.c
@ -999,17 +999,15 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
|
||||
goto no_page_table;
|
||||
|
||||
ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
|
||||
if (!ptep)
|
||||
goto out;
|
||||
|
||||
pte = *ptep;
|
||||
if (!pte_present(pte))
|
||||
goto unlock;
|
||||
goto no_page;
|
||||
if ((flags & FOLL_WRITE) && !pte_write(pte))
|
||||
goto unlock;
|
||||
page = vm_normal_page(vma, address, pte);
|
||||
if (unlikely(!page))
|
||||
goto unlock;
|
||||
goto bad_page;
|
||||
|
||||
if (flags & FOLL_GET)
|
||||
get_page(page);
|
||||
@ -1024,6 +1022,15 @@ unlock:
|
||||
out:
|
||||
return page;
|
||||
|
||||
bad_page:
|
||||
pte_unmap_unlock(ptep, ptl);
|
||||
return ERR_PTR(-EFAULT);
|
||||
|
||||
no_page:
|
||||
pte_unmap_unlock(ptep, ptl);
|
||||
if (!pte_none(pte))
|
||||
return page;
|
||||
/* Fall through to ZERO_PAGE handling */
|
||||
no_page_table:
|
||||
/*
|
||||
* When core dumping an enormous anonymous area that nobody
|
||||
@ -1159,6 +1166,8 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
|
||||
|
||||
cond_resched();
|
||||
}
|
||||
if (IS_ERR(page))
|
||||
return i ? i : PTR_ERR(page);
|
||||
if (pages) {
|
||||
pages[i] = page;
|
||||
|
||||
|
10
mm/migrate.c
10
mm/migrate.c
@ -865,6 +865,11 @@ static int do_move_pages(struct mm_struct *mm, struct page_to_node *pm,
|
||||
goto set_status;
|
||||
|
||||
page = follow_page(vma, pp->addr, FOLL_GET);
|
||||
|
||||
err = PTR_ERR(page);
|
||||
if (IS_ERR(page))
|
||||
goto set_status;
|
||||
|
||||
err = -ENOENT;
|
||||
if (!page)
|
||||
goto set_status;
|
||||
@ -928,6 +933,11 @@ static int do_pages_stat(struct mm_struct *mm, struct page_to_node *pm)
|
||||
goto set_status;
|
||||
|
||||
page = follow_page(vma, pm->addr, 0);
|
||||
|
||||
err = PTR_ERR(page);
|
||||
if (IS_ERR(page))
|
||||
goto set_status;
|
||||
|
||||
err = -ENOENT;
|
||||
/* Use PageReserved to check for zero page */
|
||||
if (!page || PageReserved(page))
|
||||
|
@ -3263,9 +3263,12 @@ retry:
|
||||
|
||||
if (cpuset_zone_allowed_hardwall(zone, flags) &&
|
||||
cache->nodelists[nid] &&
|
||||
cache->nodelists[nid]->free_objects)
|
||||
cache->nodelists[nid]->free_objects) {
|
||||
obj = ____cache_alloc_node(cache,
|
||||
flags | GFP_THISNODE, nid);
|
||||
if (obj)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!obj) {
|
||||
|
@ -2077,6 +2077,10 @@ int netif_receive_skb(struct sk_buff *skb)
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
/* Don't receive packets in an exiting network namespace */
|
||||
if (!net_alive(dev_net(skb->dev)))
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (skb->tc_verd & TC_NCLS) {
|
||||
skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
|
||||
|
@ -140,6 +140,9 @@ static void cleanup_net(struct work_struct *work)
|
||||
struct pernet_operations *ops;
|
||||
struct net *net;
|
||||
|
||||
/* Be very certain incoming network packets will not find us */
|
||||
rcu_barrier();
|
||||
|
||||
net = container_of(work, struct net, work);
|
||||
|
||||
mutex_lock(&net_mutex);
|
||||
|
@ -102,6 +102,15 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
|
||||
if (hdr->version != 6)
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* RFC4291 2.5.3
|
||||
* A packet received on an interface with a destination address
|
||||
* of loopback must be dropped.
|
||||
*/
|
||||
if (!(dev->flags & IFF_LOOPBACK) &&
|
||||
ipv6_addr_loopback(&hdr->daddr))
|
||||
goto err;
|
||||
|
||||
skb->transport_header = skb->network_header + sizeof(*hdr);
|
||||
IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
|
||||
|
||||
|
@ -345,18 +345,21 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
case IPV6_DSTOPTS:
|
||||
{
|
||||
struct ipv6_txoptions *opt;
|
||||
|
||||
/* remove any sticky options header with a zero option
|
||||
* length, per RFC3542.
|
||||
*/
|
||||
if (optlen == 0)
|
||||
optval = NULL;
|
||||
else if (optlen < sizeof(struct ipv6_opt_hdr) ||
|
||||
optlen & 0x7 || optlen > 8 * 255)
|
||||
goto e_inval;
|
||||
|
||||
/* hop-by-hop / destination options are privileged option */
|
||||
retv = -EPERM;
|
||||
if (optname != IPV6_RTHDR && !capable(CAP_NET_RAW))
|
||||
break;
|
||||
|
||||
if (optlen < sizeof(struct ipv6_opt_hdr) ||
|
||||
optlen & 0x7 || optlen > 8 * 255)
|
||||
goto e_inval;
|
||||
|
||||
opt = ipv6_renew_options(sk, np->opt, optname,
|
||||
(struct ipv6_opt_hdr __user *)optval,
|
||||
optlen);
|
||||
|
@ -1132,7 +1132,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb,
|
||||
ieee80211_tx_handler *handler;
|
||||
struct ieee80211_tx_data tx;
|
||||
ieee80211_tx_result res = TX_DROP, res_prepare;
|
||||
int ret, i;
|
||||
int ret, i, retries = 0;
|
||||
|
||||
WARN_ON(__ieee80211_queue_pending(local, control->queue));
|
||||
|
||||
@ -1216,6 +1216,13 @@ retry:
|
||||
if (!__ieee80211_queue_stopped(local, control->queue)) {
|
||||
clear_bit(IEEE80211_LINK_STATE_PENDING,
|
||||
&local->state[control->queue]);
|
||||
retries++;
|
||||
/*
|
||||
* Driver bug, it's rejecting packets but
|
||||
* not stopping queues.
|
||||
*/
|
||||
if (WARN_ON_ONCE(retries > 5))
|
||||
goto drop;
|
||||
goto retry;
|
||||
}
|
||||
memcpy(&store->control, control,
|
||||
|
@ -4401,7 +4401,9 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len,
|
||||
if (copy_from_user(&getaddrs, optval, len))
|
||||
return -EFAULT;
|
||||
|
||||
if (getaddrs.addr_num <= 0) return -EINVAL;
|
||||
if (getaddrs.addr_num <= 0 ||
|
||||
getaddrs.addr_num >= (INT_MAX / sizeof(union sctp_addr)))
|
||||
return -EINVAL;
|
||||
/*
|
||||
* For UDP-style sockets, id specifies the association to query.
|
||||
* If the id field is set to the value '0' then the locally bound
|
||||
|
Loading…
Reference in New Issue
Block a user