mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-31 06:36:41 +00:00
linux: update RPi patches, take \#2
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
ea48d24910
commit
b5a957cf78
@ -1,96 +0,0 @@
|
||||
From dd6079fc871e99e4b0345d3fe27701dce5dcc7d0 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 17 Jan 2012 19:22:59 +0000
|
||||
Subject: [PATCH] Allow mac address to be set in smsc95xx
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 files changed, 56 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
|
||||
index f74f3ce..5a2e12b 100644
|
||||
--- a/drivers/net/usb/smsc95xx.c
|
||||
+++ b/drivers/net/usb/smsc95xx.c
|
||||
@@ -46,6 +46,7 @@
|
||||
#define SMSC95XX_INTERNAL_PHY_ID (1)
|
||||
#define SMSC95XX_TX_OVERHEAD (8)
|
||||
#define SMSC95XX_TX_OVERHEAD_CSUM (12)
|
||||
+#define MAC_ADDR_LEN (6)
|
||||
|
||||
struct smsc95xx_priv {
|
||||
u32 mac_cr;
|
||||
@@ -63,6 +64,10 @@ struct usb_context {
|
||||
module_param(turbo_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
|
||||
|
||||
+static char *macaddr = ":";
|
||||
+module_param(macaddr, charp, 0);
|
||||
+MODULE_PARM_DESC(macaddr, "MAC address");
|
||||
+
|
||||
static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
|
||||
{
|
||||
u32 *buf = kmalloc(4, GFP_KERNEL);
|
||||
@@ -600,8 +605,59 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
|
||||
return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
|
||||
}
|
||||
|
||||
+/* Check the macaddr module parameter for a MAC address */
|
||||
+static int smsc95xx_is_macaddr_param(struct usbnet *dev, u8 *dev_mac)
|
||||
+{
|
||||
+ int i, j, got_num, num;
|
||||
+ u8 mtbl[MAC_ADDR_LEN];
|
||||
+
|
||||
+ if (macaddr[0] == ':')
|
||||
+ return 0;
|
||||
+
|
||||
+ i = 0;
|
||||
+ j = 0;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ while (j < MAC_ADDR_LEN) {
|
||||
+ if (macaddr[i] && macaddr[i] != ':') {
|
||||
+ got_num++;
|
||||
+ if ('0' <= macaddr[i] && macaddr[i] <= '9')
|
||||
+ num = num * 16 + macaddr[i] - '0';
|
||||
+ else if ('A' <= macaddr[i] && macaddr[i] <= 'F')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'A';
|
||||
+ else if ('a' <= macaddr[i] && macaddr[i] <= 'f')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'a';
|
||||
+ else
|
||||
+ break;
|
||||
+ i++;
|
||||
+ } else if (got_num == 2) {
|
||||
+ mtbl[j++] = (u8) num;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ i++;
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (j == MAC_ADDR_LEN) {
|
||||
+ netif_dbg(dev, ifup, dev->net, "Overriding MAC address with: "
|
||||
+ "%02x:%02x:%02x:%02x:%02x:%02x\n", mtbl[0], mtbl[1], mtbl[2],
|
||||
+ mtbl[3], mtbl[4], mtbl[5]);
|
||||
+ for (i = 0; i < MAC_ADDR_LEN; i++)
|
||||
+ dev_mac[i] = mtbl[i];
|
||||
+ return 1;
|
||||
+ } else {
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void smsc95xx_init_mac_address(struct usbnet *dev)
|
||||
{
|
||||
+ /* Check module parameters */
|
||||
+ if (smsc95xx_is_macaddr_param(dev, dev->net->dev_addr))
|
||||
+ return;
|
||||
+
|
||||
/* try reading mac address from EEPROM */
|
||||
if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
|
||||
dev->net->dev_addr) == 0) {
|
||||
--
|
||||
1.7.5.4
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,416 +0,0 @@
|
||||
diff -Naur linux-3.1.10/drivers/watchdog/bcm2708_wdog.c linux-3.1.10.patch/drivers/watchdog/bcm2708_wdog.c
|
||||
--- linux-3.1.10/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-3.1.10.patch/drivers/watchdog/bcm2708_wdog.c 2012-02-03 23:09:15.158582362 +0100
|
||||
@@ -0,0 +1,385 @@
|
||||
+/*
|
||||
+ * Broadcom BCM2708 watchdog driver.
|
||||
+ *
|
||||
+ * (c) Copyright 2010 Broadcom Europe Ltd
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * as published by the Free Software Foundation; either version
|
||||
+ * 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * BCM2708 watchdog driver. Loosely based on wdt driver.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/interrupt.h>
|
||||
+#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>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+#include <mach/platform.h>
|
||||
+
|
||||
+#include <asm/system.h>
|
||||
+
|
||||
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
|
||||
+#define WDOG_TICKS_TO_SECS(x) ((x) >> 16)
|
||||
+
|
||||
+static unsigned long wdog_is_open;
|
||||
+static uint32_t wdog_ticks; /* Ticks to load into wdog timer */
|
||||
+static char expect_close;
|
||||
+
|
||||
+/*
|
||||
+ * Module parameters
|
||||
+ */
|
||||
+
|
||||
+#define WD_TIMO 10 /* Default heartbeat = 60 seconds */
|
||||
+static int heartbeat = WD_TIMO; /* Heartbeat in seconds */
|
||||
+
|
||||
+module_param(heartbeat, int, 0);
|
||||
+MODULE_PARM_DESC(heartbeat,
|
||||
+ "Watchdog heartbeat in seconds. (0 < heartbeat < 65536, default="
|
||||
+ __MODULE_STRING(WD_TIMO) ")");
|
||||
+
|
||||
+static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
+module_param(nowayout, int, 0);
|
||||
+MODULE_PARM_DESC(nowayout,
|
||||
+ "Watchdog cannot be stopped once started (default="
|
||||
+ __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
+
|
||||
+static DEFINE_SPINLOCK(wdog_lock);
|
||||
+
|
||||
+/**
|
||||
+ * Start the watchdog driver.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_start(unsigned long timeout)
|
||||
+{
|
||||
+ uint32_t cur;
|
||||
+ unsigned long flags;
|
||||
+ spin_lock_irqsave(&wdog_lock, flags);
|
||||
+
|
||||
+ /* enable the watchdog */
|
||||
+ iowrite32(PM_PASSWORD | (timeout & PM_WDOG_TIME_SET),
|
||||
+ __io_address(PM_WDOG));
|
||||
+ cur = ioread32(__io_address(PM_RSTC));
|
||||
+ iowrite32(PM_PASSWORD | (cur & PM_RSTC_WRCFG_CLR) |
|
||||
+ PM_RSTC_WRCFG_FULL_RESET, __io_address(PM_RSTC));
|
||||
+
|
||||
+ spin_unlock_irqrestore(&wdog_lock, flags);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Stop the watchdog driver.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_stop(void)
|
||||
+{
|
||||
+ iowrite32(PM_PASSWORD | PM_RSTC_RESET, __io_address(PM_RSTC));
|
||||
+ printk(KERN_INFO "watchdog stopped\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Reload counter one with the watchdog heartbeat. We don't bother
|
||||
+ * reloading the cascade counter.
|
||||
+ */
|
||||
+
|
||||
+static void wdog_ping(void)
|
||||
+{
|
||||
+ wdog_start(wdog_ticks);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @t: the new heartbeat value that needs to be set.
|
||||
+ *
|
||||
+ * Set a new heartbeat value for the watchdog device. If the heartbeat
|
||||
+ * value is incorrect we keep the old value and return -EINVAL. If
|
||||
+ * successful we return 0.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_set_heartbeat(int t)
|
||||
+{
|
||||
+ if (t < 1 || t > WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ heartbeat = t;
|
||||
+ wdog_ticks = SECS_TO_WDOG_TICKS(t);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @file: file handle to the watchdog
|
||||
+ * @buf: buffer to write (unused as data does not matter here
|
||||
+ * @count: count of bytes
|
||||
+ * @ppos: pointer to the position to write. No seeks allowed
|
||||
+ *
|
||||
+ * A write to a watchdog device is defined as a keepalive signal.
|
||||
+ *
|
||||
+ * if 'nowayout' is set then normally a close() is ignored. But
|
||||
+ * if you write 'V' first then the close() will stop the timer.
|
||||
+ */
|
||||
+
|
||||
+static ssize_t wdog_write(struct file *file, const char __user *buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ if (count) {
|
||||
+ if (!nowayout) {
|
||||
+ size_t i;
|
||||
+
|
||||
+ /* In case it was set long ago */
|
||||
+ expect_close = 0;
|
||||
+
|
||||
+ for (i = 0; i != count; i++) {
|
||||
+ char c;
|
||||
+ if (get_user(c, buf + i))
|
||||
+ return -EFAULT;
|
||||
+ if (c == 'V')
|
||||
+ expect_close = 42;
|
||||
+ }
|
||||
+ }
|
||||
+ wdog_ping();
|
||||
+ }
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static int wdog_get_status(void)
|
||||
+{
|
||||
+ unsigned long flags;
|
||||
+ int status = 0;
|
||||
+ spin_lock_irqsave(&wdog_lock, flags);
|
||||
+ /* FIXME: readback reset reason */
|
||||
+ spin_unlock_irqrestore(&wdog_lock, flags);
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static uint32_t wdog_get_remaining(void)
|
||||
+{
|
||||
+ uint32_t ret = ioread32(__io_address(PM_WDOG));
|
||||
+ return ret & PM_WDOG_TIME_SET;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @file: file handle to the device
|
||||
+ * @cmd: watchdog command
|
||||
+ * @arg: argument pointer
|
||||
+ *
|
||||
+ * The watchdog API defines a common set of functions for all watchdogs
|
||||
+ * according to their available features. We only actually usefully support
|
||||
+ * querying capabilities and current status.
|
||||
+ */
|
||||
+
|
||||
+static long wdog_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ void __user *argp = (void __user *)arg;
|
||||
+ int __user *p = argp;
|
||||
+ int new_heartbeat;
|
||||
+ int status;
|
||||
+ int options;
|
||||
+ uint32_t remaining;
|
||||
+
|
||||
+ struct watchdog_info ident = {
|
||||
+ .options = WDIOF_SETTIMEOUT|
|
||||
+ WDIOF_MAGICCLOSE|
|
||||
+ WDIOF_KEEPALIVEPING,
|
||||
+ .firmware_version = 1,
|
||||
+ .identity = "BCM2708",
|
||||
+ };
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case WDIOC_GETSUPPORT:
|
||||
+ return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
|
||||
+ case WDIOC_GETSTATUS:
|
||||
+ status = wdog_get_status();
|
||||
+ return put_user(status, p);
|
||||
+ case WDIOC_GETBOOTSTATUS:
|
||||
+ return put_user(0, p);
|
||||
+ case WDIOC_KEEPALIVE:
|
||||
+ wdog_ping();
|
||||
+ return 0;
|
||||
+ case WDIOC_SETTIMEOUT:
|
||||
+ if (get_user(new_heartbeat, p))
|
||||
+ return -EFAULT;
|
||||
+ if (wdog_set_heartbeat(new_heartbeat))
|
||||
+ return -EINVAL;
|
||||
+ wdog_ping();
|
||||
+ /* Fall */
|
||||
+ case WDIOC_GETTIMEOUT:
|
||||
+ return put_user(heartbeat, p);
|
||||
+ case WDIOC_GETTIMELEFT:
|
||||
+ remaining = WDOG_TICKS_TO_SECS(wdog_get_remaining());
|
||||
+ return put_user(remaining, p);
|
||||
+ case WDIOC_SETOPTIONS:
|
||||
+ if (get_user(options, p))
|
||||
+ return -EFAULT;
|
||||
+ if (options & WDIOS_DISABLECARD)
|
||||
+ wdog_stop();
|
||||
+ if (options & WDIOS_ENABLECARD)
|
||||
+ wdog_start(wdog_ticks);
|
||||
+ return 0;
|
||||
+ default:
|
||||
+ return -ENOTTY;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @inode: inode of device
|
||||
+ * @file: file handle to device
|
||||
+ *
|
||||
+ * The watchdog device has been opened. The watchdog device is single
|
||||
+ * open and on opening we load the counters.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ if (test_and_set_bit(0, &wdog_is_open))
|
||||
+ return -EBUSY;
|
||||
+ /*
|
||||
+ * Activate
|
||||
+ */
|
||||
+ wdog_start(wdog_ticks);
|
||||
+ return nonseekable_open(inode, file);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @inode: inode to board
|
||||
+ * @file: file handle to board
|
||||
+ *
|
||||
+ * The watchdog has a configurable API. There is a religious dispute
|
||||
+ * between people who want their watchdog to be able to shut down and
|
||||
+ * those who want to be sure if the watchdog manager dies the machine
|
||||
+ * reboots. In the former case we disable the counters, in the latter
|
||||
+ * case you have to open it again very soon.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ if (expect_close == 42) {
|
||||
+ wdog_stop();
|
||||
+ } else {
|
||||
+ printk(KERN_CRIT
|
||||
+ "wdt: WDT device closed unexpectedly. WDT will not stop!\n");
|
||||
+ wdog_ping();
|
||||
+ }
|
||||
+ clear_bit(0, &wdog_is_open);
|
||||
+ expect_close = 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @this: our notifier block
|
||||
+ * @code: the event being reported
|
||||
+ * @unused: unused
|
||||
+ *
|
||||
+ * Our notifier is called on system shutdowns. Turn the watchdog
|
||||
+ * off so that it does not fire during the next reboot.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_notify_sys(struct notifier_block *this, unsigned long code,
|
||||
+ void *unused)
|
||||
+{
|
||||
+ if (code == SYS_DOWN || code == SYS_HALT)
|
||||
+ wdog_stop();
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Kernel Interfaces
|
||||
+ */
|
||||
+
|
||||
+
|
||||
+static const struct file_operations wdog_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = no_llseek,
|
||||
+ .write = wdog_write,
|
||||
+ .unlocked_ioctl = wdog_ioctl,
|
||||
+ .open = wdog_open,
|
||||
+ .release = wdog_release,
|
||||
+};
|
||||
+
|
||||
+static struct miscdevice wdog_miscdev = {
|
||||
+ .minor = WATCHDOG_MINOR,
|
||||
+ .name = "watchdog",
|
||||
+ .fops = &wdog_fops,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * The WDT card needs to learn about soft shutdowns in order to
|
||||
+ * turn the timebomb registers off.
|
||||
+ */
|
||||
+
|
||||
+static struct notifier_block wdog_notifier = {
|
||||
+ .notifier_call = wdog_notify_sys,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * cleanup_module:
|
||||
+ *
|
||||
+ * Unload the watchdog. You cannot do this with any file handles open.
|
||||
+ * If your watchdog is set to continue ticking on close and you unload
|
||||
+ * it, well it keeps ticking. We won't get the interrupt but the board
|
||||
+ * will not touch PC memory so all is fine. You just have to load a new
|
||||
+ * module in 60 seconds or reboot.
|
||||
+ */
|
||||
+
|
||||
+static void __exit wdog_exit(void)
|
||||
+{
|
||||
+ misc_deregister(&wdog_miscdev);
|
||||
+ unregister_reboot_notifier(&wdog_notifier);
|
||||
+}
|
||||
+
|
||||
+static int __init wdog_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Check that the heartbeat value is within it's range;
|
||||
+ if not reset to the default */
|
||||
+ if (wdog_set_heartbeat(heartbeat)) {
|
||||
+ wdog_set_heartbeat(WD_TIMO);
|
||||
+ printk(KERN_INFO "bcm2708_wdog: heartbeat value must be "
|
||||
+ "0 < heartbeat < %d, using %d\n",
|
||||
+ WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET),
|
||||
+ WD_TIMO);
|
||||
+ }
|
||||
+
|
||||
+ ret = register_reboot_notifier(&wdog_notifier);
|
||||
+ if (ret) {
|
||||
+ printk(KERN_ERR
|
||||
+ "wdt: cannot register reboot notifier (err=%d)\n", ret);
|
||||
+ goto out_reboot;
|
||||
+ }
|
||||
+
|
||||
+ ret = misc_register(&wdog_miscdev);
|
||||
+ if (ret) {
|
||||
+ printk(KERN_ERR
|
||||
+ "wdt: cannot register miscdev on minor=%d (err=%d)\n",
|
||||
+ WATCHDOG_MINOR, ret);
|
||||
+ goto out_misc;
|
||||
+ }
|
||||
+
|
||||
+ printk(KERN_INFO "bcm2708 watchdog, heartbeat=%d sec (nowayout=%d)\n",
|
||||
+ heartbeat, nowayout);
|
||||
+ return 0;
|
||||
+
|
||||
+out_misc:
|
||||
+ unregister_reboot_notifier(&wdog_notifier);
|
||||
+out_reboot:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+module_init(wdog_init);
|
||||
+module_exit(wdog_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Luke Diamand");
|
||||
+MODULE_DESCRIPTION("Driver for BCM2708 watchdog");
|
||||
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
|
||||
+MODULE_ALIAS_MISCDEV(TEMP_MINOR);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
diff -Naur linux-3.1.10/drivers/watchdog/Kconfig linux-3.1.10.patch/drivers/watchdog/Kconfig
|
||||
--- linux-3.1.10/drivers/watchdog/Kconfig 2012-01-18 16:33:18.000000000 +0100
|
||||
+++ linux-3.1.10.patch/drivers/watchdog/Kconfig 2012-02-03 23:09:14.775574917 +0100
|
||||
@@ -348,6 +348,12 @@
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx2_wdt.
|
||||
|
||||
+config BCM2708_WDT
|
||||
+ tristate "BCM2708 Watchdog"
|
||||
+ depends on ARCH_BCM2708
|
||||
+ help
|
||||
+ Enables BCM2708 watchdog support.
|
||||
+
|
||||
# AVR32 Architecture
|
||||
|
||||
config AT32AP700X_WDT
|
||||
diff -Naur linux-3.1.10/drivers/watchdog/Makefile linux-3.1.10.patch/drivers/watchdog/Makefile
|
||||
--- linux-3.1.10/drivers/watchdog/Makefile 2012-01-18 16:33:18.000000000 +0100
|
||||
+++ linux-3.1.10.patch/drivers/watchdog/Makefile 2012-02-03 23:09:14.775574917 +0100
|
||||
@@ -54,6 +54,7 @@
|
||||
obj-$(CONFIG_ADX_WATCHDOG) += adx_wdt.o
|
||||
obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
|
||||
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
|
||||
+obj-$(CONFIG_BCM2708_WDT) += bcm2708_wdog.o
|
||||
|
||||
# AVR32 Architecture
|
||||
obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,48 +0,0 @@
|
||||
From 98be24ac73ff6d8608ed858cd64e870479f67780 Mon Sep 17 00:00:00 2001
|
||||
From: Dom Cobley <dc4@broadcom.com>
|
||||
Date: Sun, 12 Feb 2012 20:27:35 +0000
|
||||
Subject: [PATCH] Add config option to enable L2 cache
|
||||
|
||||
Signed-off-by: Dom Cobley <dc4@broadcom.com>
|
||||
---
|
||||
arch/arm/mach-bcm2708/Kconfig | 7 +++++++
|
||||
arch/arm/mach-bcm2708/include/mach/memory.h | 7 ++++++-
|
||||
2 files changed, 13 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/mach-bcm2708/Kconfig b/arch/arm/mach-bcm2708/Kconfig
|
||||
index 44c7866..d3d3db7 100644
|
||||
--- a/arch/arm/mach-bcm2708/Kconfig
|
||||
+++ b/arch/arm/mach-bcm2708/Kconfig
|
||||
@@ -22,4 +22,11 @@ config BCM2708_VCMEM
|
||||
help
|
||||
Helper for videocore memory access and total size allocation.
|
||||
|
||||
+config BCM2708_L2CACHE
|
||||
+ bool "Videocore L2 cache"
|
||||
+ depends on MACH_BCM2708
|
||||
+ default n
|
||||
+ help
|
||||
+ Allow ARM to use GPU's L2 cache. Requires enable_l2cache in config.txt.
|
||||
+
|
||||
endmenu
|
||||
diff --git a/arch/arm/mach-bcm2708/include/mach/memory.h b/arch/arm/mach-bcm2708/include/mach/memory.h
|
||||
index c6a21cb..771bdf1 100644
|
||||
--- a/arch/arm/mach-bcm2708/include/mach/memory.h
|
||||
+++ b/arch/arm/mach-bcm2708/include/mach/memory.h
|
||||
@@ -34,7 +34,12 @@
|
||||
*/
|
||||
#define PHYS_OFFSET UL(0x00000000)
|
||||
#define ARMMEM_OFFSET UL(0x00000000) /* offset in VC of ARM memory */
|
||||
-#define _REAL_BUS_OFFSET UL(0xC0000000) /* don't use L1 or L2 caches */
|
||||
+
|
||||
+#ifdef CONFIG_BCM2708_L2CACHE
|
||||
+ #define _REAL_BUS_OFFSET UL(0x40000000) /* use L2 cache */
|
||||
+#else
|
||||
+ #define _REAL_BUS_OFFSET UL(0xC0000000) /* don't use L1 or L2 caches */
|
||||
+#endif
|
||||
|
||||
/* We're using the memory at 64M in the VideoCore for Linux - this adjustment
|
||||
* will provide the offset into this area as well as setting the bits that
|
||||
--
|
||||
1.7.5.4
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,26 +0,0 @@
|
||||
From ef98446236432e102d00d841cf1a6b63ed7be41f Mon Sep 17 00:00:00 2001
|
||||
From: Dom Cobley <dc4@broadcom.com>
|
||||
Date: Wed, 15 Feb 2012 18:33:00 +0000
|
||||
Subject: [PATCH] Fix bug where vchiq fails when L2 enabled
|
||||
|
||||
Signed-off-by: Dom Cobley <dc4@broadcom.com>
|
||||
---
|
||||
.../interface/vchiq_arm/vchiq_2835_arm.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
index ca065ff..a3d8f3c 100644
|
||||
--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
+++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
|
||||
@@ -36,7 +36,7 @@
|
||||
#define TOTAL_SLOTS (VCHIQ_SLOT_ZERO_SLOTS + 2 * 32)
|
||||
|
||||
#define VCHIQ_DOORBELL_IRQ IRQ_ARM_DOORBELL_0
|
||||
-#define VCHIQ_ARM_ADDRESS(x) __virt_to_bus(x)
|
||||
+#define VCHIQ_ARM_ADDRESS(x) __virt_to_bus((unsigned)x)
|
||||
|
||||
#include "vchiq_arm.h"
|
||||
#include "vchiq_2835.h"
|
||||
--
|
||||
1.7.5.4
|
||||
|
Loading…
x
Reference in New Issue
Block a user