Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (134 commits) powerpc/nvram: Enable use Generic NVRAM driver for different size chips powerpc/iseries: Fix oops reading from /proc/iSeries/mf/*/cmdline powerpc/ps3: Workaround for flash memory I/O error powerpc/booke: Don't set DABR on 64-bit BookE, use DAC1 instead powerpc/perf_counters: Reduce stack usage of power_check_constraints powerpc: Fix bug where perf_counters breaks oprofile powerpc/85xx: Fix SMP compile error and allow NULL for smp_ops powerpc/irq: Improve nanodoc powerpc: Fix some late PowerMac G5 with PCIe ATI graphics powerpc/fsl-booke: Use HW PTE format if CONFIG_PTE_64BIT powerpc/book3e: Add missing page sizes powerpc/pseries: Fix to handle slb resize across migration powerpc/powermac: Thermal control turns system off too eagerly powerpc/pci: Merge ppc32 and ppc64 versions of phb_scan() powerpc/405ex: support cuImage via included dtb powerpc/405ex: provide necessary fixup function to support cuImage powerpc/40x: Add support for the ESTeem 195E (PPC405EP) SBC powerpc/44x: Add Eiger AMCC (AppliedMicro) PPC460SX evaluation board support. powerpc/44x: Update Arches defconfig powerpc/44x: Update Arches dts ... Fix up conflicts in drivers/char/agp/uninorth-agp.c
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/agp_backend.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <asm/uninorth.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/prom.h>
|
||||
@@ -27,6 +28,8 @@
|
||||
static int uninorth_rev;
|
||||
static int is_u3;
|
||||
|
||||
#define DEFAULT_APERTURE_SIZE 256
|
||||
#define DEFAULT_APERTURE_STRING "256"
|
||||
static char *aperture = NULL;
|
||||
|
||||
static int uninorth_fetch_size(void)
|
||||
@@ -55,7 +58,7 @@ static int uninorth_fetch_size(void)
|
||||
|
||||
if (!size) {
|
||||
for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++)
|
||||
if (values[i].size == 32)
|
||||
if (values[i].size == DEFAULT_APERTURE_SIZE)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -179,8 +182,6 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start,
|
||||
}
|
||||
(void)in_le32((volatile u32*)&agp_bridge->gatt_table[pg_start]);
|
||||
mb();
|
||||
flush_dcache_range((unsigned long)&agp_bridge->gatt_table[pg_start],
|
||||
(unsigned long)&agp_bridge->gatt_table[pg_start + mem->page_count]);
|
||||
|
||||
uninorth_tlbflush(mem);
|
||||
return 0;
|
||||
@@ -224,7 +225,6 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
(unsigned long)__va(page_to_phys(mem->pages[i]))+0x1000);
|
||||
}
|
||||
mb();
|
||||
flush_dcache_range((unsigned long)gp, (unsigned long) &gp[i]);
|
||||
uninorth_tlbflush(mem);
|
||||
|
||||
return 0;
|
||||
@@ -243,7 +243,6 @@ int u3_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
for (i = 0; i < mem->page_count; ++i)
|
||||
gp[i] = 0;
|
||||
mb();
|
||||
flush_dcache_range((unsigned long)gp, (unsigned long) &gp[i]);
|
||||
uninorth_tlbflush(mem);
|
||||
|
||||
return 0;
|
||||
@@ -396,6 +395,7 @@ static int uninorth_create_gatt_table(struct agp_bridge_data *bridge)
|
||||
int i;
|
||||
void *temp;
|
||||
struct page *page;
|
||||
struct page **pages;
|
||||
|
||||
/* We can't handle 2 level gatt's */
|
||||
if (bridge->driver->size_type == LVL2_APER_SIZE)
|
||||
@@ -424,21 +424,39 @@ static int uninorth_create_gatt_table(struct agp_bridge_data *bridge)
|
||||
if (table == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
pages = kmalloc((1 << page_order) * sizeof(struct page*), GFP_KERNEL);
|
||||
if (pages == NULL)
|
||||
goto enomem;
|
||||
|
||||
table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
|
||||
|
||||
for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
|
||||
for (page = virt_to_page(table), i = 0; page <= virt_to_page(table_end);
|
||||
page++, i++) {
|
||||
SetPageReserved(page);
|
||||
pages[i] = page;
|
||||
}
|
||||
|
||||
bridge->gatt_table_real = (u32 *) table;
|
||||
bridge->gatt_table = (u32 *)table;
|
||||
/* Need to clear out any dirty data still sitting in caches */
|
||||
flush_dcache_range((unsigned long)table,
|
||||
(unsigned long)(table_end + PAGE_SIZE));
|
||||
bridge->gatt_table = vmap(pages, (1 << page_order), 0, PAGE_KERNEL_NCG);
|
||||
|
||||
if (bridge->gatt_table == NULL)
|
||||
goto enomem;
|
||||
|
||||
bridge->gatt_bus_addr = virt_to_phys(table);
|
||||
|
||||
for (i = 0; i < num_entries; i++)
|
||||
bridge->gatt_table[i] = 0;
|
||||
|
||||
flush_dcache_range((unsigned long)table, (unsigned long)table_end);
|
||||
|
||||
return 0;
|
||||
|
||||
enomem:
|
||||
kfree(pages);
|
||||
if (table)
|
||||
free_pages((unsigned long)table, page_order);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int uninorth_free_gatt_table(struct agp_bridge_data *bridge)
|
||||
@@ -456,6 +474,7 @@ static int uninorth_free_gatt_table(struct agp_bridge_data *bridge)
|
||||
* from the table.
|
||||
*/
|
||||
|
||||
vunmap(bridge->gatt_table);
|
||||
table = (char *) bridge->gatt_table_real;
|
||||
table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
|
||||
|
||||
@@ -474,13 +493,11 @@ void null_cache_flush(void)
|
||||
|
||||
/* Setup function */
|
||||
|
||||
static const struct aper_size_info_32 uninorth_sizes[7] =
|
||||
static const struct aper_size_info_32 uninorth_sizes[] =
|
||||
{
|
||||
#if 0 /* Not sure uninorth supports that high aperture sizes */
|
||||
{256, 65536, 6, 64},
|
||||
{128, 32768, 5, 32},
|
||||
{64, 16384, 4, 16},
|
||||
#endif
|
||||
{32, 8192, 3, 8},
|
||||
{16, 4096, 2, 4},
|
||||
{8, 2048, 1, 2},
|
||||
@@ -491,7 +508,7 @@ static const struct aper_size_info_32 uninorth_sizes[7] =
|
||||
* Not sure that u3 supports that high aperture sizes but it
|
||||
* would strange if it did not :)
|
||||
*/
|
||||
static const struct aper_size_info_32 u3_sizes[8] =
|
||||
static const struct aper_size_info_32 u3_sizes[] =
|
||||
{
|
||||
{512, 131072, 7, 128},
|
||||
{256, 65536, 6, 64},
|
||||
@@ -507,7 +524,7 @@ const struct agp_bridge_driver uninorth_agp_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.aperture_sizes = (void *)uninorth_sizes,
|
||||
.size_type = U32_APER_SIZE,
|
||||
.num_aperture_sizes = 4,
|
||||
.num_aperture_sizes = ARRAY_SIZE(uninorth_sizes),
|
||||
.configure = uninorth_configure,
|
||||
.fetch_size = uninorth_fetch_size,
|
||||
.cleanup = uninorth_cleanup,
|
||||
@@ -534,7 +551,7 @@ const struct agp_bridge_driver u3_agp_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.aperture_sizes = (void *)u3_sizes,
|
||||
.size_type = U32_APER_SIZE,
|
||||
.num_aperture_sizes = 8,
|
||||
.num_aperture_sizes = ARRAY_SIZE(u3_sizes),
|
||||
.configure = uninorth_configure,
|
||||
.fetch_size = uninorth_fetch_size,
|
||||
.cleanup = uninorth_cleanup,
|
||||
@@ -717,7 +734,7 @@ module_param(aperture, charp, 0);
|
||||
MODULE_PARM_DESC(aperture,
|
||||
"Aperture size, must be power of two between 4MB and an\n"
|
||||
"\t\tupper limit specific to the UniNorth revision.\n"
|
||||
"\t\tDefault: 32M");
|
||||
"\t\tDefault: " DEFAULT_APERTURE_STRING "M");
|
||||
|
||||
MODULE_AUTHOR("Ben Herrenschmidt & Paul Mackerras");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* Generic /dev/nvram driver for architectures providing some
|
||||
* "generic" hooks, that is :
|
||||
*
|
||||
* nvram_read_byte, nvram_write_byte, nvram_sync
|
||||
* nvram_read_byte, nvram_write_byte, nvram_sync, nvram_get_size
|
||||
*
|
||||
* Note that an additional hook is supported for PowerMac only
|
||||
* for getting the nvram "partition" informations
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
#define NVRAM_SIZE 8192
|
||||
|
||||
static ssize_t nvram_len;
|
||||
|
||||
static loff_t nvram_llseek(struct file *file, loff_t offset, int origin)
|
||||
{
|
||||
lock_kernel();
|
||||
@@ -36,7 +38,7 @@ static loff_t nvram_llseek(struct file *file, loff_t offset, int origin)
|
||||
offset += file->f_pos;
|
||||
break;
|
||||
case 2:
|
||||
offset += NVRAM_SIZE;
|
||||
offset += nvram_len;
|
||||
break;
|
||||
}
|
||||
if (offset < 0) {
|
||||
@@ -56,9 +58,9 @@ static ssize_t read_nvram(struct file *file, char __user *buf,
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, count))
|
||||
return -EFAULT;
|
||||
if (*ppos >= NVRAM_SIZE)
|
||||
if (*ppos >= nvram_len)
|
||||
return 0;
|
||||
for (i = *ppos; count > 0 && i < NVRAM_SIZE; ++i, ++p, --count)
|
||||
for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count)
|
||||
if (__put_user(nvram_read_byte(i), p))
|
||||
return -EFAULT;
|
||||
*ppos = i;
|
||||
@@ -74,9 +76,9 @@ static ssize_t write_nvram(struct file *file, const char __user *buf,
|
||||
|
||||
if (!access_ok(VERIFY_READ, buf, count))
|
||||
return -EFAULT;
|
||||
if (*ppos >= NVRAM_SIZE)
|
||||
if (*ppos >= nvram_len)
|
||||
return 0;
|
||||
for (i = *ppos; count > 0 && i < NVRAM_SIZE; ++i, ++p, --count) {
|
||||
for (i = *ppos; count > 0 && i < nvram_len; ++i, ++p, --count) {
|
||||
if (__get_user(c, p))
|
||||
return -EFAULT;
|
||||
nvram_write_byte(c, i);
|
||||
@@ -133,9 +135,20 @@ static struct miscdevice nvram_dev = {
|
||||
|
||||
int __init nvram_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
printk(KERN_INFO "Generic non-volatile memory driver v%s\n",
|
||||
NVRAM_VERSION);
|
||||
return misc_register(&nvram_dev);
|
||||
ret = misc_register(&nvram_dev);
|
||||
if (ret != 0)
|
||||
goto out;
|
||||
|
||||
nvram_len = nvram_get_size();
|
||||
if (nvram_len < 0)
|
||||
nvram_len = NVRAM_SIZE;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void __exit nvram_cleanup(void)
|
||||
|
@@ -516,8 +516,6 @@ static void hvc_set_winsz(struct work_struct *work)
|
||||
struct winsize ws;
|
||||
|
||||
hp = container_of(work, struct hvc_struct, tty_resize);
|
||||
if (!hp)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&hp->lock, hvc_flags);
|
||||
if (!hp->tty) {
|
||||
|
@@ -120,7 +120,7 @@ static struct vio_driver hvc_vio_driver = {
|
||||
}
|
||||
};
|
||||
|
||||
static int hvc_vio_init(void)
|
||||
static int __init hvc_vio_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -134,7 +134,7 @@ static int hvc_vio_init(void)
|
||||
}
|
||||
module_init(hvc_vio_init); /* after drivers/char/hvc_console.c */
|
||||
|
||||
static void hvc_vio_exit(void)
|
||||
static void __exit hvc_vio_exit(void)
|
||||
{
|
||||
vio_unregister_driver(&hvc_vio_driver);
|
||||
}
|
||||
|
@@ -1230,11 +1230,12 @@ static struct tty_driver *hvsi_console_device(struct console *console,
|
||||
|
||||
static int __init hvsi_console_setup(struct console *console, char *options)
|
||||
{
|
||||
struct hvsi_struct *hp = &hvsi_ports[console->index];
|
||||
struct hvsi_struct *hp;
|
||||
int ret;
|
||||
|
||||
if (console->index < 0 || console->index >= hvsi_count)
|
||||
return -1;
|
||||
hp = &hvsi_ports[console->index];
|
||||
|
||||
/* give the FSP a chance to change the baud rate when we re-open */
|
||||
hvsi_close_protocol(hp);
|
||||
|
Reference in New Issue
Block a user