mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'master' into upstream
This commit is contained in:
commit
f630fe2817
1487 changed files with 43462 additions and 15549 deletions
|
|
@ -99,7 +99,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
*/
|
||||
#include <linux/capability.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/rtc.h>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/acpi.h>
|
||||
|
|
@ -340,6 +339,7 @@ static int acpi_ec_hc_add(struct acpi_device *device)
|
|||
smbus->adapter.owner = THIS_MODULE;
|
||||
smbus->adapter.algo = &acpi_ec_smbus_algorithm;
|
||||
smbus->adapter.algo_data = smbus;
|
||||
smbus->adapter.dev.parent = &device->dev;
|
||||
|
||||
if (i2c_add_adapter(&smbus->adapter)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_WARN,
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <linux/nmi.h>
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsinit")
|
||||
|
|
@ -534,7 +535,15 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
|
|||
info->parameter_type = ACPI_PARAM_ARGS;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
/*
|
||||
* Some hardware relies on this being executed as atomically
|
||||
* as possible (without an NMI being received in the middle of
|
||||
* this) - so disable NMIs and initialize the device:
|
||||
*/
|
||||
acpi_nmi_disable();
|
||||
status = acpi_ns_evaluate(info);
|
||||
acpi_nmi_enable();
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
walk_info->num_INI++;
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,17 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/sched.h> /* need_resched() */
|
||||
#include <linux/latency.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
/*
|
||||
* Include the apic definitions for x86 to have the APIC timer related defines
|
||||
* available also for UP (on SMP it gets magically included via linux/smp.h).
|
||||
* asm/acpi.h is not an option, as it would require more include magic. Also
|
||||
* creating an empty asm-ia64/apic.h would just trade pest vs. cholera.
|
||||
*/
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/apic.h>
|
||||
#endif
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
|
@ -238,6 +249,81 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
||||
|
||||
/*
|
||||
* Some BIOS implementations switch to C3 in the published C2 state.
|
||||
* This seems to be a common problem on AMD boxen, but other vendors
|
||||
* are affected too. We pick the most conservative approach: we assume
|
||||
* that the local APIC stops in both C2 and C3.
|
||||
*/
|
||||
static void acpi_timer_check_state(int state, struct acpi_processor *pr,
|
||||
struct acpi_processor_cx *cx)
|
||||
{
|
||||
struct acpi_processor_power *pwr = &pr->power;
|
||||
|
||||
/*
|
||||
* Check, if one of the previous states already marked the lapic
|
||||
* unstable
|
||||
*/
|
||||
if (pwr->timer_broadcast_on_state < state)
|
||||
return;
|
||||
|
||||
if (cx->type >= ACPI_STATE_C2)
|
||||
pr->power.timer_broadcast_on_state = state;
|
||||
}
|
||||
|
||||
static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
|
||||
{
|
||||
#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
||||
unsigned long reason;
|
||||
|
||||
reason = pr->power.timer_broadcast_on_state < INT_MAX ?
|
||||
CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;
|
||||
|
||||
clockevents_notify(reason, &pr->id);
|
||||
#else
|
||||
cpumask_t mask = cpumask_of_cpu(pr->id);
|
||||
|
||||
if (pr->power.timer_broadcast_on_state < INT_MAX)
|
||||
on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
|
||||
else
|
||||
on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Power(C) State timer broadcast control */
|
||||
static void acpi_state_timer_broadcast(struct acpi_processor *pr,
|
||||
struct acpi_processor_cx *cx,
|
||||
int broadcast)
|
||||
{
|
||||
#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
||||
|
||||
int state = cx - pr->power.states;
|
||||
|
||||
if (state >= pr->power.timer_broadcast_on_state) {
|
||||
unsigned long reason;
|
||||
|
||||
reason = broadcast ? CLOCK_EVT_NOTIFY_BROADCAST_ENTER :
|
||||
CLOCK_EVT_NOTIFY_BROADCAST_EXIT;
|
||||
clockevents_notify(reason, &pr->id);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void acpi_timer_check_state(int state, struct acpi_processor *pr,
|
||||
struct acpi_processor_cx *cstate) { }
|
||||
static void acpi_propagate_timer_broadcast(struct acpi_processor *pr) { }
|
||||
static void acpi_state_timer_broadcast(struct acpi_processor *pr,
|
||||
struct acpi_processor_cx *cx,
|
||||
int broadcast)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void acpi_processor_idle(void)
|
||||
{
|
||||
struct acpi_processor *pr = NULL;
|
||||
|
|
@ -382,6 +468,7 @@ static void acpi_processor_idle(void)
|
|||
/* Get start time (ticks) */
|
||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
/* Invoke C2 */
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
acpi_cstate_enter(cx);
|
||||
/* Get end time (ticks) */
|
||||
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
|
|
@ -396,6 +483,7 @@ static void acpi_processor_idle(void)
|
|||
/* Compute time (ticks) that we were actually asleep */
|
||||
sleep_ticks =
|
||||
ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
|
||||
acpi_state_timer_broadcast(pr, cx, 0);
|
||||
break;
|
||||
|
||||
case ACPI_STATE_C3:
|
||||
|
|
@ -417,6 +505,7 @@ static void acpi_processor_idle(void)
|
|||
/* Get start time (ticks) */
|
||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
/* Invoke C3 */
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
acpi_cstate_enter(cx);
|
||||
/* Get end time (ticks) */
|
||||
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
|
|
@ -436,6 +525,7 @@ static void acpi_processor_idle(void)
|
|||
/* Compute time (ticks) that we were actually asleep */
|
||||
sleep_ticks =
|
||||
ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
|
||||
acpi_state_timer_broadcast(pr, cx, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -904,11 +994,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|||
unsigned int i;
|
||||
unsigned int working = 0;
|
||||
|
||||
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
||||
int timer_broadcast = 0;
|
||||
cpumask_t mask = cpumask_of_cpu(pr->id);
|
||||
on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
|
||||
#endif
|
||||
pr->power.timer_broadcast_on_state = INT_MAX;
|
||||
|
||||
for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
|
||||
struct acpi_processor_cx *cx = &pr->power.states[i];
|
||||
|
|
@ -920,21 +1006,14 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|||
|
||||
case ACPI_STATE_C2:
|
||||
acpi_processor_power_verify_c2(cx);
|
||||
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
||||
/* Some AMD systems fake C3 as C2, but still
|
||||
have timer troubles */
|
||||
if (cx->valid &&
|
||||
boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
|
||||
timer_broadcast++;
|
||||
#endif
|
||||
if (cx->valid)
|
||||
acpi_timer_check_state(i, pr, cx);
|
||||
break;
|
||||
|
||||
case ACPI_STATE_C3:
|
||||
acpi_processor_power_verify_c3(pr, cx);
|
||||
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
||||
if (cx->valid)
|
||||
timer_broadcast++;
|
||||
#endif
|
||||
acpi_timer_check_state(i, pr, cx);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -942,10 +1021,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|||
working++;
|
||||
}
|
||||
|
||||
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
||||
if (timer_broadcast)
|
||||
on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
|
||||
#endif
|
||||
acpi_propagate_timer_broadcast(pr);
|
||||
|
||||
return (working);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@
|
|||
#include <linux/pm.h>
|
||||
#include <linux/init.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <asm/io.h>
|
||||
#include "sleep.h"
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,8 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
|
|
|||
|
|
@ -1410,7 +1410,16 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
|||
}
|
||||
|
||||
tf.protocol = ATA_PROT_PIO;
|
||||
tf.flags |= ATA_TFLAG_POLLING; /* for polling presence detection */
|
||||
|
||||
/* Some devices choke if TF registers contain garbage. Make
|
||||
* sure those are properly initialized.
|
||||
*/
|
||||
tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
|
||||
/* Device presence detection is unreliable on some
|
||||
* controllers. Always poll IDENTIFY if available.
|
||||
*/
|
||||
tf.flags |= ATA_TFLAG_POLLING;
|
||||
|
||||
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
|
||||
id, sizeof(id[0]) * ATA_ID_WORDS);
|
||||
|
|
|
|||
|
|
@ -89,9 +89,10 @@ static int probe_all; /* Set to check all ISA port ranges */
|
|||
static int ht6560a; /* HT 6560A on primary 1, secondary 2, both 3 */
|
||||
static int ht6560b; /* HT 6560A on primary 1, secondary 2, both 3 */
|
||||
static int opti82c611a; /* Opti82c611A on primary 1, secondary 2, both 3 */
|
||||
static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */
|
||||
static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */
|
||||
static int autospeed; /* Chip present which snoops speed changes */
|
||||
static int pio_mask = 0x1F; /* PIO range for autospeed devices */
|
||||
static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
|
||||
|
||||
/**
|
||||
* legacy_set_mode - mode setting
|
||||
|
|
@ -113,6 +114,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
|
|||
for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
||||
struct ata_device *dev = &ap->device[i];
|
||||
if (ata_dev_enabled(dev)) {
|
||||
ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
|
||||
dev->pio_mode = XFER_PIO_0;
|
||||
dev->xfer_mode = XFER_PIO_0;
|
||||
dev->xfer_shift = ATA_SHIFT_PIO;
|
||||
|
|
@ -695,6 +697,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
|||
void __iomem *io_addr, *ctrl_addr;
|
||||
int pio_modes = pio_mask;
|
||||
u32 mask = (1 << port);
|
||||
u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
|
||||
int ret;
|
||||
|
||||
pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
|
||||
|
|
@ -715,6 +718,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
|||
if (ht6560a & mask) {
|
||||
ops = &ht6560a_port_ops;
|
||||
pio_modes = 0x07;
|
||||
iordy = ATA_FLAG_NO_IORDY;
|
||||
}
|
||||
if (ht6560b & mask) {
|
||||
ops = &ht6560b_port_ops;
|
||||
|
|
@ -750,6 +754,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
|||
printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n");
|
||||
pio_modes = 0x07;
|
||||
ops = &pdc20230_port_ops;
|
||||
iordy = ATA_FLAG_NO_IORDY;
|
||||
udelay(100);
|
||||
inb(0x1F5);
|
||||
} else {
|
||||
|
|
@ -767,6 +772,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
|||
/* Chip does mode setting by command snooping */
|
||||
if (ops == &legacy_port_ops && (autospeed & mask))
|
||||
ops = &simple_port_ops;
|
||||
|
||||
memset(&ae, 0, sizeof(struct ata_probe_ent));
|
||||
INIT_LIST_HEAD(&ae.node);
|
||||
ae.dev = &pdev->dev;
|
||||
|
|
@ -776,7 +782,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
|||
ae.pio_mask = pio_modes;
|
||||
ae.irq = irq;
|
||||
ae.irq_flags = 0;
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST;
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST|iordy;
|
||||
ae.port[0].cmd_addr = io_addr;
|
||||
ae.port[0].altstatus_addr = ctrl_addr;
|
||||
ae.port[0].ctl_addr = ctrl_addr;
|
||||
|
|
@ -945,6 +951,7 @@ module_param(ht6560b, int, 0);
|
|||
module_param(opti82c611a, int, 0);
|
||||
module_param(opti82c46x, int, 0);
|
||||
module_param(pio_mask, int, 0);
|
||||
module_param(iordy_mask, int, 0);
|
||||
|
||||
module_init(legacy_init);
|
||||
module_exit(legacy_exit);
|
||||
|
|
|
|||
|
|
@ -484,10 +484,8 @@ mpc52xx_ata_resume(struct of_device *op)
|
|||
|
||||
static struct of_device_id mpc52xx_ata_of_match[] = {
|
||||
{
|
||||
.compatible = "mpc5200-ata",
|
||||
},
|
||||
{
|
||||
.compatible = "mpc52xx-ata",
|
||||
.type = "ata",
|
||||
.compatible = "mpc5200-ata",
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -241,7 +241,7 @@ static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
probe.port_ops = &mpiix_port_ops;
|
||||
probe.sht = &mpiix_sht;
|
||||
probe.pio_mask = 0x1F;
|
||||
probe.irq_flags = SA_SHIRQ;
|
||||
probe.irq_flags = IRQF_SHARED;
|
||||
probe.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
|
||||
probe.n_ports = 1;
|
||||
|
||||
|
|
|
|||
|
|
@ -264,7 +264,7 @@ next_entry:
|
|||
ae.n_ports = 1;
|
||||
ae.pio_mask = 1; /* ISA so PIO 0 cycles */
|
||||
ae.irq = pdev->irq.AssignedIRQ;
|
||||
ae.irq_flags = SA_SHIRQ;
|
||||
ae.irq_flags = IRQF_SHARED;
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
|
||||
ae.port[0].cmd_addr = io_addr;
|
||||
ae.port[0].altstatus_addr = ctl_addr;
|
||||
|
|
|
|||
|
|
@ -796,7 +796,7 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
|
|||
probe_ent->port_ops = pdc2027x_port_info[board_idx].port_ops;
|
||||
|
||||
probe_ent->irq = pdev->irq;
|
||||
probe_ent->irq_flags = SA_SHIRQ;
|
||||
probe_ent->irq_flags = IRQF_SHARED;
|
||||
probe_ent->iomap = pcim_iomap_table(pdev);
|
||||
|
||||
mmio_base = probe_ent->iomap[PDC_MMIO_BAR];
|
||||
|
|
|
|||
|
|
@ -264,16 +264,18 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
|
|||
if (type == 6580) {
|
||||
ae.port_ops = &qdi6580_port_ops;
|
||||
ae.pio_mask = 0x1F;
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
|
||||
} else {
|
||||
ae.port_ops = &qdi6500_port_ops;
|
||||
ae.pio_mask = 0x07; /* Actually PIO3 !IORDY is possible */
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
|
||||
ATA_FLAG_NO_IORDY;
|
||||
}
|
||||
|
||||
ae.sht = &qdi_sht;
|
||||
ae.n_ports = 1;
|
||||
ae.irq = irq;
|
||||
ae.irq_flags = 0;
|
||||
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
|
||||
ae.port[0].cmd_addr = io_addr;
|
||||
ae.port[0].altstatus_addr = ctl_addr;
|
||||
ae.port[0].ctl_addr = ctl_addr;
|
||||
|
|
|
|||
|
|
@ -187,7 +187,9 @@ static void sl82c105_bmdma_start(struct ata_queued_cmd *qc)
|
|||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
|
||||
udelay(100);
|
||||
sl82c105_reset_engine(ap);
|
||||
udelay(100);
|
||||
|
||||
/* Set the clocks for DMA */
|
||||
sl82c105_configure_dmamode(ap, qc->dev);
|
||||
|
|
@ -216,6 +218,7 @@ static void sl82c105_bmdma_stop(struct ata_queued_cmd *qc)
|
|||
|
||||
ata_bmdma_stop(qc);
|
||||
sl82c105_reset_engine(ap);
|
||||
udelay(100);
|
||||
|
||||
/* This will redo the initial setup of the DMA device to matching
|
||||
PIO timings */
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
|
|
|
|||
|
|
@ -710,7 +710,7 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
probe_ent->n_ports = NR_PORTS;
|
||||
|
||||
probe_ent->irq = pdev->irq;
|
||||
probe_ent->irq_flags = SA_SHIRQ;
|
||||
probe_ent->irq_flags = IRQF_SHARED;
|
||||
|
||||
probe_ent->iomap = iomap;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
|
|
|||
|
|
@ -827,7 +827,8 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
|||
/* freeze if hotplugged or controller error */
|
||||
if (unlikely(status & (NV_ADMA_STAT_HOTPLUG |
|
||||
NV_ADMA_STAT_HOTUNPLUG |
|
||||
NV_ADMA_STAT_TIMEOUT))) {
|
||||
NV_ADMA_STAT_TIMEOUT |
|
||||
NV_ADMA_STAT_SERROR))) {
|
||||
struct ata_eh_info *ehi = &ap->eh_info;
|
||||
|
||||
ata_ehi_clear_desc(ehi);
|
||||
|
|
@ -841,6 +842,9 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
|
|||
} else if (status & NV_ADMA_STAT_HOTUNPLUG) {
|
||||
ata_ehi_hotplugged(ehi);
|
||||
ata_ehi_push_desc(ehi, ": hot unplug");
|
||||
} else if (status & NV_ADMA_STAT_SERROR) {
|
||||
/* let libata analyze SError and figure out the cause */
|
||||
ata_ehi_push_desc(ehi, ": SError");
|
||||
}
|
||||
ata_port_freeze(ap);
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
|
@ -120,9 +119,7 @@ static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
|
|||
static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
|
||||
static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||
static irqreturn_t pdc_interrupt (int irq, void *dev_instance);
|
||||
static void pdc_eng_timeout(struct ata_port *ap);
|
||||
static int pdc_port_start(struct ata_port *ap);
|
||||
static void pdc_pata_phy_reset(struct ata_port *ap);
|
||||
static void pdc_qc_prep(struct ata_queued_cmd *qc);
|
||||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
|
|
@ -216,12 +213,12 @@ static const struct ata_port_operations pdc_pata_ops = {
|
|||
.dev_select = ata_std_dev_select,
|
||||
.check_atapi_dma = pdc_check_atapi_dma,
|
||||
|
||||
.phy_reset = pdc_pata_phy_reset,
|
||||
|
||||
.qc_prep = pdc_qc_prep,
|
||||
.qc_issue = pdc_qc_issue_prot,
|
||||
.freeze = pdc_freeze,
|
||||
.thaw = pdc_thaw,
|
||||
.error_handler = pdc_error_handler,
|
||||
.data_xfer = ata_data_xfer,
|
||||
.eng_timeout = pdc_eng_timeout,
|
||||
.irq_handler = pdc_interrupt,
|
||||
.irq_clear = pdc_irq_clear,
|
||||
.irq_on = ata_irq_on,
|
||||
|
|
@ -254,7 +251,7 @@ static const struct ata_port_info pdc_port_info[] = {
|
|||
/* board_20619 */
|
||||
{
|
||||
.sht = &pdc_ata_sht,
|
||||
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SRST | ATA_FLAG_SLAVE_POSS,
|
||||
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
|
||||
.pio_mask = 0x1f, /* pio0-4 */
|
||||
.mwdma_mask = 0x07, /* mwdma0-2 */
|
||||
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
|
||||
|
|
@ -390,14 +387,6 @@ static void pdc_pata_cbl_detect(struct ata_port *ap)
|
|||
ap->cbl = ATA_CBL_PATA80;
|
||||
}
|
||||
|
||||
static void pdc_pata_phy_reset(struct ata_port *ap)
|
||||
{
|
||||
pdc_pata_cbl_detect(ap);
|
||||
pdc_reset_port(ap);
|
||||
ata_port_probe(ap);
|
||||
ata_bus_reset(ap);
|
||||
}
|
||||
|
||||
static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
|
||||
{
|
||||
if (sc_reg > SCR_CONTROL || ap->cbl != ATA_CBL_SATA)
|
||||
|
|
@ -565,6 +554,13 @@ static void pdc_thaw(struct ata_port *ap)
|
|||
readl(mmio + PDC_CTLSTAT); /* flush */
|
||||
}
|
||||
|
||||
static int pdc_pre_reset(struct ata_port *ap)
|
||||
{
|
||||
if (!sata_scr_valid(ap))
|
||||
pdc_pata_cbl_detect(ap);
|
||||
return ata_std_prereset(ap);
|
||||
}
|
||||
|
||||
static void pdc_error_handler(struct ata_port *ap)
|
||||
{
|
||||
ata_reset_fn_t hardreset;
|
||||
|
|
@ -577,7 +573,7 @@ static void pdc_error_handler(struct ata_port *ap)
|
|||
hardreset = sata_std_hardreset;
|
||||
|
||||
/* perform recovery */
|
||||
ata_do_eh(ap, ata_std_prereset, ata_std_softreset, hardreset,
|
||||
ata_do_eh(ap, pdc_pre_reset, ata_std_softreset, hardreset,
|
||||
ata_std_postreset);
|
||||
}
|
||||
|
||||
|
|
@ -593,43 +589,6 @@ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
|
|||
pdc_reset_port(ap);
|
||||
}
|
||||
|
||||
static void pdc_eng_timeout(struct ata_port *ap)
|
||||
{
|
||||
struct ata_host *host = ap->host;
|
||||
u8 drv_stat;
|
||||
struct ata_queued_cmd *qc;
|
||||
unsigned long flags;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
|
||||
switch (qc->tf.protocol) {
|
||||
case ATA_PROT_DMA:
|
||||
case ATA_PROT_NODATA:
|
||||
ata_port_printk(ap, KERN_ERR, "command timeout\n");
|
||||
drv_stat = ata_wait_idle(ap);
|
||||
qc->err_mask |= __ac_err_mask(drv_stat);
|
||||
break;
|
||||
|
||||
default:
|
||||
drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
|
||||
|
||||
ata_port_printk(ap, KERN_ERR,
|
||||
"unknown timeout, cmd 0x%x stat 0x%x\n",
|
||||
qc->tf.command, drv_stat);
|
||||
|
||||
qc->err_mask |= ac_err_mask(drv_stat);
|
||||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
ata_eh_qc_complete(qc);
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
static inline unsigned int pdc_host_intr( struct ata_port *ap,
|
||||
struct ata_queued_cmd *qc)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
|
|
|
|||
|
|
@ -346,6 +346,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
|
|||
struct ata_probe_ent *probe_ent;
|
||||
void __iomem *mmio_base;
|
||||
int rc;
|
||||
u8 cls;
|
||||
|
||||
if (!printed_version++)
|
||||
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
|
||||
|
|
@ -383,9 +384,12 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
|
|||
INIT_LIST_HEAD(&probe_ent->node);
|
||||
|
||||
/*
|
||||
* Due to a bug in the chip, the default cache line size can't be used
|
||||
* Due to a bug in the chip, the default cache line size can't be
|
||||
* used (unless the default is non-zero).
|
||||
*/
|
||||
pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
|
||||
pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls);
|
||||
if (cls == 0x00)
|
||||
pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
|
||||
|
||||
if (pci_enable_msi(pdev) == 0)
|
||||
pci_intx(pdev, 0);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/pci.h>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h> /* for jiffies */
|
||||
#include <linux/mm.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/atmdev.h>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pci.h>
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
|||
|
|
@ -153,7 +153,6 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO, D_SBY, D_DLY, D_SLV};
|
|||
#include <linux/blkpg.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
static DEFINE_SPINLOCK(pd_lock);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
*/
|
||||
|
||||
//#define DEBUG /* uncomment if you want debugging info (pr_debug) */
|
||||
#include <linux/sched.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/bio.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/fs.h>
|
||||
|
|
|
|||
|
|
@ -3553,9 +3553,7 @@ static void cdrom_sysctl_register(void)
|
|||
if (initialized == 1)
|
||||
return;
|
||||
|
||||
cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1);
|
||||
if (cdrom_root_table->ctl_name && cdrom_root_table->child->de)
|
||||
cdrom_root_table->child->de->owner = THIS_MODULE;
|
||||
cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
|
||||
|
||||
/* set the defaults */
|
||||
cdrom_sysctl_settings.autoclose = autoclose;
|
||||
|
|
|
|||
|
|
@ -183,7 +183,6 @@ History:
|
|||
#include <linux/errno.h> /* These include what we really need */
|
||||
#include <linux/delay.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/cdrom.h>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mm.h>
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/fs.h>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
agpgart-y := backend.o frontend.o generic.o isoch.o
|
||||
|
||||
obj-$(CONFIG_AGP) += agpgart.o
|
||||
obj-$(CONFIG_COMPAT) += compat_ioctl.o
|
||||
obj-$(CONFIG_AGP_ALI) += ali-agp.o
|
||||
obj-$(CONFIG_AGP_ATI) += ati-agp.o
|
||||
obj-$(CONFIG_AGP_AMD) += amd-k7-agp.o
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ struct agp_bridge_driver {
|
|||
void (*free_by_type)(struct agp_memory *);
|
||||
void *(*agp_alloc_page)(struct agp_bridge_data *);
|
||||
void (*agp_destroy_page)(void *);
|
||||
int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
|
||||
};
|
||||
|
||||
struct agp_bridge_data {
|
||||
|
|
@ -218,6 +219,7 @@ struct agp_bridge_data {
|
|||
#define I810_PTE_MAIN_UNCACHED 0x00000000
|
||||
#define I810_PTE_LOCAL 0x00000002
|
||||
#define I810_PTE_VALID 0x00000001
|
||||
#define I830_PTE_SYSTEM_CACHED 0x00000006
|
||||
#define I810_SMRAM_MISCC 0x70
|
||||
#define I810_GFX_MEM_WIN_SIZE 0x00010000
|
||||
#define I810_GFX_MEM_WIN_32M 0x00010000
|
||||
|
|
@ -270,8 +272,16 @@ void global_cache_flush(void);
|
|||
void get_agp_version(struct agp_bridge_data *bridge);
|
||||
unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type);
|
||||
int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
|
||||
int type);
|
||||
struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev);
|
||||
|
||||
/* generic functions for user-populated AGP memory types */
|
||||
struct agp_memory *agp_generic_alloc_user(size_t page_count, int type);
|
||||
void agp_alloc_page_array(size_t size, struct agp_memory *mem);
|
||||
void agp_free_page_array(struct agp_memory *mem);
|
||||
|
||||
|
||||
/* generic routines for agp>=3 */
|
||||
int agp3_generic_fetch_size(void);
|
||||
void agp3_generic_tlbflush(struct agp_memory *mem);
|
||||
|
|
@ -288,6 +298,8 @@ extern struct aper_size_info_16 agp3_generic_sizes[];
|
|||
extern int agp_off;
|
||||
extern int agp_try_unsupported_boot;
|
||||
|
||||
long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||
|
||||
/* Chipset independant registers (from AGP Spec) */
|
||||
#define AGP_APBASE 0x10
|
||||
|
||||
|
|
|
|||
|
|
@ -214,6 +214,7 @@ static struct agp_bridge_driver ali_generic_bridge = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = ali_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver ali_m1541_bridge = {
|
||||
|
|
@ -237,6 +238,7 @@ static struct agp_bridge_driver ali_m1541_bridge = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = m1541_alloc_page,
|
||||
.agp_destroy_page = m1541_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,9 @@ static int alpha_core_agp_insert_memory(struct agp_memory *mem, off_t pg_start,
|
|||
int num_entries, status;
|
||||
void *temp;
|
||||
|
||||
if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
|
||||
return -EINVAL;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_FIX(temp)->num_entries;
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
|
|
@ -142,6 +145,7 @@ struct agp_bridge_driver alpha_core_agp_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
struct agp_bridge_data *alpha_bridge;
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@ static struct agp_bridge_driver amd_irongate_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_device_ids amd_agp_device_ids[] __devinitdata =
|
||||
|
|
|
|||
|
|
@ -62,12 +62,18 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
{
|
||||
int i, j, num_entries;
|
||||
long long tmp;
|
||||
int mask_type;
|
||||
struct agp_bridge_data *bridge = mem->bridge;
|
||||
u32 pte;
|
||||
|
||||
num_entries = agp_num_entries();
|
||||
|
||||
if (type != 0 || mem->type != 0)
|
||||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
|
||||
if (mask_type != 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
/* Make sure we can fit the range in the gatt table. */
|
||||
/* FIXME: could wrap */
|
||||
|
|
@ -90,7 +96,7 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
tmp = agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type);
|
||||
mem->memory[i], mask_type);
|
||||
|
||||
BUG_ON(tmp & 0xffffff0000000ffcULL);
|
||||
pte = (tmp & 0x000000ff00000000ULL) >> 28;
|
||||
|
|
@ -247,6 +253,7 @@ static struct agp_bridge_driver amd_8151_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
/* Some basic sanity checks for the aperture. */
|
||||
|
|
|
|||
|
|
@ -431,6 +431,7 @@ static struct agp_bridge_driver ati_generic_bridge = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
* fix some real stupidity. It's only by chance we can bump
|
||||
* past 0.99 at all due to some boolean logic error. */
|
||||
#define AGPGART_VERSION_MAJOR 0
|
||||
#define AGPGART_VERSION_MINOR 101
|
||||
#define AGPGART_VERSION_MINOR 102
|
||||
static const struct agp_version agp_current_version =
|
||||
{
|
||||
.major = AGPGART_VERSION_MAJOR,
|
||||
|
|
|
|||
282
drivers/char/agp/compat_ioctl.c
Normal file
282
drivers/char/agp/compat_ioctl.c
Normal file
|
|
@ -0,0 +1,282 @@
|
|||
/*
|
||||
* AGPGART driver frontend compatibility ioctls
|
||||
* Copyright (C) 2004 Silicon Graphics, Inc.
|
||||
* Copyright (C) 2002-2003 Dave Jones
|
||||
* Copyright (C) 1999 Jeff Hartmann
|
||||
* Copyright (C) 1999 Precision Insight, Inc.
|
||||
* Copyright (C) 1999 Xi Graphics, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/agpgart.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "agp.h"
|
||||
#include "compat_ioctl.h"
|
||||
|
||||
static int compat_agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_info32 userinfo;
|
||||
struct agp_kern_info kerninfo;
|
||||
|
||||
agp_copy_info(agp_bridge, &kerninfo);
|
||||
|
||||
userinfo.version.major = kerninfo.version.major;
|
||||
userinfo.version.minor = kerninfo.version.minor;
|
||||
userinfo.bridge_id = kerninfo.device->vendor |
|
||||
(kerninfo.device->device << 16);
|
||||
userinfo.agp_mode = kerninfo.mode;
|
||||
userinfo.aper_base = (compat_long_t)kerninfo.aper_base;
|
||||
userinfo.aper_size = kerninfo.aper_size;
|
||||
userinfo.pg_total = userinfo.pg_system = kerninfo.max_memory;
|
||||
userinfo.pg_used = kerninfo.current_memory;
|
||||
|
||||
if (copy_to_user(arg, &userinfo, sizeof(userinfo)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compat_agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_region32 ureserve;
|
||||
struct agp_region kreserve;
|
||||
struct agp_client *client;
|
||||
struct agp_file_private *client_priv;
|
||||
|
||||
DBG("");
|
||||
if (copy_from_user(&ureserve, arg, sizeof(ureserve)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((unsigned) ureserve.seg_count >= ~0U/sizeof(struct agp_segment32))
|
||||
return -EFAULT;
|
||||
|
||||
kreserve.pid = ureserve.pid;
|
||||
kreserve.seg_count = ureserve.seg_count;
|
||||
|
||||
client = agp_find_client_by_pid(kreserve.pid);
|
||||
|
||||
if (kreserve.seg_count == 0) {
|
||||
/* remove a client */
|
||||
client_priv = agp_find_private(kreserve.pid);
|
||||
|
||||
if (client_priv != NULL) {
|
||||
set_bit(AGP_FF_IS_CLIENT, &client_priv->access_flags);
|
||||
set_bit(AGP_FF_IS_VALID, &client_priv->access_flags);
|
||||
}
|
||||
if (client == NULL) {
|
||||
/* client is already removed */
|
||||
return 0;
|
||||
}
|
||||
return agp_remove_client(kreserve.pid);
|
||||
} else {
|
||||
struct agp_segment32 *usegment;
|
||||
struct agp_segment *ksegment;
|
||||
int seg;
|
||||
|
||||
if (ureserve.seg_count >= 16384)
|
||||
return -EINVAL;
|
||||
|
||||
usegment = kmalloc(sizeof(*usegment) * ureserve.seg_count, GFP_KERNEL);
|
||||
if (!usegment)
|
||||
return -ENOMEM;
|
||||
|
||||
ksegment = kmalloc(sizeof(*ksegment) * kreserve.seg_count, GFP_KERNEL);
|
||||
if (!ksegment) {
|
||||
kfree(usegment);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (copy_from_user(usegment, (void __user *) ureserve.seg_list,
|
||||
sizeof(*usegment) * ureserve.seg_count)) {
|
||||
kfree(usegment);
|
||||
kfree(ksegment);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
for (seg = 0; seg < ureserve.seg_count; seg++) {
|
||||
ksegment[seg].pg_start = usegment[seg].pg_start;
|
||||
ksegment[seg].pg_count = usegment[seg].pg_count;
|
||||
ksegment[seg].prot = usegment[seg].prot;
|
||||
}
|
||||
|
||||
kfree(usegment);
|
||||
kreserve.seg_list = ksegment;
|
||||
|
||||
if (client == NULL) {
|
||||
/* Create the client and add the segment */
|
||||
client = agp_create_client(kreserve.pid);
|
||||
|
||||
if (client == NULL) {
|
||||
kfree(ksegment);
|
||||
return -ENOMEM;
|
||||
}
|
||||
client_priv = agp_find_private(kreserve.pid);
|
||||
|
||||
if (client_priv != NULL) {
|
||||
set_bit(AGP_FF_IS_CLIENT, &client_priv->access_flags);
|
||||
set_bit(AGP_FF_IS_VALID, &client_priv->access_flags);
|
||||
}
|
||||
}
|
||||
return agp_create_segment(client, &kreserve);
|
||||
}
|
||||
/* Will never really happen */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int compat_agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_memory *memory;
|
||||
struct agp_allocate32 alloc;
|
||||
|
||||
DBG("");
|
||||
if (copy_from_user(&alloc, arg, sizeof(alloc)))
|
||||
return -EFAULT;
|
||||
|
||||
memory = agp_allocate_memory_wrap(alloc.pg_count, alloc.type);
|
||||
|
||||
if (memory == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
alloc.key = memory->key;
|
||||
alloc.physical = memory->physical;
|
||||
|
||||
if (copy_to_user(arg, &alloc, sizeof(alloc))) {
|
||||
agp_free_memory_wrap(memory);
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compat_agpioc_bind_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_bind32 bind_info;
|
||||
struct agp_memory *memory;
|
||||
|
||||
DBG("");
|
||||
if (copy_from_user(&bind_info, arg, sizeof(bind_info)))
|
||||
return -EFAULT;
|
||||
|
||||
memory = agp_find_mem_by_key(bind_info.key);
|
||||
|
||||
if (memory == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return agp_bind_memory(memory, bind_info.pg_start);
|
||||
}
|
||||
|
||||
static int compat_agpioc_unbind_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_memory *memory;
|
||||
struct agp_unbind32 unbind;
|
||||
|
||||
DBG("");
|
||||
if (copy_from_user(&unbind, arg, sizeof(unbind)))
|
||||
return -EFAULT;
|
||||
|
||||
memory = agp_find_mem_by_key(unbind.key);
|
||||
|
||||
if (memory == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return agp_unbind_memory(memory);
|
||||
}
|
||||
|
||||
long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct agp_file_private *curr_priv = file->private_data;
|
||||
int ret_val = -ENOTTY;
|
||||
|
||||
mutex_lock(&(agp_fe.agp_mutex));
|
||||
|
||||
if ((agp_fe.current_controller == NULL) &&
|
||||
(cmd != AGPIOC_ACQUIRE32)) {
|
||||
ret_val = -EINVAL;
|
||||
goto ioctl_out;
|
||||
}
|
||||
if ((agp_fe.backend_acquired != TRUE) &&
|
||||
(cmd != AGPIOC_ACQUIRE32)) {
|
||||
ret_val = -EBUSY;
|
||||
goto ioctl_out;
|
||||
}
|
||||
if (cmd != AGPIOC_ACQUIRE32) {
|
||||
if (!(test_bit(AGP_FF_IS_CONTROLLER, &curr_priv->access_flags))) {
|
||||
ret_val = -EPERM;
|
||||
goto ioctl_out;
|
||||
}
|
||||
/* Use the original pid of the controller,
|
||||
* in case it's threaded */
|
||||
|
||||
if (agp_fe.current_controller->pid != curr_priv->my_pid) {
|
||||
ret_val = -EBUSY;
|
||||
goto ioctl_out;
|
||||
}
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case AGPIOC_INFO32:
|
||||
ret_val = compat_agpioc_info_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_ACQUIRE32:
|
||||
ret_val = agpioc_acquire_wrap(curr_priv);
|
||||
break;
|
||||
|
||||
case AGPIOC_RELEASE32:
|
||||
ret_val = agpioc_release_wrap(curr_priv);
|
||||
break;
|
||||
|
||||
case AGPIOC_SETUP32:
|
||||
ret_val = agpioc_setup_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_RESERVE32:
|
||||
ret_val = compat_agpioc_reserve_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_PROTECT32:
|
||||
ret_val = agpioc_protect_wrap(curr_priv);
|
||||
break;
|
||||
|
||||
case AGPIOC_ALLOCATE32:
|
||||
ret_val = compat_agpioc_allocate_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_DEALLOCATE32:
|
||||
ret_val = agpioc_deallocate_wrap(curr_priv, (int) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_BIND32:
|
||||
ret_val = compat_agpioc_bind_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
|
||||
case AGPIOC_UNBIND32:
|
||||
ret_val = compat_agpioc_unbind_wrap(curr_priv, (void __user *) arg);
|
||||
break;
|
||||
}
|
||||
|
||||
ioctl_out:
|
||||
DBG("ioctl returns %d\n", ret_val);
|
||||
mutex_unlock(&(agp_fe.agp_mutex));
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
105
drivers/char/agp/compat_ioctl.h
Normal file
105
drivers/char/agp/compat_ioctl.h
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Copyright (C) 1999 Jeff Hartmann
|
||||
* Copyright (C) 1999 Precision Insight, Inc.
|
||||
* Copyright (C) 1999 Xi Graphics, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _AGP_COMPAT_IOCTL_H
|
||||
#define _AGP_COMPAT_IOCTL_H
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/agpgart.h>
|
||||
|
||||
#define AGPIOC_INFO32 _IOR (AGPIOC_BASE, 0, compat_uptr_t)
|
||||
#define AGPIOC_ACQUIRE32 _IO (AGPIOC_BASE, 1)
|
||||
#define AGPIOC_RELEASE32 _IO (AGPIOC_BASE, 2)
|
||||
#define AGPIOC_SETUP32 _IOW (AGPIOC_BASE, 3, compat_uptr_t)
|
||||
#define AGPIOC_RESERVE32 _IOW (AGPIOC_BASE, 4, compat_uptr_t)
|
||||
#define AGPIOC_PROTECT32 _IOW (AGPIOC_BASE, 5, compat_uptr_t)
|
||||
#define AGPIOC_ALLOCATE32 _IOWR(AGPIOC_BASE, 6, compat_uptr_t)
|
||||
#define AGPIOC_DEALLOCATE32 _IOW (AGPIOC_BASE, 7, compat_int_t)
|
||||
#define AGPIOC_BIND32 _IOW (AGPIOC_BASE, 8, compat_uptr_t)
|
||||
#define AGPIOC_UNBIND32 _IOW (AGPIOC_BASE, 9, compat_uptr_t)
|
||||
|
||||
struct agp_info32 {
|
||||
struct agp_version version; /* version of the driver */
|
||||
u32 bridge_id; /* bridge vendor/device */
|
||||
u32 agp_mode; /* mode info of bridge */
|
||||
compat_long_t aper_base; /* base of aperture */
|
||||
compat_size_t aper_size; /* size of aperture */
|
||||
compat_size_t pg_total; /* max pages (swap + system) */
|
||||
compat_size_t pg_system; /* max pages (system) */
|
||||
compat_size_t pg_used; /* current pages used */
|
||||
};
|
||||
|
||||
/*
|
||||
* The "prot" down below needs still a "sleep" flag somehow ...
|
||||
*/
|
||||
struct agp_segment32 {
|
||||
compat_off_t pg_start; /* starting page to populate */
|
||||
compat_size_t pg_count; /* number of pages */
|
||||
compat_int_t prot; /* prot flags for mmap */
|
||||
};
|
||||
|
||||
struct agp_region32 {
|
||||
compat_pid_t pid; /* pid of process */
|
||||
compat_size_t seg_count; /* number of segments */
|
||||
struct agp_segment32 *seg_list;
|
||||
};
|
||||
|
||||
struct agp_allocate32 {
|
||||
compat_int_t key; /* tag of allocation */
|
||||
compat_size_t pg_count; /* number of pages */
|
||||
u32 type; /* 0 == normal, other devspec */
|
||||
u32 physical; /* device specific (some devices
|
||||
* need a phys address of the
|
||||
* actual page behind the gatt
|
||||
* table) */
|
||||
};
|
||||
|
||||
struct agp_bind32 {
|
||||
compat_int_t key; /* tag of allocation */
|
||||
compat_off_t pg_start; /* starting page to populate */
|
||||
};
|
||||
|
||||
struct agp_unbind32 {
|
||||
compat_int_t key; /* tag of allocation */
|
||||
u32 priority; /* priority for paging out */
|
||||
};
|
||||
|
||||
extern struct agp_front_data agp_fe;
|
||||
|
||||
int agpioc_acquire_wrap(struct agp_file_private *priv);
|
||||
int agpioc_release_wrap(struct agp_file_private *priv);
|
||||
int agpioc_protect_wrap(struct agp_file_private *priv);
|
||||
int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg);
|
||||
int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg);
|
||||
struct agp_file_private *agp_find_private(pid_t pid);
|
||||
struct agp_client *agp_create_client(pid_t id);
|
||||
int agp_remove_client(pid_t id);
|
||||
int agp_create_segment(struct agp_client *client, struct agp_region *region);
|
||||
void agp_free_memory_wrap(struct agp_memory *memory);
|
||||
struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type);
|
||||
struct agp_memory *agp_find_mem_by_key(int key);
|
||||
struct agp_client *agp_find_client_by_pid(pid_t id);
|
||||
|
||||
#endif /* _AGP_COMPAT_H */
|
||||
|
|
@ -335,6 +335,7 @@ static struct agp_bridge_driver efficeon_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
|
||||
|
|
|
|||
|
|
@ -41,9 +41,9 @@
|
|||
#include <asm/pgtable.h>
|
||||
#include "agp.h"
|
||||
|
||||
static struct agp_front_data agp_fe;
|
||||
struct agp_front_data agp_fe;
|
||||
|
||||
static struct agp_memory *agp_find_mem_by_key(int key)
|
||||
struct agp_memory *agp_find_mem_by_key(int key)
|
||||
{
|
||||
struct agp_memory *curr;
|
||||
|
||||
|
|
@ -159,7 +159,7 @@ static pgprot_t agp_convert_mmap_flags(int prot)
|
|||
return vm_get_page_prot(prot_bits);
|
||||
}
|
||||
|
||||
static int agp_create_segment(struct agp_client *client, struct agp_region *region)
|
||||
int agp_create_segment(struct agp_client *client, struct agp_region *region)
|
||||
{
|
||||
struct agp_segment_priv **ret_seg;
|
||||
struct agp_segment_priv *seg;
|
||||
|
|
@ -211,7 +211,7 @@ static void agp_insert_into_pool(struct agp_memory * temp)
|
|||
|
||||
/* File private list routines */
|
||||
|
||||
static struct agp_file_private *agp_find_private(pid_t pid)
|
||||
struct agp_file_private *agp_find_private(pid_t pid)
|
||||
{
|
||||
struct agp_file_private *curr;
|
||||
|
||||
|
|
@ -266,13 +266,13 @@ static void agp_remove_file_private(struct agp_file_private * priv)
|
|||
* Wrappers for agp_free_memory & agp_allocate_memory
|
||||
* These make sure that internal lists are kept updated.
|
||||
*/
|
||||
static void agp_free_memory_wrap(struct agp_memory *memory)
|
||||
void agp_free_memory_wrap(struct agp_memory *memory)
|
||||
{
|
||||
agp_remove_from_pool(memory);
|
||||
agp_free_memory(memory);
|
||||
}
|
||||
|
||||
static struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
|
||||
struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
|
||||
{
|
||||
struct agp_memory *memory;
|
||||
|
||||
|
|
@ -484,7 +484,7 @@ static struct agp_controller *agp_find_controller_for_client(pid_t id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct agp_client *agp_find_client_by_pid(pid_t id)
|
||||
struct agp_client *agp_find_client_by_pid(pid_t id)
|
||||
{
|
||||
struct agp_client *temp;
|
||||
|
||||
|
|
@ -509,7 +509,7 @@ static void agp_insert_client(struct agp_client *client)
|
|||
agp_fe.current_controller->num_clients++;
|
||||
}
|
||||
|
||||
static struct agp_client *agp_create_client(pid_t id)
|
||||
struct agp_client *agp_create_client(pid_t id)
|
||||
{
|
||||
struct agp_client *new_client;
|
||||
|
||||
|
|
@ -522,7 +522,7 @@ static struct agp_client *agp_create_client(pid_t id)
|
|||
return new_client;
|
||||
}
|
||||
|
||||
static int agp_remove_client(pid_t id)
|
||||
int agp_remove_client(pid_t id)
|
||||
{
|
||||
struct agp_client *client;
|
||||
struct agp_client *prev_client;
|
||||
|
|
@ -746,7 +746,7 @@ static int agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agpioc_acquire_wrap(struct agp_file_private *priv)
|
||||
int agpioc_acquire_wrap(struct agp_file_private *priv)
|
||||
{
|
||||
struct agp_controller *controller;
|
||||
|
||||
|
|
@ -789,14 +789,14 @@ static int agpioc_acquire_wrap(struct agp_file_private *priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agpioc_release_wrap(struct agp_file_private *priv)
|
||||
int agpioc_release_wrap(struct agp_file_private *priv)
|
||||
{
|
||||
DBG("");
|
||||
agp_controller_release_current(agp_fe.current_controller, priv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
|
||||
{
|
||||
struct agp_setup mode;
|
||||
|
||||
|
|
@ -876,7 +876,7 @@ static int agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int agpioc_protect_wrap(struct agp_file_private *priv)
|
||||
int agpioc_protect_wrap(struct agp_file_private *priv)
|
||||
{
|
||||
DBG("");
|
||||
/* This function is not currently implemented */
|
||||
|
|
@ -892,6 +892,9 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
|
|||
if (copy_from_user(&alloc, arg, sizeof(struct agp_allocate)))
|
||||
return -EFAULT;
|
||||
|
||||
if (alloc.type >= AGP_USER_TYPES)
|
||||
return -EINVAL;
|
||||
|
||||
memory = agp_allocate_memory_wrap(alloc.pg_count, alloc.type);
|
||||
|
||||
if (memory == NULL)
|
||||
|
|
@ -907,7 +910,7 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
|
||||
int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
|
||||
{
|
||||
struct agp_memory *memory;
|
||||
|
||||
|
|
@ -1043,6 +1046,9 @@ static const struct file_operations agp_fops =
|
|||
.read = agp_read,
|
||||
.write = agp_write,
|
||||
.ioctl = agp_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = compat_agp_ioctl,
|
||||
#endif
|
||||
.mmap = agp_mmap,
|
||||
.open = agp_open,
|
||||
.release = agp_release,
|
||||
|
|
|
|||
|
|
@ -101,6 +101,63 @@ static int agp_get_key(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use kmalloc if possible for the page list. Otherwise fall back to
|
||||
* vmalloc. This speeds things up and also saves memory for small AGP
|
||||
* regions.
|
||||
*/
|
||||
|
||||
void agp_alloc_page_array(size_t size, struct agp_memory *mem)
|
||||
{
|
||||
mem->memory = NULL;
|
||||
mem->vmalloc_flag = 0;
|
||||
|
||||
if (size <= 2*PAGE_SIZE)
|
||||
mem->memory = kmalloc(size, GFP_KERNEL | __GFP_NORETRY);
|
||||
if (mem->memory == NULL) {
|
||||
mem->memory = vmalloc(size);
|
||||
mem->vmalloc_flag = 1;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(agp_alloc_page_array);
|
||||
|
||||
void agp_free_page_array(struct agp_memory *mem)
|
||||
{
|
||||
if (mem->vmalloc_flag) {
|
||||
vfree(mem->memory);
|
||||
} else {
|
||||
kfree(mem->memory);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(agp_free_page_array);
|
||||
|
||||
|
||||
static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)
|
||||
{
|
||||
struct agp_memory *new;
|
||||
unsigned long alloc_size = num_agp_pages*sizeof(struct page *);
|
||||
|
||||
new = kzalloc(sizeof(struct agp_memory), GFP_KERNEL);
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
||||
new->key = agp_get_key();
|
||||
|
||||
if (new->key < 0) {
|
||||
kfree(new);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
agp_alloc_page_array(alloc_size, new);
|
||||
|
||||
if (new->memory == NULL) {
|
||||
agp_free_key(new->key);
|
||||
kfree(new);
|
||||
return NULL;
|
||||
}
|
||||
new->num_scratch_pages = 0;
|
||||
return new;
|
||||
}
|
||||
|
||||
struct agp_memory *agp_create_memory(int scratch_pages)
|
||||
{
|
||||
|
|
@ -116,7 +173,8 @@ struct agp_memory *agp_create_memory(int scratch_pages)
|
|||
kfree(new);
|
||||
return NULL;
|
||||
}
|
||||
new->memory = vmalloc(PAGE_SIZE * scratch_pages);
|
||||
|
||||
agp_alloc_page_array(PAGE_SIZE * scratch_pages, new);
|
||||
|
||||
if (new->memory == NULL) {
|
||||
agp_free_key(new->key);
|
||||
|
|
@ -124,6 +182,7 @@ struct agp_memory *agp_create_memory(int scratch_pages)
|
|||
return NULL;
|
||||
}
|
||||
new->num_scratch_pages = scratch_pages;
|
||||
new->type = AGP_NORMAL_MEMORY;
|
||||
return new;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_create_memory);
|
||||
|
|
@ -146,6 +205,11 @@ void agp_free_memory(struct agp_memory *curr)
|
|||
if (curr->is_bound == TRUE)
|
||||
agp_unbind_memory(curr);
|
||||
|
||||
if (curr->type >= AGP_USER_TYPES) {
|
||||
agp_generic_free_by_type(curr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (curr->type != 0) {
|
||||
curr->bridge->driver->free_by_type(curr);
|
||||
return;
|
||||
|
|
@ -157,7 +221,7 @@ void agp_free_memory(struct agp_memory *curr)
|
|||
flush_agp_mappings();
|
||||
}
|
||||
agp_free_key(curr->key);
|
||||
vfree(curr->memory);
|
||||
agp_free_page_array(curr);
|
||||
kfree(curr);
|
||||
}
|
||||
EXPORT_SYMBOL(agp_free_memory);
|
||||
|
|
@ -188,6 +252,13 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
|
|||
if ((atomic_read(&bridge->current_memory_agp) + page_count) > bridge->max_memory_agp)
|
||||
return NULL;
|
||||
|
||||
if (type >= AGP_USER_TYPES) {
|
||||
new = agp_generic_alloc_user(page_count, type);
|
||||
if (new)
|
||||
new->bridge = bridge;
|
||||
return new;
|
||||
}
|
||||
|
||||
if (type != 0) {
|
||||
new = bridge->driver->alloc_by_type(page_count, type);
|
||||
if (new)
|
||||
|
|
@ -960,6 +1031,7 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
|||
off_t j;
|
||||
void *temp;
|
||||
struct agp_bridge_data *bridge;
|
||||
int mask_type;
|
||||
|
||||
bridge = mem->bridge;
|
||||
if (!bridge)
|
||||
|
|
@ -995,7 +1067,11 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
|||
num_entries -= agp_memory_reserved/PAGE_SIZE;
|
||||
if (num_entries < 0) num_entries = 0;
|
||||
|
||||
if (type != 0 || mem->type != 0) {
|
||||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
|
||||
if (mask_type != 0) {
|
||||
/* The generic routines know nothing of memory types */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -1018,7 +1094,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
|||
}
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(bridge->driver->mask_memory(bridge, mem->memory[i], mem->type), bridge->gatt_table+j);
|
||||
writel(bridge->driver->mask_memory(bridge, mem->memory[i], mask_type),
|
||||
bridge->gatt_table+j);
|
||||
}
|
||||
readl(bridge->gatt_table+j-1); /* PCI Posting. */
|
||||
|
||||
|
|
@ -1032,6 +1109,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
{
|
||||
size_t i;
|
||||
struct agp_bridge_data *bridge;
|
||||
int mask_type;
|
||||
|
||||
bridge = mem->bridge;
|
||||
if (!bridge)
|
||||
|
|
@ -1040,7 +1118,11 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
|
||||
if (type != 0 || mem->type != 0) {
|
||||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
|
||||
if (mask_type != 0) {
|
||||
/* The generic routines know nothing of memory types */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -1056,22 +1138,40 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
}
|
||||
EXPORT_SYMBOL(agp_generic_remove_memory);
|
||||
|
||||
|
||||
struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_alloc_by_type);
|
||||
|
||||
|
||||
void agp_generic_free_by_type(struct agp_memory *curr)
|
||||
{
|
||||
vfree(curr->memory);
|
||||
agp_free_page_array(curr);
|
||||
agp_free_key(curr->key);
|
||||
kfree(curr);
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_free_by_type);
|
||||
|
||||
struct agp_memory *agp_generic_alloc_user(size_t page_count, int type)
|
||||
{
|
||||
struct agp_memory *new;
|
||||
int i;
|
||||
int pages;
|
||||
|
||||
pages = (page_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE;
|
||||
new = agp_create_user_memory(page_count);
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < page_count; i++)
|
||||
new->memory[i] = 0;
|
||||
new->page_count = 0;
|
||||
new->type = type;
|
||||
new->num_scratch_pages = pages;
|
||||
|
||||
return new;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_alloc_user);
|
||||
|
||||
/*
|
||||
* Basic Page Allocation Routines -
|
||||
|
|
@ -1165,6 +1265,15 @@ unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
|
|||
}
|
||||
EXPORT_SYMBOL(agp_generic_mask_memory);
|
||||
|
||||
int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
|
||||
int type)
|
||||
{
|
||||
if (type >= AGP_USER_TYPES)
|
||||
return 0;
|
||||
return type;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_type_to_mask_type);
|
||||
|
||||
/*
|
||||
* These functions are implemented according to the AGPv3 spec,
|
||||
* which covers implementation details that had previously been
|
||||
|
|
|
|||
|
|
@ -438,6 +438,7 @@ struct agp_bridge_driver hp_zx1_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -293,6 +293,9 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem,
|
|||
pr_debug("i460_insert_memory_small_io_page(mem=%p, pg_start=%ld, type=%d, paddr0=0x%lx)\n",
|
||||
mem, pg_start, type, mem->memory[0]);
|
||||
|
||||
if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
|
||||
return -EINVAL;
|
||||
|
||||
io_pg_start = I460_IOPAGES_PER_KPAGE * pg_start;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
|
|
@ -396,6 +399,9 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem,
|
|||
struct lp_desc *start, *end, *lp;
|
||||
void *temp;
|
||||
|
||||
if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
|
||||
return -EINVAL;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_8(temp)->num_entries;
|
||||
|
||||
|
|
@ -572,6 +578,7 @@ struct agp_bridge_driver intel_i460_driver = {
|
|||
#endif
|
||||
.alloc_by_type = agp_generic_alloc_by_type,
|
||||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/agp_backend.h>
|
||||
#include "agp.h"
|
||||
|
|
@ -24,6 +25,9 @@
|
|||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
|
||||
|
||||
|
||||
extern int agp_memory_reserved;
|
||||
|
||||
|
||||
/* Intel 815 register */
|
||||
#define INTEL_815_APCONT 0x51
|
||||
#define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF
|
||||
|
|
@ -68,12 +72,15 @@ static struct aper_size_info_fixed intel_i810_sizes[] =
|
|||
|
||||
#define AGP_DCACHE_MEMORY 1
|
||||
#define AGP_PHYS_MEMORY 2
|
||||
#define INTEL_AGP_CACHED_MEMORY 3
|
||||
|
||||
static struct gatt_mask intel_i810_masks[] =
|
||||
{
|
||||
{.mask = I810_PTE_VALID, .type = 0},
|
||||
{.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
|
||||
{.mask = I810_PTE_VALID, .type = 0}
|
||||
{.mask = I810_PTE_VALID, .type = 0},
|
||||
{.mask = I810_PTE_VALID | I830_PTE_SYSTEM_CACHED,
|
||||
.type = INTEL_AGP_CACHED_MEMORY}
|
||||
};
|
||||
|
||||
static struct _intel_i810_private {
|
||||
|
|
@ -117,13 +124,15 @@ static int intel_i810_configure(void)
|
|||
|
||||
current_size = A_SIZE_FIX(agp_bridge->current_size);
|
||||
|
||||
pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
|
||||
temp &= 0xfff80000;
|
||||
|
||||
intel_i810_private.registers = ioremap(temp, 128 * 4096);
|
||||
if (!intel_i810_private.registers) {
|
||||
printk(KERN_ERR PFX "Unable to remap memory.\n");
|
||||
return -ENOMEM;
|
||||
pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
|
||||
temp &= 0xfff80000;
|
||||
|
||||
intel_i810_private.registers = ioremap(temp, 128 * 4096);
|
||||
if (!intel_i810_private.registers) {
|
||||
printk(KERN_ERR PFX "Unable to remap memory.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
if ((readl(intel_i810_private.registers+I810_DRAM_CTL)
|
||||
|
|
@ -201,62 +210,79 @@ static void i8xx_destroy_pages(void *addr)
|
|||
atomic_dec(&agp_bridge->current_memory_agp);
|
||||
}
|
||||
|
||||
static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
|
||||
int type)
|
||||
{
|
||||
if (type < AGP_USER_TYPES)
|
||||
return type;
|
||||
else if (type == AGP_USER_CACHED_MEMORY)
|
||||
return INTEL_AGP_CACHED_MEMORY;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
|
||||
int type)
|
||||
{
|
||||
int i, j, num_entries;
|
||||
void *temp;
|
||||
int ret = -EINVAL;
|
||||
int mask_type;
|
||||
|
||||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_FIX(temp)->num_entries;
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
goto out_err;
|
||||
|
||||
|
||||
for (j = pg_start; j < (pg_start + mem->page_count); j++) {
|
||||
if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j)))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (type != 0 || mem->type != 0) {
|
||||
if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) {
|
||||
/* special insert */
|
||||
if (!mem->is_flushed) {
|
||||
global_cache_flush();
|
||||
mem->is_flushed = TRUE;
|
||||
}
|
||||
|
||||
for (i = pg_start; i < (pg_start + mem->page_count); i++) {
|
||||
writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4));
|
||||
}
|
||||
readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */
|
||||
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
|
||||
ret = -EBUSY;
|
||||
goto out_err;
|
||||
}
|
||||
if ((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY))
|
||||
goto insert;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
insert:
|
||||
if (!mem->is_flushed) {
|
||||
global_cache_flush();
|
||||
mem->is_flushed = TRUE;
|
||||
}
|
||||
if (type != mem->type)
|
||||
goto out_err;
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type),
|
||||
intel_i810_private.registers+I810_PTE_BASE+(j*4));
|
||||
mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
|
||||
|
||||
switch (mask_type) {
|
||||
case AGP_DCACHE_MEMORY:
|
||||
if (!mem->is_flushed)
|
||||
global_cache_flush();
|
||||
for (i = pg_start; i < (pg_start + mem->page_count); i++) {
|
||||
writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
|
||||
intel_i810_private.registers+I810_PTE_BASE+(i*4));
|
||||
}
|
||||
readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4));
|
||||
break;
|
||||
case AGP_PHYS_MEMORY:
|
||||
case AGP_NORMAL_MEMORY:
|
||||
if (!mem->is_flushed)
|
||||
global_cache_flush();
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i],
|
||||
mask_type),
|
||||
intel_i810_private.registers+I810_PTE_BASE+(j*4));
|
||||
}
|
||||
readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4));
|
||||
break;
|
||||
default:
|
||||
goto out_err;
|
||||
}
|
||||
readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4)); /* PCI Posting. */
|
||||
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
out:
|
||||
ret = 0;
|
||||
out_err:
|
||||
mem->is_flushed = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
|
||||
|
|
@ -337,12 +363,11 @@ static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
|
|||
new->type = AGP_DCACHE_MEMORY;
|
||||
new->page_count = pg_count;
|
||||
new->num_scratch_pages = 0;
|
||||
vfree(new->memory);
|
||||
agp_free_page_array(new);
|
||||
return new;
|
||||
}
|
||||
if (type == AGP_PHYS_MEMORY)
|
||||
return alloc_agpphysmem_i8xx(pg_count, type);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -357,7 +382,7 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
|
|||
gart_to_virt(curr->memory[0]));
|
||||
global_flush_tlb();
|
||||
}
|
||||
vfree(curr->memory);
|
||||
agp_free_page_array(curr);
|
||||
}
|
||||
kfree(curr);
|
||||
}
|
||||
|
|
@ -619,9 +644,11 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
|
|||
{
|
||||
int i,j,num_entries;
|
||||
void *temp;
|
||||
int ret = -EINVAL;
|
||||
int mask_type;
|
||||
|
||||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_FIX(temp)->num_entries;
|
||||
|
|
@ -631,34 +658,41 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
|
|||
pg_start,intel_i830_private.gtt_entries);
|
||||
|
||||
printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
|
||||
return -EINVAL;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
goto out_err;
|
||||
|
||||
/* The i830 can't check the GTT for entries since its read only,
|
||||
* depend on the caller to make the correct offset decisions.
|
||||
*/
|
||||
|
||||
if ((type != 0 && type != AGP_PHYS_MEMORY) ||
|
||||
(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
|
||||
return -EINVAL;
|
||||
if (type != mem->type)
|
||||
goto out_err;
|
||||
|
||||
if (!mem->is_flushed) {
|
||||
mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
|
||||
|
||||
if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
|
||||
mask_type != INTEL_AGP_CACHED_MEMORY)
|
||||
goto out_err;
|
||||
|
||||
if (!mem->is_flushed)
|
||||
global_cache_flush();
|
||||
mem->is_flushed = TRUE;
|
||||
}
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type),
|
||||
intel_i830_private.registers+I810_PTE_BASE+(j*4));
|
||||
mem->memory[i], mask_type),
|
||||
intel_i830_private.registers+I810_PTE_BASE+(j*4));
|
||||
}
|
||||
readl(intel_i830_private.registers+I810_PTE_BASE+((j-1)*4));
|
||||
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
|
||||
out:
|
||||
ret = 0;
|
||||
out_err:
|
||||
mem->is_flushed = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
|
||||
|
|
@ -687,7 +721,6 @@ static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
|
|||
{
|
||||
if (type == AGP_PHYS_MEMORY)
|
||||
return alloc_agpphysmem_i8xx(pg_count, type);
|
||||
|
||||
/* always return NULL for other allocation types for now */
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -734,9 +767,11 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
|
|||
{
|
||||
int i,j,num_entries;
|
||||
void *temp;
|
||||
int ret = -EINVAL;
|
||||
int mask_type;
|
||||
|
||||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_FIX(temp)->num_entries;
|
||||
|
|
@ -746,33 +781,41 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
|
|||
pg_start,intel_i830_private.gtt_entries);
|
||||
|
||||
printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
|
||||
return -EINVAL;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
goto out_err;
|
||||
|
||||
/* The i830 can't check the GTT for entries since its read only,
|
||||
/* The i915 can't check the GTT for entries since its read only,
|
||||
* depend on the caller to make the correct offset decisions.
|
||||
*/
|
||||
|
||||
if ((type != 0 && type != AGP_PHYS_MEMORY) ||
|
||||
(mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
|
||||
return -EINVAL;
|
||||
if (type != mem->type)
|
||||
goto out_err;
|
||||
|
||||
if (!mem->is_flushed) {
|
||||
mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
|
||||
|
||||
if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
|
||||
mask_type != INTEL_AGP_CACHED_MEMORY)
|
||||
goto out_err;
|
||||
|
||||
if (!mem->is_flushed)
|
||||
global_cache_flush();
|
||||
mem->is_flushed = TRUE;
|
||||
}
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type), intel_i830_private.gtt+j);
|
||||
mem->memory[i], mask_type), intel_i830_private.gtt+j);
|
||||
}
|
||||
readl(intel_i830_private.gtt+j-1);
|
||||
|
||||
readl(intel_i830_private.gtt+j-1);
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
|
||||
out:
|
||||
ret = 0;
|
||||
out_err:
|
||||
mem->is_flushed = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
|
||||
|
|
@ -803,7 +846,7 @@ static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
|
|||
*/
|
||||
static int intel_i9xx_fetch_size(void)
|
||||
{
|
||||
int num_sizes = sizeof(intel_i830_sizes) / sizeof(*intel_i830_sizes);
|
||||
int num_sizes = ARRAY_SIZE(intel_i830_sizes);
|
||||
int aper_size; /* size in megabytes */
|
||||
int i;
|
||||
|
||||
|
|
@ -1384,6 +1427,7 @@ static struct agp_bridge_driver intel_generic_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_810_driver = {
|
||||
|
|
@ -1408,6 +1452,7 @@ static struct agp_bridge_driver intel_810_driver = {
|
|||
.free_by_type = intel_i810_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_815_driver = {
|
||||
|
|
@ -1431,6 +1476,7 @@ static struct agp_bridge_driver intel_815_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_830_driver = {
|
||||
|
|
@ -1455,6 +1501,7 @@ static struct agp_bridge_driver intel_830_driver = {
|
|||
.free_by_type = intel_i810_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = intel_i830_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_820_driver = {
|
||||
|
|
@ -1478,6 +1525,7 @@ static struct agp_bridge_driver intel_820_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_830mp_driver = {
|
||||
|
|
@ -1501,6 +1549,7 @@ static struct agp_bridge_driver intel_830mp_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_840_driver = {
|
||||
|
|
@ -1524,6 +1573,7 @@ static struct agp_bridge_driver intel_840_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_845_driver = {
|
||||
|
|
@ -1547,6 +1597,7 @@ static struct agp_bridge_driver intel_845_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_850_driver = {
|
||||
|
|
@ -1570,6 +1621,7 @@ static struct agp_bridge_driver intel_850_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_860_driver = {
|
||||
|
|
@ -1593,6 +1645,7 @@ static struct agp_bridge_driver intel_860_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_915_driver = {
|
||||
|
|
@ -1617,6 +1670,7 @@ static struct agp_bridge_driver intel_915_driver = {
|
|||
.free_by_type = intel_i810_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = intel_i830_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_i965_driver = {
|
||||
|
|
@ -1641,6 +1695,7 @@ static struct agp_bridge_driver intel_i965_driver = {
|
|||
.free_by_type = intel_i810_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = intel_i830_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver intel_7505_driver = {
|
||||
|
|
@ -1664,6 +1719,7 @@ static struct agp_bridge_driver intel_7505_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static int find_i810(u16 device)
|
||||
|
|
|
|||
|
|
@ -310,6 +310,7 @@ static struct agp_bridge_driver nvidia_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static int __devinit agp_nvidia_probe(struct pci_dev *pdev,
|
||||
|
|
|
|||
|
|
@ -228,6 +228,7 @@ struct agp_bridge_driver parisc_agp_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -265,6 +265,7 @@ struct agp_bridge_driver sgi_tioca_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = sgi_tioca_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
.needs_scratch_page = 0,
|
||||
.num_aperture_sizes = 1,
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ static struct agp_bridge_driver sis_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_device_ids sis_agp_device_ids[] __devinitdata =
|
||||
|
|
|
|||
|
|
@ -444,6 +444,7 @@ static struct agp_bridge_driver sworks_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
|
||||
|
|
|
|||
|
|
@ -510,6 +510,7 @@ struct agp_bridge_driver uninorth_agp_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
};
|
||||
|
||||
|
|
@ -534,6 +535,7 @@ struct agp_bridge_driver u3_agp_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
.cant_use_aperture = 1,
|
||||
.needs_scratch_page = 1,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -191,6 +191,7 @@ static struct agp_bridge_driver via_agp3_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_bridge_driver via_driver = {
|
||||
|
|
@ -214,6 +215,7 @@ static struct agp_bridge_driver via_driver = {
|
|||
.free_by_type = agp_generic_free_by_type,
|
||||
.agp_alloc_page = agp_generic_alloc_page,
|
||||
.agp_destroy_page = agp_generic_destroy_page,
|
||||
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
|
||||
};
|
||||
|
||||
static struct agp_device_ids via_agp_device_ids[] __devinitdata =
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
* for authors.
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <asm/upa.h>
|
||||
|
||||
#include "ffb.h"
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
#include "ffb_drv.h"
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <asm/shmparam.h>
|
||||
#include <asm/oplib.h>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
* thermometer driver (as used in the Rebel.com NetWinder)
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/delay.h>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h> /* for kmalloc() and kfree() */
|
||||
#include <linux/sched.h> /* for struct wait_queue etc */
|
||||
#include <linux/major.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ __setup("hcheck_reboot", hangcheck_parse_reboot);
|
|||
__setup("hcheck_dump_tasks", hangcheck_parse_dump_tasks);
|
||||
#endif /* not MODULE */
|
||||
|
||||
#if defined(CONFIG_X86_64) || defined(CONFIG_S390)
|
||||
#if defined(CONFIG_S390)
|
||||
# define HAVE_MONOTONIC
|
||||
# define TIMER_FREQ 1000000000ULL
|
||||
#elif defined(CONFIG_IA64)
|
||||
|
|
|
|||
|
|
@ -703,7 +703,7 @@ int hpet_control(struct hpet_task *tp, unsigned int cmd, unsigned long arg)
|
|||
|
||||
static ctl_table hpet_table[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.ctl_name = CTL_UNNUMBERED,
|
||||
.procname = "max-user-freq",
|
||||
.data = &hpet_max_freq,
|
||||
.maxlen = sizeof(int),
|
||||
|
|
@ -715,7 +715,7 @@ static ctl_table hpet_table[] = {
|
|||
|
||||
static ctl_table hpet_root[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.ctl_name = CTL_UNNUMBERED,
|
||||
.procname = "hpet",
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
|
|
@ -1018,7 +1018,7 @@ static int __init hpet_init(void)
|
|||
if (result < 0)
|
||||
return -ENODEV;
|
||||
|
||||
sysctl_header = register_sysctl_table(dev_root, 0);
|
||||
sysctl_header = register_sysctl_table(dev_root);
|
||||
|
||||
result = acpi_bus_register_driver(&hpet_acpi_driver);
|
||||
if (result < 0) {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/tty.h>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mutex.h>
|
||||
|
|
|
|||
|
|
@ -686,7 +686,7 @@ static int ipmi_poweroff_init (void)
|
|||
printk(KERN_INFO PFX "Power cycle is enabled.\n");
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
ipmi_table_header = register_sysctl_table(ipmi_root_table, 1);
|
||||
ipmi_table_header = register_sysctl_table(ipmi_root_table);
|
||||
if (!ipmi_table_header) {
|
||||
printk(KERN_ERR PFX "Unable to register powercycle sysctl\n");
|
||||
rv = -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -596,7 +596,6 @@ static void fn_spawn_con(struct vc_data *vc)
|
|||
static void fn_SAK(struct vc_data *vc)
|
||||
{
|
||||
struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
|
||||
PREPARE_WORK(SAK_work, vc_SAK);
|
||||
schedule_work(SAK_work);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#define NVRAM_VERSION "1.2"
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/nvram.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/rwsem.h>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
#include <linux/module.h> /* For EXPORT_SYMBOL */
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/tty_flip.h>
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ irqreturn_t rtc_interrupt(int irq, void *dev_id)
|
|||
*/
|
||||
static ctl_table rtc_table[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.ctl_name = CTL_UNNUMBERED,
|
||||
.procname = "max-user-freq",
|
||||
.data = &rtc_max_user_freq,
|
||||
.maxlen = sizeof(int),
|
||||
|
|
@ -294,9 +294,8 @@ static ctl_table rtc_table[] = {
|
|||
|
||||
static ctl_table rtc_root[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.ctl_name = CTL_UNNUMBERED,
|
||||
.procname = "rtc",
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = rtc_table,
|
||||
},
|
||||
|
|
@ -307,7 +306,6 @@ static ctl_table dev_root[] = {
|
|||
{
|
||||
.ctl_name = CTL_DEV,
|
||||
.procname = "dev",
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = rtc_root,
|
||||
},
|
||||
|
|
@ -318,7 +316,7 @@ static struct ctl_table_header *sysctl_header;
|
|||
|
||||
static int __init init_sysctl(void)
|
||||
{
|
||||
sysctl_header = register_sysctl_table(dev_root, 0);
|
||||
sysctl_header = register_sysctl_table(dev_root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@
|
|||
#include <linux/module.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/miscdevice.h>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/hrtimer.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
|
@ -89,7 +90,6 @@ static struct sysrq_key_op sysrq_loglevel_op = {
|
|||
static void sysrq_handle_SAK(int key, struct tty_struct *tty)
|
||||
{
|
||||
struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
|
||||
PREPARE_WORK(SAK_work, vc_SAK);
|
||||
schedule_work(SAK_work);
|
||||
}
|
||||
static struct sysrq_key_op sysrq_SAK_op = {
|
||||
|
|
@ -159,6 +159,17 @@ static struct sysrq_key_op sysrq_sync_op = {
|
|||
.enable_mask = SYSRQ_ENABLE_SYNC,
|
||||
};
|
||||
|
||||
static void sysrq_handle_show_timers(int key, struct tty_struct *tty)
|
||||
{
|
||||
sysrq_timer_list_show();
|
||||
}
|
||||
|
||||
static struct sysrq_key_op sysrq_show_timers_op = {
|
||||
.handler = sysrq_handle_show_timers,
|
||||
.help_msg = "show-all-timers(Q)",
|
||||
.action_msg = "Show Pending Timers",
|
||||
};
|
||||
|
||||
static void sysrq_handle_mountro(int key, struct tty_struct *tty)
|
||||
{
|
||||
emergency_remount();
|
||||
|
|
@ -336,7 +347,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
|
|||
/* o: This will often be registered as 'Off' at init time */
|
||||
NULL, /* o */
|
||||
&sysrq_showregs_op, /* p */
|
||||
NULL, /* q */
|
||||
&sysrq_show_timers_op, /* q */
|
||||
&sysrq_unraw_op, /* r */
|
||||
&sysrq_sync_op, /* s */
|
||||
&sysrq_showstate_op, /* t */
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h> /* printk() */
|
||||
#include <linux/fs.h> /* everything... */
|
||||
#include <linux/errno.h> /* error codes */
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/miscdevice.h>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include "tpm.h"
|
||||
|
|
|
|||
|
|
@ -3442,7 +3442,6 @@ void do_SAK(struct tty_struct *tty)
|
|||
{
|
||||
if (!tty)
|
||||
return;
|
||||
PREPARE_WORK(&tty->SAK_work, do_SAK_work);
|
||||
schedule_work(&tty->SAK_work);
|
||||
}
|
||||
|
||||
|
|
@ -3568,7 +3567,7 @@ static void initialize_tty_struct(struct tty_struct *tty)
|
|||
mutex_init(&tty->atomic_write_lock);
|
||||
spin_lock_init(&tty->read_lock);
|
||||
INIT_LIST_HEAD(&tty->tty_files);
|
||||
INIT_WORK(&tty->SAK_work, NULL);
|
||||
INIT_WORK(&tty->SAK_work, do_SAK_work);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
#include <linux/major.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/kdev_t.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
|||
|
|
@ -2635,6 +2635,7 @@ static int __init con_init(void)
|
|||
*/
|
||||
for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
|
||||
vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));
|
||||
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
||||
visual_init(vc, currcons, 1);
|
||||
vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
|
||||
vc->vc_kmalloced = 0;
|
||||
|
|
|
|||
|
|
@ -48,46 +48,52 @@
|
|||
* It can be 1, 2, 10, 20, 110 or 220 seconds.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/watchdog.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/init.h>
|
||||
/*
|
||||
* Includes, defines, variables, module parameters, ...
|
||||
*/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
/* Includes */
|
||||
#include <linux/module.h> /* For module specific items */
|
||||
#include <linux/moduleparam.h> /* For new moduleparam's */
|
||||
#include <linux/types.h> /* For standard types (like size_t) */
|
||||
#include <linux/errno.h> /* For the -ENODEV/... values */
|
||||
#include <linux/kernel.h> /* For printk/panic/... */
|
||||
#include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
|
||||
#include <linux/watchdog.h> /* For the watchdog specific items */
|
||||
#include <linux/fs.h> /* For file operations */
|
||||
#include <linux/ioport.h> /* For io-port access */
|
||||
#include <linux/platform_device.h> /* For platform_driver framework */
|
||||
#include <linux/init.h> /* For __init/__exit/... */
|
||||
|
||||
#include <asm/uaccess.h> /* For copy_to_user/put_user/... */
|
||||
#include <asm/io.h> /* For inb/outb/... */
|
||||
|
||||
/* Module information */
|
||||
#define DRV_NAME "acquirewdt"
|
||||
#define PFX DRV_NAME ": "
|
||||
#define WATCHDOG_NAME "Acquire WDT"
|
||||
#define PFX WATCHDOG_NAME ": "
|
||||
#define WATCHDOG_HEARTBEAT 0 /* There is no way to see what the correct time-out period is */
|
||||
|
||||
/* internal variables */
|
||||
static struct platform_device *acq_platform_device; /* the watchdog platform device */
|
||||
static unsigned long acq_is_open;
|
||||
static char expect_close;
|
||||
|
||||
/*
|
||||
* You must set these - there is no sane way to probe for this board.
|
||||
*/
|
||||
|
||||
static int wdt_stop = 0x43;
|
||||
/* module parameters */
|
||||
static int wdt_stop = 0x43; /* You must set this - there is no sane way to probe for this board. */
|
||||
module_param(wdt_stop, int, 0);
|
||||
MODULE_PARM_DESC(wdt_stop, "Acquire WDT 'stop' io port (default 0x43)");
|
||||
|
||||
static int wdt_start = 0x443;
|
||||
static int wdt_start = 0x443; /* You must set this - there is no sane way to probe for this board. */
|
||||
module_param(wdt_start, int, 0);
|
||||
MODULE_PARM_DESC(wdt_start, "Acquire WDT 'start' io port (default 0x443)");
|
||||
|
||||
static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
module_param(nowayout, int, 0);
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
|
||||
/*
|
||||
* Kernel methods.
|
||||
* Watchdog Operations
|
||||
*/
|
||||
|
||||
static void acq_keepalive(void)
|
||||
|
|
@ -103,7 +109,7 @@ static void acq_stop(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* /dev/watchdog handling.
|
||||
* /dev/watchdog handling
|
||||
*/
|
||||
|
||||
static ssize_t acq_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
|
||||
|
|
@ -143,7 +149,7 @@ static int acq_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
{
|
||||
.options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
|
||||
.firmware_version = 1,
|
||||
.identity = "Acquire WDT",
|
||||
.identity = WATCHDOG_NAME,
|
||||
};
|
||||
|
||||
switch(cmd)
|
||||
|
|
@ -213,20 +219,6 @@ static int acq_close(struct inode *inode, struct file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Notifier for system down
|
||||
*/
|
||||
|
||||
static int acq_notify_sys(struct notifier_block *this, unsigned long code,
|
||||
void *unused)
|
||||
{
|
||||
if(code==SYS_DOWN || code==SYS_HALT) {
|
||||
/* Turn the WDT off */
|
||||
acq_stop();
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Kernel Interfaces
|
||||
*/
|
||||
|
|
@ -240,29 +232,20 @@ static const struct file_operations acq_fops = {
|
|||
.release = acq_close,
|
||||
};
|
||||
|
||||
static struct miscdevice acq_miscdev=
|
||||
{
|
||||
.minor = WATCHDOG_MINOR,
|
||||
.name = "watchdog",
|
||||
.fops = &acq_fops,
|
||||
static struct miscdevice acq_miscdev = {
|
||||
.minor = WATCHDOG_MINOR,
|
||||
.name = "watchdog",
|
||||
.fops = &acq_fops,
|
||||
};
|
||||
|
||||
/*
|
||||
* The WDT card needs to learn about soft shutdowns in order to
|
||||
* turn the timebomb registers off.
|
||||
* Init & exit routines
|
||||
*/
|
||||
|
||||
static struct notifier_block acq_notifier =
|
||||
{
|
||||
.notifier_call = acq_notify_sys,
|
||||
};
|
||||
|
||||
static int __init acq_init(void)
|
||||
static int __devinit acq_probe(struct platform_device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk(KERN_INFO "WDT driver for Acquire single board computer initialising.\n");
|
||||
|
||||
if (wdt_stop != wdt_start) {
|
||||
if (!request_region(wdt_stop, 1, WATCHDOG_NAME)) {
|
||||
printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
|
||||
|
|
@ -279,18 +262,11 @@ static int __init acq_init(void)
|
|||
goto unreg_stop;
|
||||
}
|
||||
|
||||
ret = register_reboot_notifier(&acq_notifier);
|
||||
if (ret != 0) {
|
||||
printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
|
||||
ret);
|
||||
goto unreg_regions;
|
||||
}
|
||||
|
||||
ret = misc_register(&acq_miscdev);
|
||||
if (ret != 0) {
|
||||
printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
|
||||
WATCHDOG_MINOR, ret);
|
||||
goto unreg_reboot;
|
||||
goto unreg_regions;
|
||||
}
|
||||
|
||||
printk (KERN_INFO PFX "initialized. (nowayout=%d)\n",
|
||||
|
|
@ -298,8 +274,6 @@ static int __init acq_init(void)
|
|||
|
||||
return 0;
|
||||
|
||||
unreg_reboot:
|
||||
unregister_reboot_notifier(&acq_notifier);
|
||||
unreg_regions:
|
||||
release_region(wdt_start, 1);
|
||||
unreg_stop:
|
||||
|
|
@ -309,13 +283,60 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __exit acq_exit(void)
|
||||
static int __devexit acq_remove(struct platform_device *dev)
|
||||
{
|
||||
misc_deregister(&acq_miscdev);
|
||||
unregister_reboot_notifier(&acq_notifier);
|
||||
release_region(wdt_start,1);
|
||||
if(wdt_stop != wdt_start)
|
||||
release_region(wdt_stop,1);
|
||||
release_region(wdt_start,1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acq_shutdown(struct platform_device *dev)
|
||||
{
|
||||
/* Turn the WDT off if we have a soft shutdown */
|
||||
acq_stop();
|
||||
}
|
||||
|
||||
static struct platform_driver acquirewdt_driver = {
|
||||
.probe = acq_probe,
|
||||
.remove = __devexit_p(acq_remove),
|
||||
.shutdown = acq_shutdown,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = DRV_NAME,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init acq_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
printk(KERN_INFO "WDT driver for Acquire single board computer initialising.\n");
|
||||
|
||||
err = platform_driver_register(&acquirewdt_driver);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
acq_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
|
||||
if (IS_ERR(acq_platform_device)) {
|
||||
err = PTR_ERR(acq_platform_device);
|
||||
goto unreg_platform_driver;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
unreg_platform_driver:
|
||||
platform_driver_unregister(&acquirewdt_driver);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit acq_exit(void)
|
||||
{
|
||||
platform_device_unregister(acq_platform_device);
|
||||
platform_driver_unregister(&acquirewdt_driver);
|
||||
printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
|
||||
}
|
||||
|
||||
module_init(acq_init);
|
||||
|
|
|
|||
|
|
@ -35,18 +35,19 @@
|
|||
#include <linux/watchdog.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define DRV_NAME "advantechwdt"
|
||||
#define PFX DRV_NAME ": "
|
||||
#define WATCHDOG_NAME "Advantech WDT"
|
||||
#define PFX WATCHDOG_NAME ": "
|
||||
#define WATCHDOG_TIMEOUT 60 /* 60 sec default timeout */
|
||||
|
||||
static struct platform_device *advwdt_platform_device; /* the watchdog platform device */
|
||||
static unsigned long advwdt_is_open;
|
||||
static char adv_expect_close;
|
||||
|
||||
|
|
@ -75,10 +76,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, defaul
|
|||
|
||||
static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
module_param(nowayout, int, 0);
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
|
||||
/*
|
||||
* Kernel methods.
|
||||
* Watchdog Operations
|
||||
*/
|
||||
|
||||
static void
|
||||
|
|
@ -94,6 +95,20 @@ advwdt_disable(void)
|
|||
inb_p(wdt_stop);
|
||||
}
|
||||
|
||||
static int
|
||||
advwdt_set_heartbeat(int t)
|
||||
{
|
||||
if ((t < 1) || (t > 63))
|
||||
return -EINVAL;
|
||||
|
||||
timeout = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* /dev/watchdog handling
|
||||
*/
|
||||
|
||||
static ssize_t
|
||||
advwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
|
|
@ -126,7 +141,7 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
static struct watchdog_info ident = {
|
||||
.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
|
||||
.firmware_version = 1,
|
||||
.identity = "Advantech WDT",
|
||||
.identity = WATCHDOG_NAME,
|
||||
};
|
||||
|
||||
switch (cmd) {
|
||||
|
|
@ -146,9 +161,8 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
case WDIOC_SETTIMEOUT:
|
||||
if (get_user(new_timeout, p))
|
||||
return -EFAULT;
|
||||
if ((new_timeout < 1) || (new_timeout > 63))
|
||||
if (advwdt_set_heartbeat(new_timeout))
|
||||
return -EINVAL;
|
||||
timeout = new_timeout;
|
||||
advwdt_ping();
|
||||
/* Fall */
|
||||
|
||||
|
|
@ -208,21 +222,6 @@ advwdt_close(struct inode *inode, struct file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Notifier for system down
|
||||
*/
|
||||
|
||||
static int
|
||||
advwdt_notify_sys(struct notifier_block *this, unsigned long code,
|
||||
void *unused)
|
||||
{
|
||||
if (code == SYS_DOWN || code == SYS_HALT) {
|
||||
/* Turn the WDT off */
|
||||
advwdt_disable();
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Kernel Interfaces
|
||||
*/
|
||||
|
|
@ -237,33 +236,20 @@ static const struct file_operations advwdt_fops = {
|
|||
};
|
||||
|
||||
static struct miscdevice advwdt_miscdev = {
|
||||
.minor = WATCHDOG_MINOR,
|
||||
.name = "watchdog",
|
||||
.fops = &advwdt_fops,
|
||||
.minor = WATCHDOG_MINOR,
|
||||
.name = "watchdog",
|
||||
.fops = &advwdt_fops,
|
||||
};
|
||||
|
||||
/*
|
||||
* The WDT needs to learn about soft shutdowns in order to
|
||||
* turn the timebomb registers off.
|
||||
* Init & exit routines
|
||||
*/
|
||||
|
||||
static struct notifier_block advwdt_notifier = {
|
||||
.notifier_call = advwdt_notify_sys,
|
||||
};
|
||||
|
||||
static int __init
|
||||
advwdt_init(void)
|
||||
static int __devinit
|
||||
advwdt_probe(struct platform_device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
|
||||
|
||||
if (timeout < 1 || timeout > 63) {
|
||||
timeout = WATCHDOG_TIMEOUT;
|
||||
printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
|
||||
timeout);
|
||||
}
|
||||
|
||||
if (wdt_stop != wdt_start) {
|
||||
if (!request_region(wdt_stop, 1, WATCHDOG_NAME)) {
|
||||
printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
|
||||
|
|
@ -280,18 +266,18 @@ advwdt_init(void)
|
|||
goto unreg_stop;
|
||||
}
|
||||
|
||||
ret = register_reboot_notifier(&advwdt_notifier);
|
||||
if (ret != 0) {
|
||||
printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
|
||||
ret);
|
||||
goto unreg_regions;
|
||||
/* Check that the heartbeat value is within it's range ; if not reset to the default */
|
||||
if (advwdt_set_heartbeat(timeout)) {
|
||||
advwdt_set_heartbeat(WATCHDOG_TIMEOUT);
|
||||
printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
|
||||
timeout);
|
||||
}
|
||||
|
||||
ret = misc_register(&advwdt_miscdev);
|
||||
if (ret != 0) {
|
||||
printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
|
||||
WATCHDOG_MINOR, ret);
|
||||
goto unreg_reboot;
|
||||
goto unreg_regions;
|
||||
}
|
||||
|
||||
printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
|
||||
|
|
@ -299,8 +285,6 @@ advwdt_init(void)
|
|||
|
||||
out:
|
||||
return ret;
|
||||
unreg_reboot:
|
||||
unregister_reboot_notifier(&advwdt_notifier);
|
||||
unreg_regions:
|
||||
release_region(wdt_start, 1);
|
||||
unreg_stop:
|
||||
|
|
@ -309,14 +293,64 @@ unreg_stop:
|
|||
goto out;
|
||||
}
|
||||
|
||||
static int __devexit
|
||||
advwdt_remove(struct platform_device *dev)
|
||||
{
|
||||
misc_deregister(&advwdt_miscdev);
|
||||
release_region(wdt_start,1);
|
||||
if(wdt_stop != wdt_start)
|
||||
release_region(wdt_stop,1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
advwdt_shutdown(struct platform_device *dev)
|
||||
{
|
||||
/* Turn the WDT off if we have a soft shutdown */
|
||||
advwdt_disable();
|
||||
}
|
||||
|
||||
static struct platform_driver advwdt_driver = {
|
||||
.probe = advwdt_probe,
|
||||
.remove = __devexit_p(advwdt_remove),
|
||||
.shutdown = advwdt_shutdown,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = DRV_NAME,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init
|
||||
advwdt_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
|
||||
|
||||
err = platform_driver_register(&advwdt_driver);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
advwdt_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
|
||||
if (IS_ERR(advwdt_platform_device)) {
|
||||
err = PTR_ERR(advwdt_platform_device);
|
||||
goto unreg_platform_driver;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
unreg_platform_driver:
|
||||
platform_driver_unregister(&advwdt_driver);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
advwdt_exit(void)
|
||||
{
|
||||
misc_deregister(&advwdt_miscdev);
|
||||
unregister_reboot_notifier(&advwdt_notifier);
|
||||
if(wdt_stop != wdt_start)
|
||||
release_region(wdt_stop,1);
|
||||
release_region(wdt_start,1);
|
||||
platform_device_unregister(advwdt_platform_device);
|
||||
platform_driver_unregister(&advwdt_driver);
|
||||
printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
|
||||
}
|
||||
|
||||
module_init(advwdt_init);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (0<timeout<18000, defaul
|
|||
|
||||
static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
module_param(nowayout, int, 0);
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
|
||||
/*
|
||||
* ali_start - start watchdog countdown
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ module_param(use_gpio, int, 0);
|
|||
MODULE_PARM_DESC(use_gpio, "Use the gpio watchdog. (required by old cobalt boards)");
|
||||
|
||||
static void wdt_timer_ping(unsigned long);
|
||||
static struct timer_list timer;
|
||||
static DEFINE_TIMER(timer, wdt_timer_ping, 0, 1);
|
||||
static unsigned long next_heartbeat;
|
||||
static unsigned long wdt_is_open;
|
||||
static char wdt_expect_close;
|
||||
|
|
@ -78,7 +78,7 @@ static struct pci_dev *alim7101_pmu;
|
|||
static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
module_param(nowayout, int, 0);
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
|
||||
__stringify(CONFIG_WATCHDOG_NOWAYOUT) ")");
|
||||
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
|
||||
/*
|
||||
* Whack the dog
|
||||
|
|
@ -108,8 +108,7 @@ static void wdt_timer_ping(unsigned long data)
|
|||
printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");
|
||||
}
|
||||
/* Re-set the timer interval */
|
||||
timer.expires = jiffies + WDT_INTERVAL;
|
||||
add_timer(&timer);
|
||||
mod_timer(&timer, jiffies + WDT_INTERVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -147,9 +146,7 @@ static void wdt_startup(void)
|
|||
wdt_change(WDT_ENABLE);
|
||||
|
||||
/* Start the timer */
|
||||
timer.expires = jiffies + WDT_INTERVAL;
|
||||
add_timer(&timer);
|
||||
|
||||
mod_timer(&timer, jiffies + WDT_INTERVAL);
|
||||
|
||||
printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
|
||||
}
|
||||
|
|
@ -380,10 +377,6 @@ static int __init alim7101_wdt_init(void)
|
|||
timeout);
|
||||
}
|
||||
|
||||
init_timer(&timer);
|
||||
timer.function = wdt_timer_ping;
|
||||
timer.data = 1;
|
||||
|
||||
rc = misc_register(&wdt_miscdev);
|
||||
if (rc) {
|
||||
printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
|
||||
|
|
|
|||
|
|
@ -80,10 +80,8 @@ static void cpu5wdt_trigger(unsigned long unused)
|
|||
outb(1, port + CPU5WDT_TRIGGER_REG);
|
||||
|
||||
/* requeue?? */
|
||||
if( cpu5wdt_device.queue && ticks ) {
|
||||
cpu5wdt_device.timer.expires = jiffies + CPU5WDT_INTERVAL;
|
||||
add_timer(&cpu5wdt_device.timer);
|
||||
}
|
||||
if (cpu5wdt_device.queue && ticks)
|
||||
mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL);
|
||||
else {
|
||||
/* ticks doesn't matter anyway */
|
||||
complete(&cpu5wdt_device.stop);
|
||||
|
|
@ -109,8 +107,7 @@ static void cpu5wdt_start(void)
|
|||
outb(1, port + CPU5WDT_MODE_REG);
|
||||
outb(0, port + CPU5WDT_RESET_REG);
|
||||
outb(0, port + CPU5WDT_ENABLE_REG);
|
||||
cpu5wdt_device.timer.expires = jiffies + CPU5WDT_INTERVAL;
|
||||
add_timer(&cpu5wdt_device.timer);
|
||||
mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL);
|
||||
}
|
||||
/* if process dies, counter is not decremented */
|
||||
cpu5wdt_device.running++;
|
||||
|
|
@ -245,9 +242,7 @@ static int __devinit cpu5wdt_init(void)
|
|||
|
||||
clear_bit(0, &cpu5wdt_device.inuse);
|
||||
|
||||
init_timer(&cpu5wdt_device.timer);
|
||||
cpu5wdt_device.timer.function = cpu5wdt_trigger;
|
||||
cpu5wdt_device.timer.data = 0;
|
||||
setup_timer(&cpu5wdt_device.timer, cpu5wdt_trigger, 0);
|
||||
|
||||
cpu5wdt_device.default_ticks = ticks;
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue