From 03dd5e1ba55d43c3a12b8514f9889049037f17f7 Mon Sep 17 00:00:00 2001 From: Adrian McMenamin Date: Thu, 29 Jan 2009 22:56:08 -0800 Subject: Input: add support for the Maple mouse on the SEGA Dreamcast Signed-off-by: Adrian McMenamin Acked-by: Mike Frysinger Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index 093c8c1..e3855a7 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig @@ -292,4 +292,15 @@ config MOUSE_PXA930_TRKBALL help Say Y here to support PXA930 Trackball mouse. +config MOUSE_MAPLE + tristate "Maple mouse (for the Dreamcast)" + depends on MAPLE + help + This driver supports the Maple mouse on the SEGA Dreamcast. + + Most Dreamcast users, who have a mouse, will say Y here. + + To compile this driver as a module choose M here: the module will be + called maplemouse. + endif diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile index 8c8a1f2..4721894 100644 --- a/drivers/input/mouse/Makefile +++ b/drivers/input/mouse/Makefile @@ -6,18 +6,19 @@ obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o -obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o -obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o +obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o +obj-$(CONFIG_MOUSE_GPIO) += gpio_mouse.o +obj-$(CONFIG_MOUSE_HIL) += hil_ptr.o obj-$(CONFIG_MOUSE_INPORT) += inport.o obj-$(CONFIG_MOUSE_LOGIBM) += logibm.o +obj-$(CONFIG_MOUSE_MAPLE) += maplemouse.o obj-$(CONFIG_MOUSE_PC110PAD) += pc110pad.o obj-$(CONFIG_MOUSE_PS2) += psmouse.o obj-$(CONFIG_MOUSE_PXA930_TRKBALL) += pxa930_trkball.o +obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o obj-$(CONFIG_MOUSE_SERIAL) += sermouse.o -obj-$(CONFIG_MOUSE_HIL) += hil_ptr.o obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o -obj-$(CONFIG_MOUSE_GPIO) += gpio_mouse.o psmouse-objs := psmouse-base.o synaptics.o diff --git a/drivers/input/mouse/maplemouse.c b/drivers/input/mouse/maplemouse.c new file mode 100644 index 0000000..d196abf --- /dev/null +++ b/drivers/input/mouse/maplemouse.c @@ -0,0 +1,147 @@ +/* + * SEGA Dreamcast mouse driver + * Based on drivers/usb/usbmouse.c + * + * Copyright Yaegashi Takeshi, 2001 + * Adrian McMenamin, 2008 + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Adrian McMenamin "); +MODULE_DESCRIPTION("SEGA Dreamcast mouse driver"); +MODULE_LICENSE("GPL"); + +struct dc_mouse { + struct input_dev *dev; + struct maple_device *mdev; +}; + +static void dc_mouse_callback(struct mapleq *mq) +{ + int buttons, relx, rely, relz; + struct maple_device *mapledev = mq->dev; + struct dc_mouse *mse = maple_get_drvdata(mapledev); + struct input_dev *dev = mse->dev; + unsigned char *res = mq->recvbuf; + + buttons = ~res[8]; + relx = *(unsigned short *)(res + 12) - 512; + rely = *(unsigned short *)(res + 14) - 512; + relz = *(unsigned short *)(res + 16) - 512; + + input_report_key(dev, BTN_LEFT, buttons & 4); + input_report_key(dev, BTN_MIDDLE, buttons & 9); + input_report_key(dev, BTN_RIGHT, buttons & 2); + input_report_rel(dev, REL_X, relx); + input_report_rel(dev, REL_Y, rely); + input_report_rel(dev, REL_WHEEL, relz); + input_sync(dev); +} + +static int dc_mouse_open(struct input_dev *dev) +{ + struct dc_mouse *mse = dev->dev.platform_data; + + maple_getcond_callback(mse->mdev, dc_mouse_callback, HZ/50, + MAPLE_FUNC_MOUSE); + + return 0; +} + +static void dc_mouse_close(struct input_dev *dev) +{ + struct dc_mouse *mse = dev->dev.platform_data; + + maple_getcond_callback(mse->mdev, dc_mouse_callback, 0, + MAPLE_FUNC_MOUSE); +} + + +static int __devinit probe_maple_mouse(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct maple_driver *mdrv = to_maple_driver(dev->driver); + struct input_dev *input_dev; + struct dc_mouse *mse; + int error; + + mse = kzalloc(sizeof(struct dc_mouse), GFP_KERNEL); + input_dev = input_allocate_device(); + + if (!mse || !input_dev) { + error = -ENOMEM; + goto fail; + } + + mse->dev = input_dev; + mse->mdev = mdev; + + input_set_drvdata(input_dev, mse); + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); + input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y) | + BIT_MASK(REL_WHEEL); + input_dev->name = mdev->product_name; + input_dev->id.bustype = BUS_HOST; + input_dev->open = dc_mouse_open; + input_dev->close = dc_mouse_close; + + mdev->driver = mdrv; + maple_set_drvdata(mdev, mse); + + error = input_register_device(input_dev); + if (error) + goto fail; + + return 0; + +fail: + input_free_device(input_dev); + maple_set_drvdata(mdev, NULL); + kfree(mse); + mdev->driver = NULL; + return error; +} + +static int __devexit remove_maple_mouse(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct dc_mouse *mse = maple_get_drvdata(mdev); + + mdev->callback = NULL; + input_unregister_device(mse->dev); + maple_set_drvdata(mdev, NULL); + kfree(mse); + + return 0; +} + +static struct maple_driver dc_mouse_driver = { + .function = MAPLE_FUNC_MOUSE, + .drv = { + .name = "Dreamcast_mouse", + .probe = probe_maple_mouse, + .remove = __devexit_p(remove_maple_mouse), + }, +}; + +static int __init dc_mouse_init(void) +{ + return maple_driver_register(&dc_mouse_driver); +} + +static void __exit dc_mouse_exit(void) +{ + maple_driver_unregister(&dc_mouse_driver); +} + +module_init(dc_mouse_init); +module_exit(dc_mouse_exit); -- cgit v0.10.2 From b0ee0d3eb31a163c958f2960906c44bcdfdc607b Mon Sep 17 00:00:00 2001 From: Roel Kluin Date: Thu, 29 Jan 2009 22:56:08 -0800 Subject: Input: pc110pad - use no_pci_devices() Use no_pci_devices() helper instead of doing explicit get/put. Signed-off-by: Roel Kluin Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c index fd09c8d..f63995f 100644 --- a/drivers/input/mouse/pc110pad.c +++ b/drivers/input/mouse/pc110pad.c @@ -111,11 +111,8 @@ static int __init pc110pad_init(void) struct pci_dev *dev; int err; - dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); - if (dev) { - pci_dev_put(dev); + if (!no_pci_devices()) return -ENODEV; - } if (!request_region(pc110pad_io, 4, "pc110pad")) { printk(KERN_ERR "pc110pad: I/O area %#x-%#x in use.\n", -- cgit v0.10.2 From e7b5c1ef4d87426da0b689a0a4fa67edda02ea5c Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Thu, 29 Jan 2009 23:17:52 -0800 Subject: Input: stop autorepeat timer on key release Whenever you press and then release a key, the CPU wakes up three times: * press * release * autorepeat timer exactly 250ms after press The autorepeat timer has nothing to do, obviously, since you already have released the key, so stop it on key release. [dtor@mail.ru: This changes autorepeat behavior a bit since we now stop autorepeat even if key that is being released is not the one that is being auto-repeated, but I believe the new behavior is better.] Signed-off-by: Johannes Berg Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/input.c b/drivers/input/input.c index 1730d73..46e9ce1 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -132,6 +132,11 @@ static void input_start_autorepeat(struct input_dev *dev, int code) } } +static void input_stop_autorepeat(struct input_dev *dev) +{ + del_timer(&dev->timer); +} + #define INPUT_IGNORE_EVENT 0 #define INPUT_PASS_TO_HANDLERS 1 #define INPUT_PASS_TO_DEVICE 2 @@ -167,6 +172,8 @@ static void input_handle_event(struct input_dev *dev, __change_bit(code, dev->key); if (value) input_start_autorepeat(dev, code); + else + input_stop_autorepeat(dev); } disposition = INPUT_PASS_TO_HANDLERS; -- cgit v0.10.2 From 169bc1efa84680d0a8c9567539f8577fd52e1a77 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Thu, 29 Jan 2009 23:42:16 -0800 Subject: Input: ati_remote2 - complete suspend support Add the missing reset_resume, pre_reset and post_reset hooks. Signed-off-by: Ville Syrjala Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 3c9988d..351eb90 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c @@ -139,6 +139,9 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d static void ati_remote2_disconnect(struct usb_interface *interface); static int ati_remote2_suspend(struct usb_interface *interface, pm_message_t message); static int ati_remote2_resume(struct usb_interface *interface); +static int ati_remote2_reset_resume(struct usb_interface *interface); +static int ati_remote2_pre_reset(struct usb_interface *interface); +static int ati_remote2_post_reset(struct usb_interface *interface); static struct usb_driver ati_remote2_driver = { .name = "ati_remote2", @@ -147,6 +150,9 @@ static struct usb_driver ati_remote2_driver = { .id_table = ati_remote2_id_table, .suspend = ati_remote2_suspend, .resume = ati_remote2_resume, + .reset_resume = ati_remote2_reset_resume, + .pre_reset = ati_remote2_pre_reset, + .post_reset = ati_remote2_post_reset, .supports_autosuspend = 1, }; @@ -715,6 +721,78 @@ static int ati_remote2_resume(struct usb_interface *interface) return r; } +static int ati_remote2_reset_resume(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + int r = 0; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + r = ati_remote2_setup(ar2); + if (r) + goto out; + + if (ar2->flags & ATI_REMOTE2_OPENED) + r = ati_remote2_submit_urbs(ar2); + + if (!r) + ar2->flags &= ~ATI_REMOTE2_SUSPENDED; + + out: + mutex_unlock(&ati_remote2_mutex); + + return r; +} + +static int ati_remote2_pre_reset(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + if (ar2->flags == ATI_REMOTE2_OPENED) + ati_remote2_kill_urbs(ar2); + + return 0; +} + +static int ati_remote2_post_reset(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + int r = 0; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + if (ar2->flags == ATI_REMOTE2_OPENED) + r = ati_remote2_submit_urbs(ar2); + + mutex_unlock(&ati_remote2_mutex); + + return r; +} + static int __init ati_remote2_init(void) { int r; -- cgit v0.10.2 From d329e33c7c2bdcd955a00c84a9363cb309cad352 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Thu, 29 Jan 2009 23:42:16 -0800 Subject: Input: ati_remote2 - add per device attrs Add per device channel_mask and mode_mask attributes. They inherit the values from the module parameters when the device is registered. One additional benefit is that now runtime changes to channel_mask can actually affect the hardware channel setup like they should. Signed-off-by: Ville Syrjala Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 351eb90..0871d7b 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c @@ -31,11 +31,16 @@ MODULE_LICENSE("GPL"); * newly configured "channel". */ -static unsigned int channel_mask = 0xFFFF; +enum { + ATI_REMOTE2_MAX_CHANNEL_MASK = 0xFFFF, + ATI_REMOTE2_MAX_MODE_MASK = 0x1F, +}; + +static unsigned int channel_mask = ATI_REMOTE2_MAX_CHANNEL_MASK; module_param(channel_mask, uint, 0644); MODULE_PARM_DESC(channel_mask, "Bitmask of channels to accept <15:Channel16>...<1:Channel2><0:Channel1>"); -static unsigned int mode_mask = 0x1F; +static unsigned int mode_mask = ATI_REMOTE2_MAX_MODE_MASK; module_param(mode_mask, uint, 0644); MODULE_PARM_DESC(mode_mask, "Bitmask of modes to accept <4:PC><3:AUX4><2:AUX3><1:AUX2><0:AUX1>"); @@ -133,6 +138,9 @@ struct ati_remote2 { u16 keycode[ATI_REMOTE2_MODES][ARRAY_SIZE(ati_remote2_key_table)]; unsigned int flags; + + unsigned int channel_mask; + unsigned int mode_mask; }; static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id); @@ -244,7 +252,7 @@ static void ati_remote2_input_mouse(struct ati_remote2 *ar2) channel = data[0] >> 4; - if (!((1 << channel) & channel_mask)) + if (!((1 << channel) & ar2->channel_mask)) return; mode = data[0] & 0x0F; @@ -256,7 +264,7 @@ static void ati_remote2_input_mouse(struct ati_remote2 *ar2) return; } - if (!((1 << mode) & mode_mask)) + if (!((1 << mode) & ar2->mode_mask)) return; input_event(idev, EV_REL, REL_X, (s8) data[1]); @@ -283,7 +291,7 @@ static void ati_remote2_input_key(struct ati_remote2 *ar2) channel = data[0] >> 4; - if (!((1 << channel) & channel_mask)) + if (!((1 << channel) & ar2->channel_mask)) return; mode = data[0] & 0x0F; @@ -311,7 +319,7 @@ static void ati_remote2_input_key(struct ati_remote2 *ar2) ar2->mode = mode; } - if (!((1 << mode) & mode_mask)) + if (!((1 << mode) & ar2->mode_mask)) return; index = ati_remote2_lookup(hw_code); @@ -416,7 +424,7 @@ static int ati_remote2_getkeycode(struct input_dev *idev, int index, mode; mode = scancode >> 8; - if (mode > ATI_REMOTE2_PC || !((1 << mode) & mode_mask)) + if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) return -EINVAL; index = ati_remote2_lookup(scancode & 0xFF); @@ -433,7 +441,7 @@ static int ati_remote2_setkeycode(struct input_dev *idev, int scancode, int keyc int index, mode, old_keycode; mode = scancode >> 8; - if (mode > ATI_REMOTE2_PC || !((1 << mode) & mode_mask)) + if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) return -EINVAL; index = ati_remote2_lookup(scancode & 0xFF); @@ -556,7 +564,7 @@ static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2) } } -static int ati_remote2_setup(struct ati_remote2 *ar2) +static int ati_remote2_setup(struct ati_remote2 *ar2, unsigned int ch_mask) { int r, i, channel; @@ -571,8 +579,8 @@ static int ati_remote2_setup(struct ati_remote2 *ar2) channel = 0; for (i = 0; i < 16; i++) { - if ((1 << i) & channel_mask) { - if (!(~(1 << i) & 0xFFFF & channel_mask)) + if ((1 << i) & ch_mask) { + if (!(~(1 << i) & ch_mask)) channel = i + 1; break; } @@ -591,6 +599,99 @@ static int ati_remote2_setup(struct ati_remote2 *ar2) return 0; } +static ssize_t ati_remote2_show_channel_mask(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + + return sprintf(buf, "0x%04x\n", ar2->channel_mask); +} + +static ssize_t ati_remote2_store_channel_mask(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + unsigned long mask; + int r; + + if (strict_strtoul(buf, 0, &mask)) + return -EINVAL; + + if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK) + return -EINVAL; + + r = usb_autopm_get_interface(ar2->intf[0]); + if (r) { + dev_err(&ar2->intf[0]->dev, + "%s(): usb_autopm_get_interface() = %d\n", __func__, r); + return r; + } + + mutex_lock(&ati_remote2_mutex); + + if (mask != ar2->channel_mask && !ati_remote2_setup(ar2, mask)) + ar2->channel_mask = mask; + + mutex_unlock(&ati_remote2_mutex); + + usb_autopm_put_interface(ar2->intf[0]); + + return count; +} + +static ssize_t ati_remote2_show_mode_mask(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + + return sprintf(buf, "0x%02x\n", ar2->mode_mask); +} + +static ssize_t ati_remote2_store_mode_mask(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + unsigned long mask; + + if (strict_strtoul(buf, 0, &mask)) + return -EINVAL; + + if (mask & ~ATI_REMOTE2_MAX_MODE_MASK) + return -EINVAL; + + ar2->mode_mask = mask; + + return count; +} + +static DEVICE_ATTR(channel_mask, 0644, ati_remote2_show_channel_mask, + ati_remote2_store_channel_mask); + +static DEVICE_ATTR(mode_mask, 0644, ati_remote2_show_mode_mask, + ati_remote2_store_mode_mask); + +static struct attribute *ati_remote2_attrs[] = { + &dev_attr_channel_mask.attr, + &dev_attr_mode_mask.attr, + NULL, +}; + +static struct attribute_group ati_remote2_attr_group = { + .attrs = ati_remote2_attrs, +}; + static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id) { struct usb_device *udev = interface_to_usbdev(interface); @@ -621,7 +722,10 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d if (r) goto fail2; - r = ati_remote2_setup(ar2); + ar2->channel_mask = channel_mask & ATI_REMOTE2_MAX_CHANNEL_MASK; + ar2->mode_mask = mode_mask & ATI_REMOTE2_MAX_MODE_MASK; + + r = ati_remote2_setup(ar2, ar2->channel_mask); if (r) goto fail2; @@ -630,19 +734,24 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d strlcat(ar2->name, "ATI Remote Wonder II", sizeof(ar2->name)); - r = ati_remote2_input_init(ar2); + r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group); if (r) goto fail2; + r = ati_remote2_input_init(ar2); + if (r) + goto fail3; + usb_set_intfdata(interface, ar2); interface->needs_remote_wakeup = 1; return 0; + fail3: + sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group); fail2: ati_remote2_urb_cleanup(ar2); - usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); fail1: kfree(ar2); @@ -663,6 +772,8 @@ static void ati_remote2_disconnect(struct usb_interface *interface) input_unregister_device(ar2->idev); + sysfs_remove_group(&ar2->udev->dev.kobj, &ati_remote2_attr_group); + ati_remote2_urb_cleanup(ar2); usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); @@ -736,7 +847,7 @@ static int ati_remote2_reset_resume(struct usb_interface *interface) mutex_lock(&ati_remote2_mutex); - r = ati_remote2_setup(ar2); + r = ati_remote2_setup(ar2, ar2->channel_mask); if (r) goto out; -- cgit v0.10.2 From 8a49cfa9de4ef47eb9238d625b900d4cdddccf30 Mon Sep 17 00:00:00 2001 From: Ville Syrjala Date: Thu, 29 Jan 2009 23:42:16 -0800 Subject: Input: ati_remote2 - check module params Validate that the values of the module parameters are within the supported range. Also print the values in hex since that seems like a better match for bitmasks than decimal. Signed-off-by: Ville Syrjala Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 0871d7b..922c051 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c @@ -36,12 +36,68 @@ enum { ATI_REMOTE2_MAX_MODE_MASK = 0x1F, }; +static int ati_remote2_set_mask(const char *val, + struct kernel_param *kp, unsigned int max) +{ + unsigned long mask; + int ret; + + if (!val) + return -EINVAL; + + ret = strict_strtoul(val, 0, &mask); + if (ret) + return ret; + + if (mask & ~max) + return -EINVAL; + + *(unsigned int *)kp->arg = mask; + + return 0; +} + +static int ati_remote2_set_channel_mask(const char *val, + struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return ati_remote2_set_mask(val, kp, ATI_REMOTE2_MAX_CHANNEL_MASK); +} + +static int ati_remote2_get_channel_mask(char *buffer, struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return sprintf(buffer, "0x%04x", *(unsigned int *)kp->arg); +} + +static int ati_remote2_set_mode_mask(const char *val, struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return ati_remote2_set_mask(val, kp, ATI_REMOTE2_MAX_MODE_MASK); +} + +static int ati_remote2_get_mode_mask(char *buffer, struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return sprintf(buffer, "0x%02x", *(unsigned int *)kp->arg); +} + static unsigned int channel_mask = ATI_REMOTE2_MAX_CHANNEL_MASK; -module_param(channel_mask, uint, 0644); +#define param_check_channel_mask(name, p) __param_check(name, p, unsigned int) +#define param_set_channel_mask ati_remote2_set_channel_mask +#define param_get_channel_mask ati_remote2_get_channel_mask +module_param(channel_mask, channel_mask, 0644); MODULE_PARM_DESC(channel_mask, "Bitmask of channels to accept <15:Channel16>...<1:Channel2><0:Channel1>"); static unsigned int mode_mask = ATI_REMOTE2_MAX_MODE_MASK; -module_param(mode_mask, uint, 0644); +#define param_check_mode_mask(name, p) __param_check(name, p, unsigned int) +#define param_set_mode_mask ati_remote2_set_mode_mask +#define param_get_mode_mask ati_remote2_get_mode_mask +module_param(mode_mask, mode_mask, 0644); MODULE_PARM_DESC(mode_mask, "Bitmask of modes to accept <4:PC><3:AUX4><2:AUX3><1:AUX2><0:AUX1>"); static struct usb_device_id ati_remote2_id_table[] = { @@ -722,8 +778,8 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d if (r) goto fail2; - ar2->channel_mask = channel_mask & ATI_REMOTE2_MAX_CHANNEL_MASK; - ar2->mode_mask = mode_mask & ATI_REMOTE2_MAX_MODE_MASK; + ar2->channel_mask = channel_mask; + ar2->mode_mask = mode_mask; r = ati_remote2_setup(ar2, ar2->channel_mask); if (r) -- cgit v0.10.2 From 9705ecc5c1f8f34f756164a711b4cc61110c0283 Mon Sep 17 00:00:00 2001 From: Balaji Rao Date: Tue, 27 Jan 2009 19:23:12 +0530 Subject: pcf50633_charger: Enable periodic charging restart The battery charger state machine switches into charging mode when the battery voltage falls below 96% of a battery float voltage. But the voltage drop in Li-ion batteries is marginal(1~2 %) till about 80% of its capacity - which means, after a BATFULL, charging won't be restarted until 80%. This work_struct function restarts charging at regular intervals to make sure the battery doesn't discharge too much. Signed-off-by: Balaji Rao Cc: Andy Green Signed-off-by: Anton Vorontsov diff --git a/drivers/power/pcf50633-charger.c b/drivers/power/pcf50633-charger.c index 41aec2a..1fe1e85 100644 --- a/drivers/power/pcf50633-charger.c +++ b/drivers/power/pcf50633-charger.c @@ -36,6 +36,8 @@ struct pcf50633_mbc { struct power_supply usb; struct power_supply adapter; + + struct delayed_work charging_restart_work; }; int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma) @@ -43,6 +45,8 @@ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma) struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev); int ret = 0; u8 bits; + int charging_start = 1; + u8 mbcs2, chgmod; if (ma >= 1000) bits = PCF50633_MBCC7_USB_1000mA; @@ -50,8 +54,10 @@ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma) bits = PCF50633_MBCC7_USB_500mA; else if (ma >= 100) bits = PCF50633_MBCC7_USB_100mA; - else + else { bits = PCF50633_MBCC7_USB_SUSPEND; + charging_start = 0; + } ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC7, PCF50633_MBCC7_USB_MASK, bits); @@ -60,6 +66,22 @@ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma) else dev_info(pcf->dev, "usb curlim to %d mA\n", ma); + /* Manual charging start */ + mbcs2 = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2); + chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK); + + /* If chgmod == BATFULL, setting chgena has no effect. + * We need to set resume instead. + */ + if (chgmod != PCF50633_MBCS2_MBC_BAT_FULL) + pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1, + PCF50633_MBCC1_CHGENA, PCF50633_MBCC1_CHGENA); + else + pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1, + PCF50633_MBCC1_RESUME, PCF50633_MBCC1_RESUME); + + mbc->usb_active = charging_start; + power_supply_changed(&mbc->usb); return ret; @@ -160,10 +182,44 @@ static struct attribute_group mbc_attr_group = { .attrs = pcf50633_mbc_sysfs_entries, }; +/* MBC state machine switches into charging mode when the battery voltage + * falls below 96% of a battery float voltage. But the voltage drop in Li-ion + * batteries is marginal(1~2 %) till about 80% of its capacity - which means, + * after a BATFULL, charging won't be restarted until 80%. + * + * This work_struct function restarts charging at regular intervals to make + * sure we don't discharge too much + */ + +static void pcf50633_mbc_charging_restart(struct work_struct *work) +{ + struct pcf50633_mbc *mbc; + u8 mbcs2, chgmod; + + mbc = container_of(work, struct pcf50633_mbc, + charging_restart_work.work); + + mbcs2 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS2); + chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK); + + if (chgmod != PCF50633_MBCS2_MBC_BAT_FULL) + return; + + /* Restart charging */ + pcf50633_reg_set_bit_mask(mbc->pcf, PCF50633_REG_MBCC1, + PCF50633_MBCC1_RESUME, PCF50633_MBCC1_RESUME); + mbc->usb_active = 1; + power_supply_changed(&mbc->usb); + + dev_info(mbc->pcf->dev, "Charging restarted\n"); +} + static void pcf50633_mbc_irq_handler(int irq, void *data) { struct pcf50633_mbc *mbc = data; + int chg_restart_interval = + mbc->pcf->pdata->charging_restart_interval; /* USB */ if (irq == PCF50633_IRQ_USBINS) { @@ -172,6 +228,7 @@ pcf50633_mbc_irq_handler(int irq, void *data) mbc->usb_online = 0; mbc->usb_active = 0; pcf50633_mbc_usb_curlim_set(mbc->pcf, 0); + cancel_delayed_work_sync(&mbc->charging_restart_work); } /* Adapter */ @@ -186,7 +243,14 @@ pcf50633_mbc_irq_handler(int irq, void *data) if (irq == PCF50633_IRQ_BATFULL) { mbc->usb_active = 0; mbc->adapter_active = 0; - } + + if (chg_restart_interval > 0) + schedule_delayed_work(&mbc->charging_restart_work, + chg_restart_interval); + } else if (irq == PCF50633_IRQ_USBLIMON) + mbc->usb_active = 0; + else if (irq == PCF50633_IRQ_USBLIMOFF) + mbc->usb_active = 1; power_supply_changed(&mbc->usb); power_supply_changed(&mbc->adapter); @@ -303,6 +367,9 @@ static int __devinit pcf50633_mbc_probe(struct platform_device *pdev) return ret; } + INIT_DELAYED_WORK(&mbc->charging_restart_work, + pcf50633_mbc_charging_restart); + ret = sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group); if (ret) dev_err(mbc->pcf->dev, "failed to create sysfs entries\n"); @@ -328,6 +395,8 @@ static int __devexit pcf50633_mbc_remove(struct platform_device *pdev) power_supply_unregister(&mbc->usb); power_supply_unregister(&mbc->adapter); + cancel_delayed_work_sync(&mbc->charging_restart_work); + kfree(mbc); return 0; diff --git a/include/linux/mfd/pcf50633/core.h b/include/linux/mfd/pcf50633/core.h index 4455b21..c8f51c3 100644 --- a/include/linux/mfd/pcf50633/core.h +++ b/include/linux/mfd/pcf50633/core.h @@ -29,6 +29,8 @@ struct pcf50633_platform_data { char **batteries; int num_batteries; + int charging_restart_interval; + /* Callbacks */ void (*probe_done)(struct pcf50633 *); void (*mbc_event_callback)(struct pcf50633 *, int); -- cgit v0.10.2 From cc52a29e6245acd9032fcfa0ffcab4cc612de986 Mon Sep 17 00:00:00 2001 From: Balaji Rao Date: Tue, 27 Jan 2009 19:22:55 +0530 Subject: pcf50633_charger: Remove unused mbc_set_status function The 'pcf50633_mbc_set_status' function is unused, so remove it. Signed-off-by: Balaji Rao Cc: Andy Green Signed-off-by: Anton Vorontsov diff --git a/drivers/power/pcf50633-charger.c b/drivers/power/pcf50633-charger.c index 1fe1e85..e8b278f 100644 --- a/drivers/power/pcf50633-charger.c +++ b/drivers/power/pcf50633-charger.c @@ -106,21 +106,6 @@ int pcf50633_mbc_get_status(struct pcf50633 *pcf) } EXPORT_SYMBOL_GPL(pcf50633_mbc_get_status); -void pcf50633_mbc_set_status(struct pcf50633 *pcf, int what, int status) -{ - struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev); - - if (what & PCF50633_MBC_USB_ONLINE) - mbc->usb_online = !!status; - if (what & PCF50633_MBC_USB_ACTIVE) - mbc->usb_active = !!status; - if (what & PCF50633_MBC_ADAPTER_ONLINE) - mbc->adapter_online = !!status; - if (what & PCF50633_MBC_ADAPTER_ACTIVE) - mbc->adapter_active = !!status; -} -EXPORT_SYMBOL_GPL(pcf50633_mbc_set_status); - static ssize_t show_chgmode(struct device *dev, struct device_attribute *attr, char *buf) { diff --git a/include/linux/mfd/pcf50633/mbc.h b/include/linux/mfd/pcf50633/mbc.h index 6e17619..4119579 100644 --- a/include/linux/mfd/pcf50633/mbc.h +++ b/include/linux/mfd/pcf50633/mbc.h @@ -128,7 +128,6 @@ enum pcf50633_reg_mbcs3 { int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma); int pcf50633_mbc_get_status(struct pcf50633 *); -void pcf50633_mbc_set_status(struct pcf50633 *, int what, int status); #endif -- cgit v0.10.2 From 5bf2b994bfe11bfe86231050897b2d881ca544d9 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Sun, 18 Jan 2009 17:40:27 +0100 Subject: pda_power: Add optional OTG transceiver and voltage regulator support This patch allows machines to use an OTG transceiver driver instead of supplying a custom is_usb_online callback to check USB power. Also, in the case that the OTG transceiver handles charger control when connected to USB, a regulator named "ac_draw" can be supplied instead of the custom set_charge callback to control the charger when connected to AC. The check for (transceiver->state == OTG_STATE_B_PERIPHERAL) in otg_is_usb_online is probably too simple, I'm just using this with a peripheral only device and gpio_vbus + bq24022. I'm not sure which other OTG states can supply power. Signed-off-by: Philipp Zabel Signed-off-by: Anton Vorontsov diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c index b56a704..a232de6 100644 --- a/drivers/power/pda_power.c +++ b/drivers/power/pda_power.c @@ -12,11 +12,14 @@ #include #include +#include #include #include #include +#include #include #include +#include static inline unsigned int get_irq_flags(struct resource *res) { @@ -35,6 +38,11 @@ static struct timer_list supply_timer; static struct timer_list polling_timer; static int polling; +#ifdef CONFIG_USB_OTG_UTILS +static struct otg_transceiver *transceiver; +#endif +static struct regulator *ac_draw; + enum { PDA_PSY_OFFLINE = 0, PDA_PSY_ONLINE = 1, @@ -104,18 +112,35 @@ static void update_status(void) static void update_charger(void) { - if (!pdata->set_charge) - return; - - if (new_ac_status > 0) { - dev_dbg(dev, "charger on (AC)\n"); - pdata->set_charge(PDA_POWER_CHARGE_AC); - } else if (new_usb_status > 0) { - dev_dbg(dev, "charger on (USB)\n"); - pdata->set_charge(PDA_POWER_CHARGE_USB); - } else { - dev_dbg(dev, "charger off\n"); - pdata->set_charge(0); + static int regulator_enabled; + int max_uA = pdata->ac_max_uA; + + if (pdata->set_charge) { + if (new_ac_status > 0) { + dev_dbg(dev, "charger on (AC)\n"); + pdata->set_charge(PDA_POWER_CHARGE_AC); + } else if (new_usb_status > 0) { + dev_dbg(dev, "charger on (USB)\n"); + pdata->set_charge(PDA_POWER_CHARGE_USB); + } else { + dev_dbg(dev, "charger off\n"); + pdata->set_charge(0); + } + } else if (ac_draw) { + if (new_ac_status > 0) { + regulator_set_current_limit(ac_draw, max_uA, max_uA); + if (!regulator_enabled) { + dev_dbg(dev, "charger on (AC)\n"); + regulator_enable(ac_draw); + regulator_enabled = 1; + } + } else { + if (regulator_enabled) { + dev_dbg(dev, "charger off\n"); + regulator_disable(ac_draw); + regulator_enabled = 0; + } + } } } @@ -194,6 +219,13 @@ static void polling_timer_func(unsigned long unused) jiffies + msecs_to_jiffies(pdata->polling_interval)); } +#ifdef CONFIG_USB_OTG_UTILS +static int otg_is_usb_online(void) +{ + return (transceiver->state == OTG_STATE_B_PERIPHERAL); +} +#endif + static int pda_power_probe(struct platform_device *pdev) { int ret = 0; @@ -227,6 +259,9 @@ static int pda_power_probe(struct platform_device *pdev) if (!pdata->polling_interval) pdata->polling_interval = 2000; + if (!pdata->ac_max_uA) + pdata->ac_max_uA = 500000; + setup_timer(&charger_timer, charger_timer_func, 0); setup_timer(&supply_timer, supply_timer_func, 0); @@ -240,6 +275,13 @@ static int pda_power_probe(struct platform_device *pdev) pda_psy_usb.num_supplicants = pdata->num_supplicants; } + ac_draw = regulator_get(dev, "ac_draw"); + if (IS_ERR(ac_draw)) { + dev_dbg(dev, "couldn't get ac_draw regulator\n"); + ac_draw = NULL; + ret = PTR_ERR(ac_draw); + } + if (pdata->is_ac_online) { ret = power_supply_register(&pdev->dev, &pda_psy_ac); if (ret) { @@ -261,6 +303,13 @@ static int pda_power_probe(struct platform_device *pdev) } } +#ifdef CONFIG_USB_OTG_UTILS + transceiver = otg_get_transceiver(); + if (transceiver && !pdata->is_usb_online) { + pdata->is_usb_online = otg_is_usb_online; + } +#endif + if (pdata->is_usb_online) { ret = power_supply_register(&pdev->dev, &pda_psy_usb); if (ret) { @@ -300,10 +349,18 @@ usb_irq_failed: usb_supply_failed: if (pdata->is_ac_online && ac_irq) free_irq(ac_irq->start, &pda_psy_ac); +#ifdef CONFIG_USB_OTG_UTILS + if (transceiver) + otg_put_transceiver(transceiver); +#endif ac_irq_failed: if (pdata->is_ac_online) power_supply_unregister(&pda_psy_ac); ac_supply_failed: + if (ac_draw) { + regulator_put(ac_draw); + ac_draw = NULL; + } if (pdata->exit) pdata->exit(dev); init_failed: @@ -327,6 +384,14 @@ static int pda_power_remove(struct platform_device *pdev) power_supply_unregister(&pda_psy_usb); if (pdata->is_ac_online) power_supply_unregister(&pda_psy_ac); +#ifdef CONFIG_USB_OTG_UTILS + if (transceiver) + otg_put_transceiver(transceiver); +#endif + if (ac_draw) { + regulator_put(ac_draw); + ac_draw = NULL; + } if (pdata->exit) pdata->exit(dev); diff --git a/include/linux/pda_power.h b/include/linux/pda_power.h index cb7d10f..d4cf7a2 100644 --- a/include/linux/pda_power.h +++ b/include/linux/pda_power.h @@ -31,6 +31,8 @@ struct pda_power_pdata { unsigned int wait_for_status; /* msecs, default is 500 */ unsigned int wait_for_charger; /* msecs, default is 500 */ unsigned int polling_interval; /* msecs, default is 2000 */ + + unsigned long ac_max_uA; /* current to draw when on AC */ }; #endif /* __PDA_POWER_H__ */ -- cgit v0.10.2 From 0f4954819fb6f840d46076f0dbd313ef5da48f5d Mon Sep 17 00:00:00 2001 From: Andy Whitcroft Date: Sat, 28 Feb 2009 14:55:46 -0800 Subject: Input: psmouse - add newline to OLPC HGPK touchpad debugging When probing for the OLPC HGPK touchpad the ID of the probed touchpad is emitted, but the debug is missing the terminating newline. This causes later information to run into it, and for that to be categorised incorrectly at KERN_DBG. Fix this up. Reported-by: Matt Zimmerman Signed-off-by: Andy Whitcroft Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index 81e6ebf..a14a6b0 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c @@ -472,7 +472,7 @@ static enum hgpk_model_t hgpk_get_model(struct psmouse *psmouse) return -EIO; } - hgpk_dbg(psmouse, "ID: %02x %02x %02x", param[0], param[1], param[2]); + hgpk_dbg(psmouse, "ID: %02x %02x %02x\n", param[0], param[1], param[2]); /* HGPK signature: 0x67, 0x00, 0x */ if (param[0] != 0x67 || param[1] != 0x00) -- cgit v0.10.2 From fa88661224946145819a904cef2ec7dd5c9c78bc Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Wed, 4 Mar 2009 00:52:20 -0800 Subject: Input: fix polling of /proc/bus/input/devices Tested-by: Alessio Sangalli Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/input.c b/drivers/input/input.c index 46e9ce1..913392f 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -744,11 +744,11 @@ static inline void input_wakeup_procfs_readers(void) static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait) { - int state = input_devices_state; - poll_wait(file, &input_devices_poll_wait, wait); - if (state != input_devices_state) + if (file->f_version != input_devices_state) { + file->f_version = input_devices_state; return POLLIN | POLLRDNORM; + } return 0; } -- cgit v0.10.2 From 65db86ac07e2f7f91a552490c0be6a99aab8e4a8 Mon Sep 17 00:00:00 2001 From: Mike Rapoport Date: Wed, 4 Mar 2009 01:12:37 -0800 Subject: Input: wm97xx - add BTN_TOUCH event to wm97xx to use it with Android Android expects BTN_TOUCH events when pen state changes. Add BTN_TOUCH event reporting to allow use of wm97xx touchscreen controller wiht Android devices. Signed-off-by: Mike Rapoport Signed-off-by: Mark Brown Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index d15aa11..cec480b 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c @@ -409,6 +409,7 @@ static int wm97xx_read_samples(struct wm97xx *wm) wm->pen_is_down = 0; dev_dbg(wm->dev, "pen up\n"); input_report_abs(wm->input_dev, ABS_PRESSURE, 0); + input_report_key(wm->input_dev, BTN_TOUCH, 0); input_sync(wm->input_dev); } else if (!(rc & RC_AGAIN)) { /* We need high frequency updates only while @@ -433,6 +434,7 @@ static int wm97xx_read_samples(struct wm97xx *wm) input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, 1); input_sync(wm->input_dev); wm->pen_is_down = 1; wm->ts_reader_interval = wm->ts_reader_min_interval; @@ -628,18 +630,21 @@ static int wm97xx_probe(struct device *dev) wm->input_dev->phys = "wm97xx"; wm->input_dev->open = wm97xx_ts_input_open; wm->input_dev->close = wm97xx_ts_input_close; - set_bit(EV_ABS, wm->input_dev->evbit); - set_bit(ABS_X, wm->input_dev->absbit); - set_bit(ABS_Y, wm->input_dev->absbit); - set_bit(ABS_PRESSURE, wm->input_dev->absbit); + + __set_bit(EV_ABS, wm->input_dev->evbit); + __set_bit(EV_KEY, wm->input_dev->evbit); + __set_bit(BTN_TOUCH, wm->input_dev->keybit); + input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1], abs_x[2], 0); input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1], abs_y[2], 0); input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1], abs_p[2], 0); + input_set_drvdata(wm->input_dev, wm); wm->input_dev->dev.parent = dev; + ret = input_register_device(wm->input_dev); if (ret < 0) goto dev_alloc_err; -- cgit v0.10.2 From a700e72dd009c79c62e78ebeefa27315db6e1e60 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 4 Mar 2009 01:12:49 -0800 Subject: Input: wm97xx - use disable_irq_nosync() for Mainstone This should make no practical difference since the Mainstone can't be SMP but it is more correct. Signed-off-by: Mark Brown Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c b/drivers/input/touchscreen/mainstone-wm97xx.c index 1d11e2b..08d3dbd 100644 --- a/drivers/input/touchscreen/mainstone-wm97xx.c +++ b/drivers/input/touchscreen/mainstone-wm97xx.c @@ -245,7 +245,7 @@ static void wm97xx_irq_enable(struct wm97xx *wm, int enable) if (enable) enable_irq(wm->pen_irq); else - disable_irq(wm->pen_irq); + disable_irq_nosync(wm->pen_irq); } static struct wm97xx_mach_ops mainstone_mach_ops = { -- cgit v0.10.2 From cd2d64b1a0a12283d63c9d853d5b1403d5cd6c9d Mon Sep 17 00:00:00 2001 From: Mike Rapoport Date: Wed, 4 Mar 2009 01:12:49 -0800 Subject: Input: ucb1400_ts, mainstone-wm97xx - add BTN_TOUCH events Add BTN_TOUCH event reporting to ucb1400_ts and accelerated mainstone-wm97xx touchscreen drivers. Together with previously posted similar patch for wm97xx-core this will make all touchscreen drivers behave consistently wrt. BTN_TOUCH. Signed-off-by: Mike Rapoport Signed-off-by: Mark Brown Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c b/drivers/input/touchscreen/mainstone-wm97xx.c index 08d3dbd..dfa6a84 100644 --- a/drivers/input/touchscreen/mainstone-wm97xx.c +++ b/drivers/input/touchscreen/mainstone-wm97xx.c @@ -162,6 +162,7 @@ static int wm97xx_acc_pen_down(struct wm97xx *wm) input_report_abs(wm->input_dev, ABS_X, x & 0xfff); input_report_abs(wm->input_dev, ABS_Y, y & 0xfff); input_report_abs(wm->input_dev, ABS_PRESSURE, p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, (p != 0)); input_sync(wm->input_dev); reads++; } while (reads < cinfo[sp_idx].reads); diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index 5498662..e868264 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c @@ -151,12 +151,14 @@ static void ucb1400_ts_evt_add(struct input_dev *idev, u16 pressure, u16 x, u16 input_report_abs(idev, ABS_X, x); input_report_abs(idev, ABS_Y, y); input_report_abs(idev, ABS_PRESSURE, pressure); + input_report_key(idev, BTN_TOUCH, 1); input_sync(idev); } static void ucb1400_ts_event_release(struct input_dev *idev) { input_report_abs(idev, ABS_PRESSURE, 0); + input_report_key(idev, BTN_TOUCH, 0); input_sync(idev); } @@ -377,7 +379,8 @@ static int ucb1400_ts_probe(struct platform_device *dev) ucb->ts_idev->id.product = ucb->id; ucb->ts_idev->open = ucb1400_ts_open; ucb->ts_idev->close = ucb1400_ts_close; - ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS); + ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); ucb1400_adc_enable(ucb->ac97); x_res = ucb1400_ts_read_xres(ucb); -- cgit v0.10.2 From 22e39d344f5f3465dffb9e2713bb8d7cf1f5aec8 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 4 Mar 2009 01:12:49 -0800 Subject: Input: add accelerated touchscreen support for Marvell Zylonite This patch implements accelerated touchscreen support for the Marvell Zylonite development platform, supporting pen down interrupts and continuous mode data transfers. Signed-off-by: Mark Brown Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index bb6486a..a31d434 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -308,6 +308,19 @@ config TOUCHSCREEN_WM97XX_MAINSTONE To compile this driver as a module, choose M here: the module will be called mainstone-wm97xx. +config TOUCHSCREEN_WM97XX_ZYLONITE + tristate "Zylonite accelerated touch" + depends on TOUCHSCREEN_WM97XX && MACH_ZYLONITE + select TOUCHSCREEN_WM9713 + help + Say Y here for support for streaming mode with the touchscreen + on Zylonite systems. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called zylonite-wm97xx. + config TOUCHSCREEN_USB_COMPOSITE tristate "USB Touchscreen Driver" depends on USB_ARCH_HAS_HCD diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index d3375af..82dd918 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -34,3 +34,4 @@ wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9713) += wm9713.o obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o +obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o diff --git a/drivers/input/touchscreen/zylonite-wm97xx.c b/drivers/input/touchscreen/zylonite-wm97xx.c new file mode 100644 index 0000000..41e4359 --- /dev/null +++ b/drivers/input/touchscreen/zylonite-wm97xx.c @@ -0,0 +1,240 @@ +/* + * zylonite-wm97xx.c -- Zylonite Continuous Touch screen driver + * + * Copyright 2004, 2007, 2008 Wolfson Microelectronics PLC. + * Author: Mark Brown + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * + * 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. + * + * Notes: + * This is a wm97xx extended touch driver supporting interrupt driven + * and continuous operation on Marvell Zylonite development systems + * (which have a WM9713 on board). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct continuous { + u16 id; /* codec id */ + u8 code; /* continuous code */ + u8 reads; /* number of coord reads per read cycle */ + u32 speed; /* number of coords per second */ +}; + +#define WM_READS(sp) ((sp / HZ) + 1) + +static const struct continuous cinfo[] = { + { WM9713_ID2, 0, WM_READS(94), 94 }, + { WM9713_ID2, 1, WM_READS(120), 120 }, + { WM9713_ID2, 2, WM_READS(154), 154 }, + { WM9713_ID2, 3, WM_READS(188), 188 }, +}; + +/* continuous speed index */ +static int sp_idx; + +/* + * Pen sampling frequency (Hz) in continuous mode. + */ +static int cont_rate = 200; +module_param(cont_rate, int, 0); +MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); + +/* + * Pressure readback. + * + * Set to 1 to read back pen down pressure + */ +static int pressure; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); + +/* + * AC97 touch data slot. + * + * Touch screen readback data ac97 slot + */ +static int ac97_touch_slot = 5; +module_param(ac97_touch_slot, int, 0); +MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); + + +/* flush AC97 slot 5 FIFO machines */ +static void wm97xx_acc_pen_up(struct wm97xx *wm) +{ + int i; + + msleep(1); + + for (i = 0; i < 16; i++) + MODR; +} + +static int wm97xx_acc_pen_down(struct wm97xx *wm) +{ + u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES; + int reads = 0; + static u16 last, tries; + + /* When the AC97 queue has been drained we need to allow time + * to buffer up samples otherwise we end up spinning polling + * for samples. The controller can't have a suitably low + * threashold set to use the notifications it gives. + */ + msleep(1); + + if (tries > 5) { + tries = 0; + return RC_PENUP; + } + + x = MODR; + if (x == last) { + tries++; + return RC_AGAIN; + } + last = x; + do { + if (reads) + x = MODR; + y = MODR; + if (pressure) + p = MODR; + + /* are samples valid */ + if ((x & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_X || + (y & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_Y || + (p & WM97XX_ADCSRC_MASK) != WM97XX_ADCSEL_PRES) + goto up; + + /* coordinate is good */ + tries = 0; + input_report_abs(wm->input_dev, ABS_X, x & 0xfff); + input_report_abs(wm->input_dev, ABS_Y, y & 0xfff); + input_report_abs(wm->input_dev, ABS_PRESSURE, p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, (p != 0)); + input_sync(wm->input_dev); + reads++; + } while (reads < cinfo[sp_idx].reads); +up: + return RC_PENDOWN | RC_AGAIN; +} + +static int wm97xx_acc_startup(struct wm97xx *wm) +{ + int idx; + + /* check we have a codec */ + if (wm->ac97 == NULL) + return -ENODEV; + + /* Go you big red fire engine */ + for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { + if (wm->id != cinfo[idx].id) + continue; + sp_idx = idx; + if (cont_rate <= cinfo[idx].speed) + break; + } + wm->acc_rate = cinfo[sp_idx].code; + wm->acc_slot = ac97_touch_slot; + dev_info(wm->dev, + "zylonite accelerated touchscreen driver, %d samples/sec\n", + cinfo[sp_idx].speed); + + return 0; +} + +static void wm97xx_irq_enable(struct wm97xx *wm, int enable) +{ + if (enable) + enable_irq(wm->pen_irq); + else + disable_irq_nosync(wm->pen_irq); +} + +static struct wm97xx_mach_ops zylonite_mach_ops = { + .acc_enabled = 1, + .acc_pen_up = wm97xx_acc_pen_up, + .acc_pen_down = wm97xx_acc_pen_down, + .acc_startup = wm97xx_acc_startup, + .irq_enable = wm97xx_irq_enable, + .irq_gpio = WM97XX_GPIO_2, +}; + +static int zylonite_wm97xx_probe(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + int gpio_touch_irq; + + if (cpu_is_pxa320()) + gpio_touch_irq = mfp_to_gpio(MFP_PIN_GPIO15); + else + gpio_touch_irq = mfp_to_gpio(MFP_PIN_GPIO26); + + wm->pen_irq = IRQ_GPIO(gpio_touch_irq); + set_irq_type(IRQ_GPIO(gpio_touch_irq), IRQ_TYPE_EDGE_BOTH); + + wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_STICKY, + WM97XX_GPIO_WAKE); + wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_NOTSTICKY, + WM97XX_GPIO_NOWAKE); + + return wm97xx_register_mach_ops(wm, &zylonite_mach_ops); +} + +static int zylonite_wm97xx_remove(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + + wm97xx_unregister_mach_ops(wm); + + return 0; +} + +static struct platform_driver zylonite_wm97xx_driver = { + .probe = zylonite_wm97xx_probe, + .remove = zylonite_wm97xx_remove, + .driver = { + .name = "wm97xx-touch", + }, +}; + +static int __init zylonite_wm97xx_init(void) +{ + return platform_driver_register(&zylonite_wm97xx_driver); +} + +static void __exit zylonite_wm97xx_exit(void) +{ + platform_driver_unregister(&zylonite_wm97xx_driver); +} + +module_init(zylonite_wm97xx_init); +module_exit(zylonite_wm97xx_exit); + +/* Module information */ +MODULE_AUTHOR("Mark Brown "); +MODULE_DESCRIPTION("wm97xx continuous touch driver for Zylonite"); +MODULE_LICENSE("GPL"); -- cgit v0.10.2 From 391916985b009b8934d00f772a3bde0d8a495ebd Mon Sep 17 00:00:00 2001 From: Daniel Mierswa Date: Wed, 4 Mar 2009 23:27:15 -0800 Subject: Input: atkbd - consolidate force release quirk setup Signed-off-by: Andrew Morton Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 45470f1..9d940db 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -229,7 +229,8 @@ struct atkbd { /* * System-specific ketymap fixup routine */ -static void (*atkbd_platform_fixup)(struct atkbd *); +static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); +static void *atkbd_platform_fixup_data; static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, ssize_t (*handler)(struct atkbd *, char *)); @@ -834,87 +835,56 @@ static void atkbd_disconnect(struct serio *serio) } /* - * Most special keys (Fn+F?) on Dell laptops do not generate release - * events so we have to do it ourselves. + * generate release events for the keycodes given in data */ -static void atkbd_dell_laptop_keymap_fixup(struct atkbd *atkbd) +static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd, + const void *data) { - static const unsigned int forced_release_keys[] = { - 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, - }; - int i; + const unsigned int *keys = data; + unsigned int i; if (atkbd->set == 2) - for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) - __set_bit(forced_release_keys[i], - atkbd->force_release_mask); + for (i = 0; keys[i] != -1U; i++) + __set_bit(keys[i], atkbd->force_release_mask); } /* + * Most special keys (Fn+F?) on Dell laptops do not generate release + * events so we have to do it ourselves. + */ +static unsigned int atkbd_dell_laptop_forced_release_keys[] = { + 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, -1U +}; + +/* * Perform fixup for HP system that doesn't generate release * for its video switch */ -static void atkbd_hp_keymap_fixup(struct atkbd *atkbd) -{ - static const unsigned int forced_release_keys[] = { - 0x94, - }; - int i; - - if (atkbd->set == 2) - for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) - __set_bit(forced_release_keys[i], - atkbd->force_release_mask); -} +static unsigned int atkbd_hp_forced_release_keys[] = { + 0x94, -1U +}; /* * Inventec system with broken key release on volume keys */ -static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd) -{ - const unsigned int forced_release_keys[] = { - 0xae, 0xb0, - }; - int i; - - if (atkbd->set == 2) - for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) - __set_bit(forced_release_keys[i], - atkbd->force_release_mask); -} +static unsigned int atkbd_inventec_forced_release_keys[] = { + 0xae, 0xb0, -1U +}; /* * Perform fixup for HP Pavilion ZV6100 laptop that doesn't generate release * for its volume buttons */ -static void atkbd_hp_zv6100_keymap_fixup(struct atkbd *atkbd) -{ - const unsigned int forced_release_keys[] = { - 0xae, 0xb0, - }; - int i; - - if (atkbd->set == 2) - for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) - __set_bit(forced_release_keys[i], - atkbd->force_release_mask); -} +static unsigned int atkbd_hp_zv6100_forced_release_keys[] = { + 0xae, 0xb0, -1U +}; /* * Samsung NC10 with Fn+F? key release not working */ -static void atkbd_samsung_keymap_fixup(struct atkbd *atkbd) -{ - const unsigned int forced_release_keys[] = { - 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, - }; - int i; - - if (atkbd->set == 2) - for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) - __set_bit(forced_release_keys[i], - atkbd->force_release_mask); -} +static unsigned int atkbd_samsung_forced_release_keys[] = { + 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U +}; /* * atkbd_set_keycode_table() initializes keyboard's keycode table @@ -967,7 +937,7 @@ static void atkbd_set_keycode_table(struct atkbd *atkbd) * Perform additional fixups */ if (atkbd_platform_fixup) - atkbd_platform_fixup(atkbd); + atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data); } /* @@ -1492,9 +1462,11 @@ static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf) return sprintf(buf, "%lu\n", atkbd->err_count); } -static int __init atkbd_setup_fixup(const struct dmi_system_id *id) +static int __init atkbd_setup_forced_release(const struct dmi_system_id *id) { - atkbd_platform_fixup = id->driver_data; + atkbd_platform_fixup = atkbd_apply_forced_release_keylist; + atkbd_platform_fixup_data = id->driver_data; + return 0; } @@ -1505,8 +1477,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_dell_laptop_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_dell_laptop_forced_release_keys, }, { .ident = "Dell Laptop", @@ -1514,8 +1486,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_dell_laptop_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_dell_laptop_forced_release_keys, }, { .ident = "HP 2133", @@ -1523,8 +1495,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"), }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_hp_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_hp_forced_release_keys, }, { .ident = "HP Pavilion ZV6100", @@ -1532,8 +1504,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_hp_zv6100_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_hp_zv6100_forced_release_keys, }, { .ident = "Inventec Symphony", @@ -1541,8 +1513,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_inventec_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_inventec_forced_release_keys, }, { .ident = "Samsung NC10", @@ -1550,8 +1522,8 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), DMI_MATCH(DMI_PRODUCT_NAME, "NC10"), }, - .callback = atkbd_setup_fixup, - .driver_data = atkbd_samsung_keymap_fixup, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_samsung_forced_release_keys, }, { } }; -- cgit v0.10.2 From adcb523eb39e0dd2f712d8dbd8e18b5d36a97825 Mon Sep 17 00:00:00 2001 From: Daniel Mierswa Date: Wed, 4 Mar 2009 23:27:15 -0800 Subject: Input: atkbd - add quirk for Fujitsu Siemens Amilo PA 1510 The volume up and down keys on the Fujitsu Siemens Amilo PA 1510 laptop won't generate release events, so we have to do that. Use the same way that is already used with other models. Signed-off-by: Andrew Morton Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 9d940db..f999dc6 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -887,6 +887,14 @@ static unsigned int atkbd_samsung_forced_release_keys[] = { }; /* + * The volume up and volume down special keys on a Fujitsu Amilo PA 1510 laptop + * do not generate release events so we have to do it ourselves. + */ +static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = { + 0xb0, 0xae, -1U +}; + +/* * atkbd_set_keycode_table() initializes keyboard's keycode table * according to the selected scancode set */ @@ -1525,6 +1533,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { .callback = atkbd_setup_forced_release, .driver_data = atkbd_samsung_forced_release_keys, }, + { + .ident = "Fujitsu Amilo PA 1510", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_amilo_pa1510_forced_release_keys, + }, { } }; -- cgit v0.10.2 From b0ecc7309443dbcf1a0ce2d93f39f5d92c124d42 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Wed, 4 Mar 2009 23:27:15 -0800 Subject: Input: hilkbd - fix crash when removing hilkbd module On parisc machines, which don't have HIL, removing the hilkbd module panics the kernel. Fix this by adding proper implementations for the probe and remove functions to the parisc_driver structure. A few functions were renamed to clean up the code and make it easier readable. Disable the MODULE_DEVICE_TABLE() macro on parisc since the kernel module autoloader should instead prefer the hp_sdc driver which takes care of full HIL support, including HIL mouse and HIL tablets. [dtor@mail.ru: fix some section markups] Signed-off-by: Helge Deller Acked-by: Geert Uytterhoeven Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/keyboard/hilkbd.c b/drivers/input/keyboard/hilkbd.c index aacf71f..e9d639e 100644 --- a/drivers/input/keyboard/hilkbd.c +++ b/drivers/input/keyboard/hilkbd.c @@ -198,45 +198,28 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len) } -/* initialise HIL */ -static int __init -hil_keyb_init(void) +/* initialize HIL */ +static int __devinit hil_keyb_init(void) { unsigned char c; unsigned int i, kbid; wait_queue_head_t hil_wait; int err; - if (hil_dev.dev) { + if (hil_dev.dev) return -ENODEV; /* already initialized */ - } + init_waitqueue_head(&hil_wait); spin_lock_init(&hil_dev.lock); + hil_dev.dev = input_allocate_device(); if (!hil_dev.dev) return -ENOMEM; -#if defined(CONFIG_HP300) - if (!MACH_IS_HP300) { - err = -ENODEV; - goto err1; - } - if (!hwreg_present((void *)(HILBASE + HIL_DATA))) { - printk(KERN_ERR "HIL: hardware register was not found\n"); - err = -ENODEV; - goto err1; - } - if (!request_region(HILBASE + HIL_DATA, 2, "hil")) { - printk(KERN_ERR "HIL: IOPORT region already used\n"); - err = -EIO; - goto err1; - } -#endif - err = request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id); if (err) { printk(KERN_ERR "HIL: Can't get IRQ\n"); - goto err2; + goto err1; } /* Turn on interrupts */ @@ -246,11 +229,9 @@ hil_keyb_init(void) hil_dev.valid = 0; /* clear any pending data */ hil_do(HIL_READKBDSADR, NULL, 0); - init_waitqueue_head(&hil_wait); - wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3*HZ); - if (!hil_dev.valid) { + wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3 * HZ); + if (!hil_dev.valid) printk(KERN_WARNING "HIL: timed out, assuming no keyboard present\n"); - } c = hil_dev.c; hil_dev.valid = 0; @@ -268,7 +249,7 @@ hil_keyb_init(void) for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++) if (hphilkeyb_keycode[i] != KEY_RESERVED) - set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit); + __set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit); hil_dev.dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); hil_dev.dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) | @@ -287,34 +268,45 @@ hil_keyb_init(void) err = input_register_device(hil_dev.dev); if (err) { printk(KERN_ERR "HIL: Can't register device\n"); - goto err3; + goto err2; } + printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n", hil_dev.dev->name, kbid, HILBASE, HIL_IRQ); return 0; -err3: +err2: hil_do(HIL_INTOFF, NULL, 0); - disable_irq(HIL_IRQ); free_irq(HIL_IRQ, hil_dev.dev_id); -err2: -#if defined(CONFIG_HP300) - release_region(HILBASE + HIL_DATA, 2); err1: -#endif input_free_device(hil_dev.dev); hil_dev.dev = NULL; return err; } +static void __devexit hil_keyb_exit(void) +{ + if (HIL_IRQ) + free_irq(HIL_IRQ, hil_dev.dev_id); + + /* Turn off interrupts */ + hil_do(HIL_INTOFF, NULL, 0); + + input_unregister_device(hil_dev.dev); + hil_dev.dev = NULL; +} #if defined(CONFIG_PARISC) -static int __init -hil_init_chip(struct parisc_device *dev) +static int __devinit hil_probe_chip(struct parisc_device *dev) { + /* Only allow one HIL keyboard */ + if (hil_dev.dev) + return -ENODEV; + if (!dev->irq) { - printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n", dev->hpa.start); + printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%p\n", + (void *)dev->hpa.start); return -ENODEV; } @@ -327,51 +319,79 @@ hil_init_chip(struct parisc_device *dev) return hil_keyb_init(); } +static int __devexit hil_remove_chip(struct parisc_device *dev) +{ + hil_keyb_exit(); + + return 0; +} + static struct parisc_device_id hil_tbl[] = { { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00073 }, { 0, } }; +#if 0 +/* Disabled to avoid conflicts with the HP SDC HIL drivers */ MODULE_DEVICE_TABLE(parisc, hil_tbl); +#endif static struct parisc_driver hil_driver = { - .name = "hil", - .id_table = hil_tbl, - .probe = hil_init_chip, + .name = "hil", + .id_table = hil_tbl, + .probe = hil_probe_chip, + .remove = __devexit_p(hil_remove_chip), }; -#endif /* CONFIG_PARISC */ - static int __init hil_init(void) { -#if defined(CONFIG_PARISC) return register_parisc_driver(&hil_driver); -#else - return hil_keyb_init(); -#endif } - static void __exit hil_exit(void) { - if (HIL_IRQ) { - disable_irq(HIL_IRQ); - free_irq(HIL_IRQ, hil_dev.dev_id); + unregister_parisc_driver(&hil_driver); +} + +#else /* !CONFIG_PARISC */ + +static int __init hil_init(void) +{ + int error; + + /* Only allow one HIL keyboard */ + if (hil_dev.dev) + return -EBUSY; + + if (!MACH_IS_HP300) + return -ENODEV; + + if (!hwreg_present((void *)(HILBASE + HIL_DATA))) { + printk(KERN_ERR "HIL: hardware register was not found\n"); + return -ENODEV; } - /* Turn off interrupts */ - hil_do(HIL_INTOFF, NULL, 0); + if (!request_region(HILBASE + HIL_DATA, 2, "hil")) { + printk(KERN_ERR "HIL: IOPORT region already used\n"); + return -EIO; + } - input_unregister_device(hil_dev.dev); + error = hil_keyb_init(); + if (error) { + release_region(HILBASE + HIL_DATA, 2); + return error; + } - hil_dev.dev = NULL; + return 0; +} -#if defined(CONFIG_PARISC) - unregister_parisc_driver(&hil_driver); -#else - release_region(HILBASE+HIL_DATA, 2); -#endif +static void __exit hil_exit(void) +{ + hil_keyb_exit(); + release_region(HILBASE + HIL_DATA, 2); } +#endif /* CONFIG_PARISC */ + module_init(hil_init); module_exit(hil_exit); -- cgit v0.10.2 From 73969ff0eda233f140bcbed1251431387b43f383 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 4 Mar 2009 23:27:14 -0800 Subject: Input: generic driver for rotary encoders on GPIOs This patch adds a generic driver for rotary encoders connected to GPIO pins of a system. It relies on gpiolib and generic hardware irqs. The documentation that also comes with this patch explains the concept and how to use the driver. Signed-off-by: Daniel Mack Tested-by: H Hartley Sweeten Signed-off-by: Dmitry Torokhov diff --git a/Documentation/input/rotary-encoder.txt b/Documentation/input/rotary-encoder.txt new file mode 100644 index 0000000..435102a --- /dev/null +++ b/Documentation/input/rotary-encoder.txt @@ -0,0 +1,101 @@ +rotary-encoder - a generic driver for GPIO connected devices +Daniel Mack , Feb 2009 + +0. Function +----------- + +Rotary encoders are devices which are connected to the CPU or other +peripherals with two wires. The outputs are phase-shifted by 90 degrees +and by triggering on falling and rising edges, the turn direction can +be determined. + +The phase diagram of these two outputs look like this: + + _____ _____ _____ + | | | | | | + Channel A ____| |_____| |_____| |____ + + : : : : : : : : : : : : + __ _____ _____ _____ + | | | | | | | + Channel B |_____| |_____| |_____| |__ + + : : : : : : : : : : : : + Event a b c d a b c d a b c d + + |<-------->| + one step + + +For more information, please see + http://en.wikipedia.org/wiki/Rotary_encoder + + +1. Events / state machine +------------------------- + +a) Rising edge on channel A, channel B in low state + This state is used to recognize a clockwise turn + +b) Rising edge on channel B, channel A in high state + When entering this state, the encoder is put into 'armed' state, + meaning that there it has seen half the way of a one-step transition. + +c) Falling edge on channel A, channel B in high state + This state is used to recognize a counter-clockwise turn + +d) Falling edge on channel B, channel A in low state + Parking position. If the encoder enters this state, a full transition + should have happend, unless it flipped back on half the way. The + 'armed' state tells us about that. + +2. Platform requirements +------------------------ + +As there is no hardware dependent call in this driver, the platform it is +used with must support gpiolib. Another requirement is that IRQs must be +able to fire on both edges. + + +3. Board integration +-------------------- + +To use this driver in your system, register a platform_device with the +name 'rotary-encoder' and associate the IRQs and some specific platform +data with it. + +struct rotary_encoder_platform_data is declared in +include/linux/rotary-encoder.h and needs to be filled with the number of +steps the encoder has and can carry information about externally inverted +signals (because of used invertig buffer or other reasons). + +Because GPIO to IRQ mapping is platform specific, this information must +be given in seperately to the driver. See the example below. + +------------------ + +/* board support file example */ + +#include +#include + +#define GPIO_ROTARY_A 1 +#define GPIO_ROTARY_B 2 + +static struct rotary_encoder_platform_data my_rotary_encoder_info = { + .steps = 24, + .axis = ABS_X, + .gpio_a = GPIO_ROTARY_A, + .gpio_b = GPIO_ROTARY_B, + .inverted_a = 0, + .inverted_b = 0, +}; + +static struct platform_device rotary_encoder_device = { + .name = "rotary-encoder", + .id = 0, + .dev = { + .platform_data = &my_rotary_encoder_info, + } +}; + diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 67e5553..806d2e6 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -227,4 +227,15 @@ config INPUT_PCF50633_PMU Say Y to include support for delivering PMU events via input layer on NXP PCF50633. +config INPUT_GPIO_ROTARY_ENCODER + tristate "Rotary encoders connected to GPIO pins" + depends on GPIOLIB && GENERIC_GPIO + help + Say Y here to add support for rotary encoders connected to GPIO lines. + Check file:Documentation/incput/rotary_encoder.txt for more + information. + + To compile this driver as a module, choose M here: the + module will be called rotary_encoder. + endif diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index bb62e6e..e86cee6 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -22,3 +22,5 @@ obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_APANEL) += apanel.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o +obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o + diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c new file mode 100644 index 0000000..5bb3ab5 --- /dev/null +++ b/drivers/input/misc/rotary_encoder.c @@ -0,0 +1,221 @@ +/* + * rotary_encoder.c + * + * (c) 2009 Daniel Mack + * + * state machine code inspired by code from Tim Ruetz + * + * A generic driver for rotary encoders connected to GPIO lines. + * See file:Documentation/input/rotary_encoder.txt for more information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "rotary-encoder" + +struct rotary_encoder { + unsigned int irq_a; + unsigned int irq_b; + unsigned int pos; + unsigned int armed; + unsigned int dir; + struct input_dev *input; + struct rotary_encoder_platform_data *pdata; +}; + +static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) +{ + struct rotary_encoder *encoder = dev_id; + struct rotary_encoder_platform_data *pdata = encoder->pdata; + int a = !!gpio_get_value(pdata->gpio_a); + int b = !!gpio_get_value(pdata->gpio_b); + int state; + + a ^= pdata->inverted_a; + b ^= pdata->inverted_b; + state = (a << 1) | b; + + switch (state) { + + case 0x0: + if (!encoder->armed) + break; + + if (encoder->dir) { + /* turning counter-clockwise */ + encoder->pos += pdata->steps; + encoder->pos--; + encoder->pos %= pdata->steps; + } else { + /* turning clockwise */ + encoder->pos++; + encoder->pos %= pdata->steps; + } + + input_report_abs(encoder->input, pdata->axis, encoder->pos); + input_sync(encoder->input); + + encoder->armed = 0; + break; + + case 0x1: + case 0x2: + if (encoder->armed) + encoder->dir = state - 1; + break; + + case 0x3: + encoder->armed = 1; + break; + } + + return IRQ_HANDLED; +} + +static int __devinit rotary_encoder_probe(struct platform_device *pdev) +{ + struct rotary_encoder_platform_data *pdata = pdev->dev.platform_data; + struct rotary_encoder *encoder; + struct input_dev *input; + int err; + + if (!pdata || !pdata->steps) { + dev_err(&pdev->dev, "invalid platform data\n"); + return -ENOENT; + } + + encoder = kzalloc(sizeof(struct rotary_encoder), GFP_KERNEL); + input = input_allocate_device(); + if (!encoder || !input) { + dev_err(&pdev->dev, "failed to allocate memory for device\n"); + err = -ENOMEM; + goto exit_free_mem; + } + + encoder->input = input; + encoder->pdata = pdata; + encoder->irq_a = gpio_to_irq(pdata->gpio_a); + encoder->irq_b = gpio_to_irq(pdata->gpio_b); + + /* create and register the input driver */ + input->name = pdev->name; + input->id.bustype = BUS_HOST; + input->dev.parent = &pdev->dev; + input->evbit[0] = BIT_MASK(EV_ABS); + input_set_abs_params(encoder->input, + pdata->axis, 0, pdata->steps, 0, 1); + + err = input_register_device(input); + if (err) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto exit_free_mem; + } + + /* request the GPIOs */ + err = gpio_request(pdata->gpio_a, DRV_NAME); + if (err) { + dev_err(&pdev->dev, "unable to request GPIO %d\n", + pdata->gpio_a); + goto exit_unregister_input; + } + + err = gpio_request(pdata->gpio_b, DRV_NAME); + if (err) { + dev_err(&pdev->dev, "unable to request GPIO %d\n", + pdata->gpio_b); + goto exit_free_gpio_a; + } + + /* request the IRQs */ + err = request_irq(encoder->irq_a, &rotary_encoder_irq, + IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, + DRV_NAME, encoder); + if (err) { + dev_err(&pdev->dev, "unable to request IRQ %d\n", + encoder->irq_a); + goto exit_free_gpio_b; + } + + err = request_irq(encoder->irq_b, &rotary_encoder_irq, + IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, + DRV_NAME, encoder); + if (err) { + dev_err(&pdev->dev, "unable to request IRQ %d\n", + encoder->irq_b); + goto exit_free_irq_a; + } + + platform_set_drvdata(pdev, encoder); + + return 0; + +exit_free_irq_a: + free_irq(encoder->irq_a, encoder); +exit_free_gpio_b: + gpio_free(pdata->gpio_b); +exit_free_gpio_a: + gpio_free(pdata->gpio_a); +exit_unregister_input: + input_unregister_device(input); + input = NULL; /* so we don't try to free it */ +exit_free_mem: + input_free_device(input); + kfree(encoder); + return err; +} + +static int __devexit rotary_encoder_remove(struct platform_device *pdev) +{ + struct rotary_encoder *encoder = platform_get_drvdata(pdev); + struct rotary_encoder_platform_data *pdata = pdev->dev.platform_data; + + free_irq(encoder->irq_a, encoder); + free_irq(encoder->irq_b, encoder); + gpio_free(pdata->gpio_a); + gpio_free(pdata->gpio_b); + input_unregister_device(encoder->input); + platform_set_drvdata(pdev, NULL); + kfree(encoder); + + return 0; +} + +static struct platform_driver rotary_encoder_driver = { + .probe = rotary_encoder_probe, + .remove = __devexit_p(rotary_encoder_remove), + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + } +}; + +static int __init rotary_encoder_init(void) +{ + return platform_driver_register(&rotary_encoder_driver); +} + +static void __exit rotary_encoder_exit(void) +{ + platform_driver_unregister(&rotary_encoder_driver); +} + +module_init(rotary_encoder_init); +module_exit(rotary_encoder_exit); + +MODULE_ALIAS("platform:" DRV_NAME); +MODULE_DESCRIPTION("GPIO rotary encoder driver"); +MODULE_AUTHOR("Daniel Mack "); +MODULE_LICENSE("GPL v2"); + diff --git a/include/linux/rotary_encoder.h b/include/linux/rotary_encoder.h new file mode 100644 index 0000000..12d63a3 --- /dev/null +++ b/include/linux/rotary_encoder.h @@ -0,0 +1,13 @@ +#ifndef __ROTARY_ENCODER_H__ +#define __ROTARY_ENCODER_H__ + +struct rotary_encoder_platform_data { + unsigned int steps; + unsigned int axis; + unsigned int gpio_a; + unsigned int gpio_b; + unsigned int inverted_a; + unsigned int inverted_b; +}; + +#endif /* __ROTARY_ENCODER_H__ */ -- cgit v0.10.2 From d9bdffd2102404e8ea5f71c5b88dad890984164d Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Wed, 4 Mar 2009 23:27:15 -0800 Subject: Input: add driver for S1 button of rb532 Mikrotik's Routerboard 532 has two builtin buttons, from which one triggers a hardware reset. The other one is accessible through GPIO pin 1. Sadly, this pin is being multiplexed with UART0 input, so enabling it as interrupt source (as implied by the gpio-keys driver) is not possible unless UART0 has been turned off. The later one though is a rather bad idea as the Routerboard is an embedded device with only a single serial port, so it's almost always used as serial console device. This patch adds a driver based on INPUT_POLLDEV, which disables the UART and reconfigures GPIO pin 1 temporarily while reading the button state. This procedure works fine and has been tested as part of another, unpublished driver for this device. Signed-off-by: Phil Sutter Signed-off-by: Dmitry Torokhov diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index 3cb50d1..12ee8d5 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h @@ -80,6 +80,9 @@ struct rb532_gpio_reg { /* Compact Flash GPIO pin */ #define CF_GPIO_NUM 13 +/* S1 button GPIO (shared with UART0_SIN) */ +#define GPIO_BTN_S1 1 + extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); extern void rb532_gpio_set_istat(int bit, unsigned gpio); extern void rb532_gpio_set_func(unsigned gpio); diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 4a5f05b..9f40e1f 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c @@ -200,26 +200,9 @@ static struct platform_device rb532_led = { .id = -1, }; -static struct gpio_keys_button rb532_gpio_btn[] = { - { - .gpio = 1, - .code = BTN_0, - .desc = "S1", - .active_low = 1, - } -}; - -static struct gpio_keys_platform_data rb532_gpio_btn_data = { - .buttons = rb532_gpio_btn, - .nbuttons = ARRAY_SIZE(rb532_gpio_btn), -}; - static struct platform_device rb532_button = { - .name = "gpio-keys", + .name = "rb532-button", .id = -1, - .dev = { - .platform_data = &rb532_gpio_btn_data, - } }; static struct resource rb532_wdt_res[] = { diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 806d2e6..203abac 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -238,4 +238,16 @@ config INPUT_GPIO_ROTARY_ENCODER To compile this driver as a module, choose M here: the module will be called rotary_encoder. +config INPUT_RB532_BUTTON + tristate "Mikrotik Routerboard 532 button interface" + depends on MIKROTIK_RB532 + depends on GPIOLIB && GENERIC_GPIO + select INPUT_POLLDEV + help + Say Y here if you want support for the S1 button built into + Mikrotik's Routerboard 532. + + To compile this driver as a module, choose M here: the + module will be called rb532_button. + endif diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index e86cee6..e94cfd9 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -23,4 +23,5 @@ obj-$(CONFIG_INPUT_APANEL) += apanel.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o +obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o diff --git a/drivers/input/misc/rb532_button.c b/drivers/input/misc/rb532_button.c new file mode 100644 index 0000000..e2c7f62 --- /dev/null +++ b/drivers/input/misc/rb532_button.c @@ -0,0 +1,120 @@ +/* + * Support for the S1 button on Routerboard 532 + * + * Copyright (C) 2009 Phil Sutter + */ + +#include +#include +#include + +#include +#include + +#define DRV_NAME "rb532-button" + +#define RB532_BTN_RATE 100 /* msec */ +#define RB532_BTN_KSYM BTN_0 + +/* The S1 button state is provided by GPIO pin 1. But as this + * pin is also used for uart input as alternate function, the + * operational modes must be switched first: + * 1) disable uart using set_latch_u5() + * 2) turn off alternate function implicitly through + * gpio_direction_input() + * 3) read the GPIO's current value + * 4) undo step 2 by enabling alternate function (in this + * mode the GPIO direction is fixed, so no change needed) + * 5) turn on uart again + * The GPIO value occurs to be inverted, so pin high means + * button is not pressed. + */ +static bool rb532_button_pressed(void) +{ + int val; + + set_latch_u5(0, LO_FOFF); + gpio_direction_input(GPIO_BTN_S1); + + val = gpio_get_value(GPIO_BTN_S1); + + rb532_gpio_set_func(GPIO_BTN_S1); + set_latch_u5(LO_FOFF, 0); + + return !val; +} + +static void rb532_button_poll(struct input_polled_dev *poll_dev) +{ + input_report_key(poll_dev->input, RB532_BTN_KSYM, + rb532_button_pressed()); + input_sync(poll_dev->input); +} + +static int __devinit rb532_button_probe(struct platform_device *pdev) +{ + struct input_polled_dev *poll_dev; + int error; + + poll_dev = input_allocate_polled_device(); + if (!poll_dev) + return -ENOMEM; + + poll_dev->poll = rb532_button_poll; + poll_dev->poll_interval = RB532_BTN_RATE; + + poll_dev->input->name = "rb532 button"; + poll_dev->input->phys = "rb532/button0"; + poll_dev->input->id.bustype = BUS_HOST; + poll_dev->input->dev.parent = &pdev->dev; + + dev_set_drvdata(&pdev->dev, poll_dev); + + input_set_capability(poll_dev->input, EV_KEY, RB532_BTN_KSYM); + + error = input_register_polled_device(poll_dev); + if (error) { + input_free_polled_device(poll_dev); + return error; + } + + return 0; +} + +static int __devexit rb532_button_remove(struct platform_device *pdev) +{ + struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev); + + input_unregister_polled_device(poll_dev); + input_free_polled_device(poll_dev); + dev_set_drvdata(&pdev->dev, NULL); + + return 0; +} + +static struct platform_driver rb532_button_driver = { + .probe = rb532_button_probe, + .remove = __devexit_p(rb532_button_remove), + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + }, +}; + +static int __init rb532_button_init(void) +{ + return platform_driver_register(&rb532_button_driver); +} + +static void __exit rb532_button_exit(void) +{ + platform_driver_unregister(&rb532_button_driver); +} + +module_init(rb532_button_init); +module_exit(rb532_button_exit); + +MODULE_AUTHOR("Phil Sutter "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Support for S1 button on Routerboard 532"); +MODULE_ALIAS("platform:" DRV_NAME); -- cgit v0.10.2 From 87f0fd02a4a98df105b8fcfb80f1dcbe28d01cc8 Mon Sep 17 00:00:00 2001 From: Michael Hennerich Date: Fri, 6 Mar 2009 01:35:35 -0800 Subject: Input: bf54x-keys - fix typo in warning Signed-off-by: Michael Hennerich Signed-off-by: Bryan Wu Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c index ee855c5..e94b7d7 100644 --- a/drivers/input/keyboard/bf54x-keys.c +++ b/drivers/input/keyboard/bf54x-keys.c @@ -211,8 +211,8 @@ static int __devinit bfin_kpad_probe(struct platform_device *pdev) if (!pdata->debounce_time || pdata->debounce_time > MAX_MULT || !pdata->coldrive_time || pdata->coldrive_time > MAX_MULT) { - printk(KERN_ERR DRV_NAME - ": Invalid Debounce/Columdrive Time from pdata\n"); + printk(KERN_WARNING DRV_NAME + ": Invalid Debounce/Columndrive Time in platform data\n"); bfin_write_KPAD_MSEL(0xFF0); /* Default MSEL */ } else { bfin_write_KPAD_MSEL( -- cgit v0.10.2 From 331b78ed300d9b37bd42dbc8b19f6277151a0dfa Mon Sep 17 00:00:00 2001 From: Michael Hennerich Date: Mon, 9 Mar 2009 20:12:52 -0700 Subject: Input: add AD7877 touchscreen driver [dtor@mail.ru: locking and other fixups] Signed-off-by: Michael Hennerich Signed-off-by: Bryan Wu Signed-off-by: Andrew Morton Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index a31d434..afeb755 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -29,6 +29,19 @@ config TOUCHSCREEN_ADS7846 To compile this driver as a module, choose M here: the module will be called ads7846. +config TOUCHSCREEN_AD7877 + tristate "AD7877 based touchscreens" + depends on SPI_MASTER + help + Say Y here if you have a touchscreen interface using the + AD7877 controller, and your board-specific initialization + code includes that in its table of SPI devices. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ad7877. + config TOUCHSCREEN_BITSY tristate "Compaq iPAQ H3600 (Bitsy) touchscreen" depends on SA1100_BITSY diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 82dd918..45dfcd6 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -6,6 +6,7 @@ wm97xx-ts-y := wm97xx-core.o +obj-$(CONFIG_TOUCHSCREEN_AD7877) += ad7877.o obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c new file mode 100644 index 0000000..e4728a2 --- /dev/null +++ b/drivers/input/touchscreen/ad7877.c @@ -0,0 +1,844 @@ +/* + * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. + * + * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver + * Based on: ads7846.c + * + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see the file COPYING, or write + * to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * History: + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * Various changes: Imre Deak + * + * Using code from: + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(50) + +#define MAX_SPI_FREQ_HZ 20000000 +#define MAX_12BIT ((1<<12)-1) + +#define AD7877_REG_ZEROS 0 +#define AD7877_REG_CTRL1 1 +#define AD7877_REG_CTRL2 2 +#define AD7877_REG_ALERT 3 +#define AD7877_REG_AUX1HIGH 4 +#define AD7877_REG_AUX1LOW 5 +#define AD7877_REG_BAT1HIGH 6 +#define AD7877_REG_BAT1LOW 7 +#define AD7877_REG_BAT2HIGH 8 +#define AD7877_REG_BAT2LOW 9 +#define AD7877_REG_TEMP1HIGH 10 +#define AD7877_REG_TEMP1LOW 11 +#define AD7877_REG_SEQ0 12 +#define AD7877_REG_SEQ1 13 +#define AD7877_REG_DAC 14 +#define AD7877_REG_NONE1 15 +#define AD7877_REG_EXTWRITE 15 +#define AD7877_REG_XPLUS 16 +#define AD7877_REG_YPLUS 17 +#define AD7877_REG_Z2 18 +#define AD7877_REG_aux1 19 +#define AD7877_REG_aux2 20 +#define AD7877_REG_aux3 21 +#define AD7877_REG_bat1 22 +#define AD7877_REG_bat2 23 +#define AD7877_REG_temp1 24 +#define AD7877_REG_temp2 25 +#define AD7877_REG_Z1 26 +#define AD7877_REG_GPIOCTRL1 27 +#define AD7877_REG_GPIOCTRL2 28 +#define AD7877_REG_GPIODATA 29 +#define AD7877_REG_NONE2 30 +#define AD7877_REG_NONE3 31 + +#define AD7877_SEQ_YPLUS_BIT (1<<11) +#define AD7877_SEQ_XPLUS_BIT (1<<10) +#define AD7877_SEQ_Z2_BIT (1<<9) +#define AD7877_SEQ_AUX1_BIT (1<<8) +#define AD7877_SEQ_AUX2_BIT (1<<7) +#define AD7877_SEQ_AUX3_BIT (1<<6) +#define AD7877_SEQ_BAT1_BIT (1<<5) +#define AD7877_SEQ_BAT2_BIT (1<<4) +#define AD7877_SEQ_TEMP1_BIT (1<<3) +#define AD7877_SEQ_TEMP2_BIT (1<<2) +#define AD7877_SEQ_Z1_BIT (1<<1) + +enum { + AD7877_SEQ_YPOS = 0, + AD7877_SEQ_XPOS = 1, + AD7877_SEQ_Z2 = 2, + AD7877_SEQ_AUX1 = 3, + AD7877_SEQ_AUX2 = 4, + AD7877_SEQ_AUX3 = 5, + AD7877_SEQ_BAT1 = 6, + AD7877_SEQ_BAT2 = 7, + AD7877_SEQ_TEMP1 = 8, + AD7877_SEQ_TEMP2 = 9, + AD7877_SEQ_Z1 = 10, + AD7877_NR_SENSE = 11, +}; + +/* DAC Register Default RANGE 0 to Vcc, Volatge Mode, DAC On */ +#define AD7877_DAC_CONF 0x1 + +/* If gpio3 is set AUX3/GPIO3 acts as GPIO Output */ +#define AD7877_EXTW_GPIO_3_CONF 0x1C4 +#define AD7877_EXTW_GPIO_DATA 0x200 + +/* Control REG 2 */ +#define AD7877_TMR(x) ((x & 0x3) << 0) +#define AD7877_REF(x) ((x & 0x1) << 2) +#define AD7877_POL(x) ((x & 0x1) << 3) +#define AD7877_FCD(x) ((x & 0x3) << 4) +#define AD7877_PM(x) ((x & 0x3) << 6) +#define AD7877_ACQ(x) ((x & 0x3) << 8) +#define AD7877_AVG(x) ((x & 0x3) << 10) + +/* Control REG 1 */ +#define AD7877_SER (1 << 11) /* non-differential */ +#define AD7877_DFR (0 << 11) /* differential */ + +#define AD7877_MODE_NOC (0) /* Do not convert */ +#define AD7877_MODE_SCC (1) /* Single channel conversion */ +#define AD7877_MODE_SEQ0 (2) /* Sequence 0 in Slave Mode */ +#define AD7877_MODE_SEQ1 (3) /* Sequence 1 in Master Mode */ + +#define AD7877_CHANADD(x) ((x&0xF)<<7) +#define AD7877_READADD(x) ((x)<<2) +#define AD7877_WRITEADD(x) ((x)<<12) + +#define AD7877_READ_CHAN(x) (AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_SER | \ + AD7877_MODE_SCC | AD7877_CHANADD(AD7877_REG_ ## x) | \ + AD7877_READADD(AD7877_REG_ ## x)) + +#define AD7877_MM_SEQUENCE (AD7877_SEQ_YPLUS_BIT | AD7877_SEQ_XPLUS_BIT | \ + AD7877_SEQ_Z2_BIT | AD7877_SEQ_Z1_BIT) + +/* + * Non-touchscreen sensors only use single-ended conversions. + */ + +struct ser_req { + u16 reset; + u16 ref_on; + u16 command; + u16 sample; + struct spi_message msg; + struct spi_transfer xfer[6]; +}; + +struct ad7877 { + struct input_dev *input; + char phys[32]; + + struct spi_device *spi; + u16 model; + u16 vref_delay_usecs; + u16 x_plate_ohms; + u16 pressure_max; + + u16 cmd_crtl1; + u16 cmd_crtl2; + u16 cmd_dummy; + u16 dac; + + u8 stopacq_polarity; + u8 first_conversion_delay; + u8 acquisition_time; + u8 averaging; + u8 pen_down_acc_interval; + + u16 conversion_data[AD7877_NR_SENSE]; + + struct spi_transfer xfer[AD7877_NR_SENSE + 2]; + struct spi_message msg; + + struct mutex mutex; + unsigned disabled:1; /* P: mutex */ + unsigned gpio3:1; /* P: mutex */ + unsigned gpio4:1; /* P: mutex */ + + spinlock_t lock; + struct timer_list timer; /* P: lock */ + unsigned pending:1; /* P: lock */ +}; + +static int gpio3; +module_param(gpio3, int, 0); +MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3"); + +/* + * ad7877_read/write are only used for initial setup and for sysfs controls. + * The main traffic is done using spi_async() in the interrupt handler. + */ + +static int ad7877_read(struct spi_device *spi, u16 reg) +{ + struct ser_req *req; + int status, ret; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) (AD7877_WRITEADD(AD7877_REG_CTRL1) | + AD7877_READADD(reg)); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + + req->xfer[1].rx_buf = &req->sample; + req->xfer[1].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + spi_message_add_tail(&req->xfer[1], &req->msg); + + status = spi_sync(spi, &req->msg); + ret = status ? : req->sample; + + kfree(req); + + return ret; +} + +static int ad7877_write(struct spi_device *spi, u16 reg, u16 val) +{ + struct ser_req *req; + int status; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) (AD7877_WRITEADD(reg) | (val & MAX_12BIT)); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + + status = spi_sync(spi, &req->msg); + + kfree(req); + + return status; +} + +static int ad7877_read_adc(struct spi_device *spi, unsigned command) +{ + struct ad7877 *ts = dev_get_drvdata(&spi->dev); + struct ser_req *req; + int status; + int sample; + int i; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + /* activate reference, so it has time to settle; */ + req->ref_on = AD7877_WRITEADD(AD7877_REG_CTRL2) | + AD7877_POL(ts->stopacq_polarity) | + AD7877_AVG(0) | AD7877_PM(2) | AD7877_TMR(0) | + AD7877_ACQ(ts->acquisition_time) | AD7877_FCD(0); + + req->reset = AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_MODE_NOC; + + req->command = (u16) command; + + req->xfer[0].tx_buf = &req->reset; + req->xfer[0].len = 2; + + req->xfer[1].tx_buf = &req->ref_on; + req->xfer[1].len = 2; + req->xfer[1].delay_usecs = ts->vref_delay_usecs; + + req->xfer[2].tx_buf = &req->command; + req->xfer[2].len = 2; + req->xfer[2].delay_usecs = ts->vref_delay_usecs; + + req->xfer[3].rx_buf = &req->sample; + req->xfer[3].len = 2; + + req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/ + req->xfer[4].len = 2; + + req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/ + req->xfer[5].len = 2; + + /* group all the transfers together, so we can't interfere with + * reading touchscreen state; disable penirq while sampling + */ + for (i = 0; i < 6; i++) + spi_message_add_tail(&req->xfer[i], &req->msg); + + status = spi_sync(spi, &req->msg); + sample = req->sample; + + kfree(req); + + return status ? : sample; +} + +static void ad7877_rx(struct ad7877 *ts) +{ + struct input_dev *input_dev = ts->input; + unsigned Rt; + u16 x, y, z1, z2; + + x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; + y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; + z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; + z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT; + + /* + * The samples processed here are already preprocessed by the AD7877. + * The preprocessing function consists of an averaging filter. + * The combination of 'first conversion delay' and averaging provides a robust solution, + * discarding the spurious noise in the signal and keeping only the data of interest. + * The size of the averaging filter is programmable. (dev.platform_data, see linux/spi/ad7877.h) + * Other user-programmable conversion controls include variable acquisition time, + * and first conversion delay. Up to 16 averages can be taken per conversion. + */ + + if (likely(x && z1)) { + /* compute touch pressure resistance using equation #1 */ + Rt = (z2 - z1) * x * ts->x_plate_ohms; + Rt /= z1; + Rt = (Rt + 2047) >> 12; + + input_report_abs(input_dev, ABS_X, x); + input_report_abs(input_dev, ABS_Y, y); + input_report_abs(input_dev, ABS_PRESSURE, Rt); + input_sync(input_dev); + } +} + +static inline void ad7877_ts_event_release(struct ad7877 *ts) +{ + struct input_dev *input_dev = ts->input; + + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_sync(input_dev); +} + +static void ad7877_timer(unsigned long handle) +{ + struct ad7877 *ts = (void *)handle; + + ad7877_ts_event_release(ts); +} + +static irqreturn_t ad7877_irq(int irq, void *handle) +{ + struct ad7877 *ts = handle; + unsigned long flags; + int status; + + /* + * The repeated conversion sequencer controlled by TMR kicked off + * too fast. We ignore the last and process the sample sequence + * currently in the queue. It can't be older than 9.4ms, and we + * need to avoid that ts->msg doesn't get issued twice while in work. + */ + + spin_lock_irqsave(&ts->lock, flags); + if (!ts->pending) { + ts->pending = 1; + + status = spi_async(ts->spi, &ts->msg); + if (status) + dev_err(&ts->spi->dev, "spi_sync --> %d\n", status); + } + spin_unlock_irqrestore(&ts->lock, flags); + + return IRQ_HANDLED; +} + +static void ad7877_callback(void *_ts) +{ + struct ad7877 *ts = _ts; + + spin_lock_irq(&ts->lock); + + ad7877_rx(ts); + ts->pending = 0; + mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); + + spin_unlock_irq(&ts->lock); +} + +static void ad7877_disable(struct ad7877 *ts) +{ + mutex_lock(&ts->mutex); + + if (!ts->disabled) { + ts->disabled = 1; + disable_irq(ts->spi->irq); + + /* Wait for spi_async callback */ + while (ts->pending) + msleep(1); + + if (del_timer_sync(&ts->timer)) + ad7877_ts_event_release(ts); + } + + /* we know the chip's in lowpower mode since we always + * leave it that way after every request + */ + + mutex_unlock(&ts->mutex); +} + +static void ad7877_enable(struct ad7877 *ts) +{ + mutex_lock(&ts->mutex); + + if (ts->disabled) { + ts->disabled = 0; + enable_irq(ts->spi->irq); + } + + mutex_unlock(&ts->mutex); +} + +#define SHOW(name) static ssize_t \ +name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ +{ \ + struct ad7877 *ts = dev_get_drvdata(dev); \ + ssize_t v = ad7877_read_adc(ts->spi, \ + AD7877_READ_CHAN(name)); \ + if (v < 0) \ + return v; \ + return sprintf(buf, "%u\n", (unsigned) v); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL); + +SHOW(aux1) +SHOW(aux2) +SHOW(aux3) +SHOW(bat1) +SHOW(bat2) +SHOW(temp1) +SHOW(temp2) + +static ssize_t ad7877_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->disabled); +} + +static ssize_t ad7877_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + if (val) + ad7877_disable(ts); + else + ad7877_enable(ts); + + return count; +} + +static DEVICE_ATTR(disable, 0664, ad7877_disable_show, ad7877_disable_store); + +static ssize_t ad7877_dac_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->dac); +} + +static ssize_t ad7877_dac_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->dac = val & 0xFF; + ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(dac, 0664, ad7877_dac_show, ad7877_dac_store); + +static ssize_t ad7877_gpio3_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->gpio3); +} + +static ssize_t ad7877_gpio3_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->gpio3 = !!val; + ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | + (ts->gpio4 << 4) | (ts->gpio3 << 5)); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store); + +static ssize_t ad7877_gpio4_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->gpio4); +} + +static ssize_t ad7877_gpio4_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->gpio4 = !!val; + ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | + (ts->gpio4 << 4) | (ts->gpio3 << 5)); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(gpio4, 0664, ad7877_gpio4_show, ad7877_gpio4_store); + +static struct attribute *ad7877_attributes[] = { + &dev_attr_temp1.attr, + &dev_attr_temp2.attr, + &dev_attr_aux1.attr, + &dev_attr_aux2.attr, + &dev_attr_bat1.attr, + &dev_attr_bat2.attr, + &dev_attr_disable.attr, + &dev_attr_dac.attr, + &dev_attr_gpio4.attr, + NULL +}; + +static const struct attribute_group ad7877_attr_group = { + .attrs = ad7877_attributes, +}; + +static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts) +{ + struct spi_message *m; + int i; + + ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) | + AD7877_POL(ts->stopacq_polarity) | + AD7877_AVG(ts->averaging) | AD7877_PM(1) | + AD7877_TMR(ts->pen_down_acc_interval) | + AD7877_ACQ(ts->acquisition_time) | + AD7877_FCD(ts->first_conversion_delay); + + ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2); + + ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) | + AD7877_READADD(AD7877_REG_XPLUS-1) | + AD7877_MODE_SEQ1 | AD7877_DFR; + + ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); + + ts->cmd_dummy = 0; + + m = &ts->msg; + + spi_message_init(m); + + m->complete = ad7877_callback; + m->context = ts; + + ts->xfer[0].tx_buf = &ts->cmd_crtl1; + ts->xfer[0].len = 2; + + spi_message_add_tail(&ts->xfer[0], m); + + ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */ + ts->xfer[1].len = 2; + + spi_message_add_tail(&ts->xfer[1], m); + + for (i = 0; i < 11; i++) { + ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i]; + ts->xfer[i + 2].len = 2; + spi_message_add_tail(&ts->xfer[i + 2], m); + } +} + +static int __devinit ad7877_probe(struct spi_device *spi) +{ + struct ad7877 *ts; + struct input_dev *input_dev; + struct ad7877_platform_data *pdata = spi->dev.platform_data; + int err; + u16 verify; + + if (!spi->irq) { + dev_dbg(&spi->dev, "no IRQ?\n"); + return -ENODEV; + } + + if (!pdata) { + dev_dbg(&spi->dev, "no platform data?\n"); + return -ENODEV; + } + + /* don't exceed max specified SPI CLK frequency */ + if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { + dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz); + return -EINVAL; + } + + ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + dev_set_drvdata(&spi->dev, ts); + ts->spi = spi; + ts->input = input_dev; + + setup_timer(&ts->timer, ad7877_timer, (unsigned long) ts); + mutex_init(&ts->mutex); + spin_lock_init(&ts->lock); + + ts->model = pdata->model ? : 7877; + ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; + ts->pressure_max = pdata->pressure_max ? : ~0; + + ts->stopacq_polarity = pdata->stopacq_polarity; + ts->first_conversion_delay = pdata->first_conversion_delay; + ts->acquisition_time = pdata->acquisition_time; + ts->averaging = pdata->averaging; + ts->pen_down_acc_interval = pdata->pen_down_acc_interval; + + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); + + input_dev->name = "AD7877 Touchscreen"; + input_dev->phys = ts->phys; + input_dev->dev.parent = &spi->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + __set_bit(ABS_PRESSURE, input_dev->absbit); + + input_set_abs_params(input_dev, ABS_X, + pdata->x_min ? : 0, + pdata->x_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + pdata->pressure_min, pdata->pressure_max, 0, 0); + + ad7877_write(spi, AD7877_REG_SEQ1, AD7877_MM_SEQUENCE); + + verify = ad7877_read(spi, AD7877_REG_SEQ1); + + if (verify != AD7877_MM_SEQUENCE){ + dev_err(&spi->dev, "%s: Failed to probe %s\n", + dev_name(&spi->dev), input_dev->name); + err = -ENODEV; + goto err_free_mem; + } + + if (gpio3) + ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF); + + ad7877_setup_ts_def_msg(spi, ts); + + /* Request AD7877 /DAV GPIO interrupt */ + + err = request_irq(spi->irq, ad7877_irq, IRQF_TRIGGER_FALLING | + IRQF_SAMPLE_RANDOM, spi->dev.driver->name, ts); + if (err) { + dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); + goto err_free_mem; + } + + err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group); + if (err) + goto err_free_irq; + + err = device_create_file(&spi->dev, + gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3); + if (err) + goto err_remove_attr_group; + + err = input_register_device(input_dev); + if (err) + goto err_remove_attr; + + return 0; + +err_remove_attr: + device_remove_file(&spi->dev, + gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3); +err_remove_attr_group: + sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); +err_free_irq: + free_irq(spi->irq, ts); +err_free_mem: + input_free_device(input_dev); + kfree(ts); + dev_set_drvdata(&spi->dev, NULL); + return err; +} + +static int __devexit ad7877_remove(struct spi_device *spi) +{ + struct ad7877 *ts = dev_get_drvdata(&spi->dev); + + sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); + device_remove_file(&spi->dev, + gpio3 ? &dev_attr_gpio3 : &dev_attr_aux3); + + ad7877_disable(ts); + free_irq(ts->spi->irq, ts); + + input_unregister_device(ts->input); + kfree(ts); + + dev_dbg(&spi->dev, "unregistered touchscreen\n"); + dev_set_drvdata(&spi->dev, NULL); + + return 0; +} + +#ifdef CONFIG_PM +static int ad7877_suspend(struct spi_device *spi, pm_message_t message) +{ + struct ad7877 *ts = dev_get_drvdata(&spi->dev); + + ad7877_disable(ts); + + return 0; +} + +static int ad7877_resume(struct spi_device *spi) +{ + struct ad7877 *ts = dev_get_drvdata(&spi->dev); + + ad7877_enable(ts); + + return 0; +} +#else +#define ad7877_suspend NULL +#define ad7877_resume NULL +#endif + +static struct spi_driver ad7877_driver = { + .driver = { + .name = "ad7877", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + .probe = ad7877_probe, + .remove = __devexit_p(ad7877_remove), + .suspend = ad7877_suspend, + .resume = ad7877_resume, +}; + +static int __init ad7877_init(void) +{ + return spi_register_driver(&ad7877_driver); +} +module_init(ad7877_init); + +static void __exit ad7877_exit(void) +{ + spi_unregister_driver(&ad7877_driver); +} +module_exit(ad7877_exit); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7877 touchscreen Driver"); +MODULE_LICENSE("GPL"); -- cgit v0.10.2 From b4be468cc1e65110d9144751bf7079dad6f142b7 Mon Sep 17 00:00:00 2001 From: Michael Hennerich Date: Mon, 9 Mar 2009 20:12:52 -0700 Subject: Input: add AD7879 Touchscreen driver [randy.dunlap@oracle.com: don't use bus_id] [dtor@mail.ru: locking and other fixups] Signed-off-by: Michael Hennerich Signed-off-by: Bryan Wu Signed-off-by: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index afeb755..b01fd61d 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -42,6 +42,38 @@ config TOUCHSCREEN_AD7877 To compile this driver as a module, choose M here: the module will be called ad7877. +config TOUCHSCREEN_AD7879_I2C + tristate "AD7879 based touchscreens: AD7879-1 I2C Interface" + depends on I2C + select TOUCHSCREEN_AD7879 + help + Say Y here if you have a touchscreen interface using the + AD7879-1 controller, and your board-specific initialization + code includes that in its table of I2C devices. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ad7879. + +config TOUCHSCREEN_AD7879_SPI + tristate "AD7879 based touchscreens: AD7879 SPI Interface" + depends on SPI_MASTER && TOUCHSCREEN_AD7879_I2C = n + select TOUCHSCREEN_AD7879 + help + Say Y here if you have a touchscreen interface using the + AD7879 controller, and your board-specific initialization + code includes that in its table of SPI devices. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ad7879. + +config TOUCHSCREEN_AD7879 + tristate + default n + config TOUCHSCREEN_BITSY tristate "Compaq iPAQ H3600 (Bitsy) touchscreen" depends on SA1100_BITSY diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 45dfcd6..6700f7b9 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -7,6 +7,7 @@ wm97xx-ts-y := wm97xx-core.o obj-$(CONFIG_TOUCHSCREEN_AD7877) += ad7877.o +obj-$(CONFIG_TOUCHSCREEN_AD7879) += ad7879.o obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c new file mode 100644 index 0000000..ea4c61d --- /dev/null +++ b/drivers/input/touchscreen/ad7879.c @@ -0,0 +1,782 @@ +/* + * Copyright (C) 2008 Michael Hennerich, Analog Devices Inc. + * + * Description: AD7879 based touchscreen, and GPIO driver (I2C/SPI Interface) + * + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see the file COPYING, or write + * to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * History: + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * Various changes: Imre Deak + * + * Using code from: + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + * - ad7877.c + * Copyright (C) 2006-2008 Analog Devices Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define AD7879_REG_ZEROS 0 +#define AD7879_REG_CTRL1 1 +#define AD7879_REG_CTRL2 2 +#define AD7879_REG_CTRL3 3 +#define AD7879_REG_AUX1HIGH 4 +#define AD7879_REG_AUX1LOW 5 +#define AD7879_REG_TEMP1HIGH 6 +#define AD7879_REG_TEMP1LOW 7 +#define AD7879_REG_XPLUS 8 +#define AD7879_REG_YPLUS 9 +#define AD7879_REG_Z1 10 +#define AD7879_REG_Z2 11 +#define AD7879_REG_AUXVBAT 12 +#define AD7879_REG_TEMP 13 +#define AD7879_REG_REVID 14 + +/* Control REG 1 */ +#define AD7879_TMR(x) ((x & 0xFF) << 0) +#define AD7879_ACQ(x) ((x & 0x3) << 8) +#define AD7879_MODE_NOC (0 << 10) /* Do not convert */ +#define AD7879_MODE_SCC (1 << 10) /* Single channel conversion */ +#define AD7879_MODE_SEQ0 (2 << 10) /* Sequence 0 in Slave Mode */ +#define AD7879_MODE_SEQ1 (3 << 10) /* Sequence 1 in Master Mode */ +#define AD7879_MODE_INT (1 << 15) /* PENIRQ disabled INT enabled */ + +/* Control REG 2 */ +#define AD7879_FCD(x) ((x & 0x3) << 0) +#define AD7879_RESET (1 << 4) +#define AD7879_MFS(x) ((x & 0x3) << 5) +#define AD7879_AVG(x) ((x & 0x3) << 7) +#define AD7879_SER (1 << 9) /* non-differential */ +#define AD7879_DFR (0 << 9) /* differential */ +#define AD7879_GPIOPOL (1 << 10) +#define AD7879_GPIODIR (1 << 11) +#define AD7879_GPIO_DATA (1 << 12) +#define AD7879_GPIO_EN (1 << 13) +#define AD7879_PM(x) ((x & 0x3) << 14) +#define AD7879_PM_SHUTDOWN (0) +#define AD7879_PM_DYN (1) +#define AD7879_PM_FULLON (2) + +/* Control REG 3 */ +#define AD7879_TEMPMASK_BIT (1<<15) +#define AD7879_AUXVBATMASK_BIT (1<<14) +#define AD7879_INTMODE_BIT (1<<13) +#define AD7879_GPIOALERTMASK_BIT (1<<12) +#define AD7879_AUXLOW_BIT (1<<11) +#define AD7879_AUXHIGH_BIT (1<<10) +#define AD7879_TEMPLOW_BIT (1<<9) +#define AD7879_TEMPHIGH_BIT (1<<8) +#define AD7879_YPLUS_BIT (1<<7) +#define AD7879_XPLUS_BIT (1<<6) +#define AD7879_Z1_BIT (1<<5) +#define AD7879_Z2_BIT (1<<4) +#define AD7879_AUX_BIT (1<<3) +#define AD7879_VBAT_BIT (1<<2) +#define AD7879_TEMP_BIT (1<<1) + +enum { + AD7879_SEQ_XPOS = 0, + AD7879_SEQ_YPOS = 1, + AD7879_SEQ_Z1 = 2, + AD7879_SEQ_Z2 = 3, + AD7879_NR_SENSE = 4, +}; + +#define MAX_12BIT ((1<<12)-1) +#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(50) + +#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE) +#define AD7879_DEVID 0x7A +typedef struct spi_device bus_device; +#elif defined(CONFIG_TOUCHSCREEN_AD7879_I2C) || defined(CONFIG_TOUCHSCREEN_AD7879_I2C_MODULE) +#define AD7879_DEVID 0x79 +typedef struct i2c_client bus_device; +#endif + +struct ad7879 { + bus_device *bus; + struct input_dev *input; + struct work_struct work; + struct timer_list timer; + + struct mutex mutex; + unsigned disabled:1; /* P: mutex */ + +#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE) + struct spi_message msg; + struct spi_transfer xfer[AD7879_NR_SENSE + 1]; + u16 cmd; +#endif + u16 conversion_data[AD7879_NR_SENSE]; + char phys[32]; + u8 first_conversion_delay; + u8 acquisition_time; + u8 averaging; + u8 pen_down_acc_interval; + u8 median; + u16 x_plate_ohms; + u16 pressure_max; + u16 gpio_init; + u16 cmd_crtl1; + u16 cmd_crtl2; + u16 cmd_crtl3; + unsigned gpio:1; +}; + +static int ad7879_read(bus_device *, u8); +static int ad7879_write(bus_device *, u8, u16); +static void ad7879_collect(struct ad7879 *); + +static void ad7879_report(struct ad7879 *ts) +{ + struct input_dev *input_dev = ts->input; + unsigned Rt; + u16 x, y, z1, z2; + + x = ts->conversion_data[AD7879_SEQ_XPOS] & MAX_12BIT; + y = ts->conversion_data[AD7879_SEQ_YPOS] & MAX_12BIT; + z1 = ts->conversion_data[AD7879_SEQ_Z1] & MAX_12BIT; + z2 = ts->conversion_data[AD7879_SEQ_Z2] & MAX_12BIT; + + /* + * The samples processed here are already preprocessed by the AD7879. + * The preprocessing function consists of a median and an averaging filter. + * The combination of these two techniques provides a robust solution, + * discarding the spurious noise in the signal and keeping only the data of interest. + * The size of both filters is programmable. (dev.platform_data, see linux/spi/ad7879.h) + * Other user-programmable conversion controls include variable acquisition time, + * and first conversion delay. Up to 16 averages can be taken per conversion. + */ + + if (likely(x && z1)) { + /* compute touch pressure resistance using equation #1 */ + Rt = (z2 - z1) * x * ts->x_plate_ohms; + Rt /= z1; + Rt = (Rt + 2047) >> 12; + + input_report_abs(input_dev, ABS_X, x); + input_report_abs(input_dev, ABS_Y, y); + input_report_abs(input_dev, ABS_PRESSURE, Rt); + input_sync(input_dev); + } +} + +static void ad7879_work(struct work_struct *work) +{ + struct ad7879 *ts = container_of(work, struct ad7879, work); + + /* use keventd context to read the result registers */ + ad7879_collect(ts); + ad7879_report(ts); + mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); +} + +static void ad7879_ts_event_release(struct ad7879 *ts) +{ + struct input_dev *input_dev = ts->input; + + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_sync(input_dev); +} + +static void ad7879_timer(unsigned long handle) +{ + struct ad7879 *ts = (void *)handle; + + ad7879_ts_event_release(ts); +} + +static irqreturn_t ad7879_irq(int irq, void *handle) +{ + struct ad7879 *ts = handle; + + /* The repeated conversion sequencer controlled by TMR kicked off too fast. + * We ignore the last and process the sample sequence currently in the queue. + * It can't be older than 9.4ms + */ + + if (!work_pending(&ts->work)) + schedule_work(&ts->work); + + return IRQ_HANDLED; +} + +static void ad7879_setup(struct ad7879 *ts) +{ + ts->cmd_crtl3 = AD7879_YPLUS_BIT | + AD7879_XPLUS_BIT | + AD7879_Z2_BIT | + AD7879_Z1_BIT | + AD7879_TEMPMASK_BIT | + AD7879_AUXVBATMASK_BIT | + AD7879_GPIOALERTMASK_BIT; + + ts->cmd_crtl2 = AD7879_PM(AD7879_PM_DYN) | AD7879_DFR | + AD7879_AVG(ts->averaging) | + AD7879_MFS(ts->median) | + AD7879_FCD(ts->first_conversion_delay) | + ts->gpio_init; + + ts->cmd_crtl1 = AD7879_MODE_INT | AD7879_MODE_SEQ1 | + AD7879_ACQ(ts->acquisition_time) | + AD7879_TMR(ts->pen_down_acc_interval); + + ad7879_write(ts->bus, AD7879_REG_CTRL2, ts->cmd_crtl2); + ad7879_write(ts->bus, AD7879_REG_CTRL3, ts->cmd_crtl3); + ad7879_write(ts->bus, AD7879_REG_CTRL1, ts->cmd_crtl1); +} + +static void ad7879_disable(struct ad7879 *ts) +{ + mutex_lock(&ts->mutex); + + if (!ts->disabled) { + + ts->disabled = 1; + disable_irq(ts->bus->irq); + + cancel_work_sync(&ts->work); + + if (del_timer_sync(&ts->timer)) + ad7879_ts_event_release(ts); + + ad7879_write(ts->bus, AD7879_REG_CTRL2, + AD7879_PM(AD7879_PM_SHUTDOWN)); + } + + mutex_unlock(&ts->mutex); +} + +static void ad7879_enable(struct ad7879 *ts) +{ + mutex_lock(&ts->mutex); + + if (ts->disabled) { + ad7879_setup(ts); + ts->disabled = 0; + enable_irq(ts->bus->irq); + } + + mutex_unlock(&ts->mutex); +} + +static ssize_t ad7879_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->disabled); +} + +static ssize_t ad7879_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + if (val) + ad7879_disable(ts); + else + ad7879_enable(ts); + + return count; +} + +static DEVICE_ATTR(disable, 0664, ad7879_disable_show, ad7879_disable_store); + +static ssize_t ad7879_gpio_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->gpio); +} + +static ssize_t ad7879_gpio_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + unsigned long val; + int error; + + error = strict_strtoul(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->gpio = !!val; + error = ad7879_write(ts->bus, AD7879_REG_CTRL2, + ts->gpio ? + ts->cmd_crtl2 & ~AD7879_GPIO_DATA : + ts->cmd_crtl2 | AD7879_GPIO_DATA); + mutex_unlock(&ts->mutex); + + return error ? : count; +} + +static DEVICE_ATTR(gpio, 0664, ad7879_gpio_show, ad7879_gpio_store); + +static struct attribute *ad7879_attributes[] = { + &dev_attr_disable.attr, + &dev_attr_gpio.attr, + NULL +}; + +static const struct attribute_group ad7879_attr_group = { + .attrs = ad7879_attributes, +}; + +static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts) +{ + struct input_dev *input_dev; + struct ad7879_platform_data *pdata = bus->dev.platform_data; + int err; + u16 revid; + + if (!bus->irq) { + dev_err(&bus->dev, "no IRQ?\n"); + return -ENODEV; + } + + if (!pdata) { + dev_err(&bus->dev, "no platform data?\n"); + return -ENODEV; + } + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + ts->input = input_dev; + + setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); + INIT_WORK(&ts->work, ad7879_work); + mutex_init(&ts->mutex); + + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; + ts->pressure_max = pdata->pressure_max ? : ~0; + + ts->first_conversion_delay = pdata->first_conversion_delay; + ts->acquisition_time = pdata->acquisition_time; + ts->averaging = pdata->averaging; + ts->pen_down_acc_interval = pdata->pen_down_acc_interval; + ts->median = pdata->median; + + if (pdata->gpio_output) + ts->gpio_init = AD7879_GPIO_EN | + (pdata->gpio_default ? 0 : AD7879_GPIO_DATA); + else + ts->gpio_init = AD7879_GPIO_EN | AD7879_GPIODIR; + + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&bus->dev)); + + input_dev->name = "AD7879 Touchscreen"; + input_dev->phys = ts->phys; + input_dev->dev.parent = &bus->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + __set_bit(ABS_PRESSURE, input_dev->absbit); + + input_set_abs_params(input_dev, ABS_X, + pdata->x_min ? : 0, + pdata->x_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + pdata->pressure_min, pdata->pressure_max, 0, 0); + + err = ad7879_write(bus, AD7879_REG_CTRL2, AD7879_RESET); + + if (err < 0) { + dev_err(&bus->dev, "Failed to write %s\n", input_dev->name); + goto err_free_mem; + } + + revid = ad7879_read(bus, AD7879_REG_REVID); + + if ((revid & 0xFF) != AD7879_DEVID) { + dev_err(&bus->dev, "Failed to probe %s\n", input_dev->name); + err = -ENODEV; + goto err_free_mem; + } + + ad7879_setup(ts); + + err = request_irq(bus->irq, ad7879_irq, + IRQF_TRIGGER_FALLING | IRQF_SAMPLE_RANDOM, + bus->dev.driver->name, ts); + + if (err) { + dev_err(&bus->dev, "irq %d busy?\n", bus->irq); + goto err_free_mem; + } + + err = sysfs_create_group(&bus->dev.kobj, &ad7879_attr_group); + if (err) + goto err_free_irq; + + err = input_register_device(input_dev); + if (err) + goto err_remove_attr; + + dev_info(&bus->dev, "Rev.%d touchscreen, irq %d\n", + revid >> 8, bus->irq); + + return 0; + +err_remove_attr: + sysfs_remove_group(&bus->dev.kobj, &ad7879_attr_group); +err_free_irq: + free_irq(bus->irq, ts); +err_free_mem: + input_free_device(input_dev); + + return err; +} + +static int __devexit ad7879_destroy(bus_device *bus, struct ad7879 *ts) +{ + ad7879_disable(ts); + sysfs_remove_group(&ts->bus->dev.kobj, &ad7879_attr_group); + free_irq(ts->bus->irq, ts); + input_unregister_device(ts->input); + dev_dbg(&bus->dev, "unregistered touchscreen\n"); + + return 0; +} + +#ifdef CONFIG_PM +static int ad7879_suspend(bus_device *bus, pm_message_t message) +{ + struct ad7879 *ts = dev_get_drvdata(&bus->dev); + + ad7879_disable(ts); + + return 0; +} + +static int ad7879_resume(bus_device *bus) +{ + struct ad7879 *ts = dev_get_drvdata(&bus->dev); + + ad7879_enable(ts); + + return 0; +} +#else +#define ad7879_suspend NULL +#define ad7879_resume NULL +#endif + +#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE) +#define MAX_SPI_FREQ_HZ 5000000 +#define AD7879_CMD_MAGIC 0xE000 +#define AD7879_CMD_READ (1 << 10) +#define AD7879_WRITECMD(reg) (AD7879_CMD_MAGIC | (reg & 0xF)) +#define AD7879_READCMD(reg) (AD7879_CMD_MAGIC | AD7879_CMD_READ | (reg & 0xF)) + +struct ser_req { + u16 command; + u16 data; + struct spi_message msg; + struct spi_transfer xfer[2]; +}; + +/* + * ad7879_read/write are only used for initial setup and for sysfs controls. + * The main traffic is done in ad7879_collect(). + */ + +static int ad7879_read(struct spi_device *spi, u8 reg) +{ + struct ser_req *req; + int status, ret; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) AD7879_READCMD(reg); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + + req->xfer[1].rx_buf = &req->data; + req->xfer[1].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + spi_message_add_tail(&req->xfer[1], &req->msg); + + status = spi_sync(spi, &req->msg); + ret = status ? : req->data; + + kfree(req); + + return ret; +} + +static int ad7879_write(struct spi_device *spi, u8 reg, u16 val) +{ + struct ser_req *req; + int status; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) AD7879_WRITECMD(reg); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + + req->data = val; + req->xfer[1].tx_buf = &req->data; + req->xfer[1].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + spi_message_add_tail(&req->xfer[1], &req->msg); + + status = spi_sync(spi, &req->msg); + + kfree(req); + + return status; +} + +static void ad7879_collect(struct ad7879 *ts) +{ + int status = spi_sync(ts->bus, &ts->msg); + + if (status) + dev_err(&ts->bus->dev, "spi_sync --> %d\n", status); +} + +static void ad7879_setup_ts_def_msg(struct ad7879 *ts) +{ + struct spi_message *m; + int i; + + ts->cmd = (u16) AD7879_READCMD(AD7879_REG_XPLUS); + + m = &ts->msg; + spi_message_init(m); + ts->xfer[0].tx_buf = &ts->cmd; + ts->xfer[0].len = 2; + + spi_message_add_tail(&ts->xfer[0], m); + + for (i = 0; i < AD7879_NR_SENSE; i++) { + ts->xfer[i + 1].rx_buf = &ts->conversion_data[i]; + ts->xfer[i + 1].len = 2; + spi_message_add_tail(&ts->xfer[i + 1], m); + } +} + +static int __devinit ad7879_probe(struct spi_device *spi) +{ + struct ad7879 *ts; + int error; + + /* don't exceed max specified SPI CLK frequency */ + if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { + dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz); + return -EINVAL; + } + + ts = kzalloc(sizeof(struct ad7879), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + dev_set_drvdata(&spi->dev, ts); + ts->bus = spi; + + ad7879_setup_ts_def_msg(ts); + + error = ad7879_construct(spi, ts); + if (error) { + dev_set_drvdata(&spi->dev, NULL); + kfree(ts); + } + + return 0; +} + +static int __devexit ad7879_remove(struct spi_device *spi) +{ + struct ad7879 *ts = dev_get_drvdata(&spi->dev); + + ad7879_destroy(spi, ts); + dev_set_drvdata(&spi->dev, NULL); + kfree(ts); + + return 0; +} + +static struct spi_driver ad7879_driver = { + .driver = { + .name = "ad7879", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + .probe = ad7879_probe, + .remove = __devexit_p(ad7879_remove), + .suspend = ad7879_suspend, + .resume = ad7879_resume, +}; + +static int __init ad7879_init(void) +{ + return spi_register_driver(&ad7879_driver); +} +module_init(ad7879_init); + +static void __exit ad7879_exit(void) +{ + spi_unregister_driver(&ad7879_driver); +} +module_exit(ad7879_exit); + +#elif defined(CONFIG_TOUCHSCREEN_AD7879_I2C) || defined(CONFIG_TOUCHSCREEN_AD7879_I2C_MODULE) + +/* All registers are word-sized. + * AD7879 uses a high-byte first convention. + */ +static int ad7879_read(struct i2c_client *client, u8 reg) +{ + return swab16(i2c_smbus_read_word_data(client, reg)); +} + +static int ad7879_write(struct i2c_client *client, u8 reg, u16 val) +{ + return i2c_smbus_write_word_data(client, reg, swab16(val)); +} + +static void ad7879_collect(struct ad7879 *ts) +{ + int i; + + for (i = 0; i < AD7879_NR_SENSE; i++) + ts->conversion_data[i] = ad7879_read(ts->bus, + AD7879_REG_XPLUS + i); +} + +static int __devinit ad7879_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ad7879 *ts; + int error; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "SMBUS Word Data not Supported\n"); + return -EIO; + } + + ts = kzalloc(sizeof(struct ad7879), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + i2c_set_clientdata(client, ts); + ts->bus = client; + + error = ad7879_construct(client, ts); + if (error) { + i2c_set_clientdata(client, NULL); + kfree(ts); + } + + return 0; +} + +static int __devexit ad7879_remove(struct i2c_client *client) +{ + struct ad7879 *ts = dev_get_drvdata(&client->dev); + + ad7879_destroy(client, ts); + i2c_set_clientdata(client, NULL); + kfree(ts); + + return 0; +} + +static const struct i2c_device_id ad7879_id[] = { + { "ad7879", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, ad7879_id); + +static struct i2c_driver ad7879_driver = { + .driver = { + .name = "ad7879", + .owner = THIS_MODULE, + }, + .probe = ad7879_probe, + .remove = __devexit_p(ad7879_remove), + .suspend = ad7879_suspend, + .resume = ad7879_resume, + .id_table = ad7879_id, +}; + +static int __init ad7879_init(void) +{ + return i2c_add_driver(&ad7879_driver); +} +module_init(ad7879_init); + +static void __exit ad7879_exit(void) +{ + i2c_del_driver(&ad7879_driver); +} +module_exit(ad7879_exit); +#endif + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/spi/ad7879.h b/include/linux/spi/ad7879.h new file mode 100644 index 0000000..4231104 --- /dev/null +++ b/include/linux/spi/ad7879.h @@ -0,0 +1,35 @@ +/* linux/spi/ad7879.h */ + +/* Touchscreen characteristics vary between boards and models. The + * platform_data for the device's "struct device" holds this information. + * + * It's OK if the min/max values are zero. + */ +struct ad7879_platform_data { + u16 model; /* 7879 */ + u16 x_plate_ohms; + u16 x_min, x_max; + u16 y_min, y_max; + u16 pressure_min, pressure_max; + + /* [0..255] 0=OFF Starts at 1=550us and goes + * all the way to 9.440ms in steps of 35us. + */ + u8 pen_down_acc_interval; + /* [0..15] Starts at 0=128us and goes all the + * way to 4.096ms in steps of 128us. + */ + u8 first_conversion_delay; + /* [0..3] 0 = 2us, 1 = 4us, 2 = 8us, 3 = 16us */ + u8 acquisition_time; + /* [0..3] Average X middle samples 0 = 2, 1 = 4, 2 = 8, 3 = 16 */ + u8 averaging; + /* [0..3] Perform X measurements 0 = OFF, + * 1 = 4, 2 = 8, 3 = 16 (median > averaging) + */ + u8 median; + /* 1 = AUX/VBAT/GPIO set to GPIO Output */ + u8 gpio_output; + /* Initial GPIO pin state (valid if gpio_output = 1) */ + u8 gpio_default; +}; -- cgit v0.10.2 From 74f733c7257ca878bf0a4b9365a454ef3fefd196 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Mon, 9 Mar 2009 20:15:08 -0700 Subject: Input: arrange drivers/input/misc/Makefile in alphabetical order Everyone adds their driver to the end of the list, hopefully if it is in alphabetical order new drivers will spread out a bit and I can merge them more easily. Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index e94cfd9..eb3f407 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -4,24 +4,23 @@ # Each configuration option enables a list of files. -obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o -obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o -obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o -obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o -obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o -obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o -obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o +obj-$(CONFIG_INPUT_APANEL) += apanel.o obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o -obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o -obj-$(CONFIG_INPUT_POWERMATE) += powermate.o -obj-$(CONFIG_INPUT_YEALINK) += yealink.o +obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o obj-$(CONFIG_INPUT_CM109) += cm109.o +obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o -obj-$(CONFIG_INPUT_UINPUT) += uinput.o -obj-$(CONFIG_INPUT_APANEL) += apanel.o -obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o +obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o +obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o +obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o -obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o +obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o +obj-$(CONFIG_INPUT_POWERMATE) += powermate.o obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o - +obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o +obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o +obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o +obj-$(CONFIG_INPUT_UINPUT) += uinput.o +obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o +obj-$(CONFIG_INPUT_YEALINK) += yealink.o -- cgit v0.10.2 From 406107dacde125346c313d34534eed937eb25444 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:11 +0100 Subject: microblaze_v8: Cpuinfo handling Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/cpuinfo.h b/arch/microblaze/include/asm/cpuinfo.h new file mode 100644 index 0000000..52f28f6 --- /dev/null +++ b/arch/microblaze/include/asm/cpuinfo.h @@ -0,0 +1,102 @@ +/* + * Generic support for queying CPU info + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_CPUINFO_H +#define _ASM_MICROBLAZE_CPUINFO_H + +#include + +/* CPU Version and FPGA Family code conversion table type */ +struct cpu_ver_key { + const char *s; + const unsigned k; +}; + +extern const struct cpu_ver_key cpu_ver_lookup[]; + +struct family_string_key { + const char *s; + const unsigned k; +}; + +extern const struct family_string_key family_string_lookup[]; + +struct cpuinfo { + /* Core CPU configuration */ + u32 use_instr; + u32 use_mult; + u32 use_fpu; + u32 use_exc; + u32 ver_code; + u32 mmu; + + /* CPU caches */ + u32 use_icache; + u32 icache_tagbits; + u32 icache_write; + u32 icache_line; + u32 icache_size; + unsigned long icache_base; + unsigned long icache_high; + + u32 use_dcache; + u32 dcache_tagbits; + u32 dcache_write; + u32 dcache_line; + u32 dcache_size; + unsigned long dcache_base; + unsigned long dcache_high; + + /* Bus connections */ + u32 use_dopb; + u32 use_iopb; + u32 use_dlmb; + u32 use_ilmb; + u32 num_fsl; + + /* CPU interrupt line info */ + u32 irq_edge; + u32 irq_positive; + + u32 area_optimised; + + /* HW debug support */ + u32 hw_debug; + u32 num_pc_brk; + u32 num_rd_brk; + u32 num_wr_brk; + u32 cpu_clock_freq; /* store real freq of cpu */ + u32 freq_div_hz; /* store freq/HZ */ + + /* FPGA family */ + u32 fpga_family_code; + + /* User define */ + u32 pvr_user1; + u32 pvr_user2; +}; + +extern struct cpuinfo cpuinfo; + +/* fwd declarations of the various CPUinfo populators */ +void setup_cpuinfo(void); + +void set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu); +void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu); + +static inline unsigned int fcpu(struct device_node *cpu, char *n) +{ + int *val; + return (val = (int *) of_get_property(cpu, n, NULL)) ? *val : 0; +} + +#endif /* _ASM_MICROBLAZE_CPUINFO_H */ diff --git a/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c b/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c new file mode 100644 index 0000000..cf7424a --- /dev/null +++ b/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c @@ -0,0 +1,101 @@ +/* + * Support for MicroBlaze PVR (processor version register) + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include + +/* + * Helper macro to map between fields in our struct cpuinfo, and + * the PVR macros in pvr.h. + */ + +#define CI(c, p) { ci->c = PVR_##p(pvr); } +#define err_printk(x) \ + early_printk("ERROR: Microblaze " x " - different for PVR and DTS\n"); + +void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu) +{ + struct pvr_s pvr; + int temp; /* for saving temp value */ + get_pvr(&pvr); + + temp = PVR_USE_BARREL(pvr) | PVR_USE_MSR_INSTR(pvr) |\ + PVR_USE_PCMP_INSTR(pvr) | PVR_USE_DIV(pvr); + if (ci->use_instr != temp) + err_printk("BARREL, MSR, PCMP or DIV"); + ci->use_instr = temp; + + temp = PVR_USE_HW_MUL(pvr) | PVR_USE_MUL64(pvr); + if (ci->use_mult != temp) + err_printk("HW_MUL"); + ci->use_mult = temp; + + temp = PVR_USE_FPU(pvr) | PVR_USE_FPU2(pvr); + if (ci->use_fpu != temp) + err_printk("HW_FPU"); + ci->use_fpu = temp; + + ci->use_exc = PVR_OPCODE_0x0_ILLEGAL(pvr) |\ + PVR_UNALIGNED_EXCEPTION(pvr) |\ + PVR_ILL_OPCODE_EXCEPTION(pvr) |\ + PVR_IOPB_BUS_EXCEPTION(pvr) |\ + PVR_DOPB_BUS_EXCEPTION(pvr) |\ + PVR_DIV_ZERO_EXCEPTION(pvr) |\ + PVR_FPU_EXCEPTION(pvr) |\ + PVR_FSL_EXCEPTION(pvr); + + CI(pvr_user1, USER1); + CI(pvr_user2, USER2); + + CI(mmu, USE_MMU); + + CI(ver_code, VERSION); + + CI(use_icache, USE_ICACHE); + CI(icache_tagbits, ICACHE_ADDR_TAG_BITS); + CI(icache_write, ICACHE_ALLOW_WR); + CI(icache_line, ICACHE_LINE_LEN); + CI(icache_size, ICACHE_BYTE_SIZE); + CI(icache_base, ICACHE_BASEADDR); + CI(icache_high, ICACHE_HIGHADDR); + + CI(use_dcache, USE_DCACHE); + CI(dcache_tagbits, DCACHE_ADDR_TAG_BITS); + CI(dcache_write, DCACHE_ALLOW_WR); + CI(dcache_line, DCACHE_LINE_LEN); + CI(dcache_size, DCACHE_BYTE_SIZE); + CI(dcache_base, DCACHE_BASEADDR); + CI(dcache_high, DCACHE_HIGHADDR); + + CI(use_dopb, D_OPB); + CI(use_iopb, I_OPB); + CI(use_dlmb, D_LMB); + CI(use_ilmb, I_LMB); + CI(num_fsl, FSL_LINKS); + + CI(irq_edge, INTERRUPT_IS_EDGE); + CI(irq_positive, EDGE_IS_POSITIVE); + + CI(area_optimised, AREA_OPTIMISED); + + CI(hw_debug, DEBUG_ENABLED); + CI(num_pc_brk, NUMBER_OF_PC_BRK); + CI(num_rd_brk, NUMBER_OF_RD_ADDR_BRK); + CI(num_wr_brk, NUMBER_OF_WR_ADDR_BRK); + + CI(fpga_family_code, TARGET_FAMILY); + + /* take timebase-frequency from DTS */ + ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency"); +} diff --git a/arch/microblaze/kernel/cpu/cpuinfo-static.c b/arch/microblaze/kernel/cpu/cpuinfo-static.c new file mode 100644 index 0000000..cfe44ef --- /dev/null +++ b/arch/microblaze/kernel/cpu/cpuinfo-static.c @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +const static char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY; +const static char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER; + +#define err_printk(x) \ + early_printk("ERROR: Microblaze " x "- different for kernel and DTS\n"); + +void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu) +{ + int i = 0; + + ci->use_instr = + (fcpu(cpu, "xlnx,use-barrel") ? PVR0_USE_BARREL_MASK : 0) | + (fcpu(cpu, "xlnx,use-msr-instr") ? PVR2_USE_MSR_INSTR : 0) | + (fcpu(cpu, "xlnx,use-pcmp-instr") ? PVR2_USE_PCMP_INSTR : 0) | + (fcpu(cpu, "xlnx,use-div") ? PVR0_USE_DIV_MASK : 0); + if (CONFIG_XILINX_MICROBLAZE0_USE_BARREL) + i |= PVR0_USE_BARREL_MASK; + if (CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR) + i |= PVR2_USE_MSR_INSTR; + if (CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) + i |= PVR2_USE_PCMP_INSTR; + if (CONFIG_XILINX_MICROBLAZE0_USE_DIV) + i |= PVR0_USE_DIV_MASK; + if (ci->use_instr != i) + err_printk("BARREL, MSR, PCMP or DIV"); + + ci->use_mult = fcpu(cpu, "xlnx,use-hw-mul"); + if (ci->use_mult != CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL) + err_printk("HW_MUL"); + ci->use_mult = + (ci->use_mult > 1 ? + (PVR2_USE_MUL64_MASK | PVR0_USE_HW_MUL_MASK) : + (ci->use_mult == 1 ? PVR0_USE_HW_MUL_MASK : 0)); + + ci->use_fpu = fcpu(cpu, "xlnx,use-fpu"); + if (ci->use_fpu != CONFIG_XILINX_MICROBLAZE0_USE_FPU) + err_printk("HW_FPU"); + ci->use_fpu = (ci->use_fpu > 1 ? + (PVR2_USE_FPU2_MASK | PVR0_USE_FPU_MASK) : + (ci->use_fpu == 1 ? PVR0_USE_FPU_MASK : 0)); + + ci->use_exc = + (fcpu(cpu, "xlnx,unaligned-exceptions") ? + PVR2_UNALIGNED_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,ill-opcode-exception") ? + PVR2_ILL_OPCODE_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,iopb-bus-exception") ? + PVR2_IOPB_BUS_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,dopb-bus-exception") ? + PVR2_DOPB_BUS_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,div-zero-exception") ? + PVR2_DIV_ZERO_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,fpu-exception") ? PVR2_FPU_EXC_MASK : 0) | + (fcpu(cpu, "xlnx,fsl-exception") ? PVR2_USE_EXTEND_FSL : 0); + + ci->use_icache = fcpu(cpu, "xlnx,use-icache"); + ci->icache_tagbits = fcpu(cpu, "xlnx,addr-tag-bits"); + ci->icache_write = fcpu(cpu, "xlnx,allow-icache-wr"); + ci->icache_line = fcpu(cpu, "xlnx,icache-line-len") << 2; + if (!ci->icache_line) { + if (fcpu(cpu, "xlnx,icache-use-fsl")) + ci->icache_line = 4 << 2; + else + ci->icache_line = 1 << 2; + } + ci->icache_size = fcpu(cpu, "i-cache-size"); + ci->icache_base = fcpu(cpu, "i-cache-baseaddr"); + ci->icache_high = fcpu(cpu, "i-cache-highaddr"); + + ci->use_dcache = fcpu(cpu, "xlnx,use-dcache"); + ci->dcache_tagbits = fcpu(cpu, "xlnx,dcache-addr-tag"); + ci->dcache_write = fcpu(cpu, "xlnx,allow-dcache-wr"); + ci->dcache_line = fcpu(cpu, "xlnx,dcache-line-len") << 2; + if (!ci->dcache_line) { + if (fcpu(cpu, "xlnx,dcache-use-fsl")) + ci->dcache_line = 4 << 2; + else + ci->dcache_line = 1 << 2; + } + ci->dcache_size = fcpu(cpu, "d-cache-size"); + ci->dcache_base = fcpu(cpu, "d-cache-baseaddr"); + ci->dcache_high = fcpu(cpu, "d-cache-highaddr"); + + ci->use_dopb = fcpu(cpu, "xlnx,d-opb"); + ci->use_iopb = fcpu(cpu, "xlnx,i-opb"); + ci->use_dlmb = fcpu(cpu, "xlnx,d-lmb"); + ci->use_ilmb = fcpu(cpu, "xlnx,i-lmb"); + + ci->num_fsl = fcpu(cpu, "xlnx,fsl-links"); + ci->irq_edge = fcpu(cpu, "xlnx,interrupt-is-edge"); + ci->irq_positive = fcpu(cpu, "xlnx,edge-is-positive"); + ci->area_optimised = 0; + + ci->hw_debug = fcpu(cpu, "xlnx,debug-enabled"); + ci->num_pc_brk = fcpu(cpu, "xlnx,number-of-pc-brk"); + ci->num_rd_brk = fcpu(cpu, "xlnx,number-of-rd-addr-brk"); + ci->num_wr_brk = fcpu(cpu, "xlnx,number-of-wr-addr-brk"); + + ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency"); + + ci->pvr_user1 = fcpu(cpu, "xlnx,pvr-user1"); + ci->pvr_user2 = fcpu(cpu, "xlnx,pvr-user2"); + + ci->mmu = fcpu(cpu, "xlnx,use-mmu"); + + ci->ver_code = 0; + ci->fpga_family_code = 0; + + /* Do various fixups based on CPU version and FPGA family strings */ + + /* Resolved the CPU version code */ + for (i = 0; cpu_ver_lookup[i].s != NULL; i++) { + if (strcmp(cpu_ver_lookup[i].s, cpu_ver_string) == 0) + ci->ver_code = cpu_ver_lookup[i].k; + } + + /* Resolved the fpga family code */ + for (i = 0; family_string_lookup[i].s != NULL; i++) { + if (strcmp(family_string_lookup[i].s, family_string) == 0) + ci->fpga_family_code = family_string_lookup[i].k; + } + + /* FIXME - mb3 and spartan2 do not exist in PVR */ + /* This is mb3 and on a non Spartan2 */ + if (ci->ver_code == 0x20 && ci->fpga_family_code != 0xf0) + /* Hardware Multiplier in use */ + ci->use_mult = 1; +} diff --git a/arch/microblaze/kernel/cpu/cpuinfo.c b/arch/microblaze/kernel/cpu/cpuinfo.c new file mode 100644 index 0000000..4a740df --- /dev/null +++ b/arch/microblaze/kernel/cpu/cpuinfo.c @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include + +const struct cpu_ver_key cpu_ver_lookup[] = { + /* These key value are as per MBV field in PVR0 */ + {"5.00.a", 0x01}, + {"5.00.b", 0x02}, + {"5.00.c", 0x03}, + {"6.00.a", 0x04}, + {"6.00.b", 0x06}, + {"7.00.a", 0x05}, + {"7.00.b", 0x07}, + {"7.10.a", 0x08}, + {"7.10.b", 0x09}, + {"7.10.c", 0x0a}, + {"7.10.d", 0x0b}, + /* FIXME There is no keycode defined in MBV for these versions */ + {"2.10.a", 0x10}, + {"3.00.a", 0x20}, + {"4.00.a", 0x30}, + {"4.00.b", 0x40}, + {NULL, 0}, +}; + +/* + * FIXME Not sure if the actual key is defined by Xilinx in the PVR + */ +const struct family_string_key family_string_lookup[] = { + {"virtex2", 0x4}, + {"virtex2pro", 0x5}, + {"spartan3", 0x6}, + {"virtex4", 0x7}, + {"virtex5", 0x8}, + {"spartan3e", 0x9}, + {"spartan3a", 0xa}, + {"spartan3an", 0xb}, + {"spartan3adsp", 0xc}, + /* FIXME There is no key code defined for spartan2 */ + {"spartan2", 0xf0}, + {NULL, 0}, +}; + +struct cpuinfo cpuinfo; + +void __init setup_cpuinfo(void) +{ + struct device_node *cpu = NULL; + + cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu"); + if (!cpu) + printk(KERN_ERR "You don't have cpu!!!\n"); + + printk(KERN_INFO "%s: initialising\n", __func__); + + switch (cpu_has_pvr()) { + case 0: + printk(KERN_WARNING + "%s: No PVR support. Using static CPU info from FDT\n", + __func__); + set_cpuinfo_static(&cpuinfo, cpu); + break; +/* FIXME I found weird behavior with MB 7.00.a/b + * please do not use FULL PVR with MMU */ + case 1: + printk(KERN_INFO "%s: Using full CPU PVR support\n", + __func__); + set_cpuinfo_static(&cpuinfo, cpu); + set_cpuinfo_pvr_full(&cpuinfo, cpu); + break; + default: + printk(KERN_WARNING "%s: Unsupported PVR setting\n", __func__); + set_cpuinfo_static(&cpuinfo, cpu); + } +} -- cgit v0.10.2 From 12e8414263f47352b3fec8ba5efff160584202e0 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:12 +0100 Subject: microblaze_v8: Open firmware files Reviewed-by: Ingo Molnar Reviewed-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/of_device.h b/arch/microblaze/include/asm/of_device.h new file mode 100644 index 0000000..ba917cf --- /dev/null +++ b/arch/microblaze/include/asm/of_device.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2007-2008 Michal Simek + * + * based on PowerPC of_device.h + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_OF_DEVICE_H +#define _ASM_MICROBLAZE_OF_DEVICE_H +#ifdef __KERNEL__ + +#include +#include + +/* + * The of_device is a kind of "base class" that is a superset of + * struct device for use by devices attached to an OF node and + * probed using OF properties. + */ +struct of_device { + struct device_node *node; /* to be obsoleted */ + u64 dma_mask; /* DMA mask */ + struct device dev; /* Generic device interface */ +}; + +extern ssize_t of_device_get_modalias(struct of_device *ofdev, + char *str, ssize_t len); + +extern struct of_device *of_device_alloc(struct device_node *np, + const char *bus_id, + struct device *parent); + +extern int of_device_uevent(struct device *dev, + struct kobj_uevent_env *env); + +extern void of_device_make_bus_id(struct of_device *dev); + +/* This is just here during the transition */ +#include + +#endif /* __KERNEL__ */ +#endif /* _ASM_MICROBLAZE_OF_DEVICE_H */ diff --git a/arch/microblaze/include/asm/of_platform.h b/arch/microblaze/include/asm/of_platform.h new file mode 100644 index 0000000..187c0ee --- /dev/null +++ b/arch/microblaze/include/asm/of_platform.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp. + * + * + * 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. + */ + +#ifndef _ASM_MICROBLAZE_OF_PLATFORM_H +#define _ASM_MICROBLAZE_OF_PLATFORM_H + +/* This is just here during the transition */ +#include + +/* + * The list of OF IDs below is used for matching bus types in the + * system whose devices are to be exposed as of_platform_devices. + * + * This is the default list valid for most platforms. This file provides + * functions who can take an explicit list if necessary though + * + * The search is always performed recursively looking for children of + * the provided device_node and recursively if such a children matches + * a bus type in the list + */ + +static const struct of_device_id of_default_bus_ids[] = { + { .type = "soc", }, + { .compatible = "soc", }, + { .type = "plb5", }, + { .type = "plb4", }, + { .type = "opb", }, + { .type = "simple", }, + {}, +}; + +/* Platform drivers register/unregister */ +static inline int of_register_platform_driver(struct of_platform_driver *drv) +{ + return of_register_driver(drv, &of_platform_bus_type); +} +static inline void of_unregister_platform_driver(struct of_platform_driver *drv) +{ + of_unregister_driver(drv); +} + +/* Platform devices and busses creation */ +extern struct of_device *of_platform_device_create(struct device_node *np, + const char *bus_id, + struct device *parent); +/* pseudo "matches" value to not do deep probe */ +#define OF_NO_DEEP_PROBE ((struct of_device_id *)-1) + +extern int of_platform_bus_probe(struct device_node *root, + const struct of_device_id *matches, + struct device *parent); + +extern struct of_device *of_find_device_by_phandle(phandle ph); + +extern void of_instantiate_rtc(void); + +#endif /* _ASM_MICROBLAZE_OF_PLATFORM_H */ diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h new file mode 100644 index 0000000..20f7b3a --- /dev/null +++ b/arch/microblaze/include/asm/prom.h @@ -0,0 +1,313 @@ +/* + * Definitions for talking to the Open Firmware PROM on + * Power Macintosh computers. + * + * Copyright (C) 1996-2005 Paul Mackerras. + * + * Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp. + * + * 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. + */ + +#ifndef _ASM_MICROBLAZE_PROM_H +#define _ASM_MICROBLAZE_PROM_H +#ifdef __KERNEL__ + +#include +#include +#include +#include +#include + +#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1 +#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 + +#define of_compat_cmp(s1, s2, l) strncasecmp((s1), (s2), (l)) +#define of_prop_cmp(s1, s2) strcmp((s1), (s2)) +#define of_node_cmp(s1, s2) strcasecmp((s1), (s2)) + +/* Definitions used by the flattened device tree */ +#define OF_DT_HEADER 0xd00dfeed /* marker */ +#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */ +#define OF_DT_END_NODE 0x2 /* End node */ +#define OF_DT_PROP 0x3 /* Property: name off, size, content */ +#define OF_DT_NOP 0x4 /* nop */ +#define OF_DT_END 0x9 + +#define OF_DT_VERSION 0x10 + +/* + * This is what gets passed to the kernel by prom_init or kexec + * + * The dt struct contains the device tree structure, full pathes and + * property contents. The dt strings contain a separate block with just + * the strings for the property names, and is fully page aligned and + * self contained in a page, so that it can be kept around by the kernel, + * each property name appears only once in this page (cheap compression) + * + * the mem_rsvmap contains a map of reserved ranges of physical memory, + * passing it here instead of in the device-tree itself greatly simplifies + * the job of everybody. It's just a list of u64 pairs (base/size) that + * ends when size is 0 + */ +struct boot_param_header { + u32 magic; /* magic word OF_DT_HEADER */ + u32 totalsize; /* total size of DT block */ + u32 off_dt_struct; /* offset to structure */ + u32 off_dt_strings; /* offset to strings */ + u32 off_mem_rsvmap; /* offset to memory reserve map */ + u32 version; /* format version */ + u32 last_comp_version; /* last compatible version */ + /* version 2 fields below */ + u32 boot_cpuid_phys; /* Physical CPU id we're booting on */ + /* version 3 fields below */ + u32 dt_strings_size; /* size of the DT strings block */ + /* version 17 fields below */ + u32 dt_struct_size; /* size of the DT structure block */ +}; + +typedef u32 phandle; +typedef u32 ihandle; + +struct property { + char *name; + int length; + void *value; + struct property *next; +}; + +struct device_node { + const char *name; + const char *type; + phandle node; + phandle linux_phandle; + char *full_name; + + struct property *properties; + struct property *deadprops; /* removed properties */ + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + struct device_node *next; /* next device of same type */ + struct device_node *allnext; /* next in list of all nodes */ + struct proc_dir_entry *pde; /* this node's proc directory */ + struct kref kref; + unsigned long _flags; + void *data; +}; + +extern struct device_node *of_chosen; + +static inline int of_node_check_flag(struct device_node *n, unsigned long flag) +{ + return test_bit(flag, &n->_flags); +} + +static inline void of_node_set_flag(struct device_node *n, unsigned long flag) +{ + set_bit(flag, &n->_flags); +} + +#define HAVE_ARCH_DEVTREE_FIXUPS + +static inline void set_node_proc_entry(struct device_node *dn, + struct proc_dir_entry *de) +{ + dn->pde = de; +} + +extern struct device_node *allnodes; /* temporary while merging */ +extern rwlock_t devtree_lock; /* temporary while merging */ + +extern struct device_node *of_find_all_nodes(struct device_node *prev); +extern struct device_node *of_node_get(struct device_node *node); +extern void of_node_put(struct device_node *node); + +/* For scanning the flat device-tree at boot time */ +extern int __init of_scan_flat_dt(int (*it)(unsigned long node, + const char *uname, int depth, + void *data), + void *data); +extern void *__init of_get_flat_dt_prop(unsigned long node, const char *name, + unsigned long *size); +extern int __init + of_flat_dt_is_compatible(unsigned long node, const char *name); +extern unsigned long __init of_get_flat_dt_root(void); + +/* For updating the device tree at runtime */ +extern void of_attach_node(struct device_node *); +extern void of_detach_node(struct device_node *); + +/* Other Prototypes */ +extern void finish_device_tree(void); +extern void unflatten_device_tree(void); +extern int early_uartlite_console(void); +extern void early_init_devtree(void *); +extern int machine_is_compatible(const char *compat); +extern void print_properties(struct device_node *node); +extern int prom_n_intr_cells(struct device_node *np); +extern void prom_get_irq_senses(unsigned char *senses, int off, int max); +extern int prom_add_property(struct device_node *np, struct property *prop); +extern int prom_remove_property(struct device_node *np, struct property *prop); +extern int prom_update_property(struct device_node *np, + struct property *newprop, + struct property *oldprop); + +extern struct resource *request_OF_resource(struct device_node *node, + int index, const char *name_postfix); +extern int release_OF_resource(struct device_node *node, int index); + +/* + * OF address retreival & translation + */ + +/* Helper to read a big number; size is in cells (not bytes) */ +static inline u64 of_read_number(const u32 *cell, int size) +{ + u64 r = 0; + while (size--) + r = (r << 32) | *(cell++); + return r; +} + +/* Like of_read_number, but we want an unsigned long result */ +#define of_read_ulong(cell, size) of_read_number(cell, size) + +/* Translate an OF address block into a CPU physical address + */ +extern u64 of_translate_address(struct device_node *np, const u32 *addr); + +/* Extract an address from a device, returns the region size and + * the address space flags too. The PCI version uses a BAR number + * instead of an absolute index + */ +extern const u32 *of_get_address(struct device_node *dev, int index, + u64 *size, unsigned int *flags); +extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no, + u64 *size, unsigned int *flags); + +/* Get an address as a resource. Note that if your address is + * a PIO address, the conversion will fail if the physical address + * can't be internally converted to an IO token with + * pci_address_to_pio(), that is because it's either called to early + * or it can't be matched to any host bridge IO space + */ +extern int of_address_to_resource(struct device_node *dev, int index, + struct resource *r); +extern int of_pci_address_to_resource(struct device_node *dev, int bar, + struct resource *r); + +/* Parse the ibm,dma-window property of an OF node into the busno, phys and + * size parameters. + */ +void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, + unsigned long *busno, unsigned long *phys, unsigned long *size); + +extern void kdump_move_device_tree(void); + +/* CPU OF node matching */ +struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); + +/* Get the MAC address */ +extern const void *of_get_mac_address(struct device_node *np); + +/* + * OF interrupt mapping + */ + +/* This structure is returned when an interrupt is mapped. The controller + * field needs to be put() after use + */ + +#define OF_MAX_IRQ_SPEC 4 /* We handle specifiers of at most 4 cells */ + +struct of_irq { + struct device_node *controller; /* Interrupt controller node */ + u32 size; /* Specifier size */ + u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ +}; + +/** + * of_irq_map_init - Initialize the irq remapper + * @flags: flags defining workarounds to enable + * + * Some machines have bugs in the device-tree which require certain workarounds + * to be applied. Call this before any interrupt mapping attempts to enable + * those workarounds. + */ +#define OF_IMAP_OLDWORLD_MAC 0x00000001 +#define OF_IMAP_NO_PHANDLE 0x00000002 + +extern void of_irq_map_init(unsigned int flags); + +/** + * of_irq_map_raw - Low level interrupt tree parsing + * @parent: the device interrupt parent + * @intspec: interrupt specifier ("interrupts" property of the device) + * @ointsize: size of the passed in interrupt specifier + * @addr: address specifier (start of "reg" property of the device) + * @out_irq: structure of_irq filled by this function + * + * Returns 0 on success and a negative number on error + * + * This function is a low-level interrupt tree walking function. It + * can be used to do a partial walk with synthetized reg and interrupts + * properties, for example when resolving PCI interrupts when no device + * node exist for the parent. + * + */ + +extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec, + u32 ointsize, const u32 *addr, + struct of_irq *out_irq); + +/** + * of_irq_map_one - Resolve an interrupt for a device + * @device: the device whose interrupt is to be resolved + * @index: index of the interrupt to resolve + * @out_irq: structure of_irq filled by this function + * + * This function resolves an interrupt, walking the tree, for a given + * device-tree node. It's the high level pendant to of_irq_map_raw(). + * It also implements the workarounds for OldWolrd Macs. + */ +extern int of_irq_map_one(struct device_node *device, int index, + struct of_irq *out_irq); + +/** + * of_irq_map_pci - Resolve the interrupt for a PCI device + * @pdev: the device whose interrupt is to be resolved + * @out_irq: structure of_irq filled by this function + * + * This function resolves the PCI interrupt for a given PCI device. If a + * device-node exists for a given pci_dev, it will use normal OF tree + * walking. If not, it will implement standard swizzling and walk up the + * PCI tree until an device-node is found, at which point it will finish + * resolving using the OF tree walking. + */ +struct pci_dev; +extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); + +extern int of_irq_to_resource(struct device_node *dev, int index, + struct resource *r); + +/** + * of_iomap - Maps the memory mapped IO for a given device_node + * @device: the device whose io range will be mapped + * @index: index of the io range + * + * Returns a pointer to the mapped memory + */ +extern void __iomem *of_iomap(struct device_node *device, int index); + +/* + * NB: This is here while we transition from using asm/prom.h + * to linux/of.h + */ +#include + +#endif /* __KERNEL__ */ +#endif /* _ASM_MICROBLAZE_PROM_H */ diff --git a/arch/microblaze/kernel/of_device.c b/arch/microblaze/kernel/of_device.c new file mode 100644 index 0000000..717edf4 --- /dev/null +++ b/arch/microblaze/kernel/of_device.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +void of_device_make_bus_id(struct of_device *dev) +{ + static atomic_t bus_no_reg_magic; + struct device_node *node = dev->node; + char *name = dev->dev.bus_id; + const u32 *reg; + u64 addr; + int magic; + + /* + * For MMIO, get the physical address + */ + reg = of_get_property(node, "reg", NULL); + if (reg) { + addr = of_translate_address(node, reg); + if (addr != OF_BAD_ADDR) { + snprintf(name, BUS_ID_SIZE, + "%llx.%s", (unsigned long long)addr, + node->name); + return; + } + } + + /* + * No BusID, use the node name and add a globally incremented + * counter (and pray...) + */ + magic = atomic_add_return(1, &bus_no_reg_magic); + snprintf(name, BUS_ID_SIZE, "%s.%d", node->name, magic - 1); +} +EXPORT_SYMBOL(of_device_make_bus_id); + +struct of_device *of_device_alloc(struct device_node *np, + const char *bus_id, + struct device *parent) +{ + struct of_device *dev; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return NULL; + + dev->node = of_node_get(np); + dev->dev.dma_mask = &dev->dma_mask; + dev->dev.parent = parent; + dev->dev.release = of_release_dev; + dev->dev.archdata.of_node = np; + + if (bus_id) + strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE); + else + of_device_make_bus_id(dev); + + return dev; +} +EXPORT_SYMBOL(of_device_alloc); + +int of_device_uevent(struct device *dev, struct kobj_uevent_env *env) +{ + struct of_device *ofdev; + const char *compat; + int seen = 0, cplen, sl; + + if (!dev) + return -ENODEV; + + ofdev = to_of_device(dev); + + if (add_uevent_var(env, "OF_NAME=%s", ofdev->node->name)) + return -ENOMEM; + + if (add_uevent_var(env, "OF_TYPE=%s", ofdev->node->type)) + return -ENOMEM; + + /* Since the compatible field can contain pretty much anything + * it's not really legal to split it out with commas. We split it + * up using a number of environment variables instead. */ + + compat = of_get_property(ofdev->node, "compatible", &cplen); + while (compat && *compat && cplen > 0) { + if (add_uevent_var(env, "OF_COMPATIBLE_%d=%s", seen, compat)) + return -ENOMEM; + + sl = strlen(compat) + 1; + compat += sl; + cplen -= sl; + seen++; + } + + if (add_uevent_var(env, "OF_COMPATIBLE_N=%d", seen)) + return -ENOMEM; + + /* modalias is trickier, we add it in 2 steps */ + if (add_uevent_var(env, "MODALIAS=")) + return -ENOMEM; + sl = of_device_get_modalias(ofdev, &env->buf[env->buflen-1], + sizeof(env->buf) - env->buflen); + if (sl >= (sizeof(env->buf) - env->buflen)) + return -ENOMEM; + env->buflen += sl; + + return 0; +} +EXPORT_SYMBOL(of_device_uevent); diff --git a/arch/microblaze/kernel/of_platform.c b/arch/microblaze/kernel/of_platform.c new file mode 100644 index 0000000..acf4574 --- /dev/null +++ b/arch/microblaze/kernel/of_platform.c @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp. + * + * and Arnd Bergmann, IBM Corp. + * + * 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. + * + */ + +#undef DEBUG + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct bus_type of_platform_bus_type = { + .uevent = of_device_uevent, +}; +EXPORT_SYMBOL(of_platform_bus_type); + +static int __init of_bus_driver_init(void) +{ + return of_bus_type_init(&of_platform_bus_type, "of_platform"); +} +postcore_initcall(of_bus_driver_init); + +struct of_device *of_platform_device_create(struct device_node *np, + const char *bus_id, + struct device *parent) +{ + struct of_device *dev; + + dev = of_device_alloc(np, bus_id, parent); + if (!dev) + return NULL; + + dev->dma_mask = 0xffffffffUL; + dev->dev.bus = &of_platform_bus_type; + + /* We do not fill the DMA ops for platform devices by default. + * This is currently the responsibility of the platform code + * to do such, possibly using a device notifier + */ + + if (of_device_register(dev) != 0) { + of_device_free(dev); + return NULL; + } + + return dev; +} +EXPORT_SYMBOL(of_platform_device_create); + +/** + * of_platform_bus_create - Create an OF device for a bus node and all its + * children. Optionally recursively instanciate matching busses. + * @bus: device node of the bus to instanciate + * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to + * disallow recursive creation of child busses + */ +static int of_platform_bus_create(const struct device_node *bus, + const struct of_device_id *matches, + struct device *parent) +{ + struct device_node *child; + struct of_device *dev; + int rc = 0; + + for_each_child_of_node(bus, child) { + pr_debug(" create child: %s\n", child->full_name); + dev = of_platform_device_create(child, NULL, parent); + if (dev == NULL) + rc = -ENOMEM; + else if (!of_match_node(matches, child)) + continue; + if (rc == 0) { + pr_debug(" and sub busses\n"); + rc = of_platform_bus_create(child, matches, &dev->dev); + } + if (rc) { + of_node_put(child); + break; + } + } + return rc; +} + + +/** + * of_platform_bus_probe - Probe the device-tree for platform busses + * @root: parent of the first level to probe or NULL for the root of the tree + * @matches: match table, NULL to use the default + * @parent: parent to hook devices from, NULL for toplevel + * + * Note that children of the provided root are not instanciated as devices + * unless the specified root itself matches the bus list and is not NULL. + */ + +int of_platform_bus_probe(struct device_node *root, + const struct of_device_id *matches, + struct device *parent) +{ + struct device_node *child; + struct of_device *dev; + int rc = 0; + + if (matches == NULL) + matches = of_default_bus_ids; + if (matches == OF_NO_DEEP_PROBE) + return -EINVAL; + if (root == NULL) + root = of_find_node_by_path("/"); + else + of_node_get(root); + + pr_debug("of_platform_bus_probe()\n"); + pr_debug(" starting at: %s\n", root->full_name); + + /* Do a self check of bus type, if there's a match, create + * children + */ + if (of_match_node(matches, root)) { + pr_debug(" root match, create all sub devices\n"); + dev = of_platform_device_create(root, NULL, parent); + if (dev == NULL) { + rc = -ENOMEM; + goto bail; + } + pr_debug(" create all sub busses\n"); + rc = of_platform_bus_create(root, matches, &dev->dev); + goto bail; + } + for_each_child_of_node(root, child) { + if (!of_match_node(matches, child)) + continue; + + pr_debug(" match: %s\n", child->full_name); + dev = of_platform_device_create(child, NULL, parent); + if (dev == NULL) + rc = -ENOMEM; + else + rc = of_platform_bus_create(child, matches, &dev->dev); + if (rc) { + of_node_put(child); + break; + } + } + bail: + of_node_put(root); + return rc; +} +EXPORT_SYMBOL(of_platform_bus_probe); + +static int of_dev_node_match(struct device *dev, void *data) +{ + return to_of_device(dev)->node == data; +} + +struct of_device *of_find_device_by_node(struct device_node *np) +{ + struct device *dev; + + dev = bus_find_device(&of_platform_bus_type, + NULL, np, of_dev_node_match); + if (dev) + return to_of_device(dev); + return NULL; +} +EXPORT_SYMBOL(of_find_device_by_node); + +static int of_dev_phandle_match(struct device *dev, void *data) +{ + phandle *ph = data; + return to_of_device(dev)->node->linux_phandle == *ph; +} + +struct of_device *of_find_device_by_phandle(phandle ph) +{ + struct device *dev; + + dev = bus_find_device(&of_platform_bus_type, + NULL, &ph, of_dev_phandle_match); + if (dev) + return to_of_device(dev); + return NULL; +} +EXPORT_SYMBOL(of_find_device_by_phandle); diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c new file mode 100644 index 0000000..475b1fa --- /dev/null +++ b/arch/microblaze/kernel/prom.c @@ -0,0 +1,1147 @@ +/* + * Procedures for creating, accessing and interpreting the device tree. + * + * Paul Mackerras August 1996. + * Copyright (C) 1996-2005 Paul Mackerras. + * + * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. + * {engebret|bergner}@us.ibm.com + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int __initdata dt_root_addr_cells; +static int __initdata dt_root_size_cells; + +typedef u32 cell_t; + +static struct boot_param_header *initial_boot_params; + +/* export that to outside world */ +struct device_node *of_chosen; + +static inline char *find_flat_dt_string(u32 offset) +{ + return ((char *)initial_boot_params) + + initial_boot_params->off_dt_strings + offset; +} + +/** + * This function is used to scan the flattened device-tree, it is + * used to extract the memory informations at boot before we can + * unflatten the tree + */ +int __init of_scan_flat_dt(int (*it)(unsigned long node, + const char *uname, int depth, + void *data), + void *data) +{ + unsigned long p = ((unsigned long)initial_boot_params) + + initial_boot_params->off_dt_struct; + int rc = 0; + int depth = -1; + + do { + u32 tag = *((u32 *)p); + char *pathp; + + p += 4; + if (tag == OF_DT_END_NODE) { + depth--; + continue; + } + if (tag == OF_DT_NOP) + continue; + if (tag == OF_DT_END) + break; + if (tag == OF_DT_PROP) { + u32 sz = *((u32 *)p); + p += 8; + if (initial_boot_params->version < 0x10) + p = _ALIGN(p, sz >= 8 ? 8 : 4); + p += sz; + p = _ALIGN(p, 4); + continue; + } + if (tag != OF_DT_BEGIN_NODE) { + printk(KERN_WARNING "Invalid tag %x scanning flattened" + " device tree !\n", tag); + return -EINVAL; + } + depth++; + pathp = (char *)p; + p = _ALIGN(p + strlen(pathp) + 1, 4); + if ((*pathp) == '/') { + char *lp, *np; + for (lp = NULL, np = pathp; *np; np++) + if ((*np) == '/') + lp = np+1; + if (lp != NULL) + pathp = lp; + } + rc = it(p, pathp, depth, data); + if (rc != 0) + break; + } while (1); + + return rc; +} + +unsigned long __init of_get_flat_dt_root(void) +{ + unsigned long p = ((unsigned long)initial_boot_params) + + initial_boot_params->off_dt_struct; + + while (*((u32 *)p) == OF_DT_NOP) + p += 4; + BUG_ON(*((u32 *)p) != OF_DT_BEGIN_NODE); + p += 4; + return _ALIGN(p + strlen((char *)p) + 1, 4); +} + +/** + * This function can be used within scan_flattened_dt callback to get + * access to properties + */ +void *__init of_get_flat_dt_prop(unsigned long node, const char *name, + unsigned long *size) +{ + unsigned long p = node; + + do { + u32 tag = *((u32 *)p); + u32 sz, noff; + const char *nstr; + + p += 4; + if (tag == OF_DT_NOP) + continue; + if (tag != OF_DT_PROP) + return NULL; + + sz = *((u32 *)p); + noff = *((u32 *)(p + 4)); + p += 8; + if (initial_boot_params->version < 0x10) + p = _ALIGN(p, sz >= 8 ? 8 : 4); + + nstr = find_flat_dt_string(noff); + if (nstr == NULL) { + printk(KERN_WARNING "Can't find property index" + " name !\n"); + return NULL; + } + if (strcmp(name, nstr) == 0) { + if (size) + *size = sz; + return (void *)p; + } + p += sz; + p = _ALIGN(p, 4); + } while (1); +} + +int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) +{ + const char *cp; + unsigned long cplen, l; + + cp = of_get_flat_dt_prop(node, "compatible", &cplen); + if (cp == NULL) + return 0; + while (cplen > 0) { + if (strncasecmp(cp, compat, strlen(compat)) == 0) + return 1; + l = strlen(cp) + 1; + cp += l; + cplen -= l; + } + + return 0; +} + +static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, + unsigned long align) +{ + void *res; + + *mem = _ALIGN(*mem, align); + res = (void *)*mem; + *mem += size; + + return res; +} + +static unsigned long __init unflatten_dt_node(unsigned long mem, + unsigned long *p, + struct device_node *dad, + struct device_node ***allnextpp, + unsigned long fpsize) +{ + struct device_node *np; + struct property *pp, **prev_pp = NULL; + char *pathp; + u32 tag; + unsigned int l, allocl; + int has_name = 0; + int new_format = 0; + + tag = *((u32 *)(*p)); + if (tag != OF_DT_BEGIN_NODE) { + printk("Weird tag at start of node: %x\n", tag); + return mem; + } + *p += 4; + pathp = (char *)*p; + l = allocl = strlen(pathp) + 1; + *p = _ALIGN(*p + l, 4); + + /* version 0x10 has a more compact unit name here instead of the full + * path. we accumulate the full path size using "fpsize", we'll rebuild + * it later. We detect this because the first character of the name is + * not '/'. + */ + if ((*pathp) != '/') { + new_format = 1; + if (fpsize == 0) { + /* root node: special case. fpsize accounts for path + * plus terminating zero. root node only has '/', so + * fpsize should be 2, but we want to avoid the first + * level nodes to have two '/' so we use fpsize 1 here + */ + fpsize = 1; + allocl = 2; + } else { + /* account for '/' and path size minus terminal 0 + * already in 'l' + */ + fpsize += l; + allocl = fpsize; + } + } + + np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, + __alignof__(struct device_node)); + if (allnextpp) { + memset(np, 0, sizeof(*np)); + np->full_name = ((char *)np) + sizeof(struct device_node); + if (new_format) { + char *p2 = np->full_name; + /* rebuild full path for new format */ + if (dad && dad->parent) { + strcpy(p2, dad->full_name); +#ifdef DEBUG + if ((strlen(p2) + l + 1) != allocl) { + pr_debug("%s: p: %d, l: %d, a: %d\n", + pathp, (int)strlen(p2), + l, allocl); + } +#endif + p2 += strlen(p2); + } + *(p2++) = '/'; + memcpy(p2, pathp, l); + } else + memcpy(np->full_name, pathp, l); + prev_pp = &np->properties; + **allnextpp = np; + *allnextpp = &np->allnext; + if (dad != NULL) { + np->parent = dad; + /* we temporarily use the next field as `last_child'*/ + if (dad->next == NULL) + dad->child = np; + else + dad->next->sibling = np; + dad->next = np; + } + kref_init(&np->kref); + } + while (1) { + u32 sz, noff; + char *pname; + + tag = *((u32 *)(*p)); + if (tag == OF_DT_NOP) { + *p += 4; + continue; + } + if (tag != OF_DT_PROP) + break; + *p += 4; + sz = *((u32 *)(*p)); + noff = *((u32 *)((*p) + 4)); + *p += 8; + if (initial_boot_params->version < 0x10) + *p = _ALIGN(*p, sz >= 8 ? 8 : 4); + + pname = find_flat_dt_string(noff); + if (pname == NULL) { + printk(KERN_INFO + "Can't find property name in list !\n"); + break; + } + if (strcmp(pname, "name") == 0) + has_name = 1; + l = strlen(pname) + 1; + pp = unflatten_dt_alloc(&mem, sizeof(struct property), + __alignof__(struct property)); + if (allnextpp) { + if (strcmp(pname, "linux,phandle") == 0) { + np->node = *((u32 *)*p); + if (np->linux_phandle == 0) + np->linux_phandle = np->node; + } + if (strcmp(pname, "ibm,phandle") == 0) + np->linux_phandle = *((u32 *)*p); + pp->name = pname; + pp->length = sz; + pp->value = (void *)*p; + *prev_pp = pp; + prev_pp = &pp->next; + } + *p = _ALIGN((*p) + sz, 4); + } + /* with version 0x10 we may not have the name property, recreate + * it here from the unit name if absent + */ + if (!has_name) { + char *p1 = pathp, *ps = pathp, *pa = NULL; + int sz; + + while (*p1) { + if ((*p1) == '@') + pa = p1; + if ((*p1) == '/') + ps = p1 + 1; + p1++; + } + if (pa < ps) + pa = p1; + sz = (pa - ps) + 1; + pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz, + __alignof__(struct property)); + if (allnextpp) { + pp->name = "name"; + pp->length = sz; + pp->value = pp + 1; + *prev_pp = pp; + prev_pp = &pp->next; + memcpy(pp->value, ps, sz - 1); + ((char *)pp->value)[sz - 1] = 0; + pr_debug("fixed up name for %s -> %s\n", pathp, + (char *)pp->value); + } + } + if (allnextpp) { + *prev_pp = NULL; + np->name = of_get_property(np, "name", NULL); + np->type = of_get_property(np, "device_type", NULL); + + if (!np->name) + np->name = ""; + if (!np->type) + np->type = ""; + } + while (tag == OF_DT_BEGIN_NODE) { + mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); + tag = *((u32 *)(*p)); + } + if (tag != OF_DT_END_NODE) { + printk(KERN_INFO "Weird tag at end of node: %x\n", tag); + return mem; + } + *p += 4; + return mem; +} + +/** + * unflattens the device-tree passed by the firmware, creating the + * tree of struct device_node. It also fills the "name" and "type" + * pointers of the nodes so the normal device-tree walking functions + * can be used (this used to be done by finish_device_tree) + */ +void __init unflatten_device_tree(void) +{ + unsigned long start, mem, size; + struct device_node **allnextp = &allnodes; + + pr_debug(" -> unflatten_device_tree()\n"); + + /* First pass, scan for size */ + start = ((unsigned long)initial_boot_params) + + initial_boot_params->off_dt_struct; + size = unflatten_dt_node(0, &start, NULL, NULL, 0); + size = (size | 3) + 1; + + pr_debug(" size is %lx, allocating...\n", size); + + /* Allocate memory for the expanded device tree */ + mem = lmb_alloc(size + 4, __alignof__(struct device_node)); + mem = (unsigned long) __va(mem); + + ((u32 *)mem)[size / 4] = 0xdeadbeef; + + pr_debug(" unflattening %lx...\n", mem); + + /* Second pass, do actual unflattening */ + start = ((unsigned long)initial_boot_params) + + initial_boot_params->off_dt_struct; + unflatten_dt_node(mem, &start, NULL, &allnextp, 0); + if (*((u32 *)start) != OF_DT_END) + printk(KERN_WARNING "Weird tag at end of tree: %08x\n", + *((u32 *)start)); + if (((u32 *)mem)[size / 4] != 0xdeadbeef) + printk(KERN_WARNING "End of tree marker overwritten: %08x\n", + ((u32 *)mem)[size / 4]); + *allnextp = NULL; + + /* Get pointer to OF "/chosen" node for use everywhere */ + of_chosen = of_find_node_by_path("/chosen"); + if (of_chosen == NULL) + of_chosen = of_find_node_by_path("/chosen@0"); + + pr_debug(" <- unflatten_device_tree()\n"); +} + +#define early_init_dt_scan_drconf_memory(node) 0 + +static int __init early_init_dt_scan_cpus(unsigned long node, + const char *uname, int depth, + void *data) +{ + static int logical_cpuid; + char *type = of_get_flat_dt_prop(node, "device_type", NULL); + const u32 *intserv; + int i, nthreads; + int found = 0; + + /* We are scanning "cpu" nodes only */ + if (type == NULL || strcmp(type, "cpu") != 0) + return 0; + + /* Get physical cpuid */ + intserv = of_get_flat_dt_prop(node, "reg", NULL); + nthreads = 1; + + /* + * Now see if any of these threads match our boot cpu. + * NOTE: This must match the parsing done in smp_setup_cpu_maps. + */ + for (i = 0; i < nthreads; i++) { + /* + * version 2 of the kexec param format adds the phys cpuid of + * booted proc. + */ + if (initial_boot_params && initial_boot_params->version >= 2) { + if (intserv[i] == + initial_boot_params->boot_cpuid_phys) { + found = 1; + break; + } + } else { + /* + * Check if it's the boot-cpu, set it's hw index now, + * unfortunately this format did not support booting + * off secondary threads. + */ + if (of_get_flat_dt_prop(node, + "linux,boot-cpu", NULL) != NULL) { + found = 1; + break; + } + } + +#ifdef CONFIG_SMP + /* logical cpu id is always 0 on UP kernels */ + logical_cpuid++; +#endif + } + + if (found) { + pr_debug("boot cpu: logical %d physical %d\n", logical_cpuid, + intserv[i]); + boot_cpuid = logical_cpuid; + } + + return 0; +} + +#ifdef CONFIG_BLK_DEV_INITRD +static void __init early_init_dt_check_for_initrd(unsigned long node) +{ + unsigned long l; + u32 *prop; + + pr_debug("Looking for initrd properties... "); + + prop = of_get_flat_dt_prop(node, "linux,initrd-start", &l); + if (prop) { + initrd_start = (unsigned long)__va(of_read_ulong(prop, l/4)); + + prop = of_get_flat_dt_prop(node, "linux,initrd-end", &l); + if (prop) { + initrd_end = (unsigned long) + __va(of_read_ulong(prop, l/4)); + initrd_below_start_ok = 1; + } else { + initrd_start = 0; + } + } + + pr_debug("initrd_start=0x%lx initrd_end=0x%lx\n", + initrd_start, initrd_end); +} +#else +static inline void early_init_dt_check_for_initrd(unsigned long node) +{ +} +#endif /* CONFIG_BLK_DEV_INITRD */ + +static int __init early_init_dt_scan_chosen(unsigned long node, + const char *uname, int depth, void *data) +{ + unsigned long l; + char *p; + + pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); + + if (depth != 1 || + (strcmp(uname, "chosen") != 0 && + strcmp(uname, "chosen@0") != 0)) + return 0; + +#ifdef CONFIG_KEXEC + lprop = (u64 *)of_get_flat_dt_prop(node, + "linux,crashkernel-base", NULL); + if (lprop) + crashk_res.start = *lprop; + + lprop = (u64 *)of_get_flat_dt_prop(node, + "linux,crashkernel-size", NULL); + if (lprop) + crashk_res.end = crashk_res.start + *lprop - 1; +#endif + + early_init_dt_check_for_initrd(node); + + /* Retreive command line */ + p = of_get_flat_dt_prop(node, "bootargs", &l); + if (p != NULL && l > 0) + strlcpy(cmd_line, p, min((int)l, COMMAND_LINE_SIZE)); + +#ifdef CONFIG_CMDLINE + if (p == NULL || l == 0 || (l == 1 && (*p) == 0)) + strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); +#endif /* CONFIG_CMDLINE */ + + pr_debug("Command line is: %s\n", cmd_line); + + /* break now */ + return 1; +} + +static int __init early_init_dt_scan_root(unsigned long node, + const char *uname, int depth, void *data) +{ + u32 *prop; + + if (depth != 0) + return 0; + + prop = of_get_flat_dt_prop(node, "#size-cells", NULL); + dt_root_size_cells = (prop == NULL) ? 1 : *prop; + pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells); + + prop = of_get_flat_dt_prop(node, "#address-cells", NULL); + dt_root_addr_cells = (prop == NULL) ? 2 : *prop; + pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); + + /* break now */ + return 1; +} + +static u64 __init dt_mem_next_cell(int s, cell_t **cellp) +{ + cell_t *p = *cellp; + + *cellp = p + s; + return of_read_number(p, s); +} + +static int __init early_init_dt_scan_memory(unsigned long node, + const char *uname, int depth, void *data) +{ + char *type = of_get_flat_dt_prop(node, "device_type", NULL); + cell_t *reg, *endp; + unsigned long l; + + /* Look for the ibm,dynamic-reconfiguration-memory node */ +/* if (depth == 1 && + strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) + return early_init_dt_scan_drconf_memory(node); +*/ + /* We are scanning "memory" nodes only */ + if (type == NULL) { + /* + * The longtrail doesn't have a device_type on the + * /memory node, so look for the node called /memory@0. + */ + if (depth != 1 || strcmp(uname, "memory@0") != 0) + return 0; + } else if (strcmp(type, "memory") != 0) + return 0; + + reg = (cell_t *)of_get_flat_dt_prop(node, "linux,usable-memory", &l); + if (reg == NULL) + reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l); + if (reg == NULL) + return 0; + + endp = reg + (l / sizeof(cell_t)); + + pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", + uname, l, reg[0], reg[1], reg[2], reg[3]); + + while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { + u64 base, size; + + base = dt_mem_next_cell(dt_root_addr_cells, ®); + size = dt_mem_next_cell(dt_root_size_cells, ®); + + if (size == 0) + continue; + pr_debug(" - %llx , %llx\n", (unsigned long long)base, + (unsigned long long)size); + + lmb_add(base, size); + } + return 0; +} + +#ifdef CONFIG_PHYP_DUMP +/** + * phyp_dump_calculate_reserve_size() - reserve variable boot area 5% or arg + * + * Function to find the largest size we need to reserve + * during early boot process. + * + * It either looks for boot param and returns that OR + * returns larger of 256 or 5% rounded down to multiples of 256MB. + * + */ +static inline unsigned long phyp_dump_calculate_reserve_size(void) +{ + unsigned long tmp; + + if (phyp_dump_info->reserve_bootvar) + return phyp_dump_info->reserve_bootvar; + + /* divide by 20 to get 5% of value */ + tmp = lmb_end_of_DRAM(); + do_div(tmp, 20); + + /* round it down in multiples of 256 */ + tmp = tmp & ~0x0FFFFFFFUL; + + return (tmp > PHYP_DUMP_RMR_END ? tmp : PHYP_DUMP_RMR_END); +} + +/** + * phyp_dump_reserve_mem() - reserve all not-yet-dumped mmemory + * + * This routine may reserve memory regions in the kernel only + * if the system is supported and a dump was taken in last + * boot instance or if the hardware is supported and the + * scratch area needs to be setup. In other instances it returns + * without reserving anything. The memory in case of dump being + * active is freed when the dump is collected (by userland tools). + */ +static void __init phyp_dump_reserve_mem(void) +{ + unsigned long base, size; + unsigned long variable_reserve_size; + + if (!phyp_dump_info->phyp_dump_configured) { + printk(KERN_ERR "Phyp-dump not supported on this hardware\n"); + return; + } + + if (!phyp_dump_info->phyp_dump_at_boot) { + printk(KERN_INFO "Phyp-dump disabled at boot time\n"); + return; + } + + variable_reserve_size = phyp_dump_calculate_reserve_size(); + + if (phyp_dump_info->phyp_dump_is_active) { + /* Reserve *everything* above RMR.Area freed by userland tools*/ + base = variable_reserve_size; + size = lmb_end_of_DRAM() - base; + + /* XXX crashed_ram_end is wrong, since it may be beyond + * the memory_limit, it will need to be adjusted. */ + lmb_reserve(base, size); + + phyp_dump_info->init_reserve_start = base; + phyp_dump_info->init_reserve_size = size; + } else { + size = phyp_dump_info->cpu_state_size + + phyp_dump_info->hpte_region_size + + variable_reserve_size; + base = lmb_end_of_DRAM() - size; + lmb_reserve(base, size); + phyp_dump_info->init_reserve_start = base; + phyp_dump_info->init_reserve_size = size; + } +} +#else +static inline void __init phyp_dump_reserve_mem(void) {} +#endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */ + +#ifdef CONFIG_EARLY_PRINTK +/* MS this is Microblaze specifig function */ +static int __init early_init_dt_scan_serial(unsigned long node, + const char *uname, int depth, void *data) +{ + unsigned long l; + char *p; + int *addr; + + pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); + +/* find all serial nodes */ + if (strncmp(uname, "serial", 6) != 0) + return 0; + + early_init_dt_check_for_initrd(node); + +/* find compatible node with uartlite */ + p = of_get_flat_dt_prop(node, "compatible", &l); + if ((strncmp(p, "xlnx,xps-uartlite", 17) != 0) && + (strncmp(p, "xlnx,opb-uartlite", 17) != 0)) + return 0; + + addr = of_get_flat_dt_prop(node, "reg", &l); + return *addr; /* return address */ +} + +/* this function is looking for early uartlite console - Microblaze specific */ +int __init early_uartlite_console(void) +{ + return of_scan_flat_dt(early_init_dt_scan_serial, NULL); +} +#endif + +void __init early_init_devtree(void *params) +{ + pr_debug(" -> early_init_devtree(%p)\n", params); + + /* Setup flat device-tree pointer */ + initial_boot_params = params; + +#ifdef CONFIG_PHYP_DUMP + /* scan tree to see if dump occured during last boot */ + of_scan_flat_dt(early_init_dt_scan_phyp_dump, NULL); +#endif + + /* Retrieve various informations from the /chosen node of the + * device-tree, including the platform type, initrd location and + * size, TCE reserve, and more ... + */ + of_scan_flat_dt(early_init_dt_scan_chosen, NULL); + + /* Scan memory nodes and rebuild LMBs */ + lmb_init(); + of_scan_flat_dt(early_init_dt_scan_root, NULL); + of_scan_flat_dt(early_init_dt_scan_memory, NULL); + + /* Save command line for /proc/cmdline and then parse parameters */ + strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE); + parse_early_param(); + + lmb_analyze(); + + pr_debug("Phys. mem: %lx\n", (unsigned long) lmb_phys_mem_size()); + + pr_debug("Scanning CPUs ...\n"); + + /* Retreive CPU related informations from the flat tree + * (altivec support, boot CPU ID, ...) + */ + of_scan_flat_dt(early_init_dt_scan_cpus, NULL); + + pr_debug(" <- early_init_devtree()\n"); +} + +/** + * Indicates whether the root node has a given value in its + * compatible property. + */ +int machine_is_compatible(const char *compat) +{ + struct device_node *root; + int rc = 0; + + root = of_find_node_by_path("/"); + if (root) { + rc = of_device_is_compatible(root, compat); + of_node_put(root); + } + return rc; +} +EXPORT_SYMBOL(machine_is_compatible); + +/******* + * + * New implementation of the OF "find" APIs, return a refcounted + * object, call of_node_put() when done. The device tree and list + * are protected by a rw_lock. + * + * Note that property management will need some locking as well, + * this isn't dealt with yet. + * + *******/ + +/** + * of_find_node_by_phandle - Find a node given a phandle + * @handle: phandle of the node to find + * + * Returns a node pointer with refcount incremented, use + * of_node_put() on it when done. + */ +struct device_node *of_find_node_by_phandle(phandle handle) +{ + struct device_node *np; + + read_lock(&devtree_lock); + for (np = allnodes; np != NULL; np = np->allnext) + if (np->linux_phandle == handle) + break; + of_node_get(np); + read_unlock(&devtree_lock); + return np; +} +EXPORT_SYMBOL(of_find_node_by_phandle); + +/** + * of_find_all_nodes - Get next node in global list + * @prev: Previous node or NULL to start iteration + * of_node_put() will be called on it + * + * Returns a node pointer with refcount incremented, use + * of_node_put() on it when done. + */ +struct device_node *of_find_all_nodes(struct device_node *prev) +{ + struct device_node *np; + + read_lock(&devtree_lock); + np = prev ? prev->allnext : allnodes; + for (; np != NULL; np = np->allnext) + if (of_node_get(np)) + break; + of_node_put(prev); + read_unlock(&devtree_lock); + return np; +} +EXPORT_SYMBOL(of_find_all_nodes); + +/** + * of_node_get - Increment refcount of a node + * @node: Node to inc refcount, NULL is supported to + * simplify writing of callers + * + * Returns node. + */ +struct device_node *of_node_get(struct device_node *node) +{ + if (node) + kref_get(&node->kref); + return node; +} +EXPORT_SYMBOL(of_node_get); + +static inline struct device_node *kref_to_device_node(struct kref *kref) +{ + return container_of(kref, struct device_node, kref); +} + +/** + * of_node_release - release a dynamically allocated node + * @kref: kref element of the node to be released + * + * In of_node_put() this function is passed to kref_put() + * as the destructor. + */ +static void of_node_release(struct kref *kref) +{ + struct device_node *node = kref_to_device_node(kref); + struct property *prop = node->properties; + + /* We should never be releasing nodes that haven't been detached. */ + if (!of_node_check_flag(node, OF_DETACHED)) { + printk(KERN_INFO "WARNING: Bad of_node_put() on %s\n", + node->full_name); + dump_stack(); + kref_init(&node->kref); + return; + } + + if (!of_node_check_flag(node, OF_DYNAMIC)) + return; + + while (prop) { + struct property *next = prop->next; + kfree(prop->name); + kfree(prop->value); + kfree(prop); + prop = next; + + if (!prop) { + prop = node->deadprops; + node->deadprops = NULL; + } + } + kfree(node->full_name); + kfree(node->data); + kfree(node); +} + +/** + * of_node_put - Decrement refcount of a node + * @node: Node to dec refcount, NULL is supported to + * simplify writing of callers + * + */ +void of_node_put(struct device_node *node) +{ + if (node) + kref_put(&node->kref, of_node_release); +} +EXPORT_SYMBOL(of_node_put); + +/* + * Plug a device node into the tree and global list. + */ +void of_attach_node(struct device_node *np) +{ + unsigned long flags; + + write_lock_irqsave(&devtree_lock, flags); + np->sibling = np->parent->child; + np->allnext = allnodes; + np->parent->child = np; + allnodes = np; + write_unlock_irqrestore(&devtree_lock, flags); +} + +/* + * "Unplug" a node from the device tree. The caller must hold + * a reference to the node. The memory associated with the node + * is not freed until its refcount goes to zero. + */ +void of_detach_node(struct device_node *np) +{ + struct device_node *parent; + unsigned long flags; + + write_lock_irqsave(&devtree_lock, flags); + + parent = np->parent; + if (!parent) + goto out_unlock; + + if (allnodes == np) + allnodes = np->allnext; + else { + struct device_node *prev; + for (prev = allnodes; + prev->allnext != np; + prev = prev->allnext) + ; + prev->allnext = np->allnext; + } + + if (parent->child == np) + parent->child = np->sibling; + else { + struct device_node *prevsib; + for (prevsib = np->parent->child; + prevsib->sibling != np; + prevsib = prevsib->sibling) + ; + prevsib->sibling = np->sibling; + } + + of_node_set_flag(np, OF_DETACHED); + +out_unlock: + write_unlock_irqrestore(&devtree_lock, flags); +} + +/* + * Add a property to a node + */ +int prom_add_property(struct device_node *np, struct property *prop) +{ + struct property **next; + unsigned long flags; + + prop->next = NULL; + write_lock_irqsave(&devtree_lock, flags); + next = &np->properties; + while (*next) { + if (strcmp(prop->name, (*next)->name) == 0) { + /* duplicate ! don't insert it */ + write_unlock_irqrestore(&devtree_lock, flags); + return -1; + } + next = &(*next)->next; + } + *next = prop; + write_unlock_irqrestore(&devtree_lock, flags); + +#ifdef CONFIG_PROC_DEVICETREE + /* try to add to proc as well if it was initialized */ + if (np->pde) + proc_device_tree_add_prop(np->pde, prop); +#endif /* CONFIG_PROC_DEVICETREE */ + + return 0; +} + +/* + * Remove a property from a node. Note that we don't actually + * remove it, since we have given out who-knows-how-many pointers + * to the data using get-property. Instead we just move the property + * to the "dead properties" list, so it won't be found any more. + */ +int prom_remove_property(struct device_node *np, struct property *prop) +{ + struct property **next; + unsigned long flags; + int found = 0; + + write_lock_irqsave(&devtree_lock, flags); + next = &np->properties; + while (*next) { + if (*next == prop) { + /* found the node */ + *next = prop->next; + prop->next = np->deadprops; + np->deadprops = prop; + found = 1; + break; + } + next = &(*next)->next; + } + write_unlock_irqrestore(&devtree_lock, flags); + + if (!found) + return -ENODEV; + +#ifdef CONFIG_PROC_DEVICETREE + /* try to remove the proc node as well */ + if (np->pde) + proc_device_tree_remove_prop(np->pde, prop); +#endif /* CONFIG_PROC_DEVICETREE */ + + return 0; +} + +/* + * Update a property in a node. Note that we don't actually + * remove it, since we have given out who-knows-how-many pointers + * to the data using get-property. Instead we just move the property + * to the "dead properties" list, and add the new property to the + * property list + */ +int prom_update_property(struct device_node *np, + struct property *newprop, + struct property *oldprop) +{ + struct property **next; + unsigned long flags; + int found = 0; + + write_lock_irqsave(&devtree_lock, flags); + next = &np->properties; + while (*next) { + if (*next == oldprop) { + /* found the node */ + newprop->next = oldprop->next; + *next = newprop; + oldprop->next = np->deadprops; + np->deadprops = oldprop; + found = 1; + break; + } + next = &(*next)->next; + } + write_unlock_irqrestore(&devtree_lock, flags); + + if (!found) + return -ENODEV; + +#ifdef CONFIG_PROC_DEVICETREE + /* try to add to proc as well if it was initialized */ + if (np->pde) + proc_device_tree_update_prop(np->pde, newprop, oldprop); +#endif /* CONFIG_PROC_DEVICETREE */ + + return 0; +} + +#if defined(CONFIG_DEBUG_FS) && defined(DEBUG) +static struct debugfs_blob_wrapper flat_dt_blob; + +static int __init export_flat_device_tree(void) +{ + struct dentry *d; + + flat_dt_blob.data = initial_boot_params; + flat_dt_blob.size = initial_boot_params->totalsize; + + d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, + of_debugfs_root, &flat_dt_blob); + if (!d) + return 1; + + return 0; +} +device_initcall(export_flat_device_tree); +#endif diff --git a/arch/microblaze/kernel/prom_parse.c b/arch/microblaze/kernel/prom_parse.c new file mode 100644 index 0000000..ae0352e --- /dev/null +++ b/arch/microblaze/kernel/prom_parse.c @@ -0,0 +1,1025 @@ +#undef DEBUG + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PRu64 "%llx" + +/* Max address size we deal with */ +#define OF_MAX_ADDR_CELLS 4 +#define OF_CHECK_COUNTS(na, ns) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \ + (ns) > 0) + +static struct of_bus *of_match_bus(struct device_node *np); +static int __of_address_to_resource(struct device_node *dev, + const u32 *addrp, u64 size, unsigned int flags, + struct resource *r); + +/* Debug utility */ +#ifdef DEBUG +static void of_dump_addr(const char *s, const u32 *addr, int na) +{ + printk(KERN_INFO "%s", s); + while (na--) + printk(KERN_INFO " %08x", *(addr++)); + printk(KERN_INFO "\n"); +} +#else +static void of_dump_addr(const char *s, const u32 *addr, int na) { } +#endif + +/* Callbacks for bus specific translators */ +struct of_bus { + const char *name; + const char *addresses; + int (*match)(struct device_node *parent); + void (*count_cells)(struct device_node *child, + int *addrc, int *sizec); + u64 (*map)(u32 *addr, const u32 *range, + int na, int ns, int pna); + int (*translate)(u32 *addr, u64 offset, int na); + unsigned int (*get_flags)(const u32 *addr); +}; + +/* + * Default translator (generic bus) + */ + +static void of_bus_default_count_cells(struct device_node *dev, + int *addrc, int *sizec) +{ + if (addrc) + *addrc = of_n_addr_cells(dev); + if (sizec) + *sizec = of_n_size_cells(dev); +} + +static u64 of_bus_default_map(u32 *addr, const u32 *range, + int na, int ns, int pna) +{ + u64 cp, s, da; + + cp = of_read_number(range, na); + s = of_read_number(range + na + pna, ns); + da = of_read_number(addr, na); + + pr_debug("OF: default map, cp="PRu64", s="PRu64", da="PRu64"\n", + cp, s, da); + + if (da < cp || da >= (cp + s)) + return OF_BAD_ADDR; + return da - cp; +} + +static int of_bus_default_translate(u32 *addr, u64 offset, int na) +{ + u64 a = of_read_number(addr, na); + memset(addr, 0, na * 4); + a += offset; + if (na > 1) + addr[na - 2] = a >> 32; + addr[na - 1] = a & 0xffffffffu; + + return 0; +} + +static unsigned int of_bus_default_get_flags(const u32 *addr) +{ + return IORESOURCE_MEM; +} + +#ifdef CONFIG_PCI +/* + * PCI bus specific translator + */ + +static int of_bus_pci_match(struct device_node *np) +{ + /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */ + return !strcmp(np->type, "pci") || !strcmp(np->type, "vci"); +} + +static void of_bus_pci_count_cells(struct device_node *np, + int *addrc, int *sizec) +{ + if (addrc) + *addrc = 3; + if (sizec) + *sizec = 2; +} + +static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna) +{ + u64 cp, s, da; + + /* Check address type match */ + if ((addr[0] ^ range[0]) & 0x03000000) + return OF_BAD_ADDR; + + /* Read address values, skipping high cell */ + cp = of_read_number(range + 1, na - 1); + s = of_read_number(range + na + pna, ns); + da = of_read_number(addr + 1, na - 1); + + pr_debug("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da); + + if (da < cp || da >= (cp + s)) + return OF_BAD_ADDR; + return da - cp; +} + +static int of_bus_pci_translate(u32 *addr, u64 offset, int na) +{ + return of_bus_default_translate(addr + 1, offset, na - 1); +} + +static unsigned int of_bus_pci_get_flags(const u32 *addr) +{ + unsigned int flags = 0; + u32 w = addr[0]; + + switch ((w >> 24) & 0x03) { + case 0x01: + flags |= IORESOURCE_IO; + break; + case 0x02: /* 32 bits */ + case 0x03: /* 64 bits */ + flags |= IORESOURCE_MEM; + break; + } + if (w & 0x40000000) + flags |= IORESOURCE_PREFETCH; + return flags; +} + +const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size, + unsigned int *flags) +{ + const u32 *prop; + unsigned int psize; + struct device_node *parent; + struct of_bus *bus; + int onesize, i, na, ns; + + /* Get parent & match bus type */ + parent = of_get_parent(dev); + if (parent == NULL) + return NULL; + bus = of_match_bus(parent); + if (strcmp(bus->name, "pci")) { + of_node_put(parent); + return NULL; + } + bus->count_cells(dev, &na, &ns); + of_node_put(parent); + if (!OF_CHECK_COUNTS(na, ns)) + return NULL; + + /* Get "reg" or "assigned-addresses" property */ + prop = of_get_property(dev, bus->addresses, &psize); + if (prop == NULL) + return NULL; + psize /= 4; + + onesize = na + ns; + for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) + if ((prop[0] & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) { + if (size) + *size = of_read_number(prop + na, ns); + if (flags) + *flags = bus->get_flags(prop); + return prop; + } + return NULL; +} +EXPORT_SYMBOL(of_get_pci_address); + +int of_pci_address_to_resource(struct device_node *dev, int bar, + struct resource *r) +{ + const u32 *addrp; + u64 size; + unsigned int flags; + + addrp = of_get_pci_address(dev, bar, &size, &flags); + if (addrp == NULL) + return -EINVAL; + return __of_address_to_resource(dev, addrp, size, flags, r); +} +EXPORT_SYMBOL_GPL(of_pci_address_to_resource); + +static u8 of_irq_pci_swizzle(u8 slot, u8 pin) +{ + return (((pin - 1) + slot) % 4) + 1; +} + +int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) +{ + struct device_node *dn, *ppnode; + struct pci_dev *ppdev; + u32 lspec; + u32 laddr[3]; + u8 pin; + int rc; + + /* Check if we have a device node, if yes, fallback to standard OF + * parsing + */ + dn = pci_device_to_OF_node(pdev); + if (dn) + return of_irq_map_one(dn, 0, out_irq); + + /* Ok, we don't, time to have fun. Let's start by building up an + * interrupt spec. we assume #interrupt-cells is 1, which is standard + * for PCI. If you do different, then don't use that routine. + */ + rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin); + if (rc != 0) + return rc; + /* No pin, exit */ + if (pin == 0) + return -ENODEV; + + /* Now we walk up the PCI tree */ + lspec = pin; + for (;;) { + /* Get the pci_dev of our parent */ + ppdev = pdev->bus->self; + + /* Ouch, it's a host bridge... */ + if (ppdev == NULL) { + struct pci_controller *host; + host = pci_bus_to_host(pdev->bus); + ppnode = host ? host->arch_data : NULL; + /* No node for host bridge ? give up */ + if (ppnode == NULL) + return -EINVAL; + } else + /* We found a P2P bridge, check if it has a node */ + ppnode = pci_device_to_OF_node(ppdev); + + /* Ok, we have found a parent with a device-node, hand over to + * the OF parsing code. + * We build a unit address from the linux device to be used for + * resolution. Note that we use the linux bus number which may + * not match your firmware bus numbering. + * Fortunately, in most cases, interrupt-map-mask doesn't + * include the bus number as part of the matching. + * You should still be careful about that though if you intend + * to rely on this function (you ship a firmware that doesn't + * create device nodes for all PCI devices). + */ + if (ppnode) + break; + + /* We can only get here if we hit a P2P bridge with no node, + * let's do standard swizzling and try again + */ + lspec = of_irq_pci_swizzle(PCI_SLOT(pdev->devfn), lspec); + pdev = ppdev; + } + + laddr[0] = (pdev->bus->number << 16) + | (pdev->devfn << 8); + laddr[1] = laddr[2] = 0; + return of_irq_map_raw(ppnode, &lspec, 1, laddr, out_irq); +} +EXPORT_SYMBOL_GPL(of_irq_map_pci); +#endif /* CONFIG_PCI */ + +/* + * ISA bus specific translator + */ + +static int of_bus_isa_match(struct device_node *np) +{ + return !strcmp(np->name, "isa"); +} + +static void of_bus_isa_count_cells(struct device_node *child, + int *addrc, int *sizec) +{ + if (addrc) + *addrc = 2; + if (sizec) + *sizec = 1; +} + +static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna) +{ + u64 cp, s, da; + + /* Check address type match */ + if ((addr[0] ^ range[0]) & 0x00000001) + return OF_BAD_ADDR; + + /* Read address values, skipping high cell */ + cp = of_read_number(range + 1, na - 1); + s = of_read_number(range + na + pna, ns); + da = of_read_number(addr + 1, na - 1); + + pr_debug("OF: ISA map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da); + + if (da < cp || da >= (cp + s)) + return OF_BAD_ADDR; + return da - cp; +} + +static int of_bus_isa_translate(u32 *addr, u64 offset, int na) +{ + return of_bus_default_translate(addr + 1, offset, na - 1); +} + +static unsigned int of_bus_isa_get_flags(const u32 *addr) +{ + unsigned int flags = 0; + u32 w = addr[0]; + + if (w & 1) + flags |= IORESOURCE_IO; + else + flags |= IORESOURCE_MEM; + return flags; +} + +/* + * Array of bus specific translators + */ + +static struct of_bus of_busses[] = { +#ifdef CONFIG_PCI + /* PCI */ + { + .name = "pci", + .addresses = "assigned-addresses", + .match = of_bus_pci_match, + .count_cells = of_bus_pci_count_cells, + .map = of_bus_pci_map, + .translate = of_bus_pci_translate, + .get_flags = of_bus_pci_get_flags, + }, +#endif /* CONFIG_PCI */ + /* ISA */ + { + .name = "isa", + .addresses = "reg", + .match = of_bus_isa_match, + .count_cells = of_bus_isa_count_cells, + .map = of_bus_isa_map, + .translate = of_bus_isa_translate, + .get_flags = of_bus_isa_get_flags, + }, + /* Default */ + { + .name = "default", + .addresses = "reg", + .match = NULL, + .count_cells = of_bus_default_count_cells, + .map = of_bus_default_map, + .translate = of_bus_default_translate, + .get_flags = of_bus_default_get_flags, + }, +}; + +static struct of_bus *of_match_bus(struct device_node *np) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(of_busses); i++) + if (!of_busses[i].match || of_busses[i].match(np)) + return &of_busses[i]; + BUG(); + return NULL; +} + +static int of_translate_one(struct device_node *parent, struct of_bus *bus, + struct of_bus *pbus, u32 *addr, + int na, int ns, int pna) +{ + const u32 *ranges; + unsigned int rlen; + int rone; + u64 offset = OF_BAD_ADDR; + + /* Normally, an absence of a "ranges" property means we are + * crossing a non-translatable boundary, and thus the addresses + * below the current not cannot be converted to CPU physical ones. + * Unfortunately, while this is very clear in the spec, it's not + * what Apple understood, and they do have things like /uni-n or + * /ht nodes with no "ranges" property and a lot of perfectly + * useable mapped devices below them. Thus we treat the absence of + * "ranges" as equivalent to an empty "ranges" property which means + * a 1:1 translation at that level. It's up to the caller not to try + * to translate addresses that aren't supposed to be translated in + * the first place. --BenH. + */ + ranges = of_get_property(parent, "ranges", (int *) &rlen); + if (ranges == NULL || rlen == 0) { + offset = of_read_number(addr, na); + memset(addr, 0, pna * 4); + pr_debug("OF: no ranges, 1:1 translation\n"); + goto finish; + } + + pr_debug("OF: walking ranges...\n"); + + /* Now walk through the ranges */ + rlen /= 4; + rone = na + pna + ns; + for (; rlen >= rone; rlen -= rone, ranges += rone) { + offset = bus->map(addr, ranges, na, ns, pna); + if (offset != OF_BAD_ADDR) + break; + } + if (offset == OF_BAD_ADDR) { + pr_debug("OF: not found !\n"); + return 1; + } + memcpy(addr, ranges + na, 4 * pna); + + finish: + of_dump_addr("OF: parent translation for:", addr, pna); + pr_debug("OF: with offset: "PRu64"\n", offset); + + /* Translate it into parent bus space */ + return pbus->translate(addr, offset, pna); +} + +/* + * Translate an address from the device-tree into a CPU physical address, + * this walks up the tree and applies the various bus mappings on the + * way. + * + * Note: We consider that crossing any level with #size-cells == 0 to mean + * that translation is impossible (that is we are not dealing with a value + * that can be mapped to a cpu physical address). This is not really specified + * that way, but this is traditionally the way IBM at least do things + */ +u64 of_translate_address(struct device_node *dev, const u32 *in_addr) +{ + struct device_node *parent = NULL; + struct of_bus *bus, *pbus; + u32 addr[OF_MAX_ADDR_CELLS]; + int na, ns, pna, pns; + u64 result = OF_BAD_ADDR; + + pr_debug("OF: ** translation for device %s **\n", dev->full_name); + + /* Increase refcount at current level */ + of_node_get(dev); + + /* Get parent & match bus type */ + parent = of_get_parent(dev); + if (parent == NULL) + goto bail; + bus = of_match_bus(parent); + + /* Cound address cells & copy address locally */ + bus->count_cells(dev, &na, &ns); + if (!OF_CHECK_COUNTS(na, ns)) { + printk(KERN_ERR "prom_parse: Bad cell count for %s\n", + dev->full_name); + goto bail; + } + memcpy(addr, in_addr, na * 4); + + pr_debug("OF: bus is %s (na=%d, ns=%d) on %s\n", + bus->name, na, ns, parent->full_name); + of_dump_addr("OF: translating address:", addr, na); + + /* Translate */ + for (;;) { + /* Switch to parent bus */ + of_node_put(dev); + dev = parent; + parent = of_get_parent(dev); + + /* If root, we have finished */ + if (parent == NULL) { + pr_debug("OF: reached root node\n"); + result = of_read_number(addr, na); + break; + } + + /* Get new parent bus and counts */ + pbus = of_match_bus(parent); + pbus->count_cells(dev, &pna, &pns); + if (!OF_CHECK_COUNTS(pna, pns)) { + printk(KERN_ERR "prom_parse: Bad cell count for %s\n", + dev->full_name); + break; + } + + pr_debug("OF: parent bus is %s (na=%d, ns=%d) on %s\n", + pbus->name, pna, pns, parent->full_name); + + /* Apply bus translation */ + if (of_translate_one(dev, bus, pbus, addr, na, ns, pna)) + break; + + /* Complete the move up one level */ + na = pna; + ns = pns; + bus = pbus; + + of_dump_addr("OF: one level translation:", addr, na); + } + bail: + of_node_put(parent); + of_node_put(dev); + + return result; +} +EXPORT_SYMBOL(of_translate_address); + +const u32 *of_get_address(struct device_node *dev, int index, u64 *size, + unsigned int *flags) +{ + const u32 *prop; + unsigned int psize; + struct device_node *parent; + struct of_bus *bus; + int onesize, i, na, ns; + + /* Get parent & match bus type */ + parent = of_get_parent(dev); + if (parent == NULL) + return NULL; + bus = of_match_bus(parent); + bus->count_cells(dev, &na, &ns); + of_node_put(parent); + if (!OF_CHECK_COUNTS(na, ns)) + return NULL; + + /* Get "reg" or "assigned-addresses" property */ + prop = of_get_property(dev, bus->addresses, (int *) &psize); + if (prop == NULL) + return NULL; + psize /= 4; + + onesize = na + ns; + for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) + if (i == index) { + if (size) + *size = of_read_number(prop + na, ns); + if (flags) + *flags = bus->get_flags(prop); + return prop; + } + return NULL; +} +EXPORT_SYMBOL(of_get_address); + +static int __of_address_to_resource(struct device_node *dev, const u32 *addrp, + u64 size, unsigned int flags, + struct resource *r) +{ + u64 taddr; + + if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0) + return -EINVAL; + taddr = of_translate_address(dev, addrp); + if (taddr == OF_BAD_ADDR) + return -EINVAL; + memset(r, 0, sizeof(struct resource)); + if (flags & IORESOURCE_IO) { + unsigned long port; + port = -1; /* pci_address_to_pio(taddr); */ + if (port == (unsigned long)-1) + return -EINVAL; + r->start = port; + r->end = port + size - 1; + } else { + r->start = taddr; + r->end = taddr + size - 1; + } + r->flags = flags; + r->name = dev->name; + return 0; +} + +int of_address_to_resource(struct device_node *dev, int index, + struct resource *r) +{ + const u32 *addrp; + u64 size; + unsigned int flags; + + addrp = of_get_address(dev, index, &size, &flags); + if (addrp == NULL) + return -EINVAL; + return __of_address_to_resource(dev, addrp, size, flags, r); +} +EXPORT_SYMBOL_GPL(of_address_to_resource); + +void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, + unsigned long *busno, unsigned long *phys, unsigned long *size) +{ + const u32 *dma_window; + u32 cells; + const unsigned char *prop; + + dma_window = dma_window_prop; + + /* busno is always one cell */ + *busno = *(dma_window++); + + prop = of_get_property(dn, "ibm,#dma-address-cells", NULL); + if (!prop) + prop = of_get_property(dn, "#address-cells", NULL); + + cells = prop ? *(u32 *)prop : of_n_addr_cells(dn); + *phys = of_read_number(dma_window, cells); + + dma_window += cells; + + prop = of_get_property(dn, "ibm,#dma-size-cells", NULL); + cells = prop ? *(u32 *)prop : of_n_size_cells(dn); + *size = of_read_number(dma_window, cells); +} + +/* + * Interrupt remapper + */ + +static unsigned int of_irq_workarounds; +static struct device_node *of_irq_dflt_pic; + +static struct device_node *of_irq_find_parent(struct device_node *child) +{ + struct device_node *p; + const phandle *parp; + + if (!of_node_get(child)) + return NULL; + + do { + parp = of_get_property(child, "interrupt-parent", NULL); + if (parp == NULL) + p = of_get_parent(child); + else { + if (of_irq_workarounds & OF_IMAP_NO_PHANDLE) + p = of_node_get(of_irq_dflt_pic); + else + p = of_find_node_by_phandle(*parp); + } + of_node_put(child); + child = p; + } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL); + + return p; +} + +/* This doesn't need to be called if you don't have any special workaround + * flags to pass + */ +void of_irq_map_init(unsigned int flags) +{ + of_irq_workarounds = flags; + + /* OldWorld, don't bother looking at other things */ + if (flags & OF_IMAP_OLDWORLD_MAC) + return; + + /* If we don't have phandles, let's try to locate a default interrupt + * controller (happens when booting with BootX). We do a first match + * here, hopefully, that only ever happens on machines with one + * controller. + */ + if (flags & OF_IMAP_NO_PHANDLE) { + struct device_node *np; + + for (np = NULL; (np = of_find_all_nodes(np)) != NULL;) { + if (of_get_property(np, "interrupt-controller", NULL) + == NULL) + continue; + /* Skip /chosen/interrupt-controller */ + if (strcmp(np->name, "chosen") == 0) + continue; + /* It seems like at least one person on this planet + * wants to use BootX on a machine with an AppleKiwi + * controller which happens to pretend to be an + * interrupt controller too. + */ + if (strcmp(np->name, "AppleKiwi") == 0) + continue; + /* I think we found one ! */ + of_irq_dflt_pic = np; + break; + } + } + +} + +int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize, + const u32 *addr, struct of_irq *out_irq) +{ + struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL; + const u32 *tmp, *imap, *imask; + u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0; + int imaplen, match, i; + + pr_debug("of_irq_map_raw: par=%s,intspec=[0x%08x 0x%08x...]," + "ointsize=%d\n", + parent->full_name, intspec[0], intspec[1], ointsize); + + ipar = of_node_get(parent); + + /* First get the #interrupt-cells property of the current cursor + * that tells us how to interpret the passed-in intspec. If there + * is none, we are nice and just walk up the tree + */ + do { + tmp = of_get_property(ipar, "#interrupt-cells", NULL); + if (tmp != NULL) { + intsize = *tmp; + break; + } + tnode = ipar; + ipar = of_irq_find_parent(ipar); + of_node_put(tnode); + } while (ipar); + if (ipar == NULL) { + pr_debug(" -> no parent found !\n"); + goto fail; + } + + pr_debug("of_irq_map_raw: ipar=%s, size=%d\n", + ipar->full_name, intsize); + + if (ointsize != intsize) + return -EINVAL; + + /* Look for this #address-cells. We have to implement the old linux + * trick of looking for the parent here as some device-trees rely on it + */ + old = of_node_get(ipar); + do { + tmp = of_get_property(old, "#address-cells", NULL); + tnode = of_get_parent(old); + of_node_put(old); + old = tnode; + } while (old && tmp == NULL); + of_node_put(old); + old = NULL; + addrsize = (tmp == NULL) ? 2 : *tmp; + + pr_debug(" -> addrsize=%d\n", addrsize); + + /* Now start the actual "proper" walk of the interrupt tree */ + while (ipar != NULL) { + /* Now check if cursor is an interrupt-controller and if it is + * then we are done + */ + if (of_get_property(ipar, "interrupt-controller", NULL) != + NULL) { + pr_debug(" -> got it !\n"); + memcpy(out_irq->specifier, intspec, + intsize * sizeof(u32)); + out_irq->size = intsize; + out_irq->controller = ipar; + of_node_put(old); + return 0; + } + + /* Now look for an interrupt-map */ + imap = of_get_property(ipar, "interrupt-map", &imaplen); + /* No interrupt map, check for an interrupt parent */ + if (imap == NULL) { + pr_debug(" -> no map, getting parent\n"); + newpar = of_irq_find_parent(ipar); + goto skiplevel; + } + imaplen /= sizeof(u32); + + /* Look for a mask */ + imask = of_get_property(ipar, "interrupt-map-mask", NULL); + + /* If we were passed no "reg" property and we attempt to parse + * an interrupt-map, then #address-cells must be 0. + * Fail if it's not. + */ + if (addr == NULL && addrsize != 0) { + pr_debug(" -> no reg passed in when needed !\n"); + goto fail; + } + + /* Parse interrupt-map */ + match = 0; + while (imaplen > (addrsize + intsize + 1) && !match) { + /* Compare specifiers */ + match = 1; + for (i = 0; i < addrsize && match; ++i) { + u32 mask = imask ? imask[i] : 0xffffffffu; + match = ((addr[i] ^ imap[i]) & mask) == 0; + } + for (; i < (addrsize + intsize) && match; ++i) { + u32 mask = imask ? imask[i] : 0xffffffffu; + match = + ((intspec[i-addrsize] ^ imap[i]) + & mask) == 0; + } + imap += addrsize + intsize; + imaplen -= addrsize + intsize; + + pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen); + + /* Get the interrupt parent */ + if (of_irq_workarounds & OF_IMAP_NO_PHANDLE) + newpar = of_node_get(of_irq_dflt_pic); + else + newpar = + of_find_node_by_phandle((phandle)*imap); + imap++; + --imaplen; + + /* Check if not found */ + if (newpar == NULL) { + pr_debug(" -> imap parent not found !\n"); + goto fail; + } + + /* Get #interrupt-cells and #address-cells of new + * parent + */ + tmp = of_get_property(newpar, "#interrupt-cells", NULL); + if (tmp == NULL) { + pr_debug(" -> parent lacks " + "#interrupt-cells!\n"); + goto fail; + } + newintsize = *tmp; + tmp = of_get_property(newpar, "#address-cells", NULL); + newaddrsize = (tmp == NULL) ? 0 : *tmp; + + pr_debug(" -> newintsize=%d, newaddrsize=%d\n", + newintsize, newaddrsize); + + /* Check for malformed properties */ + if (imaplen < (newaddrsize + newintsize)) + goto fail; + + imap += newaddrsize + newintsize; + imaplen -= newaddrsize + newintsize; + + pr_debug(" -> imaplen=%d\n", imaplen); + } + if (!match) + goto fail; + + of_node_put(old); + old = of_node_get(newpar); + addrsize = newaddrsize; + intsize = newintsize; + intspec = imap - intsize; + addr = intspec - addrsize; + +skiplevel: + /* Iterate again with new parent */ + pr_debug(" -> new parent: %s\n", + newpar ? newpar->full_name : "<>"); + of_node_put(ipar); + ipar = newpar; + newpar = NULL; + } +fail: + of_node_put(ipar); + of_node_put(old); + of_node_put(newpar); + + return -EINVAL; +} +EXPORT_SYMBOL_GPL(of_irq_map_raw); + +int of_irq_map_one(struct device_node *device, + int index, struct of_irq *out_irq) +{ + struct device_node *p; + const u32 *intspec, *tmp, *addr; + u32 intsize, intlen; + int res; + + pr_debug("of_irq_map_one: dev=%s, index=%d\n", + device->full_name, index); + + /* Get the interrupts property */ + intspec = of_get_property(device, "interrupts", (int *) &intlen); + if (intspec == NULL) + return -EINVAL; + intlen /= sizeof(u32); + + pr_debug(" intspec=%d intlen=%d\n", *intspec, intlen); + + /* Get the reg property (if any) */ + addr = of_get_property(device, "reg", NULL); + + /* Look for the interrupt parent. */ + p = of_irq_find_parent(device); + if (p == NULL) + return -EINVAL; + + /* Get size of interrupt specifier */ + tmp = of_get_property(p, "#interrupt-cells", NULL); + if (tmp == NULL) { + of_node_put(p); + return -EINVAL; + } + intsize = *tmp; + + pr_debug(" intsize=%d intlen=%d\n", intsize, intlen); + + /* Check index */ + if ((index + 1) * intsize > intlen) + return -EINVAL; + + /* Get new specifier and map it */ + res = of_irq_map_raw(p, intspec + index * intsize, intsize, + addr, out_irq); + of_node_put(p); + return res; +} +EXPORT_SYMBOL_GPL(of_irq_map_one); + +/** + * Search the device tree for the best MAC address to use. 'mac-address' is + * checked first, because that is supposed to contain to "most recent" MAC + * address. If that isn't set, then 'local-mac-address' is checked next, + * because that is the default address. If that isn't set, then the obsolete + * 'address' is checked, just in case we're using an old device tree. + * + * Note that the 'address' property is supposed to contain a virtual address of + * the register set, but some DTS files have redefined that property to be the + * MAC address. + * + * All-zero MAC addresses are rejected, because those could be properties that + * exist in the device tree, but were not set by U-Boot. For example, the + * DTS could define 'mac-address' and 'local-mac-address', with zero MAC + * addresses. Some older U-Boots only initialized 'local-mac-address'. In + * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists + * but is all zeros. +*/ +const void *of_get_mac_address(struct device_node *np) +{ + struct property *pp; + + pp = of_find_property(np, "mac-address", NULL); + if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) + return pp->value; + + pp = of_find_property(np, "local-mac-address", NULL); + if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) + return pp->value; + + pp = of_find_property(np, "address", NULL); + if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) + return pp->value; + + return NULL; +} +EXPORT_SYMBOL(of_get_mac_address); + +int of_irq_to_resource(struct device_node *dev, int index, struct resource *r) +{ + struct of_irq out_irq; + int irq; + int res; + + res = of_irq_map_one(dev, index, &out_irq); + + /* Get irq for the device */ + if (res) { + pr_debug("IRQ not found... code = %d", res); + return NO_IRQ; + } + /* Assuming single interrupt controller... */ + irq = out_irq.specifier[0]; + + pr_debug("IRQ found = %d", irq); + + /* Only dereference the resource if both the + * resource and the irq are valid. */ + if (r && irq != NO_IRQ) { + r->start = r->end = irq; + r->flags = IORESOURCE_IRQ; + } + + return irq; +} +EXPORT_SYMBOL_GPL(of_irq_to_resource); + +void __iomem *of_iomap(struct device_node *np, int index) +{ + struct resource res; + + if (of_address_to_resource(np, index, &res)) + return NULL; + + return ioremap(res.start, 1 + res.end - res.start); +} +EXPORT_SYMBOL(of_iomap); -- cgit v0.10.2 From 945ce1bc54e40aa0a659226b6e79a0bce065945f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:12 +0100 Subject: microblaze_v8: Platform bus registration Reviewed-by: Ingo Molnar Reviewed-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/platform/platform.c b/arch/microblaze/platform/platform.c new file mode 100644 index 0000000..56e0234 --- /dev/null +++ b/arch/microblaze/platform/platform.c @@ -0,0 +1,31 @@ +/* + * Copyright 2008 Michal Simek + * + * based on virtex.c file + * + * Copyright 2007 Secret Lab Technologies Ltd. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#include +#include +#include + +static struct of_device_id xilinx_of_bus_ids[] __initdata = { + { .compatible = "simple-bus", }, + { .compatible = "xlnx,plb-v46-1.00.a", }, + { .compatible = "xlnx,opb-v20-1.10.c", }, + { .compatible = "xlnx,opb-v20-1.10.b", }, + { .compatible = "xlnx,compound", }, + {} +}; + +static int __init microblaze_device_probe(void) +{ + of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL); + return 0; +} +device_initcall(microblaze_device_probe); -- cgit v0.10.2 From c4df4bc155bbe18fb91800bb9d29499a4fb211ad Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:13 +0100 Subject: microblaze_v8: exception handling Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/exceptions.h b/arch/microblaze/include/asm/exceptions.h new file mode 100644 index 0000000..4cdd215 --- /dev/null +++ b/arch/microblaze/include/asm/exceptions.h @@ -0,0 +1,96 @@ +/* + * Preliminary support for HW exception handing for Microblaze + * + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2008 PetaLogix + * Copyright (C) 2005 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_EXCEPTIONS_H +#define _ASM_MICROBLAZE_EXCEPTIONS_H + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +/* Macros to enable and disable HW exceptions in the MSR */ +/* Define MSR enable bit for HW exceptions */ +#define HWEX_MSR_BIT (1 << 8) + +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR +#define __enable_hw_exceptions() \ + __asm__ __volatile__ (" msrset r0, %0; \ + nop;" \ + : \ + : "i" (HWEX_MSR_BIT) \ + : "memory") + +#define __disable_hw_exceptions() \ + __asm__ __volatile__ (" msrclr r0, %0; \ + nop;" \ + : \ + : "i" (HWEX_MSR_BIT) \ + : "memory") +#else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ +#define __enable_hw_exceptions() \ + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + ori r12, r12, %0; \ + mts rmsr, r12; \ + nop;" \ + : \ + : "i" (HWEX_MSR_BIT) \ + : "memory", "r12") + +#define __disable_hw_exceptions() \ + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + andi r12, r12, ~%0; \ + mts rmsr, r12; \ + nop;" \ + : \ + : "i" (HWEX_MSR_BIT) \ + : "memory", "r12") +#endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ + +asmlinkage void full_exception(struct pt_regs *regs, unsigned int type, + int fsr, int addr); + +#if defined(CONFIG_XMON) +extern void xmon(struct pt_regs *regs); +extern int xmon_bpt(struct pt_regs *regs); +extern int xmon_sstep(struct pt_regs *regs); +extern int xmon_iabr_match(struct pt_regs *regs); +extern int xmon_dabr_match(struct pt_regs *regs); +extern void (*xmon_fault_handler)(struct pt_regs *regs); + +void (*debugger)(struct pt_regs *regs) = xmon; +int (*debugger_bpt)(struct pt_regs *regs) = xmon_bpt; +int (*debugger_sstep)(struct pt_regs *regs) = xmon_sstep; +int (*debugger_iabr_match)(struct pt_regs *regs) = xmon_iabr_match; +int (*debugger_dabr_match)(struct pt_regs *regs) = xmon_dabr_match; +void (*debugger_fault_handler)(struct pt_regs *regs); +#elif defined(CONFIG_KGDB) +void (*debugger)(struct pt_regs *regs); +int (*debugger_bpt)(struct pt_regs *regs); +int (*debugger_sstep)(struct pt_regs *regs); +int (*debugger_iabr_match)(struct pt_regs *regs); +int (*debugger_dabr_match)(struct pt_regs *regs); +void (*debugger_fault_handler)(struct pt_regs *regs); +#else +#define debugger(regs) do { } while (0) +#define debugger_bpt(regs) 0 +#define debugger_sstep(regs) 0 +#define debugger_iabr_match(regs) 0 +#define debugger_dabr_match(regs) 0 +#define debugger_fault_handler ((void (*)(struct pt_regs *))0) +#endif + +#endif /*__ASSEMBLY__ */ +#endif /* __KERNEL__ */ +#endif /* _ASM_MICROBLAZE_EXCEPTIONS_H */ diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c new file mode 100644 index 0000000..4a8a406 --- /dev/null +++ b/arch/microblaze/kernel/exceptions.c @@ -0,0 +1,124 @@ +/* + * HW exception handling + * + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008 PetaLogix + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +/* + * This file handles the architecture-dependent parts of hardware exceptions + */ + +#include +#include +#include +#include +#include + +#include +#include /* For KM CPU var */ +#include +#include +#include +#include + +#define MICROBLAZE_ILL_OPCODE_EXCEPTION 0x02 +#define MICROBLAZE_IBUS_EXCEPTION 0x03 +#define MICROBLAZE_DBUS_EXCEPTION 0x04 +#define MICROBLAZE_DIV_ZERO_EXCEPTION 0x05 +#define MICROBLAZE_FPU_EXCEPTION 0x06 +#define MICROBLAZE_PRIVILEG_EXCEPTION 0x07 + +static DEFINE_SPINLOCK(die_lock); + +void die(const char *str, struct pt_regs *fp, long err) +{ + console_verbose(); + spin_lock_irq(&die_lock); + printk(KERN_WARNING "Oops: %s, sig: %ld\n", str, err); + show_regs(fp); + spin_unlock_irq(&die_lock); + /* do_exit() should take care of panic'ing from an interrupt + * context so we don't handle it here + */ + do_exit(err); +} + +void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) +{ + siginfo_t info; + + if (kernel_mode(regs)) { + debugger(regs); + die("Exception in kernel mode", regs, signr); + } + info.si_signo = signr; + info.si_errno = 0; + info.si_code = code; + info.si_addr = (void __user *) addr; + force_sig_info(signr, &info, current); +} + +asmlinkage void full_exception(struct pt_regs *regs, unsigned int type, + int fsr, int addr) +{ +#if 0 + printk(KERN_WARNING "Exception %02x in %s mode, FSR=%08x PC=%08x ESR=%08x\n", + type, user_mode(regs) ? "user" : "kernel", fsr, + (unsigned int) regs->pc, (unsigned int) regs->esr); +#endif + + switch (type & 0x1F) { + case MICROBLAZE_ILL_OPCODE_EXCEPTION: + _exception(SIGILL, regs, ILL_ILLOPC, addr); + break; + case MICROBLAZE_IBUS_EXCEPTION: + if (user_mode(regs)) { + printk(KERN_WARNING "Instruction bus error exception in user mode.\n"); + _exception(SIGBUS, regs, BUS_ADRERR, addr); + return; + } + printk(KERN_WARNING "Instruction bus error exception in kernel mode.\n"); + die("bus exception", regs, SIGBUS); + break; + case MICROBLAZE_DBUS_EXCEPTION: + if (user_mode(regs)) { + printk(KERN_WARNING "Data bus error exception in user mode.\n"); + _exception(SIGBUS, regs, BUS_ADRERR, addr); + return; + } + printk(KERN_WARNING "Data bus error exception in kernel mode.\n"); + die("bus exception", regs, SIGBUS); + break; + case MICROBLAZE_DIV_ZERO_EXCEPTION: + printk(KERN_WARNING "Divide by zero exception\n"); + _exception(SIGILL, regs, ILL_ILLOPC, addr); + break; + + case MICROBLAZE_FPU_EXCEPTION: + /* IEEE FP exception */ + /* I removed fsr variable and use code var for storing fsr */ + if (fsr & FSR_IO) + fsr = FPE_FLTINV; + else if (fsr & FSR_OF) + fsr = FPE_FLTOVF; + else if (fsr & FSR_UF) + fsr = FPE_FLTUND; + else if (fsr & FSR_DZ) + fsr = FPE_FLTDIV; + else if (fsr & FSR_DO) + fsr = FPE_FLTRES; + _exception(SIGFPE, regs, fsr, addr); + break; + + default: + printk(KERN_WARNING "Unexpected exception %02x " + "PC=%08x in %s mode\n", type, (unsigned int) addr, + kernel_mode(regs) ? "kernel" : "user"); + } + return; +} diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaze/kernel/hw_exception_handler.S new file mode 100644 index 0000000..cf9486d --- /dev/null +++ b/arch/microblaze/kernel/hw_exception_handler.S @@ -0,0 +1,458 @@ +/* + * Exception handling for Microblaze + * + * Rewriten interrupt handling + * + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * + * uClinux customisation (C) 2005 John Williams + * + * MMU code derived from arch/ppc/kernel/head_4xx.S: + * Copyright (C) 1995-1996 Gary Thomas + * Initial PowerPC version. + * Copyright (C) 1996 Cort Dougan + * Rewritten for PReP + * Copyright (C) 1996 Paul Mackerras + * Low-level exception handers, MMU support, and rewrite. + * Copyright (C) 1997 Dan Malek + * PowerPC 8xx modifications. + * Copyright (C) 1998-1999 TiVo, Inc. + * PowerPC 403GCX modifications. + * Copyright (C) 1999 Grant Erickson + * PowerPC 403GCX/405GP modifications. + * Copyright 2000 MontaVista Software Inc. + * PPC405 modifications + * PowerPC 403GCX/405GP modifications. + * Author: MontaVista Software, Inc. + * frank_rowand@mvista.com or source@mvista.com + * debbie_chu@mvista.com + * + * Original code + * Copyright (C) 2004 Xilinx, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +/* + * Here are the handlers which don't require enabling translation + * and calling other kernel code thus we can keep their design very simple + * and do all processing in real mode. All what they need is a valid current + * (that is an issue for the CONFIG_REGISTER_TASK_PTR case) + * This handlers use r3,r4,r5,r6 and optionally r[current] to work therefore + * these registers are saved/restored + * The handlers which require translation are in entry.S --KAA + * + * Microblaze HW Exception Handler + * - Non self-modifying exception handler for the following exception conditions + * - Unalignment + * - Instruction bus error + * - Data bus error + * - Illegal instruction opcode + * - Divide-by-zero + * + * Note we disable interrupts during exception handling, otherwise we will + * possibly get multiple re-entrancy if interrupt handles themselves cause + * exceptions. JW + */ + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +/* Helpful Macros */ +#define EX_HANDLER_STACK_SIZ (4*19) +#define NUM_TO_REG(num) r ## num + +#define LWREG_NOP \ + bri ex_handler_unhandled; \ + nop; + +#define SWREG_NOP \ + bri ex_handler_unhandled; \ + nop; + +/* FIXME this is weird - for noMMU kernel is not possible to use brid + * instruction which can shorten executed time + */ + +/* r3 is the source */ +#define R3_TO_LWREG_V(regnum) \ + swi r3, r1, 4 * regnum; \ + bri ex_handler_done; + +/* r3 is the source */ +#define R3_TO_LWREG(regnum) \ + or NUM_TO_REG (regnum), r0, r3; \ + bri ex_handler_done; + +/* r3 is the target */ +#define SWREG_TO_R3_V(regnum) \ + lwi r3, r1, 4 * regnum; \ + bri ex_sw_tail; + +/* r3 is the target */ +#define SWREG_TO_R3(regnum) \ + or r3, r0, NUM_TO_REG (regnum); \ + bri ex_sw_tail; + +.extern other_exception_handler /* Defined in exception.c */ + +/* + * hw_exception_handler - Handler for exceptions + * + * Exception handler notes: + * - Handles all exceptions + * - Does not handle unaligned exceptions during load into r17, r1, r0. + * - Does not handle unaligned exceptions during store from r17 (cannot be + * done) and r1 (slows down common case) + * + * Relevant register structures + * + * EAR - |----|----|----|----|----|----|----|----| + * - < ## 32 bit faulting address ## > + * + * ESR - |----|----|----|----|----| - | - |-----|-----| + * - W S REG EXC + * + * + * STACK FRAME STRUCTURE (for NO_MMU) + * --------------------------------- + * + * +-------------+ + 0 + * | MSR | + * +-------------+ + 4 + * | r1 | + * | . | + * | . | + * | . | + * | . | + * | r18 | + * +-------------+ + 76 + * | . | + * | . | + * + * NO_MMU kernel use the same r0_ram pointed space - look to vmlinux.lds.S + * which is used for storing register values - old style was, that value were + * stored in stack but in case of failure you lost information about register. + * Currently you can see register value in memory in specific place. + * In compare to with previous solution the speed should be the same. + * + * MMU exception handler has different handling compare to no MMU kernel. + * Exception handler use jump table for directing of what happen. For MMU kernel + * is this approach better because MMU relate exception are handled by asm code + * in this file. In compare to with MMU expect of unaligned exception + * is everything handled by C code. + */ + +/* + * every of these handlers is entered having R3/4/5/6/11/current saved on stack + * and clobbered so care should be taken to restore them if someone is going to + * return from exception + */ + +/* wrappers to restore state before coming to entry.S */ + +.global _hw_exception_handler +.section .text +.align 4 +.ent _hw_exception_handler +_hw_exception_handler: + addik r1, r1, -(EX_HANDLER_STACK_SIZ); /* Create stack frame */ + swi r3, r1, PT_R3 + swi r4, r1, PT_R4 + swi r5, r1, PT_R5 + swi r6, r1, PT_R6 + + mfs r5, rmsr; + nop + swi r5, r1, 0; + mfs r4, rbtr /* Save BTR before jumping to handler */ + nop + mfs r3, resr + nop + + andi r5, r3, 0x1000; /* Check ESR[DS] */ + beqi r5, not_in_delay_slot; /* Branch if ESR[DS] not set */ + mfs r17, rbtr; /* ESR[DS] set - return address in BTR */ + nop +not_in_delay_slot: + swi r17, r1, PT_R17 + + andi r5, r3, 0x1F; /* Extract ESR[EXC] */ + + /* Exceptions enabled here. This will allow nested exceptions */ + mfs r6, rmsr; + nop + swi r6, r1, 0; /* RMSR_OFFSET */ + ori r6, r6, 0x100; /* Turn ON the EE bit */ + andi r6, r6, ~2; /* Disable interrupts */ + mts rmsr, r6; + nop + + xori r6, r5, 1; /* 00001 = Unaligned Exception */ + /* Jump to unalignment exception handler */ + beqi r6, handle_unaligned_ex; + +handle_other_ex: /* Handle Other exceptions here */ + /* Save other volatiles before we make procedure calls below */ + swi r7, r1, PT_R7 + swi r8, r1, PT_R8 + swi r9, r1, PT_R9 + swi r10, r1, PT_R10 + swi r11, r1, PT_R11 + swi r12, r1, PT_R12 + swi r14, r1, PT_R14 + swi r15, r1, PT_R15 + swi r18, r1, PT_R18 + + or r5, r1, r0 + andi r6, r3, 0x1F; /* Load ESR[EC] */ + lwi r7, r0, PER_CPU(KM) /* MS: saving current kernel mode to regs */ + swi r7, r1, PT_MODE + mfs r7, rfsr + nop + addk r8, r17, r0; /* Load exception address */ + bralid r15, full_exception; /* Branch to the handler */ + nop; + + /* + * Trigger execution of the signal handler by enabling + * interrupts and calling an invalid syscall. + */ + mfs r5, rmsr; + nop + ori r5, r5, 2; + mts rmsr, r5; /* enable interrupt */ + nop + addi r12, r0, __NR_syscalls; + brki r14, 0x08; + mfs r5, rmsr; /* disable interrupt */ + nop + andi r5, r5, ~2; + mts rmsr, r5; + nop + + lwi r7, r1, PT_R7 + lwi r8, r1, PT_R8 + lwi r9, r1, PT_R9 + lwi r10, r1, PT_R10 + lwi r11, r1, PT_R11 + lwi r12, r1, PT_R12 + lwi r14, r1, PT_R14 + lwi r15, r1, PT_R15 + lwi r18, r1, PT_R18 + + bri ex_handler_done; /* Complete exception handling */ + +/* 0x01 - Unaligned data access exception + * This occurs when a word access is not aligned on a word boundary, + * or when a 16-bit access is not aligned on a 16-bit boundary. + * This handler perform the access, and returns, except for MMU when + * the unaligned address is last on a 4k page or the physical address is + * not found in the page table, in which case unaligned_data_trap is called. + */ +handle_unaligned_ex: + /* Working registers already saved: R3, R4, R5, R6 + * R3 = ESR + * R4 = BTR + */ + mfs r4, rear; + nop + + andi r6, r3, 0x3E0; /* Mask and extract the register operand */ + srl r6, r6; /* r6 >> 5 */ + srl r6, r6; + srl r6, r6; + srl r6, r6; + srl r6, r6; + /* Store the register operand in a temporary location */ + sbi r6, r0, TOPHYS(ex_reg_op); + + andi r6, r3, 0x400; /* Extract ESR[S] */ + bnei r6, ex_sw; +ex_lw: + andi r6, r3, 0x800; /* Extract ESR[W] */ + beqi r6, ex_lhw; + lbui r5, r4, 0; /* Exception address in r4 */ + /* Load a word, byte-by-byte from destination address + and save it in tmp space */ + sbi r5, r0, TOPHYS(ex_tmp_data_loc_0); + lbui r5, r4, 1; + sbi r5, r0, TOPHYS(ex_tmp_data_loc_1); + lbui r5, r4, 2; + sbi r5, r0, TOPHYS(ex_tmp_data_loc_2); + lbui r5, r4, 3; + sbi r5, r0, TOPHYS(ex_tmp_data_loc_3); + /* Get the destination register value into r3 */ + lwi r3, r0, TOPHYS(ex_tmp_data_loc_0); + bri ex_lw_tail; +ex_lhw: + lbui r5, r4, 0; /* Exception address in r4 */ + /* Load a half-word, byte-by-byte from destination + address and save it in tmp space */ + sbi r5, r0, TOPHYS(ex_tmp_data_loc_0); + lbui r5, r4, 1; + sbi r5, r0, TOPHYS(ex_tmp_data_loc_1); + /* Get the destination register value into r3 */ + lhui r3, r0, TOPHYS(ex_tmp_data_loc_0); +ex_lw_tail: + /* Get the destination register number into r5 */ + lbui r5, r0, TOPHYS(ex_reg_op); + /* Form load_word jump table offset (lw_table + (8 * regnum)) */ + la r6, r0, TOPHYS(lw_table); + addk r5, r5, r5; + addk r5, r5, r5; + addk r5, r5, r5; + addk r5, r5, r6; + bra r5; +ex_lw_end: /* Exception handling of load word, ends */ +ex_sw: + /* Get the destination register number into r5 */ + lbui r5, r0, TOPHYS(ex_reg_op); + /* Form store_word jump table offset (sw_table + (8 * regnum)) */ + la r6, r0, TOPHYS(sw_table); + add r5, r5, r5; + add r5, r5, r5; + add r5, r5, r5; + add r5, r5, r6; + bra r5; +ex_sw_tail: + mfs r6, resr; + nop + andi r6, r6, 0x800; /* Extract ESR[W] */ + beqi r6, ex_shw; + /* Get the word - delay slot */ + swi r3, r0, TOPHYS(ex_tmp_data_loc_0); + /* Store the word, byte-by-byte into destination address */ + lbui r3, r0, TOPHYS(ex_tmp_data_loc_0); + sbi r3, r4, 0; + lbui r3, r0, TOPHYS(ex_tmp_data_loc_1); + sbi r3, r4, 1; + lbui r3, r0, TOPHYS(ex_tmp_data_loc_2); + sbi r3, r4, 2; + lbui r3, r0, TOPHYS(ex_tmp_data_loc_3); + sbi r3, r4, 3; + bri ex_handler_done; + +ex_shw: + /* Store the lower half-word, byte-by-byte into destination address */ + swi r3, r0, TOPHYS(ex_tmp_data_loc_0); + lbui r3, r0, TOPHYS(ex_tmp_data_loc_2); + sbi r3, r4, 0; + lbui r3, r0, TOPHYS(ex_tmp_data_loc_3); + sbi r3, r4, 1; +ex_sw_end: /* Exception handling of store word, ends. */ + +ex_handler_done: + lwi r5, r1, 0 /* RMSR */ + mts rmsr, r5 + nop + lwi r3, r1, PT_R3 + lwi r4, r1, PT_R4 + lwi r5, r1, PT_R5 + lwi r6, r1, PT_R6 + lwi r17, r1, PT_R17 + + rted r17, 0 + addik r1, r1, (EX_HANDLER_STACK_SIZ); /* Restore stack frame */ + +.end _hw_exception_handler + +ex_handler_unhandled: +/* FIXME add handle function for unhandled exception - dump register */ + bri 0 + +.section .text +.align 4 +lw_table: +lw_r0: R3_TO_LWREG (0); +lw_r1: LWREG_NOP; +lw_r2: R3_TO_LWREG (2); +lw_r3: R3_TO_LWREG_V (3); +lw_r4: R3_TO_LWREG_V (4); +lw_r5: R3_TO_LWREG_V (5); +lw_r6: R3_TO_LWREG_V (6); +lw_r7: R3_TO_LWREG (7); +lw_r8: R3_TO_LWREG (8); +lw_r9: R3_TO_LWREG (9); +lw_r10: R3_TO_LWREG (10); +lw_r11: R3_TO_LWREG (11); +lw_r12: R3_TO_LWREG (12); +lw_r13: R3_TO_LWREG (13); +lw_r14: R3_TO_LWREG (14); +lw_r15: R3_TO_LWREG (15); +lw_r16: R3_TO_LWREG (16); +lw_r17: LWREG_NOP; +lw_r18: R3_TO_LWREG (18); +lw_r19: R3_TO_LWREG (19); +lw_r20: R3_TO_LWREG (20); +lw_r21: R3_TO_LWREG (21); +lw_r22: R3_TO_LWREG (22); +lw_r23: R3_TO_LWREG (23); +lw_r24: R3_TO_LWREG (24); +lw_r25: R3_TO_LWREG (25); +lw_r26: R3_TO_LWREG (26); +lw_r27: R3_TO_LWREG (27); +lw_r28: R3_TO_LWREG (28); +lw_r29: R3_TO_LWREG (29); +lw_r30: R3_TO_LWREG (30); +lw_r31: R3_TO_LWREG (31); + +sw_table: +sw_r0: SWREG_TO_R3 (0); +sw_r1: SWREG_NOP; +sw_r2: SWREG_TO_R3 (2); +sw_r3: SWREG_TO_R3_V (3); +sw_r4: SWREG_TO_R3_V (4); +sw_r5: SWREG_TO_R3_V (5); +sw_r6: SWREG_TO_R3_V (6); +sw_r7: SWREG_TO_R3 (7); +sw_r8: SWREG_TO_R3 (8); +sw_r9: SWREG_TO_R3 (9); +sw_r10: SWREG_TO_R3 (10); +sw_r11: SWREG_TO_R3 (11); +sw_r12: SWREG_TO_R3 (12); +sw_r13: SWREG_TO_R3 (13); +sw_r14: SWREG_TO_R3 (14); +sw_r15: SWREG_TO_R3 (15); +sw_r16: SWREG_TO_R3 (16); +sw_r17: SWREG_NOP; +sw_r18: SWREG_TO_R3 (18); +sw_r19: SWREG_TO_R3 (19); +sw_r20: SWREG_TO_R3 (20); +sw_r21: SWREG_TO_R3 (21); +sw_r22: SWREG_TO_R3 (22); +sw_r23: SWREG_TO_R3 (23); +sw_r24: SWREG_TO_R3 (24); +sw_r25: SWREG_TO_R3 (25); +sw_r26: SWREG_TO_R3 (26); +sw_r27: SWREG_TO_R3 (27); +sw_r28: SWREG_TO_R3 (28); +sw_r29: SWREG_TO_R3 (29); +sw_r30: SWREG_TO_R3 (30); +sw_r31: SWREG_TO_R3 (31); + +/* Temporary data structures used in the handler */ +.section .data +.align 4 +ex_tmp_data_loc_0: + .byte 0 +ex_tmp_data_loc_1: + .byte 0 +ex_tmp_data_loc_2: + .byte 0 +ex_tmp_data_loc_3: + .byte 0 +ex_reg_op: + .byte 0 -- cgit v0.10.2 From 2148daa9c45ff4f91b5890f2a453e3130288064c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:14 +0100 Subject: microblaze_v8: Signal support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/signal.h b/arch/microblaze/include/asm/signal.h new file mode 100644 index 0000000..9676fad --- /dev/null +++ b/arch/microblaze/include/asm/signal.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * Yasushi SHOJI + * Tetsuya OHKAWA + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SIGNAL_H +#define _ASM_MICROBLAZE_SIGNAL_H + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +/* +#define SIGLOST 29 +*/ +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +/* These should not be considered constants from userland. */ +#define SIGRTMIN 32 +#define SIGRTMAX _NSIG + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 +#define SA_SIGINFO 0x00000004 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +#define SA_RESTORER 0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +# ifndef __ASSEMBLY__ +# include +# include + +/* Avoid too many header ordering problems. */ +struct siginfo; + +# ifdef __KERNEL__ +/* + * Most things should be clean enough to redefine this at will, if care + * is taken to make libc match. + */ +# define _NSIG 64 +# define _NSIG_BPW 32 +# define _NSIG_WORDS (_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t; /* at least 32 bits */ + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +struct old_sigaction { + __sighandler_t sa_handler; + old_sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +}; + +struct sigaction { + __sighandler_t sa_handler; + unsigned long sa_flags; + void (*sa_restorer)(void); + sigset_t sa_mask; /* mask last for extensibility */ +}; + +struct k_sigaction { + struct sigaction sa; +}; + +# include +# undef __HAVE_ARCH_SIG_BITOPS + +# define ptrace_signal_deliver(regs, cookie) do { } while (0) + +# else /* !__KERNEL__ */ + +/* Here we must cater to libcs that poke about in kernel headers. */ + +# define NSIG 32 +typedef unsigned long sigset_t; + +struct sigaction { + union { + __sighandler_t _sa_handler; + void (*_sa_sigaction)(int, struct siginfo *, void *); + } _u; + sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +}; + +# define sa_handler _u._sa_handler +# define sa_sigaction _u._sa_sigaction + +# endif /* __KERNEL__ */ + +typedef struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +# endif /* __ASSEMBLY__ */ +#endif /* _ASM_MICROBLAZE_SIGNAL_H */ diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c new file mode 100644 index 0000000..ff347b9 --- /dev/null +++ b/arch/microblaze/kernel/signal.c @@ -0,0 +1,538 @@ +/* + * Signal handling + * + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2003,2004 John Williams + * Copyright (C) 2001 NEC Corporation + * Copyright (C) 2001 Miles Bader + * Copyright (C) 1999,2000 Niibe Yutaka & Kaz Kojima + * Copyright (C) 1991,1992 Linus Torvalds + * + * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson + * + * This file was was derived from the sh version, arch/sh/kernel/signal.c + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) + +asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset, int in_sycall); + +/* + * Atomically swap in the new signal mask, and wait for a signal. + */ +asmlinkage int +sys_sigsuspend(old_sigset_t mask, struct pt_regs *regs) +{ + sigset_t saveset; + + mask &= _BLOCKABLE; + spin_lock_irq(¤t->sighand->siglock); + saveset = current->blocked; + siginitset(¤t->blocked, mask); + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + + regs->r3 = -EINTR; + while (1) { + current->state = TASK_INTERRUPTIBLE; + schedule(); + if (do_signal(regs, &saveset, 1)) + return -EINTR; + } +} + +asmlinkage int +sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, + struct pt_regs *regs) +{ + sigset_t saveset, newset; + + /* XXX: Don't preclude handling different sized sigset_t's. */ + if (sigsetsize != sizeof(sigset_t)) + return -EINVAL; + + if (copy_from_user(&newset, unewset, sizeof(newset))) + return -EFAULT; + sigdelsetmask(&newset, ~_BLOCKABLE); + spin_lock_irq(¤t->sighand->siglock); + saveset = current->blocked; + current->blocked = newset; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + + regs->r3 = -EINTR; + while (1) { + current->state = TASK_INTERRUPTIBLE; + schedule(); + if (do_signal(regs, &saveset, 1)) + return -EINTR; + } +} + +asmlinkage int +sys_sigaction(int sig, const struct old_sigaction *act, + struct old_sigaction *oact) +{ + struct k_sigaction new_ka, old_ka; + int ret; + + if (act) { + old_sigset_t mask; + if (!access_ok(VERIFY_READ, act, sizeof(*act)) || + __get_user(new_ka.sa.sa_handler, &act->sa_handler) || + __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) + return -EFAULT; + __get_user(new_ka.sa.sa_flags, &act->sa_flags); + __get_user(mask, &act->sa_mask); + siginitset(&new_ka.sa.sa_mask, mask); + } + + ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); + + if (!ret && oact) { + if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || + __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || + __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) + return -EFAULT; + __put_user(old_ka.sa.sa_flags, &oact->sa_flags); + __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); + } + + return ret; +} + +asmlinkage int +sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, + struct pt_regs *regs) +{ + return do_sigaltstack(uss, uoss, regs->r1); +} + +/* + * Do a signal return; undo the signal stack. + */ + +struct sigframe { + struct sigcontext sc; + unsigned long extramask[_NSIG_WORDS-1]; + unsigned long tramp[2]; /* signal trampoline */ +}; + +struct rt_sigframe { + struct siginfo info; + struct ucontext uc; + unsigned long tramp[2]; /* signal trampoline */ +}; + +static int +restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *rval_p) +{ + unsigned int err = 0; + +#define COPY(x) {err |= __get_user(regs->x, &sc->regs.x); } + COPY(r0); + COPY(r1); + COPY(r2); COPY(r3); COPY(r4); COPY(r5); + COPY(r6); COPY(r7); COPY(r8); COPY(r9); + COPY(r10); COPY(r11); COPY(r12); COPY(r13); + COPY(r14); COPY(r15); COPY(r16); COPY(r17); + COPY(r18); COPY(r19); COPY(r20); COPY(r21); + COPY(r22); COPY(r23); COPY(r24); COPY(r25); + COPY(r26); COPY(r27); COPY(r28); COPY(r29); + COPY(r30); COPY(r31); + COPY(pc); COPY(ear); COPY(esr); COPY(fsr); +#undef COPY + + *rval_p = regs->r3; + + return err; +} + +asmlinkage int sys_sigreturn(struct pt_regs *regs) +{ + struct sigframe *frame = (struct sigframe *)regs->r1; + sigset_t set; + int rval; + + if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) + goto badframe; + + if (__get_user(set.sig[0], &frame->sc.oldmask) + || (_NSIG_WORDS > 1 + && __copy_from_user(&set.sig[1], &frame->extramask, + sizeof(frame->extramask)))) + goto badframe; + + sigdelsetmask(&set, ~_BLOCKABLE); + + spin_lock_irq(¤t->sighand->siglock); + current->blocked = set; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + + if (restore_sigcontext(regs, &frame->sc, &rval)) + goto badframe; + return rval; + +badframe: + force_sig(SIGSEGV, current); + return 0; +} + +asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) +{ + struct rt_sigframe *frame = (struct rt_sigframe *)regs->r1; + sigset_t set; + stack_t st; + int rval; + + if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) + goto badframe; + + if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) + goto badframe; + + sigdelsetmask(&set, ~_BLOCKABLE); + spin_lock_irq(¤t->sighand->siglock); + current->blocked = set; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + + if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval)) + goto badframe; + + if (__copy_from_user((void *)&st, &frame->uc.uc_stack, sizeof(st))) + goto badframe; + /* It is more difficult to avoid calling this function than to + call it and ignore errors. */ + do_sigaltstack(&st, NULL, regs->r1); + + return rval; + +badframe: + force_sig(SIGSEGV, current); + return 0; +} + +/* + * Set up a signal frame. + */ + +static int +setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, + unsigned long mask) +{ + int err = 0; + +#define COPY(x) {err |= __put_user(regs->x, &sc->regs.x); } + COPY(r0); + COPY(r1); + COPY(r2); COPY(r3); COPY(r4); COPY(r5); + COPY(r6); COPY(r7); COPY(r8); COPY(r9); + COPY(r10); COPY(r11); COPY(r12); COPY(r13); + COPY(r14); COPY(r15); COPY(r16); COPY(r17); + COPY(r18); COPY(r19); COPY(r20); COPY(r21); + COPY(r22); COPY(r23); COPY(r24); COPY(r25); + COPY(r26); COPY(r27); COPY(r28); COPY(r29); + COPY(r30); COPY(r31); + COPY(pc); COPY(ear); COPY(esr); COPY(fsr); +#undef COPY + + err |= __put_user(mask, &sc->oldmask); + + return err; +} + +/* + * Determine which stack to use.. + */ +static inline void * +get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) +{ + /* Default to using normal stack */ + unsigned long sp = regs->r1; + + if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && !on_sig_stack(sp)) + sp = current->sas_ss_sp + current->sas_ss_size; + + return (void *)((sp - frame_size) & -8UL); +} + +static void setup_frame(int sig, struct k_sigaction *ka, + sigset_t *set, struct pt_regs *regs) +{ + struct sigframe *frame; + int err = 0; + int signal; + + frame = get_sigframe(ka, regs, sizeof(*frame)); + + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) + goto give_sigsegv; + + signal = current_thread_info()->exec_domain + && current_thread_info()->exec_domain->signal_invmap + && sig < 32 + ? current_thread_info()->exec_domain->signal_invmap[sig] + : sig; + + err |= setup_sigcontext(&frame->sc, regs, set->sig[0]); + + if (_NSIG_WORDS > 1) { + err |= __copy_to_user(frame->extramask, &set->sig[1], + sizeof(frame->extramask)); + } + + /* Set up to return from userspace. If provided, use a stub + already in userspace. */ + /* minus 8 is offset to cater for "rtsd r15,8" offset */ + if (ka->sa.sa_flags & SA_RESTORER) { + regs->r15 = ((unsigned long)ka->sa.sa_restorer)-8; + } else { + /* Note, these encodings are _big endian_! */ + + /* addi r12, r0, __NR_sigreturn */ + err |= __put_user(0x31800000 | __NR_sigreturn , + frame->tramp + 0); + /* brki r14, 0x8 */ + err |= __put_user(0xb9cc0008, frame->tramp + 1); + + /* Return from sighandler will jump to the tramp. + Negative 8 offset because return is rtsd r15, 8 */ + regs->r15 = ((unsigned long)frame->tramp)-8; + + __invalidate_cache_sigtramp((unsigned long)frame->tramp); + } + + if (err) + goto give_sigsegv; + + /* Set up registers for signal handler */ + regs->r1 = (unsigned long) frame; + /* Signal handler args: */ + regs->r5 = signal; /* Arg 0: signum */ + regs->r6 = (unsigned long) &frame->sc; /* arg 1: sigcontext */ + + /* Offset of 4 to handle microblaze rtid r14, 0 */ + regs->pc = (unsigned long)ka->sa.sa_handler; + + set_fs(USER_DS); + +#ifdef DEBUG_SIG + printk(KERN_INFO "SIG deliver (%s:%d): sp=%p pc=%08lx\n", + current->comm, current->pid, frame, regs->pc); +#endif + + return; + +give_sigsegv: + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); +} + +static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, + sigset_t *set, struct pt_regs *regs) +{ + struct rt_sigframe *frame; + int err = 0; + int signal; + + frame = get_sigframe(ka, regs, sizeof(*frame)); + + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) + goto give_sigsegv; + + signal = current_thread_info()->exec_domain + && current_thread_info()->exec_domain->signal_invmap + && sig < 32 + ? current_thread_info()->exec_domain->signal_invmap[sig] + : sig; + + err |= copy_siginfo_to_user(&frame->info, info); + + /* Create the ucontext. */ + err |= __put_user(0, &frame->uc.uc_flags); + err |= __put_user(0, &frame->uc.uc_link); + err |= __put_user((void *)current->sas_ss_sp, + &frame->uc.uc_stack.ss_sp); + err |= __put_user(sas_ss_flags(regs->r1), + &frame->uc.uc_stack.ss_flags); + err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); + err |= setup_sigcontext(&frame->uc.uc_mcontext, + regs, set->sig[0]); + err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); + + /* Set up to return from userspace. If provided, use a stub + already in userspace. */ + /* minus 8 is offset to cater for "rtsd r15,8" */ + if (ka->sa.sa_flags & SA_RESTORER) { + regs->r15 = ((unsigned long)ka->sa.sa_restorer)-8; + } else { + /* addi r12, r0, __NR_sigreturn */ + err |= __put_user(0x31800000 | __NR_rt_sigreturn , + frame->tramp + 0); + /* brki r14, 0x8 */ + err |= __put_user(0xb9cc0008, frame->tramp + 1); + + /* Return from sighandler will jump to the tramp. + Negative 8 offset because return is rtsd r15, 8 */ + regs->r15 = ((unsigned long)frame->tramp)-8; + + __invalidate_cache_sigtramp((unsigned long)frame->tramp); + } + + if (err) + goto give_sigsegv; + + /* Set up registers for signal handler */ + regs->r1 = (unsigned long) frame; + /* Signal handler args: */ + regs->r5 = signal; /* arg 0: signum */ + regs->r6 = (unsigned long) &frame->info; /* arg 1: siginfo */ + regs->r7 = (unsigned long) &frame->uc; /* arg2: ucontext */ + /* Offset to handle microblaze rtid r14, 0 */ + regs->pc = (unsigned long)ka->sa.sa_handler; + + set_fs(USER_DS); + +#ifdef DEBUG_SIG + printk(KERN_INFO "SIG deliver (%s:%d): sp=%p pc=%08lx\n", + current->comm, current->pid, frame, regs->pc); +#endif + + return; + +give_sigsegv: + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); +} + +/* Handle restarting system calls */ +static inline void +handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) +{ + switch (regs->r3) { + case -ERESTART_RESTARTBLOCK: + case -ERESTARTNOHAND: + if (!has_handler) + goto do_restart; + regs->r3 = -EINTR; + break; + case -ERESTARTSYS: + if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { + regs->r3 = -EINTR; + break; + } + /* fallthrough */ + case -ERESTARTNOINTR: +do_restart: + /* offset of 4 bytes to re-execute trap (brki) instruction */ + regs->pc -= 4; + break; + } +} + +/* + * OK, we're invoking a handler + */ + +static void +handle_signal(unsigned long sig, struct k_sigaction *ka, + siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) +{ + /* Set up the stack frame */ + if (ka->sa.sa_flags & SA_SIGINFO) + setup_rt_frame(sig, ka, info, oldset, regs); + else + setup_frame(sig, ka, oldset, regs); + + if (ka->sa.sa_flags & SA_ONESHOT) + ka->sa.sa_handler = SIG_DFL; + + if (!(ka->sa.sa_flags & SA_NODEFER)) { + spin_lock_irq(¤t->sighand->siglock); + sigorsets(¤t->blocked, + ¤t->blocked, &ka->sa.sa_mask); + sigaddset(¤t->blocked, sig); + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + } +} + +/* + * Note that 'init' is a special process: it doesn't get signals it doesn't + * want to handle. Thus you cannot kill init even with a SIGKILL even by + * mistake. + * + * Note that we go through the signals twice: once to check the signals that + * the kernel can handle, and then we build all the user-level signal handling + * stack-frames in one go after that. + */ +int do_signal(struct pt_regs *regs, sigset_t *oldset, int in_syscall) +{ + siginfo_t info; + int signr; + struct k_sigaction ka; +#ifdef DEBUG_SIG + printk(KERN_INFO "do signal: %p %p %d\n", regs, oldset, in_syscall); + printk(KERN_INFO "do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1, + regs->r12, current_thread_info()->flags); +#endif + /* + * We want the common case to go fast, which + * is why we may in certain cases get here from + * kernel mode. Just return without doing anything + * if so. + */ + if (kernel_mode(regs)) + return 1; + + if (!oldset) + oldset = ¤t->blocked; + + signr = get_signal_to_deliver(&info, &ka, regs, NULL); + if (signr > 0) { + /* Whee! Actually deliver the signal. */ + if (in_syscall) + handle_restart(regs, &ka, 1); + handle_signal(signr, &ka, &info, oldset, regs); + return 1; + } + + if (in_syscall) + handle_restart(regs, NULL, 0); + + /* Did we come from a system call? */ + return 0; +} -- cgit v0.10.2 From 37069abf2973f51aa12aa9dcb86c7403c9828161 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:15 +0100 Subject: microblaze_v8: Selfmodified code Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/selfmod.h b/arch/microblaze/include/asm/selfmod.h new file mode 100644 index 0000000..c42aff2 --- /dev/null +++ b/arch/microblaze/include/asm/selfmod.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2007-2008 Michal Simek + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SELFMOD_H +#define _ASM_MICROBLAZE_SELFMOD_H + +/* + * BARRIER_BASE_ADDR is constant address for selfmod function. + * do not change this value - selfmod function is in + * arch/microblaze/kernel/selfmod.c: selfmod_function() + * + * last 16 bits is used for storing register offset + */ + +#define BARRIER_BASE_ADDR 0x1234ff00 + +void selfmod_function(const int *arr_fce, const unsigned int base); + +#endif /* _ASM_MICROBLAZE_SELFMOD_H */ diff --git a/arch/microblaze/kernel/selfmod.c b/arch/microblaze/kernel/selfmod.c new file mode 100644 index 0000000..89508bd --- /dev/null +++ b/arch/microblaze/kernel/selfmod.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2009 PetaLogix + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include + +#undef DEBUG + +#if __GNUC__ > 3 +#error GCC 4 unsupported SELFMOD. Please disable SELFMOD from menuconfig. +#endif + +#define OPCODE_IMM 0xB0000000 +#define OPCODE_LWI 0xE8000000 +#define OPCODE_LWI_MASK 0xEC000000 +#define OPCODE_RTSD 0xB60F0008 /* return from func: rtsd r15, 8 */ +#define OPCODE_ADDIK 0x30000000 +#define OPCODE_ADDIK_MASK 0xFC000000 + +#define IMM_BASE (OPCODE_IMM | (BARRIER_BASE_ADDR >> 16)) +#define LWI_BASE (OPCODE_LWI | (BARRIER_BASE_ADDR & 0x0000ff00)) +#define LWI_BASE_MASK (OPCODE_LWI_MASK | (BARRIER_BASE_ADDR & 0x0000ff00)) +#define ADDIK_BASE (OPCODE_ADDIK | (BARRIER_BASE_ADDR & 0x0000ff00)) +#define ADDIK_BASE_MASK (OPCODE_ADDIK_MASK | (BARRIER_BASE_ADDR & 0x0000ff00)) + +#define MODIFY_INSTR { \ + pr_debug("%s: curr instr, (%d):0x%x, next(%d):0x%x\n", \ + __func__, i, addr[i], i + 1, addr[i + 1]); \ + addr[i] = OPCODE_IMM + (base >> 16); \ + /* keep instruction opcode and add only last 16bits */ \ + addr[i + 1] = (addr[i + 1] & 0xffff00ff) + (base & 0xffff); \ + __invalidate_icache(addr[i]); \ + __invalidate_icache(addr[i + 1]); \ + pr_debug("%s: hack instr, (%d):0x%x, next(%d):0x%x\n", \ + __func__, i, addr[i], i + 1, addr[i + 1]); } + +/* NOTE + * self-modified part of code for improvement of interrupt controller + * save instruction in interrupt rutine + */ +void selfmod_function(const int *arr_fce, const unsigned int base) +{ + unsigned int flags, i, j, *addr = NULL; + + local_irq_save(flags); + __disable_icache(); + + /* zero terminated array */ + for (j = 0; arr_fce[j] != 0; j++) { + /* get start address of function */ + addr = (unsigned int *) arr_fce[j]; + pr_debug("%s: func(%d) at 0x%x\n", + __func__, j, (unsigned int) addr); + for (i = 0; ; i++) { + pr_debug("%s: instruction code at %d: 0x%x\n", + __func__, i, addr[i]); + if (addr[i] == IMM_BASE) { + /* detecting of lwi (0xE8) or swi (0xF8) instr + * I can detect both opcode with one mask */ + if ((addr[i + 1] & LWI_BASE_MASK) == LWI_BASE) { + MODIFY_INSTR; + } else /* detection addik for ack */ + if ((addr[i + 1] & ADDIK_BASE_MASK) == + ADDIK_BASE) { + MODIFY_INSTR; + } + } else if (addr[i] == OPCODE_RTSD) { + /* return from function means end of function */ + pr_debug("%s: end of array %d\n", __func__, i); + break; + } + } + } + local_irq_restore(flags); +} /* end of self-modified code */ -- cgit v0.10.2 From 8beb8503bfa305cd7d9efa590517a9c01e2f97b4 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:16 +0100 Subject: microblaze_v8: cache support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/cache.h b/arch/microblaze/include/asm/cache.h new file mode 100644 index 0000000..c4c64b4 --- /dev/null +++ b/arch/microblaze/include/asm/cache.h @@ -0,0 +1,45 @@ +/* + * Cache operations + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2003 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_CACHE_H +#define _ASM_MICROBLAZE_CACHE_H + +#include + +#define L1_CACHE_SHIFT 2 +/* word-granular cache in microblaze */ +#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) + +#define SMP_CACHE_BYTES L1_CACHE_BYTES + +void _enable_icache(void); +void _disable_icache(void); +void _invalidate_icache(unsigned int addr); + +#define __enable_icache() _enable_icache() +#define __disable_icache() _disable_icache() +#define __invalidate_icache(addr) _invalidate_icache(addr) + +void _enable_dcache(void); +void _disable_dcache(void); +void _invalidate_dcache(unsigned int addr); + +#define __enable_dcache() _enable_dcache() +#define __disable_dcache() _disable_dcache() +#define __invalidate_dcache(addr) _invalidate_dcache(addr) + +/* FIXME - I don't think this is right */ +#ifdef CONFIG_XILINX_UNCACHED_SHADOW +#define UNCACHED_SHADOW_MASK (CONFIG_XILINX_ERAM_SIZE) +#endif + +#endif /* _ASM_MICROBLAZE_CACHE_H */ diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h new file mode 100644 index 0000000..3300b78 --- /dev/null +++ b/arch/microblaze/include/asm/cacheflush.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2007 PetaLogix + * Copyright (C) 2007 John Williams + * based on v850 version which was + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + * + */ + +#ifndef _ASM_MICROBLAZE_CACHEFLUSH_H +#define _ASM_MICROBLAZE_CACHEFLUSH_H + +/* Somebody depends on this; sigh... */ +#include + +/* + * Cache handling functions. + * Microblaze has a write-through data cache, meaning that the data cache + * never needs to be flushed. The only flushing operations that are + * implemented are to invalidate the instruction cache. These are called + * after loading a user application into memory, we must invalidate the + * instruction cache to make sure we don't fetch old, bad code. + */ + +/* FIXME for LL-temac driver */ +#define invalidate_dcache_range(start, end) \ + __invalidate_dcache_range(start, end) + +#define flush_cache_all() __invalidate_cache_all() +#define flush_cache_mm(mm) do { } while (0) +#define flush_cache_range(vma, start, end) __invalidate_cache_all() +#define flush_cache_page(vma, vmaddr, pfn) do { } while (0) + +#define flush_dcache_range(start, end) __invalidate_dcache_range(start, end) +#define flush_dcache_page(page) do { } while (0) +#define flush_dcache_mmap_lock(mapping) do { } while (0) +#define flush_dcache_mmap_unlock(mapping) do { } while (0) + +#define flush_icache_range(start, len) __invalidate_icache_range(start, len) +#define flush_icache_page(vma, pg) do { } while (0) + +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +struct page; +struct mm_struct; +struct vm_area_struct; + +/* see arch/microblaze/kernel/cache.c */ +extern void __invalidate_icache_all(void); +extern void __invalidate_icache_range(unsigned long start, unsigned long end); +extern void __invalidate_icache_page(struct vm_area_struct *vma, + struct page *page); +extern void __invalidate_icache_user_range(struct vm_area_struct *vma, + struct page *page, + unsigned long adr, int len); +extern void __invalidate_cache_sigtramp(unsigned long addr); + +extern void __invalidate_dcache_all(void); +extern void __invalidate_dcache_range(unsigned long start, unsigned long end); +extern void __invalidate_dcache_page(struct vm_area_struct *vma, + struct page *page); +extern void __invalidate_dcache_user_range(struct vm_area_struct *vma, + struct page *page, + unsigned long adr, int len); + +extern inline void __invalidate_cache_all(void) +{ + __invalidate_icache_all(); + __invalidate_dcache_all(); +} + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy((dst), (src), (len)); \ + flush_icache_range((unsigned) (dst), (unsigned) (dst) + (len)); \ +} while (0) + +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy((dst), (src), (len)) + +#endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ diff --git a/arch/microblaze/kernel/cpu/cache.c b/arch/microblaze/kernel/cpu/cache.c new file mode 100644 index 0000000..be9fecc --- /dev/null +++ b/arch/microblaze/kernel/cpu/cache.c @@ -0,0 +1,258 @@ +/* + * Cache control for MicroBlaze cache memories + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#include +#include +#include + +/* Exported functions */ + +void _enable_icache(void) +{ + if (cpuinfo.use_icache) { +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + __asm__ __volatile__ (" \ + msrset r0, %0; \ + nop; " \ + : \ + : "i" (MSR_ICE) \ + : "memory"); +#else + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + ori r12, r12, %0; \ + mts rmsr, r12; \ + nop; " \ + : \ + : "i" (MSR_ICE) \ + : "memory", "r12"); +#endif + } +} + +void _disable_icache(void) +{ + if (cpuinfo.use_icache) { +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + __asm__ __volatile__ (" \ + msrclr r0, %0; \ + nop; " \ + : \ + : "i" (MSR_ICE) \ + : "memory"); +#else + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + andi r12, r12, ~%0; \ + mts rmsr, r12; \ + nop; " \ + : \ + : "i" (MSR_ICE) \ + : "memory", "r12"); +#endif + } +} + +void _invalidate_icache(unsigned int addr) +{ + if (cpuinfo.use_icache) { + __asm__ __volatile__ (" \ + wic %0, r0" \ + : \ + : "r" (addr)); + } +} + +void _enable_dcache(void) +{ + if (cpuinfo.use_dcache) { +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + __asm__ __volatile__ (" \ + msrset r0, %0; \ + nop; " \ + : \ + : "i" (MSR_DCE) \ + : "memory"); +#else + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + ori r12, r12, %0; \ + mts rmsr, r12; \ + nop; " \ + : \ + : "i" (MSR_DCE) \ + : "memory", "r12"); +#endif + } +} + +void _disable_dcache(void) +{ + if (cpuinfo.use_dcache) { +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + __asm__ __volatile__ (" \ + msrclr r0, %0; \ + nop; " \ + : \ + : "i" (MSR_DCE) \ + : "memory"); +#else + __asm__ __volatile__ (" \ + mfs r12, rmsr; \ + nop; \ + andi r12, r12, ~%0; \ + mts rmsr, r12; \ + nop; " \ + : \ + : "i" (MSR_DCE) \ + : "memory", "r12"); +#endif + } +} + +void _invalidate_dcache(unsigned int addr) +{ + if (cpuinfo.use_dcache) + __asm__ __volatile__ (" \ + wdc %0, r0" \ + : \ + : "r" (addr)); +} + +void __invalidate_icache_all(void) +{ + unsigned int i; + unsigned flags; + + if (cpuinfo.use_icache) { + local_irq_save(flags); + __disable_icache(); + + /* Just loop through cache size and invalidate, no need to add + CACHE_BASE address */ + for (i = 0; i < cpuinfo.icache_size; + i += cpuinfo.icache_line) + __invalidate_icache(i); + + __enable_icache(); + local_irq_restore(flags); + } +} + +void __invalidate_icache_range(unsigned long start, unsigned long end) +{ + unsigned int i; + unsigned flags; + unsigned int align; + + if (cpuinfo.use_icache) { + /* + * No need to cover entire cache range, + * just cover cache footprint + */ + end = min(start + cpuinfo.icache_size, end); + align = ~(cpuinfo.icache_line - 1); + start &= align; /* Make sure we are aligned */ + /* Push end up to the next cache line */ + end = ((end & align) + cpuinfo.icache_line); + + local_irq_save(flags); + __disable_icache(); + + for (i = start; i < end; i += cpuinfo.icache_line) + __invalidate_icache(i); + + __enable_icache(); + local_irq_restore(flags); + } +} + +void __invalidate_icache_page(struct vm_area_struct *vma, struct page *page) +{ + __invalidate_icache_all(); +} + +void __invalidate_icache_user_range(struct vm_area_struct *vma, + struct page *page, unsigned long adr, + int len) +{ + __invalidate_icache_all(); +} + +void __invalidate_cache_sigtramp(unsigned long addr) +{ + __invalidate_icache_range(addr, addr + 8); +} + +void __invalidate_dcache_all(void) +{ + unsigned int i; + unsigned flags; + + if (cpuinfo.use_dcache) { + local_irq_save(flags); + __disable_dcache(); + + /* + * Just loop through cache size and invalidate, + * no need to add CACHE_BASE address + */ + for (i = 0; i < cpuinfo.dcache_size; + i += cpuinfo.dcache_line) + __invalidate_dcache(i); + + __enable_dcache(); + local_irq_restore(flags); + } +} + +void __invalidate_dcache_range(unsigned long start, unsigned long end) +{ + unsigned int i; + unsigned flags; + unsigned int align; + + if (cpuinfo.use_dcache) { + /* + * No need to cover entire cache range, + * just cover cache footprint + */ + end = min(start + cpuinfo.dcache_size, end); + align = ~(cpuinfo.dcache_line - 1); + start &= align; /* Make sure we are aligned */ + /* Push end up to the next cache line */ + end = ((end & align) + cpuinfo.dcache_line); + local_irq_save(flags); + __disable_dcache(); + + for (i = start; i < end; i += cpuinfo.dcache_line) + __invalidate_dcache(i); + + __enable_dcache(); + local_irq_restore(flags); + } +} + +void __invalidate_dcache_page(struct vm_area_struct *vma, struct page *page) +{ + __invalidate_dcache_all(); +} + +void __invalidate_dcache_user_range(struct vm_area_struct *vma, + struct page *page, unsigned long adr, + int len) +{ + __invalidate_dcache_all(); +} -- cgit v0.10.2 From 7fbd3232082908e2a50c6776f4779b79085161fa Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:16 +0100 Subject: microblaze_v8: Generic dts file for platforms Reviewed-by: Ingo Molnar Reviewed-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/platform/generic/system.dts b/arch/microblaze/platform/generic/system.dts new file mode 100644 index 0000000..29993f6 --- /dev/null +++ b/arch/microblaze/platform/generic/system.dts @@ -0,0 +1,332 @@ +/* + * Device Tree Generator version: 1.1 + * + * (C) Copyright 2007-2008 Xilinx, Inc. + * (C) Copyright 2007-2009 Michal Simek + * + * Michal SIMEK + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * CAUTION: This file is automatically generated by libgen. + * Version: Xilinx EDK 10.1.03 EDK_K_SP3.6 + * + * XPS project directory: Xilinx-ML505-ll_temac-sgdma-MMU-FDT-edk101 + */ + +/dts-v1/; +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "xlnx,microblaze"; + model = "testing"; + DDR2_SDRAM: memory@90000000 { + device_type = "memory"; + reg = < 0x90000000 0x10000000 >; + } ; + chosen { + bootargs = "console=ttyUL0,115200 highres=on"; + linux,stdout-path = "/plb@0/serial@84000000"; + } ; + cpus { + #address-cells = <1>; + #cpus = <0x1>; + #size-cells = <0>; + microblaze_0: cpu@0 { + clock-frequency = <125000000>; + compatible = "xlnx,microblaze-7.10.d"; + d-cache-baseaddr = <0x90000000>; + d-cache-highaddr = <0x9fffffff>; + d-cache-line-size = <0x10>; + d-cache-size = <0x2000>; + device_type = "cpu"; + i-cache-baseaddr = <0x90000000>; + i-cache-highaddr = <0x9fffffff>; + i-cache-line-size = <0x10>; + i-cache-size = <0x2000>; + model = "microblaze,7.10.d"; + reg = <0>; + timebase-frequency = <125000000>; + xlnx,addr-tag-bits = <0xf>; + xlnx,allow-dcache-wr = <0x1>; + xlnx,allow-icache-wr = <0x1>; + xlnx,area-optimized = <0x0>; + xlnx,cache-byte-size = <0x2000>; + xlnx,d-lmb = <0x1>; + xlnx,d-opb = <0x0>; + xlnx,d-plb = <0x1>; + xlnx,data-size = <0x20>; + xlnx,dcache-addr-tag = <0xf>; + xlnx,dcache-always-used = <0x1>; + xlnx,dcache-byte-size = <0x2000>; + xlnx,dcache-line-len = <0x4>; + xlnx,dcache-use-fsl = <0x1>; + xlnx,debug-enabled = <0x1>; + xlnx,div-zero-exception = <0x1>; + xlnx,dopb-bus-exception = <0x0>; + xlnx,dynamic-bus-sizing = <0x1>; + xlnx,edge-is-positive = <0x1>; + xlnx,family = "virtex5"; + xlnx,fpu-exception = <0x1>; + xlnx,fsl-data-size = <0x20>; + xlnx,fsl-exception = <0x0>; + xlnx,fsl-links = <0x0>; + xlnx,i-lmb = <0x1>; + xlnx,i-opb = <0x0>; + xlnx,i-plb = <0x1>; + xlnx,icache-always-used = <0x1>; + xlnx,icache-line-len = <0x4>; + xlnx,icache-use-fsl = <0x1>; + xlnx,ill-opcode-exception = <0x1>; + xlnx,instance = "microblaze_0"; + xlnx,interconnect = <0x1>; + xlnx,interrupt-is-edge = <0x0>; + xlnx,iopb-bus-exception = <0x0>; + xlnx,mmu-dtlb-size = <0x4>; + xlnx,mmu-itlb-size = <0x2>; + xlnx,mmu-tlb-access = <0x3>; + xlnx,mmu-zones = <0x10>; + xlnx,number-of-pc-brk = <0x1>; + xlnx,number-of-rd-addr-brk = <0x0>; + xlnx,number-of-wr-addr-brk = <0x0>; + xlnx,opcode-0x0-illegal = <0x1>; + xlnx,pvr = <0x2>; + xlnx,pvr-user1 = <0x0>; + xlnx,pvr-user2 = <0x0>; + xlnx,reset-msr = <0x0>; + xlnx,sco = <0x0>; + xlnx,unaligned-exceptions = <0x1>; + xlnx,use-barrel = <0x1>; + xlnx,use-dcache = <0x1>; + xlnx,use-div = <0x1>; + xlnx,use-ext-brk = <0x1>; + xlnx,use-ext-nm-brk = <0x1>; + xlnx,use-extended-fsl-instr = <0x0>; + xlnx,use-fpu = <0x2>; + xlnx,use-hw-mul = <0x2>; + xlnx,use-icache = <0x1>; + xlnx,use-interrupt = <0x1>; + xlnx,use-mmu = <0x3>; + xlnx,use-msr-instr = <0x1>; + xlnx,use-pcmp-instr = <0x1>; + } ; + } ; + mb_plb: plb@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "xlnx,plb-v46-1.03.a", "simple-bus"; + ranges ; + FLASH: flash@a0000000 { + bank-width = <2>; + compatible = "xlnx,xps-mch-emc-2.00.a", "cfi-flash"; + reg = < 0xa0000000 0x2000000 >; + xlnx,family = "virtex5"; + xlnx,include-datawidth-matching-0 = <0x1>; + xlnx,include-datawidth-matching-1 = <0x0>; + xlnx,include-datawidth-matching-2 = <0x0>; + xlnx,include-datawidth-matching-3 = <0x0>; + xlnx,include-negedge-ioregs = <0x0>; + xlnx,include-plb-ipif = <0x1>; + xlnx,include-wrbuf = <0x1>; + xlnx,max-mem-width = <0x10>; + xlnx,mch-native-dwidth = <0x20>; + xlnx,mch-plb-clk-period-ps = <0x1f40>; + xlnx,mch-splb-awidth = <0x20>; + xlnx,mch0-accessbuf-depth = <0x10>; + xlnx,mch0-protocol = <0x0>; + xlnx,mch0-rddatabuf-depth = <0x10>; + xlnx,mch1-accessbuf-depth = <0x10>; + xlnx,mch1-protocol = <0x0>; + xlnx,mch1-rddatabuf-depth = <0x10>; + xlnx,mch2-accessbuf-depth = <0x10>; + xlnx,mch2-protocol = <0x0>; + xlnx,mch2-rddatabuf-depth = <0x10>; + xlnx,mch3-accessbuf-depth = <0x10>; + xlnx,mch3-protocol = <0x0>; + xlnx,mch3-rddatabuf-depth = <0x10>; + xlnx,mem0-width = <0x10>; + xlnx,mem1-width = <0x20>; + xlnx,mem2-width = <0x20>; + xlnx,mem3-width = <0x20>; + xlnx,num-banks-mem = <0x1>; + xlnx,num-channels = <0x0>; + xlnx,priority-mode = <0x0>; + xlnx,synch-mem-0 = <0x0>; + xlnx,synch-mem-1 = <0x0>; + xlnx,synch-mem-2 = <0x0>; + xlnx,synch-mem-3 = <0x0>; + xlnx,synch-pipedelay-0 = <0x2>; + xlnx,synch-pipedelay-1 = <0x2>; + xlnx,synch-pipedelay-2 = <0x2>; + xlnx,synch-pipedelay-3 = <0x2>; + xlnx,tavdv-ps-mem-0 = <0x1adb0>; + xlnx,tavdv-ps-mem-1 = <0x3a98>; + xlnx,tavdv-ps-mem-2 = <0x3a98>; + xlnx,tavdv-ps-mem-3 = <0x3a98>; + xlnx,tcedv-ps-mem-0 = <0x1adb0>; + xlnx,tcedv-ps-mem-1 = <0x3a98>; + xlnx,tcedv-ps-mem-2 = <0x3a98>; + xlnx,tcedv-ps-mem-3 = <0x3a98>; + xlnx,thzce-ps-mem-0 = <0x88b8>; + xlnx,thzce-ps-mem-1 = <0x1b58>; + xlnx,thzce-ps-mem-2 = <0x1b58>; + xlnx,thzce-ps-mem-3 = <0x1b58>; + xlnx,thzoe-ps-mem-0 = <0x1b58>; + xlnx,thzoe-ps-mem-1 = <0x1b58>; + xlnx,thzoe-ps-mem-2 = <0x1b58>; + xlnx,thzoe-ps-mem-3 = <0x1b58>; + xlnx,tlzwe-ps-mem-0 = <0x88b8>; + xlnx,tlzwe-ps-mem-1 = <0x0>; + xlnx,tlzwe-ps-mem-2 = <0x0>; + xlnx,tlzwe-ps-mem-3 = <0x0>; + xlnx,twc-ps-mem-0 = <0x2af8>; + xlnx,twc-ps-mem-1 = <0x3a98>; + xlnx,twc-ps-mem-2 = <0x3a98>; + xlnx,twc-ps-mem-3 = <0x3a98>; + xlnx,twp-ps-mem-0 = <0x11170>; + xlnx,twp-ps-mem-1 = <0x2ee0>; + xlnx,twp-ps-mem-2 = <0x2ee0>; + xlnx,twp-ps-mem-3 = <0x2ee0>; + xlnx,xcl0-linesize = <0x4>; + xlnx,xcl0-writexfer = <0x1>; + xlnx,xcl1-linesize = <0x4>; + xlnx,xcl1-writexfer = <0x1>; + xlnx,xcl2-linesize = <0x4>; + xlnx,xcl2-writexfer = <0x1>; + xlnx,xcl3-linesize = <0x4>; + xlnx,xcl3-writexfer = <0x1>; + } ; + Hard_Ethernet_MAC: xps-ll-temac@81c00000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "xlnx,compound"; + ethernet@81c00000 { + compatible = "xlnx,xps-ll-temac-1.01.b"; + device_type = "network"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 5 2 >; + llink-connected = <&PIM3>; + local-mac-address = [ 02 00 00 00 00 00 ]; + reg = < 0x81c00000 0x40 >; + xlnx,bus2core-clk-ratio = <0x1>; + xlnx,phy-type = <0x1>; + xlnx,phyaddr = <0x1>; + xlnx,rxcsum = <0x0>; + xlnx,rxfifo = <0x1000>; + xlnx,temac-type = <0x0>; + xlnx,txcsum = <0x0>; + xlnx,txfifo = <0x1000>; + } ; + } ; + IIC_EEPROM: i2c@81600000 { + compatible = "xlnx,xps-iic-2.00.a"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 6 2 >; + reg = < 0x81600000 0x10000 >; + xlnx,clk-freq = <0x7735940>; + xlnx,family = "virtex5"; + xlnx,gpo-width = <0x1>; + xlnx,iic-freq = <0x186a0>; + xlnx,scl-inertial-delay = <0x0>; + xlnx,sda-inertial-delay = <0x0>; + xlnx,ten-bit-adr = <0x0>; + } ; + LEDs_8Bit: gpio@81400000 { + compatible = "xlnx,xps-gpio-1.00.a"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 7 2 >; + reg = < 0x81400000 0x10000 >; + xlnx,all-inputs = <0x0>; + xlnx,all-inputs-2 = <0x0>; + xlnx,dout-default = <0x0>; + xlnx,dout-default-2 = <0x0>; + xlnx,family = "virtex5"; + xlnx,gpio-width = <0x8>; + xlnx,interrupt-present = <0x1>; + xlnx,is-bidir = <0x1>; + xlnx,is-bidir-2 = <0x1>; + xlnx,is-dual = <0x0>; + xlnx,tri-default = <0xffffffff>; + xlnx,tri-default-2 = <0xffffffff>; + } ; + RS232_Uart_1: serial@84000000 { + clock-frequency = <125000000>; + compatible = "xlnx,xps-uartlite-1.00.a"; + current-speed = <115200>; + device_type = "serial"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 8 0 >; + port-number = <0>; + reg = < 0x84000000 0x10000 >; + xlnx,baudrate = <0x1c200>; + xlnx,data-bits = <0x8>; + xlnx,family = "virtex5"; + xlnx,odd-parity = <0x0>; + xlnx,use-parity = <0x0>; + } ; + SysACE_CompactFlash: sysace@83600000 { + compatible = "xlnx,xps-sysace-1.00.a"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 4 2 >; + reg = < 0x83600000 0x10000 >; + xlnx,family = "virtex5"; + xlnx,mem-width = <0x10>; + } ; + debug_module: debug@84400000 { + compatible = "xlnx,mdm-1.00.d"; + reg = < 0x84400000 0x10000 >; + xlnx,family = "virtex5"; + xlnx,interconnect = <0x1>; + xlnx,jtag-chain = <0x2>; + xlnx,mb-dbg-ports = <0x1>; + xlnx,uart-width = <0x8>; + xlnx,use-uart = <0x1>; + xlnx,write-fsl-ports = <0x0>; + } ; + mpmc@90000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "xlnx,mpmc-4.02.a"; + PIM3: sdma@84600180 { + compatible = "xlnx,ll-dma-1.00.a"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 2 2 1 2 >; + reg = < 0x84600180 0x80 >; + } ; + } ; + xps_intc_0: interrupt-controller@81800000 { + #interrupt-cells = <0x2>; + compatible = "xlnx,xps-intc-1.00.a"; + interrupt-controller ; + reg = < 0x81800000 0x10000 >; + xlnx,kind-of-intr = <0x100>; + xlnx,num-intr-inputs = <0x9>; + } ; + xps_timer_1: timer@83c00000 { + compatible = "xlnx,xps-timer-1.00.a"; + interrupt-parent = <&xps_intc_0>; + interrupts = < 3 2 >; + reg = < 0x83c00000 0x10000 >; + xlnx,count-width = <0x20>; + xlnx,family = "virtex5"; + xlnx,gen0-assert = <0x1>; + xlnx,gen1-assert = <0x1>; + xlnx,one-timer-only = <0x0>; + xlnx,trig0-assert = <0x1>; + xlnx,trig1-assert = <0x1>; + } ; + } ; +} ; -- cgit v0.10.2 From f6b165c6ae540c607a9a62427f1b25bc5743c0aa Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:17 +0100 Subject: microblaze_v8: kernel modules support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/module.h b/arch/microblaze/include/asm/module.h new file mode 100644 index 0000000..914565a --- /dev/null +++ b/arch/microblaze/include/asm/module.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_MODULE_H +#define _ASM_MICROBLAZE_MODULE_H + +/* Microblaze Relocations */ +#define R_MICROBLAZE_NONE 0 +#define R_MICROBLAZE_32 1 +#define R_MICROBLAZE_32_PCREL 2 +#define R_MICROBLAZE_64_PCREL 3 +#define R_MICROBLAZE_32_PCREL_LO 4 +#define R_MICROBLAZE_64 5 +#define R_MICROBLAZE_32_LO 6 +#define R_MICROBLAZE_SRO32 7 +#define R_MICROBLAZE_SRW32 8 +#define R_MICROBLAZE_64_NONE 9 +#define R_MICROBLAZE_32_SYM_OP_SYM 10 +/* Keep this the last entry. */ +#define R_MICROBLAZE_NUM 11 + +struct mod_arch_specific { + int foo; +}; + +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Ehdr Elf32_Ehdr + +typedef struct { volatile int counter; } module_t; + +#endif /* _ASM_MICROBLAZE_MODULE_H */ diff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c new file mode 100644 index 0000000..5f71790 --- /dev/null +++ b/arch/microblaze/kernel/microblaze_ksyms.c @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/* + * libgcc functions - functions that are used internally by the + * compiler... (prototypes are not correct though, but that + * doesn't really matter since they're not versioned). + */ +extern void __ashldi3(void); +EXPORT_SYMBOL(__ashldi3); +extern void __ashrdi3(void); +EXPORT_SYMBOL(__ashrdi3); +extern void __divsi3(void); +EXPORT_SYMBOL(__divsi3); +extern void __lshrdi3(void); +EXPORT_SYMBOL(__lshrdi3); +extern void __modsi3(void); +EXPORT_SYMBOL(__modsi3); +extern void __mulsi3(void); +EXPORT_SYMBOL(__mulsi3); +extern void __muldi3(void); +EXPORT_SYMBOL(__muldi3); +extern void __ucmpdi2(void); +EXPORT_SYMBOL(__ucmpdi2); +extern void __udivsi3(void); +EXPORT_SYMBOL(__udivsi3); +extern void __umodsi3(void); +EXPORT_SYMBOL(__umodsi3); diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c new file mode 100644 index 0000000..5141417 --- /dev/null +++ b/arch/microblaze/kernel/module.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +void *module_alloc(unsigned long size) +{ + void *ret; + ret = (size == 0) ? NULL : vmalloc(size); + pr_debug("module_alloc (%08lx@%08lx)\n", size, (unsigned long int)ret); + return ret; +} + +void module_free(struct module *module, void *region) +{ + pr_debug("module_free(%s,%08lx)\n", module->name, + (unsigned long)region); + vfree(region); +} + +int module_frob_arch_sections(Elf_Ehdr *hdr, + Elf_Shdr *sechdrs, + char *secstrings, + struct module *mod) +{ + return 0; +} + +int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, + unsigned int symindex, unsigned int relsec, struct module *module) +{ + printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", + module->name); + return -ENOEXEC; +} + +int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, + unsigned int symindex, unsigned int relsec, struct module *module) +{ + + unsigned int i; + Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr; + Elf32_Sym *sym; + unsigned long int *location; + unsigned long int locoffs; + unsigned long int value; +#if __GNUC__ < 4 + unsigned long int old_value; +#endif + + pr_debug("Applying add relocation section %u to %u\n", + relsec, sechdrs[relsec].sh_info); + + for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) { + + location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + + rela[i].r_offset; + sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + + ELF32_R_SYM(rela[i].r_info); + value = sym->st_value + rela[i].r_addend; + + switch (ELF32_R_TYPE(rela[i].r_info)) { + + /* + * Be careful! mb-gcc / mb-ld splits the relocs between the + * text and the reloc table. In general this means we must + * read the current contents of (*location), add any offset + * then store the result back in + */ + + case R_MICROBLAZE_32: +#if __GNUC__ < 4 + old_value = *location; + *location = value + old_value; + + pr_debug("R_MICROBLAZE_32 (%08lx->%08lx)\n", + old_value, value); +#else + *location = value; +#endif + break; + + case R_MICROBLAZE_64: +#if __GNUC__ < 4 + /* Split relocs only required/used pre gcc4.1.1 */ + old_value = ((location[0] & 0x0000FFFF) << 16) | + (location[1] & 0x0000FFFF); + value += old_value; +#endif + location[0] = (location[0] & 0xFFFF0000) | + (value >> 16); + location[1] = (location[1] & 0xFFFF0000) | + (value & 0xFFFF); +#if __GNUC__ < 4 + pr_debug("R_MICROBLAZE_64 (%08lx->%08lx)\n", + old_value, value); +#endif + break; + + case R_MICROBLAZE_64_PCREL: + locoffs = (location[0] & 0xFFFF) << 16 | + (location[1] & 0xFFFF); + value -= (unsigned long int)(location) + 4 + + locoffs; + location[0] = (location[0] & 0xFFFF0000) | + (value >> 16); + location[1] = (location[1] & 0xFFFF0000) | + (value & 0xFFFF); + pr_debug("R_MICROBLAZE_64_PCREL (%08lx)\n", + value); + break; + + case R_MICROBLAZE_NONE: + pr_debug("R_MICROBLAZE_NONE\n"); + break; + + default: + printk(KERN_ERR "module %s: " + "Unknown relocation: %u\n", + module->name, + ELF32_R_TYPE(rela->r_info)); + return -ENOEXEC; + } + } + return 0; +} + +int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, + struct module *module) +{ + return 0; +} + +void module_arch_cleanup(struct module *mod) +{ +} -- cgit v0.10.2 From 93139b1cf85924a3cc758c9a83b8c7b689987729 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:18 +0100 Subject: microblaze_v8: lmb include file Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/lmb.h b/arch/microblaze/include/asm/lmb.h new file mode 100644 index 0000000..a0a0a92 --- /dev/null +++ b/arch/microblaze/include/asm/lmb.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2008 Michal Simek + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_LMB_H +#define _ASM_MICROBLAZE_LMB_H + +/* LMB limit is OFF */ +#define LMB_REAL_LIMIT 0xFFFFFFFF + +#endif /* _ASM_MICROBLAZE_LMB_H */ + + -- cgit v0.10.2 From b0c62724a52a4f541bfe77c678a0229d7a7c6844 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:18 +0100 Subject: microblaze_v8: PVR support, cpuinfo support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/pvr.h b/arch/microblaze/include/asm/pvr.h new file mode 100644 index 0000000..66f1b30 --- /dev/null +++ b/arch/microblaze/include/asm/pvr.h @@ -0,0 +1,209 @@ +/* + * Support for the MicroBlaze PVR (Processor Version Register) + * + * Copyright (C) 2009 Michal Simek + * Copyright (C) 2007 John Williams + * Copyright (C) 2007 - 2009 PetaLogix + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_PVR_H +#define _ASM_MICROBLAZE_PVR_H + +#define PVR_MSR_BIT 0x400 + +struct pvr_s { + unsigned pvr[16]; +}; + +/* The following taken from Xilinx's standalone BSP pvr.h */ + +/* Basic PVR mask */ +#define PVR0_PVR_FULL_MASK 0x80000000 +#define PVR0_USE_BARREL_MASK 0x40000000 +#define PVR0_USE_DIV_MASK 0x20000000 +#define PVR0_USE_HW_MUL_MASK 0x10000000 +#define PVR0_USE_FPU_MASK 0x08000000 +#define PVR0_USE_EXC_MASK 0x04000000 +#define PVR0_USE_ICACHE_MASK 0x02000000 +#define PVR0_USE_DCACHE_MASK 0x01000000 +#define PVR0_USE_MMU 0x00800000 /* new */ +#define PVR0_VERSION_MASK 0x0000FF00 +#define PVR0_USER1_MASK 0x000000FF + +/* User 2 PVR mask */ +#define PVR1_USER2_MASK 0xFFFFFFFF + +/* Configuration PVR masks */ +#define PVR2_D_OPB_MASK 0x80000000 +#define PVR2_D_LMB_MASK 0x40000000 +#define PVR2_I_OPB_MASK 0x20000000 +#define PVR2_I_LMB_MASK 0x10000000 +#define PVR2_INTERRUPT_IS_EDGE_MASK 0x08000000 +#define PVR2_EDGE_IS_POSITIVE_MASK 0x04000000 +#define PVR2_D_PLB_MASK 0x02000000 /* new */ +#define PVR2_I_PLB_MASK 0x01000000 /* new */ +#define PVR2_INTERCONNECT 0x00800000 /* new */ +#define PVR2_USE_EXTEND_FSL 0x00080000 /* new */ +#define PVR2_USE_FSL_EXC 0x00040000 /* new */ +#define PVR2_USE_MSR_INSTR 0x00020000 +#define PVR2_USE_PCMP_INSTR 0x00010000 +#define PVR2_AREA_OPTIMISED 0x00008000 +#define PVR2_USE_BARREL_MASK 0x00004000 +#define PVR2_USE_DIV_MASK 0x00002000 +#define PVR2_USE_HW_MUL_MASK 0x00001000 +#define PVR2_USE_FPU_MASK 0x00000800 +#define PVR2_USE_MUL64_MASK 0x00000400 +#define PVR2_USE_FPU2_MASK 0x00000200 /* new */ +#define PVR2_USE_IPLBEXC 0x00000100 +#define PVR2_USE_DPLBEXC 0x00000080 +#define PVR2_OPCODE_0x0_ILL_MASK 0x00000040 +#define PVR2_UNALIGNED_EXC_MASK 0x00000020 +#define PVR2_ILL_OPCODE_EXC_MASK 0x00000010 +#define PVR2_IOPB_BUS_EXC_MASK 0x00000008 +#define PVR2_DOPB_BUS_EXC_MASK 0x00000004 +#define PVR2_DIV_ZERO_EXC_MASK 0x00000002 +#define PVR2_FPU_EXC_MASK 0x00000001 + +/* Debug and exception PVR masks */ +#define PVR3_DEBUG_ENABLED_MASK 0x80000000 +#define PVR3_NUMBER_OF_PC_BRK_MASK 0x1E000000 +#define PVR3_NUMBER_OF_RD_ADDR_BRK_MASK 0x00380000 +#define PVR3_NUMBER_OF_WR_ADDR_BRK_MASK 0x0000E000 +#define PVR3_FSL_LINKS_MASK 0x00000380 + +/* ICache config PVR masks */ +#define PVR4_USE_ICACHE_MASK 0x80000000 +#define PVR4_ICACHE_ADDR_TAG_BITS_MASK 0x7C000000 +#define PVR4_ICACHE_USE_FSL_MASK 0x02000000 +#define PVR4_ICACHE_ALLOW_WR_MASK 0x01000000 +#define PVR4_ICACHE_LINE_LEN_MASK 0x00E00000 +#define PVR4_ICACHE_BYTE_SIZE_MASK 0x001F0000 + +/* DCache config PVR masks */ +#define PVR5_USE_DCACHE_MASK 0x80000000 +#define PVR5_DCACHE_ADDR_TAG_BITS_MASK 0x7C000000 +#define PVR5_DCACHE_USE_FSL_MASK 0x02000000 +#define PVR5_DCACHE_ALLOW_WR_MASK 0x01000000 +#define PVR5_DCACHE_LINE_LEN_MASK 0x00E00000 +#define PVR5_DCACHE_BYTE_SIZE_MASK 0x001F0000 + +/* ICache base address PVR mask */ +#define PVR6_ICACHE_BASEADDR_MASK 0xFFFFFFFF + +/* ICache high address PVR mask */ +#define PVR7_ICACHE_HIGHADDR_MASK 0xFFFFFFFF + +/* DCache base address PVR mask */ +#define PVR8_DCACHE_BASEADDR_MASK 0xFFFFFFFF + +/* DCache high address PVR mask */ +#define PVR9_DCACHE_HIGHADDR_MASK 0xFFFFFFFF + +/* Target family PVR mask */ +#define PVR10_TARGET_FAMILY_MASK 0xFF000000 + +/* MMU descrtiption */ +#define PVR11_USE_MMU 0xC0000000 +#define PVR11_MMU_ITLB_SIZE 0x38000000 +#define PVR11_MMU_DTLB_SIZE 0x07000000 +#define PVR11_MMU_TLB_ACCESS 0x00C00000 +#define PVR11_MMU_ZONES 0x003C0000 +/* MSR Reset value PVR mask */ +#define PVR11_MSR_RESET_VALUE_MASK 0x000007FF + + +/* PVR access macros */ +#define PVR_IS_FULL(pvr) (pvr.pvr[0] & PVR0_PVR_FULL_MASK) +#define PVR_USE_BARREL(pvr) (pvr.pvr[0] & PVR0_USE_BARREL_MASK) +#define PVR_USE_DIV(pvr) (pvr.pvr[0] & PVR0_USE_DIV_MASK) +#define PVR_USE_HW_MUL(pvr) (pvr.pvr[0] & PVR0_USE_HW_MUL_MASK) +#define PVR_USE_FPU(pvr) (pvr.pvr[0] & PVR0_USE_FPU_MASK) +#define PVR_USE_FPU2(pvr) (pvr.pvr[2] & PVR2_USE_FPU2_MASK) +#define PVR_USE_ICACHE(pvr) (pvr.pvr[0] & PVR0_USE_ICACHE_MASK) +#define PVR_USE_DCACHE(pvr) (pvr.pvr[0] & PVR0_USE_DCACHE_MASK) +#define PVR_VERSION(pvr) ((pvr.pvr[0] & PVR0_VERSION_MASK) >> 8) +#define PVR_USER1(pvr) (pvr.pvr[0] & PVR0_USER1_MASK) +#define PVR_USER2(pvr) (pvr.pvr[1] & PVR1_USER2_MASK) + +#define PVR_D_OPB(pvr) (pvr.pvr[2] & PVR2_D_OPB_MASK) +#define PVR_D_LMB(pvr) (pvr.pvr[2] & PVR2_D_LMB_MASK) +#define PVR_I_OPB(pvr) (pvr.pvr[2] & PVR2_I_OPB_MASK) +#define PVR_I_LMB(pvr) (pvr.pvr[2] & PVR2_I_LMB_MASK) +#define PVR_INTERRUPT_IS_EDGE(pvr) \ + (pvr.pvr[2] & PVR2_INTERRUPT_IS_EDGE_MASK) +#define PVR_EDGE_IS_POSITIVE(pvr) \ + (pvr.pvr[2] & PVR2_EDGE_IS_POSITIVE_MASK) +#define PVR_USE_MSR_INSTR(pvr) (pvr.pvr[2] & PVR2_USE_MSR_INSTR) +#define PVR_USE_PCMP_INSTR(pvr) (pvr.pvr[2] & PVR2_USE_PCMP_INSTR) +#define PVR_AREA_OPTIMISED(pvr) (pvr.pvr[2] & PVR2_AREA_OPTIMISED) +#define PVR_USE_MUL64(pvr) (pvr.pvr[2] & PVR2_USE_MUL64_MASK) +#define PVR_OPCODE_0x0_ILLEGAL(pvr) \ + (pvr.pvr[2] & PVR2_OPCODE_0x0_ILL_MASK) +#define PVR_UNALIGNED_EXCEPTION(pvr) \ + (pvr.pvr[2] & PVR2_UNALIGNED_EXC_MASK) +#define PVR_ILL_OPCODE_EXCEPTION(pvr) \ + (pvr.pvr[2] & PVR2_ILL_OPCODE_EXC_MASK) +#define PVR_IOPB_BUS_EXCEPTION(pvr) \ + (pvr.pvr[2] & PVR2_IOPB_BUS_EXC_MASK) +#define PVR_DOPB_BUS_EXCEPTION(pvr) \ + (pvr.pvr[2] & PVR2_DOPB_BUS_EXC_MASK) +#define PVR_DIV_ZERO_EXCEPTION(pvr) \ + (pvr.pvr[2] & PVR2_DIV_ZERO_EXC_MASK) +#define PVR_FPU_EXCEPTION(pvr) (pvr.pvr[2] & PVR2_FPU_EXC_MASK) +#define PVR_FSL_EXCEPTION(pvr) (pvr.pvr[2] & PVR2_USE_EXTEND_FSL) + +#define PVR_DEBUG_ENABLED(pvr) (pvr.pvr[3] & PVR3_DEBUG_ENABLED_MASK) +#define PVR_NUMBER_OF_PC_BRK(pvr) \ + ((pvr.pvr[3] & PVR3_NUMBER_OF_PC_BRK_MASK) >> 25) +#define PVR_NUMBER_OF_RD_ADDR_BRK(pvr) \ + ((pvr.pvr[3] & PVR3_NUMBER_OF_RD_ADDR_BRK_MASK) >> 19) +#define PVR_NUMBER_OF_WR_ADDR_BRK(pvr) \ + ((pvr.pvr[3] & PVR3_NUMBER_OF_WR_ADDR_BRK_MASK) >> 13) +#define PVR_FSL_LINKS(pvr) ((pvr.pvr[3] & PVR3_FSL_LINKS_MASK) >> 7) + +#define PVR_ICACHE_ADDR_TAG_BITS(pvr) \ + ((pvr.pvr[4] & PVR4_ICACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_ICACHE_USE_FSL(pvr) (pvr.pvr[4] & PVR4_ICACHE_USE_FSL_MASK) +#define PVR_ICACHE_ALLOW_WR(pvr) (pvr.pvr[4] & PVR4_ICACHE_ALLOW_WR_MASK) +#define PVR_ICACHE_LINE_LEN(pvr) \ + (1 << ((pvr.pvr[4] & PVR4_ICACHE_LINE_LEN_MASK) >> 21)) +#define PVR_ICACHE_BYTE_SIZE(pvr) \ + (1 << ((pvr.pvr[4] & PVR4_ICACHE_BYTE_SIZE_MASK) >> 16)) + +#define PVR_DCACHE_ADDR_TAG_BITS(pvr) \ + ((pvr.pvr[5] & PVR5_DCACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_DCACHE_USE_FSL(pvr) (pvr.pvr[5] & PVR5_DCACHE_USE_FSL_MASK) +#define PVR_DCACHE_ALLOW_WR(pvr) (pvr.pvr[5] & PVR5_DCACHE_ALLOW_WR_MASK) +#define PVR_DCACHE_LINE_LEN(pvr) \ + (1 << ((pvr.pvr[5] & PVR5_DCACHE_LINE_LEN_MASK) >> 21)) +#define PVR_DCACHE_BYTE_SIZE(pvr) \ + (1 << ((pvr.pvr[5] & PVR5_DCACHE_BYTE_SIZE_MASK) >> 16)) + + +#define PVR_ICACHE_BASEADDR(pvr) (pvr.pvr[6] & PVR6_ICACHE_BASEADDR_MASK) +#define PVR_ICACHE_HIGHADDR(pvr) (pvr.pvr[7] & PVR7_ICACHE_HIGHADDR_MASK) + +#define PVR_DCACHE_BASEADDR(pvr) (pvr.pvr[8] & PVR8_DCACHE_BASEADDR_MASK) +#define PVR_DCACHE_HIGHADDR(pvr) (pvr.pvr[9] & PVR9_DCACHE_HIGHADDR_MASK) + +#define PVR_TARGET_FAMILY(pvr) ((pvr.pvr[10] & PVR10_TARGET_FAMILY_MASK) >> 24) + +#define PVR_MSR_RESET_VALUE(pvr) \ + (pvr.pvr[11] & PVR11_MSR_RESET_VALUE_MASK) + +/* mmu */ +#define PVR_USE_MMU(pvr) ((pvr.pvr[11] & PVR11_USE_MMU) >> 30) +#define PVR_MMU_ITLB_SIZE(pvr) (pvr.pvr[11] & PVR11_MMU_ITLB_SIZE) +#define PVR_MMU_DTLB_SIZE(pvr) (pvr.pvr[11] & PVR11_MMU_DTLB_SIZE) +#define PVR_MMU_TLB_ACCESS(pvr) (pvr.pvr[11] & PVR11_MMU_TLB_ACCESS) +#define PVR_MMU_ZONES(pvr) (pvr.pvr[11] & PVR11_MMU_ZONES) + + +int cpu_has_pvr(void); +void get_pvr(struct pvr_s *pvr); + +#endif /* _ASM_MICROBLAZE_PVR_H */ diff --git a/arch/microblaze/kernel/cpu/mb.c b/arch/microblaze/kernel/cpu/mb.c new file mode 100644 index 0000000..3b6212b --- /dev/null +++ b/arch/microblaze/kernel/cpu/mb.c @@ -0,0 +1,148 @@ +/* + * CPU-version specific code + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2006-2009 PetaLogix + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int show_cpuinfo(struct seq_file *m, void *v) +{ + int count = 0; + char *fpga_family = "Unknown"; + char *cpu_ver = "Unknown"; + int i; + + /* Denormalised to get the fpga family string */ + for (i = 0; family_string_lookup[i].s != NULL; i++) { + if (cpuinfo.fpga_family_code == family_string_lookup[i].k) { + fpga_family = (char *)family_string_lookup[i].s; + break; + } + } + + /* Denormalised to get the hw version string */ + for (i = 0; cpu_ver_lookup[i].s != NULL; i++) { + if (cpuinfo.ver_code == cpu_ver_lookup[i].k) { + cpu_ver = (char *)cpu_ver_lookup[i].s; + break; + } + } + + count = seq_printf(m, + "CPU-Family: MicroBlaze\n" + "FPGA-Arch: %s\n" + "CPU-Ver: %s\n" + "CPU-MHz: %d.%02d\n" + "BogoMips: %lu.%02lu\n", + fpga_family, + cpu_ver, + cpuinfo.cpu_clock_freq / + 1000000, + cpuinfo.cpu_clock_freq % + 1000000, + loops_per_jiffy / (500000 / HZ), + (loops_per_jiffy / (5000 / HZ)) % 100); + + count += seq_printf(m, + "HW:\n Shift:\t\t%s\n" + " MSR:\t\t%s\n" + " PCMP:\t\t%s\n" + " DIV:\t\t%s\n", + (cpuinfo.use_instr & PVR0_USE_BARREL_MASK) ? "yes" : "no", + (cpuinfo.use_instr & PVR2_USE_MSR_INSTR) ? "yes" : "no", + (cpuinfo.use_instr & PVR2_USE_PCMP_INSTR) ? "yes" : "no", + (cpuinfo.use_instr & PVR0_USE_DIV_MASK) ? "yes" : "no"); + + count += seq_printf(m, + " MMU:\t\t%x\n", + cpuinfo.mmu); + + count += seq_printf(m, + " MUL:\t\t%s\n" + " FPU:\t\t%s\n", + (cpuinfo.use_mult & PVR2_USE_MUL64_MASK) ? "v2" : + (cpuinfo.use_mult & PVR0_USE_HW_MUL_MASK) ? "v1" : "no", + (cpuinfo.use_fpu & PVR2_USE_FPU2_MASK) ? "v2" : + (cpuinfo.use_fpu & PVR0_USE_FPU_MASK) ? "v1" : "no"); + + count += seq_printf(m, + " Exc:\t\t%s%s%s%s%s%s%s%s\n", + (cpuinfo.use_exc & PVR2_OPCODE_0x0_ILL_MASK) ? "op0x0 " : "", + (cpuinfo.use_exc & PVR2_UNALIGNED_EXC_MASK) ? "unal " : "", + (cpuinfo.use_exc & PVR2_ILL_OPCODE_EXC_MASK) ? "ill " : "", + (cpuinfo.use_exc & PVR2_IOPB_BUS_EXC_MASK) ? "iopb " : "", + (cpuinfo.use_exc & PVR2_DOPB_BUS_EXC_MASK) ? "dopb " : "", + (cpuinfo.use_exc & PVR2_DIV_ZERO_EXC_MASK) ? "zero " : "", + (cpuinfo.use_exc & PVR2_FPU_EXC_MASK) ? "fpu " : "", + (cpuinfo.use_exc & PVR2_USE_FSL_EXC) ? "fsl " : ""); + + if (cpuinfo.use_icache) + count += seq_printf(m, + "Icache:\t\t%ukB\n", + cpuinfo.icache_size >> 10); + else + count += seq_printf(m, "Icache:\t\tno\n"); + + if (cpuinfo.use_dcache) + count += seq_printf(m, + "Dcache:\t\t%ukB\n", + cpuinfo.dcache_size >> 10); + else + count += seq_printf(m, "Dcache:\t\tno\n"); + + count += seq_printf(m, + "HW-Debug:\t%s\n", + cpuinfo.hw_debug ? "yes" : "no"); + + count += seq_printf(m, + "PVR-USR1:\t%x\n" + "PVR-USR2:\t%x\n", + cpuinfo.pvr_user1, + cpuinfo.pvr_user2); + + return 0; +} + +static void *c_start(struct seq_file *m, loff_t *pos) +{ + int i = *pos; + + return i < NR_CPUS ? (void *) (i + 1) : NULL; +} + +static void *c_next(struct seq_file *m, void *v, loff_t *pos) +{ + ++*pos; + return c_start(m, pos); +} + +static void c_stop(struct seq_file *m, void *v) +{ +} + +const struct seq_operations cpuinfo_op = { + .start = c_start, + .next = c_next, + .stop = c_stop, + .show = show_cpuinfo, +}; diff --git a/arch/microblaze/kernel/cpu/pvr.c b/arch/microblaze/kernel/cpu/pvr.c new file mode 100644 index 0000000..c9a4340 --- /dev/null +++ b/arch/microblaze/kernel/cpu/pvr.c @@ -0,0 +1,81 @@ +/* + * Support for MicroBlaze PVR (processor version register) + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +/* + * Until we get an assembler that knows about the pvr registers, + * this horrible cruft will have to do. + * That hardcoded opcode is mfs r3, rpvrNN + */ + +#define get_single_pvr(pvrid, val) \ +{ \ + register unsigned tmp __asm__("r3"); \ + tmp = 0x0; /* Prevent warning about unused */ \ + __asm__ __volatile__ ( \ + ".byte 0x94,0x60,0xa0, " #pvrid "\n\t" \ + : "=r" (tmp) : : "memory"); \ + val = tmp; \ +} + +/* + * Does the CPU support the PVR register? + * return value: + * 0: no PVR + * 1: simple PVR + * 2: full PVR + * + * This must work on all CPU versions, including those before the + * PVR was even an option. + */ + +int cpu_has_pvr(void) +{ + unsigned flags; + unsigned pvr0; + + local_save_flags(flags); + + /* PVR bit in MSR tells us if there is any support */ + if (!(flags & PVR_MSR_BIT)) + return 0; + + get_single_pvr(0x00, pvr0); + pr_debug("%s: pvr0 is 0x%08x\n", __func__, pvr0); + + if (pvr0 & PVR0_PVR_FULL_MASK) + return 1; + + /* for partial PVR use static cpuinfo */ + return 2; +} + +void get_pvr(struct pvr_s *p) +{ + get_single_pvr(0, p->pvr[0]); + get_single_pvr(1, p->pvr[1]); + get_single_pvr(2, p->pvr[2]); + get_single_pvr(3, p->pvr[3]); + get_single_pvr(4, p->pvr[4]); + get_single_pvr(5, p->pvr[5]); + get_single_pvr(6, p->pvr[6]); + get_single_pvr(7, p->pvr[7]); + get_single_pvr(8, p->pvr[8]); + get_single_pvr(9, p->pvr[9]); + get_single_pvr(10, p->pvr[10]); + get_single_pvr(11, p->pvr[11]); +} -- cgit v0.10.2 From 2d43dab99a5387c9bac22fc92e88ae3754672e19 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:19 +0100 Subject: microblaze_v8: defconfig file Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/configs/nommu_defconfig b/arch/microblaze/configs/nommu_defconfig new file mode 100644 index 0000000..beb7ecd --- /dev/null +++ b/arch/microblaze/configs/nommu_defconfig @@ -0,0 +1,804 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.29 +# Tue Mar 24 10:23:20 2009 +# +CONFIG_MICROBLAZE=y +# CONFIG_SWAP is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_TIME=y +# CONFIG_GENERIC_TIME_VSYSCALL is not set +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +# CONFIG_PCI is not set +# CONFIG_NO_DMA is not set +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=17 +# CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_EMBEDDED=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_EXTRA_PASS=y +# CONFIG_HOTPLUG is not set +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +# CONFIG_BASE_FULL is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_COMPAT_BRK=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=1 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +# CONFIG_FREEZER is not set + +# +# Platform options +# +CONFIG_PLATFORM_GENERIC=y +# CONFIG_SELFMOD is not set +# CONFIG_OPT_LIB_FUNCTION is not set +# CONFIG_ALLOW_EDIT_AUTO is not set +CONFIG_KERNEL_BASE_ADDR=0x90000000 +CONFIG_XILINX_MICROBLAZE0_FAMILY="virtex5" +CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1 +CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1 +CONFIG_XILINX_MICROBLAZE0_USE_BARREL=1 +CONFIG_XILINX_MICROBLAZE0_USE_DIV=1 +CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL=2 +CONFIG_XILINX_MICROBLAZE0_USE_FPU=2 +CONFIG_XILINX_MICROBLAZE0_HW_VER="7.10.d" + +# +# Processor type and features +# +CONFIG_TICK_ONESHOT=y +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +CONFIG_HZ_100=y +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=100 +CONFIG_SCHED_HRTICK=y +# CONFIG_MMU is not set +CONFIG_NO_MMU=y + +# +# Boot options +# +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyUL0,115200" +# CONFIG_CMDLINE_FORCE is not set +CONFIG_OF=y +CONFIG_OF_DEVICE=y +CONFIG_PROC_DEVICETREE=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y + +# +# Exectuable file formats +# +CONFIG_BINFMT_FLAT=y +# CONFIG_BINFMT_ZFLAT is not set +# CONFIG_BINFMT_SHARED_FLAT is not set +# CONFIG_HAVE_AOUT is not set +# CONFIG_BINFMT_MISC is not set +CONFIG_NET=y + +# +# Networking options +# +CONFIG_COMPAT_NET_DEV_OPS=y +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y +# CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_LIB80211 is not set +# CONFIG_MAC80211 is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +# CONFIG_PREVENT_FIRMWARE_BUILD is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_TESTS is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_RAM=y +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_UCLINUX=y +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +CONFIG_BLK_DEV_NBD=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +# CONFIG_SCSI is not set +# CONFIG_SCSI_DMA is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +# CONFIG_PHYLIB is not set +CONFIG_NET_ETHERNET=y +# CONFIG_MII is not set +# CONFIG_DNET is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +CONFIG_NETDEV_1000=y +CONFIG_NETDEV_10000=y + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set +# CONFIG_PHONE is not set + +# +# Input device support +# +# CONFIG_INPUT is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_UARTLITE=y +CONFIG_SERIAL_UARTLITE_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_I2C is not set +# CONFIG_SPI is not set +# CONFIG_W1 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +CONFIG_DAB=y + +# +# Graphics support +# +# CONFIG_VGASTATE is not set +CONFIG_VIDEO_OUTPUT_CONTROL=y +# CONFIG_FB is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_SOUND is not set +CONFIG_USB_SUPPORT=y +# CONFIG_USB_ARCH_HAS_HCD is not set +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set + +# +# Enable Host or Gadget support to see Inventra options +# + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; +# +# CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +# +# CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_RTC_CLASS is not set +# CONFIG_DMADEVICES is not set +# CONFIG_UIO is not set +# CONFIG_STAGING is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_DNOTIFY is not set +# CONFIG_INOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_MSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +CONFIG_CRAMFS=y +# CONFIG_SQUASHFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +CONFIG_ROMFS_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +# CONFIG_NFS_V4 is not set +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_NLS is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +CONFIG_UNUSED_SYMBOLS=y +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_SHIRQ=y +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 +CONFIG_SCHED_DEBUG=y +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_DEBUG_OBJECTS=y +CONFIG_DEBUG_OBJECTS_SELFTEST=y +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_NOMMU_REGIONS is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +CONFIG_DEBUG_LIST=y +CONFIG_DEBUG_SG=y +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_EARLY_PRINTK=y +CONFIG_HEART_BEAT=y +# CONFIG_DEBUG_BOOTMEM is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +# CONFIG_CRYPTO_MANAGER is not set +# CONFIG_CRYPTO_MANAGER2 is not set +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +# CONFIG_CRYPTO_CBC is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_GENERIC_FIND_LAST_BIT=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +# CONFIG_CRC32 is not set +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_HAVE_LMB=y -- cgit v0.10.2 From 6d5af1a35f363d3bca7ecb4560102ff94f792186 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:20 +0100 Subject: microblaze_v8: assembler files head.S, entry-nommu.S, syscall_table.S Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S new file mode 100644 index 0000000..f24b126 --- /dev/null +++ b/arch/microblaze/kernel/entry-nommu.S @@ -0,0 +1,596 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + .macro disable_irq + msrclr r0, MSR_IE + .endm + + .macro enable_irq + msrset r0, MSR_IE + .endm + + .macro clear_bip + msrclr r0, MSR_BIP + .endm +#else + .macro disable_irq + mfs r11, rmsr + andi r11, r11, ~MSR_IE + mts rmsr, r11 + .endm + + .macro enable_irq + mfs r11, rmsr + ori r11, r11, MSR_IE + mts rmsr, r11 + .endm + + .macro clear_bip + mfs r11, rmsr + andi r11, r11, ~MSR_BIP + mts rmsr, r11 + .endm +#endif + +ENTRY(_interrupt) + swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */ + swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */ + lwi r11, r0, PER_CPU(KM) /* load mode indicator */ + beqid r11, 1f + nop + brid 2f /* jump over */ + addik r1, r1, (-PT_SIZE) /* room for pt_regs (delay slot) */ +1: /* switch to kernel stack */ + lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */ + lwi r1, r1, TS_THREAD_INFO /* get the thread info */ + /* calculate kernel stack pointer */ + addik r1, r1, THREAD_SIZE - PT_SIZE +2: + swi r11, r1, PT_MODE /* store the mode */ + lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */ + swi r2, r1, PT_R2 + swi r3, r1, PT_R3 + swi r4, r1, PT_R4 + swi r5, r1, PT_R5 + swi r6, r1, PT_R6 + swi r7, r1, PT_R7 + swi r8, r1, PT_R8 + swi r9, r1, PT_R9 + swi r10, r1, PT_R10 + swi r11, r1, PT_R11 + swi r12, r1, PT_R12 + swi r13, r1, PT_R13 + swi r14, r1, PT_R14 + swi r14, r1, PT_PC + swi r15, r1, PT_R15 + swi r16, r1, PT_R16 + swi r17, r1, PT_R17 + swi r18, r1, PT_R18 + swi r19, r1, PT_R19 + swi r20, r1, PT_R20 + swi r21, r1, PT_R21 + swi r22, r1, PT_R22 + swi r23, r1, PT_R23 + swi r24, r1, PT_R24 + swi r25, r1, PT_R25 + swi r26, r1, PT_R26 + swi r27, r1, PT_R27 + swi r28, r1, PT_R28 + swi r29, r1, PT_R29 + swi r30, r1, PT_R30 + swi r31, r1, PT_R31 + /* special purpose registers */ + mfs r11, rmsr + swi r11, r1, PT_MSR + mfs r11, rear + swi r11, r1, PT_EAR + mfs r11, resr + swi r11, r1, PT_ESR + mfs r11, rfsr + swi r11, r1, PT_FSR + /* reload original stack pointer and save it */ + lwi r11, r0, PER_CPU(ENTRY_SP) + swi r11, r1, PT_R1 + /* update mode indicator we are in kernel mode */ + addik r11, r0, 1 + swi r11, r0, PER_CPU(KM) + /* restore r31 */ + lwi r31, r0, PER_CPU(CURRENT_SAVE) + /* prepare the link register, the argument and jump */ + la r15, r0, ret_from_intr - 8 + addk r6, r0, r15 + braid do_IRQ + add r5, r0, r1 + +ret_from_intr: + lwi r11, r1, PT_MODE + bneid r11, 3f + + lwi r6, r31, TS_THREAD_INFO /* get thread info */ + lwi r19, r6, TI_FLAGS /* get flags in thread info */ + /* do an extra work if any bits are set */ + + andi r11, r19, _TIF_NEED_RESCHED + beqi r11, 1f + bralid r15, schedule + nop +1: andi r11, r19, _TIF_SIGPENDING + beqid r11, no_intr_reshed + addk r5, r1, r0 + addk r7, r0, r0 + bralid r15, do_signal + addk r6, r0, r0 + +no_intr_reshed: + /* save mode indicator */ + lwi r11, r1, PT_MODE +3: + swi r11, r0, PER_CPU(KM) + + /* save r31 */ + swi r31, r0, PER_CPU(CURRENT_SAVE) +restore_context: + /* special purpose registers */ + lwi r11, r1, PT_FSR + mts rfsr, r11 + lwi r11, r1, PT_ESR + mts resr, r11 + lwi r11, r1, PT_EAR + mts rear, r11 + lwi r11, r1, PT_MSR + mts rmsr, r11 + + lwi r31, r1, PT_R31 + lwi r30, r1, PT_R30 + lwi r29, r1, PT_R29 + lwi r28, r1, PT_R28 + lwi r27, r1, PT_R27 + lwi r26, r1, PT_R26 + lwi r25, r1, PT_R25 + lwi r24, r1, PT_R24 + lwi r23, r1, PT_R23 + lwi r22, r1, PT_R22 + lwi r21, r1, PT_R21 + lwi r20, r1, PT_R20 + lwi r19, r1, PT_R19 + lwi r18, r1, PT_R18 + lwi r17, r1, PT_R17 + lwi r16, r1, PT_R16 + lwi r15, r1, PT_R15 + lwi r14, r1, PT_PC + lwi r13, r1, PT_R13 + lwi r12, r1, PT_R12 + lwi r11, r1, PT_R11 + lwi r10, r1, PT_R10 + lwi r9, r1, PT_R9 + lwi r8, r1, PT_R8 + lwi r7, r1, PT_R7 + lwi r6, r1, PT_R6 + lwi r5, r1, PT_R5 + lwi r4, r1, PT_R4 + lwi r3, r1, PT_R3 + lwi r2, r1, PT_R2 + lwi r1, r1, PT_R1 + rtid r14, 0 + nop + +ENTRY(_reset) + brai 0; + +ENTRY(_user_exception) + swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */ + swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */ + lwi r11, r0, PER_CPU(KM) /* load mode indicator */ + beqid r11, 1f /* Already in kernel mode? */ + nop + brid 2f /* jump over */ + addik r1, r1, (-PT_SIZE) /* Room for pt_regs (delay slot) */ +1: /* Switch to kernel stack */ + lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */ + lwi r1, r1, TS_THREAD_INFO /* get the thread info */ + /* calculate kernel stack pointer */ + addik r1, r1, THREAD_SIZE - PT_SIZE + swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */ + lwi r11, r0, PER_CPU(KM) /* load mode indicator */ +2: + swi r11, r1, PT_MODE /* store the mode */ + lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */ + /* save them on stack */ + swi r2, r1, PT_R2 + swi r3, r1, PT_R3 /* r3: _always_ in clobber list; see unistd.h */ + swi r4, r1, PT_R4 /* r4: _always_ in clobber list; see unistd.h */ + swi r5, r1, PT_R5 + swi r6, r1, PT_R6 + swi r7, r1, PT_R7 + swi r8, r1, PT_R8 + swi r9, r1, PT_R9 + swi r10, r1, PT_R10 + swi r11, r1, PT_R11 + /* r12: _always_ in clobber list; see unistd.h */ + swi r12, r1, PT_R12 + swi r13, r1, PT_R13 + /* r14: _always_ in clobber list; see unistd.h */ + swi r14, r1, PT_R14 + /* but we want to return to the next inst. */ + addik r14, r14, 0x4 + swi r14, r1, PT_PC /* increment by 4 and store in pc */ + swi r15, r1, PT_R15 + swi r16, r1, PT_R16 + swi r17, r1, PT_R17 + swi r18, r1, PT_R18 + swi r19, r1, PT_R19 + swi r20, r1, PT_R20 + swi r21, r1, PT_R21 + swi r22, r1, PT_R22 + swi r23, r1, PT_R23 + swi r24, r1, PT_R24 + swi r25, r1, PT_R25 + swi r26, r1, PT_R26 + swi r27, r1, PT_R27 + swi r28, r1, PT_R28 + swi r29, r1, PT_R29 + swi r30, r1, PT_R30 + swi r31, r1, PT_R31 + + disable_irq + nop /* make sure IE bit is in effect */ + clear_bip /* once IE is in effect it is safe to clear BIP */ + nop + + /* special purpose registers */ + mfs r11, rmsr + swi r11, r1, PT_MSR + mfs r11, rear + swi r11, r1, PT_EAR + mfs r11, resr + swi r11, r1, PT_ESR + mfs r11, rfsr + swi r11, r1, PT_FSR + /* reload original stack pointer and save it */ + lwi r11, r0, PER_CPU(ENTRY_SP) + swi r11, r1, PT_R1 + /* update mode indicator we are in kernel mode */ + addik r11, r0, 1 + swi r11, r0, PER_CPU(KM) + /* restore r31 */ + lwi r31, r0, PER_CPU(CURRENT_SAVE) + /* re-enable interrupts now we are in kernel mode */ + enable_irq + + /* See if the system call number is valid. */ + addi r11, r12, -__NR_syscalls + bgei r11, 1f /* return to user if not valid */ + /* Figure out which function to use for this system call. */ + /* Note Microblaze barrel shift is optional, so don't rely on it */ + add r12, r12, r12 /* convert num -> ptr */ + add r12, r12, r12 + lwi r12, r12, sys_call_table /* Get function pointer */ + la r15, r0, ret_to_user-8 /* set return address */ + bra r12 /* Make the system call. */ + bri 0 /* won't reach here */ +1: + brid ret_to_user /* jump to syscall epilogue */ + addi r3, r0, -ENOSYS /* set errno in delay slot */ + +/* + * Debug traps are like a system call, but entered via brki r14, 0x60 + * All we need to do is send the SIGTRAP signal to current, ptrace and do_signal + * will handle the rest + */ +ENTRY(_debug_exception) + swi r1, r0, PER_CPU(ENTRY_SP) /* save the current sp */ + lwi r1, r0, PER_CPU(CURRENT_SAVE) /* get the saved current */ + lwi r1, r1, TS_THREAD_INFO /* get the thread info */ + addik r1, r1, THREAD_SIZE - PT_SIZE /* get the kernel stack */ + swi r11, r0, PER_CPU(R11_SAVE) /* temporarily save r11 */ + lwi r11, r0, PER_CPU(KM) /* load mode indicator */ +//save_context: + swi r11, r1, PT_MODE /* store the mode */ + lwi r11, r0, PER_CPU(R11_SAVE) /* reload r11 */ + /* save them on stack */ + swi r2, r1, PT_R2 + swi r3, r1, PT_R3 /* r3: _always_ in clobber list; see unistd.h */ + swi r4, r1, PT_R4 /* r4: _always_ in clobber list; see unistd.h */ + swi r5, r1, PT_R5 + swi r6, r1, PT_R6 + swi r7, r1, PT_R7 + swi r8, r1, PT_R8 + swi r9, r1, PT_R9 + swi r10, r1, PT_R10 + swi r11, r1, PT_R11 + /* r12: _always_ in clobber list; see unistd.h */ + swi r12, r1, PT_R12 + swi r13, r1, PT_R13 + /* r14: _always_ in clobber list; see unistd.h */ + swi r14, r1, PT_R14 + swi r14, r1, PT_PC /* Will return to interrupted instruction */ + swi r15, r1, PT_R15 + swi r16, r1, PT_R16 + swi r17, r1, PT_R17 + swi r18, r1, PT_R18 + swi r19, r1, PT_R19 + swi r20, r1, PT_R20 + swi r21, r1, PT_R21 + swi r22, r1, PT_R22 + swi r23, r1, PT_R23 + swi r24, r1, PT_R24 + swi r25, r1, PT_R25 + swi r26, r1, PT_R26 + swi r27, r1, PT_R27 + swi r28, r1, PT_R28 + swi r29, r1, PT_R29 + swi r30, r1, PT_R30 + swi r31, r1, PT_R31 + + disable_irq + nop /* make sure IE bit is in effect */ + clear_bip /* once IE is in effect it is safe to clear BIP */ + nop + + /* special purpose registers */ + mfs r11, rmsr + swi r11, r1, PT_MSR + mfs r11, rear + swi r11, r1, PT_EAR + mfs r11, resr + swi r11, r1, PT_ESR + mfs r11, rfsr + swi r11, r1, PT_FSR + /* reload original stack pointer and save it */ + lwi r11, r0, PER_CPU(ENTRY_SP) + swi r11, r1, PT_R1 + /* update mode indicator we are in kernel mode */ + addik r11, r0, 1 + swi r11, r0, PER_CPU(KM) + /* restore r31 */ + lwi r31, r0, PER_CPU(CURRENT_SAVE) + /* re-enable interrupts now we are in kernel mode */ + enable_irq + + addi r5, r0, SIGTRAP /* sending the trap signal */ + add r6, r0, r31 /* to current */ + bralid r15, send_sig + add r7, r0, r0 /* 3rd param zero */ + + /* Restore r3/r4 to work around how ret_to_user works */ + lwi r3, r1, PT_R3 + lwi r4, r1, PT_R4 + bri ret_to_user + +ENTRY(_break) + bri 0 + +/* struct task_struct *_switch_to(struct thread_info *prev, + struct thread_info *next); */ +ENTRY(_switch_to) + /* prepare return value */ + addk r3, r0, r31 + + /* save registers in cpu_context */ + /* use r11 and r12, volatile registers, as temp register */ + addik r11, r5, TI_CPU_CONTEXT + swi r1, r11, CC_R1 + swi r2, r11, CC_R2 + /* skip volatile registers. + * they are saved on stack when we jumped to _switch_to() */ + /* dedicated registers */ + swi r13, r11, CC_R13 + swi r14, r11, CC_R14 + swi r15, r11, CC_R15 + swi r16, r11, CC_R16 + swi r17, r11, CC_R17 + swi r18, r11, CC_R18 + /* save non-volatile registers */ + swi r19, r11, CC_R19 + swi r20, r11, CC_R20 + swi r21, r11, CC_R21 + swi r22, r11, CC_R22 + swi r23, r11, CC_R23 + swi r24, r11, CC_R24 + swi r25, r11, CC_R25 + swi r26, r11, CC_R26 + swi r27, r11, CC_R27 + swi r28, r11, CC_R28 + swi r29, r11, CC_R29 + swi r30, r11, CC_R30 + /* special purpose registers */ + mfs r12, rmsr + swi r12, r11, CC_MSR + mfs r12, rear + swi r12, r11, CC_EAR + mfs r12, resr + swi r12, r11, CC_ESR + mfs r12, rfsr + swi r12, r11, CC_FSR + + /* update r31, the current */ + lwi r31, r6, TI_TASK + swi r31, r0, PER_CPU(CURRENT_SAVE) + + /* get new process' cpu context and restore */ + addik r11, r6, TI_CPU_CONTEXT + + /* special purpose registers */ + lwi r12, r11, CC_FSR + mts rfsr, r12 + lwi r12, r11, CC_ESR + mts resr, r12 + lwi r12, r11, CC_EAR + mts rear, r12 + lwi r12, r11, CC_MSR + mts rmsr, r12 + /* non-volatile registers */ + lwi r30, r11, CC_R30 + lwi r29, r11, CC_R29 + lwi r28, r11, CC_R28 + lwi r27, r11, CC_R27 + lwi r26, r11, CC_R26 + lwi r25, r11, CC_R25 + lwi r24, r11, CC_R24 + lwi r23, r11, CC_R23 + lwi r22, r11, CC_R22 + lwi r21, r11, CC_R21 + lwi r20, r11, CC_R20 + lwi r19, r11, CC_R19 + /* dedicated registers */ + lwi r18, r11, CC_R18 + lwi r17, r11, CC_R17 + lwi r16, r11, CC_R16 + lwi r15, r11, CC_R15 + lwi r14, r11, CC_R14 + lwi r13, r11, CC_R13 + /* skip volatile registers */ + lwi r2, r11, CC_R2 + lwi r1, r11, CC_R1 + + rtsd r15, 8 + nop + +ENTRY(ret_from_fork) + addk r5, r0, r3 + addk r6, r0, r1 + brlid r15, schedule_tail + nop + swi r31, r1, PT_R31 /* save r31 in user context. */ + /* will soon be restored to r31 in ret_to_user */ + addk r3, r0, r0 + brid ret_to_user + nop + +work_pending: + andi r11, r19, _TIF_NEED_RESCHED + beqi r11, 1f + bralid r15, schedule + nop +1: andi r11, r19, _TIF_SIGPENDING + beqi r11, no_work_pending + addk r5, r1, r0 + addik r7, r0, 1 + bralid r15, do_signal + addk r6, r0, r0 + bri no_work_pending + +ENTRY(ret_to_user) + disable_irq + + swi r4, r1, PT_R4 /* return val */ + swi r3, r1, PT_R3 /* return val */ + + lwi r6, r31, TS_THREAD_INFO /* get thread info */ + lwi r19, r6, TI_FLAGS /* get flags in thread info */ + bnei r19, work_pending /* do an extra work if any bits are set */ +no_work_pending: + disable_irq + + /* save r31 */ + swi r31, r0, PER_CPU(CURRENT_SAVE) + /* save mode indicator */ + lwi r18, r1, PT_MODE + swi r18, r0, PER_CPU(KM) +//restore_context: + /* special purpose registers */ + lwi r18, r1, PT_FSR + mts rfsr, r18 + lwi r18, r1, PT_ESR + mts resr, r18 + lwi r18, r1, PT_EAR + mts rear, r18 + lwi r18, r1, PT_MSR + mts rmsr, r18 + + lwi r31, r1, PT_R31 + lwi r30, r1, PT_R30 + lwi r29, r1, PT_R29 + lwi r28, r1, PT_R28 + lwi r27, r1, PT_R27 + lwi r26, r1, PT_R26 + lwi r25, r1, PT_R25 + lwi r24, r1, PT_R24 + lwi r23, r1, PT_R23 + lwi r22, r1, PT_R22 + lwi r21, r1, PT_R21 + lwi r20, r1, PT_R20 + lwi r19, r1, PT_R19 + lwi r18, r1, PT_R18 + lwi r17, r1, PT_R17 + lwi r16, r1, PT_R16 + lwi r15, r1, PT_R15 + lwi r14, r1, PT_PC + lwi r13, r1, PT_R13 + lwi r12, r1, PT_R12 + lwi r11, r1, PT_R11 + lwi r10, r1, PT_R10 + lwi r9, r1, PT_R9 + lwi r8, r1, PT_R8 + lwi r7, r1, PT_R7 + lwi r6, r1, PT_R6 + lwi r5, r1, PT_R5 + lwi r4, r1, PT_R4 /* return val */ + lwi r3, r1, PT_R3 /* return val */ + lwi r2, r1, PT_R2 + lwi r1, r1, PT_R1 + + rtid r14, 0 + nop + +sys_vfork_wrapper: + brid sys_vfork + addk r5, r1, r0 + +sys_clone_wrapper: + brid sys_clone + addk r7, r1, r0 + +sys_execve_wrapper: + brid sys_execve + addk r8, r1, r0 + +sys_sigreturn_wrapper: + brid sys_sigreturn + addk r5, r1, r0 + +sys_rt_sigreturn_wrapper: + brid sys_rt_sigreturn + addk r5, r1, r0 + +sys_sigsuspend_wrapper: + brid sys_rt_sigsuspend + addk r6, r1, r0 + +sys_rt_sigsuspend_wrapper: + brid sys_rt_sigsuspend + addk r7, r1, r0 + + /* Interrupt vector table */ + .section .init.ivt, "ax" + .org 0x0 + brai _reset + brai _user_exception + brai _interrupt + brai _break + brai _hw_exception_handler + .org 0x60 + brai _debug_exception + +.section .rodata,"a" +#include "syscall_table.S" + +syscall_table_size=(.-sys_call_table) diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S new file mode 100644 index 0000000..319dc35 --- /dev/null +++ b/arch/microblaze/kernel/head.S @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include + + .text +ENTRY(_start) + mfs r1, rmsr + andi r1, r1, ~2 + mts rmsr, r1 + +/* save fdt to kernel location */ +/* r7 stores pointer to fdt blob */ + beqi r7, no_fdt_arg + or r11, r0, r0 /* incremment */ + ori r4, r0, TOPHYS(_fdt_start) /* save bram context */ + ori r3, r0, (0x4000 - 4) +_copy_fdt: + lw r12, r7, r11 /* r12 = r7 + r11 */ + sw r12, r4, r11 /* addr[r4 + r11] = r12 */ + addik r11, r11, 4 /* increment counting */ + bgtid r3, _copy_fdt /* loop for all entries */ + addik r3, r3, -4 /* descrement loop */ +no_fdt_arg: + + /* Initialize small data anchors */ + la r13, r0, _KERNEL_SDA_BASE_ + la r2, r0, _KERNEL_SDA2_BASE_ + + /* Initialize stack pointer */ + la r1, r0, init_thread_union + THREAD_SIZE - 4 + + /* Initialize r31 with current task address */ + la r31, r0, init_task + + /* + * Call platform dependent initialize function. + * Please see $(ARCH)/mach-$(SUBARCH)/setup.c for + * the function. + */ + la r8, r0, machine_early_init + brald r15, r8 + nop + + la r15, r0, machine_halt + braid start_kernel + nop diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S new file mode 100644 index 0000000..529b0db --- /dev/null +++ b/arch/microblaze/kernel/syscall_table.S @@ -0,0 +1,365 @@ +ENTRY(sys_call_table) + .long sys_restart_syscall /* 0 - old "setup()" system call, + * used for restarting */ + .long sys_exit + .long sys_ni_syscall /* was fork */ + .long sys_read + .long sys_write + .long sys_open /* 5 */ + .long sys_close + .long sys_waitpid + .long sys_creat + .long sys_link + .long sys_unlink /* 10 */ + .long sys_execve_wrapper + .long sys_chdir + .long sys_time + .long sys_mknod + .long sys_chmod /* 15 */ + .long sys_lchown + .long sys_ni_syscall /* old break syscall holder */ + .long sys_ni_syscall /* old stat */ + .long sys_lseek + .long sys_getpid /* 20 */ + .long sys_mount + .long sys_oldumount + .long sys_setuid + .long sys_getuid + .long sys_stime /* 25 */ + .long sys_ptrace + .long sys_alarm + .long sys_ni_syscall /* oldfstat */ + .long sys_pause + .long sys_utime /* 30 */ + .long sys_ni_syscall /* old stty syscall holder */ + .long sys_ni_syscall /* old gtty syscall holder */ + .long sys_access + .long sys_nice + .long sys_ni_syscall /* 35 - old ftime syscall holder */ + .long sys_sync + .long sys_kill + .long sys_rename + .long sys_mkdir + .long sys_rmdir /* 40 */ + .long sys_dup + .long sys_pipe + .long sys_times + .long sys_ni_syscall /* old prof syscall holder */ + .long sys_brk /* 45 */ + .long sys_setgid + .long sys_getgid + .long sys_signal + .long sys_geteuid + .long sys_getegid /* 50 */ + .long sys_acct + .long sys_umount /* recycled never used phys() */ + .long sys_ni_syscall /* old lock syscall holder */ + .long sys_ioctl + .long sys_fcntl /* 55 */ + .long sys_ni_syscall /* old mpx syscall holder */ + .long sys_setpgid + .long sys_ni_syscall /* old ulimit syscall holder */ + .long sys_ni_syscall /* olduname */ + .long sys_umask /* 60 */ + .long sys_chroot + .long sys_ustat + .long sys_dup2 + .long sys_getppid + .long sys_getpgrp /* 65 */ + .long sys_setsid + .long sys_sigaction + .long sys_sgetmask + .long sys_ssetmask + .long sys_setreuid /* 70 */ + .long sys_setregid + .long sys_sigsuspend_wrapper + .long sys_sigpending + .long sys_sethostname + .long sys_setrlimit /* 75 */ + .long sys_ni_syscall /* old_getrlimit */ + .long sys_getrusage + .long sys_gettimeofday + .long sys_settimeofday + .long sys_getgroups /* 80 */ + .long sys_setgroups + .long sys_ni_syscall /* old_select */ + .long sys_symlink + .long sys_ni_syscall /* oldlstat */ + .long sys_readlink /* 85 */ + .long sys_uselib + .long sys_swapon + .long sys_reboot + .long sys_ni_syscall /* old_readdir */ + .long sys_mmap /* 90 */ /* old_mmap */ + .long sys_munmap + .long sys_truncate + .long sys_ftruncate + .long sys_fchmod + .long sys_fchown /* 95 */ + .long sys_getpriority + .long sys_setpriority + .long sys_ni_syscall /* old profil syscall holder */ + .long sys_statfs + .long sys_fstatfs /* 100 */ + .long sys_ni_syscall /* ioperm */ + .long sys_socketcall + .long sys_syslog /* operation with system console */ + .long sys_setitimer + .long sys_getitimer /* 105 */ + .long sys_newstat + .long sys_newlstat + .long sys_newfstat + .long sys_ni_syscall /* uname */ + .long sys_ni_syscall /* 110 */ /* iopl */ + .long sys_vhangup + .long sys_ni_syscall /* old "idle" system call */ + .long sys_ni_syscall /* old sys_vm86old */ + .long sys_wait4 + .long sys_swapoff /* 115 */ + .long sys_sysinfo + .long sys_ipc + .long sys_fsync + .long sys_sigreturn_wrapper + .long sys_clone_wrapper /* 120 */ + .long sys_setdomainname + .long sys_newuname + .long sys_ni_syscall /* modify_ldt */ + .long sys_adjtimex + .long sys_mprotect /* 125: sys_mprotect */ + .long sys_sigprocmask + .long sys_ni_syscall /* old "create_module" */ + .long sys_init_module + .long sys_delete_module + .long sys_ni_syscall /* 130: old "get_kernel_syms" */ + .long sys_quotactl + .long sys_getpgid + .long sys_fchdir + .long sys_bdflush + .long sys_sysfs /* 135 */ + .long sys_personality + .long sys_ni_syscall /* reserved for afs_syscall */ + .long sys_setfsuid + .long sys_setfsgid + .long sys_llseek /* 140 */ + .long sys_getdents + .long sys_select + .long sys_flock + .long sys_msync + .long sys_readv /* 145 */ + .long sys_writev + .long sys_getsid + .long sys_fdatasync + .long sys_sysctl + .long sys_mlock /* 150: sys_mlock */ + .long sys_munlock + .long sys_mlockall + .long sys_munlockall + .long sys_sched_setparam + .long sys_sched_getparam /* 155 */ + .long sys_sched_setscheduler + .long sys_sched_getscheduler + .long sys_sched_yield + .long sys_sched_get_priority_max + .long sys_sched_get_priority_min /* 160 */ + .long sys_sched_rr_get_interval + .long sys_nanosleep + .long sys_mremap + .long sys_setresuid + .long sys_getresuid /* 165 */ + .long sys_ni_syscall /* sys_vm86 */ + .long sys_ni_syscall /* Old sys_query_module */ + .long sys_poll + .long sys_nfsservctl + .long sys_setresgid /* 170 */ + .long sys_getresgid + .long sys_prctl + .long sys_rt_sigreturn_wrapper + .long sys_rt_sigaction + .long sys_rt_sigprocmask /* 175 */ + .long sys_rt_sigpending + .long sys_rt_sigtimedwait + .long sys_rt_sigqueueinfo + .long sys_rt_sigsuspend_wrapper + .long sys_pread64 /* 180 */ + .long sys_pwrite64 + .long sys_chown + .long sys_getcwd + .long sys_capget + .long sys_capset /* 185 */ + .long sys_ni_syscall /* sigaltstack */ + .long sys_sendfile + .long sys_ni_syscall /* reserved for streams1 */ + .long sys_ni_syscall /* reserved for streams2 */ + .long sys_vfork_wrapper /* 190 */ + .long sys_getrlimit + .long sys_mmap2 /* mmap2 */ + .long sys_truncate64 + .long sys_ftruncate64 + .long sys_stat64 /* 195 */ + .long sys_lstat64 + .long sys_fstat64 + .long sys_lchown + .long sys_getuid + .long sys_getgid /* 200 */ + .long sys_geteuid + .long sys_getegid + .long sys_setreuid + .long sys_setregid + .long sys_getgroups /* 205 */ + .long sys_setgroups + .long sys_fchown + .long sys_setresuid + .long sys_getresuid + .long sys_setresgid /* 210 */ + .long sys_getresgid + .long sys_chown + .long sys_setuid + .long sys_setgid + .long sys_setfsuid /* 215 */ + .long sys_setfsgid + .long sys_pivot_root + .long sys_mincore + .long sys_madvise + .long sys_getdents64 /* 220 */ + .long sys_fcntl64 + .long sys_ni_syscall /* reserved for TUX */ + .long sys_ni_syscall + .long sys_gettid + .long sys_readahead /* 225 */ + .long sys_setxattr + .long sys_lsetxattr + .long sys_fsetxattr + .long sys_getxattr + .long sys_lgetxattr /* 230 */ + .long sys_fgetxattr + .long sys_listxattr + .long sys_llistxattr + .long sys_flistxattr + .long sys_removexattr /* 235 */ + .long sys_lremovexattr + .long sys_fremovexattr + .long sys_tkill + .long sys_sendfile64 + .long sys_futex /* 240 */ + .long sys_sched_setaffinity + .long sys_sched_getaffinity + .long sys_ni_syscall /* set_thread_area */ + .long sys_ni_syscall /* get_thread_area */ + .long sys_io_setup /* 245 */ + .long sys_io_destroy + .long sys_io_getevents + .long sys_io_submit + .long sys_io_cancel + .long sys_fadvise64 /* 250 */ + .long sys_ni_syscall + .long sys_exit_group + .long sys_lookup_dcookie + .long sys_epoll_create + .long sys_epoll_ctl /* 255 */ + .long sys_epoll_wait + .long sys_remap_file_pages + .long sys_set_tid_address + .long sys_timer_create + .long sys_timer_settime /* 260 */ + .long sys_timer_gettime + .long sys_timer_getoverrun + .long sys_timer_delete + .long sys_clock_settime + .long sys_clock_gettime /* 265 */ + .long sys_clock_getres + .long sys_clock_nanosleep + .long sys_statfs64 + .long sys_fstatfs64 + .long sys_tgkill /* 270 */ + .long sys_utimes + .long sys_fadvise64_64 + .long sys_ni_syscall /* sys_vserver */ + .long sys_mbind + .long sys_get_mempolicy + .long sys_set_mempolicy + .long sys_mq_open + .long sys_mq_unlink + .long sys_mq_timedsend + .long sys_mq_timedreceive /* 280 */ + .long sys_mq_notify + .long sys_mq_getsetattr + .long sys_kexec_load + .long sys_waitid + .long sys_ni_syscall /* 285 */ /* available */ + .long sys_add_key + .long sys_request_key + .long sys_keyctl + .long sys_ioprio_set + .long sys_ioprio_get /* 290 */ + .long sys_inotify_init + .long sys_inotify_add_watch + .long sys_inotify_rm_watch + .long sys_ni_syscall /* sys_migrate_pages */ + .long sys_openat /* 295 */ + .long sys_mkdirat + .long sys_mknodat + .long sys_fchownat + .long sys_ni_syscall + .long sys_fstatat64 /* 300 */ + .long sys_unlinkat + .long sys_renameat + .long sys_linkat + .long sys_symlinkat + .long sys_readlinkat /* 305 */ + .long sys_fchmodat + .long sys_faccessat + .long sys_ni_syscall /* pselect6 */ + .long sys_ni_syscall /* sys_ppoll */ + .long sys_unshare /* 310 */ + .long sys_set_robust_list + .long sys_get_robust_list + .long sys_splice + .long sys_sync_file_range + .long sys_tee /* 315 */ + .long sys_vmsplice + .long sys_move_pages + .long sys_getcpu + .long sys_epoll_pwait + .long sys_utimensat /* 320 */ + .long sys_signalfd + .long sys_timerfd_create + .long sys_eventfd + .long sys_fallocate + .long sys_semtimedop /* 325 */ + .long sys_timerfd_settime + .long sys_timerfd_gettime + .long sys_semctl + .long sys_semget + .long sys_semop /* 330 */ + .long sys_msgctl + .long sys_msgget + .long sys_msgrcv + .long sys_msgsnd + .long sys_shmat /* 335 */ + .long sys_shmctl + .long sys_shmdt + .long sys_shmget + .long sys_signalfd4 /* new syscall */ + .long sys_eventfd2 /* 340 */ + .long sys_epoll_create1 + .long sys_dup3 + .long sys_pipe2 + .long sys_inotify_init1 + .long sys_socket /* 345 */ + .long sys_socketpair + .long sys_bind + .long sys_listen + .long sys_accept + .long sys_connect /* 350 */ + .long sys_getsockname + .long sys_getpeername + .long sys_sendto + .long sys_send + .long sys_recvfrom /* 355 */ + .long sys_recv + .long sys_setsockopt + .long sys_getsockopt + .long sys_shutdown + .long sys_sendmsg /* 360 */ + .long sys_recvmsg + .long sys_ni_syscall -- cgit v0.10.2 From 16bfeaf23ead78d937b3eacfb5c7cdc7bff6d3da Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:20 +0100 Subject: microblaze_v8: vmlinux.lds.S - linker script Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/vmlinux.lds.S b/arch/microblaze/kernel/vmlinux.lds.S new file mode 100644 index 0000000..840385e --- /dev/null +++ b/arch/microblaze/kernel/vmlinux.lds.S @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +OUTPUT_FORMAT("elf32-microblaze", "elf32-microblaze", "elf32-microblaze") +OUTPUT_ARCH(microblaze) +ENTRY(_start) + +#include + +jiffies = jiffies_64 + 4; + +SECTIONS { + . = CONFIG_KERNEL_BASE_ADDR; + + .text : { + _text = . ; + _stext = . ; + *(.text .text.*) + *(.fixup) + + *(.exitcall.exit) + SCHED_TEXT + LOCK_TEXT + KPROBES_TEXT + . = ALIGN (4) ; + _etext = . ; + } + + . = ALIGN (4) ; + _fdt_start = . ; /* place for fdt blob */ + . = . + 0x4000; + _fdt_end = . ; + + . = ALIGN(16); + RODATA + . = ALIGN(16); + __ex_table : { + __start___ex_table = .; + *(__ex_table) + __stop___ex_table = .; + } + + /* + * sdata2 section can go anywhere, but must be word aligned + * and SDA2_BASE must point to the middle of it + */ + .sdata2 : { + _ssrw = .; + . = ALIGN(4096); /* page aligned when MMU used - origin 0x8 */ + *(.sdata2) + . = ALIGN(8); + _essrw = .; + _ssrw_size = _essrw - _ssrw; + _KERNEL_SDA2_BASE_ = _ssrw + (_ssrw_size / 2); + } + + _sdata = . ; + .data ALIGN (4096) : { /* page aligned when MMU used - origin 0x4 */ + *(.data) + } + . = ALIGN(32); + .data.cacheline_aligned : { *(.data.cacheline_aligned) } + _edata = . ; + + /* Reserve some low RAM for r0 based memory references */ + . = ALIGN(0x4) ; + r0_ram = . ; + . = . + 4096; /* a page should be enough */ + + /* The initial task */ + . = ALIGN(8192); + .data.init_task : { *(.data.init_task) } + + /* Under the microblaze ABI, .sdata and .sbss must be contiguous */ + . = ALIGN(8); + .sdata : { + _ssro = .; + *(.sdata) + } + + .sbss : { + _ssbss = .; + *(.sbss) + _esbss = .; + _essro = .; + _ssro_size = _essro - _ssro ; + _KERNEL_SDA_BASE_ = _ssro + (_ssro_size / 2) ; + } + + __init_begin = .; + + . = ALIGN(4096); + .init.text : { + _sinittext = . ; + *(.init.text) + *(.exit.text) + *(.exit.data) + _einittext = .; + } + + .init.data : { *(.init.data) } + + . = ALIGN(4); + .init.ivt : { + __ivt_start = .; + *(.init.ivt) + __ivt_end = .; + } + + .init.setup : { + __setup_start = .; + *(.init.setup) + __setup_end = .; + } + + .initcall.init : { + __initcall_start = .; + INITCALLS + __initcall_end = .; + } + + .con_initcall.init : { + __con_initcall_start = .; + *(.con_initcall.init) + __con_initcall_end = .; + } + + __init_end_before_initramfs = .; + + .init.ramfs ALIGN(4096) : { + __initramfs_start = .; + *(.init.ramfs) + __initramfs_end = .; + . = ALIGN(4); + LONG(0); +/* + * FIXME this can break initramfs for MMU. + * Pad init.ramfs up to page boundary, + * so that __init_end == __bss_start. This will make image.elf + * consistent with the image.bin + */ + /* . = ALIGN(4096); */ + } + __init_end = .; + + .bss ALIGN (4096) : { /* page aligned when MMU used */ + __bss_start = . ; + *(.bss*) + *(COMMON) + . = ALIGN (4) ; + __bss_stop = . ; + _ebss = . ; + } + . = ALIGN(4096); + _end = .; +} -- cgit v0.10.2 From 322ae8eb91c1730728400c5b8dd1108aef1205b8 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:21 +0100 Subject: microblaze_v8: supported function for memory - kernel/lib Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/lib/fastcopy.S b/arch/microblaze/lib/fastcopy.S new file mode 100644 index 0000000..02e3ab4 --- /dev/null +++ b/arch/microblaze/lib/fastcopy.S @@ -0,0 +1,662 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2008 Jim Law - Iris LP All rights reserved. + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + * + * Written by Jim Law + * + * intended to replace: + * memcpy in memcpy.c and + * memmove in memmove.c + * ... in arch/microblaze/lib + * + * + * assly_fastcopy.S + * + * Attempt at quicker memcpy and memmove for MicroBlaze + * Input : Operand1 in Reg r5 - destination address + * Operand2 in Reg r6 - source address + * Operand3 in Reg r7 - number of bytes to transfer + * Output: Result in Reg r3 - starting destinaition address + * + * + * Explanation: + * Perform (possibly unaligned) copy of a block of memory + * between mem locations with size of xfer spec'd in bytes + */ + +#include + + .globl memcpy + .ent memcpy + +memcpy: +fast_memcpy_ascending: + /* move d to return register as value of function */ + addi r3, r5, 0 + + addi r4, r0, 4 /* n = 4 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + blti r4, a_xfer_end /* if n < 0, less than one word to transfer */ + + /* transfer first 0~3 bytes to get aligned dest address */ + andi r4, r5, 3 /* n = d & 3 */ + /* if zero, destination already aligned */ + beqi r4, a_dalign_done + /* n = 4 - n (yields 3, 2, 1 transfers for 1, 2, 3 addr offset) */ + rsubi r4, r4, 4 + rsub r7, r4, r7 /* c = c - n adjust c */ + +a_xfer_first_loop: + /* if no bytes left to transfer, transfer the bulk */ + beqi r4, a_dalign_done + lbui r11, r6, 0 /* h = *s */ + sbi r11, r5, 0 /* *d = h */ + addi r6, r6, 1 /* s++ */ + addi r5, r5, 1 /* d++ */ + brid a_xfer_first_loop /* loop */ + addi r4, r4, -1 /* n-- (IN DELAY SLOT) */ + +a_dalign_done: + addi r4, r0, 32 /* n = 32 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + /* if n < 0, less than one block to transfer */ + blti r4, a_block_done + +a_block_xfer: + andi r4, r7, 0xffffffe0 /* n = c & ~31 */ + rsub r7, r4, r7 /* c = c - n */ + + andi r9, r6, 3 /* t1 = s & 3 */ + /* if temp != 0, unaligned transfers needed */ + bnei r9, a_block_unaligned + +a_block_aligned: + lwi r9, r6, 0 /* t1 = *(s + 0) */ + lwi r10, r6, 4 /* t2 = *(s + 4) */ + lwi r11, r6, 8 /* t3 = *(s + 8) */ + lwi r12, r6, 12 /* t4 = *(s + 12) */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + swi r10, r5, 4 /* *(d + 4) = t2 */ + swi r11, r5, 8 /* *(d + 8) = t3 */ + swi r12, r5, 12 /* *(d + 12) = t4 */ + lwi r9, r6, 16 /* t1 = *(s + 16) */ + lwi r10, r6, 20 /* t2 = *(s + 20) */ + lwi r11, r6, 24 /* t3 = *(s + 24) */ + lwi r12, r6, 28 /* t4 = *(s + 28) */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + swi r10, r5, 20 /* *(d + 20) = t2 */ + swi r11, r5, 24 /* *(d + 24) = t3 */ + swi r12, r5, 28 /* *(d + 28) = t4 */ + addi r6, r6, 32 /* s = s + 32 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, a_block_aligned /* while (n) loop */ + addi r5, r5, 32 /* d = d + 32 (IN DELAY SLOT) */ + bri a_block_done + +a_block_unaligned: + andi r8, r6, 0xfffffffc /* as = s & ~3 */ + add r6, r6, r4 /* s = s + n */ + lwi r11, r8, 0 /* h = *(as + 0) */ + + addi r9, r9, -1 + beqi r9, a_block_u1 /* t1 was 1 => 1 byte offset */ + addi r9, r9, -1 + beqi r9, a_block_u2 /* t1 was 2 => 2 byte offset */ + +a_block_u3: + bslli r11, r11, 24 /* h = h << 24 */ +a_bu3_loop: + lwi r12, r8, 4 /* v = *(as + 4) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 12) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + lwi r12, r8, 32 /* v = *(as + 32) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + addi r8, r8, 32 /* as = as + 32 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, a_bu3_loop /* while (n) loop */ + addi r5, r5, 32 /* d = d + 32 (IN DELAY SLOT) */ + bri a_block_done + +a_block_u1: + bslli r11, r11, 8 /* h = h << 8 */ +a_bu1_loop: + lwi r12, r8, 4 /* v = *(as + 4) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 12) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + lwi r12, r8, 32 /* v = *(as + 32) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + addi r8, r8, 32 /* as = as + 32 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, a_bu1_loop /* while (n) loop */ + addi r5, r5, 32 /* d = d + 32 (IN DELAY SLOT) */ + bri a_block_done + +a_block_u2: + bslli r11, r11, 16 /* h = h << 16 */ +a_bu2_loop: + lwi r12, r8, 4 /* v = *(as + 4) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 12) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + lwi r12, r8, 32 /* v = *(as + 32) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + addi r8, r8, 32 /* as = as + 32 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, a_bu2_loop /* while (n) loop */ + addi r5, r5, 32 /* d = d + 32 (IN DELAY SLOT) */ + +a_block_done: + addi r4, r0, 4 /* n = 4 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + blti r4, a_xfer_end /* if n < 0, less than one word to transfer */ + +a_word_xfer: + andi r4, r7, 0xfffffffc /* n = c & ~3 */ + addi r10, r0, 0 /* offset = 0 */ + + andi r9, r6, 3 /* t1 = s & 3 */ + /* if temp != 0, unaligned transfers needed */ + bnei r9, a_word_unaligned + +a_word_aligned: + lw r9, r6, r10 /* t1 = *(s+offset) */ + sw r9, r5, r10 /* *(d+offset) = t1 */ + addi r4, r4,-4 /* n-- */ + bneid r4, a_word_aligned /* loop */ + addi r10, r10, 4 /* offset++ (IN DELAY SLOT) */ + + bri a_word_done + +a_word_unaligned: + andi r8, r6, 0xfffffffc /* as = s & ~3 */ + lwi r11, r8, 0 /* h = *(as + 0) */ + addi r8, r8, 4 /* as = as + 4 */ + + addi r9, r9, -1 + beqi r9, a_word_u1 /* t1 was 1 => 1 byte offset */ + addi r9, r9, -1 + beqi r9, a_word_u2 /* t1 was 2 => 2 byte offset */ + +a_word_u3: + bslli r11, r11, 24 /* h = h << 24 */ +a_wu3_loop: + lw r12, r8, r10 /* v = *(as + offset) */ + bsrli r9, r12, 8 /* t1 = v >> 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r10 /* *(d + offset) = t1 */ + bslli r11, r12, 24 /* h = v << 24 */ + addi r4, r4,-4 /* n = n - 4 */ + bneid r4, a_wu3_loop /* while (n) loop */ + addi r10, r10, 4 /* offset = ofset + 4 (IN DELAY SLOT) */ + + bri a_word_done + +a_word_u1: + bslli r11, r11, 8 /* h = h << 8 */ +a_wu1_loop: + lw r12, r8, r10 /* v = *(as + offset) */ + bsrli r9, r12, 24 /* t1 = v >> 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r10 /* *(d + offset) = t1 */ + bslli r11, r12, 8 /* h = v << 8 */ + addi r4, r4,-4 /* n = n - 4 */ + bneid r4, a_wu1_loop /* while (n) loop */ + addi r10, r10, 4 /* offset = ofset + 4 (IN DELAY SLOT) */ + + bri a_word_done + +a_word_u2: + bslli r11, r11, 16 /* h = h << 16 */ +a_wu2_loop: + lw r12, r8, r10 /* v = *(as + offset) */ + bsrli r9, r12, 16 /* t1 = v >> 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r10 /* *(d + offset) = t1 */ + bslli r11, r12, 16 /* h = v << 16 */ + addi r4, r4,-4 /* n = n - 4 */ + bneid r4, a_wu2_loop /* while (n) loop */ + addi r10, r10, 4 /* offset = ofset + 4 (IN DELAY SLOT) */ + +a_word_done: + add r5, r5, r10 /* d = d + offset */ + add r6, r6, r10 /* s = s + offset */ + rsub r7, r10, r7 /* c = c - offset */ + +a_xfer_end: +a_xfer_end_loop: + beqi r7, a_done /* while (c) */ + lbui r9, r6, 0 /* t1 = *s */ + addi r6, r6, 1 /* s++ */ + sbi r9, r5, 0 /* *d = t1 */ + addi r7, r7, -1 /* c-- */ + brid a_xfer_end_loop /* loop */ + addi r5, r5, 1 /* d++ (IN DELAY SLOT) */ + +a_done: + rtsd r15, 8 + nop + +.end memcpy +/*----------------------------------------------------------------------------*/ + .globl memmove + .ent memmove + +memmove: + cmpu r4, r5, r6 /* n = s - d */ + bgei r4,fast_memcpy_ascending + +fast_memcpy_descending: + /* move d to return register as value of function */ + addi r3, r5, 0 + + add r5, r5, r7 /* d = d + c */ + add r6, r6, r7 /* s = s + c */ + + addi r4, r0, 4 /* n = 4 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + blti r4,d_xfer_end /* if n < 0, less than one word to transfer */ + + /* transfer first 0~3 bytes to get aligned dest address */ + andi r4, r5, 3 /* n = d & 3 */ + /* if zero, destination already aligned */ + beqi r4,d_dalign_done + rsub r7, r4, r7 /* c = c - n adjust c */ + +d_xfer_first_loop: + /* if no bytes left to transfer, transfer the bulk */ + beqi r4,d_dalign_done + addi r6, r6, -1 /* s-- */ + addi r5, r5, -1 /* d-- */ + lbui r11, r6, 0 /* h = *s */ + sbi r11, r5, 0 /* *d = h */ + brid d_xfer_first_loop /* loop */ + addi r4, r4, -1 /* n-- (IN DELAY SLOT) */ + +d_dalign_done: + addi r4, r0, 32 /* n = 32 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + /* if n < 0, less than one block to transfer */ + blti r4, d_block_done + +d_block_xfer: + andi r4, r7, 0xffffffe0 /* n = c & ~31 */ + rsub r7, r4, r7 /* c = c - n */ + + andi r9, r6, 3 /* t1 = s & 3 */ + /* if temp != 0, unaligned transfers needed */ + bnei r9, d_block_unaligned + +d_block_aligned: + addi r6, r6, -32 /* s = s - 32 */ + addi r5, r5, -32 /* d = d - 32 */ + lwi r9, r6, 28 /* t1 = *(s + 28) */ + lwi r10, r6, 24 /* t2 = *(s + 24) */ + lwi r11, r6, 20 /* t3 = *(s + 20) */ + lwi r12, r6, 16 /* t4 = *(s + 16) */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + swi r10, r5, 24 /* *(d + 24) = t2 */ + swi r11, r5, 20 /* *(d + 20) = t3 */ + swi r12, r5, 16 /* *(d + 16) = t4 */ + lwi r9, r6, 12 /* t1 = *(s + 12) */ + lwi r10, r6, 8 /* t2 = *(s + 8) */ + lwi r11, r6, 4 /* t3 = *(s + 4) */ + lwi r12, r6, 0 /* t4 = *(s + 0) */ + swi r9, r5, 12 /* *(d + 12) = t1 */ + swi r10, r5, 8 /* *(d + 8) = t2 */ + swi r11, r5, 4 /* *(d + 4) = t3 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, d_block_aligned /* while (n) loop */ + swi r12, r5, 0 /* *(d + 0) = t4 (IN DELAY SLOT) */ + bri d_block_done + +d_block_unaligned: + andi r8, r6, 0xfffffffc /* as = s & ~3 */ + rsub r6, r4, r6 /* s = s - n */ + lwi r11, r8, 0 /* h = *(as + 0) */ + + addi r9, r9, -1 + beqi r9,d_block_u1 /* t1 was 1 => 1 byte offset */ + addi r9, r9, -1 + beqi r9,d_block_u2 /* t1 was 2 => 2 byte offset */ + +d_block_u3: + bsrli r11, r11, 8 /* h = h >> 8 */ +d_bu3_loop: + addi r8, r8, -32 /* as = as - 32 */ + addi r5, r5, -32 /* d = d - 32 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 112) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 4 /* v = *(as + 4) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bsrli r11, r12, 8 /* h = v >> 8 */ + lwi r12, r8, 0 /* v = *(as + 0) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, d_bu3_loop /* while (n) loop */ + bsrli r11, r12, 8 /* h = v >> 8 (IN DELAY SLOT) */ + bri d_block_done + +d_block_u1: + bsrli r11, r11, 24 /* h = h >> 24 */ +d_bu1_loop: + addi r8, r8, -32 /* as = as - 32 */ + addi r5, r5, -32 /* d = d - 32 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 112) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 4 /* v = *(as + 4) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bsrli r11, r12, 24 /* h = v >> 24 */ + lwi r12, r8, 0 /* v = *(as + 0) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, d_bu1_loop /* while (n) loop */ + bsrli r11, r12, 24 /* h = v >> 24 (IN DELAY SLOT) */ + bri d_block_done + +d_block_u2: + bsrli r11, r11, 16 /* h = h >> 16 */ +d_bu2_loop: + addi r8, r8, -32 /* as = as - 32 */ + addi r5, r5, -32 /* d = d - 32 */ + lwi r12, r8, 28 /* v = *(as + 28) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 28 /* *(d + 28) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 24 /* v = *(as + 24) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 24 /* *(d + 24) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 20 /* v = *(as + 20) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 20 /* *(d + 20) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 16 /* v = *(as + 16) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 16 /* *(d + 16) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 12 /* v = *(as + 12) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 12 /* *(d + 112) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 8 /* v = *(as + 8) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 8 /* *(d + 8) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 4 /* v = *(as + 4) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 4 /* *(d + 4) = t1 */ + bsrli r11, r12, 16 /* h = v >> 16 */ + lwi r12, r8, 0 /* v = *(as + 0) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + swi r9, r5, 0 /* *(d + 0) = t1 */ + addi r4, r4, -32 /* n = n - 32 */ + bneid r4, d_bu2_loop /* while (n) loop */ + bsrli r11, r12, 16 /* h = v >> 16 (IN DELAY SLOT) */ + +d_block_done: + addi r4, r0, 4 /* n = 4 */ + cmpu r4, r4, r7 /* n = c - n (unsigned) */ + blti r4,d_xfer_end /* if n < 0, less than one word to transfer */ + +d_word_xfer: + andi r4, r7, 0xfffffffc /* n = c & ~3 */ + rsub r5, r4, r5 /* d = d - n */ + rsub r6, r4, r6 /* s = s - n */ + rsub r7, r4, r7 /* c = c - n */ + + andi r9, r6, 3 /* t1 = s & 3 */ + /* if temp != 0, unaligned transfers needed */ + bnei r9, d_word_unaligned + +d_word_aligned: + addi r4, r4,-4 /* n-- */ + lw r9, r6, r4 /* t1 = *(s+n) */ + bneid r4, d_word_aligned /* loop */ + sw r9, r5, r4 /* *(d+n) = t1 (IN DELAY SLOT) */ + + bri d_word_done + +d_word_unaligned: + andi r8, r6, 0xfffffffc /* as = s & ~3 */ + lw r11, r8, r4 /* h = *(as + n) */ + + addi r9, r9, -1 + beqi r9,d_word_u1 /* t1 was 1 => 1 byte offset */ + addi r9, r9, -1 + beqi r9,d_word_u2 /* t1 was 2 => 2 byte offset */ + +d_word_u3: + bsrli r11, r11, 8 /* h = h >> 8 */ +d_wu3_loop: + addi r4, r4,-4 /* n = n - 4 */ + lw r12, r8, r4 /* v = *(as + n) */ + bslli r9, r12, 24 /* t1 = v << 24 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r4 /* *(d + n) = t1 */ + bneid r4, d_wu3_loop /* while (n) loop */ + bsrli r11, r12, 8 /* h = v >> 8 (IN DELAY SLOT) */ + + bri d_word_done + +d_word_u1: + bsrli r11, r11, 24 /* h = h >> 24 */ +d_wu1_loop: + addi r4, r4,-4 /* n = n - 4 */ + lw r12, r8, r4 /* v = *(as + n) */ + bslli r9, r12, 8 /* t1 = v << 8 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r4 /* *(d + n) = t1 */ + bneid r4, d_wu1_loop /* while (n) loop */ + bsrli r11, r12, 24 /* h = v >> 24 (IN DELAY SLOT) */ + + bri d_word_done + +d_word_u2: + bsrli r11, r11, 16 /* h = h >> 16 */ +d_wu2_loop: + addi r4, r4,-4 /* n = n - 4 */ + lw r12, r8, r4 /* v = *(as + n) */ + bslli r9, r12, 16 /* t1 = v << 16 */ + or r9, r11, r9 /* t1 = h | t1 */ + sw r9, r5, r4 /* *(d + n) = t1 */ + bneid r4, d_wu2_loop /* while (n) loop */ + bsrli r11, r12, 16 /* h = v >> 16 (IN DELAY SLOT) */ + +d_word_done: + +d_xfer_end: +d_xfer_end_loop: + beqi r7, a_done /* while (c) */ + addi r6, r6, -1 /* s-- */ + lbui r9, r6, 0 /* t1 = *s */ + addi r5, r5, -1 /* d-- */ + sbi r9, r5, 0 /* *d = t1 */ + brid d_xfer_end_loop /* loop */ + addi r7, r7, -1 /* c-- (IN DELAY SLOT) */ + +d_done: + rtsd r15, 8 + nop + +.end memmove diff --git a/arch/microblaze/lib/memcpy.c b/arch/microblaze/lib/memcpy.c new file mode 100644 index 0000000..5880119 --- /dev/null +++ b/arch/microblaze/lib/memcpy.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * Reasonably optimised generic C-code for memcpy on Microblaze + * This is generic C code to do efficient, alignment-aware memcpy. + * + * It is based on demo code originally Copyright 2001 by Intel Corp, taken from + * http://www.embedded.com/showArticle.jhtml?articleID=19205567 + * + * Attempts were made, unsuccesfully, to contact the original + * author of this code (Michael Morrow, Intel). Below is the original + * copyright notice. + * + * This software has been developed by Intel Corporation. + * Intel specifically disclaims all warranties, express or + * implied, and all liability, including consequential and + * other indirect damages, for the use of this program, including + * liability for infringement of any proprietary rights, + * and including the warranties of merchantability and fitness + * for a particular purpose. Intel does not assume any + * responsibility for and errors which may appear in this program + * not any responsibility to update it. + */ + +#include +#include +#include +#include + +#include +#include + +#ifdef __HAVE_ARCH_MEMCPY +void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c) +{ + const char *src = v_src; + char *dst = v_dst; +#ifndef CONFIG_OPT_LIB_FUNCTION + /* Simple, byte oriented memcpy. */ + while (c--) + *dst++ = *src++; + + return v_dst; +#else + /* The following code tries to optimize the copy by using unsigned + * alignment. This will work fine if both source and destination are + * aligned on the same boundary. However, if they are aligned on + * different boundaries shifts will be necessary. This might result in + * bad performance on MicroBlaze systems without a barrel shifter. + */ + const uint32_t *i_src; + uint32_t *i_dst; + + if (c >= 4) { + unsigned value, buf_hold; + + /* Align the dstination to a word boundry. */ + /* This is done in an endian independant manner. */ + switch ((unsigned long)dst & 3) { + case 1: + *dst++ = *src++; + --c; + case 2: + *dst++ = *src++; + --c; + case 3: + *dst++ = *src++; + --c; + } + + i_dst = (void *)dst; + + /* Choose a copy scheme based on the source */ + /* alignment relative to dstination. */ + switch ((unsigned long)src & 3) { + case 0x0: /* Both byte offsets are aligned */ + i_src = (const void *)src; + + for (; c >= 4; c -= 4) + *i_dst++ = *i_src++; + + src = (const void *)i_src; + break; + case 0x1: /* Unaligned - Off by 1 */ + /* Word align the source */ + i_src = (const void *) ((unsigned)src & ~3); + + /* Load the holding buffer */ + buf_hold = *i_src++ << 8; + + for (; c >= 4; c -= 4) { + value = *i_src++; + *i_dst++ = buf_hold | value >> 24; + buf_hold = value << 8; + } + + /* Realign the source */ + src = (const void *)i_src; + src -= 3; + break; + case 0x2: /* Unaligned - Off by 2 */ + /* Word align the source */ + i_src = (const void *) ((unsigned)src & ~3); + + /* Load the holding buffer */ + buf_hold = *i_src++ << 16; + + for (; c >= 4; c -= 4) { + value = *i_src++; + *i_dst++ = buf_hold | value >> 16; + buf_hold = value << 16; + } + + /* Realign the source */ + src = (const void *)i_src; + src -= 2; + break; + case 0x3: /* Unaligned - Off by 3 */ + /* Word align the source */ + i_src = (const void *) ((unsigned)src & ~3); + + /* Load the holding buffer */ + buf_hold = *i_src++ << 24; + + for (; c >= 4; c -= 4) { + value = *i_src++; + *i_dst++ = buf_hold | value >> 8; + buf_hold = value << 24; + } + + /* Realign the source */ + src = (const void *)i_src; + src -= 1; + break; + } + dst = (void *)i_dst; + } + + /* Finish off any remaining bytes */ + /* simple fast copy, ... unless a cache boundry is crossed */ + switch (c) { + case 3: + *dst++ = *src++; + case 2: + *dst++ = *src++; + case 1: + *dst++ = *src++; + } + + return v_dst; +#endif +} +EXPORT_SYMBOL(memcpy); +#endif /* __HAVE_ARCH_MEMCPY */ + +void *cacheable_memcpy(void *d, const void *s, __kernel_size_t c) +{ + return memcpy(d, s, c); +} diff --git a/arch/microblaze/lib/memmove.c b/arch/microblaze/lib/memmove.c new file mode 100644 index 0000000..d4e9f49 --- /dev/null +++ b/arch/microblaze/lib/memmove.c @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * Reasonably optimised generic C-code for memcpy on Microblaze + * This is generic C code to do efficient, alignment-aware memmove. + * + * It is based on demo code originally Copyright 2001 by Intel Corp, taken from + * http://www.embedded.com/showArticle.jhtml?articleID=19205567 + * + * Attempts were made, unsuccesfully, to contact the original + * author of this code (Michael Morrow, Intel). Below is the original + * copyright notice. + * + * This software has been developed by Intel Corporation. + * Intel specifically disclaims all warranties, express or + * implied, and all liability, including consequential and + * other indirect damages, for the use of this program, including + * liability for infringement of any proprietary rights, + * and including the warranties of merchantability and fitness + * for a particular purpose. Intel does not assume any + * responsibility for and errors which may appear in this program + * not any responsibility to update it. + */ + +#include +#include +#include +#include +#include + +#ifdef __HAVE_ARCH_MEMMOVE +void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) +{ + const char *src = v_src; + char *dst = v_dst; + +#ifdef CONFIG_OPT_LIB_FUNCTION + const uint32_t *i_src; + uint32_t *i_dst; +#endif + + if (!c) + return v_dst; + + /* Use memcpy when source is higher than dest */ + if (v_dst <= v_src) + return memcpy(v_dst, v_src, c); + +#ifndef CONFIG_OPT_LIB_FUNCTION + /* copy backwards, from end to beginning */ + src += c; + dst += c; + + /* Simple, byte oriented memmove. */ + while (c--) + *--dst = *--src; + + return v_dst; +#else + /* The following code tries to optimize the copy by using unsigned + * alignment. This will work fine if both source and destination are + * aligned on the same boundary. However, if they are aligned on + * different boundaries shifts will be necessary. This might result in + * bad performance on MicroBlaze systems without a barrel shifter. + */ + /* FIXME this part needs more test */ + /* Do a descending copy - this is a bit trickier! */ + dst += c; + src += c; + + if (c >= 4) { + unsigned value, buf_hold; + + /* Align the destination to a word boundry. */ + /* This is done in an endian independant manner. */ + + switch ((unsigned long)dst & 3) { + case 3: + *--dst = *--src; + --c; + case 2: + *--dst = *--src; + --c; + case 1: + *--dst = *--src; + --c; + } + + i_dst = (void *)dst; + /* Choose a copy scheme based on the source */ + /* alignment relative to dstination. */ + switch ((unsigned long)src & 3) { + case 0x0: /* Both byte offsets are aligned */ + + i_src = (const void *)src; + + for (; c >= 4; c -= 4) + *--i_dst = *--i_src; + + src = (const void *)i_src; + break; + case 0x1: /* Unaligned - Off by 1 */ + /* Word align the source */ + i_src = (const void *) (((unsigned)src + 4) & ~3); + + /* Load the holding buffer */ + buf_hold = *--i_src >> 24; + + for (; c >= 4; c -= 4) { + value = *--i_src; + *--i_dst = buf_hold << 8 | value; + buf_hold = value >> 24; + } + + /* Realign the source */ + src = (const void *)i_src; + src += 1; + break; + case 0x2: /* Unaligned - Off by 2 */ + /* Word align the source */ + i_src = (const void *) (((unsigned)src + 4) & ~3); + + /* Load the holding buffer */ + buf_hold = *--i_src >> 16; + + for (; c >= 4; c -= 4) { + value = *--i_src; + *--i_dst = buf_hold << 16 | value; + buf_hold = value >> 16; + } + + /* Realign the source */ + src = (const void *)i_src; + src += 2; + break; + case 0x3: /* Unaligned - Off by 3 */ + /* Word align the source */ + i_src = (const void *) (((unsigned)src + 4) & ~3); + + /* Load the holding buffer */ + buf_hold = *--i_src >> 8; + + for (; c >= 4; c -= 4) { + value = *--i_src; + *--i_dst = buf_hold << 24 | value; + buf_hold = value >> 8; + } + + /* Realign the source */ + src = (const void *)i_src; + src += 3; + break; + } + dst = (void *)i_dst; + } + + /* simple fast copy, ... unless a cache boundry is crossed */ + /* Finish off any remaining bytes */ + switch (c) { + case 4: + *--dst = *--src; + case 3: + *--dst = *--src; + case 2: + *--dst = *--src; + case 1: + *--dst = *--src; + } + return v_dst; +#endif +} +EXPORT_SYMBOL(memmove); +#endif /* __HAVE_ARCH_MEMMOVE */ diff --git a/arch/microblaze/lib/memset.c b/arch/microblaze/lib/memset.c new file mode 100644 index 0000000..941dc8f --- /dev/null +++ b/arch/microblaze/lib/memset.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * Reasonably optimised generic C-code for memset on Microblaze + * This is generic C code to do efficient, alignment-aware memcpy. + * + * It is based on demo code originally Copyright 2001 by Intel Corp, taken from + * http://www.embedded.com/showArticle.jhtml?articleID=19205567 + * + * Attempts were made, unsuccesfully, to contact the original + * author of this code (Michael Morrow, Intel). Below is the original + * copyright notice. + * + * This software has been developed by Intel Corporation. + * Intel specifically disclaims all warranties, express or + * implied, and all liability, including consequential and + * other indirect damages, for the use of this program, including + * liability for infringement of any proprietary rights, + * and including the warranties of merchantability and fitness + * for a particular purpose. Intel does not assume any + * responsibility for and errors which may appear in this program + * not any responsibility to update it. + */ + +#include +#include +#include +#include +#include + +#ifdef __HAVE_ARCH_MEMSET +void *memset(void *v_src, int c, __kernel_size_t n) +{ + + char *src = v_src; +#ifdef CONFIG_OPT_LIB_FUNCTION + uint32_t *i_src; + uint32_t w32; +#endif + /* Truncate c to 8 bits */ + c = (c & 0xFF); + +#ifdef CONFIG_OPT_LIB_FUNCTION + /* Make a repeating word out of it */ + w32 = c; + w32 |= w32 << 8; + w32 |= w32 << 16; + + if (n >= 4) { + /* Align the destination to a word boundary */ + /* This is done in an endian independant manner */ + switch ((unsigned) src & 3) { + case 1: + *src++ = c; + --n; + case 2: + *src++ = c; + --n; + case 3: + *src++ = c; + --n; + } + + i_src = (void *)src; + + /* Do as many full-word copies as we can */ + for (; n >= 4; n -= 4) + *i_src++ = w32; + + src = (void *)i_src; + } +#endif + /* Simple, byte oriented memset or the rest of count. */ + while (n--) + *src++ = c; + + return v_src; +} +EXPORT_SYMBOL(memset); +#endif /* __HAVE_ARCH_MEMSET */ -- cgit v0.10.2 From f11e044b449c0534cd2de3465f68925f68190866 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:22 +0100 Subject: microblaze_v8: checksum support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/checksum.h b/arch/microblaze/include/asm/checksum.h new file mode 100644 index 0000000..92b3076 --- /dev/null +++ b/arch/microblaze/include/asm/checksum.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_CHECKSUM_H +#define _ASM_MICROBLAZE_CHECKSUM_H + +#include + +/* + * computes the checksum of the TCP/UDP pseudo-header + * returns a 16-bit checksum, already complemented + */ +static inline __wsum +csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, + unsigned short proto, __wsum sum) +{ + __asm__("add %0, %0, %1\n\t" + "addc %0, %0, %2\n\t" + "addc %0, %0, %3\n\t" + "addc %0, %0, r0\n\t" + : "+&d" (sum) + : "d" (saddr), "d" (daddr), "d" (len + proto)); + + return sum; +} + +/* + * computes the checksum of a memory block at buff, length len, + * and adds in "sum" (32-bit) + * + * returns a 32-bit number suitable for feeding into itself + * or csum_tcpudp_magic + * + * this function must be called with even lengths, except + * for the last fragment, which may be odd + * + * it's best to have buff aligned on a 32-bit boundary + */ +extern __wsum csum_partial(const void *buff, int len, __wsum sum); + +/* + * the same as csum_partial, but copies from src while it + * checksums + * + * here even more important to align src and dst on a 32-bit (or even + * better 64-bit) boundary + */ +extern __wsum csum_partial_copy(const char *src, char *dst, int len, int sum); + +/* + * the same as csum_partial_copy, but copies from user space. + * + * here even more important to align src and dst on a 32-bit (or even + * better 64-bit) boundary + */ +extern __wsum csum_partial_copy_from_user(const char *src, char *dst, + int len, int sum, int *csum_err); + +#define csum_partial_copy_nocheck(src, dst, len, sum) \ + csum_partial_copy((src), (dst), (len), (sum)) + +/* + * This is a version of ip_compute_csum() optimized for IP headers, + * which always checksum on 4 octet boundaries. + * + */ +extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); + +/* + * Fold a partial checksum + */ +static inline __sum16 csum_fold(unsigned int sum) +{ + sum = (sum & 0xffff) + (sum >> 16); + sum = (sum & 0xffff) + (sum >> 16); + return ~sum; +} + +static inline __sum16 +csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len, + unsigned short proto, __wsum sum) +{ + return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); +} + +/* + * this routine is used for miscellaneous IP-like checksums, mainly + * in icmp.c + */ +extern __sum16 ip_compute_csum(const unsigned char *buff, int len); + +#endif /* _ASM_MICROBLAZE_CHECKSUM_H */ diff --git a/arch/microblaze/lib/checksum.c b/arch/microblaze/lib/checksum.c new file mode 100644 index 0000000..8093400 --- /dev/null +++ b/arch/microblaze/lib/checksum.c @@ -0,0 +1,163 @@ +/* + * + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * IP/TCP/UDP checksumming routines + * + * Authors: Jorge Cwik, + * Arnt Gulbrandsen, + * Tom May, + * Andreas Schwab, + * Lots of code moved from tcp.c and ip.c; see those files + * for more names. + * + * 03/02/96 Jes Sorensen, Andreas Schwab, Roman Hodek: + * Fixed some nasty bugs, causing some horrible crashes. + * A: At some points, the sum (%0) was used as + * length-counter instead of the length counter + * (%1). Thanks to Roman Hodek for pointing this out. + * B: GCC seems to mess up if one uses too many + * data-registers to hold input values and one tries to + * specify d0 and d1 as scratch registers. Letting gcc + * choose these registers itself solves the problem. + * + * 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. + */ + +/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access + kills, so most of the assembly has to go. */ + +#include +#include +#include + +static inline unsigned short from32to16(unsigned long x) +{ + /* add up 16-bit and 16-bit for 16+c bit */ + x = (x & 0xffff) + (x >> 16); + /* add up carry.. */ + x = (x & 0xffff) + (x >> 16); + return x; +} + +static unsigned int do_csum(const unsigned char *buff, int len) +{ + int odd, count; + unsigned long result = 0; + + if (len <= 0) + goto out; + odd = 1 & (unsigned long) buff; + if (odd) { + result = *buff; + len--; + buff++; + } + count = len >> 1; /* nr of 16-bit words.. */ + if (count) { + if (2 & (unsigned long) buff) { + result += *(unsigned short *) buff; + count--; + len -= 2; + buff += 2; + } + count >>= 1; /* nr of 32-bit words.. */ + if (count) { + unsigned long carry = 0; + do { + unsigned long w = *(unsigned long *) buff; + count--; + buff += 4; + result += carry; + result += w; + carry = (w > result); + } while (count); + result += carry; + result = (result & 0xffff) + (result >> 16); + } + if (len & 2) { + result += *(unsigned short *) buff; + buff += 2; + } + } + if (len & 1) + result += (*buff << 8); + result = from32to16(result); + if (odd) + result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); +out: + return result; +} + +/* + * This is a version of ip_compute_csum() optimized for IP headers, + * which always checksum on 4 octet boundaries. + */ +__sum16 ip_fast_csum(const void *iph, unsigned int ihl) +{ + return (__force __sum16)~do_csum(iph, ihl*4); +} + +/* + * computes the checksum of a memory block at buff, length len, + * and adds in "sum" (32-bit) + * + * returns a 32-bit number suitable for feeding into itself + * or csum_tcpudp_magic + * + * this function must be called with even lengths, except + * for the last fragment, which may be odd + * + * it's best to have buff aligned on a 32-bit boundary + */ +__wsum csum_partial(const void *buff, int len, __wsum sum) +{ + unsigned int result = do_csum(buff, len); + + /* add in old sum, and carry.. */ + result += sum; + if (sum > result) + result += 1; + return result; +} +EXPORT_SYMBOL(csum_partial); + +/* + * this routine is used for miscellaneous IP-like checksums, mainly + * in icmp.c + */ +__sum16 ip_compute_csum(const unsigned char *buff, int len) +{ + return ~do_csum(buff, len); +} +EXPORT_SYMBOL(ip_compute_csum); + +/* + * copy from fs while checksumming, otherwise like csum_partial + */ +__wsum +csum_partial_copy_from_user(const char __user *src, char *dst, int len, + int sum, int *csum_err) +{ + if (csum_err) + *csum_err = 0; + memcpy(dst, src, len); + return csum_partial(dst, len, sum); +} +EXPORT_SYMBOL(csum_partial_copy_from_user); + +/* + * copy from ds while checksumming, otherwise like csum_partial + */ +__wsum +csum_partial_copy(const char *src, char *dst, int len, int sum) +{ + memcpy(dst, src, len); + return csum_partial(dst, len, sum); +} +EXPORT_SYMBOL(csum_partial_copy); -- cgit v0.10.2 From 89272a51b322aa14332d58896b9d377ea9b4e551 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:22 +0100 Subject: microblaze_v8: early_printk support Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/early_printk.c b/arch/microblaze/kernel/early_printk.c new file mode 100644 index 0000000..62cc789 --- /dev/null +++ b/arch/microblaze/kernel/early_printk.c @@ -0,0 +1,107 @@ +/* + * Early printk support for Microblaze. + * + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2003-2006 Yasushi SHOJI + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static u32 early_console_initialized; +static u32 base_addr; + +static void early_printk_putc(char c) +{ + /* + * Limit how many times we'll spin waiting for TX FIFO status. + * This will prevent lockups if the base address is incorrectly + * set, or any other issue on the UARTLITE. + * This limit is pretty arbitrary, unless we are at about 10 baud + * we'll never timeout on a working UART. + */ + + unsigned retries = 10000; + /* read status bit - 0x8 offset */ + while (retries-- && (in_be32(base_addr + 8) & (1 << 3))) + ; + + /* Only attempt the iowrite if we didn't timeout */ + /* write to TX_FIFO - 0x4 offset */ + if (retries) + out_be32(base_addr + 4, c & 0xff); +} + +static void early_printk_write(struct console *unused, + const char *s, unsigned n) +{ + while (*s && n-- > 0) { + early_printk_putc(*s); + if (*s == '\n') + early_printk_putc('\r'); + s++; + } +} + +static struct console early_serial_console = { + .name = "earlyser", + .write = early_printk_write, + .flags = CON_PRINTBUFFER, + .index = -1, +}; + +static struct console *early_console = &early_serial_console; + +void early_printk(const char *fmt, ...) +{ + char buf[512]; + int n; + va_list ap; + + if (early_console_initialized) { + va_start(ap, fmt); + n = vscnprintf(buf, 512, fmt, ap); + early_console->write(early_console, buf, n); + va_end(ap); + } +} + +int __init setup_early_printk(char *opt) +{ + if (early_console_initialized) + return 1; + + base_addr = early_uartlite_console(); + if (base_addr) { + early_console_initialized = 1; + early_printk("early_printk_console is enabled at 0x%08x\n", + base_addr); + + /* register_console(early_console); */ + + return 0; + } else + return 1; +} + +void __init disable_early_printk(void) +{ + if (!early_console_initialized || !early_console) + return; + printk(KERN_WARNING "disabling early console\n"); + unregister_console(early_console); + early_console_initialized = 0; +} -- cgit v0.10.2 From 2660663ff2d34a3665381a2591bbc3ce0cdbd69c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:23 +0100 Subject: microblaze_v8: uaccess files Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h new file mode 100644 index 0000000..5a3ffc3 --- /dev/null +++ b/arch/microblaze/include/asm/uaccess.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_UACCESS_H +#define _ASM_MICROBLAZE_UACCESS_H + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +#include +#include +#include /* RLIMIT_FSIZE */ +#include + +#include +#include +#include +#include +#include + +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 + +extern int ___range_ok(unsigned long addr, unsigned long size); + +#define __range_ok(addr, size) \ + ___range_ok((unsigned long)(addr), (unsigned long)(size)) + +#define access_ok(type, addr, size) (__range_ok((addr), (size)) == 0) +#define __access_ok(add, size) (__range_ok((addr), (size)) == 0) + +extern inline int bad_user_access_length(void) +{ + return 0; +} +/* FIXME this is function for optimalization -> memcpy */ +#define __get_user(var, ptr) \ + ({ \ + int __gu_err = 0; \ + switch (sizeof(*(ptr))) { \ + case 1: \ + case 2: \ + case 4: \ + (var) = *(ptr); \ + break; \ + case 8: \ + memcpy((void *) &(var), (ptr), 8); \ + break; \ + default: \ + (var) = 0; \ + __gu_err = __get_user_bad(); \ + break; \ + } \ + __gu_err; \ + }) + +#define __get_user_bad() (bad_user_access_length(), (-EFAULT)) + +#define __put_user(var, ptr) \ + ({ \ + int __pu_err = 0; \ + switch (sizeof(*(ptr))) { \ + case 1: \ + case 2: \ + case 4: \ + *(ptr) = (var); \ + break; \ + case 8: { \ + typeof(*(ptr)) __pu_val = var; \ + memcpy(ptr, &__pu_val, sizeof(__pu_val));\ + } \ + break; \ + default: \ + __pu_err = __put_user_bad(); \ + break; \ + } \ + __pu_err; \ + }) + +#define __put_user_bad() (bad_user_access_length(), (-EFAULT)) + +#define put_user(x, ptr) __put_user(x, ptr) +#define get_user(x, ptr) __get_user(x, ptr) + +#define copy_to_user(to, from, n) (memcpy(to, from, n), 0) +#define copy_from_user(to, from, n) (memcpy(to, from, n), 0) + +#define __copy_to_user(to, from, n) (copy_to_user(to, from, n)) +#define __copy_from_user(to, from, n) (copy_from_user(to, from, n)) +#define __copy_to_user_inatomic(to, from, n) (__copy_to_user(to, from, n)) +#define __copy_from_user_inatomic(to, from, n) (__copy_from_user(to, from, n)) + +#define __clear_user(addr, n) (memset((void *)addr, 0, n), 0) + +static inline unsigned long clear_user(void *addr, unsigned long size) +{ + if (access_ok(VERIFY_WRITE, addr, size)) + size = __clear_user(addr, size); + return size; +} + +/* Returns 0 if exception not found and fixup otherwise. */ +extern unsigned long search_exception_table(unsigned long); + + +extern long strncpy_from_user(char *dst, const char __user *src, long count); +extern long strnlen_user(const char __user *src, long count); +extern long __strncpy_from_user(char *dst, const char __user *src, long count); + +/* + * The exception table consists of pairs of addresses: the first is the + * address of an instruction that is allowed to fault, and the second is + * the address at which the program should continue. No registers are + * modified, so it is entirely up to the continuation code to figure out + * what to do. + * + * All the routines below use bits of fixup code that are out of line + * with the main instruction path. This means when everything is well, + * we don't even have to jump over them. Further, they do not intrude + * on our cache or tlb entries. + */ +struct exception_table_entry { + unsigned long insn, fixup; +}; + +#endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ + +#endif /* _ASM_MICROBLAZE_UACCESS_H */ diff --git a/arch/microblaze/lib/uaccess.c b/arch/microblaze/lib/uaccess.c new file mode 100644 index 0000000..8eb9df5 --- /dev/null +++ b/arch/microblaze/lib/uaccess.c @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include + +#include + +long strnlen_user(const char __user *src, long count) +{ + return strlen(src) + 1; +} + +#define __do_strncpy_from_user(dst, src, count, res) \ + do { \ + char *tmp; \ + strncpy(dst, src, count); \ + for (tmp = dst; *tmp && count > 0; tmp++, count--) \ + ; \ + res = (tmp - dst); \ + } while (0) + +long __strncpy_from_user(char *dst, const char __user *src, long count) +{ + long res; + __do_strncpy_from_user(dst, src, count, res); + return res; +} + +long strncpy_from_user(char *dst, const char __user *src, long count) +{ + long res = -EFAULT; + if (access_ok(VERIFY_READ, src, 1)) + __do_strncpy_from_user(dst, src, count, res); + return res; +} -- cgit v0.10.2 From ecc6dfc8adfc76d323c513bc88cb260344c11139 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:24 +0100 Subject: microblaze_v8: heartbeat file Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/heartbeat.c b/arch/microblaze/kernel/heartbeat.c new file mode 100644 index 0000000..1bdf202 --- /dev/null +++ b/arch/microblaze/kernel/heartbeat.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include + +#include +#include +#include + +static unsigned int base_addr; + +void heartbeat(void) +{ + static unsigned int cnt, period, dist; + + if (base_addr) { + if (cnt == 0 || cnt == dist) + out_be32(base_addr, 1); + else if (cnt == 7 || cnt == dist + 7) + out_be32(base_addr, 0); + + if (++cnt > period) { + cnt = 0; + /* + * The hyperbolic function below modifies the heartbeat + * period length in dependency of the current (5min) + * load. It goes through the points f(0)=126, f(1)=86, + * f(5)=51, f(inf)->30. + */ + period = ((672 << FSHIFT) / (5 * avenrun[0] + + (7 << FSHIFT))) + 30; + dist = period / 4; + } + } +} + +void setup_heartbeat(void) +{ + struct device_node *gpio = NULL; + int j; + char *gpio_list[] = { + "xlnx,xps-gpio-1.00.a", + "xlnx,opb-gpio-1.00.a", + NULL + }; + + for (j = 0; gpio_list[j] != NULL; j++) { + gpio = of_find_compatible_node(NULL, NULL, gpio_list[j]); + if (gpio) + break; + } + + base_addr = *(int *) of_get_property(gpio, "reg", NULL); + base_addr = (unsigned long) ioremap(base_addr, PAGE_SIZE); + printk(KERN_NOTICE "Heartbeat GPIO at 0x%x\n", base_addr); + + if (*(int *) of_get_property(gpio, "xlnx,is-bidir", NULL)) + out_be32(base_addr + 4, 0); /* GPIO is configured as output */ +} -- cgit v0.10.2 From ec9f91018408617d32dc189cc5e6d030351270c5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:24 +0100 Subject: microblaze_v8: setup.c, setup.h - system setting Reviewed-by: Ingo Molnar Reviewed-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/setup.h b/arch/microblaze/include/asm/setup.h new file mode 100644 index 0000000..9b98e8e --- /dev/null +++ b/arch/microblaze/include/asm/setup.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2007-2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SETUP_H +#define _ASM_MICROBLAZE_SETUP_H + +#define COMMAND_LINE_SIZE 256 + +# ifndef __ASSEMBLY__ + +# ifdef __KERNEL__ +extern unsigned int boot_cpuid; /* move to smp.h */ + +extern char cmd_line[COMMAND_LINE_SIZE]; +# endif/* __KERNEL__ */ + +void early_printk(const char *fmt, ...); + +int setup_early_printk(char *opt); +void disable_early_printk(void); + +void heartbeat(void); +void setup_heartbeat(void); + +unsigned long long sched_clock(void); + +void time_init(void); +void init_IRQ(void); +void machine_early_init(const char *cmdline, unsigned int ram, + unsigned int fdt); + +void machine_restart(char *cmd); +void machine_shutdown(void); +void machine_halt(void); +void machine_power_off(void); + +# endif /* __ASSEMBLY__ */ +#endif /* _ASM_MICROBLAZE_SETUP_H */ diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c new file mode 100644 index 0000000..eb6b417 --- /dev/null +++ b/arch/microblaze/kernel/setup.c @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +DEFINE_PER_CPU(unsigned int, KSP); /* Saved kernel stack pointer */ +DEFINE_PER_CPU(unsigned int, KM); /* Kernel/user mode */ +DEFINE_PER_CPU(unsigned int, ENTRY_SP); /* Saved SP on kernel entry */ +DEFINE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */ +DEFINE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ + +unsigned int boot_cpuid; +char cmd_line[COMMAND_LINE_SIZE]; + +void __init setup_arch(char **cmdline_p) +{ +#ifdef CONFIG_CMDLINE_FORCE + strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); + strlcpy(boot_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); +#endif + *cmdline_p = cmd_line; + + console_verbose(); + + unflatten_device_tree(); + + /* NOTE I think that this function is not necessary to call */ + /* irq_early_init(); */ + setup_cpuinfo(); + + __invalidate_icache_all(); + __enable_icache(); + + __invalidate_dcache_all(); + __enable_dcache(); + + panic_timeout = 120; + + setup_memory(); + +#if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER) + printk(KERN_NOTICE "Self modified code enable\n"); +#endif + +#ifdef CONFIG_VT +#if defined(CONFIG_XILINX_CONSOLE) + conswitchp = &xil_con; +#elif defined(CONFIG_DUMMY_CONSOLE) + conswitchp = &dummy_con; +#endif +#endif +} + +#ifdef CONFIG_MTD_UCLINUX +/* Handle both romfs and cramfs types, without generating unnecessary + code (ie no point checking for CRAMFS if it's not even enabled) */ +inline unsigned get_romfs_len(unsigned *addr) +{ +#ifdef CONFIG_ROMFS_FS + if (memcmp(&addr[0], "-rom1fs-", 8) == 0) /* romfs */ + return be32_to_cpu(addr[2]); +#endif + +#ifdef CONFIG_CRAMFS + if (addr[0] == le32_to_cpu(0x28cd3d45)) /* cramfs */ + return le32_to_cpu(addr[1]); +#endif + return 0; +} +#endif /* CONFIG_MTD_UCLINUX_EBSS */ + +void __init machine_early_init(const char *cmdline, unsigned int ram, + unsigned int fdt) +{ + unsigned long *src, *dst = (unsigned long *)0x0; + +/* clearing bss section */ + memset(__bss_start, 0, __bss_stop-__bss_start); + memset(_ssbss, 0, _esbss-_ssbss); + + /* + * Copy command line passed from bootloader, or use default + * if none provided, or forced + */ +#ifndef CONFIG_CMDLINE_BOOL + if (cmdline && cmdline[0] != '\0') + strlcpy(cmd_line, cmdline, COMMAND_LINE_SIZE); +#endif + +/* initialize device tree for usage in early_printk */ + early_init_devtree((void *)_fdt_start); + +#ifdef CONFIG_EARLY_PRINTK + setup_early_printk(NULL); +#endif + + early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt); + printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt); + +#ifdef CONFIG_MTD_UCLINUX + { + int size; + unsigned int romfs_base; + romfs_base = (ram ? ram : (unsigned int)&__init_end); + /* if CONFIG_MTD_UCLINUX_EBSS is defined, assume ROMFS is at the + * end of kernel, which is ROMFS_LOCATION defined above. */ + size = PAGE_ALIGN(get_romfs_len((unsigned *)romfs_base)); + early_printk("Found romfs @ 0x%08x (0x%08x)\n", + romfs_base, size); + early_printk("#### klimit %p ####\n", klimit); + BUG_ON(size < 0); /* What else can we do? */ + + /* Use memmove to handle likely case of memory overlap */ + early_printk("Moving 0x%08x bytes from 0x%08x to 0x%08x\n", + size, romfs_base, (unsigned)&_ebss); + memmove(&_ebss, (int *)romfs_base, size); + + /* update klimit */ + klimit += PAGE_ALIGN(size); + early_printk("New klimit: 0x%08x\n", (unsigned)klimit); + } +#endif + + for (src = __ivt_start; src < __ivt_end; src++, dst++) + *dst = *src; + + /* Initialize global data */ + per_cpu(KM, 0) = 0x1; /* We start in kernel mode */ + per_cpu(CURRENT_SAVE, 0) = (unsigned long)current; +} + +#ifdef CONFIG_DEBUG_FS +struct dentry *of_debugfs_root; + +static int microblaze_debugfs_init(void) +{ + of_debugfs_root = debugfs_create_dir("microblaze", NULL); + + return of_debugfs_root == NULL; +} +arch_initcall(microblaze_debugfs_init); +#endif + +void machine_restart(char *cmd) +{ + printk(KERN_NOTICE "Machine restart...\n"); + dump_stack(); + while (1) + ; +} + +void machine_shutdown(void) +{ + printk(KERN_NOTICE "Machine shutdown...\n"); + while (1) + ; +} + +void machine_halt(void) +{ + printk(KERN_NOTICE "Machine halt...\n"); + while (1) + ; +} + +void machine_power_off(void) +{ + printk(KERN_NOTICE "Machine power off...\n"); + while (1) + ; +} -- cgit v0.10.2 From c47f10baa0bd7e3de6b7072cfdcafef58f4147f5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:25 +0100 Subject: microblaze_v8: asm-offsets.c Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/asm-offsets.c b/arch/microblaze/kernel/asm-offsets.c new file mode 100644 index 0000000..38e1a2e --- /dev/null +++ b/arch/microblaze/kernel/asm-offsets.c @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* struct pt_regs */ + DEFINE(PT_SIZE, sizeof(struct pt_regs)); + DEFINE(PT_MSR, offsetof(struct pt_regs, msr)); + DEFINE(PT_EAR, offsetof(struct pt_regs, ear)); + DEFINE(PT_ESR, offsetof(struct pt_regs, esr)); + DEFINE(PT_FSR, offsetof(struct pt_regs, fsr)); + DEFINE(PT_PC, offsetof(struct pt_regs, pc)); + DEFINE(PT_R0, offsetof(struct pt_regs, r0)); + DEFINE(PT_R1, offsetof(struct pt_regs, r1)); + DEFINE(PT_R2, offsetof(struct pt_regs, r2)); + DEFINE(PT_R3, offsetof(struct pt_regs, r3)); + DEFINE(PT_R4, offsetof(struct pt_regs, r4)); + DEFINE(PT_R5, offsetof(struct pt_regs, r5)); + DEFINE(PT_R6, offsetof(struct pt_regs, r6)); + DEFINE(PT_R7, offsetof(struct pt_regs, r7)); + DEFINE(PT_R8, offsetof(struct pt_regs, r8)); + DEFINE(PT_R9, offsetof(struct pt_regs, r9)); + DEFINE(PT_R10, offsetof(struct pt_regs, r10)); + DEFINE(PT_R11, offsetof(struct pt_regs, r11)); + DEFINE(PT_R12, offsetof(struct pt_regs, r12)); + DEFINE(PT_R13, offsetof(struct pt_regs, r13)); + DEFINE(PT_R14, offsetof(struct pt_regs, r14)); + DEFINE(PT_R15, offsetof(struct pt_regs, r15)); + DEFINE(PT_R16, offsetof(struct pt_regs, r16)); + DEFINE(PT_R17, offsetof(struct pt_regs, r17)); + DEFINE(PT_R18, offsetof(struct pt_regs, r18)); + DEFINE(PT_R19, offsetof(struct pt_regs, r19)); + DEFINE(PT_R20, offsetof(struct pt_regs, r20)); + DEFINE(PT_R21, offsetof(struct pt_regs, r21)); + DEFINE(PT_R22, offsetof(struct pt_regs, r22)); + DEFINE(PT_R23, offsetof(struct pt_regs, r23)); + DEFINE(PT_R24, offsetof(struct pt_regs, r24)); + DEFINE(PT_R25, offsetof(struct pt_regs, r25)); + DEFINE(PT_R26, offsetof(struct pt_regs, r26)); + DEFINE(PT_R27, offsetof(struct pt_regs, r27)); + DEFINE(PT_R28, offsetof(struct pt_regs, r28)); + DEFINE(PT_R29, offsetof(struct pt_regs, r29)); + DEFINE(PT_R30, offsetof(struct pt_regs, r30)); + DEFINE(PT_R31, offsetof(struct pt_regs, r31)); + DEFINE(PT_MODE, offsetof(struct pt_regs, kernel_mode)); + BLANK(); + + /* Magic offsets for PTRACE PEEK/POKE etc */ + DEFINE(PT_TEXT_ADDR, sizeof(struct pt_regs) + 1); + DEFINE(PT_TEXT_LEN, sizeof(struct pt_regs) + 2); + DEFINE(PT_DATA_ADDR, sizeof(struct pt_regs) + 3); + BLANK(); + + /* struct task_struct */ + DEFINE(TS_THREAD_INFO, offsetof(struct task_struct, stack)); + + /* struct thread_info */ + DEFINE(TI_TASK, offsetof(struct thread_info, task)); + DEFINE(TI_EXEC_DOMAIN, offsetof(struct thread_info, exec_domain)); + DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); + DEFINE(TI_STATUS, offsetof(struct thread_info, status)); + DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); + DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count)); + DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); + DEFINE(TI_RESTART_BLOCK, offsetof(struct thread_info, restart_block)); + DEFINE(TI_CPU_CONTEXT, offsetof(struct thread_info, cpu_context)); + BLANK(); + + /* struct cpu_context */ + DEFINE(CC_R1, offsetof(struct cpu_context, r1)); /* r1 */ + DEFINE(CC_R2, offsetof(struct cpu_context, r2)); + /* dedicated registers */ + DEFINE(CC_R13, offsetof(struct cpu_context, r13)); + DEFINE(CC_R14, offsetof(struct cpu_context, r14)); + DEFINE(CC_R15, offsetof(struct cpu_context, r15)); + DEFINE(CC_R16, offsetof(struct cpu_context, r16)); + DEFINE(CC_R17, offsetof(struct cpu_context, r17)); + DEFINE(CC_R18, offsetof(struct cpu_context, r18)); + /* non-volatile registers */ + DEFINE(CC_R19, offsetof(struct cpu_context, r19)); + DEFINE(CC_R20, offsetof(struct cpu_context, r20)); + DEFINE(CC_R21, offsetof(struct cpu_context, r21)); + DEFINE(CC_R22, offsetof(struct cpu_context, r22)); + DEFINE(CC_R23, offsetof(struct cpu_context, r23)); + DEFINE(CC_R24, offsetof(struct cpu_context, r24)); + DEFINE(CC_R25, offsetof(struct cpu_context, r25)); + DEFINE(CC_R26, offsetof(struct cpu_context, r26)); + DEFINE(CC_R27, offsetof(struct cpu_context, r27)); + DEFINE(CC_R28, offsetof(struct cpu_context, r28)); + DEFINE(CC_R29, offsetof(struct cpu_context, r29)); + DEFINE(CC_R30, offsetof(struct cpu_context, r30)); + /* special purpose registers */ + DEFINE(CC_MSR, offsetof(struct cpu_context, msr)); + DEFINE(CC_EAR, offsetof(struct cpu_context, ear)); + DEFINE(CC_ESR, offsetof(struct cpu_context, esr)); + DEFINE(CC_FSR, offsetof(struct cpu_context, fsr)); + BLANK(); + + return 0; +} -- cgit v0.10.2 From 6496a23add642b7c9203411bdff3ff761835a80a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:26 +0100 Subject: microblaze_v8: process and init task function Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/init_task.c b/arch/microblaze/kernel/init_task.c new file mode 100644 index 0000000..48eb9fb --- /dev/null +++ b/arch/microblaze/kernel/init_task.c @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2009 Michal Simek + * Copyright (C) 2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +#include + +static struct signal_struct init_signals = INIT_SIGNALS(init_signals); +static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); +struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + +union thread_union init_thread_union + __attribute__((__section__(".data.init_task"))) = +{ INIT_THREAD_INFO(init_task) }; + +struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c new file mode 100644 index 0000000..60e9ed7 --- /dev/null +++ b/arch/microblaze/kernel/process.c @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +void show_regs(struct pt_regs *regs) +{ + printk(KERN_INFO " Registers dump: mode=%X\r\n", regs->kernel_mode); + printk(KERN_INFO " r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n", + regs->r1, regs->r2, regs->r3, regs->r4); + printk(KERN_INFO " r5=%08lX, r6=%08lX, r7=%08lX, r8=%08lX\n", + regs->r5, regs->r6, regs->r7, regs->r8); + printk(KERN_INFO " r9=%08lX, r10=%08lX, r11=%08lX, r12=%08lX\n", + regs->r9, regs->r10, regs->r11, regs->r12); + printk(KERN_INFO " r13=%08lX, r14=%08lX, r15=%08lX, r16=%08lX\n", + regs->r13, regs->r14, regs->r15, regs->r16); + printk(KERN_INFO " r17=%08lX, r18=%08lX, r19=%08lX, r20=%08lX\n", + regs->r17, regs->r18, regs->r19, regs->r20); + printk(KERN_INFO " r21=%08lX, r22=%08lX, r23=%08lX, r24=%08lX\n", + regs->r21, regs->r22, regs->r23, regs->r24); + printk(KERN_INFO " r25=%08lX, r26=%08lX, r27=%08lX, r28=%08lX\n", + regs->r25, regs->r26, regs->r27, regs->r28); + printk(KERN_INFO " r29=%08lX, r30=%08lX, r31=%08lX, rPC=%08lX\n", + regs->r29, regs->r30, regs->r31, regs->pc); + printk(KERN_INFO " msr=%08lX, ear=%08lX, esr=%08lX, fsr=%08lX\n", + regs->msr, regs->ear, regs->esr, regs->fsr); + while (1) + ; +} + +void (*pm_idle)(void); +void (*pm_power_off)(void) = NULL; +EXPORT_SYMBOL(pm_power_off); + +static int hlt_counter = 1; + +void disable_hlt(void) +{ + hlt_counter++; +} +EXPORT_SYMBOL(disable_hlt); + +void enable_hlt(void) +{ + hlt_counter--; +} +EXPORT_SYMBOL(enable_hlt); + +static int __init nohlt_setup(char *__unused) +{ + hlt_counter = 1; + return 1; +} +__setup("nohlt", nohlt_setup); + +static int __init hlt_setup(char *__unused) +{ + hlt_counter = 0; + return 1; +} +__setup("hlt", hlt_setup); + +void default_idle(void) +{ + if (!hlt_counter) { + clear_thread_flag(TIF_POLLING_NRFLAG); + smp_mb__after_clear_bit(); + local_irq_disable(); + while (!need_resched()) + cpu_sleep(); + local_irq_enable(); + set_thread_flag(TIF_POLLING_NRFLAG); + } else + while (!need_resched()) + cpu_relax(); +} + +void cpu_idle(void) +{ + set_thread_flag(TIF_POLLING_NRFLAG); + + /* endless idle loop with no priority at all */ + while (1) { + void (*idle)(void) = pm_idle; + + if (!idle) + idle = default_idle; + + tick_nohz_stop_sched_tick(1); + while (!need_resched()) + idle(); + tick_nohz_restart_sched_tick(); + + preempt_enable_no_resched(); + schedule(); + preempt_disable(); + check_pgt_cache(); + } +} + +void flush_thread(void) +{ +} + +/* FIXME - here will be a proposed change -> remove nr parameter */ +int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, + unsigned long unused, + struct task_struct *p, struct pt_regs *regs) +{ + struct pt_regs *childregs = task_pt_regs(p); + struct thread_info *ti = task_thread_info(p); + + *childregs = *regs; + if (user_mode(regs)) + childregs->r1 = usp; + else + childregs->r1 = ((unsigned long) ti) + THREAD_SIZE; + + memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); + ti->cpu_context.r1 = (unsigned long)childregs; + ti->cpu_context.msr = (unsigned long)childregs->msr; + ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; + + if (clone_flags & CLONE_SETTLS) + ; + + return 0; +} + +/* + * Return saved PC of a blocked thread. + */ +unsigned long thread_saved_pc(struct task_struct *tsk) +{ + struct cpu_context *ctx = + &(((struct thread_info *)(tsk->stack))->cpu_context); + + /* Check whether the thread is blocked in resume() */ + if (in_sched_functions(ctx->r15)) + return (unsigned long)ctx->r15; + else + return ctx->r14; +} + +static void kernel_thread_helper(int (*fn)(void *), void *arg) +{ + fn(arg); + do_exit(-1); +} + +int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) +{ + struct pt_regs regs; + int ret; + + memset(®s, 0, sizeof(regs)); + /* store them in non-volatile registers */ + regs.r5 = (unsigned long)fn; + regs.r6 = (unsigned long)arg; + local_save_flags(regs.msr); + regs.pc = (unsigned long)kernel_thread_helper; + regs.kernel_mode = 1; + + ret = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, + ®s, 0, NULL, NULL); + + return ret; +} + +unsigned long get_wchan(struct task_struct *p) +{ +/* TBD (used by procfs) */ + return 0; +} -- cgit v0.10.2 From 216f03481d2fca7094f5f982a65acfc2ca14fa85 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:27 +0100 Subject: microblaze_v8: delay.h, timex.h Reviewed-by: Ingo Molnar Acked-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/delay.h b/arch/microblaze/include/asm/delay.h new file mode 100644 index 0000000..05b7d39 --- /dev/null +++ b/arch/microblaze/include/asm/delay.h @@ -0,0 +1,72 @@ +/* + * include/asm-microblaze/delay.h + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2007 John Williams + * Copyright (C) 2006 Atmark Techno, Inc. + */ + +#ifndef _ASM_MICROBLAZE_DELAY_H +#define _ASM_MICROBLAZE_DELAY_H + +extern inline void __delay(unsigned long loops) +{ + asm volatile ("# __delay \n\t" \ + "1: addi %0, %0, -1\t\n" \ + "bneid %0, 1b \t\n" \ + "nop \t\n" + : "=r" (loops) + : "0" (loops)); +} + +/* + * Note that 19 * 226 == 4294 ==~ 2^32 / 10^6, so + * loops = (4294 * usecs * loops_per_jiffy * HZ) / 2^32. + * + * The mul instruction gives us loops = (a * b) / 2^32. + * We choose a = usecs * 19 * HZ and b = loops_per_jiffy * 226 + * because this lets us support a wide range of HZ and + * loops_per_jiffy values without either a or b overflowing 2^32. + * Thus we need usecs * HZ <= (2^32 - 1) / 19 = 226050910 and + * loops_per_jiffy <= (2^32 - 1) / 226 = 19004280 + * (which corresponds to ~3800 bogomips at HZ = 100). + * -- paulus + */ +#define __MAX_UDELAY (226050910UL/HZ) /* maximum udelay argument */ +#define __MAX_NDELAY (4294967295UL/HZ) /* maximum ndelay argument */ + +extern unsigned long loops_per_jiffy; + +extern inline void __udelay(unsigned int x) +{ + + unsigned long long tmp = + (unsigned long long)x * (unsigned long long)loops_per_jiffy \ + * 226LL; + unsigned loops = tmp >> 32; + +/* + __asm__("mulxuu %0,%1,%2" : "=r" (loops) : + "r" (x), "r" (loops_per_jiffy * 226)); +*/ + __delay(loops); +} + +extern void __bad_udelay(void); /* deliberately undefined */ +extern void __bad_ndelay(void); /* deliberately undefined */ + +#define udelay(n) (__builtin_constant_p(n) ? \ + ((n) > __MAX_UDELAY ? __bad_udelay() : __udelay((n) * (19 * HZ))) : \ + __udelay((n) * (19 * HZ))) + +#define ndelay(n) (__builtin_constant_p(n) ? \ + ((n) > __MAX_NDELAY ? __bad_ndelay() : __udelay((n) * HZ)) : \ + __udelay((n) * HZ)) + +#define muldiv(a, b, c) (((a)*(b))/(c)) + +#endif /* _ASM_MICROBLAZE_DELAY_H */ diff --git a/arch/microblaze/include/asm/timex.h b/arch/microblaze/include/asm/timex.h new file mode 100644 index 0000000..678525d --- /dev/null +++ b/arch/microblaze/include/asm/timex.h @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TIMEX_H +#define _ASM_MICROBLAZE_TIMEX_H + +#define CLOCK_TICK_RATE 1000 /* Timer input freq. */ + +typedef unsigned long cycles_t; + +#define get_cycles() (0) + +#endif /* _ASM_TIMEX_H */ -- cgit v0.10.2 From 2b4384542691fddd309f9324b5a9af976b75e918 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:27 +0100 Subject: microblaze_v8: ptrace support Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/ptrace.h b/arch/microblaze/include/asm/ptrace.h new file mode 100644 index 0000000..f1f0348 --- /dev/null +++ b/arch/microblaze/include/asm/ptrace.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PTRACE_H +#define _ASM_MICROBLAZE_PTRACE_H + +#ifndef __ASSEMBLY__ +#include + +typedef unsigned long microblaze_reg_t; + +struct pt_regs { + microblaze_reg_t r0; + microblaze_reg_t r1; + microblaze_reg_t r2; + microblaze_reg_t r3; + microblaze_reg_t r4; + microblaze_reg_t r5; + microblaze_reg_t r6; + microblaze_reg_t r7; + microblaze_reg_t r8; + microblaze_reg_t r9; + microblaze_reg_t r10; + microblaze_reg_t r11; + microblaze_reg_t r12; + microblaze_reg_t r13; + microblaze_reg_t r14; + microblaze_reg_t r15; + microblaze_reg_t r16; + microblaze_reg_t r17; + microblaze_reg_t r18; + microblaze_reg_t r19; + microblaze_reg_t r20; + microblaze_reg_t r21; + microblaze_reg_t r22; + microblaze_reg_t r23; + microblaze_reg_t r24; + microblaze_reg_t r25; + microblaze_reg_t r26; + microblaze_reg_t r27; + microblaze_reg_t r28; + microblaze_reg_t r29; + microblaze_reg_t r30; + microblaze_reg_t r31; + microblaze_reg_t pc; + microblaze_reg_t msr; + microblaze_reg_t ear; + microblaze_reg_t esr; + microblaze_reg_t fsr; + int kernel_mode; +}; + +#define kernel_mode(regs) ((regs)->kernel_mode) +#define user_mode(regs) (!kernel_mode(regs)) + +#define instruction_pointer(regs) ((regs)->pc) +#define profile_pc(regs) instruction_pointer(regs) + +void show_regs(struct pt_regs *); + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_MICROBLAZE_PTRACE_H */ diff --git a/arch/microblaze/kernel/ptrace.c b/arch/microblaze/kernel/ptrace.c new file mode 100644 index 0000000..3171e39 --- /dev/null +++ b/arch/microblaze/kernel/ptrace.c @@ -0,0 +1,182 @@ +/* + * `ptrace' system call + * + * Copyright (C) 2008-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2004-2007 John Williams + * + * derived from arch/v850/kernel/ptrace.c + * + * Copyright (C) 2002,03 NEC Electronics Corporation + * Copyright (C) 2002,03 Miles Bader + * + * Derived from arch/mips/kernel/ptrace.c: + * + * Copyright (C) 1992 Ross Biro + * Copyright (C) Linus Torvalds + * Copyright (C) 1994, 95, 96, 97, 98, 2000 Ralf Baechle + * Copyright (C) 1996 David S. Miller + * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com + * Copyright (C) 1999 MIPS Technologies, Inc. + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/* Returns the address where the register at REG_OFFS in P is stashed away. */ +static microblaze_reg_t *reg_save_addr(unsigned reg_offs, + struct task_struct *t) +{ + struct pt_regs *regs; + + /* + * Three basic cases: + * + * (1) A register normally saved before calling the scheduler, is + * available in the kernel entry pt_regs structure at the top + * of the kernel stack. The kernel trap/irq exit path takes + * care to save/restore almost all registers for ptrace'd + * processes. + * + * (2) A call-clobbered register, where the process P entered the + * kernel via [syscall] trap, is not stored anywhere; that's + * OK, because such registers are not expected to be preserved + * when the trap returns anyway (so we don't actually bother to + * test for this case). + * + * (3) A few registers not used at all by the kernel, and so + * normally never saved except by context-switches, are in the + * context switch state. + */ + + /* Register saved during kernel entry (or not available). */ + regs = task_pt_regs(t); + + return (microblaze_reg_t *)((char *)regs + reg_offs); +} + +long arch_ptrace(struct task_struct *child, long request, long addr, long data) +{ + int rval; + unsigned long val = 0; + unsigned long copied; + + switch (request) { + case PTRACE_PEEKTEXT: /* read word at location addr. */ + case PTRACE_PEEKDATA: + pr_debug("PEEKTEXT/PEEKDATA at %08lX\n", addr); + copied = access_process_vm(child, addr, &val, sizeof(val), 0); + rval = -EIO; + if (copied != sizeof(val)) + break; + rval = put_user(val, (unsigned long *)data); + break; + + case PTRACE_POKETEXT: /* write the word at location addr. */ + case PTRACE_POKEDATA: + pr_debug("POKETEXT/POKEDATA to %08lX\n", addr); + rval = 0; + if (access_process_vm(child, addr, &data, sizeof(data), 1) + == sizeof(data)) + break; + rval = -EIO; + break; + + /* Read/write the word at location ADDR in the registers. */ + case PTRACE_PEEKUSR: + case PTRACE_POKEUSR: + pr_debug("PEEKUSR/POKEUSR : 0x%08lx\n", addr); + rval = 0; + if (addr >= PT_SIZE && request == PTRACE_PEEKUSR) { + /* + * Special requests that don't actually correspond + * to offsets in struct pt_regs. + */ + if (addr == PT_TEXT_ADDR) { + val = child->mm->start_code; + } else if (addr == PT_DATA_ADDR) { + val = child->mm->start_data; + } else if (addr == PT_TEXT_LEN) { + val = child->mm->end_code + - child->mm->start_code; + } else { + rval = -EIO; + } + } else if (addr >= 0 && addr < PT_SIZE && (addr & 0x3) == 0) { + microblaze_reg_t *reg_addr = reg_save_addr(addr, child); + if (request == PTRACE_PEEKUSR) + val = *reg_addr; + else + *reg_addr = data; + } else + rval = -EIO; + + if (rval == 0 && request == PTRACE_PEEKUSR) + rval = put_user(val, (unsigned long *)data); + break; + /* Continue and stop at next (return from) syscall */ + case PTRACE_SYSCALL: + pr_debug("PTRACE_SYSCALL\n"); + case PTRACE_SINGLESTEP: + pr_debug("PTRACE_SINGLESTEP\n"); + /* Restart after a signal. */ + case PTRACE_CONT: + pr_debug("PTRACE_CONT\n"); + rval = -EIO; + if (!valid_signal(data)) + break; + + if (request == PTRACE_SYSCALL) + set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); + else + clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); + + child->exit_code = data; + pr_debug("wakeup_process\n"); + wake_up_process(child); + rval = 0; + break; + + /* + * make the child exit. Best I can do is send it a sigkill. + * perhaps it should be put in the status that it wants to + * exit. + */ + case PTRACE_KILL: + pr_debug("PTRACE_KILL\n"); + rval = 0; + if (child->exit_state == EXIT_ZOMBIE) /* already dead */ + break; + child->exit_code = SIGKILL; + wake_up_process(child); + break; + + case PTRACE_DETACH: /* detach a process that was attached. */ + pr_debug("PTRACE_DETACH\n"); + rval = ptrace_detach(child, data); + break; + default: + /* rval = ptrace_request(child, request, addr, data); noMMU */ + rval = -EIO; + } + return rval; +} + +void ptrace_disable(struct task_struct *child) +{ + /* nothing to do */ +} -- cgit v0.10.2 From 7dcbbb2b17d4ef0d0541708eddfb720e2e422c3b Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:28 +0100 Subject: microblaze_v8: IPC support Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/ipc.h b/arch/microblaze/include/asm/ipc.h new file mode 100644 index 0000000..a46e3d9 --- /dev/null +++ b/arch/microblaze/include/asm/ipc.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/ipcbuf.h b/arch/microblaze/include/asm/ipcbuf.h new file mode 100644 index 0000000..b056fa4 --- /dev/null +++ b/arch/microblaze/include/asm/ipcbuf.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_IPCBUF_H +#define _ASM_MICROBLAZE_IPCBUF_H + +/* + * The user_ipc_perm structure for microblaze architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 32-bit mode_t and seq + * - 2 miscellaneous 32-bit values + */ + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned short __pad1; + unsigned short seq; + unsigned short __pad2; + unsigned long __unused1; + unsigned long __unused2; +}; + +#endif /* _ASM_MICROBLAZE_IPCBUF_H */ diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c new file mode 100644 index 0000000..d90b548 --- /dev/null +++ b/arch/microblaze/kernel/sys_microblaze.c @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2007 John Williams + * + * Copyright (C) 2006 Atmark Techno, Inc. + * Yasushi SHOJI + * Tetsuya OHKAWA + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +/* + * sys_ipc() is the de-multiplexer for the SysV IPC calls.. + * + * This is really horribly ugly. This will be remove with new toolchain. + */ +asmlinkage int +sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth) +{ + int version, ret; + + version = call >> 16; /* hack for backward compatibility */ + call &= 0xffff; + + ret = -EINVAL; + switch (call) { + case SEMOP: + ret = sys_semop(first, (struct sembuf *)ptr, second); + break; + case SEMGET: + ret = sys_semget(first, second, third); + break; + case SEMCTL: + { + union semun fourth; + + if (!ptr) + break; + ret = (access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT) + || (get_user(fourth.__pad, (void **)ptr)) ; + if (ret) + break; + ret = sys_semctl(first, second, third, fourth); + break; + } + case MSGSND: + ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third); + break; + case MSGRCV: + switch (version) { + case 0: { + struct ipc_kludge tmp; + + if (!ptr) + break; + ret = (access_ok(VERIFY_READ, ptr, sizeof(tmp)) + ? 0 : -EFAULT) || copy_from_user(&tmp, + (struct ipc_kludge *) ptr, sizeof(tmp)); + if (ret) + break; + ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp, + third); + break; + } + default: + ret = sys_msgrcv(first, (struct msgbuf *) ptr, + second, fifth, third); + break; + } + break; + case MSGGET: + ret = sys_msgget((key_t) first, second); + break; + case MSGCTL: + ret = sys_msgctl(first, second, (struct msqid_ds *) ptr); + break; + case SHMAT: + switch (version) { + default: { + ulong raddr; + ret = access_ok(VERIFY_WRITE, (ulong *) third, + sizeof(ulong)) ? 0 : -EFAULT; + if (ret) + break; + ret = do_shmat(first, (char *) ptr, second, &raddr); + if (ret) + break; + ret = put_user(raddr, (ulong *) third); + break; + } + case 1: /* iBCS2 emulator entry point */ + if (!segment_eq(get_fs(), get_ds())) + break; + ret = do_shmat(first, (char *) ptr, second, + (ulong *) third); + break; + } + break; + case SHMDT: + ret = sys_shmdt((char *)ptr); + break; + case SHMGET: + ret = sys_shmget(first, second, third); + break; + case SHMCTL: + ret = sys_shmctl(first, second, (struct shmid_ds *) ptr); + break; + } + return -EINVAL; +} + +asmlinkage int sys_vfork(struct pt_regs *regs) +{ + return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->r1, + regs, 0, NULL, NULL); +} + +asmlinkage int sys_clone(int flags, unsigned long stack, struct pt_regs *regs) +{ + if (!stack) + stack = regs->r1; + return do_fork(flags, stack, regs, 0, NULL, NULL); +} + +asmlinkage int sys_execve(char __user *filenamei, char __user *__user *argv, + char __user *__user *envp, struct pt_regs *regs) +{ + int error; + char *filename; + + filename = getname(filenamei); + error = PTR_ERR(filename); + if (IS_ERR(filename)) + goto out; + error = do_execve(filename, argv, envp, regs); + putname(filename); +out: + return error; +} + +asmlinkage unsigned long +sys_mmap2(unsigned long addr, size_t len, + unsigned long prot, unsigned long flags, + unsigned long fd, unsigned long pgoff) +{ + struct file *file = NULL; + int ret = -EBADF; + + flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); + if (!(flags & MAP_ANONYMOUS)) { + file = fget(fd); + if (!file) { + printk(KERN_INFO "no fd in mmap\r\n"); + goto out; + } + } + + down_write(¤t->mm->mmap_sem); + ret = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); + up_write(¤t->mm->mmap_sem); + if (file) + fput(file); +out: + return ret; +} + +asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, + unsigned long prot, unsigned long flags, + unsigned long fd, off_t offset) +{ + int err = -EINVAL; + + if (offset & ~PAGE_MASK) { + printk(KERN_INFO "no pagemask in mmap\r\n"); + goto out; + } + + err = sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +out: + return err; +} + +/* + * Do a system call from kernel instead of calling sys_execve so we + * end up with proper pt_regs. + */ +int kernel_execve(const char *filename, char *const argv[], char *const envp[]) +{ + register const char *__a __asm__("r5") = filename; + register const void *__b __asm__("r6") = argv; + register const void *__c __asm__("r7") = envp; + register unsigned long __syscall __asm__("r12") = __NR_execve; + register unsigned long __ret __asm__("r3"); + __asm__ __volatile__ ("brki r14, 0x8" + : "=r" (__ret), "=r" (__syscall) + : "1" (__syscall), "r" (__a), "r" (__b), "r" (__c) + : "r4", "r8", "r9", + "r10", "r11", "r14", "cc", "memory"); + return __ret; +} -- cgit v0.10.2 From 65bc60930c32b4831800056c8e0a0571c9b6a0bf Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:29 +0100 Subject: microblaze_v8: traps support Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/kernel/traps.c b/arch/microblaze/kernel/traps.c new file mode 100644 index 0000000..fbdc533 --- /dev/null +++ b/arch/microblaze/kernel/traps.c @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +#include +#include + +void trap_init(void) +{ + __enable_hw_exceptions(); +} + +void __bad_xchg(volatile void *ptr, int size) +{ + printk(KERN_INFO "xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n", + __builtin_return_address(0), ptr, size); + BUG(); +} +EXPORT_SYMBOL(__bad_xchg); + +static int kstack_depth_to_print = 24; + +static int __init kstack_setup(char *s) +{ + kstack_depth_to_print = strict_strtoul(s, 0, 0); + + return 1; +} +__setup("kstack=", kstack_setup); + +void show_trace(struct task_struct *task, unsigned long *stack) +{ + unsigned long addr; + + if (!stack) + stack = (unsigned long *)&stack; + + printk(KERN_NOTICE "Call Trace: "); +#ifdef CONFIG_KALLSYMS + printk(KERN_NOTICE "\n"); +#endif + while (!kstack_end(stack)) { + addr = *stack++; + /* + * If the address is either in the text segment of the + * kernel, or in the region which contains vmalloc'ed + * memory, it *may* be the address of a calling + * routine; if so, print it so that someone tracing + * down the cause of the crash will be able to figure + * out the call path that was taken. + */ + if (kernel_text_address(addr)) + print_ip_sym(addr); + } + printk(KERN_NOTICE "\n"); + + if (!task) + task = current; + + debug_show_held_locks(task); +} + +void show_stack(struct task_struct *task, unsigned long *sp) +{ + unsigned long *stack; + int i; + + if (sp == NULL) { + if (task) + sp = (unsigned long *) ((struct thread_info *) + (task->stack))->cpu_context.r1; + else + sp = (unsigned long *)&sp; + } + + stack = sp; + + printk(KERN_INFO "\nStack:\n "); + + for (i = 0; i < kstack_depth_to_print; i++) { + if (kstack_end(sp)) + break; + if (i && ((i % 8) == 0)) + printk("\n "); + printk("%08lx ", *sp++); + } + printk("\n"); + show_trace(task, stack); +} + +void dump_stack(void) +{ + show_stack(NULL, NULL); +} +EXPORT_SYMBOL(dump_stack); -- cgit v0.10.2 From a95d0e1602f9f3ab54c7dbc9727bf22095705d1e Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:29 +0100 Subject: microblaze_v8: memory inicialization, MMU, TLB Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/mmu.h b/arch/microblaze/include/asm/mmu.h new file mode 100644 index 0000000..0e0431d --- /dev/null +++ b/arch/microblaze/include/asm/mmu.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_MMU_H +#define _ASM_MICROBLAZE_MMU_H + +#ifndef __ASSEMBLY__ +typedef struct { + struct vm_list_struct *vmlist; + unsigned long end_brk; +} mm_context_t; +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_MICROBLAZE_MMU_H */ diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h new file mode 100644 index 0000000..150ca01 --- /dev/null +++ b/arch/microblaze/include/asm/mmu_context.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_MMU_CONTEXT_H +#define _ASM_MICROBLAZE_MMU_CONTEXT_H + +# define init_new_context(tsk, mm) ({ 0; }) + +# define enter_lazy_tlb(mm, tsk) do {} while (0) +# define change_mm_context(old, ctx, _pml4) do {} while (0) +# define destroy_context(mm) do {} while (0) +# define deactivate_mm(tsk, mm) do {} while (0) +# define switch_mm(prev, next, tsk) do {} while (0) +# define activate_mm(prev, next) do {} while (0) + +#endif /* _ASM_MICROBLAZE_MMU_CONTEXT_H */ diff --git a/arch/microblaze/include/asm/tlb.h b/arch/microblaze/include/asm/tlb.h new file mode 100644 index 0000000..d1dfe37 --- /dev/null +++ b/arch/microblaze/include/asm/tlb.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TLB_H +#define _ASM_MICROBLAZE_TLB_H + +#define tlb_flush(tlb) do {} while (0) + +#include + +#endif /* _ASM_MICROBLAZE_TLB_H */ diff --git a/arch/microblaze/include/asm/tlbflush.h b/arch/microblaze/include/asm/tlbflush.h new file mode 100644 index 0000000..d7fe762 --- /dev/null +++ b/arch/microblaze/include/asm/tlbflush.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TLBFLUSH_H +#define _ASM_MICROBLAZE_TLBFLUSH_H + +#define flush_tlb() BUG() +#define flush_tlb_all() BUG() +#define flush_tlb_mm(mm) BUG() +#define flush_tlb_page(vma, addr) BUG() +#define flush_tlb_range(mm, start, end) BUG() +#define flush_tlb_pgtables(mm, start, end) BUG() +#define flush_tlb_kernel_range(start, end) BUG() + +#endif /* _ASM_MICROBLAZE_TLBFLUSH_H */ diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c new file mode 100644 index 0000000..b0c8213 --- /dev/null +++ b/arch/microblaze/mm/init.c @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2007-2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include /* mem_init */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +unsigned int __page_offset; +/* EXPORT_SYMBOL(__page_offset); */ + +char *klimit = _end; + +/* + * Initialize the bootmem system and give it all the memory we + * have available. + */ +unsigned int memory_start; +unsigned int memory_end; /* due to mm/nommu.c */ +unsigned int memory_size; + +/* + * paging_init() sets up the page tables - in fact we've already done this. + */ +static void __init paging_init(void) +{ + int i; + unsigned long zones_size[MAX_NR_ZONES]; + + /* + * old: we can DMA to/from any address.put all page into ZONE_DMA + * We use only ZONE_NORMAL + */ + zones_size[ZONE_NORMAL] = max_mapnr; + + /* every other zones are empty */ + for (i = 1; i < MAX_NR_ZONES; i++) + zones_size[i] = 0; + + free_area_init(zones_size); +} + +void __init setup_memory(void) +{ + int i; + unsigned long map_size; + u32 kernel_align_start, kernel_align_size; + + /* Find main memory where is the kernel */ + for (i = 0; i < lmb.memory.cnt; i++) { + memory_start = (u32) lmb.memory.region[i].base; + memory_end = (u32) lmb.memory.region[i].base + + (u32) lmb.memory.region[i].size; + if ((memory_start <= (u32)_text) && + ((u32)_text <= memory_end)) { + memory_size = memory_end - memory_start; + PAGE_OFFSET = memory_start; + printk(KERN_INFO "%s: Main mem: 0x%x-0x%x, " + "size 0x%08x\n", __func__, memory_start, + memory_end, memory_size); + break; + } + } + + if (!memory_start || !memory_end) { + panic("%s: Missing memory setting 0x%08x-0x%08x\n", + __func__, memory_start, memory_end); + } + + /* reservation of region where is the kernel */ + kernel_align_start = PAGE_DOWN((u32)_text); + /* ALIGN can be remove because _end in vmlinux.lds.S is align */ + kernel_align_size = PAGE_UP((u32)klimit) - kernel_align_start; + lmb_reserve(kernel_align_start, kernel_align_size); + printk(KERN_INFO "%s: kernel addr=0x%08x-0x%08x size=0x%08x\n", + __func__, kernel_align_start, kernel_align_start + + kernel_align_size, kernel_align_size); + + /* + * Kernel: + * start: base phys address of kernel - page align + * end: base phys address of kernel - page align + * + * min_low_pfn - the first page (mm/bootmem.c - node_boot_start) + * max_low_pfn + * max_mapnr - the first unused page (mm/bootmem.c - node_low_pfn) + * num_physpages - number of all pages + */ + + /* memory start is from the kernel end (aligned) to higher addr */ + min_low_pfn = memory_start >> PAGE_SHIFT; /* minimum for allocation */ + /* RAM is assumed contiguous */ + num_physpages = max_mapnr = memory_size >> PAGE_SHIFT; + max_pfn = max_low_pfn = memory_end >> PAGE_SHIFT; + + printk(KERN_INFO "%s: max_mapnr: %#lx\n", __func__, max_mapnr); + printk(KERN_INFO "%s: min_low_pfn: %#lx\n", __func__, min_low_pfn); + printk(KERN_INFO "%s: max_low_pfn: %#lx\n", __func__, max_low_pfn); + + /* + * Find an area to use for the bootmem bitmap. + * We look for the first area which is at least + * 128kB in length (128kB is enough for a bitmap + * for 4GB of memory, using 4kB pages), plus 1 page + * (in case the address isn't page-aligned). + */ + map_size = init_bootmem_node(NODE_DATA(0), PFN_UP(TOPHYS((u32)_end)), + min_low_pfn, max_low_pfn); + + lmb_reserve(PFN_UP(TOPHYS((u32)_end)) << PAGE_SHIFT, map_size); + + /* free bootmem is whole main memory */ + free_bootmem(memory_start, memory_size); + + /* reserve allocate blocks */ + for (i = 0; i < lmb.reserved.cnt; i++) { + pr_debug("reserved %d - 0x%08x-0x%08x\n", i, + (u32) lmb.reserved.region[i].base, + (u32) lmb_size_bytes(&lmb.reserved, i)); + reserve_bootmem(lmb.reserved.region[i].base, + lmb_size_bytes(&lmb.reserved, i) - 1, BOOTMEM_DEFAULT); + } + paging_init(); +} + +void free_init_pages(char *what, unsigned long begin, unsigned long end) +{ + unsigned long addr; + + for (addr = begin; addr < end; addr += PAGE_SIZE) { + ClearPageReserved(virt_to_page(addr)); + init_page_count(virt_to_page(addr)); + memset((void *)addr, 0xcc, PAGE_SIZE); + free_page(addr); + totalram_pages++; + } + printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); +} + +#ifdef CONFIG_BLK_DEV_INITRD +void free_initrd_mem(unsigned long start, unsigned long end) +{ + int pages = 0; + for (; start < end; start += PAGE_SIZE) { + ClearPageReserved(virt_to_page(start)); + init_page_count(virt_to_page(start)); + free_page(start); + totalram_pages++; + pages++; + } + printk(KERN_NOTICE "Freeing initrd memory: %dk freed\n", pages); +} +#endif + +void free_initmem(void) +{ + free_init_pages("unused kernel memory", + (unsigned long)(&__init_begin), + (unsigned long)(&__init_end)); +} + +/* FIXME from arch/powerpc/mm/mem.c*/ +void show_mem(void) +{ + printk(KERN_NOTICE "%s\n", __func__); +} + +void __init mem_init(void) +{ + high_memory = (void *)__va(memory_end); + /* this will put all memory onto the freelists */ + totalram_pages += free_all_bootmem(); + + printk(KERN_INFO "Memory: %luk/%luk available\n", + (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), + num_physpages << (PAGE_SHIFT-10)); +} + +/* Check against bounds of physical memory */ +int ___range_ok(unsigned long addr, unsigned long size) +{ + return ((addr < memory_start) || + ((addr + size) > memory_end)); +} -- cgit v0.10.2 From 4b87d7a4f91d31f186b9d03434f800863aaf16d2 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:30 +0100 Subject: microblaze_v8: page.h, segment.h, unaligned.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h new file mode 100644 index 0000000..7238dcf --- /dev/null +++ b/arch/microblaze/include/asm/page.h @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2008 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * Changes for MMU support: + * Copyright (C) 2007 Xilinx, Inc. All rights reserved. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PAGE_H +#define _ASM_MICROBLAZE_PAGE_H + +#include +#include + +/* PAGE_SHIFT determines the page size */ +#define PAGE_SHIFT (12) +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_MASK (~(PAGE_SIZE-1)) + +#ifdef __KERNEL__ + +#ifndef __ASSEMBLY__ + +#define PAGE_UP(addr) (((addr)+((PAGE_SIZE)-1))&(~((PAGE_SIZE)-1))) +#define PAGE_DOWN(addr) ((addr)&(~((PAGE_SIZE)-1))) + +/* align addr on a size boundary - adjust address up/down if needed */ +#define _ALIGN_UP(addr, size) (((addr)+((size)-1))&(~((size)-1))) +#define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1))) + +/* align addr on a size boundary - adjust address up if needed */ +#define _ALIGN(addr, size) _ALIGN_UP(addr, size) + +/* + * PAGE_OFFSET -- the first address of the first page of memory. When not + * using MMU this corresponds to the first free page in physical memory (aligned + * on a page boundary). + */ +extern unsigned int __page_offset; +#define PAGE_OFFSET __page_offset + +#define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) +#define get_user_page(vaddr) __get_free_page(GFP_KERNEL) +#define free_user_page(page, addr) free_page(addr) + +#define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) + + +#define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) +#define copy_user_page(vto, vfrom, vaddr, topg) \ + memcpy((vto), (vfrom), PAGE_SIZE) + +/* + * These are used to make use of C type-checking.. + */ +typedef struct page *pgtable_t; +typedef struct { unsigned long pte; } pte_t; +typedef struct { unsigned long pgprot; } pgprot_t; +typedef struct { unsigned long ste[64]; } pmd_t; +typedef struct { pmd_t pue[1]; } pud_t; +typedef struct { pud_t pge[1]; } pgd_t; + + +#define pte_val(x) ((x).pte) +#define pgprot_val(x) ((x).pgprot) +#define pmd_val(x) ((x).ste[0]) +#define pud_val(x) ((x).pue[0]) +#define pgd_val(x) ((x).pge[0]) + +#define __pte(x) ((pte_t) { (x) }) +#define __pmd(x) ((pmd_t) { (x) }) +#define __pgd(x) ((pgd_t) { (x) }) +#define __pgprot(x) ((pgprot_t) { (x) }) + +/** + * Conversions for virtual address, physical address, pfn, and struct + * page are defined in the following files. + * + * virt -+ + * | asm-microblaze/page.h + * phys -+ + * | linux/pfn.h + * pfn -+ + * | asm-generic/memory_model.h + * page -+ + * + */ + +extern unsigned long max_low_pfn; +extern unsigned long min_low_pfn; +extern unsigned long max_pfn; + +#define __pa(vaddr) ((unsigned long) (vaddr)) +#define __va(paddr) ((void *) (paddr)) + +#define phys_to_pfn(phys) (PFN_DOWN(phys)) +#define pfn_to_phys(pfn) (PFN_PHYS(pfn)) + +#define virt_to_pfn(vaddr) (phys_to_pfn((__pa(vaddr)))) +#define pfn_to_virt(pfn) __va(pfn_to_phys((pfn))) + +#define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) +#define page_to_virt(page) (pfn_to_virt(page_to_pfn(page))) + +#define page_to_phys(page) (pfn_to_phys(page_to_pfn(page))) +#define page_to_bus(page) (page_to_phys(page)) +#define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) + +extern unsigned int memory_start; +extern unsigned int memory_end; +extern unsigned int memory_size; + +#define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_mapnr) + +#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) + +#else +#define tophys(rd, rs) (addik rd, rs, 0) +#define tovirt(rd, rs) (addik rd, rs, 0) +#endif /* __ASSEMBLY__ */ + +#define virt_addr_valid(vaddr) (pfn_valid(virt_to_pfn(vaddr))) + +/* Convert between virtual and physical address for MMU. */ +/* Handle MicroBlaze processor with virtual memory. */ +#define __virt_to_phys(addr) addr +#define __phys_to_virt(addr) addr + +#define TOPHYS(addr) __virt_to_phys(addr) + +#endif /* __KERNEL__ */ + +#include +#include + +#endif /* _ASM_MICROBLAZE_PAGE_H */ diff --git a/arch/microblaze/include/asm/segment.h b/arch/microblaze/include/asm/segment.h new file mode 100644 index 0000000..7f5dcc5 --- /dev/null +++ b/arch/microblaze/include/asm/segment.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2008 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SEGMENT_H +#define _ASM_MICROBLAZE_SEGMENT_H + +#ifndef __ASSEMBLY__ + +typedef struct { + unsigned long seg; +} mm_segment_t; + +/* + * On Microblaze the fs value is actually the top of the corresponding + * address space. + * + * The fs value determines whether argument validity checking should be + * performed or not. If get_fs() == USER_DS, checking is performed, with + * get_fs() == KERNEL_DS, checking is bypassed. + * + * For historical reasons, these macros are grossly misnamed. + * + * For non-MMU arch like Microblaze, KERNEL_DS and USER_DS is equal. + */ +# define KERNEL_DS ((mm_segment_t){0}) +# define USER_DS KERNEL_DS + +# define get_ds() (KERNEL_DS) +# define get_fs() (current_thread_info()->addr_limit) +# define set_fs(x) \ + do { current_thread_info()->addr_limit = (x); } while (0) + +# define segment_eq(a, b) ((a).seg == (b).seg) + +# endif /* __ASSEMBLY__ */ +#endif /* _ASM_MICROBLAZE_SEGMENT_H */ diff --git a/arch/microblaze/include/asm/unaligned.h b/arch/microblaze/include/asm/unaligned.h new file mode 100644 index 0000000..9d66b64 --- /dev/null +++ b/arch/microblaze/include/asm/unaligned.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_UNALIGNED_H +#define _ASM_MICROBLAZE_UNALIGNED_H + +# ifdef __KERNEL__ + +# include +# include + +# define get_unaligned __get_unaligned_be +# define put_unaligned __put_unaligned_be + +# endif /* __KERNEL__ */ +#endif /* _ASM_MICROBLAZE_UNALIGNED_H */ -- cgit v0.10.2 From 9b8a45d92718e473d465d47f20e3eaca98ec63b5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:31 +0100 Subject: microblaze_v8: includes SHM*, msgbuf Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/msgbuf.h b/arch/microblaze/include/asm/msgbuf.h new file mode 100644 index 0000000..09dd970 --- /dev/null +++ b/arch/microblaze/include/asm/msgbuf.h @@ -0,0 +1,31 @@ +#ifndef _ASM_MICROBLAZE_MSGBUF_H +#define _ASM_MICROBLAZE_MSGBUF_H + +/* + * The msqid64_ds structure for microblaze architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct msqid64_ds { + struct ipc64_perm msg_perm; + __kernel_time_t msg_stime; /* last msgsnd time */ + unsigned long __unused1; + __kernel_time_t msg_rtime; /* last msgrcv time */ + unsigned long __unused2; + __kernel_time_t msg_ctime; /* last change time */ + unsigned long __unused3; + unsigned long msg_cbytes; /* current number of bytes on queue */ + unsigned long msg_qnum; /* number of messages in queue */ + unsigned long msg_qbytes; /* max number of bytes on queue */ + __kernel_pid_t msg_lspid; /* pid of last msgsnd */ + __kernel_pid_t msg_lrpid; /* last receive pid */ + unsigned long __unused4; + unsigned long __unused5; +}; + +#endif /* _ASM_MICROBLAZE_MSGBUF_H */ diff --git a/arch/microblaze/include/asm/shmbuf.h b/arch/microblaze/include/asm/shmbuf.h new file mode 100644 index 0000000..f829c58 --- /dev/null +++ b/arch/microblaze/include/asm/shmbuf.h @@ -0,0 +1,42 @@ +#ifndef _ASM_MICROBLAZE_SHMBUF_H +#define _ASM_MICROBLAZE_SHMBUF_H + +/* + * The shmid64_ds structure for microblaze architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct shmid64_ds { + struct ipc64_perm shm_perm; /* operation perms */ + size_t shm_segsz; /* size of segment (bytes) */ + __kernel_time_t shm_atime; /* last attach time */ + unsigned long __unused1; + __kernel_time_t shm_dtime; /* last detach time */ + unsigned long __unused2; + __kernel_time_t shm_ctime; /* last change time */ + unsigned long __unused3; + __kernel_pid_t shm_cpid; /* pid of creator */ + __kernel_pid_t shm_lpid; /* pid of last operator */ + unsigned long shm_nattch; /* no. of current attaches */ + unsigned long __unused4; + unsigned long __unused5; +}; + +struct shminfo64 { + unsigned long shmmax; + unsigned long shmmin; + unsigned long shmmni; + unsigned long shmseg; + unsigned long shmall; + unsigned long __unused1; + unsigned long __unused2; + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _ASM_MICROBLAZE_SHMBUF_H */ diff --git a/arch/microblaze/include/asm/shmparam.h b/arch/microblaze/include/asm/shmparam.h new file mode 100644 index 0000000..9f5fc2b --- /dev/null +++ b/arch/microblaze/include/asm/shmparam.h @@ -0,0 +1,6 @@ +#ifndef _ASM_MICROBLAZE_SHMPARAM_H +#define _ASM_MICROBLAZE_SHMPARAM_H + +#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ + +#endif /* _ASM_MICROBLAZE_SHMPARAM_H */ -- cgit v0.10.2 From 8c4f92fe02394f7bc4c079d0ab943d4aea893f14 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:32 +0100 Subject: microblaze_v8: bug headers files Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/bug.h b/arch/microblaze/include/asm/bug.h new file mode 100644 index 0000000..8eb2cdd --- /dev/null +++ b/arch/microblaze/include/asm/bug.h @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_BUG_H +#define _ASM_MICROBLAZE_BUG_H + +#include +#include + +#endif /* _ASM_MICROBLAZE_BUG_H */ diff --git a/arch/microblaze/include/asm/bugs.h b/arch/microblaze/include/asm/bugs.h new file mode 100644 index 0000000..f2c6593 --- /dev/null +++ b/arch/microblaze/include/asm/bugs.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_BUGS_H +#define _ASM_MICROBLAZE_BUGS_H + +static inline void check_bugs(void) +{ + /* nothing to do */ +} + +#endif /* _ASM_MICROBLAZE_BUGS_H */ -- cgit v0.10.2 From 6d9c3f20858039d98da30074b487f2059450a9b1 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:32 +0100 Subject: microblaze_v8: definitions of types Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/posix_types.h b/arch/microblaze/include/asm/posix_types.h new file mode 100644 index 0000000..b4df41c --- /dev/null +++ b/arch/microblaze/include/asm/posix_types.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_POSIX_TYPES_H +#define _ASM_MICROBLAZE_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc. Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned long __kernel_ino_t; +typedef unsigned int __kernel_mode_t; +typedef unsigned int __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned int __kernel_ipc_pid_t; +typedef unsigned int __kernel_uid_t; +typedef unsigned int __kernel_gid_t; +typedef unsigned long __kernel_size_t; +typedef long __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_timer_t; +typedef int __kernel_clockid_t; +typedef int __kernel_daddr_t; +typedef char *__kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; +typedef unsigned int __kernel_uid32_t; +typedef unsigned int __kernel_gid32_t; + +typedef unsigned int __kernel_old_uid_t; +typedef unsigned int __kernel_old_gid_t; +typedef unsigned int __kernel_old_dev_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +typedef struct { +#if defined(__KERNEL__) || defined(__USE_ALL) + int val[2]; +#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ + int __val[2]; +#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ +} __kernel_fsid_t; + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + +#undef __FD_SET +#define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) + +#undef __FD_CLR +#define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) + +#undef __FD_ISSET +#define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) + +#undef __FD_ZERO +#define __FD_ZERO(fdsetp) (memset(fdsetp, 0, sizeof(*(fd_set *)fdsetp))) + +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + +#endif /* _ASM_MICROBLAZE_POSIX_TYPES_H */ diff --git a/arch/microblaze/include/asm/types.h b/arch/microblaze/include/asm/types.h new file mode 100644 index 0000000..bebc018 --- /dev/null +++ b/arch/microblaze/include/asm/types.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TYPES_H +#define _ASM_MICROBLAZE_TYPES_H + +/* + * This file is never included by application software unless + * explicitly requested (e.g., via linux/types.h) in which case the + * application is Linux specific so (user-) name space pollution is + * not a major issue. However, for interoperability, libraries still + * need to be careful to avoid a name clashes. + */ + +#include + +# ifndef __ASSEMBLY__ + +typedef unsigned short umode_t; + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +# ifdef __KERNEL__ +# define BITS_PER_LONG 32 + +/* Dma addresses are 32-bits wide. */ + +typedef u32 dma_addr_t; + +# endif/* __KERNEL__ */ +# endif /* __ASSEMBLY__ */ +#endif /* _ASM_MICROBLAZE_TYPES_H */ -- cgit v0.10.2 From 97f34d71a0e7fea3be9c09ff2e80867b57e32aa4 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:33 +0100 Subject: microblaze_v8: ioctl support Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/ioctl.h b/arch/microblaze/include/asm/ioctl.h new file mode 100644 index 0000000..b279fe0 --- /dev/null +++ b/arch/microblaze/include/asm/ioctl.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/ioctls.h b/arch/microblaze/include/asm/ioctls.h new file mode 100644 index 0000000..03582b2 --- /dev/null +++ b/arch/microblaze/include/asm/ioctls.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_IOCTLS_H +#define _ASM_MICROBLAZE_IOCTLS_H + +#include + +/* 0x54 is just a magic number to make these relatively unique ('T') */ + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define FIONREAD 0x541B +#define TIOCINQ FIONREAD +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#define FIONBIO 0x5421 +#define TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ +#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */ +#define TIOCSBRK 0x5427 /* BSD compatibility */ +#define TIOCCBRK 0x5428 /* BSD compatibility */ +#define TIOCGSID 0x5429 /* Return the session ID of FD */ +/* Get Pty Number (of pty-mux device) */ +#define TIOCGPTN _IOR('T', 0x30, unsigned int) +#define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ + +#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */ +#define FIOCLEX 0x5451 +#define FIOASYNC 0x5452 +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ +#define TIOCSERGETLSR 0x5459 /* Get line status register */ +#define TIOCSERGETMULTI 0x545A /* Get multiport config */ +#define TIOCSERSETMULTI 0x545B /* Set multiport config */ + +#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ +#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ + +#define FIOQSIZE 0x545E + +/* Used for packet mode */ +#define TIOCPKT_DATA 0 +#define TIOCPKT_FLUSHREAD 1 +#define TIOCPKT_FLUSHWRITE 2 +#define TIOCPKT_STOP 4 +#define TIOCPKT_START 8 +#define TIOCPKT_NOSTOP 16 +#define TIOCPKT_DOSTOP 32 + +#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ + +#endif /* _ASM_MICROBLAZE_IOCTLS_H */ -- cgit v0.10.2 From 2c572c2824ca5d96bd22b9366389b75ff3620a13 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:33 +0100 Subject: microblaze_v8: io.h IO operations Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h new file mode 100644 index 0000000..cfab034 --- /dev/null +++ b/arch/microblaze/include/asm/io.h @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_IO_H +#define _ASM_MICROBLAZE_IO_H + +#include +#include +#include +#include + +#define IO_SPACE_LIMIT (0xFFFFFFFF) + +static inline unsigned char __raw_readb(const volatile void __iomem *addr) +{ + return *(volatile unsigned char __force *)addr; +} +static inline unsigned short __raw_readw(const volatile void __iomem *addr) +{ + return *(volatile unsigned short __force *)addr; +} +static inline unsigned int __raw_readl(const volatile void __iomem *addr) +{ + return *(volatile unsigned int __force *)addr; +} +static inline unsigned long __raw_readq(const volatile void __iomem *addr) +{ + return *(volatile unsigned long __force *)addr; +} +static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr) +{ + *(volatile unsigned char __force *)addr = v; +} +static inline void __raw_writew(unsigned short v, volatile void __iomem *addr) +{ + *(volatile unsigned short __force *)addr = v; +} +static inline void __raw_writel(unsigned int v, volatile void __iomem *addr) +{ + *(volatile unsigned int __force *)addr = v; +} +static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) +{ + *(volatile unsigned long __force *)addr = v; +} + +/* + * read (readb, readw, readl, readq) and write (writeb, writew, + * writel, writeq) accessors are for PCI and thus littel endian. + * Linux 2.4 for Microblaze had this wrong. + */ +static inline unsigned char readb(const volatile void __iomem *addr) +{ + return *(volatile unsigned char __force *)addr; +} +static inline unsigned short readw(const volatile void __iomem *addr) +{ + return le16_to_cpu(*(volatile unsigned short __force *)addr); +} +static inline unsigned int readl(const volatile void __iomem *addr) +{ + return le32_to_cpu(*(volatile unsigned int __force *)addr); +} +static inline void writeb(unsigned char v, volatile void __iomem *addr) +{ + *(volatile unsigned char __force *)addr = v; +} +static inline void writew(unsigned short v, volatile void __iomem *addr) +{ + *(volatile unsigned short __force *)addr = cpu_to_le16(v); +} +static inline void writel(unsigned int v, volatile void __iomem *addr) +{ + *(volatile unsigned int __force *)addr = cpu_to_le32(v); +} + +/* ioread and iowrite variants. thease are for now same as __raw_ + * variants of accessors. we might check for endianess in the feature + */ +#define ioread8(addr) __raw_readb((u8 *)(addr)) +#define ioread16(addr) __raw_readw((u16 *)(addr)) +#define ioread32(addr) __raw_readl((u32 *)(addr)) +#define iowrite8(v, addr) __raw_writeb((u8)(v), (u8 *)(addr)) +#define iowrite16(v, addr) __raw_writew((u16)(v), (u16 *)(addr)) +#define iowrite32(v, addr) __raw_writel((u32)(v), (u32 *)(addr)) + +/* These are the definitions for the x86 IO instructions + * inb/inw/inl/outb/outw/outl, the "string" versions + * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions + * inb_p/inw_p/... + * The macros don't do byte-swapping. + */ +#define inb(port) readb((u8 *)((port))) +#define outb(val, port) writeb((val), (u8 *)((unsigned long)(port))) +#define inw(port) readw((u16 *)((port))) +#define outw(val, port) writew((val), (u16 *)((unsigned long)(port))) +#define inl(port) readl((u32 *)((port))) +#define outl(val, port) writel((val), (u32 *)((unsigned long)(port))) + +#define inb_p(port) inb((port)) +#define outb_p(val, port) outb((val), (port)) +#define inw_p(port) inw((port)) +#define outw_p(val, port) outw((val), (port)) +#define inl_p(port) inl((port)) +#define outl_p(val, port) outl((val), (port)) + +#define memset_io(a, b, c) memset((void *)(a), (b), (c)) +#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c)) +#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c)) + +/** + * virt_to_phys - map virtual addresses to physical + * @address: address to remap + * + * The returned physical address is the physical (CPU) mapping for + * the memory address given. It is only valid to use this function on + * addresses directly mapped or allocated via kmalloc. + * + * This function does not give bus mappings for DMA transfers. In + * almost all conceivable cases a device driver should not be using + * this function + */ +static inline unsigned long __iomem virt_to_phys(volatile void *address) +{ + return __pa((unsigned long)address); +} + +#define virt_to_bus virt_to_phys + +/** + * phys_to_virt - map physical address to virtual + * @address: address to remap + * + * The returned virtual address is a current CPU mapping for + * the memory address given. It is only valid to use this function on + * addresses that have a kernel mapping + * + * This function does not handle bus mappings for DMA transfers. In + * almost all conceivable cases a device driver should not be using + * this function + */ +static inline void *phys_to_virt(unsigned long address) +{ + return (void *)__va(address); +} + +#define bus_to_virt(a) phys_to_virt(a) + +static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size, + unsigned long flags) +{ + return (void *)address; +} + +#define ioremap(physaddr, size) ((void __iomem *)(unsigned long)(physaddr)) +#define iounmap(addr) ((void)0) +#define ioremap_nocache(physaddr, size) ioremap(physaddr, size) + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + +/* + * Big Endian + */ +#define out_be32(a, v) __raw_writel((v), (void __iomem __force *)(a)) +#define out_be16(a, v) __raw_writew((v), (a)) + +#define in_be32(a) __raw_readl((const void __iomem __force *)(a)) +#define in_be16(a) __raw_readw(a) + +/* + * Little endian + */ + +#define out_le32(a, v) __raw_writel(__cpu_to_le32(v), (a)); +#define out_le16(a, v) __raw_writew(__cpu_to_le16(v), (a)) + +#define in_le32(a) __le32_to_cpu(__raw_readl(a)) +#define in_le16(a) __le16_to_cpu(__raw_readw(a)) + +/* Byte ops */ +#define out_8(a, v) __raw_writeb((v), (a)) +#define in_8(a) __raw_readb(a) + +/* FIXME */ +static inline void __iomem *ioport_map(unsigned long port, unsigned int len) +{ + return (void __iomem *) (port); +} + +static inline void ioport_unmap(void __iomem *addr) +{ + /* Nothing to do */ +} + +#endif /* _ASM_MICROBLAZE_IO_H */ -- cgit v0.10.2 From c6087fdc7720e7c5cf3d52fccecb3f73e3d52ac7 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:34 +0100 Subject: microblaze_v8: headers for executables format FLAT, ELF Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/elf.h b/arch/microblaze/include/asm/elf.h new file mode 100644 index 0000000..81337f2 --- /dev/null +++ b/arch/microblaze/include/asm/elf.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_ELF_H +#define _ASM_MICROBLAZE_ELF_H + +/* + * Note there is no "official" ELF designation for Microblaze. + * I've snaffled the value from the microblaze binutils source code + * /binutils/microblaze/include/elf/microblaze.h + */ +#define EM_XILINX_MICROBLAZE 0xbaab +#define ELF_ARCH EM_XILINX_MICROBLAZE + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x) ((x)->e_machine == EM_XILINX_MICROBLAZE) + +/* + * These are used to set parameters in the core dumps. + */ +#define ELF_CLASS ELFCLASS32 + +#endif /* _ASM_MICROBLAZE_ELF_H */ diff --git a/arch/microblaze/include/asm/flat.h b/arch/microblaze/include/asm/flat.h new file mode 100644 index 0000000..acf0da5 --- /dev/null +++ b/arch/microblaze/include/asm/flat.h @@ -0,0 +1,90 @@ +/* + * uClinux flat-format executables + * + * Copyright (C) 2005 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_FLAT_H +#define _ASM_MICROBLAZE_FLAT_H + +#include + +#define flat_stack_align(sp) /* nothing needed */ +#define flat_argvp_envp_on_stack() 0 +#define flat_old_ram_flag(flags) (flags) +#define flat_reloc_valid(reloc, size) ((reloc) <= (size)) +#define flat_set_persistent(relval, p) 0 + +/* + * Microblaze works a little differently from other arches, because + * of the MICROBLAZE_64 reloc type. Here, a 32 bit address is split + * over two instructions, an 'imm' instruction which provides the top + * 16 bits, then the instruction "proper" which provides the low 16 + * bits. + */ + +/* + * Crack open a symbol reference and extract the address to be + * relocated. rp is a potentially unaligned pointer to the + * reference + */ + +static inline unsigned long +flat_get_addr_from_rp(unsigned long *rp, unsigned long relval, + unsigned long flags, unsigned long *persistent) +{ + unsigned long addr; + (void)flags; + + /* Is it a split 64/32 reference? */ + if (relval & 0x80000000) { + /* Grab the two halves of the reference */ + unsigned long val_hi, val_lo; + + val_hi = get_unaligned(rp); + val_lo = get_unaligned(rp+1); + + /* Crack the address out */ + addr = ((val_hi & 0xffff) << 16) + (val_lo & 0xffff); + } else { + /* Get the address straight out */ + addr = get_unaligned(rp); + } + + return addr; +} + +/* + * Insert an address into the symbol reference at rp. rp is potentially + * unaligned. + */ + +static inline void +flat_put_addr_at_rp(unsigned long *rp, unsigned long addr, unsigned long relval) +{ + /* Is this a split 64/32 reloc? */ + if (relval & 0x80000000) { + /* Get the two "halves" */ + unsigned long val_hi = get_unaligned(rp); + unsigned long val_lo = get_unaligned(rp + 1); + + /* insert the address */ + val_hi = (val_hi & 0xffff0000) | addr >> 16; + val_lo = (val_lo & 0xffff0000) | (addr & 0xffff); + + /* store the two halves back into memory */ + put_unaligned(val_hi, rp); + put_unaligned(val_lo, rp+1); + } else { + /* Put it straight in, no messing around */ + put_unaligned(addr, rp); + } +} + +#define flat_get_relocate_addr(rel) (rel & 0x7fffffff) + +#endif /* _ASM_MICROBLAZE_FLAT_H */ -- cgit v0.10.2 From 69b1b7817e68379aa55d4677657135a05a287785 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:35 +0100 Subject: microblaze_v8: dma support Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/dma-mapping.h b/arch/microblaze/include/asm/dma-mapping.h new file mode 100644 index 0000000..1733625 --- /dev/null +++ b/arch/microblaze/include/asm/dma-mapping.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_DMA_MAPPING_H +#define _ASM_MICROBLAZE_DMA_MAPPING_H + +#include +#include +#include + +struct scatterlist; + +#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) +#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) + +/* FIXME */ +static inline int +dma_supported(struct device *dev, u64 mask) +{ + return 1; +} + +static inline dma_addr_t +dma_map_page(struct device *dev, struct page *page, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ + BUG(); + return 0; +} + +static inline void +dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, + enum dma_data_direction direction) +{ + BUG(); +} + +static inline int +dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, + enum dma_data_direction direction) +{ + BUG(); + return 0; +} + +static inline void +dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, + enum dma_data_direction direction) +{ + BUG(); +} + +static inline void +dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, + enum dma_data_direction direction) +{ + BUG(); +} + +static inline void +dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction direction) +{ + BUG(); +} + +static inline void +dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ + BUG(); +} + +static inline void +dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ + BUG(); +} + +static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) +{ + return 0; +} + +static inline void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *dma_handle, int flag) +{ + return NULL; /* consistent_alloc(flag, size, dma_handle); */ +} + +static inline void dma_free_coherent(struct device *dev, size_t size, + void *vaddr, dma_addr_t dma_handle) +{ + BUG(); +} + +static inline dma_addr_t +dma_map_single(struct device *dev, void *ptr, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); + + return virt_to_bus(ptr); +} + +static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, + size_t size, + enum dma_data_direction direction) +{ + switch (direction) { + case DMA_FROM_DEVICE: + flush_dcache_range((unsigned)dma_addr, + (unsigned)dma_addr + size); + /* Fall through */ + case DMA_TO_DEVICE: + break; + default: + BUG(); + } +} + +#endif /* _ASM_MICROBLAZE_DMA_MAPPING_H */ diff --git a/arch/microblaze/include/asm/dma.h b/arch/microblaze/include/asm/dma.h new file mode 100644 index 0000000..0967fa0 --- /dev/null +++ b/arch/microblaze/include/asm/dma.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_DMA_H +#define _ASM_MICROBLAZE_DMA_H + +/* we don't have dma address limit. define it as zero to be + * unlimited. */ +#define MAX_DMA_ADDRESS (0) + +#endif /* _ASM_MICROBLAZE_DMA_H */ diff --git a/arch/microblaze/include/asm/scatterlist.h b/arch/microblaze/include/asm/scatterlist.h new file mode 100644 index 0000000..08ff1d0 --- /dev/null +++ b/arch/microblaze/include/asm/scatterlist.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SCATTERLIST_H +#define _ASM_MICROBLAZE_SCATTERLIST_H + +struct scatterlist { +#ifdef CONFIG_DEBUG_SG + unsigned long sg_magic; +#endif + unsigned long page_link; + dma_addr_t dma_address; + unsigned int offset; + unsigned int length; +}; + +#define sg_dma_address(sg) ((sg)->dma_address) +#define sg_dma_len(sg) ((sg)->length) + +#define ISA_DMA_THRESHOLD (~0UL) + +#endif /* _ASM_MICROBLAZE_SCATTERLIST_H */ -- cgit v0.10.2 From 4dbdc9a59656d9166f9baaf8733b73e2ad0c8fa5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:35 +0100 Subject: microblaze_v8: headers for irq Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/hardirq.h b/arch/microblaze/include/asm/hardirq.h new file mode 100644 index 0000000..0f2d6b0 --- /dev/null +++ b/arch/microblaze/include/asm/hardirq.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_HARDIRQ_H +#define _ASM_MICROBLAZE_HARDIRQ_H + +#include +#include +#include +#include +#include + +/* should be defined in each interrupt controller driver */ +extern unsigned int get_irq(struct pt_regs *regs); + +typedef struct { + unsigned int __softirq_pending; +} ____cacheline_aligned irq_cpustat_t; + +void ack_bad_irq(unsigned int irq); + +#include /* Standard mappings for irq_cpustat_t above */ + +#endif /* _ASM_MICROBLAZE_HARDIRQ_H */ diff --git a/arch/microblaze/include/asm/hw_irq.h b/arch/microblaze/include/asm/hw_irq.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/microblaze/include/asm/irq_regs.h b/arch/microblaze/include/asm/irq_regs.h new file mode 100644 index 0000000..3dd9c0b --- /dev/null +++ b/arch/microblaze/include/asm/irq_regs.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/irqflags.h b/arch/microblaze/include/asm/irqflags.h new file mode 100644 index 0000000..dea6564 --- /dev/null +++ b/arch/microblaze/include/asm/irqflags.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_IRQFLAGS_H +#define _ASM_MICROBLAZE_IRQFLAGS_H + +#include + +# if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR + +# define local_irq_save(flags) \ + do { \ + asm volatile ("# local_irq_save \n\t" \ + "msrclr %0, %1 \n\t" \ + "nop \n\t" \ + : "=r"(flags) \ + : "i"(MSR_IE) \ + : "memory"); \ + } while (0) + +# define local_irq_disable() \ + do { \ + asm volatile ("# local_irq_disable \n\t" \ + "msrclr r0, %0 \n\t" \ + "nop \n\t" \ + : \ + : "i"(MSR_IE) \ + : "memory"); \ + } while (0) + +# define local_irq_enable() \ + do { \ + asm volatile ("# local_irq_enable \n\t" \ + "msrset r0, %0 \n\t" \ + "nop \n\t" \ + : \ + : "i"(MSR_IE) \ + : "memory"); \ + } while (0) + +# else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */ + +# define local_irq_save(flags) \ + do { \ + register unsigned tmp; \ + asm volatile ("# local_irq_save \n\t" \ + "mfs %0, rmsr \n\t" \ + "nop \n\t" \ + "andi %1, %0, %2 \n\t" \ + "mts rmsr, %1 \n\t" \ + "nop \n\t" \ + : "=r"(flags), "=r" (tmp) \ + : "i"(~MSR_IE) \ + : "memory"); \ + } while (0) + +# define local_irq_disable() \ + do { \ + register unsigned tmp; \ + asm volatile ("# local_irq_disable \n\t" \ + "mfs %0, rmsr \n\t" \ + "nop \n\t" \ + "andi %0, %0, %1 \n\t" \ + "mts rmsr, %0 \n\t" \ + "nop \n\t" \ + : "=r"(tmp) \ + : "i"(~MSR_IE) \ + : "memory"); \ + } while (0) + +# define local_irq_enable() \ + do { \ + register unsigned tmp; \ + asm volatile ("# local_irq_enable \n\t" \ + "mfs %0, rmsr \n\t" \ + "nop \n\t" \ + "ori %0, %0, %1 \n\t" \ + "mts rmsr, %0 \n\t" \ + "nop \n\t" \ + : "=r"(tmp) \ + : "i"(MSR_IE) \ + : "memory"); \ + } while (0) + +# endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ + +#define local_save_flags(flags) \ + do { \ + asm volatile ("# local_save_flags \n\t" \ + "mfs %0, rmsr \n\t" \ + "nop \n\t" \ + : "=r"(flags) \ + : \ + : "memory"); \ + } while (0) + +#define local_irq_restore(flags) \ + do { \ + asm volatile ("# local_irq_restore \n\t"\ + "mts rmsr, %0 \n\t" \ + "nop \n\t" \ + : \ + : "r"(flags) \ + : "memory"); \ + } while (0) + +static inline int irqs_disabled(void) +{ + unsigned long flags; + + local_save_flags(flags); + return ((flags & MSR_IE) == 0); +} + +#define raw_irqs_disabled irqs_disabled +#define raw_irqs_disabled_flags(flags) ((flags) == 0) + +#endif /* _ASM_MICROBLAZE_IRQFLAGS_H */ -- cgit v0.10.2 From 10713b1d9f4e64468e9b9d38c32eea0814568b92 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:36 +0100 Subject: microblaze_v8: atomic.h bitops.h swab.h byteorder.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h new file mode 100644 index 0000000..a448d94 --- /dev/null +++ b/arch/microblaze/include/asm/atomic.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_ATOMIC_H +#define _ASM_MICROBLAZE_ATOMIC_H + +#include +#include /* likely */ +#include /* local_irq_XXX and friends */ + +#define ATOMIC_INIT(i) { (i) } +#define atomic_read(v) ((v)->counter) +#define atomic_set(v, i) (((v)->counter) = (i)) + +#define atomic_inc(v) (atomic_add_return(1, (v))) +#define atomic_dec(v) (atomic_sub_return(1, (v))) + +#define atomic_add(i, v) (atomic_add_return(i, (v))) +#define atomic_sub(i, v) (atomic_sub_return(i, (v))) + +#define atomic_inc_return(v) (atomic_add_return(1, (v))) +#define atomic_dec_return(v) (atomic_sub_return(1, (v))) + +#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) +#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) + +#define atomic_inc_not_zero(v) (atomic_add_unless((v), 1, 0)) + +#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0) + +static inline int atomic_cmpxchg(atomic_t *v, int old, int new) +{ + int ret; + unsigned long flags; + + local_irq_save(flags); + ret = v->counter; + if (likely(ret == old)) + v->counter = new; + local_irq_restore(flags); + + return ret; +} + +static inline int atomic_add_unless(atomic_t *v, int a, int u) +{ + int c, old; + + c = atomic_read(v); + while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c) + c = old; + return c != u; +} + +static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) +{ + unsigned long flags; + + local_irq_save(flags); + *addr &= ~mask; + local_irq_restore(flags); +} + +/** + * atomic_add_return - add and return + * @i: integer value to add + * @v: pointer of type atomic_t + * + * Atomically adds @i to @v and returns @i + @v + */ +static inline int atomic_add_return(int i, atomic_t *v) +{ + unsigned long flags; + int val; + + local_irq_save(flags); + val = v->counter; + v->counter = val += i; + local_irq_restore(flags); + + return val; +} + +static inline int atomic_sub_return(int i, atomic_t *v) +{ + return atomic_add_return(-i, v); +} + +/* + * Atomically test *v and decrement if it is greater than 0. + * The function returns the old value of *v minus 1. + */ +static inline int atomic_dec_if_positive(atomic_t *v) +{ + unsigned long flags; + int res; + + local_irq_save(flags); + res = v->counter - 1; + if (res >= 0) + v->counter = res; + local_irq_restore(flags); + + return res; +} + +#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) +#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) + +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + +#include + +#endif /* _ASM_MICROBLAZE_ATOMIC_H */ diff --git a/arch/microblaze/include/asm/bitops.h b/arch/microblaze/include/asm/bitops.h new file mode 100644 index 0000000..d6df1fd --- /dev/null +++ b/arch/microblaze/include/asm/bitops.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_BITOPS_H +#define _ASM_MICROBLAZE_BITOPS_H + +/* + * Copyright 1992, Linus Torvalds. + */ + +#include /* swab32 */ +#include /* save_flags */ + +/* + * clear_bit() doesn't provide any barrier for the compiler. + */ +#define smp_mb__before_clear_bit() barrier() +#define smp_mb__after_clear_bit() barrier() +#include +#include + +#endif /* _ASM_MICROBLAZE_BITOPS_H */ diff --git a/arch/microblaze/include/asm/byteorder.h b/arch/microblaze/include/asm/byteorder.h new file mode 100644 index 0000000..ce9c587 --- /dev/null +++ b/arch/microblaze/include/asm/byteorder.h @@ -0,0 +1,6 @@ +#ifndef _ASM_MICROBLAZE_BYTEORDER_H +#define _ASM_MICROBLAZE_BYTEORDER_H + +#include + +#endif /* _ASM_MICROBLAZE_BYTEORDER_H */ diff --git a/arch/microblaze/include/asm/swab.h b/arch/microblaze/include/asm/swab.h new file mode 100644 index 0000000..b375d7b --- /dev/null +++ b/arch/microblaze/include/asm/swab.h @@ -0,0 +1,8 @@ +#ifndef _ASM_MICROBLAZE_SWAB_H +#define _ASM_MICROBLAZE_SWAB_H + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) +#define __SWAB_64_THRU_32__ +#endif + +#endif /* _ASM_MICROBLAZE_SWAB_H */ -- cgit v0.10.2 From 6a3cece5e5e7e7c0fde769d7cf065fb8aef6e54e Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:37 +0100 Subject: microblaze_v8: headers pgalloc.h pgtable.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h new file mode 100644 index 0000000..2a4b354 --- /dev/null +++ b/arch/microblaze/include/asm/pgalloc.h @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PGALLOC_H +#define _ASM_MICROBLAZE_PGALLOC_H + +#define check_pgt_cache() do {} while (0) + +#endif /* _ASM_MICROBLAZE_PGALLOC_H */ diff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h new file mode 100644 index 0000000..4df31e4 --- /dev/null +++ b/arch/microblaze/include/asm/pgtable.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PGTABLE_H +#define _ASM_MICROBLAZE_PGTABLE_H + +#include + +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ + remap_pfn_range(vma, vaddr, pfn, size, prot) + +#define pgd_present(pgd) (1) /* pages are always present on non MMU */ +#define pgd_none(pgd) (0) +#define pgd_bad(pgd) (0) +#define pgd_clear(pgdp) +#define kern_addr_valid(addr) (1) +#define pmd_offset(a, b) ((void *) 0) + +#define PAGE_NONE __pgprot(0) /* these mean nothing to non MMU */ +#define PAGE_SHARED __pgprot(0) /* these mean nothing to non MMU */ +#define PAGE_COPY __pgprot(0) /* these mean nothing to non MMU */ +#define PAGE_READONLY __pgprot(0) /* these mean nothing to non MMU */ +#define PAGE_KERNEL __pgprot(0) /* these mean nothing to non MMU */ + +#define __swp_type(x) (0) +#define __swp_offset(x) (0) +#define __swp_entry(typ, off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) +#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) +#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) + +#ifndef __ASSEMBLY__ +static inline int pte_file(pte_t pte) { return 0; } +#endif /* __ASSEMBLY__ */ + +#define ZERO_PAGE(vaddr) ({ BUG(); NULL; }) + +#define swapper_pg_dir ((pgd_t *) NULL) + +#define pgtable_cache_init() do {} while (0) + +#define arch_enter_lazy_cpu_mode() do {} while (0) + +#ifndef __ASSEMBLY__ +#include + +void setup_memory(void); +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_MICROBLAZE_PGTABLE_H */ -- cgit v0.10.2 From 4511ec153afd132da9f4308e7db394820eb52129 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:37 +0100 Subject: microblaze_v8: system.h processor.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h new file mode 100644 index 0000000..d8e1543 --- /dev/null +++ b/arch/microblaze/include/asm/processor.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2008 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PROCESSOR_H +#define _ASM_MICROBLAZE_PROCESSOR_H + +#include +#include +#include +#include + +# ifndef __ASSEMBLY__ +/* from kernel/cpu/mb.c */ +extern const struct seq_operations cpuinfo_op; + +# define cpu_relax() barrier() +# define cpu_sleep() do {} while (0) +# define prepare_to_copy(tsk) do {} while (0) + +# endif /* __ASSEMBLY__ */ + +/* + * User space process size: memory size + * + * TASK_SIZE on MMU cpu is usually 1GB. However, on no-MMU arch, both + * user processes and the kernel is on the same memory region. They + * both share the memory space and that is limited by the amount of + * physical memory. thus, we set TASK_SIZE == amount of total memory. + */ +# define TASK_SIZE (0x81000000 - 0x80000000) + +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +# define current_text_addr() ({ __label__ _l; _l: &&_l; }) + +/* + * This decides where the kernel will search for a free chunk of vm + * space during mmap's. We won't be using it + */ +# define TASK_UNMAPPED_BASE 0 + +/* definition in include/linux/sched.h */ +struct task_struct; + +/* thread_struct is gone. use thread_info instead. */ +struct thread_struct { }; +# define INIT_THREAD { } + +/* Do necessary setup to start up a newly executed thread. */ +static inline void start_thread(struct pt_regs *regs, + unsigned long pc, + unsigned long usp) +{ + regs->pc = pc; + regs->r1 = usp; + regs->kernel_mode = 0; +} + +/* Free all resources held by a thread. */ +static inline void release_thread(struct task_struct *dead_task) +{ +} + +/* Free all resources held by a thread. */ +static inline void exit_thread(void) +{ +} + +extern unsigned long thread_saved_pc(struct task_struct *t); + +extern unsigned long get_wchan(struct task_struct *p); + +/* + * create a kernel thread without removing it from tasklists + */ +extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); + +# define task_pt_regs(tsk) \ + (((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1) + +# define KSTK_EIP(tsk) (0) +# define KSTK_ESP(tsk) (0) + +#endif /* _ASM_MICROBLAZE_PROCESSOR_H */ diff --git a/arch/microblaze/include/asm/system.h b/arch/microblaze/include/asm/system.h new file mode 100644 index 0000000..c4e3088 --- /dev/null +++ b/arch/microblaze/include/asm/system.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SYSTEM_H +#define _ASM_MICROBLAZE_SYSTEM_H + +#include +#include +#include + +struct task_struct; +struct thread_info; + +extern struct task_struct *_switch_to(struct thread_info *prev, + struct thread_info *next); + +#define switch_to(prev, next, last) \ + do { \ + (last) = _switch_to(task_thread_info(prev), \ + task_thread_info(next)); \ + } while (0) + +#define smp_read_barrier_depends() do {} while (0) +#define read_barrier_depends() do {} while (0) + +#define nop() asm volatile ("nop") +#define mb() barrier() +#define rmb() mb() +#define wmb() mb() +#define set_mb(var, value) do { var = value; mb(); } while (0) +#define set_wmb(var, value) do { var = value; wmb(); } while (0) + +#define smp_mb() mb() +#define smp_rmb() rmb() +#define smp_wmb() wmb() + +void show_trace(struct task_struct *task, unsigned long *stack); +void __bad_xchg(volatile void *ptr, int size); + +static inline unsigned long __xchg(unsigned long x, volatile void *ptr, + int size) +{ + unsigned long ret; + unsigned long flags; + + switch (size) { + case 1: + local_irq_save(flags); + ret = *(volatile unsigned char *)ptr; + *(volatile unsigned char *)ptr = x; + local_irq_restore(flags); + break; + + case 4: + local_irq_save(flags); + ret = *(volatile unsigned long *)ptr; + *(volatile unsigned long *)ptr = x; + local_irq_restore(flags); + break; + default: + __bad_xchg(ptr, size), ret = 0; + break; + } + + return ret; +} + +void disable_hlt(void); +void enable_hlt(void); +void default_idle(void); + +#define xchg(ptr, x) \ + ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) + +void free_init_pages(char *what, unsigned long begin, unsigned long end); +void free_initmem(void); +extern char *klimit; +extern void ret_from_fork(void); + +#ifdef CONFIG_DEBUG_FS +extern struct dentry *of_debugfs_root; +#endif + +#define arch_align_stack(x) (x) + +#endif /* _ASM_MICROBLAZE_SYSTEM_H */ -- cgit v0.10.2 From 9981cd94d526a300dbef58048b1d281386b7289c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:38 +0100 Subject: microblaze_v8: clinkage.h linkage.h sections.h kmap_types.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/clinkage.h b/arch/microblaze/include/asm/clinkage.h new file mode 100644 index 0000000..9e21843 --- /dev/null +++ b/arch/microblaze/include/asm/clinkage.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/kmap_types.h b/arch/microblaze/include/asm/kmap_types.h new file mode 100644 index 0000000..4d7e222 --- /dev/null +++ b/arch/microblaze/include/asm/kmap_types.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_KMAP_TYPES_H +#define _ASM_MICROBLAZE_KMAP_TYPES_H + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_PTE0, + KM_PTE1, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR, +}; + +#endif /* _ASM_MICROBLAZE_KMAP_TYPES_H */ diff --git a/arch/microblaze/include/asm/linkage.h b/arch/microblaze/include/asm/linkage.h new file mode 100644 index 0000000..3a8e36d --- /dev/null +++ b/arch/microblaze/include/asm/linkage.h @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_LINKAGE_H +#define _ASM_MICROBLAZE_LINKAGE_H + +#define __ALIGN .align 4 +#define __ALIGN_STR ".align 4" + +#endif /* _ASM_MICROBLAZE_LINKAGE_H */ diff --git a/arch/microblaze/include/asm/sections.h b/arch/microblaze/include/asm/sections.h new file mode 100644 index 0000000..8434a43 --- /dev/null +++ b/arch/microblaze/include/asm/sections.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SECTIONS_H +#define _ASM_MICROBLAZE_SECTIONS_H + +#include + +# ifndef __ASSEMBLY__ +extern char _ssbss[], _esbss[]; +extern unsigned long __ivt_start[], __ivt_end[]; + +# ifdef CONFIG_MTD_UCLINUX +extern char *_ebss; +# endif + +extern u32 _fdt_start[], _fdt_end[]; + +# endif /* !__ASSEMBLY__ */ +#endif /* _ASM_MICROBLAZE_SECTIONS_H */ -- cgit v0.10.2 From fb621f1790b9a14a44162ba02fb6b31479aa7cc4 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:39 +0100 Subject: microblaze_v8: stats headers Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/stat.h b/arch/microblaze/include/asm/stat.h new file mode 100644 index 0000000..5f18b8a --- /dev/null +++ b/arch/microblaze/include/asm/stat.h @@ -0,0 +1,73 @@ +/* + * Microblaze stat structure + * + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + * + * Written by Miles Bader + */ + +#ifndef _ASM_MICROBLAZE_STAT_H +#define _ASM_MICROBLAZE_STAT_H + +#include + +struct stat { + unsigned int st_dev; + unsigned long st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned int st_rdev; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long __unused1; /* unsigned long st_atime_nsec */ + unsigned long st_mtime; + unsigned long __unused2; /* unsigned long st_mtime_nsec */ + unsigned long st_ctime; + unsigned long __unused3; /* unsigned long st_ctime_nsec */ + unsigned long __unused4; + unsigned long __unused5; +}; + +struct stat64 { + unsigned long long st_dev; + unsigned long __unused1; + + unsigned long long st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned int st_uid; + unsigned int st_gid; + + unsigned long long st_rdev; + unsigned long __unused3; + + long long st_size; + unsigned long st_blksize; + + unsigned long st_blocks; /* No. of 512-byte blocks allocated */ + unsigned long __unused4; /* future possible st_blocks high bits */ + + unsigned long st_atime; + unsigned long st_atime_nsec; + + unsigned long st_mtime; + unsigned long st_mtime_nsec; + + unsigned long st_ctime; + unsigned long st_ctime_nsec; + + unsigned long __unused8; +}; + +#endif /* _ASM_MICROBLAZE_STAT_H */ diff --git a/arch/microblaze/include/asm/statfs.h b/arch/microblaze/include/asm/statfs.h new file mode 100644 index 0000000..0b91fe1 --- /dev/null +++ b/arch/microblaze/include/asm/statfs.h @@ -0,0 +1 @@ +#include -- cgit v0.10.2 From 19d1b40ac5ba821b29fe047512ae9971a31d14c3 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:40 +0100 Subject: microblaze_v8: termbits.h termios.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/termbits.h b/arch/microblaze/include/asm/termbits.h new file mode 100644 index 0000000..a1b64bc --- /dev/null +++ b/arch/microblaze/include/asm/termbits.h @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TERMBITS_H +#define _ASM_MICROBLAZE_TERMBITS_H + +#include + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define NCCS 19 +struct termios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ +}; + +struct ktermios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +/* c_cc characters */ + +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + +/* c_iflag bits */ + +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +/* c_oflag bits */ + +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +/* c_cflag bit meaning */ + +#define CBAUD 0010017 +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#define EXTA B19200 +#define EXTB B38400 +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#define CBAUDEX 0010000 +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define BOTHER 0010000 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 +#define CIBAUD 002003600000 /* input baud rate (not used) */ +#define CMSPAR 010000000000 /* mark or space (stick) parity */ +#define CRTSCTS 020000000000 /* flow control */ + +#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ + +/* c_lflag bits */ + +#define ISIG 0000001 +#define ICANON 0000002 +#define XCASE 0000004 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define IEXTEN 0100000 + +/* tcflow() and TCXONC use these */ + +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ + +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ + +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +#endif /* _ASM_MICROBLAZE_TERMBITS_H */ diff --git a/arch/microblaze/include/asm/termios.h b/arch/microblaze/include/asm/termios.h new file mode 100644 index 0000000..102d772 --- /dev/null +++ b/arch/microblaze/include/asm/termios.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_TERMIOS_H +#define _ASM_MICROBLAZE_TERMIOS_H + +#include +#include +#include + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +#ifdef __KERNEL__ +/* intr=^C quit=^| erase=del kill=^U + eof=^D vtime=\0 vmin=\1 sxtc=\0 + start=^Q stop=^S susp=^Z eol=\0 + reprint=^R discard=^U werase=^W lnext=^V + eol2=\0 +*/ +#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" +#endif + +/* Modem lines */ + +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 + +/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ + +/* Line disciplines */ + +#define N_TTY 0 +#define N_SLIP 1 +#define N_MOUSE 2 +#define N_PPP 3 +#define N_STRIP 4 +#define N_AX25 5 +#define N_X25 6 /* X.25 async */ +#define N_6PACK 7 +#define N_MASC 8 /* Reserved for Mobitex module */ +#define N_R3964 9 /* Reserved for Simatic R3964 module */ +#define N_PROFIBUS_FDL 10 /* Reserved for Profibus */ +#define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ +#define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards + about SMS messages */ +#define N_HDLC 13 /* synchronous HDLC */ +#define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ + +#ifdef __KERNEL__ + +#include + +#endif /* __KERNEL__ */ + +#endif /* _ASM_MICROBLAZE_TERMIOS_H */ -- cgit v0.10.2 From 3a5c17b573acd712c849ba447d914dae722483b3 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:40 +0100 Subject: microblaze_v8: sigcontext.h siginfo.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/sigcontext.h b/arch/microblaze/include/asm/sigcontext.h new file mode 100644 index 0000000..55873c8 --- /dev/null +++ b/arch/microblaze/include/asm/sigcontext.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SIGCONTEXT_H +#define _ASM_MICROBLAZE_SIGCONTEXT_H + +/* FIXME should be linux/ptrace.h */ +#include + +struct sigcontext { + struct pt_regs regs; + unsigned long oldmask; +}; + +#endif /* _ASM_MICROBLAZE_SIGCONTEXT_H */ diff --git a/arch/microblaze/include/asm/siginfo.h b/arch/microblaze/include/asm/siginfo.h new file mode 100644 index 0000000..f162911 --- /dev/null +++ b/arch/microblaze/include/asm/siginfo.h @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SIGINFO_H +#define _ASM_MICROBLAZE_SIGINFO_H + +#include +#include + +#endif /* _ASM_MICROBLAZE_SIGINFO_H */ -- cgit v0.10.2 From 407f99912bd6e264340dd432c85d4e9c53d34579 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:41 +0100 Subject: microblaze_v8: headers simple files - empty or redirect to asm-generic Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/auxvec.h b/arch/microblaze/include/asm/auxvec.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/microblaze/include/asm/cputable.h b/arch/microblaze/include/asm/cputable.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/microblaze/include/asm/cputime.h b/arch/microblaze/include/asm/cputime.h new file mode 100644 index 0000000..6d68ad7 --- /dev/null +++ b/arch/microblaze/include/asm/cputime.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/div64.h b/arch/microblaze/include/asm/div64.h new file mode 100644 index 0000000..6cd978c --- /dev/null +++ b/arch/microblaze/include/asm/div64.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/emergency-restart.h b/arch/microblaze/include/asm/emergency-restart.h new file mode 100644 index 0000000..3711bd9 --- /dev/null +++ b/arch/microblaze/include/asm/emergency-restart.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/errno.h b/arch/microblaze/include/asm/errno.h new file mode 100644 index 0000000..4c82b50 --- /dev/null +++ b/arch/microblaze/include/asm/errno.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/futex.h b/arch/microblaze/include/asm/futex.h new file mode 100644 index 0000000..0b74582 --- /dev/null +++ b/arch/microblaze/include/asm/futex.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/kdebug.h b/arch/microblaze/include/asm/kdebug.h new file mode 100644 index 0000000..6ece1b0 --- /dev/null +++ b/arch/microblaze/include/asm/kdebug.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/local.h b/arch/microblaze/include/asm/local.h new file mode 100644 index 0000000..c11c530 --- /dev/null +++ b/arch/microblaze/include/asm/local.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/mutex.h b/arch/microblaze/include/asm/mutex.h new file mode 100644 index 0000000..ff6101a --- /dev/null +++ b/arch/microblaze/include/asm/mutex.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/percpu.h b/arch/microblaze/include/asm/percpu.h new file mode 100644 index 0000000..06a959d --- /dev/null +++ b/arch/microblaze/include/asm/percpu.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/resource.h b/arch/microblaze/include/asm/resource.h new file mode 100644 index 0000000..04bc4db --- /dev/null +++ b/arch/microblaze/include/asm/resource.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/user.h b/arch/microblaze/include/asm/user.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/microblaze/include/asm/vga.h b/arch/microblaze/include/asm/vga.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/microblaze/include/asm/xor.h b/arch/microblaze/include/asm/xor.h new file mode 100644 index 0000000..c82eb12 --- /dev/null +++ b/arch/microblaze/include/asm/xor.h @@ -0,0 +1 @@ +#include -- cgit v0.10.2 From a1a741e4143a971dafe66f54defdea2ad9a5be5a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:42 +0100 Subject: microblaze_v8: gpio.h, serial.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/gpio.h b/arch/microblaze/include/asm/gpio.h new file mode 100644 index 0000000..ea04632 --- /dev/null +++ b/arch/microblaze/include/asm/gpio.h @@ -0,0 +1,56 @@ +/* + * Generic GPIO API implementation for PowerPC. + * + * Copyright (c) 2007-2008 MontaVista Software, Inc. + * + * Author: Anton Vorontsov + * + * 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. + */ + +#ifndef __ASM_POWERPC_GPIO_H +#define __ASM_POWERPC_GPIO_H + +#include +#include + +#ifdef CONFIG_GPIOLIB + +/* + * We don't (yet) implement inlined/rapid versions for on-chip gpios. + * Just call gpiolib. + */ +static inline int gpio_get_value(unsigned int gpio) +{ + return __gpio_get_value(gpio); +} + +static inline void gpio_set_value(unsigned int gpio, int value) +{ + __gpio_set_value(gpio, value); +} + +static inline int gpio_cansleep(unsigned int gpio) +{ + return __gpio_cansleep(gpio); +} + +/* + * Not implemented, yet. + */ +static inline int gpio_to_irq(unsigned int gpio) +{ + return -ENOSYS; +} + +static inline int irq_to_gpio(unsigned int irq) +{ + return -EINVAL; +} + +#endif /* CONFIG_GPIOLIB */ + +#endif /* __ASM_POWERPC_GPIO_H */ diff --git a/arch/microblaze/include/asm/serial.h b/arch/microblaze/include/asm/serial.h new file mode 100644 index 0000000..39bfc8c --- /dev/null +++ b/arch/microblaze/include/asm/serial.h @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2009 Michal Simek + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SERIAL_H +#define _ASM_MICROBLAZE_SERIAL_H + +# define BASE_BAUD (1843200 / 16) + +#endif /* _ASM_MICROBLAZE_SERIAL_H */ -- cgit v0.10.2 From aa683ff145fd92df147e1fef15f17e06a2ae009f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:42 +0100 Subject: microblaze_v8: namei.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/namei.h b/arch/microblaze/include/asm/namei.h new file mode 100644 index 0000000..61d60b8 --- /dev/null +++ b/arch/microblaze/include/asm/namei.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_NAMEI_H +#define _ASM_MICROBLAZE_NAMEI_H + +#ifdef __KERNEL__ + +/* This dummy routine maybe changed to something useful + * for /usr/gnemul/ emulation stuff. + * Look at asm-sparc/namei.h for details. + */ +#define __emul_prefix() NULL + +#endif /* __KERNEL__ */ + +#endif /* _ASM_MICROBLAZE_NAMEI_H */ -- cgit v0.10.2 From 4115ac8381b528f76f3d08f2a2387408512891c2 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:43 +0100 Subject: microblaze_v8: headers files entry.h current.h mman.h registers.h sembuf.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/current.h b/arch/microblaze/include/asm/current.h new file mode 100644 index 0000000..8375ea9 --- /dev/null +++ b/arch/microblaze/include/asm/current.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_CURRENT_H +#define _ASM_MICROBLAZE_CURRENT_H + +# ifndef __ASSEMBLY__ +/* + * Dedicate r31 to keeping the current task pointer + */ +register struct task_struct *current asm("r31"); + +# define get_current() current +# endif /* __ASSEMBLY__ */ + +#endif /* _ASM_MICROBLAZE_CURRENT_H */ diff --git a/arch/microblaze/include/asm/entry.h b/arch/microblaze/include/asm/entry.h new file mode 100644 index 0000000..7f57e42 --- /dev/null +++ b/arch/microblaze/include/asm/entry.h @@ -0,0 +1,35 @@ +/* + * Definitions used by low-level trap handlers + * + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2007 - 2008 PetaLogix + * Copyright (C) 2007 John Williams + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file COPYING in the main directory of this + * archive for more details. + */ + +#ifndef _ASM_MICROBLAZE_ENTRY_H +#define _ASM_MICROBLAZE_ENTRY_H + +#include +#include + +/* + * These are per-cpu variables required in entry.S, among other + * places + */ + +#define PER_CPU(var) per_cpu__##var + +# ifndef __ASSEMBLY__ +DECLARE_PER_CPU(unsigned int, KSP); /* Saved kernel stack pointer */ +DECLARE_PER_CPU(unsigned int, KM); /* Kernel/user mode */ +DECLARE_PER_CPU(unsigned int, ENTRY_SP); /* Saved SP on kernel entry */ +DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */ +DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ +DECLARE_PER_CPU(unsigned int, SYSCALL_SAVE); /* Saved syscall number */ +# endif /* __ASSEMBLY__ */ + +#endif /* _ASM_MICROBLAZE_ENTRY_H */ diff --git a/arch/microblaze/include/asm/mman.h b/arch/microblaze/include/asm/mman.h new file mode 100644 index 0000000..4914b13 --- /dev/null +++ b/arch/microblaze/include/asm/mman.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_MMAN_H +#define _ASM_MICROBLAZE_MMAN_H + +#include + +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ +#define MAP_NONBLOCK 0x10000 /* do not block on IO */ + +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ + +#endif /* _ASM_MICROBLAZE_MMAN_H */ diff --git a/arch/microblaze/include/asm/registers.h b/arch/microblaze/include/asm/registers.h new file mode 100644 index 0000000..834142d --- /dev/null +++ b/arch/microblaze/include/asm/registers.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2008 Michal Simek + * Copyright (C) 2008 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_REGISTERS_H +#define _ASM_MICROBLAZE_REGISTERS_H + +#define MSR_BE (1<<0) /* 0x001 */ +#define MSR_IE (1<<1) /* 0x002 */ +#define MSR_C (1<<2) /* 0x004 */ +#define MSR_BIP (1<<3) /* 0x008 */ +#define MSR_FSL (1<<4) /* 0x010 */ +#define MSR_ICE (1<<5) /* 0x020 */ +#define MSR_DZ (1<<6) /* 0x040 */ +#define MSR_DCE (1<<7) /* 0x080 */ +#define MSR_EE (1<<8) /* 0x100 */ +#define MSR_EIP (1<<9) /* 0x200 */ +#define MSR_CC (1<<31) + +/* Floating Point Status Register (FSR) Bits */ +#define FSR_IO (1<<4) /* Invalid operation */ +#define FSR_DZ (1<<3) /* Divide-by-zero */ +#define FSR_OF (1<<2) /* Overflow */ +#define FSR_UF (1<<1) /* Underflow */ +#define FSR_DO (1<<0) /* Denormalized operand error */ + +#endif /* _ASM_MICROBLAZE_REGISTERS_H */ diff --git a/arch/microblaze/include/asm/sembuf.h b/arch/microblaze/include/asm/sembuf.h new file mode 100644 index 0000000..b804ed7 --- /dev/null +++ b/arch/microblaze/include/asm/sembuf.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SEMBUF_H +#define _ASM_MICROBLAZE_SEMBUF_H + +/* + * The semid64_ds structure for microblaze architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct semid64_ds { + struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ + __kernel_time_t sem_otime; /* last semop time */ + unsigned long __unused1; + __kernel_time_t sem_ctime; /* last change time */ + unsigned long __unused2; + unsigned long sem_nsems; /* no. of semaphores in array */ + unsigned long __unused3; + unsigned long __unused4; +}; + + +#endif /* _ASM_MICROBLAZE_SEMBUF_H */ -- cgit v0.10.2 From 0a7d800de29ed4e265cfe1a27517c5d51958b94a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:44 +0100 Subject: microblaze_v8: device.h param.h topology.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/device.h b/arch/microblaze/include/asm/device.h new file mode 100644 index 0000000..c042830 --- /dev/null +++ b/arch/microblaze/include/asm/device.h @@ -0,0 +1,21 @@ +/* + * Arch specific extensions to struct device + * + * This file is subject to the terms and conditions of the GNU General Public + * License v2. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_DEVICE_H +#define _ASM_MICROBLAZE_DEVICE_H + +struct device_node; + +struct dev_archdata { + /* Optional pointer to an OF device node */ + struct device_node *of_node; +}; + +#endif /* _ASM_MICROBLAZE_DEVICE_H */ + + diff --git a/arch/microblaze/include/asm/param.h b/arch/microblaze/include/asm/param.h new file mode 100644 index 0000000..8c538a4 --- /dev/null +++ b/arch/microblaze/include/asm/param.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_PARAM_H +#define _ASM_MICROBLAZE_PARAM_H + +#ifdef __KERNEL__ +#define HZ CONFIG_HZ /* internal kernel timer frequency */ +#define USER_HZ 100 /* for user interfaces in "ticks" */ +#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */ +#endif /* __KERNEL__ */ + +#ifndef HZ +#define HZ 100 +#endif + +#define EXEC_PAGESIZE 4096 + +#ifndef NOGROUP +#define NOGROUP (-1) +#endif + +#define MAXHOSTNAMELEN 64 /* max length of hostname */ + +#endif /* _ASM_MICROBLAZE_PARAM_H */ diff --git a/arch/microblaze/include/asm/topology.h b/arch/microblaze/include/asm/topology.h new file mode 100644 index 0000000..96bcea5 --- /dev/null +++ b/arch/microblaze/include/asm/topology.h @@ -0,0 +1,11 @@ +#include + +#ifndef _ASM_MICROBLAZE_TOPOLOGY_H +#define _ASM_MICROBLAZE_TOPOLOGY_H + +struct device_node; +static inline int of_node_to_nid(struct device_node *device) +{ + return 0; +} +#endif /* _ASM_MICROBLAZE_TOPOLOGY_H */ -- cgit v0.10.2 From a9ebdfc5edd1600c21f9ae942a95340ca948c788 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:44 +0100 Subject: microblaze_v8: pool.h socket.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/poll.h b/arch/microblaze/include/asm/poll.h new file mode 100644 index 0000000..c98509d --- /dev/null +++ b/arch/microblaze/include/asm/poll.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/socket.h b/arch/microblaze/include/asm/socket.h new file mode 100644 index 0000000..f919b6b --- /dev/null +++ b/arch/microblaze/include/asm/socket.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SOCKET_H +#define _ASM_MICROBLAZE_SOCKET_H + +#include + +/* For setsockoptions(2) */ +#define SOL_SOCKET 1 + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 + +#define SO_PEERNAME 28 +#define SO_TIMESTAMP 29 +#define SCM_TIMESTAMP SO_TIMESTAMP + +#define SO_ACCEPTCONN 30 + +#define SO_PEERSEC 31 +#define SO_PASSSEC 34 + +#define SO_TIMESTAMPNS 35 +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS + +#define SO_MARK 36 + +#endif /* _ASM_MICROBLAZE_SOCKET_H */ -- cgit v0.10.2 From 9de8901153ebf8c1070d9aca73c4a98db32abc78 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:45 +0100 Subject: microblaze_v8: fcntl.h sockios.h ucontext.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/fcntl.h b/arch/microblaze/include/asm/fcntl.h new file mode 100644 index 0000000..46ab12d --- /dev/null +++ b/arch/microblaze/include/asm/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/sockios.h b/arch/microblaze/include/asm/sockios.h new file mode 100644 index 0000000..9fff57a --- /dev/null +++ b/arch/microblaze/include/asm/sockios.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SOCKIOS_H +#define _ASM_MICROBLAZE_SOCKIOS_H + +#include + +/* Socket-level I/O control calls. */ +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ + +#endif /* _ASM_MICROBLAZE_SOCKIOS_H */ diff --git a/arch/microblaze/include/asm/ucontext.h b/arch/microblaze/include/asm/ucontext.h new file mode 100644 index 0000000..11f6bb3 --- /dev/null +++ b/arch/microblaze/include/asm/ucontext.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_UCONTEXT_H +#define _ASM_MICROBLAZE_UCONTEXT_H + +#include + +struct ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; /* mask last for extensibility */ +}; + +#endif /* _ASM_MICROBLAZE_UCONTEXT_H */ -- cgit v0.10.2 From dd0105a6e9dfd64d73a0aa6f4422f5cb0c743a6c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:46 +0100 Subject: microblaze_v8: unistd.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h new file mode 100644 index 0000000..d9d3903 --- /dev/null +++ b/arch/microblaze/include/asm/unistd.h @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2007-2008 Michal Simek + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_UNISTD_H +#define _ASM_MICROBLAZE_UNISTD_H + +#define __NR_restart_syscall 0 /* ok */ +#define __NR_exit 1 /* ok */ +#define __NR_fork 2 /* not for no MMU - weird */ +#define __NR_read 3 /* ok */ +#define __NR_write 4 /* ok */ +#define __NR_open 5 /* openat */ +#define __NR_close 6 /* ok */ +#define __NR_waitpid 7 /* waitid */ +#define __NR_creat 8 /* openat */ +#define __NR_link 9 /* linkat */ +#define __NR_unlink 10 /* unlinkat */ +#define __NR_execve 11 /* ok */ +#define __NR_chdir 12 /* ok */ +#define __NR_time 13 /* obsolete -> sys_gettimeofday */ +#define __NR_mknod 14 /* mknodat */ +#define __NR_chmod 15 /* fchmodat */ +#define __NR_lchown 16 /* ok */ +#define __NR_break 17 /* don't know */ +#define __NR_oldstat 18 /* remove */ +#define __NR_lseek 19 /* ok */ +#define __NR_getpid 20 /* ok */ +#define __NR_mount 21 /* ok */ +#define __NR_umount 22 /* ok */ /* use only umount2 */ +#define __NR_setuid 23 /* ok */ +#define __NR_getuid 24 /* ok */ +#define __NR_stime 25 /* obsolete -> sys_settimeofday */ +#define __NR_ptrace 26 /* ok */ +#define __NR_alarm 27 /* obsolete -> sys_setitimer */ +#define __NR_oldfstat 28 /* remove */ +#define __NR_pause 29 /* obsolete -> sys_rt_sigtimedwait */ +#define __NR_utime 30 /* obsolete -> sys_utimesat */ +#define __NR_stty 31 /* remove */ +#define __NR_gtty 32 /* remove */ +#define __NR_access 33 /* faccessat */ +/* can be implemented by sys_setpriority */ +#define __NR_nice 34 +#define __NR_ftime 35 /* remove */ +#define __NR_sync 36 /* ok */ +#define __NR_kill 37 /* ok */ +#define __NR_rename 38 /* renameat */ +#define __NR_mkdir 39 /* mkdirat */ +#define __NR_rmdir 40 /* unlinkat */ +#define __NR_dup 41 /* ok */ +#define __NR_pipe 42 /* ok */ +#define __NR_times 43 /* ok */ +#define __NR_prof 44 /* remove */ +#define __NR_brk 45 /* ok -mmu, nommu specific */ +#define __NR_setgid 46 /* ok */ +#define __NR_getgid 47 /* ok */ +#define __NR_signal 48 /* obsolete -> sys_rt_sigaction */ +#define __NR_geteuid 49 /* ok */ +#define __NR_getegid 50 /* ok */ +#define __NR_acct 51 /* add it and then I can disable it */ +#define __NR_umount2 52 /* remove */ +#define __NR_lock 53 /* remove */ +#define __NR_ioctl 54 /* ok */ +#define __NR_fcntl 55 /* ok -> 64bit version*/ +#define __NR_mpx 56 /* remove */ +#define __NR_setpgid 57 /* ok */ +#define __NR_ulimit 58 /* remove */ +#define __NR_oldolduname 59 /* remove */ +#define __NR_umask 60 /* ok */ +#define __NR_chroot 61 /* ok */ +#define __NR_ustat 62 /* obsolete -> statfs64 */ +#define __NR_dup2 63 /* ok */ +#define __NR_getppid 64 /* ok */ +#define __NR_getpgrp 65 /* obsolete -> sys_getpgid */ +#define __NR_setsid 66 /* ok */ +#define __NR_sigaction 67 /* obsolete -> rt_sigaction */ +#define __NR_sgetmask 68 /* obsolete -> sys_rt_sigprocmask */ +#define __NR_ssetmask 69 /* obsolete ->sys_rt_sigprocmask */ +#define __NR_setreuid 70 /* ok */ +#define __NR_setregid 71 /* ok */ +#define __NR_sigsuspend 72 /* obsolete -> rt_sigsuspend */ +#define __NR_sigpending 73 /* obsolete -> sys_rt_sigpending */ +#define __NR_sethostname 74 /* ok */ +#define __NR_setrlimit 75 /* ok */ +#define __NR_getrlimit 76 /* ok Back compatible 2G limited rlimit */ +#define __NR_getrusage 77 /* ok */ +#define __NR_gettimeofday 78 /* ok */ +#define __NR_settimeofday 79 /* ok */ +#define __NR_getgroups 80 /* ok */ +#define __NR_setgroups 81 /* ok */ +#define __NR_select 82 /* obsolete -> sys_pselect7 */ +#define __NR_symlink 83 /* symlinkat */ +#define __NR_oldlstat 84 /* remove */ +#define __NR_readlink 85 /* obsolete -> sys_readlinkat */ +#define __NR_uselib 86 /* remove */ +#define __NR_swapon 87 /* ok */ +#define __NR_reboot 88 /* ok */ +#define __NR_readdir 89 /* remove ? */ +#define __NR_mmap 90 /* obsolete -> sys_mmap2 */ +#define __NR_munmap 91 /* ok - mmu and nommu */ +#define __NR_truncate 92 /* ok or truncate64 */ +#define __NR_ftruncate 93 /* ok or ftruncate64 */ +#define __NR_fchmod 94 /* ok */ +#define __NR_fchown 95 /* ok */ +#define __NR_getpriority 96 /* ok */ +#define __NR_setpriority 97 /* ok */ +#define __NR_profil 98 /* remove */ +#define __NR_statfs 99 /* ok or statfs64 */ +#define __NR_fstatfs 100 /* ok or fstatfs64 */ +#define __NR_ioperm 101 /* remove */ +#define __NR_socketcall 102 /* remove */ +#define __NR_syslog 103 /* ok */ +#define __NR_setitimer 104 /* ok */ +#define __NR_getitimer 105 /* ok */ +#define __NR_stat 106 /* remove */ +#define __NR_lstat 107 /* remove */ +#define __NR_fstat 108 /* remove */ +#define __NR_olduname 109 /* remove */ +#define __NR_iopl 110 /* remove */ +#define __NR_vhangup 111 /* ok */ +#define __NR_idle 112 /* remove */ +#define __NR_vm86old 113 /* remove */ +#define __NR_wait4 114 /* obsolete -> waitid */ +#define __NR_swapoff 115 /* ok */ +#define __NR_sysinfo 116 /* ok */ +#define __NR_ipc 117 /* remove - direct call */ +#define __NR_fsync 118 /* ok */ +#define __NR_sigreturn 119 /* obsolete -> sys_rt_sigreturn */ +#define __NR_clone 120 /* ok */ +#define __NR_setdomainname 121 /* ok */ +#define __NR_uname 122 /* remove */ +#define __NR_modify_ldt 123 /* remove */ +#define __NR_adjtimex 124 /* ok */ +#define __NR_mprotect 125 /* remove */ +#define __NR_sigprocmask 126 /* obsolete -> sys_rt_sigprocmask */ +#define __NR_create_module 127 /* remove */ +#define __NR_init_module 128 /* ok */ +#define __NR_delete_module 129 /* ok */ +#define __NR_get_kernel_syms 130 /* remove */ +#define __NR_quotactl 131 /* ok */ +#define __NR_getpgid 132 /* ok */ +#define __NR_fchdir 133 /* ok */ +#define __NR_bdflush 134 /* remove */ +#define __NR_sysfs 135 /* needed for busybox */ +#define __NR_personality 136 /* ok */ +#define __NR_afs_syscall 137 /* Syscall for Andrew File System */ +#define __NR_setfsuid 138 /* ok */ +#define __NR_setfsgid 139 /* ok */ +#define __NR__llseek 140 /* remove only lseek */ +#define __NR_getdents 141 /* ok or getdents64 */ +#define __NR__newselect 142 /* remove */ +#define __NR_flock 143 /* ok */ +#define __NR_msync 144 /* remove */ +#define __NR_readv 145 /* ok */ +#define __NR_writev 146 /* ok */ +#define __NR_getsid 147 /* ok */ +#define __NR_fdatasync 148 /* ok */ +#define __NR__sysctl 149 /* remove */ +#define __NR_mlock 150 /* ok - nommu or mmu */ +#define __NR_munlock 151 /* ok - nommu or mmu */ +#define __NR_mlockall 152 /* ok - nommu or mmu */ +#define __NR_munlockall 153 /* ok - nommu or mmu */ +#define __NR_sched_setparam 154 /* ok */ +#define __NR_sched_getparam 155 /* ok */ +#define __NR_sched_setscheduler 156 /* ok */ +#define __NR_sched_getscheduler 157 /* ok */ +#define __NR_sched_yield 158 /* ok */ +#define __NR_sched_get_priority_max 159 /* ok */ +#define __NR_sched_get_priority_min 160 /* ok */ +#define __NR_sched_rr_get_interval 161 /* ok */ +#define __NR_nanosleep 162 /* ok */ +#define __NR_mremap 163 /* ok - nommu or mmu */ +#define __NR_setresuid 164 /* ok */ +#define __NR_getresuid 165 /* ok */ +#define __NR_vm86 166 /* remove */ +#define __NR_query_module 167 /* ok */ +#define __NR_poll 168 /* obsolete -> sys_ppoll */ +#define __NR_nfsservctl 169 /* ok */ +#define __NR_setresgid 170 /* ok */ +#define __NR_getresgid 171 /* ok */ +#define __NR_prctl 172 /* ok */ +#define __NR_rt_sigreturn 173 /* ok */ +#define __NR_rt_sigaction 174 /* ok */ +#define __NR_rt_sigprocmask 175 /* ok */ +#define __NR_rt_sigpending 176 /* ok */ +#define __NR_rt_sigtimedwait 177 /* ok */ +#define __NR_rt_sigqueueinfo 178 /* ok */ +#define __NR_rt_sigsuspend 179 /* ok */ +#define __NR_pread64 180 /* ok */ +#define __NR_pwrite64 181 /* ok */ +#define __NR_chown 182 /* obsolete -> fchownat */ +#define __NR_getcwd 183 /* ok */ +#define __NR_capget 184 /* ok */ +#define __NR_capset 185 /* ok */ +#define __NR_sigaltstack 186 /* remove */ +#define __NR_sendfile 187 /* ok -> exist 64bit version*/ +#define __NR_getpmsg 188 /* remove */ +/* remove - some people actually want streams */ +#define __NR_putpmsg 189 +/* for noMMU - group with clone -> maybe remove */ +#define __NR_vfork 190 +#define __NR_ugetrlimit 191 /* remove - SuS compliant getrlimit */ +#define __NR_mmap2 192 /* ok */ +#define __NR_truncate64 193 /* ok */ +#define __NR_ftruncate64 194 /* ok */ +#define __NR_stat64 195 /* remove _ARCH_WANT_STAT64 */ +#define __NR_lstat64 196 /* remove _ARCH_WANT_STAT64 */ +#define __NR_fstat64 197 /* remove _ARCH_WANT_STAT64 */ +#define __NR_lchown32 198 /* ok - without 32 */ +#define __NR_getuid32 199 /* ok - without 32 */ +#define __NR_getgid32 200 /* ok - without 32 */ +#define __NR_geteuid32 201 /* ok - without 32 */ +#define __NR_getegid32 202 /* ok - without 32 */ +#define __NR_setreuid32 203 /* ok - without 32 */ +#define __NR_setregid32 204 /* ok - without 32 */ +#define __NR_getgroups32 205 /* ok - without 32 */ +#define __NR_setgroups32 206 /* ok - without 32 */ +#define __NR_fchown32 207 /* ok - without 32 */ +#define __NR_setresuid32 208 /* ok - without 32 */ +#define __NR_getresuid32 209 /* ok - without 32 */ +#define __NR_setresgid32 210 /* ok - without 32 */ +#define __NR_getresgid32 211 /* ok - without 32 */ +#define __NR_chown32 212 /* ok - without 32 -obsolete -> fchownat */ +#define __NR_setuid32 213 /* ok - without 32 */ +#define __NR_setgid32 214 /* ok - without 32 */ +#define __NR_setfsuid32 215 /* ok - without 32 */ +#define __NR_setfsgid32 216 /* ok - without 32 */ +#define __NR_pivot_root 217 /* ok */ +#define __NR_mincore 218 /* ok */ +#define __NR_madvise 219 /* ok */ +#define __NR_getdents64 220 /* ok */ +#define __NR_fcntl64 221 /* ok */ +/* 223 is unused */ +#define __NR_gettid 224 /* ok */ +#define __NR_readahead 225 /* ok */ +#define __NR_setxattr 226 /* ok */ +#define __NR_lsetxattr 227 /* ok */ +#define __NR_fsetxattr 228 /* ok */ +#define __NR_getxattr 229 /* ok */ +#define __NR_lgetxattr 230 /* ok */ +#define __NR_fgetxattr 231 /* ok */ +#define __NR_listxattr 232 /* ok */ +#define __NR_llistxattr 233 /* ok */ +#define __NR_flistxattr 234 /* ok */ +#define __NR_removexattr 235 /* ok */ +#define __NR_lremovexattr 236 /* ok */ +#define __NR_fremovexattr 237 /* ok */ +#define __NR_tkill 238 /* ok */ +#define __NR_sendfile64 239 /* ok */ +#define __NR_futex 240 /* ok */ +#define __NR_sched_setaffinity 241 /* ok */ +#define __NR_sched_getaffinity 242 /* ok */ +#define __NR_set_thread_area 243 /* remove */ +#define __NR_get_thread_area 244 /* remove */ +#define __NR_io_setup 245 /* ok */ +#define __NR_io_destroy 246 /* ok */ +#define __NR_io_getevents 247 /* ok */ +#define __NR_io_submit 248 /* ok */ +#define __NR_io_cancel 249 /* ok */ +#define __NR_fadvise64 250 /* remove -> sys_fadvise64_64 */ +/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ +#define __NR_exit_group 252 /* ok */ +#define __NR_lookup_dcookie 253 /* ok */ +#define __NR_epoll_create 254 /* ok */ +#define __NR_epoll_ctl 255 /* ok */ +#define __NR_epoll_wait 256 /* obsolete -> sys_epoll_pwait */ +#define __NR_remap_file_pages 257 /* only for mmu */ +#define __NR_set_tid_address 258 /* ok */ +#define __NR_timer_create 259 /* ok */ +#define __NR_timer_settime (__NR_timer_create+1) /* 260 */ /* ok */ +#define __NR_timer_gettime (__NR_timer_create+2) /* 261 */ /* ok */ +#define __NR_timer_getoverrun (__NR_timer_create+3) /* 262 */ /* ok */ +#define __NR_timer_delete (__NR_timer_create+4) /* 263 */ /* ok */ +#define __NR_clock_settime (__NR_timer_create+5) /* 264 */ /* ok */ +#define __NR_clock_gettime (__NR_timer_create+6) /* 265 */ /* ok */ +#define __NR_clock_getres (__NR_timer_create+7) /* 266 */ /* ok */ +#define __NR_clock_nanosleep (__NR_timer_create+8) /* 267 */ /* ok */ +#define __NR_statfs64 268 /* ok */ +#define __NR_fstatfs64 269 /* ok */ +#define __NR_tgkill 270 /* ok */ +#define __NR_utimes 271 /* obsolete -> sys_futimesat */ +#define __NR_fadvise64_64 272 /* ok */ +#define __NR_vserver 273 /* ok */ +#define __NR_mbind 274 /* only for mmu */ +#define __NR_get_mempolicy 275 /* only for mmu */ +#define __NR_set_mempolicy 276 /* only for mmu */ +#define __NR_mq_open 277 /* ok */ +#define __NR_mq_unlink (__NR_mq_open+1) /* 278 */ /* ok */ +#define __NR_mq_timedsend (__NR_mq_open+2) /* 279 */ /* ok */ +#define __NR_mq_timedreceive (__NR_mq_open+3) /* 280 */ /* ok */ +#define __NR_mq_notify (__NR_mq_open+4) /* 281 */ /* ok */ +#define __NR_mq_getsetattr (__NR_mq_open+5) /* 282 */ /* ok */ +#define __NR_kexec_load 283 /* ok */ +#define __NR_waitid 284 /* ok */ +/* #define __NR_sys_setaltroot 285 */ +#define __NR_add_key 286 /* ok */ +#define __NR_request_key 287 /* ok */ +#define __NR_keyctl 288 /* ok */ +#define __NR_ioprio_set 289 /* ok */ +#define __NR_ioprio_get 290 /* ok */ +#define __NR_inotify_init 291 /* ok */ +#define __NR_inotify_add_watch 292 /* ok */ +#define __NR_inotify_rm_watch 293 /* ok */ +#define __NR_migrate_pages 294 /* mmu */ +#define __NR_openat 295 /* ok */ +#define __NR_mkdirat 296 /* ok */ +#define __NR_mknodat 297 /* ok */ +#define __NR_fchownat 298 /* ok */ +#define __NR_futimesat 299 /* obsolete -> sys_utimesat */ +#define __NR_fstatat64 300 /* stat64 */ +#define __NR_unlinkat 301 /* ok */ +#define __NR_renameat 302 /* ok */ +#define __NR_linkat 303 /* ok */ +#define __NR_symlinkat 304 /* ok */ +#define __NR_readlinkat 305 /* ok */ +#define __NR_fchmodat 306 /* ok */ +#define __NR_faccessat 307 /* ok */ +#define __NR_pselect6 308 /* obsolete -> sys_pselect7 */ +#define __NR_ppoll 309 /* ok */ +#define __NR_unshare 310 /* ok */ +#define __NR_set_robust_list 311 /* ok */ +#define __NR_get_robust_list 312 /* ok */ +#define __NR_splice 313 /* ok */ +#define __NR_sync_file_range 314 /* ok */ +#define __NR_tee 315 /* ok */ +#define __NR_vmsplice 316 /* ok */ +#define __NR_move_pages 317 /* mmu */ +#define __NR_getcpu 318 /* ok */ +#define __NR_epoll_pwait 319 /* ok */ +#define __NR_utimensat 320 /* ok */ +#define __NR_signalfd 321 /* ok */ +#define __NR_timerfd_create 322 /* ok */ +#define __NR_eventfd 323 /* ok */ +#define __NR_fallocate 324 /* ok */ +#define __NR_semtimedop 325 /* ok - semaphore group */ +#define __NR_timerfd_settime 326 /* ok */ +#define __NR_timerfd_gettime 327 /* ok */ +/* sysv ipc syscalls */ +#define __NR_semctl 328 /* ok */ +#define __NR_semget 329 /* ok */ +#define __NR_semop 330 /* ok */ +#define __NR_msgctl 331 /* ok */ +#define __NR_msgget 332 /* ok */ +#define __NR_msgrcv 333 /* ok */ +#define __NR_msgsnd 334 /* ok */ +#define __NR_shmat 335 /* ok */ +#define __NR_shmctl 336 /* ok */ +#define __NR_shmdt 337 /* ok */ +#define __NR_shmget 338 /* ok */ + + +#define __NR_signalfd4 339 /* new */ +#define __NR_eventfd2 340 /* new */ +#define __NR_epoll_create1 341 /* new */ +#define __NR_dup3 342 /* new */ +#define __NR_pipe2 343 /* new */ +#define __NR_inotify_init1 344 /* new */ +#define __NR_socket 345 /* new */ +#define __NR_socketpair 346 /* new */ +#define __NR_bind 347 /* new */ +#define __NR_listen 348 /* new */ +#define __NR_accept 349 /* new */ +#define __NR_connect 350 /* new */ +#define __NR_getsockname 351 /* new */ +#define __NR_getpeername 352 /* new */ +#define __NR_sendto 353 /* new */ +#define __NR_send 354 /* new */ +#define __NR_recvfrom 355 /* new */ +#define __NR_recv 356 /* new */ +#define __NR_setsockopt 357 /* new */ +#define __NR_getsockopt 358 /* new */ +#define __NR_shutdown 359 /* new */ +#define __NR_sendmsg 360 /* new */ +#define __NR_recvmsg 361 /* new */ +#define __NR_accept04 362 /* new */ + +#define __NR_syscalls 363 + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +#define __ARCH_WANT_IPC_PARSE_VERSION +/* #define __ARCH_WANT_OLD_READDIR */ +/* #define __ARCH_WANT_OLD_STAT */ +#define __ARCH_WANT_STAT64 +#define __ARCH_WANT_SYS_ALARM +#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_PAUSE +#define __ARCH_WANT_SYS_SGETMASK +#define __ARCH_WANT_SYS_SIGNAL +#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_SYS_UTIME +#define __ARCH_WANT_SYS_WAITPID +#define __ARCH_WANT_SYS_SOCKETCALL +#define __ARCH_WANT_SYS_FADVISE64 +#define __ARCH_WANT_SYS_GETPGRP +#define __ARCH_WANT_SYS_LLSEEK +#define __ARCH_WANT_SYS_NICE +/* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */ +#define __ARCH_WANT_SYS_OLDUMOUNT +#define __ARCH_WANT_SYS_SIGPENDING +#define __ARCH_WANT_SYS_SIGPROCMASK +#define __ARCH_WANT_SYS_RT_SIGACTION +/* #define __ARCH_WANT_SYS_RT_SIGSUSPEND */ + +/* + * "Conditional" syscalls + * + * What we want is __attribute__((weak,alias("sys_ni_syscall"))), + * but it doesn't work on all toolchains, so we just do it by hand + */ +#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); + +#endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ +#endif /* _ASM_MICROBLAZE_UNISTD_H */ -- cgit v0.10.2 From 4684dadec6ca3f310b0d9ff1860ca6b6f11ffd2d Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:47 +0100 Subject: microblaze_v8: string.h thread_info.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/string.h b/arch/microblaze/include/asm/string.h new file mode 100644 index 0000000..f7728c9 --- /dev/null +++ b/arch/microblaze/include/asm/string.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_STRING_H +#define _ASM_MICROBLAZE_STRING_H + +#ifndef __KERNEL__ + +#define __HAVE_ARCH_MEMSET +#define __HAVE_ARCH_MEMCPY +#define __HAVE_ARCH_MEMMOVE + +extern void *memset(void *, int, __kernel_size_t); +extern void *memcpy(void *, const void *, __kernel_size_t); +extern void *memmove(void *, const void *, __kernel_size_t); + +#endif /* __KERNEL__ */ + +#endif /* _ASM_MICROBLAZE_STRING_H */ diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h new file mode 100644 index 0000000..4c3943e --- /dev/null +++ b/arch/microblaze/include/asm/thread_info.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_THREAD_INFO_H +#define _ASM_MICROBLAZE_THREAD_INFO_H + +#ifdef __KERNEL__ + +/* we have 8k stack */ +#define THREAD_SHIFT 13 +#define THREAD_SIZE (1 << THREAD_SHIFT) +#define THREAD_SIZE_ORDER 1 + +#ifndef __ASSEMBLY__ +# include +# include +# include + +/* + * low level task data that entry.S needs immediate access to + * - this struct should fit entirely inside of one cache line + * - this struct shares the supervisor stack pages + * - if the contents of this structure are changed, the assembly constants + * must also be changed + */ + +struct cpu_context { + __u32 r1; /* stack pointer */ + __u32 r2; + /* dedicated registers */ + __u32 r13; + __u32 r14; + __u32 r15; + __u32 r16; + __u32 r17; + __u32 r18; + /* non-volatile registers */ + __u32 r19; + __u32 r20; + __u32 r21; + __u32 r22; + __u32 r23; + __u32 r24; + __u32 r25; + __u32 r26; + __u32 r27; + __u32 r28; + __u32 r29; + __u32 r30; + /* r31 is used as current task pointer */ + /* special purpose registers */ + __u32 msr; + __u32 ear; + __u32 esr; + __u32 fsr; +}; + +struct thread_info { + struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + unsigned long flags; /* low level flags */ + unsigned long status; /* thread-synchronous flags */ + __u32 cpu; /* current CPU */ + __s32 preempt_count; /* 0 => preemptable,< 0 => BUG*/ + mm_segment_t addr_limit; /* thread address space */ + struct restart_block restart_block; + + struct cpu_context cpu_context; +}; + +/* + * macros/functions for gaining access to the thread information structure + * + * preempt_count needs to be 1 initially, until the scheduler is functional. + */ +#define INIT_THREAD_INFO(tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +/* how to get the thread information struct from C */ +static inline struct thread_info *current_thread_info(void) +{ + register unsigned long sp asm("r1"); + + return (struct thread_info *)(sp & ~(THREAD_SIZE-1)); +} + +/* thread information allocation */ +#endif /* __ASSEMBLY__ */ + +#define PREEMPT_ACTIVE 0x10000000 + +/* + * thread information flags + * - these are process state flags that various assembly files may + * need to access + * - pending work-to-be-done flags are in LSW + * - other flags in MSW + */ +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ +#define TIF_SIGPENDING 2 /* signal pending */ +#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ +/* restore singlestep on return to user mode */ +#define TIF_SINGLESTEP 4 +#define TIF_IRET 5 /* return with iret */ +#define TIF_MEMDIE 6 +#define TIF_FREEZE 14 /* Freezing for suspend */ + +/* FIXME change in entry.S */ +#define TIF_KERNEL_TRACE 8 /* kernel trace active */ + +/* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_POLLING_NRFLAG 16 + +#define _TIF_SYSCALL_TRACE (1< Date: Fri, 27 Mar 2009 14:25:47 +0100 Subject: microblaze_v8: Kbuild file Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild new file mode 100644 index 0000000..31820df --- /dev/null +++ b/arch/microblaze/include/asm/Kbuild @@ -0,0 +1,26 @@ +include include/asm-generic/Kbuild.asm + +header-y += auxvec.h +header-y += errno.h +header-y += fcntl.h +header-y += ioctl.h +header-y += ioctls.h +header-y += ipcbuf.h +header-y += linkage.h +header-y += msgbuf.h +header-y += poll.h +header-y += resource.h +header-y += sembuf.h +header-y += shmbuf.h +header-y += sigcontext.h +header-y += siginfo.h +header-y += socket.h +header-y += sockios.h +header-y += statfs.h +header-y += stat.h +header-y += termbits.h +header-y += ucontext.h + +unifdef-y += cputable.h +unifdef-y += elf.h +unifdef-y += termios.h -- cgit v0.10.2 From 36174f4e8742faed7da08e6110f134cf87dc03df Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:48 +0100 Subject: microblaze_v8: pci headers Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/pci-bridge.h b/arch/microblaze/include/asm/pci-bridge.h new file mode 100644 index 0000000..7ad28f6 --- /dev/null +++ b/arch/microblaze/include/asm/pci-bridge.h @@ -0,0 +1 @@ +#include diff --git a/arch/microblaze/include/asm/pci.h b/arch/microblaze/include/asm/pci.h new file mode 100644 index 0000000..ca03794 --- /dev/null +++ b/arch/microblaze/include/asm/pci.h @@ -0,0 +1 @@ +#include -- cgit v0.10.2 From 3be100114a352bb4b0eee5b6a847cf4f34ce28b1 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:49 +0100 Subject: microblaze_v8: syscalls.h Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/syscalls.h b/arch/microblaze/include/asm/syscalls.h new file mode 100644 index 0000000..9cb4ff0 --- /dev/null +++ b/arch/microblaze/include/asm/syscalls.h @@ -0,0 +1,45 @@ +#ifndef __ASM_MICROBLAZE_SYSCALLS_H +#define __ASM_MICROBLAZE_SYSCALLS_H +#ifdef __KERNEL__ + +#include +#include +#include +#include + +/* FIXME will be removed */ +asmlinkage int sys_ipc(uint call, int first, int second, + int third, void *ptr, long fifth); + +struct pt_regs; +asmlinkage int sys_vfork(struct pt_regs *regs); +asmlinkage int sys_clone(int flags, unsigned long stack, struct pt_regs *regs); +asmlinkage int sys_execve(char __user *filenamei, char __user *__user *argv, + char __user *__user *envp, struct pt_regs *regs); + +asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, + unsigned long prot, unsigned long flags, + unsigned long fd, unsigned long pgoff); + +asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, + unsigned long prot, unsigned long flags, + unsigned long fd, off_t offset); + +/* from signal.c */ +asmlinkage int sys_sigsuspend(old_sigset_t mask, struct pt_regs *regs); + +asmlinkage int sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, + struct pt_regs *regs); + +asmlinkage int sys_sigaction(int sig, const struct old_sigaction *act, + struct old_sigaction *oact); + +asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, + struct pt_regs *regs); + +asmlinkage int sys_sigreturn(struct pt_regs *regs); + +asmlinkage int sys_rt_sigreturn(struct pt_regs *regs); + +#endif /* __KERNEL__ */ +#endif /* __ASM_MICROBLAZE_SYSCALLS_H */ -- cgit v0.10.2 From eedbdab99fffb8ed71cac75a722088b8ace2583c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:49 +0100 Subject: microblaze_v8: Interrupt handling and timer support Reviewed-by: Thomas Gleixner Reviewed-by: Ingo Molnar Reviewed-by: Stephen Neuendorffer Acked-by: John Linn Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h new file mode 100644 index 0000000..db515de --- /dev/null +++ b/arch/microblaze/include/asm/irq.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_IRQ_H +#define _ASM_MICROBLAZE_IRQ_H + +#define NR_IRQS 32 + +#include + +extern unsigned int nr_irq; + +#define NO_IRQ (-1) + +static inline int irq_canonicalize(int irq) +{ + return irq; +} + +struct pt_regs; +extern void do_IRQ(struct pt_regs *regs); + +/* irq_of_parse_and_map - Parse and Map an interrupt into linux virq space + * @device: Device node of the device whose interrupt is to be mapped + * @index: Index of the interrupt to map + * + * This function is a wrapper that chains of_irq_map_one() and + * irq_create_of_mapping() to make things easier to callers + */ +struct device_node; +extern unsigned int irq_of_parse_and_map(struct device_node *dev, int index); + +/** FIXME - not implement + * irq_dispose_mapping - Unmap an interrupt + * @virq: linux virq number of the interrupt to unmap + */ +static inline void irq_dispose_mapping(unsigned int virq) +{ + return; +} + +#endif /* _ASM_MICROBLAZE_IRQ_H */ diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c new file mode 100644 index 0000000..a69d3e3 --- /dev/null +++ b/arch/microblaze/kernel/intc.c @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include + +#include +#include + +#ifdef CONFIG_SELFMOD_INTC +#include +#define INTC_BASE BARRIER_BASE_ADDR +#else +static unsigned int intc_baseaddr; +#define INTC_BASE intc_baseaddr +#endif + +unsigned int nr_irq; + +/* No one else should require these constants, so define them locally here. */ +#define ISR 0x00 /* Interrupt Status Register */ +#define IPR 0x04 /* Interrupt Pending Register */ +#define IER 0x08 /* Interrupt Enable Register */ +#define IAR 0x0c /* Interrupt Acknowledge Register */ +#define SIE 0x10 /* Set Interrupt Enable bits */ +#define CIE 0x14 /* Clear Interrupt Enable bits */ +#define IVR 0x18 /* Interrupt Vector Register */ +#define MER 0x1c /* Master Enable Register */ + +#define MER_ME (1<<0) +#define MER_HIE (1<<1) + +static void intc_enable_or_unmask(unsigned int irq) +{ + pr_debug("enable_or_unmask: %d\n", irq); + out_be32(INTC_BASE + SIE, 1 << irq); +} + +static void intc_disable_or_mask(unsigned int irq) +{ + pr_debug("disable: %d\n", irq); + out_be32(INTC_BASE + CIE, 1 << irq); +} + +static void intc_ack(unsigned int irq) +{ + pr_debug("ack: %d\n", irq); + out_be32(INTC_BASE + IAR, 1 << irq); +} + +static void intc_mask_ack(unsigned int irq) +{ + unsigned long mask = 1 << irq; + pr_debug("disable_and_ack: %d\n", irq); + out_be32(INTC_BASE + CIE, mask); + out_be32(INTC_BASE + IAR, mask); +} + +static void intc_end(unsigned int irq) +{ + unsigned long mask = 1 << irq; + pr_debug("end: %d\n", irq); + if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { + out_be32(INTC_BASE + SIE, mask); + /* ack level sensitive intr */ + if (irq_desc[irq].status & IRQ_LEVEL) + out_be32(INTC_BASE + IAR, mask); + } +} + +static struct irq_chip intc_dev = { + .name = "Xilinx INTC", + .unmask = intc_enable_or_unmask, + .mask = intc_disable_or_mask, + .ack = intc_ack, + .mask_ack = intc_mask_ack, + .end = intc_end, +}; + +unsigned int get_irq(struct pt_regs *regs) +{ + int irq; + + /* + * NOTE: This function is the one that needs to be improved in + * order to handle multiple interrupt controllers. It currently + * is hardcoded to check for interrupts only on the first INTC. + */ + irq = in_be32(INTC_BASE + IVR); + pr_debug("get_irq: %d\n", irq); + + return irq; +} + +void __init init_IRQ(void) +{ + u32 i, j, intr_type; + struct device_node *intc = NULL; +#ifdef CONFIG_SELFMOD_INTC + unsigned int intc_baseaddr = 0; + static int arr_func[] = { + (int)&get_irq, + (int)&intc_enable_or_unmask, + (int)&intc_disable_or_mask, + (int)&intc_mask_ack, + (int)&intc_ack, + (int)&intc_end, + 0 + }; +#endif + static char *intc_list[] = { + "xlnx,xps-intc-1.00.a", + "xlnx,opb-intc-1.00.c", + "xlnx,opb-intc-1.00.b", + "xlnx,opb-intc-1.00.a", + NULL + }; + + for (j = 0; intc_list[j] != NULL; j++) { + intc = of_find_compatible_node(NULL, NULL, intc_list[j]); + if (intc) + break; + } + + intc_baseaddr = *(int *) of_get_property(intc, "reg", NULL); + intc_baseaddr = (unsigned long) ioremap(intc_baseaddr, PAGE_SIZE); + nr_irq = *(int *) of_get_property(intc, "xlnx,num-intr-inputs", NULL); + + intr_type = + *(int *) of_get_property(intc, "xlnx,kind-of-intr", NULL); + if (intr_type >= (1 << nr_irq)) + printk(KERN_INFO " ERROR: Mishmash in king-of-intr param\n"); + +#ifdef CONFIG_SELFMOD_INTC + selfmod_function((int *) arr_func, intc_baseaddr); +#endif + printk(KERN_INFO "%s #0 at 0x%08x, num_irq=%d, edge=0x%x\n", + intc_list[j], intc_baseaddr, nr_irq, intr_type); + + /* + * Disable all external interrupts until they are + * explicity requested. + */ + out_be32(intc_baseaddr + IER, 0); + + /* Acknowledge any pending interrupts just in case. */ + out_be32(intc_baseaddr + IAR, 0xffffffff); + + /* Turn on the Master Enable. */ + out_be32(intc_baseaddr + MER, MER_HIE | MER_ME); + + for (i = 0; i < nr_irq; ++i) { + if (intr_type & (0x00000001 << i)) { + set_irq_chip_and_handler_name(i, &intc_dev, + handle_edge_irq, intc_dev.name); + irq_desc[i].status &= ~IRQ_LEVEL; + } else { + set_irq_chip_and_handler_name(i, &intc_dev, + handle_level_irq, intc_dev.name); + irq_desc[i].status |= IRQ_LEVEL; + } + } +} diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c new file mode 100644 index 0000000..f688ee9 --- /dev/null +++ b/arch/microblaze/kernel/irq.c @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +unsigned int irq_of_parse_and_map(struct device_node *dev, int index) +{ + struct of_irq oirq; + + if (of_irq_map_one(dev, index, &oirq)) + return NO_IRQ; + + return oirq.specifier[0]; +} +EXPORT_SYMBOL_GPL(irq_of_parse_and_map); + +/* + * 'what should we do if we get a hw irq event on an illegal vector'. + * each architecture has to answer this themselves. + */ +void ack_bad_irq(unsigned int irq) +{ + printk(KERN_WARNING "unexpected IRQ trap at vector %02x\n", irq); +} + +static u32 concurrent_irq; + +void do_IRQ(struct pt_regs *regs) +{ + unsigned int irq; + struct pt_regs *old_regs = set_irq_regs(regs); + + irq_enter(); + irq = get_irq(regs); +next_irq: + BUG_ON(irq == -1U); + generic_handle_irq(irq); + + irq = get_irq(regs); + if (irq != -1U) { + pr_debug("next irq: %d\n", irq); + ++concurrent_irq; + goto next_irq; + } + + irq_exit(); + set_irq_regs(old_regs); +} + +int show_interrupts(struct seq_file *p, void *v) +{ + int i = *(loff_t *) v, j; + struct irqaction *action; + unsigned long flags; + + if (i == 0) { + seq_printf(p, " "); + for_each_online_cpu(j) + seq_printf(p, "CPU%-8d", j); + seq_putc(p, '\n'); + } + + if (i < nr_irq) { + spin_lock_irqsave(&irq_desc[i].lock, flags); + action = irq_desc[i].action; + if (!action) + goto skip; + seq_printf(p, "%3d: ", i); +#ifndef CONFIG_SMP + seq_printf(p, "%10u ", kstat_irqs(i)); +#else + for_each_online_cpu(j) + seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); +#endif + seq_printf(p, " %8s", irq_desc[i].status & + IRQ_LEVEL ? "level" : "edge"); + seq_printf(p, " %8s", irq_desc[i].chip->name); + seq_printf(p, " %s", action->name); + + for (action = action->next; action; action = action->next) + seq_printf(p, ", %s", action->name); + + seq_putc(p, '\n'); +skip: + spin_unlock_irqrestore(&irq_desc[i].lock, flags); + } + return 0; +} diff --git a/arch/microblaze/kernel/timer.c b/arch/microblaze/kernel/timer.c new file mode 100644 index 0000000..05a497e --- /dev/null +++ b/arch/microblaze/kernel/timer.c @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2007-2009 Michal Simek + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SELFMOD_TIMER +#include +#define TIMER_BASE BARRIER_BASE_ADDR +#else +static unsigned int timer_baseaddr; +#define TIMER_BASE timer_baseaddr +#endif + +#define TCSR0 (0x00) +#define TLR0 (0x04) +#define TCR0 (0x08) +#define TCSR1 (0x10) +#define TLR1 (0x14) +#define TCR1 (0x18) + +#define TCSR_MDT (1<<0) +#define TCSR_UDT (1<<1) +#define TCSR_GENT (1<<2) +#define TCSR_CAPT (1<<3) +#define TCSR_ARHT (1<<4) +#define TCSR_LOAD (1<<5) +#define TCSR_ENIT (1<<6) +#define TCSR_ENT (1<<7) +#define TCSR_TINT (1<<8) +#define TCSR_PWMA (1<<9) +#define TCSR_ENALL (1<<10) + +static inline void microblaze_timer0_stop(void) +{ + out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0) & ~TCSR_ENT); +} + +static inline void microblaze_timer0_start_periodic(unsigned long load_val) +{ + if (!load_val) + load_val = 1; + out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ + + /* load the initial value */ + out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); + + /* see timer data sheet for detail + * !ENALL - don't enable 'em all + * !PWMA - disable pwm + * TINT - clear interrupt status + * ENT- enable timer itself + * EINT - enable interrupt + * !LOAD - clear the bit to let go + * ARHT - auto reload + * !CAPT - no external trigger + * !GENT - no external signal + * UDT - set the timer as down counter + * !MDT0 - generate mode + */ + out_be32(TIMER_BASE + TCSR0, + TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); +} + +static inline void microblaze_timer0_start_oneshot(unsigned long load_val) +{ + if (!load_val) + load_val = 1; + out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ + + /* load the initial value */ + out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); + + out_be32(TIMER_BASE + TCSR0, + TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); +} + +static int microblaze_timer_set_next_event(unsigned long delta, + struct clock_event_device *dev) +{ + pr_debug("%s: next event, delta %x\n", __func__, (u32)delta); + microblaze_timer0_start_oneshot(delta); + return 0; +} + +static void microblaze_timer_set_mode(enum clock_event_mode mode, + struct clock_event_device *evt) +{ + switch (mode) { + case CLOCK_EVT_MODE_PERIODIC: + printk(KERN_INFO "%s: periodic\n", __func__); + microblaze_timer0_start_periodic(cpuinfo.freq_div_hz); + break; + case CLOCK_EVT_MODE_ONESHOT: + printk(KERN_INFO "%s: oneshot\n", __func__); + break; + case CLOCK_EVT_MODE_UNUSED: + printk(KERN_INFO "%s: unused\n", __func__); + break; + case CLOCK_EVT_MODE_SHUTDOWN: + printk(KERN_INFO "%s: shutdown\n", __func__); + microblaze_timer0_stop(); + break; + case CLOCK_EVT_MODE_RESUME: + printk(KERN_INFO "%s: resume\n", __func__); + break; + } +} + +static struct clock_event_device clockevent_microblaze_timer = { + .name = "microblaze_clockevent", + .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, + .shift = 24, + .rating = 300, + .set_next_event = microblaze_timer_set_next_event, + .set_mode = microblaze_timer_set_mode, +}; + +static inline void timer_ack(void) +{ + out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0)); +} + +static irqreturn_t timer_interrupt(int irq, void *dev_id) +{ + struct clock_event_device *evt = &clockevent_microblaze_timer; +#ifdef CONFIG_HEART_BEAT + heartbeat(); +#endif + timer_ack(); + evt->event_handler(evt); + return IRQ_HANDLED; +} + +static struct irqaction timer_irqaction = { + .handler = timer_interrupt, + .flags = IRQF_DISABLED | IRQF_TIMER, + .name = "timer", + .dev_id = &clockevent_microblaze_timer, +}; + +static __init void microblaze_clockevent_init(void) +{ + clockevent_microblaze_timer.mult = + div_sc(cpuinfo.cpu_clock_freq, NSEC_PER_SEC, + clockevent_microblaze_timer.shift); + clockevent_microblaze_timer.max_delta_ns = + clockevent_delta2ns((u32)~0, &clockevent_microblaze_timer); + clockevent_microblaze_timer.min_delta_ns = + clockevent_delta2ns(1, &clockevent_microblaze_timer); + clockevent_microblaze_timer.cpumask = cpumask_of(0); + clockevents_register_device(&clockevent_microblaze_timer); +} + +static cycle_t microblaze_read(void) +{ + /* reading actual value of timer 1 */ + return (cycle_t) (in_be32(TIMER_BASE + TCR1)); +} + +static struct clocksource clocksource_microblaze = { + .name = "microblaze_clocksource", + .rating = 300, + .read = microblaze_read, + .mask = CLOCKSOURCE_MASK(32), + .shift = 24, /* I can shift it */ + .flags = CLOCK_SOURCE_IS_CONTINUOUS, +}; + +static int __init microblaze_clocksource_init(void) +{ + clocksource_microblaze.mult = + clocksource_hz2mult(cpuinfo.cpu_clock_freq, + clocksource_microblaze.shift); + if (clocksource_register(&clocksource_microblaze)) + panic("failed to register clocksource"); + + /* stop timer1 */ + out_be32(TIMER_BASE + TCSR1, in_be32(TIMER_BASE + TCSR1) & ~TCSR_ENT); + /* start timer1 - up counting without interrupt */ + out_be32(TIMER_BASE + TCSR1, TCSR_TINT|TCSR_ENT|TCSR_ARHT); + return 0; +} + +void __init time_init(void) +{ + u32 irq, i = 0; + u32 timer_num = 1; + struct device_node *timer = NULL; +#ifdef CONFIG_SELFMOD_TIMER + unsigned int timer_baseaddr = 0; + int arr_func[] = { + (int)µblaze_read, + (int)&timer_interrupt, + (int)µblaze_clocksource_init, + (int)µblaze_timer_set_mode, + (int)µblaze_timer_set_next_event, + 0 + }; +#endif + char *timer_list[] = { + "xlnx,xps-timer-1.00.a", + "xlnx,opb-timer-1.00.b", + "xlnx,opb-timer-1.00.a", + NULL + }; + + for (i = 0; timer_list[i] != NULL; i++) { + timer = of_find_compatible_node(NULL, NULL, timer_list[i]); + if (timer) + break; + } + + timer_baseaddr = *(int *) of_get_property(timer, "reg", NULL); + timer_baseaddr = (unsigned long) ioremap(timer_baseaddr, PAGE_SIZE); + irq = *(int *) of_get_property(timer, "interrupts", NULL); + timer_num = + *(int *) of_get_property(timer, "xlnx,one-timer-only", NULL); + if (timer_num) { + printk(KERN_EMERG "Please enable two timers in HW\n"); + BUG(); + } + +#ifdef CONFIG_SELFMOD_TIMER + selfmod_function((int *) arr_func, timer_baseaddr); +#endif + printk(KERN_INFO "%s #0 at 0x%08x, irq=%d\n", + timer_list[i], timer_baseaddr, irq); + + cpuinfo.freq_div_hz = cpuinfo.cpu_clock_freq / HZ; + + setup_irq(irq, &timer_irqaction); +#ifdef CONFIG_HEART_BEAT + setup_heartbeat(); +#endif + microblaze_clocksource_init(); + microblaze_clockevent_init(); +} -- cgit v0.10.2 From 575ca2883ed7652aba09d7b77332004e45d56f69 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:50 +0100 Subject: microblaze_v8: Kconfig patches Reviewed-by: Ingo Molnar Acked-by: Randy Dunlap Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig new file mode 100644 index 0000000..8cc312b --- /dev/null +++ b/arch/microblaze/Kconfig @@ -0,0 +1,141 @@ +# For a description of the syntax of this configuration file, +# see Documentation/kbuild/kconfig-language.txt. + +mainmenu "Linux/Microblaze Kernel Configuration" + +config MICROBLAZE + def_bool y + select HAVE_LMB + +config SWAP + def_bool n + +config RWSEM_GENERIC_SPINLOCK + def_bool y + +config RWSEM_XCHGADD_ALGORITHM + bool + +config ARCH_HAS_ILOG2_U32 + def_bool n + +config ARCH_HAS_ILOG2_U64 + def_bool n + +config GENERIC_FIND_NEXT_BIT + def_bool y + +config GENERIC_HWEIGHT + def_bool y + +config GENERIC_HARDIRQS + def_bool y + +config GENERIC_IRQ_PROBE + def_bool y + +config GENERIC_CALIBRATE_DELAY + def_bool y + +config GENERIC_TIME + def_bool y + +config GENERIC_TIME_VSYSCALL + def_bool n + +config GENERIC_CLOCKEVENTS + def_bool y + +config GENERIC_HARDIRQS_NO__DO_IRQ + def_bool y + +config PCI + depends on !MMU + def_bool n + +config NO_DMA + depends on !MMU + def_bool n + +source "init/Kconfig" + +source "kernel/Kconfig.freezer" + +source "arch/microblaze/platform/Kconfig.platform" + +menu "Processor type and features" + +source kernel/time/Kconfig + +source "kernel/Kconfig.preempt" + +source "kernel/Kconfig.hz" + +config MMU + def_bool n + +config NO_MMU + bool + depends on !MMU + default y + +comment "Boot options" + +config CMDLINE_BOOL + bool "Default bootloader kernel arguments" + +config CMDLINE + string "Default kernel command string" + depends on CMDLINE_BOOL + default "console=ttyUL0,115200" + help + On some architectures there is currently no way for the boot loader + to pass arguments to the kernel. For these architectures, you should + supply some command-line options at build time by entering them + here. + +config CMDLINE_FORCE + bool "Force default kernel command string" + depends on CMDLINE_BOOL + default n + help + Set this to have arguments from the default kernel command string + override those passed by the boot loader. + +config OF + def_bool y + +config OF_DEVICE + def_bool y + +config PROC_DEVICETREE + bool "Support for device tree in /proc" + depends on PROC_FS + help + This option adds a device-tree directory under /proc which contains + an image of the device tree that the kernel copies from Open + Firmware or other boot firmware. If unsure, say Y here. + +endmenu + +source "mm/Kconfig" + +menu "Exectuable file formats" + +source "fs/Kconfig.binfmt" + +endmenu + +source "net/Kconfig" + +source "drivers/Kconfig" + +source "fs/Kconfig" + +source "arch/microblaze/Kconfig.debug" + +source "security/Kconfig" + +source "crypto/Kconfig" + +source "lib/Kconfig" diff --git a/arch/microblaze/Kconfig.debug b/arch/microblaze/Kconfig.debug new file mode 100644 index 0000000..242cd35 --- /dev/null +++ b/arch/microblaze/Kconfig.debug @@ -0,0 +1,26 @@ +# For a description of the syntax of this configuration file, +# see Documentation/kbuild/kconfig-language.txt. + +menu "Kernel hacking" + +source "lib/Kconfig.debug" + +config EARLY_PRINTK + bool "Early printk function for kernel" + default n + help + This option turns on/off early printk messages to console. + First Uartlite node is taken. + +config HEART_BEAT + bool "Heart beat function for kernel" + default n + help + This option turns on/off heart beat kernel functionality. + First GPIO node is taken. + +config DEBUG_BOOTMEM + depends on DEBUG_KERNEL + bool "Debug BOOTMEM initialization" + +endmenu diff --git a/arch/microblaze/platform/Kconfig.platform b/arch/microblaze/platform/Kconfig.platform new file mode 100644 index 0000000..8e9b475 --- /dev/null +++ b/arch/microblaze/platform/Kconfig.platform @@ -0,0 +1,85 @@ +# For a description of the syntax of this configuration file, +# see Documentation/kbuild/kconfig-language.txt. +# +# Platform selection Kconfig menu for MicroBlaze targets +# + +menu "Platform options" +choice + prompt "Platform" + default PLATFORM_MICROBLAZE_AUTO + help + Choose which hardware board/platform you are targeting. + +config PLATFORM_GENERIC + bool "Generic" + help + Choose this option for the Generic platform. + +endchoice + +config SELFMOD + bool "Use self modified code for intc/timer" + depends on EXPERIMENTAL && NO_MMU + default n + help + This choice enables self-modified code for interrupt controller + and timer. + +config SELFMOD_INTC + bool "Use self modified code for intc" + depends on SELFMOD + default y + help + This choice enables self-modified code for interrupt controller. + +config SELFMOD_TIMER + bool "Use self modified code for timer" + depends on SELFMOD + default y + help + This choice enables self-modified code for timer. + +config OPT_LIB_FUNCTION + bool "Optimalized lib function" + default y + help + Allows turn on optimalized library function (memcpy and memmove). + They are optimized by using word alignment. This will work + fine if both source and destination are aligned on the same + boundary. However, if they are aligned on different boundaries + shifts will be necessary. This might result in bad performance + on MicroBlaze systems without a barrel shifter. + +config OPT_LIB_ASM + bool "Optimalized lib function ASM" + depends on OPT_LIB_FUNCTION + default n + help + Allows turn on optimalized library function (memcpy and memmove). + Function are written in asm code. + +# This is still a bit broken - disabling for now JW 20070504 +config ALLOW_EDIT_AUTO + bool "Permit Display/edit of Kconfig.auto platform settings" + default n + help + Allows the editing of auto-generated platform settings from + the Kconfig.auto file. Obviously this does not change the + underlying hardware, so be very careful if you go editing + these settings. + + Also, if you enable this, and edit various Kconfig.auto + settings, YOUR CHANGES WILL BE LOST if you then disable it + again. You have been warned! + + If unsure, say no. + +comment "Automatic platform settings from Kconfig.auto" + depends on ALLOW_EDIT_AUTO + +if PLATFORM_GENERIC=y + source "arch/microblaze/platform/generic/Kconfig.auto" +endif + +endmenu diff --git a/arch/microblaze/platform/generic/Kconfig.auto b/arch/microblaze/platform/generic/Kconfig.auto new file mode 100644 index 0000000..fbca22d --- /dev/null +++ b/arch/microblaze/platform/generic/Kconfig.auto @@ -0,0 +1,62 @@ +# +# (C) Copyright 2007 Michal Simek +# +# Michal SIMEK +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +# Definitions for MICROBLAZE0 +comment "Definitions for MICROBLAZE0" + depends on ALLOW_EDIT_AUTO + +config KERNEL_BASE_ADDR + hex "Physical address where Linux Kernel is" + default "0x90000000" + help + BASE Address for kernel + +config XILINX_MICROBLAZE0_FAMILY + string "Targetted FPGA family" if ALLOW_EDIT_AUTO + default "virtex5" + +config XILINX_MICROBLAZE0_USE_MSR_INSTR + int "USE_MSR_INSTR range (0:1)" if ALLOW_EDIT_AUTO + default 1 + +config XILINX_MICROBLAZE0_USE_PCMP_INSTR + int "USE_PCMP_INSTR range (0:1)" if ALLOW_EDIT_AUTO + default 1 + +config XILINX_MICROBLAZE0_USE_BARREL + int "USE_BARREL range (0:1)" if ALLOW_EDIT_AUTO + default 1 + +config XILINX_MICROBLAZE0_USE_DIV + int "USE_DIV range (0:1)" if ALLOW_EDIT_AUTO + default 1 + +config XILINX_MICROBLAZE0_USE_HW_MUL + int "USE_HW_MUL values (0=NONE, 1=MUL32, 2=MUL64)" if ALLOW_EDIT_AUTO + default 2 + +config XILINX_MICROBLAZE0_USE_FPU + int "USE_FPU values (0=NONE, 1=BASIC, 2=EXTENDED)" if ALLOW_EDIT_AUTO + default 2 + +config XILINX_MICROBLAZE0_HW_VER + string "Core version number" if ALLOW_EDIT_AUTO + default 7.10.d -- cgit v0.10.2 From 5f8ffb5f6649a261372547a5841285c23409ab68 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:51 +0100 Subject: microblaze_v8: Makefiles for Microblaze cpu Reviewed-by: Ingo Molnar Acked-by: Randy Dunlap Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile new file mode 100644 index 0000000..0dcbb98 --- /dev/null +++ b/arch/microblaze/Makefile @@ -0,0 +1,69 @@ +UTS_SYSNAME = -DUTS_SYSNAME=\"uClinux\" + +# What CPU vesion are we building for, and crack it open +# as major.minor.rev +CPU_VER=$(subst ",,$(CONFIG_XILINX_MICROBLAZE0_HW_VER) ) +CPU_MAJOR=$(shell echo $(CPU_VER) | cut -d '.' -f 1) +CPU_MINOR=$(shell echo $(CPU_VER) | cut -d '.' -f 2) +CPU_REV=$(shell echo $(CPU_VER) | cut -d '.' -f 3) + +export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV + +# Use cpu-related CONFIG_ vars to set compile options. + +# Work out HW multipler support. This is icky. +# 1. Spartan2 has no HW multiplers. +# 2. MicroBlaze v3.x always uses them, except in Spartan 2 +# 3. All other FPGa/CPU ver combos, we can trust the CONFIG_ settings +ifeq (,$(findstring spartan2,$(CONFIG_XILINX_MICROBLAZE0_FAMILY))) + ifeq ($(CPU_MAJOR),3) + CPUFLAGS-1 += -mno-xl-soft-mul + else + # USE_HW_MUL can be 0, 1, or 2, defining a heirarchy of HW Mul support. + CPUFLAGS-$(subst 1,,$(CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL)) += -mxl-multiply-high + CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL) += -mno-xl-soft-mul + endif +endif +CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_DIV) += -mno-xl-soft-div +CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_BARREL) += -mxl-barrel-shift +CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP) += -mxl-pattern-compare + +CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER)) + +# The various CONFIG_XILINX cpu features options are integers 0/1/2... +# rather than bools y/n +CFLAGS += $(CPUFLAGS-1) +CFLAGS += $(CPUFLAGS-2) + +# r31 holds current when in kernel mode +CFLAGS += -ffixed-r31 + +LDFLAGS_BLOB := --format binary --oformat elf32-microblaze + +LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) + +head-y := arch/microblaze/kernel/head.o +libs-y += arch/microblaze/lib/ $(LIBGCC) +core-y += arch/microblaze/kernel/ arch/microblaze/mm/ \ + arch/microblaze/platform/ + +boot := arch/$(ARCH)/boot + +# defines filename extension depending memory management type +ifeq ($(CONFIG_MMU),) +MMUEXT := -nommu +endif +export MMUEXT + +all: linux.bin + +archclean: + $(Q)$(MAKE) $(clean)=$(boot) + +linux.bin linux.bin.gz: vmlinux + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ + +define archhelp + echo '* linux.bin - Create raw binary' + echo ' linux.bin.gz - Create compressed raw binary' +endef diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile new file mode 100644 index 0000000..844edf4 --- /dev/null +++ b/arch/microblaze/boot/Makefile @@ -0,0 +1,17 @@ +# +# arch/microblaze/boot/Makefile +# + +targets := linux.bin linux.bin.gz + +OBJCOPYFLAGS_linux.bin := -O binary + +$(obj)/linux.bin: vmlinux FORCE + $(call if_changed,objcopy) + @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' + +$(obj)/linux.bin.gz: $(obj)/linux.bin FORCE + $(call if_changed,gzip) + @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' + +clean-kernel += linux.bin linux.bin.gz diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile new file mode 100644 index 0000000..da94bec --- /dev/null +++ b/arch/microblaze/kernel/Makefile @@ -0,0 +1,19 @@ +# +# Makefile +# + +extra-y := head.o vmlinux.lds + +obj-y += exceptions.o \ + hw_exception_handler.o init_task.o intc.o irq.o of_device.o \ + of_platform.o process.o prom.o prom_parse.o ptrace.o \ + setup.o signal.o sys_microblaze.o timer.o traps.o + +obj-y += cpu/ + +obj-$(CONFIG_EARLY_PRINTK) += early_printk.o +obj-$(CONFIG_SELFMOD) += selfmod.o +obj-$(CONFIG_HEART_BEAT) += heartbeat.o +obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o + +obj-y += entry$(MMUEXT).o diff --git a/arch/microblaze/kernel/cpu/Makefile b/arch/microblaze/kernel/cpu/Makefile new file mode 100644 index 0000000..20646e5 --- /dev/null +++ b/arch/microblaze/kernel/cpu/Makefile @@ -0,0 +1,8 @@ +# +# Build the appropriate CPU version support +# + +EXTRA_CFLAGS += -DCPU_MAJOR=$(CPU_MAJOR) -DCPU_MINOR=$(CPU_MINOR) \ + -DCPU_REV=$(CPU_REV) + +obj-y += cache.o cpuinfo.o cpuinfo-pvr-full.o cpuinfo-static.o mb.o pvr.o diff --git a/arch/microblaze/lib/Makefile b/arch/microblaze/lib/Makefile new file mode 100644 index 0000000..d27126b --- /dev/null +++ b/arch/microblaze/lib/Makefile @@ -0,0 +1,13 @@ +# +# Makefile +# + +lib-y := memset.o checksum.o + +ifeq ($(CONFIG_OPT_LIB_ASM),y) +lib-y += fastcopy.o +else +lib-y += memcpy.o memmove.o +endif + +lib-y += uaccess.o diff --git a/arch/microblaze/mm/Makefile b/arch/microblaze/mm/Makefile new file mode 100644 index 0000000..bf9e447 --- /dev/null +++ b/arch/microblaze/mm/Makefile @@ -0,0 +1,5 @@ +# +# Makefile +# + +obj-y := init.o diff --git a/arch/microblaze/platform/Makefile b/arch/microblaze/platform/Makefile new file mode 100644 index 0000000..ea1b75c --- /dev/null +++ b/arch/microblaze/platform/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for arch/microblaze/platform directory +# +#obj-$(CONFIG_PLATFORM_GENERIC) += generic/ + +obj-y += platform.o diff --git a/arch/microblaze/platform/generic/Makefile b/arch/microblaze/platform/generic/Makefile new file mode 100644 index 0000000..9a8b1bd --- /dev/null +++ b/arch/microblaze/platform/generic/Makefile @@ -0,0 +1,3 @@ +# +# Empty Makefile to keep make clean happy +# -- cgit v0.10.2 From 4286c2b08c1a24fcb96503a3fb43e69cb1ae0410 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:51 +0100 Subject: microblaze_v8: Uartlite for Microblaze Reviewed-by: Ingo Molnar Acked-by: Peter Korsgaard Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 7d7f576..131901b 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -833,7 +833,7 @@ config SERIAL_IMX_CONSOLE config SERIAL_UARTLITE tristate "Xilinx uartlite serial port support" - depends on PPC32 + depends on PPC32 || MICROBLAZE select SERIAL_CORE help Say Y here if you want to use the Xilinx uartlite serial controller. @@ -1319,7 +1319,7 @@ config SERIAL_NETX_CONSOLE config SERIAL_OF_PLATFORM tristate "Serial port on Open Firmware platform bus" - depends on PPC_OF + depends on PPC_OF || MICROBLAZE depends on SERIAL_8250 || SERIAL_OF_PLATFORM_NWPSERIAL help If you have a PowerPC based system that has serial ports -- cgit v0.10.2 From c6375b0a8007fffe65109aeea032a9243df070e1 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 27 Mar 2009 14:25:52 +0100 Subject: microblaze_v8: Add MAINTAINERS fragment Reviewed-by: Ingo Molnar Acked-by: John Linn Acked-by: Stephen Neuendorffer Acked-by: John Williams Signed-off-by: Michal Simek diff --git a/MAINTAINERS b/MAINTAINERS index 5d460c9..7bfeed1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2943,6 +2943,14 @@ L: linux-mtd@lists.infradead.org T: git git://git.infradead.org/mtd-2.6.git S: Maintained +MICROBLAZE ARCHITECTURE +P: Michal Simek +M: monstr@monstr.eu +L: microblaze-uclinux@itee.uq.edu.au +W: http://www.monstr.eu/fdt/ +T: git git://git.monstr.eu/linux-2.6-microblaze.git +S: Supported + MICROTEK X6 SCANNER P: Oliver Neukum M: oliver@neukum.name -- cgit v0.10.2 From e1d60ec6699f19b760df8261e922ae236ea7bb31 Mon Sep 17 00:00:00 2001 From: Roland Dreier Date: Mon, 30 Mar 2009 08:31:05 -0700 Subject: IB/mlx4: Use pgprot_writecombine() for BlueFlame pages The PAT work on x86 has finally made pgprot_writecombine() a usable API for modular drivers. As the comment indicates, this is exactly what we want to use in mlx4_ib to map BlueFlame pages up to userspace, since using WC for these pages improves small message latency significantly. Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 2ccb9d3..ae3d759 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -394,8 +394,7 @@ static int mlx4_ib_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) PAGE_SIZE, vma->vm_page_prot)) return -EAGAIN; } else if (vma->vm_pgoff == 1 && dev->dev->caps.bf_reg_size != 0) { - /* FIXME want pgprot_writecombine() for BlueFlame pages */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); if (io_remap_pfn_range(vma, vma->vm_start, to_mucontext(context)->uar.pfn + -- cgit v0.10.2 From 04b5d028f50ff05a8f9ae049ee71f8fdfcf1f5de Mon Sep 17 00:00:00 2001 From: Steve Wise Date: Mon, 30 Mar 2009 08:37:56 -0700 Subject: RDMA/cxgb3: Handle EEH events - wrap calls into cxgb3 and fail them if we're in the middle of a PCI EEH event. - correctly unwind and release endpoint and other resources when we are in an EEH event. - dispatch IB_EVENT_DEVICE_FATAL event when cxgb3 notifies iw_cxgb3 of a fatal error. Signed-off-by: Steve Wise Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index a4a82bf..8d71086 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c @@ -152,7 +152,7 @@ static int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid) sge_cmd = qpid << 8 | 3; wqe->sge_cmd = cpu_to_be64(sge_cmd); skb->priority = CPL_PRIORITY_CONTROL; - return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb)); + return iwch_cxgb3_ofld_send(rdev_p->t3cdev_p, skb); } int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq) @@ -571,7 +571,7 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) (unsigned long long) rdev_p->ctrl_qp.dma_addr, rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2); skb->priority = CPL_PRIORITY_CONTROL; - return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb)); + return iwch_cxgb3_ofld_send(rdev_p->t3cdev_p, skb); err: kfree_skb(skb); return err; @@ -701,7 +701,7 @@ static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, u32 stag_idx; u32 wptr; - if (rdev_p->flags) + if (cxio_fatal_error(rdev_p)) return -EIO; stag_state = stag_state > 0; @@ -858,7 +858,7 @@ int cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) wqe->qp_dma_size = cpu_to_be32(attr->qp_dma_size); wqe->irs = cpu_to_be32(attr->irs); skb->priority = 0; /* 0=>ToeQ; 1=>CtrlQ */ - return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb)); + return iwch_cxgb3_ofld_send(rdev_p->t3cdev_p, skb); } void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb) @@ -1041,9 +1041,9 @@ void cxio_rdev_close(struct cxio_rdev *rdev_p) cxio_hal_pblpool_destroy(rdev_p); cxio_hal_rqtpool_destroy(rdev_p); list_del(&rdev_p->entry); - rdev_p->t3cdev_p->ulp = NULL; cxio_hal_destroy_ctrl_qp(rdev_p); cxio_hal_destroy_resource(rdev_p->rscp); + rdev_p->t3cdev_p->ulp = NULL; } } diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h index 094a66d..bfd03bf 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.h +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h @@ -115,6 +115,11 @@ struct cxio_rdev { #define CXIO_ERROR_FATAL 1 }; +static inline int cxio_fatal_error(struct cxio_rdev *rdev_p) +{ + return rdev_p->flags & CXIO_ERROR_FATAL; +} + static inline int cxio_num_stags(struct cxio_rdev *rdev_p) { return min((int)T3_MAX_NUM_STAG, (int)((rdev_p->rnic_info.tpt_top - rdev_p->rnic_info.tpt_base) >> 5)); @@ -188,6 +193,7 @@ void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count); void cxio_flush_hw_cq(struct t3_cq *cq); int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, u8 *cqe_flushed, u64 *cookie, u32 *credit); +int iwch_cxgb3_ofld_send(struct t3cdev *tdev, struct sk_buff *skb); #define MOD "iw_cxgb3: " #define PDBG(fmt, args...) pr_debug(MOD fmt, ## args) diff --git a/drivers/infiniband/hw/cxgb3/iwch.c b/drivers/infiniband/hw/cxgb3/iwch.c index 37a4fc2..26fc0a4 100644 --- a/drivers/infiniband/hw/cxgb3/iwch.c +++ b/drivers/infiniband/hw/cxgb3/iwch.c @@ -165,12 +165,19 @@ static void close_rnic_dev(struct t3cdev *tdev) static void iwch_err_handler(struct t3cdev *tdev, u32 status, u32 error) { struct cxio_rdev *rdev = tdev->ulp; + struct iwch_dev *rnicp = rdev_to_iwch_dev(rdev); + struct ib_event event; - if (status == OFFLOAD_STATUS_DOWN) + if (status == OFFLOAD_STATUS_DOWN) { rdev->flags = CXIO_ERROR_FATAL; - return; + event.device = &rnicp->ibdev; + event.event = IB_EVENT_DEVICE_FATAL; + event.element.port_num = 0; + ib_dispatch_event(&event); + } + return; } static int __init iwch_init_module(void) diff --git a/drivers/infiniband/hw/cxgb3/iwch.h b/drivers/infiniband/hw/cxgb3/iwch.h index 3773453..8473550 100644 --- a/drivers/infiniband/hw/cxgb3/iwch.h +++ b/drivers/infiniband/hw/cxgb3/iwch.h @@ -117,6 +117,11 @@ static inline struct iwch_dev *to_iwch_dev(struct ib_device *ibdev) return container_of(ibdev, struct iwch_dev, ibdev); } +static inline struct iwch_dev *rdev_to_iwch_dev(struct cxio_rdev *rdev) +{ + return container_of(rdev, struct iwch_dev, rdev); +} + static inline int t3b_device(const struct iwch_dev *rhp) { return rhp->rdev.t3cdev_p->type == T3B; diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index 8699947..59e1c5f0 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c @@ -139,6 +139,38 @@ static void stop_ep_timer(struct iwch_ep *ep) put_ep(&ep->com); } +int iwch_l2t_send(struct t3cdev *tdev, struct sk_buff *skb, struct l2t_entry *l2e) +{ + int error = 0; + struct cxio_rdev *rdev; + + rdev = (struct cxio_rdev *)tdev->ulp; + if (cxio_fatal_error(rdev)) { + kfree_skb(skb); + return -EIO; + } + error = l2t_send(tdev, skb, l2e); + if (error) + kfree_skb(skb); + return error; +} + +int iwch_cxgb3_ofld_send(struct t3cdev *tdev, struct sk_buff *skb) +{ + int error = 0; + struct cxio_rdev *rdev; + + rdev = (struct cxio_rdev *)tdev->ulp; + if (cxio_fatal_error(rdev)) { + kfree_skb(skb); + return -EIO; + } + error = cxgb3_ofld_send(tdev, skb); + if (error) + kfree_skb(skb); + return error; +} + static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb) { struct cpl_tid_release *req; @@ -150,7 +182,7 @@ static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb) req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, hwtid)); skb->priority = CPL_PRIORITY_SETUP; - cxgb3_ofld_send(tdev, skb); + iwch_cxgb3_ofld_send(tdev, skb); return; } @@ -172,8 +204,7 @@ int iwch_quiesce_tid(struct iwch_ep *ep) req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE); skb->priority = CPL_PRIORITY_DATA; - cxgb3_ofld_send(ep->com.tdev, skb); - return 0; + return iwch_cxgb3_ofld_send(ep->com.tdev, skb); } int iwch_resume_tid(struct iwch_ep *ep) @@ -194,8 +225,7 @@ int iwch_resume_tid(struct iwch_ep *ep) req->val = 0; skb->priority = CPL_PRIORITY_DATA; - cxgb3_ofld_send(ep->com.tdev, skb); - return 0; + return iwch_cxgb3_ofld_send(ep->com.tdev, skb); } static void set_emss(struct iwch_ep *ep, u16 opt) @@ -382,7 +412,7 @@ static void abort_arp_failure(struct t3cdev *dev, struct sk_buff *skb) PDBG("%s t3cdev %p\n", __func__, dev); req->cmd = CPL_ABORT_NO_RST; - cxgb3_ofld_send(dev, skb); + iwch_cxgb3_ofld_send(dev, skb); } static int send_halfclose(struct iwch_ep *ep, gfp_t gfp) @@ -402,8 +432,7 @@ static int send_halfclose(struct iwch_ep *ep, gfp_t gfp) req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_CLOSE_CON)); req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, ep->hwtid)); - l2t_send(ep->com.tdev, skb, ep->l2t); - return 0; + return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); } static int send_abort(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp) @@ -424,8 +453,7 @@ static int send_abort(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp) req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, ep->hwtid)); req->cmd = CPL_ABORT_SEND_RST; - l2t_send(ep->com.tdev, skb, ep->l2t); - return 0; + return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); } static int send_connect(struct iwch_ep *ep) @@ -469,8 +497,7 @@ static int send_connect(struct iwch_ep *ep) req->opt0l = htonl(opt0l); req->params = 0; req->opt2 = htonl(opt2); - l2t_send(ep->com.tdev, skb, ep->l2t); - return 0; + return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); } static void send_mpa_req(struct iwch_ep *ep, struct sk_buff *skb) @@ -527,7 +554,7 @@ static void send_mpa_req(struct iwch_ep *ep, struct sk_buff *skb) req->sndseq = htonl(ep->snd_seq); BUG_ON(ep->mpa_skb); ep->mpa_skb = skb; - l2t_send(ep->com.tdev, skb, ep->l2t); + iwch_l2t_send(ep->com.tdev, skb, ep->l2t); start_ep_timer(ep); state_set(&ep->com, MPA_REQ_SENT); return; @@ -578,8 +605,7 @@ static int send_mpa_reject(struct iwch_ep *ep, const void *pdata, u8 plen) req->sndseq = htonl(ep->snd_seq); BUG_ON(ep->mpa_skb); ep->mpa_skb = skb; - l2t_send(ep->com.tdev, skb, ep->l2t); - return 0; + return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); } static int send_mpa_reply(struct iwch_ep *ep, const void *pdata, u8 plen) @@ -630,8 +656,7 @@ static int send_mpa_reply(struct iwch_ep *ep, const void *pdata, u8 plen) req->sndseq = htonl(ep->snd_seq); ep->mpa_skb = skb; state_set(&ep->com, MPA_REP_SENT); - l2t_send(ep->com.tdev, skb, ep->l2t); - return 0; + return iwch_l2t_send(ep->com.tdev, skb, ep->l2t); } static int act_establish(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) @@ -795,7 +820,7 @@ static int update_rx_credits(struct iwch_ep *ep, u32 credits) OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid)); req->credit_dack = htonl(V_RX_CREDITS(credits) | V_RX_FORCE_ACK(1)); skb->priority = CPL_PRIORITY_ACK; - cxgb3_ofld_send(ep->com.tdev, skb); + iwch_cxgb3_ofld_send(ep->com.tdev, skb); return credits; } @@ -1203,8 +1228,7 @@ static int listen_start(struct iwch_listen_ep *ep) req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK)); skb->priority = 1; - cxgb3_ofld_send(ep->com.tdev, skb); - return 0; + return iwch_cxgb3_ofld_send(ep->com.tdev, skb); } static int pass_open_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) @@ -1237,8 +1261,7 @@ static int listen_stop(struct iwch_listen_ep *ep) req->cpu_idx = 0; OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid)); skb->priority = 1; - cxgb3_ofld_send(ep->com.tdev, skb); - return 0; + return iwch_cxgb3_ofld_send(ep->com.tdev, skb); } static int close_listsrv_rpl(struct t3cdev *tdev, struct sk_buff *skb, @@ -1286,7 +1309,7 @@ static void accept_cr(struct iwch_ep *ep, __be32 peer_ip, struct sk_buff *skb) rpl->opt2 = htonl(opt2); rpl->rsvd = rpl->opt2; /* workaround for HW bug */ skb->priority = CPL_PRIORITY_SETUP; - l2t_send(ep->com.tdev, skb, ep->l2t); + iwch_l2t_send(ep->com.tdev, skb, ep->l2t); return; } @@ -1315,7 +1338,7 @@ static void reject_cr(struct t3cdev *tdev, u32 hwtid, __be32 peer_ip, rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT); rpl->opt2 = 0; rpl->rsvd = rpl->opt2; - cxgb3_ofld_send(tdev, skb); + iwch_cxgb3_ofld_send(tdev, skb); } } @@ -1613,7 +1636,7 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid)); rpl->cmd = CPL_ABORT_NO_RST; - cxgb3_ofld_send(ep->com.tdev, rpl_skb); + iwch_cxgb3_ofld_send(ep->com.tdev, rpl_skb); out: if (release) release_ep_resources(ep); @@ -2017,8 +2040,11 @@ int iwch_destroy_listen(struct iw_cm_id *cm_id) ep->com.rpl_done = 0; ep->com.rpl_err = 0; err = listen_stop(ep); + if (err) + goto done; wait_event(ep->com.waitq, ep->com.rpl_done); cxgb3_free_stid(ep->com.tdev, ep->stid); +done: err = ep->com.rpl_err; cm_id->rem_ref(cm_id); put_ep(&ep->com); @@ -2030,12 +2056,22 @@ int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp) int ret=0; unsigned long flags; int close = 0; + int fatal = 0; + struct t3cdev *tdev; + struct cxio_rdev *rdev; spin_lock_irqsave(&ep->com.lock, flags); PDBG("%s ep %p state %s, abrupt %d\n", __func__, ep, states[ep->com.state], abrupt); + tdev = (struct t3cdev *)ep->com.tdev; + rdev = (struct cxio_rdev *)tdev->ulp; + if (cxio_fatal_error(rdev)) { + fatal = 1; + close_complete_upcall(ep); + ep->com.state = DEAD; + } switch (ep->com.state) { case MPA_REQ_WAIT: case MPA_REQ_SENT: @@ -2075,7 +2111,11 @@ int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp) ret = send_abort(ep, NULL, gfp); else ret = send_halfclose(ep, gfp); + if (ret) + fatal = 1; } + if (fatal) + release_ep_resources(ep); return ret; } diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c index c758fbd..2f546a6 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_qp.c +++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c @@ -751,7 +751,7 @@ int iwch_post_zb_read(struct iwch_qp *qhp) wqe->send.wrh.gen_tid_len = cpu_to_be32(V_FW_RIWR_TID(qhp->ep->hwtid)| V_FW_RIWR_LEN(flit_cnt)); skb->priority = CPL_PRIORITY_DATA; - return cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb); + return iwch_cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb); } /* @@ -783,7 +783,7 @@ int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg) V_FW_RIWR_FLAGS(T3_COMPLETION_FLAG | T3_NOTIFY_FLAG)); wqe->send.wrh.gen_tid_len = cpu_to_be32(V_FW_RIWR_TID(qhp->ep->hwtid)); skb->priority = CPL_PRIORITY_DATA; - return cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb); + return iwch_cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb); } /* -- cgit v0.10.2 From 874d8df5ed6e36fed07b524c266f6a96dd6d10d9 Mon Sep 17 00:00:00 2001 From: Steve Wise Date: Mon, 30 Mar 2009 08:37:59 -0700 Subject: RDMA/cxgb3: Release dependent resources only when endpoint memory is freed. The cxgb3 l2t entry, hwtid, and dst entry were being released before all the iwch_ep references were released. This can cause a crash in t3_l2t_send_slow() and other places where the l2t entry is used. The fix is to defer releasing these resources until all endpoint references are gone. Details: - move flags field to the iwch_ep_common struct. - add a flag indicating resources are to be released. - release resources at endpoint free time instead of close/abort time. Signed-off-by: Steve Wise Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index 59e1c5f0..fef3f1a 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c @@ -282,18 +282,22 @@ static void *alloc_ep(int size, gfp_t gfp) void __free_ep(struct kref *kref) { - struct iwch_ep_common *epc; - epc = container_of(kref, struct iwch_ep_common, kref); - PDBG("%s ep %p state %s\n", __func__, epc, states[state_read(epc)]); - kfree(epc); + struct iwch_ep *ep; + ep = container_of(container_of(kref, struct iwch_ep_common, kref), + struct iwch_ep, com); + PDBG("%s ep %p state %s\n", __func__, ep, states[state_read(&ep->com)]); + if (ep->com.flags & RELEASE_RESOURCES) { + cxgb3_remove_tid(ep->com.tdev, (void *)ep, ep->hwtid); + dst_release(ep->dst); + l2t_release(L2DATA(ep->com.tdev), ep->l2t); + } + kfree(ep); } static void release_ep_resources(struct iwch_ep *ep) { PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); - cxgb3_remove_tid(ep->com.tdev, (void *)ep, ep->hwtid); - dst_release(ep->dst); - l2t_release(L2DATA(ep->com.tdev), ep->l2t); + ep->com.flags |= RELEASE_RESOURCES; put_ep(&ep->com); } @@ -1152,8 +1156,8 @@ static int abort_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) * We get 2 abort replies from the HW. The first one must * be ignored except for scribbling that we need one more. */ - if (!(ep->flags & ABORT_REQ_IN_PROGRESS)) { - ep->flags |= ABORT_REQ_IN_PROGRESS; + if (!(ep->com.flags & ABORT_REQ_IN_PROGRESS)) { + ep->com.flags |= ABORT_REQ_IN_PROGRESS; return CPL_RET_BUF_DONE; } @@ -1557,8 +1561,8 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) * We get 2 peer aborts from the HW. The first one must * be ignored except for scribbling that we need one more. */ - if (!(ep->flags & PEER_ABORT_IN_PROGRESS)) { - ep->flags |= PEER_ABORT_IN_PROGRESS; + if (!(ep->com.flags & PEER_ABORT_IN_PROGRESS)) { + ep->com.flags |= PEER_ABORT_IN_PROGRESS; return CPL_RET_BUF_DONE; } diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.h b/drivers/infiniband/hw/cxgb3/iwch_cm.h index d7c7e09..43c0aea 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.h +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.h @@ -147,6 +147,7 @@ enum iwch_ep_state { enum iwch_ep_flags { PEER_ABORT_IN_PROGRESS = (1 << 0), ABORT_REQ_IN_PROGRESS = (1 << 1), + RELEASE_RESOURCES = (1 << 2), }; struct iwch_ep_common { @@ -161,6 +162,7 @@ struct iwch_ep_common { wait_queue_head_t waitq; int rpl_done; int rpl_err; + u32 flags; }; struct iwch_listen_ep { @@ -188,7 +190,6 @@ struct iwch_ep { u16 plen; u32 ird; u32 ord; - u32 flags; }; static inline struct iwch_ep *to_ep(struct iw_cm_id *cm_id) -- cgit v0.10.2 From a18b83b7ef3c98cd8b4bb885e4a649a8f30fb7b0 Mon Sep 17 00:00:00 2001 From: Bharata B Rao Date: Mon, 23 Mar 2009 10:02:53 +0530 Subject: cpuacct: make cpuacct hierarchy walk in cpuacct_charge() safe when rcupreempt is used -v2 Impact: fix cgroups race under rcu-preempt cpuacct_charge() obtains task's ca and does a hierarchy walk upwards. This can race with the task's movement between cgroups. This race can cause an access to freed ca pointer in cpuacct_charge() or access to invalid cgroups pointer of the task. This will not happen with rcu or tree rcu as cpuacct_charge() is called with preemption disabled. However if rcupreempt is used, the race is seen. Thanks to Li Zefan for explaining this. Fix this race by explicitly protecting ca and the hierarchy walk with rcu_read_lock(). Changes for v2: - Update patch descrition (as per Li Zefan's review comments). - Remove comments in cpuacct_charge() which explained why rcu_read_lock() was needed (as per Peter Zijlstra's review comments). Signed-off-by: Bharata B Rao Cc: Dhaval Giani Cc: Li Zefan Cc: Paul Menage Cc: KAMEZAWA Hiroyuki Acked-by: Peter Zijlstra Acked-by: Balbir Singh Tested-by: Balbir Singh Signed-off-by: Ingo Molnar diff --git a/kernel/sched.c b/kernel/sched.c index 186c6fd..cc397aa 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -9654,12 +9654,17 @@ static void cpuacct_charge(struct task_struct *tsk, u64 cputime) return; cpu = task_cpu(tsk); + + rcu_read_lock(); + ca = task_ca(tsk); for (; ca; ca = ca->parent) { u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu); *cpuusage += cputime; } + + rcu_read_unlock(); } struct cgroup_subsys cpuacct_subsys = { -- cgit v0.10.2 From 352b09edd7fa8145bfc9e5db0cc0fed971b69440 Mon Sep 17 00:00:00 2001 From: Roland Dreier Date: Tue, 31 Mar 2009 09:54:15 -0700 Subject: mlx4_core: Don't leak mailbox for SET_PORT on Ethernet ports Commit 793730bf ("mlx4_core: Don't perform SET_PORT command for Ethernet ports") introduced a leak of mailbox buffers when SET_PORT was called for Ethernet ports, since it added a return after the mailbox was allocated. Fix this by checking the port type and returning *before* allocating the mailbox. Signed-off-by: Roland Dreier diff --git a/drivers/net/mlx4/port.c b/drivers/net/mlx4/port.c index 7cce334..606aa58 100644 --- a/drivers/net/mlx4/port.c +++ b/drivers/net/mlx4/port.c @@ -299,13 +299,14 @@ int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) struct mlx4_cmd_mailbox *mailbox; int err; + if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) + return 0; + mailbox = mlx4_alloc_cmd_mailbox(dev); if (IS_ERR(mailbox)) return PTR_ERR(mailbox); memset(mailbox->buf, 0, 256); - if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) - return 0; ((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port]; err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_SET_PORT, -- cgit v0.10.2 From edb5abb1e2a84fd8802a3577d95eac84fe1405ab Mon Sep 17 00:00:00 2001 From: Roland Dreier Date: Tue, 31 Mar 2009 10:22:32 -0700 Subject: IPoIB: Avoid free_netdev() BUG when destroying a child interface We have to release the RTNL before calling free_netdev() so that the device state has a chance to become NETREG_UNREGISTERED. Otherwise when removing a child interface, we hit the BUG() that tests the device state in free_netdev(). Reported-by: Yossi Etigin Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c index 5a76a55..4c57f32 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c @@ -70,12 +70,14 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) */ if (ppriv->pkey == pkey) { result = -ENOTUNIQ; + priv = NULL; goto err; } list_for_each_entry(priv, &ppriv->child_intfs, list) { if (priv->pkey == pkey) { result = -ENOTUNIQ; + priv = NULL; goto err; } } @@ -96,7 +98,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) result = ipoib_set_dev_features(priv, ppriv->ca); if (result) - goto device_init_failed; + goto err; priv->pkey = pkey; @@ -109,7 +111,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) ipoib_warn(ppriv, "failed to initialize subinterface: " "device %s, port %d", ppriv->ca->name, ppriv->port); - goto device_init_failed; + goto err; } result = register_netdevice(priv->dev); @@ -146,19 +148,19 @@ sysfs_failed: register_failed: ipoib_dev_cleanup(priv->dev); -device_init_failed: - free_netdev(priv->dev); - err: mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); + if (priv) + free_netdev(priv->dev); + return result; } int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) { struct ipoib_dev_priv *ppriv, *priv, *tpriv; - int ret = -ENOENT; + struct net_device *dev = NULL; if (!capable(CAP_NET_ADMIN)) return -EPERM; @@ -172,14 +174,17 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) unregister_netdevice(priv->dev); ipoib_dev_cleanup(priv->dev); list_del(&priv->list); - free_netdev(priv->dev); - - ret = 0; + dev = priv->dev; break; } } mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); - return ret; + if (dev) { + free_netdev(dev); + return 0; + } + + return -ENODEV; } -- cgit v0.10.2 From 13b8bd0a5713bdf05659019badd7c0407984ece1 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 25 Mar 2009 15:01:22 +1030 Subject: sched_rt: don't allocate cpumask in fastpath Impact: cleanup As pointed out by Steven Rostedt. Since the arg in question is unused, we simply change cpupri_find() to accept NULL. Reported-by: Steven Rostedt Signed-off-by: Rusty Russell LKML-Reference: <200903251501.22664.rusty@rustcorp.com.au> Signed-off-by: Ingo Molnar diff --git a/kernel/sched_cpupri.c b/kernel/sched_cpupri.c index 1e00bfa..cdd3c89 100644 --- a/kernel/sched_cpupri.c +++ b/kernel/sched_cpupri.c @@ -55,7 +55,7 @@ static int convert_prio(int prio) * cpupri_find - find the best (lowest-pri) CPU in the system * @cp: The cpupri context * @p: The task - * @lowest_mask: A mask to fill in with selected CPUs + * @lowest_mask: A mask to fill in with selected CPUs (or NULL) * * Note: This function returns the recommended CPUs as calculated during the * current invokation. By the time the call returns, the CPUs may have in @@ -81,7 +81,8 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p, if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids) continue; - cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask); + if (lowest_mask) + cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask); return 1; } diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index bac1061..fbec5a5 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c @@ -805,20 +805,15 @@ static int select_task_rq_rt(struct task_struct *p, int sync) static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) { - cpumask_var_t mask; - if (rq->curr->rt.nr_cpus_allowed == 1) return; - if (!alloc_cpumask_var(&mask, GFP_ATOMIC)) - return; - if (p->rt.nr_cpus_allowed != 1 - && cpupri_find(&rq->rd->cpupri, p, mask)) - goto free; + && cpupri_find(&rq->rd->cpupri, p, NULL)) + return; - if (!cpupri_find(&rq->rd->cpupri, rq->curr, mask)) - goto free; + if (!cpupri_find(&rq->rd->cpupri, rq->curr, NULL)) + return; /* * There appears to be other cpus that can accept @@ -827,8 +822,6 @@ static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) */ requeue_task_rt(rq, p, 1); resched_task(rq->curr); -free: - free_cpumask_var(mask); } #endif /* CONFIG_SMP */ -- cgit v0.10.2 From c5f8d99585d7b5b7e857fabf8aefd0174903a98c Mon Sep 17 00:00:00 2001 From: Hidetoshi Seto Date: Tue, 31 Mar 2009 16:56:03 +0900 Subject: posixtimers, sched: Fix posix clock monotonicity Impact: Regression fix (against clock_gettime() backwarding bug) This patch re-introduces a couple of functions, task_sched_runtime and thread_group_sched_runtime, which was once removed at the time of 2.6.28-rc1. These functions protect the sampling of thread/process clock with rq lock. This rq lock is required not to update rq->clock during the sampling. i.e. The clock_gettime() may return ((accounted runtime before update) + (delta after update)) that is less than what it should be. v2 -> v3: - Rename static helper function __task_delta_exec() to do_task_delta_exec() since -tip tree already has a __task_delta_exec() of different version. v1 -> v2: - Revises comments of function and patch description. - Add note about accuracy of thread group's runtime. Signed-off-by: Hidetoshi Seto Acked-by: Peter Zijlstra Cc: stable@kernel.org [2.6.28.x][2.6.29.x] LKML-Reference: <49D1CC93.4080401@jp.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index fa07da9..4318c30 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -224,7 +224,7 @@ static int cpu_clock_sample(const clockid_t which_clock, struct task_struct *p, cpu->cpu = virt_ticks(p); break; case CPUCLOCK_SCHED: - cpu->sched = p->se.sum_exec_runtime + task_delta_exec(p); + cpu->sched = task_sched_runtime(p); break; } return 0; @@ -240,18 +240,19 @@ static int cpu_clock_sample_group(const clockid_t which_clock, { struct task_cputime cputime; - thread_group_cputime(p, &cputime); switch (CPUCLOCK_WHICH(which_clock)) { default: return -EINVAL; case CPUCLOCK_PROF: + thread_group_cputime(p, &cputime); cpu->cpu = cputime_add(cputime.utime, cputime.stime); break; case CPUCLOCK_VIRT: + thread_group_cputime(p, &cputime); cpu->cpu = cputime.utime; break; case CPUCLOCK_SCHED: - cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p); + cpu->sched = thread_group_sched_runtime(p); break; } return 0; diff --git a/kernel/sched.c b/kernel/sched.c index cc397aa..c8d7f17 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4139,9 +4139,25 @@ DEFINE_PER_CPU(struct kernel_stat, kstat); EXPORT_PER_CPU_SYMBOL(kstat); /* - * Return any ns on the sched_clock that have not yet been banked in + * Return any ns on the sched_clock that have not yet been accounted in * @p in case that task is currently running. + * + * Called with task_rq_lock() held on @rq. */ +static u64 do_task_delta_exec(struct task_struct *p, struct rq *rq) +{ + u64 ns = 0; + + if (task_current(rq, p)) { + update_rq_clock(rq); + ns = rq->clock - p->se.exec_start; + if ((s64)ns < 0) + ns = 0; + } + + return ns; +} + unsigned long long task_delta_exec(struct task_struct *p) { unsigned long flags; @@ -4149,16 +4165,49 @@ unsigned long long task_delta_exec(struct task_struct *p) u64 ns = 0; rq = task_rq_lock(p, &flags); + ns = do_task_delta_exec(p, rq); + task_rq_unlock(rq, &flags); - if (task_current(rq, p)) { - u64 delta_exec; + return ns; +} - update_rq_clock(rq); - delta_exec = rq->clock - p->se.exec_start; - if ((s64)delta_exec > 0) - ns = delta_exec; - } +/* + * Return accounted runtime for the task. + * In case the task is currently running, return the runtime plus current's + * pending runtime that have not been accounted yet. + */ +unsigned long long task_sched_runtime(struct task_struct *p) +{ + unsigned long flags; + struct rq *rq; + u64 ns = 0; + + rq = task_rq_lock(p, &flags); + ns = p->se.sum_exec_runtime + do_task_delta_exec(p, rq); + task_rq_unlock(rq, &flags); + + return ns; +} +/* + * Return sum_exec_runtime for the thread group. + * In case the task is currently running, return the sum plus current's + * pending runtime that have not been accounted yet. + * + * Note that the thread group might have other running tasks as well, + * so the return value not includes other pending runtime that other + * running tasks might have. + */ +unsigned long long thread_group_sched_runtime(struct task_struct *p) +{ + struct task_cputime totals; + unsigned long flags; + struct rq *rq; + u64 ns; + + rq = task_rq_lock(p, &flags); + thread_group_cputime(p, &totals); + ns = totals.sum_exec_runtime + do_task_delta_exec(p, rq); task_rq_unlock(rq, &flags); return ns; -- cgit v0.10.2 From ef12fefabf94b6a902ad3abd3eb124b00560c445 Mon Sep 17 00:00:00 2001 From: Bharata B Rao Date: Tue, 31 Mar 2009 10:02:22 +0530 Subject: cpuacct: add per-cgroup utime/stime statistics Add per-cgroup cpuacct controller statistics like the system and user time consumed by the group of tasks. Changelog: v7 - Changed the name of the statistic from utime to user and from stime to system so that in future we could easily add other statistics like irq, softirq, steal times etc easily. v6 - Fixed a bug in the error path of cpuacct_create() (pointed by Li Zefan). v5 - In cpuacct_stats_show(), use cputime64_to_clock_t() since we are operating on a 64bit variable here. v4 - Remove comments in cpuacct_update_stats() which explained why rcu_read_lock() was needed (as per Peter Zijlstra's review comments). - Don't say that percpu_counter_read() is broken in Documentation/cpuacct.txt as per KAMEZAWA Hiroyuki's review comments. v3 - Fix a small race in the cpuacct hierarchy walk. v2 - stime and utime now exported in clock_t units instead of msecs. - Addressed the code review comments from Balbir and Li Zefan. - Moved to -tip tree. v1 - Moved the stime/utime accounting to cpuacct controller. Earlier versions - http://lkml.org/lkml/2009/2/25/129 Signed-off-by: Bharata B Rao Signed-off-by: Balaji Rao Cc: Dhaval Giani Cc: Paul Menage Cc: Andrew Morton Cc: KAMEZAWA Hiroyuki Reviewed-by: Li Zefan Acked-by: Peter Zijlstra Acked-by: Balbir Singh Tested-by: Balbir Singh LKML-Reference: <20090331043222.GA4093@in.ibm.com> Signed-off-by: Ingo Molnar diff --git a/Documentation/cgroups/cpuacct.txt b/Documentation/cgroups/cpuacct.txt index bb775fb..8b93094 100644 --- a/Documentation/cgroups/cpuacct.txt +++ b/Documentation/cgroups/cpuacct.txt @@ -30,3 +30,21 @@ The above steps create a new group g1 and move the current shell process (bash) into it. CPU time consumed by this bash and its children can be obtained from g1/cpuacct.usage and the same is accumulated in /cgroups/cpuacct.usage also. + +cpuacct.stat file lists a few statistics which further divide the +CPU time obtained by the cgroup into user and system times. Currently +the following statistics are supported: + +user: Time spent by tasks of the cgroup in user mode. +system: Time spent by tasks of the cgroup in kernel mode. + +user and system are in USER_HZ unit. + +cpuacct controller uses percpu_counter interface to collect user and +system times. This has two side effects: + +- It is theoretically possible to see wrong values for user and system times. + This is because percpu_counter_read() on 32bit systems isn't safe + against concurrent writes. +- It is possible to see slightly outdated values for user and system times + due to the batch processing nature of percpu_counter. diff --git a/kernel/sched.c b/kernel/sched.c index c8d7f17..8d1bdbe 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1393,10 +1393,22 @@ iter_move_one_task(struct rq *this_rq, int this_cpu, struct rq *busiest, struct rq_iterator *iterator); #endif +/* Time spent by the tasks of the cpu accounting group executing in ... */ +enum cpuacct_stat_index { + CPUACCT_STAT_USER, /* ... user mode */ + CPUACCT_STAT_SYSTEM, /* ... kernel mode */ + + CPUACCT_STAT_NSTATS, +}; + #ifdef CONFIG_CGROUP_CPUACCT static void cpuacct_charge(struct task_struct *tsk, u64 cputime); +static void cpuacct_update_stats(struct task_struct *tsk, + enum cpuacct_stat_index idx, cputime_t val); #else static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {} +static inline void cpuacct_update_stats(struct task_struct *tsk, + enum cpuacct_stat_index idx, cputime_t val) {} #endif static inline void inc_cpu_load(struct rq *rq, unsigned long load) @@ -4236,6 +4248,8 @@ void account_user_time(struct task_struct *p, cputime_t cputime, cpustat->nice = cputime64_add(cpustat->nice, tmp); else cpustat->user = cputime64_add(cpustat->user, tmp); + + cpuacct_update_stats(p, CPUACCT_STAT_USER, cputime); /* Account for user time used */ acct_update_integrals(p); } @@ -4297,6 +4311,8 @@ void account_system_time(struct task_struct *p, int hardirq_offset, else cpustat->system = cputime64_add(cpustat->system, tmp); + cpuacct_update_stats(p, CPUACCT_STAT_SYSTEM, cputime); + /* Account for system time used */ acct_update_integrals(p); } @@ -9539,6 +9555,7 @@ struct cpuacct { struct cgroup_subsys_state css; /* cpuusage holds pointer to a u64-type object on every cpu */ u64 *cpuusage; + struct percpu_counter cpustat[CPUACCT_STAT_NSTATS]; struct cpuacct *parent; }; @@ -9563,20 +9580,32 @@ static struct cgroup_subsys_state *cpuacct_create( struct cgroup_subsys *ss, struct cgroup *cgrp) { struct cpuacct *ca = kzalloc(sizeof(*ca), GFP_KERNEL); + int i; if (!ca) - return ERR_PTR(-ENOMEM); + goto out; ca->cpuusage = alloc_percpu(u64); - if (!ca->cpuusage) { - kfree(ca); - return ERR_PTR(-ENOMEM); - } + if (!ca->cpuusage) + goto out_free_ca; + + for (i = 0; i < CPUACCT_STAT_NSTATS; i++) + if (percpu_counter_init(&ca->cpustat[i], 0)) + goto out_free_counters; if (cgrp->parent) ca->parent = cgroup_ca(cgrp->parent); return &ca->css; + +out_free_counters: + while (--i >= 0) + percpu_counter_destroy(&ca->cpustat[i]); + free_percpu(ca->cpuusage); +out_free_ca: + kfree(ca); +out: + return ERR_PTR(-ENOMEM); } /* destroy an existing cpu accounting group */ @@ -9584,7 +9613,10 @@ static void cpuacct_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp) { struct cpuacct *ca = cgroup_ca(cgrp); + int i; + for (i = 0; i < CPUACCT_STAT_NSTATS; i++) + percpu_counter_destroy(&ca->cpustat[i]); free_percpu(ca->cpuusage); kfree(ca); } @@ -9671,6 +9703,25 @@ static int cpuacct_percpu_seq_read(struct cgroup *cgroup, struct cftype *cft, return 0; } +static const char *cpuacct_stat_desc[] = { + [CPUACCT_STAT_USER] = "user", + [CPUACCT_STAT_SYSTEM] = "system", +}; + +static int cpuacct_stats_show(struct cgroup *cgrp, struct cftype *cft, + struct cgroup_map_cb *cb) +{ + struct cpuacct *ca = cgroup_ca(cgrp); + int i; + + for (i = 0; i < CPUACCT_STAT_NSTATS; i++) { + s64 val = percpu_counter_read(&ca->cpustat[i]); + val = cputime64_to_clock_t(val); + cb->fill(cb, cpuacct_stat_desc[i], val); + } + return 0; +} + static struct cftype files[] = { { .name = "usage", @@ -9681,7 +9732,10 @@ static struct cftype files[] = { .name = "usage_percpu", .read_seq_string = cpuacct_percpu_seq_read, }, - + { + .name = "stat", + .read_map = cpuacct_stats_show, + }, }; static int cpuacct_populate(struct cgroup_subsys *ss, struct cgroup *cgrp) @@ -9716,6 +9770,27 @@ static void cpuacct_charge(struct task_struct *tsk, u64 cputime) rcu_read_unlock(); } +/* + * Charge the system/user time to the task's accounting group. + */ +static void cpuacct_update_stats(struct task_struct *tsk, + enum cpuacct_stat_index idx, cputime_t val) +{ + struct cpuacct *ca; + + if (unlikely(!cpuacct_subsys.active)) + return; + + rcu_read_lock(); + ca = task_ca(tsk); + + do { + percpu_counter_add(&ca->cpustat[idx], val); + ca = ca->parent; + } while (ca); + rcu_read_unlock(); +} + struct cgroup_subsys cpuacct_subsys = { .name = "cpuacct", .create = cpuacct_create, -- cgit v0.10.2 From 46e0bb9c12f4bab539736f1714cbf16600f681ec Mon Sep 17 00:00:00 2001 From: Gautham R Shenoy Date: Mon, 30 Mar 2009 10:25:20 +0530 Subject: sched: Print sched_group::__cpu_power in sched_domain_debug Impact: extend debug info /proc/sched_debug If the user changes the value of the sched_mc/smt_power_savings sysfs tunable, it'll trigger a rebuilding of the whole sched_domain tree, with the SD_POWERSAVINGS_BALANCE flag set at certain levels. As a result, there would be a change in the __cpu_power of sched_groups in the sched_domain hierarchy. Print the __cpu_power values for each sched_group in sched_domain_debug to help verify this change and correlate it with the change in the load-balancing behavior. Signed-off-by: Gautham R Shenoy Cc: Peter Zijlstra LKML-Reference: <20090330045520.2869.24777.stgit@sofia.in.ibm.com> Signed-off-by: Ingo Molnar diff --git a/kernel/sched.c b/kernel/sched.c index 8d1bdbe..6234d10 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -6963,7 +6963,8 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level, cpumask_or(groupmask, groupmask, sched_group_cpus(group)); cpulist_scnprintf(str, sizeof(str), sched_group_cpus(group)); - printk(KERN_CONT " %s", str); + printk(KERN_CONT " %s (__cpu_power = %d)", str, + group->__cpu_power); group = group->next; } while (group != sd->groups); -- cgit v0.10.2 From 84adeee9aaa0d81712de1e0ea74caed3398e4a1d Mon Sep 17 00:00:00 2001 From: Yossi Etigin Date: Wed, 1 Apr 2009 13:55:32 -0700 Subject: RDMA/cma: Use rate from IPoIB broadcast when joining IPoIB multicast groups When joining an IPoIB multicast group, use the same rate as in the broadcast group. Otherwise, if the RDMA CM creates this group before IPoIB does, it might get a different rate. This will cause IPoIB to fail joining to the same group later on, because IPoIB uses strict rate selection. Signed-off-by: Yossi Etigin Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 2a2e508..3f9c03a 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -2713,6 +2713,10 @@ static int cma_join_ib_multicast(struct rdma_id_private *id_priv, IB_SA_MCMEMBER_REC_FLOW_LABEL | IB_SA_MCMEMBER_REC_TRAFFIC_CLASS; + if (id_priv->id.ps == RDMA_PS_IPOIB) + comp_mask |= IB_SA_MCMEMBER_REC_RATE | + IB_SA_MCMEMBER_REC_RATE_SELECTOR; + mc->multicast.ib = ib_sa_join_multicast(&sa_client, id_priv->id.device, id_priv->id.port_num, &rec, comp_mask, GFP_KERNEL, -- cgit v0.10.2 From 633fe795b80693a8198e7d82f66538a72d2bbba2 Mon Sep 17 00:00:00 2001 From: Randy Dunlap Date: Wed, 1 Apr 2009 17:47:23 -0700 Subject: timers: add missing kernel-doc Add missing kernel-doc parameter notation and change function name to its new name: Warning(kernel/timer.c:543): No description found for parameter 'name' Warning(kernel/timer.c:543): No description found for parameter 'key' Signed-off-by: Randy Dunlap Cc: akpm Cc: Johannes Berg LKML-Reference: <20090401174723.f0bea0eb.randy.dunlap@oracle.com> Signed-off-by: Ingo Molnar diff --git a/kernel/timer.c b/kernel/timer.c index 9b77fc9..3af9a0b 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -524,10 +524,13 @@ static void __init_timer(struct timer_list *timer) } /** - * init_timer - initialize a timer. + * init_timer_key - initialize a timer * @timer: the timer to be initialized + * @name: name of the timer + * @key: lockdep class key of the fake lock used for tracking timer + * sync lock dependencies * - * init_timer() must be done to a timer prior calling *any* of the + * init_timer_key() must be done to a timer prior calling *any* of the * other timer functions. */ void init_timer(struct timer_list *timer) -- cgit v0.10.2 From cd84a42f315e50edd454c27a3da3951ccd3d735a Mon Sep 17 00:00:00 2001 From: Darren Hart Date: Thu, 2 Apr 2009 14:19:38 -0700 Subject: futex: comment requeue key reference semantics We've tripped over the futex_requeue drop_count refering to key2 instead of key1. The code is actually correct, but is non-intuitive. This patch adds an explicit comment explaining the requeue. Signed-off-by: Darren Hart Cc: Peter Zijlstra Cc: Nick Piggin Cc: Rusty Russell Signed-off-by: Andrew Morton Signed-off-by: Ingo Molnar diff --git a/kernel/futex.c b/kernel/futex.c index 6b50a02..eef8cd2 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -883,7 +883,12 @@ retry_private: out_unlock: double_unlock_hb(hb1, hb2); - /* drop_futex_key_refs() must be called outside the spinlocks. */ + /* + * drop_futex_key_refs() must be called outside the spinlocks. During + * the requeue we moved futex_q's from the hash bucket at key1 to the + * one at key2 and updated their key pointer. We no longer need to + * hold the references to key1. + */ while (--drop_count >= 0) drop_futex_key_refs(&key1); -- cgit v0.10.2 From 9756b15e1b58453a6fd54b85c1ad8515209e10bb Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Mon, 30 Mar 2009 20:37:20 -0700 Subject: irq: fix cpumask memory leak on offstack cpumask kernels Need to free the old cpumask for affinity and pending_mask. Signed-off-by: Yinghai Lu Acked-by: Rusty Russell LKML-Reference: <49D18FF0.50707@kernel.org> Signed-off-by: Ingo Molnar diff --git a/include/linux/irq.h b/include/linux/irq.h index 974890b..99d147e 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -482,6 +482,16 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, #endif } +static inline void free_desc_masks(struct irq_desc *old_desc, + struct irq_desc *new_desc) +{ + free_cpumask_var(old_desc->affinity); + +#ifdef CONFIG_GENERIC_PENDING_IRQ + free_cpumask_var(old_desc->pending_mask); +#endif +} + #else /* !CONFIG_SMP */ static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, @@ -495,6 +505,10 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, { } +static inline void free_desc_masks(struct irq_desc *old_desc, + struct irq_desc *new_desc) +{ +} #endif /* CONFIG_SMP */ #endif /* _LINUX_IRQ_H */ diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 243d612..44bbdcb 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c @@ -54,6 +54,7 @@ static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) { free_kstat_irqs(old_desc, desc); + free_desc_masks(old_desc, desc); arch_free_chip_data(old_desc, desc); } -- cgit v0.10.2 From eb650b9ed0f69be075a5a86ef9c4fc2cf7915293 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Sat, 31 Jan 2009 12:13:57 +0100 Subject: [ARM] pxa/magician: Enable bq24022 regulator for gpio_vbus and pda_power With this patch, the bq24022 battery charger is controlled by the USB gadget framework (via gpio_vbus) when connected to USB. To compile, this patch depends on the "regulator: Allow init data to be supplied for bq24022" patch (queued for next in the regulator tree) to add the init_data field to struct bq24022_mach_info. It also depends on the "add optional OTG transceiver and voltage regulator support to pda_power" patch (queued for next in the power supply tree) to enable charging when connected to the AC charger. Signed-off-by: Philipp Zabel Signed-off-by: Eric Miao diff --git a/arch/arm/configs/magician_defconfig b/arch/arm/configs/magician_defconfig index 82428c2..f56837f 100644 --- a/arch/arm/configs/magician_defconfig +++ b/arch/arm/configs/magician_defconfig @@ -1183,7 +1183,11 @@ CONFIG_RTC_INTF_DEV=y CONFIG_RTC_DRV_SA1100=y # CONFIG_RTC_DRV_PXA is not set # CONFIG_DMADEVICES is not set -# CONFIG_REGULATOR is not set +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +# CONFIG_REGULATOR_FIXED_VOLTAGE is not set +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +CONFIG_REGULATOR_BQ24022=y # CONFIG_UIO is not set # CONFIG_STAGING is not set diff --git a/arch/arm/mach-pxa/include/mach/magician.h b/arch/arm/mach-pxa/include/mach/magician.h index 82a399f..20ef37d 100644 --- a/arch/arm/mach-pxa/include/mach/magician.h +++ b/arch/arm/mach-pxa/include/mach/magician.h @@ -27,7 +27,7 @@ #define GPIO22_MAGICIAN_VIBRA_EN 22 #define GPIO26_MAGICIAN_GSM_POWER 26 #define GPIO27_MAGICIAN_USBC_PUEN 27 -#define GPIO30_MAGICIAN_nCHARGE_EN 30 +#define GPIO30_MAGICIAN_BQ24022_nCHARGE_EN 30 #define GPIO37_MAGICIAN_KEY_HANGUP 37 #define GPIO38_MAGICIAN_KEY_CONTACTS 38 #define GPIO40_MAGICIAN_GSM_OUT2 40 @@ -98,7 +98,7 @@ #define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2) #define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3) #define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4) -#define EGPIO_MAGICIAN_CHARGE_EN MAGICIAN_EGPIO(2, 5) +#define EGPIO_MAGICIAN_BQ24022_ISET2 MAGICIAN_EGPIO(2, 5) #define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7) /* input */ diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index d46b367..2f75387 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -553,33 +555,7 @@ static struct platform_device gpio_vbus = { static int power_supply_init(struct device *dev) { - int ret; - - ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC"); - if (ret) - goto err_cs_ac; - ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_USB, "CABLE_STATE_USB"); - if (ret) - goto err_cs_usb; - ret = gpio_request(EGPIO_MAGICIAN_CHARGE_EN, "CHARGE_EN"); - if (ret) - goto err_chg_en; - ret = gpio_request(GPIO30_MAGICIAN_nCHARGE_EN, "nCHARGE_EN"); - if (!ret) - ret = gpio_direction_output(GPIO30_MAGICIAN_nCHARGE_EN, 0); - if (ret) - goto err_nchg_en; - - return 0; - -err_nchg_en: - gpio_free(EGPIO_MAGICIAN_CHARGE_EN); -err_chg_en: - gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB); -err_cs_usb: - gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC); -err_cs_ac: - return ret; + return gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC"); } static int magician_is_ac_online(void) @@ -587,22 +563,8 @@ static int magician_is_ac_online(void) return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_AC); } -static int magician_is_usb_online(void) -{ - return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_USB); -} - -static void magician_set_charge(int flags) -{ - gpio_set_value(GPIO30_MAGICIAN_nCHARGE_EN, !flags); - gpio_set_value(EGPIO_MAGICIAN_CHARGE_EN, flags); -} - static void power_supply_exit(struct device *dev) { - gpio_free(GPIO30_MAGICIAN_nCHARGE_EN); - gpio_free(EGPIO_MAGICIAN_CHARGE_EN); - gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB); gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC); } @@ -613,8 +575,6 @@ static char *magician_supplicants[] = { static struct pda_power_pdata power_supply_info = { .init = power_supply_init, .is_ac_online = magician_is_ac_online, - .is_usb_online = magician_is_usb_online, - .set_charge = magician_set_charge, .exit = power_supply_exit, .supplied_to = magician_supplicants, .num_supplicants = ARRAY_SIZE(magician_supplicants), @@ -647,6 +607,43 @@ static struct platform_device power_supply = { .num_resources = ARRAY_SIZE(power_supply_resources), }; +/* + * Battery charger + */ + +static struct regulator_consumer_supply bq24022_consumers[] = { + { + .dev = &gpio_vbus.dev, + .supply = "vbus_draw", + }, + { + .dev = &power_supply.dev, + .supply = "ac_draw", + }, +}; + +static struct regulator_init_data bq24022_init_data = { + .constraints = { + .max_uA = 500000, + .valid_ops_mask = REGULATOR_CHANGE_CURRENT, + }, + .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), + .consumer_supplies = bq24022_consumers, +}; + +static struct bq24022_mach_info bq24022_info = { + .gpio_nce = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN, + .gpio_iset2 = EGPIO_MAGICIAN_BQ24022_ISET2, + .init_data = &bq24022_init_data, +}; + +static struct platform_device bq24022 = { + .name = "bq24022", + .id = -1, + .dev = { + .platform_data = &bq24022_info, + }, +}; /* * MMC/SD @@ -757,6 +754,7 @@ static struct platform_device *devices[] __initdata = { &egpio, &backlight, &pasic3, + &bq24022, &gpio_vbus, &power_supply, &strataflash, -- cgit v0.10.2 From c9be0e39618984b925ec758c1384853db4435ea8 Mon Sep 17 00:00:00 2001 From: Mike Rapoport Date: Tue, 3 Feb 2009 09:15:30 +0200 Subject: [ARM] pxa/em-x270: add libertas device registration Signed-off-by: Mike Rapoport Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 920dfb8..67611da 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c @@ -25,8 +25,10 @@ #include #include #include +#include #include #include +#include #include @@ -62,6 +64,8 @@ #define GPIO93_CAM_RESET (93) #define GPIO41_ETHIRQ (41) #define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ) +#define GPIO115_WLAN_PWEN (115) +#define GPIO19_WLAN_STRAP (19) static int mmc_cd; static int nand_rb; @@ -159,8 +163,8 @@ static unsigned long common_pin_config[] = { GPIO57_SSP1_TXD, /* SSP2 */ - GPIO19_SSP2_SCLK, - GPIO14_SSP2_SFRM, + GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */ + GPIO14_GPIO, GPIO89_SSP2_TXD, GPIO88_SSP2_RXD, @@ -648,20 +652,86 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = { .model = TDO35S, }; +static struct pxa2xx_spi_master em_x270_spi_2_info = { + .num_chipselect = 1, + .enable_dma = 1, +}; + +static struct pxa2xx_spi_chip em_x270_libertas_chip = { + .rx_threshold = 1, + .tx_threshold = 1, + .timeout = 1000, +}; + +static unsigned long em_x270_libertas_pin_config[] = { + /* SSP2 */ + GPIO19_SSP2_SCLK, + GPIO14_GPIO, + GPIO89_SSP2_TXD, + GPIO88_SSP2_RXD, +}; + +static int em_x270_libertas_setup(struct spi_device *spi) +{ + int err = gpio_request(GPIO115_WLAN_PWEN, "WLAN PWEN"); + if (err) + return err; + + gpio_direction_output(GPIO19_WLAN_STRAP, 1); + mdelay(100); + + pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_libertas_pin_config)); + + gpio_direction_output(GPIO115_WLAN_PWEN, 0); + mdelay(100); + gpio_set_value(GPIO115_WLAN_PWEN, 1); + mdelay(100); + + spi->bits_per_word = 16; + spi_setup(spi); + + return 0; +} + +static int em_x270_libertas_teardown(struct spi_device *spi) +{ + gpio_set_value(GPIO115_WLAN_PWEN, 0); + gpio_free(GPIO115_WLAN_PWEN); + + return 0; +} + +struct libertas_spi_platform_data em_x270_libertas_pdata = { + .use_dummy_writes = 1, + .gpio_cs = 14, + .setup = em_x270_libertas_setup, + .teardown = em_x270_libertas_teardown, +}; + static struct spi_board_info em_x270_spi_devices[] __initdata = { { - .modalias = "tdo24m", - .max_speed_hz = 1000000, - .bus_num = 1, - .chip_select = 0, - .controller_data = &em_x270_tdo24m_chip, - .platform_data = &em_x270_tdo24m_pdata, + .modalias = "tdo24m", + .max_speed_hz = 1000000, + .bus_num = 1, + .chip_select = 0, + .controller_data = &em_x270_tdo24m_chip, + .platform_data = &em_x270_tdo24m_pdata, + }, + { + .modalias = "libertas_spi", + .max_speed_hz = 13000000, + .bus_num = 2, + .irq = IRQ_GPIO(116), + .chip_select = 0, + .controller_data = &em_x270_libertas_chip, + .platform_data = &em_x270_libertas_pdata, }, }; static void __init em_x270_init_spi(void) { pxa2xx_set_spi_info(1, &em_x270_spi_info); + pxa2xx_set_spi_info(2, &em_x270_spi_2_info); spi_register_board_info(ARRAY_AND_SIZE(em_x270_spi_devices)); } #else -- cgit v0.10.2 From 54088bf50f31e5f20e005922dae8948f9f856b79 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 24 Mar 2009 00:29:29 +0100 Subject: [ARM] pxa: Palm Tungsten E2 basic support This contains support for keypad, MMC, AC97, LCD and backlight. Signed-off-by: Marek Vasut Signed-off-by: Eric Miao diff --git a/MAINTAINERS b/MAINTAINERS index 6fe6f39..97d75ff 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -636,7 +636,7 @@ P: Dirk Opfer M: dirk@opfer-online.de S: Maintained -ARM/PALMTX,PALMT5,PALMLD SUPPORT +ARM/PALMTX,PALMT5,PALMLD,PALMTE2 SUPPORT P: Marek Vasut M: marek.vasut@gmail.com W: http://hackndev.com diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 96a2006..3e66d90 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig @@ -343,6 +343,15 @@ config ARCH_PXA_PALM bool "PXA based Palm PDAs" select HAVE_PWM +config MACH_PALMTE2 + bool "Palm Tungsten|E2" + default y + depends on ARCH_PXA_PALM + select PXA25x + help + Say Y here if you intend to run this kernel on a Palm Tungsten|E2 + handheld computer. + config MACH_PALMT5 bool "Palm Tungsten|T5" default y diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index c80e1ba..682dbf4 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_E740) += e740.o obj-$(CONFIG_MACH_E750) += e750.o obj-$(CONFIG_MACH_E400) += e400.o obj-$(CONFIG_MACH_E800) += e800.o +obj-$(CONFIG_MACH_PALMTE2) += palmte2.o obj-$(CONFIG_MACH_PALMT5) += palmt5.o obj-$(CONFIG_MACH_PALMTX) += palmtx.o obj-$(CONFIG_MACH_PALMLD) += palmld.o diff --git a/arch/arm/mach-pxa/include/mach/palmte2.h b/arch/arm/mach-pxa/include/mach/palmte2.h new file mode 100644 index 0000000..808ee7f --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/palmte2.h @@ -0,0 +1,43 @@ +/* + * GPIOs and interrupts for Palm Tungsten|E2 Handheld Computer + * + * Author: + * Carlos Eduardo Medaglia Dyonisio + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef _INCLUDE_PALMTE2_H_ +#define _INCLUDE_PALMTE2_H_ + +/** HERE ARE GPIOs **/ + +/* GPIOs */ +#define GPIO_NR_PALMTE2_SD_DETECT_N 10 +#define GPIO_NR_PALMTE2_SD_POWER 55 +#define GPIO_NR_PALMTE2_SD_READONLY 51 + +/* KEYS */ +#define GPIO_NR_PALMTE2_KEY_NOTES 5 +#define GPIO_NR_PALMTE2_KEY_TASKS 7 +#define GPIO_NR_PALMTE2_KEY_CALENDAR 11 +#define GPIO_NR_PALMTE2_KEY_CONTACTS 13 +#define GPIO_NR_PALMTE2_KEY_CENTER 14 +#define GPIO_NR_PALMTE2_KEY_LEFT 19 +#define GPIO_NR_PALMTE2_KEY_RIGHT 20 +#define GPIO_NR_PALMTE2_KEY_DOWN 21 +#define GPIO_NR_PALMTE2_KEY_UP 22 + +/** HERE ARE INIT VALUES **/ + +/* BACKLIGHT */ +#define PALMTE2_MAX_INTENSITY 0xFE +#define PALMTE2_DEFAULT_INTENSITY 0x7E +#define PALMTE2_LIMIT_MASK 0x7F +#define PALMTE2_PRESCALER 0x3F +#define PALMTE2_PERIOD_NS 3500 + +#endif diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c new file mode 100644 index 0000000..e0dc655 --- /dev/null +++ b/arch/arm/mach-pxa/palmte2.c @@ -0,0 +1,278 @@ +/* + * Hardware definitions for Palm Tungsten|E2 + * + * Author: + * Carlos Eduardo Medaglia Dyonisio + * + * Rewrite for mainline: + * Marek Vasut + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * (find more info at www.hackndev.com) + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "generic.h" +#include "devices.h" + +/****************************************************************************** + * Pin configuration + ******************************************************************************/ +static unsigned long palmte2_pin_config[] __initdata = { + /* MMC */ + GPIO6_MMC_CLK, + GPIO8_MMC_CS0, + GPIO10_GPIO, /* SD detect */ + GPIO55_GPIO, /* SD power */ + GPIO51_GPIO, /* SD r/o switch */ + + /* AC97 */ + GPIO28_AC97_BITCLK, + GPIO29_AC97_SDATA_IN_0, + GPIO30_AC97_SDATA_OUT, + GPIO31_AC97_SYNC, + + /* PWM */ + GPIO16_PWM0_OUT, + + /* LCD */ + GPIO58_LCD_LDD_0, + GPIO59_LCD_LDD_1, + GPIO60_LCD_LDD_2, + GPIO61_LCD_LDD_3, + GPIO62_LCD_LDD_4, + GPIO63_LCD_LDD_5, + GPIO64_LCD_LDD_6, + GPIO65_LCD_LDD_7, + GPIO66_LCD_LDD_8, + GPIO67_LCD_LDD_9, + GPIO68_LCD_LDD_10, + GPIO69_LCD_LDD_11, + GPIO70_LCD_LDD_12, + GPIO71_LCD_LDD_13, + GPIO72_LCD_LDD_14, + GPIO73_LCD_LDD_15, + GPIO74_LCD_FCLK, + GPIO75_LCD_LCLK, + GPIO76_LCD_PCLK, + + /* GPIO KEYS */ + GPIO5_GPIO, /* notes */ + GPIO7_GPIO, /* tasks */ + GPIO11_GPIO, /* calendar */ + GPIO13_GPIO, /* contacts */ + GPIO14_GPIO, /* center */ + GPIO19_GPIO, /* left */ + GPIO20_GPIO, /* right */ + GPIO21_GPIO, /* down */ + GPIO22_GPIO, /* up */ + + /* MISC */ + GPIO1_RST, /* reset */ +}; + +/****************************************************************************** + * SD/MMC card controller + ******************************************************************************/ +static int palmte2_mci_init(struct device *dev, + irq_handler_t palmte2_detect_int, void *data) +{ + int err = 0; + + /* Setup an interrupt for detecting card insert/remove events */ + err = gpio_request(GPIO_NR_PALMTE2_SD_DETECT_N, "SD IRQ"); + if (err) + goto err; + err = gpio_direction_input(GPIO_NR_PALMTE2_SD_DETECT_N); + if (err) + goto err2; + err = request_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), + palmte2_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + "SD/MMC card detect", data); + if (err) { + printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", + __func__); + goto err2; + } + + err = gpio_request(GPIO_NR_PALMTE2_SD_POWER, "SD_POWER"); + if (err) + goto err3; + err = gpio_direction_output(GPIO_NR_PALMTE2_SD_POWER, 0); + if (err) + goto err4; + + err = gpio_request(GPIO_NR_PALMTE2_SD_READONLY, "SD_READONLY"); + if (err) + goto err4; + err = gpio_direction_input(GPIO_NR_PALMTE2_SD_READONLY); + if (err) + goto err5; + + printk(KERN_DEBUG "%s: irq registered\n", __func__); + + return 0; + +err5: + gpio_free(GPIO_NR_PALMTE2_SD_READONLY); +err4: + gpio_free(GPIO_NR_PALMTE2_SD_POWER); +err3: + free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data); +err2: + gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N); +err: + return err; +} + +static void palmte2_mci_exit(struct device *dev, void *data) +{ + gpio_free(GPIO_NR_PALMTE2_SD_READONLY); + gpio_free(GPIO_NR_PALMTE2_SD_POWER); + free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data); + gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N); +} + +static void palmte2_mci_power(struct device *dev, unsigned int vdd) +{ + struct pxamci_platform_data *p_d = dev->platform_data; + gpio_set_value(GPIO_NR_PALMTE2_SD_POWER, p_d->ocr_mask & (1 << vdd)); +} + +static int palmte2_mci_get_ro(struct device *dev) +{ + return gpio_get_value(GPIO_NR_PALMTE2_SD_READONLY); +} + +static struct pxamci_platform_data palmte2_mci_platform_data = { + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, + .setpower = palmte2_mci_power, + .get_ro = palmte2_mci_get_ro, + .init = palmte2_mci_init, + .exit = palmte2_mci_exit, +}; + +/****************************************************************************** + * GPIO keys + ******************************************************************************/ +static struct gpio_keys_button palmte2_pxa_buttons[] = { + {KEY_F1, GPIO_NR_PALMTE2_KEY_CONTACTS, 1, "Contacts" }, + {KEY_F2, GPIO_NR_PALMTE2_KEY_CALENDAR, 1, "Calendar" }, + {KEY_F3, GPIO_NR_PALMTE2_KEY_TASKS, 1, "Tasks" }, + {KEY_F4, GPIO_NR_PALMTE2_KEY_NOTES, 1, "Notes" }, + {KEY_ENTER, GPIO_NR_PALMTE2_KEY_CENTER, 1, "Center" }, + {KEY_LEFT, GPIO_NR_PALMTE2_KEY_LEFT, 1, "Left" }, + {KEY_RIGHT, GPIO_NR_PALMTE2_KEY_RIGHT, 1, "Right" }, + {KEY_DOWN, GPIO_NR_PALMTE2_KEY_DOWN, 1, "Down" }, + {KEY_UP, GPIO_NR_PALMTE2_KEY_UP, 1, "Up" }, +}; + +static struct gpio_keys_platform_data palmte2_pxa_keys_data = { + .buttons = palmte2_pxa_buttons, + .nbuttons = ARRAY_SIZE(palmte2_pxa_buttons), +}; + +static struct platform_device palmte2_pxa_keys = { + .name = "gpio-keys", + .id = -1, + .dev = { + .platform_data = &palmte2_pxa_keys_data, + }, +}; + +/****************************************************************************** + * Backlight + ******************************************************************************/ +static struct platform_pwm_backlight_data palmte2_backlight_data = { + .pwm_id = 0, + .max_brightness = PALMTE2_MAX_INTENSITY, + .dft_brightness = PALMTE2_MAX_INTENSITY, + .pwm_period_ns = PALMTE2_PERIOD_NS, +}; + +static struct platform_device palmte2_backlight = { + .name = "pwm-backlight", + .dev = { + .parent = &pxa25x_device_pwm0.dev, + .platform_data = &palmte2_backlight_data, + }, +}; + +/****************************************************************************** + * Framebuffer + ******************************************************************************/ +static struct pxafb_mode_info palmte2_lcd_modes[] = { +{ + .pixclock = 77757, + .xres = 320, + .yres = 320, + .bpp = 16, + + .left_margin = 28, + .right_margin = 7, + .upper_margin = 7, + .lower_margin = 5, + + .hsync_len = 4, + .vsync_len = 1, +}, +}; + +static struct pxafb_mach_info palmte2_lcd_screen = { + .modes = palmte2_lcd_modes, + .num_modes = ARRAY_SIZE(palmte2_lcd_modes), + .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, +}; + +/****************************************************************************** + * Machine init + ******************************************************************************/ +static struct platform_device *devices[] __initdata = { +#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) + &palmte2_pxa_keys, +#endif + &palmte2_backlight, +}; + +static void __init palmte2_init(void) +{ + pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config)); + + set_pxa_fb_info(&palmte2_lcd_screen); + pxa_set_mci_info(&palmte2_mci_platform_data); + pxa_set_ac97_info(NULL); + + platform_add_devices(devices, ARRAY_SIZE(devices)); +} + +MACHINE_START(PALMTE2, "Palm Tungsten|E2") + .phys_io = 0x40000000, + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, + .boot_params = 0xa0000100, + .map_io = pxa_map_io, + .init_irq = pxa25x_init_irq, + .timer = &pxa_timer, + .init_machine = palmte2_init +MACHINE_END -- cgit v0.10.2 From 8c8aa5fa3060abc17e8a07d15f575485f6a0c0b8 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 24 Mar 2009 21:23:39 +0100 Subject: [ARM] pxa: PalmTE2 support for battery, UDC, IrDA and backlight Signed-off-by: Marek Vasut Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/include/mach/palmte2.h b/arch/arm/mach-pxa/include/mach/palmte2.h index 808ee7f..1236134 100644 --- a/arch/arm/mach-pxa/include/mach/palmte2.h +++ b/arch/arm/mach-pxa/include/mach/palmte2.h @@ -16,10 +16,26 @@ /** HERE ARE GPIOs **/ /* GPIOs */ +#define GPIO_NR_PALMTE2_POWER_DETECT 9 +#define GPIO_NR_PALMTE2_HOTSYNC_BUTTON_N 4 +#define GPIO_NR_PALMTE2_EARPHONE_DETECT 15 + +/* SD/MMC */ #define GPIO_NR_PALMTE2_SD_DETECT_N 10 #define GPIO_NR_PALMTE2_SD_POWER 55 #define GPIO_NR_PALMTE2_SD_READONLY 51 +/* IRDA - disable GPIO connected to SD pin of tranceiver (TFBS4710?) ? */ +#define GPIO_NR_PALMTE2_IR_DISABLE 48 + +/* USB */ +#define GPIO_NR_PALMTE2_USB_DETECT_N 35 +#define GPIO_NR_PALMTE2_USB_PULLUP 53 + +/* LCD/BACKLIGHT */ +#define GPIO_NR_PALMTE2_BL_POWER 56 +#define GPIO_NR_PALMTE2_LCD_POWER 37 + /* KEYS */ #define GPIO_NR_PALMTE2_KEY_NOTES 5 #define GPIO_NR_PALMTE2_KEY_TASKS 7 @@ -40,4 +56,13 @@ #define PALMTE2_PRESCALER 0x3F #define PALMTE2_PERIOD_NS 3500 +/* BATTERY */ +#define PALMTE2_BAT_MAX_VOLTAGE 4000 /* 4.00v current voltage */ +#define PALMTE2_BAT_MIN_VOLTAGE 3550 /* 3.55v critical voltage */ +#define PALMTE2_BAT_MAX_CURRENT 0 /* unknokn */ +#define PALMTE2_BAT_MIN_CURRENT 0 /* unknown */ +#define PALMTE2_BAT_MAX_CHARGE 1 /* unknown */ +#define PALMTE2_BAT_MIN_CHARGE 1 /* unknown */ +#define PALMTE2_MAX_LIFE_MINS 360 /* on-life in minutes */ + #endif diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c index e0dc655..43fcf2e 100644 --- a/arch/arm/mach-pxa/palmte2.c +++ b/arch/arm/mach-pxa/palmte2.c @@ -20,8 +20,11 @@ #include #include #include +#include #include #include +#include +#include #include #include @@ -32,6 +35,8 @@ #include #include #include +#include +#include #include "generic.h" #include "devices.h" @@ -56,6 +61,15 @@ static unsigned long palmte2_pin_config[] __initdata = { /* PWM */ GPIO16_PWM0_OUT, + /* USB */ + GPIO15_GPIO, /* usb detect */ + GPIO53_GPIO, /* usb power */ + + /* IrDA */ + GPIO48_GPIO, /* ir disable */ + GPIO46_FICP_RXD, + GPIO47_FICP_TXD, + /* LCD */ GPIO58_LCD_LDD_0, GPIO59_LCD_LDD_1, @@ -76,6 +90,7 @@ static unsigned long palmte2_pin_config[] __initdata = { GPIO74_LCD_FCLK, GPIO75_LCD_LCLK, GPIO76_LCD_PCLK, + GPIO77_LCD_BIAS, /* GPIO KEYS */ GPIO5_GPIO, /* notes */ @@ -90,6 +105,10 @@ static unsigned long palmte2_pin_config[] __initdata = { /* MISC */ GPIO1_RST, /* reset */ + GPIO4_GPIO, /* Hotsync button */ + GPIO9_GPIO, /* power detect */ + GPIO37_GPIO, /* LCD power */ + GPIO56_GPIO, /* Backlight power */ }; /****************************************************************************** @@ -205,11 +224,53 @@ static struct platform_device palmte2_pxa_keys = { /****************************************************************************** * Backlight ******************************************************************************/ +static int palmte2_backlight_init(struct device *dev) +{ + int ret; + + ret = gpio_request(GPIO_NR_PALMTE2_BL_POWER, "BL POWER"); + if (ret) + goto err; + ret = gpio_direction_output(GPIO_NR_PALMTE2_BL_POWER, 0); + if (ret) + goto err2; + ret = gpio_request(GPIO_NR_PALMTE2_LCD_POWER, "LCD POWER"); + if (ret) + goto err2; + ret = gpio_direction_output(GPIO_NR_PALMTE2_LCD_POWER, 0); + if (ret) + goto err3; + + return 0; +err3: + gpio_free(GPIO_NR_PALMTE2_LCD_POWER); +err2: + gpio_free(GPIO_NR_PALMTE2_BL_POWER); +err: + return ret; +} + +static int palmte2_backlight_notify(int brightness) +{ + gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness); + gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness); + return brightness; +} + +static void palmte2_backlight_exit(struct device *dev) +{ + gpio_free(GPIO_NR_PALMTE2_BL_POWER); + gpio_free(GPIO_NR_PALMTE2_LCD_POWER); +} + static struct platform_pwm_backlight_data palmte2_backlight_data = { .pwm_id = 0, .max_brightness = PALMTE2_MAX_INTENSITY, .dft_brightness = PALMTE2_MAX_INTENSITY, .pwm_period_ns = PALMTE2_PERIOD_NS, + .init = palmte2_backlight_init, + .notify = palmte2_backlight_notify, + .exit = palmte2_backlight_exit, }; static struct platform_device palmte2_backlight = { @@ -221,6 +282,119 @@ static struct platform_device palmte2_backlight = { }; /****************************************************************************** + * IrDA + ******************************************************************************/ +static int palmte2_irda_startup(struct device *dev) +{ + int err; + err = gpio_request(GPIO_NR_PALMTE2_IR_DISABLE, "IR DISABLE"); + if (err) + goto err; + err = gpio_direction_output(GPIO_NR_PALMTE2_IR_DISABLE, 1); + if (err) + gpio_free(GPIO_NR_PALMTE2_IR_DISABLE); +err: + return err; +} + +static void palmte2_irda_shutdown(struct device *dev) +{ + gpio_free(GPIO_NR_PALMTE2_IR_DISABLE); +} + +static void palmte2_irda_transceiver_mode(struct device *dev, int mode) +{ + gpio_set_value(GPIO_NR_PALMTE2_IR_DISABLE, mode & IR_OFF); + pxa2xx_transceiver_mode(dev, mode); +} + +static struct pxaficp_platform_data palmte2_ficp_platform_data = { + .startup = palmte2_irda_startup, + .shutdown = palmte2_irda_shutdown, + .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, + .transceiver_mode = palmte2_irda_transceiver_mode, +}; + +/****************************************************************************** + * UDC + ******************************************************************************/ +static struct pxa2xx_udc_mach_info palmte2_udc_info __initdata = { + .gpio_vbus = GPIO_NR_PALMTE2_USB_DETECT_N, + .gpio_vbus_inverted = 1, + .gpio_pullup = GPIO_NR_PALMTE2_USB_PULLUP, + .gpio_pullup_inverted = 0, +}; + +/****************************************************************************** + * Power supply + ******************************************************************************/ +static int power_supply_init(struct device *dev) +{ + int ret; + + ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC"); + if (ret) + goto err1; + ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT); + if (ret) + goto err2; + + return 0; + +err2: + gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); +err1: + return ret; +} + +static int palmte2_is_ac_online(void) +{ + return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT); +} + +static void power_supply_exit(struct device *dev) +{ + gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); +} + +static char *palmte2_supplicants[] = { + "main-battery", +}; + +static struct pda_power_pdata power_supply_info = { + .init = power_supply_init, + .is_ac_online = palmte2_is_ac_online, + .exit = power_supply_exit, + .supplied_to = palmte2_supplicants, + .num_supplicants = ARRAY_SIZE(palmte2_supplicants), +}; + +static struct platform_device power_supply = { + .name = "pda-power", + .id = -1, + .dev = { + .platform_data = &power_supply_info, + }, +}; + +/****************************************************************************** + * WM97xx battery + ******************************************************************************/ +static struct wm97xx_batt_info wm97xx_batt_pdata = { + .batt_aux = WM97XX_AUX_ID3, + .temp_aux = WM97XX_AUX_ID2, + .charge_gpio = -1, + .max_voltage = PALMTE2_BAT_MAX_VOLTAGE, + .min_voltage = PALMTE2_BAT_MIN_VOLTAGE, + .batt_mult = 1000, + .batt_div = 414, + .temp_mult = 1, + .temp_div = 1, + .batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO, + .batt_name = "main-batt", +}; + +/****************************************************************************** * Framebuffer ******************************************************************************/ static struct pxafb_mode_info palmte2_lcd_modes[] = { @@ -254,15 +428,29 @@ static struct platform_device *devices[] __initdata = { &palmte2_pxa_keys, #endif &palmte2_backlight, + &power_supply, }; +/* setup udc GPIOs initial state */ +static void __init palmte2_udc_init(void) +{ + if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) { + gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1); + gpio_free(GPIO_NR_PALMTE2_USB_PULLUP); + } +} + static void __init palmte2_init(void) { pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config)); set_pxa_fb_info(&palmte2_lcd_screen); pxa_set_mci_info(&palmte2_mci_platform_data); + palmte2_udc_init(); + pxa_set_udc_info(&palmte2_udc_info); pxa_set_ac97_info(NULL); + pxa_set_ficp_info(&palmte2_ficp_platform_data); + wm97xx_bat_set_pdata(&wm97xx_batt_pdata); platform_add_devices(devices, ARRAY_SIZE(devices)); } -- cgit v0.10.2 From 81854f82c5c1a203b2f5c94f6aa2ed8b8e19f025 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sat, 28 Mar 2009 12:37:42 +0100 Subject: [ARM] pxa: Add support for suspend on PalmTX, T5 and LD Signed-off-by: Marek Vasut Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/include/mach/palmld.h b/arch/arm/mach-pxa/include/mach/palmld.h index 7c295a4..fb13c82 100644 --- a/arch/arm/mach-pxa/include/mach/palmld.h +++ b/arch/arm/mach-pxa/include/mach/palmld.h @@ -87,6 +87,7 @@ #define PALMLD_IDE_SIZE 0x00100000 #define PALMLD_PHYS_IO_START 0x40000000 +#define PALMLD_STR_BASE 0xa0200000 /* BATTERY */ #define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */ diff --git a/arch/arm/mach-pxa/include/mach/palmt5.h b/arch/arm/mach-pxa/include/mach/palmt5.h index 94db288..052bfe7 100644 --- a/arch/arm/mach-pxa/include/mach/palmt5.h +++ b/arch/arm/mach-pxa/include/mach/palmt5.h @@ -59,6 +59,7 @@ /* Various addresses */ #define PALMT5_PHYS_RAM_START 0xa0000000 #define PALMT5_PHYS_IO_START 0x40000000 +#define PALMT5_STR_BASE 0xa0200000 /* TOUCHSCREEN */ #define AC97_LINK_FRAME 21 diff --git a/arch/arm/mach-pxa/include/mach/palmtx.h b/arch/arm/mach-pxa/include/mach/palmtx.h index 1e8bccb..9f7d62f 100644 --- a/arch/arm/mach-pxa/include/mach/palmtx.h +++ b/arch/arm/mach-pxa/include/mach/palmtx.h @@ -78,6 +78,8 @@ #define PALMTX_PHYS_RAM_START 0xa0000000 #define PALMTX_PHYS_IO_START 0x40000000 +#define PALMTX_STR_BASE 0xa0200000 + #define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */ #define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */ diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 8587477..ecf5910 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -68,10 +69,10 @@ static unsigned long palmld_pin_config[] __initdata = { GPIO47_FICP_TXD, /* MATRIX KEYPAD */ - GPIO100_KP_MKIN_0, - GPIO101_KP_MKIN_1, - GPIO102_KP_MKIN_2, - GPIO97_KP_MKIN_3, + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, GPIO103_KP_MKOUT_0, GPIO104_KP_MKOUT_1, GPIO105_KP_MKOUT_2, @@ -507,6 +508,33 @@ static struct pxafb_mach_info palmld_lcd_screen = { }; /****************************************************************************** + * Power management - standby + ******************************************************************************/ +#ifdef CONFIG_PM +static u32 *addr __initdata; +static u32 resume[3] __initdata = { + 0xe3a00101, /* mov r0, #0x40000000 */ + 0xe380060f, /* orr r0, r0, #0x00f00000 */ + 0xe590f008, /* ldr pc, [r0, #0x08] */ +}; + +static int __init palmld_pm_init(void) +{ + int i; + + /* this is where the bootloader jumps */ + addr = phys_to_virt(PALMLD_STR_BASE); + + for (i = 0; i < 3; i++) + addr[i] = resume[i]; + + return 0; +} + +device_initcall(palmld_pm_init); +#endif + +/****************************************************************************** * Machine init ******************************************************************************/ static struct platform_device *devices[] __initdata = { diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index 9521c7b..0680f1a 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c @@ -75,10 +75,10 @@ static unsigned long palmt5_pin_config[] __initdata = { GPIO95_GPIO, /* usb power */ /* MATRIX KEYPAD */ - GPIO100_KP_MKIN_0, - GPIO101_KP_MKIN_1, - GPIO102_KP_MKIN_2, - GPIO97_KP_MKIN_3, + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, GPIO103_KP_MKOUT_0, GPIO104_KP_MKOUT_1, GPIO105_KP_MKOUT_2, @@ -450,6 +450,33 @@ static struct pxafb_mach_info palmt5_lcd_screen = { }; /****************************************************************************** + * Power management - standby + ******************************************************************************/ +#ifdef CONFIG_PM +static u32 *addr __initdata; +static u32 resume[3] __initdata = { + 0xe3a00101, /* mov r0, #0x40000000 */ + 0xe380060f, /* orr r0, r0, #0x00f00000 */ + 0xe590f008, /* ldr pc, [r0, #0x08] */ +}; + +static int __init palmt5_pm_init(void) +{ + int i; + + /* this is where the bootloader jumps */ + addr = phys_to_virt(PALMT5_STR_BASE); + + for (i = 0; i < 3; i++) + addr[i] = resume[i]; + + return 0; +} + +device_initcall(palmt5_pm_init); +#endif + +/****************************************************************************** * Machine init ******************************************************************************/ static struct platform_device *devices[] __initdata = { diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index b490c09..59d0c1c 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c @@ -93,10 +93,10 @@ static unsigned long palmtx_pin_config[] __initdata = { GPIO116_GPIO, /* wifi ready */ /* MATRIX KEYPAD */ - GPIO100_KP_MKIN_0, - GPIO101_KP_MKIN_1, - GPIO102_KP_MKIN_2, - GPIO97_KP_MKIN_3, + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, GPIO103_KP_MKOUT_0, GPIO104_KP_MKOUT_1, GPIO105_KP_MKOUT_2, @@ -459,6 +459,33 @@ static struct pxafb_mach_info palmtx_lcd_screen = { }; /****************************************************************************** + * Power management - standby + ******************************************************************************/ +#ifdef CONFIG_PM +static u32 *addr __initdata; +static u32 resume[3] __initdata = { + 0xe3a00101, /* mov r0, #0x40000000 */ + 0xe380060f, /* orr r0, r0, #0x00f00000 */ + 0xe590f008, /* ldr pc, [r0, #0x08] */ +}; + +static int __init palmtx_pm_init(void) +{ + int i; + + /* this is where the bootloader jumps */ + addr = phys_to_virt(PALMTX_STR_BASE); + + for (i = 0; i < 3; i++) + addr[i] = resume[i]; + + return 0; +} + +device_initcall(palmtx_pm_init); +#endif + +/****************************************************************************** * Machine init ******************************************************************************/ static struct platform_device *devices[] __initdata = { diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index b438fc4..e6344ec 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -828,6 +828,17 @@ void __init reserve_node_zero(pg_data_t *pgdat) BOOTMEM_DEFAULT); } + if (machine_is_palmld() || machine_is_palmtx()) { + reserve_bootmem_node(pgdat, 0xa0000000, 0x1000, + BOOTMEM_EXCLUSIVE); + reserve_bootmem_node(pgdat, 0xa0200000, 0x1000, + BOOTMEM_EXCLUSIVE); + } + + if (machine_is_palmt5()) + reserve_bootmem_node(pgdat, 0xa0200000, 0x1000, + BOOTMEM_EXCLUSIVE); + #ifdef CONFIG_SA1111 /* * Because of the SA1111 DMA bug, we want to preserve our -- cgit v0.10.2 From 50f6bb0ab75794ad02cb5db503cc8c99465ceaf4 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 1 Apr 2009 22:30:07 +0800 Subject: [ARM] pxa/cm-x2xx: fix ucb1400 not being registered This patch fixes cm-x2xx not registering the ucb1400. This is because of the splitting of ucb1400 driver half year ago. Signed-off-by: Marek Vasut Acked-by: Mike Rapoport Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c index 117b5435f..b50ef39 100644 --- a/arch/arm/mach-pxa/cm-x2xx.c +++ b/arch/arm/mach-pxa/cm-x2xx.c @@ -121,7 +121,7 @@ static inline void cmx2xx_init_dm9000(void) {} /* UCB1400 touchscreen controller */ #if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) static struct platform_device cmx2xx_ts_device = { - .name = "ucb1400_ts", + .name = "ucb1400_core", .id = -1, }; -- cgit v0.10.2 From 22a0200b18b8526043d3014efdaf839b01767111 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Thu, 2 Apr 2009 08:33:14 +0200 Subject: [ARM] pxa/colibri: provide MAC address from ATAG_SERIAL In 67fca028f1535e510689d2e444b0289e264e05c1, the ax88796 ethernet driver learned a way to let the platform data hand in the MAC address. Use it here as the original Colibri bootloader passes in a MAC address via ATAG_SERIAL. Reported-by: Matthias Meier Signed-off-by: Daniel Mack Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c index 10c2eaf..0964eda 100644 --- a/arch/arm/mach-pxa/colibri-pxa300.c +++ b/arch/arm/mach-pxa/colibri-pxa300.c @@ -32,12 +32,13 @@ #if defined(CONFIG_AX88796) #define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO) + /* * Asix AX88796 Ethernet */ static struct ax_plat_data colibri_asix_platdata = { - .flags = AXFLG_MAC_FROMDEV, - .wordlength = 2 + .flags = 0, /* defined later */ + .wordlength = 2, }; static struct resource colibri_asix_resource[] = { @@ -70,6 +71,7 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = { static void __init colibri_pxa300_init_eth(void) { + colibri_pxa3xx_init_eth(&colibri_asix_platdata); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config)); set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); platform_device_register(&asix_device); diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c index 55b74a7..8a742b7 100644 --- a/arch/arm/mach-pxa/colibri-pxa320.c +++ b/arch/arm/mach-pxa/colibri-pxa320.c @@ -38,8 +38,8 @@ * Asix AX88796 Ethernet */ static struct ax_plat_data colibri_asix_platdata = { - .flags = AXFLG_MAC_FROMDEV, - .wordlength = 2 + .flags = 0, /* defined later */ + .wordlength = 2, }; static struct resource colibri_asix_resource[] = { @@ -72,6 +72,7 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = { static void __init colibri_pxa320_init_eth(void) { + colibri_pxa3xx_init_eth(&colibri_asix_platdata); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config)); set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); platform_device_register(&asix_device); diff --git a/arch/arm/mach-pxa/colibri-pxa3xx.c b/arch/arm/mach-pxa/colibri-pxa3xx.c index 12d0afc..ea34e34 100644 --- a/arch/arm/mach-pxa/colibri-pxa3xx.c +++ b/arch/arm/mach-pxa/colibri-pxa3xx.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,40 @@ #include "generic.h" #include "devices.h" +#if defined(CONFIG_AX88796) +#define ETHER_ADDR_LEN 6 +static u8 ether_mac_addr[ETHER_ADDR_LEN]; + +void __init colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data) +{ + int i; + u64 serial = ((u64) system_serial_high << 32) | system_serial_low; + + /* + * If the bootloader passed in a serial boot tag, which contains a + * valid ethernet MAC, pass it to the interface. Toradex ships the + * modules with their own bootloader which provides a valid MAC + * this way. + */ + + for (i = 0; i < ETHER_ADDR_LEN; i++) { + ether_mac_addr[i] = serial & 0xff; + serial >>= 8; + } + + if (is_valid_ether_addr(ether_mac_addr)) { + plat_data->flags |= AXFLG_MAC_FROMPLATFORM; + plat_data->mac_addr = ether_mac_addr; + printk(KERN_INFO "%s(): taking MAC from serial boot tag\n", + __func__); + } else { + plat_data->flags |= AXFLG_MAC_FROMDEV; + printk(KERN_INFO "%s(): no valid serial boot tag found, " + "taking MAC from device\n", __func__); + } +} +#endif + #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) static int mmc_detect_pin; diff --git a/arch/arm/mach-pxa/include/mach/colibri.h b/arch/arm/mach-pxa/include/mach/colibri.h index 3f2a01d..306ad64 100644 --- a/arch/arm/mach-pxa/include/mach/colibri.h +++ b/arch/arm/mach-pxa/include/mach/colibri.h @@ -16,6 +16,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin); static inline void colibri_pxa3xx_init_lcd(int) {} #endif +#if defined(CONFIG_AX88796) +extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data); +#endif + /* physical memory regions */ #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ -- cgit v0.10.2 From 8a28b10e915fff4a4e8be4f152a8e8695d0cb044 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Thu, 2 Apr 2009 08:33:15 +0200 Subject: [ARM] pxa/colibri: get rid of set_irq_type() In commit 47cb035560a41bd1bd3db506eeab93088815203e, the ax88796 driver learned to take IRQ flags from platform_device definition. Use that here to get rid of the set_irq_type() hack. Signed-off-by: Daniel Mack Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c index 0964eda..7c9c34c 100644 --- a/arch/arm/mach-pxa/colibri-pxa300.c +++ b/arch/arm/mach-pxa/colibri-pxa300.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -50,7 +50,7 @@ static struct resource colibri_asix_resource[] = { [1] = { .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), - .flags = IORESOURCE_IRQ + .flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING, } }; @@ -73,7 +73,6 @@ static void __init colibri_pxa300_init_eth(void) { colibri_pxa3xx_init_eth(&colibri_asix_platdata); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config)); - set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); platform_device_register(&asix_device); } #else diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c index 8a742b7..a18d37b 100644 --- a/arch/arm/mach-pxa/colibri-pxa320.c +++ b/arch/arm/mach-pxa/colibri-pxa320.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -51,7 +51,7 @@ static struct resource colibri_asix_resource[] = { [1] = { .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), - .flags = IORESOURCE_IRQ + .flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING, } }; @@ -74,7 +74,6 @@ static void __init colibri_pxa320_init_eth(void) { colibri_pxa3xx_init_eth(&colibri_asix_platdata); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config)); - set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); platform_device_register(&asix_device); } #else diff --git a/arch/arm/mach-pxa/include/mach/colibri.h b/arch/arm/mach-pxa/include/mach/colibri.h index 306ad64..90230c6 100644 --- a/arch/arm/mach-pxa/include/mach/colibri.h +++ b/arch/arm/mach-pxa/include/mach/colibri.h @@ -1,5 +1,8 @@ #ifndef _COLIBRI_H_ #define _COLIBRI_H_ + +#include + /* * common settings for all modules */ -- cgit v0.10.2 From 675b5d869fe8f6f9cdb3c6758228f211fb1773e6 Mon Sep 17 00:00:00 2001 From: Dmitry Eremin-Solenikov Date: Wed, 1 Apr 2009 03:40:05 +0400 Subject: [ARM] pxa/csb701: do not register devices on non-csb726 boads csb701 driver can currently only be used on csb726 boards, limit the csb701 devices registration to csb726 board. Signed-off-by: Dmitry Eremin-Solenikov Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/csb701.c b/arch/arm/mach-pxa/csb701.c index 4a2a295..5a221a4 100644 --- a/arch/arm/mach-pxa/csb701.c +++ b/arch/arm/mach-pxa/csb701.c @@ -5,6 +5,8 @@ #include #include +#include + static struct gpio_keys_button csb701_buttons[] = { { .code = 0x7, @@ -54,6 +56,9 @@ static struct platform_device *devices[] __initdata = { static int __init csb701_init(void) { + if (!machine_is_csb726()) + return -ENODEV; + return platform_add_devices(devices, ARRAY_SIZE(devices)); } -- cgit v0.10.2 From 80748fb8ff3bc068dccacb690cd2eb417b034ec7 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 3 Apr 2009 12:45:49 +0100 Subject: [ARM] pxa: register AC97 controller devices The tosa, e740, e750, e800 and mioa701 all use AC97 audio codecs but does not register the platform device for the AC97 controller. Doing so is now required by ASoC. Signed-off-by: Mark Brown Acked-by: Dmitry Eremin-Solenikov Acked-by: Ian Molton Signed-off-by: Robert Jarzmik Signed-off-by: Eric Miao diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c index 07500a0..a36fc17 100644 --- a/arch/arm/mach-pxa/e740.c +++ b/arch/arm/mach-pxa/e740.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "generic.h" #include "eseries.h" @@ -197,6 +198,7 @@ static void __init e740_init(void) eseries_get_tmio_gpios(); platform_add_devices(devices, ARRAY_SIZE(devices)); pxa_set_udc_info(&e7xx_udc_mach_info); + pxa_set_ac97_info(NULL); e7xx_irda_init(); pxa_set_ficp_info(&e7xx_ficp_platform_data); } diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c index 6126c04..1d00110 100644 --- a/arch/arm/mach-pxa/e750.c +++ b/arch/arm/mach-pxa/e750.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "generic.h" #include "eseries.h" @@ -198,6 +199,7 @@ static void __init e750_init(void) eseries_get_tmio_gpios(); platform_add_devices(devices, ARRAY_SIZE(devices)); pxa_set_udc_info(&e7xx_udc_mach_info); + pxa_set_ac97_info(NULL); e7xx_irda_init(); pxa_set_ficp_info(&e7xx_ficp_platform_data); } diff --git a/arch/arm/mach-pxa/e800.c b/arch/arm/mach-pxa/e800.c index 74ab098..9866c7b 100644 --- a/arch/arm/mach-pxa/e800.c +++ b/arch/arm/mach-pxa/e800.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "generic.h" #include "eseries.h" @@ -199,6 +200,7 @@ static void __init e800_init(void) eseries_get_tmio_gpios(); platform_add_devices(devices, ARRAY_SIZE(devices)); pxa_set_udc_info(&e800_udc_mach_info); + pxa_set_ac97_info(NULL); } MACHINE_START(E800, "Toshiba e800") diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index 97c93a7..9203b06 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -763,8 +764,6 @@ MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight", &pxa27x_device_pwm0.dev, &mioa701_backlight_data); MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info) MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL) -MIO_SIMPLE_DEV(pxa2xx_ac97, "pxa2xx-ac97", NULL) -MIO_PARENT_DEV(mio_wm9713_codec, "wm9713-codec", &pxa2xx_ac97.dev, NULL) MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL) MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL) MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data); @@ -774,8 +773,6 @@ static struct platform_device *devices[] __initdata = { &mioa701_backlight, &mioa701_led, &pxa2xx_pcm, - &pxa2xx_ac97, - &mio_wm9713_codec, &mioa701_sound, &power_dev, &strataflash, @@ -818,6 +815,7 @@ static void __init mioa701_machine_init(void) pxa_set_keypad_info(&mioa701_keypad_info); wm97xx_bat_set_pdata(&mioa701_battery_data); pxa_set_udc_info(&mioa701_udc_info); + pxa_set_ac97_info(NULL); pm_power_off = mioa701_poweroff; arm_pm_restart = mioa701_restart; platform_add_devices(devices, ARRAY_SIZE(devices)); diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 6e8ade6..afac5b6 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -914,6 +915,7 @@ static void __init tosa_init(void) pxa_set_udc_info(&udc_info); pxa_set_ficp_info(&tosa_ficp_platform_data); pxa_set_i2c_info(NULL); + pxa_set_ac97_info(NULL); platform_scoop_config = &tosa_pcmcia_config; pxa2xx_set_spi_info(2, &pxa_ssp_master_info); -- cgit v0.10.2 From f73953c0656f2db9073c585c4df2884a8ecd101e Mon Sep 17 00:00:00 2001 From: Thiemo Nagel Date: Tue, 7 Apr 2009 18:46:47 -0400 Subject: ext4: Fix big-endian problem in __ext4_check_blockref() Commit fe2c8191 introduced a regression on big-endian system, because the checks to make sure block references in non-extent inodes are valid failed to use le32_to_cpu(). Reported-by: Alexander Beregalov Signed-off-by: Thiemo Nagel Tested-by: Alexander Beregalov Signed-off-by: "Theodore Ts'o" Cc: stable@kernel.org diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index a2e7952..c6bd6ce 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -372,16 +372,16 @@ static int ext4_block_to_path(struct inode *inode, } static int __ext4_check_blockref(const char *function, struct inode *inode, - unsigned int *p, unsigned int max) { + __le32 *p, unsigned int max) { unsigned int maxblocks = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es); - unsigned int *bref = p; + __le32 *bref = p; while (bref < p+max) { - if (unlikely(*bref >= maxblocks)) { + if (unlikely(le32_to_cpu(*bref) >= maxblocks)) { ext4_error(inode->i_sb, function, "block reference %u >= max (%u) " "in inode #%lu, offset=%d", - *bref, maxblocks, + le32_to_cpu(*bref), maxblocks, inode->i_ino, (int)(bref-p)); return -EIO; } -- cgit v0.10.2 From e44543b83bf4ab84dc6bd5b88158c78b1ed1c208 Mon Sep 17 00:00:00 2001 From: Thiemo Nagel Date: Sat, 4 Apr 2009 23:30:44 -0400 Subject: ext4: Fix off-by-one-error in ext4_valid_extent_idx() Signed-off-by: Thiemo Nagel Signed-off-by: "Theodore Ts'o" diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index ac77d8b..6132353 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -342,7 +342,7 @@ static int ext4_valid_extent_idx(struct inode *inode, ext4_fsblk_t block = idx_pblock(ext_idx); struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; if (unlikely(block < le32_to_cpu(es->s_first_data_block) || - (block > ext4_blocks_count(es)))) + (block >= ext4_blocks_count(es)))) return 0; else return 1; -- cgit v0.10.2 From 3ef48fac6e8e2362a4e6ef31dd043c89fe107875 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 5 Apr 2009 12:27:24 +0100 Subject: [ARM] omap: fix omap1 clock usecount decrement bug Same fix as per a7f8c59, but for OMAP1 instead. Signed-off-by: Russell King diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index dafe4f7..336e51d 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c @@ -590,27 +590,28 @@ static void omap1_init_ext_clk(struct clk * clk) static int omap1_clk_enable(struct clk *clk) { int ret = 0; + if (clk->usecount++ == 0) { - if (likely(clk->parent)) { + if (clk->parent) { ret = omap1_clk_enable(clk->parent); - - if (unlikely(ret != 0)) { - clk->usecount--; - return ret; - } + if (ret) + goto err; if (clk->flags & CLOCK_NO_IDLE_PARENT) omap1_clk_deny_idle(clk->parent); } ret = clk->ops->enable(clk); - - if (unlikely(ret != 0) && clk->parent) { - omap1_clk_disable(clk->parent); - clk->usecount--; + if (ret) { + if (clk->parent) + omap1_clk_disable(clk->parent); + goto err; } } + return ret; +err: + clk->usecount--; return ret; } -- cgit v0.10.2 From 556b0f58bbcdc96ba8ed67001b4e57c50198da89 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 10 Jan 2009 14:53:15 +0000 Subject: Revert "fix modules_install via NFS" This reverts commit 8b249b6856f16f09b0e5b79ce5f4d435e439b9d6. This 'fix' is not necessary; we just need to undo the damage caused accidentally by Igor/Mauro in 4b29631db33292d416dc395c56122ea865e7635c ("V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card") Signed-off-by: David Woodhouse diff --git a/firmware/.gitignore b/firmware/.gitignore index f89a21f..d9c6901 100644 --- a/firmware/.gitignore +++ b/firmware/.gitignore @@ -3,3 +3,4 @@ *.bin *.csp *.dsp +ihex2fw diff --git a/firmware/Makefile b/firmware/Makefile index 14fdd07..185c8dc 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -118,10 +118,10 @@ quiet_cmd_ihex = IHEX $@ cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@ quiet_cmd_ihex2fw = IHEX2FW $@ - cmd_ihex2fw = $(objtree)/scripts/ihex2fw $< $@ + cmd_ihex2fw = $(objtree)/$(obj)/ihex2fw $< $@ quiet_cmd_h16tofw = H16TOFW $@ - cmd_h16tofw = $(objtree)/scripts/ihex2fw -w $< $@ + cmd_h16tofw = $(objtree)/$(obj)/ihex2fw -w $< $@ quiet_cmd_fwbin = MK_FW $@ cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \ @@ -184,11 +184,11 @@ $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) # is actually meaningful, because the firmware has to be loaded in a certain # order rather than as a single binary blob. Thus, we convert them into our # more compact binary representation of ihex records () -$(obj)/%.fw: $(obj)/%.HEX | $(objtree)/$(obj)/$$(dir %) +$(obj)/%.fw: $(obj)/%.HEX $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) $(call cmd,ihex2fw) # .H16 is our own modified form of Intel HEX, with 16-bit length for records. -$(obj)/%.fw: $(obj)/%.H16 | $(objtree)/$(obj)/$$(dir %) +$(obj)/%.fw: $(obj)/%.H16 $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) $(call cmd,h16tofw) $(firmware-dirs): @@ -205,3 +205,5 @@ targets := $(fw-shipped-) $(patsubst $(obj)/%,%, \ # Without this, built-in.o won't be created when it's empty, and the # final vmlinux link will fail. obj-n := dummy + +hostprogs-y := ihex2fw diff --git a/firmware/ihex2fw.c b/firmware/ihex2fw.c new file mode 100644 index 0000000..8f7fdaa9 --- /dev/null +++ b/firmware/ihex2fw.c @@ -0,0 +1,268 @@ +/* + * Parser/loader for IHEX formatted data. + * + * Copyright © 2008 David Woodhouse + * Copyright © 2005 Jan Harkes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define _GNU_SOURCE +#include + + +struct ihex_binrec { + struct ihex_binrec *next; /* not part of the real data structure */ + uint32_t addr; + uint16_t len; + uint8_t data[]; +}; + +/** + * nybble/hex are little helpers to parse hexadecimal numbers to a byte value + **/ +static uint8_t nybble(const uint8_t n) +{ + if (n >= '0' && n <= '9') return n - '0'; + else if (n >= 'A' && n <= 'F') return n - ('A' - 10); + else if (n >= 'a' && n <= 'f') return n - ('a' - 10); + return 0; +} + +static uint8_t hex(const uint8_t *data, uint8_t *crc) +{ + uint8_t val = (nybble(data[0]) << 4) | nybble(data[1]); + *crc += val; + return val; +} + +static int process_ihex(uint8_t *data, ssize_t size); +static void file_record(struct ihex_binrec *record); +static int output_records(int outfd); + +static int sort_records = 0; +static int wide_records = 0; + +int usage(void) +{ + fprintf(stderr, "ihex2fw: Convert ihex files into binary " + "representation for use by Linux kernel\n"); + fprintf(stderr, "usage: ihex2fw [] \n"); + fprintf(stderr, " -w: wide records (16-bit length)\n"); + fprintf(stderr, " -s: sort records by address\n"); + return 1; +} + +int main(int argc, char **argv) +{ + int infd, outfd; + struct stat st; + uint8_t *data; + int opt; + + while ((opt = getopt(argc, argv, "ws")) != -1) { + switch (opt) { + case 'w': + wide_records = 1; + break; + case 's': + sort_records = 1; + break; + default: + return usage(); + } + } + + if (optind + 2 != argc) + return usage(); + + if (!strcmp(argv[optind], "-")) + infd = 0; + else + infd = open(argv[optind], O_RDONLY); + if (infd == -1) { + fprintf(stderr, "Failed to open source file: %s", + strerror(errno)); + return usage(); + } + if (fstat(infd, &st)) { + perror("stat"); + return 1; + } + data = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, infd, 0); + if (data == MAP_FAILED) { + perror("mmap"); + return 1; + } + + if (!strcmp(argv[optind+1], "-")) + outfd = 1; + else + outfd = open(argv[optind+1], O_TRUNC|O_CREAT|O_WRONLY, 0644); + if (outfd == -1) { + fprintf(stderr, "Failed to open destination file: %s", + strerror(errno)); + return usage(); + } + if (process_ihex(data, st.st_size)) + return 1; + + output_records(outfd); + return 0; +} + +static int process_ihex(uint8_t *data, ssize_t size) +{ + struct ihex_binrec *record; + uint32_t offset = 0; + uint8_t type, crc = 0, crcbyte = 0; + int i, j; + int line = 1; + int len; + + i = 0; +next_record: + /* search for the start of record character */ + while (i < size) { + if (data[i] == '\n') line++; + if (data[i++] == ':') break; + } + + /* Minimum record length would be about 10 characters */ + if (i + 10 > size) { + fprintf(stderr, "Can't find valid record at line %d\n", line); + return -EINVAL; + } + + len = hex(data + i, &crc); i += 2; + if (wide_records) { + len <<= 8; + len += hex(data + i, &crc); i += 2; + } + record = malloc((sizeof (*record) + len + 3) & ~3); + if (!record) { + fprintf(stderr, "out of memory for records\n"); + return -ENOMEM; + } + memset(record, 0, (sizeof(*record) + len + 3) & ~3); + record->len = len; + + /* now check if we have enough data to read everything */ + if (i + 8 + (record->len * 2) > size) { + fprintf(stderr, "Not enough data to read complete record at line %d\n", + line); + return -EINVAL; + } + + record->addr = hex(data + i, &crc) << 8; i += 2; + record->addr |= hex(data + i, &crc); i += 2; + type = hex(data + i, &crc); i += 2; + + for (j = 0; j < record->len; j++, i += 2) + record->data[j] = hex(data + i, &crc); + + /* check CRC */ + crcbyte = hex(data + i, &crc); i += 2; + if (crc != 0) { + fprintf(stderr, "CRC failure at line %d: got 0x%X, expected 0x%X\n", + line, crcbyte, (unsigned char)(crcbyte-crc)); + return -EINVAL; + } + + /* Done reading the record */ + switch (type) { + case 0: + /* old style EOF record? */ + if (!record->len) + break; + + record->addr += offset; + file_record(record); + goto next_record; + + case 1: /* End-Of-File Record */ + if (record->addr || record->len) { + fprintf(stderr, "Bad EOF record (type 01) format at line %d", + line); + return -EINVAL; + } + break; + + case 2: /* Extended Segment Address Record (HEX86) */ + case 4: /* Extended Linear Address Record (HEX386) */ + if (record->addr || record->len != 2) { + fprintf(stderr, "Bad HEX86/HEX386 record (type %02X) at line %d\n", + type, line); + return -EINVAL; + } + + /* We shouldn't really be using the offset for HEX86 because + * the wraparound case is specified quite differently. */ + offset = record->data[0] << 8 | record->data[1]; + offset <<= (type == 2 ? 4 : 16); + goto next_record; + + case 3: /* Start Segment Address Record */ + case 5: /* Start Linear Address Record */ + if (record->addr || record->len != 4) { + fprintf(stderr, "Bad Start Address record (type %02X) at line %d\n", + type, line); + return -EINVAL; + } + + /* These records contain the CS/IP or EIP where execution + * starts. Don't really know what to do with them. */ + goto next_record; + + default: + fprintf(stderr, "Unknown record (type %02X)\n", type); + return -EINVAL; + } + + return 0; +} + +static struct ihex_binrec *records; + +static void file_record(struct ihex_binrec *record) +{ + struct ihex_binrec **p = &records; + + while ((*p) && (!sort_records || (*p)->addr < record->addr)) + p = &((*p)->next); + + record->next = *p; + *p = record; +} + +static int output_records(int outfd) +{ + unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0}; + struct ihex_binrec *p = records; + + while (p) { + uint16_t writelen = (p->len + 9) & ~3; + + p->addr = htonl(p->addr); + p->len = htons(p->len); + write(outfd, &p->addr, writelen); + p = p->next; + } + /* EOF record is zero length, since we don't bother to represent + the type field in the binary version */ + write(outfd, zeroes, 6); + return 0; +} diff --git a/scripts/.gitignore b/scripts/.gitignore index 09e2406..b939fbd 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,7 +1,6 @@ # # Generated files # -ihex2fw conmakehash kallsyms pnmtologo diff --git a/scripts/Makefile b/scripts/Makefile index 035182e..aafdf06 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -2,12 +2,11 @@ # scripts contains sources for various helper programs used throughout # the kernel for the build process. # --------------------------------------------------------------------------- -# ihex2fw: Parser/loader for IHEX formatted data # kallsyms: Find all symbols in vmlinux # pnmttologo: Convert pnm files to logo files +# conmakehash: Create chartable # conmakehash: Create arrays for initializing the kernel console tables -hostprogs-y := ihex2fw hostprogs-$(CONFIG_KALLSYMS) += kallsyms hostprogs-$(CONFIG_LOGO) += pnmtologo hostprogs-$(CONFIG_VT) += conmakehash diff --git a/scripts/ihex2fw.c b/scripts/ihex2fw.c deleted file mode 100644 index 8f7fdaa9..0000000 --- a/scripts/ihex2fw.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Parser/loader for IHEX formatted data. - * - * Copyright © 2008 David Woodhouse - * Copyright © 2005 Jan Harkes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define _GNU_SOURCE -#include - - -struct ihex_binrec { - struct ihex_binrec *next; /* not part of the real data structure */ - uint32_t addr; - uint16_t len; - uint8_t data[]; -}; - -/** - * nybble/hex are little helpers to parse hexadecimal numbers to a byte value - **/ -static uint8_t nybble(const uint8_t n) -{ - if (n >= '0' && n <= '9') return n - '0'; - else if (n >= 'A' && n <= 'F') return n - ('A' - 10); - else if (n >= 'a' && n <= 'f') return n - ('a' - 10); - return 0; -} - -static uint8_t hex(const uint8_t *data, uint8_t *crc) -{ - uint8_t val = (nybble(data[0]) << 4) | nybble(data[1]); - *crc += val; - return val; -} - -static int process_ihex(uint8_t *data, ssize_t size); -static void file_record(struct ihex_binrec *record); -static int output_records(int outfd); - -static int sort_records = 0; -static int wide_records = 0; - -int usage(void) -{ - fprintf(stderr, "ihex2fw: Convert ihex files into binary " - "representation for use by Linux kernel\n"); - fprintf(stderr, "usage: ihex2fw [] \n"); - fprintf(stderr, " -w: wide records (16-bit length)\n"); - fprintf(stderr, " -s: sort records by address\n"); - return 1; -} - -int main(int argc, char **argv) -{ - int infd, outfd; - struct stat st; - uint8_t *data; - int opt; - - while ((opt = getopt(argc, argv, "ws")) != -1) { - switch (opt) { - case 'w': - wide_records = 1; - break; - case 's': - sort_records = 1; - break; - default: - return usage(); - } - } - - if (optind + 2 != argc) - return usage(); - - if (!strcmp(argv[optind], "-")) - infd = 0; - else - infd = open(argv[optind], O_RDONLY); - if (infd == -1) { - fprintf(stderr, "Failed to open source file: %s", - strerror(errno)); - return usage(); - } - if (fstat(infd, &st)) { - perror("stat"); - return 1; - } - data = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, infd, 0); - if (data == MAP_FAILED) { - perror("mmap"); - return 1; - } - - if (!strcmp(argv[optind+1], "-")) - outfd = 1; - else - outfd = open(argv[optind+1], O_TRUNC|O_CREAT|O_WRONLY, 0644); - if (outfd == -1) { - fprintf(stderr, "Failed to open destination file: %s", - strerror(errno)); - return usage(); - } - if (process_ihex(data, st.st_size)) - return 1; - - output_records(outfd); - return 0; -} - -static int process_ihex(uint8_t *data, ssize_t size) -{ - struct ihex_binrec *record; - uint32_t offset = 0; - uint8_t type, crc = 0, crcbyte = 0; - int i, j; - int line = 1; - int len; - - i = 0; -next_record: - /* search for the start of record character */ - while (i < size) { - if (data[i] == '\n') line++; - if (data[i++] == ':') break; - } - - /* Minimum record length would be about 10 characters */ - if (i + 10 > size) { - fprintf(stderr, "Can't find valid record at line %d\n", line); - return -EINVAL; - } - - len = hex(data + i, &crc); i += 2; - if (wide_records) { - len <<= 8; - len += hex(data + i, &crc); i += 2; - } - record = malloc((sizeof (*record) + len + 3) & ~3); - if (!record) { - fprintf(stderr, "out of memory for records\n"); - return -ENOMEM; - } - memset(record, 0, (sizeof(*record) + len + 3) & ~3); - record->len = len; - - /* now check if we have enough data to read everything */ - if (i + 8 + (record->len * 2) > size) { - fprintf(stderr, "Not enough data to read complete record at line %d\n", - line); - return -EINVAL; - } - - record->addr = hex(data + i, &crc) << 8; i += 2; - record->addr |= hex(data + i, &crc); i += 2; - type = hex(data + i, &crc); i += 2; - - for (j = 0; j < record->len; j++, i += 2) - record->data[j] = hex(data + i, &crc); - - /* check CRC */ - crcbyte = hex(data + i, &crc); i += 2; - if (crc != 0) { - fprintf(stderr, "CRC failure at line %d: got 0x%X, expected 0x%X\n", - line, crcbyte, (unsigned char)(crcbyte-crc)); - return -EINVAL; - } - - /* Done reading the record */ - switch (type) { - case 0: - /* old style EOF record? */ - if (!record->len) - break; - - record->addr += offset; - file_record(record); - goto next_record; - - case 1: /* End-Of-File Record */ - if (record->addr || record->len) { - fprintf(stderr, "Bad EOF record (type 01) format at line %d", - line); - return -EINVAL; - } - break; - - case 2: /* Extended Segment Address Record (HEX86) */ - case 4: /* Extended Linear Address Record (HEX386) */ - if (record->addr || record->len != 2) { - fprintf(stderr, "Bad HEX86/HEX386 record (type %02X) at line %d\n", - type, line); - return -EINVAL; - } - - /* We shouldn't really be using the offset for HEX86 because - * the wraparound case is specified quite differently. */ - offset = record->data[0] << 8 | record->data[1]; - offset <<= (type == 2 ? 4 : 16); - goto next_record; - - case 3: /* Start Segment Address Record */ - case 5: /* Start Linear Address Record */ - if (record->addr || record->len != 4) { - fprintf(stderr, "Bad Start Address record (type %02X) at line %d\n", - type, line); - return -EINVAL; - } - - /* These records contain the CS/IP or EIP where execution - * starts. Don't really know what to do with them. */ - goto next_record; - - default: - fprintf(stderr, "Unknown record (type %02X)\n", type); - return -EINVAL; - } - - return 0; -} - -static struct ihex_binrec *records; - -static void file_record(struct ihex_binrec *record) -{ - struct ihex_binrec **p = &records; - - while ((*p) && (!sort_records || (*p)->addr < record->addr)) - p = &((*p)->next); - - record->next = *p; - *p = record; -} - -static int output_records(int outfd) -{ - unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0}; - struct ihex_binrec *p = records; - - while (p) { - uint16_t writelen = (p->len + 9) & ~3; - - p->addr = htonl(p->addr); - p->len = htons(p->len); - write(outfd, &p->addr, writelen); - p = p->next; - } - /* EOF record is zero length, since we don't bother to represent - the type field in the binary version */ - write(outfd, zeroes, 6); - return 0; -} -- cgit v0.10.2 From 4528e429009325790d94cd4f816b386bea8e8291 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 10 Jan 2009 14:54:48 +0000 Subject: Partially revert "V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card" This reverts a hunk of commit 4b29631db33292d416dc395c56122ea865e7635c which seems to have been an accident, and which re-introduced a previously fixed bug. Signed-off-by: David Woodhouse diff --git a/firmware/Makefile b/firmware/Makefile index 185c8dc..95fb42c 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -180,15 +180,27 @@ $(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/% $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) $(call cmd,ihex) +# Don't depend on ihex2fw if we're installing and it already exists. +# Putting it after | in the dependencies doesn't seem sufficient when +# we're installing after a cross-compile, because ihex2fw has dependencies +# on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and +# thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree +# is exported read-only for someone to run 'make install'. +ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw) +ihex2fw_dep := +else +ihex2fw_dep := $(obj)/ihex2fw +endif + # .HEX is also Intel HEX, but where the offset and length in each record # is actually meaningful, because the firmware has to be loaded in a certain # order rather than as a single binary blob. Thus, we convert them into our # more compact binary representation of ihex records () -$(obj)/%.fw: $(obj)/%.HEX $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) +$(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) $(call cmd,ihex2fw) # .H16 is our own modified form of Intel HEX, with 16-bit length for records. -$(obj)/%.fw: $(obj)/%.H16 $(obj)/ihex2fw | $(objtree)/$(obj)/$$(dir %) +$(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) $(call cmd,h16tofw) $(firmware-dirs): -- cgit v0.10.2 From 9137f05f7e72517d44b6b0c15b11b419ecb5d201 Mon Sep 17 00:00:00 2001 From: Jaswinder Singh Date: Mon, 6 Apr 2009 14:34:12 -0700 Subject: firmware: convert av7110 driver to request_firmware() Signed-off-by: Jaswinder Singh Signed-off-by: David Woodhouse diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c index 3a3f527..5e3f889 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.c +++ b/drivers/media/dvb/ttpci/av7110_hw.c @@ -198,29 +198,10 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len) /* we cannot write av7110 DRAM directly, so load a bootloader into * the DPRAM which implements a simple boot protocol */ -static u8 bootcode[] = { - 0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, 0xe2, 0x5e, 0xf0, 0x04, - 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04, - 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, 0x2c, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a, 0x00, 0x1f, 0x15, 0x55, - 0x00, 0x00, 0x00, 0x09, 0xe5, 0x9f, 0xd0, 0x7c, 0xe5, 0x9f, 0x40, 0x74, - 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x04, - 0xe5, 0x9f, 0x10, 0x70, 0xe5, 0x9f, 0x20, 0x70, 0xe5, 0x9f, 0x30, 0x64, - 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, 0xe1, 0x51, 0x00, 0x02, - 0xda, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xd4, 0x10, 0xb0, - 0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc, 0xe1, 0xa0, 0x10, 0x0d, - 0xe5, 0x94, 0x30, 0x04, 0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f, - 0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02, 0xe1, 0xc4, 0x00, 0xb0, - 0x0a, 0xff, 0xff, 0xf4, 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, - 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, 0xe2, 0x52, 0x20, 0x01, - 0x1a, 0xff, 0xff, 0xf9, 0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec, - 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00, 0x9e, 0x00, 0x08, 0x00, - 0x2c, 0x00, 0x00, 0x74, 0x2c, 0x00, 0x00, 0xc0 -}; - int av7110_bootarm(struct av7110 *av7110) { + const struct firmware *fw; + const char *fw_name = "av7110/bootcode.bin"; struct saa7146_dev *dev = av7110->dev; u32 ret; int i; @@ -261,7 +242,15 @@ int av7110_bootarm(struct av7110 *av7110) //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT); //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT); - mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode)); + ret = request_firmware(&fw, fw_name, &dev->pci->dev); + if (ret) { + printk(KERN_ERR "dvb-ttpci: Failed to load firmware \"%s\"\n", + fw_name); + return ret; + } + + mwdebi(av7110, DEBISWAB, DPRAM_BASE, fw->data, fw->size); + release_firmware(fw); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); if (saa7146_wait_for_debi_done(av7110->dev, 1)) { @@ -302,7 +291,7 @@ int av7110_bootarm(struct av7110 *av7110) av7110->arm_ready = 1; return 0; } - +MODULE_FIRMWARE("av7110/bootcode.bin"); /**************************************************************************** * DEBI command polling diff --git a/drivers/media/dvb/ttpci/av7110_hw.h b/drivers/media/dvb/ttpci/av7110_hw.h index ca99e5c..1634aba 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.h +++ b/drivers/media/dvb/ttpci/av7110_hw.h @@ -390,7 +390,8 @@ static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, } /* buffer writes */ -static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, u8 *val, int count) +static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, + const u8 *val, int count) { memcpy(av7110->debi_virt, val, count); av7110_debiwrite(av7110, config, addr, 0, count); diff --git a/firmware/Makefile b/firmware/Makefile index 95fb42c..4267f68 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -37,6 +37,7 @@ fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ cxgb3/t3c_psram-1.1.0.bin \ cxgb3/t3fw-7.1.0.bin +fw-shipped-$(CONFIG_DVB_AV7110) += av7110/bootcode.bin fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ e100/d102e_ucode.bin diff --git a/firmware/WHENCE b/firmware/WHENCE index c006af8..c0a7c8f 100644 --- a/firmware/WHENCE +++ b/firmware/WHENCE @@ -632,3 +632,13 @@ Licence: Unknown Found in hex form in kernel source. -------------------------------------------------------------------------- + +Driver: DVB AV7110 -- AV7110 cards + +File: av7110/bootcode.bin + +Licence: GPLv2 or later + +ARM assembly source code available at http://www.linuxtv.org/downloads/firmware/Boot.S + +-------------------------------------------------------------------------- diff --git a/firmware/av7110/Boot.S b/firmware/av7110/Boot.S new file mode 100644 index 0000000..d562fdc --- /dev/null +++ b/firmware/av7110/Boot.S @@ -0,0 +1,109 @@ +/* + Boot.S: boot loader for Siemens DVB-S card + + Copyright (C) 2001 Convergence integrated media GmbH + Written by Ralph Metzler + + Copyright (C) 2006 Matthieu CASTET + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + +*/ + +/* + check AV711x_3_1.pdf for some hardware infos + build it with : + $ cc -mbig-endian -c Boot.S + $ ld -Ttext 0x2c000000 -EB -o Boot Boot.o + $ objcopy -Obinary Boot +*/ + + .text + .align + .globl _start +_start: + b reset // reset vector + movs pc, r14 // undefined + subs pc, r14, #4 // SWI + subs pc, r14, #4 // prefetch abort + subs pc, r14, #8 // data abort + subs pc, r14, #4 // reserved + subs pc, r14, #4 // IRQ + subs pc, r14, #4 // FIQ + + .word tbl // table needed by firmware ROM +tbl: .word (endtbl - tbl) + .word 0 + .word conf +endtbl: .word 0 +conf: .word 0xa5a55a5a + .word 0x001f1555 + .word 0x00000009 + +reset: ldr r13, buffer + ldr r4, flag + mov r0, #0 + str r0, [r4] + str r0, [r4, #4] + + ldr r1, wait_address + ldr r2, flag_address + ldr r3, sram + +copycode: // copy the code HW Sram + ldmia r1!, {r5-r12} + stmia r3!, {r5-r12} + cmp r1, r2 + ble copycode + ldr pc, sram // jump to the copied code + +wait: ldrh r1, [r4] // wait for flag!=0 + cmp r1, #0 + beq wait + + mov r1, r13 // buffer address + ldr r3, [r4,#4] // destaddr + + ldrh r2, [r4,#2] // get segment length + add r2, r2, #63 // round length to next 64 bytes + movs r2, r2, lsr #6 // and divide by 64 + moveq r0, #2 // if 0, set flag to 2, else signal + strh r0, [r4] // that buffer is accepted by setting to 0 + beq wait + +copyloop: + ldmia r1!, {r5-r12} + stmia r3!, {r5-r12} + ldmia r1!, {r5-r12} + stmia r3!, {r5-r12} + subs r2, r2, #1 + bne copyloop + + eor r13, r13, #0x1400 // switch to other buffer + b wait + +// flag is stored at 0x2c0003f8, length at 0x2c0003fa, +// destaddr at 0x2c0003fc + +flag: .word 0x2c0003f8 + + +// buffer 1 is at 0x2c000400, buffer 2 at 0x2c001000 + +buffer: .word 0x2c000400 + +sram: .word 0x9e000800 +wait_address: .word wait +flag_address: .word flag diff --git a/firmware/av7110/bootcode.bin.ihex b/firmware/av7110/bootcode.bin.ihex new file mode 100644 index 0000000..26a2993 --- /dev/null +++ b/firmware/av7110/bootcode.bin.ihex @@ -0,0 +1,15 @@ +:10000000EA00000EE1B0F00EE25EF004E25EF00401 +:10001000E25EF008E25EF004E25EF004E25EF0040C +:100020002C0000240000000C000000002C00003414 +:1000300000000000A5A55A5A001F15550000000930 +:10004000E59FD07CE59F4074E3A00000E5840000BC +:10005000E5840004E59F1070E59F2070E59F306403 +:10006000E8B11FE0E8A31FE0E1510002DAFFFFFB67 +:10007000E59FF050E1D410B0E35100000AFFFFFC0F +:10008000E1A0100DE5943004E1D420B2E282203FDB +:10009000E1B0232203A00002E1C400B00AFFFFF494 +:1000A000E8B11FE0E8A31FE0E8B11FE0E8A31FE00C +:1000B000E25220011AFFFFF9E22DDB05EAFFFFEC17 +:1000C0002C0003F82C0004009E0008002C00007493 +:0400D0002C0000C040 +:00000001FF -- cgit v0.10.2 From 4f8d182513690b42b20fb81e487be4cd4729e27c Mon Sep 17 00:00:00 2001 From: Jaswinder Singh Date: Sun, 22 Jun 2008 18:24:19 +0530 Subject: Remove fdump tool for av7110 firmware There's no point in this, since the user can use the BUILTIN_FIRMWARE option to include arbitrary firmware files directly in the kernel image. Thanks to David Woodhouse for help. Signed-off-by: Jaswinder Singh Signed-off-by: David Woodhouse diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index 7729904..68eb449 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig @@ -28,25 +28,12 @@ config DVB_AV7110 download/extract it, and then copy it to /usr/lib/hotplug/firmware or /lib/firmware (depending on configuration of firmware hotplug). - Say Y if you own such a card and want to use it. - -config DVB_AV7110_FIRMWARE - bool "Compile AV7110 firmware into the driver" - depends on DVB_AV7110 && !STANDALONE - default y if DVB_AV7110=y - help - The AV7110 firmware is normally loaded by the firmware hotplug manager. - If you want to compile the firmware into the driver you need to say - Y here and provide the correct path of the firmware. You need this - option if you want to compile the whole driver statically into the - kernel. + Alternatively, you can download the file and use the kernel's + EXTRA_FIRMWARE configuration option to build it into your + kernel image by adding the filename to the EXTRA_FIRMWARE + configuration option string. - All other people say N. - -config DVB_AV7110_FIRMWARE_FILE - string "Full pathname of av7110 firmware file" - depends on DVB_AV7110_FIRMWARE - default "/usr/lib/hotplug/firmware/dvb-ttpci-01.fw" + Say Y if you own such a card and want to use it. config DVB_AV7110_OSD bool "AV7110 OSD support" diff --git a/drivers/media/dvb/ttpci/Makefile b/drivers/media/dvb/ttpci/Makefile index 7145123..8a4d5bb 100644 --- a/drivers/media/dvb/ttpci/Makefile +++ b/drivers/media/dvb/ttpci/Makefile @@ -19,12 +19,3 @@ obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ EXTRA_CFLAGS += -Idrivers/media/common/tuners - -hostprogs-y := fdump - -ifeq ($(CONFIG_DVB_AV7110_FIRMWARE),y) -$(obj)/av7110.o: $(obj)/av7110_firm.h - -$(obj)/av7110_firm.h: $(obj)/fdump - $(obj)/fdump $(CONFIG_DVB_AV7110_FIRMWARE_FILE) dvb_ttpci_fw $@ -endif diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 4624cee..d1d959e 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c @@ -1518,20 +1518,6 @@ static int check_firmware(struct av7110* av7110) return 0; } -#ifdef CONFIG_DVB_AV7110_FIRMWARE_FILE -#include "av7110_firm.h" -static void put_firmware(struct av7110* av7110) -{ - av7110->bin_fw = NULL; -} - -static inline int get_firmware(struct av7110* av7110) -{ - av7110->bin_fw = dvb_ttpci_fw; - av7110->size_fw = sizeof(dvb_ttpci_fw); - return check_firmware(av7110); -} -#else static void put_firmware(struct av7110* av7110) { vfree(av7110->bin_fw); @@ -1580,8 +1566,6 @@ static int get_firmware(struct av7110* av7110) release_firmware(fw); return ret; } -#endif - static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params) { diff --git a/drivers/media/dvb/ttpci/fdump.c b/drivers/media/dvb/ttpci/fdump.c deleted file mode 100644 index c90001d..0000000 --- a/drivers/media/dvb/ttpci/fdump.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - unsigned char buf[8]; - unsigned int i, count, bytes = 0; - FILE *fd_in, *fd_out; - - if (argc != 4) { - fprintf(stderr, "\n\tusage: %s \n\n", argv[0]); - return -1; - } - - fd_in = fopen(argv[1], "rb"); - if (fd_in == NULL) { - fprintf(stderr, "firmware file '%s' not found\n", argv[1]); - return -1; - } - - fd_out = fopen(argv[3], "w+"); - if (fd_out == NULL) { - fprintf(stderr, "cannot create output file '%s'\n", argv[3]); - return -1; - } - - fprintf(fd_out, "\n#include \n\nu8 %s [] = {", argv[2]); - - while ((count = fread(buf, 1, 8, fd_in)) > 0) { - fprintf(fd_out, "\n\t"); - for (i = 0; i < count; i++, bytes++) - fprintf(fd_out, "0x%02x, ", buf[i]); - } - - fprintf(fd_out, "\n};\n\n"); - - fclose(fd_in); - fclose(fd_out); - - return 0; -} -- cgit v0.10.2 From 7c7cae17e04765692aa3d2bda5c771f909219f27 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 6 Apr 2009 14:38:43 -0700 Subject: ALSA: wavefront - Always use request_firmware() Always use request_firmware() for loading yss225_registers image. Signed-off-by: Takashi Iwai Signed-off-by: David Woodhouse diff --git a/firmware/Makefile b/firmware/Makefile index 4267f68..a19e579 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -63,6 +63,7 @@ fw-shipped-$(CONFIG_SXG) += sxg/saharadownloadB.sys \ sxg/saharadbgdownloadB.sys fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \ yamaha/ds1e_ctrl.fw +fw-shipped-$(CONFIG_SND_WAVEFRONT) += yamaha/yss225_registers.bin fw-shipped-$(CONFIG_TEHUTI) += tehuti/bdx.bin fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \ tigon/tg3_tso5.bin diff --git a/firmware/WHENCE b/firmware/WHENCE index c0a7c8f..ff41dbf 100644 --- a/firmware/WHENCE +++ b/firmware/WHENCE @@ -642,3 +642,15 @@ Licence: GPLv2 or later ARM assembly source code available at http://www.linuxtv.org/downloads/firmware/Boot.S -------------------------------------------------------------------------- + +Driver: wavefront - ISA WaveFront sound card + +File: yamaha/yss225_registers.bin + +Licence: Allegedly GPLv2+, but no source visible. + +Found in hex form in kernel source, with the following comment: + Copyright (c) 1998-2002 by Paul Davis + + +-------------------------------------------------------------------------- diff --git a/firmware/yamaha/yss225_registers.bin.ihex b/firmware/yamaha/yss225_registers.bin.ihex new file mode 100644 index 0000000..6dd3d8c --- /dev/null +++ b/firmware/yamaha/yss225_registers.bin.ihex @@ -0,0 +1,998 @@ +:10000000FF000E100F00FF000E110F00FF000E1278 +:100010000F00FF000E130F00FF000E140F00FF0073 +:100020000E150F00FF000E160F00FF000E170F0039 +:10003000FF000E180F00FF000E190F00FF000E1A30 +:100040000F00FF000E1B0F00FF000E1C0F00FF0033 +:100050000E1D0F00FF000E1E0F00FF000E1F0F00F1 +:10006000FF000E200F00FF000E210F00FF000E22E8 +:100070000F00FF000E230F00FF000E240F00FF00F3 +:100080000E250F00FF000E260F00FF000E270F00A9 +:10009000FF000E280F00FF000E290F00FF000E2AA0 +:1000A0000F00FF000E2B0F00FF000E2C0F00FF00B3 +:1000B0000E2D0F00FF000E2E0F00FF000E2F0F0061 +:1000C000FF000E300F00FF000E310F00FF000E3258 +:1000D0000F00FF000E330F00FF000E340F00FF0073 +:1000E0000E350F00FF000E360F00FF000E370F0019 +:1000F000FF000E380F00FF000E390F00FF000E3A10 +:100100000F00FF000E3B0F00FF000E3C0F00FF0032 +:100110000E3D0F00FF000E3E0F00FF000E3F0F00D0 +:10012000FF000E400F00FF000E410F00FF000E42C7 +:100130000F00FF000E430F00FF000E440F00FF00F2 +:100140000E450F00FF000E460F00FF000E470F0088 +:10015000FF000E480F00FF000E490F00FF000E4A7F +:100160000F00FF000E4B0F00FF000E4C0F00FF00B2 +:100170000E4D0F00FF000E4E0F00FF000E4F0F0040 +:10018000FF000E500F00FF000E510F00FF000E5237 +:100190000F00FF000E530F00FF000E540F00FF0072 +:1001A0000E550F00FF000E560F00FF000E570F00F8 +:1001B000FF000E580F00FF000E590F00FF000E5AEF +:1001C0000F00FF000E5B0F00FF000E5C0F00FF0032 +:1001D0000E5D0F00FF000E5E0F00FF000E5F0F00B0 +:1001E000FF000E600F00FF000E610F00FF000E62A7 +:1001F0000F00FF000E630F00FF000E640F00FF00F2 +:100200000E650F00FF000E660F00FF000E670F0067 +:10021000FF000E680F00FF000E690F00FF000E6A5E +:100220000F00FF000E6B0F00FF000E6C0F00FF00B1 +:100230000E6D0F00FF000E6E0F00FF000E6F0F001F +:10024000FF000E700F00FF000E710F00FF000E7216 +:100250000F00FF000E730F00FF000E740F00FF0071 +:100260000E750F00FF000E760F00FF000E770F00D7 +:10027000FF000E780F00FF000E790F00FF000E7ACE +:100280000F00FF000E7B0F00FF000E7C0F00FF0031 +:100290000E7D0F00FF000E7E0F00FF000E7F0F008F +:1002A000FF000E800F00FF000E810F00FF000E8286 +:1002B0000F00FF000E830F00FF000E840F00FF00F1 +:1002C0000E850F00FF000E860F00FF000E870F0047 +:1002D000FF000E880F00FF000E890F00FF000E8A3E +:1002E0000F00FF000E8B0F00FF000E8C0F00FF00B1 +:1002F0000E8D0F00FF000E8E0F00FF000E8F0F00FF +:10030000FF000E900F00FF000E910F00FF000E92F5 +:100310000F00FF000E930F00FF000E940F00FF0070 +:100320000E950F00FF000E960F00FF000E970F00B6 +:10033000FF000E980F00FF000E990F00FF000E9AAD +:100340000F00FF000E9B0F00FF000E9C0F00FF0030 +:100350000E9D0F00FF000E9E0F00FF000E9F0F006E +:10036000FF000EA00F00FF000EA10F00FF000EA265 +:100370000F00FF000EA30F00FF000EA40F00FF00F0 +:100380000EA50F00FF000EA60F00FF000EA70F0026 +:10039000FF000EA80F00FF000EA90F00FF000EAA1D +:1003A0000F00FF000EAB0F00FF000EAC0F00FF00B0 +:1003B0000EAD0F00FF000EAE0F00FF000EAF0F00DE +:1003C000FF000EB00F00FF000EB10F00FF000EB2D5 +:1003D0000F00FF000EB30F00FF000EB40F00FF0070 +:1003E0000EB50F00FF000EB60F00FF000EB70F0096 +:1003F000FF000EB80F00FF000EB90F00FF000EBA8D +:100400000F00FF000EBB0F00FF000EBC0F00FF002F +:100410000EBD0F00FF000EBE0F00FF000EBF0F004D +:10042000FF000EC00F00FF000EC10F00FF000EC244 +:100430000F00FF000EC30F00FF000EC40F00FF00EF +:100440000EC50F00FF000EC60F00FF000EC70F0005 +:10045000FF000EC80F00FF000EC90F00FF000ECAFC +:100460000F00FF000ECB0F00FF000ECC0F00FF00AF +:100470000ECD0F00FF000ECE0F00FF000ECF0F00BD +:10048000FF000ED00F00FF000ED10F00FF000ED2B4 +:100490000F00FF000ED30F00FF000ED40F00FF006F +:1004A0000ED50F00FF000ED60F00FF000ED70F0075 +:1004B000FF000ED80F00FF000ED90F00FF000EDA6C +:1004C0000F00FF000EDB0F00FF000EDC0F00FF002F +:1004D0000EDD0F00FF000EDE0F00FF000EDF0F002D +:1004E000FF000EE00F00FF000EE10F00FF000EE224 +:1004F0000F00FF000EE30F00FF000EE40F00FF00EF +:100500000EE50F00FF000EE60F00FF000EE70F00E4 +:10051000FF000EE80F00FF000EE90F00FF000EEADB +:100520000F00FF000EEB0F00FF000EEC0F00FF00AE +:100530000EED0F00FF000EEE0F00FF000EEF0F009C +:10054000FF000EF00F00FF000EF10F00FF000EF293 +:100550000F00FF000EF30F00FF000EF40F00FF006E +:100560000EF50F00FF000EF60F00FF000EF70F0054 +:10057000FF000EF80F00FF000EF90F00FF000EFA4B +:100580000F00FF000EFB0F00FF000EFC0F00FF002E +:100590000EFD0F00FF000EFE0F00FF000EFF0F000C +:1005A000FF000E100F00FF000E110F00FF000E12D3 +:1005B0000F00FF000E130F00FF000E140F00FF00CE +:1005C0000E150F00FF000E160F00FF000E170F0094 +:1005D000FF000E180F00FF000E190F00FF000E1A8B +:1005E0000F00FF000E1B0F00FF000E1C0F00FF008E +:1005F0000E1D0F00FF000E1E0F00FF000E1F0F004C +:10060000FF000E200F00FF000E210F00FF000E2242 +:100610000F00FF000E230F00FF000E240F00FF004D +:100620000E250F00FF000E260F00FF000E270F0003 +:10063000FF000E280F00FF000E290F00FF000E2AFA +:100640000F00FF000E2B0F00FF000E2C0F00FF000D +:100650000E2D0F00FF000E2E0F00FF000E2F0F00BB +:10066000FF000E300F00FF000E310F00FF000E32B2 +:100670000F00FF000E330F00FF000E340F00FF00CD +:100680000E350F00FF000E360F00FF000E370F0073 +:10069000FF000E380F00FF000E390F00FF000E3A6A +:1006A0000F00FF000E3B0F00FF000E3C0F00FF008D +:1006B0000E3D0F00FF000E3E0F00FF000E3F0F002B +:1006C000FF000E400F00FF000E410F00FF000E4222 +:1006D0000F00FF000E430F00FF000E440F00FF004D +:1006E0000E450F00FF000E460F00FF000E470F00E3 +:1006F000FF000E480F00FF000E490F00FF000E4ADA +:100700000F00FF000E4B0F00FF000E4C0F00FF000C +:100710000E4D0F00FF000E4E0F00FF000E4F0F009A +:10072000FF000E500F00FF000E510F00FF000E5291 +:100730000F00FF000E530F00FF000E540F00FF00CC +:100740000E550F00FF000E560F00FF000E570F0052 +:10075000FF000E580F00FF000E590F00FF000E5A49 +:100760000F00FF000E5B0F00FF000E5C0F00FF008C +:100770000E5D0F00FF000E5E0F00FF000E5F0F000A +:10078000FF000E600F00FF000E610F00FF000E6201 +:100790000F00FF000E630F00FF000E640F00FF004C +:1007A0000E650F00FF000E660F00FF000E670F00C2 +:1007B000FF000E680F00FF000E690F00FF000E6AB9 +:1007C0000F00FF000E6B0F00FF000E6C0F00FF000C +:1007D0000E6D0F00FF000E6E0F00FF000E6F0F007A +:1007E000FF000E700F00FF000E710F00FF000E7271 +:1007F0000F00FF000E730F00FF000E740F00FF00CC +:100800000E750F00FF000E760F00FF000E770F0031 +:10081000FF000E780F00FF000E790F00FF000E7A28 +:100820000F00FF000E7B0F00FF000E7C0F00FF008B +:100830000E7D0F00FF000E7E0F00FF000E7F0F00E9 +:10084000FF000E800F00FF000E810F00FF000E82E0 +:100850000F00FF000E830F00FF000E840F00FF004B +:100860000E850F00FF000E860F00FF000E870F00A1 +:10087000FF000E880F00FF000E890F00FF000E8A98 +:100880000F00FF000E8B0F00FF000E8C0F00FF000B +:100890000E8D0F00FF000E8E0F00FF000E8F0F0059 +:1008A000FF000E900F00FF000E910F00FF000E9250 +:1008B0000F00FF000E930F00FF000E940F00FF00CB +:1008C0000E950F00FF000E960F00FF000E970F0011 +:1008D000FF000E980F00FF000E990F00FF000E9A08 +:1008E0000F00FF000E9B0F00FF000E9C0F00FF008B +:1008F0000E9D0F00FF000E9E0F00FF000E9F0F00C9 +:10090000FF000EA00F00FF000EA10F00FF000EA2BF +:100910000F00FF000EA30F00FF000EA40F00FF004A +:100920000EA50F00FF000EA60F00FF000EA70F0080 +:10093000FF000EA80F00FF000EA90F00FF000EAA77 +:100940000F00FF000EAB0F00FF000EAC0F00FF000A +:100950000EAD0F00FF000EAE0F00FF000EAF0F0038 +:10096000FF000EB00F00FF000EB10F00FF000EB22F +:100970000F00FF000EB30F00FF000EB40F00FF00CA +:100980000EB50F00FF000EB60F00FF000EB70F00F0 +:10099000FF000EB80F00FF000EB90F00FF000EBAE7 +:1009A0000F00FF000EBB0F00FF000EBC0F00FF008A +:1009B0000EBD0F00FF000EBE0F00FF000EBF0F00A8 +:1009C000FF000EC00F00FF000EC10F00FF000EC29F +:1009D0000F00FF000EC30F00FF000EC40F00FF004A +:1009E0000EC50F00FF000EC60F00FF000EC70F0060 +:1009F000FF000EC80F00FF000EC90F00FF000ECA57 +:100A00000F00FF000ECB0F00FF000ECC0F00FF0009 +:100A10000ECD0F00FF000ECE0F00FF000ECF0F0017 +:100A2000FF000ED00F00FF000ED10F00FF000ED20E +:100A30000F00FF000ED30F00FF000ED40F00FF00C9 +:100A40000ED50F00FF000ED60F00FF000ED70F00CF +:100A5000FF000ED80F00FF000ED90F00FF000EDAC6 +:100A60000F00FF000EDB0F00FF000EDC0F00FF0089 +:100A70000EDD0F00FF000EDE0F00FF000EDF0F0087 +:100A8000FF000EE00F00FF000EE10F00FF000EE27E +:100A90000F00FF000EE30F00FF000EE40F00FF0049 +:100AA0000EE50F00FF000EE60F00FF000EE70F003F +:100AB000FF000EE80F00FF000EE90F00FF000EEA36 +:100AC0000F00FF000EEB0F00FF000EEC0F00FF0009 +:100AD0000EED0F00FF000EEE0F00FF000EEF0F00F7 +:100AE000FF000EF00F00FF000EF10F00FF000EF2EE +:100AF0000F00FF000EF30F00FF000EF40F00FF00C9 +:100B00000EF50F00FF000EF60F00FF000EF70F00AE +:100B1000FF000EF80F00FF000EF90F00FF000EFAA5 +:100B20000F00FF000EFB0F00FF000EFC0F00FF0088 +:100B30000EFD0F00FF000EFE0F00FF000EFF0F0066 +:100B4000FF000802FF000B070A440D000C00FF0025 +:100B50000B070A420D000C00FF000B070A430D00B3 +:100B60000C00FF000B070A7C0D000C00FF000B07B8 +:100B70000A7E0D000C00FF000B070A460D000C005A +:100B8000FF000B070A490D000C00FF000B070A4786 +:100B90000D000C00FF000B070A4A0D000C00FF00BF +:100BA0000E100F00FF000E110F00FF000E120F00BD +:100BB000FF000E130F00FF000E140F00FF000E15B4 +:100BC0000F00FF000E160F00FF000E170F00FF00B2 +:100BD0000E180F00FF000E190F00FF000E1A0F0075 +:100BE000FF000E1B0F00FF000E1C0F00FF000E1D6C +:100BF0000F00FF000E1E0F00FF000E1F0F00FF0072 +:100C00000E200F00FF000E210F00FF000E220F002C +:100C1000FF000E230F00FF000E240F00FF000E2523 +:100C20000F00FF000E260F00FF000E270F00FF0031 +:100C30000E280F00FF000E290F00FF000E2A0F00E4 +:100C4000FF000E2B0F00FF000E2C0F00FF000E2DDB +:100C50000F00FF000E2E0F00FF000E2F0F00FF00F1 +:100C60000E300F00FF000E310F00FF000E320F009C +:100C7000FF000E330F00FF000E340F00FF000E3593 +:100C80000F00FF000E360F00FF000E370F00FF00B1 +:100C90000E380F00FF000E390F00FF000E3A0F0054 +:100CA000FF000E3B0F00FF000E3C0F00FF000E3D4B +:100CB0000F00FF000E3E0F00FF000E3F0F00FF0071 +:100CC0000E400F00FF000E410F00FF000E420F000C +:100CD000FF000E430F00FF000E440F00FF000E4503 +:100CE0000F00FF000E460F00FF000E470F00FF0031 +:100CF0000E480F00FF000E490F00FF000E4A0F00C4 +:100D0000FF000E4B0F00FF000E4C0F00FF000E4DBA +:100D10000F00FF000E4E0F00FF000E4F0F00FF00F0 +:100D20000E500F00FF000E510F00FF000E520F007B +:100D3000FF000E530F00FF000E540F00FF000E5572 +:100D40000F00FF000E560F00FF000E570F00FF00B0 +:100D50000E580F00FF000E590F00FF000E5A0F0033 +:100D6000FF000E5B0F00FF000E5C0F00FF000E5D2A +:100D70000F00FF000E5E0F00FF000E5F0F00FF0070 +:100D80000E600F00FF000E610F00FF000E620F00EB +:100D9000FF000E630F00FF000E640F00FF000E65E2 +:100DA0000F00FF000E660F00FF000E670F00FF0030 +:100DB0000E680F00FF000E690F00FF000E6A0F00A3 +:100DC000FF000E6B0F00FF000E6C0F00FF000E6D9A +:100DD0000F00FF000E6E0F00FF000E6F0F00FF00F0 +:100DE0000E700F00FF000E710F00FF000E720F005B +:100DF000FF000E730F00FF000E740F00FF000E7552 +:100E00000F00FF000E760F00FF000E770F00FF00AF +:100E10000E780F00FF000E790F00FF000E7A0F0012 +:100E2000FF000E7B0F00FF000E7C0F00FF000E7D09 +:100E30000F00FF000E7E0F00FF000E7F0F00FF006F +:100E40000E800F00FF000E810F00FF000E820F00CA +:100E5000FF000E830F00FF000E840F00FF000E85C1 +:100E60000F00FF000E860F00FF000E870F00FF002F +:100E70000E880F00FF000E890F00FF000E8A0F0082 +:100E8000FF000E8B0F00FF000E8C0F00FF000E8D79 +:100E90000F00FF000E8E0F00FF000E8F0F00FF00EF +:100EA0000E900F00FF000E910F00FF000E920F003A +:100EB000FF000E930F00FF000E940F00FF000E9531 +:100EC0000F00FF000E960F00FF000E970F00FF00AF +:100ED0000E980F00FF000E990F00FF000E9A0F00F2 +:100EE000FF000E9B0F00FF000E9C0F00FF000E9DE9 +:100EF0000F00FF000E9E0F00FF000E9F0F00FF006F +:100F00000EA00F00FF000EA10F00FF000EA20F00A9 +:100F1000FF000EA30F00FF000EA40F00FF000EA5A0 +:100F20000F00FF000EA60F00FF000EA70F00FF002E +:100F30000EA80F00FF000EA90F00FF000EAA0F0061 +:100F4000FF000EAB0F00FF000EAC0F00FF000EAD58 +:100F50000F00FF000EAE0F00FF000EAF0F00FF00EE +:100F60000EB00F00FF000EB10F00FF000EB20F0019 +:100F7000FF000EB30F00FF000EB40F00FF000EB510 +:100F80000F00FF000EB60F00FF000EB70F00FF00AE +:100F90000EB80F00FF000EB90F00FF000EBA0F00D1 +:100FA000FF000EBB0F00FF000EBC0F00FF000EBDC8 +:100FB0000F00FF000EBE0F00FF000EBF0F00FF006E +:100FC0000EC00F00FF000EC10F00FF000EC20F0089 +:100FD000FF000EC30F00FF000EC40F00FF000EC580 +:100FE0000F00FF000EC60F00FF000EC70F00FF002E +:100FF0000EC80F00FF000EC90F00FF000ECA0F0041 +:10100000FF000ECB0F00FF000ECC0F00FF000ECD37 +:101010000F00FF000ECE0F00FF000ECF0F00FF00ED +:101020000ED00F00FF000ED10F00FF000ED20F00F8 +:10103000FF000ED30F00FF000ED40F00FF000ED5EF +:101040000F00FF000ED60F00FF000ED70F00FF00AD +:101050000ED80F00FF000ED90F00FF000EDA0F00B0 +:10106000FF000EDB0F00FF000EDC0F00FF000EDDA7 +:101070000F00FF000EDE0F00FF000EDF0F00FF006D +:101080000EE00F00FF000EE10F00FF000EE20F0068 +:10109000FF000EE30F00FF000EE40F00FF000EE55F +:1010A0000F00FF000EE60F00FF000EE70F00FF002D +:1010B0000EE80F00FF000EE90F00FF000EEA0F0020 +:1010C000FF000EEB0F00FF000EEC0F00FF000EED17 +:1010D0000F00FF000EEE0F00FF000EEF0F00FF00ED +:1010E0000EF00F00FF000EF10F00FF000EF20F00D8 +:1010F000FF000EF30F00FF000EF40F00FF000EF5CF +:101100000F00FF000EF60F00FF000EF70F00FF00AC +:101110000EF80F00FF000EF90F00FF000EFA0F008F +:10112000FF000EFB0F00FF000EFC0F00FF000EFD86 +:101130000F00FF000EFE0F00FF000EFF0F0009055D +:101140000B000A000D010C7CFF000D000C1EFF00BF +:101150000D000C00FF000D000C00FF000D000CF551 +:10116000FF000D000C11FF000D000C20FF000D0012 +:101170000C32FF000D000C40FF000D000C13FF00AF +:101180000D000C00FF000D000C14FF000D020C768A +:10119000FF000D000C60FF000D000C80FF000D0231 +:1011A0000C00FF000D000C00FF000D000C00FF0004 +:1011B0000D020C00FF000D000C00FF000D000C00E4 +:1011C000FF000D000C00FF000D000C00FF000D00E3 +:1011D0000C00FF000D000C00FF000D000C00FF00D4 +:1011E0000D000C00FF000D000C00FF000D000C00B6 +:1011F000FF000D000C00FF000D000C00FF000D00B3 +:101200000C00FF000D000C00FF000D000C00FF00A3 +:101210000D000C00FF000D000C00FF000D000C0085 +:10122000FF000D000C00FF000D000C00FF000D0082 +:101230000C00FF000D000C00FF000D000C00FF0073 +:101240000D000C00FF000D000C00FF000D000C0055 +:10125000FF000D000C00FF000D000C00FF000D0052 +:101260000C00FF000D000C00FF000D000C00FF0043 +:101270000D000C00FF000D000C00FF000D000C0025 +:10128000FF000D000C00FF000D000C00FF000D0022 +:101290000C00FF000D000C00FF000D000C00FF0013 +:1012A0000D000C00FF000D000C00FF000D000C00F5 +:1012B000FF000D000C00FF000D000C00FF000D00F2 +:1012C0000C00FF000D000C18FF000D000C19FF00B2 +:1012D0000D010C1AFF000D010C20FF000D010C4048 +:1012E000FF000D010C17FF000D000C00FF000D01A9 +:1012F0000C80FF000D010C20FF000D000C10FF0002 +:101300000D010CA0FF000D030CD1FF000D000C001F +:10131000FF000D010CF2FF000D020C00FF000D009C +:101320000C13FF000D000C00FF000D000CF4FF007B +:101330000D020CE0FF000D000C15FF000D000C006D +:10134000FF000D000C16FF000D000C00FF000D004B +:101350000C17FF000D000C20FF000D000C00FF001B +:101360000D000C20FF000D000C50FF000D000C00C4 +:10137000FF000D000C40FF000D000C00FF000D00F1 +:101380000C71FF000D020C00FF000D000C60FF004F +:101390000D000C00FF000D000C92FF000D000C0072 +:1013A000FF000D000C80FF000D000C00FF000D0081 +:1013B0000CB3FF000D020C00FF000D000CA0FF009D +:1013C0000D000C00FF000D000CD4FF000D000C0000 +:1013D000FF000D000C40FF000D000C80FF000D0011 +:1013E0000CF5FF000D000C20FF000D000C70FF003D +:1013F0000D000CA0FF000D020C11FF000D000C16DB +:10140000FF000D000C00FF000D000C00FF000D00A0 +:101410000C00FF000D000C20FF000D020C00FF006F +:101420000D000C20FF000D000C10FF000D000C172C +:10143000FF000D000C1BFF000D000C1DFF000D0236 +:101440000CDFFF0009050B010A000D000C00FF0076 +:101450000D000C00FF000D000C00FF000D020C0041 +:10146000FF000D000C19FF000D000C1FFF000D0008 +:101470000C00FF000D000C00FF000D000C00FF0031 +:101480000D030CD8FF000D000C00FF000D020C2016 +:10149000FF000D000C19FF000D000C00FF000D00F7 +:1014A0000C00FF000D000C18FF000D010CC0FF0028 +:1014B0000D010CFAFF000D000C1AFF000D000C00CE +:1014C000FF000D000C00FF000D000C00FF000D00E0 +:1014D0000C00FF000D000C00FF000D000C00FF00D1 +:1014E0000D000C00FF000D000C00FF000D000C00B3 +:1014F000FF000D000C00FF000D000C00FF000D00B0 +:101500000C00FF000D000C00FF000D000C00FF00A0 +:101510000D000C00FF000D000C00FF000D000C0082 +:10152000FF000D000C00FF000D000C00FF000D007F +:101530000C00FF000D000C00FF000D000C00FF0070 +:101540000D000C00FF000D000C00FF000D000C0052 +:10155000FF000D000C00FF000D000C00FF000D004F +:101560000C00FF000D000C00FF000D000C00FF0040 +:101570000D000C00FF000D000C00FF000D000C0022 +:10158000FF000D000C00FF000D000C00FF000D001F +:101590000C00FF000D000C00FF000D000C00FF0010 +:1015A0000D000C00FF000D000C00FF000D000C00F2 +:1015B000FF000D000C00FF000D000C00FF000D00EF +:1015C0000C00FF000D000C00FF000D020C40FF009E +:1015D0000D020C60FF000D000C00FF000D000C0060 +:1015E000FF000D000C00FF000D020CC0FF000D02FB +:1015F0000C80FF000D000C00FF000D020CFBFF0033 +:101600000D020CA0FF000D000C00FF000D000C1BD4 +:10161000FF000D020CD7FF000D000C00FF000D02B3 +:101620000CF7FF000D030C20FF000D030C00FF0062 +:101630000D000C00FF000D000C1CFF000D030C3C06 +:10164000FF000D000C00FF000D030C3FFF000D001C +:101650000C00FF000D030CC0FF000D000C00FF008C +:101660000D030CDFFF000D000C00FF000D000C004F +:10167000FF000D030C5DFF000D000C00FF000D03CB +:101680000CC0FF000D000C00FF000D030C7DFF00DF +:101690000D000C00FF000D030CC0FF000D000C003E +:1016A000FF000D030C9EFF000D000C00FF000D035A +:1016B0000CC0FF000D000C00FF000D030CBEFF006E +:1016C0000D000C00FF000D030CC0FF000D000C000E +:1016D000FF000D000C00FF000D000C00FF000D00CE +:1016E0000C00FF000D000C1BFF000D000C00FF00A4 +:1016F0000D000C00FF000D000C00FF000D020CDBC4 +:10170000FF000D000C00FF000D020CDBFF000D00C0 +:101710000C00FF000D020CE0FF000D000C00FF00AC +:101720000D020CFBFF000D000C00FF000D020CC0B1 +:10173000FF000D020C40FF000D020CFBFF000D022C +:101740000C60FF000D000C1BFF0009050B020A00D6 +:101750000CC4FF000C00FF000C44FF000C07FF004E +:101760000C44FF000C00FF000C40FF000C25FF00A4 +:101770000C01FF000C06FF000CC4FF000C07FF006B +:101780000C40FF000C25FF000C01FF000C00FF00C7 +:101790000C46FF000C46FF000C00FF000C00FF0091 +:1017A0000C00FF000C00FF000C00FF000C00FF000D +:1017B0000C00FF000C00FF000C00FF000C00FF00FD +:1017C0000C00FF000C00FF000C00FF000C00FF00ED +:1017D0000C00FF000C00FF000C00FF000C00FF00DD +:1017E0000C00FF000C00FF000C00FF000C00FF00CD +:1017F0000C00FF000C00FF000C00FF000C00FF00BD +:101800000C00FF000C00FF000C00FF000C00FF00AC +:101810000C00FF000C00FF000C00FF000C00FF009C +:101820000C00FF000C00FF000C00FF000C00FF008C +:101830000C00FF000C00FF000C00FF000C00FF007C +:101840000C00FF000C00FF000C00FF000C00FF006C +:101850000C46FF000C07FF000C05FF000C05FF0005 +:101860000C05FF000C04FF000C07FF000C05FF0037 +:101870000C04FF000C07FF000C05FF000C44FF00E8 +:101880000C46FF000C44FF000C46FF000C46FF0016 +:101890000C07FF000C05FF000C44FF000C46FF0086 +:1018A0000C05FF000C46FF000C05FF000C46FF0076 +:1018B0000C05FF000C46FF000C05FF000C44FF0068 +:1018C0000C46FF000C05FF000C07FF000C44FF0056 +:1018D0000C46FF000C05FF000C07FF000C44FF0046 +:1018E0000C46FF000C05FF000C07FF000C44FF0036 +:1018F0000C46FF000C05FF000C07FF000C44FF0026 +:101900000C05FF000C05FF000C05FF000C44FF0058 +:101910000C05FF000C05FF000C05FF000C46FF0046 +:101920000C05FF000C46FF000C05FF000C46FF00F5 +:101930000C05FF000C46FF000C05FF000C46FF00E5 +:101940000C07FF000C46FF000C07FF000C44FF00D3 +:1019500009050B030A000C07FF000C40FF000C00F8 +:10196000FF000C00FF000C00FF000C47FF000C0004 +:10197000FF000C40FF000C00FF000C40FF000C06B5 +:10198000FF000C40FF000C00FF000C00FF000C00EB +:10199000FF000C00FF000C00FF000C00FF000C001B +:1019A000FF000C00FF000C00FF000C00FF000C000B +:1019B000FF000C00FF000C00FF000C00FF000C00FB +:1019C000FF000C00FF000C00FF000C00FF000C00EB +:1019D000FF000C00FF000C00FF000C00FF000C00DB +:1019E000FF000C00FF000C00FF000C00FF000C00CB +:1019F000FF000C00FF000C00FF000C00FF000C00BB +:101A0000FF000C00FF000C00FF000C00FF000C00AA +:101A1000FF000C00FF000C00FF000C00FF000C009A +:101A2000FF000C00FF000C00FF000C00FF000C008A +:101A3000FF000C00FF000C00FF000C00FF000C007A +:101A4000FF000C00FF000C00FF000C00FF000C006A +:101A5000FF000C00FF000C80FF000C80FF000CC09A +:101A6000FF000C00FF000C00FF000C40FF000C000A +:101A7000FF000C00FF000C00FF000C40FF000C00FA +:101A8000FF000C40FF000C00FF000C60FF000C008A +:101A9000FF000C70FF000C00FF000C40FF000C006A +:101AA000FF000C40FF000C00FF000C42FF000C0088 +:101AB000FF000C40FF000C00FF000C02FF000C00B8 +:101AC000FF000C40FF000C00FF000C00FF000C00AA +:101AD000FF000C40FF000C00FF000C00FF000C009A +:101AE000FF000C40FF000C00FF000C00FF000C008A +:101AF000FF000C40FF000C00FF000C00FF000C007A +:101B0000FF000C40FF000C00FF000C00FF000C0069 +:101B1000FF000C42FF000C00FF000C40FF000C0017 +:101B2000FF000C42FF000C00FF000C02FF000C0045 +:101B3000FF000C02FF000C00FF000C02FF000C0075 +:101B4000FF000C42FF000C00FF000CC0FF000C0067 +:101B5000FF000C40FF0009050B040A000C63FF00A6 +:101B60000C03FF000C26FF000C02FF000C2CFF00F2 +:101B70000C00FF000C24FF000C00FF000C2EFF00E7 +:101B80000C02FF000C02FF000C02FF000C00FF0023 +:101B90000C00FF000C00FF000C00FF000C00FF0019 +:101BA0000C00FF000C00FF000C00FF000C00FF0009 +:101BB0000C00FF000C00FF000C00FF000C00FF00F9 +:101BC0000C00FF000C00FF000C00FF000C00FF00E9 +:101BD0000C00FF000C00FF000C00FF000C00FF00D9 +:101BE0000C00FF000C00FF000C00FF000C00FF00C9 +:101BF0000C00FF000C00FF000C00FF000C00FF00B9 +:101C00000C00FF000C00FF000C00FF000C00FF00A8 +:101C10000C00FF000C00FF000C00FF000C00FF0098 +:101C20000C00FF000C00FF000C00FF000C00FF0088 +:101C30000C00FF000C00FF000C00FF000C00FF0078 +:101C40000C00FF000C00FF000C00FF000C00FF0068 +:101C50000C00FF000C00FF000C00FF000C00FF0058 +:101C60000C01FF000C20FF000C00FF000C60FF00C7 +:101C70000C00FF000C20FF000C00FF000C20FF00F8 +:101C80000C00FF000C20FF000C00FF000C20FF00E8 +:101C90000C00FF000C20FF000C00FF000C20FF00D8 +:101CA0000C00FF000C20FF000C00FF000C20FF00C8 +:101CB0000C00FF000C60FF000C00FF000C20FF0078 +:101CC0000C00FF000C60FF000C00FF000C20FF0068 +:101CD0000C00FF000C60FF000C00FF000C20FF0058 +:101CE0000C00FF000C60FF000C00FF000C20FF0048 +:101CF0000C00FF000C60FF000C00FF000C20FF0038 +:101D00000C00FF000C60FF000C00FF000C20FF0027 +:101D10000C00FF000C20FF000C00FF000C22FF0055 +:101D20000C02FF000C22FF000C02FF000C20FF0041 +:101D30000C00FF000C60FF000C00FF000C22FF00F5 +:101D40000C02FF000C62FF000C02FF000C20FF00E1 +:101D50000C01FF000C21FF000C01FF0009010B0624 +:101D60000A000D000C00FF000A020D000C00FF002D +:101D70000A040D000C00FF000A060D000C00FF0015 +:101D80000A080D000C00FF000A0A0D000C00FF00FD +:101D90000A0C0D000C00FF000A0E0D000C00FF00E5 +:101DA0000A100D000C00FF000A120D000C00FF00CD +:101DB0000A140D000C00FF000A160D000C00FF00B5 +:101DC0000A180D000C00FF000A1A0D000C00FF009D +:101DD0000A1C0D000C00FF000A1E0D000C00FF0085 +:101DE0000A200D000C00FF000A220D000C00FF006D +:101DF0000A240D000C00FF000A260D000C00FF0055 +:101E00000A280D000C00FF000A2A0D000C00FF003C +:101E10000A2C0D000C00FF000A2E0D000C00FF0024 +:101E20000A300D000C00FF000A320D000C00FF000C +:101E30000A340D000C00FF000A360D000C00FF00F4 +:101E40000A380D000C00FF000A3A0D000C00FF00DC +:101E50000A3C0D000C00FF000A3E0D000C00FF00C4 +:101E60000A400D000C00FF000A420D030C00FF00A9 +:101E70000A440D010C00FF000A460D0A0C21FF0068 +:101E80000A480D0D0C23FF000A4A0D230C1BFF000E +:101E90000A4C0D370C8FFF000A4E0D450C77FF00E2 +:101EA0000A500D520CE2FF000A520D1C0C92FF006A +:101EB0000A540D1C0C52FF000A560D070C00FF00BF +:101EC0000A580D2F0CC6FF000A5A0D0B0C00FF001C +:101ED0000A5C0D300C06FF000A5E0D170C00FF00B7 +:101EE0000A600D3D0CDAFF000A620D290C00FF00AC +:101EF0000A640D3E0C41FF000A660D390C00FF001C +:101F00000A680D4C0C48FF000A6A0D490C00FF00DE +:101F10000A6C0D4C0C6CFF000A6E0D110CD2FF0008 +:101F20000A700D160C0CFF000A720D000C00FF0069 +:101F30000A740D000C80FF000A760D0F0C00FF00E4 +:101F40000A780D000C80FF000A7A0D130C00FF00C8 +:101F50000A7C0D800C00FF000A7E0D800C80FF00C3 +:101F600009050B070A000D0F0CFFFF000D000C0008 +:101F7000FF000D080C00FF000D080C00FF000D0213 +:101F80000C00FF000D000C00FF000D000C00FF0016 +:101F90000D0F0CFFFF000D000C00FF000D000C00EA +:101FA000FF000D080C00FF000D080C00FF000D00E5 +:101FB0000C00FF000D0F0CFFFF000D000C00FF00D8 +:101FC0000D000C00FF000D0F0CFFFF000D0F0CFFAC +:101FD000FF000D000C00FF000D000C00FF000D00C5 +:101FE0000C00FF000D000C00FF000D000C00FF00B6 +:101FF0000D000C00FF000D000C00FF000D000C0098 +:10200000FF000D000C00FF000D000C00FF000D0094 +:102010000C00FF000D000C00FF000D000C00FF0085 +:102020000D000C00FF000D000C00FF000D000C0067 +:10203000FF000D000C00FF000D000C00FF000D0064 +:102040000C00FF000D000C00FF000D000C00FF0055 +:102050000D000C00FF000D000C00FF000D000C0037 +:10206000FF000D000C00FF000D000C00FF000D0034 +:102070000C00FF000D000C00FF000D000C00FF0025 +:102080000D000C00FF000D000C00FF000D000C0007 +:10209000FF000D000C00FF000D000C00FF000D0004 +:1020A0000C00FF000D000C00FF000D000C00FF00F5 +:1020B0000D000C00FF000D000C00FF000D000C00D7 +:1020C000FF000D000C00FF000D000C00FF000D00D4 +:1020D0000C00FF000D000C00FF000D000C00FF00C5 +:1020E0000D000C00FF000D000C00FF000D000C00A7 +:1020F000FF000D000C00FF000D000C00FF000D00A4 +:102100000C00FF000D000C00FF000D000C00FF0094 +:102110000D000C00FF000D000C00FF000D000C0076 +:10212000FF000D000C00FF000D0F0CFFFF000D0F56 +:102130000CFFFF000D0F0CFFFF000D0F0CFFFF0049 +:102140000D020CE9FF000D060C8CFF000D060C8C37 +:10215000FF000D0F0CFFFF000D1A0C75FF000D0D99 +:102160000C8BFF000D040CE9FF000D0B0C16FF009B +:102170000D1A0C38FF000D0D0CC8FF000D040C6F7C +:10218000FF000D0B0C91FF000D0F0CFFFF000D0663 +:102190000C40FF000D060C40FF000D020C8FFF00ED +:1021A0000D0F0CFFFF000D060C62FF000D060C6208 +:1021B000FF000D020C7BFF000D0F0CFFFF000D0652 +:1021C0000C97FF000D060C97FF000D020C52FF004C +:1021D0000D0F0CFFFF000D060CF6FF000D060CF6B0 +:1021E000FF000D020C19FF000D050C55FF000D0539 +:1021F0000C55FF000D050C55FF000D050C55FF009B +:102200000D050C55FF000D050C55FF000D050C5577 +:10221000FF000D050C55FF000D140CDAFF000D0D2D +:102220000C93FF000D040CDAFF000D050C93FF006A +:102230000D140CDAFF000D0D0C93FF000D040CDAE9 +:10224000FF000D050C93FF000D000C00FF000D00BA +:102250000C00FF000D000C00FF000D000C00FF0043 +:102260000D020C00FF000E010F00FF000E020F0018 +:10227000FF000E010F01FF000E020F00FF000E0114 +:102280000F02FF000E020F00FF000E010F03FF0000 +:102290000E020F00FF000E010F04FF000E020F00E0 +:1022A000FF000E010F05FF000E020F00FF000E01E0 +:1022B0000F06FF000E020F00FF000E010F07FF00C8 +:1022C0000E020F00FF000E010F08FF000E020F00AC +:1022D000FF000E010F09FF000E020F00FF000E01AC +:1022E0000F0AFF000E020F00FF000E010F0BFF0090 +:1022F0000E020F00FF000E010F0CFF000E020F0078 +:10230000FF000E010F0DFF000E020F00FF000E0177 +:102310000F0EFF000E020F00FF000E010F0FFF0057 +:102320000E020F00FF000EB00F20FF000EB10F20B5 +:10233000FF000EB20F20FF000EB30F20FF000EB4FF +:102340000F20FF000EB50F20FF000EB60F20FF007C +:102350000EB70F20FF000EB80F20FF000EB90F20A0 +:10236000FF000EBA0F20FF000EBB0F20FF000EBCB7 +:102370000F20FF000EBD0F20FF000EBE0F20FF003C +:102380000EBF0F20FF000EF00F20FF000EF10F20F8 +:10239000FF000EF20F20FF000EF30F20FF000EF4DF +:1023A0000F20FF000EF50F20FF000EF60F20FF009C +:1023B0000EF70F20FF000EF80F20FF000EF90F2080 +:1023C000FF000EFA0F20FF000EFB0F20FF000EFC97 +:1023D0000F20FF000EFD0F20FF000EFE0F20FF005C +:1023E0000EFF0F20FF000E100FFFFF000E110FFF5A +:1023F000FF000E120FFFFF000E130FFFFF000E1461 +:102400000FFFFF000E150FFFFF000E160FFFFF005E +:102410000E170FFFFF000E180FFFFF000E190FFF22 +:10242000FF000E1A0FFFFF000E1B0FFFFF000E1C18 +:102430000FFFFF000E1D0FFFFF000E1E0F40FF00DD +:102440000E1F0FFFFF000E200FFFFF000E210FFFDA +:10245000FF000E220FFFFF000E230FFFFF000E24D0 +:102460000FFFFF000E250FFFFF000E260FFFFF00DE +:102470000E270FFFFF000E280FFFFF000E290FFF92 +:10248000FF000E2A0FFFFF000E2B0FFFFF000E2C88 +:102490000FFFFF000E2D0FFFFF000E2E0F00FF009D +:1024A0000E2F0F00FF000E300F00FF000E310F0047 +:1024B000FF000E320F00FF000E330F00FF000E343E +:1024C0000F00FF000E350F00FF000E360F00FF005B +:1024D0000E370F00FF000E380F00FF000E390F00FF +:1024E000FF000E3A0F00FF000E3B0F00FF000E3CF6 +:1024F0000F00FF000E3D0F00FF000E3E0F00FF001B +:102500000E3F0F20FF000E400F00FF000E410F0096 +:10251000FF000E420F00FF000E430F00FF000E44AD +:102520000F00FF000E450F00FF000E460F00FF00DA +:102530000E470F00FF000E480F00FF000E490F006E +:10254000FF000E4A0F00FF000E4B0F00FF000E4C65 +:102550000F00FF000E4D0F00FF000E4E0F0EFF008C +:102560000E4F0F0EFF000E500F00FF000E510F0018 +:10257000FF000E520F00FF000E530F00FF000E541D +:102580000F00FF000E550F00FF000E560F00FF005A +:102590000E570F00FF000E580F00FF000E590F00DE +:1025A000FF000E5A0F00FF000E5B0F00FF000E5CD5 +:1025B0000F00FF000E5D0F00FF000E5E0F00FF001A +:1025C0000E5F0F00FF000E600F00FF000E610F0096 +:1025D000FF000E620F00FF000E630F00FF000E648D +:1025E0000F00FF000E650F00FF000E660F00FF00DA +:1025F0000E670F00FF000E680F00FF000E690F004E +:10260000FF000E6A0F00FF000E6B0F00FF000E6C44 +:102610000F40FF000E6D0F00FF000E6E0F40FF0019 +:102620000E6F0F40FF000E700FC0FF000E710FC045 +:10263000FF000E720FC0FF000E730FC0FF000E747C +:102640000FC0FF000E750FC0FF000E760FC0FF0019 +:102650000E770FC0FF000E780FC0FF000E790FC07D +:10266000FF000E7A0FC0FF000E7B0FC0FF000E7C34 +:102670000FC0FF000E7D0FC0FF000E7E0FC0FF00D9 +:102680000E7F0FC0FF000E800F00FF000E810F00B5 +:10269000FF000E820F00FF000E830F00FF000E846C +:1026A0000F00FF000E850F00FF000E860F00FF00D9 +:1026B0000E870F00FF000E880F00FF000E890F002D +:1026C000FF000E8A0F00FF000E8B0F00FF000E8C24 +:1026D0000F00FF000E8D0F00FF000E8E0F00FF0099 +:1026E0000E8F0F00FF000E900F00FF000E910F00E5 +:1026F000FF000E920F00FF000E930F00FF000E94DC +:102700000F00FF000E950F00FF000E960F00FF0058 +:102710000E970F00FF000E980F00FF000E990F009C +:10272000FF000E9A0F00FF000E9B0F00FF000E9C93 +:102730000F00FF000E9D0F00FF000E9E0F00FF0018 +:102740000E9F0F00FF000EA00F00FF000EA10F0054 +:10275000FF000EA20F00FF000EA30F00FF000EA44B +:102760000F00FF000EA50F00FF000EA60F00FF00D8 +:102770000EA70F00FF000EA80F00FF000EA90F000C +:10278000FF000EAA0F00FF000EAB0F00FF000EAC03 +:102790000F00FF000EAD0F00FF000EAE0F00FF0098 +:1027A0000EAF0F00FF000EC00F00FF000EC10F00A4 +:1027B000FF000EC20F00FF000EC30F00FF000EC48B +:1027C0000F00FF000EC50F00FF000EC60F00FF0038 +:1027D0000EC70F00FF000EC80F00FF000EC90F004C +:1027E000FF000ECA0F00FF000ECB0F00FF000ECC43 +:1027F0000F00FF000ECD0F00FF000ECE0F00FF00F8 +:102800000ECF0F00FF000ED00F00FF000ED10F0003 +:10281000FF000ED20F00FF000ED30F00FF000ED4FA +:102820000F00FF000ED50F00FF000ED60F00FF00B7 +:102830000ED70F00FF000ED80F00FF000ED90F00BB +:10284000FF000EDA0F00FF000EDB0F00FF000EDCB2 +:102850000F00FF000EDD0F00FF000EDE0F10FF0067 +:102860000EDF0F10FF000EE00F00FF000EE10F0063 +:10287000FF000EE20F00FF000EE30F00FF000EE46A +:102880000F00FF000EE50F00FF000EE60F00FF0037 +:102890000EE70F00FF000EE80F00FF000EE90F002B +:1028A000FF000EEA0F00FF000EEB0F00FF000EEC22 +:1028B0000F00FF000EED0F00FF000EEE0F00FF00F7 +:1028C0000EEF0F00FF000E010F000E020F01FF00C0 +:1028D0000E010F010E020F01FF000E010F020E028A +:1028E0000F01FF000E010F030E020F01FF000E018A +:1028F0000F040E020F01FF000E010F050E020F0163 +:10290000FF000E010F060E020F01FF000E010F0760 +:102910000E020F01FF000E010F080E020F01FF0053 +:102920000E010F090E020F01FF000E010F0A0E0229 +:102930000F01FF000E010F0B0E020F01FF000E0131 +:102940000F0C0E020F01FF000E010F0D0E020F0102 +:10295000FF000E010F0E0E020F01FF000E010F0F00 +:102960000E020F01FF0008020B070A460D000C00C3 +:10297000FF000B070A490D000C00FF000B000A4B7B +:102980000D030C11FF000B000A4D0D010C32FF006E +:102990000B070A460D000C00FF000B070A490D004B +:1029A0000C00FF000B070A400D000C00FF000B0796 +:1029B0000A410D000C00FF000B010A400D020C4003 +:1029C000FF000B010A410D020C60FF000B070A40DB +:1029D0000D000C00FF000B070A410D000C00FF006A +:1029E0000B070A470D000C00FF000B070A4A0D00F9 +:1029F0000C00FF000B000A470D010C00FF000B004C +:102A00000A4A0D010C20FF000B070A470D000C00BD +:102A1000FF000B070A4A0D000C00FF000B070A7CA1 +:102A20000D000C00FF000B070A7E0D000C00FF00DC +:102A30000B000A000D010C1CFF000B070A7C0D00A7 +:102A40000C00FF000B070A7E0D000C00FF000B07B7 +:102A50000A440D000C00FF000B000A440D010C009D +:102A6000FF000B070A440D000C00FF000B070A4291 +:102A70000D000C00FF000B070A430D000C00FF00C7 +:102A80000B000A420D010C1AFF000B000A430D0156 +:102A90000C20FF000B070A420D000C00FF000B0783 +:102AA0000A430D000C00FF000B070A400D000C004C +:102AB000FF000B070A410D000C00FF000B010A404C +:102AC0000D020C40FF000B010A410D020C60FF00DB +:102AD0000B070A400D000C00FF000B070A410D0018 +:102AE0000C00FF000B070A440D0F0CFFFF000B0743 +:102AF0000A420D000C00FF000B070A430D000C00FA +:102B0000FF000B070A400D000C00FF000B070A41F5 +:102B10000D000C00FF000B070A510D060C40FF00D2 +:102B20000B070A500D060C40FF000B070A4F0D0360 +:102B30000C81FF000B070A530D1A0C76FF000B07E0 +:102B40000A540D0D0C8BFF000B070A550D040CE900 +:102B5000FF000B070A560D0B0C17FF000B070A5757 +:102B60000D1A0C38FF000B070A580D0D0CC9FF0099 +:102B70000B070A590D040C6FFF000B070A5A0D0BC7 +:102B80000C91FF000B070A730D140CDAFF000B0702 +:102B90000A740D0D0C93FF000B070A750D040CD978 +:102BA000FF000B070A760D050C93FF000B070A7751 +:102BB0000D140CDAFF000B070A780D0D0C93FF00C3 +:102BC0000B070A790D040CD9FF000B070A7A0D05D3 +:102BD0000C93FF000B070A5E0D030C68FF000B0748 +:102BE0000A5C0D040C31FF000B070A5D0D040C316B +:102BF000FF000B070A620D030C52FF000B070A606F +:102C00000D040C76FF000B070A610D040C76FF0023 +:102C10000B070A660D030C2EFF000B070A640D0458 +:102C20000CDAFF000B070A650D040CDAFF000B0736 +:102C30000A6A0D020CF6FF000B070A680D050C620C +:102C4000FF000B070A690D050C62FF000B060A4620 +:102C50000D0A0C22FF000B060A480D0D0C24FF0084 +:102C60000B060A6E0D110CD3FF000B060A700D1532 +:102C70000CCBFF000B060A520D200C93FF000B0635 +:102C80000A540D200C54FF000B060A4A0D270C1D98 +:102C9000FF000B060A580D2F0CC8FF000B060A5C3C +:102CA0000D300C07FF000B060A4C0D370C90FF008F +:102CB0000B060A600D3D0CDBFF000B060A640D3E9F +:102CC0000C42FF000B060A4E0D450C78FF000B0668 +:102CD0000A680D4C0C48FF000B060A6C0D4C0C6C7E +:102CE000FF000B060A500D520CE2FF000B060A42D1 +:102CF0000D020CBAFF00FF000E1E0F14FF000EDEC7 +:102D00000F20FF000EDF0F20FF000B060A780D00DA +:102D10000C40FF000B070A030D0F0CFFFF000B0711 +:102D20000A0B0D0F0CFFFF000B070A020D000C0031 +:102D3000FF000B070A0A0D000C00FF000B070A46F4 +:102D40000D000C00FF000B070A490D000C000905DF +:102D50000B000A100D000C00FF000D000C00FF001E +:102D60000D020C00FF000D000C00FF000D000C0018 +:102D7000FF000D000C00FF000D000C00FF000D0017 +:102D80000C00FF000D000C00FF000D000C00FF0008 +:102D90000D000C00FF000D000C00FF000D000C00EA +:102DA000FF000D000C00FF000D000C00FF000D00E7 +:102DB0000C00FF000D000C00FF000D000C00FF00D8 +:102DC0000D000C00FF000D000C00FF000D000C00BA +:102DD000FF000D000C00FF000D000C00FF000D00B7 +:102DE0000C00FF000D000C00FF000D000C00FF00A8 +:102DF0000D000C00FF000D000C00FF000D000C008A +:102E0000FF000D000C00FF000D000C00FF000D0086 +:102E10000C00FF000D000C00FF000D000C00FF0077 +:102E20000D000C00FF000D000C00FF000D000C0059 +:102E3000FF000D000C00FF000D000C00FF000D0056 +:102E40000C00FF000D000C00FF000D000C00FF0047 +:102E50000D000C00FF000D000C00FF000D000C0029 +:102E6000FF000D000C00FF000D000C00FF000D0026 +:102E70000C00FF0009050B010A100D010CC0FF003A +:102E80000D010CFAFF000D000C1AFF000D000C00E4 +:102E9000FF000D000C00FF000D000C00FF000D00F6 +:102EA0000C00FF000D000C00FF000D000C00FF00E7 +:102EB0000D000C00FF000D000C00FF000D000C00C9 +:102EC000FF000D000C00FF000D000C00FF000D00C6 +:102ED0000C00FF000D000C00FF000D000C00FF00B7 +:102EE0000D000C00FF000D000C00FF000D000C0099 +:102EF000FF000D000C00FF000D000C00FF000D0096 +:102F00000C00FF000D000C00FF000D000C00FF0086 +:102F10000D000C00FF000D000C00FF000D000C0068 +:102F2000FF000D000C00FF000D000C00FF000D0065 +:102F30000C00FF000D000C00FF000D000C00FF0056 +:102F40000D000C00FF000D000C00FF000D000C0038 +:102F5000FF000D000C00FF000D000C00FF000D0035 +:102F60000C00FF000D000C00FF000D000C00FF0026 +:102F70000D000C00FF000D000C00FF000D000C0008 +:102F8000FF000D000C00FF000D000C00FF000D0005 +:102F90000C00FF000D000C00FF00FF00FF00090502 +:102FA0000B020A100C46FF000C46FF000C00FF004D +:102FB0000C00FF000C00FF000C00FF000C00FF00E5 +:102FC0000C00FF000C00FF000C00FF000C00FF00D5 +:102FD0000C00FF000C00FF000C00FF000C00FF00C5 +:102FE0000C00FF000C00FF000C00FF000C00FF00B5 +:102FF0000C00FF000C00FF000C00FF000C00FF00A5 +:103000000C00FF000C00FF000C00FF000C00FF0094 +:103010000C00FF000C00FF000C00FF000C00FF0084 +:103020000C00FF000C00FF000C00FF000C00FF0074 +:103030000C00FF000C00FF000C00FF000C00FF0064 +:103040000C00FF000C00FF000C00FF000C00FF0054 +:103050000C00FF000C00FF000C00FF000C00FF0044 +:103060000C00FF0009050B030A100C00FF000C0008 +:10307000FF000C00FF000C00FF000C00FF000C0024 +:10308000FF000C00FF000C00FF000C00FF000C0014 +:10309000FF000C00FF000C00FF000C00FF000C0004 +:1030A000FF000C00FF000C00FF000C00FF000C00F4 +:1030B000FF000C00FF000C00FF000C00FF000C00E4 +:1030C000FF000C00FF000C00FF000C00FF000C00D4 +:1030D000FF000C00FF000C00FF000C00FF000C00C4 +:1030E000FF000C00FF000C00FF000C00FF000C00B4 +:1030F000FF000C00FF000C00FF000C00FF000C00A4 +:10310000FF000C00FF000C00FF000C00FF000C0093 +:10311000FF000C00FF000C00FF000C00FF000C0083 +:10312000FF000C00FF000C00FF0009050B040A1053 +:103130000C00FF000C00FF000C00FF000C00FF0063 +:103140000C00FF000C00FF000C00FF000C00FF0053 +:103150000C00FF000C00FF000C00FF000C00FF0043 +:103160000C00FF000C00FF000C00FF000C00FF0033 +:103170000C00FF000C00FF000C00FF000C00FF0023 +:103180000C00FF000C00FF000C00FF000C00FF0013 +:103190000C00FF000C00FF000C00FF000C00FF0003 +:1031A0000C00FF000C00FF000C00FF000C00FF00F3 +:1031B0000C00FF000C00FF000C00FF000C00FF00E3 +:1031C0000C00FF000C00FF000C00FF000C00FF00D3 +:1031D0000C00FF000C00FF000C00FF000C00FF00C3 +:1031E0000C00FF000C00FF000C00FF000C00FF00B3 +:1031F00009010B060A100D000C00FF000A120D0059 +:103200000C00FF000A140D000C00FF000A160D0050 +:103210000C00FF000A180D000C00FF000A1A0D0038 +:103220000C00FF000A1C0D000C00FF000A1E0D0020 +:103230000C00FF000A200D000C00FF000A220D0008 +:103240000C00FF000A240D000C00FF000A260D00F0 +:103250000C00FF000A280D000C00FF000A2A0D00D8 +:103260000C00FF000A2C0D000C00FF000A2E0D00C0 +:103270000C00FF000A300D000C00FF000A320D00A8 +:103280000C00FF000A340D000C00FF000A360D0090 +:103290000C00FF000A380D000C00FF000A3A0D0078 +:1032A0000C00FF000A3C0D000C00FF000A3E0D0060 +:1032B0000C00FF0009050B070A100D0F0CFFFF00A3 +:1032C0000D0F0CFFFF000D000C00FF000D000C00A7 +:1032D000FF000D000C00FF000D000C00FF000D00B2 +:1032E0000C00FF000D000C00FF000D000C00FF00A3 +:1032F0000D000C00FF000D000C00FF000D000C0085 +:10330000FF000D000C00FF000D000C00FF000D0081 +:103310000C00FF000D000C00FF000D000C00FF0072 +:103320000D000C00FF000D000C00FF000D000C0054 +:10333000FF000D000C00FF000D000C00FF000D0051 +:103340000C00FF000D000C00FF000D000C00FF0042 +:103350000D000C00FF000D000C00FF000D000C0024 +:10336000FF000D000C00FF000D000C00FF000D0021 +:103370000C00FF000D000C00FF000D000C00FF0012 +:103380000D000C00FF000D000C00FF000D000C00F4 +:10339000FF000D000C00FF000D000C00FF000D00F1 +:1033A0000C00FF000D000C00FF000D000C00FF00E2 +:1033B0000D000C00FF000D000C00FF000D000C00C4 +:1033C000FF000D000C00FF000D000C00FF000D00C1 +:1033D0000C00FF000D000C00FF000E010F00FF00AD +:1033E0000E020F00FF000E010F01FF000E020F0082 +:1033F000FF000E010F02FF000E020F00FF000E0182 +:103400000F03FF000E020F00FF000E010F04FF006C +:103410000E020F00FF000E010F05FF000E020F004D +:10342000FF000E010F06FF000E020F00FF000E014D +:103430000F07FF000E020F00FF000EB00F20FF006D +:103440000EB10F20FF000EB20F20FF000EB30F20B1 +:10345000FF000EB40F20FF000EB50F20FF000EB6C8 +:103460000F20FF000EB70F20FF000EF00F20FF000F +:103470000EF10F20FF000EF20F20FF000EF30F20C1 +:10348000FF000EF40F20FF000EF50F20FF000EF6D8 +:103490000F20FF000EF70F20FF000E100FFFFF00A0 +:1034A0000E110FFFFF000E120FFFFF000E130FFF94 +:1034B000FF000E140FFFFF000E150FFFFF000E168A +:1034C0000FFFFF000E170FFFFF000E200FFFFF0082 +:1034D0000E210FFFFF000E220FFFFF000E230FFF34 +:1034E000FF000E240FFFFF000E250FFFFF000E262A +:1034F0000FFFFF000E270FFFFF000E300F00FF0031 +:103500000E310F00FF000E320F00FF000E330F00D0 +:10351000FF000E340F00FF000E350F00FF000E36C7 +:103520000F00FF000E370F00FF000E400F00FF00DE +:103530000E410F00FF000E420F00FF000E430F0070 +:10354000FF000E440F00FF000E450F00FF000E4667 +:103550000F00FF000E470F00FF000E500F00FF008E +:103560000E510F00FF000E520F00FF000E530F0010 +:10357000FF000E540F00FF000E550F00FF000E5607 +:103580000F00FF000E570F00FF000E600F00FF003E +:103590000E610F00FF000E620F00FF000E630F00B0 +:1035A000FF000E640F00FF000E650F00FF000E66A7 +:1035B0000F00FF000E670F00FF000E700FC0FF002E +:1035C0000E710FC0FF000E720FC0FF000E730FC010 +:1035D000FF000E740FC0FF000E750FC0FF000E76C7 +:1035E0000FC0FF000E770FC0FF000E800F00FF001E +:1035F0000E810F00FF000E820F00FF000E830F00F0 +:10360000FF000E840F00FF000E850F00FF000E86E6 +:103610000F00FF000E870F00FF000E900F00FF004D +:103620000E910F00FF000E920F00FF000E930F008F +:10363000FF000E940F00FF000E950F00FF000E9686 +:103640000F00FF000E970F00FF000EA00F00FF00FD +:103650000EA10F00FF000EA20F00FF000EA30F002F +:10366000FF000EA40F00FF000EA50F00FF000EA626 +:103670000F00FF000EA70F00FF000EC00F00FF009D +:103680000EC10F00FF000EC20F00FF000EC30F009F +:10369000FF000EC40F00FF000EC50F00FF000EC696 +:1036A0000F00FF000EC70F00FF000ED00F00FF003D +:1036B0000ED10F00FF000ED20F00FF000ED30F003F +:1036C000FF000ED40F00FF000ED50F00FF000ED636 +:1036D0000F00FF000ED70F00FF000EE00F00FF00ED +:1036E0000EE10F00FF000EE20F00FF000EE30F00DF +:1036F000FF000EE40F00FF000EE50F00FF000EE6D6 +:103700000F00FF000EE70F00FF000E010F00FF008B +:103710000E020F01FF000E010F01FF000E020F014C +:10372000FF000E010F02FF000E020F01FF000E014D +:103730000F03FF000E020F01FF000E010F04FF0038 +:103740000E020F01FF000E010F05FF000E020F0118 +:10375000FF000E010F06FF000E020F01FF000E0119 +:103760000F07FF000E020F01FF000B070A460D00B6 +:103770000C00FF000B070A490D000C00FF000B07AF +:103780000A450D0F0CFFFF000B070A480D0F0CFF39 +:10379000FF000B070A7B0D040CCCFF000B070A7D12 +:1037A0000D040CCCFF000B070A7C0D000C00FF0081 +:1037B0000B070A7E0D000C00FF000B070A460D00E8 +:1037C0000C00FF000B070A490D000C00FF000B075F +:1037D0000A470D000C00FF000B070A4A0D000C0001 +:1037E000FF000B070A4C0D000C00FF000B070A4EF0 +:1037F0000D000C00FF000B070A4C0D000C000B071E +:103800000A4E0D000C000B070A4C0D000C280B078C +:103810000A4E0D000C280B070A4C0D000C510B072B +:103820000A4E0D000C510B070A4C0D000C7A0B07C9 +:103830000A4E0D000C7A0B070A4C0D000CA30B0767 +:103840000A4E0D000CA30B070A4C0D000CCC0B0705 +:103850000A4E0D000CCC0B070A4C0D000CF50B07A3 +:103860000A4E0D000CF50B070A4C0D010C1E0B0740 +:103870000A4E0D010C1E0B070A4C0D010C470B07DD +:103880000A4E0D010C470B070A4C0D010C700B077B +:103890000A4E0D010C700B070A4C0D010C990B0719 +:1038A0000A4E0D010C990B070A4C0D010CC20B07B7 +:1038B0000A4E0D010CC20B070A4C0D010CEB0B0755 +:1038C0000A4E0D010CEB0B070A4C0D020C140B07F2 +:1038D0000A4E0D020C140B070A4C0D020C3D0B078F +:1038E0000A4E0D020C3D0B070A4C0D020C660B072D +:1038F0000A4E0D020C660B070A4C0D020C8F0B07CB +:103900000A4E0D020C8F0B070A4C0D020CB80B0768 +:103910000A4E0D020CB80B070A4C0D020CE10B0706 +:103920000A4E0D020CE10B070A4C0D030C0A0B07A3 +:103930000A4E0D030C0A0B070A4C0D030C330B0740 +:103940000A4E0D030C330B070A4C0D030C5C0B07DE +:103950000A4E0D030C5C0B070A4C0D030C850B077C +:103960000A4E0D030C850B070A4C0D030CAE0B071A +:103970000A4E0D030CAE0B070A4C0D030CD70B07B8 +:103980000A4E0D030CD70B070A4C0D040C000B0755 +:103990000A4E0D040C000B070A4C0D040C280B07F3 +:1039A0000A4E0D040C280B070A4C0D040C510B0792 +:1039B0000A4E0D040C510B070A4C0D040C7A0B0730 +:1039C0000A4E0D040C7A0B070A4C0D040CA30B07CE +:1039D0000A4E0D040CA30B070A4C0D040CCC0B076C +:1039E0000A4E0D040CCC0B070A4C0D040CF50B070A +:1039F0000A4E0D040CF50B070A4C0D050C1E0B07A7 +:103A00000A4E0D050C1E0B070A4C0D050C470B0743 +:103A10000A4E0D050C470B070A4C0D050C700B07E1 +:103A20000A4E0D050C700B070A4C0D050C990B077F +:103A30000A4E0D050C990B070A4C0D050CC20B071D +:103A40000A4E0D050CC20B070A4C0D050CEB0B07BB +:103A50000A4E0D050CEB0B070A4C0D060C140B0758 +:103A60000A4E0D060C140B070A4C0D060C3D0B07F5 +:103A70000A4E0D060C3D0B070A4C0D060C660B0793 +:103A80000A4E0D060C660B070A4C0D060C8F0B0731 +:103A90000A4E0D060C8F0B070A4C0D060CB80B07CF +:103AA0000A4E0D060CB80B070A4C0D060CE10B076D +:103AB0000A4E0D060CE10B070A4C0D070C0A0B070A +:103AC0000A4E0D070C0A0B070A4C0D070C330B07A7 +:103AD0000A4E0D070C330B070A4C0D070C5C0B0745 +:103AE0000A4E0D070C5C0B070A4C0D070C850B07E3 +:103AF0000A4E0D070C850B070A4C0D070CAE0B0781 +:103B00000A4E0D070CAE0B070A4C0D070CD70B071E +:103B10000A4E0D070CD70B070A4C0D080C000B07BB +:103B20000A4E0D080C000B070A4C0D080C280B0759 +:103B30000A4E0D080C280B070A4C0D080C510B07F8 +:103B40000A4E0D080C510B070A4C0D080C7A0B0796 +:103B50000A4E0D080C7A0B070A4C0D080CA30B0734 +:103B60000A4E0D080CA30B070A4C0D080CCC0B07D2 +:103B70000A4E0D080CCC0B070A4C0D080CF50B0770 +:103B80000A4E0D080CF50B070A4C0D090C1E0B070D +:103B90000A4E0D090C1E0B070A4C0D090C470B07AA +:103BA0000A4E0D090C470B070A4C0D090C700B0748 +:103BB0000A4E0D090C700B070A4C0D090C990B07E6 +:103BC0000A4E0D090C990B070A4C0D090CC20B0784 +:103BD0000A4E0D090CC20B070A4C0D090CEB0B0722 +:103BE0000A4E0D090CEB0B070A4C0D0A0C140B07BF +:103BF0000A4E0D0A0C140B070A4C0D0A0C3D0B075C +:103C00000A4E0D0A0C3D0B070A4C0D0A0C660B07F9 +:103C10000A4E0D0A0C660B070A4C0D0A0C8F0B0797 +:103C20000A4E0D0A0C8F0B070A4C0D0A0CB80B0735 +:103C30000A4E0D0A0CB80B070A4C0D0A0CE10B07D3 +:103C40000A4E0D0A0CE10B070A4C0D0B0C0A0B0770 +:103C50000A4E0D0B0C0A0B070A4C0D0B0C330B070D +:103C60000A4E0D0B0C330B070A4C0D0B0C5C0B07AB +:103C70000A4E0D0B0C5C0B070A4C0D0B0C850B0749 +:103C80000A4E0D0B0C850B070A4C0D0B0CAE0B07E7 +:103C90000A4E0D0B0CAE0B070A4C0D0B0CD70B0785 +:103CA0000A4E0D0B0CD70B070A4C0D0C0C000B0722 +:103CB0000A4E0D0C0C000B070A4C0D0C0C280B07C0 +:103CC0000A4E0D0C0C280B070A4C0D0C0C510B075F +:103CD0000A4E0D0C0C510B070A4C0D0C0C7A0B07FD +:103CE0000A4E0D0C0C7A0B070A4C0D0C0CA30B079B +:103CF0000A4E0D0C0CA30B070A4C0D0C0CCC0B0739 +:103D00000A4E0D0C0CCC0B070A4C0D0C0CF50B07D6 +:103D10000A4E0D0C0CF50B070A4C0D0D0C1E0B0773 +:103D20000A4E0D0D0C1E0B070A4C0D0D0C470B0710 +:103D30000A4E0D0D0C470B070A4C0D0D0C700B07AE +:103D40000A4E0D0D0C700B070A4C0D0D0C990B074C +:103D50000A4E0D0D0C990B070A4C0D0D0CC20B07EA +:103D60000A4E0D0D0CC20B070A4C0D0D0CEB0B0788 +:103D70000A4E0D0D0CEB0B070A4C0D0E0C140B0725 +:103D80000A4E0D0E0C140B070A4C0D0E0C3D0B07C2 +:103D90000A4E0D0E0C3D0B070A4C0D0E0C660B0760 +:103DA0000A4E0D0E0C660B070A4C0D0E0C8F0B07FE +:103DB0000A4E0D0E0C8F0B070A4C0D0E0CB80B079C +:103DC0000A4E0D0E0CB80B070A4C0D0E0CE10B073A +:103DD0000A4E0D0E0CE10B070A4C0D0F0C0A0B07D7 +:103DE0000A4E0D0F0C0A0B070A4C0D0F0C330B0774 +:103DF0000A4E0D0F0C330B070A4C0D0F0C5C0B0712 +:103E00000A4E0D0F0C5C0B070A4C0D0F0C850B07AF +:103E10000A4E0D0F0C850B070A4C0D0F0CAE0B074D +:103E20000A4E0D0F0CAE0B070A4C0D0F0CD70B07EB +:103E30000A4E0D0F0CD70B070A4C0D0F0CFF0B078A +:0A3E40000A4E0D0F0CFF0800FF00F2 +:00000001FF diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig index c5c9a92..c6942a4 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig @@ -395,16 +395,6 @@ config SND_WAVEFRONT To compile this driver as a module, choose M here: the module will be called snd-wavefront. -config SND_WAVEFRONT_FIRMWARE_IN_KERNEL - bool "In-kernel firmware for Wavefront" - depends on SND_WAVEFRONT - default y - help - Say Y here to include the static firmware for FX DSP built in - the kernel for the Wavefront driver. If you choose N here, - you need to install the firmware files from the - alsa-firmware package. - config SND_MSND_PINNACLE tristate "Turtle Beach MultiSound Pinnacle/Fiji driver" depends on X86 && EXPERIMENTAL diff --git a/sound/isa/wavefront/wavefront_fx.c b/sound/isa/wavefront/wavefront_fx.c index dfc449a..a4345fc 100644 --- a/sound/isa/wavefront/wavefront_fx.c +++ b/sound/isa/wavefront/wavefront_fx.c @@ -34,14 +34,6 @@ #define WAIT_IDLE 0xff -#ifdef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL -#include "yss225.c" -static const struct firmware yss225_registers_firmware = { - .data = (u8 *)yss225_registers, - .size = sizeof yss225_registers -}; -#endif - static int wavefront_fx_idle (snd_wavefront_t *dev) @@ -260,16 +252,12 @@ snd_wavefront_fx_start (snd_wavefront_t *dev) if (dev->fx_initialized) return 0; -#ifdef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL - firmware = &yss225_registers_firmware; -#else err = request_firmware(&firmware, "yamaha/yss225_registers.bin", dev->card->dev); if (err < 0) { err = -1; goto out; } -#endif for (i = 0; i + 1 < firmware->size; i += 2) { if (firmware->data[i] >= 8 && firmware->data[i] < 16) { @@ -292,12 +280,8 @@ snd_wavefront_fx_start (snd_wavefront_t *dev) err = 0; out: -#ifndef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL release_firmware(firmware); -#endif return err; } -#ifndef CONFIG_SND_WAVEFRONT_FIRMWARE_IN_KERNEL MODULE_FIRMWARE("yamaha/yss225_registers.bin"); -#endif diff --git a/sound/isa/wavefront/yss225.c b/sound/isa/wavefront/yss225.c deleted file mode 100644 index 9f6be3f..0000000 --- a/sound/isa/wavefront/yss225.c +++ /dev/null @@ -1,2739 +0,0 @@ -/* - * Copyright (c) 1998-2002 by Paul Davis - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* weird stuff, derived from port I/O tracing with dosemu */ - -static const struct { - unsigned char addr; - unsigned char data; -} yss225_registers[] __devinitdata = { -/* Set all bits for all channels on the MOD unit to zero */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* XXX But why do this twice? */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* mute on */ -{ WAIT_IDLE }, { 0x8, 0x02 }, - -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, - -/* either because of stupidity by TB's programmers, or because it - actually does something, rezero the MOD page. */ -{ WAIT_IDLE }, { 0xe, 0x10 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x11 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x12 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x13 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x14 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x15 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x16 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x17 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x18 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x19 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x1f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x20 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x21 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x22 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x23 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x24 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x25 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x26 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x27 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x28 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x29 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x2f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x30 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x31 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x32 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x33 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x34 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x35 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x36 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x37 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x38 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x39 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x3f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x40 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x41 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x42 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x43 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x44 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x45 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x46 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x47 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x48 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x49 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x4f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x50 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x51 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x52 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x53 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x54 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x55 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x56 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x57 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x58 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x59 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x5f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x60 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x61 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x62 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x63 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x64 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x65 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x66 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x67 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x68 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x69 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x6f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x70 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x71 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x72 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x73 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x74 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x75 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x76 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x77 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x78 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x79 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x7f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x80 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x81 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x82 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x83 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x84 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x85 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x86 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x87 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x88 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x89 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x8f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x90 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x91 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x92 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x93 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x94 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x95 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x96 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x97 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x98 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x99 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9a }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9b }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9c }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9d }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9e }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0x9f }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xa9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xab }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xac }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xad }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xae }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xaf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xb9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xba }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xbf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xc9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xca }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xce }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xcf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xd9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xda }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xe9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xea }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xeb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xec }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xed }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xee }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xef }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf0 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf1 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf2 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf3 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf4 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf5 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf6 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf7 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf8 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xf9 }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfa }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfb }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfc }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfd }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xfe }, { 0xf, 0x00 }, -{ WAIT_IDLE }, { 0xe, 0xff }, { 0xf, 0x00 }, - -/* load page zero */ -{ 0x9, 0x05 }, { 0xb, 0x00 }, { 0xa, 0x00 }, - -{ 0xd, 0x01 }, { 0xc, 0x7c }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1e }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf5 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x32 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x13 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x14 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x18 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x10 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xd1 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xf2 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x13 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf4 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x15 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x50 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x71 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x92 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xb3 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xd4 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xf5 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x70 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x10 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1d }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdf }, { WAIT_IDLE }, - -/* Now load page one */ -{ 0x9, 0x05 }, { 0xb, 0x01 }, { 0xa, 0x00 }, - -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1f }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xd8 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x18 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xfa }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xa0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xd7 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xf7 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1c }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x3c }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x3f }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xdf }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x5d }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x7d }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0x9e }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xbe }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x03 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe0 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xfb }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1b }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x02 }, { 0xa, 0x00 }, - -{ 0xc, 0xc4 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x25 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xc, 0xc4 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x25 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x04 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x04 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x05 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x44 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x03 }, { 0xa, 0x00 }, - -{ 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x47 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x70 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x40 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x04 }, { 0xa, 0x00 }, - -{ 0xc, 0x63 }, { WAIT_IDLE }, -{ 0xc, 0x03 }, { WAIT_IDLE }, -{ 0xc, 0x26 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x2c }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x24 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x2e }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xc, 0x02 }, { WAIT_IDLE }, -{ 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, -{ 0xc, 0x21 }, { WAIT_IDLE }, -{ 0xc, 0x01 }, { WAIT_IDLE }, - -/* Load memory area (page six) */ -{ 0x9, 0x01 }, { 0xb, 0x06 }, - -{ 0xa, 0x00 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x02 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x04 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x06 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x08 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x0e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x10 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x12 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x14 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x16 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x18 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x20 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x22 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x24 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x26 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x28 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x30 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x32 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x34 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x36 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x38 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x42 }, { 0xd, 0x03 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x44 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x46 }, { 0xd, 0x0a }, { 0xc, 0x21 }, { WAIT_IDLE }, -{ 0xa, 0x48 }, { 0xd, 0x0d }, { 0xc, 0x23 }, { WAIT_IDLE }, -{ 0xa, 0x4a }, { 0xd, 0x23 }, { 0xc, 0x1b }, { WAIT_IDLE }, -{ 0xa, 0x4c }, { 0xd, 0x37 }, { 0xc, 0x8f }, { WAIT_IDLE }, -{ 0xa, 0x4e }, { 0xd, 0x45 }, { 0xc, 0x77 }, { WAIT_IDLE }, -{ 0xa, 0x50 }, { 0xd, 0x52 }, { 0xc, 0xe2 }, { WAIT_IDLE }, -{ 0xa, 0x52 }, { 0xd, 0x1c }, { 0xc, 0x92 }, { WAIT_IDLE }, -{ 0xa, 0x54 }, { 0xd, 0x1c }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xa, 0x56 }, { 0xd, 0x07 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x58 }, { 0xd, 0x2f }, { 0xc, 0xc6 }, { WAIT_IDLE }, -{ 0xa, 0x5a }, { 0xd, 0x0b }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x5c }, { 0xd, 0x30 }, { 0xc, 0x06 }, { WAIT_IDLE }, -{ 0xa, 0x5e }, { 0xd, 0x17 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x60 }, { 0xd, 0x3d }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xa, 0x62 }, { 0xd, 0x29 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x64 }, { 0xd, 0x3e }, { 0xc, 0x41 }, { WAIT_IDLE }, -{ 0xa, 0x66 }, { 0xd, 0x39 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x68 }, { 0xd, 0x4c }, { 0xc, 0x48 }, { WAIT_IDLE }, -{ 0xa, 0x6a }, { 0xd, 0x49 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x6c }, { 0xd, 0x4c }, { 0xc, 0x6c }, { WAIT_IDLE }, -{ 0xa, 0x6e }, { 0xd, 0x11 }, { 0xc, 0xd2 }, { WAIT_IDLE }, -{ 0xa, 0x70 }, { 0xd, 0x16 }, { 0xc, 0x0c }, { WAIT_IDLE }, -{ 0xa, 0x72 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x74 }, { 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xa, 0x76 }, { 0xd, 0x0f }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x78 }, { 0xd, 0x00 }, { 0xc, 0x80 }, { WAIT_IDLE }, -{ 0xa, 0x7a }, { 0xd, 0x13 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x7c }, { 0xd, 0x80 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x7e }, { 0xd, 0x80 }, { 0xc, 0x80 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x07 }, { 0xa, 0x00 }, - -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x08 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x8c }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x8c }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x1a }, { 0xc, 0x75 }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x8b }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xd, 0x0b }, { 0xc, 0x16 }, { WAIT_IDLE }, -{ 0xd, 0x1a }, { 0xc, 0x38 }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0xc8 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0x6f }, { WAIT_IDLE }, -{ 0xd, 0x0b }, { 0xc, 0x91 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x8f }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x7b }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x97 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0x97 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xd, 0x06 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x19 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x55 }, { WAIT_IDLE }, -{ 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -/* Now setup the MOD area. */ -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x08 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x09 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0a }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0b }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0c }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0d }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0f }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0xb0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb8 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb9 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xba }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbb }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbc }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbd }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbe }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xbf }, { 0xf, 0x20 }, { WAIT_IDLE }, - -{ 0xe, 0xf0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf8 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf9 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfa }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfb }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfc }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfd }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xfe }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xff }, { 0xf, 0x20 }, { WAIT_IDLE }, - -{ 0xe, 0x10 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x11 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x12 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x13 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x14 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x15 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x16 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x17 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x18 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x19 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1a }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1b }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1c }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1d }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x1e }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x1f }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x20 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x21 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x22 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x23 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x24 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x25 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x26 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x27 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x28 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x29 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2a }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2b }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2c }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2d }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x2e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x2f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x30 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x31 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x32 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x33 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x34 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x35 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x36 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x37 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x38 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x39 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x3f }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0x40 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x41 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x42 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x43 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x44 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x45 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x46 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x47 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x48 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x49 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x4e }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x4f }, { 0xf, 0x0e }, { WAIT_IDLE }, -{ 0xe, 0x50 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x51 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x52 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x53 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x54 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x55 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x56 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x57 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x58 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x59 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x5f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x60 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x61 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x62 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x63 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x64 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x65 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x66 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x67 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x68 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x69 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6c }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x6d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x6e }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x6f }, { 0xf, 0x40 }, { WAIT_IDLE }, -{ 0xe, 0x70 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x71 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x72 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x73 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x74 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x75 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x76 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x77 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x78 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x79 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7a }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7b }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7c }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7d }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7e }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x7f }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x80 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x81 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x82 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x83 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x84 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x85 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x86 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x87 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x88 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x89 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x8f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x90 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x91 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x92 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x93 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x94 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x95 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x96 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x97 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x98 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x99 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9a }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9b }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9c }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9d }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9e }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x9f }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xaa }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xab }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xac }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xad }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xae }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xaf }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0xc0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xca }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcc }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcd }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xce }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xcf }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xda }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdc }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xdd }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xde }, { 0xf, 0x10 }, { WAIT_IDLE }, -{ 0xe, 0xdf }, { 0xf, 0x10 }, { WAIT_IDLE }, -{ 0xe, 0xe0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe8 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe9 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xea }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xeb }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xec }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xed }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xee }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xef }, { 0xf, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0x01 }, { 0xf, 0x00 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x08 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x09 }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0a }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0b }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0c }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0d }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0e }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x0f }, { 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, - -/* mute on */ -{ 0x8, 0x02 }, - -/* Now set the coefficients and so forth for the programs above */ -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4b }, { 0xd, 0x03 }, { 0xc, 0x11 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4d }, { 0xd, 0x01 }, { 0xc, 0x32 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x40 }, { 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x41 }, { 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x47 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x4a }, { 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x00 }, { 0xd, 0x01 }, { 0xc, 0x1c }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x44 }, { 0xd, 0x01 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x42 }, { 0xd, 0x01 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xb, 0x00 }, { 0xa, 0x43 }, { 0xd, 0x01 }, { 0xc, 0x20 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x40 }, { 0xd, 0x02 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x01 }, { 0xa, 0x41 }, { 0xd, 0x02 }, { 0xc, 0x60 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x44 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x42 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x43 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x40 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x41 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x51 }, { 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x50 }, { 0xd, 0x06 }, { 0xc, 0x40 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4f }, { 0xd, 0x03 }, { 0xc, 0x81 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x53 }, { 0xd, 0x1a }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x54 }, { 0xd, 0x0d }, { 0xc, 0x8b }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x55 }, { 0xd, 0x04 }, { 0xc, 0xe9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x56 }, { 0xd, 0x0b }, { 0xc, 0x17 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x57 }, { 0xd, 0x1a }, { 0xc, 0x38 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x58 }, { 0xd, 0x0d }, { 0xc, 0xc9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x59 }, { 0xd, 0x04 }, { 0xc, 0x6f }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5a }, { 0xd, 0x0b }, { 0xc, 0x91 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x73 }, { 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x74 }, { 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x75 }, { 0xd, 0x04 }, { 0xc, 0xd9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x76 }, { 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x77 }, { 0xd, 0x14 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x78 }, { 0xd, 0x0d }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x79 }, { 0xd, 0x04 }, { 0xc, 0xd9 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7a }, { 0xd, 0x05 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5e }, { 0xd, 0x03 }, { 0xc, 0x68 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5c }, { 0xd, 0x04 }, { 0xc, 0x31 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x5d }, { 0xd, 0x04 }, { 0xc, 0x31 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x62 }, { 0xd, 0x03 }, { 0xc, 0x52 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x60 }, { 0xd, 0x04 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x61 }, { 0xd, 0x04 }, { 0xc, 0x76 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x66 }, { 0xd, 0x03 }, { 0xc, 0x2e }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x64 }, { 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x65 }, { 0xd, 0x04 }, { 0xc, 0xda }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x6a }, { 0xd, 0x02 }, { 0xc, 0xf6 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x68 }, { 0xd, 0x05 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x69 }, { 0xd, 0x05 }, { 0xc, 0x62 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x46 }, { 0xd, 0x0a }, { 0xc, 0x22 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x48 }, { 0xd, 0x0d }, { 0xc, 0x24 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x6e }, { 0xd, 0x11 }, { 0xc, 0xd3 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x70 }, { 0xd, 0x15 }, { 0xc, 0xcb }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x52 }, { 0xd, 0x20 }, { 0xc, 0x93 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x54 }, { 0xd, 0x20 }, { 0xc, 0x54 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4a }, { 0xd, 0x27 }, { 0xc, 0x1d }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x58 }, { 0xd, 0x2f }, { 0xc, 0xc8 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x5c }, { 0xd, 0x30 }, { 0xc, 0x07 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4c }, { 0xd, 0x37 }, { 0xc, 0x90 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x60 }, { 0xd, 0x3d }, { 0xc, 0xdb }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x64 }, { 0xd, 0x3e }, { 0xc, 0x42 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x4e }, { 0xd, 0x45 }, { 0xc, 0x78 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x68 }, { 0xd, 0x4c }, { 0xc, 0x48 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x6c }, { 0xd, 0x4c }, { 0xc, 0x6c }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x50 }, { 0xd, 0x52 }, { 0xc, 0xe2 }, { WAIT_IDLE }, -{ 0xb, 0x06 }, { 0xa, 0x42 }, { 0xd, 0x02 }, { 0xc, 0xba }, { WAIT_IDLE }, - -/* Some settings (?) */ -{ WAIT_IDLE }, { 0xe, 0x1e }, { 0xf, 0x14 }, -{ WAIT_IDLE }, { 0xe, 0xde }, { 0xf, 0x20 }, -{ WAIT_IDLE }, { 0xe, 0xdf }, { 0xf, 0x20 }, - -/* some more coefficients */ -{ WAIT_IDLE }, { 0xb, 0x06 }, { 0xa, 0x78 }, { 0xd, 0x00 }, { 0xc, 0x40 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x03 }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x0b }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x02 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x0a }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ WAIT_IDLE }, { 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, - -/* Now, for some strange reason, lets reload every page - and all the coefficients over again. I have *NO* idea - why this is done. I do know that no sound is produced - is this phase is omitted. */ -{ 0x9, 0x05 }, { 0xb, 0x00 }, { 0xa, 0x10 }, - -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x02 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x01 }, { 0xa, 0x10 }, - -{ 0xd, 0x01 }, { 0xc, 0xc0 }, { WAIT_IDLE }, -{ 0xd, 0x01 }, { 0xc, 0xfa }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x1a }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ WAIT_IDLE }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x02 }, { 0xa, 0x10 }, - -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x46 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x03 }, { 0xa, 0x10 }, - -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x04 }, { 0xa, 0x10 }, - -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xc, 0x00 }, { WAIT_IDLE }, - -/* Page six v.2 */ -{ 0x9, 0x01 }, { 0xb, 0x06 }, - -{ 0xa, 0x10 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x12 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x14 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x16 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x18 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x1e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x20 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x22 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x24 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x26 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x28 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x2e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x30 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x32 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x34 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x36 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x38 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xa, 0x3e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0x9, 0x05 }, { 0xb, 0x07 }, { 0xa, 0x10 }, - -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xb0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xb7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf0 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf1 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf2 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf3 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf4 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf5 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf6 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0xf7 }, { 0xf, 0x20 }, { WAIT_IDLE }, -{ 0xe, 0x10 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x11 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x12 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x13 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x14 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x15 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x16 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x17 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x20 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x21 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x22 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x23 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x24 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x25 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x26 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x27 }, { 0xf, 0xff }, { WAIT_IDLE }, -{ 0xe, 0x30 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x31 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x32 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x33 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x34 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x35 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x36 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x37 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x40 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x41 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x42 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x43 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x44 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x45 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x46 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x47 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x50 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x51 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x52 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x53 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x54 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x55 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x56 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x57 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x60 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x61 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x62 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x63 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x64 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x65 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x66 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x67 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x70 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x71 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x72 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x73 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x74 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x75 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x76 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x77 }, { 0xf, 0xc0 }, { WAIT_IDLE }, -{ 0xe, 0x80 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x81 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x82 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x83 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x84 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x85 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x86 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x87 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x90 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x91 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x92 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x93 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x94 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x95 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x96 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x97 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xa7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xc7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xd7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe0 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe1 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe2 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe3 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe4 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe5 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe6 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0xe7 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x00 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x02 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x03 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x04 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x05 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x06 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, -{ 0xe, 0x01 }, { 0xf, 0x07 }, { WAIT_IDLE }, -{ 0xe, 0x02 }, { 0xf, 0x01 }, { WAIT_IDLE }, - -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x45 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x48 }, { 0xd, 0x0f }, { 0xc, 0xff }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7b }, { 0xd, 0x04 }, { 0xc, 0xcc }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7d }, { 0xd, 0x04 }, { 0xc, 0xcc }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x7e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x46 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x49 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x47 }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4a }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x00 }, { WAIT_IDLE }, - -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x00 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x00 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x01 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x01 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x02 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x02 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x03 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x03 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x04 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x04 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x05 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x05 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x06 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x06 }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x07 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x07 }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x08 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x08 }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x09 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x09 }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0a }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0a }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0b }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0b }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x00 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x28 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x51 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0x7a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xa3 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xcc }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0c }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0c }, { 0xc, 0xf5 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x1e }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x47 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x70 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0x99 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0xc2 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0d }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0d }, { 0xc, 0xeb }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x14 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x3d }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x66 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0x8f }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0xb8 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0e }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0e }, { 0xc, 0xe1 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x0a }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x33 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x5c }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0x85 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xae }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xd7 }, -{ 0xb, 0x07 }, { 0xa, 0x4c }, { 0xd, 0x0f }, { 0xc, 0xff }, -{ 0xb, 0x07 }, { 0xa, 0x4e }, { 0xd, 0x0f }, { 0xc, 0xff }, - -/* mute off */ -{ 0x8, 0x00 }, { WAIT_IDLE } -}; -- cgit v0.10.2 From 31d3568dfeb1dfb2735f119efe5ece7c6d40969c Mon Sep 17 00:00:00 2001 From: Fenghua Yu Date: Mon, 6 Apr 2009 11:21:49 -0700 Subject: Intel-IOMMU Alignment Issue in dma_pte_clear_range() This issue was pointed out by Linus. In dma_pte_clear_range() in intel-iommu.c start = PAGE_ALIGN(start); end &= PAGE_MASK; npages = (end - start) / VTD_PAGE_SIZE; In partial page case, start could be bigger than end and npages will be negative. Currently the issue doesn't show up as a real bug in because start and end have been aligned to page boundary already by all callers. So the issue has been hidden. But it is dangerous programming practice. Signed-off-by: Fenghua Yu Signed-off-by: David Woodhouse diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index dcda521..f0dade1 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -733,8 +733,8 @@ static void dma_pte_clear_range(struct dmar_domain *domain, u64 start, u64 end) start &= (((u64)1) << addr_width) - 1; end &= (((u64)1) << addr_width) - 1; /* in case it's partial page */ - start = PAGE_ALIGN(start); - end &= PAGE_MASK; + start &= PAGE_MASK; + end = PAGE_ALIGN(end); npages = (end - start) / VTD_PAGE_SIZE; /* we don't need lock here, nobody else touches the iova range */ -- cgit v0.10.2 From 14fa86f7c7f46abc3a1c2f18d9cea859e8e700c0 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Mon, 6 Apr 2009 17:06:51 -0700 Subject: firmware/WHENCE: Add missing origin information for Ambassador atmsar11.fw Looks like we forgot to update WHENCE when we converted this driver. Signed-off-by: David Woodhouse diff --git a/firmware/WHENCE b/firmware/WHENCE index ff41dbf..afce746 100644 --- a/firmware/WHENCE +++ b/firmware/WHENCE @@ -8,6 +8,24 @@ kernel. -------------------------------------------------------------------------- +Driver: ambassador -- Madge Ambassador (Collage PCI 155 Server) ATM NIC. + +File: firmware/atmsar11.fw + +Licence: Allegedly GPLv2+, but no source visible. Marked: + + Madge Ambassador ATM Adapter microcode. + Copyright (C) 1995-1999 Madge Networks Ltd. + + This microcode data is placed under the terms of the GNU General + Public License. The GPL is contained in /usr/doc/copyright/GPL on a + Debian system and in the file COPYING in the Linux kernel source. + + We would prefer you not to distribute modified versions without + consultation and not to ask for assembly/other microcode source. + +-------------------------------------------------------------------------- + Driver: korg1212 -- Korg 1212 IO audio device File: korg/k1212.dsp -- cgit v0.10.2 From 9090589d87506c578ea1523ffd7ae7fd9424fb28 Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Tue, 7 Apr 2009 10:24:29 +0800 Subject: ACPI: convert acpi_device_lock spinlock to mutex Convert acpi_device_lock to a mutex to avoid a potential race upon access to /proc/acpi/wakeup Delete the lock entirely in wakeup.c since it is not necessary (and can not sleep) Found-by: Linus Torvalds Signed-off-by: Shaohua Li Signed-off-by: Len Brown diff --git a/drivers/acpi/proc.c b/drivers/acpi/proc.c index 05dfdc9..d0d550d 100644 --- a/drivers/acpi/proc.c +++ b/drivers/acpi/proc.c @@ -343,9 +343,6 @@ acpi_system_write_alarm(struct file *file, } #endif /* HAVE_ACPI_LEGACY_ALARM */ -extern struct list_head acpi_wakeup_device_list; -extern spinlock_t acpi_device_lock; - static int acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) { @@ -353,7 +350,7 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) seq_printf(seq, "Device\tS-state\t Status Sysfs node\n"); - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, wakeup_list); @@ -361,7 +358,6 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) if (!dev->wakeup.flags.valid) continue; - spin_unlock(&acpi_device_lock); ldev = acpi_get_physical_device(dev->handle); seq_printf(seq, "%s\t S%d\t%c%-8s ", @@ -376,9 +372,8 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) seq_printf(seq, "\n"); put_device(ldev); - spin_lock(&acpi_device_lock); } - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); return 0; } @@ -409,7 +404,7 @@ acpi_system_write_wakeup_device(struct file *file, strbuf[len] = '\0'; sscanf(strbuf, "%s", str); - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, wakeup_list); @@ -446,7 +441,7 @@ acpi_system_write_wakeup_device(struct file *file, } } } - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); return count; } diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 20c23c0..e63f2fe 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -24,7 +24,7 @@ extern struct acpi_device *acpi_root; static LIST_HEAD(acpi_device_list); static LIST_HEAD(acpi_bus_id_list); -DEFINE_SPINLOCK(acpi_device_lock); +DEFINE_MUTEX(acpi_device_lock); LIST_HEAD(acpi_wakeup_device_list); struct acpi_device_bus_id{ @@ -500,7 +500,7 @@ static int acpi_device_register(struct acpi_device *device, return -ENOMEM; } - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); /* * Find suitable bus_id and instance number in acpi_bus_id_list * If failed, create one and link it into acpi_bus_id_list @@ -528,7 +528,7 @@ static int acpi_device_register(struct acpi_device *device, list_add_tail(&device->g_list, &acpi_device_list); if (device->wakeup.flags.valid) list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list); - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); if (device->parent) device->dev.parent = &parent->dev; @@ -549,20 +549,20 @@ static int acpi_device_register(struct acpi_device *device, device->removal_type = ACPI_BUS_REMOVAL_NORMAL; return 0; end: - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); if (device->parent) { list_del(&device->node); list_del(&device->g_list); } else list_del(&device->g_list); list_del(&device->wakeup_list); - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); return result; } static void acpi_device_unregister(struct acpi_device *device, int type) { - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); if (device->parent) { list_del(&device->node); list_del(&device->g_list); @@ -570,7 +570,7 @@ static void acpi_device_unregister(struct acpi_device *device, int type) list_del(&device->g_list); list_del(&device->wakeup_list); - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); acpi_detach_data(device->handle, acpi_bus_data_handler); diff --git a/drivers/acpi/sleep.h b/drivers/acpi/sleep.h index cfaf8f5..8a8f3b3 100644 --- a/drivers/acpi/sleep.h +++ b/drivers/acpi/sleep.h @@ -5,3 +5,6 @@ extern int acpi_suspend (u32 state); extern void acpi_enable_wakeup_device_prep(u8 sleep_state); extern void acpi_enable_wakeup_device(u8 sleep_state); extern void acpi_disable_wakeup_device(u8 sleep_state); + +extern struct list_head acpi_wakeup_device_list; +extern struct mutex acpi_device_lock; diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c index 5aee8c2..88725dc 100644 --- a/drivers/acpi/wakeup.c +++ b/drivers/acpi/wakeup.c @@ -12,12 +12,14 @@ #include "internal.h" #include "sleep.h" +/* + * We didn't lock acpi_device_lock in the file, because it invokes oops in + * suspend/resume and isn't really required as this is called in S-state. At + * that time, there is no device hotplug + **/ #define _COMPONENT ACPI_SYSTEM_COMPONENT ACPI_MODULE_NAME("wakeup_devices") -extern struct list_head acpi_wakeup_device_list; -extern spinlock_t acpi_device_lock; - /** * acpi_enable_wakeup_device_prep - prepare wakeup devices * @sleep_state: ACPI state @@ -29,7 +31,6 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state) { struct list_head *node, *next; - spin_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, @@ -40,11 +41,8 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state) (sleep_state > (u32) dev->wakeup.sleep_state)) continue; - spin_unlock(&acpi_device_lock); acpi_enable_wakeup_device_power(dev, sleep_state); - spin_lock(&acpi_device_lock); } - spin_unlock(&acpi_device_lock); } /** @@ -60,7 +58,6 @@ void acpi_enable_wakeup_device(u8 sleep_state) * Caution: this routine must be invoked when interrupt is disabled * Refer ACPI2.0: P212 */ - spin_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, wakeup_list); @@ -74,22 +71,17 @@ void acpi_enable_wakeup_device(u8 sleep_state) if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared) || sleep_state > (u32) dev->wakeup.sleep_state) { if (dev->wakeup.flags.run_wake) { - spin_unlock(&acpi_device_lock); /* set_gpe_type will disable GPE, leave it like that */ acpi_set_gpe_type(dev->wakeup.gpe_device, dev->wakeup.gpe_number, ACPI_GPE_TYPE_RUNTIME); - spin_lock(&acpi_device_lock); } continue; } - spin_unlock(&acpi_device_lock); if (!dev->wakeup.flags.run_wake) acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number); - spin_lock(&acpi_device_lock); } - spin_unlock(&acpi_device_lock); } /** @@ -101,7 +93,6 @@ void acpi_disable_wakeup_device(u8 sleep_state) { struct list_head *node, *next; - spin_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, wakeup_list); @@ -112,19 +103,16 @@ void acpi_disable_wakeup_device(u8 sleep_state) if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared) || sleep_state > (u32) dev->wakeup.sleep_state) { if (dev->wakeup.flags.run_wake) { - spin_unlock(&acpi_device_lock); acpi_set_gpe_type(dev->wakeup.gpe_device, dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN); /* Re-enable it, since set_gpe_type will disable it */ acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number); - spin_lock(&acpi_device_lock); } continue; } - spin_unlock(&acpi_device_lock); acpi_disable_wakeup_device_power(dev); /* Never disable run-wake GPE */ if (!dev->wakeup.flags.run_wake) { @@ -133,16 +121,14 @@ void acpi_disable_wakeup_device(u8 sleep_state) acpi_clear_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, ACPI_NOT_ISR); } - spin_lock(&acpi_device_lock); } - spin_unlock(&acpi_device_lock); } int __init acpi_wakeup_device_init(void) { struct list_head *node, *next; - spin_lock(&acpi_device_lock); + mutex_lock(&acpi_device_lock); list_for_each_safe(node, next, &acpi_wakeup_device_list) { struct acpi_device *dev = container_of(node, struct acpi_device, @@ -150,15 +136,13 @@ int __init acpi_wakeup_device_init(void) /* In case user doesn't load button driver */ if (!dev->wakeup.flags.run_wake || dev->wakeup.state.enabled) continue; - spin_unlock(&acpi_device_lock); acpi_set_gpe_type(dev->wakeup.gpe_device, dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN); acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number); dev->wakeup.state.enabled = 1; - spin_lock(&acpi_device_lock); } - spin_unlock(&acpi_device_lock); + mutex_unlock(&acpi_device_lock); return 0; } -- cgit v0.10.2 From cec20f36d6e5a10db315714c6c3da90792368382 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Mon, 6 Apr 2009 17:24:16 -0700 Subject: firmware: Remove newly-added slicoss and sxg firmware images These are available elsewhere (for example in the linux-firmware.git repository); they have no business being added to the kernel source tree. We are only putting stuff in the firmware/ directory of the kernel source when it's extracted from long-standing drivers which used to include it directly. We didn't intend to open the floodgates to including megabytes of new firmware which was previously being distributed separately. Signed-off-by: David Woodhouse diff --git a/firmware/Makefile b/firmware/Makefile index a19e579..5aadbad 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -55,12 +55,6 @@ fw-shipped-$(CONFIG_SND_SB16_CSP) += sb16/mulaw_main.csp sb16/alaw_main.csp \ sb16/ima_adpcm_init.csp \ sb16/ima_adpcm_playback.csp \ sb16/ima_adpcm_capture.csp -fw-shipped-$(CONFIG_SLICOSS) += slicoss/gbdownload.sys slicoss/gbrcvucode.sys \ - slicoss/oasisdbgdownload.sys \ - slicoss/oasisdownload.sys \ - slicoss/oasisrcvucode.sys -fw-shipped-$(CONFIG_SXG) += sxg/saharadownloadB.sys \ - sxg/saharadbgdownloadB.sys fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \ yamaha/ds1e_ctrl.fw fw-shipped-$(CONFIG_SND_WAVEFRONT) += yamaha/yss225_registers.bin diff --git a/firmware/WHENCE b/firmware/WHENCE index afce746..929f9ed 100644 --- a/firmware/WHENCE +++ b/firmware/WHENCE @@ -408,59 +408,6 @@ Found in hex form in kernel source. -------------------------------------------------------------------------- -Driver: SLICOSS - Alacritech IS-NIC products - -File: slicoss/gbdownload.sys.ihex -File: slicoss/gbrcvucode.sys.ihex -File: slicoss/oasisdbgdownload.sys.ihex -File: slicoss/oasisdownload.sys.ihex -File: slicoss/oasisrcvucode.sys.ihex - -Licence: - Copyright (C) 1999-2009 Alacritech, Inc. - - as an unpublished work. This notice does not imply unrestricted or - public access to the source code from which this firmware image is - derived. Except as noted below this firmware image may not be - reproduced, used, sold or transferred to any third party without - Alacritech's prior written consent. All Rights Reserved. - - Permission is hereby granted for the distribution of this firmware - image as part of a Linux or other Open Source operating system kernel - in text or binary form as required. - - This firmware may not be modified and may only be used with - Alacritech hardware. - -Found in hex form in kernel source. - --------------------------------------------------------------------------- - -Driver: SXG - Alacritech IS-NIC products - -File: sxg/saharadownloadB.sys.ihex -File: sxg/saharadbgdownloadB.sys.ihex - -Licence: - Copyright (C) 1999-2009 Alacritech, Inc. - - as an unpublished work. This notice does not imply unrestricted or - public access to the source code from which this firmware image is - derived. Except as noted below this firmware image may not be - reproduced, used, sold or transferred to any third party without - Alacritech's prior written consent. All Rights Reserved. - - Permission is hereby granted for the distribution of this firmware - image as part of a Linux or other Open Source operating system kernel - in text or binary form as required. - - This firmware may not be modified and may only be used with - Alacritech hardware. - -Found in hex form in kernel source. - --------------------------------------------------------------------------- - Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter File: cxgb3/t3b_psram-1.1.0.bin.ihex diff --git a/firmware/slicoss/gbdownload.sys.ihex b/firmware/slicoss/gbdownload.sys.ihex deleted file mode 100644 index dc17e63..0000000 --- a/firmware/slicoss/gbdownload.sys.ihex +++ /dev/null @@ -1,6148 +0,0 @@ -:10000000020000000080000000000100000000006D -:10001000008000001200004081B200001800004083 -:1000200081B200001E00004081B2000003000040C9 -:1000300081B20000000000A898B001000480A24036 -:10004000FD7F00000900A249DD7D00000000004C9A -:1000500080B2010007000040D1B100000000004C58 -:1000600080B201000900A240757D000060000040E0 -:10007000619901000B00A8B17E3100000900004029 -:1000800081B200001100004081B2000000801FE931 -:1000900018310000000041E980B201000F0040E982 -:1000A00080B2000000000040A59901001600294020 -:1000B00081320000160014BC803200000F0093BC97 -:1000C000803200000000504081B2010000800040FA -:1000D00081B2000010000040A59901001C002940D9 -:1000E000813200001C0014BC80320000110093BC5F -:1000F000803200000000504081B2010001800040C9 -:1001000081B2000020000040A59901002200294092 -:1001100081320000220014BC803200000E0093BC2B -:100120008032000000000049DD8101002B01004009 -:10013000813201003C01004081320100270014BCE3 -:1001400080320000140113BC80320000549500403E -:1001500045990100FFFF0040E599010000002F4094 -:1001600049B1010000000040E1B101000000004B76 -:10017000B7B3010000000040B5B30100D900004052 -:10018000B333010000000040B6D30100320095E80F -:1001900080320000FFFF00E880880100B8002640A0 -:1001A0008132000000000040FDB30100000000406B -:1001B000FFB301003C002250836C000000000045AA -:1001C000FD930100A5A500A6B4A701003C00A25024 -:1001D000B573000000010040813201003C00A245DF -:1001E0008032000000000046FD9301004100004005 -:1001F00081B200007F000020F5CF01001C0100FA51 -:10020000B3330100A5A500DAB5AB01009900A250F7 -:10021000B563000000000044FD930100D5000044D8 -:10022000B333010000000040D5990100000000DA5E -:10023000D7B10100FFFF00DAED8B0100D5000046C9 -:10024000B333010008000040D5990100000000DA36 -:10025000D7B10100FF0000DAEF8B0100FF0000DAE8 -:10026000E38F0100D5000048B33301003C0000409B -:10027000D5990100FF0000DAD78D0100FFFF00DAF9 -:10028000F1DB0100FF0000DAE98B0100000000480B -:10029000E9E30100D500004BB33301002C0000401E -:1002A000D5990100000000DAD7B10100D500004C5B -:1002B000B3330100FFFF00DAEBDB0100D500004E95 -:1002C000B3330100030000DA818801000000005C04 -:1002D00081E00100FFFF00DAB5DB01005C00264091 -:1002E00081320000010000DAB5CF010000F000A764 -:1002F000B4870100000000DA819401000000004092 -:10030000D8B10100D5000050B3330100FFFF00DA7F -:10031000B58B01006200264CB5630000010000DAD5 -:10032000B5CF0100000000DADFB10100D5000052B6 -:10033000B3330100FF0000DA4B890100080000DA46 -:10034000DFF70100FF0000EFDF8B010069002240B2 -:10035000DF7F000000000047FD9301002000004007 -:10036000B39B0100D500004081320100060000402F -:10037000D5990100080000DAD7E50100F80000DA9D -:10038000B38B010034000040D5990100000000D972 -:10039000D7B10100020000D9D5C90100000000DA80 -:1003A000D7B1010022000040B39B0100D5000040FE -:1003B0008132010000000048B5F30100030000DABB -:1003C0007B89010000010040DD9B0100D500005D3C -:1003D000B3330100FFFF00DAE78B01008A002640FB -:1003E0008132000000000041FD9301000000005038 -:1003F000E7E3010000010040D5990100000000F68C -:10040000E7970100000000F3D7B10100D500005EBE -:10041000B3330100FF0000DAE58B01000000004863 -:10042000E5E3010008010040D5990100FF0000DA72 -:10043000B58F0100000000F7B5970100000000DA59 -:10044000D7B101003C010040D5990100000000F83F -:10045000E5970100000000F2D7B101000002004062 -:10046000DD9B0100960022F5813200000000004271 -:10047000FD930100000000EED5B10100000000F680 -:10048000EB970100000000F5D7B10100080000EA79 -:10049000D4C90100000000F7E3970100000000F15B -:1004A000D7B101003C0000EEDDCB0100000000EE02 -:1004B000D5B10100000000F8E9970100000000F448 -:1004C000D7B10100D500004AB3330100FFFF00DAC5 -:1004D000DD890100B700004081B20000000000404B -:1004E000D5990100050000A6D6B101009A1300EBD2 -:1004F000D699010008000040D5990100000200A62D -:10050000D6B10100010000EBD69901002C0000409B -:10051000D5990100050000A6D6B101009A1300EBA1 -:10052000D69901003C010040D5990100000200402D -:10053000D799010000000042FD9301003C000040FB -:10054000D5990100000000A6D6B10100000100EB22 -:10055000D699010000010040D5990100060000A6CF -:10056000D6B101009A1300EBD699010008010040B2 -:10057000D5990100000200A6D6B10100010000EBF0 -:10058000D699010000000040D9B1010000000040F0 -:10059000DFB1010006000040D5990100A00000A6CF -:1005A000D6B10100640000404B99010000000040FA -:1005B0007B99010002040040DD990100B70013BCE3 -:1005C0008032000002080040DD9901000000004C6C -:1005D000DD910100B80095E88430000000002FE9AB -:1005E000FAB3010000000040D1B10100FF00004259 -:1005F000808801003400004080CE0100B800A64091 -:1006000081320000C100004081320100028022409E -:1006100080320000B800004081B200000000004FAE -:1006200081B00100CA0009F981320000C80008F950 -:1006300081320000D4001FFDF9330000C7009EFD89 -:10064000813200000000004AF3930100000080485E -:10065000F3930100000000FDF7B3010000008049A2 -:10066000F3930100000000FC19B10100CF000AF96A -:1006700081320000000040FB81B20100000041FD1A -:1006800081B20100000780F9F38F0100000742F9F1 -:10069000F38F0100D300A2FFF76F0000000043407A -:1006A00081B201000000A2FFFBEF0000000080FC0F -:1006B000E1B101000000804081B00100D80006FED9 -:1006C0008132000000000041B3E301001C0100FA88 -:1006D000B3C30000DA0000428DB00000000000410A -:1006E0008DB001000004004083980100EB00004041 -:1006F000813201000000005083B0010000008496A8 -:1007000080B2000026010040813201002501004036 -:100710002D110100000000402D810100000000DAD1 -:10072000B5EB0100E400849680320000E500004053 -:10073000B593000000000040B5830100DE00A24137 -:1007400083500000000000422D810100260100417D -:100750002D01010000000041B3C30100DA00A241F5 -:100760008D500000000080DAB5BF01000000004B92 -:1007700081B00100000000DB81D00100000000D941 -:10078000B9B3010000000040B8E30100000000DC44 -:10079000B9EB010000000041B8970100150000DC32 -:1007A000B9E70100000000412D810100000000DBDD -:1007B00081B00100270100422D11010025010040F8 -:1007C0002D110100280100402D0101000000004111 -:1007D0002D910100260100408132010025010040D9 -:1007E0002D110100000000402D8101000000A241F8 -:1007F00081D000000000849680320100FF00A0DC60 -:10080000B96B0000F80000412D910000F800004194 -:100810002D810000D8000040B3330100000090DAC1 -:100820008BB000001100004588F401004000004436 -:1008300080CE01000000A44081B200000000A3446B -:1008400089EC00000000004289D001000000004255 -:1008500087B00100D9000043B2330100000000500E -:10086000B5F301000C01A0DA8B400000000000414C -:100870008BC001000000004187C001000801A241B7 -:1008800089500000FFFF00458888010010000045E6 -:100890008AF40100120190448A40000000000041E7 -:1008A0008BC00100FFFF00458AA8010000008050B6 -:1008B0008BE0010000800040F99B010000C0004077 -:1008C000B3CF01001C0100FC193101001C0140DA0A -:1008D00081320100000041DA81B2010000000041D4 -:1008E000F9C3010016019FDA813200000280004046 -:1008F00081B200000000004491B00100000000D966 -:100900002BB101001E019F9480320000180000945A -:1009100092E4010000000048B5F301000000004926 -:10092000B497010000000041B3C301001D01A241C2 -:1009300091500000000080402BB1010029010051BE -:1009400093B000002901004D93B000002901004937 -:1009500093B000000000004293B001002901A241C1 -:10096000935000000000804081B201000000104060 -:1009700081B201000000114081B20100000012406C -:1009800081B201000000134081B201000000144058 -:1009900081B201000000154081B201000000164044 -:1009A00081B201000000174081B201000000184030 -:1009B00081B201000000194081B2010000001A401C -:1009C00081B2010000001B4081B2010000001C4008 -:1009D00081B2010000001D4081B2010000001E40F4 -:1009E00081B2010000001F4081B201000000804080 -:1009F00081B2010000040040A199010000000050F4 -:100A0000A1D10100000000401BB001000000004027 -:100A100019B001000000004017B0010000000040C4 -:100A200015B001000000004013B0010000000040BC -:100A300011B00100000000400FB0010000000040B4 -:100A40000DB00100000000400BB0010000000040AC -:100A500009B001000000004007B0010000000040A4 -:100A600005B001000000004003B00100000000409C -:100A700001B0010044012048A15100000000804065 -:100A800081B201005001224B747D000000008040C3 -:100A900081B201006000004B60990100000000B1CC -:100AA0007EB101005101A840813200004E0100409A -:100AB00081B20000040080409798010000000058B7 -:100AC00007900100F39F004081B200000000004445 -:100AD000A5B30100AF02004081320100C502004011 -:100AE000813201000000005C07900100F39F00408C -:100AF000BFB300005F0122CC857F000000000051E1 -:100B000007900100F39F004081B200000000004008 -:100B100049B10100AE0300CBA3C90100D0140040CD -:100B2000A19B01000000002046B101000000004828 -:100B3000F1B10100000000D0F1B10100000000CAD5 -:100B4000F1B10100000000D5E1B101000700004053 -:100B5000619901002000002062DD01006801A840C9 -:100B600081320000000000CC85930100C5020040E6 -:100B700081320100D014004043990100000000FAC6 -:100B8000BAB30100000000FAA4B30100000000F8AD -:100B9000BCB3010000142F4081B00100000000E749 -:100BA000A7B30100000000D8A9B30100FF0000DDD9 -:100BB000818801000200004080F4010078010040BB -:100BC00080C80100880100DD813200000000004083 -:100BD00010B100008901004081B200008A0100408C -:100BE00081B200008B01004081B200008C01004006 -:100BF00081B200008D01004081B200008F010040F1 -:100C000081B200009101004081B200005501004016 -:100C100081B20000D201004081B2000055010040C5 -:100C200081B20000E001004081B20000E10100401B -:100C300081B200007F02004081B2000080020040CB -:100C400081B20000F19F004081B20000F29F00409D -:100C500081B200007701004181C01A005A01514061 -:100C600081B21A005A01524081B21A005A0155400D -:100C700081B21A005A01564081B21A005501918181 -:100C800080301A005A01454081B21A005501918204 -:100C900080301A005A01464081B200000000004036 -:100CA00089B0010000002F4081B001000014004015 -:100CB00049990100B50122DEE16D00000000004C01 -:100CC00049C101000000004181C001009401A2441B -:100CD000816C00000000004C49D101009C012240C1 -:100CE000E16D00009801A2418150000055010041D2 -:100CF000BFB3000000000042BFB301005501A00FC8 -:100D0000BD6F0000000000DEE1B101000000004402 -:100D100049C10100B701004019990100000042409B -:100D200081B20100000043FF85B00100000000DE39 -:100D300019B10100000042FF87B00100000043FF2D -:100D4000E1B101000000004449C1010000002FFF93 -:100D5000E1B10100081400A480CC0100AC012640E0 -:100D6000813200000000004185C00100AA01A24CB0 -:100D700081500000B60122D281320000B10122412F -:100D8000A56F00005501A2E081320000000000D2F2 -:100D9000C1B301000000005C8990010000004042E6 -:100DA00080B201000000414380B20100000000F069 -:100DB000889401005A010044E0B10000B3010048EA -:100DC00049C10000B101005B89900000B09F00A004 -:100DD0009EB000000000004D81B001000000004303 -:100DE000CB8301000000454081B20100BA01A2415D -:100DF000815000000000454081B2010000004540E4 -:100E000081B20100C4019182823000000000008A9A -:100E100080B00100B69F004080CE0100C301A64013 -:100E200081320000C401564081B20000000000532E -:100E30006F930100F39F00526F9300000000004D7C -:100E400081B0010000000042CD8301000000464057 -:100E500081B20100C701A24181500000000046405C -:100E600081B201000000464081B20100D1019181B0 -:100E7000823000000000008980B00100B69F004071 -:100E800080CE0100D001A64081320000D101554042 -:100E900081B20000000000526F930100F39F0053E5 -:100EA0006F9300000000004083B001000014004078 -:100EB000499901000000234081B00100DA0122DEDF -:100EC000E16D00000000004C49C10100000000413C -:100ED00081C00100D501A244816C0000550100438E -:100EE000BFB30000000000F818B10100000040F896 -:100EF00080B20100000041F080B20100000000401B -:100F0000F1B1010000000040F1B101005A010040C0 -:100F1000E1B10000E201004091B00000000000419A -:100F200091B00100D0142E4049B1010005000040ED -:100F3000A39B0100080000DD81F40100E7010040EF -:100F400080C801000000004010B10000ED01004029 -:100F500081B00000580100DEA1B30000FF01004095 -:100F600081B200000102004081B000000702004091 -:100F700081B20000570100DFE1B10000000000D0A5 -:100F8000BAB30100000000DEA1B10100020000D2EE -:100F9000A5E70100000000D2C1B30100000000007D -:100FA000F0B10100F7012244C1530000F601844171 -:100FB00081400000FA01004081320100000000D0B1 -:100FC00045B10100F1010041A1C10000B1020040A2 -:100FD00081320100C5020040813201005A0100DD6A -:100FE000A1B100000000004081B0010040000040BD -:100FF000A59B0100B102004081320100400000D3F6 -:10100000A7CB0100C50200E0A5B30000030000402B -:10101000A39B0100580100DEA1B3000000000044C2 -:10102000BFB30100000000DE819001005501A2BAAB -:1010300080040000600000DE619901000402A8B194 -:101040008030000057010040E0B10000000000D0F7 -:10105000BAB3010068020040819801005D02004DB2 -:101060008330010000000044E1B3010000000044AF -:10107000E3B3010000000044E5B3010000000044B8 -:10108000E9B3010000000044EBB30100000000449C -:10109000F5B3010000000044F7B301000000004474 -:1010A000F9B30100150222408F6F00007502004065 -:1010B000819801005D0200C7833001007D0200407D -:1010C000819801005D02004283300100000000E8C9 -:1010D000F1B10100000000E9F1B10100000000EAF7 -:1010E000F1B10100000000EBF1B10100000000854A -:1010F000F0B10100000000ECF1B10100000000EDD2 -:10110000F1B10100000000B2F0B10100E09F004029 -:101110008132010000000040F0B1010000000040F9 -:10112000F1B10100000000ABF0B10100000000B817 -:10113000F0B10100000000B9F0B10100000000BAF8 -:10114000F0B10100000000BBF0B101002902B8407D -:101150008130000000000040819001002B02B94066 -:101160008132000000000041819001002D02BA4050 -:101170008132000000000042819001002F02BB403C -:101180008132000000000043819001003102BC4028 -:101190008132000000000044819001003302BD4014 -:1011A0008132000000000045819001003502BE4000 -:1011B0008132000000000046819001003702BF40EC -:1011C0008132000000000047819001003902C840D0 -:1011D0008132000000000048819001003B02C940BC -:1011E0008132000000000049819001003D02CA40A8 -:1011F000813200000000004A819001003F02CB4094 -:10120000813200000000004B819001004102CC407F -:10121000813200000000004C819001004302CD406B -:10122000813200000000004D819001004502CE4057 -:10123000813200000000004E819001004702CF4043 -:10124000813200000000004F81900100000000404A -:10125000F0B1010040000040A59B0100AF0200403A -:1012600081320100C502004081320100D0142E06F7 -:10127000A5B30100400000D3A7CB0100000000F09F -:10128000F1B10100000000F1F1B10100000000F235 -:10129000F1B10100000000F4F1B10100000000F51F -:1012A000F1B10100000000FAF1B10100000000FB03 -:1012B000F1B10100000000FCF1B10100000000EB01 -:1012C000F1B10100000000EEF1B10100000000EFFB -:1012D000F1B10100000000F3F1B10100000000F6DF -:1012E000F1B10100000000FDF1B10100F70100C7FC -:1012F000E1B100000000804081B2010063020048BB -:1013000080320000000051401AB1010000004D4041 -:1013100081B201000000454081B201006002A2419B -:10132000835000005C02494081B20000000052403E -:101330001CB1010000004E4081B201000000464097 -:1013400081B201006502A241835000005C024A4064 -:1013500081B20000000000A09EB0010000000080EB -:10136000D8B30100000000A1D0B30100000000A22A -:10137000D2B30100000000A4D4B30100000000D0EB -:10138000D6B30100000000D1DCB30100000000D2A0 -:10139000DEB3010000000088DAB30100000000D4D1 -:1013A0008EB30100000000D3E6B30100000000ACE2 -:1013B000ECB3010000000099FAB30100000000D571 -:1013C000E0B30100000000D5E2B30100000000D549 -:1013D000E4B30100000000D5E8B30100000000D52F -:1013E000EAB30100000000D5F4B30100000000D50D -:1013F000F6B30100000000D5F8B30100000000C7FB -:10140000A9B101000000004F40B10100810200407D -:1014100091B000000000004191B0010007000040C1 -:10142000A39B0100080000DD81F40100850200405B -:1014300080C801000000004010B100008A02004096 -:1014400081B200009502004081B200009502004682 -:10145000A3B300009802004081B200009E02004049 -:1014600081B200008C022350A56F000000000050E4 -:10147000A5B30100BC020042A5630100C502004003 -:1014800081320100D0142D4049B10100000000D08C -:10149000BAB30100000000DEA1B10100000000F8B5 -:1014A00000B0010094022244A553000091020041C3 -:1014B000A1C100005A0100DDA1B10000BC0200DEA4 -:1014C000A1330100C5020040813201005A010040F1 -:1014D00081B2000000000045BFB301005501A2D257 -:1014E000777D0000000000D261B10100000000DE45 -:1014F00063B101009B02A840813200005A01004004 -:1015000081B20000BC020054A5330100C5020040B6 -:1015100081320100D0142D4049B10100000000F8D3 -:10152000D0B30100000000F8D2B30100000000F8C1 -:10153000D4B30100000000F8D6B30100000000F8A9 -:1015400008B10100A9020040819801005D02004637 -:10155000833001005A01004081B20000000000A069 -:101560009EB00100000000E843B10100000000E966 -:1015700045B10100000000EA49B10100000000EBA4 -:10158000A1B101000000004F40B10100000000E7E0 -:10159000A7B30100000000D8A9B30100000000407B -:1015A00049B10100AE0300CBA3C901000000002037 -:1015B00046B10100000000D2F1B10100000000D3EB -:1015C000F1B10100000000D4F1B10100000000D031 -:1015D000E1B10100000000D161B101002000002054 -:1015E00062DD0100B902A84081320000000080CC19 -:1015F00085930100000000E7A7B30100000000D8B8 -:10160000A9B301000000004049B10100AE0300CBC6 -:10161000A3C901000000002046B10100000000D273 -:10162000F1B10100000000D0F1B10100000000D3D1 -:10163000F1B10100B80200D4E1B100000000A2CC79 -:1016400085FF00000000005081B00100C702A241E8 -:1016500081500000C602A2F280300000000080CC61 -:10166000858301000000004081B00100CB0280A50D -:1016700080320000CC0200A5803200000000004152 -:1016800081C00100CD0280A58032000080010040B1 -:1016900083980100D602204F816C000000010040B9 -:1016A00083980100D602204B816C0000800000402E -:1016B00083980100D6022047816C000000000040A2 -:1016C000839801000000004182DC0100039000418A -:1016D000209901000000004049B1010000142F4C86 -:1016E00083B0010000000040F1B10100DA02A24124 -:1016F00083500000020000A580C80100DD02A2A501 -:10170000806C000020000090209901000000005F24 -:1017100023910100E0021F91803200003000009010 -:10172000209901000000005F23910100E3021F9156 -:10173000803200007000009020A901000000005FCE -:1017400023910100E6021F91803200000000005F3B -:1017500023910100E8021F91803200004068009050 -:1017600020A90100E0000040619901002100004033 -:1017700061990100220000406199010023000040AE -:10178000619901002400004061990100250000409A -:101790006199010026000040619901002700004086 -:1017A00061990100C000004061990100D01400401F -:1017B00045990100020100A680B001000403004029 -:1017C00080980100060500A682B0010008070041CC -:1017D0008298010000000040F0B1010000000041CB -:1017E000E0B10100300300408530010039030040C2 -:1017F00081320100D814004043990100FF02A2F891 -:10180000806C0000000322F0826C000000000042A7 -:1018100021910100D0142040E1B101003003000CFF -:10182000853001003003004D851001003003004E6B -:1018300085100100D014204FE1B101003003004FAA -:10184000851001003903000C85300100D8142043B5 -:1018500081B001000F0322F09E6E00003903004D9D -:1018600085100100D814204281B001000F0322F03E -:101870009E6E00003903004E85100100D8142041EF -:1018800081B001001103A2F09E6E0000000000492B -:1018900081E001000000004020950100030000905D -:1018A000208D010000000043219501000000001B75 -:1018B00089B00100D0142040E1B1010030030017CD -:1018C00085300100300300588510010030030059B5 -:1018D00085100100D014204FE1B101003003005AFF -:1018E000851001003903001785300100D81420400D -:1018F00081B00100230322F09E6E000039030058DE -:1019000085100100D814204181B00100230322F08A -:101910009E6E00003903005985100100D814204242 -:1019200081B001002703A2F09E6E0000030000902A -:10193000208D0100000000402095010000000018EB -:1019400089B001000000004088E001002F03A2429E -:10195000217D0000A5A5004081980100D014204001 -:10196000E0B101003003004484300100390300403D -:1019700081320100D814204081B201002F03A2F06F -:10198000806C00000000004189E00100E000804020 -:10199000619901007015004047990100000000485E -:1019A000F1B1010000000042F0B10100D01400408C -:1019B000F19901000000005587B4010004000040C7 -:1019C0006199010070150043629901003603A84037 -:1019D000813200004103004081B2000070150040D8 -:1019E0004799010000000048F1B10100D8140040FF -:1019F000F199010000000042F0B101000000005523 -:101A000087B4010002000040619901007015004395 -:101A1000629901003F03A8408132000000000048A5 -:101A200087B001004203A241875000000000A2F2EB -:101A300086B00000100000F186F40100410326404A -:101A4000813200000400004081B200000000004725 -:101A500084B001000000A248848400000000005F00 -:101A600061B101000000005C8F90010000000047A0 -:101A700062B101004903A84081320000F59F004790 -:101A800098300100000800478EC801004703005C41 -:101A90008F800000E00000406199010058152D4042 -:101AA0008DB00100D0142DF088B00100000000FAC4 -:101AB0008AB001000000004581B001000700004528 -:101AC00082880100000000438BF001000000004804 -:101AD00083E00100000000468294010020000041E4 -:101AE00060990100000000418DC001006403225F85 -:101AF0008D6C00005503A24181500000530300404B -:101B000081B20000080000408598010000000044F8 -:101B100082B001000000004186B00100001C0043BB -:101B200086D801000000A6418550010060030041F5 -:101B300083E000005E0300408132010000000048A5 -:101B400085E00100D0142F4684940100200000425B -:101B500060990100C00000406199010000008040D0 -:101B600081B20100070000458088010000000043A9 -:101B70008BF0010000040040839801006F03A04136 -:101B8000815000006D03004182E8000000008041A8 -:101B90008EC00100AE030040A39901000000005474 -:101BA00081B00100601500408598010008000040E8 -:101BB00040E401000000005A419401000000005080 -:101BC00041E001000000004240940100000000419B -:101BD00081C001000000A355816C0100000000419C -:101BE000A3C101007303005085C000000000004045 -:101BF00049B1010000020040839801000016004036 -:101C00004599010000000040F1B101007E03A241AE -:101C1000835000000000004085B001000B0000442C -:101C200082F401001A1500A686B00100701500406C -:101C30004599010000080040F199010000000042B0 -:101C4000F0B1010000160040E199010004000040DD -:101C50006199010070150043629901008803A84052 -:101C6000813200008A03225A737D00007A0000400E -:101C7000619901008B03A8B17E3100000008004289 -:101C800084C801008303A24183500000000080400B -:101C900081B201000400004081B200000400004055 -:101CA00081B200000400004081B200000400004046 -:101CB00081B200000400004081B200000400004036 -:101CC00081B200000400004081B200000400004026 -:101CD00081B200000400004081B200000400004016 -:101CE00081B200000400004081B200000400004006 -:101CF00081B200000400004081B2000004000040F6 -:101D000081B200000400004081B2000004000040E5 -:101D100081B200000400004081B2000004000040D5 -:101D200081B200000400004081B2000004000040C5 -:101D300081B200000400004081B2000004000040B5 -:101D400081B200000400004081B2000004000040A5 -:101D500081B200000400004081B200000400004095 -:101D600081B200000400004081B200000400004085 -:101D700081B200000400004081B200000400004075 -:101D800081B200000400004081B200000400004065 -:101D900081B200000400004081B200000400004055 -:101DA00081B200000400004081B200000400004045 -:101DB00081B200000400004081B200000400004035 -:101DC00081B200000400004081B200000400004025 -:101DD00081B200000400004081B200000400004015 -:101DE00081B200000400004081B200000400004005 -:101DF00081B200000400004081B2000004000040F5 -:101E000081B200000400004081B2000004000040E4 -:101E100081B200000400004081B2000004000040D4 -:101E200081B200000400004081B2000004000040C4 -:101E300081B200000400004081B2000004000040B4 -:101E400081B200000400004081B2000004000040A4 -:101E500081B200000400004081B200000400004094 -:101E600081B200000400004081B200000400004084 -:101E700081B200000400004081B200000400004074 -:101E800081B200000400004081B200000400004064 -:101E900081B200000400004081B200000400004054 -:101EA00081B200000400004081B200000400004044 -:101EB00081B200000400004081B200000400004034 -:101EC00081B200000400004081B200000400004024 -:101ED00081B200000400004081B200000400004014 -:101EE00081B200000400004081B200000400004004 -:101EF00081B200000400004081B2000004000040F4 -:101F000081B200000400004081B2000004000040E3 -:101F100081B200000400004081B2000004000040D3 -:101F200081B200000400004081B2000004000040C3 -:101F300081B200000400004081B2000004000040B3 -:101F400081B200000400004081B2000004000040A3 -:101F500081B200000400004081B200000400004093 -:101F600081B200000400004081B200000400004083 -:101F700081B200000400004081B200000400004073 -:101F800081B200000400004081B200000400004063 -:101F900081B200000400004081B200000400004053 -:101FA00081B200000400004081B200000400004043 -:101FB00081B200000400004081B200000400004033 -:101FC00081B200000400004081B200000400004023 -:101FD00081B200000400004081B200000400004013 -:101FE00081B200000400004081B200000400004003 -:101FF00081B200000400004081B2000004000040F3 -:1020000081B200000400004081B2000004000040E2 -:1020100081B200000400004081B2000004000040D2 -:1020200081B200000400004081B2000004000040C2 -:1020300081B200000400004081B2000004000040B2 -:1020400081B200000400004081B2000004000040A2 -:1020500081B200000400004081B200000400004092 -:1020600081B200000400004081B200000400004082 -:1020700081B200000400004081B200000400004072 -:1020800081B200000400004081B200000400004062 -:1020900081B200000400004081B200000400004052 -:1020A00081B200000400004081B200000400004042 -:1020B00081B200000400004081B200000400004032 -:1020C00081B200000400004081B200000400004022 -:1020D00081B200000400004081B200000400004012 -:1020E00081B200000400004081B200000400004002 -:1020F00081B200000400004081B2000004000040F2 -:1021000081B200000400004081B2000004000040E1 -:1021100081B200000400004081B2000004000040D1 -:1021200081B200000400004081B2000004000040C1 -:1021300081B200000400004081B2000004000040B1 -:1021400081B200000400004081B2000004000040A1 -:1021500081B200000400004081B200000400004091 -:1021600081B200000400004081B200000400004081 -:1021700081B200000400004081B200000400004071 -:1021800081B200000400004081B200000400004061 -:1021900081B200000400004081B200000400004051 -:1021A00081B200000400004081B200000400004041 -:1021B00081B200000400004081B200000400004031 -:1021C00081B200000400004081B200000400004021 -:1021D00081B200000400004081B200000400004011 -:1021E00081B200000400004081B200000400004001 -:1021F00081B200000400004081B2000004000040F1 -:1022000081B200000400004081B2000004000040E0 -:1022100081B200000400004081B2000004000040D0 -:1022200081B200000400004081B2000004000040C0 -:1022300081B200000400004081B2000004000040B0 -:1022400081B200000400004081B2000004000040A0 -:1022500081B200000400004081B200000400004090 -:1022600081B200000400004081B200000400004080 -:1022700081B200000400004081B200000400004070 -:1022800081B200000400004081B200000400004060 -:1022900081B200000400004081B200000400004050 -:1022A00081B200000400004081B200000400004040 -:1022B00081B200000400004081B200000400004030 -:1022C00081B200000400004081B200000400004020 -:1022D00081B200000400004081B200000400004010 -:1022E00081B200000400004081B200000400004000 -:1022F00081B200000400004081B2000004000040F0 -:1023000081B200000400004081B2000004000040DF -:1023100081B200000400004081B2000004000040CF -:1023200081B200000400004081B2000004000040BF -:1023300081B200000400004081B2000004000040AF -:1023400081B200000400004081B20000040000409F -:1023500081B200000400004081B20000040000408F -:1023600081B200000400004081B20000040000407F -:1023700081B200000400004081B20000040000406F -:1023800081B200000400004081B20000040000405F -:1023900081B200000400004081B20000040000404F -:1023A00081B200000400004081B20000040000403F -:1023B00081B200000400004081B20000040000402F -:1023C00081B200000400004081B20000040000401F -:1023D00081B200000400004081B20000040000400F -:1023E00081B200000400004081B2000004000040FF -:1023F00081B200000400004081B2000004000040EF -:1024000081B200000400004081B2000004000040DE -:1024100081B200000400004081B2000004000040CE -:1024200081B200000400004081B2000004000040BE -:1024300081B200000400004081B2000004000040AE -:1024400081B200000400004081B20000040000409E -:1024500081B200000400004081B20000040000408E -:1024600081B200000400004081B20000040000407E -:1024700081B200000400004081B20000040000406E -:1024800081B200000400004081B20000040000405E -:1024900081B200000400004081B20000040000404E -:1024A00081B200000400004081B20000040000403E -:1024B00081B200000400004081B20000040000402E -:1024C00081B200000400004081B20000040000401E -:1024D00081B200000400004081B20000040000400E -:1024E00081B200000400004081B2000004000040FE -:1024F00081B200000400004081B2000004000040EE -:1025000081B200000400004081B2000004000040DD -:1025100081B200000400004081B2000004000040CD -:1025200081B200000400004081B2000004000040BD -:1025300081B200000400004081B2000004000040AD -:1025400081B200000400004081B20000040000409D -:1025500081B200000400004081B20000040000408D -:1025600081B200000400004081B20000040000407D -:1025700081B200000400004081B20000040000406D -:1025800081B200000400004081B20000040000405D -:1025900081B200000400004081B20000040000404D -:1025A00081B200000400004081B20000040000403D -:1025B00081B200000400004081B20000040000402D -:1025C00081B200000400004081B20000040000401D -:1025D00081B200000400004081B20000040000400D -:1025E00081B200000400004081B2000004000040FD -:1025F00081B200000400004081B2000004000040ED -:1026000081B200000400004081B2000004000040DC -:1026100081B200000400004081B2000004000040CC -:1026200081B200000400004081B2000004000040BC -:1026300081B200000400004081B2000004000040AC -:1026400081B200000400004081B20000040000409C -:1026500081B200000400004081B20000040000408C -:1026600081B200000400004081B20000040000407C -:1026700081B200000400004081B20000040000406C -:1026800081B200000400004081B20000040000405C -:1026900081B200000400004081B20000040000404C -:1026A00081B200000400004081B20000040000403C -:1026B00081B200000400004081B20000040000402C -:1026C00081B200000400004081B20000040000401C -:1026D00081B200000400004081B20000040000400C -:1026E00081B200000400004081B2000004000040FC -:1026F00081B200000400004081B2000004000040EC -:1027000081B200000400004081B2000004000040DB -:1027100081B200000400004081B2000004000040CB -:1027200081B200000400004081B2000004000040BB -:1027300081B200000400004081B2000004000040AB -:1027400081B200000400004081B20000040000409B -:1027500081B200000400004081B20000040000408B -:1027600081B200000400004081B20000040000407B -:1027700081B200000400004081B20000040000406B -:1027800081B200000400004081B20000040000405B -:1027900081B200000400004081B20000040000404B -:1027A00081B200000400004081B20000040000403B -:1027B00081B200000400004081B20000040000402B -:1027C00081B200000400004081B20000040000401B -:1027D00081B200000400004081B20000040000400B -:1027E00081B200000400004081B2000004000040FB -:1027F00081B200000400004081B2000004000040EB -:1028000081B200000400004081B2000004000040DA -:1028100081B200000400004081B2000004000040CA -:1028200081B200000400004081B2000004000040BA -:1028300081B200000400004081B2000004000040AA -:1028400081B200000400004081B20000040000409A -:1028500081B200000400004081B20000040000408A -:1028600081B200000400004081B20000040000407A -:1028700081B200000400004081B20000040000406A -:1028800081B200000400004081B20000040000405A -:1028900081B200000400004081B20000040000404A -:1028A00081B200000400004081B20000040000403A -:1028B00081B200000400004081B20000040000402A -:1028C00081B200000400004081B20000040000401A -:1028D00081B200000400004081B20000040000400A -:1028E00081B200000400004081B2000004000040FA -:1028F00081B200000400004081B2000004000040EA -:1029000081B200000400004081B2000004000040D9 -:1029100081B200000400004081B2000004000040C9 -:1029200081B200000400004081B2000004000040B9 -:1029300081B200000400004081B2000004000040A9 -:1029400081B200000400004081B200000400004099 -:1029500081B200000400004081B200000400004089 -:1029600081B200000400004081B200000400004079 -:1029700081B200000400004081B200000400004069 -:1029800081B200000400004081B200000400004059 -:1029900081B200000400004081B200000400004049 -:1029A00081B200000400004081B200000400004039 -:1029B00081B200000400004081B200000400004029 -:1029C00081B200000400004081B200000400004019 -:1029D00081B200000400004081B200000400004009 -:1029E00081B200000400004081B2000004000040F9 -:1029F00081B200000400004081B2000004000040E9 -:102A000081B200000400004081B2000004000040D8 -:102A100081B200000400004081B2000004000040C8 -:102A200081B200000400004081B2000004000040B8 -:102A300081B200000400004081B2000004000040A8 -:102A400081B200000400004081B200000400004098 -:102A500081B200000400004081B200000400004088 -:102A600081B200000400004081B200000400004078 -:102A700081B200000400004081B200000400004068 -:102A800081B200000400004081B200000400004058 -:102A900081B200000400004081B200000400004048 -:102AA00081B200000400004081B200000400004038 -:102AB00081B200000400004081B200000400004028 -:102AC00081B200000400004081B200000400004018 -:102AD00081B200000400004081B200000400004008 -:102AE00081B200000400004081B2000004000040F8 -:102AF00081B200000400004081B2000004000040E8 -:102B000081B200000400004081B2000004000040D7 -:102B100081B200000400004081B2000004000040C7 -:102B200081B200000400004081B2000004000040B7 -:102B300081B200000400004081B2000004000040A7 -:102B400081B200000400004081B200000400004097 -:102B500081B200000400004081B200000400004087 -:102B600081B200000400004081B200000400004077 -:102B700081B200000400004081B200000400004067 -:102B800081B200000400004081B200000400004057 -:102B900081B200000400004081B200000400004047 -:102BA00081B200000400004081B200000400004037 -:102BB00081B200000400004081B200000400004027 -:102BC00081B200000400004081B200000400004017 -:102BD00081B200000400004081B200000400004007 -:102BE00081B200000400004081B2000004000040F7 -:102BF00081B200000400004081B2000004000040E7 -:102C000081B200000400004081B2000004000040D6 -:102C100081B200000400004081B2000004000040C6 -:102C200081B200000400004081B2000004000040B6 -:102C300081B200000400004081B2000004000040A6 -:102C400081B200000400004081B200000400004096 -:102C500081B200000400004081B200000400004086 -:102C600081B200000400004081B200000400004076 -:102C700081B200000400004081B200000400004066 -:102C800081B200000400004081B200000400004056 -:102C900081B200000400004081B200000400004046 -:102CA00081B200000400004081B200000400004036 -:102CB00081B200000400004081B200000400004026 -:102CC00081B200000400004081B200000400004016 -:102CD00081B200000400004081B200000400004006 -:102CE00081B200000400004081B2000004000040F6 -:102CF00081B200000400004081B2000004000040E6 -:102D000081B200000400004081B2000004000040D5 -:102D100081B200000400004081B2000004000040C5 -:102D200081B200000400004081B2000004000040B5 -:102D300081B200000400004081B2000004000040A5 -:102D400081B200000400004081B200000400004095 -:102D500081B200000400004081B200000400004085 -:102D600081B200000400004081B200000400004075 -:102D700081B200000400004081B200000400004065 -:102D800081B200000400004081B200000400004055 -:102D900081B200000400004081B200000400004045 -:102DA00081B200000400004081B200000400004035 -:102DB00081B200000400004081B200000400004025 -:102DC00081B200000400004081B200000400004015 -:102DD00081B200000400004081B200000400004005 -:102DE00081B200000400004081B2000004000040F5 -:102DF00081B200000400004081B2000004000040E5 -:102E000081B200000400004081B2000004000040D4 -:102E100081B200000400004081B2000004000040C4 -:102E200081B200000400004081B2000004000040B4 -:102E300081B200000400004081B2000004000040A4 -:102E400081B200000400004081B200000400004094 -:102E500081B200000400004081B200000400004084 -:102E600081B200000400004081B200000400004074 -:102E700081B200000400004081B200000400004064 -:102E800081B200000400004081B200000400004054 -:102E900081B200000400004081B200000400004044 -:102EA00081B200000400004081B200000400004034 -:102EB00081B200000400004081B200000400004024 -:102EC00081B200000400004081B200000400004014 -:102ED00081B200000400004081B200000400004004 -:102EE00081B200000400004081B2000004000040F4 -:102EF00081B200000400004081B2000004000040E4 -:102F000081B200000400004081B2000004000040D3 -:102F100081B200000400004081B2000004000040C3 -:102F200081B200000400004081B2000004000040B3 -:102F300081B200000400004081B2000004000040A3 -:102F400081B200000400004081B200000400004093 -:102F500081B200000400004081B200000400004083 -:102F600081B200000400004081B200000400004073 -:102F700081B200000400004081B200000400004063 -:102F800081B200000400004081B200000400004053 -:102F900081B200000400004081B200000400004043 -:102FA00081B200000400004081B200000400004033 -:102FB00081B200000400004081B200000400004023 -:102FC00081B200000400004081B200000400004013 -:102FD00081B200000400004081B200000400004003 -:102FE00081B200000400004081B2000004000040F3 -:102FF00081B200000400004081B2000004000040E3 -:1030000081B200000400004081B2000004000040D2 -:1030100081B200000400004081B2000004000040C2 -:1030200081B200000400004081B2000004000040B2 -:1030300081B200000400004081B2000004000040A2 -:1030400081B200000400004081B200000400004092 -:1030500081B200000400004081B200000400004082 -:1030600081B200000400004081B200000400004072 -:1030700081B200000400004081B200000400004062 -:1030800081B200000400004081B200000400004052 -:1030900081B200000400004081B200000400004042 -:1030A00081B200000400004081B200000400004032 -:1030B00081B200000400004081B200000400004022 -:1030C00081B200000400004081B200000400004012 -:1030D00081B200000400004081B200000400004002 -:1030E00081B200000400004081B2000004000040F2 -:1030F00081B200000400004081B2000004000040E2 -:1031000081B200000400004081B2000004000040D1 -:1031100081B200000400004081B2000004000040C1 -:1031200081B200000400004081B2000004000040B1 -:1031300081B200000400004081B2000004000040A1 -:1031400081B200000400004081B200000400004091 -:1031500081B200000400004081B200000400004081 -:1031600081B200000400004081B200000400004071 -:1031700081B200000400004081B200000400004061 -:1031800081B200000400004081B200000400004051 -:1031900081B200000400004081B200000400004041 -:1031A00081B200000400004081B200000400004031 -:1031B00081B200000400004081B200000400004021 -:1031C00081B200000400004081B200000400004011 -:1031D00081B200000400004081B200000400004001 -:1031E00081B200000400004081B2000004000040F1 -:1031F00081B200000400004081B2000004000040E1 -:1032000081B200000400004081B2000004000040D0 -:1032100081B200000400004081B2000004000040C0 -:1032200081B200000400004081B2000004000040B0 -:1032300081B200000400004081B2000004000040A0 -:1032400081B200000400004081B200000400004090 -:1032500081B200000400004081B200000400004080 -:1032600081B200000400004081B200000400004070 -:1032700081B200000400004081B200000400004060 -:1032800081B200000400004081B200000400004050 -:1032900081B200000400004081B200000400004040 -:1032A00081B200000400004081B200000400004030 -:1032B00081B200000400004081B200000400004020 -:1032C00081B200000400004081B200000400004010 -:1032D00081B200000400004081B200000400004000 -:1032E00081B200000400004081B2000004000040F0 -:1032F00081B200000400004081B2000004000040E0 -:1033000081B200000400004081B2000004000040CF -:1033100081B200000400004081B2000004000040BF -:1033200081B200000400004081B2000004000040AF -:1033300081B200000400004081B20000040000409F -:1033400081B200000400004081B20000040000408F -:1033500081B200000400004081B20000040000407F -:1033600081B200000400004081B20000040000406F -:1033700081B200000400004081B20000040000405F -:1033800081B200000400004081B20000040000404F -:1033900081B200000400004081B20000040000403F -:1033A00081B200000400004081B20000040000402F -:1033B00081B200000400004081B20000040000401F -:1033C00081B200000400004081B20000040000400F -:1033D00081B200000400004081B2000004000040FF -:1033E00081B200000400004081B2000004000040EF -:1033F00081B200000400004081B2000004000040DF -:1034000081B200000400004081B2000004000040CE -:1034100081B200000400004081B2000004000040BE -:1034200081B200000400004081B2000004000040AE -:1034300081B200000400004081B20000040000409E -:1034400081B200000400004081B20000040000408E -:1034500081B200000400004081B20000040000407E -:1034600081B200000400004081B20000040000406E -:1034700081B200000400004081B20000040000405E -:1034800081B200000400004081B20000040000404E -:1034900081B200000400004081B20000040000403E -:1034A00081B200000400004081B20000040000402E -:1034B00081B200000400004081B20000040000401E -:1034C00081B200000400004081B20000040000400E -:1034D00081B200000400004081B2000004000040FE -:1034E00081B200000400004081B2000004000040EE -:1034F00081B200000400004081B2000004000040DE -:1035000081B200000400004081B2000004000040CD -:1035100081B200000400004081B2000004000040BD -:1035200081B200000400004081B2000004000040AD -:1035300081B200000400004081B20000040000409D -:1035400081B200000400004081B20000040000408D -:1035500081B200000400004081B20000040000407D -:1035600081B200000400004081B20000040000406D -:1035700081B200000400004081B20000040000405D -:1035800081B200000400004081B20000040000404D -:1035900081B200000400004081B20000040000403D -:1035A00081B200000400004081B20000040000402D -:1035B00081B200000400004081B20000040000401D -:1035C00081B200000400004081B20000040000400D -:1035D00081B200000400004081B2000004000040FD -:1035E00081B200000400004081B2000004000040ED -:1035F00081B200000400004081B2000004000040DD -:1036000081B200000400004081B2000004000040CC -:1036100081B200000400004081B2000004000040BC -:1036200081B200000400004081B2000004000040AC -:1036300081B200000400004081B20000040000409C -:1036400081B200000400004081B20000040000408C -:1036500081B200000400004081B20000040000407C -:1036600081B200000400004081B20000040000406C -:1036700081B200000400004081B20000040000405C -:1036800081B200000400004081B20000040000404C -:1036900081B200000400004081B20000040000403C -:1036A00081B200000400004081B20000040000402C -:1036B00081B200000400004081B20000040000401C -:1036C00081B200000400004081B20000040000400C -:1036D00081B200000400004081B2000004000040FC -:1036E00081B200000400004081B2000004000040EC -:1036F00081B200000400004081B2000004000040DC -:1037000081B200000400004081B2000004000040CB -:1037100081B200000400004081B2000004000040BB -:1037200081B200000400004081B2000004000040AB -:1037300081B200000400004081B20000040000409B -:1037400081B200000400004081B20000040000408B -:1037500081B200000400004081B20000040000407B -:1037600081B200000400004081B20000040000406B -:1037700081B200000400004081B20000040000405B -:1037800081B200000400004081B20000040000404B -:1037900081B200000400004081B20000040000403B -:1037A00081B200000400004081B20000040000402B -:1037B00081B200000400004081B20000040000401B -:1037C00081B200000400004081B20000040000400B -:1037D00081B200000400004081B2000004000040FB -:1037E00081B200000400004081B2000004000040EB -:1037F00081B200000400004081B2000004000040DB -:1038000081B200000400004081B2000004000040CA -:1038100081B200000400004081B2000004000040BA -:1038200081B200000400004081B2000004000040AA -:1038300081B200000400004081B20000040000409A -:1038400081B200000400004081B20000040000408A -:1038500081B200000400004081B20000040000407A -:1038600081B200000400004081B20000040000406A -:1038700081B200000400004081B20000040000405A -:1038800081B200000400004081B20000040000404A -:1038900081B200000400004081B20000040000403A -:1038A00081B200000400004081B20000040000402A -:1038B00081B200000400004081B20000040000401A -:1038C00081B200000400004081B20000040000400A -:1038D00081B200000400004081B2000004000040FA -:1038E00081B200000400004081B2000004000040EA -:1038F00081B200000400004081B2000004000040DA -:1039000081B200000400004081B2000004000040C9 -:1039100081B200000400004081B2000004000040B9 -:1039200081B200000400004081B2000004000040A9 -:1039300081B200000400004081B200000400004099 -:1039400081B200000400004081B200000400004089 -:1039500081B200000400004081B200000400004079 -:1039600081B200000400004081B200000400004069 -:1039700081B200000400004081B200000400004059 -:1039800081B200000400004081B200000400004049 -:1039900081B200000400004081B200000400004039 -:1039A00081B200000400004081B200000400004029 -:1039B00081B200000400004081B200000400004019 -:1039C00081B200000400004081B200000400004009 -:1039D00081B200000400004081B2000004000040F9 -:1039E00081B200000400004081B2000004000040E9 -:1039F00081B200000400004081B2000004000040D9 -:103A000081B200000400004081B2000004000040C8 -:103A100081B200000400004081B2000004000040B8 -:103A200081B200000400004081B2000004000040A8 -:103A300081B200000400004081B200000400004098 -:103A400081B200000400004081B200000400004088 -:103A500081B200000400004081B200000400004078 -:103A600081B200000400004081B200000400004068 -:103A700081B200000400004081B200000400004058 -:103A800081B200000400004081B200000400004048 -:103A900081B200000400004081B200000400004038 -:103AA00081B200000400004081B200000400004028 -:103AB00081B200000400004081B200000400004018 -:103AC00081B200000400004081B200000400004008 -:103AD00081B200000400004081B2000004000040F8 -:103AE00081B200000400004081B2000004000040E8 -:103AF00081B200000400004081B2000004000040D8 -:103B000081B200000400004081B2000004000040C7 -:103B100081B200000400004081B2000004000040B7 -:103B200081B200000400004081B2000004000040A7 -:103B300081B200000400004081B200000400004097 -:103B400081B200000400004081B200000400004087 -:103B500081B200000400004081B200000400004077 -:103B600081B200000400004081B200000400004067 -:103B700081B200000400004081B200000400004057 -:103B800081B200000400004081B200000400004047 -:103B900081B200000400004081B200000400004037 -:103BA00081B200000400004081B200000400004027 -:103BB00081B200000400004081B200000400004017 -:103BC00081B200000400004081B200000400004007 -:103BD00081B200000400004081B2000004000040F7 -:103BE00081B200000400004081B2000004000040E7 -:103BF00081B200000400004081B2000004000040D7 -:103C000081B200000400004081B2000004000040C6 -:103C100081B200000400004081B2000004000040B6 -:103C200081B200000400004081B2000004000040A6 -:103C300081B200000400004081B200000400004096 -:103C400081B200000400004081B200000400004086 -:103C500081B200000400004081B200000400004076 -:103C600081B200000400004081B200000400004066 -:103C700081B200000400004081B200000400004056 -:103C800081B200000400004081B200000400004046 -:103C900081B200000400004081B200000400004036 -:103CA00081B200000400004081B200000400004026 -:103CB00081B200000400004081B200000400004016 -:103CC00081B200000400004081B200000400004006 -:103CD00081B200000400004081B2000004000040F6 -:103CE00081B200000400004081B2000004000040E6 -:103CF00081B200000400004081B2000004000040D6 -:103D000081B200000400004081B2000004000040C5 -:103D100081B200000400004081B2000004000040B5 -:103D200081B200000400004081B2000004000040A5 -:103D300081B200000400004081B200000400004095 -:103D400081B200000400004081B200000400004085 -:103D500081B200000400004081B200000400004075 -:103D600081B200000400004081B200000400004065 -:103D700081B200000400004081B200000400004055 -:103D800081B200000400004081B200000400004045 -:103D900081B200000400004081B200000400004035 -:103DA00081B200000400004081B200000400004025 -:103DB00081B200000400004081B200000400004015 -:103DC00081B200000400004081B200000400004005 -:103DD00081B200000400004081B2000004000040F5 -:103DE00081B200000400004081B2000004000040E5 -:103DF00081B200000400004081B2000004000040D5 -:103E000081B200000400004081B2000004000040C4 -:103E100081B200000400004081B2000004000040B4 -:103E200081B200000400004081B2000004000040A4 -:103E300081B200000400004081B200000400004094 -:103E400081B200000400004081B200000400004084 -:103E500081B200000400004081B200000400004074 -:103E600081B200000400004081B200000400004064 -:103E700081B200000400004081B200000400004054 -:103E800081B200000400004081B200000400004044 -:103E900081B200000400004081B200000400004034 -:103EA00081B200000400004081B200000400004024 -:103EB00081B200000400004081B200000400004014 -:103EC00081B200000400004081B200000400004004 -:103ED00081B200000400004081B2000004000040F4 -:103EE00081B200000400004081B2000004000040E4 -:103EF00081B200000400004081B2000004000040D4 -:103F000081B200000400004081B2000004000040C3 -:103F100081B200000400004081B2000004000040B3 -:103F200081B200000400004081B2000004000040A3 -:103F300081B200000400004081B200000400004093 -:103F400081B200000400004081B200000400004083 -:103F500081B200000400004081B200000400004073 -:103F600081B200000400004081B200000400004063 -:103F700081B200000400004081B200000400004053 -:103F800081B200000400004081B200000400004043 -:103F900081B200000400004081B200000400004033 -:103FA00081B200000400004081B200000400004023 -:103FB00081B200000400004081B200000400004013 -:103FC00081B200000400004081B200000400004003 -:103FD00081B200000400004081B2000004000040F3 -:103FE00081B200000400004081B2000004000040E3 -:103FF00081B200000400004081B2000004000040D3 -:1040000081B200000400004081B2000004000040C2 -:1040100081B200000400004081B2000004000040B2 -:1040200081B200000400004081B2000004000040A2 -:1040300081B200000400004081B200000400004092 -:1040400081B200000400004081B200000400004082 -:1040500081B200000400004081B200000400004072 -:1040600081B200000400004081B200000400004062 -:1040700081B200000400004081B200000400004052 -:1040800081B200000400004081B200000400004042 -:1040900081B200000400004081B200000400004032 -:1040A00081B200000400004081B200000400004022 -:1040B00081B200000400004081B200000400004012 -:1040C00081B200000400004081B200000400004002 -:1040D00081B200000400004081B2000004000040F2 -:1040E00081B200000400004081B2000004000040E2 -:1040F00081B200000400004081B2000004000040D2 -:1041000081B200000400004081B2000004000040C1 -:1041100081B200000400004081B2000004000040B1 -:1041200081B200000400004081B2000004000040A1 -:1041300081B200000400004081B200000400004091 -:1041400081B200000400004081B200000400004081 -:1041500081B200000400004081B200000400004071 -:1041600081B200000400004081B200000400004061 -:1041700081B200000400004081B200000400004051 -:1041800081B200000400004081B200000400004041 -:1041900081B200000400004081B200000400004031 -:1041A00081B200000400004081B200000400004021 -:1041B00081B200000400004081B200000400004011 -:1041C00081B200000400004081B200000400004001 -:1041D00081B200000400004081B2000004000040F1 -:1041E00081B200000400004081B2000004000040E1 -:1041F00081B200000400004081B2000004000040D1 -:1042000081B200000400004081B2000004000040C0 -:1042100081B200000400004081B2000004000040B0 -:1042200081B200000400004081B2000004000040A0 -:1042300081B200000400004081B200000400004090 -:1042400081B200000400004081B200000400004080 -:1042500081B200000400004081B200000400004070 -:1042600081B200000400004081B200000400004060 -:1042700081B200000400004081B200000400004050 -:1042800081B200000400004081B200000400004040 -:1042900081B200000400004081B200000400004030 -:1042A00081B200000400004081B200000400004020 -:1042B00081B200000400004081B200000400004010 -:1042C00081B200000400004081B200000400004000 -:1042D00081B200000400004081B2000004000040F0 -:1042E00081B200000400004081B2000004000040E0 -:1042F00081B200000400004081B2000004000040D0 -:1043000081B200000400004081B2000004000040BF -:1043100081B200000400004081B2000004000040AF -:1043200081B200000400004081B20000040000409F -:1043300081B200000400004081B20000040000408F -:1043400081B200000400004081B20000040000407F -:1043500081B200000400004081B20000040000406F -:1043600081B200000400004081B20000040000405F -:1043700081B200000400004081B20000040000404F -:1043800081B200000400004081B20000040000403F -:1043900081B200000400004081B20000040000402F -:1043A00081B200000400004081B20000040000401F -:1043B00081B200000400004081B20000040000400F -:1043C00081B200000400004081B2000004000040FF -:1043D00081B200000400004081B2000004000040EF -:1043E00081B200000400004081B2000004000040DF -:1043F00081B200000400004081B2000004000040CF -:1044000081B200000400004081B2000004000040BE -:1044100081B200000400004081B2000004000040AE -:1044200081B200000400004081B20000040000409E -:1044300081B200000400004081B20000040000408E -:1044400081B200000400004081B20000040000407E -:1044500081B200000400004081B20000040000406E -:1044600081B200000400004081B20000040000405E -:1044700081B200000400004081B20000040000404E -:1044800081B200000400004081B20000040000403E -:1044900081B200000400004081B20000040000402E -:1044A00081B200000400004081B20000040000401E -:1044B00081B200000400004081B20000040000400E -:1044C00081B200000400004081B2000004000040FE -:1044D00081B200000400004081B2000004000040EE -:1044E00081B200000400004081B2000004000040DE -:1044F00081B200000400004081B2000004000040CE -:1045000081B200000400004081B2000004000040BD -:1045100081B200000400004081B2000004000040AD -:1045200081B200000400004081B20000040000409D -:1045300081B200000400004081B20000040000408D -:1045400081B200000400004081B20000040000407D -:1045500081B200000400004081B20000040000406D -:1045600081B200000400004081B20000040000405D -:1045700081B200000400004081B20000040000404D -:1045800081B200000400004081B20000040000403D -:1045900081B200000400004081B20000040000402D -:1045A00081B200000400004081B20000040000401D -:1045B00081B200000400004081B20000040000400D -:1045C00081B200000400004081B2000004000040FD -:1045D00081B200000400004081B2000004000040ED -:1045E00081B200000400004081B2000004000040DD -:1045F00081B200000400004081B2000004000040CD -:1046000081B200000400004081B2000004000040BC -:1046100081B200000400004081B2000004000040AC -:1046200081B200000400004081B20000040000409C -:1046300081B200000400004081B20000040000408C -:1046400081B200000400004081B20000040000407C -:1046500081B200000400004081B20000040000406C -:1046600081B200000400004081B20000040000405C -:1046700081B200000400004081B20000040000404C -:1046800081B200000400004081B20000040000403C -:1046900081B200000400004081B20000040000402C -:1046A00081B200000400004081B20000040000401C -:1046B00081B200000400004081B20000040000400C -:1046C00081B200000400004081B2000004000040FC -:1046D00081B200000400004081B2000004000040EC -:1046E00081B200000400004081B2000004000040DC -:1046F00081B200000400004081B2000004000040CC -:1047000081B200000400004081B2000004000040BB -:1047100081B200000400004081B2000004000040AB -:1047200081B200000400004081B20000040000409B -:1047300081B200000400004081B20000040000408B -:1047400081B200000400004081B20000040000407B -:1047500081B200000400004081B20000040000406B -:1047600081B200000400004081B20000040000405B -:1047700081B200000400004081B20000040000404B -:1047800081B200000400004081B20000040000403B -:1047900081B200000400004081B20000040000402B -:1047A00081B200000400004081B20000040000401B -:1047B00081B200000400004081B20000040000400B -:1047C00081B200000400004081B2000004000040FB -:1047D00081B200000400004081B2000004000040EB -:1047E00081B200000400004081B2000004000040DB -:1047F00081B200000400004081B2000004000040CB -:1048000081B200000400004081B2000004000040BA -:1048100081B200000400004081B2000004000040AA -:1048200081B200000400004081B20000040000409A -:1048300081B200000400004081B20000040000408A -:1048400081B200000400004081B20000040000407A -:1048500081B200000400004081B20000040000406A -:1048600081B200000400004081B20000040000405A -:1048700081B200000400004081B20000040000404A -:1048800081B200000400004081B20000040000403A -:1048900081B200000400004081B20000040000402A -:1048A00081B200000400004081B20000040000401A -:1048B00081B200000400004081B20000040000400A -:1048C00081B200000400004081B2000004000040FA -:1048D00081B200000400004081B2000004000040EA -:1048E00081B200000400004081B2000004000040DA -:1048F00081B200000400004081B2000004000040CA -:1049000081B200000400004081B2000004000040B9 -:1049100081B200000400004081B2000004000040A9 -:1049200081B200000400004081B200000400004099 -:1049300081B200000400004081B200000400004089 -:1049400081B200000400004081B200000400004079 -:1049500081B200000400004081B200000400004069 -:1049600081B200000400004081B200000400004059 -:1049700081B200000400004081B200000400004049 -:1049800081B200000400004081B200000400004039 -:1049900081B200000400004081B200000400004029 -:1049A00081B200000400004081B200000400004019 -:1049B00081B200000400004081B200000400004009 -:1049C00081B200000400004081B2000004000040F9 -:1049D00081B200000400004081B2000004000040E9 -:1049E00081B200000400004081B2000004000040D9 -:1049F00081B200000400004081B2000004000040C9 -:104A000081B200000400004081B2000004000040B8 -:104A100081B200000400004081B2000004000040A8 -:104A200081B200000400004081B200000400004098 -:104A300081B200000400004081B200000400004088 -:104A400081B200000400004081B200000400004078 -:104A500081B200000400004081B200000400004068 -:104A600081B200000400004081B200000400004058 -:104A700081B200000400004081B200000400004048 -:104A800081B200000400004081B200000400004038 -:104A900081B200000400004081B200000400004028 -:104AA00081B200000400004081B200000400004018 -:104AB00081B200000400004081B200000400004008 -:104AC00081B200000400004081B2000004000040F8 -:104AD00081B200000400004081B2000004000040E8 -:104AE00081B200000400004081B2000004000040D8 -:104AF00081B200000400004081B2000004000040C8 -:104B000081B200000400004081B2000004000040B7 -:104B100081B200000400004081B2000004000040A7 -:104B200081B200000400004081B200000400004097 -:104B300081B200000400004081B200000400004087 -:104B400081B200000400004081B200000400004077 -:104B500081B200000400004081B200000400004067 -:104B600081B200000400004081B200000400004057 -:104B700081B200000400004081B200000400004047 -:104B800081B200000400004081B200000400004037 -:104B900081B200000400004081B200000400004027 -:104BA00081B200000400004081B200000400004017 -:104BB00081B200000400004081B200000400004007 -:104BC00081B200000400004081B2000004000040F7 -:104BD00081B200000400004081B2000004000040E7 -:104BE00081B200000400004081B2000004000040D7 -:104BF00081B200000400004081B2000004000040C7 -:104C000081B200000400004081B2000004000040B6 -:104C100081B200000400004081B2000004000040A6 -:104C200081B200000400004081B200000400004096 -:104C300081B200000400004081B200000400004086 -:104C400081B200000400004081B200000400004076 -:104C500081B200000400004081B200000400004066 -:104C600081B200000400004081B200000400004056 -:104C700081B200000400004081B200000400004046 -:104C800081B200000400004081B200000400004036 -:104C900081B200000400004081B200000400004026 -:104CA00081B200000400004081B200000400004016 -:104CB00081B200000400004081B200000400004006 -:104CC00081B200000400004081B2000004000040F6 -:104CD00081B200000400004081B2000004000040E6 -:104CE00081B200000400004081B2000004000040D6 -:104CF00081B200000400004081B2000004000040C6 -:104D000081B200000400004081B2000004000040B5 -:104D100081B200000400004081B2000004000040A5 -:104D200081B200000400004081B200000400004095 -:104D300081B200000400004081B200000400004085 -:104D400081B200000400004081B200000400004075 -:104D500081B200000400004081B200000400004065 -:104D600081B200000400004081B200000400004055 -:104D700081B200000400004081B200000400004045 -:104D800081B200000400004081B200000400004035 -:104D900081B200000400004081B200000400004025 -:104DA00081B200000400004081B200000400004015 -:104DB00081B200000400004081B200000400004005 -:104DC00081B200000400004081B2000004000040F5 -:104DD00081B200000400004081B2000004000040E5 -:104DE00081B200000400004081B2000004000040D5 -:104DF00081B200000400004081B2000004000040C5 -:104E000081B200000400004081B2000004000040B4 -:104E100081B200000400004081B2000004000040A4 -:104E200081B200000400004081B200000400004094 -:104E300081B200000400004081B200000400004084 -:104E400081B200000400004081B200000400004074 -:104E500081B200000400004081B200000400004064 -:104E600081B200000400004081B200000400004054 -:104E700081B200000400004081B200000400004044 -:104E800081B200000400004081B200000400004034 -:104E900081B200000400004081B200000400004024 -:104EA00081B200000400004081B200000400004014 -:104EB00081B200000400004081B200000400004004 -:104EC00081B200000400004081B2000004000040F4 -:104ED00081B200000400004081B2000004000040E4 -:104EE00081B200000400004081B2000004000040D4 -:104EF00081B200000400004081B2000004000040C4 -:104F000081B200000400004081B2000004000040B3 -:104F100081B200000400004081B2000004000040A3 -:104F200081B200000400004081B200000400004093 -:104F300081B200000400004081B200000400004083 -:104F400081B200000400004081B200000400004073 -:104F500081B200000400004081B200000400004063 -:104F600081B200000400004081B200000400004053 -:104F700081B200000400004081B200000400004043 -:104F800081B200000400004081B200000400004033 -:104F900081B200000400004081B200000400004023 -:104FA00081B200000400004081B200000400004013 -:104FB00081B200000400004081B200000400004003 -:104FC00081B200000400004081B2000004000040F3 -:104FD00081B200000400004081B2000004000040E3 -:104FE00081B200000400004081B2000004000040D3 -:104FF00081B200000400004081B2000004000040C3 -:1050000081B200000400004081B2000004000040B2 -:1050100081B200000400004081B2000004000040A2 -:1050200081B200000400004081B200000400004092 -:1050300081B200000400004081B200000400004082 -:1050400081B200000400004081B200000400004072 -:1050500081B200000400004081B200000400004062 -:1050600081B200000400004081B200000400004052 -:1050700081B200000400004081B200000400004042 -:1050800081B200000400004081B200000400004032 -:1050900081B200000400004081B200000400004022 -:1050A00081B200000400004081B200000400004012 -:1050B00081B200000400004081B200000400004002 -:1050C00081B200000400004081B2000004000040F2 -:1050D00081B200000400004081B2000004000040E2 -:1050E00081B200000400004081B2000004000040D2 -:1050F00081B200000400004081B2000004000040C2 -:1051000081B200000400004081B2000004000040B1 -:1051100081B200000400004081B2000004000040A1 -:1051200081B200000400004081B200000400004091 -:1051300081B200000400004081B200000400004081 -:1051400081B200000400004081B200000400004071 -:1051500081B200000400004081B200000400004061 -:1051600081B200000400004081B200000400004051 -:1051700081B200000400004081B200000400004041 -:1051800081B200000400004081B200000400004031 -:1051900081B200000400004081B200000400004021 -:1051A00081B200000400004081B200000400004011 -:1051B00081B200000400004081B200000400004001 -:1051C00081B200000400004081B2000004000040F1 -:1051D00081B200000400004081B2000004000040E1 -:1051E00081B200000400004081B2000004000040D1 -:1051F00081B200000400004081B2000004000040C1 -:1052000081B200000400004081B2000004000040B0 -:1052100081B200000400004081B2000004000040A0 -:1052200081B200000400004081B200000400004090 -:1052300081B200000400004081B200000400004080 -:1052400081B200000400004081B200000400004070 -:1052500081B200000400004081B200000400004060 -:1052600081B200000400004081B200000400004050 -:1052700081B200000400004081B200000400004040 -:1052800081B200000400004081B200000400004030 -:1052900081B200000400004081B200000400004020 -:1052A00081B200000400004081B200000400004010 -:1052B00081B200000400004081B200000400004000 -:1052C00081B200000400004081B2000004000040F0 -:1052D00081B200000400004081B2000004000040E0 -:1052E00081B200000400004081B2000004000040D0 -:1052F00081B200000400004081B2000004000040C0 -:1053000081B200000400004081B2000004000040AF -:1053100081B200000400004081B20000040000409F -:1053200081B200000400004081B20000040000408F -:1053300081B200000400004081B20000040000407F -:1053400081B200000400004081B20000040000406F -:1053500081B200000400004081B20000040000405F -:1053600081B200000400004081B20000040000404F -:1053700081B200000400004081B20000040000403F -:1053800081B200000400004081B20000040000402F -:1053900081B200000400004081B20000040000401F -:1053A00081B200000400004081B20000040000400F -:1053B00081B200000400004081B2000004000040FF -:1053C00081B200000400004081B2000004000040EF -:1053D00081B200000400004081B2000004000040DF -:1053E00081B200000400004081B2000004000040CF -:1053F00081B200000400004081B2000004000040BF -:1054000081B200000400004081B2000004000040AE -:1054100081B200000400004081B20000040000409E -:1054200081B200000400004081B20000040000408E -:1054300081B200000400004081B20000040000407E -:1054400081B200000400004081B20000040000406E -:1054500081B200000400004081B20000040000405E -:1054600081B200000400004081B20000040000404E -:1054700081B200000400004081B20000040000403E -:1054800081B200000400004081B20000040000402E -:1054900081B200000400004081B20000040000401E -:1054A00081B200000400004081B20000040000400E -:1054B00081B200000400004081B2000004000040FE -:1054C00081B200000400004081B2000004000040EE -:1054D00081B200000400004081B2000004000040DE -:1054E00081B200000400004081B2000004000040CE -:1054F00081B200000400004081B2000004000040BE -:1055000081B200000400004081B2000004000040AD -:1055100081B200000400004081B20000040000409D -:1055200081B200000400004081B20000040000408D -:1055300081B200000400004081B20000040000407D -:1055400081B200000400004081B20000040000406D -:1055500081B200000400004081B20000040000405D -:1055600081B200000400004081B20000040000404D -:1055700081B200000400004081B20000040000403D -:1055800081B200000400004081B20000040000402D -:1055900081B200000400004081B20000040000401D -:1055A00081B200000400004081B20000040000400D -:1055B00081B200000400004081B2000004000040FD -:1055C00081B200000400004081B2000004000040ED -:1055D00081B200000400004081B2000004000040DD -:1055E00081B200000400004081B2000004000040CD -:1055F00081B200000400004081B2000004000040BD -:1056000081B200000400004081B2000004000040AC -:1056100081B200000400004081B20000040000409C -:1056200081B200000400004081B20000040000408C -:1056300081B200000400004081B20000040000407C -:1056400081B200000400004081B20000040000406C -:1056500081B200000400004081B20000040000405C -:1056600081B200000400004081B20000040000404C -:1056700081B200000400004081B20000040000403C -:1056800081B200000400004081B20000040000402C -:1056900081B200000400004081B20000040000401C -:1056A00081B200000400004081B20000040000400C -:1056B00081B200000400004081B2000004000040FC -:1056C00081B200000400004081B2000004000040EC -:1056D00081B200000400004081B2000004000040DC -:1056E00081B200000400004081B2000004000040CC -:1056F00081B200000400004081B2000004000040BC -:1057000081B200000400004081B2000004000040AB -:1057100081B200000400004081B20000040000409B -:1057200081B200000400004081B20000040000408B -:1057300081B200000400004081B20000040000407B -:1057400081B200000400004081B20000040000406B -:1057500081B200000400004081B20000040000405B -:1057600081B200000400004081B20000040000404B -:1057700081B200000400004081B20000040000403B -:1057800081B200000400004081B20000040000402B -:1057900081B200000400004081B20000040000401B -:1057A00081B200000400004081B20000040000400B -:1057B00081B200000400004081B2000004000040FB -:1057C00081B200000400004081B2000004000040EB -:1057D00081B200000400004081B2000004000040DB -:1057E00081B200000400004081B2000004000040CB -:1057F00081B200000400004081B2000004000040BB -:1058000081B200000400004081B2000004000040AA -:1058100081B200000400004081B20000040000409A -:1058200081B200000400004081B20000040000408A -:1058300081B200000400004081B20000040000407A -:1058400081B200000400004081B20000040000406A -:1058500081B200000400004081B20000040000405A -:1058600081B200000400004081B20000040000404A -:1058700081B200000400004081B20000040000403A -:1058800081B200000400004081B20000040000402A -:1058900081B200000400004081B20000040000401A -:1058A00081B200000400004081B20000040000400A -:1058B00081B200000400004081B2000004000040FA -:1058C00081B200000400004081B2000004000040EA -:1058D00081B200000400004081B2000004000040DA -:1058E00081B200000400004081B2000004000040CA -:1058F00081B200000400004081B2000004000040BA -:1059000081B200000400004081B2000004000040A9 -:1059100081B200000400004081B200000400004099 -:1059200081B200000400004081B200000400004089 -:1059300081B200000400004081B200000400004079 -:1059400081B200000400004081B200000400004069 -:1059500081B200000400004081B200000400004059 -:1059600081B200000400004081B200000400004049 -:1059700081B200000400004081B200000400004039 -:1059800081B200000400004081B200000400004029 -:1059900081B200000400004081B200000400004019 -:1059A00081B200000400004081B200000400004009 -:1059B00081B200000400004081B2000004000040F9 -:1059C00081B200000400004081B2000004000040E9 -:1059D00081B200000400004081B2000004000040D9 -:1059E00081B200000400004081B2000004000040C9 -:1059F00081B200000400004081B2000004000040B9 -:105A000081B200000400004081B2000004000040A8 -:105A100081B200000400004081B200000400004098 -:105A200081B200000400004081B200000400004088 -:105A300081B200000400004081B200000400004078 -:105A400081B200000400004081B200000400004068 -:105A500081B200000400004081B200000400004058 -:105A600081B200000400004081B200000400004048 -:105A700081B200000400004081B200000400004038 -:105A800081B200000400004081B200000400004028 -:105A900081B200000400004081B200000400004018 -:105AA00081B200000400004081B200000400004008 -:105AB00081B200000400004081B2000004000040F8 -:105AC00081B200000400004081B2000004000040E8 -:105AD00081B200000400004081B2000004000040D8 -:105AE00081B200000400004081B2000004000040C8 -:105AF00081B200000400004081B2000004000040B8 -:105B000081B200000400004081B2000004000040A7 -:105B100081B200000400004081B200000400004097 -:105B200081B200000400004081B200000400004087 -:105B300081B200000400004081B200000400004077 -:105B400081B200000400004081B200000400004067 -:105B500081B200000400004081B200000400004057 -:105B600081B200000400004081B200000400004047 -:105B700081B200000400004081B200000400004037 -:105B800081B200000400004081B200000400004027 -:105B900081B200000400004081B200000400004017 -:105BA00081B200000400004081B200000400004007 -:105BB00081B200000400004081B2000004000040F7 -:105BC00081B200000400004081B2000004000040E7 -:105BD00081B200000400004081B2000004000040D7 -:105BE00081B200000400004081B2000004000040C7 -:105BF00081B200000400004081B2000004000040B7 -:105C000081B200000400004081B2000004000040A6 -:105C100081B200000400004081B200000400004096 -:105C200081B200000400004081B200000400004086 -:105C300081B200000400004081B200000400004076 -:105C400081B200000400004081B200000400004066 -:105C500081B200000400004081B200000400004056 -:105C600081B200000400004081B200000400004046 -:105C700081B200000400004081B200000400004036 -:105C800081B200000400004081B200000400004026 -:105C900081B200000400004081B200000400004016 -:105CA00081B200000400004081B200000400004006 -:105CB00081B200000400004081B2000004000040F6 -:105CC00081B200000400004081B2000004000040E6 -:105CD00081B200000400004081B2000004000040D6 -:105CE00081B200000400004081B2000004000040C6 -:105CF00081B200000400004081B2000004000040B6 -:105D000081B200000400004081B2000004000040A5 -:105D100081B200000400004081B200000400004095 -:105D200081B200000400004081B200000400004085 -:105D300081B200000400004081B200000400004075 -:105D400081B200000400004081B200000400004065 -:105D500081B200000400004081B200000400004055 -:105D600081B200000400004081B200000400004045 -:105D700081B200000400004081B200000400004035 -:105D800081B200000400004081B200000400004025 -:105D900081B200000400004081B200000400004015 -:105DA00081B200000400004081B200000400004005 -:105DB00081B200000400004081B2000004000040F5 -:105DC00081B200000400004081B2000004000040E5 -:105DD00081B200000400004081B2000004000040D5 -:105DE00081B200000400004081B2000004000040C5 -:105DF00081B200000400004081B2000004000040B5 -:105E000081B200000400004081B2000004000040A4 -:105E100081B200000400004081B200000400004094 -:105E200081B200000400004081B200000400004084 -:105E300081B200000400004081B200000400004074 -:105E400081B200000400004081B200000400004064 -:105E500081B200000400004081B200000400004054 -:105E600081B200000400004081B200000400004044 -:105E700081B200000400004081B200000400004034 -:105E800081B200000400004081B200000400004024 -:105E900081B200000400004081B200000400004014 -:105EA00081B200000400004081B200000400004004 -:105EB00081B200000400004081B2000004000040F4 -:105EC00081B200000400004081B2000004000040E4 -:105ED00081B200000400004081B2000004000040D4 -:105EE00081B200000400004081B2000004000040C4 -:105EF00081B200000400004081B2000004000040B4 -:105F000081B200000400004081B2000004000040A3 -:105F100081B200000400004081B200000400004093 -:105F200081B200000400004081B200000400004083 -:105F300081B200000400004081B200000400004073 -:105F400081B200000400004081B200000400004063 -:105F500081B200000400004081B200000400004053 -:105F600081B200000400004081B200000400004043 -:105F700081B200000400004081B200000400004033 -:105F800081B200000400004081B200000400004023 -:105F900081B200000400004081B200000400004013 -:105FA00081B200000400004081B200000400004003 -:105FB00081B200000400004081B2000004000040F3 -:105FC00081B200000400004081B2000004000040E3 -:105FD00081B200000400004081B2000004000040D3 -:105FE00081B200000400004081B2000004000040C3 -:105FF00081B200000400004081B2000004000040B3 -:1060000081B200000400004081B2000004000040A2 -:1060100081B200000400004081B200000400004092 -:1060200081B200000400004081B200000400004082 -:1060300081B200000400004081B200000400004072 -:1060400081B200000400004081B200000400004062 -:1060500081B200000400004081B200000400004052 -:1060600081B200000400004081B200000400004042 -:1060700081B200000400004081B200000400004032 -:1060800081B200000400004081B200000400004022 -:1060900081B200000400004081B200000400004012 -:1060A00081B200000400004081B200000400004002 -:1060B00081B200000400004081B2000004000040F2 -:1060C00081B200000400004081B2000004000040E2 -:1060D00081B200000400004081B2000004000040D2 -:1060E00081B200000400004081B2000004000040C2 -:1060F00081B200000400004081B2000004000040B2 -:1061000081B200000400004081B2000004000040A1 -:1061100081B200000400004081B200000400004091 -:1061200081B200000400004081B200000400004081 -:1061300081B200000400004081B200000400004071 -:1061400081B200000400004081B200000400004061 -:1061500081B200000400004081B200000400004051 -:1061600081B200000400004081B200000400004041 -:1061700081B200000400004081B200000400004031 -:1061800081B200000400004081B200000400004021 -:1061900081B200000400004081B200000400004011 -:1061A00081B200000400004081B200000400004001 -:1061B00081B200000400004081B2000004000040F1 -:1061C00081B200000400004081B2000004000040E1 -:1061D00081B200000400004081B2000004000040D1 -:1061E00081B200000400004081B2000004000040C1 -:1061F00081B200000400004081B2000004000040B1 -:1062000081B200000400004081B2000004000040A0 -:1062100081B200000400004081B200000400004090 -:1062200081B200000400004081B200000400004080 -:1062300081B200000400004081B200000400004070 -:1062400081B200000400004081B200000400004060 -:1062500081B200000400004081B200000400004050 -:1062600081B200000400004081B200000400004040 -:1062700081B200000400004081B200000400004030 -:1062800081B200000400004081B200000400004020 -:1062900081B200000400004081B200000400004010 -:1062A00081B200000400004081B200000400004000 -:1062B00081B200000400004081B2000004000040F0 -:1062C00081B200000400004081B2000004000040E0 -:1062D00081B200000400004081B2000004000040D0 -:1062E00081B200000400004081B2000004000040C0 -:1062F00081B200000400004081B2000004000040B0 -:1063000081B200000400004081B20000040000409F -:1063100081B200000400004081B20000040000408F -:1063200081B200000400004081B20000040000407F -:1063300081B200000400004081B20000040000406F -:1063400081B200000400004081B20000040000405F -:1063500081B200000400004081B20000040000404F -:1063600081B200000400004081B20000040000403F -:1063700081B200000400004081B20000040000402F -:1063800081B200000400004081B20000040000401F -:1063900081B200000400004081B20000040000400F -:1063A00081B200000400004081B2000004000040FF -:1063B00081B200000400004081B2000004000040EF -:1063C00081B200000400004081B2000004000040DF -:1063D00081B200000400004081B2000004000040CF -:1063E00081B200000400004081B2000004000040BF -:1063F00081B200000400004081B2000004000040AF -:1064000081B200000400004081B20000040000409E -:1064100081B200000400004081B20000040000408E -:1064200081B200000400004081B20000040000407E -:1064300081B200000400004081B20000040000406E -:1064400081B200000400004081B20000040000405E -:1064500081B200000400004081B20000040000404E -:1064600081B200000400004081B20000040000403E -:1064700081B200000400004081B20000040000402E -:1064800081B200000400004081B20000040000401E -:1064900081B200000400004081B20000040000400E -:1064A00081B200000400004081B2000004000040FE -:1064B00081B200000400004081B2000004000040EE -:1064C00081B200000400004081B2000004000040DE -:1064D00081B200000400004081B2000004000040CE -:1064E00081B200000400004081B2000004000040BE -:1064F00081B200000400004081B2000004000040AE -:1065000081B200000400004081B20000040000409D -:1065100081B200000400004081B20000040000408D -:1065200081B200000400004081B20000040000407D -:1065300081B200000400004081B20000040000406D -:1065400081B200000400004081B20000040000405D -:1065500081B200000400004081B20000040000404D -:1065600081B200000400004081B20000040000403D -:1065700081B200000400004081B20000040000402D -:1065800081B200000400004081B20000040000401D -:1065900081B200000400004081B20000040000400D -:1065A00081B200000400004081B2000004000040FD -:1065B00081B200000400004081B2000004000040ED -:1065C00081B200000400004081B2000004000040DD -:1065D00081B200000400004081B2000004000040CD -:1065E00081B200000400004081B2000004000040BD -:1065F00081B200000400004081B2000004000040AD -:1066000081B200000400004081B20000040000409C -:1066100081B200000400004081B20000040000408C -:1066200081B200000400004081B20000040000407C -:1066300081B200000400004081B20000040000406C -:1066400081B200000400004081B20000040000405C -:1066500081B200000400004081B20000040000404C -:1066600081B200000400004081B20000040000403C -:1066700081B200000400004081B20000040000402C -:1066800081B200000400004081B20000040000401C -:1066900081B200000400004081B20000040000400C -:1066A00081B200000400004081B2000004000040FC -:1066B00081B200000400004081B2000004000040EC -:1066C00081B200000400004081B2000004000040DC -:1066D00081B200000400004081B2000004000040CC -:1066E00081B200000400004081B2000004000040BC -:1066F00081B200000400004081B2000004000040AC -:1067000081B200000400004081B20000040000409B -:1067100081B200000400004081B20000040000408B -:1067200081B200000400004081B20000040000407B -:1067300081B200000400004081B20000040000406B -:1067400081B200000400004081B20000040000405B -:1067500081B200000400004081B20000040000404B -:1067600081B200000400004081B20000040000403B -:1067700081B200000400004081B20000040000402B -:1067800081B200000400004081B20000040000401B -:1067900081B200000400004081B20000040000400B -:1067A00081B200000400004081B2000004000040FB -:1067B00081B200000400004081B2000004000040EB -:1067C00081B200000400004081B2000004000040DB -:1067D00081B200000400004081B2000004000040CB -:1067E00081B200000400004081B2000004000040BB -:1067F00081B200000400004081B2000004000040AB -:1068000081B200000400004081B20000040000409A -:1068100081B200000400004081B20000040000408A -:1068200081B200000400004081B20000040000407A -:1068300081B200000400004081B20000040000406A -:1068400081B200000400004081B20000040000405A -:1068500081B200000400004081B20000040000404A -:1068600081B200000400004081B20000040000403A -:1068700081B200000400004081B20000040000402A -:1068800081B200000400004081B20000040000401A -:1068900081B200000400004081B20000040000400A -:1068A00081B200000400004081B2000004000040FA -:1068B00081B200000400004081B2000004000040EA -:1068C00081B200000400004081B2000004000040DA -:1068D00081B200000400004081B2000004000040CA -:1068E00081B200000400004081B2000004000040BA -:1068F00081B200000400004081B2000004000040AA -:1069000081B200000400004081B200000400004099 -:1069100081B200000400004081B200000400004089 -:1069200081B200000400004081B200000400004079 -:1069300081B200000400004081B200000400004069 -:1069400081B200000400004081B200000400004059 -:1069500081B200000400004081B200000400004049 -:1069600081B200000400004081B200000400004039 -:1069700081B200000400004081B200000400004029 -:1069800081B200000400004081B200000400004019 -:1069900081B200000400004081B200000400004009 -:1069A00081B200000400004081B2000004000040F9 -:1069B00081B200000400004081B2000004000040E9 -:1069C00081B200000400004081B2000004000040D9 -:1069D00081B200000400004081B2000004000040C9 -:1069E00081B200000400004081B2000004000040B9 -:1069F00081B200000400004081B2000004000040A9 -:106A000081B200000400004081B200000400004098 -:106A100081B200000400004081B200000400004088 -:106A200081B200000400004081B200000400004078 -:106A300081B200000400004081B200000400004068 -:106A400081B200000400004081B200000400004058 -:106A500081B200000400004081B200000400004048 -:106A600081B200000400004081B200000400004038 -:106A700081B200000400004081B200000400004028 -:106A800081B200000400004081B200000400004018 -:106A900081B200000400004081B200000400004008 -:106AA00081B200000400004081B2000004000040F8 -:106AB00081B200000400004081B2000004000040E8 -:106AC00081B200000400004081B2000004000040D8 -:106AD00081B200000400004081B2000004000040C8 -:106AE00081B200000400004081B2000004000040B8 -:106AF00081B200000400004081B2000004000040A8 -:106B000081B200000400004081B200000400004097 -:106B100081B200000400004081B200000400004087 -:106B200081B200000400004081B200000400004077 -:106B300081B200000400004081B200000400004067 -:106B400081B200000400004081B200000400004057 -:106B500081B200000400004081B200000400004047 -:106B600081B200000400004081B200000400004037 -:106B700081B200000400004081B200000400004027 -:106B800081B200000400004081B200000400004017 -:106B900081B200000400004081B200000400004007 -:106BA00081B200000400004081B2000004000040F7 -:106BB00081B200000400004081B2000004000040E7 -:106BC00081B200000400004081B2000004000040D7 -:106BD00081B200000400004081B2000004000040C7 -:106BE00081B200000400004081B2000004000040B7 -:106BF00081B200000400004081B2000004000040A7 -:106C000081B200000400004081B200000400004096 -:106C100081B200000400004081B200000400004086 -:106C200081B200000400004081B200000400004076 -:106C300081B200000400004081B200000400004066 -:106C400081B200000400004081B200000400004056 -:106C500081B200000400004081B200000400004046 -:106C600081B200000400004081B200000400004036 -:106C700081B200000400004081B200000400004026 -:106C800081B200000400004081B200000400004016 -:106C900081B200000400004081B200000400004006 -:106CA00081B200000400004081B2000004000040F6 -:106CB00081B200000400004081B2000004000040E6 -:106CC00081B200000400004081B2000004000040D6 -:106CD00081B200000400004081B2000004000040C6 -:106CE00081B200000400004081B2000004000040B6 -:106CF00081B200000400004081B2000004000040A6 -:106D000081B200000400004081B200000400004095 -:106D100081B200000400004081B200000400004085 -:106D200081B200000400004081B200000400004075 -:106D300081B200000400004081B200000400004065 -:106D400081B200000400004081B200000400004055 -:106D500081B200000400004081B200000400004045 -:106D600081B200000400004081B200000400004035 -:106D700081B200000400004081B200000400004025 -:106D800081B200000400004081B200000400004015 -:106D900081B200000400004081B200000400004005 -:106DA00081B200000400004081B2000004000040F5 -:106DB00081B200000400004081B2000004000040E5 -:106DC00081B200000400004081B2000004000040D5 -:106DD00081B200000400004081B2000004000040C5 -:106DE00081B200000400004081B2000004000040B5 -:106DF00081B200000400004081B2000004000040A5 -:106E000081B200000400004081B200000400004094 -:106E100081B200000400004081B200000400004084 -:106E200081B200000400004081B200000400004074 -:106E300081B200000400004081B200000400004064 -:106E400081B200000400004081B200000400004054 -:106E500081B200000400004081B200000400004044 -:106E600081B200000400004081B200000400004034 -:106E700081B200000400004081B200000400004024 -:106E800081B200000400004081B200000400004014 -:106E900081B200000400004081B200000400004004 -:106EA00081B200000400004081B2000004000040F4 -:106EB00081B200000400004081B2000004000040E4 -:106EC00081B200000400004081B2000004000040D4 -:106ED00081B200000400004081B2000004000040C4 -:106EE00081B200000400004081B2000004000040B4 -:106EF00081B200000400004081B2000004000040A4 -:106F000081B200000400004081B200000400004093 -:106F100081B200000400004081B200000400004083 -:106F200081B200000400004081B200000400004073 -:106F300081B200000400004081B200000400004063 -:106F400081B200000400004081B200000400004053 -:106F500081B200000400004081B200000400004043 -:106F600081B200000400004081B200000400004033 -:106F700081B200000400004081B200000400004023 -:106F800081B200000400004081B200000400004013 -:106F900081B200000400004081B200000400004003 -:106FA00081B200000400004081B2000004000040F3 -:106FB00081B200000400004081B2000004000040E3 -:106FC00081B200000400004081B2000004000040D3 -:106FD00081B200000400004081B2000004000040C3 -:106FE00081B200000400004081B2000004000040B3 -:106FF00081B200000400004081B2000004000040A3 -:1070000081B200000400004081B200000400004092 -:1070100081B200000400004081B200000400004082 -:1070200081B200000400004081B200000400004072 -:1070300081B200000400004081B200000400004062 -:1070400081B200000400004081B200000400004052 -:1070500081B200000400004081B200000400004042 -:1070600081B200000400004081B200000400004032 -:1070700081B200000400004081B200000400004022 -:1070800081B200000400004081B200000400004012 -:1070900081B200000400004081B200000400004002 -:1070A00081B200000400004081B2000004000040F2 -:1070B00081B200000400004081B2000004000040E2 -:1070C00081B200000400004081B2000004000040D2 -:1070D00081B200000400004081B2000004000040C2 -:1070E00081B200000400004081B2000004000040B2 -:1070F00081B200000400004081B2000004000040A2 -:1071000081B200000400004081B200000400004091 -:1071100081B200000400004081B200000400004081 -:1071200081B200000400004081B200000400004071 -:1071300081B200000400004081B200000400004061 -:1071400081B200000400004081B200000400004051 -:1071500081B200000400004081B200000400004041 -:1071600081B200000400004081B200000400004031 -:1071700081B200000400004081B200000400004021 -:1071800081B200000400004081B200000400004011 -:1071900081B200000400004081B200000400004001 -:1071A00081B200000400004081B2000004000040F1 -:1071B00081B200000400004081B2000004000040E1 -:1071C00081B200000400004081B2000004000040D1 -:1071D00081B200000400004081B2000004000040C1 -:1071E00081B200000400004081B2000004000040B1 -:1071F00081B200000400004081B2000004000040A1 -:1072000081B200000400004081B200000400004090 -:1072100081B200000400004081B200000400004080 -:1072200081B200000400004081B200000400004070 -:1072300081B200000400004081B200000400004060 -:1072400081B200000400004081B200000400004050 -:1072500081B200000400004081B200000400004040 -:1072600081B200000400004081B200000400004030 -:1072700081B200000400004081B200000400004020 -:1072800081B200000400004081B200000400004010 -:1072900081B200000400004081B200000400004000 -:1072A00081B200000400004081B2000004000040F0 -:1072B00081B200000400004081B2000004000040E0 -:1072C00081B200000400004081B2000004000040D0 -:1072D00081B200000400004081B2000004000040C0 -:1072E00081B200000400004081B2000004000040B0 -:1072F00081B200000400004081B2000004000040A0 -:1073000081B200000400004081B20000040000408F -:1073100081B200000400004081B20000040000407F -:1073200081B200000400004081B20000040000406F -:1073300081B200000400004081B20000040000405F -:1073400081B200000400004081B20000040000404F -:1073500081B200000400004081B20000040000403F -:1073600081B200000400004081B20000040000402F -:1073700081B200000400004081B20000040000401F -:1073800081B200000400004081B20000040000400F -:1073900081B200000400004081B2000004000040FF -:1073A00081B200000400004081B2000004000040EF -:1073B00081B200000400004081B2000004000040DF -:1073C00081B200000400004081B2000004000040CF -:1073D00081B200000400004081B2000004000040BF -:1073E00081B200000400004081B2000004000040AF -:1073F00081B200000400004081B20000040000409F -:1074000081B200000400004081B20000040000408E -:1074100081B200000400004081B20000040000407E -:1074200081B200000400004081B20000040000406E -:1074300081B200000400004081B20000040000405E -:1074400081B200000400004081B20000040000404E -:1074500081B200000400004081B20000040000403E -:1074600081B200000400004081B20000040000402E -:1074700081B200000400004081B20000040000401E -:1074800081B200000400004081B20000040000400E -:1074900081B200000400004081B2000004000040FE -:1074A00081B200000400004081B2000004000040EE -:1074B00081B200000400004081B2000004000040DE -:1074C00081B200000400004081B2000004000040CE -:1074D00081B200000400004081B2000004000040BE -:1074E00081B200000400004081B2000004000040AE -:1074F00081B200000400004081B20000040000409E -:1075000081B200000400004081B20000040000408D -:1075100081B200000400004081B20000040000407D -:1075200081B200000400004081B20000040000406D -:1075300081B200000400004081B20000040000405D -:1075400081B200000400004081B20000040000404D -:1075500081B200000400004081B20000040000403D -:1075600081B200000400004081B20000040000402D -:1075700081B200000400004081B20000040000401D -:1075800081B200000400004081B20000040000400D -:1075900081B200000400004081B2000004000040FD -:1075A00081B200000400004081B2000004000040ED -:1075B00081B200000400004081B2000004000040DD -:1075C00081B200000400004081B2000004000040CD -:1075D00081B200000400004081B2000004000040BD -:1075E00081B200000400004081B2000004000040AD -:1075F00081B200000400004081B20000040000409D -:1076000081B200000400004081B20000040000408C -:1076100081B200000400004081B20000040000407C -:1076200081B200000400004081B20000040000406C -:1076300081B200000400004081B20000040000405C -:1076400081B200000400004081B20000040000404C -:1076500081B200000400004081B20000040000403C -:1076600081B200000400004081B20000040000402C -:1076700081B200000400004081B20000040000401C -:1076800081B200000400004081B20000040000400C -:1076900081B200000400004081B2000004000040FC -:1076A00081B200000400004081B2000004000040EC -:1076B00081B200000400004081B2000004000040DC -:1076C00081B200000400004081B2000004000040CC -:1076D00081B200000400004081B2000004000040BC -:1076E00081B200000400004081B2000004000040AC -:1076F00081B200000400004081B20000040000409C -:1077000081B200000400004081B20000040000408B -:1077100081B200000400004081B20000040000407B -:1077200081B200000400004081B20000040000406B -:1077300081B200000400004081B20000040000405B -:1077400081B200000400004081B20000040000404B -:1077500081B200000400004081B20000040000403B -:1077600081B200000400004081B20000040000402B -:1077700081B200000400004081B20000040000401B -:1077800081B200000400004081B20000040000400B -:1077900081B200000400004081B2000004000040FB -:1077A00081B200000400004081B2000004000040EB -:1077B00081B200000400004081B2000004000040DB -:1077C00081B200000400004081B2000004000040CB -:1077D00081B200000400004081B2000004000040BB -:1077E00081B200000400004081B2000004000040AB -:1077F00081B200000400004081B20000040000409B -:1078000081B200000400004081B20000040000408A -:1078100081B200000400004081B20000040000407A -:1078200081B200000400004081B20000040000406A -:1078300081B200000400004081B20000040000405A -:1078400081B200000400004081B20000040000404A -:1078500081B200000400004081B20000040000403A -:1078600081B200000400004081B20000040000402A -:1078700081B200000400004081B20000040000401A -:1078800081B200000400004081B20000040000400A -:1078900081B200000400004081B2000004000040FA -:1078A00081B200000400004081B2000004000040EA -:1078B00081B200000400004081B2000004000040DA -:1078C00081B200000400004081B2000004000040CA -:1078D00081B200000400004081B2000004000040BA -:1078E00081B200000400004081B2000004000040AA -:1078F00081B200000400004081B20000040000409A -:1079000081B200000400004081B200000400004089 -:1079100081B200000400004081B200000400004079 -:1079200081B200000400004081B200000400004069 -:1079300081B200000400004081B200000400004059 -:1079400081B200000400004081B200000400004049 -:1079500081B200000400004081B200000400004039 -:1079600081B200000400004081B200000400004029 -:1079700081B200000400004081B200000400004019 -:1079800081B200000400004081B200000400004009 -:1079900081B200000400004081B2000004000040F9 -:1079A00081B200000400004081B2000004000040E9 -:1079B00081B200000400004081B2000004000040D9 -:1079C00081B200000400004081B2000004000040C9 -:1079D00081B200000400004081B2000004000040B9 -:1079E00081B200000400004081B2000004000040A9 -:1079F00081B200000400004081B200000400004099 -:107A000081B200000400004081B200000400004088 -:107A100081B200000400004081B200000400004078 -:107A200081B200000400004081B200000400004068 -:107A300081B200000400004081B200000400004058 -:107A400081B200000400004081B200000400004048 -:107A500081B200000400004081B200000400004038 -:107A600081B200000400004081B200000400004028 -:107A700081B200000400004081B200000400004018 -:107A800081B200000400004081B200000400004008 -:107A900081B200000400004081B2000004000040F8 -:107AA00081B200000400004081B2000004000040E8 -:107AB00081B200000400004081B2000004000040D8 -:107AC00081B200000400004081B2000004000040C8 -:107AD00081B200000400004081B2000004000040B8 -:107AE00081B200000400004081B2000004000040A8 -:107AF00081B200000400004081B200000400004098 -:107B000081B200000400004081B200000400004087 -:107B100081B200000400004081B200000400004077 -:107B200081B200000400004081B200000400004067 -:107B300081B200000400004081B200000400004057 -:107B400081B200000400004081B200000400004047 -:107B500081B200000400004081B200000400004037 -:107B600081B200000400004081B200000400004027 -:107B700081B200000400004081B200000400004017 -:107B800081B200000400004081B200000400004007 -:107B900081B200000400004081B2000004000040F7 -:107BA00081B200000400004081B2000004000040E7 -:107BB00081B200000400004081B2000004000040D7 -:107BC00081B200000400004081B2000004000040C7 -:107BD00081B200000400004081B2000004000040B7 -:107BE00081B200000400004081B2000004000040A7 -:107BF00081B200000400004081B200000400004097 -:107C000081B200000400004081B200000400004086 -:107C100081B200000400004081B200000400004076 -:107C200081B200000400004081B200000400004066 -:107C300081B200000400004081B200000400004056 -:107C400081B200000400004081B200000400004046 -:107C500081B200000400004081B200000400004036 -:107C600081B200000400004081B200000400004026 -:107C700081B200000400004081B200000400004016 -:107C800081B200000400004081B200000400004006 -:107C900081B200000400004081B2000004000040F6 -:107CA00081B200000400004081B2000004000040E6 -:107CB00081B200000400004081B2000004000040D6 -:107CC00081B200000400004081B2000004000040C6 -:107CD00081B200000400004081B2000004000040B6 -:107CE00081B200000400004081B2000004000040A6 -:107CF00081B200000400004081B200000400004096 -:107D000081B200000400004081B200000400004085 -:107D100081B200000400004081B200000400004075 -:107D200081B200000400004081B200000400004065 -:107D300081B200000400004081B200000400004055 -:107D400081B200000400004081B200000400004045 -:107D500081B200000400004081B200000400004035 -:107D600081B200000400004081B200000400004025 -:107D700081B200000400004081B200000400004015 -:107D800081B200000400004081B200000400004005 -:107D900081B200000400004081B2000004000040F5 -:107DA00081B200000400004081B2000004000040E5 -:107DB00081B200000400004081B2000004000040D5 -:107DC00081B200000400004081B2000004000040C5 -:107DD00081B200000400004081B2000004000040B5 -:107DE00081B200000400004081B2000004000040A5 -:107DF00081B200000400004081B200000400004095 -:107E000081B200000400004081B200000400004084 -:107E100081B200000400004081B200000400004074 -:107E200081B200000400004081B200000400004064 -:107E300081B200000400004081B200000400004054 -:107E400081B200000400004081B200000400004044 -:107E500081B200000400004081B200000400004034 -:107E600081B200000400004081B200000400004024 -:107E700081B200000400004081B200000400004014 -:107E800081B200000400004081B200000400004004 -:107E900081B200000400004081B2000004000040F4 -:107EA00081B200000400004081B2000004000040E4 -:107EB00081B200000400004081B2000004000040D4 -:107EC00081B200000400004081B2000004000040C4 -:107ED00081B200000400004081B2000004000040B4 -:107EE00081B200000400004081B2000004000040A4 -:107EF00081B200000400004081B200000400004094 -:107F000081B200000400004081B200000400004083 -:107F100081B200000400004081B200000400004073 -:107F200081B200000400004081B200000400004063 -:107F300081B200000400004081B200000400004053 -:107F400081B200000400004081B200000400004043 -:107F500081B200000400004081B200000400004033 -:107F600081B200000400004081B200000400004023 -:107F700081B200000400004081B200000400004013 -:107F800081B200000400004081B200000400004003 -:107F900081B200000400004081B2000004000040F3 -:107FA00081B200000400004081B2000004000040E3 -:107FB00081B200000400004081B2000004000040D3 -:107FC00081B200000400004081B20000F70F00BC45 -:107FD00080B200000380004081B2000003800040B6 -:107FE00081B200000380004081B2000003800040A5 -:107FF00081B200000380004081B200000380004095 -:1080000081B200000380004081B200000380004084 -:1080100081B200003180004081B200003480004015 -:1080200081B200003580004081B2000004000040B1 -:1080300081B200001B80818080320000EC89A24068 -:10804000916F00000000004C90B301005C952EA2DF -:1080500080B00100FF000080F489010090952AC8DB -:10806000E5B10100000000A1F0B1010000000040F6 -:10807000F0B10100000000A4F0B10100000000D048 -:10808000F0B10100000000D1F0B10100000000D209 -:10809000F0B101000000004CF0B10100000000D47C -:1080A000F0B10100000000D3F0B10100000000EECB -:1080B000F0B101000000004EF0B1010000000040EE -:1080C00044B1010018801181983000000000514037 -:1080D00081B201001A8011829830000000005240E5 -:1080E00081B20100EC890048FD930000B603004016 -:1080F000A19901002380A242FD7F00002080008022 -:1081000080320000228011818230000022805140A4 -:1081100081B2000022801182823000002280524011 -:1081200081B200002C800048FD9300002780008071 -:10813000803200002680A253077C000000005153CB -:10814000079001002A800052079000002980A25267 -:10815000077C00000000525207900100000000530D -:108160000790010000000048FD9301000000004559 -:10817000F39301005C952EA252B30100FF00008032 -:10818000F48901000000004CE4B10100000000A9E6 -:1081900045B101003080004C80B200000000454035 -:1081A00081B201000000554081B201001B840540EE -:1081B00049B100001B84054049B1000000000540A2 -:1081C00049B10100E1800040813201000000004B14 -:1081D000DEB20100770000404B9901000000004032 -:1081E000FD93010000000048FD83010002000040F3 -:1081F0009B9B0100000000A59CB30100F699004084 -:108200008132010058952044E0B1010000C000A671 -:1082100036B10100D014004047990100050000402C -:10822000F599010000380040F59901000006004072 -:10823000F599010000000040F59901000518004083 -:10824000F599010002090040F59901000400004081 -:10825000F599010050030040813201007B0300408A -:1082600081320100E083004081320100108400402F -:108270008132010008840040813201006095204075 -:10828000E1B1010070952040E1B10100000000491A -:10829000DD9101000000004091B3010000000040AA -:1082A00085B301005C952040E1B101001A820040D5 -:1082B0008132010071830040813201000200009789 -:1082C00080980100000000402EB101000200004033 -:1082D0002EDD01009001004093980100290100402B -:1082E000813201005C810040AF3301007999004088 -:1082F000813201000000454081B20100000055407C -:1083000081B201004984004081B2000004000040B5 -:1083100081B200000400004081B20000040000406F -:1083200081B200000400004081B20000040000405F -:1083300081B200000400004081B20000040000404F -:1083400081B200000400004081B20000040000403F -:1083500081B200007701004181C00000718051406E -:1083600081B200007280524081B20000738055409B -:1083700081B200007480564081B2000055019181A5 -:10838000803000005A01454081B2000055019182C1 -:10839000803000005A01464081B200005A01004876 -:1083A000FD9300005A010048FD9300005A01004966 -:1083B000FD8300005A01004AFD83000000000040D8 -:1083C00049B10100AE0300CBA3C9010000000020A9 -:1083D00046B10100000000D2F1B10100000000D35D -:1083E000F1B1010000000042F0B1010000000045C1 -:1083F00061B101002000002062DD01000000A8D072 -:10840000E1B100007C80004081B20000000000A8C3 -:1084100098B00100048000408BB30000B10300401D -:10842000A19901008480A241976F000000000045DF -:10843000A1C101000000000080B001000000A20402 -:108440008094000080153F4297E301000000004047 -:1084500049B10100000060030294010000000040E7 -:1084600007B00100040000CB99CB0100000000CC54 -:10847000F38301008E80A241976F0000000000CBC3 -:10848000F3930100AE0300CBA3C90100000000205C -:1084900044B1010000000044F1B1010000000000FF -:1084A000F0B1010000000004F0B10100000000A1E3 -:1084B000E0B10100050000406199010020000020AA -:1084C00062DD01009580A84081320000C6020020D4 -:1084D000423101000000A241056C0100000080CB88 -:1084E000DB910100000019418BB3010060000040E6 -:1084F000619901009B80A8B18C33000060000040AE -:10850000619901009D80A8B194330000A38014C636 -:1085100081320000180000C683F401006A84224FF3 -:10852000830400007F80004081B20000FF0100C68C -:1085300081880100000000C697A301007F801F5CB6 -:10854000975300009E831DC68132000000002F4318 -:1085500081F00100A980004010C9000005810040A1 -:1085600081B200003681004081B20000DA8100CA89 -:1085700063B300002D81004081B200001481004DE2 -:1085800083B000001E81004E61B100000D810040EB -:1085900085B000001481004C83B00000F0800040E2 -:1085A00085B000009181004049B100003D8100404C -:1085B000C1B100008D81004081B200000D810040FA -:1085C00085B00000DD81004049B100006A8400CA26 -:1085D0009BB3000046810040C1B100004E810040C5 -:1085E000C1B1000055810040C1B10000568100407A -:1085F000C1B1000057810040C1B100005881004066 -:10860000C1B100005981004081B000005981004192 -:1086100081B00000CE81004081B20000DD8300BB4C -:10862000ABB30000DB8100CACFB30000D3800040B1 -:1086300049B10000DF80004081B20000DC810040D1 -:1086400081B200006A84004081B20000DA800040FC -:1086500081B200006A8400CA77B300001581004D22 -:1086600083B000001C81004E61B100000D8100BB91 -:1086700085B000001581004C83B000000D8100BB67 -:1086800085B00000F08000BB85B00000E2800040B3 -:1086900081B200006A8400CA4DB3000064820040C9 -:1086A00049B100008F82004049B10000C8142EBBC0 -:1086B00085B00100000000EE82B001000000004122 -:1086C000E0B10100FF7F00A2A08B01000000004488 -:1086D000A5B30100758000CAA733010002810040E4 -:1086E00081B200004E01004D933001004E01004E5A -:1086F000933001004E01004C93300100088400408B -:10870000813201006A84004081B20000549500402B -:10871000459901006A8400CAE5B10000000080406C -:1087200097B00100E88022428F6F0000EA8022416A -:108730008F6F0000EC801ECA81320000EE801FCADD -:1087400081320000000000CAC9B101006A84004201 -:108750008FB30000000000CACDB101006A8400415F -:108760008FB30000000000CACFB101006A8400404E -:108770008FB30000008100A6C6B101006A840040EA -:1087800081B20000008000A6C6B101006A840040EA -:108790008FB30000781800404999010010002F9C09 -:1087A00089B00100078100403933010018002F9B78 -:1087B00089B00100078100403733010000002F9A83 -:1087C00089B00100078100403533010008002F996E -:1087D00089B001000781004033330100008000AE02 -:1087E00047C9010080000040F1990100000000CA63 -:1087F000F1B1010000000042F0B10100401800405A -:10880000E19901000000004561B10100200000AEC7 -:1088100063DD01000281284081320000FF800040BA -:1088200081B2000002814240813200000000005C01 -:10883000699301006A841A449393000005814240C1 -:108840008132000004810058699300000000004458 -:10885000F0D101000000A44081B200000C81A240D0 -:10886000E16D00000000004445D10100000080409F -:10887000E1B1010000008041E1D101000D81375CD0 -:10888000613100000000004262B101001181284006 -:10889000813200000E81004081B20000000000CA59 -:1088A00063B101001181A840813200006A84174041 -:1088B00081B200001681004081B00000168100BB2B -:1088C00081B000000000004160B1010000000040E4 -:1088D00062B101001781A84081320000000000CA87 -:1088E00063B101006A842840813200001981004090 -:1088F00081B2000050950040479901001F8100BBE4 -:1089000087B0000050952F4087B0010021812240A0 -:10891000957F00006A8460409583000002002DF07E -:1089200084B0010022813640813200000000004204 -:1089300062B101002381A8408132000000000043A1 -:1089400062B101002581A84081320000000000CA08 -:1089500063B101002781A840813200000000164069 -:1089600081B201006A84224143510000000800CA1C -:1089700095CB01002281004185C000002F81A242D9 -:10898000676F00000000004167B301002F81424083 -:10899000813200000000004065B30100000000408B -:1089A0009383010000001ACA699701006A84264077 -:1089B0008132000034814240813200006A841A44CE -:1089C000939300006A842043956F00006A8480CAF4 -:1089D000673300006A842240656F00006A84006F7C -:1089E000DB910000C100004081320100358022404F -:1089F000803200006A84004081B200000000005F05 -:108A0000959301004281A244216F00000000005FA5 -:108A1000958301000000005E95930100000000575F -:108A200095930100000000CAC3B101004581225B9B -:108A3000957F00000000004BFD9301006A84004018 -:108A400081B2000049812240AF6F00001BF500CACF -:108A5000959B01004A81004081B200001BFD00CAC5 -:108A6000959B0100000000CA7FB30100260100CAE7 -:108A7000C53101000000005F958301006A8400CACF -:108A8000C5B10000DF6F00CA959B010000000055D2 -:108A900095930100000000CAC7B101006A84225FFB -:108AA000957F000026010040813201000000005F38 -:108AB000958301006A8400CAC7B100006A8400CAB5 -:108AC000C9B100006A8400CACBB100006A8400CA40 -:108AD000CDB100006A8400CACFB1000000002E4270 -:108AE00081E001009814004048C901006A8400CA6E -:108AF000E1B100000000004009B10100200000A623 -:108B000082B001005E81A25E0B7D0000008000410A -:108B1000089901006081A25E0B7D0000208000A604 -:108B200008B1010062819F85823000006181A24FFF -:108B30000B7D00000000004121B30100028000A66F -:108B400082B00100C9810040813201001000004163 -:108B500084E40100038000A682B00100C9810040C6 -:108B600081320100F0FF00418688010000000043CF -:108B7000849401000F0000A686B0010010C40043D9 -:108B8000869801007581A243846C000000000043B8 -:108B900021B30100200000A682B001001C000041AA -:108BA00082DC01007281A25E0B7D000004000041A6 -:108BB000089901007E81004081B20000410100A6B9 -:108BC00086B00100500C0043869801007A81A243D0 -:108BD000846C00000000004121B301007E81004050 -:108BE00081B20000410100A686B00100600C004384 -:108BF000869801007E81A243846C00000000004240 -:108C000021B30100200000A682B001007F81A25E96 -:108C10000B7D000040130041089901008781224329 -:108C2000216F0000200000A682B001001200004168 -:108C300082DC01008481A25E0B7D00000004004103 -:108C4000089901008C81004081B20000200000A63C -:108C500082B001001900004182DC01008981A25E1E -:108C60000B7D000000A00041089901008C810040AC -:108C700081B200000000804081B20100200000A607 -:108C800080B00100000000CA819401008F81A25EC3 -:108C90000B7D00006A84004008B10000C8142EBBA0 -:108CA00085B001009281A25E0B7D000000000040B3 -:108CB00087B00100A1812243216F0000B0812244CE -:108CC000216F0000118000A682B00100C981004020 -:108CD00081320100B881224A837C000000000040FC -:108CE000879001009C81224D837C000000000041A0 -:108CF000879001009E81224F837C0000000000438A -:108D000087900100A081224E837C00000000004279 -:108D100087900100B881004081B20000018000A668 -:108D200082B00100C981004081320100018000A6AB -:108D300082B00100C981004081320100B881224225 -:108D4000837C000000000040879001001C8000A68A -:108D500082B00100C981004081320100AB8122450F -:108D6000837C00000000004187900100AD81224417 -:108D7000837C00000000004387900100AF81224304 -:108D8000837C00000000004287900100B881004011 -:108D900081B20000018000A682B00100C9810040BC -:108DA00081320100018000A682B00100C98100402B -:108DB00081320100B8812242837C00000000004023 -:108DC00087900100000000438790010000000041EF -:108DD00087900100008000A682B00100C981004098 -:108DE00081320100BC81224B837C000000000040E6 -:108DF0008780010000000043E0B101000000004056 -:108E0000AFB30100C5812240877C0000C581A2412B -:108E1000877C000000000041AEB30100000000406C -:108E200081B30100C4812242877C0000C581000B10 -:108E30007DB300000000000F7DB30100FF7F00A2A2 -:108E4000A08B010000000044A5B30100758000CA9A -:108E5000A73301000281004081B2000020000041E0 -:108E600082DC0100CA81A25E0B7D0000000000418F -:108E700008B10100CC819F85823000000000804055 -:108E800081B20100D18114F781300000D181A24963 -:108E9000FD7F000000000048FD930100D48115F81B -:108EA00081140000D481A24AFD7F00000000004828 -:108EB000FD930100D681A2C881320000400000402D -:108EC00080DC01000010004080DC01000000004058 -:108ED000EFB30100D8814240F1330000048100402B -:108EE000689700006A8400BB6BB300006A8400BB13 -:108EF000B1B300006A84004081B20000CC142E405F -:108F000087B00100FF7F00A2A08B0100D8000043C2 -:108F1000B2330100000068DA89B001007C00004033 -:108F20008B9801000000005089F001000000004112 -:108F300089D0010003000044888C01000000004239 -:108F400087C0010000000041A5B30100D800004324 -:108F5000B2330100000000DAF1B10100000000426C -:108F600087C0010000000041A5C30100F881224430 -:108F700089500000F88122448B500000E781A25004 -:108F8000A56F000000000042A5E30100000000CA38 -:108F9000A7B30100758000BB85300100CC142ED230 -:108FA00095C30100AE0300CBA3C90100000000205F -:108FB00042B101000000005081B00100F581A241E2 -:108FC00081500000F481A2F280300000E78100406F -:108FD000A5B3000000000042A5E30100000000CAA4 -:108FE000A7B30100758000BB8530010002810040FD -:108FF00081B20000D9000041B3730100000080502D -:10900000B5F30100D8000041B3F30000000000D91F -:10901000B3FB0100003000A6B8B30100F20000402D -:1090200081320100250100422D01010000020040B3 -:1090300083980100EB0000408132010000000050E5 -:1090400081B001002601004081320100098210DA5E -:10905000B56B00000A8200412D8100000000004134 -:109060002D910100280100408132010025010040BE -:109070002D110100000000402D8101000682A24157 -:1090800081500000260100422D0101002501004011 -:1090900081320100260100422D110100250100400E -:1090A0002D110100158204402D0100002501004012 -:1090B000813201001182004081B20000280100408D -:1090C00081320100250100422D010100F200004023 -:1090D000B9330100000000422D81010000008041F1 -:1090E0002D8101000000804081B20100000300409A -:1090F000819801000000004018B10100800000408C -:109100008398010000190040459901000000424089 -:1091100081B20100000043FFF1B10100000000FF37 -:10912000F1B101000000004181C0010000000040D9 -:1091300018B101001F82A2418350000000160040B8 -:1091400045990100001900404399010000000047C3 -:1091500043C101000000004083B00100000000F3A3 -:1091600080B001000000005B81D0010000000041E0 -:1091700080D0010000000040F6B101000000005B5B -:1091800043C101000000004183C001002982A254B4 -:10919000836C000000000040F7B1010000000041B6 -:1091A00083C001003082A206836C00000000804072 -:1091B00081B201000000800791B00100E180004011 -:1091C000813201003982A240976C000028000040E3 -:1091D000B39B01003A82004081B2000028000040A9 -:1091E000B39B0100FC81004081320100000000DAE5 -:1091F000F5B10100FC810042B3430100000000DA38 -:10920000F5B10100FC810042B3430100000000DA27 -:10921000F5B101004E000040B39B0100FC8100400D -:1092200081320100080000DAF7F50100500000402B -:1092300091980100000000478FB00100FC810048B8 -:10924000B2330100000000DAF7B10100080000DAD3 -:10925000F7F501000000004291C001004582A241E3 -:109260008F5000000000004145D10100080000407F -:10927000B39B0100FC81004081320100000000DA54 -:10928000FDB101000A000040B39B0100FC810040D9 -:1092900081320100000000DAFDB101001800004039 -:1092A000B39B0100FC81004081320100000000DA24 -:1092B000FDB1010016000040B39B0100FC8100409D -:1092C00081320100000000DAFDB10100348200406B -:1092D000813201001E000048B2CB0100FC81004039 -:1092E00081320100000000DA91C001000000004856 -:1092F000B2CB0100FC8100408132010000006EDA37 -:109300008FB0010002000048B2CB0100FC81004098 -:1093100081320100000000DAFDB1010004000048C4 -:10932000B2CB0100FC81004081320100000080DAF4 -:10933000FDB101006F822250FD7F00006F82224547 -:10934000FD7F000040160040459901003582004035 -:109350004931010008000048B2CB0100FE81004005 -:10936000813201006D82A2408F6C00007282222047 -:10937000B56F00006F82004081B20000DB820040C8 -:109380008132010072822240976C00006F8242405D -:10939000813200000000004F6993010004810058F1 -:1093A000699300005416004047990100000000FE38 -:1093B000F4B101000000004081B20100000000FE95 -:1093C000F4B101000000004081B20100000000FE85 -:1093D000F4B101000000004081B20100000000FE75 -:1093E000F4B101000000004081B20100000000FE65 -:1093F000F4B101000000004081B20100000000FE55 -:10940000F4B101000000004081B20100000000FE44 -:10941000F4B1010046000040B39B0100FC81004014 -:1094200081320100080000DAF7F501004800004031 -:10943000959801000000004497B00100FC81004AAB -:10944000B2330100000000DAF7B10100080000DAD1 -:10945000F7F501000000004295C001008582A2419D -:10946000975000002A000040A59B010040160040D4 -:10947000A19B0100000000CAA7B30100758000BBDA -:10948000853001000281004081B20000A7822245A0 -:10949000FD7F0000E0150040479901001A0000A27E -:1094A00080DC010000000050F1B10100F015004027 -:1094B000F1990100000000CAF1B10100070000406D -:1094C00061990100A000004062DD01009682A8BB06 -:1094D000E13100000000005083B001009982A241F8 -:1094E000835000009882A2F282300000E1800040A8 -:1094F000813201009F82A240976C0000280000404A -:10950000B39B0100A082004081B20000280000400F -:10951000B39B0100F015004043990100FC8100401D -:1095200081320100A782A2FAB46F0000FC810042E0 -:10953000B3430100A782A2FAB46F0000FC8100428D -:10954000B3430100AA8222FAB46F0000A78242400E -:10955000813200000000004E699301000481005830 -:109560006993000040160040459901003582004093 -:1095700049310100F6150040439901005C16004096 -:109580004599010000006EFA8EB001000000004015 -:1095900081B20100000000FEF4B1010000000040B3 -:1095A00081B20100000000FEF4B1010000000040A3 -:1095B00081B20100000000F0B4B30100B882A24003 -:1095C0008F6C0000FC152020E1B10100BD8200403D -:1095D00081B20000DB82004081320100BD82224066 -:1095E000976C0000BA824240813200000000004FB8 -:1095F000699301000481005869930000348200409F -:10960000813201001E000048B2CB0100FC81004005 -:1096100081320100C2822250B56F0000000000506C -:1096200091C0010000000048B2CB0100F6150040D7 -:1096300043990100FF8100F2B433010002000048A9 -:10964000B2CB0100F815004043990100FF8100F200 -:10965000B433010004000048B2CB0100FA15004009 -:1096600043990100FF8100F2B43301000800004873 -:10967000B2CB0100FC15004043990100000000F04E -:1096800094B00100FFFF004AB48B0100FF8100404D -:10969000813201000A000048B2CB01001000004AEC -:1096A000B4F70100FF8100408132010034820040A4 -:1096B000813201001E000048B2CB0100FC81004055 -:1096C00081320100D8822250B56F0000D98200504B -:1096D000B5B3000000000040B5B30100FF810040B9 -:1096E000813201000281004081B20000001600407A -:1096F0004799010030310040F599010032330040B4 -:10970000F599010034350040F599010036370040E5 -:10971000F599010038390040F599010041420040B7 -:10972000F599010043440040F59901004546004089 -:10973000F599010047480040F5990100494A004069 -:10974000F59901002C0000408398010000000040C2 -:10975000F7B10100E782A2418350000080162E0677 -:1097600083B00100360000FBF6A90100EA82A241A5 -:10977000835000002200004083980100000000FB9D -:10978000F6B10100ED82A24183500000620000406A -:1097900095980100008300408132010000162D06DB -:1097A00083B0010080160040459901005C0000FB79 -:1097B000F6A90100F382A24183500000000000706E -:1097C000F9B1010000000071F9B101000000007260 -:1097D000F9B1010000000073F9B10100000000744C -:1097E000F9B1010054000040959801000083004049 -:1097F000813201000000007095B00100FF822270EC -:10980000B56F00000000804197B00100000080406B -:1098100097B00100456700A6E0B201000123007087 -:10982000E19A0100CDEF00A6E2B2010089AB007120 -:10983000E39A0100BA9800A6E4B20100FEDC0072CF -:10984000E59A0100321000A6E6B2010076540073DA -:10985000E79A0100D2C300A6E8B20100F0E100746B -:10986000E99A01008016004A44C90100000000077F -:1098700081B001000000004A80D0010000000040DB -:10988000F7B101000D83A241815000008016004A0B -:1098900044C90100FC162A47E7B501000300004A4D -:1098A000E8E50100000000408DB0010050030040D9 -:1098B000A399010080163D468DE001000000005094 -:1098C00089B00100000000FC40B001000000004130 -:1098D000A3C101001683A24189500000000000705E -:1098E000EBB2010000000071EDB201000000007257 -:1098F000EFB2010000000073F1B20100000000743B -:10990000F3B201000000004083B001000F000041ED -:109910008088010050030040A2C901003383A05099 -:10992000836C00000D00004098C801000000004F4B -:10993000998401005003004CA2C9010000000020DE -:1099400086B001000800004098C801000000004FE8 -:10995000998401005003004CA2C9010000000020BE -:1099600086A401000200004098C801000000004FDA -:10997000998401005003004CA2C90100000000209E -:1099800086A4010050030040A2C90100000000436A -:1099900040A401000100002088E401000000005FF5 -:1099A00041F00100000000444094010005000075F2 -:1099B00089E401001B00007585F4010000000044EB -:1099C000849401003D83A353836C00000000007663 -:1099D00089B0010000000077898401000000007652 -:1099E0008BB00100000000208BA401000000007873 -:1099F0008B8401004C8300458894000027000041BF -:109A000080CE01004283AA4081320000000000762F -:109A100089B001000000007789A401004C83007820 -:109A200089A400003B00004180CE01003F83AA4092 -:109A3000813200000000007689B00100000000774C -:109A400089840100000000768BB0010000000078DE -:109A50008B8401000000004588940100000000771D -:109A60008BB00100000000788B8401004C8300451E -:109A7000889400000000004484C0010000000079C8 -:109A800085C001000000002084C001005383A3535F -:109A9000836C0000825A00A684C0010099790042BC -:109AA00084C801006083004081B2000027000041AB -:109AB00080CE01005883AA4081320000D96E00A6F2 -:109AC00084C00100A1EB004284C801006083004013 -:109AD00081B200003B00004180CE01005D83AA40BE -:109AE000813200001B8F00A684C00100DCBC004254 -:109AF00084C801006083004081B2000062CA00A6F1 -:109B000084C00100D6C1004284C8010060830040C7 -:109B100081B2000000000078F3B20100000000777D -:109B2000F1B201001E00007689E401000200007617 -:109B3000EFF6010000000044EE9601000000007501 -:109B4000EDB2010000000042EAB201000000004155 -:109B500083C001004F00004180CE01001F832A40D6 -:109B60008132000000000075E1C2010000000076B3 -:109B7000E3C2010000000077E5C2010000000078A8 -:109B8000E7C2010000000079E9C2010013838141AE -:109B90008D4000000000804081B201009D83A24BF7 -:109BA000B76F00009D83A2412F7D00000000005090 -:109BB000FD930100401600404599010035820040A8 -:109BC000493101009C8322408F6C0000080000484E -:109BD000B2CB0100FE81004081320100DB820040F7 -:109BE000813201009C83A240976C00005E16004009 -:109BF000439901007C1620F6E0B10100000000400E -:109C000031B301008083224F8F7C0000000000519F -:109C1000FD930100828322408F7C000086830054E4 -:109C2000FD930000848322428F7C000000000052DC -:109C3000FD930100868322418F7C000000000053C9 -:109C4000FD9301009A832251FD7F00003482004081 -:109C5000813201000C000048B2CB0100FC810040C1 -:109C6000813201009583A240B56F00001E000048BC -:109C7000B2CB0100FC81004896300100000000DA00 -:109C800097C001000400004BB2CB0100FC810040F2 -:109C9000813201000E000048B2CB0100FF8100407C -:109CA000813201000C000048B2CB010000000030FE -:109CB000B5B30100FF810040813201000E00004871 -:109CC000B2CB0100FC810040813201009983224027 -:109CD000B56F00009D830054FD930000000000510B -:109CE000FD8301001C0000FE7FD901009D83A6407A -:109CF0008132000000000055FD930100000080400B -:109D000081B20100B6030040A199010000002F417B -:109D100099B30100A8832244816C0000B0832248DB -:109D2000816C0000AA83224C816C0000B483225015 -:109D3000816C0000B5832254816C0000B7832258E7 -:109D4000816C0000BC83225C816C000055010040E6 -:109D500081B20000000000BC09B001006A8400CAA2 -:109D600001B000000000004003B00100000000410D -:109D7000F3830100AE83A242056C000000000041A5 -:109D800005B001006A8422CA071400006A840045F5 -:109D9000F39300006A842043956F00006A8480CAB0 -:109DA000053000006A842201803000006A8400CB04 -:109DB000DB9100005C0100BCABB30000000000BC04 -:109DC000B1B301006A8400CACFB30000FF0000CA2B -:109DD000818801006A84A240747D000060002040F8 -:109DE00060990100B983A8B182300000B8830040B7 -:109DF00081B200006A8400CA79B300000000004EFE -:109E000081B0010000000043CB8301000000454009 -:109E100081B20100BF83A241815000000000454093 -:109E200081B201000000454081B20100CA839182E5 -:109E3000823000000000008A80B00100B69F004020 -:109E400080CE0100C883A64081320000CA835640FC -:109E500081B20000B6030040A19901000000005348 -:109E600007900100B6030040A199010000000052D4 -:109E700007900100F39F00418BB300000000004EEB -:109E800081B0010000000042CD8301000000464087 -:109E900081B20100CF83A241815000000000464002 -:109EA00081B201000000464081B20100DA83918155 -:109EB000823000000000008980B00100B69F0040A1 -:109EC00080CE0100D883A64081320000DA8355405D -:109ED00081B20000B6030040A199010000000052C9 -:109EE00007900100B6030040A19901000000005353 -:109EF00007900100F39F00418BB30000B1030040C5 -:109F0000A1990100C4142F4099B301005C010040E5 -:109F100049B1000058152D408DB00100D0142DF02E -:109F200088B00100000000408FB00100010000A6D1 -:109F300090B0010000F80048909801000000004532 -:109F400093B00100000000FA8AB001006A030040EB -:109F500081320100020000A680B00100EC832240A3 -:109F6000826C0000F0830040813201004703004012 -:109F700081320100000000418DC00100F583225FA5 -:109F80008D6C0000E783A24193500000E583004000 -:109F900081B20000FF070047848801000000A6404E -:109FA00081B20000F59F00478030010000020047A9 -:109FB0008EC80100F083004081B200000000004420 -:109FC00050B30100FB832018896C0000040000A638 -:109FD00084B00100200000A686B0010000100040FF -:109FE000559B0100FE83004081B20000040000A6E2 -:109FF00084B00100200000A686B0010000100040DF -:10A00000559B01000000004250D30100000000A851 -:10A010004FB30100000000434ED301005E03004037 -:10A02000813201006C03004280300100F083004067 -:10A0300081320100078422A78F6C00004903004091 -:10A04000813201000484004081B2000000008040A1 -:10A0500081B20100A0942E4397B00100000000409F -:10A06000F1B101000984A2419750000050952040B1 -:10A07000E1B10100AC942E4397B001000000004014 -:10A08000F1B101000D84A241975000000000804012 -:10A0900081B20100AE030040A3990100000000401E -:10A0A00081B0010060150040859801000800004063 -:10A0B00040E40100000000594194010000000050FC -:10A0C00041E0010000000042409401000000004116 -:10A0D00081C001000000A341816C0100000000412B -:10A0E000A3C101001384005085C000004984A2412F -:10A0F000017D000021842258737D0000780000401B -:10A10000619901001C84A8B19C30000030003845E2 -:10A110009DE001000100000E10C90000218433C43D -:10A12000813000002484A1AD9D2000001B841340D9 -:10A1300081B200000000134E5A8301003000384500 -:10A140009DE001002C8422AB800400002A84A24000 -:10A15000017D00002C84225F577D0000278A00408B -:10A1600081B200002C84225E577D00008A8A004064 -:10A1700081B2000031842254737D000074000040DD -:10A18000619901002C84A8B1003000000086A25F14 -:10A19000017C00006289004081B200003384A25F2C -:10A1A000592700003584A25C737D00003C84A25EC8 -:10A1B000737D00004684225C737D00004784374035 -:10A1C000813200007C000040619901003684A8B112 -:10A1D000363000007C000040619901003884A8B14D -:10A1E000003000001F000000028801002F86174089 -:10A1F00081B2000047843440813200007E0000407C -:10A20000619901003D84A8B11230000044845221BC -:10A2100013040000000014412FC30100FF3F000998 -:10A22000008C01000000004301F00100878400342D -:10A2300013840000FF3F1409008C0100E7840043F1 -:10A2400001F000000000004081B20100478433406B -:10A25000813200001B84134E5A930000EC89A248FF -:10A26000FD7F00004E842259737D0000790000407C -:10A27000619901004A8428B17E3100004B8400407E -:10A2800081B20000528421AC9C20000000000041FB -:10A290001FC301000400A05F9D6C00000000004E81 -:10A2A000589101005684225A737D00007A000040C4 -:10A2B000619901005384A8B17E310000010000CFF4 -:10A2C00011C900005C84A240937F00005C8422449A -:10A2D000937F0000588442A5803000005B84A24038 -:10A2E000937F000071841A409393000000001A408D -:10A2F00081B201009A80A240737D0000A1892244AE -:10A30000216F000098892240657D0000A689A25B2C -:10A31000737D00000400A249337D0000668422485A -:10A32000337D0000FF01009980D80100000000503B -:10A3300081E00100A8982F4033B1010000000040E7 -:10A34000E0C1010069842240AF6F000069842240AF -:10A35000816F0000F5891FA5826F000049840040CD -:10A3600081B200001B8400408BB300000000005845 -:10A3700061B101000000004E62B101001B84284061 -:10A38000813200006C84004081B200006F84334051 -:10A390001F3000001B84134E5A9300007384A0CE1C -:10A3A000815000008584A0CD816C0000000000A5D4 -:10A3B0009CB30100000000B181B00100858422B58A -:10A3C0008114000080152F4049B10100778442407C -:10A3D00081320000000060B465970100D0152E4066 -:10A3E00069B3010000001A44938301001A0000A21F -:10A3F00080DC010000000044F1B10100000000B168 -:10A40000F1B10100000000B5F1B10100050000400C -:10A41000619901000000004062B101008084A8A1A0 -:10A42000E03100005C8400889EB300005C84A2419F -:10A43000676F00005C84006FDB9100008584424000 -:10A44000813200005C841A40938300000099000967 -:10A4500046C901003F0000F30C8801009084A64229 -:10A460001360000055970095033001008B84454030 -:10A470008132000075000040619901008C84A8B110 -:10A480000C3000005C971D1094300100918400583E -:10A490001F9000004E970095033001001B84008838 -:10A4A0001CB0000000002D0348B1010004002DF095 -:10A4B0002EB00100EE070040979801009884234BCE -:10A4C000E46D00009884224BFD7F000000000040F6 -:10A4D0001F90010022002F4081B201009B8483174E -:10A4E0008032000026000040479901009D848517B6 -:10A4F000803200000000004847C10100A3842255BB -:10A500002F7C00000000004243D101000F0000FA40 -:10A51000968801000000004297E001000000004220 -:10A5200097D00100A484004B44C10000120000A297 -:10A5300044C90100280000F602CC01000A0000A175 -:10A5400042C90100000000F816B00100000028F028 -:10A5500010B00100000000F01AB00100000000A2DD -:10A560002AB00100C0283C460DE0010000002D4447 -:10A5700095B00100B084A2F80E300000C0842241E2 -:10A580009550000000002D5049C10100AC840040EE -:10A5900081B20000AD84A2F8166C0000AD84A2F870 -:10A5A000106C0000AD84A2F01A6C0000BE8422582A -:10A5B0001F7C000000993F4213F00100B584474022 -:10A5C00081320000B984A2F3740600000000000686 -:10A5D000E6950100BE841F4081B200000000000625 -:10A5E00096B001003F001FF30C88010000000055E9 -:10A5F00061B101000000004B62B10100BC84A840C1 -:10A6000081320000BE84474081320000C6841F4171 -:10A610002DC30000C48422581F7C00000000005598 -:10A6200061B101000000000662B10100C284A840CF -:10A6300081320000C484474081320000EE841F4113 -:10A640002DC30000030000071AF401002196000743 -:10A6500016300100D5842241816C0000CC84224256 -:10A66000816C00001B8400881CB00000D484225F31 -:10A670000F7C00001597005F01100100D28422407A -:10A68000956C00000480000342C90100000000F244 -:10A6900002B001008A960052953001009196004B5D -:10A6A00002B000006797000996300100058A00405B -:10A6B0000FB00000DD84A25A1F7C00009B95004073 -:10A6C00081320100DD842220856C0000DA849C0F39 -:10A6D000803200001B8400881CB000007C96005C67 -:10A6E0001F0001009B980042613101001B8400881B -:10A6F0001CB00000E69900079630010000002D050F -:10A7000048B10100E08482F0183000006C8B0045F5 -:10A710008FB00000282000A696B00100E484221724 -:10A72000960400000B98004B953001006C8B004B99 -:10A730008FB000002197000348310100FC940040D5 -:10A74000813001006C8B004081B2000000002E10AF -:10A7500048B101000000685003B001000000000390 -:10A76000F0B101000000004261B1010000000010E2 -:10A7700062B10100EB84A800E03100001B84008876 -:10A780001CB0000000002D0348B101000000004093 -:10A790000FB00100000000F82EB00100000000F230 -:10A7A00002B001000000004017B00100004100A607 -:10A7B00096B00100EE072E47979001000185221701 -:10A7C00096040000FF84224BFD7F0000FF8423A23B -:10A7D000026C00008A96005295300100040022416C -:10A7E000975000000C002D0012B00100000000F096 -:10A7F00000B001000000005C018001009196004B58 -:10A8000002B000000000000900B00100000000508C -:10A8100003B001001E85005C1790000013852243E1 -:10A820002F7C0000000000451F9001000C85225F76 -:10A830002F7C000000002E1048B1010000000058DD -:10A84000F1B1010010000003F0C901001000000088 -:10A85000E0C9010008854542613100000000001098 -:10A8600062B101000985A840813200001B841D8867 -:10A870001CB0000020002D0348B10100FF0F00F6BE -:10A88000808801001085A2A6816C0000138500F26B -:10A890003AB00000FD85A24BFD7F0000E29500402C -:10A8A000813201001B8A004081B200001E85224ACD -:10A8B0002F7C00001E8522482F7C00000A002D03FB -:10A8C00048B101003F0000F2868801001F000043EC -:10A8D000848801000500004380F4010098943D4203 -:10A8E00081E001001E85A242E07D0000FD85A24BB3 -:10A8F000FD7F0000E2950040813201001B8A00408C -:10A9000081B200001E85474081320000000000A394 -:10A9100009B0010000001F4147C30100248522A1A6 -:10A92000096C00006B8400881CB0000021850003C6 -:10A9300048B100005E85A392036C00000A990040B4 -:10A94000953001000000004143C3010000000016E3 -:10A9500080B201001B8A2708803200002B85225C10 -:10A96000177C00002C8500002AB0000012000000B7 -:10A970002AC801000200000880C801003085A243F7 -:10A980002F7C00000E980040813201004C85005E53 -:10A9900017900000040000018CCC01000E98004CC0 -:10A9A0000330010000002E4602B00100100000102C -:10A9B00048C901000C000001F0CD01002C0000404E -:10A9C000F0C9010000000016F0B1010010000015F0 -:10A9D000E0C901000000004361B10100A00000A433 -:10A9E00062DD01003985A854171000004C85005E17 -:10A9F00017900000120000002AC801004B85224376 -:10AA00002F7C0000040000018CCC01000000004CF1 -:10AA100003B001002F9800436131010000002E4671 -:10AA200002B001001000001048C901000C00000134 -:10AA3000F0CD01000C000009F0C901000000001871 -:10AA4000F0B1010010000015E0C901000000004352 -:10AA500061B10100A00000A462DD01004C85285412 -:10AA6000171000004885004081B200002F98004375 -:10AA7000613101004E8522502F7C000000000056FD -:10AA80001790010007000017988801005185A24126 -:10AA9000996C000000000055179001000000004371 -:10AAA00061B101004000001062DD01005285A84044 -:10AAB000813200001B8400881CB000001698004002 -:10AAC00081320100598522432F7C0000168000034B -:10AAD00044C901000000001DE4B10100B797005E09 -:10AAE000051001005C85A25F2F7C0000CE94000160 -:10AAF00038430100E2950040813201001B8A00408A -:10AB000081B200006085A24BFD7F0000FA85004104 -:10AB100043C300000000004027B0010000000040D7 -:10AB20002DB001000000004011B001006385350127 -:10AB3000863000006D000040619901006B8528B1EE -:10AB4000303000006485224D757D00000000001645 -:10AB500080B20100EA85A740116C000000000041AE -:10AB600043C30100F985004081B200006D00004040 -:10AB7000619901006B85A8B1123000000000001639 -:10AB800080B201007585A740116C000000000041F3 -:10AB900043C301000000000910B0010000000018CC -:10ABA0002CB00100DE07004380CE01006485AA407E -:10ABB000813200007A85004081B2000040003E43AF -:10ABC00027E0010000000009F0B1010000000018BA -:10ABD000E0B101000000004127C001006485A30B23 -:10ABE00087500000000015401BB00100000000402D -:10ABF00023B00100120000002AC8010040002D40CF -:10AC000039B001008285A240276C000022000008B4 -:10AC100012C80100DE07004025980100858500402C -:10AC200081B20000000000F812B00100000000F046 -:10AC300030B001000000000B25B001000000001042 -:10AC400032B0010014002001E0B10100EE07004025 -:10AC5000379801008A852301366C0000000000014E -:10AC600036B001009585824123400000208000100D -:10AC700042C9010091852240E36D000000000043BD -:10AC800061B101004000001062DD01008E85A84026 -:10AC9000813200001B8400881CB000000196004334 -:10ACA000233001000000001032B00100000000411C -:10ACB00023B001000000000348B10100008000192A -:10ACC00044C90100A48522451F7C00000000004CFF -:10ACD000F1B1010000000009F0B10100000000180E -:10ACE000F0B101000000004361B101002000001933 -:10ACF00062DD01009B85A815E031000000000050D6 -:10AD000003D001000000005033C001000000004CDF -:10AD100025D001000C002D4C13C001000000005094 -:10AD200037D00100000000502BC001008A8500458B -:10AD30001F800000A685A312366C0000A785681B43 -:10AD400028B000000000681228B0010000000009CF -:10AD5000F0B1010000000018F0B101000000004354 -:10AD600061B101002000001962DD0100AA85A8156B -:10AD7000E0310000D0852214025000000000005095 -:10AD800033C001000000001424D001000C002D1479 -:10AD900012C00100C985A21436500000BA85225C99 -:10ADA0001F7C00003080001042C90100B88522409D -:10ADB000E36D00000000004261B10100400000109E -:10ADC00062DD0100B585A840813200001B84008847 -:10ADD0001CB000000000000348B101000C002D5C15 -:10ADE0001F800100100000F02AC801000000005C74 -:10ADF0002B800100F007004037980100BF85230138 -:10AE0000366C00000000000136B00100CA85221B2C -:10AE1000026C00003000001048C9010000002E5CE8 -:10AE20001F90010000000050F1B10100000000037C -:10AE3000F0B10100FF070015E08D010000000042A5 -:10AE400061B10100A00000A462DD0100C685A84038 -:10AE500081320000CA85000348B1000000000014E0 -:10AE60002AC001008A85A240256C00000000004134 -:10AE700039C0010040003D4339E001000000000BF3 -:10AE800025B00100000000F812B001008A8500F032 -:10AE900030B000000080001942C90100D685224070 -:10AEA000E36D00000000004361B1010040000019A3 -:10AEB00062DD0100D385A840813200001B84008838 -:10AEC0001CB00000019600402B30010018002E033A -:10AED00048B10100DA8522502F7C000000000056A6 -:10AEE000179001000700001798880100DD85A24136 -:10AEF000996C00000000005517900100E085224386 -:10AF00002F7C000000000054179001001600201D47 -:10AF1000E4B10100E285A340276C0000E485605F96 -:10AF2000179000000084000B16DC01000000601385 -:10AF300016940100B797005E051001001B8AA25FFE -:10AF40002F7C00001480000342C90100000000F2C1 -:10AF500002B00100CE940001384301001B8A00407A -:10AF600081B200000000004083B001000000004DED -:10AF700061B101000000001662B10100EC85A8403B -:10AF8000813200000000000862B10100EE85A84097 -:10AF900081320000F9852213826C000040003D439D -:10AFA00083E00100000000F810B00100000000F094 -:10AFB0002CB001000000001662B10100F485A84029 -:10AFC000813200000000000862B10100F685A8404F -:10AFD00081320000F085004183C000000000154070 -:10AFE00081B20100008200A604B00100A0980040D8 -:10AFF00047990100E9890041893001008A96005291 -:10B00000953001009196004B02B000001B8A004071 -:10B010000FB000000000005F018001001000000080 -:10B020000EF401003F00000000880100030000074B -:10B030001AF4010021960007163001000B86224108 -:10B04000816C000009862242816C00001B8400880C -:10B050001CB000000A86225F0F7C0000058A0040B9 -:10B060000FB000001386A25A1F7C00009B95004081 -:10B070008132010013862220856C000010869C0F0F -:10B08000803200001B8400881CB000007C96005CAD -:10B090001F0001009B980042613101001B84008861 -:10B0A0001CB00000E69900079630010000002D0555 -:10B0B00048B10100000000F018B001001986223AE2 -:10B0C000016C0000000000008EB001006C8B00409D -:10B0D00001B000000000004081B201002E002D05EB -:10B0E00048B101001D86A240E76D00000A00004043 -:10B0F0008F9801006C8B004001B000006695004005 -:10B10000813201004E970095033001001B840088B6 -:10B110001CB0000000002D0348B1010022002DF0FA -:10B120002EB00100282000A696B001002686221726 -:10B13000960400000B98004B953001006C8B004C7E -:10B140008FB0000028868317803200000000004482 -:10B1500043C101002A8685178032000000000048A4 -:10B1600043C10100280000F602CC0100120000A13A -:10B170002AC801002197004081320100FC9400415F -:10B18000813001006C8B004081B2000000000001A2 -:10B1900000D0010000002E1048B10100280000403E -:10B1A000F199010000000003F0B10100000000006F -:10B1B000F0B1010034864647613100000000001004 -:10B1C00062B101003586A81BE03100001B841E8897 -:10B1D0001CB000000000004503E0010008002D0342 -:10B1E00048B101005A8601FB08300000AD8687FB9C -:10B1F00022300000000000FA0EB00100000000F84C -:10B2000014B00100030000071AF4010021960007A2 -:10B210001630010050862241816C00004486224293 -:10B22000816C00001B8400881CB000004F86225FE8 -:10B230000F7C0000380000047E8901004886A65F6C -:10B240000F00000074950040053001004D8600405D -:10B2500081B20000130000408798010000002D0318 -:10B2600048B101000C002DF082B00100000000F098 -:10B2700084B0010000970040053001000000005C30 -:10B280001F900100058A00400FB000005886A25AA6 -:10B290001F7C00009B9500408132010058862220CF -:10B2A000856C000055869C0F803200001B8400884E -:10B2B0001CB000007C96005C1F0001009B980042BF -:10B2C000613101001B8400881CB00000E699000772 -:10B2D0009630010000002D0548B10100000000F08B -:10B2E00018B001005C862104802000005D860040CB -:10B2F00010C90000AE8A004B81B000007C8600437C -:10B3000081B00000808600FB22B00000AE8A0041C0 -:10B3100081B000006C8B004E8FB000007886005A20 -:10B320008FB00000658600478FB00000AE8A0053E2 -:10B3300081B00000AE8A005681B0000032002D05B9 -:10B3400048B101006C8BA00AE46D00006B86A2413D -:10B35000197C00006A86220A803200006C8B005340 -:10B360008FB000006C8B00548FB000007486220AEE -:10B37000803200006E86A20AE46D00006C8B005DD6 -:10B380008FB00000000000F280B001000000000A51 -:10B3900080D001007286A091816C00006C8B005EF1 -:10B3A0008FB00000250000408F9801006C8B00409A -:10B3B00081B2000076862091E56D00006C8B005410 -:10B3C0008FB00000210000408F9801006C8B00407E -:10B3D00081B2000032002D0548B101006C8BA00A3B -:10B3E000E46D0000240000408F9801006C8B004049 -:10B3F00081B2000037002D0548B10100040000F3C0 -:10B4000082F40100AE8AA042836C0000AE8A005430 -:10B4100081B00000000000F20EB001000300000740 -:10B420001AF4010000B5000D42C901000700000731 -:10B43000168801008986220BE67D00000A00004084 -:10B4400087980100559900408132010000000040BA -:10B450000FB00100058A005C1F9000009B862250FF -:10B46000FD7F00009686A254FD7F00008E86225547 -:10B47000FD7F000082000040879801008686004022 -:10B4800081B2000086862253FD7F000014800003F5 -:10B4900042C90100000000F096B001001000004B0E -:10B4A00080F401000CBC004087980100968622437E -:10B4B000806C0000FFFF004B808801008686A2435D -:10B4C000806C00007C9600404799010097864340BD -:10B4D000813200009A86A0F0306F00008C861B40FD -:10B4E00081B2000000001B4131C30100A59500405E -:10B4F000253001009F869C0F803200001B8400884D -:10B500001CB000007C96005C1F000100148000034A -:10B5100042C90100000000F096B0010000002F05B4 -:10B5200048B101001000000718E401000008000CF9 -:10B53000E0990100E69900079630010000B5000D82 -:10B5400046C90100A6863040813200000000000B91 -:10B55000E6910100000200A146C901000000000BB5 -:10B56000E691010004002E0548B1010000001040E2 -:10B57000E1B10100AE8A004081B00000000000FB94 -:10B5800028B00100000000FB86B00100000000F8B8 -:10B5900014B00100B7862246237C0000B386224007 -:10B5A000877C0000000000481F900100B586224102 -:10B5B000877C0000000000471F900100B7862242F0 -:10B5C000877C0000000000451F900100B786471BE4 -:10B5D0002C300000000000A013B0010000001F414B -:10B5E00041C30100E6862392156C0000E686A24561 -:10B5F0001F7C0000EA86224BFD7F0000170000D070 -:10B60000A2C901000000004027B001000200000AAA -:10B6100024C80100DD9500400F300100E4862208B7 -:10B620004030000000000041A3C10100F0070012FB -:10B6300024CC0100C086AA4127400000010000136D -:10B6400080CC0100E086264023300000000000404E -:10B6500083B001006000000384C8010010000010E6 -:10B6600048CD0100170000D0A2C90100CD86A2403C -:10B67000836C0000D986004183B000000080004246 -:10B6800044990100000068213896010000002E5006 -:10B6900049C10100D286A244236C0000300000039F -:10B6A00048C9010000000044F1B101000C00002075 -:10B6B000F0C901000000004461B10100A00000A435 -:10B6C00062DD0100D586A842E031000000000044A0 -:10B6D00085C001000000004123C0010000000041BE -:10B6E000A3C10100CB86A24181500000E086224028 -:10B6F000236C00000000004461B101004000001014 -:10B7000062DD0100DD86A840813200001B840088D4 -:10B710001CB000000000000348B10100EE0700402B -:10B7200025980100170000D02AC80100F3860017F1 -:10B7300010B00000C097004081320100EA8600404E -:10B7400081B20000DD95009225300100000000402C -:10B7500031B00100EA8622082E300000F386004155 -:10B7600027B00000808000A604B001000600004061 -:10B77000879801005599000A8C30010000000040B4 -:10B780000FB001000000005C1F900100F286229FB4 -:10B79000136C0000020000881CCC01006B84004088 -:10B7A00081B20000058A00413FC300000000004054 -:10B7B0000FB001002800000180CE010007872A4059 -:10B7C000813000000080001044C9010040000040AA -:10B7D00081980100FC86A2481F7C0000FC86A247DD -:10B7E0001F7C0000FC86A307036C00008000004063 -:10B7F00081980100FF86A340026C00002800000130 -:10B80000F0CD0100018700400FB00000280000408B -:10B81000F0CD0100040000400ECC01002800000320 -:10B82000F0C9010028000000F0C901000000001666 -:10B83000E0B101000000004761B1010020000010EC -:10B8400062DD01000587A85C1F10000000000040B9 -:10B8500043990100000000F008B00100A0012D4054 -:10B8600000C00100ED88220F4205000018879C0FE0 -:10B87000803200000000005C1F800100008000108A -:10B8800042C9010013872240E36D00000000004719 -:10B8900061B101004000001062DD01001087A84086 -:10B8A000813200001B8400881CB00000188722072A -:10B8B000803200000000000342B1010000000007D8 -:10B8C00042C10100008000A1469901000000005F14 -:10B8D000E1910100D787A2451F7C00001000000302 -:10B8E00048C9010000002D5429C00100000000F8E3 -:10B8F00018B00100000000F804B00100000000F8DA -:10B900000EB00100420000030AC801000C0000A4B0 -:10B910000CC801000000004017B001000000001436 -:10B9200002B001000000001424D001000000001447 -:10B9300010C001001200000810C801000000004003 -:10B9400023B00100FE7F000544C90100298720942F -:10B95000156C00002A870094E5B100000000000A81 -:10B96000E4B10100438722018032000000003C4422 -:10B9700023E0010000002EA480B0010000000010B0 -:10B9800048C101003087A307026C000031876801BD -:10B990001AB00000000068071AB001000000000D96 -:10B9A00002D0010000000005F0B101000000000C11 -:10B9B000F0B1010000000002E0B101000000000D44 -:10B9C0000AC001003D872240036C00003D872242EF -:10B9D000236C00000000004123C00100000000476C -:10B9E00061B10100A00000A462DD0100658728406C -:10B9F000813200003A87004081B200000000001050 -:10BA000080C001000000004761B10100000000405B -:10BA100062B101003F87A840233000001B840088EA -:10BA20001CB000006587004081B2000000003C446B -:10BA300023E00100000000A486B0010000002E10E9 -:10BA400048C101004887A3120E6C000049876807AF -:10BA50001AB00000000068121AB001004C8780087C -:10BA6000F03100000100001198C801000000004CF6 -:10BA70001E9001000000000CF0B101000000000267 -:10BA8000E0B101000000001086C001000000004687 -:10BA900061B10100011F004362DD01005087A85C15 -:10BAA0001F1000008387220D146C00005687220DA2 -:10BAB000246C00000000000D10C001005A87000D2A -:10BAC00024D00000000000412BC001000000001540 -:10BAD000A2B101001000002010C80100F0070040D2 -:10BAE000259801005C872242236C00006587004195 -:10BAF00023C000000000004661B1010040000010BA -:10BB000062DD01005D87A85C1F0000001B840088C7 -:10BB10001CB000000000001048B1010063872247FC -:10BB20001F7C000011960043233001000E00000F1F -:10BB30001E8C01000000004023B001008387220D0D -:10BB4000145000008287A20D0E500000718722461B -:10BB50001F7C0000000000461F80010030800010A4 -:10BB600042C901006F872240E36D000000000047DA -:10BB700061B101004000001062DD01006C87A84047 -:10BB8000813200001B8400881CB00000208000036C -:10BB9000469901000000005FE191010000002D06C0 -:10BBA00048B10100000000F818B00100000000F8E2 -:10BBB00004B0010076871FF00E3000002A87004C89 -:10BBC0000DC0000000002E5F0F8001002A872307B0 -:10BBD000146C00003000001048C90100240000402F -:10BBE000F199010000000003F0B101000000000025 -:10BBF000F0B1010000000016F0B1010024000000C7 -:10BC000000C801000000004761B10100A00000A4CD -:10BC100062DD01007F87A8461F1000002A8700030D -:10BC20000CB000002A87000D18C0000004002E147C -:10BC30000AD001001200000548CD0100FE7F00057A -:10BC400042C901000C002AF2E0B1010089872240BC -:10BC5000316C000000006018389601001E000040A2 -:10BC600043990100008100F680CE01008D87A64037 -:10BC7000813200000000004443C101008F87220B85 -:10BC8000ED6D0000080000A142C90100020000A102 -:10BC900046C901000F0000FA948801000200004A22 -:10BCA00086E40100000000F60EB0010097872247ED -:10BCB0001F7C000004001F430E5000009787A04621 -:10BCC0000F400000000000410FC001009B87224888 -:10BCD0001F7C00000000004091B0010004000FA292 -:10BCE000423100009E87004089B000000C0000A295 -:10BCF00042C901000000004389B001000000004378 -:10BD000095D00100000000FC82B00100A187A04195 -:10BD1000904000000000004191C00100A68722472A -:10BD20001F7C0000A687A043896C0000A6872045E1 -:10BD3000896C0000A687A0410E4000000000004171 -:10BD40000FC001000000004189C001009E87A24190 -:10BD500095500000AF8722481F7C0000100000486B -:10BD600092F40100FFFF004890880100AD879048E1 -:10BD7000924000000000004193C001000A0000A2B0 -:10BD800044C901000000662093A401003080001027 -:10BD900044C9010012000014F0C90100000000179E -:10BDA000F0B1010012000005E0CD010030000010EC -:10BDB00080C801000000004461B101002000004083 -:10BDC00062DD0100B587A84081320000C287225C95 -:10BDD0001F7C000000003C4423E0010000002D1007 -:10BDE00048C10100BF872240E36D0000000000460B -:10BDF00061B101004000001062DD0100BC87A84075 -:10BE0000813200001B8400881CB00000C287875C60 -:10BE10001F0000000000001048B101001196004111 -:10BE200023400100C487A2471F7C000058890017E7 -:10BE300010B0000000002F0348B10100C787A00721 -:10BE4000164000000000004117C001000000000B78 -:10BE5000E4B101000000005017F00100CB8790F220 -:10BE6000164000000000004117C0010000006620DD -:10BE700017A40100100000142AC80100000000509F -:10BE80002BE00100000000F22A9401003080001035 -:10BE900042C90100D5872240E36D00000000004444 -:10BEA00061B101004000001062DD0100D287A840AE -:10BEB000813200001B8400881CB000000080001745 -:10BEC00010DC01005889004081B20000A5950040B7 -:10BED00081320100DB87225C1F7C00001B8400880C -:10BEE0001CB000007C96005C1F0001000080000573 -:10BEF00044C9010000000040E1B1010004002D032D -:10BF000048B10100000000F03CB00100280000141E -:10BF100002C801000000000134B0010000002D053E -:10BF200032B00100220000050AC801001000000321 -:10BF300048C90100000000F818B00100000000F836 -:10BF400004B00100000000F80EB001000C0000A4D5 -:10BF50000CC801000000004017B0010000000040C4 -:10BF600023B00100218822018032000000003C44FF -:10BF700023E0010000002EA480B0010000000010AA -:10BF800048C10100F087A307026C0000F187680137 -:10BF90001AB00000000068071AB001000000000D90 -:10BFA00002D0010000000005F0B101000000000C0B -:10BFB000F0B1010000000002E0B101000000000D3E -:10BFC0000AC0010003882240036C0000FD87224262 -:10BFD000236C00000000004123C001000000004766 -:10BFE00061B10100A00000A462DD01003D8828408D -:10BFF00081320000FA87004081B20000000000108A -:10C0000080C001000000004761B101000000004055 -:10C0100062B10100FF87A840233000001B84008824 -:10C020001CB000003D88004081B2000000000010FC -:10C0300080C001000000004761B101000000004025 -:10C0400062B101000588A840233000001B840088ED -:10C050001CB000002200001948C9010000002D1486 -:10C0600048C101000F0000F23A88010000000042C0 -:10C070003BE001000E00001402C801000000001D9A -:10C0800002C001001188231A02500000000000467F -:10C0900003C001003D88000134C000000C002D1DCC -:10C0A00048C10100F00000F23088010000000042A9 -:10C0B00031F001000000001402B001000000001D7A -:10C0C00002C001000000001802C001001988221AF5 -:10C0D000025000003D88000134C000002200001919 -:10C0E00048C9010002002D1448C10100000000F6FB -:10C0F00014B001000000001D14D001000000001861 -:10C1000014D001000000001E24B00100120000172E -:10C1100010C801003D88001A10C0000000003C4417 -:10C1200023E00100000000A486B0010000002E10F2 -:10C1300048C101002688A3120E6C000027886807FA -:10C140001AB00000000068121AB001002A888008A6 -:10C15000F03100000100001198C801000000004CFF -:10C160001E9001000000000CF0B101000000000270 -:10C17000E0B101000000001086C001000000004690 -:10C1800061B10100011F004362DD01002E88A85C3F -:10C190001F1000005A88220D145000005A88220DEA -:10C1A000245000000000000D10C00100358822421C -:10C1B000236C00003D88004123C0000000000046C1 -:10C1C00061B101004000001062DD01003688A85C0A -:10C1D0001F0000001B8400881CB00000000000103D -:10C1E00048B1010011960043233001000E00000FFA -:10C1F0001E8C01000000004023B001005988A20DF0 -:10C200000E500000488822461F7C000000000046B7 -:10C210001F8001003080001042C901004688224082 -:10C22000E36D00000000004761B101004000001014 -:10C2300062DD01004388A840813200001B84008831 -:10C240001CB0000020800003469901000000005F40 -:10C25000E191010000002D0648B10100000000F846 -:10C2600018B00100000000F804B001004D881FF074 -:10C270000E300000EA87004C0DC0000000002E5F69 -:10C280000F800100EA872307146C000030000010C3 -:10C2900048C9010024000040F1990100000000039A -:10C2A000F0B1010000000000F0B101000000001634 -:10C2B000F0B101002400000000C8010000000047A8 -:10C2C00061B10100A00000A462DD01005688A8460B -:10C2D0001F100000EA8700030CB00000EA87000D81 -:10C2E00018C000007788A2441F7C000000000019DD -:10C2F0000AB001002200000548C901000A002D14FF -:10C3000048C1010002002040E5B1010004002040C6 -:10C31000E5B101000D002D1D48C10100090000F329 -:10C32000388801000D002050E7B1010004002D40C5 -:10C330003FB00100000000F432B0010004002040D2 -:10C34000E1B101002200000548C9010000002D14E0 -:10C3500048C101000200001D94F4010000000040EB -:10C3600091B001006C88A0FC9040000000000041EA -:10C3700091C001006A88A241955000000480000528 -:10C3800044C9010000000048F0B10100000000189D -:10C3900048C101000200001894F4010000002D18AB -:10C3A00090B001007488A0FC9040000000000041A3 -:10C3B00091C001007288A241955000000000004821 -:10C3C000E0B1010010002040E5B1010022000005AD -:10C3D00048C901000000001448C1010004800005A4 -:10C3E00042C90100000000F880B00100000000F028 -:10C3F00016C001007C8842303D0700000000009E0E -:10C4000085B0010000001A413DC301000400204234 -:10C41000ECB101000000001E82B0010002002E1DE0 -:10C4200082C001000000661882C0010000000042C6 -:10C4300080C001008688A0418044000000000041C7 -:10C4400081C001001000004092F401000A002E306B -:10C45000818401008A8890409240000000000041E1 -:10C4600093C001000000662093A401000000001D9D -:10C4700048C1010004002019E8B101000000001EBD -:10C4800016C001009088A019164400000000004169 -:10C4900017C001000D002F1E32C001009588A24078 -:10C4A000156C00009488A01C16400000000000419C -:10C4B00017C00100000063F338940100100000056C -:10C4C00048C9010004002E1E98B001000000601A47 -:10C4D00098C001000C002040E1B10100A388224671 -:10C4E0001F7C0000000000461F800100308000100B -:10C4F00042C90100A1882240E36D0000000000470E -:10C5000061B101004000001062DD01009E88A8407A -:10C51000813200001B8400881CB0000020800003D2 -:10C52000469901000000005FE19101003080001099 -:10C5300044C901001200001AF0C9010000000017F0 -:10C54000F0B1010010000005E0C90100300000104A -:10C5500080C801000000004461B1010020000040DB -:10C5600062DD0100A988A84081320000B788225C02 -:10C570001F7C000000003C4423E0010000002D105F -:10C5800048C10100B3882240E36D0000000000466E -:10C5900061B101004000001062DD0100B088A840D8 -:10C5A000813200001B8400881CB000000000005C89 -:10C5B0001F8001000000001048B1010011960041E9 -:10C5C000234001000E00000F1E8C010020002F05EB -:10C5D00048B101000000000BE4B101000000005070 -:10C5E00017F00100BC8890F21640000000000041E6 -:10C5F00017C001000000662017A4010010000014FD -:10C600002AC801000000001D2AC0010000000050DF -:10C610002BE00100000000F22A940100308000109D -:10C6200042C90100C7882240E36D000000000044B9 -:10C6300061B101004000001062DD0100C488A84023 -:10C64000813200001B8400881CB0000000800017AD -:10C6500010DC0100E4882240156C0000CF88A24461 -:10C660001F7C0000000000441F900100CE88229F24 -:10C67000136C0000020000881CCC01006B84004099 -:10C6800081B20000000000413FC3010066990040F4 -:10C6900081320100D288A241877C00000000001E88 -:10C6A0003EC00100E4882240156C0000D588201EA1 -:10C6B000146C00000000000A3CB00100DD95001E73 -:10C6C00024300100DA8822082E30000000000052D9 -:10C6D00011C001000000001A10C001003D88004098 -:10C6E00017B000006B8400881CB00000DD9500408E -:10C6F00081320100D788A2082E300000808000A679 -:10C7000004B001000600004087980100008000038B -:10C710004499010004002204E03100005599001FF3 -:10C720008C300100000000400FB00100058A005C61 -:10C730001F900000008000034499010004002204BF -:10C74000E03100006699004081320100E988A24191 -:10C75000877C0000EA88001E3EC000000000001F29 -:10C760008CB001000000004005B001005599004068 -:10C770000F300100058A005C1F900000F5889C0FB7 -:10C78000803200000000005C1F800100008000106B -:10C7900042C90100F5882240E36D00000000004717 -:10C7A00061B101004000001062DD0100F288A84084 -:10C7B000813200001B8400881CB00000FA88220728 -:10C7C000803200000000000342B1010000000007B9 -:10C7D00042C10100008000A1469901000000005FF5 -:10C7E000E191010004002E0348B10100FD8820946E -:10C7F000156C0000FE880094E1B100000000000A02 -:10C80000E0B1010001892240316C00000C000040C1 -:10C8100045990100000060183896010000002E10B4 -:10C8200048B1010000000050F1B101000000000813 -:10C83000F0B1010000000003E0B10100000000447D -:10C8400061B101000000001062B101000689A8403A -:10C85000233000001B8400881CB0000000002D5213 -:10C8600011C001001000000348C90100000000F8D9 -:10C8700018B00100000000F804B00100000000F84A -:10C880000EB001000C0000A40CC8010000003C44E4 -:10C8900023E00100000000A486B0010000002E107B -:10C8A00048C101001489A3120E6C000015896807A5 -:10C8B0001AB00000000068121AB001000000001059 -:10C8C00086C0010000000008F0B101000000000C6B -:10C8D000F0B1010000000002E0B1010000000046DC -:10C8E00061B10100011F004362DD01001A89A85CEB -:10C8F0001F1000004B89220D146C00002089220DAE -:10C90000246C00000000000D10C001002489000DFF -:10C9100024D00000000000412BC0010000000015E1 -:10C92000A2B101001000002010C80100F007004073 -:10C930002598010026892242236C00002D890041A0 -:10C9400023C000000000004661B10100400000105B -:10C9500062DD01002789A85C1F0000001B8400889D -:10C960001CB000000000001048B10100D794004343 -:10C97000233001000000004023B001000400220D1C -:10C98000145000004A89A20D0E5000003989224639 -:10C990001F7C0000000000461F8001003080001056 -:10C9A00042C9010037892240E36D000000000047C2 -:10C9B00061B101004000001062DD01003489A8402F -:10C9C000813200001B8400881CB00000208000031E -:10C9D000469901000000005FE191010000002D0672 -:10C9E00048B10100000000F818B00100000000F894 -:10C9F00004B001003E891FF00E3000000F89004C8A -:10CA00000DC0000000002E5F0F8001000F8923077A -:10CA1000146C00003000001048C9010024000040E0 -:10CA2000F199010000000003F0B1010000000000D6 -:10CA3000F0B1010000000016F0B101002400000078 -:10CA400000C801000000004761B10100A00000A47F -:10CA500062DD01004789A8461F1000000F8900030E -:10CA60000CB000000F89000D18C000005489225C32 -:10CA70001F7C00000000005C1F80010000003C449F -:10CA800023E0010000002D1048C10100548922401C -:10CA9000E36D00000000004661B10100400000109D -:10CAA00062DD01005189A840813200001B840088AA -:10CAB0001CB000000000001048B10100D7940041F4 -:10CAC000234001000000001710B001005889004009 -:10CAD0002BB0000000800003449901000000000416 -:10CAE000E0B101005D89229F136C00000200008804 -:10CAF0001CCC01006B84004081B2000066990041AB -:10CB00003F430100000000408DB0010000000040E4 -:10CB100005B00100559900400F3001001B8A005CF0 -:10CB20001F900000100000000EF401000000003A09 -:10CB300001840100030000071AF401002196000798 -:10CB4000163001006C892241816C00006A89224202 -:10CB5000816C00001B8400881CB000006B89225F80 -:10CB60000F7C0000058A00400FB000007489A25AB3 -:10CB70001F7C00009B9500408132010074892220B7 -:10CB8000856C000071899C0F803200001B84008836 -:10CB90001CB000007C96005C1F0001009B980042C6 -:10CBA000613101001B8400881CB00000E699000779 -:10CBB0009630010000002D0548B10100000000F092 -:10CBC00018B001000000000080B00100AE8AA25F32 -:10CBD000816C0000A8002D431980010037002DF062 -:10CBE00024B00100040000F38EF401000F0000F3F4 -:10CBF00090880100838922488E6C00003600004036 -:10CC00004399010058003D43E7E1010083891FF08B -:10CC1000246C0000828923418F6C0000AE8A00479B -:10CC200081B00000AE8A004881B0000040000040A2 -:10CC300043990100B0002DF014B001008889220A48 -:10CC4000904000003999004091300100AE8AA24026 -:10CC500080320000B0002D4581B00100948922F09F -:10CC60002C300000A3002D3083B00100AC002DF368 -:10CC700082E001008E89A3412C6C000000000016A8 -:10CC800082B0010098002DF082C0010088002DF0D4 -:10CC900082D00100000000F298E80100AE8A204C2A -:10CCA000826C00007C002D4198E80100AE8A20F0E3 -:10CCB000986C0000058A220A803200004002000CB5 -:10CCC0007E890100058AA64081320000AE8A0049B3 -:10CCD00081B00000200000A680B001009C892243A2 -:10CCE000216F00001380004080DC01009D8900401E -:10CCF00081B200001A80004080DC01009D89A25EA4 -:10CD00000B7D00000000004008B101009F899F8555 -:10CD100080320000A389004081B200005F8422407D -:10CD2000577D00000100004057990100A38942404F -:10CD300081320000000000449393010049841A5B93 -:10CD4000699300007B00004061990100A689A8B1A9 -:10CD500080300000CF891D4080320000C089224011 -:10CD6000AF6F0000C089225B817C00000400225D5F -:10CD7000737D00007D00004061990100AC89A8B17D -:10CD8000943000000000005F61B101000000004A23 -:10CD900062B10100AF89A84081320000B1894340EF -:10CDA00081320000BF892257737D00007700004068 -:10CDB00061990100B389A8B1943000007700004068 -:10CDC00061990100B589A8B19630000000000048C3 -:10CDD00061B101000000004A62B10100B889A84AAF -:10CDE00080330000BD89225F957C00000000004B6D -:10CDF00062B10100BB89A84BAC33000000001BA549 -:10CE000082B30100C08900BE83C3000000001B4044 -:10CE100081B301004018004049990100040000A6B8 -:10CE200086B00100CD89A240860400001B849C408E -:10CE300080320000FFFF004088880100E98900502F -:10CE4000473101003600004488CC0100C9895240B6 -:10CE500081320000E98900404731010000000041B3 -:10CE600089B00100E989004847310100E9890005DE -:10CE7000473101001B84004081B2000028000040BF -:10CE8000479901001B840041E1C10000781800406F -:10CE900049990100D6892254817C0000D189424001 -:10CEA00081320000008200B469DF010000001A44F2 -:10CEB000939301002800004047990100E98900414F -:10CEC00089300100E4890F4080320000FF7F00407C -:10CED00088880100E989005047310100360000448C -:10CEE00088CC0100DC8999408032000000000048B5 -:10CEF00089D00100DE899B40803200000000004C98 -:10CF000089D00100E0891F4480320000E989004097 -:10CF1000473101000000004189B00100E989004863 -:10CF200047310100E9890058473101001B84004066 -:10CF300081B200001000004086F401006F00004341 -:10CF4000868801001B84260547310000E9890041DD -:10CF5000893001001B84004081B200000000A04421 -:10CF6000F04101000000004081B20100000080415A -:10CF7000E1C10100040000CB81C80100EF8922401B -:10CF8000F27F00008180006F97330100F189224019 -:10CF9000737D00009B8000418BB30000EC89225917 -:10CFA000737D00007900004061990100EC8928B18F -:10CFB0007E310000F289004081B20000040022C0EE -:10CFC00095300000000000D697B00100FA89225D7C -:10CFD000737D00007D00004061990100F889A8B1CF -:10CFE000803000000000005E7F830100000000BF71 -:10CFF000C5B10100040000408198010025010040F6 -:10D0000081320100FD89A24181500000FF89435F08 -:10D010007F130000260100BFC53101000000005F42 -:10D020007F8301000000005E7F9301008B9800BFAA -:10D03000C53101001B84004081B200000C8A9C0FA6 -:10D04000803200000080001042C901000C8A22409A -:10D05000E36D00000000004561B1010040000010D8 -:10D0600062DD0100098AA840813200001B8400882B -:10D070001CB0000077952202803200000D8A4240E9 -:10D0800081320000000000449393010077951A025A -:10D0900068970000178A9C0F803200000080001003 -:10D0A00042C90100178A2240E36D000000000045DC -:10D0B00061B101004000001062DD0100148AA84047 -:10D0C000813200001B8400881CB000008195220280 -:10D0D00080320000188A4240813200000000004483 -:10D0E0009393010081951A0268970000228A9C0F91 -:10D0F000803200000080001042C90100228A2240D4 -:10D10000E36D00000000004561B101004000001027 -:10D1100062DD01001F8AA840813200001B84008864 -:10D120001CB000006F84220280320000238A42403B -:10D1300081320000000000449393010000001A02B5 -:10D14000689701006F84004005B00000008000A6D1 -:10D1500056B1010056952F4005B00100738AA240D8 -:10D16000E76D0000B8942941E7B1010000000054C8 -:10D17000EF930100000000F20EB001002900004012 -:10D180000D9801000900000712E40100000000A74B -:10D1900013C00100030000071AF401000700000794 -:10D1A00016880100FFFF001034D8010000000003C2 -:10D1B000349401000000004023B00100201800401A -:10D1C0001198010000B5000D42C90100578A220BD9 -:10D1D000E67D0000388A444081320000FFFF0007EE -:10D1E000848901003F8A05C224300000679800400E -:10D1F0008132010000002D0548B10100748A1CF045 -:10D2000018300100578A004081B2000000001C4025 -:10D2100081B201004E8AA048236C0000000000503B -:10D2200035D001000080001A42C90100488A22401E -:10D23000E36D00000000004261B101004000001AEF -:10D2400062DD0100458AA840813200001B8400880D -:10D250001CB000002098004043990100748A00F837 -:10D2600018300100498AA24123500000FFFF00103E -:10D2700034D801000000000334940100201800405D -:10D280001198010000002E1A48B10100000000446E -:10D29000F1B1010000000008F0B1010000000042FF -:10D2A00061B101002000001A62DD0100528AA80964 -:10D2B000E03100000000004123C0010000000050E8 -:10D2C00035C001000000004411C00100638A224102 -:10D2D0000D500000000000410FC001005F8AA0AAAD -:10D2E0000F6C0000000000410FB0010009000007B2 -:10D2F00012E40100000000A713C00100000000407C -:10D300001BB00100368A004117B00000000200097E -:10D3100012C80100368A8341174000000000004017 -:10D3200017B00100368A00411BC000006E8A2340FE -:10D33000236C00000000005035D001000080001A6E -:10D3400042C901006B8A2240E36D000000000042E8 -:10D3500061B101004000001A62DD0100688AA84046 -:10D36000813200001B8400881CB00000209800401F -:10D3700043990100748A00F8183001006C8AA241B8 -:10D3800023500000000000410FC00100718AA0AAD4 -:10D390000F6C0000000000410FB00100B89420079E -:10D3A000E4B1010056952040E7B10100058A004034 -:10D3B0000FB00000FFFF000C80D80100C002000C7D -:10D3C0007E890100868A2654613100007C8A870CA0 -:10D3D000803200000F000040629901007C8A2840E2 -:10D3E000813200007C8AA254777D0000788A004058 -:10D3F00081B20000818A2246197C00000D000040A5 -:10D40000629901000000A84081B200000000A2540F -:10D41000777D01007D8A004081B20000868A224922 -:10D42000197C00000E000040629901000000A84035 -:10D4300081B200000000A254777D0100818A004083 -:10D4400081B2000010000040629901000000A84075 -:10D4500081B200000000A254777D0100868A00405E -:10D4600081B2000030942F55F1930100004000A6D6 -:10D4700056B101006F84A241E551000064000040F4 -:10D48000E59901008E8A424081320000918AA29380 -:10D49000576F00000000004157C3010000001AABA5 -:10D4A00027B301006F842250FD7F00006F8422515A -:10D4B000FD7F00006F84A2411D53000050460040D4 -:10D4C0001D9B010034820040813201000E000048A3 -:10D4D000B2CB0100FC810040493101009D8A22400D -:10D4E000B56F00000E000048B2CB0100FF81004183 -:10D4F000B55301006F84004081B20000000000516C -:10D50000FD8301004016004045990100358200402E -:10D51000493101001E000048B2CB0100FC810040EF -:10D5200081320100000000DA91C0010004000048CF -:10D53000B2CB0100FF810040B533010060162040EE -:10D54000E5B10100DB820040B5330100080000486E -:10D55000B2CB0100FFFF004AB48B0100FF81004005 -:10D56000813201000A000048B2CB01001000004ADD -:10D57000B4F70100FF810040813201006F84004058 -:10D5800081B200000500004043990100000000F353 -:10D5900008B0010004002040E6B101000300004093 -:10D5A00096E401000000000496C00100B48A004B1C -:10D5B00010C90000D78D004109B000000400002010 -:10D5C0008FB00000040000208FB000000400002095 -:10D5D0008FB00000040000208FB000000400002085 -:10D5E0008FB00000040000208FB000000400002075 -:10D5F0008FB00000040000208FB000000B8E0041AF -:10D6000009B00000040000208FB0000004000020DA -:10D610008FB00000040000208FB000000400002044 -:10D620008FB00000040000208FB000000400002034 -:10D630008FB00000040000208FB000000400002024 -:10D640008FB000003D8E004509B000003D8E0045C2 -:10D6500009B000003D8E004509B000003D8E004538 -:10D6600009B00000040000208FB00000040000207A -:10D670008FB00000040000208FB0000004000020E4 -:10D680008FB000007C8E004309B00000A58E0043DF -:10D6900009B00000A98E004409B0000011900045B7 -:10D6A00009B00000040000208FB00000040000203A -:10D6B0008FB00000040000208FB0000004000020A4 -:10D6C0008FB00000040000208FB00000B58E004332 -:10D6D00009B00000B48E004309B00000D58D0045AC -:10D6E00009B00000040000208FB0000004000020FA -:10D6F0008FB00000040000208FB000000400002064 -:10D700008FB00000758F004209B00000758F004394 -:10D7100009B00000758F004409B00000D58D0045A8 -:10D7200009B00000040000208FB0000004000020B9 -:10D730008FB00000040000208FB000000400002023 -:10D740008FB00000040000208FB00000A18F0043C4 -:10D7500009B00000040000208FB00000D58D004506 -:10D7600009B00000040000208FB000000400002079 -:10D770008FB00000040000208FB0000004000020E3 -:10D780008FB00000040000208FB00000BF8F004366 -:10D7900009B00000BF8F004409B00000D58D0045DE -:10D7A00009B00000040000208FB000000400002039 -:10D7B0008FB00000040000208FB0000004000020A3 -:10D7C0008FB00000040000208FB00000BF8F004227 -:10D7D00009B00000040000208FB00000D58D004586 -:10D7E00009B00000040000208FB0000004000020F9 -:10D7F0008FB00000040000208FB000000400002063 -:10D800008FB00000040000208FB00000E78F0044BC -:10D8100009B00000040000208FB00000D58D004545 -:10D8200009B00000040000208FB0000004000020B8 -:10D830008FB00000040000208FB000000400002022 -:10D840008FB00000D58D004209B00000F88F004570 -:10D8500009B00000F88F004509B00000D58D0045E3 -:10D8600009B00000040000208FB000000400002078 -:10D870008FB00000040000208FB0000004000020E2 -:10D880008FB00000FA8F004209B00000FA8F004309 -:10D8900009B00000FA8F004409B00000FA8F00457B -:10D8A00009B00000040000208FB000000400002038 -:10D8B0008FB00000040000208FB0000004000020A2 -:10D8C0008FB00000040000208FB000000400002092 -:10D8D0008FB000000290004409B00000D58D0045D3 -:10D8E00009B00000040000208FB0000004000020F8 -:10D8F0008FB00000040000208FB000000400002062 -:10D900008FB000001390004209B000000390004364 -:10D9100009B000001390004409B00000D58D004507 -:10D9200009B00000040000208FB0000004000020B7 -:10D930008FB00000040000208FB000000400002021 -:10D940008FB00000040000208FB00000149000434E -:10D9500009B000000A90004409B00000D58D0045D0 -:10D9600009B00000040000208FB000000400002077 -:10D970008FB00000040000208FB00000D58D004162 -:10D9800009B00000738F004209B00000738F00439C -:10D9900009B00000738F004409B00000D58D004528 -:10D9A00009B00000040000208FB000000400002037 -:10D9B0008FB00000040000208FB00000D58D004122 -:10D9C00009B000001590004209B000001590004316 -:10D9D00009B000001590004409B00000D58D004545 -:10D9E00009B00000040000208FB0000004000020F7 -:10D9F0008FB00000040000208FB000000400002061 -:10DA00008FB00000040000208FB000000400002050 -:10DA10008FB00000040000208FB000001C90004573 -:10DA200009B00000040000208FB0000004000020B6 -:10DA30008FB00000040000208FB000001E90004254 -:10DA400009B00000040000208FB000000400002096 -:10DA50008FB00000040000208FB000000400002000 -:10DA60008FB00000040000208FB0000004000020F0 -:10DA70008FB00000040000208FB0000004000020E0 -:10DA80008FB000002A90004309B00000939000433B -:10DA900009B00000A98E004409B0000011900045B3 -:10DAA00009B00000040000208FB000000400002036 -:10DAB0008FB00000040000208FB0000004000020A0 -:10DAC0008FB00000040000208FB000009B90004346 -:10DAD00009B00000A98E004409B000001190004573 -:10DAE00009B00000040000208FB0000004000020F6 -:10DAF0008FB00000040000208FB000000400002060 -:10DB00008FB00000040000208FB00000AC900043F4 -:10DB100009B00000040000208FB00000D58D004542 -:10DB200009B00000040000208FB0000004000020B5 -:10DB30008FB00000040000208FB00000040000201F -:10DB40008FB00000798E004309B000009790004329 -:10DB500009B00000A98E004409B0000011900045F2 -:10DB600009B00000040000208FB000000400002075 -:10DB70008FB0000007002D0548B10100000000F340 -:10DB800008B0010006002047E6B10100040000478C -:10DB900096E401000000004796D001000000004715 -:10DBA00096D001000000000496C00100748B004B69 -:10DBB00010C90000C490004909B000000400002012 -:10DBC00085B000000400002085B0000004000020A3 -:10DBD00085B000000400002085B000000400002093 -:10DBE00085B000000400002085B000000400002083 -:10DBF00085B000000400002085B000000400002073 -:10DC000085B000000400002085B000000400002062 -:10DC100085B000000400002085B000000400002052 -:10DC200085B000000400002085B00000FD90004297 -:10DC300009B000000400002085B0000004000020AE -:10DC400085B000000400002085B000000400002022 -:10DC500085B000000400002085B000000400002012 -:10DC600085B000000400002085B000000400002002 -:10DC700085B000000400002085B0000004000020F2 -:10DC800085B000000400002085B0000004000020E2 -:10DC900085B000000400002085B00000039100461C -:10DCA00009B000000400002085B00000040000203E -:10DCB00085B000000400002085B0000004000020B2 -:10DCC00085B000000400002085B0000004000020A2 -:10DCD00085B000000400002085B000000400002092 -:10DCE00085B000000400002085B000000400002082 -:10DCF00085B000000400002085B000000400002072 -:10DD000085B000000400002085B000000400002061 -:10DD100085B000001191004209B00000040000200D -:10DD200085B000003391004209B0000004000020DB -:10DD300085B000000400002085B000000400002031 -:10DD400085B000000400002085B000000400002021 -:10DD500085B000000400002085B000002E91004A2C -:10DD600009B000000400002085B00000040000207D -:10DD700085B000000400002085B0000004000020F1 -:10DD800085B000003691004309B000000400002077 -:10DD900085B000008F91004409B00000040000200D -:10DDA00085B000000400002085B0000004000020C1 -:10DDB00085B000000400002085B0000004000020B1 -:10DDC00085B000000400002085B000008E91004B5B -:10DDD00009B000000400002085B00000040000200D -:10DDE00085B000000400002085B0000006910041CD -:10DDF00009B000000400002085B000000691004337 -:10DE000009B000000691004409B0000006910045E9 -:10DE100009B000000691004609B0000006910047D5 -:10DE200009B000000691004809B0000006910049C1 -:10DE300009B000000691004A09B000000691004BAD -:10DE400009B000000691004C09B000000691004D99 -:10DE500009B000000400002085B00000040000208C -:10DE600085B00000EE91004209B0000004000020DF -:10DE700085B00000EE91004409B0000004000020CD -:10DE800085B000000400002085B0000004000020E0 -:10DE900085B000000400002085B0000004000020D0 -:10DEA00085B000000400002085B00000EE91004B1A -:10DEB00009B000000400002085B00000040000202C -:10DEC00085B000000400002085B0000004000020A0 -:10DED00085B000000400002085B0000006920045D7 -:10DEE00009B000000400002085B0000004000020FC -:10DEF00085B000000400002085B000000400002070 -:10DF000085B000001D92004709B000000400002009 -:10DF100085B00000FA91004509B00000040000201F -:10DF200085B000000400002085B000007C9400460D -:10DF300009B000000400002085B0000004000020AB -:10DF400085B000000400002085B00000040000201F -:10DF500085B000000400002085B000003391004629 -:10DF600009B000001191004609B000002C91004753 -:10DF700009B000002C91004809B000000400002006 -:10DF800085B000000400002085B0000004000020DF -:10DF900085B000002E91004A09B000000400002066 -:10DFA00085B000000400002085B0000004000020BF -:10DFB00085B000000400002085B0000004000020AF -:10DFC00085B000000400002085B000008F9100455E -:10DFD00009B000003691004309B000002C910047C1 -:10DFE00009B000002C91004809B000000400002096 -:10DFF00085B000000400002085B00000040000206F -:10E0000085B000008E91004C09B000000400002093 -:10E0100085B000000400002085B00000040000204E -:10E0200085B000000400002085B00000040000203E -:10E0300085B000000400002085B000002392004459 -:10E0400009B000002392004209B00000C08D0047D3 -:10E0500009B00000C08D004809B000000400002095 -:10E0600085B000000400002085B0000004000020FE -:10E0700085B000002392004B09B00000040000208E -:10E0800085B000000400002085B00000069100412A -:10E0900009B000004692004709B0000004000020CB -:10E0A00085B000002E92004709B000000400002057 -:10E0B00085B000000400002085B0000004000020AE -:10E0C00085B000000400002085B00000040000209E -:10E0D00085B000000400002085B000002E920047AB -:10E0E00009B000000400002085B0000004000020FA -:10E0F00085B000000400002085B00000040000206E -:10E1000085B000000400002085B00000040000205D -:10E1100085B000000400002085B000002E9200476A -:10E1200009B000004692004709B000002C9100475A -:10E1300009B000002C91004809B000000400002044 -:10E1400085B000000400002085B00000040000201D -:10E1500085B000002E92004709B0000004000020A6 -:10E1600085B000000400002085B0000004000020FD -:10E1700085B000000400002085B0000004000020ED -:10E1800085B000000400002085B0000004000020DD -:10E1900085B000000400002085B0000055920047C3 -:10E1A00009B000005592004809B0000004000020AA -:10E1B00085B000000400002085B0000004000020AD -:10E1C00085B000000400002085B00000040000209D -:10E1D00085B000000400002085B00000B892004027 -:10E1E00009B00000D692004709B00000CA9200486A -:10E1F00009B000002692004709B0000026920047AF -:10E2000009B00000D692004709B00000DD92004737 -:10E2100009B00000DD92004809B0000004000020B1 -:10E2200085B00000CA92004809B00000269200475D -:10E2300009B000002692004709B00000CA920048C9 -:10E2400009B000000400002085B000000400002098 -:10E2500085B000000400002085B00000EE9100436E -:10E2600009B000000400002085B00000EE910045D8 -:10E2700009B00000EE91004609B000002C91004763 -:10E2800009B000002C91004809B0000004000020F3 -:10E2900085B00000EE91004A09B0000004000020A3 -:10E2A00085B00000EE91004C09B000000400002091 -:10E2B00085B000000400002085B0000004000020AC -:10E2C00085B000004592004709B00000399200482F -:10E2D00009B000002D92004709B000002D920047C0 -:10E2E00009B000004592004709B00000C08D00470A -:10E2F00009B00000C08D004809B0000004000020F3 -:10E3000085B000003992004809B000002D92004706 -:10E3100009B000002D92004709B000003992004872 -:10E3200009B000000400002085B0000004000020B7 -:10E3300085B00000DF92004209B000000400002018 -:10E3400085B00000DF92004409B000000400002006 -:10E3500085B000000400002085B00000040000200B -:10E3600085B000000400002085B0000004000020FB -:10E3700085B000000400002085B00000DF92004B53 -:10E3800009B000000400002085B000000400002057 -:10E3900085B000000400002085B0000004000020CB -:10E3A00085B000000400002085B00000DF9200432B -:10E3B00009B000000400002085B00000DF92004595 -:10E3C00009B00000DF92004609B00000DF9200476C -:10E3D00009B00000DF92004809B0000004000020EE -:10E3E00085B00000DF92004A09B000000400002060 -:10E3F00085B00000DF92004C09B00000DF92004CB5 -:10E4000009B000000400002085B0000004000020D6 -:10E4100085B000000400002085B00000FA9200469C -:10E4200009B000000400002085B0000004000020B6 -:10E4300085B000000400002085B00000040000202A -:10E4400085B000001D92004709B0000004000020C4 -:10E4500085B00000FA92004609B0000004000020D8 -:10E4600085B000000400002085B0000004000020FA -:10E4700085B000000400002085B0000004000020EA -:10E4800085B000000400002085B00000069400461E -:10E4900009B000000400002085B000000400002046 -:10E4A00085B000000400002085B0000004000020BA -:10E4B00085B000001D92004709B000000400002054 -:10E4C00085B000000694004609B00000040000205A -:10E4D00085B000000400002085B0000006940046CE -:10E4E00009B000000400002085B0000004000020F6 -:10E4F00085B000000400002085B00000040000206A -:10E5000085B000002B94004209B0000004000020F8 -:10E5100085B000000400002085B000000400002049 -:10E5200085B000000400002085B000000400002039 -:10E5300085B000000400002085B000002A94004A45 -:10E5400009B000000400002085B000000400002095 -:10E5500085B000000400002085B000000400002009 -:10E5600085B000000400002085B0000004000020F9 -:10E5700085B000000400002085B000002B94004608 -:10E5800009B000000400002085B000002C91004775 -:10E5900009B000002C91004809B0000004000020E0 -:10E5A00085B000000400002085B0000004000020B9 -:10E5B00085B000002A94004A09B000000400002041 -:10E5C00085B000000400002085B000000400002099 -:10E5D00085B000000400002085B000000400002089 -:10E5E00085B000000400002085B000000400002079 -:10E5F00085B000000400002085B000000400002069 -:10E6000085B000000400002085B00000EA920041BF -:10E6100009B000000400002085B0000004000020C4 -:10E6200085B000000400002085B000000400002038 -:10E6300085B000000400002085B000000400002028 -:10E6400085B00000F792004209B0000004000020ED -:10E6500085B00000F792004409B0000004000020DB -:10E6600085B000000400002085B0000004000020F8 -:10E6700085B000000400002085B0000004000020E8 -:10E6800085B000000400002085B00000F792004B28 -:10E6900009B000000400002085B000000400002044 -:10E6A00085B000000400002085B0000004000020B8 -:10E6B00085B000000400002085B00000F792004300 -:10E6C00009B000000400002085B00000F79200456A -:10E6D00009B00000F792004609B00000F792004729 -:10E6E00009B00000F792004809B0000004000020C3 -:10E6F00085B000000400002085B000000400002068 -:10E7000085B00000F792004C09B000000400002022 -:10E7100085B000000400002085B000000400002047 -:10E7200085B000000400002085B000000692004C77 -:10E7300009B000000400002085B0000004000020A3 -:10E7400085B000000400002085B000000400002017 -:10E7500085B000001D92004709B0000004000020B1 -:10E7600085B00000FA91004C09B0000004000020C0 -:10E7700085B000000400002085B00000CD94004664 -:10E7800009B000000400002085B000000400002053 -:10E7900085B000007194004209B000000400002020 -:10E7A00085B000007194004409B00000040000200E -:10E7B00085B000000400002085B0000004000020A7 -:10E7C00085B000000400002085B000000400002097 -:10E7D00085B000000400002085B000007194004B5B -:10E7E00009B000000400002085B0000004000020F3 -:10E7F00085B000000400002085B000000400002067 -:10E8000085B000000400002085B000000400002056 -:10E8100085B000000400002085B000007194004520 -:10E8200009B000007194004609B000002C91004727 -:10E8300009B000002C91004809B00000040000203D -:10E8400085B000000400002085B000000400002016 -:10E8500085B000007194004C09B000000400002055 -:10E8600085B000000400002085B0000004000020F6 -:10E8700085B00000FA91004209B000007C94004687 -:10E8800009B000000400002085B000000400002052 -:10E8900085B00000FA91004609B000000400002095 -:10E8A00085B000001D92004709B000000400002060 -:10E8B00085B000007C94004609B0000004000020F0 -:10E8C00085B000000400002085B000007C94004664 -:10E8D00009B000000400002085B000000400002002 -:10E8E00085B000000400002085B000008094004343 -:10E8F00009B000000400002085B0000004000020E2 -:10E9000085B000000400002085B000000400002055 -:10E9100085B000001D92004709B0000004000020EF -:10E9200085B000008094004309B00000040000207E -:10E9300085B000000400002085B000008094004DE8 -:10E9400009B000000400002085B000000400002091 -:10E9500085B000000400002085B000000400002005 -:10E9600085B000009294004309B00000040000202C -:10E9700085B000000400002085B0000004000020E5 -:10E9800085B000000400002085B0000004000020D5 -:10E9900085B000000400002085B000006F94004A9C -:10E9A00009B000000400002085B000000400002031 -:10E9B00085B000000400002085B0000004000020A5 -:10E9C00085B000000400002085B000000400002095 -:10E9D00085B000000400002085B000009294004340 -:10E9E00009B000000400002085B000002C91004711 -:10E9F00009B000002C91004809B00000040000207C -:10EA000085B000000400002085B000000400002054 -:10EA100085B000006F94004A09B000000400002097 -:10EA200085B000000400002085B000000400002034 -:10EA300085B000000400002085B00000A4940043CD -:10EA400009B000000400002085B000000400002090 -:10EA500085B000000400002085B000000400002004 -:10EA600085B000001D92004709B00000040000209E -:10EA700085B00000A494004309B000000400002009 -:10EA800085B000000400002085B00000A494004D73 -:10EA900009B000000400002085B000000400002040 -:10EAA00085B000001191004209B000000400002070 -:10EAB00085B000003391004209B00000040000203E -:10EAC00085B000000400002085B000000400002094 -:10EAD00085B000000400002085B000000400002084 -:10EAE00085B000000400002085B00000C3940042FF -:10EAF00009B000000400002085B0000004000020E0 -:10EB000085B000000400002085B000000400002053 -:10EB100085B000000400002085B000000400002043 -:10EB200085B000000400002085B00000339100464D -:10EB300009B000001191004609B000002C91004777 -:10EB400009B000002C91004809B00000040000202A -:10EB500085B000000400002085B000000400002003 -:10EB600085B00000C394004609B0000004000020F6 -:10EB700085B000000400002085B0000004000020E3 -:10EB800085B000000400002085B00000C594004A54 -:10EB900009B000000400002085B00000040000203F -:10EBA00085B000000400002085B0000004000020B3 -:10EBB00085B000001D92004709B00000040000204D -:10EBC00085B00000C594004A09B000000400002090 -:10EBD00085B000000400002085B000007D94004650 -:10EBE00009B000000400002085B0000004000020EF -:10EBF00085B000000400002085B000007D94004630 -:10EC000009B000000400002085B0000004000020CE -:10EC100085B000000400002085B000000400002042 -:10EC200085B000001D92004709B0000004000020DC -:10EC300085B000007D94004609B00000040000206B -:10EC400085B000000400002085B000007D940046DF -:10EC500009B000000400002085B00000040000207E -:10EC600085B000000400002085B0000004000020F2 -:10EC700085B00000CB94004209B0000004000020E1 -:10EC800085B000000400002085B0000004000020D2 -:10EC900085B000000400002085B0000004000020C2 -:10ECA00085B000000400002085B000006F94004A89 -:10ECB00009B000000400002085B00000040000201E -:10ECC00085B000000400002085B000000400002092 -:10ECD00085B000000400002085B000000400002082 -:10ECE00085B000000400002085B00000CB940046F1 -:10ECF00009B000000400002085B000002C910047FE -:10ED000009B000002C91004809B000000400002068 -:10ED100085B000000400002085B000000400002041 -:10ED200085B000006F94004A09B000000400002084 -:10ED300085B000000400002085B000000400002021 -:10ED400085B000003691004D09B00000040000209D -:10ED500085B000000400002085B000000400002001 -:10ED600085B000000400002085B0000004000020F1 -:10ED700085B000000400002085B0000004000020E1 -:10ED800085B000000400002085B0000004000020D1 -:10ED900085B000000400002085B0000004000020C1 -:10EDA00085B000000400002085B0000004000020B1 -:10EDB00085B000000400002085B0000004000020A1 -:10EDC00085B000000400002085B000000400002091 -:10EDD00085B000003691004D09B000002C9100472D -:10EDE00009B000002C91004809B000000400002088 -:10EDF00085B000000400002085B000000400002061 -:10EE000085B000000400002085B000000400002050 -:10EE100085B0000007002E4B19900100108A0004F5 -:10EE2000E6B10000C08D2242197C0000C597003A6F -:10EE300081300100C08D004081B20000C08D2242AF -:10EE4000197C0000FF1F000F1E8C01003797004047 -:10EE500081320100D08D9C0F803200000000005CE8 -:10EE60001F8001000080001042C90100D08D2240A7 -:10EE7000E36D00000000004561B10100400000109A -:10EE800062DD0100CD8DA840813200001B84008826 -:10EE90001CB000001986220280320000D18D424051 -:10EEA00081320000000000449393010000001A0228 -:10EEB000689701001986004005B0000005002E4B40 -:10EEC00019900100108A0004E6B100000000004023 -:10EED00087B00100000000408DB0010000800003F9 -:10EEE00042C90100400000A144C90100000000F037 -:10EEF000E0B101005599000607400100000000063E -:10EF000007D00100D4002E5C1F9001000000000714 -:10EF1000F0B101000C80000342C90100000000F0C4 -:10EF2000F0B101000000004081B20100000000FECD -:10EF300096B00100000000FE96C00100000000F045 -:10EF4000F0B101000000004081B20100000000FEAD -:10EF500096C00100000000FE96C00100000000F015 -:10EF6000F0B101000000004081B20100000000FA91 -:10EF700096C00100000000FE96C001000030004B6A -:10EF8000948801000000004695F001000000004A4E -:10EF900096C001005E012E34978401000200004BF0 -:10EFA000E4E5010064012040E1B10100090000072F -:10EFB00086E4010000002EA787C0010010000010A9 -:10EFC00048C9010010000040F199010058010043B8 -:10EFD000F0C9010058010005E0C90100000000442B -:10EFE00061B10100A00000A462DD0100FA8DA8401B -:10EFF000813200000000000548B101001A00004005 -:10F000009798010008002E4095B00100028E204B19 -:10F01000946C000000000040F1B10100FF8D004140 -:10F0200095C000001080001042C90100098E2240E6 -:10F03000E36D00000000004461B1010040000010D9 -:10F0400062DD0100058EA840813200001B8400882B -:10F050001CB000000000000548B10100C597004049 -:10F0600081300100D58D004081B200000C8000038A -:10F0700042C90100000000F886B00100000000F85D -:10F0800088B001000E8E424081320000118EA24CE9 -:10F09000FD7F0000128E004CFD930000138E20F0C7 -:10F0A000566F0000000000F056B3010000001A4047 -:10F0B00081B201000080001044C9010064000040DA -:10F0C000F199010070000005F0C901000000004343 -:10F0D000F0B101000000004761B101002000001004 -:10F0E00062DD0100198EA844E0310000100000101C -:10F0F0008CC801000080004644C901004000004067 -:10F10000F199010068010005F0C9010064000043A5 -:10F11000F0C901000000004761B101000000004695 -:10F1200062B10100218EA844E03100001B840088F8 -:10F130001CB000000900000786E4010038002EA77B -:10F1400087C001008B002D0548B10100298E2243A4 -:10F15000E77D00000000004445C101002C8E2244E0 -:10F16000E77D00000000004C45C101000000004A9E -:10F1700019900100680120A2E4B10100880000405C -:10F1800043990100308E230BE56D00000000004123 -:10F19000199001000080001044C901005000004097 -:10F1A000F199010058010043F0C901005801000520 -:10F1B000E0C901000000004461B10100000000103E -:10F1C00062B10100358EA840813200001B840088A6 -:10F1D0001CB000005C002E0548B101000080000357 -:10F1E00042C90100000060F096B00100C5970041DF -:10F1F00081300100D58D004081B20000408EA249CF -:10F20000197C00008600004047990100448E0040B0 -:10F21000E5B1000086002F4919800100448EA2F25A -:10F22000803200008B00004047990100000000423E -:10F23000E7910100478EA246197C0000A000004023 -:10F24000479901004B8E0040E5B10000A0002F4619 -:10F25000198001004B8EA2F2803200008B0000402A -:10F260004799010000000041E7910100A80000401B -:10F270004399010034002DF024B00100000000FB90 -:10F280000CB00100000000FB10B00100000000FB0A -:10F2900012B001000F0000F316880100040000F313 -:10F2A00014F40100768E2640813200005E8E220A20 -:10F2B000166C000058003D4313E00100000000F808 -:10F2C00082B00100040022F084300000FD9800406C -:10F2D000813201001B8400881CB000000000000582 -:10F2E00048B101000000004113C001005D8EA04341 -:10F2F000136C00000000004013B00100538E004169 -:10F3000015D00000768E220A8032000058003D435E -:10F3100013E00100000000F882B00100040022F0B8 -:10F3200084300000FD980040813201004000204000 -:10F33000E1B101001B8400881CB000000000000542 -:10F3400048B10100768E22411550000000000041B6 -:10F3500011C001006A8EA043116C00000000004043 -:10F3600011B0010058003D4311E00100000000F819 -:10F3700036B00100040022F0003000000000005010 -:10F3800083B0010004980047613101001B840088AC -:10F390001CB00000749500054831010000000045D4 -:10F3A00061B101004000001062DD0100728EA840D2 -:10F3B000813200001B8400881CB00000668E0005AE -:10F3C00048B1000037002040E7B1010036980051F5 -:10F3D00081300100D58D004081B2000034002E4103 -:10F3E000F5B1010000110040E59901007E8E004852 -:10F3F0001990000034002E41F5B1010000110040C9 -:10F40000E59901000080000342C90100000000F8F6 -:10F4100094B00100838E2245237C0000B0002FF0C1 -:10F420008CB00100000060F08CC001009000004032 -:10F430004399010035002DF08CB0010058003E4387 -:10F44000E7E10100888E2248197C0000000000419D -:10F450008DC001000000680A8CC0010038002A4AF3 -:10F46000E0B1010028000000E0C901003C00201BC1 -:10F47000E0B101001080000342C90100000000F863 -:10F4800038B00100000000F826B00100040022F8A6 -:10F4900002300000968E2301146C0000000000F87A -:10F4A00080B00100000000F882B001004C0020F0A4 -:10F4B000E4B1010044002040E0B1010048002041D7 -:10F4C000E0B10100A8002D1032B00100399900F020 -:10F4D000243001009F8EA244816C00009D8E224149 -:10F4E000197C0000A09600403B300100C38EA208AA -:10F4F0003C3000009F8E004081B20000DD9500404E -:10F5000081320100C38EA2083C3000005000201C54 -:10F51000E0B1010054002013E0B101004E002001D1 -:10F52000E4B101004000200AE0B101003698005F1C -:10F5300081300100D58D004081B2000037000040CD -:10F54000479901007F9600F3943001007E8E224A95 -:10F5500080320000AB8E004081B2000037000040D6 -:10F56000479901007F9600F39430010058003E4314 -:10F5700097E001000000001BF0B101001F006000D7 -:10F58000008C0100D58D85118032000004800003BD -:10F5900042C90100B0002FF08CB00100000060F003 -:10F5A0008CC001003698005F81300100D58D00408D -:10F5B00081B20000B58E004919800000BA8E224148 -:10F5C000197C0000A09600403B300100BE8EA208CE -:10F5D0003C3000003698005F81300100D58D00403E -:10F5E00081B20000DD95004081320100BE8EA2088C -:10F5F0003C3000003698005F81300100D58D00401E -:10F6000081B2000050002D1032B0010054002DF0E6 -:10F6100038B001004E002DF026B0010040002DF260 -:10F6200002B00100000000F014B001003000001032 -:10F630008CC801000080004644C9010068012D44C7 -:10F6400061B10100100068F280C8010000000008EC -:10F65000F0B1010058010005E0C901000000000BF5 -:10F6600037B001000000004036D001005C012E40A0 -:10F6700010C001000000000680C001000000005220 -:10F6800081D00100D18E2094816C0000CB97009432 -:10F69000E5310100D28E004081B20000CB970040DE -:10F6A000E43101002000004662DD0100D28EA84056 -:10F6B000233000000E00000F1E8C0100E28E8241FC -:10F6C000234000002080001042C90100DC8E22404F -:10F6D000E36D00000000004661B101004000001031 -:10F6E00062DD0100D98EA840813200001B840088B1 -:10F6F0001CB000000000001048B10100119600434A -:10F70000233001000000000548B101000000001096 -:10F7100032B001000000004123B001000E00000FD4 -:10F720001E8C01000080001944C90100EA8E2241AC -:10F73000197C0000E68EA3010C6C0000E78E000629 -:10F7400004B000000000000104B00100E98E2002B6 -:10F75000366C00000000001B04B00100ED8E0002BA -:10F76000F0B10000EC8EA3010C6C0000ED8E680679 -:10F7700004B000000000680104B00100EF8E8008B2 -:10F78000F0310000000000111E9001000000001C7C -:10F79000F0B101000000004661B10100011F001935 -:10F7A00062DD0100F18EA813E0310000288F2202F3 -:10F7B0001450000044002D020CD00100188FA2024A -:10F7C00002500000FF8E225C1F7C0000208000039E -:10F7D00042C90100FE8E2240E36D00000000004798 -:10F7E00061B101004000001062DD0100FA8EA84006 -:10F7F000813200001B8400881CB00000000000055E -:10F8000048B1010044002D5C1F80010048002DF02C -:10F8100038B001004C002DF026B0010038002FF266 -:10F8200002B00100198F2201146C00000C8F2246D7 -:10F830001F7C0000000000461F80010020002D03F7 -:10F8400048B101000B8F2240E36D0000000000442E -:10F8500061B101004000001062DD0100088FA84086 -:10F86000813200001B8400881CB0000038002F0586 -:10F8700048B10100000000F894B0010038002DF0FC -:10F8800096B001000000004CE1C10100200000031F -:10F8900048C901000000224AF1B1010044000005FE -:10F8A000F0C901000000004AF0B101000000004B67 -:10F8B000E0B101000000004761B10100A00000A418 -:10F8C00062DD0100158FA85C1F100000198F000574 -:10F8D00048B100000000000238C00100238F22065A -:10F8E000803200000000005033C00100218FA202CE -:10F8F000366C000004008F0D42310000100000F84B -:10F9000010C801000000005C11800100F0070040F9 -:10F9100037980100D58E00A11AB000000000000247 -:10F9200010C00100D58E000236D000005000201C0F -:10F93000E0B1010054002013E0B101004E002001AD -:10F94000E4B101004000200AE0B101002D8F005F0A -:10F9500001B0000037002D4601B00100040000F3A3 -:10F9600080F401002C8FA043816C00000000005542 -:10F9700001B0010040002040E1B101000080001909 -:10F9800042C90100338F2240E36D000000000046B1 -:10F9900061B101004000001962DD0100308FA84014 -:10F9A000813200001B8400881CB0000011960010FA -:10F9B000483101003080001042C901003A8F2240D6 -:10F9C000E36D00000000004461B101004000001040 -:10F9D00062DD0100378FA840813200001B8400885F -:10F9E0001CB0000060012F0548B101000000000BB1 -:10F9F000E4B101000000005017F001003F8F90F2C9 -:10FA0000164000000000004117C001000000662001 -:10FA100017A40100320000A62AC00100000000F275 -:10FA20002A940100488F22491F7C000000000049F1 -:10FA30001F8001000000004005B0010000F0000C34 -:10FA4000188C01000B98004C95300100588F000075 -:10FA500092B000004F8F2240AF6F000000C0001E28 -:10FA600094DC01000000001596B001008898004069 -:10FA7000053001004E8FA240976C0000618F004757 -:10FA800019800000588F000092B000004F8F43484B -:10FA90006131000000D0001E62DD0100548F28405B -:10FAA00005300000508F2248777D0000578F0040BE -:10FAB00081B200000000001562B10100608F284093 -:10FAC00081320000548F004081B2000000001B0012 -:10FAD00092B001005D8F2241197C0000008000037C -:10FAE00042C90100E29500F8003001005A8FA2419E -:10FAF0003B500000618F004900B00000FF07001E6E -:10FB0000008C0100E295004081320100618F0049C4 -:10FB100000B0000000001B4719800100648F225FC5 -:10FB2000016C00006399004081320100B08A00003E -:10FB300080B000006B8F225C1F7C000020800003DF -:10FB400042C901006B8F2240E36D000000000047B6 -:10FB500061B101004000001062DD0100688FA84023 -:10FB6000813200001B8400881CB000006B8F4005B0 -:10FB700048310000FFFF000794890100718F85CA9A -:10FB8000943000006399185C1F0001000E00000F04 -:10FB90001E8C01007889004081B200003698180060 -:10FBA00080300100D58D0047198000000000004022 -:10FBB00019800100D58D2247197C0000DD95004099 -:10FBC00081320100788FA20880320000D58D00407C -:10FBD00081B20000CB9700400D3001009C01004035 -:10FBE00045990100FFFF000B988801008B002D5004 -:10FBF00017F001007E8F904C16400000000000417D -:10FC000017C00100808F2243E77D00000000004400 -:10FC100045C101000000662017A4010068010040F2 -:10FC2000439901005C012EF280B001003E000040CB -:10FC300080CE0100878F2440813200000000004602 -:10FC400081C00100888F0094E5B10000020062408D -:10FC50007ECD01000000005781C0010000002E1081 -:10FC600048B1010003000040F08D010000000008D1 -:10FC7000F0B1010058010005E0C901000000004496 -:10FC800061B101000000001062B101008E8FA84038 -:10FC9000813200001B8400881CB0000000000005B9 -:10FCA00048B101009A8F2240AF6F00000040000869 -:10FCB00094DC01008898004081320100988F224036 -:10FCC000976C0000E295000800300100D58D0040DF -:10FCD00081B200000000004005B00100D58D004752 -:10FCE000198000009A8F43486131000000500008DD -:10FCF00062DD0100A08F2840053000009B8F224864 -:10FD0000777D0000E2951B0800300100D58D004092 -:10FD100081B20000D58D1B471980000035000040DE -:10FD200047990100010063F384C80100A58FA04337 -:10FD3000856C00000000634085B00100A800004011 -:10FD40004399010037002FF024B00100010063F354 -:10FD500082CC0100B08FA2419E060000D58D2244C6 -:10FD600083700000360000404399010058003D4375 -:10FD7000E7E10100D58D1FF0246C00006399004875 -:10FD800081300100B08A2341836C0000B08A0047B3 -:10FD900081B0000058003D4385E00100000000F8FC -:10FDA00036B00100000000F000B001002800004063 -:10FDB0008398010004980047613101001B8400888A -:10FDC0001CB0000000002D0348B1010008002DF018 -:10FDD00094B00100000000F88EB0010090002DF0FA -:10FDE00014B001000000000548B10100848EA2405B -:10FDF0008F7C0000BE8F22478F7C0000848E0048DD -:10FE0000199000002D90004081B2000036002D5D59 -:10FE100005B4010037002DF380B00100000000F3AD -:10FE20008EB001005C003D4381E00100A8002DF090 -:10FE300094B00100000000F024B001002000001088 -:10FE400086DC01004080000344C90100E394004ABD -:10FE5000F031010036002F5C1F900100CC8FA250C2 -:10FE60008F50000034002040E1B10100D58D0040EA -:10FE700081B200000000634181C00100CF8FA04328 -:10FE8000816C00000000634081B001003700204712 -:10FE9000E6B10100D58D2247803200000400004702 -:10FEA0000CF401000000004F8F840100E48F224712 -:10FEB0000C6C000058003D4381E00100E48F1FF00E -:10FEC000246C00000000005C1F8001000080001016 -:10FED00042C90100DD8F2240E36D000000000045B3 -:10FEE00061B101004000001062DD0100DA8FA8401E -:10FEF000813200001B8400881CB00000DD8F42406E -:10FF000005300000000000449393010000001A5DDA -:10FF100069930100E28F23410D6C0000BF8F000543 -:10FF200048B100006399000548310100B08A0048DB -:10FF300081B00000D58D22408F6C00003698005FA4 -:10FF400081300100D58D004081B20000A200004048 -:10FF500043990100000000F384B00100A6002D4980 -:10FF600019900100020000F280F40100B8002D4059 -:10FF700081B20100000000F280C0010000000040DA -:10FF800082F801001900004081980100F38FA04021 -:10FF9000826C00002C01004081980100F38FA34087 -:10FFA000826C00000000004180B00100F58F204C01 -:10FFB000856C00000000004185C0010086002040E3 -:10FFC000E4B10100A2002042E6B10100D58D00405D -:10FFD00081B20000C597005081300100D58D0040EE -:10FFE00081B200000480000342C90100040022F035 -:10FFF00080300000000000408DB0010055990040A5 -:020000021000EC -:1000000087300100B0002F5C1F900100000060F0FD -:1000100080C001003698005F81300100D58D00401E -:1000200081B200000400004081B20000D58D22465C -:10003000197C0000A000004047990100010062F215 -:1000400096CC0100D58DA640813200003698004A3A -:10005000813001000B98004695300100D58D00409D -:1000600081B20000D58D2249197C00008600004035 -:1000700047990100010062F280CC0100D58DA640B5 -:10008000813200003698004A813001000B98004709 -:1000900095300100D58D004081B20000749500407C -:1000A00081320100D58D005C1F900000D58D00408D -:1000B00081B20000D58D004081B20000BA0000403E -:1000C00047990100010062F280C801001990904038 -:1000D00080320000FFFF624081980100A4000040D0 -:1000E00047990100D58D2240E56D0000D58D004176 -:1000F000E5C10000C597004D81300100D58D00405D -:1001000081B200005C00004047990100040022F029 -:100110009630000000000040E1B1010000800003C3 -:1001200044C901000000004BE0B1010000000040A4 -:100130008DB0010055990040873001008B000040D0 -:1001400047990100299080F396300000000000409C -:10015000E78101000000004719900100D58D005C87 -:100160001F9000003400004045990100010000404C -:10017000F599010000110040E5990100DD9500406E -:10018000813201003E90A20880320000370000401A -:1001900047990100000000F382B0010000006351A4 -:1001A00083D001003400004047990100010063F34F -:1001B00084CC010036909F428032000000006342F0 -:1001C00085B001000000004503F0010000000001BF -:1001D00000C001003890375C613100000000001B56 -:1001E00062B101003990A84B191000000000000016 -:1001F00062B101003B90A84081320000058A17409F -:1002000081B200000080000342C9010090002DF07F -:1002100094B00100AC002DF030B0010035002DF09D -:1002200028B0010058003E43E7E10100010000183A -:10023000F0C901000000004AE0B1010038002000D0 -:10024000E0B101003C00201BE0B101004000204073 -:10025000E1B10100000000402BB001001A980040FD -:100260000D3001000000001816C001004D90A014D0 -:10027000164400000000004117C001000E0000A25B -:1002800044C9010000000018F8B10100B0002D14AD -:10029000F8B1010010500040879801005690224AA2 -:1002A000197C00000030004386C801000030000BBC -:1002B00016C801005690A4408132000000000041A1 -:1002C00017C0010001006E4386980100519800306C -:1002D000813001005A90A041174000000000004109 -:1002E00017C001006190224A197C0000080000A29A -:1002F00044C90100CC002DABF9B10100000000ABF6 -:1003000017C001006090A0F01644000000000041FA -:1003100017C00100000064F082B0010090000040AE -:10032000459901000000604131C00100BC0000405F -:10033000439901006790060C80320000A00020F273 -:10034000E4B1010004000946191000009C010040BE -:1003500045990100FFFF000B988801008B002D508C -:1003600017F001006C90904C164000000000004116 -:1003700017C001006E902243E77D0000000000449A -:1003800045C101000000662017A40100680100407B -:10039000439901005C012EF280B001003E00004054 -:1003A00080CE01007590244081320000000000469C -:1003B00081C0010076900094E5B100000200624027 -:1003C0007ECD01000000005781C0010000002E100A -:1003D00048B1010003000040F08D0100000000085A -:1003E000F0B1010058010005E0C90100000000441F -:1003F00061B101000000001062B101007C90A840D2 -:10040000813200001B8400881CB000000000000541 -:1004100048B1010086902240AF6F00000040000804 -:1004200094DC010088980040813201008190A24054 -:10043000976C000035000040479901008A90004009 -:1004400005B000008690434861310000005000086C -:1004500062DD01008790A8400530000035001B4098 -:1004600047990100010063F384C801008D90A04307 -:10047000856C00000000634085B00100370000403B -:1004800047990100010063F382CC01008B0000401A -:100490004799010000000045E79101003698005F90 -:1004A00081300100D58D004081B20000370000404E -:1004B000479901007F9600F3943001002D90224A65 -:1004C00080320000AB8E004081B200003700004057 -:1004D000479901007F9600F3943001007B8E224AF9 -:1004E00080320000AB8E004081B200003600004038 -:1004F00043990100000000FB12B001000F0000F35F -:1005000090880100040000F30CF40100A58E22067F -:10051000906C00005C003D4313E00100A8002DF04A -:1005200094B0010037002FF024B0010036002A50AB -:10053000E7D101000000634113C00100A790A04370 -:10054000136C000000000040E7B10100E1940010CE -:10055000863001001B8400881CB00000A990420571 -:10056000483100000000004493930100A58E1A5DFD -:100570006993000036002D1086B001005C003D43F9 -:10058000E7E10100A8002DF094B0010035002FF044 -:1005900024B0010001006BFB84C80100B490A043AB -:1005A000856C000035002040E7B1010000000040EC -:1005B00081B20100010063F312C80100B790A043AB -:1005C000136C000000000040E7B101004080000310 -:1005D00044C90100E394004AF03101001B84008803 -:1005E0001CB00000BA9042054831000000000044F1 -:1005F0009393010000001A5D6993010037000040E9 -:1006000047990100110063F382CC0100A98F2241B8 -:100610009E060000350000404399010058003D430C -:10062000E7E10100000000F836B00100B38F00F0F0 -:1006300000B000005E012D0548B10100C59047F2F1 -:100640001230000000993F4213F00100CA90224787 -:10065000E77D00006B841F881CB00000C490004040 -:1006600081B2000000000047E791010000001F4236 -:10067000199001007500004061990100CC90A8B16B -:100680000C3000005C970010943001001B8400883F -:100690001CB000005E012E0548B10100C0A83D4617 -:1006A0000DE001000000004097B00100D69022400C -:1006B000E16D00000400024197400000D39000501B -:1006C00043C10000E290224B803200000000624BE8 -:1006D000129401000900000796E40100000000A741 -:1006E00097C001003000001094C801000080004A4B -:1006F0004499010000000042F1B101005E01004B8D -:10070000F0C901005E010005E0C9010000000044DD -:1007100061B101002000004A62DD0100E090A840C4 -:10072000813200000080001044C901000000005028 -:10073000F1B101000400000996E40100000068A87E -:1007400097C00100D4000005E0C90100000000448A -:1007500061B101000000001062B10100E890A84002 -:10076000813200001B8400881CB0000000993F42C9 -:1007700013F00100EC904740813200003F0000F38D -:100780009688010000000040E7B1010000001F55FD -:1007900061B101000000000662B10100F090A840C4 -:1007A00081320000F590224B803200000000004BA7 -:1007B00062B10100F390A840813200000000009770 -:1007C00013B001000000009697B00100FB902009D3 -:1007D000966C0000FB901F09962400006B84008833 -:1007E0001CB00000F690004081B20000C597005791 -:1007F00081300100C08D000548B100002E0000408E -:1008000043990100019122F380320000C597004214 -:1008100081300100058A004081B200003698005204 -:1008200081300100C08D004219800000C597003A58 -:10083000813001003698005281300100C08D0040A7 -:1008400081B200000000004005B00100DF960040CA -:1008500095300100C08D2240956C00000C91A240A3 -:100860001F7C0000E295004081320100058A0040B3 -:1008700081B200000480000342C90100000000F2C0 -:1008800002B001008A960052953001009196004B0B -:1008900002B00000058A004081B200000A990040C1 -:1008A000953001001891A208803200001891A2161C -:1008B00080320000058A2242197C00000000004BB3 -:1008C00019900100C597003A81300100058A004067 -:1008D00081B20000002300A616B001001B91831E08 -:1008E000803200000008000B16DC01000000000050 -:1008F0002AC001000E980008803001001F91005EA0 -:10090000179000002F98004361310100EF940040E0 -:100910008D300100169800071614010000800010A9 -:1009200042C9010027912240E36D0000000000430E -:1009300061B101004000001062DD01002491A84077 -:10094000813200001B8400881CB00000B797005E55 -:1009500005100100E2950040813201002B9122092F -:10096000803000003698004013300100C58D00052E -:1009700048B100000F97004081320100C08D004057 -:1009800081B200000000004A1F9001003291224312 -:100990003D7C00000000004419900100000000436D -:1009A0003D800100339100421990000014002D4554 -:1009B0001F9001008F91831E803200008F910044B0 -:1009C00019900000D4950040813201004791A2089F -:1009D000803200004791A216803200004391A2426B -:1009E000197C00000082000204DC0100A098004095 -:1009F00047990100E9890041893001004091A241F5 -:100A0000197C0000E295004081320100058A004017 -:100A100081B200008A960015943001009196004B37 -:100A200002B00000058A004081B200000F9700402C -:100A3000813201000000004B19900100C597003A77 -:100A400081300100058A004081B200004A912242B3 -:100A5000197C00000F970040813201004B9100404B -:100A600081B20000DF96004081320100779122417F -:100A7000197C0000C000001598C801007791A00BF8 -:100A8000996C00003000001080C801000080004018 -:100A90004499010000000050F1B101000000000382 -:100AA000F0B101000000004261B10100000000400F -:100AB00062B101005391A800E03100001B8400885E -:100AC0001CB000000000000548B10100C000001586 -:100AD00098C8010030002E0B99D0010000006A5028 -:100AE00099C00100C000620180CC01000C800003AD -:100AF00042C901002D002DF022B001000000004C81 -:100B000080C001000000005C23800100D4003F4150 -:100B1000E7E101000B000011E4F501002F00204780 -:100B2000E7B501006491230B816C00000000004FC9 -:100B3000E59101000000000880B001000000000BFA -:100B400003B001000000001502D001000E98000063 -:100B50002A4001000000004361B101004000001084 -:100B600062DD01006991A840813200001B84008889 -:100B70001CB00000E295000548310100C0000001F2 -:100B800080CE010075912611003000001000000099 -:100B90002AC801000000000880B001000000000128 -:100BA00080C00100C00000409998010000000001D1 -:100BB00098D001000E98004C02300100C0000040A7 -:100BC000039801007C91004081B2000030002F08A2 -:100BD00080B00100C0000015F4C90100C000000190 -:100BE000E4CD0100C0000040039801000E98000011 -:100BF0002A400100819122441F7C0000AC002F405C -:100C000013B0010000000001E0C10100B00000408D -:100C10004799010082910001E0D10000EF9400406B -:100C20008D300100806300A616B001001698000701 -:100C3000161401000080001042C901008A91224070 -:100C4000E36D00000000004361B1010040000010AE -:100C500062DD01008791A840813200001B8400887A -:100C60001CB00000B797005E051001008D912209AD -:100C7000803000003698004081320100C08D0005B0 -:100C800048B100008F91004A1F9000000000000052 -:100C900010B0010024002D1510C0010028002DF017 -:100CA00016B0010022002DF026B0010014002FF232 -:100CB0000CB0010000000001E0D1010000000010B4 -:100CC00032B001000000000B1BB0010004001F1532 -:100CD0001A5000000000004023B001000000000195 -:100CE0002AB001007197004035B000002F0020406D -:100CF000E7B10100D391A2451F7C00002400200B26 -:100D0000E0B1010028002013E0B10100220020061C -:100D1000E4B10100A991225C1F7C00000000005C8E -:100D20001F8001003080001042C90100A9912240BB -:100D3000E36D00000000004761B1010040000010B9 -:100D400062DD0100A591A840813200001B8400886B -:100D50001CB000000000000548B10100008000192F -:100D600042C90100CC912240E36D0000BA912242B9 -:100D7000197C0000379700408132010089950040BE -:100D800081320100C791224B8032000000000043F5 -:100D900061B101004000001062DD0100B091A84087 -:100DA000813200001B8400881CB00000B6912241F3 -:100DB000197C0000F895004011300100B791000542 -:100DC00048B10000E295004081320100B99122094A -:100DD0008030000036980040813201006F8400406E -:100DE00005B0000037970040813201008595004032 -:100DF000813201000000004361B101004000001099 -:100E000062DD0100BD91A840813200001B84008892 -:100E10001CB00000C3912241197C0000F8950040ED -:100E200011300100C491000548B10000E295004076 -:100E300081320100C69122098030000036980040BE -:100E4000813201006F84004005B0000000000043C3 -:100E500061B101004000001062DD0100C891A840AE -:100E6000813200001B8400881CB0000000000005D7 -:100E700048B10100CF912241197C0000F895004053 -:100E800011300100D091000548B10000E29500400A -:100E900081320100D2912209803000003698004052 -:100EA00013300100C58D004005B00000008000191E -:100EB00042C90100DA912240E36D000000000043C6 -:100EC00061B101004000001062DD0100D691A84030 -:100ED000813200001B8400881CB000000000000567 -:100EE00048B101000000004005B00100DE91224140 -:100EF000197C0000F895004011300100DF910005D9 -:100F000048B10000E29500408132010008002D0A3E -:100F100084B00100000000F082B001001400204005 -:100F2000E1B10100E491031E80320000E59100412F -:100F300087B0000021000040879801000097004022 -:100F4000813201000000005C1F900100E99122093C -:100F5000803000003698004013300100EC912244AC -:100F6000197C00003698004F8130010000000044D9 -:100F700019800100C08DA24A1F7C0000C58D004071 -:100F800081B20000BA002040E5B10100F2919C1747 -:100F900080320000CC0000404399010013990040CA -:100FA00081320100A398004013300100C0000040CE -:100FB00043990100C4002DF082B00100EE9800F0CA -:100FC00084300100E295004081320100C58D220984 -:100FD000803000003698004013300100C58D00407D -:100FE00081B200002E00004043990100FE91224092 -:100FF000E76D000032000040439901000692A240D4 -:10100000E56D0000CC960040813201002400200BE9 -:10101000E0B1010028002013E0B101002200200609 -:10102000E4B101001400200AE0B10100C58D2209DD -:10103000803000003698004013300100C58D00401C -:1010400081B20000CC9600408132010085960040BC -:101050008132010014922241197C00000000000B33 -:1010600099B0010004001F1598500000149220014F -:10107000986C00007000000348C9010000002E4673 -:101080001F90010000000050F1B1010000000003BA -:10109000F0B101000000004261B10100A00000A415 -:1010A00062DD01001192A800E0310000000000059F -:1010B00048B10100AC002F0010B001000000000199 -:1010C000E0C1010014002F1510C001000000000A4B -:1010D00080B001000000600180D0010000000047E6 -:1010E000199001009691220980320000369800097B -:1010F000803001009691004013B000000080000392 -:1011000042C90100000000F082B00100130000405D -:10111000879801000000004C43C10100009700F0D7 -:1011200084300100C08D005C1F9000002C00204026 -:10113000E7B101002D002040E7B10100C08D004261 -:1011400019800000F2960040813201000B9800489F -:10115000953001000000004561B101004000001021 -:1011600062DD01002992A840133000001B84008832 -:101170001CB000002F92000548B100002E920040E4 -:1011800013B000000000000012B001000800004091 -:101190004399010014002DF082B00100040022F0F8 -:1011A0008430000013000040879801000097004041 -:1011B000813201000000005C1F900100479200098D -:1011C00000B00000C08D8742191000008B002F472F -:1011D00019800100C08D0040E79100002F00004001 -:1011E0004799010045922247E77D0000669500403F -:1011F000E731010045922200803200004092A24077 -:101200001F7C0000E29500408132010045920040C1 -:1012100081B20000300000404399010032002DF2FD -:1012200094B001008A9600F2023001009196004BC2 -:1012300002B000000000000548B1010046920040E5 -:1012400001B000000000004005B001004C922200F7 -:10125000803200004B92A242197C0000DF960040D1 -:10126000813201004C92004081B200000F97004093 -:1012700081320100D892225C1F7C00000000005CDB -:101280001F8001000080001042C9010054922240DA -:10129000E36D00000000004561B101004000001056 -:1012A00062DD01005192A840813200001B84008859 -:1012B0001CB00000D892000548B10000D495004051 -:1012C000813201005B92A208803200005B92A2167C -:1012D00080320000C597004D81300100008200027D -:1012E00004DC0100058A004081B200007400004067 -:1012F00043990100000000F882B00100000000F0F6 -:1013000084B001000000004196B0010069922242C1 -:10131000961400000080001044C901006400684079 -:101320009798010000000041F0B101000000004268 -:10133000F0B1010070000005E0C9010000000045A7 -:1013400061B101002000001062DD01006692A8403A -:10135000813200000000005C1F9001000000004589 -:1013600061B101004000001062DD01006A92A85CDA -:101370001F0000001B8400881CB000005E012D05CA -:1013800048B101006E9247F21230000000993F42CE -:1013900013F0010073922247E77D00006B841F88E1 -:1013A0001CB000006D92004081B2000000000047B8 -:1013B000E791010004001F0996E40100008000107D -:1013C00044C9010000000044F1B10100000068A818 -:1013D00097C0010000000003E0B10100008000039D -:1013E000449901000000004461B1010000000010B8 -:1013F00062B101007B92A840E13100001B840088AB -:101400001CB0000000993F4213F001007F92470595 -:10141000483100003F0000F39688010000000040C2 -:10142000E7B1010000001F4081B201008792224B0A -:10143000803200000000005561B101000000004B47 -:1014400062B101008592A8408132000000000007CF -:1014500016B001000062000B16DC0100669500402A -:10146000813201009F922200803200001597005FB8 -:101470000110010089922240956C0000008000104C -:1014800044C9010000000050F1B101000000000358 -:10149000F0B101000000004261B101000000001045 -:1014A00062B101009192A800E03100001B84008825 -:1014B0001CB000000000000548B1010004800003DA -:1014C00042C90100000000F202B001008A960052F9 -:1014D00095300100E295004081320100899222415D -:1014E000975000000C80000342C90100000000F08A -:1014F00000B001000000005C018001009196004BEB -:1015000002B000008992000548B100001698004022 -:10151000033001001780000344C9010000F0000CF3 -:10152000968801000000634C97F0010010800003D2 -:1015300044C90100000000ABE1B10100B797005EB3 -:1015400005100100030000071AF40100070000075E -:101550001688010000B5000D46C90100A99230406F -:10156000813200000000000BE681010000B7000D91 -:1015700046C901000000000BE68101001000100FB9 -:1015800094F40100E999005F950401006B96004016 -:1015900081320100B3922250FD7F0000B19243409E -:1015A0008132000000001B4131D3010000002E05F4 -:1015B00048B1010000000040E1B10100000000401E -:1015C0000FB00100CD95004181300100058A004037 -:1015D00081B20000D495004081320100C592A2087A -:1015E00080320000C592A216803200000082000204 -:1015F00004DC01000000004503F0010000000001D0 -:1016000000C00100BE92375C613100000000001B89 -:1016100062B10100C292284081320000BF920040B6 -:1016200081B200000000000062B10100C292A84037 -:1016300081320000058A174081B200007400224008 -:10164000F1B1010000000040E1B101000B98004A37 -:1016500095300100F296005C1F1001005B92004083 -:1016600081B200002F00004047990100D692224726 -:10167000E77D000066950040E7310100D692220028 -:1016800080320000D192A2401F7C0000E295004011 -:1016900081320100D692004081B20000300000404B -:1016A0004399010032002DF294B001008A9600F2B5 -:1016B000023001009196004B02B0000000000005CE -:1016C00048B101000B98004895300100F296005C8B -:1016D0001F100100DB928742191000008B002F477A -:1016E0001980010000000040E79101003698004297 -:1016F00081300100C08D004081B20000F2960040B0 -:1017000081320100C08D005C1F900000BA002040B3 -:10171000E5B10100A398004081320100C000004003 -:1017200043990100C4002DF082B00100EE9800F052 -:1017300084300100E2950040813201003698004576 -:1017400081300100C08D2242197C0000C597003A0B -:1017500081300100C08D004081B2000004000040D3 -:1017600081B20000D495004081320100F092A208BD -:1017700080320000F092A21680320000C597004728 -:10178000803001000082000204DC0100058A004074 -:1017900081B200001080000344C9010000E100A6EE -:1017A00084B0010000000040F1B1010000000040E1 -:1017B000F1B101000000600784940100B797005E5A -:1017C00005100100C08D004081B200008A00004079 -:1017D00047990100E2950041E7410100C58D0040B5 -:1017E00081B20000CC960040813201008596004015 -:1017F00081320100000000012CB001000000001542 -:1018000010B001000000000010C0010004001F0A19 -:101810002C5000000000001032B001000700000B47 -:10182000968801000C932647972400000000004191 -:1018300097C001000C93234B0C6C00004998004B9F -:10184000043001000000005033C00100000000021D -:1018500010C001000000000216C0010000000006D8 -:1018600004B001004998004B045001000D93004062 -:1018700081B2000049980006043001001393A24889 -:101880001F7C0000119384481F100000AC00004032 -:10189000479901001393000AE0C100000000000A0C -:1018A00002B00100EF9400018C3001000000004301 -:1018B00061B101004000001062DD01001493A840F6 -:1018C000813200001B8400881CB00000000000056D -:1018D00048B101000000000210C00100219322065F -:1018E000145000003A9700451F0001000093225C4D -:1018F0001F7C00000000004761B1010040000010A3 -:1019000062DD01001D93A85C1F0000001B8400889D -:101910001CB000000093000548B100000000000B5F -:101920001BB0010008002D4085B00100000000F050 -:1019300082B001000000004005B0010000970041A6 -:10194000873001000000004561B101004000001037 -:1019500062DD01002793A840813200001B840088CB -:101960001CB000000000000548B101002D932209C1 -:10197000803000003698004013300100319322443B -:10198000197C00003698004F813001003193A24746 -:101990001F7C00000000004419800100FF070008C0 -:1019A000008C01003F93224A1F7C00003793A2164F -:1019B00002300000E2950040813201002F002040FB -:1019C000E7B10100C08D004081B200002D002D085C -:1019D0002AB001003B932242197C00000F9700407F -:1019E000813201003C93004081B20000DF9600404C -:1019F0008132010030002E002AD0010032002A1569 -:101A0000E4B10100C08D0016E4B10000529322162B -:101A100002300000000000082AB001000A990040CE -:101A2000953001004493A240116C00005393224072 -:101A30002D6C0000AC00004047990100B0002B0164 -:101A4000E0C10100002B00A616B00100000000015B -:101A5000E0D101000E980008803001004B93005E39 -:101A6000179000002F9800436131010000000043EF -:101A700061B101004000001062DD01004C93A840FC -:101A8000813200001B8400881CB0000000000005AB -:101A900048B101001698000716140100B797005EC0 -:101AA00005100100E2950040813201002F00204026 -:101AB000E7B10100C58D004081B200000000000BBD -:101AC0001BB0010004001F151A500000609320167F -:101AD0001A6C00007000000348C901000000225089 -:101AE000F1B1010000000003F0B1010000000000AE -:101AF000E0B101000000004261B10100A00000A4BB -:101B000062DD01005D93A8461F1000000000000583 -:101B100048B101000000000010B0010000000015F5 -:101B200010C001000000000A2AB001000000000AF5 -:101B30002CD00100AC002F4023B0010067938445F6 -:101B40001F1000006893000AE0C100000000000AB6 -:101B500002B001007197004035B00000008000190C -:101B600042C9010070932240E36D00000000004371 -:101B700061B101004000001062DD01006C93A840DB -:101B8000813200001B8400881CB0000000000005AA -:101B900048B101008093A2021A50000081932240B4 -:101BA0002D6C00000080001044C9010000000050AE -:101BB000F1B1010000000003F0B10100FF070008CF -:101BC000E08D01000000004261B101000000001042 -:101BD00062B101007793A840813200001B84008825 -:101BE0001CB000000000000548B101002F00204794 -:101BF000E7B501000C80000342C90100100000F0AD -:101C000010C80100F00700401B9801008193005CA0 -:101C1000118000000000000210C00100F895004093 -:101C20001F0001000000000548B101008593230D4D -:101C30002C6C0000000000401F9001008E93224693 -:101C40001F7C0000000000461F8001007080000320 -:101C500042C901008E932240E36D00000000004263 -:101C600061B101004000001062DD01008A93A840CC -:101C7000813200001B8400881CB0000000000005B9 -:101C800048B1010008002D4085B00100000000F0BF -:101C900082B001000000004005B001000097004143 -:101CA000873001000000004561B1010040000010D4 -:101CB00062DD01009393A840813200001B840088FC -:101CC0001CB000000000000548B1010099932209F2 -:101CD0008030000036980040133001009D9322446C -:101CE000197C00003698004F813001009D93A24777 -:101CF0001F7C00000000004419800100FF0700085D -:101D0000008C0100B293224A1F7C0000A393A2160C -:101D100002300000E2950040813201002F00204097 -:101D2000E7B10100C08D004081B200002D002D08F8 -:101D30002AB00100AE932242197C0000A793A2F3BF -:101D400084300000000000A585B0010000000041C3 -:101D500085D00100D4003E4185E00100AB932240D4 -:101D60001F7C00000000005A119001000B000008C9 -:101D7000E4F501000F97004081320100AF9300406D -:101D800081B20000DF9600408132010030002E0059 -:101D90002AD0010032002A15E4B10100C08D0016DE -:101DA000E4B10000B593A21602300000E2950040B5 -:101DB000813201000494004081B200002D002D0802 -:101DC0002AB00100C39322471F7C0000BF93224228 -:101DD000197C0000BA93A2F384300000000000A533 -:101DE00085B001000000004185D00100D4003E41D3 -:101DF00085E00100BE9322401F7C00000000005AD5 -:101E0000119001000B000008E4F5010058012D00BD -:101E10002AD0010060012DF010B00100000000F098 -:101E20002CB001004791004081B200000A990041A6 -:101E300095300100CB93A20880320000CB93A2160C -:101E4000803200000000004197B00100C993230DCB -:101E5000026C00000000004197C001009196004B09 -:101E600002B000000494000548B10000AC002F014E -:101E700014B00100B0002B01E0C10100002B00A64E -:101E800016B0010000000001E0D10100DB93230D3A -:101E9000026C00000080001044C9010000000050E6 -:101EA000F1B1010000000003F0B1010000000042A8 -:101EB00061B101000000001062B10100D493A800DC -:101EC000E03100001B8400881CB000000000000509 -:101ED00048B101000C80000342C90100100000F06D -:101EE00022C801000000005C238001000000000106 -:101EF00084B00100DE93230D026C00000000000D91 -:101F000002B001000000000880B00100E39322400D -:101F10001B6C00000E98000184500100EB932240DE -:101F2000856C00000000000180C0010010800010DE -:101F300046C901000000004F43810100000000423B -:101F4000F0B1010020000040F0C9010000000016BF -:101F5000F0B101000000004361B10100A00000A148 -:101F600062DD0100E993A811E0310000FA93005E00 -:101F700017900000EE93230D026C00000000000D8E -:101F800002B001000000000184D00100F393224060 -:101F90001B6C00002F98004361310100FA9322402E -:101FA000856C00000000000112C0010010800010CC -:101FB00046C901000000004F4381010000000042BB -:101FC000F0B1010000000009F0B1010000000018AC -:101FD000F0B10100A00000A162DD0100F893A8119A -:101FE000E03100000000004361B10100400000103A -:101FF00062DD0100FB93A80A023000001B84008808 -:102000001CB00000E2950005483101000294230D48 -:10201000026C0000FF070011008C0100E2950040F7 -:10202000813201001698000716140100B797005E70 -:10203000051001002F002040E7B10100C58D0040D0 -:1020400081B200000080000342C90100000000F8D6 -:1020500082B00100000000F88CB00100000000F028 -:102060008EB00100C996004013300100000000400E -:1020700085B001000097004187300100859600403F -:10208000813201000080001042C9010015942240F5 -:10209000E36D00000000004561B101004000001048 -:1020A00062DD01001194A840813200001B84008889 -:1020B0001CB000000000000548B10100179422097F -:1020C0008030000036980040133001000000000B03 -:1020D0001BB00100000000151AD001001E94A2419F -:1020E000197C00000A99004095300100000000169C -:1020F00080B201002794270880320000449300003A -:102100002AC000000A990041953001000000001625 -:1021100080B201002294270880320000CB93000097 -:102120002AC000000000004197B001002594230D53 -:10213000026C00000000004197C001009196004B26 -:1021400002B000000000000548B10100C08D22422D -:10215000197C0000C597003A81300100C08D004015 -:1021600081B200002B94004A1F9000000A960000E4 -:10217000103001000000001510C001000000001028 -:1021800032B001000700000B968801003994264701 -:10219000972400000000004197C001003994234BB0 -:1021A0000C6C00004998004B043001000000005006 -:1021B00033C001000000000210C001000000000256 -:1021C00016C001000000000604B001004998004B51 -:1021D000045001003A94004081B200004998000682 -:1021E000043001003F94A2441F7C00000000000B5B -:1021F0001BB001000000000A2CD001000000000A02 -:1022000002B00100EF9400018C3001000080001941 -:1022100042C9010046942240E36D000000000043E3 -:1022200061B101004000001062DD01004294A8404D -:10223000813200001B8400881CB0000000000005F3 -:1022400048B101000000000210C001004F942206B6 -:10225000145000003A9700451F0001002D94225CA5 -:102260001F7C00000000004761B101004000001029 -:1022700062DD01004B94A85C1F0000001B840088F5 -:102280001CB000002D94000548B1000008002D404E -:1022900085B00100000000F082B0010000000040A5 -:1022A00005B00100009700418730010000000045A3 -:1022B00061B101004000001062DD01005494A840AB -:1022C000813200001B8400881CB000000000000563 -:1022D00048B101005A94220980300000369800402D -:1022E000133001005D942244197C00003698004FA1 -:1022F000813001000000004419800100FF07000840 -:10230000008C01006B94224A1F7C00006394A2168B -:1023100002300000E2950040813201002F00204091 -:10232000E7B10100C08D004081B200002D002D08F2 -:102330002AB0010067942242197C00000F970040E8 -:10234000813201006894004081B20000DF960040B5 -:102350008132010030002E002AD0010032002A15FF -:10236000E4B10100C08D0016E4B100004093A21654 -:1023700002300000E2950040813201002F00204031 -:10238000E7B10100C58D004081B200000A96004A05 -:102390001F1001005593001032B000008A00204049 -:1023A000E7B101007594A241197C0000E29500405C -:1023B000813201007894004081B200008A960015B5 -:1023C000943001009196004B02B00000000000051F -:1023D00048B101007A942242197C0000C597003A66 -:1023E000813001003698004581300100C08D0040E9 -:1023F00081B20000069200451F900000CC9600407C -:102400008132010085960040813201005593000120 -:102410002CB00000D4950040813201008D94A208B8 -:10242000803200008D94A2168032000000820002EB -:1024300004DC01000000004503F001000000000181 -:1024400000C001008694375C613100000000001B71 -:1024500062B101008A9428408132000087940040D4 -:1024600081B200000000000062B101008A94A8401F -:1024700081320000058A174081B20000580120080F -:10248000E0B1010060012016E0B10100CC960047E8 -:102490001F10010085960040813201005593000114 -:1024A0002CB00000D49500471F100100A094A20892 -:1024B00080320000A094A216803200009C94A242B8 -:1024C000197C00000082000204DC0100A09800409A -:1024D00047990100E9890041893001008A96001579 -:1024E000943001009196004B02B00000058A004034 -:1024F00081B200000F970040813201000000004BC4 -:1025000019900100C597003A81300100058A00400A -:1025100081B2000058012008E0B1010060012016DE -:10252000E0B101000A9600103230010055930040DE -:1025300013B00000D495004081320100B194A2088C -:1025400080320000B194A2168032000000820002A6 -:1025500004DC01000000004503F001000000000160 -:1025600000C00100AA94375C613100000000001B2C -:1025700062B10100AE94284081320000AB9400406B -:1025800081B200000000000062B10100AE94A840DA -:1025900081320000058A174081B2000000800003EC -:1025A00042C90100000000F882B00100000000F8FC -:1025B0008CB00100000000F08EB00100C996004010 -:1025C000133001000000004085B001000097004179 -:1025D00087300100859600408132010000800010A4 -:1025E00042C90100C0942240E36D00000000004594 -:1025F00061B101004000001062DD0100BC94A84000 -:10260000813200001B8400881CB00000000000051F -:1026100048B10100479122098030000036980040FF -:10262000133001004791004081B2000014002D4595 -:102630001F9001008F91004419900000C894A2419E -:10264000197C00000000004A1F900100FA9200402F -:1026500081B20000CC96004A1F1001008596004010 -:1026600081320100559300012CB000000A96004011 -:10267000813201005593001032B0000006920045EF -:102680001F9000000000004137C30100000000411E -:1026900033C301003600000102CC01000000D2402B -:1026A00081B20000D49485178032000000009F485A -:1026B00003D00000D6949C178032000000009F4C8D -:1026C00003D000000000800134C3010002002D117E -:1026D00010C10000DB94004043C10000DB940050B7 -:1026E00043C10000200000A142C90100DF94224044 -:1026F000E56D00000400A240E57D00000000004000 -:1027000023B00100000080491F9001000000A24199 -:1027100023D00000DB94005043D100004080000330 -:1027200044C901000000004AF0B10100000000406F -:10273000F1B1010000000012F0B10100E695004186 -:10274000E13101000080004344C901001000004055 -:10275000F199010000000048F0B1010000000049BB -:10276000F0B1010040000003E0C901000000004595 -:1027700061B101000000004362B101000000A84007 -:1027800081B20000EC94004081B20000BA00204009 -:10279000E5B10100B0002F018CD00100000000461F -:1027A000E0C10100AC002F4013B00100CC002D01AE -:1027B000E0C10100F6949C1780320000139900409C -:1027C00081320100F8942247197C00000000005F6C -:1027D00013900100A398004719100100C0002D4478 -:1027E0001F900100C4002DF082B00100EE9800F0AF -:1027F00084B0000090002D0548B101000D95A24B5A -:102800001F7C00006095A24C1F7C00000D951F1CD2 -:10281000E06D00001095A20180320000A8002D4656 -:102820008FB0010006951F1CE06D0000B400004051 -:1028300043990100089522F03A6C00005D951FF065 -:102840003A6C00000000A24080B200000000804FFF -:102850008FB001008A000040439901005E9520423C -:10286000E76D00000C952240803200000000805986 -:102870008FB00100000080588FB001000F952240FA -:10288000803200000000805C8FB001000000805B9F -:102890008FB00100AC00004043990100B0002DF062 -:1028A00084B001001495A242246C00001D9523F011 -:1028B000026C00001A95A2F0803200005F95A242DF -:1028C000246C00005F95A241036C00001995A240A2 -:1028D00080320000000080518FB001000000805263 -:1028E0008FB001005F951F12845000005F95A0011A -:1028F000846C00000D95004081B200008B00004008 -:10290000439901004895A246E77D0000140000406D -:10291000439901003A9522F0143000002695200AD0 -:10292000026C00003795031E803200002595A240FE -:1029300080320000000080448FB001000000804918 -:102940008FB001002B95220A026C00002E95A24147 -:10295000197C00002A95A2408032000000008055BA -:102960008FB00100000080568FB001002D95A2406D -:1029700080320000000080438FB0010000008048DA -:102980008FB001000000000182B001000000000AC9 -:1029900082D0010034952091836C00003395A240D1 -:1029A00080320000260080408F9801002700804080 -:1029B0008F9801003695A240803200001F008040B1 -:1029C0008F980100200080408F9801003995A24027 -:1029D00080320000220080408F9801002300804058 -:1029E0008F98010088002D448FB001004395A241CB -:1029F000197C00004095A2433D7C00004095A2F266 -:102A0000026C00000000A24080B20000000080497B -:102A10008FB001004295A240803200000000804348 -:102A20008FB00100000080488FB001004095A09158 -:102A3000036C00003E9522433D7C00004795A24078 -:102A400080320000280080408F98010029008040DB -:102A50008F98010014000040439901005195A2F0A5 -:102A60001430000088002D448FB001004E95A2F272 -:102A7000026C00000000A24080B20000000080490B -:102A80008FB0010040952241197C00003E952091B5 -:102A9000036C00004095004081B200005595200A6B -:102AA000026C00005495A240803200000000804477 -:102AB0008FB00100000080498FB001005A95220AB2 -:102AC000026C00002E95A241197C00005995A2408D -:102AD00080320000000080558FB001000000805659 -:102AE0008FB001005C95A24080320000000080435E -:102AF0008FB00100000080488FB001006295004354 -:102B000095B000006295004195B0000062950042CA -:102B100095B000006295004495B000006295004CAD -:102B200095B000000B980040813201006595A240ED -:102B3000803200000000804B8FB001000000804C0C -:102B40008FB001002D000040439901002E002FF3AB -:102B500084B001006A95A2F3963000000000804026 -:102B600001B001002D002A41E7D10100D4003D4110 -:102B700085E001000B0000F200E401007095225A8C -:102B8000017C0000000000401F9001007195005A78 -:102B900001800000000000401F8001000000634130 -:102BA00085C001000000A0A5856C01000000E34085 -:102BB00085B001000C80000342C9010012000040F2 -:102BC00087980100559900F08CB000007E95224056 -:102BD0000F6C000000002F0548B101007B95A24B4F -:102BE000197C00007C9522F0186C00000000604BFE -:102BF0001990010048960007103001006F840040D2 -:102C000005B000008095225A1F7C0000CD95004041 -:102C1000813001006F84004005B0000000002F05E6 -:102C200048B101000000604B199001004896000770 -:102C3000103001006F84004005B0000000002F0537 -:102C400048B101000000604B199001004896000750 -:102C5000103001000000804005B00100899533402C -:102C6000813200008C95A1AD952000009A9513400B -:102C700081B200000000134A5A8301003000394538 -:102C800095E001001F00000F5ED801000000005A0F -:102C90005F9001000000004045B00100000000040A -:102CA00048B00100000000054AB001000000000C1F -:102CB00058B00100000000074EB001001886004027 -:102CC0005D9801000000005861B101000000004A59 -:102CD00062B101000000A84197B000009795004044 -:102CE00081B200000000804097B001009B9544072E -:102CF00096300000FFFF004B8489010000001CC2D9 -:102D000024B00100A595A245257C00009F953120A7 -:102D100085300000A6952212487F000067981112A6 -:102D2000480301001000001296E401000000004B6F -:102D30001E9401000000805A1F900100A5953140AB -:102D400081320000000000B424B00100A6952212D8 -:102D5000487F0000679800408132010000002F0585 -:102D600048B10100B3950BF084300000000011124F -:102D700048830100B0952250857000005E0100403C -:102D800043990100679700F296300100E99900121B -:102D9000943001000000005A1F9001001000001242 -:102DA00096E401000000804B1E94010010000042D8 -:102DB00010F4010000B73F4311F0010007000008C4 -:102DC0008A880100B69530A10C300000B9952245E3 -:102DD000E67D0000A695104081B2000000002A4563 -:102DE000E69101000000101248830100000011402C -:102DF00081B201000000604B858001005E0100404F -:102E000043990100679700F296300100008000109E -:102E100044C90100D8000040819801002E002D0512 -:102E200048B10100C4952240E76D000080000040D9 -:102E300080C8010000000040F0B101000900000856 -:102E400086E40100000068A787C00100000000447C -:102E500061B101000000001062B10100C895A80531 -:102E6000E03100001000001296E401000014004B55 -:102E700096DC01000000804B1E9401001000000F42 -:102E800084F401001F00004284880100D195224093 -:102E900080320000D295004268B10000000000427C -:102EA0006AB10100D295315A1F0000000000914222 -:102EB00048930100D4953540813200006D000040F8 -:102EC00061990100DA9528B12C300000D595224D8A -:102ED000757D0000000000402DB00100000095400D -:102EE00011B001006D00004061990100DA95A8B1B0 -:102EF000103000000000954081B201007F000040CA -:102F000061990100E19528B110300000DD959FBA6C -:102F1000803200000000804011B0010000008024D9 -:102F2000118401000000005F61B101000010000089 -:102F300062DD01000000A84081B20000E39500407E -:102F400081B20000AC94004047990100E7953240FF -:102F500081320000ED9522F896300000000000F864 -:102F600090B00100000000F092B001000100004BA1 -:102F7000F0CD010020009248E0C901006C00004043 -:102F800061990100F19528B192300000ED95224C35 -:102F9000757D00000400124091B000006C000040FC -:102FA00061990100F195A8B190300000FF00004840 -:102FB000968801000000004B90D001000100004BFA -:102FC000F0CD010020000048F0C901000000924946 -:102FD000E0B101000C002D1048B10100FF0700080E -:102FE000828C0100FF0700F0008C01000000A2416C -:102FF00000EC0000FE95221A006C0000E295000033 -:10300000343001000000005049C10100FA95A2418E -:10301000235000000000804081B201000C002D1000 -:1030200048B10100FF070015828C0100FF0700F086 -:10303000008C01000000A24100EC00000796220D68 -:10304000006C0000E29500001A3001000000005002 -:1030500049C101000396A2412350000000008040B6 -:1030600081B201000C96831E8032000000000044F3 -:103070001990010024002D012CB0010028002DF032 -:1030800016B0010022002DF026B0010014002FF22E -:103090000CB0010000008040E1B1010002002D11E0 -:1030A00010C100001596004043C100001596005065 -:1030B00043C10000200000A142C901001A9622402D -:1030C000F56D00000000004243D101000400A24061 -:1030D000E57D00000000004023B0010000008049B1 -:1030E0001F9001001D9622111E7C00001F96A0F06B -:1030F000164000001F96004117C000001F96A0F464 -:10310000164000000000004117C001000000A2416D -:1031100023D000001596005243D1000000B5000DE9 -:1031200042C9010022963047170400002596A20BE1 -:10313000E67D00000000904281B0010000B7000D64 -:1031400046C901002996A20BE67D00000000000B95 -:10315000E69101000000904181B0010000001040A4 -:1031600081B201002A96400796300000F399004092 -:10317000813201003496A245957C000001973F41C1 -:1031800095E00100000000F396B001000000004E41 -:10319000E6B1010040973E4097E001000000004E7C -:1031A000E6B1010040973E409DE001004796003B9C -:1031B000E7B1000034963040813200003E96A20B09 -:1031C000E67D000000B5000D46C901003A96A20B4D -:1031D000E67D00000000104081B20100000098422E -:1031E00081B0010000B7000D46C901000000000BCE -:1031F000E69101000000104081B2010000009841FA -:1032000081B00100040021A2952000000000104AB6 -:103210004483010000973E4195E001000000004E0C -:10322000F6B101000000004EE6B1010040973E40BB -:103230009DE001000000003BE7B101000000004AF2 -:1032400090B10100FFFF0007928901000000984043 -:1032500081B001000300000886F4010000B70043BC -:1032600046C9010007000008828801004B9640080B -:1032700096300000F39900408132010057962245B4 -:10328000957C00005396225A1F7C00001000000F0E -:1032900096F401005096315F970400000000114B36 -:1032A000489301000000004B6AB101005396304082 -:1032B0008132000000000041E68101000000104062 -:1032C00081B201000000984081B2010000973F41A7 -:1032D00095E00100000000F396B0010040973D40EA -:1032E00097E00100000063F388B001005F96A23B05 -:1032F000896C00000000004A90B10100010000A6A6 -:1033000092B101006096184A4493000000001840F2 -:1033100081B201003000394597E001006596225ADC -:103320001F7C00001F04000F98D801000000004C13 -:103330005E940100679600054AB000001F0400A7D4 -:103340005E840100000000404BB001000000005806 -:1033500061B101000000004B62B101000000A84013 -:1033600081B200006896004081B200006B96400771 -:1033700096300000F3990040813201006F9622459B -:10338000957C00000000984081B20100F199004A4C -:103390004413010000973F4195E00100000000F355 -:1033A00096B0010040973D4097E00100000063F3B4 -:1033B00088B001003000384597E001000000005F50 -:1033C0000F9001000000005861B101000000004BA7 -:1033D00062B101007796A840813200007096A23B4E -:1033E000896C0000300038459DE0010000009840E5 -:1033F00081B20100E9990012943001004896005A08 -:103400001F0001000000805A1F9001001100004AB7 -:10341000E6C9010034002F4F95840100000000F33D -:1034200096B001000100634B84C801000000A04376 -:10343000856C01000000E34085B0010030002D44A0 -:103440001F90010032002DF22AB00100040022F288 -:103450000230000066950010323001003200A040BA -:10346000E5B101000000004097B00100F007004006 -:10347000999801000000004A02C0010000000050BD -:1034800003D001000000004197C001000000A34CE0 -:1034900002D000008E96004081B20000000000A81B -:1034A00036B001009E9622410350000000800010BB -:1034B00044C9010000000050F1B101007000000398 -:1034C000F0C901000000004261B1010000000010DD -:1034D00062B101009796A800E03100001B840088CB -:1034E0001CB00000E2950040813201007C800003A6 -:1034F00042C90100000000F000B001009296005C9B -:1035000001800000E2950040813201000000001BB4 -:1035100010B1000068012D0682B00100000000F229 -:1035200082C001000080000346C90100DD95004013 -:1035300081320100C5962240116C0000000068082D -:1035400038960100F007004182CC0100A396AA4101 -:103550003B400000000000F810B001000000005CDB -:10356000118001000100001D04CC0100C496264614 -:10357000233000000800000312C80100640120F09D -:10358000E0B10100C3962241055000002000000375 -:1035900048C901000C0000F886C801000000224460 -:1035A000F1B1010000000043F0B10100000000098A -:1035B000E0B101000000004461B10100A00000A4DE -:1035C00062DD0100B596A8461F100000C296224198 -:1035D00005500000C096A24123500000000000A149 -:1035E0001AB001000000004461B101004000001069 -:1035F00062DD0100BB96A846233000001B840088D2 -:103600001CB000001000000348C901000000000DBC -:1036100042B101000000004413C00100B096005008 -:1036200049C100000000000548B10100048000030A -:103630001AC801000000804081B20100C4962240F7 -:103640003B6C0000000000F800B00100E295005C57 -:1036500001000100C59600413BD0000000008D47ED -:1036600080320100B0002F5F13B001000000E0F0D5 -:103670008CC001000080000342C90100000000F876 -:1036800094B00100000000F88CB00100D1968CF8D5 -:103690008E3000000000004419900100040022F860 -:1036A00014300000000000F816B00100000000F81F -:1036B00026B0010008002EF80CB001000C002A4AC8 -:1036C000E0B1010028000000E0C901001000201B4B -:1036D000E0B10100DE96200A0C6C0000000000F84A -:1036E00094B00100000000F896B00100200020F026 -:1036F000E4B101001800204AE0B101001C00204B99 -:10370000E0B10100C996004013B000002C002D422A -:10371000199001002E002FF382B00100000000F389 -:1037200096B00100E496A2A5976C000000008041CD -:1037300095B00100E796A240976C000000000040A1 -:1037400083B001002D002040E7B10100000063417B -:1037500097C00100D4003E4183E001000000004119 -:1037600083C00100EC96A0A5836C0000000000401F -:1037700083B001002C002041E6B10100F196224007 -:103780001F7C00000004000098DC01000B00004CCE -:10379000E4F50100000080401F8001000B00800064 -:1037A000E4F50100E6950040813201000480000349 -:1037B00044C9010000000040F1B1010000000040D8 -:1037C000F1B101000000604187B0010000800010ED -:1037D00044C9010000000050F1B1010000000048A0 -:1037E000F0B1010000000049F0B101000000000349 -:1037F000E0B101000000004561B1010020000010AF -:1038000062DD01000000A85D05900000FD9600400B -:1038100081B20000E6950040813201000080000383 -:1038200044C9010000000041F0B101000000004265 -:10383000F0B1010000000040F1B1010000000043C0 -:10384000F0B101000080001044C9010000000050E8 -:10385000F1B1010000000048F0B101000000004992 -:10386000F0B1010000000003E0B1010000000045DC -:1038700061B101002000001062DD01000000A85DC0 -:10388000059000000C97004081B200002D00004020 -:10389000439901002E002FF384B00100010063F36F -:1038A00096C8010014979F4185500000010000A5B3 -:1038B00085CC01002D00A042E6B101005E012D0083 -:1038C00080B001001997524381600000020000F2AD -:1038D00082F401001A970041809400000000005F0C -:1038E000819001000000005E61B101000000004015 -:1038F00062B101000000A84095B000001B979EBB7C -:10390000803200002097A2401F7C0000E29500401A -:1039100081B200000000804195B001000400001554 -:1039200042C90100000000542BC00100000000FC4F -:1039300024B00100000000FC38B00100000000FECF -:103940003CB00100000000FE3AB0010035979C1722 -:10395000803200002A97A24A197C00000000804CA7 -:103960001F9001000C00001E98F401002997A24846 -:10397000996C00000000001542B101002997A28A4D -:10398000F16D00000C00000102CC0100000000FC01 -:103990003EB00100010000F428CC0100CC002D0550 -:1039A00048B10100349720F03E6C00000000004B4D -:1039B0001F9001000000004C2BC00100BF002D052E -:1039C00048B10100000080F33AE0010000002E4BF6 -:1039D0001990010007002A0CE4B1010000008004E6 -:1039E000E6B1010018000040439901001C002DF0D1 -:1039F00016B0010020002DF026B001000C002FF2BF -:103A00000CB001000000A20614EC00004197224512 -:103A10001F7C00000000A3062AEC0000000000F854 -:103A200094B00100000000F096B001000C002D40A1 -:103A300081B2010000002A4CE1C1010030000010F9 -:103A400048C901000A000040F19901001800000572 -:103A5000F0C901000000004AF0B101000000004B75 -:103A6000E0B101000000004761B10100A00000A426 -:103A700062DD01004B97A85C1F100000000080056C -:103A800048B1010000002E1048B10100000068019B -:103A900096B0010000000003F0B1010051974542CB -:103AA000613100000000001062B101005297A800CF -:103AB000E031000000009D4081B2010000002E10A6 -:103AC00048B101000000680196B001000000000349 -:103AD000F0B101005897454261310000200000100C -:103AE00062DD01005997A800E031000000009D4010 -:103AF00081B201003080004A44C901000000000684 -:103B0000F1B10100C0A83D460DE00100FF7F00A11A -:103B1000F08901000200000996F40100000000464F -:103B200097E00100000060A897C00100639746423B -:103B3000613100003000004A62C901006497A8406A -:103B40008132000000009E4081B2010000993F4296 -:103B500097F001006897474081320000709722F388 -:103B6000740600003F0000F3948801000000000785 -:103B7000E785010000001F5561B101000000004A07 -:103B800062B101000000A84081B200006D970040C2 -:103B900081B2000000009F4081B20100000000A837 -:103BA00036B0010080978241234000007597A244FF -:103BB0001F7C0000EF9400018C3001002080001079 -:103BC00042C901007B972240E36D000000000043E2 -:103BD00061B101004000001062DD01007897A8404B -:103BE000813200001B8400881CB0000000000041EE -:103BF00023B001000000001032B001008097224184 -:103C0000197C0000F89500432330010000000041BA -:103C100023B001008297A3150C6C00008397000667 -:103C200004B000000000001504B0010085972002D8 -:103C30001A6C00000000000D04B001000700000B2A -:103C4000968801008A9726479724000000000041CB -:103C500097C001008A97234B046C00000000004BC2 -:103C600004B001004998000548310100B4972202D0 -:103C7000145000008E97A2022A500000B497A2456B -:103C80001F7C0000909722020C50000099970002C0 -:103C900016C000009897225C1F7C00003080001046 -:103CA00042C9010098972240E36D000000000047E0 -:103CB00061B101004000001062DD01009497A8404E -:103CC000813200001B8400881CB000000000000549 -:103CD00048B101003A97005C1F000100B49722151B -:103CE000803200000000005033C00100B397A202F0 -:103CF0001A500000A59722461F7C00007080000328 -:103D000042C90100000000461F800100A597224023 -:103D1000E36D00000000004261B1010040000010AE -:103D200062DD0100A197A840813200001B84008859 -:103D30001CB000000000000548B101000C80000329 -:103D400042C90100100000F010C801002F002F5CD4 -:103D50001180010000000047E7910100F0070040DA -:103D60001B980100729720151A6C00007000000368 -:103D700048C9010000002250F1B101000000000319 -:103D8000F0B10100FF070008E08D010000000042D3 -:103D900061B10100A00000A462DD0100B097A84657 -:103DA0001F1000007297000548B1000072970002D2 -:103DB00010C00000B697A2441F7C0000EF940001E1 -:103DC0008C3001000000001B10B1000000800010CA -:103DD00044C901000C000040F199010010000008E6 -:103DE000F0C9010000000016F0B10100100000034E -:103DF000E0C901000000004561B101002000001091 -:103E000062DD01000000A85C1F900000BD9700402B -:103E100081B20000170000D0A2C901000000A2403A -:103E200027EC00000000002000B00100E2950041F6 -:103E3000A3410100C197004127D0000010000007F6 -:103E400096E401000000004B809401000000005443 -:103E500061B101000080004062DD01000000A84067 -:103E600081B20000C897004081B200001A9800405B -:103E70002B300100AC002D0616C0010090002DF083 -:103E800016C40100D097A0F01644000000000041C5 -:103E900017C001000E0000A244C9010000006CF030 -:103EA00030B00100AC002D4087B0010000006CF084 -:103EB00028B00100D997224A197C00000030004345 -:103EC00086C801000030000B16C80100D997A44035 -:103ED000813200000000004117C00100FA9722065D -:103EE00080320000E697A206146C0000E397224897 -:103EF000197C0000DE97A04117400000000000413F -:103F000017C001000000004131C0010090002018DE -:103F1000E0B101008B002D48198001008B00204585 -:103F2000E7910100E69700408790000008000043F9 -:103F300086980100E697A048174000000000004165 -:103F400017C00100B0000040439901001050004329 -:103F5000FCC9010051980030813001000000004090 -:103F6000E5B10100F197224A197C0000080000A287 -:103F700044C90100CC002DABF9B10100000000AB39 -:103F800017C00100F097A0F01644000000000041A7 -:103F900017C00100F59764F082B00000A400004053 -:103FA00047990100F597A2F280320000000000411D -:103FB000E5B101008C002018E0B101009000004044 -:103FC000459901000000600630C001000000860C29 -:103FD00080B20000BC002D4619900100A000A0F2A4 -:103FE000E4B10100B00000404399010010500043CB -:103FF000FCC9010051980030813001000000A24A44 -:1040000019FC0000080000A244C90100CC002DAB3F -:10401000F9B10100000000AB17C001000398A0F047 -:10402000164400000000004117C001000000E4F049 -:1040300082B001000080001044C90100000000416E -:10404000F0B1010000000003F0B101000000000029 -:10405000F0B101000000001062B101000000A81BD7 -:10406000E0B100000898004081B2000000F0000CB0 -:104070007E8901000000A64C956001000000804A86 -:10408000189401000080001044C9010004002201BE -:10409000F031000020000040F0C9010000000016CF -:1040A000F0B101000000004361B1010020000010E8 -:1040B00062DD01000000A815E0B100001398004087 -:1040C00081B200001080000344C901000000000616 -:1040D000F0B1010000000001F0B101000000E85F54 -:1040E0001790010070000040439901007A012EFEF4 -:1040F00092B001008B002DF616B0010020982243EB -:10410000E77D00000000004445C10100040000A656 -:104110002AB0010028006E0682C801002498224AB5 -:10412000197C00000000004245D1010000006E4CE7 -:1041300083C001000000004192C001002598423078 -:104140003D0700000000669E83B0010000001A4198 -:104150003DC301000000004192C00100060000A222 -:1041600044C901001000004998F401002E9826303F -:10417000930400002E98904C9240000000000041F3 -:1041800093C00100FFFF8049ECA9010000800010EE -:1041900044C9010004002201F031000000000009C0 -:1041A000F0B1010000000018F0B101002000001083 -:1041B00062DD01000000A815E0B100003398004066 -:1041C00081B200004098225F817C00003F98A240AD -:1041D000197C00000000004019900100000000540C -:1041E00061B101001000000796E401000000004FDB -:1041F000979401000000004B62B101003F982840F5 -:10420000813200003C98004081B200000000A221F1 -:10421000818400004398A25F816C00000000A243EB -:10422000197C0100000000431990010000000054B7 -:1042300061B101001000000796E401000000004099 -:10424000969401000000004B62B101000000A840FC -:1042500081B200004698004081B200000080001941 -:1042600044C9010004002202F03100000000000BEC -:10427000F0B1010000000013F0B1010000000043A4 -:1042800061B101002000001962DD01000000A808F2 -:10429000E0B100004E98004081B200007C002DF09B -:1042A00084B00100020000F098F401005798204CFF -:1042B000846C00008800004043990100579820F268 -:1042C000846C00000000004085B0010098002D14AF -:1042D00082B00100000000F098B00100A3002D148E -:1042E00098D001005C98204C846C00000000004CC9 -:1042F00084B00100000000F380E001005F982340DB -:10430000846C00000000004084B00100D000201444 -:10431000E0B101009800254280B0010000006EF37A -:1043200080F001000000A64282C000006598A04015 -:10433000164000000000004117C0010000009FF07F -:1043400082EC00009800A041E0B1010068980012E2 -:1043500010C90000004880400B980100C04980400F -:104360000B980100804B80400B980100404D80402D -:104370000B980100004F80400B980100C050804016 -:104380000B980100805280400B98010040548040FF -:104390000B980100005680400B980100C0578040E8 -:1043A0000B980100805980400B980100405B8040D1 -:1043B0000B980100005D80400B980100C05E8040BA -:1043C0000B980100806080400B98010040628040A3 -:1043D0000B980100006480400B980100C06580408C -:1043E0000B980100806780400B9801004069804075 -:1043F0000B980100006B80400B980100C06C80405E -:104400000B980100806E80400B9801004070804046 -:104410000B980100007280400B980100C07380402F -:104420000B980100807580400B9801004077804018 -:104430000B980100007980400B980100C07A804001 -:104440000B980100807C80400B980100407E8040EA -:104450000B98010088984357613100009498A25747 -:10446000737D00009498A240816F00000000004816 -:1044700061B101000010004A62DD01008C98A84A79 -:10448000803300009198225F957C00000000004B73 -:1044900062B101008F98A84BAC33000000001BA54F -:1044A00082B30100000000BE83C301000000804011 -:1044B00097B001000010004A62DD01009898284082 -:1044C0008132000094982257777D000000009B20E5 -:1044D00097B001000000004B62B101009898A8401D -:1044E0008132000000009B4097B0010000002E10B8 -:1044F00048B10100A8010040F19901000000000549 -:10450000F0B101000900000796E40100000060A777 -:1045100097C001000000001062B101000000A84037 -:1045200081B20000A098004081B20000A8002D1CBC -:104530008AB0010000009FF08AD000000000A24075 -:104540008BEC00008A002040E7B10100B40000407D -:1045500047990100A4002D45E0D10100AD989C17BA -:1045600080320000BE002FAB83B001001799001409 -:1045700082500100B298004081B20000B29822F24D -:10458000823000008C00004043990100B2989F1CCB -:10459000E06D0000BE0000404799010017990040FF -:1045A00081320100A800201CE0B101009C002D30E8 -:1045B00081B0010088002DF084B0010094002DF23C -:1045C00086B00100DC9823F0846C00000C000042EF -:1045D00088F40100DC982050896C0000CB98A392ED -:1045E000876C0000BB98004410C90000DC98000AEA -:1045F00087B00000DC98000987B00000DC98000854 -:1046000087B00000DC98000787B00000DC98000746 -:1046100087B00000DC98000787B00000DC98000637 -:1046200087B00000DC98000687B00000DC98000628 -:1046300087B00000DC98000687B00000DC98000618 -:1046400087B00000DC98000587B00000DC9800050A -:1046500087B00000DC98000587B00000DC980005FA -:1046600087B00000DC98000587B00000CC980044BB -:1046700010C90000DC98000F87B00000DC98000E25 -:1046800087B00000DC98000D87B00000DC98000CBB -:1046900087B00000DC98000C87B00000DC98000CAC -:1046A00087B00000DC98000C87B00000DC98000C9C -:1046B00087B00000DC98000C87B00000DC98000B8D -:1046C00087B00000DC98000B87B00000DC98000B7E -:1046D00087B00000DC98000B87B00000DC98000B6E -:1046E00087B00000DC98000B87B00000DC98000B5E -:1046F00087B00000BF002D4384C0010090002DF35F -:1047000080E00100E1982340846C00009400209D2B -:10471000E1B101000000004084B00100E598A2F082 -:10472000386C00009C002042E0B101000000005FF6 -:104730001394010000008046198001009C00204273 -:10474000E0B101003700004043990100040000F38C -:1047500080F401000F0000F382880100EB982341F0 -:10476000806C00000000005F139401000000890CC1 -:1047700080B20000BC00004043990100A000A0F2FC -:10478000E4B1010000009F4124EC0000F598A64030 -:104790008132000000009F4238EC0000F598A640EE -:1047A00081320000B400004043990100F798A3F063 -:1047B0003A6C00000000804081B20100B40000406B -:1047C00043990100FB9822F03A6C0000B400201DD0 -:1047D000E0B1010080002D5F13940100FB9823F0ED -:1047E0003A6C00008000201DE0B10100C0002012E2 -:1047F000E0B10100C400A01CE0B101000080000392 -:1048000044C9010000000042E0B101001200004074 -:104810008798010004999F41246C0000000000412A -:104820008CB00100000000128CD0010005990041FD -:1048300024B00000000000408DB0010055990040F8 -:10484000813201000000004561B10100400000100C -:1048500062DD01000000A84081B20000079900401D -:1048600081B20000D49500408132010000000016A2 -:1048700080B201000000A708803201000F99A24019 -:10488000956C0000E295004081320100008200A694 -:1048900004B00100000000402DB00100A0982F409E -:1048A00011B00100E989004189B0000000009FF8C3 -:1048B0003EEC000000009F12E0ED0000C80020ABBD -:1048C000E1B10100CC00A01FE0B101001999A35F84 -:1048D000E76D000000000041E7C10100A6000040B4 -:1048E000479901002D9922F2863000000300004311 -:1048F00084F401000100004180CC0100B8002D4289 -:1049000080D001000000624086C0010021991F4351 -:10491000803200002299A240876C000000006241B2 -:1049200087B0010026999F408032000000000040BF -:1049300085B001000000004084D00100000000426A -:1049400080B00100000000F288B0010002000044C5 -:1049500084F40100B8002E4280D0010000006240C3 -:1049600088C001002C991F44803200003099A24079 -:10497000896C00003099624189B0000003006241F7 -:1049800086E40100B8000040459901000100624141 -:1049900088E40100A4002040E5B10100A20020400D -:1049A000E7B10100BC002E4387F001000000004485 -:1049B00086C0010036992043876C000000008043C8 -:1049C000E5B101004001004380CE01000000A44396 -:1049D000E43101004001E2408798010088002D4445 -:1049E00081B0010090002DF22EB001009C002DF04E -:1049F00086B0010090002DF082B00100BA002DF0C9 -:104A000098B001004399A212986C0000BC002DF2EE -:104A100098B001004399A0F2986C000000000017C4 -:104A200082B001009C002041E0B10100B4002D12D1 -:104A300086D001004699A341E06D0000479900F03F -:104A400084B000000000004184B0010080002D43CC -:104A500084D001004A999F4280320000000000404B -:104A600085B001004C99A342146C00004D99000AD6 -:104A70000CB00000000000420CB001004F99A017DC -:104A80000C6C0000000080170CB00100549922400B -:104A90000D6C00000000A00A0CEC0000010000F00A -:104AA00082F401005499A0410C6C00000000A2F0B7 -:104AB000803201000000804081B00100E695004096 -:104AC000813201000480000344C901000000004657 -:104AD000F0B1010000000040F1B1010000006041B0 -:104AE000879401000080001044C9010000000050BC -:104AF000F1B1010000000048F0B1010000000049E0 -:104B0000F0B1010000000003E0B101000000004529 -:104B100061B101002000001062DD01000000A85D0D -:104B2000059000006099004081B2000000002E4B0B -:104B30001990010005002A0CE4B101000000800476 -:104B4000E6B101006A9922491F7C00004200004042 -:104B500087980100000000491F800100C0970040B5 -:104B60008DB0000070992240AF6F0000000000156A -:104B700096B0010088980008943001006F99224097 -:104B8000976C0000C097004687B00000000080408E -:104B900087B001007099434861310000001000089F -:104BA00062DD010075992840873000007199224824 -:104BB000777D0000C0971B4687B000007899225F80 -:104BC000117C000004002215623100007699A84093 -:104BD0008132000000009B4081B2010000000040D3 -:104BE00049B1010030000040A199010000000040DF -:104BF00093B00100000000401FB00100C9990049B6 -:104C0000963001000700004906E401000039000366 -:104C100006C801000000004005B00100200000D0DF -:104C2000A0C901000000004193C001007D99A0547B -:104C3000936C000000002E0597B001000048004072 -:104C40004999010000000040E1B10100C00100A24B -:104C500044C901008699A24197500000000000203D -:104C600049B30100CE9900404931010000B52E083A -:104C700097B0010000000040F1B101008C99A24101 -:104C800097500000180000409798010000972E40B0 -:104C900081B2010000000040F1B101009099A241F1 -:104CA000975000000000004049B1010040182E0557 -:104CB00097B0010000000040F1B101009499A241B9 -:104CC0009750000057952040E7B101003094004014 -:104CD0004599010064000040E59901005695204087 -:104CE000E7B10100B8942041E5B10100BA94204138 -:104CF000E5B1010098940040459901000200004090 -:104D00009798010000000040F1B101009E99A24176 -:104D1000975000000000004097B0010000000040E4 -:104D20006FB101000000004B68B10100A2998541FC -:104D300097400000DB9900408132010000000040F4 -:104D400039B301000000004037B30100000000400B -:104D500035B301000000004033B301000000004003 -:104D600041B30100000000403FB301003C0000409F -:104D7000299B0100EE050040259B010042000040F8 -:104D80004B9B0100000000402FB3010000000040D9 -:104D90002DB301000000004047B3010000000040B7 -:104DA00043B30100600000402B9B01000000005451 -:104DB000EF93010000000055F1930100FFFF00A5F3 -:104DC0003C8B01000000002C5BB301000000002CB4 -:104DD00045B301000000004059B30100000000404D -:104DE00057B301000000004027B30100000000405D -:104DF00053B30100BF99A250FD7F0000BF99A2519B -:104E0000FD7F0000C09900401DB3000050460040E7 -:104E10001D9B010000C000A688B30100FF3F00A653 -:104E20003AB3010000C0009D3B9B0100B405004067 -:104E3000239B0100000000404DB30100080A00A6BA -:104E400014B301000101008A159B0100008000A637 -:104E500056B101000000805E57B501001800004BFC -:104E600020E401000600004B96E401000043004BE3 -:104E700096C801001800001020DC01000000804BE3 -:104E80002094010000992E0A97B001000000004014 -:104E9000F1B10100CF99A2419750000000030040FA -:104EA0009798010000A900404599010000000040CA -:104EB000F1B10100D399A2419750000030000040A9 -:104EC000979801000000005561B101000000004BFF -:104ED00062B10100D799A84081320000D799A24160 -:104EE000975000000000804081B2010000000040A7 -:104EF00087B101000000004097B001000000004BA6 -:104F000080B10100010000A682B10100DD99854158 -:104F1000974000000000004097B1010000000040F1 -:104F200097B001000000004B90B10100010000A605 -:104F300092B10100E2998541974000000000804055 -:104F400081B20100E6994440813200000000001265 -:104F500080B10100FFFF9C4B82890100E999444028 -:104F6000813200000000004A80B1010001009CA6CF -:104F700082B10100EC99444081320000FFFF004BF8 -:104F80008489010000009CC224B001000000004A96 -:104F900090B10100FFFF804B928901000000004AA0 -:104FA00090B10100010080A692B10100FFFF004B0B -:104FB00094890100000080CA94B001000000804084 -:104FC00081B201000000004081B00100F79980A586 -:104FD00080320000F89900A58032000000000041F6 -:104FE00081C00100F99980A5803200008001004055 -:104FF00083980100029A204F816C0000000100405C -:1050000083980100029A204B816C000080000040D0 -:1050100083980100029A2047816C00000000004044 -:10502000839801000000004182DC010003900041F0 -:10503000209901000000004049B1010000142F4CEC -:1050400083B0010000000040F1B10100069AA241C6 -:1050500083500000640000A580C80100099AA2A541 -:10506000806C000020000090209901000000005F8B -:10507000239101000C9A1F918032000030000090B3 -:10508000209901000000005F239101000F9A1F91F9 -:10509000803200007000009020A901000000005F35 -:1050A00023910100129A1F91803200000000005FDE -:1050B00023910100149A1F918032000040680090F3 -:1050C00020A90100E000004061990100210000409A -:1050D0006199010022000040619901002300004015 -:1050E0006199010024000040619901002500004001 -:1050F00061990100260000406199010027000040ED -:1051000061990100C000004061990100D014004085 -:105110004599010000000040F1B10100000000408D -:10512000E1B101003003004085300100D01400409F -:1051300045990100020100A680B00100040300406F -:1051400080980100060500A682B001000807004112 -:105150008298010000000040F0B101000000004111 -:10516000E0B10100080000408598010030030040D4 -:10517000813201003903004081320100D81400401F -:1051800043990100FF02A2F8806C0000000322F0A6 -:10519000826C0000FF02004081B20000D0142E405B -:1051A00049B1010005000040A39B01000000004040 -:1051B000C1B30100080000DD81F40100369A00400F -:1051C00010C900003C9A000581B000005501004064 -:1051D00081B20000449A000581B0000055010040F2 -:1051E00081B20000499A0044A5B300004B9A0044E4 -:1051F000A5B3000002000040A4E70100000000E0A9 -:1052000081B10100FFFF00C1F0890100419A2241F4 -:10521000815000003D9A0041C1C30000B10200402E -:1052200081320100C5020040813201005A01004074 -:1052300081B2000002000040A4E70100000000E08D -:1052400091B10100FFFF00C9F0890100419A22419C -:1052500081500000459A0041C1C30000FFFF00DEFD -:1052600085890100419A00C2E0B10000FFFF00DE25 -:1052700095890100419A00CAE0B10000040000CB0A -:1052800081C801006A840040F293000004000040DD -:1052900081B200000400004081B200000400004020 -:1052A00081B200000400004081B200000400004010 -:1052B00081B200000400004081B200000400004000 -:1052C00081B200000400004081B2000004000040F0 -:1052D00081B200000400004081B2000004000040E0 -:1052E00081B200000400004081B2000004000040D0 -:1052F00081B200000400004081B2000004000040C0 -:1053000081B200000400004081B2000004000040AF -:1053100081B200000400004081B20000040000409F -:1053200081B200000400004081B20000040000408F -:1053300081B200000400004081B20000040000407F -:1053400081B200000400004081B20000040000406F -:1053500081B200000400004081B20000040000405F -:1053600081B200000400004081B20000040000404F -:1053700081B200000400004081B20000040000403F -:1053800081B200000400004081B20000040000402F -:1053900081B200000400004081B20000040000401F -:1053A00081B200000400004081B20000040000400F -:1053B00081B200000400004081B2000004000040FF -:1053C00081B200000400004081B2000004000040EF -:1053D00081B200000400004081B2000004000040DF -:1053E00081B200000400004081B2000004000040CF -:1053F00081B200000400004081B2000004000040BF -:1054000081B200000400004081B2000004000040AE -:1054100081B200000400004081B20000040000409E -:1054200081B200000400004081B20000040000408E -:1054300081B200000400004081B20000040000407E -:1054400081B200000400004081B20000040000406E -:1054500081B200000400004081B20000040000405E -:1054600081B200000400004081B20000040000404E -:1054700081B200000400004081B20000040000403E -:1054800081B200000400004081B20000040000402E -:1054900081B200000400004081B20000040000401E -:1054A00081B200000400004081B20000040000400E -:1054B00081B200000400004081B2000004000040FE -:1054C00081B200000400004081B2000004000040EE -:1054D00081B200000400004081B2000004000040DE -:1054E00081B200000400004081B2000004000040CE -:1054F00081B200000400004081B2000004000040BE -:1055000081B200000400004081B2000004000040AD -:1055100081B200000400004081B20000040000409D -:1055200081B200000400004081B20000040000408D -:1055300081B200000400004081B20000040000407D -:1055400081B200000400004081B20000040000406D -:1055500081B200000400004081B20000040000405D -:1055600081B200000400004081B20000040000404D -:1055700081B200000400004081B20000040000403D -:1055800081B200000400004081B20000040000402D -:1055900081B200000400004081B20000040000401D -:1055A00081B200000400004081B20000040000400D -:1055B00081B200000400004081B2000004000040FD -:1055C00081B200000400004081B2000004000040ED -:1055D00081B200000400004081B2000004000040DD -:1055E00081B200000400004081B2000004000040CD -:1055F00081B200000400004081B2000004000040BD -:1056000081B200000400004081B2000004000040AC -:1056100081B200000400004081B20000040000409C -:1056200081B200000400004081B20000040000408C -:1056300081B200000400004081B20000040000407C -:1056400081B200000400004081B20000040000406C -:1056500081B200000400004081B20000040000405C -:1056600081B200000400004081B20000040000404C -:1056700081B200000400004081B20000040000403C -:1056800081B200000400004081B20000040000402C -:1056900081B200000400004081B20000040000401C -:1056A00081B200000400004081B20000040000400C -:1056B00081B200000400004081B2000004000040FC -:1056C00081B200000400004081B2000004000040EC -:1056D00081B200000400004081B2000004000040DC -:1056E00081B200000400004081B2000004000040CC -:1056F00081B200000400004081B2000004000040BC -:1057000081B200000400004081B2000004000040AB -:1057100081B200000400004081B20000040000409B -:1057200081B200000400004081B20000040000408B -:1057300081B200000400004081B20000040000407B -:1057400081B200000400004081B20000040000406B -:1057500081B200000400004081B20000040000405B -:1057600081B200000400004081B20000040000404B -:1057700081B200000400004081B20000040000403B -:1057800081B200000400004081B20000040000402B -:1057900081B200000400004081B20000040000401B -:1057A00081B200000400004081B20000040000400B -:1057B00081B200000400004081B2000004000040FB -:1057C00081B200000400004081B2000004000040EB -:1057D00081B200000400004081B2000004000040DB -:1057E00081B200000400004081B2000004000040CB -:1057F00081B200000400004081B2000004000040BB -:1058000081B200000400004081B2000004000040AA -:1058100081B200000400004081B20000040000409A -:1058200081B200000400004081B20000040000408A -:1058300081B200000400004081B20000040000407A -:1058400081B200000400004081B20000040000406A -:1058500081B200000400004081B20000040000405A -:1058600081B200000400004081B20000040000404A -:1058700081B200000400004081B20000040000403A -:1058800081B200000400004081B20000040000402A -:1058900081B200000400004081B20000040000401A -:1058A00081B200000400004081B20000040000400A -:1058B00081B200000400004081B2000004000040FA -:1058C00081B200000400004081B2000004000040EA -:1058D00081B200000400004081B2000004000040DA -:1058E00081B200000400004081B2000004000040CA -:1058F00081B200000400004081B2000004000040BA -:1059000081B200000400004081B2000004000040A9 -:1059100081B200000400004081B200000400004099 -:1059200081B200000400004081B200000400004089 -:1059300081B200000400004081B200000400004079 -:1059400081B200000400004081B200000400004069 -:1059500081B200000400004081B200000400004059 -:1059600081B200000400004081B200000400004049 -:1059700081B200000400004081B200000400004039 -:1059800081B200000400004081B200000400004029 -:1059900081B200000400004081B200000400004019 -:1059A00081B200000400004081B200000400004009 -:1059B00081B200000400004081B2000004000040F9 -:1059C00081B200000400004081B2000004000040E9 -:1059D00081B200000400004081B2000004000040D9 -:1059E00081B200000400004081B2000004000040C9 -:1059F00081B200000400004081B2000004000040B9 -:105A000081B200000400004081B2000004000040A8 -:105A100081B200000400004081B200000400004098 -:105A200081B200000400004081B200000400004088 -:105A300081B200000400004081B200000400004078 -:105A400081B200000400004081B200000400004068 -:105A500081B200000400004081B200000400004058 -:105A600081B200000400004081B200000400004048 -:105A700081B200000400004081B200000400004038 -:105A800081B200000400004081B200000400004028 -:105A900081B200000400004081B200000400004018 -:105AA00081B200000400004081B200000400004008 -:105AB00081B200000400004081B2000004000040F8 -:105AC00081B200000400004081B2000004000040E8 -:105AD00081B200000400004081B2000004000040D8 -:105AE00081B200000400004081B2000004000040C8 -:105AF00081B200000400004081B2000004000040B8 -:105B000081B200000400004081B2000004000040A7 -:105B100081B200000400004081B200000400004097 -:105B200081B200000400004081B200000400004087 -:105B300081B200000400004081B200000400004077 -:105B400081B200000400004081B200000400004067 -:105B500081B200000400004081B200000400004057 -:105B600081B200000400004081B200000400004047 -:105B700081B200000400004081B200000400004037 -:105B800081B200000400004081B200000400004027 -:105B900081B200000400004081B200000400004017 -:105BA00081B200000400004081B200000400004007 -:105BB00081B200000400004081B2000004000040F7 -:105BC00081B200000400004081B2000004000040E7 -:105BD00081B200000400004081B2000004000040D7 -:105BE00081B200000400004081B2000004000040C7 -:105BF00081B200000400004081B2000004000040B7 -:105C000081B200000400004081B2000004000040A6 -:105C100081B200000400004081B200000400004096 -:105C200081B200000400004081B200000400004086 -:105C300081B200000400004081B200000400004076 -:105C400081B200000400004081B200000400004066 -:105C500081B200000400004081B200000400004056 -:105C600081B200000400004081B200000400004046 -:105C700081B200000400004081B200000400004036 -:105C800081B200000400004081B200000400004026 -:105C900081B200000400004081B200000400004016 -:105CA00081B200000400004081B200000400004006 -:105CB00081B200000400004081B2000004000040F6 -:105CC00081B200000400004081B2000004000040E6 -:105CD00081B200000400004081B2000004000040D6 -:105CE00081B200000400004081B2000004000040C6 -:105CF00081B200000400004081B2000004000040B6 -:105D000081B200000400004081B2000004000040A5 -:105D100081B200000400004081B200000400004095 -:105D200081B200000400004081B200000400004085 -:105D300081B200000400004081B200000400004075 -:105D400081B200000400004081B200000400004065 -:105D500081B200000400004081B200000400004055 -:105D600081B200000400004081B200000400004045 -:105D700081B200000400004081B200000400004035 -:105D800081B200000400004081B200000400004025 -:105D900081B200000400004081B200000400004015 -:105DA00081B200000400004081B200000400004005 -:105DB00081B200000400004081B2000004000040F5 -:105DC00081B200000400004081B2000004000040E5 -:105DD00081B200000400004081B2000004000040D5 -:105DE00081B200000400004081B2000004000040C5 -:105DF00081B200000400004081B2000004000040B5 -:105E000081B200000400004081B2000004000040A4 -:105E100081B200000400004081B200000400004094 -:105E200081B200000400004081B200000400004084 -:105E300081B200000400004081B200000400004074 -:105E400081B200000400004081B200000400004064 -:105E500081B200000400004081B200000400004054 -:105E600081B200000400004081B200000400004044 -:105E700081B200000400004081B200000400004034 -:105E800081B200000400004081B200000400004024 -:105E900081B200000400004081B200000400004014 -:105EA00081B200000400004081B200000400004004 -:105EB00081B200000400004081B2000004000040F4 -:105EC00081B200000400004081B2000004000040E4 -:105ED00081B200000400004081B2000004000040D4 -:105EE00081B200000400004081B2000004000040C4 -:105EF00081B200000400004081B2000004000040B4 -:105F000081B200000400004081B2000004000040A3 -:105F100081B200000400004081B200000400004093 -:105F200081B200000400004081B200000400004083 -:105F300081B200000400004081B200000400004073 -:105F400081B200000400004081B200000400004063 -:105F500081B200000400004081B200000400004053 -:105F600081B200000400004081B200000400004043 -:105F700081B200000400004081B200000400004033 -:105F800081B200000400004081B200000400004023 -:105F900081B200000400004081B200000400004013 -:105FA00081B200000400004081B200000400004003 -:105FB00081B200000400004081B2000004000040F3 -:105FC00081B200000400004081B2000004000040E3 -:105FD00081B200000400004081B2000004000040D3 -:105FE00081B200000400004081B2000004000040C3 -:105FF00081B200000400004081B2000004000040B3 -:1060000081B200000400004081B2000004000040A2 -:1060100081B200000400004081B200000400004092 -:1060200081B200000400004081B200000400004082 -:1060300081B200000400004081B200000400004072 -:1060400081B200000400004081B200000400004062 -:1060500081B200000400004081B200000400004052 -:1060600081B200000400004081B200000400004042 -:1060700081B200000400004081B200000400004032 -:1060800081B200000400004081B200000400004022 -:1060900081B200000400004081B200000400004012 -:1060A00081B200000400004081B200000400004002 -:1060B00081B200000400004081B2000004000040F2 -:1060C00081B200000400004081B2000004000040E2 -:1060D00081B200000400004081B2000004000040D2 -:1060E00081B200000400004081B2000004000040C2 -:1060F00081B200000400004081B2000004000040B2 -:1061000081B200000400004081B2000004000040A1 -:1061100081B200000400004081B200000400004091 -:1061200081B200000400004081B200000400004081 -:1061300081B200000400004081B200000400004071 -:1061400081B200000400004081B200000400004061 -:1061500081B200000400004081B200000400004051 -:1061600081B200000400004081B200000400004041 -:1061700081B200000400004081B200000400004031 -:1061800081B200000400004081B200000400004021 -:1061900081B200000400004081B200000400004011 -:1061A00081B200000400004081B200000400004001 -:1061B00081B200000400004081B2000004000040F1 -:1061C00081B200000400004081B2000004000040E1 -:1061D00081B200000400004081B2000004000040D1 -:1061E00081B200000400004081B2000004000040C1 -:1061F00081B200000400004081B2000004000040B1 -:1062000081B200000400004081B2000004000040A0 -:1062100081B200000400004081B200000400004090 -:1062200081B200000400004081B200000400004080 -:1062300081B200000400004081B200000400004070 -:1062400081B200000400004081B200000400004060 -:1062500081B200000400004081B200000400004050 -:1062600081B200000400004081B200000400004040 -:1062700081B200000400004081B200000400004030 -:1062800081B200000400004081B200000400004020 -:1062900081B200000400004081B200000400004010 -:1062A00081B200000400004081B200000400004000 -:1062B00081B200000400004081B2000004000040F0 -:1062C00081B200000400004081B2000004000040E0 -:1062D00081B200000400004081B2000004000040D0 -:1062E00081B200000400004081B2000004000040C0 -:1062F00081B200000400004081B2000004000040B0 -:1063000081B200000400004081B20000040000409F -:1063100081B200000400004081B20000040000408F -:1063200081B200000400004081B20000040000407F -:1063300081B200000400004081B20000040000406F -:1063400081B200000400004081B20000040000405F -:1063500081B200000400004081B20000040000404F -:1063600081B200000400004081B20000040000403F -:1063700081B200000400004081B20000040000402F -:1063800081B200000400004081B20000040000401F -:1063900081B200000400004081B20000040000400F -:1063A00081B200000400004081B2000004000040FF -:1063B00081B200000400004081B2000004000040EF -:1063C00081B200000400004081B2000004000040DF -:1063D00081B200000400004081B2000004000040CF -:1063E00081B200000400004081B2000004000040BF -:1063F00081B200000400004081B2000004000040AF -:1064000081B200000400004081B20000040000409E -:1064100081B200000400004081B20000040000408E -:1064200081B200000400004081B20000040000407E -:1064300081B200000400004081B20000040000406E -:1064400081B200000400004081B20000040000405E -:1064500081B200000400004081B20000040000404E -:1064600081B200000400004081B20000040000403E -:1064700081B200000400004081B20000040000402E -:1064800081B200000400004081B20000040000401E -:1064900081B200000400004081B20000040000400E -:1064A00081B200000400004081B2000004000040FE -:1064B00081B200000400004081B2000004000040EE -:1064C00081B200000400004081B2000004000040DE -:1064D00081B200000400004081B2000004000040CE -:1064E00081B200000400004081B2000004000040BE -:1064F00081B200000400004081B2000004000040AE -:1065000081B200000400004081B20000040000409D -:1065100081B200000400004081B20000040000408D -:1065200081B200000400004081B20000040000407D -:1065300081B200000400004081B20000040000406D -:1065400081B200000400004081B20000040000405D -:1065500081B200000400004081B20000040000404D -:1065600081B200000400004081B20000040000403D -:1065700081B200000400004081B20000040000402D -:1065800081B200000400004081B20000040000401D -:1065900081B200000400004081B20000040000400D -:1065A00081B200000400004081B2000004000040FD -:1065B00081B200000400004081B2000004000040ED -:1065C00081B200000400004081B2000004000040DD -:1065D00081B200000400004081B2000004000040CD -:1065E00081B200000400004081B2000004000040BD -:1065F00081B200000400004081B2000004000040AD -:1066000081B200000400004081B20000040000409C -:1066100081B200000400004081B20000040000408C -:1066200081B200000400004081B20000040000407C -:1066300081B200000400004081B20000040000406C -:1066400081B200000400004081B20000040000405C -:1066500081B200000400004081B20000040000404C -:1066600081B200000400004081B20000040000403C -:1066700081B200000400004081B20000040000402C -:1066800081B200000400004081B20000040000401C -:1066900081B200000400004081B20000040000400C -:1066A00081B200000400004081B2000004000040FC -:1066B00081B200000400004081B2000004000040EC -:1066C00081B200000400004081B2000004000040DC -:1066D00081B200000400004081B2000004000040CC -:1066E00081B200000400004081B2000004000040BC -:1066F00081B200000400004081B2000004000040AC -:1067000081B200000400004081B20000040000409B -:1067100081B200000400004081B20000040000408B -:1067200081B200000400004081B20000040000407B -:1067300081B200000400004081B20000040000406B -:1067400081B200000400004081B20000040000405B -:1067500081B200000400004081B20000040000404B -:1067600081B200000400004081B20000040000403B -:1067700081B200000400004081B20000040000402B -:1067800081B200000400004081B20000040000401B -:1067900081B200000400004081B20000040000400B -:1067A00081B200000400004081B2000004000040FB -:1067B00081B200000400004081B2000004000040EB -:1067C00081B200000400004081B2000004000040DB -:1067D00081B200000400004081B2000004000040CB -:1067E00081B200000400004081B2000004000040BB -:1067F00081B200000400004081B2000004000040AB -:1068000081B200000400004081B20000040000409A -:1068100081B200000400004081B20000040000408A -:1068200081B200000400004081B20000040000407A -:1068300081B200000400004081B20000040000406A -:1068400081B200000400004081B20000040000405A -:1068500081B200000400004081B20000040000404A -:1068600081B200000400004081B20000040000403A -:1068700081B200000400004081B20000040000402A -:1068800081B200000400004081B20000040000401A -:1068900081B200000400004081B20000040000400A -:1068A00081B200000400004081B2000004000040FA -:1068B00081B200000400004081B2000004000040EA -:1068C00081B200000400004081B2000004000040DA -:1068D00081B200000400004081B2000004000040CA -:1068E00081B200000400004081B2000004000040BA -:1068F00081B200000400004081B2000004000040AA -:1069000081B200000400004081B200000400004099 -:1069100081B200000400004081B200000400004089 -:1069200081B200000400004081B200000400004079 -:1069300081B200000400004081B200000400004069 -:1069400081B200000400004081B200000400004059 -:1069500081B200000400004081B200000400004049 -:1069600081B200000400004081B200000400004039 -:1069700081B200000400004081B200000400004029 -:1069800081B200000400004081B200000400004019 -:1069900081B200000400004081B200000400004009 -:1069A00081B200000400004081B2000004000040F9 -:1069B00081B200000400004081B2000004000040E9 -:1069C00081B200000400004081B2000004000040D9 -:1069D00081B200000400004081B2000004000040C9 -:1069E00081B200000400004081B2000004000040B9 -:1069F00081B200000400004081B2000004000040A9 -:106A000081B200000400004081B200000400004098 -:106A100081B200000400004081B200000400004088 -:106A200081B200000400004081B200000400004078 -:106A300081B200000400004081B200000400004068 -:106A400081B200000400004081B200000400004058 -:106A500081B200000400004081B200000400004048 -:106A600081B200000400004081B200000400004038 -:106A700081B200000400004081B200000400004028 -:106A800081B200000400004081B200000400004018 -:106A900081B200000400004081B200000400004008 -:106AA00081B200000400004081B2000004000040F8 -:106AB00081B200000400004081B2000004000040E8 -:106AC00081B200000400004081B2000004000040D8 -:106AD00081B200000400004081B2000004000040C8 -:106AE00081B200000400004081B2000004000040B8 -:106AF00081B200000400004081B2000004000040A8 -:106B000081B200000400004081B200000400004097 -:106B100081B200000400004081B200000400004087 -:106B200081B200000400004081B200000400004077 -:106B300081B200000400004081B200000400004067 -:106B400081B200000400004081B200000400004057 -:106B500081B200000400004081B200000400004047 -:106B600081B200000400004081B200000400004037 -:106B700081B200000400004081B200000400004027 -:106B800081B200000400004081B200000400004017 -:106B900081B200000400004081B200000400004007 -:106BA00081B200000400004081B2000004000040F7 -:106BB00081B200000400004081B2000004000040E7 -:106BC00081B200000400004081B2000004000040D7 -:106BD00081B200000400004081B2000004000040C7 -:106BE00081B200000400004081B2000004000040B7 -:106BF00081B200000400004081B2000004000040A7 -:106C000081B200000400004081B200000400004096 -:106C100081B200000400004081B200000400004086 -:106C200081B200000400004081B200000400004076 -:106C300081B200000400004081B200000400004066 -:106C400081B200000400004081B200000400004056 -:106C500081B200000400004081B200000400004046 -:106C600081B200000400004081B200000400004036 -:106C700081B200000400004081B200000400004026 -:106C800081B200000400004081B200000400004016 -:106C900081B200000400004081B200000400004006 -:106CA00081B200000400004081B2000004000040F6 -:106CB00081B200000400004081B2000004000040E6 -:106CC00081B200000400004081B2000004000040D6 -:106CD00081B200000400004081B2000004000040C6 -:106CE00081B200000400004081B2000004000040B6 -:106CF00081B200000400004081B2000004000040A6 -:106D000081B200000400004081B200000400004095 -:106D100081B200000400004081B200000400004085 -:106D200081B200000400004081B200000400004075 -:106D300081B200000400004081B200000400004065 -:106D400081B200000400004081B200000400004055 -:106D500081B200000400004081B200000400004045 -:106D600081B200000400004081B200000400004035 -:106D700081B200000400004081B200000400004025 -:106D800081B200000400004081B200000400004015 -:106D900081B200000400004081B200000400004005 -:106DA00081B200000400004081B2000004000040F5 -:106DB00081B200000400004081B2000004000040E5 -:106DC00081B200000400004081B2000004000040D5 -:106DD00081B200000400004081B2000004000040C5 -:106DE00081B200000400004081B2000004000040B5 -:106DF00081B200000400004081B2000004000040A5 -:106E000081B200000400004081B200000400004094 -:106E100081B200000400004081B200000400004084 -:106E200081B200000400004081B200000400004074 -:106E300081B200000400004081B200000400004064 -:106E400081B200000400004081B200000400004054 -:106E500081B200000400004081B200000400004044 -:106E600081B200000400004081B200000400004034 -:106E700081B200000400004081B200000400004024 -:106E800081B200000400004081B200000400004014 -:106E900081B200000400004081B200000400004004 -:106EA00081B200000400004081B2000004000040F4 -:106EB00081B200000400004081B2000004000040E4 -:106EC00081B200000400004081B2000004000040D4 -:106ED00081B200000400004081B2000004000040C4 -:106EE00081B200000400004081B2000004000040B4 -:106EF00081B200000400004081B2000004000040A4 -:106F000081B200000400004081B200000400004093 -:106F100081B200000400004081B200000400004083 -:106F200081B200000400004081B200000400004073 -:106F300081B200000400004081B200000400004063 -:106F400081B200000400004081B200000400004053 -:106F500081B200000400004081B200000400004043 -:106F600081B200000400004081B200000400004033 -:106F700081B200000400004081B200000400004023 -:106F800081B200000400004081B200000400004013 -:106F900081B200000400004081B200000400004003 -:106FA00081B200000400004081B2000004000040F3 -:106FB00081B200000400004081B2000004000040E3 -:106FC00081B200000400004081B2000004000040D3 -:106FD00081B200000400004081B2000004000040C3 -:106FE00081B200000400004081B2000004000040B3 -:106FF00081B200000400004081B2000004000040A3 -:1070000081B200000400004081B200000400004092 -:1070100081B200000400004081B200000400004082 -:1070200081B200000400004081B200000400004072 -:1070300081B200000400004081B200000400004062 -:1070400081B200000400004081B200000400004052 -:1070500081B200000400004081B200000400004042 -:1070600081B200000400004081B200000400004032 -:1070700081B200000400004081B200000400004022 -:1070800081B200000400004081B200000400004012 -:1070900081B200000400004081B200000400004002 -:1070A00081B200000400004081B2000004000040F2 -:1070B00081B200000400004081B2000004000040E2 -:1070C00081B200000400004081B2000004000040D2 -:1070D00081B200000400004081B2000004000040C2 -:1070E00081B200000400004081B2000004000040B2 -:1070F00081B200000400004081B2000004000040A2 -:1071000081B200000400004081B200000400004091 -:1071100081B200000400004081B200000400004081 -:1071200081B200000400004081B200000400004071 -:1071300081B200000400004081B200000400004061 -:1071400081B200000400004081B200000400004051 -:1071500081B200000400004081B200000400004041 -:1071600081B200000400004081B200000400004031 -:1071700081B200000400004081B200000400004021 -:1071800081B200000400004081B200000400004011 -:1071900081B200000400004081B200000400004001 -:1071A00081B200000400004081B2000004000040F1 -:1071B00081B200000400004081B2000004000040E1 -:1071C00081B200000400004081B2000004000040D1 -:1071D00081B200000400004081B2000004000040C1 -:1071E00081B200000400004081B2000004000040B1 -:1071F00081B200000400004081B2000004000040A1 -:1072000081B200000400004081B200000400004090 -:1072100081B200000400004081B200000400004080 -:1072200081B200000400004081B200000400004070 -:1072300081B200000400004081B200000400004060 -:1072400081B200000400004081B200000400004050 -:1072500081B200000400004081B200000400004040 -:1072600081B200000400004081B200000400004030 -:1072700081B200000400004081B200000400004020 -:1072800081B200000400004081B200000400004010 -:1072900081B200000400004081B200000400004000 -:1072A00081B200000400004081B2000004000040F0 -:1072B00081B200000400004081B2000004000040E0 -:1072C00081B200000400004081B2000004000040D0 -:1072D00081B200000400004081B2000004000040C0 -:1072E00081B200000400004081B2000004000040B0 -:1072F00081B200000400004081B2000004000040A0 -:1073000081B200000400004081B20000040000408F -:1073100081B200000400004081B20000040000407F -:1073200081B200000400004081B20000040000406F -:1073300081B200000400004081B20000040000405F -:1073400081B200000400004081B20000040000404F -:1073500081B200000400004081B20000040000403F -:1073600081B200000400004081B20000040000402F -:1073700081B200000400004081B20000040000401F -:1073800081B200000400004081B20000040000400F -:1073900081B200000400004081B2000004000040FF -:1073A00081B200000400004081B2000004000040EF -:1073B00081B200000400004081B2000004000040DF -:1073C00081B200000400004081B2000004000040CF -:1073D00081B200000400004081B2000004000040BF -:1073E00081B200000400004081B2000004000040AF -:1073F00081B200000400004081B20000040000409F -:1074000081B200000400004081B20000040000408E -:1074100081B200000400004081B20000040000407E -:1074200081B200000400004081B20000040000406E -:1074300081B200000400004081B20000040000405E -:1074400081B200000400004081B20000040000404E -:1074500081B200000400004081B20000040000403E -:1074600081B200000400004081B20000040000402E -:1074700081B200000400004081B20000040000401E -:1074800081B200000400004081B20000040000400E -:1074900081B200000400004081B2000004000040FE -:1074A00081B200000400004081B2000004000040EE -:1074B00081B200000400004081B2000004000040DE -:1074C00081B200000400004081B2000004000040CE -:1074D00081B200000400004081B2000004000040BE -:1074E00081B200000400004081B2000004000040AE -:1074F00081B200000400004081B20000040000409E -:1075000081B200000400004081B20000040000408D -:1075100081B200000400004081B20000040000407D -:1075200081B200000400004081B20000040000406D -:1075300081B200000400004081B20000040000405D -:1075400081B200000400004081B20000040000404D -:1075500081B200000400004081B20000040000403D -:1075600081B200000400004081B20000040000402D -:1075700081B200000400004081B20000040000401D -:1075800081B200000400004081B20000040000400D -:1075900081B200000400004081B2000004000040FD -:1075A00081B200000400004081B2000004000040ED -:1075B00081B200000400004081B2000004000040DD -:1075C00081B200000400004081B2000004000040CD -:1075D00081B200000400004081B2000004000040BD -:1075E00081B200000400004081B2000004000040AD -:1075F00081B200000400004081B20000040000409D -:1076000081B200000400004081B20000040000408C -:1076100081B200000400004081B20000040000407C -:1076200081B200000400004081B20000040000406C -:1076300081B200000400004081B20000040000405C -:1076400081B200000400004081B20000040000404C -:1076500081B200000400004081B20000040000403C -:1076600081B200000400004081B20000040000402C -:1076700081B200000400004081B20000040000401C -:1076800081B200000400004081B20000040000400C -:1076900081B200000400004081B2000004000040FC -:1076A00081B200000400004081B2000004000040EC -:1076B00081B200000400004081B2000004000040DC -:1076C00081B200000400004081B2000004000040CC -:1076D00081B200000400004081B2000004000040BC -:1076E00081B200000400004081B2000004000040AC -:1076F00081B200000400004081B20000040000409C -:1077000081B200000400004081B20000040000408B -:1077100081B200000400004081B20000040000407B -:1077200081B200000400004081B20000040000406B -:1077300081B200000400004081B20000040000405B -:1077400081B200000400004081B20000040000404B -:1077500081B200000400004081B20000040000403B -:1077600081B200000400004081B20000040000402B -:1077700081B200000400004081B20000040000401B -:1077800081B200000400004081B20000040000400B -:1077900081B200000400004081B2000004000040FB -:1077A00081B200000400004081B2000004000040EB -:1077B00081B200000400004081B2000004000040DB -:1077C00081B200000400004081B2000004000040CB -:1077D00081B200000400004081B2000004000040BB -:1077E00081B200000400004081B2000004000040AB -:1077F00081B200000400004081B20000040000409B -:1078000081B200000400004081B20000040000408A -:1078100081B200000400004081B20000040000407A -:1078200081B200000400004081B20000040000406A -:1078300081B200000400004081B20000040000405A -:1078400081B200000400004081B20000040000404A -:1078500081B200000400004081B20000040000403A -:1078600081B200000400004081B20000040000402A -:1078700081B200000400004081B20000040000401A -:1078800081B200000400004081B20000040000400A -:1078900081B200000400004081B2000004000040FA -:1078A00081B200000400004081B2000004000040EA -:1078B00081B200000400004081B2000004000040DA -:1078C00081B200000400004081B2000004000040CA -:1078D00081B200000400004081B2000004000040BA -:1078E00081B200000400004081B2000004000040AA -:1078F00081B200000400004081B20000040000409A -:1079000081B200000400004081B200000400004089 -:1079100081B200000400004081B200000400004079 -:1079200081B200000400004081B200000400004069 -:1079300081B200000400004081B200000400004059 -:1079400081B200000400004081B200000400004049 -:1079500081B200000400004081B200000400004039 -:1079600081B200000400004081B200000400004029 -:1079700081B200000400004081B200000400004019 -:1079800081B200000400004081B200000400004009 -:1079900081B200000400004081B2000004000040F9 -:1079A00081B200000400004081B2000004000040E9 -:1079B00081B200000400004081B2000004000040D9 -:1079C00081B200000400004081B2000004000040C9 -:1079D00081B200000400004081B2000004000040B9 -:1079E00081B200000400004081B2000004000040A9 -:1079F00081B200000400004081B200000400004099 -:107A000081B200000400004081B200000400004088 -:107A100081B200000400004081B200000400004078 -:107A200081B200000400004081B200000400004068 -:107A300081B200000400004081B200000400004058 -:107A400081B200000400004081B200000400004048 -:107A500081B200000400004081B200000400004038 -:107A600081B200000400004081B200000400004028 -:107A700081B200000400004081B200000400004018 -:107A800081B200000400004081B200000400004008 -:107A900081B200000400004081B2000004000040F8 -:107AA00081B200000400004081B2000004000040E8 -:107AB00081B200000400004081B2000004000040D8 -:107AC00081B200000400004081B2000004000040C8 -:107AD00081B200000400004081B2000004000040B8 -:107AE00081B200000400004081B2000004000040A8 -:107AF00081B200000400004081B200000400004098 -:107B000081B200000400004081B200000400004087 -:107B100081B200000400004081B200000400004077 -:107B200081B200000400004081B200000400004067 -:107B300081B200000400004081B200000400004057 -:107B400081B200000400004081B200000400004047 -:107B500081B200000400004081B200000400004037 -:107B600081B200000400004081B200000400004027 -:107B700081B200000400004081B200000400004017 -:107B800081B200000400004081B200000400004007 -:107B900081B200000400004081B2000004000040F7 -:107BA00081B200000400004081B2000004000040E7 -:107BB00081B200000400004081B2000004000040D7 -:107BC00081B200000400004081B2000004000040C7 -:107BD00081B200000400004081B2000004000040B7 -:107BE00081B200000400004081B2000004000040A7 -:107BF00081B200000400004081B200000400004097 -:107C000081B200000400004081B200000400004086 -:107C100081B200000400004081B200000400004076 -:107C200081B200000400004081B200000400004066 -:107C300081B200000400004081B200000400004056 -:107C400081B200000400004081B200000400004046 -:107C500081B200000400004081B200000400004036 -:107C600081B200000400004081B200000400004026 -:107C700081B200000400004081B200000400004016 -:107C800081B200000400004081B200000400004006 -:107C900081B200000400004081B2000004000040F6 -:107CA00081B200000400004081B2000004000040E6 -:107CB00081B200000400004081B2000004000040D6 -:107CC00081B200000400004081B2000004000040C6 -:107CD00081B200000400004081B2000004000040B6 -:107CE00081B200000400004081B2000004000040A6 -:107CF00081B200000400004081B200000400004096 -:107D000081B200000400004081B200000400004085 -:107D100081B200000400004081B200000400004075 -:107D200081B200000400004081B200000400004065 -:107D300081B200000400004081B200000400004055 -:107D400081B200000400004081B200000400004045 -:107D500081B200000400004081B200000400004035 -:107D600081B200000400004081B200000400004025 -:107D700081B200000400004081B200000400004015 -:107D800081B200000400004081B200000400004005 -:107D900081B20000B69F00889AB00000B69F0088AC -:107DA0009AB00000B69F00889AB00000B69F008885 -:107DB0009AB00000B69F00889AB0000000000088CA -:107DC0009AB00100B69F414081320000B99F224025 -:107DD0007B6F0000B69F194081B20000000019417E -:107DE0007BB30100000000A4C4B30100000000A1A7 -:107DF000C6B3010000002FA2C8B301000814004060 -:107E000049990100B09F004D9ACC0100C29F2640C5 -:107E1000813200000000004C49C10100C09FA24116 -:107E20009B500000C69F80808032000000005249B5 -:107E3000FD9301000000004AFD930100C99F00422C -:107E4000CD9300000000514AFD930100000000495D -:107E5000FD930100C99F0043CB93000000005040F8 -:107E600081B20100D99F004019990100000000F083 -:107E70009AB001000000004449D10100000040F028 -:107E800080B201000000414D80B20100D19F00404E -:107E90001999010000004C4081B20100000000442B -:107EA00049D10100000000F09AB001000000004D2F -:107EB00010B10000000000E249B10100000000E341 -:107EC00043B10100000000E445B1010000000040A2 -:107ED0007BB301000000484F40B10100D99F004032 -:107EE00081B200000400004081B2000004000040A4 -:107EF00081B200000400004081B200000400004094 -:107F000081B200000400004081B200000400004083 -:107F100081B200000000804081B0010004000040F8 -:107F200081B200000400004081B200000400004063 -:107F300081B200000400004081B200000400004053 -:107F400081B200000400004081B200000400004043 -:107F500081B200000400004081B200000400004033 -:107F600081B200000400004081B200000400004023 -:107F700081B200000400004081B200000400004013 -:107F800081B200000400004081B200000400004003 -:107F900081B200006A84004081B20000319A004042 -:107FA00081B200000400004081B200004D9A004000 -:107FB00081B200000400004081B200000000804057 -:107FC00081B20100000000A810B1000004000040D0 -:107FD00081B200000400004081B2000004000040B3 -:107FE00081B200000400004081B2000004000040A3 -:107FF00081B200000400004081B200000400004093 -:1080000081B200000400004081B200000400004082 -:0480100081B2000039 -:00000001FF diff --git a/firmware/slicoss/gbrcvucode.sys.ihex b/firmware/slicoss/gbrcvucode.sys.ihex deleted file mode 100644 index bc7a839..0000000 --- a/firmware/slicoss/gbrcvucode.sys.ihex +++ /dev/null @@ -1,162 +0,0 @@ -:10000000000200004775010004A01301001CB75B4B -:10001000093000B65F01001C00000020183B783A50 -:10002000001CA27701001C071D017018AD7BF1FFB9 -:100030001CB37BA9AA1EB47B010C1CB57B29061C32 -:1000400000005064080C315A70040C315A80040CC2 -:10005000314E90040C314AA000092555C0040C31E2 -:1000600052B000E92455C004CCB3001C1CEB2D0198 -:10007000001C065652D408079D00001C7BB70200E6 -:1000800010A00F51540906565EC004A0307403003E -:10009000AC30750300CD033A001C7BB702001C6036 -:1000A0008E5154092925750300808E5154098C30D6 -:1000B000910004471C01001CA00F5154090000646A -:1000C0000004471C65C004471C7503006C30010028 -:1000D0001C4D3402001C7BB702001CA00F515409B8 -:1000E000C88337001C800100001C0000640004A0CD -:1000F0000F505409000074C3047BFBF2001CCC3386 -:100100000D001CB47BFD031C800E505409E0FB0560 -:10011000001C0000AC0300B30F5154090000EC7048 -:10012000040000EC80040000AC93006176ADC304D1 -:10013000C08D515409E07B00C01FA0FDC50100CC5B -:100140003305001CD403003C1CD4D31B001CC0D3BB -:1001500052001C00007C13048E8E5254095B807E7A -:100160001304000000001C0000940100A00F515473 -:1001700009A00F515409C003FC7F1CA001A001007D -:100180000000A40100A00F515409C003FC031CF59A -:100190007701001C267A02061CA00F515409B30FE8 -:1001A000515409B50202001CA00F5154097A7E0275 -:1001B000001CB50202001C530F525409AF0301008A -:1001C0001C7A0E525409B50202001C000002001CE9 -:1001D000A03DAA11040000AC1104D4D352001CB5F8 -:1001E0003EB2010020FBFDFF1F802C8C0300B93ABA -:1001F0009E0100753B02001CA71C010010DB83164A -:10020000001CC71D21C104B93B8DC1048B2C01000A -:100210001C6B2C35C1040000781100CB2C79C10473 -:10022000A00F515409A00F51540954D002001C4989 -:1002300025B10100AB2C81C104A71D750300CC338F -:1002400009001CEB2D01001CEA2901001CA00F5124 -:100250005409AE0F515409A00F515409D407FC039F -:100260001C993A02001CBB3802001C003800001C1C -:100270000000FC0104DB3B7E001CC71D01001C26A6 -:100280007A16061C271D01001CB30F5154097A0E63 -:10029000525409530F5254097A0E525409530F52B3 -:1002A00054097A0E525409530F525409A00F515455 -:1002B000097A0602001C530F525409AF0301001CB7 -:1002C0007A0E525409530F5254097A0E525409535C -:1002D0000F5254097A0E525409530F5254097A0E90 -:1002E000525409003D02001C0000581200CB2C01A2 -:1002F000001C753B02001CA71C010010A67BFD051D -:100300001C000090C204A67BFD051C0000A8C204CE -:10031000CB2F05001C602C00001CC71CE90200A0AC -:100320000F515409530702001CC083F1321C000016 -:10033000600204467AE6051C7A0E525409C083F125 -:10034000321C000068020440FA15001C0000A802DC -:1003500004467AE6051CA00F515409A00F51540918 -:10036000A00F515409A00F515409B37B01C01F7451 -:100370000E505409C0039C001C8000F802000000CD -:10038000F802040000CC1205071D01001CD4D32B79 -:10039000001CD4D352001C80769D1304000000037F -:1003A00000A67BB50310C79C00001C802C00001C1D -:1003B00000007C0204000074C304AB2DF912050791 -:1003C0001DD5C2048B2D01001C692501001CA67BD4 -:1003D000B50310CB2F09001C602C00001C00006826 -:1003E0000300530F525409467AE6051C7A0E525404 -:1003F0000940FA15001C0000300304467AE6051C8B -:10040000B50F515409A00F51540973EC4A0304600D -:100410002C00001C0000480300C71C01001C000049 -:10042000481305071D01001CC0D722001C75569EED -:100430001304602C00001CE71C650304E79C00000B -:100440001CA67BB50310802C00001C0000180304C0 -:10045000000074C304B97B01001C0000ACC304CBD2 -:10046000AFFC071CCB2F01041CC79F80031C00009E -:10047000ACC304CBAFFC071CCB2F0D041CC79F8063 -:10048000031C0000ACC304CBAF00F81DCB2F010050 -:100490001DA67BB5031CC79CACC3040000AC1305B0 -:1004A000071D01001CC01DFCD308279D040400A0EB -:1004B000EE66D400FB75291404207B06001CC01CCA -:1004C0003C04000000D0D308000020F400C0EFF28C -:1004D000001C20257C140460B7F2030000002C15DA -:1004E00000CCB3FC031CCC3305021C00002CC5045B -:1004F00060B72E050400002C150400007CC404C065 -:100500001DB8F304000088C404079D00001C1B7480 -:100510001DF404A67B11041CA00F895409E07B0084 -:10052000FC1F397F02001C071DBDC304A67BCD0341 -:100530001C000088C404E01C00001C0000C403046C -:10054000CBAF00F81DCB2F01101D0000CCC3040061 -:1005500000CC0304CBAF00F81DCB2F01181DC79FA3 -:10056000000B1C0000CCC304FB7501001C071D011F -:10057000001CCCB3FC031CCC3301021C0000CCC318 -:1005800004A01C00001CA0EEC20304CBAFFC071C9F -:10059000CB2F09041CFB7501001C0000CCC304CC4C -:1005A000B3FC031CCC3301021C00002CC50400006A -:1005B000983405CCB3FC031CCC3315021C479D7446 -:1005C000C4040000984400801D9C5404871DAD04A1 -:1005D00000CE7601001CEF76BDC404A477AD2409DB -:1005E000E47601001CC47601001C0000B85404D756 -:1005F00076015018F67601001C000000301800004B -:10060000000010CC3061C504EB2D01001CEA29016B -:10061000001CC05901001CF57749C504E030FC04FA -:1006200000004CD00400204C140500000008050018 -:10063000CCB3FC031CCC3309021CEB2DD5C404CC79 -:10064000B3FC031CCC3319021CEB2DD5C404CCB372 -:10065000FC031CCC330D021CEB2DD5C404CCB3FC25 -:10066000031CCC3311021CEB2DD5C404007B00808D -:100670001CAE77610500000004C004D38B00FC1F92 -:10068000607A3C001C604CE00400C02F20051FE095 -:1006900030D004008025D00400B55BD10404692665 -:1006A00001001C6A2B01001C801D00001CA9256193 -:1006B0000500EE3000001CAF77210500B45F01405B -:1006C00018079D645504B77601001C967601001C3E -:1006D000471D01001CA433016018A42F0160186499 -:1006E000770160182477016018447701001C648842 -:1006F00003001CA43F01001CA43B01001C537B0011 -:10070000C01CD3CF1B001C534F02001CDACF00C00B -:100710001FD5570F001CD3D337001CD4530F001C18 -:10072000E02900001CF5D5CC05000000B855047781 -:100730005601001C565301001C0000001018000058 -:1007400004C004F55501001C0000D0550477560183 -:10075000001C565301001C0000001018000004C0CB -:1007600004CB2F011810CB2F011010CB2F01081034 -:10077000CB2F010810CB2F012010CB2F010010CB65 -:100780002F012810892571C20400000CC304000049 -:1007900074C304000074C304000074C30400007038 -:1007A000C20400000CC304000074C304000074C33E -:1007B00004000074C304401C6CC004401C9CC004B2 -:1007C000A77775C3040000C4C004271DF1C004004E -:1007D0000074C304000074C304000074C304000068 -:1007E00048C604000048C604000048C6040000488B -:1007F000C604000048C604000048C604000048C6FD -:1008000004000048C604000048C604000048C604AE -:10081000000048C604000048C604000048C60400A2 -:100820000048C604000048C604000048C604000092 -:1008300048C604000048C604000048C6040000483A -:10084000C604000048C604000048C604000048C6AC -:1008500004000048C604000048C604000048C6045E -:10086000000048C604000048C604000048C6040052 -:100870000048C604000048C604000048C604000042 -:1008800048C604000048C604000048C604000048EA -:10089000C604000048C604000048C604000048C65C -:1008A00004000048C604000048C604000048C6040E -:1008B000000048C604000048C604000048C6040002 -:1008C0000048C604000048C604000048C6040000F2 -:1008D00048C604000048C604000048C6040000489A -:1008E000C604000048C604000048C604000048C60C -:1008F00004000048C604000048C604000048C604BE -:10090000000048C604000048C604000048C60400B1 -:100910000048C604000048C604000048C6040000A1 -:1009200048C604000048C604000048C60400004849 -:10093000C604000048C604000048C604000048C6BB -:1009400004000048C604000048C604000048C6046D -:10095000000048C604000048C604000048C6040061 -:100960000048C604000048C604000048C604000051 -:1009700048C604000048C604000048C604000048F9 -:10098000C604000048C604000048C604000048C66B -:1009900004000048C604000048C604000048C6041D -:1009A000000048C604000048C604000048C6040011 -:1009B0000048C604000048C604000048C604000001 -:1009C00048C604000048C604000048C604000048A9 -:1009D000C604000048C604000048C604000048C61B -:1009E00004000048C604000048C604000048C604CD -:1009F000000048C604000048C604000048C60400C1 -:040A00000048C604E0 -:00000001FF diff --git a/firmware/slicoss/oasisdbgdownload.sys.ihex b/firmware/slicoss/oasisdbgdownload.sys.ihex deleted file mode 100644 index 18b376a..0000000 --- a/firmware/slicoss/oasisdbgdownload.sys.ihex +++ /dev/null @@ -1,5124 +0,0 @@ -:1000000002000000004000000000010000000000AD -:10001000008000001500004081B200001B0000407D -:1000200081B200002100004081B2000003000040C6 -:1000300081B20000000000A898B001000480A24036 -:10004000FD7F00000900A249DD7D00000000004C9A -:1000500080B2010007000040D1B100000000004C58 -:1000600080B201000900A240757D000060000040E0 -:10007000619901000B00A8B17E3100000900004029 -:1000800081B2000000808F981831000010000098A5 -:1000900080E40100000041988094010000000040CD -:1000A00081B201001000009880E401000E00409829 -:1000B000809400001100004081B200000000004068 -:1000C000A59901001900294081320000190014BCD3 -:1000D000803200000E0093BC8032000000005040CF -:1000E00081B201000080004081B200001000004099 -:1000F000A59901001F002940813200001F0014BC97 -:1001000080320000120093BC80320000000050409A -:1001100081B201000180004081B200002000004057 -:10012000A59901002500294081320000250014BC5A -:1001300080320000140093BC8032000000000049AF -:10014000DD810100120100408132010033010040D5 -:10015000813201002A0014BC80320000FE0013BC72 -:10016000803200005495004045990100FFFF004097 -:10017000E599010000002F4049B101000000004056 -:10018000E1B1010000000040FDB3010000000040AB -:10019000FFB30100330018EE803200000000005071 -:1001A00089B001003200A24189500000990000404E -:1001B000813201003094004043990100000000F8B2 -:1001C00020B10100000000FAE0B30100390098EE10 -:1001D00080320000000000FB80B001003B0080F393 -:1001E000DE33000000000047FD9301003E0083F372 -:1001F00080320000F00000F38088010001800040A0 -:100200002EDD0100009400404399010000000046EB -:1002100043C10100000000FA24B101007C0018EE87 -:1002200080320000450095E880320000FFFF00E8C2 -:10023000808801007C0026408132000000000040E0 -:10024000D5990100000000F2ECB30100000000F8B5 -:10025000D6B1010008000040D5990100000000F06F -:10026000D6B10100FF0000F8EE8B0100080100404C -:10027000D5990100FF0000F0808C0100000000F71C -:100280008194010000000040D6B10100FF0000F899 -:10029000808801003C000040D5990100FF0000F07B -:1002A000D68D0100FFFF00F0F0DB010000000048E8 -:1002B00081E00100000000F8819401003C01004051 -:1002C000D599010000000040D6B10100FF0000F800 -:1002D000808801000000004881E00100000000F873 -:1002E000819401003C020040D599010000000040CB -:1002F000D6B101002C000040D5990100000000F8A3 -:10030000D6B101001E0000F082F40100FF3F00F8AA -:1003100080D80100640026408132000000000041C6 -:1003200081D00100FFFF004080D8010000000041A3 -:100330008094010000000040D8B10100680022FA5A -:10034000803000000000004C81E00100010000400E -:1003500080CC010000000040DEB10100000100403F -:10036000D5990100100000FA80E40100000000F6B9 -:100370008194010000000040D6B10100000200405D -:10038000D5990100100000FA80E40100000000F699 -:100390008194010000000040D6B101000600004039 -:1003A000D5990100100000FBD6E5010007000040D0 -:1003B000D5990100180000FBD6E501004800004077 -:1003C000D5990100100000FAD6E501005000004068 -:1003D000D5990100100000FBD6E50100030000FBE9 -:1003E0007A890100000000F0DCB101007C00004CC3 -:1003F000DD9100007C0095E88430000000002FE9CA -:10040000FAB3010000000040D1B10100FF0000423A -:10041000808801003400004080CE01007C00A640AE -:1004200081320000850000408132010002802240BC -:10043000803200007C00004081B200000000004FCC -:1004400081B001008E0009F9813200008C0008F9AA -:100450008132000098001FFDF93300008B009EFDE3 -:10046000813200000000004AF39301000000804840 -:10047000F3930100000000FDF7B301000000804984 -:10048000F3930100000000FC19B1010093000AF988 -:1004900081320000000040FB81B20100000041FDFC -:1004A00081B20100000780F9F38F0100000742F9D3 -:1004B000F38F01009700A2FFF76F00000000434098 -:1004C00081B201000000A2FFFBEF0000000080FCF1 -:1004D000E1B101000000804081B0010000940040C3 -:1004E00047990100BB000040813201000000A24694 -:1004F000FD7F01000094004047990100CE000040BC -:10050000813201000000A244FD7F01000094004000 -:100510004599010000000040F1B10100FF7F00405B -:10052000F5990100FF7F0040F59901009A13004002 -:10053000F599010007000040F59901000100004015 -:10054000F599010000020040F59901000200004009 -:10055000F599010000020040F599010003010040F7 -:10056000F599010000000040F59901009A13004040 -:10057000F59901000B000040F59901008000004052 -:10058000F599010000000040F599010000000040CD -:10059000F599010007000040F599010008000040AE -:1005A000F5990100B0020040F599010000000040FB -:1005B000F599010000000040F59901000229004072 -:1005C000F599010000000040F59901000067004026 -:1005D000F599010000000040F599010080000040FD -:1005E000F599010000008040F599010000000045E8 -:1005F000FD83010000000046FD830100FF7F0040F5 -:1006000025990100C4000040813201000000A2448D -:1006100080B2000000000045FD930100E2000040B0 -:10062000833001000000A2458032010000008046B6 -:10063000FD9301000010004083980100DD000040A0 -:100640002B3101000000A24688B0000000000041EC -:1006500089B00100000000948CB00100FFFF00464B -:1006600080880100A5A5A24080CE000000000048BF -:100670008DF00100C90082418940000000008040E7 -:1006800089B0010000000044FD830100D400004057 -:10069000813201000000A24480B20000E2000008A4 -:1006A000833001000000A245803201000000804438 -:1006B000FD93010000300008839801008000004095 -:1006C0002B990100DB000040893001000000A246A8 -:1006D00080B20000FFFF009480880100A5A5A24021 -:1006E000804E01000000804389B001000384004176 -:1006F0002C990100DE00004081B200000388004117 -:100700002C990100000000208DB0010000009F9690 -:1007100080B20000DF00A2418D5000000000804048 -:1007200081B20100FF7F0040259901000000004CCC -:1007300089E00100DD000044821401000000909473 -:100740008AB0000000000045F0B101001000004533 -:1007500088F401000000004489D00100DD0000445D -:100760002B410100EC00084180320000ED000094B4 -:1007700024B100001000009424F501000000009452 -:10078000F0B10100F200A04489500000DD000044F7 -:100790002B41010000000094F0B10100EF00204463 -:1007A000895000001000004588F40100000000FAA4 -:1007B0008AB001000000A34289D00000F700A0FA2F -:1007C0008A400000000000418BC00100F500A342F8 -:1007D00089500000FFFF0045888801001000004597 -:1007E0008AF40100FC0090448A40000000000041AF -:1007F0008BC00100FFFF00458AA801000000805067 -:100800008BE00100FF7F0040259901007C00004043 -:100810002B9901000030004083980100DD000008A2 -:1008200083140100000000942AB101000080004000 -:10083000F99B0100DD0000FC19310100000040942B -:1008400080B20100DD0000442B4101000000419412 -:1008500080B2010000000041F9C301000000004423 -:100860002BC1010004019F948032000002800040EF -:1008700081B200001001005193B000001001004D42 -:1008800093B000001001004993B000000000004246 -:1008900093B001001001A24193500000000080407D -:1008A00081B201000000104081B20100000011403F -:1008B00081B201000000124081B20100000013402B -:1008C00081B201000000144081B201000000154017 -:1008D00081B201000000164081B201000000174003 -:1008E00081B201000000184081B2010000001940EF -:1008F00081B2010000001A4081B2010000001B40DB -:1009000081B2010000001C4081B2010000001D40C6 -:1009100081B2010000001E4081B2010000001F40B2 -:1009200081B201000000704081B2010000007140FE -:1009300081B201000000724081B2010000007340EA -:1009400081B201000000744081B2010000007540D6 -:1009500081B201000000764081B2010000007740C2 -:1009600081B201000000784081B2010000007940AE -:1009700081B2010000007A4081B2010000007B409A -:1009800081B2010000007C4081B2010000007D4086 -:1009900081B2010000007E4081B2010000007F4072 -:1009A00081B201000000804081B2010000040040DB -:1009B000A199010000000050A1D1010000000040F9 -:1009C0001BB001000000004019B001000000004011 -:1009D00017B001000000004015B001000000004009 -:1009E00013B001000000004011B001000000004001 -:1009F0000FB00100000000400DB0010000000040F9 -:100A00000BB001000000004009B0010000000040F0 -:100A100007B001000000004005B0010000000040E8 -:100A200003B001000000004001B001003B0120487C -:100A3000A15100000000804081B201004701224B1B -:100A4000747D00000000804081B201006000004B16 -:100A500060990100000000B17EB101004801A8408A -:100A6000813200004501004081B200000500804055 -:100A700097980100180000AA9688010000008043A2 -:100A800097F00100070000AA96880100000080404E -:100A900081B201000000005807900100D89F00407B -:100AA00081B2000000000044A5B30100D80200405C -:100AB00081320100F8020040813201000000005C38 -:100AC00007900100D89F0040BFB300005A0122CC1C -:100AD000857F00000000005107900100D89F004072 -:100AE00081B200000000004049B10100AE0300CB1C -:100AF000A3C90100D0140040A19B01000000002008 -:100B000046B1010000000048F1B10100000000D032 -:100B1000F1B10100000000CAF1B10100000000D5F0 -:100B2000E1B10100070000406199010020000020B0 -:100B300062DD01006301A84081320000000000CCAA -:100B400085930100F802004081320100D01400407A -:100B500043990100000000FABAB30100000000FA56 -:100B6000A4B30100000000F8BCB3010000142F4042 -:100B700081B00100000000E7A7B30100000000D829 -:100B8000A9B30100FF0000DD8188010002000040E0 -:100B900080F401007301004080C80100860100DD7F -:100BA000813200000000004010B1000087010040C9 -:100BB00081B200008801004081B20000890100403C -:100BC00081B200008A01004081B200008B01004028 -:100BD00081B200008D01004081B200008F01004011 -:100BE00081B200005001004081B20000B601004017 -:100BF00081B200005001004081B20000C4010040F9 -:100C000081B20000C501004081B2000082020040B4 -:100C100081B200008302004081B22800B802004087 -:100C200081B22800D49F004081B22800D59F0040A7 -:100C300081B22800D69F004081B22800D79F004093 -:100C400081B228007201004181C02800550151493C -:100C5000FD9328005501524AFD932A00550155493C -:100C6000FD832A005501564AFD832A0050019181D7 -:100C700080302A005501454081B22A0050019182FE -:100C800080302A005501464081B22A000000004011 -:100C900089B02B0000002F4081B0010000140040FB -:100CA00049990100B30122DEE16D00000000004C13 -:100CB00049C101000000004181C001009201A2442D -:100CC000816C00000000004C49D101009A012240D3 -:100CD000E16D00009601A2418150000050010041E9 -:100CE000BFB3000000000042BFB301005001A00FDD -:100CF000BD6F0000000000DEE1B101000000004413 -:100D000049C10100B50100401999010000004240AD -:100D100081B20100000043FF85B00100000000DE49 -:100D200019B10100000042FF87B00100000043FF3D -:100D3000E1B101000000004449C1010000002FFFA3 -:100D4000E1B10100081400A480CC0100AA012640F2 -:100D5000813200000000004185C00100A801A24CC2 -:100D600081500000B40122D281320000AF01224143 -:100D7000A56F00005001A2E081320000000000D207 -:100D8000C1B301000000005C8990010000004042F6 -:100D900080B201000000414380B20100000000F079 -:100DA0008894010055010044E0B10000B101004801 -:100DB00049C10000AF01005B89900000A89F00A01E -:100DC0009EB000000000004083B00100001400400D -:100DD000499901000000234081B00100BE0122DEDC -:100DE000E16D00000000004C49C10100000000411D -:100DF00081C00100B901A244816C00005001004390 -:100E0000BFB30000000000F818B10100000040F876 -:100E100080B20100000041F080B2010000000040FB -:100E2000F1B1010000000040F1B1010055010040A6 -:100E3000E1B10000C601004091B000000000004197 -:100E400091B00100D0142E4049B1010005000040CE -:100E5000A39B0100080000DD81F40100CB010040EC -:100E600080C801000000004010B10000D101004026 -:100E700081B00000530100DEA1B30000E301004097 -:100E800081B20000E501004081B00000EB010040AC -:100E900081B20000520100DFE1B10000000000D08B -:100EA000BAB30100000000DEA1B10100020000D2CF -:100EB000A5E70100000000D2C1B30100000000005E -:100EC000F0B10100DB012244C1530000DA0184418A -:100ED00081400000DE01004081320100000000D0AE -:100EE00045B10100D5010041A1C10000DA02004076 -:100EF00081320100F802004081320100550100DD1D -:100F0000A1B100000000004081B00100400000409D -:100F1000A59B0100DA02004081320100400000D3AD -:100F2000A7CB0100F80200E0A5B3000003000040D9 -:100F3000A39B0100530100DEA1B3000000000044A8 -:100F4000BFB30100000000DE819001005001A2BA91 -:100F500080040000600000DE61990100E801A8B192 -:100F60008030000052010040E0B10000000000D0DD -:100F7000BAB301006B020040819801006002004D8D -:100F80008330010000000044E1B301000000004490 -:100F9000E3B3010000000044E5B301000000004499 -:100FA000E9B3010000000044EBB30100000000447D -:100FB000F5B3010000000044F7B301000000004455 -:100FC000F9B30100F90122408F6F00007802004060 -:100FD00081980100600200C7833001008002004058 -:100FE000819801006002004283300100000000E8A7 -:100FF000F1B10100000000E9F1B10100000000EAD8 -:10100000F1B10100000000EBF1B10100000000852A -:10101000F0B10100000000ECF1B10100000000EDB2 -:10102000F1B10100000000B2F0B10100000000A920 -:10103000F0B10100000000ACF0B10100000000AB15 -:10104000F0B10100000000B8F0B10100000000B9EB -:10105000F0B10100000000BAF0B10100000000BBD7 -:10106000F0B101000C02B8408130000000000040E7 -:10107000819001000E02B940813200000000004161 -:10108000819001001002BA4081320000000000424D -:10109000819001001202BB40813200000000004339 -:1010A000819001001402BC40813200000000004425 -:1010B000819001001602BD40813200000000004511 -:1010C000819001001802BE408132000000000046FD -:1010D000819001001A02BF408132000000000047E9 -:1010E000819001001C02C8408132000000000048CD -:1010F000819001001E02C9408132000000000049B9 -:10110000819001002002CA40813200000000004AA4 -:10111000819001002202CB40813200000000004B90 -:10112000819001002402CC40813200000000004C7C -:10113000819001002602CD40813200000000004D68 -:10114000819001002802CE40813200000000004E54 -:10115000819001002A02CF40813200000000004F40 -:10116000819001002C02F04081320000000000500C -:10117000819001002E02F1408132000000000051F8 -:10118000819001003002F2408132000000000052E4 -:10119000819001003202F3408132000000000053D0 -:1011A000819001003402F4408132000000000054BC -:1011B000819001003602F5408132000000000055A8 -:1011C000819001003802F640813200000000005694 -:1011D000819001003A02F740813200000000005780 -:1011E000819001003C02F84081320000000000586C -:1011F000819001003E02F940813200000000005958 -:10120000819001004002FA40813200000000005A43 -:10121000819001004202FB40813200000000005B2F -:10122000819001004402FC40813200000000005C1B -:10123000819001004602FD40813200000000005D07 -:10124000819001004802FE40813200000000005EF3 -:10125000819001004A02FF40813200000000005FDF -:101260008190010000000040F0B10100400000400A -:10127000A59B0100D802004081320100F802004025 -:1012800081320100D0142E06A5B30100400000D326 -:10129000A7CB0100000000F0F1B10100000000F157 -:1012A000F1B10100000000F2F1B10100000000F412 -:1012B000F1B10100000000F5F1B10100000000FAF9 -:1012C000F1B10100000000FBF1B10100000000FCE1 -:1012D000F1B10100000000EBF1B10100000000EEEF -:1012E000F1B10100000000EFF1B10100000000F3D6 -:1012F000F1B10100000000F6F1B10100000000FDB5 -:10130000F1B10100DB0100C7E1B100000000804045 -:1013100081B20100660200488032000000005140A6 -:101320001AB1010000004D4081B2010000004540AB -:1013300081B201006302A241835000005F02494074 -:1013400081B20000000052401CB1010000004E407C -:1013500081B201000000464081B201006802A24152 -:10136000835000005F024A4081B20000000000A0EC -:101370009EB0010000000080D8B30100000000A171 -:10138000D0B30100000000A2D2B30100000000A40D -:10139000D4B30100000000D0D6B30100000000D19A -:1013A000DCB30100000000D2DEB3010000000088C1 -:1013B000DAB30100000000D48EB30100000000D3B6 -:1013C000E6B30100000000ACECB30100000000999E -:1013D000FAB30100000000D5E0B30100000000D521 -:1013E000E2B30100000000D5E4B30100000000D525 -:1013F000E8B30100000000D5EAB30100000000D509 -:10140000F4B30100000000D5F6B30100000000D5E0 -:10141000F8B30100000000C7A9B101000000004FAF -:1014200040B101008402004091B000000000004182 -:1014300091B0010007000040A39B0100080000DDFF -:1014400081F401008802004080C8010000000040D3 -:1014500010B100008D02004081B2000098020040EF -:1014600081B2000098020046A3B300009B02004036 -:1014700081B20000A102004081B200008F0223501F -:10148000A56F000000000050A5B30100E802004273 -:10149000A5630100F802004081320100D0142D4004 -:1014A00049B10100000000D0BAB30100000000DE25 -:1014B000A1B10100000000F800B001009702224431 -:1014C000A553000094020041A1C10000550100DDB8 -:1014D000A1B10000E80200DEA1330100F8020040E3 -:1014E000813201005501004081B20000000000453A -:1014F000BFB301005001A2D2777D0000000000D2EE -:1015000061B10100000000DE63B101009E02A8404D -:10151000813200005501004081B20000E802005411 -:10152000A5330100F802004081320100D0142D40A3 -:1015300049B10100000000F8D0B30100000000F83C -:10154000D2B30100000000F8D4B30100000000F89D -:10155000D6B30100000000F808B10100AC02004061 -:10156000819801006002004683300100550100406F -:1015700081B20000000000A09EB00100000000E861 -:1015800043B10100000000E945B10100000000EA9C -:1015900049B10100000000EBA1B101000000004FC3 -:1015A00040B101000400004081B20000040000408E -:1015B00081B200000400004081B20000040000403D -:1015C00081B200000400004081B20000040000402D -:1015D00081B20000D0142E4049B101000500004046 -:1015E000A39B010000000040C1B30100080000DD22 -:1015F00081F40100BD02004010C90000C3020005D3 -:1016000081B000005001004081B20000CB02000513 -:1016100081B000005001004081B20000D0020044BF -:10162000A5B30000D2020044A5B3000002000040B0 -:10163000A4E70100000000E081B10100FFFF00C14C -:10164000F0890100C802224181500000C40200411B -:10165000C1C30000DA02004081320100F8020040FC -:10166000813201005501004081B2000002000040BB -:10167000A4E70100000000E091B10100FFFF00C9F4 -:10168000F0890100C802224181500000CC020041D3 -:10169000C1C30000FFFF00DE85890100C80200C24F -:1016A000E0B10000FFFF00DE95890100C80200CA1A -:1016B000E0B100000400004081B2000004000040DE -:1016C00081B200000400004081B20000040000402C -:1016D00081B20000000000E7A7B30100000000D8BD -:1016E000A9B301000000004049B10100AE0300CBE6 -:1016F000A3C901000000002046B10100000000D293 -:10170000F1B10100000000D3F1B10100000000D4EC -:10171000F1B10100000000D0E1B10100000000D1F2 -:1017200061B101002000002062DD0100E202A8405A -:1017300081320000000080CC85930100040000404D -:1017400081B200000400004081B2000004000040AB -:1017500081B20000000000E7A7B30100000000D83C -:10176000A9B301000000004049B10100AE0300CB65 -:10177000A3C901000000002046B10100000000D212 -:10178000F1B10100000000D0F1B10100000000D370 -:10179000F1B10100E10200D4E1B100000400004019 -:1017A00081B200000400004081B20000040000404B -:1017B00081B200000400004081B20000040000403B -:1017C00081B200000400004081B20000040000402B -:1017D00081B200000000A2CC85FF00000000005094 -:1017E00081B00100FA02A24181500000F902A2F288 -:1017F00080300000000080CC8583010004000040A0 -:1018000081B200000400004081B2000004000040EA -:1018100081B20000B5030040A199010000002F41F2 -:1018200099B301000A032244816C0000120322488C -:10183000816C00000C03224C816C000016032250C6 -:10184000816C000017032254816C00001903225898 -:10185000816C00001E03225C816C0000500100407E -:1018600081B20000000000BC09B00100DD9F00CA89 -:1018700001B000000000004003B001000000004182 -:10188000F38301001003A242056C00000000004138 -:1018900005B00100DD9F22CA07140000DD9F00454E -:1018A000F3930000DD9F2043956F0000DD9F80CA09 -:1018B00005300000DD9F220180300000DD9F00CB5D -:1018C000DB910000570100BCABB30000000000BC7E -:1018D000B1B30100DD9F00CACFB30000FF0000CA12 -:1018E00081880100DD9FA240747D000060002040DF -:1018F000609901001B03A8B1823000001A03004068 -:1019000081B20000DD9F00CA79B3000004000040EE -:1019100081B200000000004E81B0010000000043D1 -:10192000CB8301000000454081B201002203A241A7 -:10193000815000000000454081B201000000454098 -:1019400081B201002D039182823000000000008AE4 -:1019500080B00100AE9F004080CE01002B03A64066 -:10196000813200002D03564081B20000B5030040D3 -:10197000A19901000000005307900100B503004049 -:10198000A19901000000005207900100D89F00417A -:101990008BB300000000004E81B001000000004247 -:1019A000CD8301000000464081B201003203A24114 -:1019B000815000000000464081B201000000464016 -:1019C00081B201003D039181823000000000008956 -:1019D00080B00100AE9F004080CE01003B03A640D6 -:1019E000813200003D03554081B20000B503004044 -:1019F000A19901000000005207900100B5030040CA -:101A0000A19901000000005307900100D89F0041F8 -:101A10008BB30000B0030040A1990100C4142F4013 -:101A200099B301005701004049B100000400004093 -:101A300081B200000400004081B2000004000040B8 -:101A400081B200000400004081B2000004000040A8 -:101A500081B200003094004043990100009000F8EA -:101A600080980100100000F288E40100200000408E -:101A7000209901000000005F239101004D031F9198 -:101A80008032000030000040209901000000005F1B -:101A90002391010050031F9180320000400000405C -:101AA000209901000000005F2391010053031F9162 -:101AB000803200000000005F2391010055031F9158 -:101AC000803200000008804020990100040000409E -:101AD00081B200000000004784B001000000A2486D -:101AE000848400000000005F61B101000000005C20 -:101AF0008F9001000000004762B101005A03A84026 -:101B000081320000000800478EC801005803005CC5 -:101B10008F800000E00000406199010058152D40C1 -:101B20008DB00100D0142DF088B00100000000FA43 -:101B30008AB001000000004581B0010007000045A7 -:101B400082880100000000438BF001000000004883 -:101B500083E0010000000046829401002000004163 -:101B600060990100000000418DC001007403225FF4 -:101B70008D6C00006503A2418150000063030040AA -:101B800081B2000008000040859801000000004478 -:101B900082B001000000004186B00100001C00433B -:101BA00086D801000000A641855001007003004165 -:101BB00083E000006E030040813201000000004815 -:101BC00085E00100D0142F468494010020000042DB -:101BD00060990100C0000040619901000000804050 -:101BE00081B201000400004081B200000400004006 -:101BF00081B200000400004081B2000004000040F7 -:101C000081B200000400004081B2000004000040E6 -:101C100081B20000070000458088010000000043F9 -:101C20008BF0010000040040839801008503A0416F -:101C3000815000008303004182E8000000008041E1 -:101C40008EC001000400004081B20000040000408A -:101C500081B200000000004049B1010000020040D4 -:101C600083980100003900404599010000000040C0 -:101C7000F1B101008B03A24183500000000000403D -:101C800085B001000B00004482F401001A1500A683 -:101C900086B0010070150040459901000008004021 -:101CA000F199010000000042F0B10100003900404C -:101CB000E1990100040000406199010070150043A2 -:101CC000629901009503A840813200009703225ACF -:101CD000737D00007A000040619901009803A8B16B -:101CE0007E3100000008004284C801009003A24138 -:101CF000835000000000804081B2010004000040D9 -:101D000081B200000400004081B2000004000040E5 -:101D100081B2000058152D408DB00100D0142DF077 -:101D200088B00100000000408FB00100010000A653 -:101D300090B0010000F800489098010000000045B4 -:101D400093B00100000000FA8AB001008003004057 -:101D500081320100020000A680B00100AC032240E5 -:101D6000826C0000B0030040813201005803004043 -:101D700081320100000000418DC00100B503225FE7 -:101D80008D6C0000A703A24193500000A503004002 -:101D900081B20000FF070047848801000000A640D0 -:101DA00081B20000ED9F0047803001000002004733 -:101DB0008EC80100B003004081B200000000004462 -:101DC00050B30100BB032018896C0000040000A67A -:101DD00084B00100200000A686B001000010004081 -:101DE000559B0100BE03004081B20000040000A624 -:101DF00084B00100200000A686B001000010004061 -:101E0000559B01000000004250D30100000000A8D3 -:101E10004FB30100000000434ED301006E030040A9 -:101E2000813201008203004280300100B003004093 -:101E300081320100C70322A78F6C00005A030040C3 -:101E400081320100C403004081B2000000008040E4 -:101E500081B20100C8142EBB85B00100000000EE65 -:101E600082B0010000000041E0B10100000000A2CA -:101E7000A0B3010000000044A5B30100E19F00CA27 -:101E8000A7330100E09F004081B200000400004041 -:101E900081B20000D6032242756F0000D8032241B0 -:101EA000756F0000DA031ECA81320000DC031FCA0E -:101EB00081320000000000CAC9B10100DD9F00426C -:101EC00075B30000000000CACDB10100DD9F0041E4 -:101ED00075B30000000000CACFB10100DD9F0040D3 -:101EE00075B30000008100A6C6B10100DD9F00406F -:101EF00081B20000008000A6C6B10100DD9F004055 -:101F000075B300000400004081B2000004000040EE -:101F100081B200004501004D933001004501004EA3 -:101F2000933001004501004C93300100EC9F0040CC -:101F300081320100DD9F004081B2000004000040BA -:101F400081B200000400004081B2000004000040A3 -:101F500081B200005495004045990100DD9F00CA00 -:101F6000E5B100000400004081B200000400004020 -:101F700081B200000400004081B200000400004073 -:101F800081B200000400004081B200000400004063 -:101F900081B20000CC142E4087B00100000000A2E6 -:101FA000A0B3010015040043B2330100000068DA59 -:101FB00089B001007C0000408B98010000000050B7 -:101FC00089F001000000004189D0010003000044B5 -:101FD000888C01000000004487C00100000000411F -:101FE000A5B3010015040043B2330100000000DA7C -:101FF000F1B101000000004487C001000000004171 -:10200000A5C301000B042244895000000B042244A4 -:102010008B500000FA03A250A56F000000000042A0 -:10202000A5E30100000000CAA7B30100E19F00BBC7 -:1020300085300100CC142ED295C30100AE0300CB35 -:10204000A3C901000000002042B1010000000050BF -:1020500081B001000804A241815000000704A2F2EF -:1020600080300000FA030040A5B3000000000042E9 -:10207000A5E30100000000CAA7B30100E19F00BB77 -:1020800085300100E09F004081B200000400004064 -:1020900081B20000000000D92BB101000010004007 -:1020A00083980100DB00004081320100FFFF0094B3 -:1020B000B48B01000000804081B20100000000D913 -:1020C0002BB101000010004083980100DD000040AA -:1020D0008132010000008094B4B30100040000408C -:1020E00081B200000400004081B200000400004002 -:1020F00081B200000400004081B2000004000040F2 -:1021000081B200000400004081B2000004000040E1 -:1021100081B20000000000D92BB10100000000DAFC -:1021200027B1010006C000402D990100DE000040EB -:1021300081320100001000408398010002C4004178 -:102140002C990100DE000040813201000040004077 -:1021500083980100058200412C990100DE000040B7 -:10216000813201002D048094803200000C01004077 -:10217000813201002804004081B200000480004048 -:102180002D990100DE0000408132010000008040F6 -:1021900081B201003104001210C9000000488040E3 -:1021A0000B980100C04980400B980100804B804093 -:1021B0000B980100404D80400B980100004F80407B -:1021C0000B980100C05080400B9801008052804065 -:1021D0000B980100405480400B980100005680404D -:1021E0000B980100C05780400B9801008059804037 -:1021F0000B980100405B80400B980100005D80401F -:102200000B980100C05E80400B9801008060804008 -:102210000B980100406280400B98010000648040F0 -:102220000B980100C06580400B98010080678040DA -:102230000B980100406980400B980100006B8040C2 -:102240000B980100C06C80400B980100806E8040AC -:102250000B980100407080400B9801000072804094 -:102260000B980100C07380400B980100807580407E -:102270000B980100407780400B9801000079804066 -:102280000B980100C07A80400B980100807C804050 -:102290000B980100407E80400B9801000400004034 -:1022A00081B200000400004081B200000400004040 -:1022B00081B200000400004081B200000400004030 -:1022C00081B200000400004081B200000400004020 -:1022D00081B200005904001210C900000080804043 -:1022E0000B980100008280400B9801000084804020 -:1022F0000B980100008680400B9801000088804008 -:102300000B980100008A80400B980100008C8040EF -:102310000B980100008E80400B98010000908040D7 -:102320000B980100009280400B98010000948040BF -:102330000B980100009680400B98010000988040A7 -:102340000B980100009A80400B980100009C80408F -:102350000B980100009E80400B98010000A0804077 -:102360000B98010000A280400B98010000A480405F -:102370000B98010000A680400B98010000A8804047 -:102380000B98010000AA80400B98010000AC80402F -:102390000B98010000AE80400B98010000B0804017 -:1023A0000B98010000B280400B98010000B48040FF -:1023B0000B98010000B680400B98010000B88040E7 -:1023C0000B98010000BA80400B98010000BC8040CF -:1023D0000B98010000BE80400B98010004000040F3 -:1023E00081B200000400004081B2000004000040FF -:1023F00081B200000400004081B2000004000040EF -:1024000081B200000400004081B2000004000040DE -:1024100081B200000000004087B1010000000040D0 -:1024200097B001000000004B80B10100010000A640 -:1024300082B1010082048541974000000000004005 -:1024400097B101000000004097B001000000004B70 -:1024500090B10100010000A692B1010087048541FE -:10246000974000000000804081B20100040000405D -:1024700081B200000400004081B20000040000406E -:1024800081B200000400004081B20000040000405E -:1024900081B2000090046040813200000000001210 -:1024A00080B10100FFFFF04B82890100930460407E -:1024B000813200000000004A80B101000100F0A656 -:1024C00082B101009604604081320000FFFF004BA2 -:1024D000848901000000F0C224B001000000004A1D -:1024E00090B10100FFFF804B928901000000004A7B -:1024F00090B10100010080A692B10100FFFF004BE6 -:1025000094890100000080CA94B0010004000040DA -:1025100081B200001000004E98E4010000000007A6 -:10252000989401000000004399E001000000008041 -:10253000989401000000004999E001000000004C5F -:1025400088940100A604474081320000AD04222097 -:10255000876F000000001F4081B2010000000040B2 -:1025600081B201000000004081B201000000004083 -:1025700081B20100A604004081B2000000001F806B -:1025800086B30100B004224F777D0000C0040040F4 -:10259000813201000000004F61B1010000000044E1 -:1025A00062B10100B104A84081320000B804224B9E -:1025B000897C0000B604224F777D0000C0040040F3 -:1025C000813201000000004562B10100B604A8405C -:1025D000813200000000802087B301000400004029 -:1025E00081B200000400004081B2000004000040FD -:1025F00081B200000400004081B2000004000040ED -:1026000081B200000400004081B2000004000040DC -:1026100081B200000000005099B001006F0000403E -:1026200061990100C104A8B152330000C604224BD5 -:10263000537F00006F00004061990100C404A8B1FD -:102640007E310000C104A241995000000000A24F59 -:1026500077FD00000400004081B20000040000404B -:1026600081B200000400004081B20000040000407C -:1026700081B200000400004081B20000040000406C -:1026800081B200000400004081B20000040000405C -:1026900081B200001000004E98E401000000000725 -:1026A000989401000000004399E0010000000080C0 -:1026B000989401000000004899E00100D604004C05 -:1026C00088940000D604474081320000DD042220B7 -:1026D000876F000000001F4081B201000000004031 -:1026E00081B201000000004081B201000000004002 -:1026F00081B20100D604004081B2000000001F80BA -:1027000086B30100E004224F777D0000F004004012 -:10271000813201000000004F61B10100000000445F -:1027200062B10100E104A84081320000E804224ABD -:10273000897C0000E604224F777D0000F004004011 -:10274000813201000000004562B10100E604A840AA -:10275000813200000000802087B3010004000040A7 -:1027600081B200000400004081B20000040000407B -:1027700081B200000400004081B20000040000406B -:1027800081B200000400004081B20000040000405B -:1027900081B200000000005099B001006F000040BD -:1027A00061990100F104A8B152330000F604224AF5 -:1027B000537F00006F00004061990100F404A8B14C -:1027C0007E310000F104A241995000000000A24FA8 -:1027D00077FD00000400004081B2000004000040CA -:1027E00081B200000400004081B2000004000040FB -:1027F00081B200000400004081B2000004000040EB -:1028000081B200000400004081B2000004000040DA -:1028100081B200007B000040619901000005A8B171 -:102820008030000012051D4080320000401800403A -:1028300049990100040000A686B001001005A240DD -:1028400086040000DE9F9C4080320000FFFF0040B5 -:1028500088880100300500504731010036000044EF -:1028600088CC01000C055240813200003005004048 -:10287000473101000000004189B0010030050048E7 -:10288000473101003005000547310100DE9F00405F -:1028900081B200002800004047991B00DE9F0041E4 -:1028A000E1C11A007818004049991B00190522540B -:1028B000817C1A001405424081321A00008200B364 -:1028C00067DF1B0000001A4493931B0028000040A0 -:1028D00047991B00300500418930010027050F4052 -:1028E00080320000FF7F00408888010030050050E2 -:1028F000473101003600004488CC01001F05994093 -:10290000803200000000004889D0010021059B4072 -:10291000803200000000004C89D0010023051F44D4 -:1029200080320000300500404731010000000041C6 -:1029300089B00100300500484731010030050058DA -:1029400047310100DE9F004081B2000010000040CE -:1029500086F401006F00004386880100DE9F260593 -:10296000473100003005004189300100DE9F004002 -:1029700081B200000400004081B200000400004069 -:1029800081B200000400004081B200000400004059 -:1029900081B200000000A044F041010000000040AE -:1029A00081B2010000008041E1C10100040000404B -:1029B00081B200000400004081B200000400004029 -:1029C00081B200000400004081B200000400004019 -:1029D00081B200004C010007913001000000A240CC -:1029E00097EC00000000800591C001000400004049 -:1029F00081B200000400004081B2000004000040E9 -:102A000081B200000400004081B2000004000040D8 -:102A100081B200004C010040813201004405A24017 -:102A2000976C00003A000040B39B01004505004050 -:102A300081B2000040000040B39B01001004004040 -:102A400081320100000000DAF5B1010010040042FB -:102A5000B3430100000000DAF5B1010010040042A8 -:102A6000B3430100000000DAF5B101004E00004060 -:102A7000B39B01001004004081320100080000DA1D -:102A8000F7F5010050000040919801000000004758 -:102A90008FB0010010040048B2330100000000DADA -:102AA000F7B10100080000DAF7F50100000000426C -:102AB00091C001005005A2418F500000000000416C -:102AC00045D1010008000040B39B01001004004004 -:102AD00081320100000000DAFDB101000A0000406F -:102AE000B39B01001004004081320100000000DAB5 -:102AF000FDB101001A000040B39B0100100400402A -:102B000081320100000000DAFDB101001800004030 -:102B1000B39B01001004004081320100000000DA84 -:102B2000FDB1010038050040813201001E0000485F -:102B3000B2CB01001004004081320100000000DA35 -:102B400091C0010000000048B2CB01001004004019 -:102B50008132010000006EDA8FB0010002000048EF -:102B6000B2CB01001004004081320100000000DA05 -:102B7000FDB1010004000048B2CB01001004004088 -:102B800081320100000080DAFDB101000400004044 -:102B900081B200007A052245FD7F0000401600400A -:102BA00045990100DB9F00404931010008000048C1 -:102BB000B2CB010015040040813201007805A2402B -:102BC0008F6C00007D052220B56F00007A05004063 -:102BD00081B20000DA9F004081321F007D05224053 -:102BE000976C1E007A05424081321E000000004FA3 -:102BF00067931F00DF9F005867931E005416004024 -:102C000047991F00000000FEF4B11F0000000040C3 -:102C100081B21F00000000FEF4B10100000000407E -:102C200081B20100000000FEF4B10100000000408C -:102C300081B20100000000FEF4B10100000000407C -:102C400081B20100000000FEF4B10100000000406C -:102C500081B20100000000FEF4B10100000000405C -:102C600081B20100000000FEF4B101004600004006 -:102C7000B39B01001004004081320100080000DA1B -:102C8000F7F501004800004095980100000000445D -:102C900097B001001004004AB2330100000000DACE -:102CA000F7B10100080000DAF7F50100000000426A -:102CB00095C001009005A241975000002A000040F5 -:102CC000A59B010040160040A19B0100000000CA26 -:102CD000A7B30100E19F00BB85300100E09F0040E9 -:102CE00081B200000400004081B2000004000040F6 -:102CF00081B200000400004081B2000004000040E6 -:102D000081B200000400004081B2000004000040D5 -:102D100081B20000B8052245FD7F0000E0150040AB -:102D2000479901001A0000A280DC01000000005059 -:102D3000F1B10100F0150040F1990100000000CA56 -:102D4000F1B101000700004061990100200000403E -:102D500062DD0100A705A8BBE131000000000050C2 -:102D600083B00100AA05A24183500000A905A2F288 -:102D7000823000004C01004081320100B005A240C9 -:102D8000976C00003A000040B39B0100B105004081 -:102D900081B2000040000040B39B0100F0150040EC -:102DA000439901001004004081320100B805A2FAE5 -:102DB000B46F000010040042B3430100B805A2FA4A -:102DC000B46F000010040042B3430100BB0522FAB7 -:102DD000B46F0000B8054240813220000000004E70 -:102DE00067932100DF9F0058679320004016004042 -:102DF00045992100DB9F004049312100F615004034 -:102E0000439921005C1600404599210000006EFAAC -:102E10008EB021000000004081B20100000000FEE1 -:102E2000F4B101000000004081B20100000000FE8A -:102E3000F4B101000000004081B20100000000F088 -:102E4000B4B30100C905A2408F6C0000FC1520201E -:102E5000E1B10100CE05004081B22400DA9F0040BC -:102E600081322500CE052240976C2400CB054240DC -:102E7000813224000000004F67932500DF9F005837 -:102E80006793240038050040813225001E00004869 -:102E9000B2CB25001004004081320100D30522503E -:102EA000B56F00000000005091C001000000004814 -:102EB000B2CB0100F615004043990100200400F256 -:102EC000B433010002000048B2CB0100F815004005 -:102ED00043990100200400F2B433010004000048CB -:102EE000B2CB0100FA15004043990100200400F222 -:102EF000B433010008000048B2CB0100FC150040CB -:102F000043990100000000F094B00100FFFF004A67 -:102F1000B48B010020040040813201000A00004807 -:102F2000B2CB01001000004AB4F7010020040040B9 -:102F30008132010038050040813201001E00004846 -:102F4000B2CB01001004004081320100E90522509B -:102F5000B56F0000EA050050B5B300000000004066 -:102F6000B5B301002004004081320100E09F004021 -:102F700081B200000400004081B200000400004063 -:102F800081B200000400004081B200000400004053 -:102F900081B2000000160040479901003031004026 -:102FA000F599010032330040F599010034350040B5 -:102FB000F599010036370040F59901003839004095 -:102FC000F599010041420040F59901004344004059 -:102FD000F599010045460040F59901004748004039 -:102FE000F5990100494A0040F59901002C00004084 -:102FF0008398010000000040F7B10100FC05A241E8 -:103000008350000080162E0683B00100360000FBBE -:10301000F6A90100FF05A2418350000022000040F4 -:1030200083980100000000FBF6B101000206A241F6 -:10303000835000006200004095980100DC9F004032 -:103040008132010000162D0683B001008016004079 -:10305000459901005C0000FBF6A901000806A241A9 -:103060008350000000000070F9B101000000007101 -:10307000F9B1010000000072F9B101000000007315 -:10308000F9B1010000000074F9B1010054000040E2 -:1030900095980100DC9F0040813201000000007023 -:1030A00095B0010014062270B56F00000000804149 -:1030B00097B001000000804097B00100040000407C -:1030C00081B200000400004081B200000400004012 -:1030D00081B20000456700A6E0B201000123007044 -:1030E000E19A0100CDEF00A6E2B2010089AB0071C8 -:1030F000E39A0100BA9800A6E4B20100FEDC007277 -:10310000E59A0100321000A6E6B201007654007381 -:10311000E79A0100D2C300A6E8B20100F0E1007412 -:10312000E99A01008016004A44C901000000000726 -:1031300081B001000000004A80D001000000004082 -:10314000F7B101002506A241815000008016004A17 -:1031500044C90100FC162A47E7B501000300004AF4 -:10316000E8E50100000000408DB001005003004080 -:10317000A399010080163D468DE00100000000503B -:1031800089B00100000000FC40B0010000000041D7 -:10319000A3C101002E06A24189500000000000706A -:1031A000EBB2010000000071EDB2010000000072FE -:1031B000EFB2010000000073F1B2010000000074E2 -:1031C000F3B201000000004083B001000F00004195 -:1031D0008088010050030040A2C901004B06A050A6 -:1031E000836C00000D00004098C801000000004FF3 -:1031F000998401005003004CA2C901000000002086 -:1032000086B001000800004098C801000000004F8F -:10321000998401005003004CA2C901000000002065 -:1032200086A401000200004098C801000000004F81 -:10323000998401005003004CA2C901000000002045 -:1032400086A4010050030040A2C901000000004311 -:1032500040A401000100002088E401000000005F9C -:1032600041F0010000000044409401000500007599 -:1032700089E401001B00007585F401000000004492 -:10328000849401005506A353836C0000000000766F -:1032900089B00100000000778984010000000076F9 -:1032A0008BB00100000000208BA40100000000781A -:1032B0008B840100640600458894000027000041CB -:1032C00080CE01005A06AA4081320000000000763C -:1032D00089B001000000007789A40100640600782D -:1032E00089A400003B00004180CE01005706AA409F -:1032F000813200000000007689B0010000000077F4 -:1033000089840100000000768BB001000000007885 -:103310008B840100000000458894010000000077C4 -:103320008BB00100000000788B840100640600452A -:10333000889400000000004484C00100000000796F -:1033400085C001000000002084C001006B06A3536B -:10335000836C0000825A00A684C001009979004263 -:1033600084C801007806004081B2000027000041B7 -:1033700080CE01007006AA4081320000D96E00A6FE -:1033800084C00100A1EB004284C80100780600401F -:1033900081B200003B00004180CE01007506AA40CA -:1033A000813200001B8F00A684C00100DCBC0042FB -:1033B00084C801007806004081B2000062CA00A6FD -:1033C00084C00100D6C1004284C8010078060040D4 -:1033D00081B2000000000078F3B201000000007725 -:1033E000F1B201001E00007689E4010002000076BF -:1033F000EFF6010000000044EE96010000000075A9 -:10340000EDB2010000000042EAB2010000000041FC -:1034100083C001004F00004180CE010037062A40E2 -:103420008132000000000075E1C20100000000765A -:10343000E3C2010000000077E5C20100000000784F -:10344000E7C2010000000079E9C201002B068141BA -:103450008D4000000000804081B201000400004067 -:1034600081B200000400004081B20000040000406E -:1034700081B200000400004081B20000040000405E -:1034800081B200000400004081B20000040000404E -:1034900081B2000000000050FD9301004016004082 -:1034A00045990100DB9F00404931010008000048B8 -:1034B000B2CB01001504004081320100B906224060 -:1034C0008F6C0000DA9F004081320100B906A240F3 -:1034D000976C00005E160040439901007C1620F6B0 -:1034E000E0B101000000004031B301009D06224F11 -:1034F0008F7C000000000051FD9301009F062240D8 -:103500008F7C0000A3060054FD930000A106224218 -:103510008F7C000000000052FD930100A3062241B1 -:103520008F7C000000000053FD930100B70622517C -:10353000FD7F000038050040813201000C0000488A -:10354000B2CB01001004004081320100B206A2405B -:10355000B56F00001E000048B2CB01001004004807 -:1035600096300100000000DA97C001000400004B13 -:10357000B2CB010010040040813201000E0000486F -:10358000B2CB010020040040813201000C00004851 -:10359000B2CB010000000030B5B3010020040040B0 -:1035A000813201000E000048B2CB0100100400403F -:1035B00081320100B6062240B56F0000BA06005401 -:1035C000FD93000000000051FD8301001C0000FE7F -:1035D0007FD90100BA06A6408132000000000055E4 -:1035E000FD9301000000804081B201000400004012 -:1035F00081B200000400004081B2000004000040DD -:1036000081B200000400004081B2000004000040CC -:1036100081B20000E79F004081320100C406225CB5 -:103620001F7C0000E39F00881CB00000E99F005C45 -:103630001F00010000002E0548B1010000000040FD -:10364000E1B1010004002D0348B10100000000F0C9 -:103650003CB001002800001402C801000000000175 -:1036600034B0010000002D0532B001002200000539 -:103670000AC801001000000348C90100000000F85A -:1036800018B00100000000F804B00100000000F8CC -:103690000EB001000C0000A40CC80100EA9F00401D -:1036A000813201000000004023B001000A0722011E -:1036B0008032000000003C4423E0010000002EA402 -:1036C00080B001000000001048C10100D906A30726 -:1036D000026C0000DA0668011AB0000000006807FA -:1036E0001AB001000000000D02D00100000000052A -:1036F000F0B101000000000CF0B101000000000278 -:10370000E0B101000000000D0AC00100EC062240FB -:10371000036C0000E6062242236C0000000000411A -:1037200023C001000000004761B10100200000A497 -:1037300062DD01002307284081320000E3060040DB -:1037400081B200000000001080C0010000000047AE -:1037500061B101000000004062B10100E806A8402C -:1037600023300000E39F00881CB0000023070040C6 -:1037700081B200000000001080C00100000000477E -:1037800061B101000000004062B10100EE06A840F6 -:1037900023300000E39F00881CB0000022000019C5 -:1037A00048C9010000002D1448C101000F0000F2BB -:1037B0003A880100000000423BE001000E000014C6 -:1037C00002C801000000001D02C00100FA06231A11 -:1037D000025000000000004603C001002307000162 -:1037E00034C000000C002D1D48C10100F00000F2A3 -:1037F000308801000000004231F001000000001498 -:1038000002B001000000001D02C00100000000180D -:1038100002C001000207221A025000002307000123 -:1038200034C000002200001948C9010002002D1414 -:1038300048C10100000000F614B001000000001DA6 -:1038400014D001000000001814D001000000001E78 -:1038500024B001001200001710C801002307001A4D -:1038600010C0000000003C4423E00100000000A460 -:1038700086B0010000002E1048C101000F07A312FE -:103880000E6C0000100760071AB000000000601204 -:103890001AB001000000680D16940100FFFF000B34 -:1038A00016D8010000000008F0B101000000000C73 -:1038B000F0B1010000000002E0B1010000000010C2 -:1038C00086C001000000004661B1010020000043F5 -:1038D00062DD01001707A85C1F1000004007220DE1 -:1038E000145000004007220D245000000000000D7D -:1038F00010C001001E072242236C00002307004174 -:1039000023C000000000004661B10100400000102B -:1039100062DD01001F07A85C1F000000E39F008814 -:103920001CB000000000004023B001003F07A20DC2 -:103930000E5000002E0722461F7C000000000046AB -:103940001F8001003080001042C901002C0722F2C4 -:10395000640600000000004761B101004000001053 -:1039600062DD01002907A84081320000E39F008842 -:103970001CB0000020800003469901000000005F99 -:10398000E191010000002D0648B10100000000F89F -:1039900018B00100000000F804B0010033071FF068 -:1039A0000E300000D306004C0DC0000000002E5F5A -:1039B0000F800100D3062307146C000030000010B4 -:1039C00048C9010024000040F199010000000003F3 -:1039D000F0B1010000000000F0B10100000000168D -:1039E000F0B101002400000000C801000000004701 -:1039F00061B10100200000A462DD01003C07A8467F -:103A00001F100000D30600030CB00000D306000D09 -:103A100018C000005F07A2441F7C000000000019CE -:103A20000AB001002200000548C901000A002D1457 -:103A300048C1010002002040E5B10100040020401F -:103A4000E5B101000D002D1D48C10100090000F382 -:103A5000388801000D002050E7B1010004002D401E -:103A60003FB00100000000F432B00100040020402B -:103A7000E1B101002200000548C9010000002D1439 -:103A800048C101000200001D94F401000000004044 -:103A900091B001005207A0FC9040000000000041DE -:103AA00091C001005007A24195500000000000A401 -:103AB00096B0010004002E0548B101000000004846 -:103AC000F0B101000000004B48B1010000000018F7 -:103AD00048C101000200001894F4010000002D18F4 -:103AE00090B001005C07A0FC904000000000004185 -:103AF00091C001005A07A241955000000000004803 -:103B0000E0B1010010002040E5B1010004002D05E6 -:103B100048B10100000000F880B02D00000000F066 -:103B200016B02D002200000548C92D000000001429 -:103B300048C12D00640743303D072C000000009E63 -:103B400085B02D0000001B413DC32D000400204224 -:103B5000ECB12D000000001E82B0010002002E1DFD -:103B600082C001000000661882C00100000000420F -:103B700080C001006E07A0418044000000000041A9 -:103B800081C001001000004092F401000A002E30B4 -:103B900081840100720790409240000000000041C3 -:103BA00093C001000000662093A401000000001DE6 -:103BB00048C1010004002019E8B101000000001E06 -:103BC00016C001007807A01916440000000000414B -:103BD00017C001000D002F1E32C001007D07A2405A -:103BE000156C00007C07A01C16400000000000417E -:103BF00017C00100000063F33894010010000005B5 -:103C000048C9010004002E1E98B001000000601A8F -:103C100098C001000C002040E1B101008B07224652 -:103C20001F7C0000000000461F8001003080001053 -:103C300042C90100890722F2640600000000004723 -:103C400061B101004000001062DD01008607A8405C -:103C500081320000E39F00881CB000002080000338 -:103C6000469901000000005FE191010030800010E2 -:103C700044C901001200001AF0C901000000001739 -:103C8000F0B1010010000005E0C901003000001093 -:103C900080C801000000004461B101002000004024 -:103CA00062DD01009107A840813200009B07225C81 -:103CB0001F7C000000003C4423E0010000002D10A8 -:103CC00048C101009B0722F2640600000000004684 -:103CD00061B101004000001062DD01009807A840BA -:103CE00081320000E39F00881CB00000EB9F005C65 -:103CF0001F00010020002F0548B101000000000B4B -:103D0000E4B101000000005017F00100A10790F29B -:103D1000164000000000004117C0010000006620AE -:103D200017A40100100000142AC801000000001DA3 -:103D30002AC00100000000502BE00100000000F24A -:103D40002A9401003080001042C90100AC0722F221 -:103D5000640600000000004461B101004000001052 -:103D600062DD0100A907A84081320000E39F0088BE -:103D70001CB000000080001710DC0100C9072240C1 -:103D8000156C0000B407A2441F7C00000000004432 -:103D90001F900100B307229F136C000002000088EF -:103DA0001CCC0100E49F004081B2000000000041F3 -:103DB0003FC30100E69F004081320100B707A241E6 -:103DC000877C00000000001E3EC00100C9072240A1 -:103DD000156C0000BA07201E146C00000000000AD9 -:103DE0003CB00100E59F001E24300100BF072208FF -:103DF0002E3000000000005211C001000000001A27 -:103E000010C001002307004017B00000E49F0088A5 -:103E10001CB00000E59F004081320100BC07A208F1 -:103E20002E300000808000A604B001000600004093 -:103E300087980100008000034499010004002204D7 -:103E4000E0310000E89F001F8C30010000000040BE -:103E50000FB00100E29F005C1F9000000080000393 -:103E60004499010004002204E0310000E69F004074 -:103E700081320100CE07A241877C0000CF07001EDF -:103E80003EC000000000001F8CB001000000004098 -:103E900005B00100E89F00400F300100E29F005C88 -:103EA0001F9000000400004081B2000004000040A8 -:103EB00081B200000400004081B200000400004014 -:103EC00081B200000400004081B200000400004004 -:103ED00081B200000400004081B2000004000040F4 -:103EE00081B200000400004081B2000004000040E4 -:103EF00081B200000400004081B2000004000040D4 -:103F000081B200000400004081B2000004000040C3 -:103F100081B200000400004081B2000004000040B3 -:103F200081B200000400004081B2000004000040A3 -:103F300081B200000400004081B200000400004093 -:103F400081B200000400004081B200000400004083 -:103F500081B200000400004081B200000400004073 -:103F600081B200000400004081B200000400004063 -:103F700081B200000400004081B200000400004053 -:103F800081B200000400004081B200000400004043 -:103F900081B200000400004081B200000400004033 -:103FA00081B200000400004081B200000400004023 -:103FB00081B200000400004081B200000400004013 -:103FC00081B200000400004081B20000F70700BC8D -:103FD00080B200000380004081B2000003800040F6 -:103FE00081B200000380004081B2000003800040E5 -:103FF00081B200000380004081B2000003800040D5 -:1040000081B200000380004081B2000003800040C4 -:1040100081B200003180004081B200003480004055 -:1040200081B200003580004081B2000004000040F1 -:1040300081B200001B80818080320000E787A240AF -:10404000916F00000000004C90B301005C952EA21F -:1040500080B00100FF000080F489010090952AC81B -:10406000E5B10100000000A1F0B101000000004036 -:10407000F0B10100000000A4F0B10100000000D088 -:10408000F0B10100000000D1F0B10100000000D249 -:10409000F0B101000000004CF0B10100000000D4BC -:1040A000F0B10100000000D3F0B10100000000EE0B -:1040B000F0B101000000004EF0B10100000000402E -:1040C00044B1010018801181983000000000514077 -:1040D00081B201001A801182983000000000524025 -:1040E00081B20100E7870048FD930000B60300405D -:1040F000A19901002380A242FD7F00002080008062 -:1041000080320000228011818230000022805140E4 -:1041100081B2000022801182823000002280524051 -:1041200081B200002C800048FD93000027800080B1 -:10413000803200002680A253077C0000000051530B -:10414000079001002A800052079000002980A252A7 -:10415000077C00000000525207900100000000534D -:104160000790010000000048FD9301000000004698 -:10417000F39301005C952EA252B30100FF00008072 -:10418000F48901000000004CE4B10100000000A926 -:1041900045B101003080004C80B200000000454075 -:1041A00081B201000000554081B20100C682054085 -:1041B00049B10000C682054049B100000000054039 -:1041C00049B101004C010040813201000000004B68 -:1041D000DEB2010000000040FD9301000000004835 -:1041E000FD830100020000409B9B0100000000A530 -:1041F0009CB30100480300408132010058952044DF -:10420000E0B101000494004043990100000000F275 -:1042100024B10100000C00EE968801000000004A65 -:1042200097F001004480A243976C00000000004218 -:10423000FD93010000C000A636B10100D01400407B -:104240004799010005000040F59901000038004041 -:10425000F599010000060040F599010003000040B7 -:10426000F599010005100040F59901000209004090 -:10427000F599010004000040F59901006003004039 -:10428000813201008803004081320100A003004018 -:1042900081320100B982004081320100B1820040C8 -:1042A0008132010060952040E1B10100709520400D -:1042B000E1B1010000000049DD9101000000004073 -:1042C00091B30100000000407BB30100A0980040C2 -:1042D000813201000000004085B301005C95204060 -:1042E000E1B101003C8200408132010090060040B3 -:1042F000813201000000005F2F810100A281004097 -:1043000081320100A5980040813201000000454043 -:1043100081B201000000554081B2010001830040DC -:1043200081B200000400004081B20000040000409F -:1043300081B200000400004081B20000040000408F -:1043400081B200000400004081B20000040000407F -:1043500081B200002800004047990100C682004158 -:10436000E1C1000078180040499901001905225464 -:10437000817C00006C80424081320000008200B4E9 -:1043800069DF010000001A449393010028000040F7 -:10439000479901001805004081B200000400004068 -:1043A00081B200000400004081B20000040000401F -:1043B00081B200000400004081B20000040000400F -:1043C00081B200000400004081B2000004000040FF -:1043D00081B2000055820040813201007D80224080 -:1043E000976C00007A804240813200000000004F4C -:1043F00069930100438100586993000054160040FE -:1044000047990100000000FEF4B101008005004062 -:1044100081B2000080804240813200000000004EE6 -:1044200069930100438100586993000040160040E1 -:10443000459901004005004049310100F615004052 -:10444000439901005C1600404599010000006EFA96 -:104450008EB00100C105004081B2000004000040A0 -:1044600081B200000400004081B20000040000405E -:1044700081B200000400004081B20000040000404E -:1044800081B200000400004081B20000040000403E -:1044900081B200009680004081B200005582004049 -:1044A0008132010096802240976C00009380424048 -:1044B000813200000000004F6993010043810058E1 -:1044C0006993000038050040813201001E00004859 -:1044D000B2CB0100D005004081B2000004000040D2 -:1044E00081B200000400004081B2000004000040DE -:1044F00081B200000400004081B2000004000040CE -:1045000081B200000400004081B2000004000040BD -:1045100081B200008302004081B20000B802004076 -:1045200081B20000D49F004081B20000D59F0040BE -:1045300081B20000D69F004081B20000D79F0040AA -:1045400081B200007201004181C000005501514953 -:10455000FD9300005501524AFD9300005501554955 -:10456000FD8300005501564AFD83000050019181F2 -:10457000803000005501454081B200005001918219 -:10458000803000005501464081B20000000000402C -:1045900089B00100000000F880B00100000000F0C8 -:1045A00016B001002200000548C9010000000014F7 -:1045B00048C10100B48043303D0700000000009E68 -:1045C00085B0010000001B413DC3010004002042F2 -:1045D000ECB101000000A240916F0100000000401A -:1045E00049B10100AE0300CBA3C9010000000020C7 -:1045F00046B10100C480A240E16D0000000000D27D -:10460000F1B10100000000D3F1B10100000000424F -:10461000F0B101000000004561B101002000002060 -:1046200062DD01000000A8D0E1B10000C1800040BF -:1046300081B20000000000A898B001000480004092 -:104640008BB30000B1030040A1990100C980A242D0 -:10465000976F000000000045A1C1010000000000AC -:1046600080B001000000A2048094000080153F4249 -:1046700097E301000000004049B101000000600321 -:10468000029401000000004007B00100040000CBCC -:1046900099CB0100000000CCF3830100D380A2423B -:1046A000976F0000000000CBF3930100AE0300CB36 -:1046B000A3C901000000002044B101000000004433 -:1046C000F1B1010000000000F0B1010000000004A1 -:1046D000F0B10100000000A1E0B1010005000040C0 -:1046E000619901002000002062DD0100DA80A8400D -:1046F00081320000F9020020423101000000A24195 -:10470000056C0100000080CBDB9101000000194125 -:104710008BB301006000004061990100E080A8B106 -:104720008C3300006000004061990100E280A8B174 -:1047300094330000E88014C681320000180000C6DF -:1047400083F401002283224F83040000C4800040D0 -:1047500081B20000FF0100C681880100000000C690 -:1047600097A30100C4801F5C975300006D821EC692 -:1047700081320000F2802248FD7F0000F280225842 -:10478000816C0000F2802248816C0000C000004073 -:1047900084CC0100F2809F428032000022830040DE -:1047A00081B20000C480A2C68F060000C4801EC66D -:1047B0008132000000002F4381F00100F6800040AC -:1047C00010C900004481004081B200007E81004099 -:1047D00081B20000398200CA63B3000075810040D5 -:1047E00081B200005581004D83B000006081004E11 -:1047F00061B100004C81004085B000005581004C43 -:1048000083B000002E81004085B00000F881004098 -:1048100049B1000086810040C1B10000F481004030 -:1048200081B200004C81004085B00000F0030040E0 -:1048300049B10000228300CA9BB300009081004070 -:10484000C1B1000094810040C1B100009B810040D3 -:10485000C1B100009C810040C1B100009D810040B9 -:10486000C1B100009E810040C1B100009F810040A5 -:1048700081B000009F81004181B000002D82004086 -:1048800081B20000AE8200BBABB300003A8200CA26 -:10489000CFB30000C803004049B10000E803004066 -:1048A00081B20000C480004081B200002283004039 -:1048B00081B20000E003004081B20000228300CA00 -:1048C00077B300005681004D83B000005E81004E3A -:1048D00061B100004C8100BB85B000005681004CE6 -:1048E00083B000004C8100BB85B000002E8100BB6E -:1048F00085B000002081004081B20000228300CA00 -:104900004DB300007005004049B10000A005004013 -:1049100049B10000268122428F6F00002881224188 -:104920008F6F00002A811ECA813200002C811FCAAD -:1049300081320000000000CAC9B101002283004298 -:104940008FB30000000000CACDB1010022830041F6 -:104950008FB30000000000CACFB1010022830040E5 -:104960008FB30000008100A6C6B101002283004081 -:1049700081B20000008000A6C6B101002283004081 -:104980008FB30000781800404999010010002F9C57 -:1049900089B00100468100403933010018002F9B87 -:1049A00089B00100468100403733010000002F9A92 -:1049B00089B00100468100403533010008002F997D -:1049C00089B001004681004033330100008000AE11 -:1049D00047C90100C480A240E16D00008000004092 -:1049E000F1990100000000CAF1B10100000000428D -:1049F000F0B1010040180040E199010000000045BD -:104A000061B10100200000AE63DD0100418128405A -:104A1000813200003E81004081B20000418142406D -:104A2000813200000000005C6993010022831A4477 -:104A3000939300004481424081320000438100583A -:104A40006993000000000044F0D101000000A44080 -:104A500081B200004B81A240E16D000000000044E3 -:104A600045D1010000008040E1B10100000080411B -:104A7000E1D101004C81375C61310000000000424F -:104A800062B1010052812840813200004D81225CD8 -:104A9000777D0000C480174081B200004D81004046 -:104AA00081B20000000000CA63B101005281A84039 -:104AB000813200002283174081B2000057810040FC -:104AC00081B00000578100BB81B0000000000041B0 -:104AD00060B10100C480A241767D0000000000406A -:104AE00062B101005981A84081320000000000CA73 -:104AF00063B1010022832840813200005B810040C5 -:104B000081B200005095004047990100618100BBCF -:104B100087B0000050952F4087B00100658122408A -:104B2000957F0000C480A240E16D0000C480224057 -:104B3000956F0000228360409583000002002DF0F5 -:104B400084B00100C4802240856C0000C480A24073 -:104B5000857C0000C480A24E777D000069813640CC -:104B6000813200000000004262B101006A81A84069 -:104B7000813200000000004362B101006C81A84056 -:104B800081320000000000CA63B101006E81A840BC -:104B9000813200000000164081B201007481224180 -:104BA00043510000000800CA95CB01006881004114 -:104BB00085C0000022830040E1B100007781A2425D -:104BC000676F00000000004167B301007781424039 -:104BD000813200000000004065B301000000004089 -:104BE0009383010000001ACA6997010022832640BE -:104BF000813200007C8142408132000022831A44CD -:104C000093930000C4802043956F0000228380CAE4 -:104C10006733000022832240656F0000C480A248F1 -:104C2000DB7D00002283006FDB91000085000040E7 -:104C30008132010035802240803200002283004012 -:104C400081B2000000000058959301000000005F51 -:104C5000959301008C81A244216F00000000005F49 -:104C6000958301000000005E95930100000000574D -:104C700095930100000000CAC3B101008F81225B3F -:104C8000957F00000000004BFD930100228300404F -:104C900081B200001BFD00CA959B01000D0100CAF6 -:104CA000C53101000000005F95830100228300CA26 -:104CB000C5B10000DF6F00CA959B010000000055E0 -:104CC00095930100000000CAC7B101002283225F52 -:104CD000957F00000D010040813201000000005F5F -:104CE00095830100228300CAC7B10000228300CA55 -:104CF000C9B10000228300CACBB10000228300CAE0 -:104D0000CDB10000228300CACFB1000000002E42C6 -:104D100081E001009814004048C90100228300CAC4 -:104D2000E1B100000000004009B10100200000A630 -:104D300082B00100A481A25E0B7D000000800041D2 -:104D400008990100A681A25E0B7D0000208000A6CC -:104D500008B10100A8819F8582300000000000306A -:104D600083840100DD812230836C0000A781A24F83 -:104D70000B7D00000000004121B30100028000A66D -:104D800082B0010028820040813201001000004101 -:104D900084E40100038000A682B001002882004064 -:104DA00081320100F0FF00418688010000000043CD -:104DB000849401000F0000A686B0010010C40043D7 -:104DC00086980100BD81A243846C0000000000436E -:104DD00021B30100200000A682B001001C000041A8 -:104DE00082DC0100BA81A25E0B7D0000040000415C -:104DF00008990100CF81004081B20000410100A666 -:104E000086B00100500C004386980100C281A24385 -:104E1000846C00000000004121B30100CF810040FC -:104E200081B20000410100A686B00100600C004381 -:104E300086980100CF81A243846C000000000042EC -:104E400021B30100188000A682B001002882004032 -:104E500081320100FFFF004182880100007700419C -:104E6000828C010001020041829801002000004173 -:104E700082DC01001800004182DC0100CD81A25ECD -:104E80000B7D00000000004108B10100200000A6D9 -:104E900082B00100D081A25E0B7D00004013004172 -:104EA00008990100D8812243216F0000200000A64C -:104EB00082B001001200004182DC0100D581A25EB7 -:104EC0000B7D00000004004108990100F3810040BF -:104ED00081B20000200000A682B00100190000414C -:104EE00082DC0100DA81A25E0B7D000000A000419F -:104EF00008990100F381004081B2000000000044E5 -:104F000021B301000000004083B001000000005FF9 -:104F1000839001000000005E8390010000000057B4 -:104F20008390010000000041C2B101000C0100406B -:104F3000813201000000005F838001000000004119 -:104F4000C2B101000C01004081320100200000A626 -:104F500082B001000400004182DC01002000004119 -:104F600008990100200000A682B001001100004154 -:104F700082DC0100EC81A25E0B7D0000010000419B -:104F800008990100200000A682B00100EF81A25E16 -:104F90000B7D00004013004108990100010000A6AC -:104FA00082B00100400000412E99010000008040C5 -:104FB00081B20100200000A680B00100000000CAFC -:104FC00081940100F681A25E0B7D000022830040E7 -:104FD00008B10000C8142EBB85B00100F981A25EA3 -:104FE0000B7D00000000004087B0010008822243D2 -:104FF000216F000017822244216F0000118000A65B -:1050000082B0010028820040813201001F82224AC2 -:10501000837C000000000040879001000382224D45 -:10502000837C000000000041879001000582224F30 -:10503000837C000000000043879001000782224E1D -:10504000837C000000000042879001001F82004026 -:1050500081B20000018000A682B0010028820040D9 -:1050600081320100018000A682B001002882004048 -:10507000813201001F822242837C00000000004038 -:10508000879001001C8000A682B0010028820040A9 -:105090008132010012822245837C00000000004121 -:1050A0008790010014822244837C000000000043AA -:1050B0008790010016822243837C0000000000429A -:1050C000879001001F82004081B20000018000A68D -:1050D00082B001002882004081320100018000A6D8 -:1050E00082B0010028820040813201001F822242EA -:1050F000837C000000000040879001000000004316 -:10510000879001000000004187900100008000A608 -:1051100082B0010028820040813201002382224BAC -:10512000837C0000000000408780010000000043F5 -:10513000E0B10100FF7F00A2A08B0100000000444D -:10514000A5B30100B88000CAA73301004181004027 -:1051500081B200002000004182DC01002982A25EB1 -:105160000B7D00000000004108B101002B829F85EB -:10517000823000000000804081B20100308214F7CC -:10518000813000003082A249FD7F0000000000480D -:10519000FD930100338215F8811400003382A24A86 -:1051A000FD7F000000000048FD9301003582A2C889 -:1051B000813200004000004080DC0100001000400F -:1051C00080DC010000000040EFB301003782424064 -:1051D000F13300004381004068970000228300BB48 -:1051E0006BB30000228300BBB1B3000022830040F8 -:1051F00081B20000000300408198010000000040DF -:1052000018B101008000004083980100001900409F -:10521000459901000000424081B20100000043FFB7 -:10522000F1B10100000000FFF1B1010000000041F8 -:1052300081C001000000004018B101004082A2417D -:1052400083500000001600404599010000190040FD -:10525000439901000000004743C1010000000040E5 -:1052600083B00100000000F380B001000000005B8B -:1052700081D001000000004180D00100000000400A -:10528000F6B101000000005B43C1010000000041D5 -:1052900083C001004A82A254836C000000000040D9 -:1052A000F7B101000000004183C001005182A20655 -:1052B000836C00000000804081B2010000160040B5 -:1052C0004399010080162E0683B00100360000FBD2 -:1052D000F6A901005782A24183500000220000403D -:1052E00083980100000000FBF6B101005A82A24140 -:1052F000835000006200004095980100DC9F004050 -:105300008132010000162D0683B001008016004096 -:10531000459901005C0000FBF6A901006082A241F2 -:105320008350000000000070F9B10100000000711E -:10533000F9B1010000000072F9B101000000007332 -:10534000F9B1010000000074F9B1010054000040FF -:1053500095980100DC9F0040813201000000007040 -:1053600095B001006C822270B56F00000000804192 -:1053700097B001000000804097B00100C480A242B5 -:10538000976F0000B6030040A199010000002F4272 -:1053900099B3010078822244816C00008082224807 -:1053A000816C00007A82224C816C00008582225040 -:1053B000816C000086822254816C00008882225811 -:1053C000816C00008D82225C816C000050010040E5 -:1053D00081B20000000000BC09B00100228300CAB5 -:1053E00001B000000000004003B0010000000041D7 -:1053F000F38301007E82A242056C000000000041A0 -:1054000005B00100228322CA07140000228300464F -:10541000F393000022832043956F0000228380CA0B -:10542000053000002283220180300000C480A248A1 -:10543000DB7D0000228300CBDB910000570100BC24 -:10544000ABB30000000000BCB1B30100228300CA6E -:10545000CFB30000FF0000CA818801002283A24070 -:10546000747D000060002040609901008A82A8B12C -:10547000823000008982004081B20000228300CA8D -:1054800079B300000000004E81B00100000000432D -:10549000CB8301000000454081B201009082A2410F -:1054A000815000000000454081B2010000004540ED -:1054B00081B201009B829182823000000000008A4C -:1054C00080B00100AE9F004080CE01009982A640CE -:1054D000813200009B82564081B20000B60300403A -:1054E000A19901000000005307900100B60300409D -:1054F000A19901000000005207900100D89F0041CF -:105500008BB300000000004E81B00100000000429B -:10551000CD8301000000464081B20100A082A2417B -:10552000815000000000464081B20100000046406A -:1055300081B20100AB8291818230000000000089BD -:1055400080B00100AE9F004080CE0100A982A6403D -:1055500081320000AB82554081B20000B6030040AA -:10556000A19901000000005207900100B60300401D -:10557000A19901000000005307900100D89F00414D -:105580008BB30000B1030040A1990100C4142F4067 -:1055900099B301005701004049B10000A0942E4387 -:1055A00097B0010000000040F1B10100B282A241B9 -:1055B0009750000050952040E1B10100AC942E437B -:1055C00097B0010000000040F1B10100B682A24195 -:1055D000975000000000804081B20100AE030040FF -:1055E000A39901000000004081B001006015004057 -:1055F000859801000800004040E4010000000059C7 -:10560000419401000000005041E001000000004210 -:10561000409401000000005741900100000000414B -:1056200081C001000000A342816C01000000004124 -:10563000A3C10100BC82A042816C0000BC8200506A -:1056400085C000000183A241017D0000CF82225865 -:10565000737D00007800004061990100C782A8B105 -:105660009C300000300038459DE001000400A25F3E -:105670001F7C00000400225E1F7C000000C000A60A -:105680001EA401000100000E10C90000CF8233C427 -:1056900081300000D282A1AD9D200000C68213405F -:1056A00081B200000000134E5A83010030003845DB -:1056B0009DE001000400A25F1F7C00000400A25EC8 -:1056C0001F7C00000400A240056C0000DD8222ABBC -:1056D00080040000DB82A240017D0000DD82225FA9 -:1056E000577D00001288005F1FB40000DD82225E3B -:1056F000577D00008088005F1FB40000E3822254C1 -:10570000737D00007400004061990100DD82A8B142 -:10571000003000000000005F1FB40100F784A25FAA -:10572000017C00009587004081B20000E582A25F05 -:1057300059270000E782A25C737D0000EE82A25E22 -:10574000737D0000FA82225C737D0000FB8237408B -:10575000813200007C00004061990100E882A8B11C -:10576000363000007C00004061990100EA82A8B157 -:10577000003000001F000000028801003785175F1D -:105780001FB40000FB823440813200007E000040E4 -:1057900061990100EF82A8B112300000F782522116 -:1057A00013040000000014412FC301000000005F3B -:1057B0001FB40100FF3F0009008C010000000043FE -:1057C00001F001004F83003413840000FF3F1409EF -:1057D000008C01000000005F1FB40100C48300437F -:1057E00001F000000000004081B20100FB82334064 -:1057F000813200000400A24E5A7F00000700004ED4 -:1058000080E401000039004080C801000400A2408B -:10581000066C0000C682134E5A930000E787A24828 -:10582000FD7F0000058302E681320000068383E5E8 -:10583000813200008E82004297B300009E820042B7 -:1058400097B3000009832246F37F00000C83A24136 -:10585000F37F0000C6800042973301000C8322448E -:10586000F37F00000C83A241F37F0000C680006F2D -:10587000973301000400A2AC803200001183225A49 -:10588000737D00007A000040619901000E83A8B189 -:105890007E310000010000CF11C900001783A24033 -:1058A000937F000017832244937F0000138342A557 -:1058B000803000001683A240937F000038831A4096 -:1058C0009393000000001A4081B20100DF80A240E3 -:1058D000737D0000E2872244216F0000D9872240B7 -:1058E000657D00000005A25B737D00000400A249F5 -:1058F000337D000021832248337D0000FF010099A1 -:1059000080D801000000005081E00100A8982F40DD -:1059100033B1010000000040E0C1010001830040FC -:1059200081B20000C68200408BB300000400A25E7A -:105930001F7C00000400225F1F7C00000000005E4E -:105940001F900100C682005F1F8000000400A25E5D -:105950001F7C00000400225F1F7C00000000005E2E -:105960001F9001000000005F1F8001000000005830 -:1059700061B101000000004E62B10100C682284002 -:10598000813200002C83004081B200000000004002 -:105990000FB001000400A25E1F7C00000400225F23 -:1059A0001F7C0000328333401F3000000400A24EF1 -:1059B0005A7F00000700004E80E4010000390040DB -:1059C00080C801000400A240066C0000C682134E8D -:1059D0005A9300003A83A0CE815000004D83A0CDA1 -:1059E000816C0000000000A59CB30100000000B124 -:1059F00081B001004D8322B58114000080152F4035 -:105A000049B101003E83424081320000000060B491 -:105A100065970100D0152E4069B3010000001A44BB -:105A20009383010004002240E16D00001A0000A2EF -:105A300080DC010000000044F1B10100000000B171 -:105A4000F1B10100000000B5F1B101000500004016 -:105A5000619901008000004062DD01004883A8A137 -:105A6000E0310000178300889EB300001783A24135 -:105A7000676F00001783006FDB9100004D83424089 -:105A80008132000017831A40938300000004004015 -:105A900089980100099900008A3001000400A25A87 -:105AA000017C000004002240016C00000099000904 -:105AB00046C901003F0000F30C8801005C83A64248 -:105AC000136000009B9600950330010057836140EE -:105AD0008132000075000040619901005883A8B12F -:105AE0000C300000A9967110943001005D830058BD -:105AF0001F9000008D9600950330010023830088DD -:105B00001CB0000000002D0348B1010004002DF07E -:105B10002EB0010080040017968801000400A64002 -:105B2000813200004AC1001796D801000400A64047 -:105B300081320000EE070040979801006883234BF4 -:105B4000E46D00006883224BFD7F000000000040F0 -:105B50001F90010022002F4081B201006B83831748 -:105B60008032000026000040479901006D838517B0 -:105B7000803200000000004847C1010073832255B5 -:105B80002F7C00000000004243D101000F0000FA0A -:105B9000968801000000004297E0010000000042EA -:105BA00097D001007483004B44C10000120000A292 -:105BB00044C90100280000F602CC01000A0000A13F -:105BC00042C90100000000F816B00100000028F0F2 -:105BD00010B00100000000F01AB00100000000A2A7 -:105BE0002AB00100C0283C460DE0010000002D4411 -:105BF00095B001008083A2F80E300000908322410E -:105C00009550000000002D5049C101007C830040E8 -:105C100081B200007D83A2F8166C00007D83A2F89B -:105C2000106C00007D83A2F01A6C00008E83225855 -:105C30001F7C000000993F4213F0010085836540FE -:105C4000813200008983A2F3740600000000000680 -:105C5000E69501008E83754081B2000000000006C9 -:105C600096B001003F0075F30C880100000000555C -:105C700061B101000000004B62B101008C83A840BB -:105C8000813200008E836740813200009683774125 -:105C90002DC30000948322581F7C00000000005593 -:105CA00061B101000000000662B101009283A840CA -:105CB000813200009483674081320000D5837741B0 -:105CC0002DC30000030000071AF401001895000717 -:105CD00016300100A8832241816C00009C8322427F -:105CE000816C0000238300881CB00000A783225F22 -:105CF0000F7C00004E96005F01100100A28322403D -:105D0000956C00000480000342C90100000000F20D -:105D100002B00100A595005295300100AC95004BF2 -:105D200002B000000000005F0F800100010400408D -:105D300089980100099900008A300100B496000991 -:105D400096300100F08700400FB00000B783A25AE0 -:105D50001F7C00000400A25A1F7C000000B5000D4B -:105D600042C901000400220BE67D000000B7000DCF -:105D700042C901000400220BE67D0000709400403F -:105D800081320100B7832220856C0000B2839C0F12 -:105D900080320000238300881CB000008D95005CD9 -:105DA0001F000100C8970042613101002383008871 -:105DB0001CB00000900400079630010000002D0583 -:105DC00048B101000400A24BE17D00000400A25C88 -:105DD0001F7C000000002D0548B10100BB8382F04C -:105DE000183000006C8900458FB00000282000A604 -:105DF00096B00100C18322179604000034040040CD -:105E000089980100099900008A3001005B97004BD6 -:105E1000953001006C89004B8FB000005D96000347 -:105E200048310100AF930040813001006C8900408F -:105E300081B20000000000400FB0010000040040EB -:105E400089980100099900008A300100040022406D -:105E5000016C000000002E1048B1010000006850E5 -:105E600003B0010000000003F0B101004000000099 -:105E7000E0C9010000002E5049C10100000000509F -:105E8000F1B1010000000003F0B101000000004288 -:105E900061B101002000001062DD0100D083A84044 -:105EA000813200001000001062C90100D283A800F6 -:105EB000E0310000238300881CB0000000002D03A7 -:105EC00048B10100000000400FB00100000000F8E0 -:105ED0002EB00100000000F202B0010000000040FE -:105EE00017B00100004100A696B00100EE072E4752 -:105EF00097900100E883221796040000E683224B66 -:105F0000FD7F0000E68323A2026C0000A5950052ED -:105F10009530010004002241975000000C002D0034 -:105F200012B00100000000F000B001000000005CB1 -:105F300001800100AC95004B02B000000000000998 -:105F400000B001000000005003B001000584005CB7 -:105F500017900000FA8322432F7C000000000045C8 -:105F60001F900100F383225F2F7C000000002E10A1 -:105F700048B1010000000058F1B101001000000319 -:105F8000F0C9010010000000E0C90100EF83624287 -:105F9000613100000000001062B10100F083A840F0 -:105FA00081320000238372881CB0000020002D0382 -:105FB00048B10100FF0F00F680880100F783A2A618 -:105FC000816C0000FA8300F23AB00000F484A24B26 -:105FD000FD7F0000C9940040813201000688004026 -:105FE00081B200000584224A2F7C000005842248EB -:105FF0002F7C00000A002D0348B101003F0000F291 -:10600000868801001F0000438488010005000043CA -:1060100080F4010098943D4281E001000584A24291 -:10602000E07D0000F484A24BFD7F0000C994004095 -:10603000813201000688004081B200000204004065 -:1060400089980100099900008A300100078469409D -:1060500081320000000000A309B001000000794176 -:1060600047C301000400A0A1096C00000E8422A116 -:10607000096C0000278300881CB000000A8400031C -:1060800048B100004884A392036C00002B980040A4 -:10609000953001000000004143C3010000000016DC -:1060A00080B2010006882708803200001584225C37 -:1060B000177C0000168400002AB0000012000000C7 -:1060C0002AC801000200000880C801001A84A24307 -:1060D0002F7C00005E970040813201003684005E14 -:1060E00017900000040000018CCC01005E97004C6A -:1060F0000330010000002E4602B001001000001025 -:1061000048C901000C000001F0CD01002C00004046 -:10611000F0C9010000000016F0B1010010000015E8 -:10612000E0C901000000004361B10100A00000A42B -:1061300062DD01002384A854171000003684005E3D -:1061400017900000120000002AC801003584224385 -:106150002F7C0000040000018CCC01000000004CEA -:1061600003B001007F9700436131010000002E461B -:1061700002B001001000001048C901000C0000012D -:10618000F0CD01000C000009F0C90100000000186A -:10619000F0B1010010000015E0C90100000000434B -:1061A00061B10100A00000A462DD01003684285422 -:1061B000171000003284004081B200007F97004336 -:1061C00061310100388422502F7C0000000000560D -:1061D0001790010007000017988801003B84A24136 -:1061E000996C00000000005517900100000000436A -:1061F00061B101004000001062DD01003C84A84054 -:1062000081320000238300881CB0000066970040A4 -:1062100081320100438422432F7C0000168000035A -:1062200044C901000000001DE4B101000097005EB8 -:10623000051001004684A25F2F7C000086930001B8 -:1062400038430100C99400408132010006880040B3 -:1062500081B200004A84A24BFD7F0000F18400411E -:1062600043C300000000004027B0010000000040D0 -:106270002DB001000000004011B001004D84350137 -:10628000863000006D00004061990100568428B1FD -:10629000303000004E84224D757D00000000001655 -:1062A00080B20100DD84A740116C000000000041B5 -:1062B00043C301000400A240276C0000F0840040AA -:1062C00081B200006D000040619901005684A8B1C0 -:1062D000123000000000001680B201006084A74068 -:1062E000116C00000000004143C3010000000009E0 -:1062F00010B00100000000182CB00100DE070043C0 -:1063000080CE01004E84AA408132000065840040A6 -:1063100081B2000040003E4327E001000000000978 -:10632000F0B1010000000018E0B1010000000041E0 -:1063300027C001004E84A30B8750000000001540C9 -:106340001BB001000000004023B001000400A203C4 -:10635000486D0000120000002AC8010040002D40D6 -:1063600039B001006F84A240276C000022000008B1 -:1063700012C801000400A216306C0000DE070040C5 -:10638000259801007284004081B20000000000F8EE -:1063900012B00100000000F030B001000000000B5E -:1063A00025B001000000001032B0010014002001EF -:1063B000E0B10100EE070040379801007784230127 -:1063C000366C00000000000136B00100828482417A -:1063D000234000002080001042C901007E8422403A -:1063E000E36D00000000004361B1010040000010B7 -:1063F00062DD01007B84A840813200002383008895 -:106400001CB00000F3940043233001000000001092 -:1064100032B001000000004123B001000000000381 -:1064200048B101000080001944C90100938422454D -:106430001F7C00000400A241236C00000400A20B9A -:10644000256C00000000004CF1B1010000000009C3 -:10645000F0B1010000000018F0B10100000000439D -:1064600061B101002000001962DD01008A84A815D5 -:10647000E03100000000005003D001000000005097 -:1064800033C001000000004C25D001000C002D4C51 -:1064900013C001000000005037D001000000005080 -:1064A0002BC00100778400451F8000009584A31253 -:1064B000366C00009684681B28B00000000068124B -:1064C00028B0010000000009F0B101000000001830 -:1064D000F0B101000000004361B10100200000198B -:1064E00062DD01009984A815E0310000C184221406 -:1064F000025000000000005033C0010000000014F2 -:1065000024D001000C002D1412C00100B984A21483 -:1065100036500000A984225C1F7C000030800010EF -:1065200042C90100A7842240E36D00000000004240 -:1065300061B101004000001062DD0100A484A840A8 -:1065400081320000238300881CB00000000000039B -:1065500048B101000C002D5C1F800100100000F00C -:106560002AC801000000005C2B80010004002250BA -:106570002B6C0000F007004037980100AF84230126 -:10658000366C00000000000136B00100BA84221B06 -:10659000026C00003000001048C9010000002E5CB1 -:1065A0001F90010000000050F1B101000000000345 -:1065B000F0B10100FF070015E08D0100000000426E -:1065C00061B10100A00000A462DD0100B684A84012 -:1065D00081320000BA84000348B1000000000014BA -:1065E0002AC001007784A240256C00000000004111 -:1065F00039C0010004002013386C000040003D4306 -:1066000039E001000000000B25B00100000000F897 -:1066100012B00100778400F030B000000400A25CEA -:106620001F7C00000080001942C90100C88422407C -:10663000E36D00000000004361B10100400000195B -:1066400062DD0100C584A8408132000023830088F8 -:106650001CB00000F39400402B30010018002E0302 -:1066600048B10100CC8422502F7C0000000000566D -:10667000179001000700001798880100CF84A241FD -:10668000996C00000000005517900100D28422434D -:106690002F7C000000000054179001001600201D00 -:1066A000E4B10100D484A340276C0000D684605F6D -:1066B000179000000084000B16DC0100000060133E -:1066C000169401000097005E051001000400A2402E -:1066D0000F6C00000688A25F2F7C0000148000036E -:1066E00042C90100000000F202B0010086930001DF -:1066F000384301000688004081B200000400A20374 -:10670000486D00000400224D757D0000000000402F -:1067100083B001000000004D61B1010000000016CF -:1067200080B2010004002740116C00000000001638 -:1067300062B10100E384A84081320000000000083B -:1067400062B10100E584A84081320000F084221388 -:10675000826C000040003D4383E00100000000F82F -:1067600010B00100000000F02CB001000000001685 -:1067700062B10100EB84A8408132000000000008F3 -:1067800062B10100ED84A84081320000E78400413D -:1067900083C000000000154081B20100008200A605 -:1067A00004B00100A0980040479901003005004165 -:1067B00089300100A595005295300100AC95004B41 -:1067C00002B00000068800400FB000000000005F2B -:1067D00001800100100000000EF4010004002640BA -:1067E000813200003F0000000088010005040040E5 -:1067F00089980100099900008A3001000300000710 -:106800001AF401001895000716300100088522418E -:10681000816C000003852242816C00002383008884 -:106820001CB000000785225F0F7C00000000005FA5 -:106830000F800100060400408998010009990000BA -:106840008A300100F08700400FB000001785A25A7F -:106850001F7C00000400A25A1F7C000000B5000D40 -:1068600042C901000400220BE67D000000B7000DC4 -:1068700042C901000400220BE67D00007094004034 -:106880008132010017852220856C000012859C0F43 -:1068900080320000238300881CB000008D95005CCE -:1068A0001F000100C8970042613101002383008866 -:1068B0001CB00000900400079630010000002D0578 -:1068C00048B101000400A24BE17D000000002D054D -:1068D00048B10100000000F018B001001C85223A08 -:1068E000016C0000000000008EB001006C890040C7 -:1068F00001B000000000004081B201002E002D0513 -:1069000048B101002185A240E76D00000A00004067 -:106910008F9801006C89004001B000001D94004078 -:106920008132010004002200803200003504004062 -:1069300089980100099900008A3001008D96009520 -:1069400003300100238300881CB0000000002D03E9 -:1069500048B1010022002DF02EB0010004001F17E5 -:1069600080320000282000A696B001002E85221754 -:10697000960400005B97004B953001006C89004C39 -:106980008FB0000030858317803200000000004483 -:1069900043C10100328585178032000000000048A5 -:1069A00043C10100280000F602CC0100120000A142 -:1069B0002AC801005D96004081320100AF9300417A -:1069C000813001006C89004081B2000000000001AC -:1069D00000D0010000002E1048B101002800004046 -:1069E000F199010000000003F0B101000000000077 -:1069F000F0B101003C8564476131000000000010E7 -:106A000062B101003D85A81BE0310000238374883A -:106A10001CB000000000004503E001000400A005D8 -:106A2000036C00000400A309036C000008002D03A0 -:106A300048B101006E8501FB08300000D88587FB56 -:106A400022300000000000FA0EB00100000000F843 -:106A500014B00100030000071AF4010018950007A4 -:106A6000163001005F852241816C00004E85224274 -:106A7000816C0000238300881CB000005E85225FCB -:106A80000F7C0000380000047E8901005485A65F59 -:106A90000F00000031940040053001000A0400405E -:106AA00089980100099900008A3001005B85004047 -:106AB00081B20000130000408798010000002D0300 -:106AC00048B101000C002DF082B00100000000F080 -:106AD00084B001002C9600400530010008040040FD -:106AE00089980100099900008A3001000400A25C25 -:106AF0001F7C00000000005C1F900100F087004038 -:106B00000FB000006C85A25A1F7C00000400A25A3E -:106B10001F7C000000B5000D42C901000400220BDB -:106B2000E67D000000B7000D42C901000400220B01 -:106B3000E67D000070940040813201006C852220C7 -:106B4000856C000069859C0F8032000023830088DB -:106B50001CB000008D95005C1F000100C89700422A -:106B600061310100238300881CB0000090040007FD -:106B70009630010000002D0548B10100000000F032 -:106B800018B001007085210480200000718500404C -:106B900010C90000A488004B81B000009F8500430D -:106BA00081B00000A38500FB22B00000A488004152 -:106BB00081B000006C89004E8FB000009485005AAF -:106BC0008FB00000798500478FB00000A488005383 -:106BD00081B00000A488005681B0000032002D056D -:106BE00048B101000704004089980100099900009C -:106BF0008A3001003C040040899801000999000A8C -:106C00008A3001003D0400408998010018000011FD -:106C10008AE40100099900F28A1401000000004092 -:106C200081B201006C89A00AE46D00008785A24151 -:106C3000197C00008685220A803200006C8900538E -:106C40008FB000006C8900548FB000009085220A3C -:106C5000803200008A85A20AE46D00006C89005D24 -:106C60008FB00000000000F280B001000000000AB8 -:106C700080D001008E85A091816C00006C89005E3F -:106C80008FB00000250000408F9801006C89004003 -:106C900081B2000092852091E56D00006C8900545E -:106CA0008FB00000210000408F9801006C890040E7 -:106CB00081B2000032002D0548B1010007040040F8 -:106CC00089980100099900008A3001003C040040C5 -:106CD000899801000999000A8A3001003D040040AA -:106CE00089980100099900F28A30010000000040F3 -:106CF00081B201006C89A00AE46D0000240000400C -:106D00008F9801006C89004081B2000037002D058A -:106D100048B10100040000F382F40100A488A042FD -:106D2000836C0000A488005481B00000000000F2D1 -:106D30000EB00100040023400F6C0000040020AAE4 -:106D40000F6C0000090400408998010009990000B7 -:106D50008A300100030000071AF4010000B5000D9D -:106D600042C901000700000716880100B185220B07 -:106D7000E67D00000A000040879801007F980040EF -:106D80008132010004001C0F80320000000000402E -:106D90000FB00100F087005C1F900000C3852250F7 -:106DA000FD7F0000BE85A254FD7F0000B685225500 -:106DB000FD7F00008200004087980100AD85004003 -:106DC00081B2000004002253FD7F00001480000304 -:106DD00042C90100000000F096B001001000004B15 -:106DE00080F401000CBC004087980100BE8522435E -:106DF000806C0000FFFF004B80880100AD85A2433E -:106E0000806C00007C96004047990100BF85464099 -:106E100081320000C285A0F0306F0000B4851E40B2 -:106E200081B2000000001E4131C301007F94004088 -:106E300025300100C7859C0F803200002383008825 -:106E40001CB000008D95005C1F0001001480000341 -:106E500042C901000400225A1F7C0000000000F01B -:106E600096B0010000002F0548B101001000000796 -:106E700018E401000008000CE099010090040007EC -:106E80009630010000B5000D46C90100CF853040A5 -:106E9000813200000400A20BE67D00000000000B20 -:106EA000E6910100000200A146C901000400A20B06 -:106EB000E67D00000000000BE691010004002E05B5 -:106EC00048B1010000001040E1B10100A488004079 -:106ED00081B00000000000FB28B00100000000FBB2 -:106EE00086B00100000000F814B00100E3852246DE -:106EF000237C000004002240876C0000DF852240D4 -:106F0000877C0000000000481F900100E1852241BD -:106F1000877C0000000000471F900100E3852242AB -:106F2000877C0000000000451F9001000400224003 -:106F3000097C0000E485661B2C300000000000A0E6 -:106F400013B001000000764141C301001686239270 -:106F5000156C00001686A2451F7C00001C86224B83 -:106F6000FD7F0000170000D0A2C901000000004012 -:106F700027B001000200000A24C80100BF940040AD -:106F80000F3001001486220840300000000000414C -:106F9000A3C10100F007001224CC0100ED85AA4135 -:106FA000274000000400A349276C000001000013E3 -:106FB00080CC01000E8626402330000000000040F7 -:106FC00083B001006000000384C8010010000010BD -:106FD00048CD0100170000D0A2C90100FB85A240E6 -:106FE000836C00000786004183B0000000800042EF -:106FF00044990100000068213896010000002E50DD -:1070000049C101000086A244236C00003000000347 -:1070100048C9010000000044F1B101000C0000204B -:10702000F0C901000000004461B10100A00000A40B -:1070300062DD01000386A842E03100000000004448 -:1070400085C001000000004123C001000000004194 -:10705000A3C10100F985A241815000000E862240A3 -:10706000236C00000000004461B1010040000010EA -:1070700062DD01000B86A840813200002383008876 -:107080001CB000000B040040899801000999000021 -:107090008A3001000000000348B10100EE07004003 -:1070A00025980100170000D02AC801002786001784 -:1070B00010B000000A970040813201001C86004099 -:1070C00081B20000BF940092253001000000004012 -:1070D00031B001000B0400408998010009990000BB -:1070E0008A3001001C8622082E30000027860041CD -:1070F00027B00000808000A604B001000600004018 -:10710000879801007F98000A8C30010004001C0F52 -:1071100080320000000000400FB001000000005C61 -:107120001F9001000400A09F136C00002686229F80 -:10713000136C0000020000881CCC01002783004073 -:1071400081B20000F08700413FC300000000004012 -:107150000FB001002800000180CE01003B862A40CC -:10716000813000000080001044C901004000004050 -:10717000819801003086A2481F7C00003086A2471B -:107180001F7C00003086A307036C000080000040D5 -:10719000819801003386A340026C000028000001A2 -:1071A000F0CD0100358600400FB0000028000040FF -:1071B000F0CD0100040000400ECC010028000003C7 -:1071C000F0C9010028000000F0C90100000000160D -:1071D000E0B101000000004761B101002000001093 -:1071E00062DD01003986A85C1F1000000400220A3D -:1071F000803200000400A203486D0000000000403F -:1072000043990100000000F008B00100A0012D40EA -:1072100000C001001C87220F420500004E869C0F13 -:10722000803200000000005C1F8001000080001020 -:1072300042C9010049862240E36D0000000000477A -:1072400061B101004000001062DD01004686A840E7 -:1072500081320000238300881CB000004E86220784 -:10726000803200000000000342B10100000000076E -:1072700042C10100008000A1469901000000005FAA -:10728000E1910100C006A2451F7C00001000000330 -:1072900048C9010000002D5429C00100000000F879 -:1072A00018B00100000000F804B00100000000F870 -:1072B0000EB0010004002640813200000400A25FED -:1072C0000F7C00003E00001480CE01000400AA40A4 -:1072D00081320000420000030AC801000C0000A433 -:1072E0000CC8010016950040813201000000001416 -:1072F00002B001000000001424D0010000000014BE -:1073000010C001001200000810C801000000004079 -:1073100023B00100FE7F000544C901000400A2A2C1 -:10732000860600000000000AE4B101007C8622010C -:107330008032000000003C4423E0010000002EA445 -:1073400080B001000000001048C101006986A30759 -:10735000026C00006A8668011AB00000000068072D -:107360001AB001000000000D02D00100000000056D -:10737000F0B101000000000CF0B1010000000002BB -:10738000E0B101000000000D0AC001007686224035 -:10739000036C000076862242236C0000000000414E -:1073A00023C001000000004761B10100A00000A45B -:1073B00062DD01009C862840813200007386004017 -:1073C00081B200000000001080C0010000000047F2 -:1073D00061B101000000004062B101007886A84060 -:1073E00023300000238300881CB000009C860040EE -:1073F00081B2000000003C4423E00100000000A432 -:1074000086B0010000002E1048C101008186A31241 -:107410000E6C0000828660071AB000000000601247 -:107420001AB001000000680D16940100FFFF000B68 -:1074300016D801001B990008983001000000680868 -:107440003E9601000000000CF0B1010000000002B7 -:10745000E0B101000000001086C0010000000046FD -:1074600061B101002000004362DD01008A86A85C52 -:107470001F100000BC86220D146C00009086220DA7 -:10748000246C00000000000D10C001009586000D66 -:1074900024D000000400224BFD7F000000000041CA -:1074A0002BC0010000000015A2B101001000002057 -:1074B00010C80100F007004025980100978622427D -:1074C000236C00009C86004123C0000000000046A1 -:1074D00061B101004000001062DD01009886A85CE7 -:1074E0001F000000238300881CB000000000004043 -:1074F00023B00100BC86220D14500000BB86A20DF3 -:107500000E500000A88622461F7C000000000046A6 -:107510001F8001003080001042C90100A686224071 -:10752000E36D00000000004761B101004000001061 -:1075300062DD0100A386A840813200002383008819 -:107540001CB0000020800003469901000000005F8D -:10755000E191010000002D0648B10100000000F893 -:1075600018B00100000000F804B00100040022F08F -:107570000E300000AE86A25F0F7C00006386004CD8 -:107580000DC0000000002E5F0F80010063862307FE -:10759000146C00000400A2461F7C000030000010A4 -:1075A00048C9010024000040F199010000000003D7 -:1075B000F0B1010000000000F0B101000000001671 -:1075C000F0B101002400000000C8010000000047E5 -:1075D00061B10100A00000A462DD0100B886A846E8 -:1075E0001F100000638600030CB000006386000DCE -:1075F00018C0000004002E140AD00100120000057B -:1076000048CD0100FE7F000542C901000400A2A48C -:10761000860600000400A2A1860600000C002AF2E3 -:10762000E0B10100C4862240316C00000000601807 -:10763000389601001E00004043990100008100F6C9 -:1076400080CE0100C886A6408132000000000044C0 -:1076500043C10100CA86220BED6D0000080000A1A5 -:1076600042C90100020000A146C901000400A2A114 -:10767000860600000F0000FA948801000400A2456D -:10768000956C00000200004A86E40100000000F64C -:107690000EB00100D48622471F7C000004001F4367 -:1076A0000E500000D486A0460F40000000000041AC -:1076B0000FC00100D88622481F7C00000000004057 -:1076C00091B0010004000FA242310000DB860040AF -:1076D00089B000000C0000A242C901000000004374 -:1076E00089B001000000004395D00100000000FCBB -:1076F00082B00100DE86A041904000000000004101 -:1077000091C00100E38622471F7C0000E386A0436E -:10771000896C0000E3862045896C0000E386A04167 -:107720000E400000000000410FC0010000000041B9 -:1077300089C00100DB86A24195500000F0862248F6 -:107740001F7C00001000004892F40100FFFF004879 -:1077500090880100EA8690489240000000000041B5 -:1077600093C001000A0000A244C901000000662085 -:1077700093A401000A00004380CC0100000000A295 -:1077800080C001000400A240426D00000400A2A1DC -:10779000860600000400A2461F7C00001B9900170B -:1077A00098300100FF0700177E8901000400A64001 -:1077B000813200003080001044C901001200001422 -:1077C000F0C9010000000017F0B10100120000052F -:1077D000E0CD01003000001080C80100000000442E -:1077E00061B101002000004062DD0100FA86A8407E -:1077F000813200000587225C1F7C000000003C44B1 -:1078000023E0010000002D1048C101000487224040 -:10781000E36D00000000004661B10100400000106F -:1078200062DD01000187A8408132000023830088C7 -:107830001CB000000000005C1F8001000887A24708 -:107840001F7C00000C9500408132010088870017E2 -:1078500010B00000139500408132010000002F039A -:1078600048B101000C87A00716400000000000414D -:1078700017C001000000000BE4B10100000000503F -:1078800017F00100108790F2164000000000004140 -:1078900017C001000000662017A4010010000014AA -:1078A0002AC80100000000502BE00100000000F297 -:1078B0002A9401003080001042C901001A8722403A -:1078C000E36D00000000004461B1010040000010C1 -:1078D00062DD01001787A840813200002383008801 -:1078E0001CB000000080001710DC010088870040F9 -:1078F00081B2000024879C0F803200000000005CF1 -:107900001F8001000080001042C90100248722402E -:10791000E36D00000000004761B10100400000106D -:1079200062DD01002187A8408132000023830088A6 -:107930001CB00000298722078032000000000003ED -:1079400042B101000000000742C10100008000A117 -:10795000469901000000005FE191010004002E0340 -:1079600048B101000000000AE0B101002E8722406A -:10797000316C00000C0000404599010000006018C7 -:107980003896010000002E1048B1010000000050A0 -:10799000F1B1010000000008F0B101000000000397 -:1079A000E0B101000000004461B1010000000010DE -:1079B00062B101003387A840233000002383008890 -:1079C0001CB0000000002D5211C001001000000387 -:1079D00048C90100000000F818B00100000000F8DC -:1079E00004B00100000000F80EB001000C0000A47B -:1079F0000CC8010004002240156C000000003C444B -:107A000023E00100000000A486B0010000002E1059 -:107A100048C101004287A3120E6C0000438768072B -:107A20001AB00000000068121AB001001B9900088B -:107A3000983001000000004081B2010000000010F9 -:107A400086C00100000068083E9601000000000C9E -:107A5000F0B1010000000002E0B1010000000046AA -:107A600061B101002000004362DD01004A87A85C8B -:107A70001F1000007C87220D146C00005087220D1F -:107A8000246C00000000000D10C001005587000D9F -:107A900024D000000400224BFD7F000000000041C4 -:107AA0002BC0010000000015A2B101001000002051 -:107AB00010C80100F00700402598010057872242B6 -:107AC000236C00005C87004123C0000000000046DA -:107AD00061B101004000001062DD01005887A85C20 -:107AE0001F000000238300881CB00000000000403D -:107AF00023B001000400220D145000007B87A20D6A -:107B00000E500000688722461F7C000000000046DF -:107B10001F8001003080001042C9010066872240AA -:107B2000E36D00000000004761B10100400000105B -:107B300062DD01006387A840813200002383008852 -:107B40001CB0000020800003469901000000005F87 -:107B5000E191010000002D0648B10100000000F88D -:107B600018B00100000000F804B00100040022F089 -:107B70000E3000006E87A25F0F7C00003C87004C37 -:107B80000DC0000000002E5F0F8001003C8723071E -:107B9000146C00000400A2461F7C0000300000109E -:107BA00048C9010024000040F199010000000003D1 -:107BB000F0B1010000000000F0B10100000000166B -:107BC000F0B101002400000000C8010000000047DF -:107BD00061B10100A00000A462DD01007887A84621 -:107BE0001F1000003C8700030CB000003C87000D14 -:107BF00018C000000400A2461F7C00008687225C9B -:107C00001F7C00000000005C1F80010000003C445D -:107C100023E0010000002D1048C1010086872240AA -:107C2000E36D00000000004661B10100400000105B -:107C300062DD01008387A840813200002383008831 -:107C40001CB000000000001710B001008887004041 -:107C50002BB00000008000034499010000000004E4 -:107C6000E0B1010004002640813200000400A09F22 -:107C7000136C00008F87229F136C000002000088A5 -:107C80001CCC01002783004081B200009498004181 -:107C90003F430100000000408DB0010000000040A3 -:107CA00005B001007F9800400F3001000400A25C85 -:107CB0001F7C00000688005C1F9000001000000080 -:107CC0000EF4010004002640813200000000003A5A -:107CD000018401009B872250016C00000D040040CC -:107CE00089980100099900008A300100030000070B -:107CF0001AF401001895000716300100A6872241EA -:107D0000816C0000A1872242816C000023830088DF -:107D10001CB00000A587225F0F7C00000000005F00 -:107D20000F8001000E0400408998010009990000AD -:107D30008A300100F08700400FB00000B387A25ADC -:107D40001F7C00000400A25A1F7C000000B5000D3B -:107D500042C901000400220BE67D000000B7000DBF -:107D600042C901000400220BE67D0000709400402F -:107D700081320100B3872220856C0000B0879C0F00 -:107D800080320000238300881CB000008D95005CC9 -:107D90001F000100C8970042613101002383008861 -:107DA0001CB00000900400079630010000002D0573 -:107DB00048B10100000000F018B001000000000010 -:107DC00080B00100A488A25F816C0000A8002D4350 -:107DD0001980010037002DF024B00100040000F3E9 -:107DE0008EF401000F0000F3908801000400A3430B -:107DF0008F6C00000400A343916C0000C4872248EC -:107E00008E6C0000360000404399010058003D434D -:107E1000E7E10100C4871FF0246C0000C387234101 -:107E20008F6C0000A488004781B00000A48800483F -:107E300081B000004000004043990100B0002DF0E7 -:107E400014B00100C987220A904000005F980040EA -:107E500091300100A488A24080320000B0002D457E -:107E600081B00100D58722F02C300000A3002D3016 -:107E700083B00100AC002DF382E00100CF87A34165 -:107E80002C6C00000000001682B0010098002DF05C -:107E900082C0010088002DF082D00100000000F2B5 -:107EA00098E80100A488204C826C00007C002D41E1 -:107EB00098E80100A48820F0986C0000F087220A5E -:107EC000803200004002000C7E890100F087A6404D -:107ED00081320000A488004981B00000200000A683 -:107EE00080B00100DD872243216F00001380004035 -:107EF00080DC0100DE87004081B200001A80004073 -:107F000080DC0100DE87A25E0B7D000000000040E7 -:107F100008B10100E0879F8580320000E4870040BF -:107F200081B200001A832240577D0000010000400A -:107F300057990100E487424081320000000000446C -:107F40009393010001831A5B69930000EA8722463C -:107F5000F37F0000EA87A241F37F0000C680004261 -:107F600097330100040000CB81C80100ED87224057 -:107F7000F27F0000C680006F97330100EF87224038 -:107F8000737D0000E08000418BB30000E787004074 -:107F900081B20000F7879C0F803200000080001043 -:107FA00042C90100F7872240E36D00000000004550 -:107FB00061B101004000001062DD0100F487A840BB -:107FC00081320000238300881CB000003494220218 -:107FD00080320000F88742408132000000000044F7 -:107FE0009393010034941A026897000002889C0F52 -:107FF000803200000080001042C901000288224047 -:10800000E36D00000000004561B101004000001078 -:1080100062DD0100FF87A8408132000023830088D1 -:108020001CB00000449422028032000003884240C9 -:1080300081320000000000449393010044941A022E -:10804000689700000D889C0F8032000000800010AF -:1080500042C901000D882240E36D00000000004588 -:1080600061B101004000001062DD01000A88A840F3 -:1080700081320000238300881CB000002F8322027D -:10808000803200000E88424081320000000000442F -:108090009393010000001A02689701002F830040AB -:1080A00005B00000008000A656B1010056952F4093 -:1080B00005B001000400A240E76D0000B89429411A -:1080C000E7B1010000000054EF930100000000F24E -:1080D0000EB001000400A30C556F00002900004001 -:1080E0000D9801000900000712E40100000000A73C -:1080F00013C00100030000071AF401000700000785 -:1081000016880100FFFF001034D8010000000003B2 -:10811000349401000000004023B00100201800400A -:1081200011980100040020AA0F6C000000B5000D9A -:1081300042C901004688220BE67D00002588604088 -:1081400081320000FFFF0007848901002E8805C2EC -:1081500024300000580400408132010000002D0549 -:1081600048B10100638870F0183001001000000C65 -:1081700082F401000400A2410E6C00004688004019 -:1081800081B200000000704081B201003D88A0482B -:10819000236C00000000005035D001000080001A60 -:1081A00042C9010037882240E36D00000000004210 -:1081B00061B101004000001A62DD01003488A8406E -:1081C00081320000238300881CB00000209800400A -:1081D00043990100638800F8183001003888A241F3 -:1081E00023500000FFFF001034D8010000000003FE -:1081F00034940100201800401198010000002E1A4C -:1082000048B1010000000044F1B101000000000885 -:10821000F0B101000000004261B101002000001A2D -:1082200062DD01004188A809E03100000000004142 -:1082300023C001000000005035C0010000000044D0 -:1082400011C00100528822410D5000000000004181 -:108250000FC001004E88A0AA0F6C00000000004172 -:108260000FB001000900000712E40100000000A7A0 -:1082700013C00100000000401BB001002288004133 -:1082800017B000000002000912C8010022888341D3 -:10829000174000000000004017B001002288004194 -:1082A0001BC000005D882340236C000000000050CC -:1082B00035D001000080001A42C901005A882240CE -:1082C000E36D00000000004261B101004000001AAF -:1082D00062DD01005788A8408132000023830088B6 -:1082E0001CB000002098004043990100638800F80A -:1082F000183001005B88A2412350000000000041BB -:108300000FC001006088A0AA0F6C000000000041AF -:108310000FB00100B8942007E4B101005695204049 -:10832000E7B10100F08700400FB00000FFFF000C34 -:1083300080D801000400264081320000C002000CF9 -:108340007E8901007C882654613100006F88870C8B -:10835000803200001F040040899801000999000C38 -:108360008A3001000000005461B101000F0000409C -:10837000629901006F882840813200000400A254F5 -:10838000777D00006B88004081B20000778822462C -:10839000197C00002A040040899801000999000C0A -:1083A0008A3001000000005461B101000D0000405E -:1083B000629901000000A84081B200000400A254AC -:1083C000777D00007088004081B200007C882249DF -:1083D000197C00000E000040629901000000A840D6 -:1083E00081B200000400A254777D0000778800402D -:1083F00081B2000010000040629901000000A84016 -:1084000081B200000400A254777D00007C88004007 -:1084100081B2000030942F55F1930100004000A676 -:1084200056B101002F83A241E551000064000040D5 -:10843000E599010084884440813200008788A29336 -:10844000576F00000000004157C3010000001CAB43 -:1084500027B301002F832250FD7F00002F8322517C -:10846000FD7F00002F83A2411D53000050460040B5 -:108470001D9B010038050040813201000E000048BC -:10848000B2CB010010040040493101009388224022 -:10849000B56F00000E000048B2CB0100200400417F -:1084A000B55301002F83004081B20000000000514D -:1084B000FD83010040160040459901004005004041 -:1084C000493101001E000048B2CB010010040040F9 -:1084D00081320100000000DA91C001000400004870 -:1084E000B2CB010020040040B533010060162040EB -:1084F000E5B1010055820040B53301000800004895 -:10850000B2CB0100FFFF004AB48B01002004004001 -:10851000813201000A000048B2CB01001000004A7D -:10852000B4F7010020040040813201002F83004095 -:1085300081B200000400A205486D00000200004066 -:10854000439901000400A2F20E6C00000400A20294 -:10855000803200000500004043990100000000F354 -:1085600008B00100AE882250816C00000F0400406A -:1085700089980100100000408AE401000999000474 -:108580008A14010004002048096C000004002057F0 -:10859000816C000004002040E6B1010003000040AF -:1085A00096E401000000000496C00100B488004B6E -:1085B00010C90000E48B004109B000000400002055 -:1085C0008FB00000040000208FB0000004000020E5 -:1085D0008FB00000040000208FB0000004000020D5 -:1085E0008FB00000040000208FB0000004000020C5 -:1085F0008FB00000040000208FB00000198C0041F3 -:1086000009B00000040000208FB00000040000202A -:108610008FB00000040000208FB000000400002094 -:108620008FB00000040000208FB000000400002084 -:108630008FB00000040000208FB000000400002074 -:108640008FB00000558C004509B00000558C0045E6 -:1086500009B00000558C004509B00000558C00455C -:1086600009B00000040000208FB0000004000020CA -:108670008FB00000040000208FB000000400002034 -:108680008FB000009C8C004309B00000CB8C0043ED -:1086900009B00000CF8C004409B000003E8E0045B8 -:1086A00009B00000040000208FB00000040000208A -:1086B0008FB00000040000208FB0000004000020F4 -:1086C0008FB00000040000208FB00000DF8C00435A -:1086D00009B00000DD8C004309B00000E08B0045CC -:1086E00009B00000040000208FB00000040000204A -:1086F0008FB00000040000208FB0000004000020B4 -:108700008FB00000988D004209B00000988D0043A2 -:1087100009B00000988D004409B00000E08B0045CE -:1087200009B00000040000208FB000000400002009 -:108730008FB00000040000208FB000000400002073 -:108740008FB00000040000208FB00000B88D0043FF -:1087500009B00000040000208FB00000E08B00454D -:1087600009B00000040000208FB0000004000020C9 -:108770008FB00000040000208FB000000400002033 -:108780008FB00000040000208FB00000E08D004397 -:1087900009B00000E08D004409B00000E08B004506 -:1087A00009B00000040000208FB000000400002089 -:1087B0008FB00000040000208FB0000004000020F3 -:1087C0008FB00000040000208FB00000E08D004258 -:1087D00009B00000040000208FB00000E08B0045CD -:1087E00009B00000040000208FB000000400002049 -:1087F0008FB00000040000208FB0000004000020B3 -:108800008FB00000040000208FB000000F8E0044E5 -:1088100009B00000040000208FB00000E08B00458C -:1088200009B00000040000208FB000000400002008 -:108830008FB00000040000208FB000000400002072 -:108840008FB00000E08B004209B00000228E00458E -:1088500009B00000228E004509B00000E08B004501 -:1088600009B00000040000208FB0000004000020C8 -:108870008FB00000040000208FB000000400002032 -:108880008FB00000248E004209B00000248E004307 -:1088900009B00000248E004409B00000248E004579 -:1088A00009B00000040000208FB000000400002088 -:1088B0008FB00000040000208FB0000004000020F2 -:1088C0008FB00000040000208FB0000004000020E2 -:1088D0008FB000002F8E004409B00000E08B0045EF -:1088E00009B00000040000208FB000000400002048 -:1088F0008FB00000040000208FB0000004000020B2 -:108900008FB00000418E004209B00000308E00435D -:1089100009B00000418E004409B00000E08B004522 -:1089200009B00000040000208FB000000400002007 -:108930008FB00000040000208FB000000400002071 -:108940008FB00000040000208FB00000438E004371 -:1089500009B00000378E004409B00000E08B0045EC -:1089600009B00000040000208FB0000004000020C7 -:108970008FB00000040000208FB00000E08B0041A9 -:1089800009B00000968D004209B00000968D0043AA -:1089900009B00000968D004409B00000E08B00454E -:1089A00009B00000040000208FB000000400002087 -:1089B0008FB00000040000208FB00000E08B004169 -:1089C00009B00000458E004209B00000458E00430A -:1089D00009B00000458E004409B00000E08B00455E -:1089E00009B00000040000208FB000000400002047 -:1089F0008FB00000040000208FB0000004000020B1 -:108A00008FB00000040000208FB0000004000020A0 -:108A10008FB00000040000208FB000004C8E004595 -:108A200009B00000040000208FB000000400002006 -:108A30008FB00000040000208FB000004E8E004276 -:108A400009B00000040000208FB0000004000020E6 -:108A50008FB00000040000208FB000000400002050 -:108A60008FB00000040000208FB000000400002040 -:108A70008FB00000040000208FB000000400002030 -:108A80008FB000005B8E004309B00000C18E004330 -:108A900009B00000CF8C004409B000003E8E0045B4 -:108AA00009B00000040000208FB000000400002086 -:108AB0008FB00000040000208FB0000004000020F0 -:108AC0008FB00000040000208FB00000C98E00436A -:108AD00009B00000CF8C004409B000003E8E004574 -:108AE00009B00000040000208FB000000400002046 -:108AF0008FB00000040000208FB0000004000020B0 -:108B00008FB00000040000208FB00000DD8E004315 -:108B100009B00000040000208FB00000E08B004589 -:108B200009B00000040000208FB000000400002005 -:108B30008FB00000040000208FB00000040000206F -:108B40008FB00000968C004309B00000C58E004332 -:108B500009B00000CF8C004409B000003E8E0045F3 -:108B600009B00000040000208FB0000004000020C5 -:108B70008FB0000002002D0548B101000400A2F2F0 -:108B80000E6C00000400A2028032000007002D409D -:108B900081B20100000000F308B0010010040040A1 -:108BA00089980100100000478AE401000999000437 -:108BB0008A1401000400204E096C00002A000047BE -:108BC00080CE0100040024408132000006002047CE -:108BD000E6B101000400004796E4010000000047F0 -:108BE00096D001000000004796D00100000000046C -:108BF00096C001007D89004B10C90000F98E004924 -:108C000009B000000400002085B00000040000202E -:108C100085B000000400002085B0000004000020A2 -:108C200085B000000400002085B000000400002092 -:108C300085B000000400002085B000000400002082 -:108C400085B000000400002085B000000400002072 -:108C500085B000000400002085B000000400002062 -:108C600085B000000400002085B000000400002052 -:108C700085B00000328F004209B0000004000020DF -:108C800085B000000400002085B000000400002032 -:108C900085B000000400002085B000000400002022 -:108CA00085B000000400002085B000000400002012 -:108CB00085B000000400002085B000000400002002 -:108CC00085B000000400002085B0000004000020F2 -:108CD00085B000000400002085B0000004000020E2 -:108CE00085B00000398F004609B000000400002064 -:108CF00085B000000400002085B0000004000020C2 -:108D000085B000000400002085B0000004000020B1 -:108D100085B000000400002085B0000004000020A1 -:108D200085B000000400002085B000000400002091 -:108D300085B000000400002085B000000400002081 -:108D400085B000000400002085B000000400002071 -:108D500085B000000400002085B000004A8F00426A -:108D600009B000000400002085B000006D8F0042B3 -:108D700009B000000400002085B0000004000020BD -:108D800085B000000400002085B000000400002031 -:108D900085B000000400002085B000000400002021 -:108DA00085B00000678F004A09B000000400002071 -:108DB00085B000000400002085B000000400002001 -:108DC00085B000000400002085B00000748F0043CF -:108DD00009B000000400002085B00000DF8F0044CF -:108DE00009B000000400002085B00000040000204D -:108DF00085B000000400002085B0000004000020C1 -:108E000085B000000400002085B0000004000020B0 -:108E100085B00000DD8F004B09B000000400002089 -:108E200085B000000400002085B000000400002090 -:108E300085B000003D8F004109B000000400002013 -:108E400085B000003D8F004309B000003D8F004415 -:108E500009B000003D8F004509B000003D8F00467D -:108E600009B000003D8F004709B000003D8F004869 -:108E700009B000003D8F004909B000003D8F004A55 -:108E800009B000003D8F004B09B000003D8F004C41 -:108E900009B000003D8F004D09B000000400002023 -:108EA00085B000000400002085B00000489000421A -:108EB00009B000000400002085B000004890004484 -:108EC00009B000000400002085B00000040000206C -:108ED00085B000000400002085B0000004000020E0 -:108EE00085B000000400002085B0000004000020D0 -:108EF00085B000004890004B09B00000040000203D -:108F000085B000000400002085B0000004000020AF -:108F100085B000000400002085B00000040000209F -:108F200085B000006590004509B0000004000020F5 -:108F300085B000000400002085B00000040000207F -:108F400085B000000400002085B000007D9000473F -:108F500009B000000400002085B0000056900045D4 -:108F600009B000000400002085B0000004000020CB -:108F700085B000001593004609B0000004000020F1 -:108F800085B000000400002085B00000040000202F -:108F900085B000000400002085B00000040000201F -:108FA00085B000006D8F004609B000004A8F004672 -:108FB00009B00000658F004709B00000658F0048C8 -:108FC00009B000000400002085B00000040000206B -:108FD00085B000000400002085B00000678F004AC3 -:108FE00009B000000400002085B00000040000204B -:108FF00085B000000400002085B0000004000020BF -:1090000085B000000400002085B0000004000020AE -:1090100085B00000DF8F004509B00000748F004369 -:1090200009B00000658F004709B00000658F004857 -:1090300009B000000400002085B0000004000020FA -:1090400085B000000400002085B00000DD8F004CDA -:1090500009B000000400002085B0000004000020DA -:1090600085B000000400002085B00000040000204E -:1090700085B000000400002085B00000040000203E -:1090800085B000008490004409B000008490004244 -:1090900009B00000C98B004709B00000C98B004827 -:1090A00009B000000400002085B00000040000208A -:1090B00085B000000400002085B000008490004BC3 -:1090C00009B000000400002085B00000040000206A -:1090D00085B000003D8F004109B00000AF9000470F -:1090E00009B000000400002085B000009290004705 -:1090F00009B000000400002085B00000040000203A -:1091000085B000000400002085B0000004000020AD -:1091100085B000000400002085B00000040000209D -:1091200085B000009290004709B0000004000020C4 -:1091300085B000000400002085B00000040000207D -:1091400085B000000400002085B00000040000206D -:1091500085B000000400002085B00000040000205D -:1091600085B000009290004709B00000AF90004722 -:1091700009B00000658F004709B00000658F004806 -:1091800009B000000400002085B0000004000020A9 -:1091900085B000000400002085B0000092900047D8 -:1091A00009B000000400002085B000000400002089 -:1091B00085B000000400002085B0000004000020FD -:1091C00085B000000400002085B0000004000020ED -:1091D00085B000000400002085B0000004000020DD -:1091E00085B00000BE90004709B00000BE90004866 -:1091F00009B000000400002085B000000400002039 -:1092000085B000000400002085B0000004000020AC -:1092100085B000000400002085B00000040000209C -:1092200085B000002F91004009B000005191004727 -:1092300009B000004391004809B000008A9000473F -:1092400009B000008A90004709B000005191004722 -:1092500009B000005A91004709B000005A91004837 -:1092600009B000000400002085B0000043910048D0 -:1092700009B000008A90004709B000008A900047BA -:1092800009B000004391004809B00000040000202C -:1092900085B000000400002085B00000040000201C -:1092A00085B000004890004309B000000400002091 -:1092B00085B000004890004509B000004890004685 -:1092C00009B00000658F004709B00000658F0048B5 -:1092D00009B000000400002085B000004890004A5A -:1092E00009B000000400002085B000004890004C48 -:1092F00009B000000400002085B000000400002038 -:1093000085B000000400002085B00000AE9000474A -:1093100009B00000A090004809B0000091900047FB -:1093200009B000009190004709B00000AE900047DE -:1093300009B00000C98B004709B00000C98B004884 -:1093400009B000000400002085B00000A090004893 -:1093500009B000009190004709B0000091900047CB -:1093600009B00000A090004809B0000004000020EF -:1093700085B000000400002085B000005D9100422F -:1093800009B000000400002085B000005D91004499 -:1093900009B000000400002085B000000400002097 -:1093A00085B000000400002085B00000040000200B -:1093B00085B000000400002085B0000004000020FB -:1093C00085B000005D91004B09B000000400002052 -:1093D00085B000000400002085B0000004000020DB -:1093E00085B000000400002085B0000004000020CB -:1093F00085B000005D91004309B00000040000202A -:1094000085B000005D91004509B000005D91004607 -:1094100009B000005D91004709B000005D9100486F -:1094200009B000000400002085B000005D91004AF2 -:1094300009B000000400002085B000005D91004CE0 -:1094400009B000005D91004C09B00000040000204C -:1094500085B000000400002085B00000040000205A -:1094600085B000007A91004609B000000400002099 -:1094700085B000000400002085B00000040000203A -:1094800085B000000400002085B000007D900047FA -:1094900009B000000400002085B000007A91004669 -:1094A00009B000000400002085B000000400002086 -:1094B00085B000000400002085B0000004000020FA -:1094C00085B000000400002085B0000004000020EA -:1094D00085B000009C92004609B000000400002006 -:1094E00085B000000400002085B0000004000020CA -:1094F00085B000000400002085B000007D9000478A -:1095000009B000000400002085B000009C920046D5 -:1095100009B000000400002085B000000400002015 -:1095200085B000009C92004609B0000004000020B5 -:1095300085B000000400002085B000000400002079 -:1095400085B000000400002085B00000C5920042F4 -:1095500009B000000400002085B0000004000020D5 -:1095600085B000000400002085B000000400002049 -:1095700085B000000400002085B000000400002039 -:1095800085B00000C392004A09B00000040000202A -:1095900085B000000400002085B000000400002019 -:1095A00085B000000400002085B000000400002009 -:1095B00085B000000400002085B0000004000020F9 -:1095C00085B00000C592004609B0000004000020EC -:1095D00085B00000658F004709B00000658F004826 -:1095E00009B000000400002085B000000400002045 -:1095F00085B000000400002085B00000C392004A3E -:1096000009B000000400002085B000000400002024 -:1096100085B000000400002085B000000400002098 -:1096200085B000000400002085B000000400002088 -:1096300085B000000400002085B000000400002078 -:1096400085B000000400002085B000000400002068 -:1096500085B000006A91004109B0000004000020BC -:1096600085B000000400002085B000000400002048 -:1096700085B000000400002085B000000400002038 -:1096800085B000000400002085B000007791004202 -:1096900009B000000400002085B00000779100446C -:1096A00009B000000400002085B000000400002084 -:1096B00085B000000400002085B0000004000020F8 -:1096C00085B000000400002085B0000004000020E8 -:1096D00085B000007791004B09B000000400002025 -:1096E00085B000000400002085B0000004000020C8 -:1096F00085B000000400002085B0000004000020B8 -:1097000085B000007791004309B0000004000020FC -:1097100085B000007791004509B0000077910046C0 -:1097200009B000007791004709B000007791004828 -:1097300009B000000400002085B0000004000020F3 -:1097400085B000000400002085B000007791004C37 -:1097500009B000000400002085B0000004000020D3 -:1097600085B000000400002085B000000400002047 -:1097700085B000006590004C09B000000400002096 -:1097800085B000000400002085B000000400002027 -:1097900085B000000400002085B000007D900047E7 -:1097A00009B000000400002085B000005690004C75 -:1097B00009B000000400002085B000000400002073 -:1097C00085B000008393004609B00000040000202B -:1097D00085B000000400002085B000000A9300421C -:1097E00009B000000400002085B000000A93004486 -:1097F00009B000000400002085B000000400002033 -:1098000085B000000400002085B0000004000020A6 -:1098100085B000000400002085B000000400002096 -:1098200085B000000A93004B09B00000040000203E -:1098300085B000000400002085B000000400002076 -:1098400085B000000400002085B000000400002066 -:1098500085B000000400002085B000000400002056 -:1098600085B000000A93004509B000000A93004645 -:1098700009B00000658F004709B00000658F0048FF -:1098800009B000000400002085B0000004000020A2 -:1098900085B000000400002085B000000A93004C51 -:1098A00009B000000400002085B000000400002082 -:1098B00085B000000400002085B0000056900042F2 -:1098C00009B000001593004609B000000400002014 -:1098D00085B000000400002085B0000056900046CE -:1098E00009B000000400002085B000007D90004712 -:1098F00009B000000400002085B000001593004668 -:1099000009B000000400002085B000000400002021 -:1099100085B000001593004609B000000400002047 -:1099200085B000000400002085B000000400002085 -:1099300085B000001C93004309B000000400002023 -:1099400085B000000400002085B000000400002065 -:1099500085B000000400002085B000007D90004725 -:1099600009B000000400002085B000001C930043F3 -:1099700009B000000400002085B0000004000020B1 -:1099800085B000001C93004D09B0000004000020C9 -:1099900085B000000400002085B000000400002015 -:1099A00085B000000400002085B000003293004321 -:1099B00009B000000400002085B000000400002071 -:1099C00085B000000400002085B0000004000020E5 -:1099D00085B000000400002085B0000004000020D5 -:1099E00085B000000393004A09B000000400002085 -:1099F00085B000000400002085B0000004000020B5 -:109A000085B000000400002085B0000004000020A4 -:109A100085B000000400002085B000000400002094 -:109A200085B000003293004309B00000040000201C -:109A300085B00000658F004709B00000658F0048C1 -:109A400009B000000400002085B0000004000020E0 -:109A500085B000000400002085B000000393004A98 -:109A600009B000000400002085B0000004000020C0 -:109A700085B000000400002085B000000400002034 -:109A800085B000004A93004309B0000004000020A4 -:109A900085B000000400002085B000000400002014 -:109AA00085B000000400002085B000007D900047D4 -:109AB00009B000000400002085B000004A93004374 -:109AC00009B000000400002085B000000400002060 -:109AD00085B000004A93004D09B00000040000204A -:109AE00085B000000400002085B000004A8F0042CD -:109AF00009B000000400002085B000006D8F004216 -:109B000009B000000400002085B00000040000201F -:109B100085B000000400002085B000000400002093 -:109B200085B000000400002085B000000400002083 -:109B300085B000006D93004209B0000004000020D1 -:109B400085B000000400002085B000000400002063 -:109B500085B000000400002085B000000400002053 -:109B600085B000000400002085B000000400002043 -:109B700085B000006D8F004609B000004A8F004696 -:109B800009B00000658F004709B00000658F0048EC -:109B900009B000000400002085B00000040000208F -:109BA00085B000000400002085B000006D930046E1 -:109BB00009B000000400002085B00000040000206F -:109BC00085B000000400002085B0000004000020E3 -:109BD00085B000007493004A09B000000400002022 -:109BE00085B000000400002085B0000004000020C3 -:109BF00085B000000400002085B000007D90004783 -:109C000009B000000400002085B000007493004AF1 -:109C100009B000000400002085B00000040000200E -:109C200085B000001693004609B000000400002033 -:109C300085B000000400002085B000000400002072 -:109C400085B000001693004609B000000400002013 -:109C500085B000000400002085B000000400002052 -:109C600085B000000400002085B000007D90004712 -:109C700009B000000400002085B0000016930046E3 -:109C800009B000000400002085B00000040000209E -:109C900085B000001693004609B0000004000020C3 -:109CA00085B000000400002085B000000400002002 -:109CB00085B000000400002085B000007D930042C4 -:109CC00009B000000400002085B00000040000205E -:109CD00085B000000400002085B0000004000020D2 -:109CE00085B000000400002085B0000004000020C2 -:109CF00085B000000393004A09B000000400002072 -:109D000085B000000400002085B0000004000020A1 -:109D100085B000000400002085B000000400002091 -:109D200085B000000400002085B000000400002081 -:109D300085B000007D93004609B0000004000020BB -:109D400085B00000658F004709B00000658F0048AE -:109D500009B000000400002085B0000004000020CD -:109D600085B000000400002085B000000393004A85 -:109D700009B000000400002085B0000004000020AD -:109D800085B000000400002085B00000748F004DF5 -:109D900009B000000400002085B00000040000208D -:109DA00085B000000400002085B000000400002001 -:109DB00085B000000400002085B0000004000020F1 -:109DC00085B000000400002085B0000004000020E1 -:109DD00085B000000400002085B0000004000020D1 -:109DE00085B000000400002085B0000004000020C1 -:109DF00085B000000400002085B0000004000020B1 -:109E000085B000000400002085B0000004000020A0 -:109E100085B000000400002085B00000748F004D64 -:109E200009B00000658F004709B00000658F004849 -:109E300009B000000400002085B0000004000020EC -:109E400085B000000400002085B000000400002060 -:109E500085B000000400002085B000000400A205C9 -:109E6000486D0000040022078032000007002E4BDE -:109E700019900100FB870004E6B10000C98B224263 -:109E8000197C00000F97003A81300100C98B004017 -:109E900081B20000C98B2242197C0000FF1F000F15 -:109EA0001E8C01007396004081320100DB8B9C0FF9 -:109EB000803200000000005C1F8001000080001064 -:109EC00042C90100DB8B2240E36D00000000004529 -:109ED00061B101004000001062DD0100D88BA84094 -:109EE00081320000238300881CB000001D852202FF -:109EF00080320000DC8B42408132000000000044D0 -:109F00009393010000001A02689701001D8500402C -:109F100005B000000400A205486D000004002207FF -:109F20008032000005002E4B19900100FB870004D1 -:109F3000E6B100000000004087B0010000000040D2 -:109F40008DB001000080000342C90100400000A163 -:109F500044C90100000000F0E0B101007F98000654 -:109F6000074001000400A25C1F7C00000000000606 -:109F700007D00100D4002E5C1F90010000000007F4 -:109F8000F0B101000C80000342C90100000000F0A4 -:109F9000F0B101000000004081B20100000000FEAD -:109FA00096B00100000000FE96C00100000000F025 -:109FB000F0B101000000004081B20100000000FE8D -:109FC00096C00100000000FE96C00100000000F0F5 -:109FD000F0B101000000004081B20100000000FA71 -:109FE00096C00100000000FE96C001000030004B4A -:109FF000948801000000004695F001000000004A2E -:10A0000096C001005E012E34978401000200004BCF -:10A01000E4E5010064012040E1B10100090000070E -:10A0200086E4010000002EA787C001001000001088 -:10A0300048C9010010000040F19901005801004397 -:10A04000F0C9010058010005E0C90100000000440A -:10A0500061B10100A00000A462DD0100088CA840ED -:10A06000813200000000000548B101001A000040E4 -:10A070009798010008002E4095B00100108C204BED -:10A08000946C000000000040F1B101000D8C004113 -:10A0900095C000001080001042C90100178C2240BA -:10A0A000E36D00000000004461B1010040000010B9 -:10A0B00062DD0100138CA8408132000023830088F8 -:10A0C0001CB000000000000548B101000F970040DF -:10A0D00081300100E08B004081B200000C80000361 -:10A0E00042C90100000000F886B00100000000F83D -:10A0F00088B001001480000398C801000400A2A1E8 -:10A10000986C00001E8C444081320000218CA24CCF -:10A11000FD7F0000228C004CFD930000238C20F07A -:10A12000566F0000000000F056B3010000001C4014 -:10A1300081B2010064000040819801006400004089 -:10A1400080CC01000400A64081320000D80000400D -:10A15000819801000400A2438104000000800010E7 -:10A1600044C9010064000040F1990100700000053D -:10A17000F0C9010000000043F0B1010000000047F9 -:10A1800061B101002000001062DD01002E8CA844A6 -:10A19000E0310000100000108CC801000080004673 -:10A1A00044C9010040000040F19901006801000528 -:10A1B000F0C9010064000043F0C90100040024401C -:10A1C000813200000000004761B10100000000463C -:10A1D00062B10100378CA844E0310000238300887D -:10A1E0001CB000000900000786E4010038002EA71B -:10A1F00087C001008B002D0548B101003F8C224330 -:10A20000E77D00000000004445C10100428C22446B -:10A21000E77D00000000004C45C101000000004A3D -:10A2200019900100680120A2E4B1010088000040FB -:10A2300043990100468C230BE56D000000000041AE -:10A24000199001000080001044C901005000004036 -:10A25000F199010058010043F0C9010058010005BF -:10A26000E0C901000000004461B1010000000010DD -:10A2700062B101004B8CA84081320000238300882A -:10A280001CB000005C002E0548B1010000800003F6 -:10A2900042C90100000060F096B00100A00000403B -:10A2A000439901000400A2F2803200000F970041A0 -:10A2B00081300100E08B004081B20000588CA2493F -:10A2C000197C000086000040479901005C8C00402A -:10A2D000E5B1000086002F49198001005C8CA2F2D4 -:10A2E000803200008B0000404799010000000042CE -:10A2F000E79101005F8CA246197C0000A00000409D -:10A3000047990100638C0040E5B10000A0002F4692 -:10A3100019800100638CA2F2803200008B000040A3 -:10A320004799010000000041E79101000700004E3D -:10A3300080E401000039004080C801000400A24010 -:10A34000066C0000A80000404399010034002DF085 -:10A3500024B00100000000FB0CB00100000000FB75 -:10A3600010B00100000000FB12B001000F0000F36C -:10A3700016880100040000F314F40100938C2640B9 -:10A3800081320000798C220A166C000058003D438F -:10A3900013E00100000000F882B00100040022F088 -:10A3A000843000001B980040813201002383008824 -:10A3B0001CB000000000000548B101000000004191 -:10A3C00013C00100788CA043136C00000000004013 -:10A3D00013B001006E8C004115D00000938C220A4E -:10A3E000803200000400A208126C000058003D43B7 -:10A3F00013E00100000000F882B00100040022F028 -:10A40000843000001B980040813201004000204051 -:10A41000E1B10100238300881CB0000000000005AA -:10A4200048B10100938C224115500000000000410A -:10A4300011C00100868CA043116C00000000004098 -:10A4400011B0010004002206106C000058003D43CA -:10A4500011E00100000000F836B00100040022F015 -:10A46000003000000000005083B001005497004706 -:10A4700061310100238300881CB000003194000585 -:10A48000483101000000004561B1010040000010AA -:10A4900062DD01008F8CA840813200002383008898 -:10A4A0001CB00000828C000548B10000370020403D -:10A4B000E7B101008697005181300100E08B004038 -:10A4C00081B2000037000040439901000400A2F36C -:10A4D0008032000034002E41F5B10100001100402F -:10A4E000E59901000400A248197C0000A08C0048F6 -:10A4F0001990000037000040439901000400A2F3C6 -:10A500008032000034002E41F5B1010000110040FE -:10A51000E59901000080000342C90100000000F835 -:10A5200094B00100A78C2245237C0000B0002FF0DE -:10A530008CB00100000060F08CC001007C00004085 -:10A54000439901000400A3F08C6C000090000040CF -:10A550004399010035002DF08CB0010034002DF33B -:10A5600084B00100040022F3846C000058003E43D4 -:10A5700085E00100AE8C2248197C000000000041FB -:10A580008DC001000000680A8CC0010038002A4A12 -:10A59000E0B1010028000000E0C901003C00201BE0 -:10A5A000E0B101001080000342C90100000000F882 -:10A5B00038B00100000000F826B00100040022F8C5 -:10A5C00002300000BC8C2301146C0000000000F875 -:10A5D00080B00100000000F882B001004C0020F0C3 -:10A5E000E4B1010044002040E0B1010048002041F6 -:10A5F000E0B10100A8002D1032B001005F9800F01A -:10A6000024300100C58CA244816C0000C38C22411F -:10A61000197C0000BC9500403B300100ED8CA20885 -:10A620003C300000C58C004081B20000BF94004067 -:10A6300081320100ED8CA2083C3000005000201C4B -:10A64000E0B1010054002013E0B101004E002001F0 -:10A65000E4B101004000200AE0B101008697005FEC -:10A6600081300100E08B004081B2000037000040E3 -:10A6700047990100959500F394300100A08C224A7F -:10A6800080320000D18C004081B2000037000040D1 -:10A6900047990100959500F3943001000400204390 -:10A6A000976C000058003E4397E001000000001B3B -:10A6B000F0B101001F006000008C0100E08B8511EB -:10A6C000803200000480000342C90100B0002FF076 -:10A6D0008CB00100000060F08CC001007C000040E4 -:10A6E000439901000400A3F08C6C00008697005F82 -:10A6F00081300100E08B004081B20000040022495B -:10A70000197C0000DF8C004919800000E48C224194 -:10A71000197C0000BC9500403B300100E88CA20889 -:10A720003C3000008697005F81300100E08B0040E4 -:10A7300081B20000BF94004081320100E88CA20881 -:10A740003C3000008697005F81300100E08B0040C4 -:10A7500081B2000050002D1032B0010054002DF0E5 -:10A7600038B001004E002DF026B0010040002DF25F -:10A7700002B00100000000F014B001003000001031 -:10A780008CC801000080004644C9010068012D44C6 -:10A7900061B10100100068F280C8010000000008EB -:10A7A000F0B1010058010005E0C901000000000BF4 -:10A7B00037B001000000004036D001005C012E409F -:10A7C00010C001000000000680C00100000000521F -:10A7D00081D0010018970040E431010020000046BC -:10A7E00062DD0100F98CA840233000000E95004086 -:10A7F000813201001695004081320100078D8241AF -:10A80000234000002080001042C90100048D224036 -:10A81000E36D00000000004661B10100400000103F -:10A8200062DD0100018DA840813200002383008891 -:10A830001CB000000000000548B10100000000103D -:10A8400032B001000000004123B001000080001977 -:10A8500044C901000F8D2241197C00000B8DA3011A -:10A860000C6C00000C8D000604B00000000000011C -:10A8700004B001000E8D2002366C00000000001BA9 -:10A8800004B00100128D0002E0B10000118DA3019F -:10A890000C6C0000128D000604B0000000000001E6 -:10A8A00004B001000000680216940100FFFF000BD5 -:10A8B00016D80100000068083E9601000000001C48 -:10A8C000F0B101000000004661B101002000001954 -:10A8D00062DD0100178DA813E0310000548D2202C3 -:10A8E0001450000044002D020CD001003F8DA20244 -:10A8F00002500000258D225C1F7C00002080000398 -:10A9000042C90100248D2240E36D00000000004791 -:10A9100061B101004000001062DD0100208DA840FF -:10A9200081320000238300881CB000000000000575 -:10A9300048B1010044002D5C1F80010048002DF04B -:10A9400038B001004C002DF026B0010038002FF285 -:10A9500002B00100418D2201146C00000400A440EB -:10A9600081320000338D22461F7C0000000000462B -:10A970001F80010020002D0348B10100328D2240CC -:10A98000E36D00000000004461B1010040000010D0 -:10A9900062DD01002F8DA8408132000023830088F2 -:10A9A0001CB0000038002F0548B10100000000F87D -:10A9B00094B0010038002DF096B001000000004C6A -:10A9C000E1C101002000000348C901000000224A43 -:10A9D000F1B1010044000005F0C901000000004A87 -:10A9E000F0B101000000004BE0B1010000000047A1 -:10A9F00061B10100A00000A462DD01003C8DA85CF3 -:10AA00001F100000418D000548B100000000000249 -:10AA100038C0010004002440813200004F8D22061E -:10AA2000803200000000005033C001004D8DA202B2 -:10AA3000366C000004002241197C000004008F0DD8 -:10AA400042310000040022F0803200000400225C49 -:10AA5000E17D00000400A2F06A060000100000F88A -:10AA600010C801000000005C11800100F0070040E8 -:10AA700037980100FD8C00A11AB000000000000210 -:10AA800010C00100FD8C000236D000005000201CD8 -:10AA9000E0B1010054002013E0B101004E0020019C -:10AAA000E4B101004000200AE0B101005B8D005FCD -:10AAB00001B000000400A202026C00000400A20227 -:10AAC0000C6C000037002D4601B00100040000F3BB -:10AAD00080F401005A8DA043816C000000000055F5 -:10AAE00001B0010040002040E1B1010000800019E8 -:10AAF00042C90100618D2240E36D00000000004664 -:10AB000061B101004000001962DD01005E8DA840C6 -:10AB100081320000238300881CB0000013950040A0 -:10AB2000813201003080001042C90100688D22404E -:10AB3000E36D00000000004461B10100400000101E -:10AB400062DD0100658DA84081320000238300880A -:10AB50001CB0000060012F0548B101000000000B8F -:10AB6000E4B101000000005017F001006D8D90F27B -:10AB7000164000000000004117C0010000006620E0 -:10AB800017A40100320000A62AC00100000000F254 -:10AB90002A940100708D45486131000000D0001EEC -:10ABA00062DD0100758D284005300000718D22485E -:10ABB000777D0000788D004081B200000000001514 -:10ABC00062B10100838D284081320000758D004004 -:10ABD00081B2000000001D0092B00100808D224172 -:10ABE000197C0000040022403B6C00000400A348D4 -:10ABF0003B6C00000080000342C90100C99400F8CA -:10AC0000003001007D8DA2413B500000848D004941 -:10AC100000B00000FF07001E008C0100C994004036 -:10AC200081320100848D004900B0000000001D4702 -:10AC300019800100878D225F016C00008E98004012 -:10AC400081320100AA88000080B000008E8D225C55 -:10AC50001F7C00002080000342C901008E8D22402D -:10AC6000E36D00000000004761B1010040000010EA -:10AC700062DD01008B8DA8408132000023830088B3 -:10AC80001CB000008E8D400548310000FFFF00071A -:10AC900094890100948D85CA943000008E98185CC8 -:10ACA0001F0001000E00000F1E8C0100B78700403E -:10ACB00081B200008697180080300100E08B0047C9 -:10ACC000198000000000004019800100E08B22473D -:10ACD000197C0000BF940040813201009B8DA208C6 -:10ACE00080320000E08B004081B2000018970040E5 -:10ACF0000D3001009C01004045990100FFFF000B51 -:10AD0000988801008B002D5017F00100A18D904C08 -:10AD1000164000000000004117C00100A38D22432F -:10AD2000E77D00000000004445C1010000006620EE -:10AD300017A4010068010040439901005C012EF254 -:10AD400080B00100020062407ECD0100000000578B -:10AD500081C0010000002E1048B101000300004036 -:10AD6000F08D010000000008F0B10100580100055D -:10AD7000E0C901000000004461B1010000000010C2 -:10AD800062B10100AD8DA8408132000023830088AC -:10AD90001CB000000000000548B10100B18D45481D -:10ADA000613100000050000862DD0100B78D2840CD -:10ADB00005300000B28D2248777D0000C9941D083F -:10ADC00000300100E08B004081B20000E08B1D47A5 -:10ADD000198000000400A205486D00003500004005 -:10ADE00047990100010063F384C80100BD8DA043B1 -:10ADF000856C00000000634085B00100A8000040A1 -:10AE00004399010037002FF024B00100040022F321 -:10AE10009E060000010063F382CC0100CB8DA241AD -:10AE20009E060000E08B224483700000A8000040D2 -:10AE3000439901000400A2F0246C00003600004099 -:10AE40004399010058003D43E7E10100E08B1FF00A -:10AE5000246C00008E98004881300100AA882341AC -:10AE6000836C0000AA88004781B0000034000040D5 -:10AE70004399010004002242E66D000058003D4362 -:10AE800085E00100000000F836B00100000000F08D -:10AE900000B0010004002200803200000400A20083 -:10AEA000BE06000028000040839801005497004728 -:10AEB00061310100238300881CB0000000002D03D5 -:10AEC00048B1010008002DF094B00100000000F826 -:10AED0008EB0010090002DF014B0010000000005BC -:10AEE00048B10100A88CA2408F7C0000DE8D224773 -:10AEF0008F7C00000400A248197C0000A88C004848 -:10AF000019900000040022468F7C0000608E0040F3 -:10AF100081B200000400A205486D000036002D5DDE -:10AF200005B4010037002DF380B00100000000F3EC -:10AF30008EB00100F00000477E8901000400264029 -:10AF4000813200005C003D4381E00100A8002DF04B -:10AF500094B001000400224A80320000000000F09A -:10AF600024B001002000001086DC010040800003B6 -:10AF700044C901009293004AF03101000400A25C30 -:10AF80001F7C000036002F5C1F900100F28DA25044 -:10AF90008F50000034002040E1B10100E08B004000 -:10AFA00081B20000F00000477E89010004002640C5 -:10AFB000813200000000634181C00100F78DA04391 -:10AFC000816C00000000634081B001003700204721 -:10AFD000E6B10100E08B2247803200000400004708 -:10AFE0000CF401000000004F8F8401000C8E2247FA -:10AFF0000C6C000058003D4381E001000C8E1FF0F6 -:10B00000246C00000000005C1F8001000080001024 -:10B0100042C90100058E2240E36D0000000000459A -:10B0200061B101004000001062DD0100028EA84005 -:10B0300081320000238300881CB00000058E42404E -:10B0400005300000000000449393010000001A5DE9 -:10B05000699301000A8E23410D6C0000E08D00050C -:10B0600048B100008E98000548310100AA880048C8 -:10B0700081B00000E08B22408F6C00008697005F5B -:10B0800081300100E08B004081B200004002000CE2 -:10B090007E8901000400A64081320000A200004029 -:10B0A00043990100000000F384B00100A6002D497F -:10B0B00019900100020000F280F40100B8002D4058 -:10B0C00081B20100000000F280C0010000000040D9 -:10B0D00082F8010019000040819801001D8EA040F7 -:10B0E000826C00002C010040819801001D8EA3405D -:10B0F000826C00000000004180B001001F8E204CD7 -:10B10000856C00000000004185C0010086002040E1 -:10B11000E4B10100A2002042E6B10100E08B004052 -:10B1200081B200000F97005081300100E08B004099 -:10B1300081B200000480000342C90100040022F033 -:10B1400080300000000000408DB001007F9800407A -:10B15000873001000400A25C1F7C0000B0002F5C5F -:10B160001F900100000060F080C001007C000040E2 -:10B17000439901000400A3F0806C00008697005FF3 -:10B1800081300100E08B004081B2000004000040EB -:10B1900081B20000E08B2246197C0000A000004034 -:10B1A00047990100010062F296CC0100E08BA640B5 -:10B1B000813200008697004A813001005B9700468B -:10B1C00095300100E08B004081B20000E08B224905 -:10B1D000197C00008600004047990100010062F2DE -:10B1E00080CC0100E08BA640813200008697004AA7 -:10B1F000813001005B97004795300100E08B0040F3 -:10B2000081B2000031940040813201000400A25C50 -:10B210001F7C0000E08B005C1F9000000400A24631 -:10B22000197C0000E08B004081B200000400A249BC -:10B23000197C0000E08B004081B20000BA000040A1 -:10B2400047990100010062F280C80100498E9040D8 -:10B2500080320000FFFF624081980100A40000409E -:10B2600047990100E08B2240E56D0000E08B004132 -:10B27000E5C100000F97004D81300100E08B0040D8 -:10B2800081B200005C00004047990100040022F0F8 -:10B290009630000000000040E1B101000080000392 -:10B2A00044C901000000004BE0B101000000004073 -:10B2B0008DB001007F980040873001008B00004076 -:10B2C00047990100598E80F396300000000000403D -:10B2D000E781010000000047199001000400A25C12 -:10B2E0001F7C0000E08B005C1F90000037000040D6 -:10B2F000439901000400A2F38032000034000040B2 -:10B300004599010001000040F5990100001100403D -:10B31000E5990100BF94004081320100718EA208BE -:10B32000803200003700004047990100000000F320 -:10B3300082B001000000635183D00100340000405E -:10B3400047990100010063F384CC0100698E9F429C -:10B35000803200000000634285B00100000000451B -:10B3600003F001000000000100C001006B8E375C9B -:10B37000613100000000001B62B101006C8EA84B1F -:10B38000191000000000000062B101006E8EA8409C -:10B3900081320000F087174081B200000080000376 -:10B3A00042C9010090002DF094B00100AC002DF0D6 -:10B3B00030B0010035002DF028B0010034002DF32D -:10B3C00084B00100040022F3846C000058003E4366 -:10B3D00085E0010001000018F0C901000000004AEA -:10B3E000E0B1010038002000E0B101003C00201B6A -:10B3F000E0B1010040002040E1B101000000004048 -:10B400002BB001006A9700400D30010000000018C9 -:10B4100016C00100828EA0141644000000000041F6 -:10B4200017C001000E0000A244C90100000000186E -:10B43000F8B10100B0002D14F8B101001050004027 -:10B44000879801008B8E224A197C0000003000434F -:10B4500086C801000030000B16C801008B8EA44086 -:10B46000813200000000004117C0010001006E435E -:10B4700086980100AE970030813001008F8EA04188 -:10B48000174000000000004117C00100968E224ABC -:10B49000197C0000080000A244C90100CC002DABBB -:10B4A000F9B10100000000AB17C00100958EA0F0BB -:10B4B000164400000000004117C00100000064F0C5 -:10B4C00082B00100900000404599010000006041F9 -:10B4D00031C00100BC000040439901009C8E060C65 -:10B4E00080320000A00020F2E4B10100040009460F -:10B4F000191000009C01004045990100FFFF000B5E -:10B50000988801008B002D5017F00100A18E904CFF -:10B51000164000000000004117C00100A38E224326 -:10B52000E77D00000000004445C1010000006620E6 -:10B5300017A4010068010040439901005C012EF24C -:10B5400080B00100020062407ECD01000000005783 -:10B5500081C0010000002E1048B10100030000402E -:10B56000F08D010000000008F0B101005801000555 -:10B57000E0C901000000004461B1010000000010BA -:10B5800062B10100AD8EA8408132000023830088A3 -:10B590001CB000000000000548B10100B18E454814 -:10B5A000613100000050000862DD0100B28EA84049 -:10B5B0000530000035001D4047990100010063F38C -:10B5C00084C80100B88EA043856C00000000634071 -:10B5D00085B001003700004047990100040022F3C4 -:10B5E0009E060000010063F382CC01000400A2412A -:10B5F0009E0600008B000040479901000400A24510 -:10B60000E77D000000000045E79101008697005F9C -:10B6100081300100E08B004081B200003700004023 -:10B6200047990100959500F394300100608E224AFD -:10B6300080320000D18C004081B200003700004011 -:10B6400047990100959500F3943001009A8C224AA5 -:10B6500080320000D18C004081B2000036000040F2 -:10B6600043990100000000FB12B001000F0000F33D -:10B6700090880100040000F30CF40100040026404F -:10B6800081320000CB8C2206906C00000400AA409E -:10B69000813200005C003D4313E00100A8002DF062 -:10B6A00094B0010004002240956C000037002FF098 -:10B6B00024B0010036002A50E7D1010000006341A8 -:10B6C00013C00100D88EA043136C0000000000409E -:10B6D000E7B101008F9300108630010023830088BA -:10B6E0001CB00000DA8E4205483100000000004422 -:10B6F00093930100CB8C1A5D699300000400A205AE -:10B70000486D000036002D1086B001005C003D43FE -:10B71000E7E10100A8002DF094B001000400224AE6 -:10B720008032000035002FF024B0010001006BFBD7 -:10B7300084C80100E78EA043856C000035002040DE -:10B74000E7B101000000004081B20100010063F395 -:10B7500012C80100EA8EA043136C000000000040F4 -:10B76000E7B101004080000344C901009293004A00 -:10B77000F0310100238300881CB00000ED8E4205EB -:10B7800048310000000000449393010000001A5D5E -:10B79000699301003700004047990100040022F33B -:10B7A0009E060000110063F382CC010004001F41DB -:10B7B00080320000C28D22419E060000350000400C -:10B7C0004399010058003D43E7E10100000000F803 -:10B7D00036B00100D08D00F000B000005E012D05F4 -:10B7E00048B10100FA8E65F21230000000993F4224 -:10B7F00013F00100FF8E2247E77D00002783758844 -:10B800001CB00000F98E004081B20000000000472B -:10B81000E791010000007542199001007500004099 -:10B8200061990100018FA8B10C300000A9960010A9 -:10B8300094300100238300881CB000005E012E05B7 -:10B8400048B10100C0A83D460DE0010000000040E5 -:10B8500097B001000B8F2240E16D0000040002410F -:10B8600097400000088F005043C10000178F224B03 -:10B87000803200000000624B1294010009000007B2 -:10B8800096E40100000000A797C0010030000010FE -:10B8900094C801000080004A449901000000004261 -:10B8A000F1B101005E01004BF0C901005E0100052D -:10B8B000E0C901000000004461B101002000004A1D -:10B8C00062DD0100158FA840813200000080001069 -:10B8D00044C9010000000050F1B10100040000095A -:10B8E00096E40100000068A897C00100D40000059C -:10B8F000E0C901000000004461B101000000001037 -:10B9000062B101001D8FA8408132000023830088AE -:10B910001CB0000000993F4213F00100218F6540E8 -:10B92000813200003F0000F39688010000000040D3 -:10B93000E7B101000000755561B10100000000068B -:10B9400062B10100258FA840813200002A8F224B6E -:10B95000803200000000004B62B10100288FA84037 -:10B96000813200000000009713B001000000009633 -:10B9700097B00100308F2009966C0000308F1F09AE -:10B9800096240000278300881CB000002B8F004005 -:10B9900081B200000F97005781300100C98B00056C -:10B9A00048B1000004002242197C00002E00004033 -:10B9B00043990100378F22F3803200000F97004235 -:10B9C00081300100F087004081B20000869700526C -:10B9D00081300100C98B004219800000040022421E -:10B9E000197C00000F97003A8130010086970052C1 -:10B9F00081300100C98B004081B20000000000408E -:10BA000005B001000596004095300100C98B224029 -:10BA1000956C0000240400408998010009990000F9 -:10BA20008A300100458FA2401F7C0000C99400406D -:10BA300081320100F087004081B2000004800003E1 -:10BA400042C90100000000F202B00100A5950052B9 -:10BA500095300100AC95004B02B00000F08700402B -:10BA600081B200002B98004095300100518FA20850 -:10BA700080320000518FA21680320000F0872242EF -:10BA8000197C00000000004B199001000F97003A4C -:10BA900081300100F087004081B20000002300A641 -:10BAA00016B00100548F831E803200000008000B86 -:10BAB00016DC0100000000002AC001005E970008AB -:10BAC00080300100588F005E179000007F97004380 -:10BAD000613101009E9300408D30010066970007A0 -:10BAE000161401000080001042C90100608F22403E -:10BAF000E36D00000000004361B101004000001050 -:10BB000062DD01005D8FA840813200002383008840 -:10BB10001CB000000097005E05100100C9940040B1 -:10BB200081320100648F2209803000008697004036 -:10BB300013300100D08B000548B100003C96004056 -:10BB400081320100C98B004081B200000400A24A8A -:10BB50001F7C00000000004A1F9001006C8F2243F0 -:10BB60003D7C0000000000441990010000000043EB -:10BB70003D8001006D8F0042199000000400A24F2B -:10BB80002B7C00000400A2451F7C000014002D4502 -:10BB90001F9001000400A2F0146C00000400A0013A -:10BBA000146C0000DF8F831E80320000DF8F0044A2 -:10BBB000199000002F000040439901000400A247A3 -:10BBC000E77D0000B494004081320100878FA20815 -:10BBD00080320000878FA21680320000838FA2423D -:10BBE000197C00000082000204DC0100A0980040E3 -:10BBF000479901003005004189300100808FA24142 -:10BC0000197C0000C994004081320100F087004097 -:10BC100081B20000A595001594300100AC95004B51 -:10BC200002B00000F087004081B200003C96004066 -:10BC3000813201000000004B199001000F97003A7B -:10BC400081300100F087004081B200008A8F2242DB -:10BC5000197C00003C960040813201008B8F00402F -:10BC600081B200000596004081320100C38F22415D -:10BC7000197C0000C000001598C80100C38FA00BFC -:10BC8000996C0000040022441F7C0000FF070000A4 -:10BC90007E8901000400A6408132000030000010BF -:10BCA00080C801000080004044990100000000505D -:10BCB000F1B1010000000003F0B1010000000042FA -:10BCC00061B101000000004062B10100968FA80040 -:10BCD000E0310000238300881CB000000000000554 -:10BCE00048B10100C000001598C8010030002E0BBB -:10BCF00099D0010000006A5099C001000400200B97 -:10BD0000996C0000C000620180CC01000C8000032F -:10BD100042C901002D002DF022B001000000004CAE -:10BD200080C001000000005C23800100D4003F417E -:10BD3000E7E1010004002242197C00000B0000F240 -:10BD400098E401000000005A998001000400A2005C -:10BD5000986C0000200400408998010009990011A6 -:10BD60008A3001000B000011E4F501002F0020478C -:10BD7000E7B50100AE8F230B816C00000000004F7F -:10BD8000E59101000000000880B00100C100000141 -:10BD900080CE01000400A440813200000000000BAE -:10BDA00003B001000000001502D001005E97000002 -:10BDB0002A4001000000004361B101004000001072 -:10BDC00062DD0100B58FA840813200002383008826 -:10BDD0001CB00000C994000548310100C0000001FA -:10BDE00080CE0100C18F261100300000100000003D -:10BDF0002AC801000000000880B001000000000116 -:10BE000080C00100C00000409998010000000001BE -:10BE100098D001005E97004C02300100C000004045 -:10BE200003980100CB8F004081B2000030002F0842 -:10BE300080B00100C0000015F4C90100C00000017D -:10BE4000E4CD0100C100000180CE01000400A44047 -:10BE5000813200000400200BE56D0000C0000040AE -:10BE6000039801005E9700002A400100D08F224411 -:10BE70001F7C0000AC002F4013B001000000000147 -:10BE8000E0C10100B000004047990100D18F0001DE -:10BE9000E0D100009E9300408D300100806300A639 -:10BEA00016B001006697000716140100008000100C -:10BEB00042C90100D98F2240E36D00000000004319 -:10BEC00061B101004000001062DD0100D68FA84082 -:10BED00081320000238300881CB000000097005EC0 -:10BEE00005100100DC8F2209803000008697004099 -:10BEF00081320100C98B000548B100000400A24A4C -:10BF00001F7C0000DF8F004A1F9000000400A24F3A -:10BF10002B7C00000400A25C1F7C00000400A244F3 -:10BF20001F7C00000000000010B0010024002D154F -:10BF300010C0010028002DF016B0010022002DF0E5 -:10BF400026B0010014002FF20CB001000000000127 -:10BF5000E0D101000000001032B001000000000B31 -:10BF60001BB0010004001F151A5000000000004023 -:10BF700023B00100000000012AB00100BE9600407D -:10BF800035B000002F002040E7B101002990A24504 -:10BF90001F7C00000400A205486D00002400200B57 -:10BFA000E0B1010028002013E0B1010022002006CA -:10BFB000E4B10100FD8F225C1F7C00000000005CEA -:10BFC0001F8001003080001042C90100FD8F224017 -:10BFD000E36D00000000004761B101004000001067 -:10BFE00062DD0100F98FA8408132000023830088C0 -:10BFF0001CB000000000000548B101001400004022 -:10C00000439901000400A2F0146C000000800019A4 -:10C0100042C9010022902240E36D000010902242AC -:10C02000197C000073960040813201005A94004050 -:10C03000813201001D90224B80320000000000433D -:10C0400061B101004000001062DD01000690A840CF -:10C0500081320000238300881CB000000C90224134 -:10C06000197C0000E7940040113001000D9000059C -:10C0700048B10000C9940040813201000F902209AC -:10C080008030000086970040813201002F830040FD -:10C0900005B0000073960040813201004F940040CB -:10C0A000813201000000004361B101004000001036 -:10C0B00062DD01001390A8408132000023830088D4 -:10C0C0001CB0000019902241197C0000E794004048 -:10C0D000113001001A90000548B10000C9940040D9 -:10C0E000813201001C9022098030000086970040B8 -:10C0F000813201002F83004005B0000000000043A2 -:10C1000061B101004000001062DD01001E90A840F6 -:10C1100081320000238300881CB00000000000056D -:10C1200048B1010025902241197C0000E7940040AD -:10C13000113001002690000548B10000C99400406C -:10C14000813201002890220980300000869700404B -:10C1500013300100D08B004005B0000014000040F7 -:10C16000439901000400A2F0146C00000080001943 -:10C1700042C9010032902240E36D000000000043FC -:10C1800061B101004000001062DD01002E90A84066 -:10C1900081320000238300881CB0000000000005ED -:10C1A00048B101000000004005B001003690224176 -:10C1B000197C0000E7940040113001003790000521 -:10C1C00048B10000C99400408132010008002D0AE6 -:10C1D00084B00100000000F082B00100040026409D -:10C1E0008132000014002040E1B101003D90031EA7 -:10C1F000803200003E90004187B0000021000040E6 -:10C20000879801002C960040813201000400A25C56 -:10C210001F7C00000000005C1F9001004390220979 -:10C220008030000086970040133001004690224481 -:10C23000197C00008697004F813001000000004407 -:10C2400019800100C98BA24A1F7C0000D08B0040DE -:10C2500081B200000400A205486D0000BA00204031 -:10C26000E5B101004E909C17803200000400224A84 -:10C27000197C0000CC000040439901003698004032 -:10C2800081320100D497004013300100C00000400B -:10C2900043990100C4002DF082B001000B9800F01A -:10C2A00084300100C994004081320100D08B220902 -:10C2B000803000008697004013300100D08B004092 -:10C2C00081B200002E000040439901005A902240A4 -:10C2D000E76D000032000040439901006590A240E4 -:10C2E000E56D0000F2950040813201002400200B32 -:10C2F000E0B1010028002013E0B101002200200677 -:10C30000E4B1010004002242197C00001400004046 -:10C31000439901000400A2F0803200001400200ABA -:10C32000E0B10100D08B22098030000086970040E8 -:10C3300013300100D08B004081B20000F295004024 -:10C34000813201009D9500408132010073902241AD -:10C35000197C00000000000B99B0010004001F15BB -:10C360009850000073902001986C0000700000034A -:10C3700048C9010000002E461F9001000000005037 -:10C38000F1B1010000000003F0B101000000004223 -:10C3900061B10100A00000A462DD01007090A8005E -:10C3A000E03100000000000548B10100AC002F00A2 -:10C3B00010B0010000000001E0C1010014002F15C1 -:10C3C00010C001000400A2F0803200000000000A4A -:10C3D00080B001000000600180D001000000004733 -:10C3E00019900100E98F2209803200008697000928 -:10C3F00080300100E98F004013B00000008000038E -:10C4000042C90100000000F082B0010013000040AA -:10C41000879801000000004C43C101002C9600F0F9 -:10C42000843001000400A25C1F7C0000C98B005C0A -:10C430001F9000002C002040E7B101002D0020409B -:10C44000E7B101002E000040439901000400A2F36F -:10C450008032000004002242197C0000C98B004297 -:10C46000198000001C960040813201005B97004853 -:10C47000953001000000004561B10100400000104E -:10C4800062DD01008D90A8401330000023830088F6 -:10C490001CB000009390000548B10000929000404D -:10C4A00013B000000000000012B0010008000040BE -:10C4B0004399010014002DF082B0010004002640D1 -:10C4C00081320000040022F084300000130000409C -:10C4D000879801002C960040813201000400A25C84 -:10C4E0001F7C00000000005C1F900100B09000095C -:10C4F00000B000000400A205486D0000C98B87420F -:10C50000191000008B002F4719800100C98B0040D3 -:10C51000E79100000400A2401F7C00002F000040B3 -:10C5200047990100AE902247E77D000004002241B8 -:10C53000197C00001D940040E7310100AE902200FC -:10C5400080320000A990A2401F7C0000C9940040E6 -:10C5500081320100AE90004081B200003000004006 -:10C560004399010032002DF294B00100A59500F22C -:10C5700002300100AC95004B02B000000000000545 -:10C5800048B10100AF90004001B000000000004041 -:10C5900005B00100B590220080320000B490A242A4 -:10C5A000197C00000596004081320100B5900040E2 -:10C5B00081B200003C960040813201005491225C1F -:10C5C0001F7C00000000005C1F8001000080001044 -:10C5D00042C90100BD902240E36D0000000000450B -:10C5E00061B101004000001062DD0100BA90A84076 -:10C5F00081320000238300881CB0000054910005A4 -:10C6000048B10000B494004081320100C490A208F7 -:10C6100080320000C490A216803200000F97004DB7 -:10C62000813001000082000204DC0100F08700403C -:10C6300081B200007400004043990100000000F83E -:10C6400082B00100000000F084B001000000004151 -:10C6500096B00100D5902242961400000080001090 -:10C6600044C9010064006840979801006400004BD1 -:10C6700080CE01000400A64081320000000000418D -:10C68000F0B1010000000042F0B1010070000005AF -:10C69000E0C901000000004561B101002000001068 -:10C6A00062DD0100D190A840813200000400A25C4C -:10C6B0001F7C00000000005C1F900100000000458E -:10C6C00061B101004000001062DD0100D690A85C5D -:10C6D0001F000000238300881CB000005E012D05B0 -:10C6E00048B10100DA9065F21230000000993F4233 -:10C6F00013F00100DF902247E77D00002783758853 -:10C700001CB00000D990004081B20000000000473A -:10C71000E79101000400750996E401000080001013 -:10C7200044C9010000000044F1B10100000068A804 -:10C7300097C0010000000003E0B101000080000389 -:10C74000449901000000004461B1010000000010A4 -:10C7500062B10100E790A840E13100002383008826 -:10C760001CB0000000993F4213F00100EB906505FA -:10C77000483100003F0000F39688010000000040AF -:10C78000E7B101000000754081B20100F390224B37 -:10C79000803200000000005561B101000000004B34 -:10C7A00062B10100F190A840813200000000000752 -:10C7B00016B001000062000B16DC01002F000040E3 -:10C7C000439901000400A247E77D00001D9400404A -:10C7D0008132010010912200803200004E96005FED -:10C7E00001100100F7902240956C000004002241E6 -:10C7F000197C0000040022401F7C00000080001013 -:10C8000044C9010000000050F1B101000000000324 -:10C81000F0B101000000004261B101000000001011 -:10C8200062B101000191A800E0310000238300887B -:10C830001CB000000000000548B1010004800003A6 -:10C8400042C90100000000F202B0010004002031E2 -:10C85000036C0000A595005295300100C99400407A -:10C8600081320100F7902241975000000C800003B4 -:10C8700042C90100000000F000B001000000005CAF -:10C8800001800100AC95004B02B00000F79000055C -:10C8900048B1000066970040033001001780000394 -:10C8A00044C9010000F0000C968801000000634CB0 -:10C8B00097F001000400204D976C00000400224016 -:10C8C000976C00001080000344C90100000000AB19 -:10C8D000E1B101000097005E0510010003000007B0 -:10C8E0001AF40100070000071688010000B5000DCA -:10C8F00046C901001C913040813200000400220B27 -:10C90000E67D00000000000BE681010000B7000D8D -:10C9100046C901000400220BE67D00000000000B68 -:10C92000E68101001000100F94F401009304005FF1 -:10C930009504010076950040813201002A91225031 -:10C94000FD7F000026914640813200002991A240DF -:10C95000316F000004001E4081B2000000001E4143 -:10C9600031D3010000002E0548B101000000004055 -:10C97000E1B10100000000400FB00100AB940041A4 -:10C9800081300100F087004081B20000B494004083 -:10C99000813201003D91A208803200003D91A21633 -:10C9A000803200000082000204DC0100000000452B -:10C9B00003F001000000000100C001003591375C68 -:10C9C000613100000000001B62B101003A91284073 -:10C9D000813200000400A25C777D000036910040A7 -:10C9E00081B200000000000062B101003A91A8404D -:10C9F00081320000F087174081B2000074002240AD -:10CA0000F1B1010000000040E1B101005B97004A74 -:10CA1000953001000400A25C1F7C00001C96005CA5 -:10CA20001F100100C490004081B200000400A24029 -:10CA30001F7C00002F0000404799010051912247C0 -:10CA4000E77D000004002241197C00001D94004095 -:10CA5000E731010051912200803200004C91A24048 -:10CA60001F7C0000C99400408132010051910040B8 -:10CA700081B20000300000404399010032002DF2E5 -:10CA800094B00100A59500F202300100AC95004B76 -:10CA900002B000000000000548B101005B970048AB -:10CAA000953001000400A25C1F7C00001C96005C15 -:10CAB0001F1001000400A205486D00005891874234 -:10CAC000191000008B002F47198001000000004062 -:10CAD000E79101008697004281300100C98B004038 -:10CAE00081B200001C960040813201000400A25C6B -:10CAF0001F7C0000C98B005C1F900000B00000404C -:10CB0000439901000400A2F080320000BA002040E6 -:10CB1000E5B10100D497004081320100C00000401F -:10CB200043990100C4002DF082B001000B9800F081 -:10CB300084300100C994004081320100869700458D -:10CB400081300100C98B2242197C00000F97003A06 -:10CB500081300100C98B004081B200000400004018 -:10CB600081B20000B4940040813201007091A208AB -:10CB7000803200007091A216803200000F970047AB -:10CB8000803001000082000204DC0100F0870040D8 -:10CB900081B200001080000344C9010000E100A63A -:10CBA00084B0010000000040F1B10100000000402D -:10CBB000F1B1010000006007849401000097005E5D -:10CBC00005100100C98B004081B200008A000040BE -:10CBD00047990100C9940041E7410100D08B004012 -:10CBE00081B200000400A205486D00000400A241CB -:10CBF000197C00000400A2481F7C0000F295004050 -:10CC0000813201000400A30A0C6C00009D950040D5 -:10CC100081320100000000012CB00100000000156D -:10CC200010B001000000000010C0010004001F0A45 -:10CC30002C50000014000040439901000400A2F0B1 -:10CC4000803200000000001032B00100A197000601 -:10CC5000043001008E91A2481F7C00008C91844812 -:10CC60001F100000AC000040479901008E91000A9F -:10CC7000E0C100000000000A02B001009E93000124 -:10CC80008C3001000000004361B101004000001041 -:10CC900062DD01008F91A84081320000238300886B -:10CCA0001CB000000000000548B1010000000002B7 -:10CCB00010C001009C91220214500000799600459A -:10CCC0001F0001008691225C1F7C000000000047CD -:10CCD00061B101004000001062DD01009891A85C84 -:10CCE0001F000000238300881CB00000869100050F -:10CCF00048B100000000000B1BB0010008002D40EF -:10CD000085B00100000000F082B00100000000408A -:10CD100005B001002C96004187300100000000455D -:10CD200061B101004000001062DD0100A291A84045 -:10CD300081320000238300881CB000000000000541 -:10CD400048B10100A8912209803000008697004078 -:10CD500013300100AC912244197C00008697004FEB -:10CD600081300100AC91A2471F7C0000000000440C -:10CD700019800100FF070008008C01000400264014 -:10CD800081320000BB91224A1F7C0000B391A216A1 -:10CD900002300000C9940040813201002F00204081 -:10CDA000E7B10100C98B004081B200002D002D08C1 -:10CDB0002AB00100B7912242197C00003C96004045 -:10CDC00081320100B891004081B200000596004018 -:10CDD0008132010030002E002AD0010032002A15D5 -:10CDE000E4B10100C98B0016E4B10000D191221614 -:10CDF000023000000400A2471F7C00000000000871 -:10CE00002AB001002B98004095300100C191A2404A -:10CE1000116C0000D29122402D6C00000400A2058C -:10CE2000486D0000040022441F7C0000AC0000405C -:10CE300047990100B0002B01E0C10100002B00A6C2 -:10CE400016B0010000000001E0D101005E9700086B -:10CE500080300100CA91005E179000007F97004368 -:10CE6000613101000000004361B101004000001089 -:10CE700062DD0100CB91A84081320000238300884D -:10CE80001CB000000000000548B1010066970007D3 -:10CE9000161401000097005E05100100C9940040BF -:10CEA000813201002F002040E7B10100D08B00400B -:10CEB00081B200000000000B1BB0010004001F1530 -:10CEC0001A500000E09120161A6C00000400224065 -:10CED0001F7C00007000000348C9010000002250C0 -:10CEE000F1B1010000000003F0B1010000000000FA -:10CEF000E0B101000000004261B10100A00000A407 -:10CF000062DD0100DD91A8461F1000000000000551 -:10CF100048B101000000000010B001000000001541 -:10CF200010C001000000000A2AB001000000000A41 -:10CF30002CD0010004001F168032000014000040B5 -:10CF4000439901000400A2F080320000AC002F40A1 -:10CF500023B00100EA9184451F100000EB91000A04 -:10CF6000E0C100000000000A02B00100BE960040CF -:10CF700035B000000400A25C1F7C00000080001996 -:10CF800042C90100F4912240E36D0000000000431B -:10CF900061B101004000001062DD0100F091A84085 -:10CFA00081320000238300881CB0000000000005CF -:10CFB00048B101000592A2021A5000000A922240D4 -:10CFC0002D6C0000040022401F7C00000080001037 -:10CFD00044C9010000000050F1B10100000000034D -:10CFE000F0B10100FF070008E08D010000000042E1 -:10CFF00061B101000000001062B10100FC91A84085 -:10D0000081320000238300881CB00000000000056E -:10D0100048B101002F002047E7B501000C80000354 -:10D0200042C90100100000F010C80100F0070040E4 -:10D030001B9801000A92005C118000000400A25FAE -:10D040001B7C0000FF070008988801000000000218 -:10D0500098C001000400200B996C00000000000241 -:10D0600010C0010004002240236C00000400A34310 -:10D07000236C0000E79400401F0001000000000541 -:10D0800048B101001092230D2C6C000000000040FC -:10D090001F900100199222461F7C000000000046EC -:10D0A0001F8001007080000342C9010019922240D4 -:10D0B000E36D00000000004261B10100400000107B -:10D0C00062DD01001592A8408132000023830088B0 -:10D0D0001CB000000000000548B1010008002D4010 -:10D0E00085B00100000000F082B0010000000040A7 -:10D0F00005B001002C96004187300100000000457A -:10D1000061B101004000001062DD01001E92A840E4 -:10D1100081320000238300881CB00000000000055D -:10D1200048B1010024922209803000008697004017 -:10D130001330010028922244197C00008697004F8A -:10D14000813001002892A2471F7C000000000044AB -:10D1500019800100FF070008008C01000400264030 -:10D16000813200003E92224A1F7C00002F92A216BC -:10D1700002300000C9940040813201002F0020409D -:10D18000E7B10100C98B004081B200002D002D08DD -:10D190002AB001003A922242197C00003392A2F395 -:10D1A00084300000000000A585B0010000000041AF -:10D1B00085D00100D4003E4185E001003792224035 -:10D1C0001F7C00000000005A119001000B000008B5 -:10D1D000E4F501003C960040813201003B920040A2 -:10D1E00081B20000059600408132010030002E001F -:10D1F0002AD0010032002A15E4B10100C98B0016C3 -:10D20000E4B100004192A21602300000C99400402F -:10D21000813201009A92004081B200002D002D0859 -:10D220002AB00100549222471F7C00000400A09104 -:10D23000036C00004E922242197C00004792A2F338 -:10D2400084300000000000A585B00100000000410E -:10D2500085D00100D4003E4185E001004B92224080 -:10D260001F7C00000000005A119001000B00000814 -:10D27000E4F50100200400408998010009990008A4 -:10D280008A30010058012D002AD0010060012DF0E4 -:10D2900010B00100000000F02CB0010000000016EA -:10D2A00080B2010004002740116C0000878F00400D -:10D2B00081B200000400A391036C00002B98004190 -:10D2C000953001005D92A208803200005D92A216A6 -:10D2D000803200000000004197B001005B92230DF6 -:10D2E000026C00000000004197C00100AC95004BAB -:10D2F00002B000009A92000548B100000400A205A7 -:10D30000486D0000040022441F7C0000AC002F0187 -:10D3100014B00100B0002B01E0C10100002B00A6F9 -:10D3200016B0010004002241197C00000000000139 -:10D33000E0D101007092230D026C0000008000100B -:10D3400044C9010000000050F1B1010000000003D9 -:10D35000F0B101000000004261B1010000000010C6 -:10D3600062B101006992A800E031000023830088C7 -:10D370001CB000000000000548B101000C80000353 -:10D3800042C90100100000F022C801000000005C4A -:10D39000238001000000000184B001007392230D7E -:10D3A000026C00000000000D02B001000000000847 -:10D3B00080B00100789222401B6C00005E97000153 -:10D3C0008450010081922240856C00000000000121 -:10D3D00080C001001080001046C901000000004F0D -:10D3E0004381010000000042F0B101002000004034 -:10D3F000F0C9010000000016F0B101000000004378 -:10D4000061B10100A00000A162DD01007E92A811BF -:10D41000E031000004002240236C00009092005E86 -:10D42000179000008492230D026C00000000000D94 -:10D4300002B001000000000184D001008992224066 -:10D440001B6C00007F9700436131010090922240E5 -:10D45000856C00000000000112C001001080001067 -:10D4600046C901000000004F438101000000004256 -:10D47000F0B1010000000009F0B101000000001847 -:10D48000F0B10100A00000A162DD01008E92A811A0 -:10D49000E03100000000004361B1010040000010D5 -:10D4A00062DD01009192A80A023000002383008807 -:10D4B0001CB00000C9940005483101009892230D6A -:10D4C000026C0000FF070011008C0100C9940040AD -:10D4D0008132010066970007161401000097005E74 -:10D4E000051001002F002040E7B10100D08B004063 -:10D4F00081B200000080000342C90100000000F872 -:10D5000082B001000400264081320000000000F8D3 -:10D510008CB00100000000F08EB00100EC950040DE -:10D520001330010004000C4780320000000000406E -:10D5300085B001002C960041873001009D95004088 -:10D540008132010004002091036C00000080001073 -:10D5500042C90100AE922240E36D00000000004588 -:10D5600061B101004000001062DD0100AA92A840F4 -:10D5700081320000238300881CB0000000000005F9 -:10D5800048B10100B0922209803000008697004027 -:10D59000133001000000000B1BB00100000000155B -:10D5A0001AD00100B792A241197C00002B980040CC -:10D5B000953001000000001680B20100C0922708DB -:10D5C00080320000C19100002AC000002B98004169 -:10D5D000953001000000001680B20100BB922708C0 -:10D5E000803200005D9200002AC00000000000416F -:10D5F00097B00100BE92230D026C000000000041B4 -:10D6000097C00100AC95004B02B00000000000057F -:10D6100048B10100C98B2242197C00000F97003AE3 -:10D6200081300100C98B004081B200000400A24A91 -:10D630001F7C0000C592004A1F9000000400A24118 -:10D64000197C00000400A24F2B7C00000400A244BF -:10D650001F7C00000400A2451F7C0000FF94000016 -:10D66000103001000000001510C001000000001083 -:10D6700032B00100A197000604300100D292A2440A -:10D680001F7C00000000000B1BB001000000000A1E -:10D690002CD001000000000A02B001009E9300019E -:10D6A0008C3001000080001942C90100D99222404B -:10D6B000E36D00000000004361B101004000001074 -:10D6C00062DD0100D592A8408132000023830088EA -:10D6D0001CB000000000000548B10100000000027D -:10D6E00010C00100E2922202145000007996004519 -:10D6F0001F000100CB92225C1F7C0000000000474D -:10D7000061B101004000001062DD0100DE92A85C02 -:10D710001F000000238300881CB00000CB9200058E -:10D7200048B1000008002D4085B00100000000F065 -:10D7300082B001000000004005B001002C960041BD -:10D74000873001000000004561B101004000001079 -:10D7500062DD0100E792A840813200002383008847 -:10D760001CB000000000000548B10100ED92220944 -:10D77000803000008697004013300100F092224470 -:10D78000197C00008697004F8130010000000044A2 -:10D7900019800100FF070008008C010004002640EA -:10D7A00081320000FF92224A1F7C0000F792A216ED -:10D7B00002300000C9940040813201002F00204057 -:10D7C000E7B10100C98B004081B200002D002D0897 -:10D7D0002AB00100FB922242197C00003C960040D6 -:10D7E00081320100FC92004081B2000005960040A9 -:10D7F0008132010030002E002AD0010032002A15AB -:10D80000E4B10100C98B0016E4B10000BC91A2167E -:10D8100002300000C9940040813201002F002040F6 -:10D82000E7B10100D08B004081B20000040022412A -:10D83000197C00000400A24F2B7C00000400A244CD -:10D840001F7C00000400A2451F7C00000400A24AC7 -:10D850001F7C0000FF94004A1F100100D4910010AB -:10D8600032B000008A002040E7B101000E93A241CF -:10D87000197C0000C99400408132010011930040DE -:10D8800081B20000A595001594300100AC95004BC5 -:10D8900002B000000000000548B1010013932242CD -:10D8A000197C00000F97003A8130010086970045EF -:10D8B00081300100C98B004081B2000065900045B5 -:10D8C0001F90000004002241197C00000400A247C0 -:10D8D0001F7C0000F2950040813201000400A30A81 -:10D8E0000C6C00009D95004081320100D491000134 -:10D8F0002CB0000004002241197C00000400A24862 -:10D900001F7C0000B4940040813201002C93A208D7 -:10D91000803200002C93A2168032000000820002A8 -:10D9200004DC01000000004503F0010000000001DC -:10D9300000C001002493375C613100000000001B2F -:10D9400062B1010029932840813200000400A25CEA -:10D95000777D00002593004081B2000000000000A8 -:10D9600062B101002993A84081320000F08717407E -:10D9700081B2000058012008E0B1010060012016CA -:10D98000E0B10100F29500471F1001000400A30A56 -:10D990000C6C00009D95004081320100D491000183 -:10D9A0002CB0000004002241197C00000400A247B2 -:10D9B0001F7C0000B49400471F1001004393A2088D -:10D9C000803200004393A216803200003F93A242AF -:10D9D000197C00000082000204DC0100A0980040D5 -:10D9E00047990100300500418930010004002241BF -:10D9F000197C0000A595001594300100AC95004BF2 -:10DA000002B00000F087004081B200003C96004068 -:10DA1000813201000000004B199001000F97003A7D -:10DA200081300100F087004081B2000058012008D9 -:10DA3000E0B1010060012016E0B101000400A24F36 -:10DA40002B7C00000400A2441F7C00000400A245BF -:10DA50001F7C0000FF94001032300100D491004080 -:10DA600013B00000B4940040813201005893A20822 -:10DA7000803200005893A21680320000008200021B -:10DA800004DC01000000004503F00100000000017B -:10DA900000C001005093375C613100000000001BA2 -:10DAA00062B1010055932840813200000400A25C5D -:10DAB000777D00005193004081B20000000000001B -:10DAC00062B101005593A84081320000F0871740F1 -:10DAD00081B200000080000342C90100000000F88C -:10DAE00082B001000400264081320000000000F8EE -:10DAF0008CB00100000000F08EB00100EC950040F9 -:10DB00001330010004000C47803200000000004088 -:10DB100085B001002C960041873001009D950040A2 -:10DB2000813201000400A091036C0000008000100D -:10DB300042C901006A932240E36D000000000045E5 -:10DB400061B101004000001062DD01006693A84051 -:10DB500081320000238300881CB000000000000513 -:10DB600048B10100878F220980300000869700406D -:10DB700013300100878F004081B200000400831E33 -:10DB8000803200000400A24F2B7C00000400A2455C -:10DB90001F7C000014002D451F9001000400A2F01E -:10DBA000146C00000400A001146C0000DF8F00441E -:10DBB000199000000400A24A1F7C00007893A24143 -:10DBC000197C00000000004A1F9001007A9100407B -:10DBD00081B200000400A2481F7C0000F295004AB8 -:10DBE0001F1001000400A30A0C6C00009D9500406A -:10DBF00081320100D49100012CB0000004002241C8 -:10DC0000197C00000400A24F2B7C00000400A244F9 -:10DC10001F7C00000400A2451F7C0000FF94004010 -:10DC200081320100D491001032B000008B0000401E -:10DC3000439901000400A246E77D0000659000457D -:10DC40001F9000000000004137C3010000000041A8 -:10DC500033C301003600000102CC01000000D240B5 -:10DC600081B200008C9385178032000000009F482D -:10DC700003D000008E939C178032000000009F4C60 -:10DC800003D000000000800134C301004080000385 -:10DC900044C901000000004AF0B101000400264020 -:10DCA0008132000000000040F1B1010000000012CC -:10DCB000F0B10100D1940041E13101000080004346 -:10DCC00044C9010010000040F19901000000004823 -:10DCD000F0B1010000000049F0B101004000000374 -:10DCE000E0C901000000004561B1010000000043EF -:10DCF00062B101000000A84081B200009B93004087 -:10DD000081B200002D04004089980100099900A506 -:10DD10008A300100BA002040E5B10100B0002F01B7 -:10DD20008CD0010004001FF080320000000000468B -:10DD3000E0C10100AC002F4013B00100CC002D0168 -:10DD4000E0C10100A9939C17803200000400224A20 -:10DD5000197C00003698004081320100AB932247C5 -:10DD6000197C00000000005F13900100D497004769 -:10DD700019100100C0002D441F900100C4002DF0B7 -:10DD800082B001000B9800F084B0000090002D05D7 -:10DD900048B10100C093A24B1F7C00001594A24C17 -:10DDA0001F7C0000C0931F1CE06D0000C393A20104 -:10DDB00080320000A8002D468FB00100B9931F1CCF -:10DDC000E06D0000B400004043990100BB9322F0D5 -:10DDD0003A6C000012941FF03A6C00000000A24060 -:10DDE00080B200000000804F8FB001008A00004028 -:10DDF0004399010013942042E76D0000BF93224035 -:10DE000080320000000080598FB00100000080586F -:10DE10008FB00100C2932240803200000000805C7D -:10DE20008FB001000000805B8FB00100AC000040AB -:10DE300043990100B0002DF084B00100C793A242C5 -:10DE4000246C0000D29323F0026C0000B00000A10B -:10DE500080CE01000400A64081320000CF93A2F0E2 -:10DE6000803200001494A242246C00001494A24159 -:10DE7000036C0000CE93A24080320000000080516D -:10DE80008FB00100000080528FB0010014941F1267 -:10DE9000845000001494A001846C0000C0930040E2 -:10DEA00081B200008B00004043990100FD93A2461F -:10DEB000E77D00001400004043990100EF9322F039 -:10DEC00014300000DB93200A026C0000EC93031E68 -:10DED00080320000DA93A2408032000000008044CB -:10DEE0008FB00100000080498FB00100E093220A4A -:10DEF000026C0000E393A241197C0000DF93A24072 -:10DF000080320000000080558FB001000000805674 -:10DF10008FB00100E293A2408032000000008043F5 -:10DF20008FB00100000080488FB0010000000001A8 -:10DF300082B001000000000A82D00100E993209124 -:10DF4000836C0000E893A2408032000026008040ED -:10DF50008F980100270080408F980100EB93A2402A -:10DF6000803200001F0080408F9801002000804018 -:10DF70008F980100EE93A240803200002200804082 -:10DF80008F980100230080408F98010088002D4465 -:10DF90008FB00100F893A241197C0000F593A243D1 -:10DFA0003D7C0000F593A2F2026C00000000A2404C -:10DFB00080B20000000080498FB00100F793A240BA -:10DFC00080320000000080438FB0010000008048D4 -:10DFD0008FB00100F593A091036C0000F3932243EE -:10DFE0003D7C0000FC93A24080320000280080406D -:10DFF0008F980100290080408F9801001400004094 -:10E00000439901000694A2F01430000088002D44CA -:10E010008FB001000394A2F2026C00000000A24045 -:10E0200080B20000000080498FB00100F5932241CA -:10E03000197C0000F3932091036C0000F5930040DD -:10E0400081B200000A94200A026C00000994A240E8 -:10E0500080320000000080448FB001000000804941 -:10E060008FB001000F94220A026C0000E393A241DA -:10E07000197C00000E94A240803200000000805500 -:10E080008FB00100000080568FB001001194A240B3 -:10E0900080320000000080438FB001000000804803 -:10E0A0008FB001001794004395B000001794004111 -:10E0B00095B000001794004295B0000017940044FA -:10E0C00095B000001794004C95B00000300400405B -:10E0D000899801000999004A8A3001005B97004045 -:10E0E000813201001C94A240803200000000804B6D -:10E0F0008FB001000000804C8FB001000400A20529 -:10E10000486D00002D000040439901002E002FF3C0 -:10E1100084B001002294A2F39630000000008040F9 -:10E1200001B001002D002A41E7D10100D4003D419A -:10E1300085E001000B0000F200E401002894225A5F -:10E14000017C0000000000401F9001002994005A4B -:10E1500001800000000000401F80010000006341BA -:10E1600085C001002C94A0A5856C000000006340D0 -:10E1700085B001001204004089980100099900004F -:10E180008A3001000000804081B201000000A0A59B -:10E19000856C01000000E34085B001000C800003A5 -:10E1A00042C9010012000040879801007F9800F0EA -:10E1B0008CB000000400225F1F7C000041942240CC -:10E1C0000F6C000000002F0548B101000400225A26 -:10E1D0001F7C0000100000F098F401000400A2076A -:10E1E000986C00001000000C98F401000400A207D5 -:10E1F000986C00003E94A24B197C00003F9422F0E2 -:10E20000186C00000000604B199001004395000756 -:10E21000103001002F83004005B000004394225AC3 -:10E220001F7C0000AB940040813001002F83004030 -:10E2300005B000000400225F1F7C000000002F05D5 -:10E2400048B101000000604B199001000400225AFF -:10E250001F7C0000040022400F6C0000100000F042 -:10E2600096F401000400A207966C00001000000C58 -:10E2700096F401000400A207966C00004395000785 -:10E28000103001002F83004005B000000400225F21 -:10E290001F7C000000002F0548B101000000604B0A -:10E2A000199001000400225A1F7C00000400224043 -:10E2B0000F6C0000100000F096F401000400A207AB -:10E2C000966C00001000000C96F401000400A207F8 -:10E2D000966C00004395000710300100000080405C -:10E2E00005B001005A943340813200005D94A1AD25 -:10E2F000952000006F94134081B200000000134A83 -:10E300005A8301003000394595E001000400A25F06 -:10E310005F7C00000400A25E5F7C00001F00000F15 -:10E320005ED801000000005A5F9001000000005E0E -:10E330005F9001000000004045B0010000000004B3 -:10E3400048B00100000000054AB001000000000CC8 -:10E3500058B00100000000074EB001001C850040CD -:10E360005D9801000400A2445F7C0000000000589A -:10E3700061B101000000004A62B101000000A84143 -:10E3800097B000006C94004081B200000000804013 -:10E3900097B001000400A240056C00001C990040E9 -:10E3A000813201007294600796300000FFFF004B3D -:10E3B00084890100000070C224B001007F94A2454E -:10E3C000257C000076943120853000008094221254 -:10E3D000487F000058041112480301001000001289 -:10E3E00096E401000000004B1E9401001704004059 -:10E3F00089980100000000128AB001000999005FAD -:10E400008B1001000000805A1F9001007F94314062 -:10E4100081320000000000B424B001008094221278 -:10E42000487F00005804004081320100170400407A -:10E4300089980100099900128A30010000002F0517 -:10E4400048B101008F940BF08430000000001112DD -:10E45000488301008C942250857000005E010040CA -:10E4600043990100B49600F2963001009304001223 -:10E47000943001000000005A1F90010010000012AB -:10E4800096E401000000804B1E9401001000004241 -:10E4900010F40100040022088032000000B73F435E -:10E4A00011F00100070000088A880100939430A150 -:10E4B0000C30000096942245E67D000080941040C8 -:10E4C00081B2000000002A45E69101000000101210 -:10E4D000488301000400A205486D000000001140BF -:10E4E00081B201000000604B858001005E010040A8 -:10E4F00043990100B49600F29630010000800010AC -:10E5000044C90100D8000040819801002E002D056B -:10E5100048B10100A2942240E76D00008000004055 -:10E5200080C8010000000040F0B1010009000008AF -:10E5300086E40100000068A787C0010000000044D5 -:10E5400061B101000000001062B10100A694A805AD -:10E55000E03100001000001296E401000014004BAE -:10E5600096DC01000000804B1E9401000400225A3A -:10E570001F7C00001000000F84F401001F00004207 -:10E5800084880100B094224080320000B19400429F -:10E5900068B10000000000426AB10100B194315A34 -:10E5A0001F0000000400A242487F000000009142CA -:10E5B00048930100B4943540813200006D00004062 -:10E5C00061990100BA9428B12C300000B594224D15 -:10E5D000757D0000000000402DB001000000954056 -:10E5E00011B001006D00004061990100BA94A8B11A -:10E5F000103000000000001680B20100040027085F -:10E60000803200000000954081B201007F00004090 -:10E6100061990100C59428B110300000BF949FBAE1 -:10E6200080320000150000408998010009990040DF -:10E63000813201000000804011B001000400225C22 -:10E64000117C00000400A25A117C00000400220882 -:10E650004806000000008024118401000400A25C30 -:10E66000017C00000400A25A017C0000040022008A -:10E670004806000004001FBB803200000000005F5D -:10E6800061B101000010000062DD01000000A8403F -:10E6900081B20000CE94004081B20000AC940040F2 -:10E6A00047990100D294324081320000DA9422F876 -:10E6B00096300000000000F890B00100000000F06B -:10E6C00092B001000000004880B201000400274918 -:10E6D000803200000100004BF0CD01002000924884 -:10E6E000E0C901006C00004061990100DE9428B18E -:10E6F00092300000DA94224C757D00000400124034 -:10E7000091B000006C00004061990100DE94A8B156 -:10E71000903000000000004980B20100040027484A -:10E7200080320000FF000048968801000000004B86 -:10E7300090D001000100004BF0CD01002000004806 -:10E74000F0C9010000009249E0B101000C002D1059 -:10E7500048B10100FF070008828C01000400A25CA0 -:10E76000837C0000FF0700F0008C01000400A25C25 -:10E77000017C000004002240016C00000000A24166 -:10E7800000EC0000F094221A006C0000C994000014 -:10E79000343001000000005049C10100EA94A24158 -:10E7A000235000000000804081B201000C002D10B9 -:10E7B00048B10100FF070015828C01000400A25C33 -:10E7C000837C0000FF0700F0008C01000400A25CC5 -:10E7D000017C000004002240016C00000000A24106 -:10E7E00000EC0000FC94220D006C0000C9940000B5 -:10E7F0001A3001000000005049C10100F694A24106 -:10E80000235000000000804081B201000195831E6A -:10E8100080320000000000441990010024002D0106 -:10E820002CB0010028002DF016B0010022002DF0C0 -:10E8300026B0010014002FF20CB001000400A2F079 -:10E84000146C000004002001146C000000008040E3 -:10E85000E1B10100300000409798010060972E4020 -:10E8600081B2010000000040F1B101000A95A2410F -:10E870009750000064973E439DE0010000008040F7 -:10E88000E1B1010064973E439DE001000000800B70 -:10E89000E8B1010064973F439DE00100000000F0F3 -:10E8A00016C0010000008040E1B1010064973F43C1 -:10E8B0009DE00100000000F416B00100000080405F -:10E8C000E1B1010060173D439DE00100100080A10F -:10E8D00016E401000400A207166C00001A040040B0 -:10E8E000899801001000000B8AE401000999000DCD -:10E8F0008A14010000B5000D42C901001D95304782 -:10E90000170400002095A20BE67D00000000904255 -:10E9100081B0010000B7000D46C901002495A20B8B -:10E92000E67D00000000000BE69101000000904130 -:10E9300081B001000000104081B201002595400720 -:10E94000963000009D040040813201002F95A245C1 -:10E95000957C000001973F4195E00100000000F325 -:10E9600096B001000000004EE6B1010040973E4025 -:10E9700097E001000000004EE6B1010040973E40E4 -:10E980009DE001004295003BE7B100002F9530402B -:10E99000813200003995A20BE67D000000B5000D24 -:10E9A00046C901003595A20BE67D0000000010402D -:10E9B00081B201000000984281B0010000B7000D53 -:10E9C00046C901000000000BE69101000000104064 -:10E9D00081B201000000984181B00100040021A231 -:10E9E000952000000000104A4483010000973E413A -:10E9F00095E001000000004EF6B101000000004E5D -:10EA0000E6B1010040973E409DE001000000003B60 -:10EA1000E7B101000000004A90B10100FFFF0007CC -:10EA2000928901000000984081B00100110400406B -:10EA300089980100099900088A3001000300000844 -:10EA400086F4010000B7004346C901000700000832 -:10EA50008288010004002208803200000400224164 -:10EA6000E67D00004A954008963000009D04004075 -:10EA70008132010058952245957C00005395225A19 -:10EA80001F7C00001000000F96F401004F95315FCD -:10EA9000970400000400A24B487F00000000114BC7 -:10EAA000489301000000004B6AB1010053953040CB -:10EAB0008132000004002241E67D00000000004198 -:10EAC000E68101000000104081B201000000984082 -:10EAD00081B2010000973F4195E00100000000F382 -:10EAE00096B0010040973D4097E00100000063F3BD -:10EAF00088B001006195A23B896C00000000004ACB -:10EB000090B10100010000A692B101000400A24AE8 -:10EB1000447F00006295184A4493000000001840AA -:10EB200081B201003F0400408998010016000012E4 -:10EB30008AE401000999004B8A140100300039452C -:10EB400097E001000400A25F5F7C00000400225EE9 -:10EB50005F7C00001F04002F7ED901000400A64046 -:10EB6000813200006E95225A1F7C00001F04000FA6 -:10EB700098D801000000004C5E94010070950005DB -:10EB80004AB000001F0400A75E840100000000409E -:10EB90004BB001000000005E5F9001000400A2087D -:10EBA0004E6C00000000005861B101000000004BF5 -:10EBB00062B101000000A84081B2000073950040DE -:10EBC00081B20000330400408998010009990007D0 -:10EBD0008A30010078954007963000009D0400407F -:10EBE000813201007C952245957C00000000984010 -:10EBF00081B201000400A24A447F00009B04004A45 -:10EC00004413010000973F4195E00100000000F32C -:10EC100096B0010040973D4097E00100000063F38B -:10EC200088B001003000384597E001000400A25F81 -:10EC30001F7C00000400225E1F7C0000040020AA4C -:10EC40000F6C00000000005F0F90010000000058F2 -:10EC500061B101000000004B62B101008895A8403D -:10EC6000813200007E95A23B896C0000300038455F -:10EC70009DE001000000984081B2010004002208DC -:10EC8000803200000300000894F4010000B7004A3D -:10EC900046C9010007000008968801000400224BC5 -:10ECA000E67D000093040012943001004395005A61 -:10ECB0001F0001000000805A1F9001001100004A4F -:10ECC000E6C901003000004A80CE01000400244063 -:10ECD0008132000034002F4F95840100000000F3C2 -:10ECE00096B001000100634B84C801000000A043FE -:10ECF000856C01000000E34085B0010030002D4428 -:10ED00001F90010032002DF22AB0010004002640BD -:10ED100081320000040022F2023000001D94001035 -:10ED20003230010004002200803200000400224240 -:10ED3000197C00003200A040E5B101000000004055 -:10ED400097B00100F0070040999801000000004AC8 -:10ED500002C001000000005003D00100000000418B -:10ED600097C001000000A34C02D00000A99500400C -:10ED700081B20000000000A836B00100BA9522411F -:10ED8000035000000080001044C901000000005042 -:10ED9000F1B1010070000003F0C901000000004261 -:10EDA00061B101000000001062B10100B295A8003D -:10EDB000E0310000238300881CB00000C9940040AB -:10EDC000813201007C80000342C90100040022401E -:10EDD000E16D0000000000F000B00100AD95005CA6 -:10EDE00001800000C9940040813201000000001B36 -:10EDF00010B1000068012D0682B00100000000F291 -:10EE000082C001000080000346C90100BF94004099 -:10EE100081320100E8952240116C00000000680872 -:10EE2000389601003A0400408998010009990008C9 -:10EE30008A300100F007004182CC0100BF95AA4151 -:10EE40003B400000000000F810B001000000005C32 -:10EE5000118001000400A3483B6C00000100001D6C -:10EE600004CC0100E695264623300000080000038C -:10EE700012C801000480000398C801000400A24CDD -:10EE8000426D00000400A205486D0000640120F0FE -:10EE9000E0B10100E595224105500000200000038B -:10EEA00048C901000C0000F886C801000000224497 -:10EEB000F1B1010000000043F0B1010000000009C1 -:10EEC000E0B101000000004461B10100A00000A415 -:10EED00062DD0100D795A8461F100000E49522418D -:10EEE00005500000E295A24123500000000000A15F -:10EEF0001AB001000000004461B1010040000010A0 -:10EF000062DD0100DD95A8462330000023830088E0 -:10EF10001CB000001000000348C901000000000DF3 -:10EF200042B101000000004413C00100D29500501E -:10EF300049C100000000000548B101000480000341 -:10EF40001AC801000400A205486D000000008040BE -:10EF500081B20100E69522403B6C0000000000F801 -:10EF600000B00100C994005C01000100E895004177 -:10EF70003BD0000000008D4780320100B0002F5FC1 -:10EF800013B00100000060F08CC001007C00004064 -:10EF9000439901000400A3F08C6C00000000804045 -:10EFA00081B201000080000342C90100000000F8A6 -:10EFB00094B00100000000F88CB00100F7958CF8C7 -:10EFC0008E3000000000004419900100040022F877 -:10EFD00014300000000000F816B00100000000F836 -:10EFE00026B0010008002EF80CB001000C002A4ADF -:10EFF000E0B1010028000000E0C901001000201B62 -:10F00000E0B101000496200A0C6C0000000000F83A -:10F0100094B00100000000F896B00100200020F03C -:10F02000E4B101001800204AE0B101001C00204BAF -:10F03000E0B10100EC95004013B000000400A2050F -:10F04000486D00002C002D42199001002E002FF376 -:10F0500082B00100000000F396B001000B96A2A55B -:10F06000976C00000000804195B001000E96A24010 -:10F07000976C00000000004083B001002D0020408C -:10F08000E7B101000000634197C00100D4003E4198 -:10F0900083E001000000004183C001001396A0A599 -:10F0A000836C00000000004083B001002C00204170 -:10F0B000E6B10100189622401F7C00000004000009 -:10F0C00098DC01000B00004CE4F5010019960040AB -:10F0D0001F8000000B000000E4F501001E0400404A -:10F0E00089980100099900008A30010000008040E1 -:10F0F00081B20100D1940040813201000080000300 -:10F1000042C9010004002240E16D000004800003B8 -:10F1100044C9010000000040F1B1010000000040BE -:10F12000F1B101000000604187B0010000800010D3 -:10F1300044C9010000000050F1B101000000004886 -:10F14000F0B1010000000049F0B10100000000032F -:10F15000E0B101000000004561B101002000001095 -:10F1600062DD01000000A85D0590000029960040C6 -:10F1700081B20000D1940040813201000080000380 -:10F1800044C9010000000041F0B101000400264024 -:10F190008132000000000042F0B101000000004098 -:10F1A000F1B1010000000043F0B101000080001047 -:10F1B00044C9010000000050F1B101000000004806 -:10F1C000F0B1010000000049F0B1010000000003AF -:10F1D000E0B101000000004561B101002000001015 -:10F1E00062DD01000000A85D059000003996004036 -:10F1F00081B200000400A205486D00000400820CEA -:10F20000803200002D000040439901002E002FF3B2 -:10F2100084B00100010063F396C8010043969F414A -:10F2200085500000010000A585CC01002D00204282 -:10F23000E6B101000400A3A5976C0000D4003D4195 -:10F2400085E001000B0000F298E401004A9622409C -:10F250001F7C00000400225A997C00000000005A24 -:10F26000998001000400A200986C00002004004076 -:10F2700089980100099900008A300100000080404F -:10F2800081B2010021040040899801000999000021 -:10F290008A3001000400A2006A0600005E012D0011 -:10F2A00080B001005596524381600000020000F2D8 -:10F2B00082F4010056960041809400000000005F37 -:10F2C000819001000000005E61B10100000000407B -:10F2D00062B101000000A84095B0000057969EBBA7 -:10F2E000803200005C96A2401F7C0000C994004060 -:10F2F00081B200000000804195B0010004000015BB -:10F3000042C90100000000542BC00100000000FCB5 -:10F3100024B00100000000FC38B00100000000FE35 -:10F320003CB00100000000FE3AB0010071969C174D -:10F33000803200006696A24A197C00000000804CD2 -:10F340001F9001000C00001E98F401006596A24871 -:10F35000996C00000000001542B101006596A28A78 -:10F36000F16D00000C00000102CC0100000000FC67 -:10F370003EB00100010000F428CC0100CC002D05B6 -:10F3800048B10100709620F03E6C00000000004B78 -:10F390001F9001000000004C2BC00100BF002D0594 -:10F3A00048B10100000080F33AE001000400A2052A -:10F3B000486D00001000000C96F401000400A20744 -:10F3C000966C000000002E4B1990010007002A0CDB -:10F3D000E4B1010000008004E6B101001800004023 -:10F3E000439901001C002DF016B0010020002DF003 -:10F3F00026B001000C002FF20CB001000000A206A4 -:10F4000014EC0000809622451F7C00000000A3063B -:10F410002AEC0000000000F894B00100000000F0A9 -:10F4200096B001000C002D4081B2010000002A4C72 -:10F43000E1C101003000001048C901000A0000408D -:10F44000F199010018000005F0C901000000004A10 -:10F45000F0B101000000004BE0B1010000000047E6 -:10F4600061B10100A00000A462DD01008A96A85CE1 -:10F470001F1000000000800548B101000400A295A3 -:10F48000036C000000002E1048B101004000000194 -:10F49000F0CD010040000003F0C901004000000071 -:10F4A000E0C9010000002E5049C101000000000623 -:10F4B000F1B1010000000003F0B101009596624235 -:10F4C000613100002000001062DD01009696A84026 -:10F4D000813200001000001062C901009896A80057 -:10F4E000E03100000000F24081B201000400A2956A -:10F4F000036C000000002E1048B101004000000124 -:10F50000F0CD010040000003F0C901004000000000 -:10F51000E0C9010000002E5049C1010000000006B2 -:10F52000F1B1010000000003F0B10100A3966242B6 -:10F53000613100002000001062DD0100A496A840A7 -:10F5400081320000A00000A462DD0100A696A800A0 -:10F55000E03100000000F24081B201003080004A3A -:10F5600044C9010000000006F1B10100C0A83D46F9 -:10F570000DE00100FF7F00A1F089010002000009F9 -:10F5800096F401000000004697E00100000060A82A -:10F5900097C00100B0966342613100003000004A1C -:10F5A00062C90100B196A840813200000000F3401A -:10F5B00081B2010000993F4297F00100B596654085 -:10F5C00081320000BD9622F3740600003F0000F374 -:10F5D0009488010000000007E785010000007555D0 -:10F5E00061B101000000004A62B101000000A840C2 -:10F5F00081B20000BA96004081B200000000F540E0 -:10F6000081B20100000000A836B00100CD96824111 -:10F6100023400000C296A2441F7C00009E9300017C -:10F620008C3001002080001042C90100C8962240A1 -:10F63000E36D00000000004361B1010040000010D4 -:10F6400062DD0100C596A840813200002383008856 -:10F650001CB000000000004123B0010000000010B9 -:10F6600032B00100CD962241197C0000E79400439E -:10F67000233001000000004123B00100CF96A31504 -:10F680000C6C0000D096000604B0000000000015CD -:10F6900004B00100D29620021A6C00000000000D98 -:10F6A00004B00100A197000548310100FD96220237 -:10F6B00014500000D696A2022A500000FD96A245E2 -:10F6C0001F7C0000D89622020C500000E196000238 -:10F6D00016C00000E096225C1F7C00003080001005 -:10F6E00042C90100E0962240E36D0000000000479F -:10F6F00061B101004000001062DD0100DC96A8400D -:10F7000081320000238300881CB000000000000547 -:10F7100048B101007996005C1F000100FD9622159A -:10F72000803200000000005033C00100FC96A202AD -:10F730001A500000ED9622461F7C000070800003E6 -:10F7400042C90100000000461F800100ED962240E2 -:10F75000E36D00000000004261B1010040000010B4 -:10F7600062DD0100E996A840813200002383008811 -:10F770001CB000000000000548B101000C8000032F -:10F7800042C90100040022F080320000100000F0A5 -:10F7900010C801002F002F5C1180010000000047FD -:10F7A000E7910100F00700401B980100BF9620156B -:10F7B0001A6C00007000000348C9010000002250CC -:10F7C000F1B1010000000003F0B10100FF070008E3 -:10F7D000E08D01000000004261B10100A00000A422 -:10F7E00062DD0100F996A8461F100000BF960005D3 -:10F7F00048B10000BF96000210C00000FF96A2446E -:10F800001F7C00009E9300018C3001000000001B53 -:10F8100010B100000080001044C901000C0000403D -:10F82000F199010010000008F0C901000000001665 -:10F83000F0B1010010000003E0C901000400A25C67 -:10F840001F7C00000000004561B101002000001095 -:10F8500062DD01000000A85C1F90000007970040D7 -:10F8600081B20000170000D0A2C901000000A24030 -:10F8700027EC00000000002000B00100C994004106 -:10F88000A34101000B97004127D00000360400403F -:10F8900089980100099900408A3001001000000792 -:10F8A00096E401000000004B809401000000005429 -:10F8B00061B101000080004062DD01000000A8404D -:10F8C00081B20000040014BB803200001497004095 -:10F8D00081B200000400A205486D00006A97004054 -:10F8E0002B300100AC002D0616C0010090002DF059 -:10F8F00016C401001E97A0F016440000000000414D -:10F9000017C001000E0000A244C9010000006CF005 -:10F9100030B00100AC002D4087B0010000006CF059 -:10F9200028B001002797224A197C000000300043CC -:10F9300086C801000030000B16C801002797A440BC -:10F94000813200000000004117C001004A972206E2 -:10F95000803200003597A206146C000032972248CE -:10F96000197C00002C97A0411740000000000041C6 -:10F9700017C001000000004131C0010090002018B4 -:10F98000E0B101008B002D48198001000400A24560 -:10F99000E77D00008B002045E7910100359700408E -:10F9A0008790000008000043869801003597A04822 -:10F9B000174000000000004117C00100B0000040E7 -:10F9C0004399010010500043FCC90100AE9700307C -:10F9D0008130010000000040E5B101004097224A5B -:10F9E000197C0000080000A244C90100CC002DAB26 -:10F9F000F9B10100000000AB17C001003F97A0F073 -:10FA0000164400000000004117C00100449764F054 -:10FA100082B00000A4000040479901004497A2F280 -:10FA20008032000000000041E5B101008C00201888 -:10FA3000E0B101009000004045990100000060061F -:10FA400030C001000000860C80B200000400A24912 -:10FA5000197C0000BC002D4619900100A000A0F206 -:10FA6000E4B10100B0000040439901001050004390 -:10FA7000FCC90100AE970030813001000000A24AAD -:10FA800019FC0000080000A244C90100CC002DAB05 -:10FA9000F9B10100000000AB17C001005397A0F0BE -:10FAA000164400000000004117C001000000E4F00F -:10FAB00082B001000080001044C901000000004134 -:10FAC000F0B1010000000003F0B1010000000000EF -:10FAD000F0B101000000001062B101000000A81B9D -:10FAE000E0B100005897004081B2000000F0000C27 -:10FAF0007E8901000000A64C956001000000804A4C -:10FB0000189401000080001044C901000400220183 -:10FB1000F031000020000040F0C901000000001694 -:10FB2000F0B101000000004361B1010020000010AD -:10FB300062DD01000000A815E0B1000063970040FD -:10FB400081B200001080000344C9010000000006DB -:10FB5000F0B1010000000001F0B101000000E85F19 -:10FB60001790010070000040439901007A012EFEB9 -:10FB700092B001008B002DF616B001007097224361 -:10FB8000E77D00000000004445C10100040000A61C -:10FB90002AB0010028006E0682C801007497224A2C -:10FBA000197C00000000004245D1010000006E4CAD -:10FBB00083C001000000004192C0010075974330EE -:10FBC0003D0700000000669E83B0010000001B415D -:10FBD0003DC301000000004192C00100060000A2E8 -:10FBE00044C901001000004998F401007E972630B6 -:10FBF000930400007E97904C92400000000000416A -:10FC000093C00100FFFF8049ECA9010000800010B3 -:10FC100044C9010004002201F03100000000000985 -:10FC2000F0B1010000000018F0B101002000001048 -:10FC300062DD01000000A815E0B1000083970040DC -:10FC400081B2000004002220816C000004002240E8 -:10FC5000816C00009597225F817C00009297A24002 -:10FC6000197C0000000000401990010000000054C1 -:10FC700061B101001000000796E401000000004F90 -:10FC8000979401000000004B62B101009297284058 -:10FC9000813200000400A254777D00008E9700405E -:10FCA00081B20000250400408998010009990040B4 -:10FCB0008A3001000000A221818400009897A25F91 -:10FCC000816C00000000A243197C01000000004389 -:10FCD000199001002504004089980100099900400D -:10FCE0008A3001000000005461B1010010000007DB -:10FCF00096E4010000000040969401000000004BD3 -:10FD000062B101000000A84081B200000400A254CA -:10FD1000777D00009D97004081B20000040022081A -:10FD2000803200000400220280320000A697A24B1D -:10FD3000FD7F0000B405000280CE01000400AA404F -:10FD4000813200000080001944C901000400220231 -:10FD5000F03100000000000BF0B1010000000013C2 -:10FD6000F0B101000000004361B101002000001962 -:10FD700062DD01000000A808E0B10000AB97004080 -:10FD800081B200000400A205486D0000B00000A18F -:10FD900080CE01000400A640813200007C002DF0DE -:10FDA00084B00100020000F098F40100B797204CE5 -:10FDB000846C00008800004043990100B79720F24E -:10FDC000846C00000000004085B0010098002D14F4 -:10FDD00082B00100000000F098B00100A3002D14D3 -:10FDE00098D00100BC97204C846C00000000004CAF -:10FDF00084B001000400A230816C0000000000F318 -:10FE000080E00100C0972340846C000000000040A7 -:10FE100084B00100D0002014E0B101009800254218 -:10FE200080B0010000006EF380F001000000A642E7 -:10FE300082C00000C697A0401640000000000041AC -:10FE400017C0010000009FF082EC00009800A04164 -:10FE5000E0B101000400A25C1F7C000037040040F8 -:10FE600089980100099900058A30010000000042CC -:10FE700061B1010000002E1048B10100A80100404E -:10FE8000F199010000000005F0B101000900000730 -:10FE900096E40100000060A797C001000000001078 -:10FEA00062B101000000A84081B20000D19700407B -:10FEB00081B20000A8002D1C8AB0010000009FF054 -:10FEC0008AD000000000A2408BEC00008A00204095 -:10FED000E7B10100B400004047990100A4002D459E -:10FEE000E0D10100DF979C17803200000400224A15 -:10FEF000197C0000BE002FAB83B001003C980014B9 -:10FF000082500100E497004081B20000E49722F2A1 -:10FF1000823000008C00004043990100E4979F1C50 -:10FF2000E06D0000BE000040479901003C98004091 -:10FF300081320100A800201CE0B101009C002D309E -:10FF400081B0010088002DF084B0010094002DF2F2 -:10FF500086B00100F89723F0846C0000EC972392A0 -:10FF6000876C0000C90400A694B00100EE97004021 -:10FF700081B20000200000A694B001006089004A10 -:10FF800094980100EE9768408132000004002240FE -:10FF9000BD7D00000000004AB0B10100BF002D424D -:10FFA000B2B1010090002DF380E00100F397D4403E -:10FFB00081320000000078DA84C00100FD97234000 -:10FFC000846C00009400209DE1B10100FD97004089 -:10FFD00084B00000BF002D4384C0010090002DF3C9 -:10FFE00080E00100FD972340846C00009400209D78 -:10FFF000E1B101000000004084B001000198A2F0CE -:020000021000EC -:10000000386C00009C002042E0B101000000005F5D -:100010001394010000008046198001009C002042DA -:10002000E0B101003700004043990100040000F3F3 -:1000300080F401000F0000F382880100079823413B -:10004000806C00000000005F139401000000890C28 -:1000500080B200000400860C80320000BC0000402A -:1000600043990100A000A0F2E4B1010000009F410B -:1000700024EC00001398A6408132000000009F424B -:1000800038EC00001398A64081320000B400004014 -:10009000439901001598A3F03A6C00000400A440B5 -:1000A000813200000000804081B20100B4000040B5 -:1000B00043990100199822F03A6C0000B400201D09 -:1000C000E0B1010080002D5F13940100199823F026 -:1000D0003A6C00008000201DE0B10100C000201239 -:1000E000E0B10100C400A01CE0B101002704004001 -:1000F00089980100099900428A3001000400A20594 -:10010000486D00000080000344C901000000004267 -:10011000E0B10100120000408798010025989F413E -:10012000246C0000000000418CB0010000000012AF -:100130008CD001002698004124B00000000000404F -:100140008DB001007F980040813201000000004521 -:1001500061B101004000001062DD01000000A84014 -:1001600081B200002898004081B20000B4940040A1 -:10017000813201000000001680B201000000A708D3 -:10018000803201003204004089980100099900087A -:100190008A3001003298A240956C0000C99400405A -:1001A00081320100008200A604B00100000000407E -:1001B0002DB00100A0982F4011B001003005004182 -:1001C00089B00000CC0000A180CE01000400A64050 -:1001D0008132000000009FF83EEC000000009F12FA -:1001E000E0ED0000C80020ABE1B10100CC00A01F91 -:1001F000E0B101000400A205486D00003F98A35F34 -:10020000E76D000000000041E7C10100A6000040CA -:1002100047990100539822F2863000000300004302 -:1002200084F401000100004180CC0100B8002D429F -:1002300080D001000000624086C0010047981F4343 -:10024000803200004898A240876C000000006241A4 -:1002500087B001004C989F408032000000000040B1 -:1002600085B001000000004084D001000000004281 -:1002700080B00100000000F288B0010002000044DC -:1002800084F40100B8002E4280D0010000006240DA -:1002900088C0010052981F44803200005698A24046 -:1002A000896C00005698624189B0000003006241E9 -:1002B00086E40100B8000040459901000100624158 -:1002C00088E40100A4002040E5B10100A200204024 -:1002D000E7B10100BC002E4387F00100000000449C -:1002E00086C001005C982043876C000000008043BA -:1002F000E5B101004001004380CE01000000A443AD -:10030000E43101004001E240879801000400A205A9 -:10031000486D00000400220A8032000088002D444D -:1003200081B0010090002DF22EB001009C002DF054 -:1003300086B0010090002DF082B00100BA002DF0CF -:1003400098B001006B98A212986C0000BC002DF2CE -:1003500098B001006B98A0F2986C000000000017A4 -:1003600082B001009C002041E0B10100B4002D12D8 -:1003700086D001006E98A341E06D00006F9800F0F8 -:1003800084B000000000004184B0010080002D43D3 -:1003900084D0010072989F4280320000000000402B -:1003A00085B001007498A342146C00007598000A8F -:1003B0000CB00000000000420CB001007798A017BC -:1003C0000C6C0000000080170CB001007C982240EB -:1003D0000D6C00000000A00A0CEC0000010000F011 -:1003E00082F401007C98A0410C6C00000000A2F097 -:1003F00080320100290000408998010009990040DD -:10040000813201000000804081B00100D1940040A1 -:1004100081320100040022038032000004800003C6 -:1004200044C9010000000046F0B101000000004096 -:10043000F1B10100000060418794010000800010CC -:1004400044C9010000000050F1B101000000004863 -:10045000F0B1010000000049F0B10100000000030C -:10046000E0B101000000004561B101002000001072 -:1004700062DD01000000A85D059000008B9800403F -:1004800081B200000400A205486D00001000000CBD -:1004900096F401000400A207966C000000002E4BA9 -:1004A0001990010005002A0CE4B10100000080044D -:1004B000E6B101003E040040899801000999000856 -:1004C0008A3001009698454861310000001000080C -:1004D00062DD01009C9828408730000097982248F0 -:1004E000777D000004002240276C00000A971D461B -:1004F00087B000009F98225F117C00000400221545 -:10050000623100009D98A8408132000000009D40AB -:1005100081B201000000004049B1010000142F4CDD -:1005200083B0010000000040F1B10100A298A24197 -:10053000835000000000804081B2010000000040B4 -:1005400049B1010030000040A199010000000040C5 -:1005500093B00100000000401FB00100F698004970 -:10056000963001000700004906E40100003900034D -:1005700006C801000000004005B00100200000D0C6 -:10058000A0C901000000004193C00100A998A05437 -:10059000936C000000002E0597B001000080004021 -:1005A0004999010000000040E1B10100000200A2F1 -:1005B00044C90100B298A2419750000000000020F9 -:1005C00049B30100FC980040493101000895004002 -:1005D0008132010000B52E0897B0010000000040F4 -:1005E000F1B10100B998A2419750000018000040F5 -:1005F0009798010000972E4081B201000000004052 -:10060000F1B10100BD98A2419750000000000040E8 -:1006100049B1010040182E0597B0010000000040CC -:10062000F1B10100C198A2419750000057952040B8 -:10063000E7B101003094004045990100640000409A -:10064000E599010056952040E7B10100B89420419A -:10065000E5B10100BA942041E5B101009894004051 -:1006600045990100020000409798010000000040F9 -:10067000F1B10100CB98A24197500000000000406A -:1006800097B00100000000406FB101000000004B76 -:1006900068B10100CF988541974000008004004078 -:1006A000813201000000004039B301000000004029 -:1006B00037B301000000004035B3010000000040E6 -:1006C00033B301000000004041B3010000000040CE -:1006D0003FB30100EE050040259B010042000040B1 -:1006E0004B9B0100000000402FB3010000000040C0 -:1006F0002DB301000000004047B30100000000409E -:1007000043B30100600000402B9B01000000005437 -:10071000EF93010000000055F1930100FFFF00A5D9 -:100720003C8B01000000002C5BB301000000002C9A -:1007300045B301000000004059B301000000004033 -:1007400057B301000000004027B301000000004043 -:1007500053B30100EB98A250FD7F0000EB98A2512B -:10076000FD7F0000EC9800401DB3000050460040A3 -:100770001D9B010000C000A688B30100FF3F00A63A -:100780003AB3010000C0009D3B9B0100B40500404E -:10079000239B0100000000404DB30100080A00A6A1 -:1007A00014B301000101008A159B01000000002024 -:1007B00087B30100008000A656B101000000805EF2 -:1007C00057B501001800004B20E401000600004B63 -:1007D00096E401000043004B96C801001800001089 -:1007E00020DC01000000004B209401000000805735 -:1007F0002190010000992E0A97B0010000000040EE -:10080000F1B10100FD98A2419750000000030040A3 -:100810009798010000A900404599010000000040A0 -:10082000F1B101000199A241975000003000004051 -:10083000979801000000005561B101000000004BD5 -:1008400062B101000599A840813200000599A241DA -:10085000975000000000804081B201001000004E5F -:1008600098E4010000000007989401000000004394 -:1008700099E0010000000080989401000000004809 -:1008800099E001000000004C889401000F996A4033 -:10089000813200001299224F777D0000F004004061 -:1008A000813201000000004F61B1010000000044EE -:1008B00062B101001399A840813200001A99224ABE -:1008C000897C00001899224F777D0000F0040040D9 -:1008D000813201000000004562B101001899A84072 -:1008E000813200000000FA4081B201000000804027 -:1008F00081B201000400A25A1F7C00001000000F0A -:1009000098F401000400A25F9904000000008040F8 -:1009100081B201000000804081B20100040000406B -:1009200081B200000400004081B2000004000040D9 -:1009300081B200000400004081B2000004000040C9 -:1009400081B200000400004081B2000004000040B9 -:1009500081B200000400004081B2000004000040A9 -:1009600081B200000400004081B200000400004099 -:1009700081B200000400004081B200000400004089 -:1009800081B200000400004081B200000400004079 -:1009900081B200000400004081B200000400004069 -:1009A00081B200000400004081B200000400004059 -:1009B00081B200000400004081B200000400004049 -:1009C00081B200000400004081B200000400004039 -:1009D00081B200000400004081B200000400004029 -:1009E00081B200000400004081B200000400004019 -:1009F00081B200000400004081B200000400004009 -:100A000081B200000400004081B2000004000040F8 -:100A100081B200000400004081B2000004000040E8 -:100A200081B200000400004081B2000004000040D8 -:100A300081B200000400004081B2000004000040C8 -:100A400081B200000400004081B2000004000040B8 -:100A500081B200000400004081B2000004000040A8 -:100A600081B200000400004081B200000400004098 -:100A700081B200000400004081B200000400004088 -:100A800081B200000400004081B200000400004078 -:100A900081B200000400004081B200000400004068 -:100AA00081B200000400004081B200000400004058 -:100AB00081B200000400004081B200000400004048 -:100AC00081B200000400004081B200000400004038 -:100AD00081B200000400004081B200000400004028 -:100AE00081B200000400004081B200000400004018 -:100AF00081B200000400004081B200000400004008 -:100B000081B200000400004081B2000004000040F7 -:100B100081B200000400004081B2000004000040E7 -:100B200081B200000400004081B2000004000040D7 -:100B300081B200000400004081B2000004000040C7 -:100B400081B200000400004081B2000004000040B7 -:100B500081B200000400004081B2000004000040A7 -:100B600081B200000400004081B200000400004097 -:100B700081B200000400004081B200000400004087 -:100B800081B200000400004081B200000400004077 -:100B900081B200000400004081B200000400004067 -:100BA00081B200000400004081B200000400004057 -:100BB00081B200000400004081B200000400004047 -:100BC00081B200000400004081B200000400004037 -:100BD00081B200000400004081B200000400004027 -:100BE00081B200000400004081B200000400004017 -:100BF00081B200000400004081B200000400004007 -:100C000081B200000400004081B2000004000040F6 -:100C100081B200000400004081B2000004000040E6 -:100C200081B200000400004081B2000004000040D6 -:100C300081B200000400004081B2000004000040C6 -:100C400081B200000400004081B2000004000040B6 -:100C500081B200000400004081B2000004000040A6 -:100C600081B200000400004081B200000400004096 -:100C700081B200000400004081B200000400004086 -:100C800081B200000400004081B200000400004076 -:100C900081B200000400004081B200000400004066 -:100CA00081B200000400004081B200000400004056 -:100CB00081B200000400004081B200000400004046 -:100CC00081B200000400004081B200000400004036 -:100CD00081B200000400004081B200000400004026 -:100CE00081B200000400004081B200000400004016 -:100CF00081B200000400004081B200000400004006 -:100D000081B200000400004081B2000004000040F5 -:100D100081B200000400004081B2000004000040E5 -:100D200081B200000400004081B2000004000040D5 -:100D300081B200000400004081B2000004000040C5 -:100D400081B200000400004081B2000004000040B5 -:100D500081B200000400004081B2000004000040A5 -:100D600081B200000400004081B200000400004095 -:100D700081B200000400004081B200000400004085 -:100D800081B200000400004081B200000400004075 -:100D900081B200000400004081B200000400004065 -:100DA00081B200000400004081B200000400004055 -:100DB00081B200000400004081B200000400004045 -:100DC00081B200000400004081B200000400004035 -:100DD00081B200000400004081B200000400004025 -:100DE00081B200000400004081B200000400004015 -:100DF00081B200000400004081B200000400004005 -:100E000081B200000400004081B2000004000040F4 -:100E100081B200000400004081B2000004000040E4 -:100E200081B200000400004081B2000004000040D4 -:100E300081B200000400004081B2000004000040C4 -:100E400081B200000400004081B2000004000040B4 -:100E500081B200000400004081B2000004000040A4 -:100E600081B200000400004081B200000400004094 -:100E700081B200000400004081B200000400004084 -:100E800081B200000400004081B200000400004074 -:100E900081B200000400004081B200000400004064 -:100EA00081B200000400004081B200000400004054 -:100EB00081B200000400004081B200000400004044 -:100EC00081B200000400004081B200000400004034 -:100ED00081B200000400004081B200000400004024 -:100EE00081B200000400004081B200000400004014 -:100EF00081B200000400004081B200000400004004 -:100F000081B200000400004081B2000004000040F3 -:100F100081B200000400004081B2000004000040E3 -:100F200081B200000400004081B2000004000040D3 -:100F300081B200000400004081B2000004000040C3 -:100F400081B200000400004081B2000004000040B3 -:100F500081B200000400004081B2000004000040A3 -:100F600081B200000400004081B200000400004093 -:100F700081B200000400004081B200000400004083 -:100F800081B200000400004081B200000400004073 -:100F900081B200000400004081B200000400004063 -:100FA00081B200000400004081B200000400004053 -:100FB00081B200000400004081B200000400004043 -:100FC00081B200000400004081B200000400004033 -:100FD00081B200000400004081B200000400004023 -:100FE00081B200000400004081B200000400004013 -:100FF00081B200000400004081B200000400004003 -:1010000081B200000400004081B2000004000040F2 -:1010100081B200000400004081B2000004000040E2 -:1010200081B200000400004081B2000004000040D2 -:1010300081B200000400004081B2000004000040C2 -:1010400081B200000400004081B2000004000040B2 -:1010500081B200000400004081B2000004000040A2 -:1010600081B200000400004081B200000400004092 -:1010700081B200000400004081B200000400004082 -:1010800081B200000400004081B200000400004072 -:1010900081B200000400004081B200000400004062 -:1010A00081B200000400004081B200000400004052 -:1010B00081B200000400004081B200000400004042 -:1010C00081B200000400004081B200000400004032 -:1010D00081B200000400004081B200000400004022 -:1010E00081B200000400004081B200000400004012 -:1010F00081B200000400004081B200000400004002 -:1011000081B200000400004081B2000004000040F1 -:1011100081B200000400004081B2000004000040E1 -:1011200081B200000400004081B2000004000040D1 -:1011300081B200000400004081B2000004000040C1 -:1011400081B200000400004081B2000004000040B1 -:1011500081B200000400004081B2000004000040A1 -:1011600081B200000400004081B200000400004091 -:1011700081B200000400004081B200000400004081 -:1011800081B200000400004081B200000400004071 -:1011900081B200000400004081B200000400004061 -:1011A00081B200000400004081B200000400004051 -:1011B00081B200000400004081B200000400004041 -:1011C00081B200000400004081B200000400004031 -:1011D00081B200000400004081B200000400004021 -:1011E00081B200000400004081B200000400004011 -:1011F00081B200000400004081B200000400004001 -:1012000081B200000400004081B2000004000040F0 -:1012100081B200000400004081B2000004000040E0 -:1012200081B200000400004081B2000004000040D0 -:1012300081B200000400004081B2000004000040C0 -:1012400081B200000400004081B2000004000040B0 -:1012500081B200000400004081B2000004000040A0 -:1012600081B200000400004081B200000400004090 -:1012700081B200000400004081B200000400004080 -:1012800081B200000400004081B200000400004070 -:1012900081B200000400004081B200000400004060 -:1012A00081B200000400004081B200000400004050 -:1012B00081B200000400004081B200000400004040 -:1012C00081B200000400004081B200000400004030 -:1012D00081B200000400004081B200000400004020 -:1012E00081B200000400004081B200000400004010 -:1012F00081B200000400004081B200000400004000 -:1013000081B200000400004081B2000004000040EF -:1013100081B200000400004081B2000004000040DF -:1013200081B200000400004081B2000004000040CF -:1013300081B200000400004081B2000004000040BF -:1013400081B200000400004081B2000004000040AF -:1013500081B200000400004081B20000040000409F -:1013600081B200000400004081B20000040000408F -:1013700081B200000400004081B20000040000407F -:1013800081B200000400004081B20000040000406F -:1013900081B200000400004081B20000040000405F -:1013A00081B200000400004081B20000040000404F -:1013B00081B200000400004081B20000040000403F -:1013C00081B200000400004081B20000040000402F -:1013D00081B200000400004081B20000040000401F -:1013E00081B200000400004081B20000040000400F -:1013F00081B200000400004081B2000004000040FF -:1014000081B200000400004081B2000004000040EE -:1014100081B200000400004081B2000004000040DE -:1014200081B200000400004081B2000004000040CE -:1014300081B200000400004081B2000004000040BE -:1014400081B200000400004081B2000004000040AE -:1014500081B200000400004081B20000040000409E -:1014600081B200000400004081B20000040000408E -:1014700081B200000400004081B20000040000407E -:1014800081B200000400004081B20000040000406E -:1014900081B200000400004081B20000040000405E -:1014A00081B200000400004081B20000040000404E -:1014B00081B200000400004081B20000040000403E -:1014C00081B200000400004081B20000040000402E -:1014D00081B200000400004081B20000040000401E -:1014E00081B200000400004081B20000040000400E -:1014F00081B200000400004081B2000004000040FE -:1015000081B200000400004081B2000004000040ED -:1015100081B200000400004081B2000004000040DD -:1015200081B200000400004081B2000004000040CD -:1015300081B200000400004081B2000004000040BD -:1015400081B200000400004081B2000004000040AD -:1015500081B200000400004081B20000040000409D -:1015600081B200000400004081B20000040000408D -:1015700081B200000400004081B20000040000407D -:1015800081B200000400004081B20000040000406D -:1015900081B200000400004081B20000040000405D -:1015A00081B200000400004081B20000040000404D -:1015B00081B200000400004081B20000040000403D -:1015C00081B200000400004081B20000040000402D -:1015D00081B200000400004081B20000040000401D -:1015E00081B200000400004081B20000040000400D -:1015F00081B200000400004081B2000004000040FD -:1016000081B200000400004081B2000004000040EC -:1016100081B200000400004081B2000004000040DC -:1016200081B200000400004081B2000004000040CC -:1016300081B200000400004081B2000004000040BC -:1016400081B200000400004081B2000004000040AC -:1016500081B200000400004081B20000040000409C -:1016600081B200000400004081B20000040000408C -:1016700081B200000400004081B20000040000407C -:1016800081B200000400004081B20000040000406C -:1016900081B200000400004081B20000040000405C -:1016A00081B200000400004081B20000040000404C -:1016B00081B200000400004081B20000040000403C -:1016C00081B200000400004081B20000040000402C -:1016D00081B200000400004081B20000040000401C -:1016E00081B200000400004081B20000040000400C -:1016F00081B200000400004081B2000004000040FC -:1017000081B200000400004081B2000004000040EB -:1017100081B200000400004081B2000004000040DB -:1017200081B200000400004081B2000004000040CB -:1017300081B200000400004081B2000004000040BB -:1017400081B200000400004081B2000004000040AB -:1017500081B200000400004081B20000040000409B -:1017600081B200000400004081B20000040000408B -:1017700081B200000400004081B20000040000407B -:1017800081B200000400004081B20000040000406B -:1017900081B200000400004081B20000040000405B -:1017A00081B200000400004081B20000040000404B -:1017B00081B200000400004081B20000040000403B -:1017C00081B200000400004081B20000040000402B -:1017D00081B200000400004081B20000040000401B -:1017E00081B200000400004081B20000040000400B -:1017F00081B200000400004081B2000004000040FB -:1018000081B200000400004081B2000004000040EA -:1018100081B200000400004081B2000004000040DA -:1018200081B200000400004081B2000004000040CA -:1018300081B200000400004081B2000004000040BA -:1018400081B200000400004081B2000004000040AA -:1018500081B200000400004081B20000040000409A -:1018600081B200000400004081B20000040000408A -:1018700081B200000400004081B20000040000407A -:1018800081B200000400004081B20000040000406A -:1018900081B200000400004081B20000040000405A -:1018A00081B200000400004081B20000040000404A -:1018B00081B200000400004081B20000040000403A -:1018C00081B200000400004081B20000040000402A -:1018D00081B200000400004081B20000040000401A -:1018E00081B200000400004081B20000040000400A -:1018F00081B200000400004081B2000004000040FA -:1019000081B200000400004081B2000004000040E9 -:1019100081B200000400004081B2000004000040D9 -:1019200081B200000400004081B2000004000040C9 -:1019300081B200000400004081B2000004000040B9 -:1019400081B200000400004081B2000004000040A9 -:1019500081B200000400004081B200000400004099 -:1019600081B200000400004081B200000400004089 -:1019700081B200000400004081B200000400004079 -:1019800081B200000400004081B200000400004069 -:1019900081B200000400004081B200000400004059 -:1019A00081B200000400004081B200000400004049 -:1019B00081B200000400004081B200000400004039 -:1019C00081B200000400004081B200000400004029 -:1019D00081B200000400004081B200000400004019 -:1019E00081B200000400004081B200000400004009 -:1019F00081B200000400004081B2000004000040F9 -:101A000081B200000400004081B2000004000040E8 -:101A100081B200000400004081B2000004000040D8 -:101A200081B200000400004081B2000004000040C8 -:101A300081B200000400004081B2000004000040B8 -:101A400081B200000400004081B2000004000040A8 -:101A500081B200000400004081B200000400004098 -:101A600081B200000400004081B200000400004088 -:101A700081B200000400004081B200000400004078 -:101A800081B200000400004081B200000400004068 -:101A900081B200000400004081B200000400004058 -:101AA00081B200000400004081B200000400004048 -:101AB00081B200000400004081B200000400004038 -:101AC00081B200000400004081B200000400004028 -:101AD00081B200000400004081B200000400004018 -:101AE00081B200000400004081B200000400004008 -:101AF00081B200000400004081B2000004000040F8 -:101B000081B200000400004081B2000004000040E7 -:101B100081B200000400004081B2000004000040D7 -:101B200081B200000400004081B2000004000040C7 -:101B300081B200000400004081B2000004000040B7 -:101B400081B200000400004081B2000004000040A7 -:101B500081B200000400004081B200000400004097 -:101B600081B200000400004081B200000400004087 -:101B700081B200000400004081B200000400004077 -:101B800081B200000400004081B200000400004067 -:101B900081B200000400004081B200000400004057 -:101BA00081B200000400004081B200000400004047 -:101BB00081B200000400004081B200000400004037 -:101BC00081B200000400004081B200000400004027 -:101BD00081B200000400004081B200000400004017 -:101BE00081B200000400004081B200000400004007 -:101BF00081B200000400004081B2000004000040F7 -:101C000081B200000400004081B2000004000040E6 -:101C100081B200000400004081B2000004000040D6 -:101C200081B200000400004081B2000004000040C6 -:101C300081B200000400004081B2000004000040B6 -:101C400081B200000400004081B2000004000040A6 -:101C500081B200000400004081B200000400004096 -:101C600081B200000400004081B200000400004086 -:101C700081B200000400004081B200000400004076 -:101C800081B200000400004081B200000400004066 -:101C900081B200000400004081B200000400004056 -:101CA00081B200000400004081B200000400004046 -:101CB00081B200000400004081B200000400004036 -:101CC00081B200000400004081B200000400004026 -:101CD00081B200000400004081B200000400004016 -:101CE00081B200000400004081B200000400004006 -:101CF00081B200000400004081B2000004000040F6 -:101D000081B200000400004081B2000004000040E5 -:101D100081B200000400004081B2000004000040D5 -:101D200081B200000400004081B2000004000040C5 -:101D300081B200000400004081B2000004000040B5 -:101D400081B200000400004081B2000004000040A5 -:101D500081B200000400004081B200000400004095 -:101D600081B200000400004081B200000400004085 -:101D700081B200000400004081B200000400004075 -:101D800081B200000400004081B200000400004065 -:101D900081B200000400004081B200000400004055 -:101DA00081B200000400004081B200000400004045 -:101DB00081B200000400004081B200000400004035 -:101DC00081B200000400004081B200000400004025 -:101DD00081B200000400004081B200000400004015 -:101DE00081B200000400004081B200000400004005 -:101DF00081B200000400004081B2000004000040F5 -:101E000081B200000400004081B2000004000040E4 -:101E100081B200000400004081B2000004000040D4 -:101E200081B200000400004081B2000004000040C4 -:101E300081B200000400004081B2000004000040B4 -:101E400081B200000400004081B2000004000040A4 -:101E500081B200000400004081B200000400004094 -:101E600081B200000400004081B200000400004084 -:101E700081B200000400004081B200000400004074 -:101E800081B200000400004081B200000400004064 -:101E900081B200000400004081B200000400004054 -:101EA00081B200000400004081B200000400004044 -:101EB00081B200000400004081B200000400004034 -:101EC00081B200000400004081B200000400004024 -:101ED00081B200000400004081B200000400004014 -:101EE00081B200000400004081B200000400004004 -:101EF00081B200000400004081B2000004000040F4 -:101F000081B200000400004081B2000004000040E3 -:101F100081B200000400004081B2000004000040D3 -:101F200081B200000400004081B2000004000040C3 -:101F300081B200000400004081B2000004000040B3 -:101F400081B200000400004081B2000004000040A3 -:101F500081B200000400004081B200000400004093 -:101F600081B200000400004081B200000400004083 -:101F700081B200000400004081B200000400004073 -:101F800081B200000400004081B200000400004063 -:101F900081B200000400004081B200000400004053 -:101FA00081B200000400004081B200000400004043 -:101FB00081B200000400004081B200000400004033 -:101FC00081B200000400004081B200000400004023 -:101FD00081B200000400004081B200000400004013 -:101FE00081B200000400004081B200000400004003 -:101FF00081B200000400004081B2000004000040F3 -:1020000081B200000400004081B2000004000040E2 -:1020100081B200000400004081B2000004000040D2 -:1020200081B200000400004081B2000004000040C2 -:1020300081B200000400004081B2000004000040B2 -:1020400081B200000400004081B2000004000040A2 -:1020500081B200000400004081B200000400004092 -:1020600081B200000400004081B200000400004082 -:1020700081B200000400004081B200000400004072 -:1020800081B200000400004081B200000400004062 -:1020900081B200000400004081B200000400004052 -:1020A00081B200000400004081B200000400004042 -:1020B00081B200000400004081B200000400004032 -:1020C00081B200000400004081B200000400004022 -:1020D00081B200000400004081B200000400004012 -:1020E00081B200000400004081B200000400004002 -:1020F00081B200000400004081B2000004000040F2 -:1021000081B200000400004081B2000004000040E1 -:1021100081B200000400004081B2000004000040D1 -:1021200081B200000400004081B2000004000040C1 -:1021300081B200000400004081B2000004000040B1 -:1021400081B200000400004081B2000004000040A1 -:1021500081B200000400004081B200000400004091 -:1021600081B200000400004081B200000400004081 -:1021700081B200000400004081B200000400004071 -:1021800081B200000400004081B200000400004061 -:1021900081B200000400004081B200000400004051 -:1021A00081B200000400004081B200000400004041 -:1021B00081B200000400004081B200000400004031 -:1021C00081B200000400004081B200000400004021 -:1021D00081B200000400004081B200000400004011 -:1021E00081B200000400004081B200000400004001 -:1021F00081B200000400004081B2000004000040F1 -:1022000081B200000400004081B2000004000040E0 -:1022100081B200000400004081B2000004000040D0 -:1022200081B200000400004081B2000004000040C0 -:1022300081B200000400004081B2000004000040B0 -:1022400081B200000400004081B2000004000040A0 -:1022500081B200000400004081B200000400004090 -:1022600081B200000400004081B200000400004080 -:1022700081B200000400004081B200000400004070 -:1022800081B200000400004081B200000400004060 -:1022900081B200000400004081B200000400004050 -:1022A00081B200000400004081B200000400004040 -:1022B00081B200000400004081B200000400004030 -:1022C00081B200000400004081B200000400004020 -:1022D00081B200000400004081B200000400004010 -:1022E00081B200000400004081B200000400004000 -:1022F00081B200000400004081B2000004000040F0 -:1023000081B200000400004081B2000004000040DF -:1023100081B200000400004081B2000004000040CF -:1023200081B200000400004081B2000004000040BF -:1023300081B200000400004081B2000004000040AF -:1023400081B200000400004081B20000040000409F -:1023500081B200000400004081B20000040000408F -:1023600081B200000400004081B20000040000407F -:1023700081B200000400004081B20000040000406F -:1023800081B200000400004081B20000040000405F -:1023900081B200000400004081B20000040000404F -:1023A00081B200000400004081B20000040000403F -:1023B00081B200000400004081B20000040000402F -:1023C00081B200000400004081B20000040000401F -:1023D00081B200000400004081B20000040000400F -:1023E00081B200000400004081B2000004000040FF -:1023F00081B200000400004081B2000004000040EF -:1024000081B200000400004081B2000004000040DE -:1024100081B200000400004081B2000004000040CE -:1024200081B200000400004081B2000004000040BE -:1024300081B200000400004081B2000004000040AE -:1024400081B200000400004081B20000040000409E -:1024500081B200000400004081B20000040000408E -:1024600081B200000400004081B20000040000407E -:1024700081B200000400004081B20000040000406E -:1024800081B200000400004081B20000040000405E -:1024900081B200000400004081B20000040000404E -:1024A00081B200000400004081B20000040000403E -:1024B00081B200000400004081B20000040000402E -:1024C00081B200000400004081B20000040000401E -:1024D00081B200000400004081B20000040000400E -:1024E00081B200000400004081B2000004000040FE -:1024F00081B200000400004081B2000004000040EE -:1025000081B200000400004081B2000004000040DD -:1025100081B200000400004081B2000004000040CD -:1025200081B200000400004081B2000004000040BD -:1025300081B200000400004081B2000004000040AD -:1025400081B200000400004081B20000040000409D -:1025500081B200000400004081B20000040000408D -:1025600081B200000400004081B20000040000407D -:1025700081B200000400004081B20000040000406D -:1025800081B200000400004081B20000040000405D -:1025900081B200000400004081B20000040000404D -:1025A00081B200000400004081B20000040000403D -:1025B00081B200000400004081B20000040000402D -:1025C00081B200000400004081B20000040000401D -:1025D00081B200000400004081B20000040000400D -:1025E00081B200000400004081B2000004000040FD -:1025F00081B200000400004081B2000004000040ED -:1026000081B200000400004081B2000004000040DC -:1026100081B200000400004081B2000004000040CC -:1026200081B200000400004081B2000004000040BC -:1026300081B200000400004081B2000004000040AC -:1026400081B200000400004081B20000040000409C -:1026500081B200000400004081B20000040000408C -:1026600081B200000400004081B20000040000407C -:1026700081B200000400004081B20000040000406C -:1026800081B200000400004081B20000040000405C -:1026900081B200000400004081B20000040000404C -:1026A00081B200000400004081B20000040000403C -:1026B00081B200000400004081B20000040000402C -:1026C00081B200000400004081B20000040000401C -:1026D00081B200000400004081B20000040000400C -:1026E00081B200000400004081B2000004000040FC -:1026F00081B200000400004081B2000004000040EC -:1027000081B200000400004081B2000004000040DB -:1027100081B200000400004081B2000004000040CB -:1027200081B200000400004081B2000004000040BB -:1027300081B200000400004081B2000004000040AB -:1027400081B200000400004081B20000040000409B -:1027500081B200000400004081B20000040000408B -:1027600081B200000400004081B20000040000407B -:1027700081B200000400004081B20000040000406B -:1027800081B200000400004081B20000040000405B -:1027900081B200000400004081B20000040000404B -:1027A00081B200000400004081B20000040000403B -:1027B00081B200000400004081B20000040000402B -:1027C00081B200000400004081B20000040000401B -:1027D00081B200000400004081B20000040000400B -:1027E00081B200000400004081B2000004000040FB -:1027F00081B200000400004081B2000004000040EB -:1028000081B200000400004081B2000004000040DA -:1028100081B200000400004081B2000004000040CA -:1028200081B200000400004081B2000004000040BA -:1028300081B200000400004081B2000004000040AA -:1028400081B200000400004081B20000040000409A -:1028500081B200000400004081B20000040000408A -:1028600081B200000400004081B20000040000407A -:1028700081B200000400004081B20000040000406A -:1028800081B200000400004081B20000040000405A -:1028900081B200000400004081B20000040000404A -:1028A00081B200000400004081B20000040000403A -:1028B00081B200000400004081B20000040000402A -:1028C00081B200000400004081B20000040000401A -:1028D00081B200000400004081B20000040000400A -:1028E00081B200000400004081B2000004000040FA -:1028F00081B200000400004081B2000004000040EA -:1029000081B200000400004081B2000004000040D9 -:1029100081B200000400004081B2000004000040C9 -:1029200081B200000400004081B2000004000040B9 -:1029300081B200000400004081B2000004000040A9 -:1029400081B200000400004081B200000400004099 -:1029500081B200000400004081B200000400004089 -:1029600081B200000400004081B200000400004079 -:1029700081B200000400004081B200000400004069 -:1029800081B200000400004081B200000400004059 -:1029900081B200000400004081B200000400004049 -:1029A00081B200000400004081B200000400004039 -:1029B00081B200000400004081B200000400004029 -:1029C00081B200000400004081B200000400004019 -:1029D00081B200000400004081B200000400004009 -:1029E00081B200000400004081B2000004000040F9 -:1029F00081B200000400004081B2000004000040E9 -:102A000081B200000400004081B2000004000040D8 -:102A100081B200000400004081B2000004000040C8 -:102A200081B200000400004081B2000004000040B8 -:102A300081B200000400004081B2000004000040A8 -:102A400081B200000400004081B200000400004098 -:102A500081B200000400004081B200000400004088 -:102A600081B200000400004081B200000400004078 -:102A700081B200000400004081B200000400004068 -:102A800081B200000400004081B200000400004058 -:102A900081B200000400004081B200000400004048 -:102AA00081B200000400004081B200000400004038 -:102AB00081B200000400004081B200000400004028 -:102AC00081B200000400004081B200000400004018 -:102AD00081B200000400004081B200000400004008 -:102AE00081B200000400004081B2000004000040F8 -:102AF00081B200000400004081B2000004000040E8 -:102B000081B200000400004081B2000004000040D7 -:102B100081B200000400004081B2000004000040C7 -:102B200081B200000400004081B2000004000040B7 -:102B300081B200000400004081B2000004000040A7 -:102B400081B200000400004081B200000400004097 -:102B500081B200000400004081B200000400004087 -:102B600081B200000400004081B200000400004077 -:102B700081B200000400004081B200000400004067 -:102B800081B200000400004081B200000400004057 -:102B900081B200000400004081B200000400004047 -:102BA00081B200000400004081B200000400004037 -:102BB00081B200000400004081B200000400004027 -:102BC00081B200000400004081B200000400004017 -:102BD00081B200000400004081B200000400004007 -:102BE00081B200000400004081B2000004000040F7 -:102BF00081B200000400004081B2000004000040E7 -:102C000081B200000400004081B2000004000040D6 -:102C100081B200000400004081B2000004000040C6 -:102C200081B200000400004081B2000004000040B6 -:102C300081B200000400004081B2000004000040A6 -:102C400081B200000400004081B200000400004096 -:102C500081B200000400004081B200000400004086 -:102C600081B200000400004081B200000400004076 -:102C700081B200000400004081B200000400004066 -:102C800081B200000400004081B200000400004056 -:102C900081B200000400004081B200000400004046 -:102CA00081B200000400004081B200000400004036 -:102CB00081B200000400004081B200000400004026 -:102CC00081B200000400004081B200000400004016 -:102CD00081B200000400004081B200000400004006 -:102CE00081B200000400004081B2000004000040F6 -:102CF00081B200000400004081B2000004000040E6 -:102D000081B200000400004081B2000004000040D5 -:102D100081B200000400004081B2000004000040C5 -:102D200081B200000400004081B2000004000040B5 -:102D300081B200000400004081B2000004000040A5 -:102D400081B200000400004081B200000400004095 -:102D500081B200000400004081B200000400004085 -:102D600081B200000400004081B200000400004075 -:102D700081B200000400004081B200000400004065 -:102D800081B200000400004081B200000400004055 -:102D900081B200000400004081B200000400004045 -:102DA00081B200000400004081B200000400004035 -:102DB00081B200000400004081B200000400004025 -:102DC00081B200000400004081B200000400004015 -:102DD00081B200000400004081B200000400004005 -:102DE00081B200000400004081B2000004000040F5 -:102DF00081B200000400004081B2000004000040E5 -:102E000081B200000400004081B2000004000040D4 -:102E100081B200000400004081B2000004000040C4 -:102E200081B200000400004081B2000004000040B4 -:102E300081B200000400004081B2000004000040A4 -:102E400081B200000400004081B200000400004094 -:102E500081B200000400004081B200000400004084 -:102E600081B200000400004081B200000400004074 -:102E700081B200000400004081B200000400004064 -:102E800081B200000400004081B200000400004054 -:102E900081B200000400004081B200000400004044 -:102EA00081B200000400004081B200000400004034 -:102EB00081B200000400004081B200000400004024 -:102EC00081B200000400004081B200000400004014 -:102ED00081B200000400004081B200000400004004 -:102EE00081B200000400004081B2000004000040F4 -:102EF00081B200000400004081B2000004000040E4 -:102F000081B200000400004081B2000004000040D3 -:102F100081B200000400004081B2000004000040C3 -:102F200081B200000400004081B2000004000040B3 -:102F300081B200000400004081B2000004000040A3 -:102F400081B200000400004081B200000400004093 -:102F500081B200000400004081B200000400004083 -:102F600081B200000400004081B200000400004073 -:102F700081B200000400004081B200000400004063 -:102F800081B200000400004081B200000400004053 -:102F900081B200000400004081B200000400004043 -:102FA00081B200000400004081B200000400004033 -:102FB00081B200000400004081B200000400004023 -:102FC00081B200000400004081B200000400004013 -:102FD00081B200000400004081B200000400004003 -:102FE00081B200000400004081B2000004000040F3 -:102FF00081B200000400004081B2000004000040E3 -:1030000081B200000400004081B2000004000040D2 -:1030100081B200000400004081B2000004000040C2 -:1030200081B200000400004081B2000004000040B2 -:1030300081B200000400004081B2000004000040A2 -:1030400081B200000400004081B200000400004092 -:1030500081B200000400004081B200000400004082 -:1030600081B200000400004081B200000400004072 -:1030700081B200000400004081B200000400004062 -:1030800081B200000400004081B200000400004052 -:1030900081B200000400004081B200000400004042 -:1030A00081B200000400004081B200000400004032 -:1030B00081B200000400004081B200000400004022 -:1030C00081B200000400004081B200000400004012 -:1030D00081B200000400004081B200000400004002 -:1030E00081B200000400004081B2000004000040F2 -:1030F00081B200000400004081B2000004000040E2 -:1031000081B200000400004081B2000004000040D1 -:1031100081B200000400004081B2000004000040C1 -:1031200081B200000400004081B2000004000040B1 -:1031300081B200000400004081B2000004000040A1 -:1031400081B200000400004081B200000400004091 -:1031500081B200000400004081B200000400004081 -:1031600081B200000400004081B200000400004071 -:1031700081B200000400004081B200000400004061 -:1031800081B200000400004081B200000400004051 -:1031900081B200000400004081B200000400004041 -:1031A00081B200000400004081B200000400004031 -:1031B00081B200000400004081B200000400004021 -:1031C00081B200000400004081B200000400004011 -:1031D00081B200000400004081B200000400004001 -:1031E00081B200000400004081B2000004000040F1 -:1031F00081B200000400004081B2000004000040E1 -:1032000081B200000400004081B2000004000040D0 -:1032100081B200000400004081B2000004000040C0 -:1032200081B200000400004081B2000004000040B0 -:1032300081B200000400004081B2000004000040A0 -:1032400081B200000400004081B200000400004090 -:1032500081B200000400004081B200000400004080 -:1032600081B200000400004081B200000400004070 -:1032700081B200000400004081B200000400004060 -:1032800081B200000400004081B200000400004050 -:1032900081B200000400004081B200000400004040 -:1032A00081B200000400004081B200000400004030 -:1032B00081B200000400004081B200000400004020 -:1032C00081B200000400004081B200000400004010 -:1032D00081B200000400004081B200000400004000 -:1032E00081B200000400004081B2000004000040F0 -:1032F00081B200000400004081B2000004000040E0 -:1033000081B200000400004081B2000004000040CF -:1033100081B200000400004081B2000004000040BF -:1033200081B200000400004081B2000004000040AF -:1033300081B200000400004081B20000040000409F -:1033400081B200000400004081B20000040000408F -:1033500081B200000400004081B20000040000407F -:1033600081B200000400004081B20000040000406F -:1033700081B200000400004081B20000040000405F -:1033800081B200000400004081B20000040000404F -:1033900081B200000400004081B20000040000403F -:1033A00081B200000400004081B20000040000402F -:1033B00081B200000400004081B20000040000401F -:1033C00081B200000400004081B20000040000400F -:1033D00081B200000400004081B2000004000040FF -:1033E00081B200000400004081B2000004000040EF -:1033F00081B200000400004081B2000004000040DF -:1034000081B200000400004081B2000004000040CE -:1034100081B200000400004081B2000004000040BE -:1034200081B200000400004081B2000004000040AE -:1034300081B200000400004081B20000040000409E -:1034400081B200000400004081B20000040000408E -:1034500081B200000400004081B20000040000407E -:1034600081B200000400004081B20000040000406E -:1034700081B200000400004081B20000040000405E -:1034800081B200000400004081B20000040000404E -:1034900081B200000400004081B20000040000403E -:1034A00081B200000400004081B20000040000402E -:1034B00081B200000400004081B20000040000401E -:1034C00081B200000400004081B20000040000400E -:1034D00081B200000400004081B2000004000040FE -:1034E00081B200000400004081B2000004000040EE -:1034F00081B200000400004081B2000004000040DE -:1035000081B200000400004081B2000004000040CD -:1035100081B200000400004081B2000004000040BD -:1035200081B200000400004081B2000004000040AD -:1035300081B200000400004081B20000040000409D -:1035400081B200000400004081B20000040000408D -:1035500081B200000400004081B20000040000407D -:1035600081B200000400004081B20000040000406D -:1035700081B200000400004081B20000040000405D -:1035800081B200000400004081B20000040000404D -:1035900081B200000400004081B20000040000403D -:1035A00081B200000400004081B20000040000402D -:1035B00081B200000400004081B20000040000401D -:1035C00081B200000400004081B20000040000400D -:1035D00081B200000400004081B2000004000040FD -:1035E00081B200000400004081B2000004000040ED -:1035F00081B200000400004081B2000004000040DD -:1036000081B200000400004081B2000004000040CC -:1036100081B200000400004081B2000004000040BC -:1036200081B200000400004081B2000004000040AC -:1036300081B200000400004081B20000040000409C -:1036400081B200000400004081B20000040000408C -:1036500081B200000400004081B20000040000407C -:1036600081B200000400004081B20000040000406C -:1036700081B200000400004081B20000040000405C -:1036800081B200000400004081B20000040000404C -:1036900081B200000400004081B20000040000403C -:1036A00081B200000400004081B20000040000402C -:1036B00081B200000400004081B20000040000401C -:1036C00081B200000400004081B20000040000400C -:1036D00081B200000400004081B2000004000040FC -:1036E00081B200000400004081B2000004000040EC -:1036F00081B200000400004081B2000004000040DC -:1037000081B200000400004081B2000004000040CB -:1037100081B200000400004081B2000004000040BB -:1037200081B200000400004081B2000004000040AB -:1037300081B200000400004081B20000040000409B -:1037400081B200000400004081B20000040000408B -:1037500081B200000400004081B20000040000407B -:1037600081B200000400004081B20000040000406B -:1037700081B200000400004081B20000040000405B -:1037800081B200000400004081B20000040000404B -:1037900081B200000400004081B20000040000403B -:1037A00081B200000400004081B20000040000402B -:1037B00081B200000400004081B20000040000401B -:1037C00081B200000400004081B20000040000400B -:1037D00081B200000400004081B2000004000040FB -:1037E00081B200000400004081B2000004000040EB -:1037F00081B200000400004081B2000004000040DB -:1038000081B200000400004081B2000004000040CA -:1038100081B200000400004081B2000004000040BA -:1038200081B200000400004081B2000004000040AA -:1038300081B200000400004081B20000040000409A -:1038400081B200000400004081B20000040000408A -:1038500081B200000400004081B20000040000407A -:1038600081B200000400004081B20000040000406A -:1038700081B200000400004081B20000040000405A -:1038800081B200000400004081B20000040000404A -:1038900081B200000400004081B20000040000403A -:1038A00081B200000400004081B20000040000402A -:1038B00081B200000400004081B20000040000401A -:1038C00081B200000400004081B20000040000400A -:1038D00081B200000400004081B2000004000040FA -:1038E00081B200000400004081B2000004000040EA -:1038F00081B200000400004081B2000004000040DA -:1039000081B200000400004081B2000004000040C9 -:1039100081B200000400004081B2000004000040B9 -:1039200081B200000400004081B2000004000040A9 -:1039300081B200000400004081B200000400004099 -:1039400081B200000400004081B200000400004089 -:1039500081B200000400004081B200000400004079 -:1039600081B200000400004081B200000400004069 -:1039700081B200000400004081B200000400004059 -:1039800081B200000400004081B200000400004049 -:1039900081B200000400004081B200000400004039 -:1039A00081B200000400004081B200000400004029 -:1039B00081B200000400004081B200000400004019 -:1039C00081B200000400004081B200000400004009 -:1039D00081B200000400004081B2000004000040F9 -:1039E00081B200000400004081B2000004000040E9 -:1039F00081B200000400004081B2000004000040D9 -:103A000081B200000400004081B2000004000040C8 -:103A100081B200000400004081B2000004000040B8 -:103A200081B200000400004081B2000004000040A8 -:103A300081B200000400004081B200000400004098 -:103A400081B200000400004081B200000400004088 -:103A500081B200000400004081B200000400004078 -:103A600081B200000400004081B200000400004068 -:103A700081B200000400004081B200000400004058 -:103A800081B200000400004081B200000400004048 -:103A900081B200000400004081B200000400004038 -:103AA00081B200000400004081B200000400004028 -:103AB00081B200000400004081B200000400004018 -:103AC00081B200000400004081B200000400004008 -:103AD00081B200000400004081B2000004000040F8 -:103AE00081B200000400004081B2000004000040E8 -:103AF00081B200000400004081B2000004000040D8 -:103B000081B200000400004081B2000004000040C7 -:103B100081B200000400004081B2000004000040B7 -:103B200081B200000400004081B2000004000040A7 -:103B300081B200000400004081B200000400004097 -:103B400081B200000400004081B200000400004087 -:103B500081B200000400004081B200000400004077 -:103B600081B200000400004081B200000400004067 -:103B700081B200000400004081B200000400004057 -:103B800081B200000400004081B200000400004047 -:103B900081B200000400004081B200000400004037 -:103BA00081B200000400004081B200000400004027 -:103BB00081B200000400004081B200000400004017 -:103BC00081B200000400004081B200000400004007 -:103BD00081B200000400004081B2000004000040F7 -:103BE00081B200000400004081B2000004000040E7 -:103BF00081B200000400004081B2000004000040D7 -:103C000081B200000400004081B2000004000040C6 -:103C100081B200000400004081B2000004000040B6 -:103C200081B200000400004081B2000004000040A6 -:103C300081B200000400004081B200000400004096 -:103C400081B200000400004081B200000400004086 -:103C500081B200000400004081B200000400004076 -:103C600081B200000400004081B200000400004066 -:103C700081B200000400004081B200000400004056 -:103C800081B200000400004081B200000400004046 -:103C900081B200000400004081B200000400004036 -:103CA00081B200000400004081B200000400004026 -:103CB00081B200000400004081B200000400004016 -:103CC00081B200000400004081B200000400004006 -:103CD00081B200000400004081B2000004000040F6 -:103CE00081B200000400004081B2000004000040E6 -:103CF00081B200000400004081B2000004000040D6 -:103D000081B200000400004081B2000004000040C5 -:103D100081B200000400004081B2000004000040B5 -:103D200081B200000400004081B2000004000040A5 -:103D300081B200000400004081B200000400004095 -:103D400081B200000400004081B200000400004085 -:103D500081B20000AE9F00889AB00000AE9F00883C -:103D60009AB00000AE9F00889AB00000AE9F008815 -:103D70009AB00000AE9F00889AB000000000008852 -:103D80009AB00100AE9F414081320000B29F2240B4 -:103D90007B6F00000000194081B20100AE9F00401F -:103DA00081B20000000019417BB30100000000A4B3 -:103DB000C4B30100000000A1C6B3010000002FA29F -:103DC000C8B301000814004049990100A89F004DA4 -:103DD0009ACC0100BB9F2640813200000000004CBD -:103DE00049C10100B99FA2419B500000BF9F808044 -:103DF0008032000000005249FD9301000000004A9B -:103E0000FD930100C29F0042CD9300000000514A83 -:103E1000FD93010000000049FD930100C29F004393 -:103E2000CB9300000000504081B20100D29F0040BF -:103E300019990100000000F09AB001000000004450 -:103E400049D10100000040F080B201000000414D66 -:103E500080B20100CA9F00401999010000004C4047 -:103E600081B201000000004449D10100000000F0CF -:103E70009AB001000000004D10B10000000000E207 -:103E800049B10100000000E343B10100000000E47B -:103E900045B10100000000407BB301000000484F25 -:103EA00040B10100D29F004081B2000004000040F8 -:103EB00081B200000400004081B200000400004014 -:103EC00081B200000400004081B200000400004004 -:103ED00081B20000040000CB81C8010022830040B1 -:103EE000F29300005582004081B20000400500407E -:103EF00081B200001806004081B200002283004019 -:103F000081B20000C682004081B2000043810040BF -:103F100081B200004181004081B20000B8800040C1 -:103F200081B20000F087004081B20000238300408E -:103F300081B200002783004081B20000BF9400409E -:103F400081B200009498004081B200007F9400404C -:103F500081B200007F98004081B200008D95004042 -:103F600081B200001695004081B20000109500401B -:103F700081B20000B182004081B20000209900406F -:103F800081B200000400004081B200000400004043 -:103F900081B200000400004081B200000400004033 -:103FA00081B200000400004081B200000400004023 -:103FB00081B200000400004081B200000400004013 -:103FC00081B200000400004081B200000400004003 -:103FD00081B200000400004081B2000004000040F3 -:103FE00081B200000400004081B2000004000040E3 -:103FF00081B200000400004081B2000004000040D3 -:1040000081B200000400004081B2000004000040C2 -:0440100081B2000079 -:00000001FF diff --git a/firmware/slicoss/oasisdownload.sys.ihex b/firmware/slicoss/oasisdownload.sys.ihex deleted file mode 100644 index 82026c2..0000000 --- a/firmware/slicoss/oasisdownload.sys.ihex +++ /dev/null @@ -1,5124 +0,0 @@ -:1000000002000000004000000000010000000000AD -:10001000008000001500004081B200001B0000407D -:1000200081B200002100004081B2000003000040C6 -:1000300081B20000000000A898B001000480A24036 -:10004000FD7F00000900A249DD7D00000000004C9A -:1000500080B2010007000040D1B100000000004C58 -:1000600080B201000900A240757D000060000040E0 -:10007000619901000B00A8B17E3100000900004029 -:1000800081B2000000808F981831000010000098A5 -:1000900080E40100000041988094010000000040CD -:1000A00081B201001000009880E401000E00409829 -:1000B000809400001100004081B200000000004068 -:1000C000A59901001900294081320000190014BCD3 -:1000D000803200000E0093BC8032000000005040CF -:1000E00081B201000080004081B200001000004099 -:1000F000A59901001F002940813200001F0014BC97 -:1001000080320000120093BC80320000000050409A -:1001100081B201000180004081B200002000004057 -:10012000A59901002500294081320000250014BC5A -:1001300080320000140093BC8032000000000049AF -:10014000DD810100120100408132010033010040D5 -:10015000813201002A0014BC80320000FE0013BC72 -:10016000803200005495004045990100FFFF004097 -:10017000E599010000002F4049B101000000004056 -:10018000E1B1010000000040FDB3010000000040AB -:10019000FFB30100330018EE803200000000005071 -:1001A00089B001003200A24189500000990000404E -:1001B000813201003094004043990100000000F8B2 -:1001C00020B10100000000FAE0B30100390098EE10 -:1001D00080320000000000FB80B001003B0080F393 -:1001E000DE33000000000047FD9301003E0083F372 -:1001F00080320000F00000F38088010001800040A0 -:100200002EDD0100009400404399010000000046EB -:1002100043C10100000000FA24B101007C0018EE87 -:1002200080320000450095E880320000FFFF00E8C2 -:10023000808801007C0026408132000000000040E0 -:10024000D5990100000000F2ECB30100000000F8B5 -:10025000D6B1010008000040D5990100000000F06F -:10026000D6B10100FF0000F8EE8B0100080100404C -:10027000D5990100FF0000F0808C0100000000F71C -:100280008194010000000040D6B10100FF0000F899 -:10029000808801003C000040D5990100FF0000F07B -:1002A000D68D0100FFFF00F0F0DB010000000048E8 -:1002B00081E00100000000F8819401003C01004051 -:1002C000D599010000000040D6B10100FF0000F800 -:1002D000808801000000004881E00100000000F873 -:1002E000819401003C020040D599010000000040CB -:1002F000D6B101002C000040D5990100000000F8A3 -:10030000D6B101001E0000F082F40100FF3F00F8AA -:1003100080D80100640026408132000000000041C6 -:1003200081D00100FFFF004080D8010000000041A3 -:100330008094010000000040D8B10100680022FA5A -:10034000803000000000004C81E00100010000400E -:1003500080CC010000000040DEB10100000100403F -:10036000D5990100100000FA80E40100000000F6B9 -:100370008194010000000040D6B10100000200405D -:10038000D5990100100000FA80E40100000000F699 -:100390008194010000000040D6B101000600004039 -:1003A000D5990100100000FBD6E5010007000040D0 -:1003B000D5990100180000FBD6E501004800004077 -:1003C000D5990100100000FAD6E501005000004068 -:1003D000D5990100100000FBD6E50100030000FBE9 -:1003E0007A890100000000F0DCB101007C00004CC3 -:1003F000DD9100007C0095E88430000000002FE9CA -:10040000FAB3010000000040D1B10100FF0000423A -:10041000808801003400004080CE01007C00A640AE -:1004200081320000850000408132010002802240BC -:10043000803200007C00004081B200000000004FCC -:1004400081B001008E0009F9813200008C0008F9AA -:100450008132000098001FFDF93300008B009EFDE3 -:10046000813200000000004AF39301000000804840 -:10047000F3930100000000FDF7B301000000804984 -:10048000F3930100000000FC19B1010093000AF988 -:1004900081320000000040FB81B20100000041FDFC -:1004A00081B20100000780F9F38F0100000742F9D3 -:1004B000F38F01009700A2FFF76F00000000434098 -:1004C00081B201000000A2FFFBEF0000000080FCF1 -:1004D000E1B101000000804081B0010000940040C3 -:1004E00047990100BB000040813201000000A24694 -:1004F000FD7F01000094004047990100CE000040BC -:10050000813201000000A244FD7F01000094004000 -:100510004599010000000040F1B10100FF7F00405B -:10052000F5990100FF7F0040F59901009A13004002 -:10053000F599010007000040F59901000100004015 -:10054000F599010000020040F59901000200004009 -:10055000F599010000020040F599010003010040F7 -:10056000F599010000000040F59901009A13004040 -:10057000F59901000B000040F59901008000004052 -:10058000F599010000000040F599010000000040CD -:10059000F599010007000040F599010008000040AE -:1005A000F5990100B0020040F599010000000040FB -:1005B000F599010000000040F59901000229004072 -:1005C000F599010000000040F59901000067004026 -:1005D000F599010000000040F599010080000040FD -:1005E000F599010000008040F599010000000045E8 -:1005F000FD83010000000046FD830100FF7F0040F5 -:1006000025990100C4000040813201000000A2448D -:1006100080B2000000000045FD930100E2000040B0 -:10062000833001000000A2458032010000008046B6 -:10063000FD9301000010004083980100DD000040A0 -:100640002B3101000000A24688B0000000000041EC -:1006500089B00100000000948CB00100FFFF00464B -:1006600080880100A5A5A24080CE000000000048BF -:100670008DF00100C90082418940000000008040E7 -:1006800089B0010000000044FD830100D400004057 -:10069000813201000000A24480B20000E2000008A4 -:1006A000833001000000A245803201000000804438 -:1006B000FD93010000300008839801008000004095 -:1006C0002B990100DB000040893001000000A246A8 -:1006D00080B20000FFFF009480880100A5A5A24021 -:1006E000804E01000000804389B001000384004176 -:1006F0002C990100DE00004081B200000388004117 -:100700002C990100000000208DB0010000009F9690 -:1007100080B20000DF00A2418D5000000000804048 -:1007200081B20100FF7F0040259901000000004CCC -:1007300089E00100DD000044821401000000909473 -:100740008AB0000000000045F0B101001000004533 -:1007500088F401000000004489D00100DD0000445D -:100760002B410100EC00084180320000ED000094B4 -:1007700024B100001000009424F501000000009452 -:10078000F0B10100F200A04489500000DD000044F7 -:100790002B41010000000094F0B10100EF00204463 -:1007A000895000001000004588F40100000000FAA4 -:1007B0008AB001000000A34289D00000F700A0FA2F -:1007C0008A400000000000418BC00100F500A342F8 -:1007D00089500000FFFF0045888801001000004597 -:1007E0008AF40100FC0090448A40000000000041AF -:1007F0008BC00100FFFF00458AA801000000805067 -:100800008BE00100FF7F0040259901007C00004043 -:100810002B9901000030004083980100DD000008A2 -:1008200083140100000000942AB101000080004000 -:10083000F99B0100DD0000FC19310100000040942B -:1008400080B20100DD0000442B4101000000419412 -:1008500080B2010000000041F9C301000000004423 -:100860002BC1010004019F948032000002800040EF -:1008700081B200001001005193B000001001004D42 -:1008800093B000001001004993B000000000004246 -:1008900093B001001001A24193500000000080407D -:1008A00081B201000000104081B20100000011403F -:1008B00081B201000000124081B20100000013402B -:1008C00081B201000000144081B201000000154017 -:1008D00081B201000000164081B201000000174003 -:1008E00081B201000000184081B2010000001940EF -:1008F00081B2010000001A4081B2010000001B40DB -:1009000081B2010000001C4081B2010000001D40C6 -:1009100081B2010000001E4081B2010000001F40B2 -:1009200081B201000000704081B2010000007140FE -:1009300081B201000000724081B2010000007340EA -:1009400081B201000000744081B2010000007540D6 -:1009500081B201000000764081B2010000007740C2 -:1009600081B201000000784081B2010000007940AE -:1009700081B2010000007A4081B2010000007B409A -:1009800081B2010000007C4081B2010000007D4086 -:1009900081B2010000007E4081B2010000007F4072 -:1009A00081B201000000804081B2010000040040DB -:1009B000A199010000000050A1D1010000000040F9 -:1009C0001BB001000000004019B001000000004011 -:1009D00017B001000000004015B001000000004009 -:1009E00013B001000000004011B001000000004001 -:1009F0000FB00100000000400DB0010000000040F9 -:100A00000BB001000000004009B0010000000040F0 -:100A100007B001000000004005B0010000000040E8 -:100A200003B001000000004001B001003B0120487C -:100A3000A15100000000804081B201004701224B1B -:100A4000747D00000000804081B201006000004B16 -:100A500060990100000000B17EB101004801A8408A -:100A6000813200004501004081B200000500804055 -:100A700097980100180000AA9688010000008043A2 -:100A800097F00100070000AA96880100000080404E -:100A900081B201000000005807900100D89F00407B -:100AA00081B2000000000044A5B30100D80200405C -:100AB00081320100F8020040813201000000005C38 -:100AC00007900100D89F0040BFB300005A0122CC1C -:100AD000857F00000000005107900100D89F004072 -:100AE00081B200000000004049B10100AE0300CB1C -:100AF000A3C90100D0140040A19B01000000002008 -:100B000046B1010000000048F1B10100000000D032 -:100B1000F1B10100000000CAF1B10100000000D5F0 -:100B2000E1B10100070000406199010020000020B0 -:100B300062DD01006301A84081320000000000CCAA -:100B400085930100F802004081320100D01400407A -:100B500043990100000000FABAB30100000000FA56 -:100B6000A4B30100000000F8BCB3010000142F4042 -:100B700081B00100000000E7A7B30100000000D829 -:100B8000A9B30100FF0000DD8188010002000040E0 -:100B900080F401007301004080C80100860100DD7F -:100BA000813200000000004010B1000087010040C9 -:100BB00081B200008801004081B20000890100403C -:100BC00081B200008A01004081B200008B01004028 -:100BD00081B200008D01004081B200008F01004011 -:100BE00081B200005001004081B20000B601004017 -:100BF00081B200005001004081B20000C4010040F9 -:100C000081B20000C501004081B2000082020040B4 -:100C100081B200008302004081B22800B802004087 -:100C200081B22800D49F004081B22800D59F0040A7 -:100C300081B22800D69F004081B22800D79F004093 -:100C400081B228007201004181C02800550151493C -:100C5000FD9328005501524AFD932A00550155493C -:100C6000FD832A005501564AFD832A0050019181D7 -:100C700080302A005501454081B22A0050019182FE -:100C800080302A005501464081B22A000000004011 -:100C900089B02B0000002F4081B0010000140040FB -:100CA00049990100B30122DEE16D00000000004C13 -:100CB00049C101000000004181C001009201A2442D -:100CC000816C00000000004C49D101009A012240D3 -:100CD000E16D00009601A2418150000050010041E9 -:100CE000BFB3000000000042BFB301005001A00FDD -:100CF000BD6F0000000000DEE1B101000000004413 -:100D000049C10100B50100401999010000004240AD -:100D100081B20100000043FF85B00100000000DE49 -:100D200019B10100000042FF87B00100000043FF3D -:100D3000E1B101000000004449C1010000002FFFA3 -:100D4000E1B10100081400A480CC0100AA012640F2 -:100D5000813200000000004185C00100A801A24CC2 -:100D600081500000B40122D281320000AF01224143 -:100D7000A56F00005001A2E081320000000000D207 -:100D8000C1B301000000005C8990010000004042F6 -:100D900080B201000000414380B20100000000F079 -:100DA0008894010055010044E0B10000B101004801 -:100DB00049C10000AF01005B89900000A89F00A01E -:100DC0009EB000000000004083B00100001400400D -:100DD000499901000000234081B00100BE0122DEDC -:100DE000E16D00000000004C49C10100000000411D -:100DF00081C00100B901A244816C00005001004390 -:100E0000BFB30000000000F818B10100000040F876 -:100E100080B20100000041F080B2010000000040FB -:100E2000F1B1010000000040F1B1010055010040A6 -:100E3000E1B10000C601004091B000000000004197 -:100E400091B00100D0142E4049B1010005000040CE -:100E5000A39B0100080000DD81F40100CB010040EC -:100E600080C801000000004010B10000D101004026 -:100E700081B00000530100DEA1B30000E301004097 -:100E800081B20000E501004081B00000EB010040AC -:100E900081B20000520100DFE1B10000000000D08B -:100EA000BAB30100000000DEA1B10100020000D2CF -:100EB000A5E70100000000D2C1B30100000000005E -:100EC000F0B10100DB012244C1530000DA0184418A -:100ED00081400000DE01004081320100000000D0AE -:100EE00045B10100D5010041A1C10000DA02004076 -:100EF00081320100F802004081320100550100DD1D -:100F0000A1B100000000004081B00100400000409D -:100F1000A59B0100DA02004081320100400000D3AD -:100F2000A7CB0100F80200E0A5B3000003000040D9 -:100F3000A39B0100530100DEA1B3000000000044A8 -:100F4000BFB30100000000DE819001005001A2BA91 -:100F500080040000600000DE61990100E801A8B192 -:100F60008030000052010040E0B10000000000D0DD -:100F7000BAB301006B020040819801006002004D8D -:100F80008330010000000044E1B301000000004490 -:100F9000E3B3010000000044E5B301000000004499 -:100FA000E9B3010000000044EBB30100000000447D -:100FB000F5B3010000000044F7B301000000004455 -:100FC000F9B30100F90122408F6F00007802004060 -:100FD00081980100600200C7833001008002004058 -:100FE000819801006002004283300100000000E8A7 -:100FF000F1B10100000000E9F1B10100000000EAD8 -:10100000F1B10100000000EBF1B10100000000852A -:10101000F0B10100000000ECF1B10100000000EDB2 -:10102000F1B10100000000B2F0B10100000000A920 -:10103000F0B10100000000ACF0B10100000000AB15 -:10104000F0B10100000000B8F0B10100000000B9EB -:10105000F0B10100000000BAF0B10100000000BBD7 -:10106000F0B101000C02B8408130000000000040E7 -:10107000819001000E02B940813200000000004161 -:10108000819001001002BA4081320000000000424D -:10109000819001001202BB40813200000000004339 -:1010A000819001001402BC40813200000000004425 -:1010B000819001001602BD40813200000000004511 -:1010C000819001001802BE408132000000000046FD -:1010D000819001001A02BF408132000000000047E9 -:1010E000819001001C02C8408132000000000048CD -:1010F000819001001E02C9408132000000000049B9 -:10110000819001002002CA40813200000000004AA4 -:10111000819001002202CB40813200000000004B90 -:10112000819001002402CC40813200000000004C7C -:10113000819001002602CD40813200000000004D68 -:10114000819001002802CE40813200000000004E54 -:10115000819001002A02CF40813200000000004F40 -:10116000819001002C02F04081320000000000500C -:10117000819001002E02F1408132000000000051F8 -:10118000819001003002F2408132000000000052E4 -:10119000819001003202F3408132000000000053D0 -:1011A000819001003402F4408132000000000054BC -:1011B000819001003602F5408132000000000055A8 -:1011C000819001003802F640813200000000005694 -:1011D000819001003A02F740813200000000005780 -:1011E000819001003C02F84081320000000000586C -:1011F000819001003E02F940813200000000005958 -:10120000819001004002FA40813200000000005A43 -:10121000819001004202FB40813200000000005B2F -:10122000819001004402FC40813200000000005C1B -:10123000819001004602FD40813200000000005D07 -:10124000819001004802FE40813200000000005EF3 -:10125000819001004A02FF40813200000000005FDF -:101260008190010000000040F0B10100400000400A -:10127000A59B0100D802004081320100F802004025 -:1012800081320100D0142E06A5B30100400000D326 -:10129000A7CB0100000000F0F1B10100000000F157 -:1012A000F1B10100000000F2F1B10100000000F412 -:1012B000F1B10100000000F5F1B10100000000FAF9 -:1012C000F1B10100000000FBF1B10100000000FCE1 -:1012D000F1B10100000000EBF1B10100000000EEEF -:1012E000F1B10100000000EFF1B10100000000F3D6 -:1012F000F1B10100000000F6F1B10100000000FDB5 -:10130000F1B10100DB0100C7E1B100000000804045 -:1013100081B20100660200488032000000005140A6 -:101320001AB1010000004D4081B2010000004540AB -:1013300081B201006302A241835000005F02494074 -:1013400081B20000000052401CB1010000004E407C -:1013500081B201000000464081B201006802A24152 -:10136000835000005F024A4081B20000000000A0EC -:101370009EB0010000000080D8B30100000000A171 -:10138000D0B30100000000A2D2B30100000000A40D -:10139000D4B30100000000D0D6B30100000000D19A -:1013A000DCB30100000000D2DEB3010000000088C1 -:1013B000DAB30100000000D48EB30100000000D3B6 -:1013C000E6B30100000000ACECB30100000000999E -:1013D000FAB30100000000D5E0B30100000000D521 -:1013E000E2B30100000000D5E4B30100000000D525 -:1013F000E8B30100000000D5EAB30100000000D509 -:10140000F4B30100000000D5F6B30100000000D5E0 -:10141000F8B30100000000C7A9B101000000004FAF -:1014200040B101008402004091B000000000004182 -:1014300091B0010007000040A39B0100080000DDFF -:1014400081F401008802004080C8010000000040D3 -:1014500010B100008D02004081B2000098020040EF -:1014600081B2000098020046A3B300009B02004036 -:1014700081B20000A102004081B200008F0223501F -:10148000A56F000000000050A5B30100E802004273 -:10149000A5630100F802004081320100D0142D4004 -:1014A00049B10100000000D0BAB30100000000DE25 -:1014B000A1B10100000000F800B001009702224431 -:1014C000A553000094020041A1C10000550100DDB8 -:1014D000A1B10000E80200DEA1330100F8020040E3 -:1014E000813201005501004081B20000000000453A -:1014F000BFB301005001A2D2777D0000000000D2EE -:1015000061B10100000000DE63B101009E02A8404D -:10151000813200005501004081B20000E802005411 -:10152000A5330100F802004081320100D0142D40A3 -:1015300049B10100000000F8D0B30100000000F83C -:10154000D2B30100000000F8D4B30100000000F89D -:10155000D6B30100000000F808B10100AC02004061 -:10156000819801006002004683300100550100406F -:1015700081B20000000000A09EB00100000000E861 -:1015800043B10100000000E945B10100000000EA9C -:1015900049B10100000000EBA1B101000000004FC3 -:1015A00040B101000400004081B20000040000408E -:1015B00081B200000400004081B20000040000403D -:1015C00081B200000400004081B20000040000402D -:1015D00081B20000D0142E4049B101000500004046 -:1015E000A39B010000000040C1B30100080000DD22 -:1015F00081F40100BD02004010C90000C3020005D3 -:1016000081B000005001004081B20000CB02000513 -:1016100081B000005001004081B20000D0020044BF -:10162000A5B30000D2020044A5B3000002000040B0 -:10163000A4E70100000000E081B10100FFFF00C14C -:10164000F0890100C802224181500000C40200411B -:10165000C1C30000DA02004081320100F8020040FC -:10166000813201005501004081B2000002000040BB -:10167000A4E70100000000E091B10100FFFF00C9F4 -:10168000F0890100C802224181500000CC020041D3 -:10169000C1C30000FFFF00DE85890100C80200C24F -:1016A000E0B10000FFFF00DE95890100C80200CA1A -:1016B000E0B100000400004081B2000004000040DE -:1016C00081B200000400004081B20000040000402C -:1016D00081B20000000000E7A7B30100000000D8BD -:1016E000A9B301000000004049B10100AE0300CBE6 -:1016F000A3C901000000002046B10100000000D293 -:10170000F1B10100000000D3F1B10100000000D4EC -:10171000F1B10100000000D0E1B10100000000D1F2 -:1017200061B101002000002062DD0100E202A8405A -:1017300081320000000080CC85930100040000404D -:1017400081B200000400004081B2000004000040AB -:1017500081B20000000000E7A7B30100000000D83C -:10176000A9B301000000004049B10100AE0300CB65 -:10177000A3C901000000002046B10100000000D212 -:10178000F1B10100000000D0F1B10100000000D370 -:10179000F1B10100E10200D4E1B100000400004019 -:1017A00081B200000400004081B20000040000404B -:1017B00081B200000400004081B20000040000403B -:1017C00081B200000400004081B20000040000402B -:1017D00081B200000000A2CC85FF00000000005094 -:1017E00081B00100FA02A24181500000F902A2F288 -:1017F00080300000000080CC8583010004000040A0 -:1018000081B200000400004081B2000004000040EA -:1018100081B20000B5030040A199010000002F41F2 -:1018200099B301000A032244816C0000120322488C -:10183000816C00000C03224C816C000016032250C6 -:10184000816C000017032254816C00001903225898 -:10185000816C00001E03225C816C0000500100407E -:1018600081B20000000000BC09B00100DD9F00CA89 -:1018700001B000000000004003B001000000004182 -:10188000F38301001003A242056C00000000004138 -:1018900005B00100DD9F22CA07140000DD9F00454E -:1018A000F3930000DD9F2043956F0000DD9F80CA09 -:1018B00005300000DD9F220180300000DD9F00CB5D -:1018C000DB910000570100BCABB30000000000BC7E -:1018D000B1B30100DD9F00CACFB30000FF0000CA12 -:1018E00081880100DD9FA240747D000060002040DF -:1018F000609901001B03A8B1823000001A03004068 -:1019000081B20000DD9F00CA79B3000004000040EE -:1019100081B200000000004E81B0010000000043D1 -:10192000CB8301000000454081B201002203A241A7 -:10193000815000000000454081B201000000454098 -:1019400081B201002D039182823000000000008AE4 -:1019500080B00100AE9F004080CE01002B03A64066 -:10196000813200002D03564081B20000B5030040D3 -:10197000A19901000000005307900100B503004049 -:10198000A19901000000005207900100D89F00417A -:101990008BB300000000004E81B001000000004247 -:1019A000CD8301000000464081B201003203A24114 -:1019B000815000000000464081B201000000464016 -:1019C00081B201003D039181823000000000008956 -:1019D00080B00100AE9F004080CE01003B03A640D6 -:1019E000813200003D03554081B20000B503004044 -:1019F000A19901000000005207900100B5030040CA -:101A0000A19901000000005307900100D89F0041F8 -:101A10008BB30000B0030040A1990100C4142F4013 -:101A200099B301005701004049B100000400004093 -:101A300081B200000400004081B2000004000040B8 -:101A400081B200000400004081B2000004000040A8 -:101A500081B200003094004043990100009000F8EA -:101A600080980100100000F288E40100200000408E -:101A7000209901000000005F239101004D031F9198 -:101A80008032000030000040209901000000005F1B -:101A90002391010050031F9180320000400000405C -:101AA000209901000000005F2391010053031F9162 -:101AB000803200000000005F2391010055031F9158 -:101AC000803200000008804020990100040000409E -:101AD00081B200000000004784B001000000A2486D -:101AE000848400000000005F61B101000000005C20 -:101AF0008F9001000000004762B101005A03A84026 -:101B000081320000000800478EC801005803005CC5 -:101B10008F800000E00000406199010058152D40C1 -:101B20008DB00100D0142DF088B00100000000FA43 -:101B30008AB001000000004581B0010007000045A7 -:101B400082880100000000438BF001000000004883 -:101B500083E0010000000046829401002000004163 -:101B600060990100000000418DC001007403225FF4 -:101B70008D6C00006503A2418150000063030040AA -:101B800081B2000008000040859801000000004478 -:101B900082B001000000004186B00100001C00433B -:101BA00086D801000000A641855001007003004165 -:101BB00083E000006E030040813201000000004815 -:101BC00085E00100D0142F468494010020000042DB -:101BD00060990100C0000040619901000000804050 -:101BE00081B201000400004081B200000400004006 -:101BF00081B200000400004081B2000004000040F7 -:101C000081B200000400004081B2000004000040E6 -:101C100081B20000070000458088010000000043F9 -:101C20008BF0010000040040839801008503A0416F -:101C3000815000008303004182E8000000008041E1 -:101C40008EC001000400004081B20000040000408A -:101C500081B200000000004049B1010000020040D4 -:101C600083980100003900404599010000000040C0 -:101C7000F1B101008B03A24183500000000000403D -:101C800085B001000B00004482F401001A1500A683 -:101C900086B0010070150040459901000008004021 -:101CA000F199010000000042F0B10100003900404C -:101CB000E1990100040000406199010070150043A2 -:101CC000629901009503A840813200009703225ACF -:101CD000737D00007A000040619901009803A8B16B -:101CE0007E3100000008004284C801009003A24138 -:101CF000835000000000804081B2010004000040D9 -:101D000081B200000400004081B2000004000040E5 -:101D100081B2000058152D408DB00100D0142DF077 -:101D200088B00100000000408FB00100010000A653 -:101D300090B0010000F800489098010000000045B4 -:101D400093B00100000000FA8AB001008003004057 -:101D500081320100020000A680B00100AC032240E5 -:101D6000826C0000B0030040813201005803004043 -:101D700081320100000000418DC00100B503225FE7 -:101D80008D6C0000A703A24193500000A503004002 -:101D900081B20000FF070047848801000000A640D0 -:101DA00081B20000ED9F0047803001000002004733 -:101DB0008EC80100B003004081B200000000004462 -:101DC00050B30100BB032018896C0000040000A67A -:101DD00084B00100200000A686B001000010004081 -:101DE000559B0100BE03004081B20000040000A624 -:101DF00084B00100200000A686B001000010004061 -:101E0000559B01000000004250D30100000000A8D3 -:101E10004FB30100000000434ED301006E030040A9 -:101E2000813201008203004280300100B003004093 -:101E300081320100C70322A78F6C00005A030040C3 -:101E400081320100C403004081B2000000008040E4 -:101E500081B20100C8142EBB85B00100000000EE65 -:101E600082B0010000000041E0B10100000000A2CA -:101E7000A0B3010000000044A5B30100E19F00CA27 -:101E8000A7330100E09F004081B200000400004041 -:101E900081B20000D6032242756F0000D8032241B0 -:101EA000756F0000DA031ECA81320000DC031FCA0E -:101EB00081320000000000CAC9B10100DD9F00426C -:101EC00075B30000000000CACDB10100DD9F0041E4 -:101ED00075B30000000000CACFB10100DD9F0040D3 -:101EE00075B30000008100A6C6B10100DD9F00406F -:101EF00081B20000008000A6C6B10100DD9F004055 -:101F000075B300000400004081B2000004000040EE -:101F100081B200004501004D933001004501004EA3 -:101F2000933001004501004C93300100EC9F0040CC -:101F300081320100DD9F004081B2000004000040BA -:101F400081B200000400004081B2000004000040A3 -:101F500081B200005495004045990100DD9F00CA00 -:101F6000E5B100000400004081B200000400004020 -:101F700081B200000400004081B200000400004073 -:101F800081B200000400004081B200000400004063 -:101F900081B20000CC142E4087B00100000000A2E6 -:101FA000A0B3010015040043B2330100000068DA59 -:101FB00089B001007C0000408B98010000000050B7 -:101FC00089F001000000004189D0010003000044B5 -:101FD000888C01000000004487C00100000000411F -:101FE000A5B3010015040043B2330100000000DA7C -:101FF000F1B101000000004487C001000000004171 -:10200000A5C301000B042244895000000B042244A4 -:102010008B500000FA03A250A56F000000000042A0 -:10202000A5E30100000000CAA7B30100E19F00BBC7 -:1020300085300100CC142ED295C30100AE0300CB35 -:10204000A3C901000000002042B1010000000050BF -:1020500081B001000804A241815000000704A2F2EF -:1020600080300000FA030040A5B3000000000042E9 -:10207000A5E30100000000CAA7B30100E19F00BB77 -:1020800085300100E09F004081B200000400004064 -:1020900081B20000000000D92BB101000010004007 -:1020A00083980100DB00004081320100FFFF0094B3 -:1020B000B48B01000000804081B20100000000D913 -:1020C0002BB101000010004083980100DD000040AA -:1020D0008132010000008094B4B30100040000408C -:1020E00081B200000400004081B200000400004002 -:1020F00081B200000400004081B2000004000040F2 -:1021000081B200000400004081B2000004000040E1 -:1021100081B20000000000D92BB10100000000DAFC -:1021200027B1010006C000402D990100DE000040EB -:1021300081320100001000408398010002C4004178 -:102140002C990100DE000040813201000040004077 -:1021500083980100058200412C990100DE000040B7 -:10216000813201002D048094803200000C01004077 -:10217000813201002804004081B200000480004048 -:102180002D990100DE0000408132010000008040F6 -:1021900081B201003104001210C9000000488040E3 -:1021A0000B980100C04980400B980100804B804093 -:1021B0000B980100404D80400B980100004F80407B -:1021C0000B980100C05080400B9801008052804065 -:1021D0000B980100405480400B980100005680404D -:1021E0000B980100C05780400B9801008059804037 -:1021F0000B980100405B80400B980100005D80401F -:102200000B980100C05E80400B9801008060804008 -:102210000B980100406280400B98010000648040F0 -:102220000B980100C06580400B98010080678040DA -:102230000B980100406980400B980100006B8040C2 -:102240000B980100C06C80400B980100806E8040AC -:102250000B980100407080400B9801000072804094 -:102260000B980100C07380400B980100807580407E -:102270000B980100407780400B9801000079804066 -:102280000B980100C07A80400B980100807C804050 -:102290000B980100407E80400B9801000400004034 -:1022A00081B200000400004081B200000400004040 -:1022B00081B200000400004081B200000400004030 -:1022C00081B200000400004081B200000400004020 -:1022D00081B200005904001210C900000080804043 -:1022E0000B980100008280400B9801000084804020 -:1022F0000B980100008680400B9801000088804008 -:102300000B980100008A80400B980100008C8040EF -:102310000B980100008E80400B98010000908040D7 -:102320000B980100009280400B98010000948040BF -:102330000B980100009680400B98010000988040A7 -:102340000B980100009A80400B980100009C80408F -:102350000B980100009E80400B98010000A0804077 -:102360000B98010000A280400B98010000A480405F -:102370000B98010000A680400B98010000A8804047 -:102380000B98010000AA80400B98010000AC80402F -:102390000B98010000AE80400B98010000B0804017 -:1023A0000B98010000B280400B98010000B48040FF -:1023B0000B98010000B680400B98010000B88040E7 -:1023C0000B98010000BA80400B98010000BC8040CF -:1023D0000B98010000BE80400B98010004000040F3 -:1023E00081B200000400004081B2000004000040FF -:1023F00081B200000400004081B2000004000040EF -:1024000081B200000400004081B2000004000040DE -:1024100081B200000000004087B1010000000040D0 -:1024200097B001000000004B80B10100010000A640 -:1024300082B1010082048541974000000000004005 -:1024400097B101000000004097B001000000004B70 -:1024500090B10100010000A692B1010087048541FE -:10246000974000000000804081B20100040000405D -:1024700081B200000400004081B20000040000406E -:1024800081B200000400004081B20000040000405E -:1024900081B2000090046040813200000000001210 -:1024A00080B10100FFFFF04B82890100930460407E -:1024B000813200000000004A80B101000100F0A656 -:1024C00082B101009604604081320000FFFF004BA2 -:1024D000848901000000F0C224B001000000004A1D -:1024E00090B10100FFFF804B928901000000004A7B -:1024F00090B10100010080A692B10100FFFF004BE6 -:1025000094890100000080CA94B0010004000040DA -:1025100081B200001000004E98E4010000000007A6 -:10252000989401000000004399E001000000008041 -:10253000989401000000004999E001000000004C5F -:1025400088940100A604474081320000AD04222097 -:10255000876F000000001F4081B2010000000040B2 -:1025600081B201000000004081B201000000004083 -:1025700081B20100A604004081B2000000001F806B -:1025800086B30100B004224F777D0000C0040040F4 -:10259000813201000000004F61B1010000000044E1 -:1025A00062B10100B104A84081320000B804224B9E -:1025B000897C0000B604224F777D0000C0040040F3 -:1025C000813201000000004562B10100B604A8405C -:1025D000813200000000802087B301000400004029 -:1025E00081B200000400004081B2000004000040FD -:1025F00081B200000400004081B2000004000040ED -:1026000081B200000400004081B2000004000040DC -:1026100081B200000000005099B001006F0000403E -:1026200061990100C104A8B152330000C604224BD5 -:10263000537F00006F00004061990100C404A8B1FD -:102640007E310000C104A241995000000000A24F59 -:1026500077FD00000400004081B20000040000404B -:1026600081B200000400004081B20000040000407C -:1026700081B200000400004081B20000040000406C -:1026800081B200000400004081B20000040000405C -:1026900081B200001000004E98E401000000000725 -:1026A000989401000000004399E0010000000080C0 -:1026B000989401000000004899E00100D604004C05 -:1026C00088940000D604474081320000DD042220B7 -:1026D000876F000000001F4081B201000000004031 -:1026E00081B201000000004081B201000000004002 -:1026F00081B20100D604004081B2000000001F80BA -:1027000086B30100E004224F777D0000F004004012 -:10271000813201000000004F61B10100000000445F -:1027200062B10100E104A84081320000E804224ABD -:10273000897C0000E604224F777D0000F004004011 -:10274000813201000000004562B10100E604A840AA -:10275000813200000000802087B3010004000040A7 -:1027600081B200000400004081B20000040000407B -:1027700081B200000400004081B20000040000406B -:1027800081B200000400004081B20000040000405B -:1027900081B200000000005099B001006F000040BD -:1027A00061990100F104A8B152330000F604224AF5 -:1027B000537F00006F00004061990100F404A8B14C -:1027C0007E310000F104A241995000000000A24FA8 -:1027D00077FD00000400004081B2000004000040CA -:1027E00081B200000400004081B2000004000040FB -:1027F00081B200000400004081B2000004000040EB -:1028000081B200000400004081B2000004000040DA -:1028100081B200007B000040619901000005A8B171 -:102820008030000012051D4080320000401800403A -:1028300049990100040000A686B001001005A240DD -:1028400086040000DE9F9C4080320000FFFF0040B5 -:1028500088880100300500504731010036000044EF -:1028600088CC01000C055240813200003005004048 -:10287000473101000000004189B0010030050048E7 -:10288000473101003005000547310100DE9F00405F -:1028900081B200002800004047991B00DE9F0041E4 -:1028A000E1C11A007818004049991B00190522540B -:1028B000817C1A001405424081321A00008200B364 -:1028C00067DF1B0000001A4493931B0028000040A0 -:1028D00047991B00300500418930010027050F4052 -:1028E00080320000FF7F00408888010030050050E2 -:1028F000473101003600004488CC01001F05994093 -:10290000803200000000004889D0010021059B4072 -:10291000803200000000004C89D0010023051F44D4 -:1029200080320000300500404731010000000041C6 -:1029300089B00100300500484731010030050058DA -:1029400047310100DE9F004081B2000010000040CE -:1029500086F401006F00004386880100DE9F260593 -:10296000473100003005004189300100DE9F004002 -:1029700081B200000400004081B200000400004069 -:1029800081B200000400004081B200000400004059 -:1029900081B200000000A044F041010000000040AE -:1029A00081B2010000008041E1C10100040000404B -:1029B00081B200000400004081B200000400004029 -:1029C00081B200000400004081B200000400004019 -:1029D00081B200004C010007913001000000A240CC -:1029E00097EC00000000800591C001000400004049 -:1029F00081B200000400004081B2000004000040E9 -:102A000081B200000400004081B2000004000040D8 -:102A100081B200004C010040813201004405A24017 -:102A2000976C00003A000040B39B01004505004050 -:102A300081B2000040000040B39B01001004004040 -:102A400081320100000000DAF5B1010010040042FB -:102A5000B3430100000000DAF5B1010010040042A8 -:102A6000B3430100000000DAF5B101004E00004060 -:102A7000B39B01001004004081320100080000DA1D -:102A8000F7F5010050000040919801000000004758 -:102A90008FB0010010040048B2330100000000DADA -:102AA000F7B10100080000DAF7F50100000000426C -:102AB00091C001005005A2418F500000000000416C -:102AC00045D1010008000040B39B01001004004004 -:102AD00081320100000000DAFDB101000A0000406F -:102AE000B39B01001004004081320100000000DAB5 -:102AF000FDB101001A000040B39B0100100400402A -:102B000081320100000000DAFDB101001800004030 -:102B1000B39B01001004004081320100000000DA84 -:102B2000FDB1010038050040813201001E0000485F -:102B3000B2CB01001004004081320100000000DA35 -:102B400091C0010000000048B2CB01001004004019 -:102B50008132010000006EDA8FB0010002000048EF -:102B6000B2CB01001004004081320100000000DA05 -:102B7000FDB1010004000048B2CB01001004004088 -:102B800081320100000080DAFDB101000400004044 -:102B900081B200007A052245FD7F0000401600400A -:102BA00045990100DB9F00404931010008000048C1 -:102BB000B2CB010015040040813201007805A2402B -:102BC0008F6C00007D052220B56F00007A05004063 -:102BD00081B20000DA9F004081321F007D05224053 -:102BE000976C1E007A05424081321E000000004FA3 -:102BF00067931F00DF9F005867931E005416004024 -:102C000047991F00000000FEF4B11F0000000040C3 -:102C100081B21F00000000FEF4B10100000000407E -:102C200081B20100000000FEF4B10100000000408C -:102C300081B20100000000FEF4B10100000000407C -:102C400081B20100000000FEF4B10100000000406C -:102C500081B20100000000FEF4B10100000000405C -:102C600081B20100000000FEF4B101004600004006 -:102C7000B39B01001004004081320100080000DA1B -:102C8000F7F501004800004095980100000000445D -:102C900097B001001004004AB2330100000000DACE -:102CA000F7B10100080000DAF7F50100000000426A -:102CB00095C001009005A241975000002A000040F5 -:102CC000A59B010040160040A19B0100000000CA26 -:102CD000A7B30100E19F00BB85300100E09F0040E9 -:102CE00081B200000400004081B2000004000040F6 -:102CF00081B200000400004081B2000004000040E6 -:102D000081B200000400004081B2000004000040D5 -:102D100081B20000B8052245FD7F0000E0150040AB -:102D2000479901001A0000A280DC01000000005059 -:102D3000F1B10100F0150040F1990100000000CA56 -:102D4000F1B101000700004061990100200000403E -:102D500062DD0100A705A8BBE131000000000050C2 -:102D600083B00100AA05A24183500000A905A2F288 -:102D7000823000004C01004081320100B005A240C9 -:102D8000976C00003A000040B39B0100B105004081 -:102D900081B2000040000040B39B0100F0150040EC -:102DA000439901001004004081320100B805A2FAE5 -:102DB000B46F000010040042B3430100B805A2FA4A -:102DC000B46F000010040042B3430100BB0522FAB7 -:102DD000B46F0000B8054240813220000000004E70 -:102DE00067932100DF9F0058679320004016004042 -:102DF00045992100DB9F004049312100F615004034 -:102E0000439921005C1600404599210000006EFAAC -:102E10008EB021000000004081B20100000000FEE1 -:102E2000F4B101000000004081B20100000000FE8A -:102E3000F4B101000000004081B20100000000F088 -:102E4000B4B30100C905A2408F6C0000FC1520201E -:102E5000E1B10100CE05004081B22400DA9F0040BC -:102E600081322500CE052240976C2400CB054240DC -:102E7000813224000000004F67932500DF9F005837 -:102E80006793240038050040813225001E00004869 -:102E9000B2CB25001004004081320100D30522503E -:102EA000B56F00000000005091C001000000004814 -:102EB000B2CB0100F615004043990100200400F256 -:102EC000B433010002000048B2CB0100F815004005 -:102ED00043990100200400F2B433010004000048CB -:102EE000B2CB0100FA15004043990100200400F222 -:102EF000B433010008000048B2CB0100FC150040CB -:102F000043990100000000F094B00100FFFF004A67 -:102F1000B48B010020040040813201000A00004807 -:102F2000B2CB01001000004AB4F7010020040040B9 -:102F30008132010038050040813201001E00004846 -:102F4000B2CB01001004004081320100E90522509B -:102F5000B56F0000EA050050B5B300000000004066 -:102F6000B5B301002004004081320100E09F004021 -:102F700081B200000400004081B200000400004063 -:102F800081B200000400004081B200000400004053 -:102F900081B2000000160040479901003031004026 -:102FA000F599010032330040F599010034350040B5 -:102FB000F599010036370040F59901003839004095 -:102FC000F599010041420040F59901004344004059 -:102FD000F599010045460040F59901004748004039 -:102FE000F5990100494A0040F59901002C00004084 -:102FF0008398010000000040F7B10100FC05A241E8 -:103000008350000080162E0683B00100360000FBBE -:10301000F6A90100FF05A2418350000022000040F4 -:1030200083980100000000FBF6B101000206A241F6 -:10303000835000006200004095980100DC9F004032 -:103040008132010000162D0683B001008016004079 -:10305000459901005C0000FBF6A901000806A241A9 -:103060008350000000000070F9B101000000007101 -:10307000F9B1010000000072F9B101000000007315 -:10308000F9B1010000000074F9B1010054000040E2 -:1030900095980100DC9F0040813201000000007023 -:1030A00095B0010014062270B56F00000000804149 -:1030B00097B001000000804097B00100040000407C -:1030C00081B200000400004081B200000400004012 -:1030D00081B20000456700A6E0B201000123007044 -:1030E000E19A0100CDEF00A6E2B2010089AB0071C8 -:1030F000E39A0100BA9800A6E4B20100FEDC007277 -:10310000E59A0100321000A6E6B201007654007381 -:10311000E79A0100D2C300A6E8B20100F0E1007412 -:10312000E99A01008016004A44C901000000000726 -:1031300081B001000000004A80D001000000004082 -:10314000F7B101002506A241815000008016004A17 -:1031500044C90100FC162A47E7B501000300004AF4 -:10316000E8E50100000000408DB001005003004080 -:10317000A399010080163D468DE00100000000503B -:1031800089B00100000000FC40B0010000000041D7 -:10319000A3C101002E06A24189500000000000706A -:1031A000EBB2010000000071EDB2010000000072FE -:1031B000EFB2010000000073F1B2010000000074E2 -:1031C000F3B201000000004083B001000F00004195 -:1031D0008088010050030040A2C901004B06A050A6 -:1031E000836C00000D00004098C801000000004FF3 -:1031F000998401005003004CA2C901000000002086 -:1032000086B001000800004098C801000000004F8F -:10321000998401005003004CA2C901000000002065 -:1032200086A401000200004098C801000000004F81 -:10323000998401005003004CA2C901000000002045 -:1032400086A4010050030040A2C901000000004311 -:1032500040A401000100002088E401000000005F9C -:1032600041F0010000000044409401000500007599 -:1032700089E401001B00007585F401000000004492 -:10328000849401005506A353836C0000000000766F -:1032900089B00100000000778984010000000076F9 -:1032A0008BB00100000000208BA40100000000781A -:1032B0008B840100640600458894000027000041CB -:1032C00080CE01005A06AA4081320000000000763C -:1032D00089B001000000007789A40100640600782D -:1032E00089A400003B00004180CE01005706AA409F -:1032F000813200000000007689B0010000000077F4 -:1033000089840100000000768BB001000000007885 -:103310008B840100000000458894010000000077C4 -:103320008BB00100000000788B840100640600452A -:10333000889400000000004484C00100000000796F -:1033400085C001000000002084C001006B06A3536B -:10335000836C0000825A00A684C001009979004263 -:1033600084C801007806004081B2000027000041B7 -:1033700080CE01007006AA4081320000D96E00A6FE -:1033800084C00100A1EB004284C80100780600401F -:1033900081B200003B00004180CE01007506AA40CA -:1033A000813200001B8F00A684C00100DCBC0042FB -:1033B00084C801007806004081B2000062CA00A6FD -:1033C00084C00100D6C1004284C8010078060040D4 -:1033D00081B2000000000078F3B201000000007725 -:1033E000F1B201001E00007689E4010002000076BF -:1033F000EFF6010000000044EE96010000000075A9 -:10340000EDB2010000000042EAB2010000000041FC -:1034100083C001004F00004180CE010037062A40E2 -:103420008132000000000075E1C20100000000765A -:10343000E3C2010000000077E5C20100000000784F -:10344000E7C2010000000079E9C201002B068141BA -:103450008D4000000000804081B201000400004067 -:1034600081B200000400004081B20000040000406E -:1034700081B200000400004081B20000040000405E -:1034800081B200000400004081B20000040000404E -:1034900081B2000000000050FD9301004016004082 -:1034A00045990100DB9F00404931010008000048B8 -:1034B000B2CB01001504004081320100B906224060 -:1034C0008F6C0000DA9F004081320100B906A240F3 -:1034D000976C00005E160040439901007C1620F6B0 -:1034E000E0B101000000004031B301009D06224F11 -:1034F0008F7C000000000051FD9301009F062240D8 -:103500008F7C0000A3060054FD930000A106224218 -:103510008F7C000000000052FD930100A3062241B1 -:103520008F7C000000000053FD930100B70622517C -:10353000FD7F000038050040813201000C0000488A -:10354000B2CB01001004004081320100B206A2405B -:10355000B56F00001E000048B2CB01001004004807 -:1035600096300100000000DA97C001000400004B13 -:10357000B2CB010010040040813201000E0000486F -:10358000B2CB010020040040813201000C00004851 -:10359000B2CB010000000030B5B3010020040040B0 -:1035A000813201000E000048B2CB0100100400403F -:1035B00081320100B6062240B56F0000BA06005401 -:1035C000FD93000000000051FD8301001C0000FE7F -:1035D0007FD90100BA06A6408132000000000055E4 -:1035E000FD9301000000804081B201000400004012 -:1035F00081B200000400004081B2000004000040DD -:1036000081B200000400004081B2000004000040CC -:1036100081B20000E79F004081320100C406225CB5 -:103620001F7C0000E39F00881CB00000E99F005C45 -:103630001F00010000002E0548B1010000000040FD -:10364000E1B1010004002D0348B10100000000F0C9 -:103650003CB001002800001402C801000000000175 -:1036600034B0010000002D0532B001002200000539 -:103670000AC801001000000348C90100000000F85A -:1036800018B00100000000F804B00100000000F8CC -:103690000EB001000C0000A40CC80100EA9F00401D -:1036A000813201000000004023B001000A0722011E -:1036B0008032000000003C4423E0010000002EA402 -:1036C00080B001000000001048C10100D906A30726 -:1036D000026C0000DA0668011AB0000000006807FA -:1036E0001AB001000000000D02D00100000000052A -:1036F000F0B101000000000CF0B101000000000278 -:10370000E0B101000000000D0AC00100EC062240FB -:10371000036C0000E6062242236C0000000000411A -:1037200023C001000000004761B10100200000A497 -:1037300062DD01002307284081320000E3060040DB -:1037400081B200000000001080C0010000000047AE -:1037500061B101000000004062B10100E806A8402C -:1037600023300000E39F00881CB0000023070040C6 -:1037700081B200000000001080C00100000000477E -:1037800061B101000000004062B10100EE06A840F6 -:1037900023300000E39F00881CB0000022000019C5 -:1037A00048C9010000002D1448C101000F0000F2BB -:1037B0003A880100000000423BE001000E000014C6 -:1037C00002C801000000001D02C00100FA06231A11 -:1037D000025000000000004603C001002307000162 -:1037E00034C000000C002D1D48C10100F00000F2A3 -:1037F000308801000000004231F001000000001498 -:1038000002B001000000001D02C00100000000180D -:1038100002C001000207221A025000002307000123 -:1038200034C000002200001948C9010002002D1414 -:1038300048C10100000000F614B001000000001DA6 -:1038400014D001000000001814D001000000001E78 -:1038500024B001001200001710C801002307001A4D -:1038600010C0000000003C4423E00100000000A460 -:1038700086B0010000002E1048C101000F07A312FE -:103880000E6C0000100760071AB000000000601204 -:103890001AB001000000680D16940100FFFF000B34 -:1038A00016D8010000000008F0B101000000000C73 -:1038B000F0B1010000000002E0B1010000000010C2 -:1038C00086C001000000004661B1010020000043F5 -:1038D00062DD01001707A85C1F1000004007220DE1 -:1038E000145000004007220D245000000000000D7D -:1038F00010C001001E072242236C00002307004174 -:1039000023C000000000004661B10100400000102B -:1039100062DD01001F07A85C1F000000E39F008814 -:103920001CB000000000004023B001003F07A20DC2 -:103930000E5000002E0722461F7C000000000046AB -:103940001F8001003080001042C901002C0722F2C4 -:10395000640600000000004761B101004000001053 -:1039600062DD01002907A84081320000E39F008842 -:103970001CB0000020800003469901000000005F99 -:10398000E191010000002D0648B10100000000F89F -:1039900018B00100000000F804B0010033071FF068 -:1039A0000E300000D306004C0DC0000000002E5F5A -:1039B0000F800100D3062307146C000030000010B4 -:1039C00048C9010024000040F199010000000003F3 -:1039D000F0B1010000000000F0B10100000000168D -:1039E000F0B101002400000000C801000000004701 -:1039F00061B10100200000A462DD01003C07A8467F -:103A00001F100000D30600030CB00000D306000D09 -:103A100018C000005F07A2441F7C000000000019CE -:103A20000AB001002200000548C901000A002D1457 -:103A300048C1010002002040E5B10100040020401F -:103A4000E5B101000D002D1D48C10100090000F382 -:103A5000388801000D002050E7B1010004002D401E -:103A60003FB00100000000F432B00100040020402B -:103A7000E1B101002200000548C9010000002D1439 -:103A800048C101000200001D94F401000000004044 -:103A900091B001005207A0FC9040000000000041DE -:103AA00091C001005007A24195500000000000A401 -:103AB00096B0010004002E0548B101000000004846 -:103AC000F0B101000000004B48B1010000000018F7 -:103AD00048C101000200001894F4010000002D18F4 -:103AE00090B001005C07A0FC904000000000004185 -:103AF00091C001005A07A241955000000000004803 -:103B0000E0B1010010002040E5B1010004002D05E6 -:103B100048B10100000000F880B02D00000000F066 -:103B200016B02D002200000548C92D000000001429 -:103B300048C12D00640743303D072C000000009E63 -:103B400085B02D0000001B413DC32D000400204224 -:103B5000ECB12D000000001E82B0010002002E1DFD -:103B600082C001000000661882C00100000000420F -:103B700080C001006E07A0418044000000000041A9 -:103B800081C001001000004092F401000A002E30B4 -:103B900081840100720790409240000000000041C3 -:103BA00093C001000000662093A401000000001DE6 -:103BB00048C1010004002019E8B101000000001E06 -:103BC00016C001007807A01916440000000000414B -:103BD00017C001000D002F1E32C001007D07A2405A -:103BE000156C00007C07A01C16400000000000417E -:103BF00017C00100000063F33894010010000005B5 -:103C000048C9010004002E1E98B001000000601A8F -:103C100098C001000C002040E1B101008B07224652 -:103C20001F7C0000000000461F8001003080001053 -:103C300042C90100890722F2640600000000004723 -:103C400061B101004000001062DD01008607A8405C -:103C500081320000E39F00881CB000002080000338 -:103C6000469901000000005FE191010030800010E2 -:103C700044C901001200001AF0C901000000001739 -:103C8000F0B1010010000005E0C901003000001093 -:103C900080C801000000004461B101002000004024 -:103CA00062DD01009107A840813200009B07225C81 -:103CB0001F7C000000003C4423E0010000002D10A8 -:103CC00048C101009B0722F2640600000000004684 -:103CD00061B101004000001062DD01009807A840BA -:103CE00081320000E39F00881CB00000EB9F005C65 -:103CF0001F00010020002F0548B101000000000B4B -:103D0000E4B101000000005017F00100A10790F29B -:103D1000164000000000004117C0010000006620AE -:103D200017A40100100000142AC801000000001DA3 -:103D30002AC00100000000502BE00100000000F24A -:103D40002A9401003080001042C90100AC0722F221 -:103D5000640600000000004461B101004000001052 -:103D600062DD0100A907A84081320000E39F0088BE -:103D70001CB000000080001710DC0100C9072240C1 -:103D8000156C0000B407A2441F7C00000000004432 -:103D90001F900100B307229F136C000002000088EF -:103DA0001CCC0100E49F004081B2000000000041F3 -:103DB0003FC30100E69F004081320100B707A241E6 -:103DC000877C00000000001E3EC00100C9072240A1 -:103DD000156C0000BA07201E146C00000000000AD9 -:103DE0003CB00100E59F001E24300100BF072208FF -:103DF0002E3000000000005211C001000000001A27 -:103E000010C001002307004017B00000E49F0088A5 -:103E10001CB00000E59F004081320100BC07A208F1 -:103E20002E300000808000A604B001000600004093 -:103E300087980100008000034499010004002204D7 -:103E4000E0310000E89F001F8C30010000000040BE -:103E50000FB00100E29F005C1F9000000080000393 -:103E60004499010004002204E0310000E69F004074 -:103E700081320100CE07A241877C0000CF07001EDF -:103E80003EC000000000001F8CB001000000004098 -:103E900005B00100E89F00400F300100E29F005C88 -:103EA0001F9000000400004081B2000004000040A8 -:103EB00081B200000400004081B200000400004014 -:103EC00081B200000400004081B200000400004004 -:103ED00081B200000400004081B2000004000040F4 -:103EE00081B200000400004081B2000004000040E4 -:103EF00081B200000400004081B2000004000040D4 -:103F000081B200000400004081B2000004000040C3 -:103F100081B200000400004081B2000004000040B3 -:103F200081B200000400004081B2000004000040A3 -:103F300081B200000400004081B200000400004093 -:103F400081B200000400004081B200000400004083 -:103F500081B200000400004081B200000400004073 -:103F600081B200000400004081B200000400004063 -:103F700081B200000400004081B200000400004053 -:103F800081B200000400004081B200000400004043 -:103F900081B200000400004081B200000400004033 -:103FA00081B200000400004081B200000400004023 -:103FB00081B200000400004081B200000400004013 -:103FC00081B200000400004081B20000F70700BC8D -:103FD00080B200000380004081B2000003800040F6 -:103FE00081B200000380004081B2000003800040E5 -:103FF00081B200000380004081B2000003800040D5 -:1040000081B200000380004081B2000003800040C4 -:1040100081B200003180004081B200003480004055 -:1040200081B200003580004081B2000004000040F1 -:1040300081B200001B808180803200001487A24082 -:10404000916F00000000004C90B301005C952EA21F -:1040500080B00100FF000080F489010090952AC81B -:10406000E5B10100000000A1F0B101000000004036 -:10407000F0B10100000000A4F0B10100000000D088 -:10408000F0B10100000000D1F0B10100000000D249 -:10409000F0B101000000004CF0B10100000000D4BC -:1040A000F0B10100000000D3F0B10100000000EE0B -:1040B000F0B101000000004EF0B10100000000402E -:1040C00044B1010018801181983000000000514077 -:1040D00081B201001A801182983000000000524025 -:1040E00081B2010014870048FD930000B603004030 -:1040F000A19901002380A242FD7F00002080008062 -:1041000080320000228011818230000022805140E4 -:1041100081B2000022801182823000002280524051 -:1041200081B200002C800048FD93000027800080B1 -:10413000803200002680A253077C0000000051530B -:10414000079001002A800052079000002980A252A7 -:10415000077C00000000525207900100000000534D -:104160000790010000000048FD9301000000004698 -:10417000F39301005C952EA252B30100FF00008072 -:10418000F48901000000004CE4B10100000000A926 -:1041900045B101003080004C80B200000000454075 -:1041A00081B201000000554081B20100AF8205409C -:1041B00049B10000AF82054049B100000000054050 -:1041C00049B101004C010040813201000000004B68 -:1041D000DEB2010000000040FD9301000000004835 -:1041E000FD830100020000409B9B0100000000A530 -:1041F0009CB30100480300408132010058952044DF -:10420000E0B101000494004043990100000000F275 -:1042100024B10100000C00EE968801000000004A65 -:1042200097F001004480A243976C00000000004218 -:10423000FD93010000C000A636B10100D01400407B -:104240004799010005000040F59901000038004041 -:10425000F599010000060040F599010000000040BA -:10426000F599010005100040F59901000209004090 -:10427000F599010004000040F59901006003004039 -:10428000813201008803004081320100A003004018 -:1042900081320100A2820040813201009A820040F6 -:1042A0008132010060952040E1B10100709520400D -:1042B000E1B1010000000049DD9101000000004073 -:1042C00091B30100F99500408132010000000040E7 -:1042D00085B301005C952040E1B1010027820040D8 -:1042E0008132010090060040813201000000005F31 -:1042F0002F8101008D81004081320100FE95004038 -:10430000813201000000454081B2010000005540AB -:1043100081B20100DD82004081B200000400004053 -:1043200081B200000400004081B20000040000409F -:1043300081B200000400004081B20000040000408F -:1043400081B200000400004081B20000040000407F -:1043500081B200002800004047990100AF8200416F -:10436000E1C1000078180040499901001905225464 -:10437000817C00006C80424081320000008200B4E9 -:1043800069DF010000001A449393010028000040F7 -:10439000479901001805004081B200000400004068 -:1043A00081B200000400004081B20000040000401F -:1043B00081B200000400004081B20000040000400F -:1043C00081B200000400004081B2000004000040FF -:1043D00081B2000040820040813201007D80224095 -:1043E000976C00007A804240813200000000004F4C -:1043F0006993010038810058699300005416004009 -:1044000047990100000000FEF4B101008005004062 -:1044100081B2000080804240813200000000004EE6 -:1044200069930100388100586993000040160040EC -:10443000459901004005004049310100F615004052 -:10444000439901005C1600404599010000006EFA96 -:104450008EB00100C105004081B2000004000040A0 -:1044600081B200000400004081B20000040000405E -:1044700081B200000400004081B20000040000404E -:1044800081B200000400004081B20000040000403E -:1044900081B200009680004081B20000408200405E -:1044A0008132010096802240976C00009380424048 -:1044B000813200000000004F6993010038810058EC -:1044C0006993000038050040813201001E00004859 -:1044D000B2CB0100D005004081B2000004000040D2 -:1044E00081B200000400004081B2000004000040DE -:1044F00081B200000400004081B2000004000040CE -:1045000081B200000400004081B2000004000040BD -:1045100081B200008302004081B20000B802004076 -:1045200081B20000D49F004081B20000D59F0040BE -:1045300081B20000D69F004081B20000D79F0040AA -:1045400081B200007201004181C000005501514854 -:10455000FD93000055015248FD9300005501554957 -:10456000FD8300005501564AFD83000050019181F2 -:10457000803000005501454081B200005001918219 -:10458000803000005501464081B20000000000402C -:1045900089B00100000000F880B00100000000F0C8 -:1045A00016B001002200000548C9010000000014F7 -:1045B00048C10100B48043303D0700000000009E68 -:1045C00085B0010000001B413DC3010004002042F2 -:1045D000ECB101000000004049B10100AE0300CB86 -:1045E000A3C901000000002046B10100000000D274 -:1045F000F1B10100000000D3F1B101000000004260 -:10460000F0B101000000004561B101002000002070 -:1046100062DD01000000A8D0E1B10000BF800040D1 -:1046200081B20000000000A898B0010004800040A2 -:104630008BB30000B1030040A1990100C780A242E2 -:10464000976F000000000045A1C1010000000000BC -:1046500080B001000000A2048094000080153F4259 -:1046600097E301000000004049B101000000600331 -:10467000029401000000004007B00100040000CBDC -:1046800099CB0100000000CCF3830100D180A2424D -:10469000976F0000000000CBF3930100AE0300CB46 -:1046A000A3C901000000002044B101000000004443 -:1046B000F1B1010000000000F0B1010000000004B1 -:1046C000F0B10100000000A1E0B1010005000040D0 -:1046D000619901002000002062DD0100D880A8401F -:1046E00081320000F9020020423101000000A241A5 -:1046F000056C0100000080CBDB9101000000194136 -:104700008BB301006000004061990100DE80A8B118 -:104710008C3300006000004061990100E080A8B186 -:1047200094330000E68014C681320000180000C6F1 -:1047300083F40100F482224F83040000C280004011 -:1047400081B20000FF0100C681880100000000C6A0 -:1047500097A30100C2801F5C9753000058821EC6B9 -:104760008132000000002F4381F00100EC80004006 -:1047700010C900003981004081B200006A81004008 -:1047800081B20000248200CA63B30000618100404E -:1047900081B200004881004D83B000005281004E7C -:1047A00061B100004181004085B000004881004CAB -:1047B00083B000002481004085B00000E381004008 -:1047C00049B1000071810040C1B10000DF810040AB -:1047D00081B200004181004085B00000F00300403C -:1047E00049B10000F48200CA9BB300007B81004005 -:1047F000C1B100007F810040C1B10000868100404E -:10480000C1B1000087810040C1B100008881004033 -:10481000C1B1000089810040C1B100008A8100401F -:1048200081B000008A81004181B000001882004000 -:1048300081B20000978200BBABB30000258200CAA2 -:10484000CFB30000C803004049B10000E8030040B6 -:1048500081B200002682004081B20000F482004054 -:1048600081B20000E003004081B20000F48200CA7F -:1048700077B300004981004D83B000005081004EA5 -:1048800061B10000418100BB85B000004981004C4E -:1048900083B00000418100BB85B00000248100BBD3 -:1048A00085B000001681004081B20000F48200CA89 -:1048B0004DB300007005004049B10000A005004064 -:1048C00049B100001C8122428F6F00001E812241ED -:1048D0008F6F000020811ECA8132000022811FCA12 -:1048E00081320000000000CAC9B10100F482004218 -:1048F0008FB30000000000CACDB10100F482004176 -:104900008FB30000000000CACFB10100F482004064 -:104910008FB30000008100A6C6B10100F482004000 -:1049200081B20000008000A6C6B10100F482004000 -:104930008FB30000781800404999010010002F9CA7 -:1049400089B001003B8100403933010018002F9BE2 -:1049500089B001003B8100403733010000002F9AED -:1049600089B001003B8100403533010008002F99D8 -:1049700089B001003B81004033330100008000AE6C -:1049800047C9010080000040F1990100000000CA01 -:10499000F1B1010000000042F0B1010040180040F8 -:1049A000E19901000000004561B10100200000AE66 -:1049B00063DD0100368128408132000033810040F0 -:1049C00081B2000036814240813200000000005C6C -:1049D00069930100F4821A449393000039814240A4 -:1049E00081320000388100586993000000000044C3 -:1049F000F0D101000000A44081B200004081A2403B -:104A0000E16D00000000004445D10100000080403D -:104A1000E1B1010000008041E1D101004181375C3A -:104A2000613100000000004262B101004581284070 -:104A3000813200004281004081B20000000000CAC3 -:104A400063B101004581A84081320000F482174023 -:104A500081B200004A81004081B000004A8100BB61 -:104A600081B000000000004160B101000000004082 -:104A700062B101004B81A84081320000000000CAF1 -:104A800063B10100F4822840813200004D81004072 -:104A900081B200005095004047990100538100BB4E -:104AA00087B0000050952F4087B00100558122400B -:104AB000957F0000F48260409583000002002DF095 -:104AC00084B001005681364081320000000000426F -:104AD00062B101005781A84081320000000000430C -:104AE00062B101005981A84081320000000000CA73 -:104AF00063B101005B81A8408132000000001640D4 -:104B000081B20100F482224143510000000800CA32 -:104B100095CB01005681004185C000006381A2420F -:104B2000676F00000000004167B3010063814240ED -:104B3000813200000000004065B301000000004029 -:104B40009383010000001ACA69970100F48226408D -:104B5000813200006881424081320000F4821A44B0 -:104B600093930000F4822043956F0000F48280CA82 -:104B700067330000F4822240656F0000F482006F0A -:104B8000DB91000085000040813201003580224029 -:104B900080320000F482004081B200000000005822 -:104BA000959301000000005F959301007781A24476 -:104BB000216F00000000005F958301000000005E8F -:104BC000959301000000005795930100000000CA72 -:104BD000C3B101007A81225B957F00000000004B89 -:104BE000FD930100F482004081B200001BFD00CA69 -:104BF000959B01000D0100CAC53101000000005F56 -:104C000095830100F48200CAC5B10000DF6F00CABD -:104C1000959B01000000005595930100000000CA1B -:104C2000C7B10100F482225F957F00000D010040B2 -:104C3000813201000000005F95830100F48200CA08 -:104C4000C7B10000F48200CAC9B10000F48200CAF2 -:104C5000CBB10000F48200CACDB10000F48200CADA -:104C6000CFB1000000002E4281E001009814004006 -:104C700048C90100F48200CAE1B100000000004010 -:104C800009B10100200000A682B001008F81A25E60 -:104C90000B7D000000800041089901009181A25E17 -:104CA0000B7D0000208000A608B1010093819F8544 -:104CB000823000000000003083840100C88122306F -:104CC000836C00009281A24F0B7D00000000004128 -:104CD00021B30100028000A682B0010013820040CF -:104CE000813201001000004184E40100038000A62D -:104CF00082B001001382004081320100F0FF0041C8 -:104D00008688010000000043849401000F0000A683 -:104D100086B0010010C4004386980100A881A24318 -:104D2000846C00000000004321B30100200000A6B5 -:104D300082B001001C00004182DC0100A581A25E5E -:104D40000B7D00000400004108990100BA81004079 -:104D500081B20000410100A686B00100500C004362 -:104D600086980100AD81A243846C000000000041E0 -:104D700021B30100BA81004081B20000410100A6C8 -:104D800086B00100600C004386980100BA81A243FE -:104D9000846C00000000004221B30100188000A6CE -:104DA00082B001001382004081320100FFFF004108 -:104DB0008288010000770041828C010001020041DD -:104DC000829801002000004182DC010018000041AF -:104DD00082DC0100B881A25E0B7D00000000004172 -:104DE00008B10100200000A682B00100BB81A25ED4 -:104DF0000B7D00004013004108990100C38122434C -:104E0000216F0000200000A682B0010012000041C6 -:104E100082DC0100C081A25E0B7D00000004004125 -:104E200008990100DE81004081B20000200000A648 -:104E300082B001001900004182DC0100C581A25E40 -:104E40000B7D000000A0004108990100DE810040B8 -:104E500081B200000000004421B3010000000040C6 -:104E600083B001000000005F839001000000005E3D -:104E70008390010000000057839001000000004172 -:104E8000C2B101000C010040813201000000005F4E -:104E90008380010000000041C2B101000C0100400C -:104EA00081320100200000A682B001000400004110 -:104EB00082DC01002000004108990100200000A6CA -:104EC00082B001001100004182DC0100D781A25EA6 -:104ED0000B7D00000100004108990100200000A6A0 -:104EE00082B00100DA81A25E0B7D00004013004118 -:104EF00008990100010000A682B0010040000041B5 -:104F00002E9901000000804081B20100200000A61F -:104F100080B00100000000CA81940100E181A25E1E -:104F20000B7D0000F482004008B10000C8142EBBC5 -:104F300085B00100E481A25E0B7D0000000000400E -:104F400087B00100F3812243216F000002822244D6 -:104F5000216F0000118000A682B001001382004082 -:104F6000813201000A82224A837C00000000004056 -:104F700087900100EE81224D837C000000000041FB -:104F800087900100F081224F837C000000000043E5 -:104F900087900100F281224E837C000000000042D5 -:104FA000879001000A82004081B20000018000A6C3 -:104FB00082B001001382004081320100018000A60E -:104FC00082B0010013820040813201000A82224235 -:104FD000837C000000000040879001001C8000A638 -:104FE00082B001001382004081320100FD81224520 -:104FF000837C00000000004187900100FF81224473 -:10500000837C00000000004387900100018222435E -:10501000837C000000000042879001000A8200406B -:1050200081B20000018000A682B00100138200401E -:1050300081320100018000A682B00100138200408D -:10504000813201000A822242837C0000000000407D -:10505000879001000000004387900100000000419C -:1050600087900100008000A682B0010013820040FA -:10507000813201000E82224B837C00000000004040 -:105080008780010000000043E0B10100FF7F00A223 -:10509000A08B010000000044A5B30100B88000CA45 -:1050A000A73301003681004081B20000200000419A -:1050B00082DC01001482A25E0B7D00000000004132 -:1050C00008B1010016829F858230000000008040F8 -:1050D00081B201001B8214F7813000001B82A249BB -:1050E000FD7F000000000048FD9301001E8215F8BE -:1050F000811400001E82A24AFD7F000000000048CB -:10510000FD9301002082A2C88132000040000040CF -:1051100080DC01000010004080DC01000000004045 -:10512000EFB3010022824240F13300003881004099 -:1051300068970000F48200BB6BB30000F48200BBF0 -:10514000B1B30000F482004081B2000000030040CF -:10515000819801000000004018B10100800000406B -:105160008398010000190040459901000000424069 -:1051700081B20100000043FFF1B10100000000FF17 -:10518000F1B101000000004181C0010000000040B9 -:1051900018B101002B82A24183500000001600408C -:1051A00045990100001900404399010000000047A3 -:1051B00043C101000000004083B00100000000F383 -:1051C00080B001000000005B81D0010000000041C0 -:1051D00080D0010000000040F6B101000000005B3B -:1051E00043C101000000004183C001003582A25488 -:1051F000836C000000000040F7B101000000004196 -:1052000083C001003C82A206836C00000000804045 -:1052100081B20100001600404399010080162E065D -:1052200083B00100360000FBF6A901004282A241D2 -:10523000835000002200004083980100000000FB22 -:10524000F6B101004582A241835000006200004097 -:1052500095980100DC9F00408132010000162D0668 -:1052600083B0010080160040459901005C0000FBFE -:10527000F6A901004B82A24183500000000000709B -:10528000F9B1010000000071F9B1010000000072E5 -:10529000F9B1010000000073F9B1010000000074D1 -:1052A000F9B101005400004095980100DC9F0040D6 -:1052B000813201000000007095B001005782227019 -:1052C000B56F00000000804197B0010000008040F1 -:1052D00097B00100B6030040A199010000002F42E1 -:1052E00099B3010062822244816C00006A822248E4 -:1052F000816C00006482224C816C00006E8222501E -:10530000816C00006F822254816C000071822258EF -:10531000816C00007682225C816C000050010040AC -:1053200081B20000000000BC09B00100F48200CA94 -:1053300001B000000000004003B001000000004187 -:10534000F38301006882A242056C00000000004166 -:1053500005B00100F48222CA07140000F48200465E -:10536000F3930000F4822043956F0000F48280CA1A -:1053700005300000F482220180300000F48200CB6E -:10538000DB910000570100BCABB30000000000BC83 -:10539000B1B30100F48200CACFB30000FF0000CA1D -:1053A00081880100F482A240747D000060002040EA -:1053B000609901007382A8B18230000072820040BF -:1053C00081B20000F48200CA79B300000000004EF0 -:1053D00081B0010000000043CB8301000000454084 -:1053E00081B201007982A241815000000000454055 -:1053F00081B201000000454081B2010084829182A7 -:10540000823000000000008A80B00100AE9F0040A2 -:1054100080CE01008282A640813200008482564004 -:1054200081B20000B6030040A199010000000053C2 -:1054300007900100B6030040A1990100000000524E -:1054400007900100D89F00418BB300000000004E80 -:1054500081B0010000000042CD8301000000464001 -:1054600081B201008982A2418150000000004640C3 -:1054700081B201000000464081B201009482918116 -:10548000823000000000008980B00100AE9F004023 -:1054900080CE01009282A640813200009482554065 -:1054A00081B20000B6030040A19901000000005243 -:1054B00007900100B6030040A199010000000053CD -:1054C00007900100D89F00418BB30000B10300405A -:1054D000A1990100C4142F4099B301005701004065 -:1054E00049B10000A0942E4397B001000000004095 -:1054F000F1B101009B82A2419750000050952040DD -:10550000E1B10100AC942E4397B0010000000040CF -:10551000F1B101009F82A24197500000000080403D -:1055200081B20100AE030040A399010000000040D9 -:1055300081B001006015004085980100080000401E -:1055400040E40100000000594194010000000050B7 -:1055500041E00100000000424094010000000057BB -:10556000419001000000004181C001000000A34201 -:10557000816C010000000041A3C10100A582A0428E -:10558000816C0000A582005085C00000DD82A24130 -:10559000017D0000B5822258737D00007800004034 -:1055A00061990100B082A8B19C30000030003845FC -:1055B0009DE001000100000E10C90000B58233C457 -:1055C00081300000B882A1AD9D200000AF82134061 -:1055D00081B200000000134E5A83010030003845AC -:1055E0009DE00100C08222AB80040000BE82A24088 -:1055F000017D0000C082225F577D00003C87004093 -:1056000081B20000C082225E577D00009F8700406B -:1056100081B20000C5822254737D000074000040F6 -:1056200061990100C082A8B1003000009084A25F9F -:10563000017C0000D086004081B20000C782A25FDA -:1056400059270000C982A25C737D0000D082A25E4F -:10565000737D0000DA82225C737D0000DB823740BC -:10566000813200007C00004061990100CA82A8B12B -:10567000363000007C00004061990100CC82A8B166 -:10568000003000001F00000002880100BF841740A6 -:1056900081B20000DB823440813200007E00004095 -:1056A00061990100D182A8B112300000D882522144 -:1056B00013040000000014412FC30100FF3F000944 -:1056C000008C01000000004301F001001183003450 -:1056D00013840000FF3F1409008C01007183004314 -:1056E00001F000000000004081B20100DB82334085 -:1056F00081320000AF82134E5A9300001487A248F3 -:10570000FD7F00000400A2AC80320000E382225A38 -:10571000737D00007A00004061990100E082A8B129 -:105720007E310000010000CF11C90000E982A240D3 -:10573000937F0000E9822244937F0000E58242A526 -:1057400080300000E882A240937F0000FB821A4074 -:105750009393000000001A4081B20100DD80A24056 -:10576000737D00000F872244216F000006872240CE -:10577000657D00000005A25B737D00000400A24966 -:10578000337D0000F3822248337D0000FF01009941 -:1057900080D801000000005081E00100A8982F404F -:1057A00033B1010000000040E0C10100DD82004093 -:1057B00081B20000AF8200408BB3000000000058AF -:1057C00061B101000000004E62B10100AF822840CB -:1057D00081320000F682004081B20000F98233403D -:1057E0001F300000AF82134E5A930000FD82A0CEFE -:1057F000815000000F83A0CD816C0000000000A547 -:105800009CB30100000000B181B001000F8322B5FC -:105810008114000080152F4049B1010001834240EE -:1058200081320000000060B465970100D0152E4061 -:1058300069B3010000001A44938301001A0000A21A -:1058400080DC010000000044F1B10100000000B163 -:10585000F1B10100000000B5F1B101000500004008 -:10586000619901008000004062DD01000A83A8A167 -:10587000E0310000E98200889EB30000E982A24185 -:10588000676F0000E982006FDB9100000F834240E8 -:1058900081320000E9821A409383000000990009D8 -:1058A00046C901003F0000F30C8801001A83A6429C -:1058B00013600000299400950330010015836140B6 -:1058C0008132000075000040619901001683A8B183 -:1058D0000C30000036947110943001001B83005886 -:1058E0001F9000001C94009503300100AF820088D7 -:1058F0001CB0000000002D0348B1010004002DF091 -:105900002EB00100EE070040979801002283234B40 -:10591000E46D00002283224BFD7F00000000004068 -:105920001F90010022002F4081B2010025838317C0 -:105930008032000026000040479901002783851728 -:10594000803200000000004847C101002D8322552D -:105950002F7C00000000004243D101000F0000FA3C -:10596000968801000000004297E00100000000421C -:1059700097D001002E83004B44C10000120000A20A -:1059800044C90100280000F602CC01000A0000A171 -:1059900042C90100000000F816B00100000028F024 -:1059A00010B00100000000F01AB00100000000A2D9 -:1059B0002AB00100C0283C460DE0010000002D4443 -:1059C00095B001003A83A2F80E3000004A832241CC -:1059D0009550000000002D5049C101003683004061 -:1059E00081B200003783A2F8166C00003783A2F85A -:1059F000106C00003783A2F01A6C00004883225814 -:105A00001F7C000000993F4213F001003F83654076 -:105A1000813200004383A2F37406000000000006F8 -:105A2000E69501004883754081B200000000000641 -:105A300096B001003F0075F30C880100000000558E -:105A400061B101000000004B62B101004683A84033 -:105A500081320000488367408132000050837741E3 -:105A60002DC300004E8322581F7C0000000000550B -:105A700061B101000000000662B101004C83A84042 -:105A8000813200004E836740813200007E8377417F -:105A90002DC30000030000071AF40100EF92000775 -:105AA000163001005F832241816C00005683224240 -:105AB000816C0000AF8200881CB000005E83225F12 -:105AC0000F7C0000E393005F011001005C83224023 -:105AD000956C00000480000342C90100000000F240 -:105AE00002B0010058930052953001005F93004BC3 -:105AF00002B0000041940009963001001A8700406E -:105B00000FB000006783A25A1F7C0000699200401A -:105B10008132010067832220856C000064839C0F22 -:105B200080320000AF8200881CB000004A93005C05 -:105B30001F0001003C95004261310100AF820088E6 -:105B40001CB00000900400079630010000002D05F5 -:105B500048B101006A8382F0183000008188004556 -:105B60008FB00000282000A696B001006E83221797 -:105B700096040000E094004B953001008188004BB2 -:105B80008FB00000EF93000348310100CA9100403C -:105B9000813001008188004081B2000000002E1099 -:105BA00048B101000000685003B00100000000038C -:105BB000F0B1010040000000E0C9010000002E50DB -:105BC00049C1010000000050F1B1010000000003D4 -:105BD000F0B101000000004261B10100200000109E -:105BE00062DD01007983A8408132000010000010BE -:105BF00062C901007B83A800E0310000AF82008809 -:105C00001CB0000000002D0348B10100000000405E -:105C10000FB00100000000F82EB00100000000F2FB -:105C200002B001000000004017B00100004100A6D2 -:105C300096B00100EE072E4797900100918322173E -:105C4000960400008F83224BFD7F00008F8323A2E8 -:105C5000026C00005893005295300100040022416C -:105C6000975000000C002D0012B00100000000F061 -:105C700000B001000000005C018001005F93004B58 -:105C800002B000000000000900B001000000005058 -:105C900003B00100AE83005C17900000A383224391 -:105CA0002F7C0000000000451F9001009C83225FB4 -:105CB0002F7C000000002E1048B1010000000058A9 -:105CC000F1B1010010000003F0C901001000000054 -:105CD000E0C90100988362426131000000000010B9 -:105CE00062B101009983A84081320000AF827288BE -:105CF0001CB0000020002D0348B10100FF0F00F68A -:105D000080880100A083A2A6816C0000A38300F21A -:105D10003AB000008D84A24BFD7F0000B09200409D -:105D2000813201003087004081B20000AE83224AF8 -:105D30002F7C0000AE8322482F7C00000A002D0338 -:105D400048B101003F0000F2868801001F000043B7 -:105D5000848801000500004380F4010098943D42CE -:105D600081E00100AE83A242E07D00008D84A24B61 -:105D7000FD7F0000B092004081320100308700407A -:105D800081B20000AE83694081320000000000A3B0 -:105D900009B001000000794147C30100B48322A18A -:105DA000096C0000F58200881CB00000B18300037C -:105DB00048B10000EE83A392036C0000949500406C -:105DC000953001000000004143C3010000000016AF -:105DD00080B201003087270880320000BB83225C3C -:105DE000177C0000BC8300002AB0000012000000F5 -:105DF0002AC801000200000880C80100C083A24335 -:105E00002F7C0000E394004081320100DC83005EBF -:105E100017900000040000018CCC0100E394004CBA -:105E20000330010000002E4602B0010010000010F7 -:105E300048C901000C000001F0CD01002C00004019 -:105E4000F0C9010000000016F0B1010010000015BB -:105E5000E0C901000000004361B10100A00000A4FE -:105E600062DD0100C983A85417100000DC83005EC6 -:105E700017900000120000002AC80100DB832243B3 -:105E80002F7C0000040000018CCC01000000004CBD -:105E900003B00100049500436131010000002E466B -:105EA00002B001001000001048C901000C00000100 -:105EB000F0CD01000C000009F0C90100000000183D -:105EC000F0B1010010000015E0C90100000000431E -:105ED00061B10100A00000A462DD0100DC83285450 -:105EE00017100000D883004081B2000004950043E1 -:105EF00061310100DE8322502F7C0000000000563B -:105F0000179001000700001798880100E183A24163 -:105F1000996C00000000005517900100000000433C -:105F200061B101004000001062DD0100E283A84081 -:105F300081320000AF8200881CB00000EB9400406A -:105F400081320100E98322432F7C00001680000388 -:105F500044C901000000001DE4B101008C94005E02 -:105F600005100100EC83A25F2F7C0000A6910001C8 -:105F700038430100B0920040813201003087004078 -:105F800081B20000F083A24BFD7F00008A840041B3 -:105F900043C300000000004027B0010000000040A3 -:105FA0002DB001000000004011B00100F383350165 -:105FB000863000006D00004061990100FB8328B12C -:105FC00030300000F483224D757D00000000001683 -:105FD00080B201007A84A740116C000000000041EB -:105FE00043C301008984004081B200006D0000407D -:105FF00061990100FB83A8B1123000000000001677 -:1060000080B201000584A740116C0000000000412F -:1060100043C301000000000910B001000000001897 -:106020002CB00100DE07004380CE0100F483AA40BB -:10603000813200000A84004081B2000040003E43EB -:1060400027E0010000000009F0B101000000001885 -:10605000E0B101000000004127C00100F483A30B60 -:1060600087500000000015401BB0010000000040F8 -:1060700023B00100120000002AC8010040002D409A -:1060800039B001001284A240276C000022000008F1 -:1060900012C80100DE070040259801001584004069 -:1060A00081B20000000000F812B00100000000F012 -:1060B00030B001000000000B25B00100000000100E -:1060C00032B0010014002001E0B10100EE070040F1 -:1060D000379801001A842301366C0000000000018B -:1060E00036B001002584824123400000208000104A -:1060F00042C9010021842240E36D000000000043FA -:1061000061B101004000001062DD01001E84A84062 -:1061100081320000AF8200881CB00000CF920043A3 -:10612000233001000000001032B0010000000041E7 -:1061300023B001000000000348B1010000800019F5 -:1061400044C90100348422451F7C00000000004C3B -:10615000F1B1010000000009F0B1010000000018D9 -:10616000F0B101000000004361B1010020000019FE -:1061700062DD01002B84A815E03100000000005012 -:1061800003D001000000005033C001000000004CAB -:1061900025D001000C002D4C13C001000000005060 -:1061A00037D00100000000502BC001001A840045C8 -:1061B0001F8000003684A312366C00003784681BF1 -:1061C00028B000000000681228B00100000000099B -:1061D000F0B1010000000018F0B101000000004320 -:1061E00061B101002000001962DD01003A84A815A8 -:1061F000E0310000608422140250000000000050D2 -:1062000033C001000000001424D001000C002D1444 -:1062100012C001005984A214365000004A84225C46 -:106220001F7C00003080001042C9010048842240D9 -:10623000E36D00000000004261B101004000001069 -:1062400062DD01004584A84081320000AF820088F1 -:106250001CB000000000000348B101000C002D5CE0 -:106260001F800100100000F02AC801000000005C3F -:106270002B800100F0070040379801004F84230174 -:10628000366C00000000000136B001005A84221B69 -:10629000026C00003000001048C9010000002E5CB4 -:1062A0001F90010000000050F1B101000000000348 -:1062B000F0B10100FF070015E08D01000000004271 -:1062C00061B10100A00000A462DD01005684A84075 -:1062D000813200005A84000348B10000000000141D -:1062E0002AC001001A84A240256C00000000004171 -:1062F00039C0010040003D4339E001000000000BBF -:1063000025B00100000000F812B001001A8400F06E -:1063100030B000000080001942C9010066842240AC -:10632000E36D00000000004361B10100400000196E -:1063300062DD01006384A84081320000AF820088E2 -:106340001CB00000CF9200402B30010018002E033B -:1063500048B101006A8422502F7C000000000056E2 -:106360001790010007000017988801006D84A24172 -:10637000996C0000000000551790010070842243C2 -:106380002F7C000000000054179001001600201D13 -:10639000E4B101007284A340276C00007484605F44 -:1063A000179000000084000B16DC01000000601351 -:1063B000169401008C94005E051001003087A25FE6 -:1063C0002F7C00001480000342C90100000000F28D -:1063D00002B00100A691000138430100308700405F -:1063E00081B200000000004083B001000000004DB9 -:1063F00061B101000000001662B101007C84A84078 -:10640000813200000000000862B101007E84A840D3 -:106410008132000089842213826C000040003D43D9 -:1064200083E00100000000F810B00100000000F05F -:106430002CB001000000001662B101008484A84065 -:10644000813200000000000862B101008684A8408B -:10645000813200008084004183C0000000001540AC -:1064600081B20100008200A604B00100A0980040A3 -:1064700047990100300500418930010058930052CE -:10648000953001005F93004B02B000003087004060 -:106490000FB000000000005F01800100100000004C -:1064A0000EF401003F000000008801000300000717 -:1064B0001AF40100EF920007163001009B8422417C -:1064C000816C000099842242816C0000AF820088B8 -:1064D0001CB000009A84225F0F7C00001A870040E5 -:1064E0000FB00000A384A25A1F7C000069920040F4 -:1064F00081320100A3842220856C0000A0849C0FBF -:1065000080320000AF8200881CB000004A93005C1B -:106510001F0001003C95004261310100AF820088FC -:106520001CB00000900400079630010000002D050B -:1065300048B10100000000F018B00100A984223A1F -:10654000016C0000000000008EB001008188004056 -:1065500001B000000000004081B201002E002D05B6 -:1065600048B10100AD84A240E76D00000A00004080 -:106570008F9801008188004001B0000034920040F3 -:10658000813201001C94009503300100AF82008825 -:106590001CB0000000002D0348B1010022002DF0C6 -:1065A0002EB00100282000A696B00100B684221764 -:1065B00096040000E094004B953001008188004C67 -:1065C0008FB00000B88483178032000000000044C0 -:1065D00043C10100BA8485178032000000000048E2 -:1065E00043C10100280000F602CC0100120000A106 -:1065F0002AC80100EF93004081320100CA91004196 -:10660000813001008188004081B20000000000015B -:1066100000D0010000002E1048B101002800004009 -:10662000F199010000000003F0B10100000000003A -:10663000F0B10100C4846447613100000000001023 -:1066400062B10100C584A81BE0310000AF827488EC -:106650001CB000000000004503E0010008002D030D -:1066600048B10100EA8401FB083000003D8587FB4A -:1066700022300000000000FA0EB00100000000F817 -:1066800014B00100030000071AF40100EF920007A4 -:1066900016300100E0842241816C0000D484224243 -:1066A000816C0000AF8200881CB00000DF84225F94 -:1066B0000F7C0000380000047E890100D884A65FAA -:1066C0000F0000004292004005300100DD840040D0 -:1066D00081B20000130000408798010000002D03E4 -:1066E00048B101000C002DF082B00100000000F064 -:1066F00084B00100CE930040053001000000005C32 -:106700001F9001001A8700400FB00000E884A25AD1 -:106710001F7C00006992004081320100E884222041 -:10672000856C0000E5849C0F80320000AF820088F9 -:106730001CB000004A93005C1F0001003C95004221 -:1067400061310100AF8200881CB000009004000796 -:106750009630010000002D0548B10100000000F056 -:1067600018B00100EC84210480200000ED8400407A -:1067700010C90000C387004B81B000000C850043A6 -:1067800081B00000108500FB22B00000C3870041EB -:1067900081B000008188004E8FB000000885005A4B -:1067A0008FB00000F58400478FB00000C38700530E -:1067B00081B00000C387005681B0000032002D0573 -:1067C00048B101008188A00AE46D0000FB84A24169 -:1067D000197C0000FA84220A80320000818800536C -:1067E0008FB00000818800548FB000000485220A19 -:1067F00080320000FE84A20AE46D00008188005D02 -:106800008FB00000000000F280B001000000000A1C -:1068100080D001000285A091816C00008188005E1B -:106820008FB00000250000408F9801008188004053 -:1068300081B2000006852091E56D0000818800543A -:106840008FB00000210000408F9801008188004037 -:1068500081B2000032002D0548B101008188A00AF4 -:10686000E46D0000240000408F9801008188004002 -:1068700081B2000037002D0548B10100040000F38B -:1068800082F40100C387A042836C0000C3870054D8 -:1068900081B00000000000F20EB00100030000070C -:1068A0001AF4010000B5000D42C9010007000007FD -:1068B000168801001985220BE67D00000A000040C1 -:1068C00087980100DF950040813201000000004000 -:1068D0000FB001001A87005C1F9000002B8522502A -:1068E000FD7F00002685A254FD7F00001E852255F5 -:1068F000FD7F00008200004087980100168500405F -:1069000081B2000016852253FD7F00001480000331 -:1069100042C90100000000F096B001001000004BD9 -:1069200080F401000CBC00408798010026852243BA -:10693000806C0000FFFF004B808801001685A24399 -:10694000806C00007C9600404799010027854640F6 -:10695000813200002A85A0F0306F00001C851E40A7 -:1069600081B2000000001E4131C30100739200405B -:10697000253001002F859C0F80320000AF820088F7 -:106980001CB000004A93005C1F000100148000034B -:1069900042C90100000000F096B0010000002F0580 -:1069A00048B101001000000718E401000008000CC5 -:1069B000E0990100900400079630010000B5000D39 -:1069C00046C9010036853040813200000000000BCE -:1069D000E6910100000200A146C901000000000B81 -:1069E000E691010004002E0548B1010000001040AE -:1069F000E1B10100C387004081B00000000000FB4E -:106A000028B00100000000FB86B00100000000F883 -:106A100014B0010047852246237C000043852240B4 -:106A2000877C0000000000481F900100458522413E -:106A3000877C0000000000471F900100478522422C -:106A4000877C0000000000451F9001004785661B01 -:106A50002C300000000000A013B0010000007641BF -:106A600041C3010076852392156C00007685A2450E -:106A70001F7C00007A85224BFD7F0000170000D0AC -:106A8000A2C901000000004027B001000200000A76 -:106A900024C80100AB9200400F3001007485220829 -:106AA0004030000000000041A3C10100F0070012C7 -:106AB00024CC01005085AA412740000001000013AA -:106AC00080CC01007085264023300000000000408B -:106AD00083B001006000000384C8010010000010B2 -:106AE00048CD0100170000D0A2C901005D85A24079 -:106AF000836C00006985004183B000000080004283 -:106B000044990100000068213896010000002E50D1 -:106B100049C101006285A244236C000030000003DB -:106B200048C9010000000044F1B101000C00002040 -:106B3000F0C901000000004461B10100A00000A400 -:106B400062DD01006585A842E031000000000044DC -:106B500085C001000000004123C001000000004189 -:106B6000A3C101005B85A2418150000070852240D5 -:106B7000236C00000000004461B1010040000010DF -:106B800062DD01006D85A84081320000AF8200887F -:106B90001CB000000000000348B10100EE070040F7 -:106BA00025980100170000D02AC80100838500172E -:106BB00010B0000095940040813201007A850040B9 -:106BC00081B20000AB92009225300100000000402D -:106BD00031B001007A8522082E3000008385004103 -:106BE00027B00000808000A604B00100060000402D -:106BF00087980100DF95000A8C30010000000040FA -:106C00000FB001000000005C1F9001008285229FF0 -:106C1000136C0000020000881CCC0100F5820040CB -:106C200081B200001A8700413FC30000000000400D -:106C30000FB001002800000180CE010097852A4096 -:106C4000813000000080001044C901004000004075 -:106C5000819801008C85A2481F7C00008C85A2478A -:106C60001F7C00008C85A307036C0000800000409F -:106C7000819801008F85A340026C0000280000016C -:106C8000F0CD0100918500400FB0000028000040C9 -:106C9000F0CD0100040000400ECC010028000003EC -:106CA000F0C9010028000000F0C901000000001632 -:106CB000E0B101000000004761B1010020000010B8 -:106CC00062DD01009585A85C1F10000000000040F7 -:106CD00043990100000000F008B00100A0012D4020 -:106CE00000C001006186220F42050000A8859C0FAC -:106CF000803200000000005C1F8001000080001056 -:106D000042C90100A3852240E36D00000000004756 -:106D100061B101004000001062DD0100A085A840C3 -:106D200081320000AF8200881CB00000A8852207D5 -:106D3000803200000000000342B1010000000007A3 -:106D400042C10100008000A1469901000000005FDF -:106D5000E1910100C006A2451F7C00001000000365 -:106D600048C9010000002D5429C00100000000F8AE -:106D700018B00100000000F804B00100000000F8A5 -:106D80000EB00100420000030AC801000C0000A47C -:106D90000CC80100ED920040813201000000001497 -:106DA00002B001000000001424D001000000001413 -:106DB00010C001001200000810C8010000000040CF -:106DC00023B00100FE7F000544C901000000000A55 -:106DD000E4B10100D18522018032000000003C4472 -:106DE00023E0010000002EA480B00100000000108C -:106DF00048C10100BE85A307026C0000BF85680181 -:106E00001AB00000000068071AB001000000000D71 -:106E100002D0010000000005F0B101000000000CEC -:106E2000F0B1010000000002E0B101000000000D1F -:106E30000AC00100CB852240036C0000CB852242B2 -:106E4000236C00000000004123C001000000004747 -:106E500061B10100A00000A462DD0100EF852840BF -:106E600081320000C885004081B20000000000109F -:106E700080C001000000004761B101000000004037 -:106E800062B10100CD85A84023300000AF820088A8 -:106E90001CB00000EF85004081B2000000003C44BF -:106EA00023E00100000000A486B0010000002E10C5 -:106EB00048C10100D685A3120E6C0000D78560077B -:106EC0001AB00000000060121AB001000000680D46 -:106ED00016940100FFFF000B16D80100000068089F -:106EE0003E9601000000000CF0B10100000000021D -:106EF000E0B101000000001086C001000000004663 -:106F000061B101002000004362DD0100DE85A85C64 -:106F10001F1000000D86220D146C0000E485220D68 -:106F2000246C00000000000D10C00100E885000D79 -:106F300024D00000000000412BC00100000000151B -:106F4000A2B101001000002010C80100F0070040AD -:106F500025980100EA852242236C0000EF8500415C -:106F600023C000000000004661B101004000001095 -:106F700062DD0100EB85A85C1F000000AF82008885 -:106F80001CB000000000004023B001000D86220D5F -:106F9000145000000C86A20D0E500000FB85224606 -:106FA0001F7C0000000000461F80010030800010A0 -:106FB00042C90100F9852240E36D0000000000474E -:106FC00061B101004000001062DD0100F685A840BB -:106FD00081320000AF8200881CB0000020800003D6 -:106FE000469901000000005FE191010000002D06BC -:106FF00048B10100000000F818B00100000000F8DE -:1070000004B0010000861FF00E300000B885004C6F -:107010000DC0000000002E5F0F800100B88523071F -:10702000146C00003000001048C90100240000402A -:10703000F199010000000003F0B101000000000020 -:10704000F0B1010000000016F0B1010024000000C2 -:1070500000C801000000004761B10100A00000A4C9 -:1070600062DD01000986A8461F100000B8850003F4 -:107070000CB00000B885000D18C0000004002E14EC -:107080000AD001001200000548CD0100FE7F000576 -:1070900042C901000C002AF2E0B10100138622402F -:1070A000316C000000006018389601001E0000409E -:1070B00043990100008100F680CE01001786A640AA -:1070C000813200000000004443C101001986220BF8 -:1070D000ED6D0000080000A142C90100020000A1FE -:1070E00046C901000F0000FA948801000200004A1E -:1070F00086E40100000000F60EB001002186224760 -:107100001F7C000004001F430E5000002186A04693 -:107110000F400000000000410FC0010025862248FA -:107120001F7C00000000004091B0010004000FA28D -:10713000423100002886004089B000000C0000A207 -:1071400042C901000000004389B001000000004373 -:1071500095D00100000000FC82B001002B86A04108 -:10716000904000000000004191C00100308622479D -:107170001F7C00003086A043896C000030862045CB -:10718000896C00003086A0410E40000000000041E4 -:107190000FC001000000004189C001002886A24103 -:1071A00095500000398622481F7C000010000048DE -:1071B00092F40100FFFF0048908801003786904854 -:1071C000924000000000004193C001000A0000A2AC -:1071D00044C901000000662093A401003080001023 -:1071E00044C9010012000014F0C90100000000179A -:1071F000F0B1010012000005E0CD010030000010E8 -:1072000080C801000000004461B10100200000407E -:1072100062DD01003F86A840813200004A86225C80 -:107220001F7C000000003C4423E0010000002D1002 -:1072300048C1010049862240E36D0000000000467D -:1072400061B101004000001062DD01004686A840E7 -:1072500081320000AF8200881CB000000000005C9A -:107260001F8001004D86A2471F7C0000E392004072 -:1072700081320100C686001710B00000EA9200407B -:107280008132010000002F0348B101005186A007A0 -:10729000164000000000004117C001000000000B74 -:1072A000E4B101000000005017F00100558690F293 -:1072B000164000000000004117C0010000006620D9 -:1072C00017A40100100000142AC80100000000509B -:1072D0002BE00100000000F22A9401003080001031 -:1072E00042C901005F862240E36D000000000044B7 -:1072F00061B101004000001062DD01005C86A84021 -:1073000081320000AF8200881CB0000000800017AE -:1073100010DC0100C686004081B2000069869C0F27 -:10732000803200000000005C1F800100008000101F -:1073300042C9010069862240E36D00000000004759 -:1073400061B101004000001062DD01006686A840C6 -:1073500081320000AF8200881CB000006E862207D8 -:10736000803200000000000342B10100000000076D -:1073700042C10100008000A1469901000000005FA9 -:10738000E191010004002E0348B101000000000A51 -:10739000E0B1010073862240316C00000C00004017 -:1073A00045990100000060183896010000002E1079 -:1073B00048B1010000000050F1B1010000000008D8 -:1073C000F0B1010000000003E0B101000000004442 -:1073D00061B101000000001062B101007886A84090 -:1073E00023300000AF8200881CB0000000002D5246 -:1073F00011C001001000000348C90100000000F89E -:1074000018B00100000000F804B00100000000F80E -:107410000EB001000C0000A40CC8010000003C44A8 -:1074200023E00100000000A486B0010000002E103F -:1074300048C101008686A3120E6C0000878668078B -:107440001AB00000000068121AB00100000000101D -:1074500086C00100000068083E9601000000000C94 -:10746000F0B1010000000002E0B1010000000046A0 -:1074700061B101002000004362DD01008C86A85C40 -:107480001F100000BB86220D146C00009286220D96 -:10749000246C00000000000D10C001009686000D55 -:1074A00024D00000000000412BC0010000000015A6 -:1074B000A2B101001000002010C80100F007004038 -:1074C0002598010098862242236C00009D86004189 -:1074D00023C000000000004661B101004000001020 -:1074E00062DD01009986A85C1F000000AF82008861 -:1074F0001CB000000000004023B001000400220D79 -:1075000014500000BA86A20D0E500000A986224633 -:107510001F7C0000000000461F800100308000102A -:1075200042C90100A7862240E36D00000000004729 -:1075300061B101004000001062DD0100A486A84096 -:1075400081320000AF8200881CB000002080000360 -:10755000469901000000005FE191010000002D0646 -:1075600048B10100000000F818B00100000000F868 -:1075700004B00100AE861FF00E3000008186004C82 -:107580000DC0000000002E5F0F80010081862307E0 -:10759000146C00003000001048C9010024000040B5 -:1075A000F199010000000003F0B1010000000000AB -:1075B000F0B1010000000016F0B10100240000004D -:1075C00000C801000000004761B10100A00000A454 -:1075D00062DD0100B786A8461F1000008186000307 -:1075E0000CB000008186000D18C00000C486225C2B -:1075F0001F7C00000000005C1F80010000003C4474 -:1076000023E0010000002D1048C10100C486224083 -:10761000E36D00000000004661B101004000001071 -:1076200062DD0100C186A84081320000AF8200887F -:107630001CB000000000001710B00100C68600401A -:107640002BB00000008000034499010000000004FA -:10765000E0B10100CB86229F136C0000020000887D -:107660001CCC0100F582004081B20000F095004181 -:107670003F430100000000408DB0010000000040C9 -:1076800005B00100DF9500400F3001003087005C3D -:107690001F900000100000000EF401000000003AEE -:1076A00001840100030000071AF40100EF920007B3 -:1076B00016300100DA862241816C0000D886224211 -:1076C000816C0000AF8200881CB00000D986225F68 -:1076D0000F7C00001A8700400FB00000E286A25A1B -:1076E0001F7C00006992004081320100E286222066 -:1076F000856C0000DF869C0F80320000AF8200881E -:107700001CB000004A93005C1F0001003C95004241 -:1077100061310100AF8200881CB0000090040007B6 -:107720009630010000002D0548B10100000000F076 -:1077300018B001000000000080B00100C387A25F04 -:10774000816C0000A8002D431980010037002DF046 -:1077500024B00100040000F38EF401000F0000F3D8 -:1077600090880100F18622488E6C000036000040AF -:107770004399010058003D43E7E10100F1861FF005 -:10778000246C0000F08623418F6C0000C387004703 -:1077900081B00000C387004881B000004000004075 -:1077A00043990100B0002DF014B00100F686220AC2 -:1077B00090400000C395004091300100C387A24073 -:1077C00080320000B0002D4581B00100028722F018 -:1077D0002C300000A3002D3083B00100AC002DF34D -:1077E00082E00100FC86A3412C6C00000000001622 -:1077F00082B0010098002DF082C0010088002DF0B9 -:1078000082D00100000000F298E80100C387204CFC -:10781000826C00007C002D4198E80100C38720F0B5 -:10782000986C00001A87220A803200004002000C87 -:107830007E8901001A87A64081320000C387004973 -:1078400081B00000200000A680B001000A8722431A -:10785000216F00001380004080DC01000B87004096 -:1078600081B200001A80004080DC01000B87A25E1C -:107870000B7D00000000004008B101000D879F85CE -:10788000803200001187004081B20000EC8222406B -:10789000577D0000010000405799010011874240C8 -:1078A000813200000000004493930100DD821A5BE6 -:1078B00069930000040000CB81C8010017872240B3 -:1078C000F27F0000C480006F9733010019872240C7 -:1078D000737D0000DE8000418BB300001487004000 -:1078E00081B2000021879C0F8032000000800010D0 -:1078F00042C9010021872240E36D000000000045DD -:1079000061B101004000001062DD01001E87A84047 -:1079100081320000AF8200881CB000004592220234 -:107920008032000022874240813200000000004483 -:107930009393010045921A02689700002C879C0FD0 -:10794000803200000080001042C901002C872240D4 -:10795000E36D00000000004561B10100400000102F -:1079600062DD01002987A84081320000AF820088D3 -:107970001CB000004F922202803200002D8742404E -:107980008132000000000044939301004F921A02DC -:107990006897000037879C0F80320000008000103D -:1079A00042C9010037872240E36D00000000004516 -:1079B00061B101004000001062DD01003487A84081 -:1079C00081320000AF8200881CB00000F9822202E0 -:1079D00080320000388742408132000000000044BD -:1079E0009393010000001A0268970100F982004099 -:1079F00005B00000008000A656B1010056952F404A -:107A000005B001008887A240E76D0000B8942941C5 -:107A1000E7B1010000000054EF930100000000F204 -:107A20000EB00100290000400D9801000900000778 -:107A300012E40100000000A713C0010003000007CA -:107A40001AF401000700000716880100FFFF00106C -:107A500034D801000000000334940100000000400D -:107A600023B00100201800401198010000B5000D5E -:107A700042C901006C87220BE67D00004D87604003 -:107A800081320000FFFF000784890100548705C28E -:107A900024300000580400408132010000002D0510 -:107AA00048B10100898770F0183001006C870040F0 -:107AB00081B200000000704081B201006387A048DD -:107AC000236C00000000005035D001000080001A37 -:107AD00042C901005D872240E36D000000000042C2 -:107AE00061B101004000001A62DD01005A87A84020 -:107AF00081320000AF8200881CB000002098004056 -:107B000043990100898700F8183001005E87A2417F -:107B100023500000FFFF001034D8010000000003D4 -:107B200034940100201800401198010000002E1A22 -:107B300048B1010000000044F1B10100000000085C -:107B4000F0B101000000004261B101002000001A04 -:107B500062DD01006787A809E031000000000041F4 -:107B600023C001000000005035C0010000000044A7 -:107B700011C00100788722410D5000000000004133 -:107B80000FC001007487A0AA0F6C00000000004124 -:107B90000FB001000900000712E40100000000A777 -:107BA00013C00100000000401BB001004B870041E2 -:107BB00017B000000002000912C801004B87834182 -:107BC000174000000000004017B001004B87004143 -:107BD0001BC0000083872340236C0000000000507E -:107BE00035D001000080001A42C901008087224080 -:107BF000E36D00000000004261B101004000001A86 -:107C000062DD01007D87A84081320000AF820088DC -:107C10001CB000002098004043990100898700F8BB -:107C2000183001008187A24123500000000000416C -:107C30000FC001008687A0AA0F6C00000000004161 -:107C40000FB00100B8942007E4B101005695204020 -:107C5000E7B101001A8700400FB00000FFFF000CE1 -:107C600080D80100C002000C7E8901009B87265449 -:107C7000613100009187870C803200000F000040C6 -:107C80006299010091872840813200009187A254B7 -:107C9000777D00008D87004081B2000096872246E4 -:107CA000197C00000D000040629901000000A8400E -:107CB00081B200000000A254777D0100928700404D -:107CC00081B200009B872249197C00000E00004011 -:107CD000629901000000A84081B200000000A25497 -:107CE000777D01009687004081B2000010000040BF -:107CF000629901000000A84081B200000000A25477 -:107D0000777D01009B87004081B2000030942F55A1 -:107D1000F1930100004000A656B10100F982A24192 -:107D2000E551000064000040E5990100A38744404C -:107D300081320000A687A293576F00000000004127 -:107D400057C3010000001CAB27B30100F982225089 -:107D5000FD7F0000F9822251FD7F0000F982A241DF -:107D60001D530000504600401D9B01003805004097 -:107D7000813201000E000048B2CB01001004004027 -:107D800049310100B2872240B56F00000E00004863 -:107D9000B2CB010020040041B5530100F98200403C -:107DA00081B2000000000051FD8301004016004038 -:107DB0004599010040050040493101001E0000487E -:107DC000B2CB01001004004081320100000000DA53 -:107DD00091C0010004000048B2CB01002004004023 -:107DE000B533010060162040E5B10100408200403B -:107DF000B533010008000048B2CB0100FFFF004A84 -:107E0000B48B010020040040813201000A000048C8 -:107E1000B2CB01001000004AB4F70100200400407A -:107E200081320100F982004081B20000050000406B -:107E300043990100000000F308B001000400204055 -:107E4000E6B101000300004096E4010000000004D8 -:107E500096C00100C987004B10C90000EC8A0041A0 -:107E600009B00000040000208FB0000004000020D2 -:107E70008FB00000040000208FB00000040000203C -:107E80008FB00000040000208FB00000040000202C -:107E90008FB00000040000208FB00000040000201C -:107EA0008FB00000208B004109B0000004000020CA -:107EB0008FB00000040000208FB0000004000020FC -:107EC0008FB00000040000208FB0000004000020EC -:107ED0008FB00000040000208FB0000004000020DC -:107EE0008FB00000040000208FB00000528B0045CE -:107EF00009B00000528B004509B00000528B0045CC -:107F000009B00000528B004509B0000004000020B9 -:107F10008FB00000040000208FB00000040000209B -:107F20008FB00000040000208FB00000918B004350 -:107F300009B00000BA8B004309B00000BE8B0044BA -:107F400009B00000098D004509B0000004000020C0 -:107F50008FB00000040000208FB00000040000205B -:107F60008FB00000040000208FB00000040000204B -:107F70008FB00000CA8B004309B00000C98B0043DA -:107F800009B00000EA8A004509B0000004000020A2 -:107F90008FB00000040000208FB00000040000201B -:107FA0008FB00000040000208FB00000798C0042E8 -:107FB00009B00000798C004309B00000798C0044BE -:107FC00009B00000EA8A004509B000000400002062 -:107FD0008FB00000040000208FB0000004000020DB -:107FE0008FB00000040000208FB0000004000020CB -:107FF0008FB00000998C004309B0000004000020FD -:108000008FB00000EA8A004509B00000040000209B -:108010008FB00000040000208FB00000040000209A -:108020008FB00000040000208FB00000040000208A -:108030008FB00000B78C004309B00000B78C00443B -:1080400009B00000EA8A004509B0000004000020E1 -:108050008FB00000040000208FB00000040000205A -:108060008FB00000040000208FB00000040000204A -:108070008FB00000B78C004209B00000040000205F -:108080008FB00000EA8A004509B00000040000201B -:108090008FB00000040000208FB00000040000201A -:1080A0008FB00000040000208FB00000040000200A -:1080B0008FB00000DF8C004409B0000004000020F5 -:1080C0008FB00000EA8A004509B0000004000020DB -:1080D0008FB00000040000208FB0000004000020DA -:1080E0008FB00000040000208FB00000EA8A004238 -:1080F00009B00000F08C004509B00000F08C00458C -:1081000009B00000EA8A004509B000000400002020 -:108110008FB00000040000208FB000000400002099 -:108120008FB00000040000208FB00000F28C0042ED -:1081300009B00000F28C004309B00000F28C00444A -:1081400009B00000F28C004509B0000004000020D6 -:108150008FB00000040000208FB000000400002059 -:108160008FB00000040000208FB000000400002049 -:108170008FB00000040000208FB00000FA8C004493 -:1081800009B00000EA8A004509B0000004000020A0 -:108190008FB00000040000208FB000000400002019 -:1081A0008FB00000040000208FB000000B8D004253 -:1081B00009B00000FB8C004309B000000B8D0044A7 -:1081C00009B00000EA8A004509B000000400002060 -:1081D0008FB00000040000208FB0000004000020D9 -:1081E0008FB00000040000208FB0000004000020C9 -:1081F0008FB000000C8D004309B00000028D0044D8 -:1082000009B00000EA8A004509B00000040000201F -:108210008FB00000040000208FB000000400002098 -:108220008FB00000EA8A004109B00000778C00425C -:1082300009B00000778C004309B00000778C00443F -:1082400009B00000EA8A004509B0000004000020DF -:108250008FB00000040000208FB000000400002058 -:108260008FB00000EA8A004109B000000D8D004285 -:1082700009B000000D8D004309B000000D8D0044D1 -:1082800009B00000EA8A004509B00000040000209F -:108290008FB00000040000208FB000000400002018 -:1082A0008FB00000040000208FB000000400002008 -:1082B0008FB00000040000208FB0000004000020F8 -:1082C0008FB00000148D004509B0000004000020AC -:1082D0008FB00000040000208FB0000004000020D8 -:1082E0008FB00000168D004209B00000040000208D -:1082F0008FB00000040000208FB0000004000020B8 -:108300008FB00000040000208FB0000004000020A7 -:108310008FB00000040000208FB000000400002097 -:108320008FB00000040000208FB00000228D0043B9 -:1083300009B00000818D004309B00000BE8B0044ED -:1083400009B00000098D004509B0000004000020BC -:108350008FB00000040000208FB000000400002057 -:108360008FB00000040000208FB000000400002047 -:108370008FB00000898D004309B00000BE8B00441F -:1083800009B00000098D004509B00000040000207C -:108390008FB00000040000208FB000000400002017 -:1083A0008FB00000040000208FB000000400002007 -:1083B0008FB000009A8D004309B000000400002037 -:1083C0008FB00000EA8A004509B0000004000020D8 -:1083D0008FB00000040000208FB0000004000020D7 -:1083E0008FB00000040000208FB000008E8B00438F -:1083F00009B00000858D004309B00000BE8B004429 -:1084000009B00000098D004509B0000004000020FB -:108410008FB00000040000208FB0000007002D0581 -:1084200048B10100000000F308B001000600204739 -:10843000E6B101000400004796E401000000004797 -:1084400096D001000000004796D001000000000413 -:1084500096C001008988004B10C90000B28D004908 -:1084600009B000000400002085B0000004000020D6 -:1084700085B000000400002085B00000040000204A -:1084800085B000000400002085B00000040000203A -:1084900085B000000400002085B00000040000202A -:1084A00085B000000400002085B00000040000201A -:1084B00085B000000400002085B00000040000200A -:1084C00085B000000400002085B0000004000020FA -:1084D00085B00000EB8D004209B0000004000020D0 -:1084E00085B000000400002085B0000004000020DA -:1084F00085B000000400002085B0000004000020CA -:1085000085B000000400002085B0000004000020B9 -:1085100085B000000400002085B0000004000020A9 -:1085200085B000000400002085B000000400002099 -:1085300085B000000400002085B000000400002089 -:1085400085B00000F18D004609B000000400002055 -:1085500085B000000400002085B000000400002069 -:1085600085B000000400002085B000000400002059 -:1085700085B000000400002085B000000400002049 -:1085800085B000000400002085B000000400002039 -:1085900085B000000400002085B000000400002029 -:1085A00085B000000400002085B000000400002019 -:1085B00085B000000400002085B00000FF8D00425F -:1085C00009B000000400002085B00000218E0042A8 -:1085D00009B000000400002085B000000400002065 -:1085E00085B000000400002085B0000004000020D9 -:1085F00085B000000400002085B0000004000020C9 -:1086000085B000001C8E004A09B000000400002064 -:1086100085B000000400002085B0000004000020A8 -:1086200085B000000400002085B00000248E0043C7 -:1086300009B000000400002085B000007D8E0044D9 -:1086400009B000000400002085B0000004000020F4 -:1086500085B000000400002085B000000400002068 -:1086600085B000000400002085B000000400002058 -:1086700085B000007C8E004B09B000000400002093 -:1086800085B000000400002085B000000400002038 -:1086900085B00000F48D004109B000000400002006 -:1086A00085B00000F48D004309B00000F48D004453 -:1086B00009B00000F48D004509B00000F48D0046BB -:1086C00009B00000F48D004709B00000F48D0048A7 -:1086D00009B00000F48D004909B00000F48D004A93 -:1086E00009B00000F48D004B09B00000F48D004C7F -:1086F00009B00000F48D004D09B000000400002016 -:1087000085B000000400002085B00000DC8E00422F -:1087100009B000000400002085B00000DC8E004499 -:1087200009B000000400002085B000000400002013 -:1087300085B000000400002085B000000400002087 -:1087400085B000000400002085B000000400002077 -:1087500085B00000DC8E004B09B000000400002052 -:1087600085B000000400002085B000000400002057 -:1087700085B000000400002085B000000400002047 -:1087800085B00000F48E004509B000000400002010 -:1087900085B000000400002085B000000400002027 -:1087A00085B000000400002085B000000B8F00475A -:1087B00009B000000400002085B00000E88E0045EC -:1087C00009B000000400002085B000000400002073 -:1087D00085B000005491004609B00000040000205C -:1087E00085B000000400002085B0000004000020D7 -:1087F00085B000000400002085B0000004000020C7 -:1088000085B00000218E004609B00000FF8D0046B3 -:1088100009B000001A8E004709B000001A8E004807 -:1088200009B000000400002085B000000400002012 -:1088300085B000000400002085B000001C8E004AB6 -:1088400009B000000400002085B0000004000020F2 -:1088500085B000000400002085B000000400002066 -:1088600085B000000400002085B000000400002056 -:1088700085B000007D8E004509B00000248E0043C5 -:1088800009B000001A8E004709B000001A8E004897 -:1088900009B000000400002085B0000004000020A2 -:1088A00085B000000400002085B000007C8E004CE4 -:1088B00009B000000400002085B000000400002082 -:1088C00085B000000400002085B0000004000020F6 -:1088D00085B000000400002085B0000004000020E6 -:1088E00085B00000118F004409B00000118F0042D4 -:1088F00009B00000D58A004709B00000D58A0048B9 -:1089000009B000000400002085B000000400002031 -:1089100085B000000400002085B00000118F004BDE -:1089200009B000000400002085B000000400002011 -:1089300085B00000F48D004109B00000348F00477D -:1089400009B000000400002085B000001C8F004723 -:1089500009B000000400002085B0000004000020E1 -:1089600085B000000400002085B000000400002055 -:1089700085B000000400002085B000000400002045 -:1089800085B000001C8F004709B0000004000020E3 -:1089900085B000000400002085B000000400002025 -:1089A00085B000000400002085B000000400002015 -:1089B00085B000000400002085B000000400002005 -:1089C00085B000001C8F004709B00000348F0047BD -:1089D00009B000001A8E004709B000001A8E004846 -:1089E00009B000000400002085B000000400002051 -:1089F00085B000000400002085B000001C8F0047F7 -:108A000009B000000400002085B000000400002030 -:108A100085B000000400002085B0000004000020A4 -:108A200085B000000400002085B000000400002094 -:108A300085B000000400002085B000000400002084 -:108A400085B00000438F004709B00000438F004805 -:108A500009B000000400002085B0000004000020E0 -:108A600085B000000400002085B000000400002054 -:108A700085B000000400002085B000000400002044 -:108A800085B00000A68F004009B00000C48F0047E9 -:108A900009B00000B88F004809B00000148F0047EB -:108AA00009B00000148F004709B00000C48F0047D0 -:108AB00009B00000CB8F004709B00000CB8F004801 -:108AC00009B000000400002085B00000B88F004805 -:108AD00009B00000148F004709B00000148F004750 -:108AE00009B00000B88F004809B000000400002061 -:108AF00085B000000400002085B0000004000020C4 -:108B000085B00000DC8E004309B0000004000020A6 -:108B100085B00000DC8E004509B00000DC8E004608 -:108B200009B000001A8E004709B000001A8E0048F4 -:108B300009B000000400002085B00000DC8E004A6F -:108B400009B000000400002085B00000DC8E004C5D -:108B500009B000000400002085B0000004000020DF -:108B600085B000000400002085B00000338F00476E -:108B700009B00000278F004809B000001B8F004794 -:108B800009B000001B8F004709B00000338F004779 -:108B900009B00000D58A004709B00000D58A004816 -:108BA00009B000000400002085B00000278F0048B5 -:108BB00009B000001B8F004709B000001B8F004761 -:108BC00009B00000278F004809B000000400002011 -:108BD00085B000000400002085B00000CD8F004269 -:108BE00009B000000400002085B00000CD8F0044D3 -:108BF00009B000000400002085B00000040000203F -:108C000085B000000400002085B0000004000020B2 -:108C100085B000000400002085B0000004000020A2 -:108C200085B00000CD8F004B09B00000040000208B -:108C300085B000000400002085B000000400002082 -:108C400085B000000400002085B000000400002072 -:108C500085B00000CD8F004309B000000400002063 -:108C600085B00000CD8F004509B00000CD8F0046D3 -:108C700009B00000CD8F004709B00000CD8F00483B -:108C800009B000000400002085B00000CD8F004A2C -:108C900009B000000400002085B00000CD8F004C1A -:108CA00009B00000CD8F004C09B000000400002086 -:108CB00085B000000400002085B000000400002002 -:108CC00085B00000E88F004609B0000004000020D5 -:108CD00085B000000400002085B0000004000020E2 -:108CE00085B000000400002085B000000B8F004715 -:108CF00009B000000400002085B00000E88F0046A5 -:108D000009B000000400002085B00000040000202D -:108D100085B000000400002085B0000004000020A1 -:108D200085B000000400002085B000000400002091 -:108D300085B00000E990004609B000000400002062 -:108D400085B000000400002085B000000400002071 -:108D500085B000000400002085B000000B8F0047A4 -:108D600009B000000400002085B00000E990004632 -:108D700009B000000400002085B0000004000020BD -:108D800085B00000E990004609B000000400002012 -:108D900085B000000400002085B000000400002021 -:108DA00085B000000400002085B000000E91004254 -:108DB00009B000000400002085B00000040000207D -:108DC00085B000000400002085B0000004000020F1 -:108DD00085B000000400002085B0000004000020E1 -:108DE00085B000000D91004A09B000000400002089 -:108DF00085B000000400002085B0000004000020C1 -:108E000085B000000400002085B0000004000020B0 -:108E100085B000000400002085B0000004000020A0 -:108E200085B000000E91004609B00000040000204B -:108E300085B000001A8E004709B000001A8E004865 -:108E400009B000000400002085B0000004000020EC -:108E500085B000000400002085B000000D91004A9C -:108E600009B000000400002085B0000004000020CC -:108E700085B000000400002085B000000400002040 -:108E800085B000000400002085B000000400002030 -:108E900085B000000400002085B000000400002020 -:108EA00085B000000400002085B000000400002010 -:108EB00085B00000D88F004109B0000004000020F8 -:108EC00085B000000400002085B0000004000020F0 -:108ED00085B000000400002085B0000004000020E0 -:108EE00085B000000400002085B00000E58F00423E -:108EF00009B000000400002085B00000E58F0044A8 -:108F000009B000000400002085B00000040000202B -:108F100085B000000400002085B00000040000209F -:108F200085B000000400002085B00000040000208F -:108F300085B00000E58F004B09B000000400002060 -:108F400085B000000400002085B00000040000206F -:108F500085B000000400002085B00000040000205F -:108F600085B00000E58F004309B000000400002038 -:108F700085B00000E58F004509B00000E58F004690 -:108F800009B00000E58F004709B00000E58F0048F8 -:108F900009B000000400002085B00000040000209B -:108FA00085B000000400002085B00000E58F004C73 -:108FB00009B000000400002085B00000040000207B -:108FC00085B000000400002085B0000004000020EF -:108FD00085B00000F48E004C09B0000004000020B1 -:108FE00085B000000400002085B0000004000020CF -:108FF00085B000000400002085B000000B8F004702 -:1090000009B000000400002085B00000E88E004C8C -:1090100009B000000400002085B00000040000201A -:1090200085B00000A591004609B0000004000020B2 -:1090300085B000000400002085B000004991004286 -:1090400009B000000400002085B0000049910044F0 -:1090500009B000000400002085B0000004000020DA -:1090600085B000000400002085B00000040000204E -:1090700085B000000400002085B00000040000203E -:1090800085B000004991004B09B0000004000020A9 -:1090900085B000000400002085B00000040000201E -:1090A00085B000000400002085B00000040000200E -:1090B00085B000000400002085B0000004000020FE -:1090C00085B000004991004509B000004991004673 -:1090D00009B000001A8E004709B000001A8E00483F -:1090E00009B000000400002085B00000040000204A -:1090F00085B000000400002085B000004991004CBC -:1091000009B000000400002085B000000400002029 -:1091100085B000000400002085B00000E88E004209 -:1091200009B000005491004609B00000040000207E -:1091300085B000000400002085B00000E88E0046E5 -:1091400009B000000400002085B000000B8F00472C -:1091500009B000000400002085B0000054910046D2 -:1091600009B000000400002085B0000004000020C9 -:1091700085B000005491004609B0000004000020B2 -:1091800085B000000400002085B00000040000202D -:1091900085B000005891004309B000000400002091 -:1091A00085B000000400002085B00000040000200D -:1091B00085B000000400002085B000000B8F004740 -:1091C00009B000000400002085B000005891004361 -:1091D00009B000000400002085B000000400002059 -:1091E00085B000005891004D09B000000400002037 -:1091F00085B000000400002085B0000004000020BD -:1092000085B000000400002085B000006A91004392 -:1092100009B000000400002085B000000400002018 -:1092200085B000000400002085B00000040000208C -:1092300085B000000400002085B00000040000207C -:1092400085B000004791004A09B0000004000020EA -:1092500085B000000400002085B00000040000205C -:1092600085B000000400002085B00000040000204C -:1092700085B000000400002085B00000040000203C -:1092800085B000006A91004309B00000040000208E -:1092900085B000001A8E004709B000001A8E004801 -:1092A00009B000000400002085B000000400002088 -:1092B00085B000000400002085B000004791004AFE -:1092C00009B000000400002085B000000400002068 -:1092D00085B000000400002085B0000004000020DC -:1092E00085B000007C91004309B00000040000201C -:1092F00085B000000400002085B0000004000020BC -:1093000085B000000400002085B000000B8F0047EE -:1093100009B000000400002085B000007C910043EB -:1093200009B000000400002085B000000400002007 -:1093300085B000007C91004D09B0000004000020C1 -:1093400085B000000400002085B00000FF8D0042C1 -:1093500009B000000400002085B00000218E00420A -:1093600009B000000400002085B0000004000020C7 -:1093700085B000000400002085B00000040000203B -:1093800085B000000400002085B00000040000202B -:1093900085B000009B91004209B00000040000204D -:1093A00085B000000400002085B00000040000200B -:1093B00085B000000400002085B0000004000020FB -:1093C00085B000000400002085B0000004000020EB -:1093D00085B00000218E004609B00000FF8D0046D8 -:1093E00009B000001A8E004709B000001A8E00482C -:1093F00009B000000400002085B000000400002037 -:1094000085B000000400002085B000009B9100465C -:1094100009B000000400002085B000000400002016 -:1094200085B000000400002085B00000040000208A -:1094300085B000009D91004A09B0000004000020A2 -:1094400085B000000400002085B00000040000206A -:1094500085B000000400002085B000000B8F00479D -:1094600009B000000400002085B000009D91004A72 -:1094700009B000000400002085B0000004000020B6 -:1094800085B000005591004609B00000040000209E -:1094900085B000000400002085B00000040000201A -:1094A00085B000005591004609B00000040000207E -:1094B00085B000000400002085B0000004000020FA -:1094C00085B000000400002085B000000B8F00472D -:1094D00009B000000400002085B00000559100464E -:1094E00009B000000400002085B000000400002046 -:1094F00085B000005591004609B00000040000202E -:1095000085B000000400002085B0000004000020A9 -:1095100085B000000400002085B00000A391004247 -:1095200009B000000400002085B000000400002005 -:1095300085B000000400002085B000000400002079 -:1095400085B000000400002085B000000400002069 -:1095500085B000004791004A09B0000004000020D7 -:1095600085B000000400002085B000000400002049 -:1095700085B000000400002085B000000400002039 -:1095800085B000000400002085B000000400002029 -:1095900085B00000A391004609B00000040000203F -:1095A00085B000001A8E004709B000001A8E0048EE -:1095B00009B000000400002085B000000400002075 -:1095C00085B000000400002085B000004791004AEB -:1095D00009B000000400002085B000000400002055 -:1095E00085B000000400002085B00000248E004DEE -:1095F00009B000000400002085B000000400002035 -:1096000085B000000400002085B0000004000020A8 -:1096100085B000000400002085B000000400002098 -:1096200085B000000400002085B000000400002088 -:1096300085B000000400002085B000000400002078 -:1096400085B000000400002085B000000400002068 -:1096500085B000000400002085B000000400002058 -:1096600085B000000400002085B000000400002048 -:1096700085B000000400002085B00000248E004D5D -:1096800009B000001A8E004709B000001A8E004889 -:1096900009B000000400002085B000000400002094 -:1096A00085B000000400002085B000000400002008 -:1096B00085B000000400002085B0000007002E4B9C -:1096C0001990010025870004E6B10000D58A2242E6 -:1096D000197C00009A94003A81300100D58A00403C -:1096E00081B20000D58A2242197C0000FF1F000FC2 -:1096F0001E8C01000594004081320100E58A9C0F18 -:10970000803200000000005C1F800100008000101B -:1097100042C90100E58A2240E36D000000000045D7 -:1097200061B101004000001062DD0100E28AA84042 -:1097300081320000AF8200881CB00000A9842202A0 -:1097400080320000E68A424081320000000000447E -:109750009393010000001A0268970100A984004059 -:1097600005B0000005002E4B19900100258700046C -:10977000E6B100000000004087B00100000000409A -:109780008DB001000080000342C90100400000A12B -:1097900044C90100000000F0E0B10100DF950006BF -:1097A000074001000000000607D00100D4002E5C35 -:1097B0001F90010000000007F0B101000C800003C1 -:1097C00042C90100000000F0F0B1010000000040BB -:1097D00081B20100000000FE96B00100000000FE12 -:1097E00096C00100000000F0F0B101000000004050 -:1097F00081B20100000000FE96C00100000000FEE2 -:1098000096C00100000000F0F0B10100000000402F -:1098100081B20100000000FA96C00100000000FEC5 -:1098200096C001000030004B948801000000004603 -:1098300095F001000000004A96C001005E012E3440 -:10984000978401000200004BE4E501006401204020 -:10985000E1B101000900000786E4010000002EA725 -:1098600087C001001000001048C90100100000402E -:10987000F199010058010043F0C9010058010005A9 -:10988000E0C901000000004461B10100A00000A493 -:1098900062DD01000F8BA84081320000000000054E -:1098A00048B101001A0000409798010008002E40BE -:1098B00095B00100178B204B946C00000000004015 -:1098C000F1B10100148B004195C000001080001020 -:1098D00042C901001E8B2240E36D000000000044DD -:1098E00061B101004000001062DD01001A8BA84048 -:1098F00081320000AF8200881CB00000000000052B -:1099000048B101009A94004081300100EA8A004089 -:1099100081B200000C80000342C90100000000F881 -:1099200086B00100000000F888B00100238B44409D -:1099300081320000268BA24CFD7F0000278B004C5B -:10994000FD930000288B20F0566F0000000000F00F -:1099500056B3010000001C4081B2010000800010DD -:1099600044C9010064000040F19901007000000545 -:10997000F0C9010000000043F0B101000000004701 -:1099800061B101002000001062DD01002E8BA844AF -:10999000E0310000100000108CC80100008000467B -:1099A00044C9010040000040F19901006801000530 -:1099B000F0C9010064000043F0C901000000004745 -:1099C00061B101000000004662B10100368BA8447D -:1099D000E0310000AF8200881CB0000009000007E1 -:1099E00086E4010038002EA787C001008B002D05FA -:1099F00048B101003E8B2243E77D00000000004497 -:109A000045C10100418B2244E77D00000000004C6D -:109A100045C101000000004A19900100680120A220 -:109A2000E4B101008800004043990100458B230BFD -:109A3000E56D000000000041199001000080001059 -:109A400044C9010050000040F19901005801004351 -:109A5000F0C9010058010005E0C901000000004400 -:109A600061B101000000001062B101004A8BA84002 -:109A700081320000AF8200881CB000005C002E051F -:109A800048B101000080000342C90100000060F0FD -:109A900096B001009A94004181300100EA8A0040AA -:109AA00081B20000558BA249197C0000860000405D -:109AB00047990100598B0040E5B1000086002F490D -:109AC00019800100598BA2F2803200008B00004007 -:109AD0004799010000000042E79101005C8BA2461B -:109AE000197C0000A000004047990100608B0040F5 -:109AF000E5B10000A0002F4619800100608BA2F2A2 -:109B0000803200008B0000404799010000000041B6 -:109B1000E7910100A80000404399010034002DF0B6 -:109B200024B00100000000FB0CB00100000000FBAD -:109B300010B00100000000FB12B001000F0000F3A4 -:109B400016880100040000F314F401008B8B2640FA -:109B500081320000738B220A166C000058003D43CE -:109B600013E00100000000F882B00100040022F0C0 -:109B7000843000008795004081320100AF82008868 -:109B80001CB000000000000548B1010000000041C9 -:109B900013C00100728BA043136C00000000004052 -:109BA00013B00100688B004115D000008B8B220A96 -:109BB0008032000058003D4313E00100000000F82F -:109BC00082B00100040022F084300000879500403C -:109BD0008132010040002040E1B10100AF820088E5 -:109BE0001CB000000000000548B101008B8B224131 -:109BF000155000000000004111C001007F8BA04300 -:109C0000116C00000000004011B0010058003D43FD -:109C100011E00100000000F836B00100040022F05D -:109C2000003000000000005083B00100D9940047CC -:109C300061310100AF8200881CB000004292000533 -:109C4000483101000000004561B1010040000010F2 -:109C500062DD0100878BA84081320000AF8200885E -:109C60001CB000007B8B000548B10000370020408D -:109C7000E7B101000B95005181300100EA8A0040F4 -:109C800081B2000034002E41F5B101000011004006 -:109C9000E5990100938B00481990000034002E4193 -:109CA000F5B1010000110040E599010000800003BA -:109CB00042C90100000000F894B00100988B2245D1 -:109CC000237C0000B0002FF08CB00100000060F099 -:109CD0008CC00100900000404399010035002DF038 -:109CE0008CB0010058003E43E7E101009D8B224803 -:109CF000197C0000000000418DC001000000680ACE -:109D00008CC0010038002A4AE0B1010028000000A0 -:109D1000E0C901003C00201BE0B1010010800003FD -:109D200042C90100000000F838B00100000000F84E -:109D300026B00100040022F802300000AB8B2301A2 -:109D4000146C0000000000F880B00100000000F872 -:109D500082B001004C0020F0E4B10100440020403A -:109D6000E0B1010048002041E0B10100A8002D1041 -:109D700032B00100C39500F024300100B48BA2443E -:109D8000816C0000B28B2241197C00006E93004070 -:109D90003B300100D88BA2083C300000B48B00405F -:109DA00081B20000AB92004081320100D88BA20842 -:109DB0003C3000005000201CE0B101005400201392 -:109DC000E0B101004E002001E4B101004000200A92 -:109DD000E0B101000B95005F81300100EA8A00408C -:109DE00081B2000037000040479901004D9300F315 -:109DF00094300100938B224A80320000C08B0040D7 -:109E000081B2000037000040479901004D9300F3F4 -:109E10009430010058003E4397E001000000001B11 -:109E2000F0B101001F006000008C0100EA8A85117A -:109E3000803200000480000342C90100B0002FF00E -:109E40008CB00100000060F08CC001000B95005F39 -:109E500081300100EA8A004081B20000CA8B0049CB -:109E600019800000CF8B2241197C00006E930040C6 -:109E70003B300100D38BA2083C3000000B95005F03 -:109E800081300100EA8A004081B20000AB920040BC -:109E900081320100D38BA2083C3000000B95005F9B -:109EA00081300100EA8A004081B2000050002D108C -:109EB00032B0010054002DF038B001004E002DF0FA -:109EC00026B0010040002DF202B00100000000F0B9 -:109ED00014B00100300000108CC801000080004662 -:109EE00044C9010068012D4461B10100100068F20D -:109EF00080C8010000000008F0B101005801000511 -:109F0000E0C901000000000B37B001000000004074 -:109F100036D001005C012E4010C001000000000698 -:109F200080C001000000005281D00100A0940040D8 -:109F3000E43101002000004662DD0100E48BA8400E -:109F400023300000E592004081320100ED92004094 -:109F500081320100F28B82412340000020800010FA -:109F600042C90100EF8B2240E36D00000000004673 -:109F700061B101004000001062DD0100EC8BA840DF -:109F800081320000AF8200881CB000000000000594 -:109F900048B101000000001032B001000000004193 -:109FA00023B001000080001944C90100FA8B22414E -:109FB000197C0000F68BA3010C6C0000F78B0006E7 -:109FC00004B000000000000104B00100F98B200281 -:109FD000366C00000000001B04B00100FD8B000285 -:109FE000E0B10000FC8BA3010C6C0000FD8B0006AF -:109FF00004B000000000000104B00100000068028D -:10A0000016940100FFFF000B16D80100000068083D -:10A010003E9601000000001CF0B101000000004667 -:10A0200061B101002000001962DD0100028CA8135B -:10A03000E0310000398C22021450000044002D024F -:10A040000CD00100298CA20202500000108C225C6E -:10A050001F7C00002080000342C901000F8C2240B9 -:10A06000E36D00000000004761B1010040000010F6 -:10A0700062DD01000B8CA84081320000AF820088B5 -:10A080001CB000000000000548B1010044002D5C38 -:10A090001F80010048002DF038B001004C002DF069 -:10A0A00026B0010038002FF202B001002A8C2201F4 -:10A0B000146C00001D8C22461F7C0000000000462E -:10A0C0001F80010020002D0348B101001C8C22409C -:10A0D000E36D00000000004461B101004000001089 -:10A0E00062DD0100198CA84081320000AF82008837 -:10A0F0001CB0000038002F0548B10100000000F836 -:10A1000094B0010038002DF096B001000000004C22 -:10A11000E1C101002000000348C901000000224AFB -:10A12000F1B1010044000005F0C901000000004A3F -:10A13000F0B101000000004BE0B101000000004759 -:10A1400061B10100A00000A462DD0100268CA85CC2 -:10A150001F1000002A8C000548B10000000000021A -:10A1600038C00100348C220680320000000000500C -:10A1700033C00100328CA202366C000004008F0D47 -:10A1800042310000100000F810C801000000005C1F -:10A1900011800100F007004037980100E88B00A112 -:10A1A0001AB000000000000210C00100E88B00029D -:10A1B00036D000005000201CE0B1010054002013F4 -:10A1C000E0B101004E002001E4B101004000200A8E -:10A1D000E0B101003E8C005F01B0000037002D4669 -:10A1E00001B00100040000F380F401003D8CA043A5 -:10A1F000816C00000000005501B0010040002040CB -:10A20000E1B101000080001942C90100448C2240E4 -:10A21000E36D00000000004661B10100400000193C -:10A2200062DD0100418CA84081320000AF820088CD -:10A230001CB00000EA920040813201003080001022 -:10A2400042C901004B8C2240E36D00000000004435 -:10A2500061B101004000001062DD0100488CA8409F -:10A2600081320000AF8200881CB0000060012F0521 -:10A2700048B101000000000BE4B1010000000050F3 -:10A2800017F00100508C90F21640000000000041D1 -:10A2900017C001000000662017A40100320000A6CC -:10A2A0002AC00100000000F22A940100538C4548A6 -:10A2B0006131000000D0001E62DD0100588C284092 -:10A2C00005300000548C2248777D00005B8C0040F4 -:10A2D00081B200000000001562B10100648C2840CA -:10A2E00081320000588C004081B2000000001D0047 -:10A2F00092B00100618C2241197C000000800003B3 -:10A3000042C90100B09200F8003001005E8CA24109 -:10A310003B500000658C004900B00000FF07001EA4 -:10A32000008C0100B092004081320100658C004930 -:10A3300000B0000000001D4719800100688C225FFA -:10A34000016C0000ED95004081320100C5870000DE -:10A3500080B000006F8C225C1F7C00002080000316 -:10A3600042C901006F8C2240E36D000000000047ED -:10A3700061B101004000001062DD01006C8CA8405A -:10A3800081320000AF8200881CB000006F8C400555 -:10A3900048310000FFFF000794890100758C85CAD1 -:10A3A00094300000ED95185C1F0001000E00000FB6 -:10A3B0001E8C0100E686004081B200000B9518005B -:10A3C00080300100EA8A0047198000000000004048 -:10A3D00019800100EA8A2247197C0000AB920040F4 -:10A3E000813201007C8CA20880320000EA8A0040A1 -:10A3F00081B20000A09400400D3001009C0100409B -:10A4000045990100FFFF000B988801008B002D503B -:10A4100017F00100828C904C1640000000000041B3 -:10A4200017C00100848C2243E77D00000000004437 -:10A4300045C101000000662017A40100680100402A -:10A44000439901005C012EF280B0010002006240DD -:10A450007ECD01000000005781C0010000002E10D9 -:10A4600048B1010003000040F08D01000000000829 -:10A47000F0B1010058010005E0C9010000000044EE -:10A4800061B101000000001062B101008E8CA84093 -:10A4900081320000AF8200881CB00000000000057F -:10A4A00048B10100928C454861310000005000081D -:10A4B00062DD0100988C284005300000938C224812 -:10A4C000777D0000B0921D0800300100EA8A00404C -:10A4D00081B20000EA8A1D47198000003500004063 -:10A4E00047990100010063F384C801009D8CA043DB -:10A4F000856C00000000634085B00100A8000040AA -:10A500004399010037002FF024B00100010063F3EC -:10A5100082CC0100A88CA2419E060000EA8A224457 -:10A5200083700000360000404399010058003D430D -:10A53000E7E10100EA8A1FF0246C0000ED95004875 -:10A5400081300100C5872341836C0000C587004727 -:10A5500081B0000058003D4385E00100000000F894 -:10A5600036B00100000000F000B0010028000040FB -:10A5700083980100D994004761310100AF820088BF -:10A580001CB0000000002D0348B1010008002DF0B0 -:10A5900094B00100000000F88EB0010090002DF092 -:10A5A00014B001000000000548B10100998BA240E1 -:10A5B0008F7C0000B68C22478F7C0000998B00486E -:10A5C00019900000258D004081B2000036002D5DFD -:10A5D00005B4010037002DF380B00100000000F346 -:10A5E0008EB001005C003D4381E00100A8002DF029 -:10A5F00094B00100000000F024B001002000001021 -:10A6000086DC01004080000344C90100B191004A8A -:10A61000F031010036002F5C1F900100C48CA25065 -:10A620008F50000034002040E1B10100EA8A004070 -:10A6300081B200000000634181C00100C78CA043CB -:10A64000816C00000000634081B0010037002047AA -:10A65000E6B10100EA8A2247803200000400004788 -:10A660000CF401000000004F8F840100DC8C2247B5 -:10A670000C6C000058003D4381E00100DC8C1FF0B1 -:10A68000246C00000000005C1F80010000800010AE -:10A6900042C90100D58C2240E36D00000000004556 -:10A6A00061B101004000001062DD0100D28CA840C1 -:10A6B00081320000AF8200881CB00000D58C42407F -:10A6C00005300000000000449393010000001A5D73 -:10A6D00069930100DA8C23410D6C0000B78C0005F2 -:10A6E00048B10000ED95000548310100C5870048DC -:10A6F00081B00000EA8A22408F6C00000B95005F59 -:10A7000081300100EA8A004081B20000A2000040CE -:10A7100043990100000000F384B00100A6002D4918 -:10A7200019900100020000F280F40100B8002D40F1 -:10A7300081B20100000000F280C001000000004072 -:10A7400082F801001900004081980100EB8CA040C4 -:10A75000826C00002C01004081980100EB8CA3402A -:10A76000826C00000000004180B00100ED8C204CA4 -:10A77000856C00000000004185C00100860020407B -:10A78000E4B10100A2002042E6B10100EA8A0040E3 -:10A7900081B200009A94005081300100EA8A0040A2 -:10A7A00081B200000480000342C90100040022F0CD -:10A7B00080300000000000408DB00100DF950040B7 -:10A7C00087300100B0002F5C1F900100000060F096 -:10A7D00080C001000B95005F81300100EA8A0040D3 -:10A7E00081B200000400004081B20000EA8A2246E3 -:10A7F000197C0000A000004047990100010062F2AE -:10A8000096CC0100EA8AA640813200000B95004AEE -:10A8100081300100E094004695300100EA8A004052 -:10A8200081B20000EA8A2249197C000086000040BB -:10A8300047990100010062F280CC0100EA8AA6403B -:10A84000813200000B95004A81300100E0940047FE -:10A8500095300100EA8A004081B200004292004037 -:10A8600081320100EA8A005C1F900000EA8A004001 -:10A8700081B20000EA8A004081B20000BA000040C4 -:10A8800047990100010062F280C80100118D9040DB -:10A8900080320000FFFF624081980100A400004068 -:10A8A00047990100EA8A2240E56D0000EA8A0041EA -:10A8B000E5C100009A94004D81300100EA8A004011 -:10A8C00081B200005C00004047990100040022F0C2 -:10A8D0009630000000000040E1B10100008000035C -:10A8E00044C901000000004BE0B10100000000403D -:10A8F0008DB00100DF950040873001008B000040E3 -:10A9000047990100218D80F396300000000000403F -:10A91000E78101000000004719900100EA8A005C0D -:10A920001F900000340000404599010001000040E4 -:10A93000F599010000110040E5990100AB9200403B -:10A9400081320100368DA2088032000037000040BD -:10A9500047990100000000F382B00100000063513C -:10A9600083D001003400004047990100010063F3E7 -:10A9700084CC01002E8D9F42803200000000634293 -:10A9800085B001000000004503F001000000000157 -:10A9900000C00100308D375C613100000000001BF9 -:10A9A00062B10100318DA84B1910000000000000B9 -:10A9B00062B10100338DA840813200001A87174030 -:10A9C00081B200000080000342C9010090002DF018 -:10A9D00094B00100AC002DF030B0010035002DF036 -:10A9E00028B0010058003E43E7E1010001000018D3 -:10A9F000F0C901000000004AE0B101003800200069 -:10AA0000E0B101003C00201BE0B10100400020400B -:10AA1000E1B10100000000402BB00100EF940040C4 -:10AA20000D3001000000001816C00100458DA01473 -:10AA3000164400000000004117C001000E0000A2F3 -:10AA400044C9010000000018F8B10100B0002D1445 -:10AA5000F8B1010010500040879801004E8D224A45 -:10AA6000197C00000030004386C801000030000B54 -:10AA700016C801004E8DA440813200000000004144 -:10AA800017C0010001006E43869801002695003032 -:10AA900081300100528DA0411740000000000041AC -:10AAA00017C00100598D224A197C0000080000A23D -:10AAB00044C90100CC002DABF9B10100000000AB8E -:10AAC00017C00100588DA0F016440000000000419E -:10AAD00017C00100000064F082B001009000004047 -:10AAE000459901000000604131C00100BC000040F8 -:10AAF000439901005F8D060C80320000A00020F217 -:10AB0000E4B1010004000946191000009C01004056 -:10AB100045990100FFFF000B988801008B002D5024 -:10AB200017F00100648D904C1640000000000041B9 -:10AB300017C00100668D2243E77D0000000000443D -:10AB400045C101000000662017A401006801004013 -:10AB5000439901005C012EF280B0010002006240C6 -:10AB60007ECD01000000005781C0010000002E10C2 -:10AB700048B1010003000040F08D01000000000812 -:10AB8000F0B1010058010005E0C9010000000044D7 -:10AB900061B101000000001062B10100708DA84099 -:10ABA00081320000AF8200881CB000000000000568 -:10ABB00048B10100748D4548613100000050000823 -:10ABC00062DD0100758DA8400530000035001D4094 -:10ABD00047990100010063F384C801007B8DA04305 -:10ABE000856C00000000634085B001003700004024 -:10ABF00047990100010063F382CC01008B00004003 -:10AC00004799010000000045E79101000B95005FA6 -:10AC100081300100EA8A004081B200003700004024 -:10AC2000479901004D9300F394300100258D224A8D -:10AC300080320000C08B004081B20000370000402D -:10AC4000479901004D9300F394300100908B224A04 -:10AC500080320000C08B004081B20000360000400E -:10AC600043990100000000FB12B001000F0000F347 -:10AC700090880100040000F30CF40100BA8B220656 -:10AC8000906C00005C003D4313E00100A8002DF033 -:10AC900094B0010037002FF024B0010036002A5094 -:10ACA000E7D101000000634113C00100958DA0436E -:10ACB000136C000000000040E7B10100AF910010EC -:10ACC00086300100AF8200881CB00000978D4205DD -:10ACD000483100000000004493930100BA8B1A5DD4 -:10ACE0006993000036002D1086B001005C003D43E2 -:10ACF000E7E10100A8002DF094B0010035002FF02D -:10AD000024B0010001006BFB84C80100A28DA043A8 -:10AD1000856C000035002040E7B1010000000040D4 -:10AD200081B20100010063F312C80100A58DA043A8 -:10AD3000136C000000000040E7B1010040800003F8 -:10AD400044C90100B191004AF0310100AF8200888E -:10AD50001CB00000A88D42054831000000000044EE -:10AD60009393010000001A5D6993010037000040D1 -:10AD700047990100110063F382CC0100A18C2241AC -:10AD80009E060000350000404399010058003D43F5 -:10AD9000E7E10100000000F836B00100AB8C00F0E4 -:10ADA00000B000005E012D0548B10100B38D65F2D1 -:10ADB0001230000000993F4213F00100B88D224785 -:10ADC000E77D0000F58275881CB00000B28D004060 -:10ADD00081B2000000000047E791010000007542C9 -:10ADE000199001007500004061990100BA8DA8B169 -:10ADF0000C3000003694001094300100AF820088BF -:10AE00001CB000005E012E0548B10100C0A83D46FF -:10AE10000DE001000000004097B00100C48D224009 -:10AE2000E16D00000400024197400000C18D005018 -:10AE300043C10000D08D224B803200000000624BE5 -:10AE4000129401000900000796E40100000000A729 -:10AE500097C001003000001094C801000080004A33 -:10AE60004499010000000042F1B101005E01004B75 -:10AE7000F0C901005E010005E0C9010000000044C6 -:10AE800061B101002000004A62DD0100CE8DA840C2 -:10AE9000813200000080001044C901000000005011 -:10AEA000F1B101000400000996E40100000068A867 -:10AEB00097C00100D4000005E0C901000000004473 -:10AEC00061B101000000001062B10100D68DA84000 -:10AED00081320000AF8200881CB0000000993F4220 -:10AEE00013F00100DA8D6540813200003F0000F36D -:10AEF0009688010000000040E7B101000000755590 -:10AF000061B101000000000662B10100DE8DA840C1 -:10AF100081320000E38D224B803200000000004BA4 -:10AF200062B10100E18DA84081320000000000976D -:10AF300013B001000000009697B00100E98D2009D0 -:10AF4000966C0000E98D1F0996240000F5820088A8 -:10AF50001CB00000E48D004081B200009A940057BC -:10AF600081300100D58A000548B100002E00004064 -:10AF700043990100EF8D22F3803200009A94004241 -:10AF8000813001001A87004081B200000B95005209 -:10AF900081300100D58A0042198000009A94003A5D -:10AFA000813001000B95005281300100D58A0040AC -:10AFB00081B200000000004005B00100AD930040E8 -:10AFC00095300100D58A2240956C0000FA8DA24090 -:10AFD0001F7C0000B0920040813201001A870040BF -:10AFE00081B200000480000342C90100000000F2A9 -:10AFF00002B0010058930052953001005F93004B5E -:10B0000002B000001A87004081B200009495004011 -:10B0100095300100068EA20880320000068EA2162E -:10B02000803200001A872242197C00000000004B89 -:10B03000199001009A94003A813001001A8700406B -:10B0400081B20000002300A616B00100098E831E05 -:10B05000803200000008000B16DC01000000000038 -:10B060002AC00100E3940008803001000D8E005ECC -:10B07000179000000495004361310100BD9100402C -:10B080008D300100EB9400071614010000800010C1 -:10B0900042C90100158E2240E36D0000000000430C -:10B0A00061B101004000001062DD0100128EA84075 -:10B0B00081320000AF8200881CB000008C94005EDA -:10B0C00005100100B092004081320100198E220962 -:10B0D000803000000B95004013300100DA8A000533 -:10B0E00048B10000DD93004081320100D58A004064 -:10B0F00081B200000000004A1F900100208E224310 -:10B100003D7C000000000044199001000000004355 -:10B110003D800100218E00421990000014002D4551 -:10B120001F9001007D8E831E803200007D8E0044C2 -:10B1300019900000A292004081320100358EA208D1 -:10B1400080320000358EA21680320000318EA2427D -:10B15000197C00000082000204DC0100A09800407D -:10B160004799010030050041893001002E8EA2412F -:10B17000197C0000B0920040813201001A87004023 -:10B1800081B2000058930015943001005F93004B8A -:10B1900002B000001A87004081B20000DD93004039 -:10B1A000813201000000004B199001009A94003A8E -:10B1B000813001001A87004081B20000388E22429F -:10B1C000197C0000DD93004081320100398E00407F -:10B1D00081B20000AD93004081320100658E2241B2 -:10B1E000197C0000C000001598C80100658EA00BF6 -:10B1F000996C00003000001080C801000080004001 -:10B200004499010000000050F1B10100000000036A -:10B21000F0B101000000004261B1010000000040F7 -:10B2200062B10100418EA800E0310000AF820088C9 -:10B230001CB000000000000548B10100C00000156E -:10B2400098C8010030002E0B99D0010000006A5010 -:10B2500099C00100C000620180CC01000C80000395 -:10B2600042C901002D002DF022B001000000004C69 -:10B2700080C001000000005C23800100D4003F4139 -:10B28000E7E101000B000011E4F501002F00204769 -:10B29000E7B50100528E230B816C00000000004FC7 -:10B2A000E59101000000000880B001000000000BE3 -:10B2B00003B001000000001502D00100E39400007B -:10B2C0002A4001000000004361B10100400000106D -:10B2D00062DD0100578EA84081320000AF820088F5 -:10B2E0001CB00000B092000548310100C000000110 -:10B2F00080CE0100638E2611003000001000000097 -:10B300002AC801000000000880B001000000000110 -:10B3100080C00100C00000409998010000000001B9 -:10B3200098D00100E394004C02300100C0000040BE -:10B33000039801006A8E004081B2000030002F089F -:10B3400080B00100C0000015F4C90100C000000178 -:10B35000E4CD0100C000004003980100E394000028 -:10B360002A4001006F8E22441F7C0000AC002F4059 -:10B3700013B0010000000001E0C10100B000004076 -:10B3800047990100708E0001E0D10000BD9100409E -:10B390008D300100806300A616B00100EB94000719 -:10B3A000161401000080001042C90100788E22406E -:10B3B000E36D00000000004361B101004000001097 -:10B3C00062DD0100758EA84081320000AF820088E6 -:10B3D0001CB000008C94005E051001007B8E2209D9 -:10B3E000803000000B95004081320100D58A0005B5 -:10B3F00048B100007D8E004A1F9000000000000050 -:10B4000010B0010024002D1510C0010028002DF0FF -:10B4100016B0010022002DF026B0010014002FF21A -:10B420000CB0010000000001E0D10100000000109C -:10B4300032B001000000000B1BB0010004001F151A -:10B440001A5000000000004023B00100000000017D -:10B450002AB001004B94004035B000002F0020407E -:10B46000E7B10100C18EA2451F7C00002400200B23 -:10B47000E0B1010028002013E0B101002200200605 -:10B48000E4B10100978E225C1F7C00000000005C8C -:10B490001F8001003080001042C90100978E2240B9 -:10B4A000E36D00000000004761B1010040000010A2 -:10B4B00062DD0100938EA84081320000AF820088D7 -:10B4C0001CB000000000000548B101000080001918 -:10B4D00042C90100BA8E2240E36D0000A88E2242CC -:10B4E000197C000005940040813201005792004011 -:10B4F00081320100B58E224B8032000000000043F3 -:10B5000061B101004000001062DD01009E8EA84084 -:10B5100081320000AF8200881CB00000A48E22415E -:10B52000197C0000C692004011300100A58E000574 -:10B5300048B10000B092004081320100A78E22097C -:10B54000803000000B95004081320100F9820040FC -:10B5500005B0000005940040813201005392004084 -:10B56000813201000000004361B101004000001081 -:10B5700062DD0100AB8EA84081320000AF820088FE -:10B580001CB00000B18E2241197C0000C692004020 -:10B5900011300100B28E000548B10000B0920040A9 -:10B5A00081320100B48E2209803000000B950040EA -:10B5B00081320100F982004005B000000000004324 -:10B5C00061B101004000001062DD0100B68EA840AC -:10B5D00081320000AF8200881CB00000000000052E -:10B5E00048B10100BD8E2241197C0000C692004086 -:10B5F00011300100BE8E000548B10000B09200403D -:10B6000081320100C08E2209803000000B9500407D -:10B6100013300100DA8A004005B0000000800019F4 -:10B6200042C90100C88E2240E36D000000000043C3 -:10B6300061B101004000001062DD0100C48EA8402D -:10B6400081320000AF8200881CB0000000000005BD -:10B6500048B101000000004005B00100CC8E22413D -:10B66000197C0000C692004011300100CD8E00050B -:10B6700048B10000B09200408132010008002D0A5C -:10B6800084B00100000000F082B0010014002040EE -:10B69000E1B10100D28E031E80320000D38E004142 -:10B6A00087B000002100004087980100CE93004041 -:10B6B000813201000000005C1F900100D78E22093A -:10B6C000803000000B95004013300100DA8E2244D8 -:10B6D000197C00000B95004F8130010000000044F0 -:10B6E00019800100D58AA24A1F7C0000DA8A004036 -:10B6F00081B20000BA002040E5B10100E08E9C1745 -:10B7000080320000CC000040439901009D9500402C -:10B71000813201004495004013300100C000004018 -:10B7200043990100C4002DF082B00100789500F02B -:10B7300084300100B092004081320100DA8A22098F -:10B74000803000000B95004013300100DA8A004081 -:10B7500081B200002E00004043990100EC8E22408F -:10B76000E76D00003200004043990100F48EA240D2 -:10B77000E56D00009A930040813201002400200B07 -:10B78000E0B1010028002013E0B1010022002006F2 -:10B79000E4B101001400200AE0B10100DA8A2209B4 -:10B7A000803000000B95004013300100DA8A004021 -:10B7B00081B200009A93004081320100539300400F -:10B7C00081320100028F2241197C00000000000B31 -:10B7D00099B0010004001F1598500000028F20014D -:10B7E000986C00007000000348C9010000002E465C -:10B7F0001F90010000000050F1B1010000000003A3 -:10B80000F0B101000000004261B10100A00000A4FD -:10B8100062DD0100FF8EA800E0310000000000059D -:10B8200048B10100AC002F0010B001000000000181 -:10B83000E0C1010014002F1510C001000000000A33 -:10B8400080B001000000600180D0010000000047CE -:10B8500019900100848E2209803200000B950009A6 -:10B8600080300100848E004013B00000008000038F -:10B8700042C90100000000F082B001001300004046 -:10B88000879801000000004C43C10100CE9300F0F6 -:10B8900084300100D58A005C1F9000002C002040FD -:10B8A000E7B101002D002040E7B10100D58A004238 -:10B8B00019800000C093004081320100E0940048EC -:10B8C000953001000000004561B10100400000100A -:10B8D00062DD0100178FA84013300000AF8200889E -:10B8E0001CB000001D8F000548B100001C8F0040F7 -:10B8F00013B000000000000012B00100080000407A -:10B900004399010014002DF082B00100040022F0E0 -:10B91000843000001300004087980100CE9300405F -:10B92000813201000000005C1F900100358F00098A -:10B9300000B00000D58A8742191000008B002F4705 -:10B9400019800100D58A0040E79100002F000040D7 -:10B9500047990100338F2247E77D00003492004071 -:10B96000E7310100338F2200803200002E8FA24089 -:10B970001F7C0000B092004081320100338F0040F4 -:10B9800081B20000300000404399010032002DF2E6 -:10B9900094B00100589300F2023001005F93004B15 -:10B9A00002B000000000000548B10100348F0040E3 -:10B9B00001B000000000004005B001003A8F2200F5 -:10B9C00080320000398FA242197C0000AD93004004 -:10B9D000813201003A8F004081B20000DD930040C7 -:10B9E00081320100C68F225C1F7C00000000005CD9 -:10B9F0001F8001000080001042C90100428F2240D8 -:10BA0000E36D00000000004561B10100400000103E -:10BA100062DD01003F8FA84081320000AF820088C4 -:10BA20001CB00000C68F000548B10000A292004083 -:10BA300081320100498FA20880320000498FA2168E -:10BA4000803200009A94004D813001000082000293 -:10BA500004DC01001A87004081B20000740000403D -:10BA600043990100000000F882B00100000000F0DE -:10BA700084B001000000004196B00100578F2242BF -:10BA8000961400000080001044C901006400684062 -:10BA90009798010000000041F0B101000000004251 -:10BAA000F0B1010070000005E0C901000000004590 -:10BAB00061B101002000001062DD0100548FA84038 -:10BAC000813200000000005C1F9001000000004572 -:10BAD00061B101004000001062DD0100588FA85CD8 -:10BAE0001F000000AF8200881CB000005E012D0521 -:10BAF00048B101005C8F65F21230000000993F42AE -:10BB000013F00100618F2247E77D0000F582758800 -:10BB10001CB000005B8F004081B2000000000047B5 -:10BB2000E79101000400750996E40100008000100F -:10BB300044C9010000000044F1B10100000068A800 -:10BB400097C0010000000003E0B101000080000385 -:10BB5000449901000000004461B1010000000010A0 -:10BB600062B10100698FA840E1310000AF82008816 -:10BB70001CB0000000993F4213F001006D8F650575 -:10BB8000483100003F0000F39688010000000040AB -:10BB9000E7B101000000754081B20100758F224BB2 -:10BBA000803200000000005561B101000000004B30 -:10BBB00062B10100738FA8408132000000000007CD -:10BBC00016B001000062000B16DC01003492004048 -:10BBD000813201008D8F220080320000E393005FEC -:10BBE00001100100778F2240956C0000008000104A -:10BBF00044C9010000000050F1B101000000000341 -:10BC0000F0B101000000004261B10100000000102D -:10BC100062B101007F8FA800E0310000AF82008890 -:10BC20001CB000000000000548B1010004800003C2 -:10BC300042C90100000000F202B001005893005216 -:10BC400095300100B092004081320100778F22418F -:10BC5000975000000C80000342C90100000000F072 -:10BC600000B001000000005C018001005F93004B08 -:10BC700002B00000778F000548B10000EB9400404F -:10BC8000033001001780000344C9010000F0000CDC -:10BC9000968801000000634C97F0010010800003BB -:10BCA00044C90100000000ABE1B101008C94005ECA -:10BCB00005100100030000071AF401000700000747 -:10BCC0001688010000B5000D46C90100978F30406D -:10BCD000813200000000000BE681010000B7000D7A -:10BCE00046C901000000000BE68101001000100FA2 -:10BCF00094F401009304005F95040100399300401F -:10BD000081320100A18F2250FD7F00009F8F4640AD -:10BD10008132000000001E4131D3010000002E05D9 -:10BD200048B1010000000040E1B101000000004006 -:10BD30000FB001009B920041813001001A87004042 -:10BD400081B20000A292004081320100B38FA208AC -:10BD500080320000B38FA216803200000082000201 -:10BD600004DC01000000004503F0010000000001B8 -:10BD700000C00100AC8F375C613100000000001B87 -:10BD800062B10100B08F284081320000AD8F0040C9 -:10BD900081B200000000000062B10100B08FA84035 -:10BDA000813200001A87174081B2000074002240DF -:10BDB000F1B1010000000040E1B10100E094004A4F -:10BDC00095300100C093005C1F100100498F0040B6 -:10BDD00081B200002F00004047990100C48F224724 -:10BDE000E77D000034920040E7310100C48F22005B -:10BDF00080320000BF8FA2401F7C0000B092004044 -:10BE000081320100C48F004081B200003000004048 -:10BE10004399010032002DF294B00100589300F2D2 -:10BE2000023001005F93004B02B0000000000005EB -:10BE300048B10100E094004895300100C093005CD7 -:10BE40001F100100C98F8742191000008B002F4777 -:10BE50001980010000000040E79101000B950042AD -:10BE600081300100D58A004081B20000C0930040BB -:10BE700081320100D58A005C1F900000BA0020408A -:10BE8000E5B101004495004081320100C00000404E -:10BE900043990100C4002DF082B00100789500F0B4 -:10BEA00084300100B0920040813201000B950045C2 -:10BEB00081300100D58A2242197C00009A94003A10 -:10BEC00081300100D58A004081B2000004000040AA -:10BED00081B20000A292004081320100DE8FA208F0 -:10BEE00080320000DE8FA216803200009A94004754 -:10BEF000803001000082000204DC01001A8700404B -:10BF000081B200001080000344C9010000E100A6D6 -:10BF100084B0010000000040F1B1010000000040C9 -:10BF2000F1B1010000006007849401008C94005E70 -:10BF300005100100D58A004081B200008A0000404F -:10BF400047990100B0920041E7410100DA8A0040C0 -:10BF500081B200009A930040813201005393004067 -:10BF600081320100000000012CB00100000000152A -:10BF700010B001000000000010C0010004001F0A02 -:10BF80002C5000000000001032B001001E95000689 -:10BF900004300100F68FA2481F7C0000F48F844813 -:10BFA0001F100000AC00004047990100F68F000A06 -:10BFB000E0C100000000000A02B00100BD910001D4 -:10BFC0008C3001000000004361B10100400000100E -:10BFD00062DD0100F78FA84081320000AF82008847 -:10BFE0001CB000000000000548B101000000000284 -:10BFF00010C0010004902202145000000894004573 -:10C000001F000100EE8F225C1F7C00000000004733 -:10C0100061B101004000001062DD01000090A85CE9 -:10C020001F000000AF8200881CB00000EE8F0005EA -:10C0300048B100000000000B1BB0010008002D40BB -:10C0400085B00100000000F082B001000000004057 -:10C0500005B00100CE93004187300100000000458B -:10C0600061B101004000001062DD01000A90A840AB -:10C0700081320000AF8200881CB000000000000583 -:10C0800048B1010010902209803000000B9500405B -:10C090001330010014902244197C00000B95004FCE -:10C0A000813001001490A2471F7C00000000004472 -:10C0B00019800100FF070008008C01002290224A2D -:10C0C0001F7C00001A90A21602300000B0920040BF -:10C0D000813201002F002040E7B10100D58A0040E5 -:10C0E00081B200002D002D082AB001001E902242CE -:10C0F000197C0000DD930040813201001F90004058 -:10C1000081B20000AD9300408132010030002E006A -:10C110002AD0010032002A15E4B10100D58A0016A8 -:10C12000E4B1000035902216023000000000000843 -:10C130002AB0010094950040953001002790A2405C -:10C14000116C0000369022402D6C0000AC000040C5 -:10C1500047990100B0002B01E0C10100002B00A6AF -:10C1600016B0010000000001E0D10100E3940008D6 -:10C17000803001002E90005E17900000049500436F -:10C18000613101000000004361B101004000001076 -:10C1900062DD01002F90A84081320000AF8200884C -:10C1A0001CB000000000000548B10100EB9400073E -:10C1B000161401008C94005E05100100B09200403E -:10C1C000813201002F002040E7B10100DA8A0040EF -:10C1D00081B200000000000B1BB0010004001F151D -:10C1E0001A500000439020161A6C000070000003E3 -:10C1F00048C9010000002250F1B101000000000315 -:10C20000F0B1010000000000E0B1010000000042B8 -:10C2100061B10100A00000A462DD01004090A846C9 -:10C220001F1000000000000548B1010000000000E0 -:10C2300010B001000000001510C001000000000A4D -:10C240002AB001000000000A2CD00100AC002F40F1 -:10C2500023B001004A9084451F1000004B90000A53 -:10C26000E0C100000000000A02B001004B94004051 -:10C2700035B000000080001942C9010053902240EF -:10C28000E36D00000000004361B1010040000010B8 -:10C2900062DD01004F90A84081320000AF8200882B -:10C2A0001CB000000000000548B101006390A2022C -:10C2B0001A500000649022402D6C00000080001095 -:10C2C00044C9010000000050F1B10100000000036A -:10C2D000F0B10100FF070008E08D010000000042FE -:10C2E00061B101000000001062B101005A90A84045 -:10C2F00081320000AF8200881CB000000000000501 -:10C3000048B101002F002047E7B501000C80000371 -:10C3100042C90100100000F010C80100F007004001 -:10C320001B9801006490005C118000000000000276 -:10C3300010C00100C69200401F000100000000056F -:10C3400048B101006890230D2C6C000000000040F3 -:10C350001F900100719022461F7C000000000046E3 -:10C360001F8001007080000342C9010071902240CB -:10C37000E36D00000000004261B1010040000010C8 -:10C3800062DD01006D90A84081320000AF8200881C -:10C390001CB000000000000548B1010008002D405D -:10C3A00085B00100000000F082B0010000000040F4 -:10C3B00005B00100CE930041873001000000004528 -:10C3C00061B101004000001062DD01007690A840DC -:10C3D00081320000AF8200881CB000000000000520 -:10C3E00048B101007C902209803000000B9500408C -:10C3F0001330010080902244197C00000B95004FFF -:10C40000813001008090A2471F7C000000000044A2 -:10C4100019800100FF070008008C01009590224A56 -:10C420001F7C00008690A21602300000B0920040EF -:10C43000813201002F002040E7B10100D58A004081 -:10C4400081B200002D002D082AB0010091902242F7 -:10C45000197C00008A90A2F384300000000000A53F -:10C4600085B001000000004185D00100D4003E41AC -:10C4700085E001008E9022401F7C00000000005AE1 -:10C48000119001000B000008E4F50100DD9300406D -:10C49000813201009290004081B20000AD930040D3 -:10C4A0008132010030002E002AD0010032002A150E -:10C4B000E4B10100D58A0016E4B100009890A216FC -:10C4C00002300000B092004081320100E79000404D -:10C4D00081B200002D002D082AB00100A69022474D -:10C4E0001F7C0000A2902242197C00009D90A2F3C4 -:10C4F00084300000000000A585B00100000000416C -:10C5000085D00100D4003E4185E00100A190224089 -:10C510001F7C00000000005A119001000B00000871 -:10C52000E4F5010058012D002AD0010060012DF032 -:10C5300010B00100000000F02CB00100358E00406A -:10C5400081B200009495004195300100AE90A208A0 -:10C5500080320000AE90A216803200000000004140 -:10C5600097B00100AC90230D026C00000000004168 -:10C5700097C001005F93004B02B00000E7900005F8 -:10C5800048B10000AC002F0114B00100B0002B0135 -:10C59000E0C10100002B00A616B001000000000160 -:10C5A000E0D10100BE90230D026C0000008000105D -:10C5B00044C9010000000050F1B101000000000377 -:10C5C000F0B101000000004261B101000000001064 -:10C5D00062B10100B790A800E0310000AF8200888E -:10C5E0001CB000000000000548B101000C800003F1 -:10C5F00042C90100100000F022C801000000005CE8 -:10C60000238001000000000184B00100C190230DCF -:10C61000026C00000000000D02B0010000000008E4 -:10C6200080B00100C69022401B6C0000E394000122 -:10C6300084500100CE902240856C00000000000173 -:10C6400080C001001080001046C901000000004FAA -:10C650004381010000000042F0B1010020000040D1 -:10C66000F0C9010000000016F0B101000000004315 -:10C6700061B10100A00000A162DD0100CC90A81111 -:10C68000E0310000DD90005E17900000D190230D96 -:10C69000026C00000000000D02B00100000000016B -:10C6A00084D00100D69022401B6C0000049500430A -:10C6B00061310100DD902240856C00000000000126 -:10C6C00012C001001080001046C901000000004F98 -:10C6D0004381010000000042F0B1010000000009A8 -:10C6E000F0B1010000000018F0B10100A00000A1AD -:10C6F00062DD0100DB90A811E03100000000004382 -:10C7000061B101004000001062DD0100DE90A80A66 -:10C7100002300000AF8200881CB00000B09200051B -:10C7200048310100E590230D026C0000FF07001165 -:10C73000008C0100B092004081320100EB940007B0 -:10C74000161401008C94005E051001002F0020409B -:10C75000E7B10100DA8A004081B2000000800003E6 -:10C7600042C90100000000F882B00100000000F89A -:10C770008CB00100000000F08EB0010097930040E3 -:10C78000133001000000004085B00100CE9300414D -:10C790008730010053930040813201000080001077 -:10C7A00042C90100F8902240E36D000000000045FE -:10C7B00061B101004000001062DD0100F490A8406A -:10C7C00081320000AF8200881CB00000000000052C -:10C7D00048B10100FA902209803000000B9500401A -:10C7E000133001000000000B1BB001000000001519 -:10C7F0001AD001000191A241197C000094950040DB -:10C80000953001000000001680B201000A9127084F -:10C8100080320000279000002AC00000949500415B -:10C82000953001000000001680B201000591270834 -:10C8300080320000AE9000002AC0000000000041DD -:10C8400097B001000891230D026C00000000004128 -:10C8500097C001005F93004B02B00000000000058C -:10C8600048B10100D58A2242197C00009A94003A0E -:10C8700081300100D58A004081B200000E91004A4B -:10C880001F900000D8920000103001000000001539 -:10C8900010C001000000001032B001001E9500061B -:10C8A000043001001791A2441F7C00000000000B1F -:10C8B0001BB001000000000A2CD001000000000A9B -:10C8C00002B00100BD9100018C3001000080001910 -:10C8D00042C901001E912240E36D000000000043A8 -:10C8E00061B101004000001062DD01001A91A84012 -:10C8F00081320000AF8200881CB0000000000005FB -:10C9000048B101000000000210C00100279122027E -:10C9100014500000089400451F0001001091225C93 -:10C920001F7C00000000004761B1010040000010C2 -:10C9300062DD01002391A85C1F000000AF82008827 -:10C940001CB000001091000548B1000008002D4007 -:10C9500085B00100000000F082B00100000000403E -:10C9600005B00100CE930041873001000000004572 -:10C9700061B101004000001062DD01002C91A8406F -:10C9800081320000AF8200881CB00000000000056A -:10C9900048B1010032912209803000000B9500401F -:10C9A0001330010035912244197C00000B95004F93 -:10C9B000813001000000004419800100FF070008D9 -:10C9C000008C01004391224A1F7C00003B91A2167B -:10C9D00002300000B0920040813201002F00204060 -:10C9E000E7B10100D58A004081B200002D002D087A -:10C9F0002AB001003F912242197C0000DD930040E3 -:10CA0000813201004091004081B20000AD930040AE -:10CA10008132010030002E002AD0010032002A1598 -:10CA2000E4B10100D58A0016E4B100002390A216FB -:10CA300002300000B0920040813201002F002040FF -:10CA4000E7B10100DA8A004081B20000D892004AC2 -:10CA50001F1001003890001032B000008A00204002 -:10CA6000E7B101004D91A241197C0000B092004055 -:10CA7000813201005091004081B2000058930015AE -:10CA8000943001005F93004B02B0000000000005ED -:10CA900048B1010052912242197C00009A94003A58 -:10CAA000813001000B95004581300100D58A00409E -:10CAB00081B20000F48E00451F9000009A93004060 -:10CAC000813201005393004081320100389000010F -:10CAD0002CB00000A2920040813201006591A208B2 -:10CAE000803200006591A2168032000000820002B0 -:10CAF00004DC01000000004503F00100000000011B -:10CB000000C001005E91375C613100000000001B35 -:10CB100062B1010062912840813200005F910040C3 -:10CB200081B200000000000062B101006291A840E3 -:10CB3000813200001A87174081B200005801200896 -:10CB4000E0B1010060012016E0B101009A930047B6 -:10CB50001F10010053930040813201003890000102 -:10CB60002CB00000A29200471F1001007891A2088B -:10CB7000803200007891A216803200007491A242A7 -:10CB8000197C00000082000204DC0100A098004033 -:10CB90004799010030050041893001005893001584 -:10CBA000943001005F93004B02B000001A870040F0 -:10CBB00081B20000DD930040813201000000004B93 -:10CBC000199001009A94003A813001001A870040C0 -:10CBD00081B2000058012008E0B101006001201678 -:10CBE000E0B10100D89200103230010038900040CE -:10CBF00013B00000A2920040813201008991A20886 -:10CC0000803200008991A21680320000008200026A -:10CC100004DC01000000004503F0010000000001F9 -:10CC200000C001008291375C613100000000001BF0 -:10CC300062B101008691284081320000839100405A -:10CC400081B200000000000062B101008691A8409E -:10CC5000813200001A87174081B200000080000373 -:10CC600042C90100000000F882B00100000000F895 -:10CC70008CB00100000000F08EB0010097930040DE -:10CC8000133001000000004085B00100CE93004148 -:10CC90008730010053930040813201000080001072 -:10CCA00042C9010098912240E36D00000000004558 -:10CCB00061B101004000001062DD01009491A840C4 -:10CCC00081320000AF8200881CB000000000000527 -:10CCD00048B10100358E2209803000000B950040DC -:10CCE00013300100358E004081B2000014002D4544 -:10CCF0001F9001007D8E004419900000A091A24178 -:10CD0000197C00000000004A1F900100E88F0040DD -:10CD100081B200009A93004A1F1001005393004013 -:10CD200081320100389000012CB00000D892004000 -:10CD3000813201003890001032B00000F48E0045BE -:10CD40001F9000000000004137C3010000000041B7 -:10CD500033C301003600000102CC01000000D240C4 -:10CD600081B20000AC9185178032000000009F481E -:10CD700003D00000AE919C178032000000009F4C51 -:10CD800003D000000000800134C301004080000394 -:10CD900044C901000000004AF0B101000000004059 -:10CDA000F1B1010000000012F0B10100B4920041A5 -:10CDB000E13101000080004344C90100100000403F -:10CDC000F199010000000048F0B1010000000049A5 -:10CDD000F0B1010040000003E0C90100000000457F -:10CDE00061B101000000004362B101000000A840F1 -:10CDF00081B20000BA91004081B20000BA00204028 -:10CE0000E5B10100B0002F018CD001000000004608 -:10CE1000E0C10100AC002F4013B00100CC002D0197 -:10CE2000E0C10100C4919C17803200009D95004034 -:10CE300081320100C6912247197C00000000005F8A -:10CE4000139001004495004719100100C0002D44C3 -:10CE50001F900100C4002DF082B00100789500F011 -:10CE600084B0000090002D0548B10100DB91A24B79 -:10CE70001F7C00002E92A24C1F7C0000DB911F1C27 -:10CE8000E06D0000DE91A20180320000A8002D4676 -:10CE90008FB00100D4911F1CE06D0000B400004071 -:10CEA00043990100D69122F03A6C00002B921FF0BA -:10CEB0003A6C00000000A24080B200000000804FE9 -:10CEC0008FB001008A000040439901002C9220425B -:10CED000E76D0000DA9122408032000000008059A6 -:10CEE0008FB00100000080588FB00100DD9122401A -:10CEF000803200000000805C8FB001000000805B89 -:10CF00008FB00100AC00004043990100B0002DF04B -:10CF100084B00100E291A242246C0000EB9123F066 -:10CF2000026C0000E891A2F0803200002D92A24233 -:10CF3000246C00002D92A241036C0000E791A240F6 -:10CF400080320000000080518FB00100000080524C -:10CF50008FB001002D921F12845000002D92A0016D -:10CF6000846C0000DB91004081B200008B00004027 -:10CF7000439901001692A246E77D0000140000408C -:10CF800043990100089222F014300000F491200A25 -:10CF9000026C00000592031E80320000F391A24053 -:10CFA00080320000000080448FB001000000804902 -:10CFB0008FB00100F991220A026C0000FC91A2419D -:10CFC000197C0000F891A2408032000000008055DA -:10CFD0008FB00100000080568FB00100FB91A2408D -:10CFE00080320000000080438FB0010000008048C4 -:10CFF0008FB001000000000182B001000000000AB3 -:10D0000082D0010002922091836C00000192A24024 -:10D0100080320000260080408F9801002700804069 -:10D020008F9801000492A240803200001F008040CF -:10D030008F980100200080408F9801000792A24045 -:10D0400080320000220080408F9801002300804041 -:10D050008F98010088002D448FB001001192A241E9 -:10D06000197C00000E92A2433D7C00000E92A2F2B9 -:10D07000026C00000000A24080B200000000804965 -:10D080008FB001001092A240803200000000804367 -:10D090008FB00100000080488FB001000E92A09177 -:10D0A000036C00000C9222433D7C00001592A240CC -:10D0B00080320000280080408F98010029008040C5 -:10D0C0008F98010014000040439901001F92A2F0C4 -:10D0D0001430000088002D448FB001001C92A2F291 -:10D0E000026C00000000A24080B2000000008049F5 -:10D0F0008FB001000E922241197C00000C92209109 -:10D10000036C00000E92004081B200002392200ABE -:10D11000026C00002292A240803200000000804495 -:10D120008FB00100000080498FB001002892220AD0 -:10D13000026C0000FC91A241197C00002792A240E1 -:10D1400080320000000080558FB001000000805642 -:10D150008FB001002A92A24080320000000080437C -:10D160008FB00100000080488FB001003092004372 -:10D1700095B000003092004195B00000309200421E -:10D1800095B000003092004495B000003092004C01 -:10D1900095B00000E0940040813201003392A2403B -:10D1A000803200000000804B8FB001000000804CF6 -:10D1B0008FB001002D000040439901002E002FF395 -:10D1C00084B001003892A2F3963000000000804045 -:10D1D00001B001002D002A41E7D10100D4003D41FA -:10D1E00085E001000B0000F200E401003E92225AAB -:10D1F000017C0000000000401F9001003F92005A97 -:10D2000001800000000000401F8001000000634119 -:10D2100085C001000000A0A5856C01000000E3406E -:10D2200085B001000C80000342C9010012000040DB -:10D2300087980100DF9500F08CB000004C922240EE -:10D240000F6C000000002F0548B101004992A24B6D -:10D25000197C00004A9222F0186C00000000604B1C -:10D26000199001001693000710300100F982004068 -:10D2700005B000004E92225A1F7C00009B92004095 -:10D2800081300100F982004005B0000000002F0548 -:10D2900048B101000000604B19900100169300078F -:10D2A00010300100F982004005B0000000002F0599 -:10D2B00048B101000000604B19900100169300076F -:10D2C000103001000000804005B00100579233404B -:10D2D000813200005A92A1AD95200000689213405F -:10D2E00081B200000000134A5A8301003000394522 -:10D2F00095E001001F00000F5ED801000000005AF9 -:10D300005F9001000000004045B0010000000004F3 -:10D3100048B00100000000054AB001000000000C08 -:10D3200058B00100000000074EB00100A884004082 -:10D330005D9801000000005861B101000000004A42 -:10D3400062B101000000A84197B000006592004062 -:10D3500081B200000000804097B001006992600730 -:10D3600096300000FFFF004B84890100000070C26E -:10D3700024B001007392A245257C00006D923120FB -:10D380008530000074922212487F00005804111268 -:10D39000480301001000001296E401000000004B59 -:10D3A0001E9401000000805A1F90010073923140CA -:10D3B00081320000000000B424B0010074922212F7 -:10D3C000487F0000580400408132010000002F0512 -:10D3D00048B1010081920BF084300000000011126E -:10D3E000488301007E922250857000005E0100405B -:10D3F00043990100419400F2963001009304001219 -:10D40000943001000000005A1F900100100000122B -:10D4100096E401000000804B1E94010010000042C1 -:10D4200010F4010000B73F4311F0010007000008AD -:10D430008A880100849230A10C3000008792224536 -:10D44000E67D00007492104081B2000000002A4581 -:10D45000E691010000001012488301000000114015 -:10D4600081B201000000604B858001005E01004038 -:10D4700043990100419400F29630010000800010B1 -:10D4800044C90100D8000040819801002E002D05FC -:10D4900048B1010092922240E76D000080000040F8 -:10D4A00080C8010000000040F0B101000900000840 -:10D4B00086E40100000068A787C001000000004466 -:10D4C00061B101000000001062B101009692A80550 -:10D4D000E03100001000001296E401000014004B3F -:10D4E00096DC01000000804B1E9401001000000F2C -:10D4F00084F401001F000042848801009F922240B2 -:10D5000080320000A092004268B10000000000429A -:10D510006AB10100A092315A1F0000000000914240 -:10D5200048930100A2923540813200006D00004016 -:10D5300061990100A89228B12C300000A392224DDD -:10D54000757D0000000000402DB0010000009540F6 -:10D5500011B001006D00004061990100A892A8B1CE -:10D56000103000000000954081B201007F000040B3 -:10D5700061990100AF9228B110300000AB929FBAC0 -:10D58000803200000000804011B0010000008024C3 -:10D59000118401000000005F61B101000010000073 -:10D5A00062DD01000000A84081B20000B19200409D -:10D5B00081B20000AC94004047990100B59232401E -:10D5C00081320000BB9222F896300000000000F883 -:10D5D00090B00100000000F092B001000100004B8B -:10D5E000F0CD010020009248E0C901006C0000402D -:10D5F00061990100BF9228B192300000BB92224C89 -:10D60000757D00000400124091B000006C000040E5 -:10D6100061990100BF92A8B190300000FF0000485E -:10D62000968801000000004B90D001000100004BE3 -:10D63000F0CD010020000048F0C90100000092492F -:10D64000E0B101000C002D1048B10100FF070008F7 -:10D65000828C0100FF0700F0008C01000000A24155 -:10D6600000EC0000CC92221A006C0000B092000086 -:10D67000343001000000005049C10100C892A241AD -:10D68000235000000000804081B201000C002D10EA -:10D6900048B10100FF070015828C0100FF0700F070 -:10D6A000008C01000000A24100EC0000D592220D88 -:10D6B000006C0000B09200001A3001000000005021 -:10D6C00049C10100D192A2412350000000008040D6 -:10D6D00081B20100DA92831E803200000000004413 -:10D6E0001990010024002D012CB0010028002DF01C -:10D6F00016B0010022002DF026B0010014002FF218 -:10D700000CB0010000008040E1B101003000004099 -:10D710009798010060972E4081B201000000004000 -:10D72000F1B10100E192A2419750000064973E439D -:10D730009DE0010000008040E1B1010064973E439C -:10D740009DE001000000800BE8B1010064973F43B9 -:10D750009DE00100000000F016C0010000008040C4 -:10D76000E1B1010064973F439DE00100000000F437 -:10D7700016B0010000008040E1B1010060173D4398 -:10D780009DE00100100080A116E4010000B5000D2D -:10D7900042C90100F092304717040000F392A20B37 -:10D7A000E67D00000000904281B0010000B7000D4E -:10D7B00046C90100F792A20BE67D00000000000BB5 -:10D7C000E69101000000904181B00100000010408E -:10D7D00081B20100F8924007963000009D0400409D -:10D7E000813201000293A245957C000001973F41E0 -:10D7F00095E00100000000F396B001000000004E2B -:10D80000E6B1010040973E4097E001000000004E65 -:10D81000E6B1010040973E409DE001001593003BBA -:10D82000E7B1000002933040813200000C93A20B5C -:10D83000E67D000000B5000D46C901000893A20B6B -:10D84000E67D00000000104081B201000000984217 -:10D8500081B0010000B7000D46C901000000000BB7 -:10D86000E69101000000104081B2010000009841E3 -:10D8700081B00100040021A2952000000000104AA0 -:10D880004483010000973E4195E001000000004EF6 -:10D89000F6B101000000004EE6B1010040973E40A5 -:10D8A0009DE001000000003BE7B101000000004ADC -:10D8B00090B10100FFFF000792890100000098402D -:10D8C00081B001000300000886F4010000B70043A6 -:10D8D00046C901000700000882880100199340082A -:10D8E000963000009D0400408132010025932245BE -:10D8F000957C00002193225A1F7C00001000000F2D -:10D9000096F401001E93315F970400000000114B54 -:10D91000489301000000004B6AB1010021933040A0 -:10D920008132000000000041E6810100000010404B -:10D9300081B201000000984081B2010000973F4190 -:10D9400095E00100000000F396B0010040973D40D3 -:10D9500097E00100000063F388B001002D93A23B23 -:10D96000896C00000000004A90B10100010000A68F -:10D9700092B101002E93184A449300000000184011 -:10D9800081B201003000394597E001003393225AFB -:10D990001F7C00001F04000F98D801000000004CFD -:10D9A0005E940100359300054AB000001F0400A7F3 -:10D9B0005E840100000000404BB0010000000058F0 -:10D9C00061B101000000004B62B101000000A840FD -:10D9D00081B200003693004081B2000039934007C5 -:10D9E000963000009D040040813201003D932245A5 -:10D9F000957C00000000984081B201009B04004A21 -:10DA00004413010000973F4195E00100000000F33E -:10DA100096B0010040973D4097E00100000063F39D -:10DA200088B001003000384597E001000000005F39 -:10DA30000F9001000000005861B101000000004B90 -:10DA400062B101004593A840813200003E93A23BA1 -:10DA5000896C0000300038459DE0010000009840CE -:10DA600081B2010093040012943001001693005A11 -:10DA70001F0001000000805A1F9001001100004AA1 -:10DA8000E6C9010034002F4F95840100000000F327 -:10DA900096B001000100634B84C801000000A04360 -:10DAA000856C01000000E34085B0010030002D448A -:10DAB0001F90010032002DF22AB00100040022F272 -:10DAC0000230000034920010323001003200A040D9 -:10DAD000E5B101000000004097B00100F0070040F0 -:10DAE000999801000000004A02C0010000000050A7 -:10DAF00003D001000000004197C001000000A34CCA -:10DB000002D000005C93004081B20000000000A839 -:10DB100036B001006C9322410350000000800010D9 -:10DB200044C9010000000050F1B101007000000381 -:10DB3000F0C901000000004261B1010000000010C6 -:10DB400062B101006593A800E0310000AF82008857 -:10DB50001CB00000B0920040813201007C800003C4 -:10DB600042C90100000000F000B001006093005CB9 -:10DB700001800000B0920040813201000000001BD3 -:10DB800010B1000068012D0682B00100000000F213 -:10DB900082C001000080000346C90100AB92004032 -:10DBA0008132010093932240116C0000000068084C -:10DBB00038960100F007004182CC01007193AA4120 -:10DBC0003B400000000000F810B001000000005CC5 -:10DBD000118001000100001D04CC01009293264633 -:10DBE000233000000800000312C80100640120F087 -:10DBF000E0B1010091932241055000002000000394 -:10DC000048C901000C0000F886C801000000224449 -:10DC1000F1B1010000000043F0B101000000000973 -:10DC2000E0B101000000004461B10100A00000A4C7 -:10DC300062DD01008393A8461F10000090932241EB -:10DC4000055000008E93A24123500000000000A167 -:10DC50001AB001000000004461B101004000001052 -:10DC600062DD01008993A84623300000AF8200885E -:10DC70001CB000001000000348C901000000000DA6 -:10DC800042B101000000004413C001007E93005027 -:10DC900049C100000000000548B1010004800003F4 -:10DCA0001AC801000000804081B201009293224016 -:10DCB0003B6C0000000000F800B00100B092005C76 -:10DCC00001000100939300413BD0000000008D470C -:10DCD00080320100B0002F5F13B001000000E0F0BF -:10DCE0008CC001000080000342C90100000000F860 -:10DCF00094B00100000000F88CB001009F938CF8F4 -:10DD00008E3000000000004419900100040022F849 -:10DD100014300000000000F816B00100000000F808 -:10DD200026B0010008002EF80CB001000C002A4AB1 -:10DD3000E0B1010028000000E0C901001000201B34 -:10DD4000E0B10100AC93200A0C6C0000000000F868 -:10DD500094B00100000000F896B00100200020F00F -:10DD6000E4B101001800204AE0B101001C00204B82 -:10DD7000E0B101009793004013B000002C002D4249 -:10DD8000199001002E002FF382B00100000000F373 -:10DD900096B00100B293A2A5976C000000008041EC -:10DDA00095B00100B593A240976C000000000040C0 -:10DDB00083B001002D002040E7B101000000634165 -:10DDC00097C00100D4003E4183E001000000004103 -:10DDD00083C00100BA93A0A5836C0000000000403E -:10DDE00083B001002C002041E6B10100BF93224026 -:10DDF0001F7C00000004000098DC01000B00004CB8 -:10DE0000E4F50100000080401F8001000B0080004D -:10DE1000E4F50100B4920040813201000480000367 -:10DE200044C9010000000040F1B1010000000040C1 -:10DE3000F1B101000000604187B0010000800010D6 -:10DE400044C9010000000050F1B101000000004889 -:10DE5000F0B1010000000049F0B101000000000332 -:10DE6000E0B101000000004561B101002000001098 -:10DE700062DD01000000A85D05900000CB9300402A -:10DE800081B20000B49200408132010000800003A2 -:10DE900044C9010000000041F0B10100000000424F -:10DEA000F0B1010000000040F1B1010000000043AA -:10DEB000F0B101000080001044C9010000000050D2 -:10DEC000F1B1010000000048F0B10100000000497C -:10DED000F0B1010000000003E0B1010000000045C6 -:10DEE00061B101002000001062DD01000000A85DAA -:10DEF00005900000DA93004081B200002D00004040 -:10DF0000439901002E002FF384B00100010063F358 -:10DF100096C80100E2939F4185500000010000A5D2 -:10DF200085CC01002D00A042E6B101005E012D006C -:10DF300080B00100E793524381600000020000F2CC -:10DF400082F40100E8930041809400000000005F2B -:10DF5000819001000000005E61B1010000000040FE -:10DF600062B101000000A84095B00000E9939EBB9B -:10DF700080320000EE93A2401F7C0000B09200406F -:10DF800081B200000000804195B00100040000153E -:10DF900042C90100000000542BC00100000000FC39 -:10DFA00024B00100000000FC38B00100000000FEB9 -:10DFB0003CB00100000000FE3AB0010003949C1741 -:10DFC00080320000F893A24A197C00000000804CC7 -:10DFD0001F9001000C00001E98F40100F793A24866 -:10DFE000996C00000000001542B10100F793A28A6D -:10DFF000F16D00000C00000102CC0100000000FCEB -:10E000003EB00100010000F428CC0100CC002D0539 -:10E0100048B10100029420F03E6C00000000004B6B -:10E020001F9001000000004C2BC00100BF002D0517 -:10E0300048B10100000080F33AE0010000002E4BDF -:10E040001990010007002A0CE4B1010000008004CF -:10E05000E6B1010018000040439901001C002DF0BA -:10E0600016B0010020002DF026B001000C002FF2A8 -:10E070000CB001000000A20614EC00000F94224531 -:10E080001F7C00000000A3062AEC0000000000F83E -:10E0900094B00100000000F096B001000C002D408B -:10E0A00081B2010000002A4CE1C1010030000010E3 -:10E0B00048C901000A000040F1990100180000055C -:10E0C000F0C901000000004AF0B101000000004B5F -:10E0D000E0B101000000004761B10100A00000A410 -:10E0E00062DD01001994A85C1F100000000080058B -:10E0F00048B1010000002E1048B1010040000001AD -:10E10000F0CD010040000003F0C901004000000014 -:10E11000E0C9010000002E5049C1010000000006C6 -:10E12000F1B1010000000003F0B10100239462424C -:10E13000613100002000001062DD01002494A8403D -:10E14000813200001000001062C901002694A8006E -:10E15000E03100000000F24081B2010000002E100A -:10E1600048B1010040000001F0CD01004000000373 -:10E17000F0C9010040000000E0C9010000002E507D -:10E1800049C1010000000006F1B1010000000003D8 -:10E19000F0B10100309462426131000020000010B3 -:10E1A00062DD01003194A84081320000A00000A48B -:10E1B00062DD01003394A800E03100000000F2406D -:10E1C00081B201003080004A44C90100000000060D -:10E1D000F1B10100C0A83D460DE00100FF7F00A1A4 -:10E1E000F08901000200000996F4010000000046D9 -:10E1F00097E00100000060A897C001003D946342D1 -:10E20000613100003000004A62C901003E94A8401C -:10E21000813200000000F34081B2010000993F42CA -:10E2200097F0010042946540813200004A9422F345 -:10E23000740600003F0000F394880100000000070E -:10E24000E78501000000755561B101000000004A3A -:10E2500062B101000000A84081B200004794004074 -:10E2600081B200000000F54081B20100000000A86A -:10E2700036B001005A948241234000004F94A244DA -:10E280001F7C0000BD9100018C3001002080001037 -:10E2900042C9010055942240E36D00000000004394 -:10E2A00061B101004000001062DD01005294A840FD -:10E2B00081320000AF8200881CB0000000000041E5 -:10E2C00023B001000000001032B001005A94224136 -:10E2D000197C0000C6920043233001000000004179 -:10E2E00023B001005C94A3150C6C00005D94000643 -:10E2F00004B000000000001504B001005F9420028B -:10E300001A6C00000000000D04B001001E9500050D -:10E310004831010089942202145000006394A20243 -:10E320002A5000008994A2451F7C000065942202B7 -:10E330000C5000006E94000216C000006D94225C28 -:10E340001F7C00003080001042C901006D94224003 -:10E35000E36D00000000004761B1010040000010C3 -:10E3600062DD01006994A84081320000AF8200881C -:10E370001CB000000000000548B101000894005CDA -:10E380001F00010089942215803200000000005017 -:10E3900033C001008894A2021A5000007A942246E9 -:10E3A0001F7C00007080000342C90100000000468D -:10E3B0001F8001007A942240E36D000000000042BB -:10E3C00061B101004000001062DD01007694A840B8 -:10E3D00081320000AF8200881CB000000000000500 -:10E3E00048B101000C80000342C90100100000F098 -:10E3F00010C801002F002F5C1180010000000047B1 -:10E40000E7910100F00700401B9801004C94201593 -:10E410001A6C00007000000348C90100000022507F -:10E42000F1B1010000000003F0B10100FF07000896 -:10E43000E08D01000000004261B10100A00000A4D5 -:10E4400062DD01008594A8461F1000004C94000571 -:10E4500048B100004C94000210C000008B94A2440C -:10E460001F7C0000BD9100018C3001000000001BEA -:10E4700010B100000080001044C901000C000040F1 -:10E48000F199010010000008F0C901000000001619 -:10E49000F0B1010010000003E0C9010000000045D8 -:10E4A00061B101002000001062DD01000000A85CE5 -:10E4B0001F9000009294004081B20000170000D02D -:10E4C000A2C901000000A24027EC000000000020CB -:10E4D00000B00100B0920041A341010096940041B8 -:10E4E00027D000001000000796E401000000004B58 -:10E4F000809401000000005461B1010000800040E0 -:10E5000062DD01000000A84081B200009D9400403F -:10E5100081B20000EF9400402B300100AC002D06CA -:10E5200016C0010090002DF016C40100A594A0F0C3 -:10E53000164400000000004117C001000E0000A2B8 -:10E5400044C9010000006CF030B00100AC002D4067 -:10E5500087B0010000006CF028B00100AE94224AA0 -:10E56000197C00000030004386C801000030000B19 -:10E5700016C80100AE94A4408132000000000041A2 -:10E5800017C00100CF94220680320000BB94A2067F -:10E59000146C0000B8942248197C0000B394A04188 -:10E5A000174000000000004117C0010000000041BA -:10E5B00031C0010090002018E0B101008B002D480F -:10E5C000198001008B002045E7910100BB940040B9 -:10E5D000879000000800004386980100BB94A04883 -:10E5E000174000000000004117C00100B0000040CB -:10E5F0004399010010500043FCC9010026950030EA -:10E600008130010000000040E5B10100C694224ABB -:10E61000197C0000080000A244C90100CC002DAB09 -:10E62000F9B10100000000AB17C00100C594A0F0D3 -:10E63000164400000000004117C00100CA9464F0B5 -:10E6400082B00000A400004047990100CA94A2F2E1 -:10E650008032000000000041E5B101008C0020186C -:10E66000E0B1010090000040459901000000600603 -:10E6700030C001000000860C80B20000BC002D46B6 -:10E6800019900100A000A0F2E4B10100B000004028 -:10E690004399010010500043FCC901002695003049 -:10E6A000813001000000A24A19FC0000080000A20D -:10E6B00044C90100CC002DABF9B10100000000AB52 -:10E6C00017C00100D894A0F01644000000000041DB -:10E6D00017C001000000E4F082B0010000800010CB -:10E6E00044C9010000000041F0B101000000000336 -:10E6F000F0B1010000000000F0B1010000000010C6 -:10E7000062B101000000A81BE0B10000DD940040F0 -:10E7100081B2000000F0000C7E8901000000A64CD0 -:10E72000956001000000804A1894010000800010EC -:10E7300044C9010004002201F03100002000004023 -:10E74000F0C9010000000016F0B101000000004314 -:10E7500061B101002000001062DD01000000A81579 -:10E76000E0B10000E894004081B200001080000396 -:10E7700044C9010000000006F0B1010000000001E2 -:10E78000F0B101000000E85F179001007000004048 -:10E79000439901007A012EFE92B001008B002DF604 -:10E7A00016B00100F5942243E77D0000000000440C -:10E7B00045C10100040000A62AB0010028006E0631 -:10E7C00082C80100F994224A197C0000000000422E -:10E7D00045D1010000006E4C83C0010000000041E3 -:10E7E00092C00100FA9443303D0700000000669E8D -:10E7F00083B0010000001B413DC301000000004147 -:10E8000092C00100060000A244C9010010000049A6 -:10E8100098F4010003952630930400000395904C72 -:10E82000924000000000004193C00100FFFF8049BA -:10E83000ECA901000080001044C90100040022017D -:10E84000F031000000000009F0B1010000000018E4 -:10E85000F0B101002000001062DD01000000A815E9 -:10E86000E0B100000895004081B200001595225FDC -:10E87000817C00001495A240197C0000000000403B -:10E88000199001000000005461B101001000000760 -:10E8900096E401000000004F979401000000004B37 -:10E8A00062B10100149528408132000011950040AA -:10E8B00081B200000000A221818400001895A25FAF -:10E8C000816C00000000A243197C0100000000439D -:10E8D000199001000000005461B101001000000710 -:10E8E00096E4010000000040969401000000004BF7 -:10E8F00062B101000000A84081B200001B950040F9 -:10E9000081B200000080001944C901000400220205 -:10E91000F03100000000000BF0B101000000001316 -:10E92000F0B101000000004361B1010020000019B6 -:10E9300062DD01000000A808E0B10000239500405E -:10E9400081B200007C002DF084B00100020000F0D4 -:10E9500098F401002C95204C846C00008800004045 -:10E96000439901002C9520F2846C000000000040C7 -:10E9700085B0010098002D1482B00100000000F065 -:10E9800098B00100A3002D1498D001003195204CBF -:10E99000846C00000000004C84B00100000000F313 -:10E9A00080E0010034952340846C000000000040AA -:10E9B00084B00100D0002014E0B10100980025428D -:10E9C00080B0010000006EF380F001000000A6425C -:10E9D00082C000003A95A0401640000000000041AF -:10E9E00017C0010000009FF082EC00009800A041D9 -:10E9F000E0B1010000002E1048B10100A801004064 -:10EA0000F199010000000005F0B1010009000007C4 -:10EA100096E40100000060A797C00100000000100C -:10EA200062B101000000A84081B2000041950040A1 -:10EA300081B20000A8002D1C8AB0010000009FF0E8 -:10EA40008AD000000000A2408BEC00008A00204029 -:10EA5000E7B10100B400004047990100A4002D4532 -:10EA6000E0D101004E959C1780320000BE002FAB14 -:10EA700083B00100A195001482500100539500401D -:10EA800081B20000539522F2823000008C000040D9 -:10EA90004399010053959F1CE06D0000BE000040AB -:10EAA00047990100A195004081320100A800201C77 -:10EAB000E0B101009C002D3081B0010088002DF0F4 -:10EAC00084B0010094002DF286B00100669523F019 -:10EAD000846C00005B952392876C0000C90400A63B -:10EAE00094B001005D95004081B20000200000A6B6 -:10EAF00094B001006089004A949801005D956840D7 -:10EB0000813200000000004AB0B10100BF002D4278 -:10EB1000B2B1010090002DF380E001006195D44076 -:10EB200081320000000078DA84C001006B95234038 -:10EB3000846C00009400209DE1B101006B950040C1 -:10EB400084B00000BF002D4384C0010090002DF36D -:10EB500080E001006B952340846C00009400209DB0 -:10EB6000E1B101000000004084B001006F95A2F007 -:10EB7000386C00009C002042E0B101000000005F02 -:10EB80001394010000008046198001009C0020427F -:10EB9000E0B101003700004043990100040000F398 -:10EBA00080F401000F0000F3828801007595234175 -:10EBB000806C00000000005F139401000000890CCD -:10EBC00080B20000BC00004043990100A000A0F208 -:10EBD000E4B1010000009F4124EC00007F95A640B5 -:10EBE0008132000000009F4238EC00007F95A64073 -:10EBF00081320000B4000040439901008195A3F0E8 -:10EC00003A6C00000000804081B20100B400004076 -:10EC100043990100859522F03A6C0000B400201D54 -:10EC2000E0B1010080002D5F13940100859523F071 -:10EC30003A6C00008000201DE0B10100C0002012ED -:10EC4000E0B10100C400A01CE0B10100008000039D -:10EC500044C9010000000042E0B101001200004080 -:10EC6000879801008E959F41246C000000000041B0 -:10EC70008CB00100000000128CD001008F95004183 -:10EC800024B00000000000408DB00100DF9500407E -:10EC9000813201000000004561B101004000001018 -:10ECA00062DD01000000A84081B2000091950040A3 -:10ECB00081B20000A29200408132010000000016E3 -:10ECC00080B201000000A708803201009995A2409F -:10ECD000956C0000B092004081320100008200A6D5 -:10ECE00004B00100000000402DB00100A0982F40AA -:10ECF00011B001003005004189B0000000009FF80C -:10ED00003EEC000000009F12E0ED0000C80020ABC8 -:10ED1000E1B10100CC00A01FE0B10100A395A35F09 -:10ED2000E76D000000000041E7C10100A6000040BF -:10ED300047990100B79522F2863000000300004396 -:10ED400084F401000100004180CC0100B8002D4294 -:10ED500080D001000000624086C00100AB951F43D7 -:10ED600080320000AC95A240876C00000000624138 -:10ED700087B00100B0959F40803200000000004045 -:10ED800085B001000000004084D001000000004276 -:10ED900080B00100000000F288B0010002000044D1 -:10EDA00084F40100B8002E4280D0010000006240CF -:10EDB00088C00100B6951F4480320000BA95A24079 -:10EDC000896C0000BA95624189B00000030062417D -:10EDD00086E40100B800004045990100010062414D -:10EDE00088E40100A4002040E5B10100A200204019 -:10EDF000E7B10100BC002E4387F001000000004491 -:10EE000086C00100C0952043876C0000000080434D -:10EE1000E5B101004001004380CE01000000A443A1 -:10EE2000E43101004001E2408798010088002D4450 -:10EE300081B0010090002DF22EB001009C002DF059 -:10EE400086B0010090002DF082B00100BA002DF0D4 -:10EE500098B00100CD95A212986C0000BC002DF274 -:10EE600098B00100CD95A0F2986C0000000000174A -:10EE700082B001009C002041E0B10100B4002D12DD -:10EE800086D00100D095A341E06D0000D19500F03F -:10EE900084B000000000004184B0010080002D43D8 -:10EEA00084D00100D4959F428032000000000040D1 -:10EEB00085B00100D695A342146C0000D795000AD6 -:10EEC0000CB00000000000420CB00100D995A01762 -:10EED0000C6C0000000080170CB00100DE95224091 -:10EEE0000D6C00000000A00A0CEC0000010000F016 -:10EEF00082F40100DE95A0410C6C00000000A2F03D -:10EF0000803201000000804081B00100B4920040D6 -:10EF1000813201000480000344C901000000004662 -:10EF2000F0B1010000000040F1B1010000006041BB -:10EF3000879401000080001044C9010000000050C7 -:10EF4000F1B1010000000048F0B1010000000049EB -:10EF5000F0B1010000000003E0B101000000004535 -:10EF600061B101002000001062DD01000000A85D19 -:10EF700005900000EA95004081B2000000002E4B91 -:10EF80001990010005002A0CE4B101000000800482 -:10EF9000E6B10100F095454861310000001000081D -:10EFA00062DD0100F595284087300000F195224888 -:10EFB000777D000095941D4687B00000F895225F8C -:10EFC000117C00000400221562310000F695A84073 -:10EFD0008132000000009D4081B20100000000402D -:10EFE00049B1010000142F4C83B001000000004023 -:10EFF000F1B10100FB95A241835000000000804068 -:10F0000081B201000000004049B101003000004021 -:10F01000A19901000000004093B0010000000040F1 -:10F020001FB001004E9600499630010007000049CC -:10F0300006E401000039000306C80100000000409A -:10F0400005B00100200000D0A0C90100000000416F -:10F0500093C001000296A054936C000000002E059E -:10F0600097B0010000800040499901000000004075 -:10F07000E1B10100000200A244C901000B96A241C7 -:10F08000975000000000002049B301005496004052 -:10F0900049310100DF9200408132010000B52E08A5 -:10F0A00097B0010000000040F1B101001296A241AA -:10F0B00097500000180000409798010000972E40DC -:10F0C00081B2010000000040F1B101001696A2419A -:10F0D000975000000000004049B1010040182E0583 -:10F0E00097B0010000000040F1B101001A96A24162 -:10F0F0009750000057952040E7B101003094004040 -:10F100004599010064000040E599010056952040B2 -:10F11000E7B10100B8942041E5B10100BA94204163 -:10F12000E5B10100989400404599010002000040BB -:10F130009798010000000040F1B101002496A2411F -:10F14000975000000000004097B001000000004010 -:10F150006FB101000000004B68B1010028968541A5 -:10F160009740000080040040813201000000004010 -:10F1700039B301000000004037B301000000004037 -:10F1800035B301000000004033B30100000000402F -:10F1900041B30100000000403FB30100EE05004014 -:10F1A000259B0100420000404B9B010000000040F5 -:10F1B0002FB30100000000402DB30100000000400B -:10F1C00047B301000000004043B30100600000406D -:10F1D0002B9B010000000054EF930100000000553C -:10F1E000F1930100FFFF00A53C8B01000000002C03 -:10F1F0005BB301000000002C45B30100000000409B -:10F2000059B301000000004057B301000000004066 -:10F2100027B301000000004053B301004496A25000 -:10F22000FD7F00004496A251FD7F000045960040FE -:10F230001DB30000504600401D9B010000C000A609 -:10F2400088B30100FF3F00A63AB3010000C0009D53 -:10F250003B9B0100B4050040239B010000000040DF -:10F260004DB30100080A00A614B301000101008A91 -:10F27000159B0100008000A656B101000000805ED1 -:10F2800057B501001800004B20E401000600004BB8 -:10F2900096E401000043004B96C8010018000010DE -:10F2A00020DC01000000004B20940100000080578A -:10F2B0002190010000992E0A97B001000000004043 -:10F2C000F1B101005596A2419750000000030040A3 -:10F2D0009798010000A900404599010000000040F6 -:10F2E000F1B101005996A241975000003000004052 -:10F2F000979801000000005561B101000000004B2B -:10F3000062B101005D96A840813200005D96A24185 -:10F31000975000000000804081B201000000804052 -:10F3200081B201000400004081B2000004000040EE -:10F3300081B200000400004081B2000004000040DF -:10F3400081B200000400004081B2000004000040CF -:10F3500081B200000400004081B2000004000040BF -:10F3600081B200000400004081B2000004000040AF -:10F3700081B200000400004081B20000040000409F -:10F3800081B200000400004081B20000040000408F -:10F3900081B200000400004081B20000040000407F -:10F3A00081B200000400004081B20000040000406F -:10F3B00081B200000400004081B20000040000405F -:10F3C00081B200000400004081B20000040000404F -:10F3D00081B200000400004081B20000040000403F -:10F3E00081B200000400004081B20000040000402F -:10F3F00081B200000400004081B20000040000401F -:10F4000081B200000400004081B20000040000400E -:10F4100081B200000400004081B2000004000040FE -:10F4200081B200000400004081B2000004000040EE -:10F4300081B200000400004081B2000004000040DE -:10F4400081B200000400004081B2000004000040CE -:10F4500081B200000400004081B2000004000040BE -:10F4600081B200000400004081B2000004000040AE -:10F4700081B200000400004081B20000040000409E -:10F4800081B200000400004081B20000040000408E -:10F4900081B200000400004081B20000040000407E -:10F4A00081B200000400004081B20000040000406E -:10F4B00081B200000400004081B20000040000405E -:10F4C00081B200000400004081B20000040000404E -:10F4D00081B200000400004081B20000040000403E -:10F4E00081B200000400004081B20000040000402E -:10F4F00081B200000400004081B20000040000401E -:10F5000081B200000400004081B20000040000400D -:10F5100081B200000400004081B2000004000040FD -:10F5200081B200000400004081B2000004000040ED -:10F5300081B200000400004081B2000004000040DD -:10F5400081B200000400004081B2000004000040CD -:10F5500081B200000400004081B2000004000040BD -:10F5600081B200000400004081B2000004000040AD -:10F5700081B200000400004081B20000040000409D -:10F5800081B200000400004081B20000040000408D -:10F5900081B200000400004081B20000040000407D -:10F5A00081B200000400004081B20000040000406D -:10F5B00081B200000400004081B20000040000405D -:10F5C00081B200000400004081B20000040000404D -:10F5D00081B200000400004081B20000040000403D -:10F5E00081B200000400004081B20000040000402D -:10F5F00081B200000400004081B20000040000401D -:10F6000081B200000400004081B20000040000400C -:10F6100081B200000400004081B2000004000040FC -:10F6200081B200000400004081B2000004000040EC -:10F6300081B200000400004081B2000004000040DC -:10F6400081B200000400004081B2000004000040CC -:10F6500081B200000400004081B2000004000040BC -:10F6600081B200000400004081B2000004000040AC -:10F6700081B200000400004081B20000040000409C -:10F6800081B200000400004081B20000040000408C -:10F6900081B200000400004081B20000040000407C -:10F6A00081B200000400004081B20000040000406C -:10F6B00081B200000400004081B20000040000405C -:10F6C00081B200000400004081B20000040000404C -:10F6D00081B200000400004081B20000040000403C -:10F6E00081B200000400004081B20000040000402C -:10F6F00081B200000400004081B20000040000401C -:10F7000081B200000400004081B20000040000400B -:10F7100081B200000400004081B2000004000040FB -:10F7200081B200000400004081B2000004000040EB -:10F7300081B200000400004081B2000004000040DB -:10F7400081B200000400004081B2000004000040CB -:10F7500081B200000400004081B2000004000040BB -:10F7600081B200000400004081B2000004000040AB -:10F7700081B200000400004081B20000040000409B -:10F7800081B200000400004081B20000040000408B -:10F7900081B200000400004081B20000040000407B -:10F7A00081B200000400004081B20000040000406B -:10F7B00081B200000400004081B20000040000405B -:10F7C00081B200000400004081B20000040000404B -:10F7D00081B200000400004081B20000040000403B -:10F7E00081B200000400004081B20000040000402B -:10F7F00081B200000400004081B20000040000401B -:10F8000081B200000400004081B20000040000400A -:10F8100081B200000400004081B2000004000040FA -:10F8200081B200000400004081B2000004000040EA -:10F8300081B200000400004081B2000004000040DA -:10F8400081B200000400004081B2000004000040CA -:10F8500081B200000400004081B2000004000040BA -:10F8600081B200000400004081B2000004000040AA -:10F8700081B200000400004081B20000040000409A -:10F8800081B200000400004081B20000040000408A -:10F8900081B200000400004081B20000040000407A -:10F8A00081B200000400004081B20000040000406A -:10F8B00081B200000400004081B20000040000405A -:10F8C00081B200000400004081B20000040000404A -:10F8D00081B200000400004081B20000040000403A -:10F8E00081B200000400004081B20000040000402A -:10F8F00081B200000400004081B20000040000401A -:10F9000081B200000400004081B200000400004009 -:10F9100081B200000400004081B2000004000040F9 -:10F9200081B200000400004081B2000004000040E9 -:10F9300081B200000400004081B2000004000040D9 -:10F9400081B200000400004081B2000004000040C9 -:10F9500081B200000400004081B2000004000040B9 -:10F9600081B200000400004081B2000004000040A9 -:10F9700081B200000400004081B200000400004099 -:10F9800081B200000400004081B200000400004089 -:10F9900081B200000400004081B200000400004079 -:10F9A00081B200000400004081B200000400004069 -:10F9B00081B200000400004081B200000400004059 -:10F9C00081B200000400004081B200000400004049 -:10F9D00081B200000400004081B200000400004039 -:10F9E00081B200000400004081B200000400004029 -:10F9F00081B200000400004081B200000400004019 -:10FA000081B200000400004081B200000400004008 -:10FA100081B200000400004081B2000004000040F8 -:10FA200081B200000400004081B2000004000040E8 -:10FA300081B200000400004081B2000004000040D8 -:10FA400081B200000400004081B2000004000040C8 -:10FA500081B200000400004081B2000004000040B8 -:10FA600081B200000400004081B2000004000040A8 -:10FA700081B200000400004081B200000400004098 -:10FA800081B200000400004081B200000400004088 -:10FA900081B200000400004081B200000400004078 -:10FAA00081B200000400004081B200000400004068 -:10FAB00081B200000400004081B200000400004058 -:10FAC00081B200000400004081B200000400004048 -:10FAD00081B200000400004081B200000400004038 -:10FAE00081B200000400004081B200000400004028 -:10FAF00081B200000400004081B200000400004018 -:10FB000081B200000400004081B200000400004007 -:10FB100081B200000400004081B2000004000040F7 -:10FB200081B200000400004081B2000004000040E7 -:10FB300081B200000400004081B2000004000040D7 -:10FB400081B200000400004081B2000004000040C7 -:10FB500081B200000400004081B2000004000040B7 -:10FB600081B200000400004081B2000004000040A7 -:10FB700081B200000400004081B200000400004097 -:10FB800081B200000400004081B200000400004087 -:10FB900081B200000400004081B200000400004077 -:10FBA00081B200000400004081B200000400004067 -:10FBB00081B200000400004081B200000400004057 -:10FBC00081B200000400004081B200000400004047 -:10FBD00081B200000400004081B200000400004037 -:10FBE00081B200000400004081B200000400004027 -:10FBF00081B200000400004081B200000400004017 -:10FC000081B200000400004081B200000400004006 -:10FC100081B200000400004081B2000004000040F6 -:10FC200081B200000400004081B2000004000040E6 -:10FC300081B200000400004081B2000004000040D6 -:10FC400081B200000400004081B2000004000040C6 -:10FC500081B200000400004081B2000004000040B6 -:10FC600081B200000400004081B2000004000040A6 -:10FC700081B200000400004081B200000400004096 -:10FC800081B200000400004081B200000400004086 -:10FC900081B200000400004081B200000400004076 -:10FCA00081B200000400004081B200000400004066 -:10FCB00081B200000400004081B200000400004056 -:10FCC00081B200000400004081B200000400004046 -:10FCD00081B200000400004081B200000400004036 -:10FCE00081B200000400004081B200000400004026 -:10FCF00081B200000400004081B200000400004016 -:10FD000081B200000400004081B200000400004005 -:10FD100081B200000400004081B2000004000040F5 -:10FD200081B200000400004081B2000004000040E5 -:10FD300081B200000400004081B2000004000040D5 -:10FD400081B200000400004081B2000004000040C5 -:10FD500081B200000400004081B2000004000040B5 -:10FD600081B200000400004081B2000004000040A5 -:10FD700081B200000400004081B200000400004095 -:10FD800081B200000400004081B200000400004085 -:10FD900081B200000400004081B200000400004075 -:10FDA00081B200000400004081B200000400004065 -:10FDB00081B200000400004081B200000400004055 -:10FDC00081B200000400004081B200000400004045 -:10FDD00081B200000400004081B200000400004035 -:10FDE00081B200000400004081B200000400004025 -:10FDF00081B200000400004081B200000400004015 -:10FE000081B200000400004081B200000400004004 -:10FE100081B200000400004081B2000004000040F4 -:10FE200081B200000400004081B2000004000040E4 -:10FE300081B200000400004081B2000004000040D4 -:10FE400081B200000400004081B2000004000040C4 -:10FE500081B200000400004081B2000004000040B4 -:10FE600081B200000400004081B2000004000040A4 -:10FE700081B200000400004081B200000400004094 -:10FE800081B200000400004081B200000400004084 -:10FE900081B200000400004081B200000400004074 -:10FEA00081B200000400004081B200000400004064 -:10FEB00081B200000400004081B200000400004054 -:10FEC00081B200000400004081B200000400004044 -:10FED00081B200000400004081B200000400004034 -:10FEE00081B200000400004081B200000400004024 -:10FEF00081B200000400004081B200000400004014 -:10FF000081B200000400004081B200000400004003 -:10FF100081B200000400004081B2000004000040F3 -:10FF200081B200000400004081B2000004000040E3 -:10FF300081B200000400004081B2000004000040D3 -:10FF400081B200000400004081B2000004000040C3 -:10FF500081B200000400004081B2000004000040B3 -:10FF600081B200000400004081B2000004000040A3 -:10FF700081B200000400004081B200000400004093 -:10FF800081B200000400004081B200000400004083 -:10FF900081B200000400004081B200000400004073 -:10FFA00081B200000400004081B200000400004063 -:10FFB00081B200000400004081B200000400004053 -:10FFC00081B200000400004081B200000400004043 -:10FFD00081B200000400004081B200000400004033 -:10FFE00081B200000400004081B200000400004023 -:10FFF00081B200000400004081B200000400004013 -:020000021000EC -:1000000081B200000400004081B200000400004002 -:1000100081B200000400004081B2000004000040F2 -:1000200081B200000400004081B2000004000040E2 -:1000300081B200000400004081B2000004000040D2 -:1000400081B200000400004081B2000004000040C2 -:1000500081B200000400004081B2000004000040B2 -:1000600081B200000400004081B2000004000040A2 -:1000700081B200000400004081B200000400004092 -:1000800081B200000400004081B200000400004082 -:1000900081B200000400004081B200000400004072 -:1000A00081B200000400004081B200000400004062 -:1000B00081B200000400004081B200000400004052 -:1000C00081B200000400004081B200000400004042 -:1000D00081B200000400004081B200000400004032 -:1000E00081B200000400004081B200000400004022 -:1000F00081B200000400004081B200000400004012 -:1001000081B200000400004081B200000400004001 -:1001100081B200000400004081B2000004000040F1 -:1001200081B200000400004081B2000004000040E1 -:1001300081B200000400004081B2000004000040D1 -:1001400081B200000400004081B2000004000040C1 -:1001500081B200000400004081B2000004000040B1 -:1001600081B200000400004081B2000004000040A1 -:1001700081B200000400004081B200000400004091 -:1001800081B200000400004081B200000400004081 -:1001900081B200000400004081B200000400004071 -:1001A00081B200000400004081B200000400004061 -:1001B00081B200000400004081B200000400004051 -:1001C00081B200000400004081B200000400004041 -:1001D00081B200000400004081B200000400004031 -:1001E00081B200000400004081B200000400004021 -:1001F00081B200000400004081B200000400004011 -:1002000081B200000400004081B200000400004000 -:1002100081B200000400004081B2000004000040F0 -:1002200081B200000400004081B2000004000040E0 -:1002300081B200000400004081B2000004000040D0 -:1002400081B200000400004081B2000004000040C0 -:1002500081B200000400004081B2000004000040B0 -:1002600081B200000400004081B2000004000040A0 -:1002700081B200000400004081B200000400004090 -:1002800081B200000400004081B200000400004080 -:1002900081B200000400004081B200000400004070 -:1002A00081B200000400004081B200000400004060 -:1002B00081B200000400004081B200000400004050 -:1002C00081B200000400004081B200000400004040 -:1002D00081B200000400004081B200000400004030 -:1002E00081B200000400004081B200000400004020 -:1002F00081B200000400004081B200000400004010 -:1003000081B200000400004081B2000004000040FF -:1003100081B200000400004081B2000004000040EF -:1003200081B200000400004081B2000004000040DF -:1003300081B200000400004081B2000004000040CF -:1003400081B200000400004081B2000004000040BF -:1003500081B200000400004081B2000004000040AF -:1003600081B200000400004081B20000040000409F -:1003700081B200000400004081B20000040000408F -:1003800081B200000400004081B20000040000407F -:1003900081B200000400004081B20000040000406F -:1003A00081B200000400004081B20000040000405F -:1003B00081B200000400004081B20000040000404F -:1003C00081B200000400004081B20000040000403F -:1003D00081B200000400004081B20000040000402F -:1003E00081B200000400004081B20000040000401F -:1003F00081B200000400004081B20000040000400F -:1004000081B200000400004081B2000004000040FE -:1004100081B200000400004081B2000004000040EE -:1004200081B200000400004081B2000004000040DE -:1004300081B200000400004081B2000004000040CE -:1004400081B200000400004081B2000004000040BE -:1004500081B200000400004081B2000004000040AE -:1004600081B200000400004081B20000040000409E -:1004700081B200000400004081B20000040000408E -:1004800081B200000400004081B20000040000407E -:1004900081B200000400004081B20000040000406E -:1004A00081B200000400004081B20000040000405E -:1004B00081B200000400004081B20000040000404E -:1004C00081B200000400004081B20000040000403E -:1004D00081B200000400004081B20000040000402E -:1004E00081B200000400004081B20000040000401E -:1004F00081B200000400004081B20000040000400E -:1005000081B200000400004081B2000004000040FD -:1005100081B200000400004081B2000004000040ED -:1005200081B200000400004081B2000004000040DD -:1005300081B200000400004081B2000004000040CD -:1005400081B200000400004081B2000004000040BD -:1005500081B200000400004081B2000004000040AD -:1005600081B200000400004081B20000040000409D -:1005700081B200000400004081B20000040000408D -:1005800081B200000400004081B20000040000407D -:1005900081B200000400004081B20000040000406D -:1005A00081B200000400004081B20000040000405D -:1005B00081B200000400004081B20000040000404D -:1005C00081B200000400004081B20000040000403D -:1005D00081B200000400004081B20000040000402D -:1005E00081B200000400004081B20000040000401D -:1005F00081B200000400004081B20000040000400D -:1006000081B200000400004081B2000004000040FC -:1006100081B200000400004081B2000004000040EC -:1006200081B200000400004081B2000004000040DC -:1006300081B200000400004081B2000004000040CC -:1006400081B200000400004081B2000004000040BC -:1006500081B200000400004081B2000004000040AC -:1006600081B200000400004081B20000040000409C -:1006700081B200000400004081B20000040000408C -:1006800081B200000400004081B20000040000407C -:1006900081B200000400004081B20000040000406C -:1006A00081B200000400004081B20000040000405C -:1006B00081B200000400004081B20000040000404C -:1006C00081B200000400004081B20000040000403C -:1006D00081B200000400004081B20000040000402C -:1006E00081B200000400004081B20000040000401C -:1006F00081B200000400004081B20000040000400C -:1007000081B200000400004081B2000004000040FB -:1007100081B200000400004081B2000004000040EB -:1007200081B200000400004081B2000004000040DB -:1007300081B200000400004081B2000004000040CB -:1007400081B200000400004081B2000004000040BB -:1007500081B200000400004081B2000004000040AB -:1007600081B200000400004081B20000040000409B -:1007700081B200000400004081B20000040000408B -:1007800081B200000400004081B20000040000407B -:1007900081B200000400004081B20000040000406B -:1007A00081B200000400004081B20000040000405B -:1007B00081B200000400004081B20000040000404B -:1007C00081B200000400004081B20000040000403B -:1007D00081B200000400004081B20000040000402B -:1007E00081B200000400004081B20000040000401B -:1007F00081B200000400004081B20000040000400B -:1008000081B200000400004081B2000004000040FA -:1008100081B200000400004081B2000004000040EA -:1008200081B200000400004081B2000004000040DA -:1008300081B200000400004081B2000004000040CA -:1008400081B200000400004081B2000004000040BA -:1008500081B200000400004081B2000004000040AA -:1008600081B200000400004081B20000040000409A -:1008700081B200000400004081B20000040000408A -:1008800081B200000400004081B20000040000407A -:1008900081B200000400004081B20000040000406A -:1008A00081B200000400004081B20000040000405A -:1008B00081B200000400004081B20000040000404A -:1008C00081B200000400004081B20000040000403A -:1008D00081B200000400004081B20000040000402A -:1008E00081B200000400004081B20000040000401A -:1008F00081B200000400004081B20000040000400A -:1009000081B200000400004081B2000004000040F9 -:1009100081B200000400004081B2000004000040E9 -:1009200081B200000400004081B2000004000040D9 -:1009300081B200000400004081B2000004000040C9 -:1009400081B200000400004081B2000004000040B9 -:1009500081B200000400004081B2000004000040A9 -:1009600081B200000400004081B200000400004099 -:1009700081B200000400004081B200000400004089 -:1009800081B200000400004081B200000400004079 -:1009900081B200000400004081B200000400004069 -:1009A00081B200000400004081B200000400004059 -:1009B00081B200000400004081B200000400004049 -:1009C00081B200000400004081B200000400004039 -:1009D00081B200000400004081B200000400004029 -:1009E00081B200000400004081B200000400004019 -:1009F00081B200000400004081B200000400004009 -:100A000081B200000400004081B2000004000040F8 -:100A100081B200000400004081B2000004000040E8 -:100A200081B200000400004081B2000004000040D8 -:100A300081B200000400004081B2000004000040C8 -:100A400081B200000400004081B2000004000040B8 -:100A500081B200000400004081B2000004000040A8 -:100A600081B200000400004081B200000400004098 -:100A700081B200000400004081B200000400004088 -:100A800081B200000400004081B200000400004078 -:100A900081B200000400004081B200000400004068 -:100AA00081B200000400004081B200000400004058 -:100AB00081B200000400004081B200000400004048 -:100AC00081B200000400004081B200000400004038 -:100AD00081B200000400004081B200000400004028 -:100AE00081B200000400004081B200000400004018 -:100AF00081B200000400004081B200000400004008 -:100B000081B200000400004081B2000004000040F7 -:100B100081B200000400004081B2000004000040E7 -:100B200081B200000400004081B2000004000040D7 -:100B300081B200000400004081B2000004000040C7 -:100B400081B200000400004081B2000004000040B7 -:100B500081B200000400004081B2000004000040A7 -:100B600081B200000400004081B200000400004097 -:100B700081B200000400004081B200000400004087 -:100B800081B200000400004081B200000400004077 -:100B900081B200000400004081B200000400004067 -:100BA00081B200000400004081B200000400004057 -:100BB00081B200000400004081B200000400004047 -:100BC00081B200000400004081B200000400004037 -:100BD00081B200000400004081B200000400004027 -:100BE00081B200000400004081B200000400004017 -:100BF00081B200000400004081B200000400004007 -:100C000081B200000400004081B2000004000040F6 -:100C100081B200000400004081B2000004000040E6 -:100C200081B200000400004081B2000004000040D6 -:100C300081B200000400004081B2000004000040C6 -:100C400081B200000400004081B2000004000040B6 -:100C500081B200000400004081B2000004000040A6 -:100C600081B200000400004081B200000400004096 -:100C700081B200000400004081B200000400004086 -:100C800081B200000400004081B200000400004076 -:100C900081B200000400004081B200000400004066 -:100CA00081B200000400004081B200000400004056 -:100CB00081B200000400004081B200000400004046 -:100CC00081B200000400004081B200000400004036 -:100CD00081B200000400004081B200000400004026 -:100CE00081B200000400004081B200000400004016 -:100CF00081B200000400004081B200000400004006 -:100D000081B200000400004081B2000004000040F5 -:100D100081B200000400004081B2000004000040E5 -:100D200081B200000400004081B2000004000040D5 -:100D300081B200000400004081B2000004000040C5 -:100D400081B200000400004081B2000004000040B5 -:100D500081B200000400004081B2000004000040A5 -:100D600081B200000400004081B200000400004095 -:100D700081B200000400004081B200000400004085 -:100D800081B200000400004081B200000400004075 -:100D900081B200000400004081B200000400004065 -:100DA00081B200000400004081B200000400004055 -:100DB00081B200000400004081B200000400004045 -:100DC00081B200000400004081B200000400004035 -:100DD00081B200000400004081B200000400004025 -:100DE00081B200000400004081B200000400004015 -:100DF00081B200000400004081B200000400004005 -:100E000081B200000400004081B2000004000040F4 -:100E100081B200000400004081B2000004000040E4 -:100E200081B200000400004081B2000004000040D4 -:100E300081B200000400004081B2000004000040C4 -:100E400081B200000400004081B2000004000040B4 -:100E500081B200000400004081B2000004000040A4 -:100E600081B200000400004081B200000400004094 -:100E700081B200000400004081B200000400004084 -:100E800081B200000400004081B200000400004074 -:100E900081B200000400004081B200000400004064 -:100EA00081B200000400004081B200000400004054 -:100EB00081B200000400004081B200000400004044 -:100EC00081B200000400004081B200000400004034 -:100ED00081B200000400004081B200000400004024 -:100EE00081B200000400004081B200000400004014 -:100EF00081B200000400004081B200000400004004 -:100F000081B200000400004081B2000004000040F3 -:100F100081B200000400004081B2000004000040E3 -:100F200081B200000400004081B2000004000040D3 -:100F300081B200000400004081B2000004000040C3 -:100F400081B200000400004081B2000004000040B3 -:100F500081B200000400004081B2000004000040A3 -:100F600081B200000400004081B200000400004093 -:100F700081B200000400004081B200000400004083 -:100F800081B200000400004081B200000400004073 -:100F900081B200000400004081B200000400004063 -:100FA00081B200000400004081B200000400004053 -:100FB00081B200000400004081B200000400004043 -:100FC00081B200000400004081B200000400004033 -:100FD00081B200000400004081B200000400004023 -:100FE00081B200000400004081B200000400004013 -:100FF00081B200000400004081B200000400004003 -:1010000081B200000400004081B2000004000040F2 -:1010100081B200000400004081B2000004000040E2 -:1010200081B200000400004081B2000004000040D2 -:1010300081B200000400004081B2000004000040C2 -:1010400081B200000400004081B2000004000040B2 -:1010500081B200000400004081B2000004000040A2 -:1010600081B200000400004081B200000400004092 -:1010700081B200000400004081B200000400004082 -:1010800081B200000400004081B200000400004072 -:1010900081B200000400004081B200000400004062 -:1010A00081B200000400004081B200000400004052 -:1010B00081B200000400004081B200000400004042 -:1010C00081B200000400004081B200000400004032 -:1010D00081B200000400004081B200000400004022 -:1010E00081B200000400004081B200000400004012 -:1010F00081B200000400004081B200000400004002 -:1011000081B200000400004081B2000004000040F1 -:1011100081B200000400004081B2000004000040E1 -:1011200081B200000400004081B2000004000040D1 -:1011300081B200000400004081B2000004000040C1 -:1011400081B200000400004081B2000004000040B1 -:1011500081B200000400004081B2000004000040A1 -:1011600081B200000400004081B200000400004091 -:1011700081B200000400004081B200000400004081 -:1011800081B200000400004081B200000400004071 -:1011900081B200000400004081B200000400004061 -:1011A00081B200000400004081B200000400004051 -:1011B00081B200000400004081B200000400004041 -:1011C00081B200000400004081B200000400004031 -:1011D00081B200000400004081B200000400004021 -:1011E00081B200000400004081B200000400004011 -:1011F00081B200000400004081B200000400004001 -:1012000081B200000400004081B2000004000040F0 -:1012100081B200000400004081B2000004000040E0 -:1012200081B200000400004081B2000004000040D0 -:1012300081B200000400004081B2000004000040C0 -:1012400081B200000400004081B2000004000040B0 -:1012500081B200000400004081B2000004000040A0 -:1012600081B200000400004081B200000400004090 -:1012700081B200000400004081B200000400004080 -:1012800081B200000400004081B200000400004070 -:1012900081B200000400004081B200000400004060 -:1012A00081B200000400004081B200000400004050 -:1012B00081B200000400004081B200000400004040 -:1012C00081B200000400004081B200000400004030 -:1012D00081B200000400004081B200000400004020 -:1012E00081B200000400004081B200000400004010 -:1012F00081B200000400004081B200000400004000 -:1013000081B200000400004081B2000004000040EF -:1013100081B200000400004081B2000004000040DF -:1013200081B200000400004081B2000004000040CF -:1013300081B200000400004081B2000004000040BF -:1013400081B200000400004081B2000004000040AF -:1013500081B200000400004081B20000040000409F -:1013600081B200000400004081B20000040000408F -:1013700081B200000400004081B20000040000407F -:1013800081B200000400004081B20000040000406F -:1013900081B200000400004081B20000040000405F -:1013A00081B200000400004081B20000040000404F -:1013B00081B200000400004081B20000040000403F -:1013C00081B200000400004081B20000040000402F -:1013D00081B200000400004081B20000040000401F -:1013E00081B200000400004081B20000040000400F -:1013F00081B200000400004081B2000004000040FF -:1014000081B200000400004081B2000004000040EE -:1014100081B200000400004081B2000004000040DE -:1014200081B200000400004081B2000004000040CE -:1014300081B200000400004081B2000004000040BE -:1014400081B200000400004081B2000004000040AE -:1014500081B200000400004081B20000040000409E -:1014600081B200000400004081B20000040000408E -:1014700081B200000400004081B20000040000407E -:1014800081B200000400004081B20000040000406E -:1014900081B200000400004081B20000040000405E -:1014A00081B200000400004081B20000040000404E -:1014B00081B200000400004081B20000040000403E -:1014C00081B200000400004081B20000040000402E -:1014D00081B200000400004081B20000040000401E -:1014E00081B200000400004081B20000040000400E -:1014F00081B200000400004081B2000004000040FE -:1015000081B200000400004081B2000004000040ED -:1015100081B200000400004081B2000004000040DD -:1015200081B200000400004081B2000004000040CD -:1015300081B200000400004081B2000004000040BD -:1015400081B200000400004081B2000004000040AD -:1015500081B200000400004081B20000040000409D -:1015600081B200000400004081B20000040000408D -:1015700081B200000400004081B20000040000407D -:1015800081B200000400004081B20000040000406D -:1015900081B200000400004081B20000040000405D -:1015A00081B200000400004081B20000040000404D -:1015B00081B200000400004081B20000040000403D -:1015C00081B200000400004081B20000040000402D -:1015D00081B200000400004081B20000040000401D -:1015E00081B200000400004081B20000040000400D -:1015F00081B200000400004081B2000004000040FD -:1016000081B200000400004081B2000004000040EC -:1016100081B200000400004081B2000004000040DC -:1016200081B200000400004081B2000004000040CC -:1016300081B200000400004081B2000004000040BC -:1016400081B200000400004081B2000004000040AC -:1016500081B200000400004081B20000040000409C -:1016600081B200000400004081B20000040000408C -:1016700081B200000400004081B20000040000407C -:1016800081B200000400004081B20000040000406C -:1016900081B200000400004081B20000040000405C -:1016A00081B200000400004081B20000040000404C -:1016B00081B200000400004081B20000040000403C -:1016C00081B200000400004081B20000040000402C -:1016D00081B200000400004081B20000040000401C -:1016E00081B200000400004081B20000040000400C -:1016F00081B200000400004081B2000004000040FC -:1017000081B200000400004081B2000004000040EB -:1017100081B200000400004081B2000004000040DB -:1017200081B200000400004081B2000004000040CB -:1017300081B200000400004081B2000004000040BB -:1017400081B200000400004081B2000004000040AB -:1017500081B200000400004081B20000040000409B -:1017600081B200000400004081B20000040000408B -:1017700081B200000400004081B20000040000407B -:1017800081B200000400004081B20000040000406B -:1017900081B200000400004081B20000040000405B -:1017A00081B200000400004081B20000040000404B -:1017B00081B200000400004081B20000040000403B -:1017C00081B200000400004081B20000040000402B -:1017D00081B200000400004081B20000040000401B -:1017E00081B200000400004081B20000040000400B -:1017F00081B200000400004081B2000004000040FB -:1018000081B200000400004081B2000004000040EA -:1018100081B200000400004081B2000004000040DA -:1018200081B200000400004081B2000004000040CA -:1018300081B200000400004081B2000004000040BA -:1018400081B200000400004081B2000004000040AA -:1018500081B200000400004081B20000040000409A -:1018600081B200000400004081B20000040000408A -:1018700081B200000400004081B20000040000407A -:1018800081B200000400004081B20000040000406A -:1018900081B200000400004081B20000040000405A -:1018A00081B200000400004081B20000040000404A -:1018B00081B200000400004081B20000040000403A -:1018C00081B200000400004081B20000040000402A -:1018D00081B200000400004081B20000040000401A -:1018E00081B200000400004081B20000040000400A -:1018F00081B200000400004081B2000004000040FA -:1019000081B200000400004081B2000004000040E9 -:1019100081B200000400004081B2000004000040D9 -:1019200081B200000400004081B2000004000040C9 -:1019300081B200000400004081B2000004000040B9 -:1019400081B200000400004081B2000004000040A9 -:1019500081B200000400004081B200000400004099 -:1019600081B200000400004081B200000400004089 -:1019700081B200000400004081B200000400004079 -:1019800081B200000400004081B200000400004069 -:1019900081B200000400004081B200000400004059 -:1019A00081B200000400004081B200000400004049 -:1019B00081B200000400004081B200000400004039 -:1019C00081B200000400004081B200000400004029 -:1019D00081B200000400004081B200000400004019 -:1019E00081B200000400004081B200000400004009 -:1019F00081B200000400004081B2000004000040F9 -:101A000081B200000400004081B2000004000040E8 -:101A100081B200000400004081B2000004000040D8 -:101A200081B200000400004081B2000004000040C8 -:101A300081B200000400004081B2000004000040B8 -:101A400081B200000400004081B2000004000040A8 -:101A500081B200000400004081B200000400004098 -:101A600081B200000400004081B200000400004088 -:101A700081B200000400004081B200000400004078 -:101A800081B200000400004081B200000400004068 -:101A900081B200000400004081B200000400004058 -:101AA00081B200000400004081B200000400004048 -:101AB00081B200000400004081B200000400004038 -:101AC00081B200000400004081B200000400004028 -:101AD00081B200000400004081B200000400004018 -:101AE00081B200000400004081B200000400004008 -:101AF00081B200000400004081B2000004000040F8 -:101B000081B200000400004081B2000004000040E7 -:101B100081B200000400004081B2000004000040D7 -:101B200081B200000400004081B2000004000040C7 -:101B300081B200000400004081B2000004000040B7 -:101B400081B200000400004081B2000004000040A7 -:101B500081B200000400004081B200000400004097 -:101B600081B200000400004081B200000400004087 -:101B700081B200000400004081B200000400004077 -:101B800081B200000400004081B200000400004067 -:101B900081B200000400004081B200000400004057 -:101BA00081B200000400004081B200000400004047 -:101BB00081B200000400004081B200000400004037 -:101BC00081B200000400004081B200000400004027 -:101BD00081B200000400004081B200000400004017 -:101BE00081B200000400004081B200000400004007 -:101BF00081B200000400004081B2000004000040F7 -:101C000081B200000400004081B2000004000040E6 -:101C100081B200000400004081B2000004000040D6 -:101C200081B200000400004081B2000004000040C6 -:101C300081B200000400004081B2000004000040B6 -:101C400081B200000400004081B2000004000040A6 -:101C500081B200000400004081B200000400004096 -:101C600081B200000400004081B200000400004086 -:101C700081B200000400004081B200000400004076 -:101C800081B200000400004081B200000400004066 -:101C900081B200000400004081B200000400004056 -:101CA00081B200000400004081B200000400004046 -:101CB00081B200000400004081B200000400004036 -:101CC00081B200000400004081B200000400004026 -:101CD00081B200000400004081B200000400004016 -:101CE00081B200000400004081B200000400004006 -:101CF00081B200000400004081B2000004000040F6 -:101D000081B200000400004081B2000004000040E5 -:101D100081B200000400004081B2000004000040D5 -:101D200081B200000400004081B2000004000040C5 -:101D300081B200000400004081B2000004000040B5 -:101D400081B200000400004081B2000004000040A5 -:101D500081B200000400004081B200000400004095 -:101D600081B200000400004081B200000400004085 -:101D700081B200000400004081B200000400004075 -:101D800081B200000400004081B200000400004065 -:101D900081B200000400004081B200000400004055 -:101DA00081B200000400004081B200000400004045 -:101DB00081B200000400004081B200000400004035 -:101DC00081B200000400004081B200000400004025 -:101DD00081B200000400004081B200000400004015 -:101DE00081B200000400004081B200000400004005 -:101DF00081B200000400004081B2000004000040F5 -:101E000081B200000400004081B2000004000040E4 -:101E100081B200000400004081B2000004000040D4 -:101E200081B200000400004081B2000004000040C4 -:101E300081B200000400004081B2000004000040B4 -:101E400081B200000400004081B2000004000040A4 -:101E500081B200000400004081B200000400004094 -:101E600081B200000400004081B200000400004084 -:101E700081B200000400004081B200000400004074 -:101E800081B200000400004081B200000400004064 -:101E900081B200000400004081B200000400004054 -:101EA00081B200000400004081B200000400004044 -:101EB00081B200000400004081B200000400004034 -:101EC00081B200000400004081B200000400004024 -:101ED00081B200000400004081B200000400004014 -:101EE00081B200000400004081B200000400004004 -:101EF00081B200000400004081B2000004000040F4 -:101F000081B200000400004081B2000004000040E3 -:101F100081B200000400004081B2000004000040D3 -:101F200081B200000400004081B2000004000040C3 -:101F300081B200000400004081B2000004000040B3 -:101F400081B200000400004081B2000004000040A3 -:101F500081B200000400004081B200000400004093 -:101F600081B200000400004081B200000400004083 -:101F700081B200000400004081B200000400004073 -:101F800081B200000400004081B200000400004063 -:101F900081B200000400004081B200000400004053 -:101FA00081B200000400004081B200000400004043 -:101FB00081B200000400004081B200000400004033 -:101FC00081B200000400004081B200000400004023 -:101FD00081B200000400004081B200000400004013 -:101FE00081B200000400004081B200000400004003 -:101FF00081B200000400004081B2000004000040F3 -:1020000081B200000400004081B2000004000040E2 -:1020100081B200000400004081B2000004000040D2 -:1020200081B200000400004081B2000004000040C2 -:1020300081B200000400004081B2000004000040B2 -:1020400081B200000400004081B2000004000040A2 -:1020500081B200000400004081B200000400004092 -:1020600081B200000400004081B200000400004082 -:1020700081B200000400004081B200000400004072 -:1020800081B200000400004081B200000400004062 -:1020900081B200000400004081B200000400004052 -:1020A00081B200000400004081B200000400004042 -:1020B00081B200000400004081B200000400004032 -:1020C00081B200000400004081B200000400004022 -:1020D00081B200000400004081B200000400004012 -:1020E00081B200000400004081B200000400004002 -:1020F00081B200000400004081B2000004000040F2 -:1021000081B200000400004081B2000004000040E1 -:1021100081B200000400004081B2000004000040D1 -:1021200081B200000400004081B2000004000040C1 -:1021300081B200000400004081B2000004000040B1 -:1021400081B200000400004081B2000004000040A1 -:1021500081B200000400004081B200000400004091 -:1021600081B200000400004081B200000400004081 -:1021700081B200000400004081B200000400004071 -:1021800081B200000400004081B200000400004061 -:1021900081B200000400004081B200000400004051 -:1021A00081B200000400004081B200000400004041 -:1021B00081B200000400004081B200000400004031 -:1021C00081B200000400004081B200000400004021 -:1021D00081B200000400004081B200000400004011 -:1021E00081B200000400004081B200000400004001 -:1021F00081B200000400004081B2000004000040F1 -:1022000081B200000400004081B2000004000040E0 -:1022100081B200000400004081B2000004000040D0 -:1022200081B200000400004081B2000004000040C0 -:1022300081B200000400004081B2000004000040B0 -:1022400081B200000400004081B2000004000040A0 -:1022500081B200000400004081B200000400004090 -:1022600081B200000400004081B200000400004080 -:1022700081B200000400004081B200000400004070 -:1022800081B200000400004081B200000400004060 -:1022900081B200000400004081B200000400004050 -:1022A00081B200000400004081B200000400004040 -:1022B00081B200000400004081B200000400004030 -:1022C00081B200000400004081B200000400004020 -:1022D00081B200000400004081B200000400004010 -:1022E00081B200000400004081B200000400004000 -:1022F00081B200000400004081B2000004000040F0 -:1023000081B200000400004081B2000004000040DF -:1023100081B200000400004081B2000004000040CF -:1023200081B200000400004081B2000004000040BF -:1023300081B200000400004081B2000004000040AF -:1023400081B200000400004081B20000040000409F -:1023500081B200000400004081B20000040000408F -:1023600081B200000400004081B20000040000407F -:1023700081B200000400004081B20000040000406F -:1023800081B200000400004081B20000040000405F -:1023900081B200000400004081B20000040000404F -:1023A00081B200000400004081B20000040000403F -:1023B00081B200000400004081B20000040000402F -:1023C00081B200000400004081B20000040000401F -:1023D00081B200000400004081B20000040000400F -:1023E00081B200000400004081B2000004000040FF -:1023F00081B200000400004081B2000004000040EF -:1024000081B200000400004081B2000004000040DE -:1024100081B200000400004081B2000004000040CE -:1024200081B200000400004081B2000004000040BE -:1024300081B200000400004081B2000004000040AE -:1024400081B200000400004081B20000040000409E -:1024500081B200000400004081B20000040000408E -:1024600081B200000400004081B20000040000407E -:1024700081B200000400004081B20000040000406E -:1024800081B200000400004081B20000040000405E -:1024900081B200000400004081B20000040000404E -:1024A00081B200000400004081B20000040000403E -:1024B00081B200000400004081B20000040000402E -:1024C00081B200000400004081B20000040000401E -:1024D00081B200000400004081B20000040000400E -:1024E00081B200000400004081B2000004000040FE -:1024F00081B200000400004081B2000004000040EE -:1025000081B200000400004081B2000004000040DD -:1025100081B200000400004081B2000004000040CD -:1025200081B200000400004081B2000004000040BD -:1025300081B200000400004081B2000004000040AD -:1025400081B200000400004081B20000040000409D -:1025500081B200000400004081B20000040000408D -:1025600081B200000400004081B20000040000407D -:1025700081B200000400004081B20000040000406D -:1025800081B200000400004081B20000040000405D -:1025900081B200000400004081B20000040000404D -:1025A00081B200000400004081B20000040000403D -:1025B00081B200000400004081B20000040000402D -:1025C00081B200000400004081B20000040000401D -:1025D00081B200000400004081B20000040000400D -:1025E00081B200000400004081B2000004000040FD -:1025F00081B200000400004081B2000004000040ED -:1026000081B200000400004081B2000004000040DC -:1026100081B200000400004081B2000004000040CC -:1026200081B200000400004081B2000004000040BC -:1026300081B200000400004081B2000004000040AC -:1026400081B200000400004081B20000040000409C -:1026500081B200000400004081B20000040000408C -:1026600081B200000400004081B20000040000407C -:1026700081B200000400004081B20000040000406C -:1026800081B200000400004081B20000040000405C -:1026900081B200000400004081B20000040000404C -:1026A00081B200000400004081B20000040000403C -:1026B00081B200000400004081B20000040000402C -:1026C00081B200000400004081B20000040000401C -:1026D00081B200000400004081B20000040000400C -:1026E00081B200000400004081B2000004000040FC -:1026F00081B200000400004081B2000004000040EC -:1027000081B200000400004081B2000004000040DB -:1027100081B200000400004081B2000004000040CB -:1027200081B200000400004081B2000004000040BB -:1027300081B200000400004081B2000004000040AB -:1027400081B200000400004081B20000040000409B -:1027500081B200000400004081B20000040000408B -:1027600081B200000400004081B20000040000407B -:1027700081B200000400004081B20000040000406B -:1027800081B200000400004081B20000040000405B -:1027900081B200000400004081B20000040000404B -:1027A00081B200000400004081B20000040000403B -:1027B00081B200000400004081B20000040000402B -:1027C00081B200000400004081B20000040000401B -:1027D00081B200000400004081B20000040000400B -:1027E00081B200000400004081B2000004000040FB -:1027F00081B200000400004081B2000004000040EB -:1028000081B200000400004081B2000004000040DA -:1028100081B200000400004081B2000004000040CA -:1028200081B200000400004081B2000004000040BA -:1028300081B200000400004081B2000004000040AA -:1028400081B200000400004081B20000040000409A -:1028500081B200000400004081B20000040000408A -:1028600081B200000400004081B20000040000407A -:1028700081B200000400004081B20000040000406A -:1028800081B200000400004081B20000040000405A -:1028900081B200000400004081B20000040000404A -:1028A00081B200000400004081B20000040000403A -:1028B00081B200000400004081B20000040000402A -:1028C00081B200000400004081B20000040000401A -:1028D00081B200000400004081B20000040000400A -:1028E00081B200000400004081B2000004000040FA -:1028F00081B200000400004081B2000004000040EA -:1029000081B200000400004081B2000004000040D9 -:1029100081B200000400004081B2000004000040C9 -:1029200081B200000400004081B2000004000040B9 -:1029300081B200000400004081B2000004000040A9 -:1029400081B200000400004081B200000400004099 -:1029500081B200000400004081B200000400004089 -:1029600081B200000400004081B200000400004079 -:1029700081B200000400004081B200000400004069 -:1029800081B200000400004081B200000400004059 -:1029900081B200000400004081B200000400004049 -:1029A00081B200000400004081B200000400004039 -:1029B00081B200000400004081B200000400004029 -:1029C00081B200000400004081B200000400004019 -:1029D00081B200000400004081B200000400004009 -:1029E00081B200000400004081B2000004000040F9 -:1029F00081B200000400004081B2000004000040E9 -:102A000081B200000400004081B2000004000040D8 -:102A100081B200000400004081B2000004000040C8 -:102A200081B200000400004081B2000004000040B8 -:102A300081B200000400004081B2000004000040A8 -:102A400081B200000400004081B200000400004098 -:102A500081B200000400004081B200000400004088 -:102A600081B200000400004081B200000400004078 -:102A700081B200000400004081B200000400004068 -:102A800081B200000400004081B200000400004058 -:102A900081B200000400004081B200000400004048 -:102AA00081B200000400004081B200000400004038 -:102AB00081B200000400004081B200000400004028 -:102AC00081B200000400004081B200000400004018 -:102AD00081B200000400004081B200000400004008 -:102AE00081B200000400004081B2000004000040F8 -:102AF00081B200000400004081B2000004000040E8 -:102B000081B200000400004081B2000004000040D7 -:102B100081B200000400004081B2000004000040C7 -:102B200081B200000400004081B2000004000040B7 -:102B300081B200000400004081B2000004000040A7 -:102B400081B200000400004081B200000400004097 -:102B500081B200000400004081B200000400004087 -:102B600081B200000400004081B200000400004077 -:102B700081B200000400004081B200000400004067 -:102B800081B200000400004081B200000400004057 -:102B900081B200000400004081B200000400004047 -:102BA00081B200000400004081B200000400004037 -:102BB00081B200000400004081B200000400004027 -:102BC00081B200000400004081B200000400004017 -:102BD00081B200000400004081B200000400004007 -:102BE00081B200000400004081B2000004000040F7 -:102BF00081B200000400004081B2000004000040E7 -:102C000081B200000400004081B2000004000040D6 -:102C100081B200000400004081B2000004000040C6 -:102C200081B200000400004081B2000004000040B6 -:102C300081B200000400004081B2000004000040A6 -:102C400081B200000400004081B200000400004096 -:102C500081B200000400004081B200000400004086 -:102C600081B200000400004081B200000400004076 -:102C700081B200000400004081B200000400004066 -:102C800081B200000400004081B200000400004056 -:102C900081B200000400004081B200000400004046 -:102CA00081B200000400004081B200000400004036 -:102CB00081B200000400004081B200000400004026 -:102CC00081B200000400004081B200000400004016 -:102CD00081B200000400004081B200000400004006 -:102CE00081B200000400004081B2000004000040F6 -:102CF00081B200000400004081B2000004000040E6 -:102D000081B200000400004081B2000004000040D5 -:102D100081B200000400004081B2000004000040C5 -:102D200081B200000400004081B2000004000040B5 -:102D300081B200000400004081B2000004000040A5 -:102D400081B200000400004081B200000400004095 -:102D500081B200000400004081B200000400004085 -:102D600081B200000400004081B200000400004075 -:102D700081B200000400004081B200000400004065 -:102D800081B200000400004081B200000400004055 -:102D900081B200000400004081B200000400004045 -:102DA00081B200000400004081B200000400004035 -:102DB00081B200000400004081B200000400004025 -:102DC00081B200000400004081B200000400004015 -:102DD00081B200000400004081B200000400004005 -:102DE00081B200000400004081B2000004000040F5 -:102DF00081B200000400004081B2000004000040E5 -:102E000081B200000400004081B2000004000040D4 -:102E100081B200000400004081B2000004000040C4 -:102E200081B200000400004081B2000004000040B4 -:102E300081B200000400004081B2000004000040A4 -:102E400081B200000400004081B200000400004094 -:102E500081B200000400004081B200000400004084 -:102E600081B200000400004081B200000400004074 -:102E700081B200000400004081B200000400004064 -:102E800081B200000400004081B200000400004054 -:102E900081B200000400004081B200000400004044 -:102EA00081B200000400004081B200000400004034 -:102EB00081B200000400004081B200000400004024 -:102EC00081B200000400004081B200000400004014 -:102ED00081B200000400004081B200000400004004 -:102EE00081B200000400004081B2000004000040F4 -:102EF00081B200000400004081B2000004000040E4 -:102F000081B200000400004081B2000004000040D3 -:102F100081B200000400004081B2000004000040C3 -:102F200081B200000400004081B2000004000040B3 -:102F300081B200000400004081B2000004000040A3 -:102F400081B200000400004081B200000400004093 -:102F500081B200000400004081B200000400004083 -:102F600081B200000400004081B200000400004073 -:102F700081B200000400004081B200000400004063 -:102F800081B200000400004081B200000400004053 -:102F900081B200000400004081B200000400004043 -:102FA00081B200000400004081B200000400004033 -:102FB00081B200000400004081B200000400004023 -:102FC00081B200000400004081B200000400004013 -:102FD00081B200000400004081B200000400004003 -:102FE00081B200000400004081B2000004000040F3 -:102FF00081B200000400004081B2000004000040E3 -:1030000081B200000400004081B2000004000040D2 -:1030100081B200000400004081B2000004000040C2 -:1030200081B200000400004081B2000004000040B2 -:1030300081B200000400004081B2000004000040A2 -:1030400081B200000400004081B200000400004092 -:1030500081B200000400004081B200000400004082 -:1030600081B200000400004081B200000400004072 -:1030700081B200000400004081B200000400004062 -:1030800081B200000400004081B200000400004052 -:1030900081B200000400004081B200000400004042 -:1030A00081B200000400004081B200000400004032 -:1030B00081B200000400004081B200000400004022 -:1030C00081B200000400004081B200000400004012 -:1030D00081B200000400004081B200000400004002 -:1030E00081B200000400004081B2000004000040F2 -:1030F00081B200000400004081B2000004000040E2 -:1031000081B200000400004081B2000004000040D1 -:1031100081B200000400004081B2000004000040C1 -:1031200081B200000400004081B2000004000040B1 -:1031300081B200000400004081B2000004000040A1 -:1031400081B200000400004081B200000400004091 -:1031500081B200000400004081B200000400004081 -:1031600081B200000400004081B200000400004071 -:1031700081B200000400004081B200000400004061 -:1031800081B200000400004081B200000400004051 -:1031900081B200000400004081B200000400004041 -:1031A00081B200000400004081B200000400004031 -:1031B00081B200000400004081B200000400004021 -:1031C00081B200000400004081B200000400004011 -:1031D00081B200000400004081B200000400004001 -:1031E00081B200000400004081B2000004000040F1 -:1031F00081B200000400004081B2000004000040E1 -:1032000081B200000400004081B2000004000040D0 -:1032100081B200000400004081B2000004000040C0 -:1032200081B200000400004081B2000004000040B0 -:1032300081B200000400004081B2000004000040A0 -:1032400081B200000400004081B200000400004090 -:1032500081B200000400004081B200000400004080 -:1032600081B200000400004081B200000400004070 -:1032700081B200000400004081B200000400004060 -:1032800081B200000400004081B200000400004050 -:1032900081B200000400004081B200000400004040 -:1032A00081B200000400004081B200000400004030 -:1032B00081B200000400004081B200000400004020 -:1032C00081B200000400004081B200000400004010 -:1032D00081B200000400004081B200000400004000 -:1032E00081B200000400004081B2000004000040F0 -:1032F00081B200000400004081B2000004000040E0 -:1033000081B200000400004081B2000004000040CF -:1033100081B200000400004081B2000004000040BF -:1033200081B200000400004081B2000004000040AF -:1033300081B200000400004081B20000040000409F -:1033400081B200000400004081B20000040000408F -:1033500081B200000400004081B20000040000407F -:1033600081B200000400004081B20000040000406F -:1033700081B200000400004081B20000040000405F -:1033800081B200000400004081B20000040000404F -:1033900081B200000400004081B20000040000403F -:1033A00081B200000400004081B20000040000402F -:1033B00081B200000400004081B20000040000401F -:1033C00081B200000400004081B20000040000400F -:1033D00081B200000400004081B2000004000040FF -:1033E00081B200000400004081B2000004000040EF -:1033F00081B200000400004081B2000004000040DF -:1034000081B200000400004081B2000004000040CE -:1034100081B200000400004081B2000004000040BE -:1034200081B200000400004081B2000004000040AE -:1034300081B200000400004081B20000040000409E -:1034400081B200000400004081B20000040000408E -:1034500081B200000400004081B20000040000407E -:1034600081B200000400004081B20000040000406E -:1034700081B200000400004081B20000040000405E -:1034800081B200000400004081B20000040000404E -:1034900081B200000400004081B20000040000403E -:1034A00081B200000400004081B20000040000402E -:1034B00081B200000400004081B20000040000401E -:1034C00081B200000400004081B20000040000400E -:1034D00081B200000400004081B2000004000040FE -:1034E00081B200000400004081B2000004000040EE -:1034F00081B200000400004081B2000004000040DE -:1035000081B200000400004081B2000004000040CD -:1035100081B200000400004081B2000004000040BD -:1035200081B200000400004081B2000004000040AD -:1035300081B200000400004081B20000040000409D -:1035400081B200000400004081B20000040000408D -:1035500081B200000400004081B20000040000407D -:1035600081B200000400004081B20000040000406D -:1035700081B200000400004081B20000040000405D -:1035800081B200000400004081B20000040000404D -:1035900081B200000400004081B20000040000403D -:1035A00081B200000400004081B20000040000402D -:1035B00081B200000400004081B20000040000401D -:1035C00081B200000400004081B20000040000400D -:1035D00081B200000400004081B2000004000040FD -:1035E00081B200000400004081B2000004000040ED -:1035F00081B200000400004081B2000004000040DD -:1036000081B200000400004081B2000004000040CC -:1036100081B200000400004081B2000004000040BC -:1036200081B200000400004081B2000004000040AC -:1036300081B200000400004081B20000040000409C -:1036400081B200000400004081B20000040000408C -:1036500081B200000400004081B20000040000407C -:1036600081B200000400004081B20000040000406C -:1036700081B200000400004081B20000040000405C -:1036800081B200000400004081B20000040000404C -:1036900081B200000400004081B20000040000403C -:1036A00081B200000400004081B20000040000402C -:1036B00081B200000400004081B20000040000401C -:1036C00081B200000400004081B20000040000400C -:1036D00081B200000400004081B2000004000040FC -:1036E00081B200000400004081B2000004000040EC -:1036F00081B200000400004081B2000004000040DC -:1037000081B200000400004081B2000004000040CB -:1037100081B200000400004081B2000004000040BB -:1037200081B200000400004081B2000004000040AB -:1037300081B200000400004081B20000040000409B -:1037400081B200000400004081B20000040000408B -:1037500081B200000400004081B20000040000407B -:1037600081B200000400004081B20000040000406B -:1037700081B200000400004081B20000040000405B -:1037800081B200000400004081B20000040000404B -:1037900081B200000400004081B20000040000403B -:1037A00081B200000400004081B20000040000402B -:1037B00081B200000400004081B20000040000401B -:1037C00081B200000400004081B20000040000400B -:1037D00081B200000400004081B2000004000040FB -:1037E00081B200000400004081B2000004000040EB -:1037F00081B200000400004081B2000004000040DB -:1038000081B200000400004081B2000004000040CA -:1038100081B200000400004081B2000004000040BA -:1038200081B200000400004081B2000004000040AA -:1038300081B200000400004081B20000040000409A -:1038400081B200000400004081B20000040000408A -:1038500081B200000400004081B20000040000407A -:1038600081B200000400004081B20000040000406A -:1038700081B200000400004081B20000040000405A -:1038800081B200000400004081B20000040000404A -:1038900081B200000400004081B20000040000403A -:1038A00081B200000400004081B20000040000402A -:1038B00081B200000400004081B20000040000401A -:1038C00081B200000400004081B20000040000400A -:1038D00081B200000400004081B2000004000040FA -:1038E00081B200000400004081B2000004000040EA -:1038F00081B200000400004081B2000004000040DA -:1039000081B200000400004081B2000004000040C9 -:1039100081B200000400004081B2000004000040B9 -:1039200081B200000400004081B2000004000040A9 -:1039300081B200000400004081B200000400004099 -:1039400081B200000400004081B200000400004089 -:1039500081B200000400004081B200000400004079 -:1039600081B200000400004081B200000400004069 -:1039700081B200000400004081B200000400004059 -:1039800081B200000400004081B200000400004049 -:1039900081B200000400004081B200000400004039 -:1039A00081B200000400004081B200000400004029 -:1039B00081B200000400004081B200000400004019 -:1039C00081B200000400004081B200000400004009 -:1039D00081B200000400004081B2000004000040F9 -:1039E00081B200000400004081B2000004000040E9 -:1039F00081B200000400004081B2000004000040D9 -:103A000081B200000400004081B2000004000040C8 -:103A100081B200000400004081B2000004000040B8 -:103A200081B200000400004081B2000004000040A8 -:103A300081B200000400004081B200000400004098 -:103A400081B200000400004081B200000400004088 -:103A500081B200000400004081B200000400004078 -:103A600081B200000400004081B200000400004068 -:103A700081B200000400004081B200000400004058 -:103A800081B200000400004081B200000400004048 -:103A900081B200000400004081B200000400004038 -:103AA00081B200000400004081B200000400004028 -:103AB00081B200000400004081B200000400004018 -:103AC00081B200000400004081B200000400004008 -:103AD00081B200000400004081B2000004000040F8 -:103AE00081B200000400004081B2000004000040E8 -:103AF00081B200000400004081B2000004000040D8 -:103B000081B200000400004081B2000004000040C7 -:103B100081B200000400004081B2000004000040B7 -:103B200081B200000400004081B2000004000040A7 -:103B300081B200000400004081B200000400004097 -:103B400081B200000400004081B200000400004087 -:103B500081B200000400004081B200000400004077 -:103B600081B200000400004081B200000400004067 -:103B700081B200000400004081B200000400004057 -:103B800081B200000400004081B200000400004047 -:103B900081B200000400004081B200000400004037 -:103BA00081B200000400004081B200000400004027 -:103BB00081B200000400004081B200000400004017 -:103BC00081B200000400004081B200000400004007 -:103BD00081B200000400004081B2000004000040F7 -:103BE00081B200000400004081B2000004000040E7 -:103BF00081B200000400004081B2000004000040D7 -:103C000081B200000400004081B2000004000040C6 -:103C100081B200000400004081B2000004000040B6 -:103C200081B200000400004081B2000004000040A6 -:103C300081B200000400004081B200000400004096 -:103C400081B200000400004081B200000400004086 -:103C500081B200000400004081B200000400004076 -:103C600081B200000400004081B200000400004066 -:103C700081B200000400004081B200000400004056 -:103C800081B200000400004081B200000400004046 -:103C900081B200000400004081B200000400004036 -:103CA00081B200000400004081B200000400004026 -:103CB00081B200000400004081B200000400004016 -:103CC00081B200000400004081B200000400004006 -:103CD00081B200000400004081B2000004000040F6 -:103CE00081B200000400004081B2000004000040E6 -:103CF00081B200000400004081B2000004000040D6 -:103D000081B200000400004081B2000004000040C5 -:103D100081B200000400004081B2000004000040B5 -:103D200081B200000400004081B2000004000040A5 -:103D300081B200000400004081B200000400004095 -:103D400081B200000400004081B200000400004085 -:103D500081B20000AE9F00889AB00000AE9F00883C -:103D60009AB00000AE9F00889AB00000AE9F008815 -:103D70009AB00000AE9F00889AB000000000008852 -:103D80009AB00100AE9F414081320000B29F2240B4 -:103D90007B6F00000000194081B20100AE9F00401F -:103DA00081B20000000019417BB30100000000A4B3 -:103DB000C4B30100000000A1C6B3010000002FA29F -:103DC000C8B301000814004049990100A89F004DA4 -:103DD0009ACC0100BB9F2640813200000000004CBD -:103DE00049C10100B99FA2419B500000BF9F808044 -:103DF0008032000000005249FD9301000000004A9B -:103E0000FD930100C29F0042CD9300000000514A83 -:103E1000FD93010000000049FD930100C29F004393 -:103E2000CB9300000000504081B20100D29F0040BF -:103E300019990100000000F09AB001000000004450 -:103E400049D10100000040F080B201000000414D66 -:103E500080B20100CA9F00401999010000004C4047 -:103E600081B201000000004449D10100000000F0CF -:103E70009AB001000000004D10B10000000000E207 -:103E800049B10100000000E343B10100000000E47B -:103E900045B10100000000407BB301000000484F25 -:103EA00040B10100D29F004081B2000004000040F8 -:103EB00081B200000400004081B200000400004014 -:103EC00081B200000400004081B200000400004004 -:103ED00081B20000040000CB81C80100F4820040E0 -:103EE000F29300004082004081B200004005004093 -:103EF00081B200001806004081B20000F482004048 -:103F000081B20000AF82004081B2000038810040E1 -:103F100081B200003681004081B20000B8800040CC -:103F200081B200001A87004081B20000AF820040D9 -:103F300081B20000F582004081B20000AB920040E7 -:103F400081B20000F095004081B200007392004001 -:103F500081B20000DF95004081B200004A9300402A -:103F600081B20000ED92004081B20000E792004073 -:103F700081B200009A82004081B2000000008040BF -:103F800081B201000400004081B200000400004042 -:103F900081B200000400004081B200000400004033 -:103FA00081B200000400004081B200000400004023 -:103FB00081B200000400004081B200000400004013 -:103FC00081B200000400004081B200000400004003 -:103FD00081B200000400004081B2000004000040F3 -:103FE00081B200000400004081B2000004000040E3 -:103FF00081B200000400004081B2000004000040D3 -:1040000081B200000400004081B2000004000040C2 -:0440100081B2000079 -:00000001FF diff --git a/firmware/slicoss/oasisrcvucode.sys.ihex b/firmware/slicoss/oasisrcvucode.sys.ihex deleted file mode 100644 index 813bea4..0000000 --- a/firmware/slicoss/oasisrcvucode.sys.ihex +++ /dev/null @@ -1,162 +0,0 @@ -:10000000000200004775010004A01301001CB75B4B -:10001000093000B65F01001C00000020183B783A50 -:10002000001CA27701001C071D017018AD7BF1FFB9 -:100030001CB37BA9AA1EB47B010C1CB57B0D061C4E -:1000400000003064080C315A70040C315A80040CE2 -:10005000314E90040C314AA000092555C0040C31E2 -:1000600052B000E92455C004CCB3001C1CEB2D0198 -:10007000001C065632D408079D00001C7BB7020006 -:1000800010A00F31540906565EC004A0305403007E -:10009000AC30550300CD033A001C7BB702001C6056 -:1000A0008E3154092925550300808E3154098C3036 -:1000B000910004471C01001CA00F3154090000648A -:1000C0000004471C65C004471C5503006C30010048 -:1000D0001C4D3402001C7BB702001CA00F315409D8 -:1000E000C88337001C800100001C0000640004A0CD -:1000F0000F305409000054C3047BFBF2001CCC33C6 -:100100000D001CB47BFD031C800E305409E0FB0580 -:10011000001C00008C0300B30F3154090000EC7088 -:10012000040000EC800400008C930061768DC30411 -:10013000C08D315409E07B00C01FA0FDC50100CC7B -:100140003305001CD403003C1CD4D31B001CC0D3BB -:1001500052001C00005C13048E8E3254095B805EDA -:100160001304000000001C0000940100A00F315493 -:1001700009A00F315409C003FC7F1CA001A001009D -:100180000000A40100A00F315409C003FC031CF5BA -:100190007701001C267AE6051CA00F315409B30F25 -:1001A000315409B50202001CA00F3154097A7E02B5 -:1001B000001CB50202001C530F325409AF030100AA -:1001C0001C7A0E325409B50202001C000002001C09 -:1001D000A03DAA11040000AC1104D4D352001CB5F8 -:1001E0003EB2010020FBFDFF1F802C6C0300B93ADA -:1001F0009E0100753B02001CA71C010010DB83164A -:10020000001CC71D21C104B93B8DC1048B2C01000A -:100210001C6B2C35C1040000781100CB2C79C10473 -:10022000A00F315409A00F31540954D002001C49C9 -:1002300025B10100AB2C81C104A71D550300CC33AF -:1002400009001CEB2D01001CEA2901001CA00F3144 -:100250005409AE0F315409A00F315409D407FC03DF -:100260001C993A02001CBB3802001C003800001C1C -:100270000000FC0104DB3B7E001CC71D01001C26A6 -:100280007AFA051C271D01001CB30F3154097A0EA0 -:10029000325409530F3254097A0E325409530F3233 -:1002A00054097A0E325409530F325409A00F3154B5 -:1002B000097A0602001C530F325409AF0301001CD7 -:1002C0007A0E325409530F3254097A0E32540953BC -:1002D0000F3254097A0E325409530F3254097A0EF0 -:1002E000325409003D02001C0000581200CB2C01C2 -:1002F000001C753B02001CA71C010010CB2F050041 -:100300001C602C00001CC71CC90200A00F3154093E -:10031000530702001C467ACA051C7A0E3254094063 -:10032000FA19001C0000880204467ACA051CA00FB6 -:10033000315409A00F315409A00F315409A00F31D5 -:100340005409B37B01C01F740E305409C0039C00D4 -:100350001C8000D802000000D802040000AC120586 -:10036000071D01001CD4D32B001CD4D352001C80C9 -:10037000767D13040000E00200A67B950310C79C65 -:1003800000001C802C00001C00006C0204000054C3 -:10039000C304AB2DD91205071DB5C2048B2D010076 -:1003A0001C692501001CA67B950310CB2F09001C9E -:1003B000602C00001C0000480300530F3254094613 -:1003C0007ACA051C7A0E32540940FA19001C000042 -:1003D000100304467ACA051CB50F315409A00F3129 -:1003E000540973EC2A0304602C00001C000028034D -:1003F00000C71C01001C0000281305071D01001C7C -:10040000C0D722001C75567E1304602C00001CE728 -:100410001C450304E79C00001CA67B950310802C60 -:1004200000001C0000F80204000054C304B97B0162 -:10043000001C00008CC304CBAFFC071CCB2F0104B5 -:100440001CC79F80031C00008CC304CBAFFC071C9F -:10045000CB2F0D041CC79F80031C00008CC304CB52 -:10046000AF00F81DCB2F01001DA67B95031CC79C78 -:100470008CC30400008C1305071D01001CC01DDC8B -:10048000D308279DE40300A0EE46D400FB750914B1 -:1004900004207B06001CC01C1C04000000B0D30814 -:1004A000000000F400C0EFF2001C20255C14046082 -:1004B000B7D2030000000C1500CCB3FC031CCC33F6 -:1004C00005021C00000CC50460B70E050400000CFA -:1004D000150400005CC404C01D98F304000068C447 -:1004E00004079D00001C1B74FDF304A67BF1031C94 -:1004F000A00F695409E07B00FC1F397F02001C0734 -:100500001D9DC304A67BAD031C000068C404E01C51 -:1005100000001C0000A40304CBAF00F81DCB2F018A -:10052000101D0000ACC3040000AC0304CBAF00F806 -:100530001DCB2F01181DC79F000B1C0000ACC3046E -:10054000FB7501001C071D01001CCCB3FC031CCC77 -:100550003301021C0000ACC304A01C00001CA0EE70 -:10056000A20304CBAFFC071CCB2F09041CFB7501B5 -:10057000001C0000ACC304CCB3FC031CCC33010250 -:100580001C00000CC5040000783405CCB3FC031C2F -:10059000CC3315021C479D54C404000078440080ED -:1005A0001D7C5404871D8D0400CE7601001CEF765F -:1005B0009DC404A4778D2409E47601001CC476014F -:1005C000001C0000985404D776015018F6760100FC -:1005D0001C00000030180000000010CC3045C5049D -:1005E000EB2D01001CEA2901001CC05901001CF57B -:1005F0007729C504E030DC0400004CB00400204C36 -:10060000F404000000E80400CCB3FC031CCC330964 -:10061000021CEB2DB5C404CCB3FC031CCC33190273 -:100620001CEB2DB5C404CCB3FC031CCC330D021C55 -:10063000EB2DB5C404CCB3FC031CCC3311021CEB72 -:100640002DB5C404007B00801CAE7745050000007A -:1006500004C004D38B00FC1F607A3C001C604CC0BB -:100660000400C02F20051FE030B004008025B00436 -:1006700000B55BB10404692601001C6A2B01001C53 -:10068000801D00001CA925450500EE3000001CAFB0 -:10069000770105000000AC2404B45F014018079DF9 -:1006A000485504B77601001C967601001C471D01D1 -:1006B000001CA433016018A42F0160186477016046 -:1006C000182477016018447701001C648803001C1B -:1006D000A43F01001CA43B01001C537B00C01CD3A1 -:1006E000CF1B001C534F02001CDACF00C01FD55790 -:1006F0000F001CD3D337001CD4530F001CE029007B -:10070000001CF5D5B0050000009C5504775601008B -:100710001C565301001C0000001018000004C00407 -:10072000F55501001C0000B45504775601001C5615 -:100730005301001C0000001018000004C004CB2F5F -:10074000011810CB2F011010CB2F010810CB2F0157 -:100750000810CB2F012010CB2F012810CB2F010028 -:1007600010892561C2040000ECC204000054C304D7 -:10077000000054C304000054C304000060C204001D -:1007800000ECC204000054C304000054C304000081 -:1007900054C304401C6CC004401C9CC004A7775583 -:1007A000C3040000C4C004271DF1C004000054C3EA -:1007B00004000054C304000054C30400002CC60409 -:1007C00000002CC60400002CC60400002CC6040047 -:1007D000002CC60400002CC60400002CC604000037 -:1007E0002CC60400002CC60400002CC60400002CFB -:1007F000C60400002CC60400002CC60400002CC651 -:100800000400002CC60400002CC60400002CC60402 -:1008100000002CC60400002CC60400002CC60400F6 -:10082000002CC60400002CC60400002CC6040000E6 -:100830002CC60400002CC60400002CC60400002CAA -:10084000C60400002CC60400002CC60400002CC600 -:100850000400002CC60400002CC60400002CC604B2 -:1008600000002CC60400002CC60400002CC60400A6 -:10087000002CC60400002CC60400002CC604000096 -:100880002CC60400002CC60400002CC60400002C5A -:10089000C60400002CC60400002CC60400002CC6B0 -:1008A0000400002CC60400002CC60400002CC60462 -:1008B00000002CC60400002CC60400002CC6040056 -:1008C000002CC60400002CC60400002CC604000046 -:1008D0002CC60400002CC60400002CC60400002C0A -:1008E000C60400002CC60400002CC60400002CC660 -:1008F0000400002CC60400002CC60400002CC60412 -:1009000000002CC60400002CC60400002CC6040005 -:10091000002CC60400002CC60400002CC6040000F5 -:100920002CC60400002CC60400002CC60400002CB9 -:10093000C60400002CC60400002CC60400002CC60F -:100940000400002CC60400002CC60400002CC604C1 -:1009500000002CC60400002CC60400002CC60400B5 -:10096000002CC60400002CC60400002CC6040000A5 -:100970002CC60400002CC60400002CC60400002C69 -:10098000C60400002CC60400002CC60400002CC6BF -:100990000400002CC60400002CC60400002CC60471 -:1009A00000002CC60400002CC60400002CC6040065 -:1009B000002CC60400002CC60400002CC604000055 -:1009C0002CC60400002CC60400002CC60400002C19 -:1009D000C60400002CC60400002CC60400002CC66F -:1009E0000400002CC60400002CC60400002CC60421 -:1009F00000002CC60400002CC60400002CC6040015 -:040A0000002CC604FC -:00000001FF diff --git a/firmware/sxg/saharadbgdownloadB.sys.ihex b/firmware/sxg/saharadbgdownloadB.sys.ihex deleted file mode 100644 index e3016d3..0000000 --- a/firmware/sxg/saharadbgdownloadB.sys.ihex +++ /dev/null @@ -1,3937 +0,0 @@ -:1000000002000000DCF500000C0000000000000011 -:10001000FF1F00000100000000000088824D293A07 -:1000200000000404000000800200009000000900AD -:100030000000008002000090000009000000008025 -:100040000200009000000900000000800200009003 -:10005000000009000000008002000090000009007C -:1000600000000080020000900000090000000080F5 -:1000700002000090000009000000008002000090D3 -:10008000FEFF0000000000AC020036320000360027 -:10009000000000A80200009200001613000000807B -:1000A0000200009000001613000000800200009083 -:1000B00000001613000000800200009000001613DC -:1000C0000000008002000090000016130000008075 -:1000D0000200009000002000000000D80F8028924D -:1000E00000002100000000D80F80289200002200AC -:1000F000000000D80F80289200002300000000D8E4 -:100100000F402B9200002400000000D80F8028929E -:1001100000002500000000D80F8028920000260073 -:10012000000000D80F80289200002700000000D8AF -:100130000F80289200002800000000D80F8028922D -:1001400000002900000000D80F80289200002A003B -:10015000000000D80F8028920000360000000098B0 -:100160001E80E99A00002C00000000D80F80289221 -:1001700000002D00000000D80F80289200002E0003 -:10018000000000D80F80289200002F00000000D847 -:100190000F80289200003000000000D40F00009271 -:1001A00000003000000000D40F400092000030003A -:1001B000000000D40F80009200003400000000D442 -:1001C0000FC0009200003000000000D40F00019228 -:1001D00000003000000000D40F4001920000300009 -:1001E000000000D40F80019200003000000000D415 -:1001F0000FC0019200003000000000D40F000292F6 -:1002000000003000000000D40F40029200003000D7 -:10021000000000D40F80029200001613000000803E -:100220000200009000003000000000D40F00039294 -:1002300000003000000000D40F40039200003000A6 -:10024000000000D40F80039200003000000000D4B2 -:100250000FC0039200000000000000D05F3F003498 -:10026000000016130400008042FFFCB000000000F4 -:10027000000000881280FD3A000016130000008084 -:10028000020000901613161302010080828DFDBC3F -:1002900000000000000000881280FD3A000000000D -:1002A000000000F803C001323800000000010084A3 -:1002B000824D281A000036000000007409400092A8 -:1002C00000004F00000000FC020000920000480007 -:1002D000000000800200009000004D00000000902F -:1002E0000E80189200001B030000000008C020923E -:1002F000000089000000000008002192000019039E -:10030000000000000840219200008600000000006C -:100310000885219000009B03000000EC02C022929F -:1003200000009404000000800200009000005800CB -:10033000000000FC0240189D00005100000000D0A9 -:10034000020000920000E003000000800200009024 -:100350000000161300000080020000900000000062 -:10036000000100800200007000004C00000000004E -:1003700009C0219200004A0012010000088522B045 -:1003800018003600000000F8738A029900008E0001 -:100390006A000080020000B008008E00000000F833 -:1003A0002340019900000000000100E80200907263 -:1003B0000000161380010080B200E9B600000204BC -:1003C0000000007C1EC0E79A08000000000000F852 -:1003D000134001390000F60300000008B801009442 -:1003E000000016130300007809401ABD0000161320 -:1003F00004010080E28097BC00000000000000A023 -:10040000E125003408000000000000F8B340013985 -:1004100000000204B20000D8020000B2000016136F -:1004200017010080020000B000001F06001001F854 -:1004300002006E9200005B000A0100CC020000B2D4 -:1004400000007000030100FC024019BD0800020416 -:10045000000000F8A34001990000000000000084A3 -:1004600001C02F320000000000000090F1010034B4 -:10047000000000000000009401C02F320000600066 -:10048000800100801281FCB6000016130401008078 -:1004900002C02FBC02006000B00000A0F20B00B947 -:1004A000000063000401008002C0B0BC00006E00C8 -:1004B000A000008002000090000065008001008024 -:1004C000F24BD0B600006E00A00000800200009049 -:1004D00000000000A0000004FD4BD03400006B00C1 -:1004E000800100801281FCB60000C211000000D81B -:1004F000020000D20000161304000080028092BCAB -:1005000018000000000000F8730A03396E0036007E -:10051000000000C00200369200009611000000D8D2 -:10052000020000D20000161304000080028092BC7A -:1005300018003600000000F8730A03F900005B00A1 -:10054000030100FC024018BD00008500030000FC10 -:10055000024019BD000000000000009401C02F32CD -:100560000000000000000080F101003400000000E5 -:100570000000008401C02F3200007500800100805F -:100580001281FCB6000016130401008002C02FBCCB -:1005900002007500B00000A0F20B00B90000780066 -:1005A0000401008002C0B0BC00008300A0000080F5 -:1005B0000200009000007A0080010080F24BD0B66B -:1005C00000008300A00000800200009000000000F6 -:1005D000A0000004FD4BD0340000800080010080AA -:1005E0001281FCB60000C211000000D8020000D247 -:1005F0000000161304000080028092BC1800000066 -:10060000000000F8730A033983003600000000C0C0 -:100610000200369200009611000000D8020000D2BD -:100620000000161304000080028092BC18003600FF -:10063000000000F8730A03F900007000030100FCD9 -:10064000024019BD00005B00030100FC024018BD20 -:1006500008000204000000F8A3400199080000000F -:10066000000000F87340013900008E008001008016 -:10067000E20180B600008B000000008002000090C4 -:10068000080091030C0000F8534001B900008D00F0 -:1006900080010080E20180B600001613120000689D -:1006A000020580B00000F6030000006C1FC0F69A3F -:1006B000000000000000000008058030000000007D -:1006C000000000FC020001320000000000000010E9 -:1006D00008803D3200000000000000CC0200003223 -:1006E00000000000000000100900363200008012F7 -:1006F00000000014090080D2000016138000008062 -:1007000062802FB60000161302010080823A80BC7E -:100710000000161306010080923A80BC0090161368 -:1007200004010080A20D80B000001613120100BC6D -:1007300008C021B200000000000000D40200003216 -:1007400002A0000000000000A90D80320000161376 -:100750001200005402A438B2000200800000002CF5 -:100760000800373218003600000000F8730A03F959 -:100770000000000000080004088072320000A2009F -:100780009F00005C080072B28300A100800100801D -:1007900082CD85B00000B6000000002CD8C1829444 -:1007A0000000B6000000002C88C1829400001613DF -:1007B00006010080827D80BC000FAC000401008037 -:1007C00082CD85B00000AC00800000803281FCB694 -:1007D0000000161312000068020580B0000000003F -:1007E0000000006C1FC0F63A00000000000000FC92 -:1007F000020001320000AA00040100DC43603DB3A6 -:100800000000F603000000FC020000921800000047 -:10081000000000F8738A0339A7003600000000C00A -:10082000020036920000AE0080010080F2C085B662 -:100830000000BE000000002C98C182941000C3008C -:1008400087000000792116B80000C30080010078FD -:10085000390090B08300C3008700007889CD85B04F -:100860000000B30080000080028097B60000B60050 -:100870000000002C88C182940000B5008000008038 -:1008800022C185B60000B6000000002CD8C18294B9 -:100890000000C3000000002C98C182940000BC003E -:1008A00080010080D2C182B60000C30080010080B8 -:1008B0007280FCB600000000001800A8423D7230B3 -:1008C00000000000541809FEF2C07C300000EA006D -:1008D00080010080F2C185B60000C50000000080E4 -:1008E00002000090000016138001008082C182B6D1 -:1008F0000000B800800000808280FCB60900C300C0 -:10090000040000B428BF17B88300C500870000ACFE -:1009100088CD85B00000C30004000080D2E28AB018 -:1009200000000000001800A8423D72300000C50021 -:10093000541809FEF2C07C9000000000540000FC36 -:100940000200003200000000001800200700003202 -:100950008000802000000080C2CD85300000DA00D9 -:100960000B000080020000B01800000000000078BA -:1009700079A116382000EA0004000080828D97BC1F -:100980000000D100800100806280FCB68300D100AD -:100990008700007889CD85B00000CD008000008000 -:1009A000028097B60000D10080010080128097B6C7 -:1009B0000000D1008001008072C185B610000000E7 -:1009C00000000078796116380000D800040100802A -:1009D000328097BC0000EA000000002CB8C182946D -:1009E0000000D800800100805280FCB60000D800D2 -:1009F0008000008072C185B60000D80080010080B0 -:100A000002C185B60000D80080010080D2C185B641 -:100A1000180000000000007879E116380000D800C6 -:100A200004010080328097BC0000EA000000002C26 -:100A3000C8C18294000000000000000408000432D5 -:100A40000000EA000000002CA8C182940800000009 -:100A500000000078792117380000EA0004000080C7 -:100A6000328097BC0000EA0004010080228097BC1D -:100A70001F0000000012000889CD72300500000040 -:100A800000120000B9DC173800000000000000A8C8 -:100A9000220090370000EA008000868022247CB685 -:100AA00000000000000000780905803000001613E7 -:100AB0000201008082BA97BC000016130601008074 -:100AC00092BA97BC0000161312000068020580B0AD -:100AD00000000000000000FC020001320000E800FD -:100AE000040100DC43603DB30000F603000000FC9D -:100AF0000200009218000000000000F8738A033919 -:100B0000E5003600000000C002003692020000003E -:100B100000000010090036320000801200000014AE -:100B2000090080D20000F10012010060084023B2E9 -:100B30003200000000000010090036320000801270 -:100B400000000014090080D20082000000000008AC -:100B5000088036320000E100000000641F40F69A71 -:100B60000000161312000024080023B20000161320 -:100B70001200002008C023B2000016131200001853 -:100B8000088023B200000000000000FC02000132D7 -:100B90000000F800040000DC43603DB318000000D2 -:100BA000000000F8738A0339F4003600000000C02A -:100BB0000200369200000000000000FC02008532B6 -:100BC00000000000000000D8028001320000000098 -:100BD000000000D00200003200C007011801000C24 -:100BE000A8CD3EB20000F80012000038028081B2A9 -:100BF000000000000000003C020082320000000003 -:100C0000000000300240823200000000000000348A -:100C10000200863220800000000000080880363282 -:100C2000000000000000005C1FC0F53A000000005A -:100C300000000078090580300000161302010080D2 -:100C400082BA97BC000016130601008092BA97BCC6 -:100C50000000F60312010068020580B000001613C0 -:100C600000000080020000900000000000180078E2 -:100C70000900723200230A0104010080A2CD82B073 -:100C800000000B0100000000090000920000161394 -:100C90009F16000029C172BC00000000001800006F -:100CA000078081320000000000200000070082322F -:100CB00000000000002800000780973210000000AC -:100CC00000300000172090390000000000380000BC -:100CD00007C0823200000000000000D8020000328D -:100CE00000000000000000000740803200001401F6 -:100CF00080010080A2C182B600001501000800003A -:100D000057008097050000000008000007A0043984 -:100D10000000161304100000074082B2000000001B -:100D20000018000007008632000016131200005061 -:100D3000F2C138B418003600000000F8730A03F955 -:100D40000000161312000068020580B000000000C9 -:100D500000000078090580300000161302010080B1 -:100D600082BA97BC000016130601008092BA97BCA5 -:100D7000000016131200004802C080B20000F60303 -:100D8000CA010008E8818094000000000000008093 -:100D9000024590300000161304010080120028BCA8 -:100DA00000001613120100BC08C021B208000000A8 -:100DB000000000F89340013910000000540000FCCE -:100DC000824D9036000016130200008042C02FBCF6 -:100DD00000002501F00100D8020000B20000000070 -:100DE000620401A802C06E3200000000000401008D -:100DF00059C06E37000000000004017819C06E3A37 -:100E0000000000004E0401EC06BD97300000000019 -:100E1000E00000F41E40EF3A0000161304190B82A4 -:100E200002C07CBC0000000000180BCE074000325E -:100E30000000000000000000074009320000161307 -:100E400004010080020036BC000000000008000021 -:100E500077C029370000161304100000173D90BA20 -:100E600000000000001800000780F4320000161394 -:100E700012000040F2C138B40B0000000000001066 -:100E8000090036320000801200000014098083D26D -:100E900000000000000000FC32C02F300000000005 -:100EA0000000001008803D3218003600000000F8F5 -:100EB000730A03F900000000000000D402000032B1 -:100EC000000016130401008002802DBC0000CE013A -:100ED0008038008022C072B600003E01120000C8B7 -:100EE000020020B2000045011201005C088020B21F -:100EF000000016131200006002802CB218000000DF -:100F0000000000F8738A03393B013600000000C07E -:100F10000200369200000000000000F81F80FF3A37 -:100F200000000000000000FC320085300000A3013A -:100F30000400008042603DB318000000000000F88B -:100F4000738A033941013600000000C00200369266 -:100F5000080000000000000088CD85370000000078 -:100F60000000002008007232000000000008002489 -:100F700008007232000016130410006C080072B2F0 -:100F8000000000000018004C080072320000161328 -:100F900004200018080072B2000000000030002891 -:100FA00008007232000016130200008082BD82BC6D -:100FB000000000000028003008007232000000002D -:100FC00000000060088082320000560106000080A8 -:100FD00062A082BC000016139F3C0014288072BCE3 -:100FE00000000000000000000700063207000000BB -:100FF00000080000774A09390000161304100000A9 -:10100000070082B200000000CA19000007408232C7 -:101010000000161312000040F2C138B400000000B6 -:10102000000000D80240003200007D010438007842 -:10103000D9C572B000005A0180010080028097B6C5 -:1010400000000000000000F882802F3400005C01E6 -:1010500080010080128097B600000000000000F8B8 -:1010600092802F34000016130401008002402DBC32 -:10107000040000000038003CB81C173800000000D5 -:101080000000003C28C0833700000000003A002C1C -:1010900008C07232000000000000001CB8E0833A73 -:1010A00000000000CB2900200700003200007C0176 -:1010B0000400008002C081BC000000000000003479 -:1010C00078A0813E000000000000001CD8E0813CB8 -:1010D00000006A01063A0080B25C83BC0000000098 -:1010E000003A000089C17237070069012B01000432 -:1010F000790A04B900000000CB00000419419034C3 -:1011000000006D01003A002C070000920000000072 -:10111000003A002CD7E0723C000000000000000004 -:101120000900003200000000000000040900003245 -:10113000000000000000000007648332000000008F -:1011400000080000070080320000161304100000A1 -:1011500007C086B2000000000018000007C08432FB -:1011600000008C0104000028D8A082BC00001613E7 -:1011700009010080020000B0000000000000000033 -:10118000D820803A000077010400008072802DBCD6 -:10119000000016131200004412E438B20000780177 -:1011A000000000D812802D9A000075120000000483 -:1011B000F94190F400007A0104000018D8A081BC25 -:1011C000000062010000006CD8E0869A0000201246 -:1011D0000000004408802DF2000062010000003091 -:1011E0000800009200000000CB1900200700003228 -:1011F00007007F012B010004790A02B900000000FA -:10120000CB00000419419034000000004D000000A4 -:10121000A7A0813E00000000000800000700803207 -:10122000000016130410000007C086B20000000082 -:101230000018000007C0843200008C010400002860 -:10124000D8A082BC0000161304010080626083BC39 -:101250000000000000000000D820803A0000890152 -:101260000400008072802DBC0000161312000044A0 -:1012700012E438B200008A01000000D812802D9AD2 -:101280000000751200000004F94190F400002012E3 -:101290000000004408802DF200007D0100000030B5 -:1012A000080000920000161380000080A2802FB674 -:1012B0000000000000000004F94190340000161303 -:1012C0001200004412E438B218003600000000F8A2 -:1012D000730A03F9000016130400008002802DBC7D -:1012E00000000000001800040980733200000000B4 -:1012F000002800088980733700000000000000808B -:1013000007008632410000000006008C07003632DC -:10131000000098012908008007C085B200009B01E9 -:101320002810008C070000B200009C01001200840D -:1013300007000092000000000010008CF7E0823AE5 -:1013400000009B0128180080074090B200009C011B -:1013500000120084070000920000000000120084C8 -:1013600027E4823200000000000000783900853058 -:101370000000161304010080F28B97BC0000A1014D -:101380000400008042603DB318000000000000F837 -:10139000738A03399C013600000000C002003692B7 -:1013A00000000000000000FC02008532000016135F -:1013B0001200005C52812CB400000000000000D834 -:1013C00002800132000000000000008002003B3279 -:1013D0000840A501F0010008088036B200000000B6 -:1013E0000004013808C06E3200000000E00000F484 -:1013F0001E40EF3C0000AC010B01008C080000B265 -:101400000000A901F2010080020000B0000000000D -:10141000000000F00E003A320000BE01E200008041 -:101420000E8083920000AC01F2010078C93B3ABC07 -:101430000000B60102010080828097BC000000001D -:10144000000000A80200E8320000B10104000080A2 -:1014500022A22ABC0000B50104190B8202C07CBC88 -:10146000000000000000008C18C0883A0000000056 -:10147000000000A812802A3A00000000000000A826 -:1014800002BD2A300000AF0104010080E2A02ABCA6 -:101490000000BB010200008082C088BC0000000088 -:1014A000E20000080800003200000000000000A870 -:1014B000028088320000161304190B8212C07CBC13 -:1014C0000000000000180BCE070000320000F603F9 -:1014D000000000DC03000092000000000000003863 -:1014E00008802A3200000000000000F00E003A32AE -:1014F00000000000E20000800E802A3200000000A0 -:10150000000000A8028088320000161304190B8224 -:1015100012C07CBC0000000000180BCE0700003297 -:1015200000000000000000DC030000320000161381 -:1015300004000080227AE8BA0000000000000000E9 -:1015400007808332000000000000000079C02937C6 -:101550006020000000000000890D903A00000000AB -:10156000CA0100D812802D3A0000000000000000DF -:101570000700013200000000000800000700903260 -:1015800000000000001000000740E83200000000EA -:10159000001800000780E83200000000000000FC96 -:1015A000020000320000F60312010048F2C138B414 -:1015B00000001613000000800200009000001613C7 -:1015C0000401008002402DBC0000161304010080BD -:1015D00002802DBC000016138000008072802FB6A0 -:1015E0000000000000300078088072320400000023 -:1015F00000380054A85C16380B0000000038002C9E -:10160000A8DC1638140000000000001C884D853A44 -:101610002200000000000010090036321000801285 -:1016200000380014A99C87D90000000000000020A9 -:101630000800723200000000000800240800723226 -:10164000000000000010006C080072320000000072 -:101650000018004C08007232000016130420001815 -:10166000080072B20000000000280030080072324A -:10167000000016139F3C0014188072BC0000E501A6 -:1016800004000080024081BC000000000000001443 -:101690001840813C000000000000000007000632F6 -:1016A0000700000000080000774A093900001613FF -:1016B00004100000070082B200000000CA190000F8 -:1016C000074082320000161312000040F2C138B405 -:1016D00000000000000000D80240003200000000BE -:1016E0000000006478C02937021000000000006488 -:1016F000884D863A0000000000000080080000329B -:10170000000000000000004008000032000000005F -:101710004D00000077A0813E00000000000800009E -:1017200007408632000016130410000007C086B27E -:10173000000000000018000007C084320000000212 -:101740000400001CD8E081BC0000161309010080D1 -:10175000020000B00000000000000064D860863A7B -:101760000000F4010400008072802DBC00001613FC -:101770001200004002C038B20000FC01000000D896 -:1017800012802D9A0000161312000040F2C138B4E6 -:1017900018003600000000F8730A03F90000FA018F -:1017A0000401008002802DBC00001613800100801F -:1017B000A2802FB60000F501670000F8A2802FB5C7 -:1017C00000001613120000E802C021B20000161338 -:1017D0000401008072802DBC00000000000000D8D1 -:1017E000024000320000FE0104000018D8A081BCB5 -:1017F0000000EA010000006CD8E0869A0000C910E1 -:101800000000004408802DF20000EA0100000030D2 -:10181000080000920000161312000040F2C138B414 -:1018200018003600000000F8730A03F900000602F1 -:101830000401008002802DBC00001613800100808E -:10184000A2802FB600000102670000F8A2802FB529 -:1018500000001613120000E802C021B200001202BC -:1018600004010080020084BC00000000000000D4DD -:101870000240003200000000000000A42240853A2F -:10188000040000000018004088CD743600000000FD -:10189000000000402800843700000000000000D451 -:1018A00002000032140012020400001C880D84BCE7 -:1018B0000000161309010080020000B000000000C3 -:1018C000000000780961853A800016130601008047 -:1018D000828D97BC0000000000000064D860863A4A -:1018E0000000FC01000000D8024000920000140239 -:1018F00004000018D8A081BC000016020000006C93 -:10190000D8E0869A0000C9100000004408802DF23B -:10191000000000000000003008000032000000005D -:10192000000000D40240003200000000000000A4CB -:1019300022C0823A000000000000003CB860853CF4 -:1019400004001C028100006088CD74B60000000015 -:1019500000040028F8A0753C00001D020008007477 -:10196000088075920000000000080028F8A0753C6F -:10197000000000000000002808A1823C00000000D8 -:10198000000000A4F2602A3A0000000000080048AD -:1019900008007532000000000020007C08807532CD -:1019A00009002302041A007088CD74B009000000F9 -:1019B000001A004C87CD74317F00000000000064E5 -:1019C000884D863100000000000000642840863AFF -:1019D00023000000000000100900363200008012D1 -:1019E00000000014098082D20C00000000000010EA -:1019F000090036320000801200000014098084D2F1 -:101A000000000000000000D802400032000000008A -:101A1000001000000740863200000000000000D8DF -:101A20000280003200000000001000005761863A7A -:101A300000003002120000C8020020B20000330291 -:101A40001201005C088020B2000016131200006032 -:101A500002802CB2000040012A0100D4020000B232 -:101A600018003600CA0000F8730A03F900004101AB -:101A7000000000F81F80FF9A00000000000000D462 -:101A800002400032080000000000000088CD8537C9 -:101A9000000000000000001CE8A1823E00000000E1 -:101AA000000000A42240853A000000000008005019 -:101AB0000780843200003A020401008072A082BCD8 -:101AC00000000000001A004CC7E174320000000062 -:101AD0000000006808E1813A00003D0290010078B2 -:101AE000F9A186BA00000000000000781980973A3A -:101AF000000000000020005807809732000000001E -:101B0000000000D802800032000000000000000049 -:101B10000700843200000000400800005721803A8E -:101B2000000041021200004CF2C138B40000000075 -:101B3000000000000821803A0000000000000004BE -:101B400008C0813200000000510000D802C00032FD -:101B500000000000000000D402000032000000007D -:101B6000CB1900200700003200001613020100808C -:101B700032802DBC07004A022B010084780A02B98A -:101B800000000000CB0000841841883400000000F1 -:101B90004D00000077A0813E00000000000800001A -:101BA00007008032000016130410000007C086B240 -:101BB000000000000018000007C084320000161367 -:101BC0009F000028D8A082BC000068020400001C0E -:101BD000D8E081BC0000161304010080626083BC61 -:101BE000000059022D000000D82080BA00005402E5 -:101BF000120100E802C021B218003600000000F80F -:101C0000730A03F9000056020401008022802DBCF3 -:101C100000005902CD0100D8024084920000161342 -:101C20000401008002802DBC00001613800100809A -:101C3000A2802FB600005302000000F8A2802F956A -:101C400000005C020400008072802DBC00001613AE -:101C50001200004412E238B200006602000000D810 -:101C600012802D9A0000000000000084F8418834A2 -:101C7000000016131200004412E238B218003600B9 -:101C8000000000F8730A03F90000640206010080F6 -:101C900022802DBC000016130401008002802DBCA0 -:101CA0000000161380010080A2802FB600005E02A3 -:101CB000670000F8A2802FB500005F02000000E876 -:101CC00002C02192000016130401008072802DBC16 -:101CD00000000000000000D802C000320000C9105F -:101CE0000000004408802DF2000047020000003090 -:101CF000080000920000700280000080D2802FB6A1 -:101D000000006B02120100E802C021B21800360088 -:101D1000000000F8730A03F900006D02040100805E -:101D200022802DBC00007002000000D80240849286 -:101D3000000016130401008002802DBC0000161361 -:101D400080010080A2802FB600006A02000000F827 -:101D5000A2802F9500000000CD000084F841883457 -:101D6000000016131200004412E238B20000000016 -:101D7000000000D40240003200000000000000A477 -:101D800022C0823A0000790204010080420086BC31 -:101D90000000000000080058074087320000780269 -:101DA0008F010074184087BA000000000000007422 -:101DB0000800003200007B0200040058F7A0869A59 -:101DC0000000000000000078F9A0863A280000001A -:101DD00000080058878D973C00000000000000D8E4 -:101DE000024000321800000000000000B760853992 -:101DF000080000000008000087CD853700007E0243 -:101E00001200004CF2C138B400000000000000488D -:101E100018A0843A00000000000000D40200003244 -:101E2000000000000000008057A1863A4100000039 -:101E30000006008C07003632000000000008008019 -:101E400007C08532000000000010008C074085327A -:101E500000000000000000D80280003200001613CD -:101E600004000058088071B20000000000000080EB -:101E70000880003218003600000000F8730A03F9E9 -:101E800000008C020401008002802DBC00001613AB -:101E900080010080A2802FB600008802000000F8B8 -:101EA000A2802F950000880204010080180088BCE1 -:101EB00000008F0290190058E89C85BA00000000CD -:101EC000000000581880853A0000000000180080CB -:101ED000078585300000940204010080420086BC22 -:101EE00000000000000000D80240003200000000A6 -:101EF00000000008898071370000950200120084FC -:101F000027E48292000000000012008407000032E3 -:101F100000009902270000FC020085B2000099022F -:101F20000400008042603DB318000000000000F88B -:101F3000738A033995023600000000C00200369211 -:101F4000000016131200005C52812CB400009D02A8 -:101F500004010080028082BC000016138000008013 -:101F6000A2802FB60000A301000000D4020000925E -:101F70000000A00204010018D8A081BC0000C91014 -:101F80000000004408802DF200002D02C70100303F -:101F90000800009200002D02C701006CD8E0869A6C -:101FA00008000000C60100F8934001391900000044 -:101FB00000000010090036320000801200000014FA -:101FC000094081D200000000000000140845813063 -:101FD00000001613120100BC08C021B20000161345 -:101FE00080000080A2802FB60000F6038001808070 -:101FF000320B6AB600006A100000003C030038F2A1 -:102000000000AC020406018002C06EBC0000161382 -:10201000870601EC56E06EBA0000F3030000008072 -:102020000200009000001613870601EC56E06EBA1D -:1020300000000000000000F842802F3408C0161392 -:1020400012000040A2CD39B218003600000000F89E -:10205000730A03F90000161303B8000009C06EBD2F -:10206000B202000000000088820D903A2F005E0648 -:102070000000001C080036920000161300000080CB -:10208000020000902C005E060000001C0800369242 -:1020900000001613000000800200009000001613DC -:1020A0000000008002000090000016130000008075 -:1020B0000200009038005E060000001C0800369206 -:1020C00039005E060000001C08003692080000007F -:1020D000000000F89340013900001613120100BC03 -:1020E00008C021B20000161380000080A2802FB625 -:1020F0000000161380008080320B6AB600006A1060 -:102100000000003C030038F20000C102040000801F -:10211000524082BC0000161304010080624082BC61 -:10212000000016130405018002C06EBC0000000010 -:10213000000000F842802F3408C01613120000403F -:10214000A2CD39B218003600000000F8730A03F976 -:10215000000000000004017809C06E320000000099 -:10216000006201EC068097320900000000000010B8 -:1021700009003632000080120004011409C06ED23A -:102180000200CB0204B8008082CD6EBC080016139A -:1021900004B9008082CD6EBC00000000000601EC96 -:1021A000064000320000CC02B50000D8020000B2A8 -:1021B00000000000A50080A0360B6A34000000007B -:1021C000003002E806C02C320000000000000000D1 -:1021D000078000320000000000000078A9002D37C1 -:1021E0001805010000080000C78D973A00000000A4 -:1021F0000000007899C02C3718010000000000781A -:10220000898D973A000016130210000087BF97BA15 -:1022100000000000001800000740FE320000161306 -:1022200012000048F2C138B418003600000000F86F -:10223000730A03F900000000001801E006000032F4 -:1022400000000000000000F882852F3000006806C2 -:102250000000001C0800369208000000000000F892 -:102260009340013900001613120100BC08C021B2CE -:102270000000161380000080A2802FB660001613A5 -:10228000040100F8828D2FB007000000000000104C -:10229000090036320000801200000014094081D28B -:1022A0000000E50280008080320B6AB61700000053 -:1022B00000000010090036320000801200380014BF -:1022C00009C06ED20000F6030000008002000090FA -:1022D00000006A1000000038030038F20000E80235 -:1022E0000402018002C06EBC0000F303000201EC96 -:1022F00056E06E9A00000000C00301EC56E06E3A12 -:10230000000016138001008002802FB600C0161353 -:1023100012000040A28D39B218003600000000F80B -:10232000730A03F9200016130439008082CD6EBCB5 -:102330001200000000000010090036320000801278 -:102340000030001409006ED21500000000000010DB -:1023500009003632180000000002011489CD6E37E2 -:102360000000801200200114895B91D21B00F4024E -:1023700038010010090036B200008012003001144C -:1023800009006ED21800000000000010090036326B -:102390000800000000000014790B143810008012AF -:1023A00000500114A95B91D90000F902042801141E -:1023B00009006EB21C00801200000010090036D225 -:1023C000000005033828001809006EB20000FD0265 -:1023D0000421010869246EBC000016130901008065 -:1023E000020000B0030068060000001C08003692DE -:1023F0000000010302300080829B90BC00000003BB -:102400000603018012C06EBC040068060000001CB8 -:1024100008003692050068060000001C080036928D -:10242000000016130430008002006EB200000403A6 -:102430000603018012C06EBC0B0068060000001C81 -:10244000080036920C0068060000001C0800369256 -:10245000000008030421010869246EBC0000161363 -:1024600009010080020000B0030068060000001CA3 -:102470000800369200000C0302300080829B90BC62 -:1024800000000B030603018012C06EBC0400680646 -:102490000000001C08003692050068060000001CC1 -:1024A0000800369200000E039F31010C69246EBCB7 -:1024B000000000000000000C0900003200001203C0 -:1024C00004310004899B90BC0000110306030180C5 -:1024D00012C06EBC200068060000001C0800369286 -:1024E000210068060000001C080036920000161348 -:1024F0009F000080024090B200001503040201809A -:1025000012C06EBC220068060000001C0800369253 -:10251000000017030401000039A490BC23006806E2 -:102520000000001C08003692000016139F00008077 -:10253000020090B2240068060000001C08003692D9 -:10254000080016130C0000F8634001B910001D03C9 -:10255000C50100CC02201598080091030C0000F87A -:10256000434001B910000000C50100CC022015381D -:102570000000000000000010090036320000801248 -:1025800000000014090080D200001613120100BCE4 -:1025900008C021B200006A100000003C030038F2BD -:1025A000000000000000005C0805803000001613E9 -:1025B0000401008002402DBC0000161302010080BF -:1025C00082FA85BC000016130601008092FA85BCD1 -:1025D0000000270336010080020000B00F006806EB -:1025E0000000001C0800369210000000002C0200C1 -:1025F000A9DB8539000016131200005402A438B27A -:10260000000000000008028C08C06E3200000000CC -:10261000000C029828806E37000000000000009C2B -:1026200038221437000032030430002808006EB24C -:10263000000016130410006C08006EB200000000C9 -:102640000018004C08006E32000016130420001819 -:1026500008006EB200000000003C001408806E32DA -:10266000050035030038020078E16E990000000093 -:10267000510000D80200003200000000003802784B -:1026800009C06E32050000006808000077A1973984 -:10269000000037031201000009C021B21800360003 -:1026A000000000F8730A03F900000000545401FC14 -:1026B00002C06E3214103B0304000080A20D72B001 -:1026C0000000F3110000002809C002F20E006806A5 -:1026D0000000001C08003692000016130609008056 -:1026E00082BD72BC00004F03331500A402C072B259 -:1026F00000008C0380010080B20172B60101420328 -:1027000004290080828D74BC080A8C03042D00808B -:10271000828D74BC000000000030007C080075321F -:1027200000004903003800881800759C080A8C03D3 -:1027300004290080828D74BC10000000002C007CF5 -:10274000888D7537000000000030007C68DD87321E -:10275000000048039F390088188075BC10000000F5 -:1027600000340088888D7537000049030000008818 -:102770001880889C1000000000340088689D88390B -:1027800037000000000000100900363200008012FF -:102790000000001409C087D23B00000000000010B8 -:1027A000090036320000801200000014098088D22F -:1027B000000050039FF1018082DB87BC00008C0386 -:1027C000000000800200009000008C038000008068 -:1027D000B20172B60000000000080048080075321F -:1027E00000000000001000700800753200000000BA -:1027F000001C007438A2753700005503831B007855 -:1028000008C074B200000000000000F8C2802F343D -:102810002F00000000000010090036320000801276 -:1028200000000014098084D2340000000000001071 -:10283000090036320000801200000014090087D21F -:1028400000006B039F780180C2216EBC00005D0315 -:102850009F990164881B87BC00006C039F6801641A -:10286000885B86BA000000000000006408000032A7 -:1028700000000000001600A402C072320000000038 -:10288000003C02A4B25B2A3A00000000003A027841 -:1028900009C06E3200006D0308010004E8A575BC94 -:1028A0003F000000000000100900363210008012C6 -:1028B00000040014695D80D910008C030B01001C1A -:1028C000080036B200006B0304A10180829B84BC27 -:1028D000000068069F980180C2216EBC0000680657 -:1028E00006B10180825B87BC00008B030B01008076 -:1028F000020000B000006C0304990180C2216EBC8C -:102900000000890302D4018092FB6EBC16006806A9 -:102910000000001C08003692170068060000001C2A -:10292000080036921C0068060000001C0800369261 -:102930003F00000000000010090036321000801235 -:1029400000040014695D80D90000710304A10180B6 -:10295000829B84BC0000780306A80180825B80BC57 -:102960000000750304A9018002006EBC00008A0308 -:1029700004A10180829B84BC00008A0304010080C2 -:10298000124080BC140068060000001C080036924B -:1029900000008A039FA0017829216EBC00008A03F1 -:1029A0000201008012A097BC00006B0300000080B1 -:1029B000020000900000850304000080028082BCB9 -:1029C000000016130402018002C06EBC00007E03EA -:1029D00002000080A26080BC060068062C01001C7A -:1029E000080036B200C0820304010080A28D2FB01F -:1029F000060068060000001C0800369200008203F2 -:102A000004000080A26080BC0000810306030180F6 -:102A100012C06EBC090068060000001C0800369257 -:102A20000A0068060000001C0800369200008403BB -:102A30000603018012C06EBC070068060000001C7F -:102A400008003692080068060000001C0800369254 -:102A5000020068063801001C080036B20000880336 -:102A6000020C0280A25B80BC1F0068060000001CF4 -:102A7000080036921E0068060000001C080036920E -:102A800000008D03000000280940009200008D0323 -:102A9000000000280980009200008D03000000283B -:102AA00009C0009200008D03000000280900019277 -:102AB00030000000000000100900363200008012D3 -:102AC00000000014098092D20E00F3110000001CD7 -:102AD000080036F200006806000000800200009046 -:102AE000100016132A0000CC022015B80D000000BB -:102AF00000000010090036320000801200000014AF -:102B0000090080D200001613120100BC08C021B2D7 -:102B100000006A100000003C030038F21D00990319 -:102B20008001007809E000B800001613040100805D -:102B3000328097BC1D0068060000001C0800369219 -:102B40000000161304010080228097BC150068065F -:102B50000000001C08003692000000000000001C6D -:102B6000A8052830000016130400008002C02CBC09 -:102B700000001613120100BC08C021B20000161399 -:102B800080000080A2802FB660001613040100F8B8 -:102B9000828D2FB008000000000000F8834001394A -:102BA0003600A4030400008082CD81BC0500000033 -:102BB00000000010090036320000801200000014EE -:102BC00009C081D20000020480018080320B6AB605 -:102BD00000006A1000000038030038F22C0068067C -:102BE0000201008082CD81BC00005E0600000080F2 -:102BF0000200009000001613120100BC08C021B2B0 -:102C00000000AB031D41025CF80168B44100F3030E -:102C1000000000F8A28D2F91350000000000001088 -:102C200009003632000080120000001409C085D26D -:102C300010000000D02C0200A9DB85390000290318 -:102C40001201005402A438B20000161300000080E4 -:102C5000020000900000B40304B0008002006EBCCB -:102C60000000B40380B9008082806EB600000013BB -:102C70000078016008006EF230005E06D700001C8C -:102C8000080036920000B60380010080D2812FB682 -:102C900031005E06D700001C080036920000B80321 -:102CA0008001008042812FB635005E06D700001CEF -:102CB000080036920000C50304A8010809006EB29E -:102CC0000000000000200208899B903E00000000E8 -:102CD00000A00108899B903A0000C5039F88010865 -:102CE000899B90BC000000000034020009C06E3DCA -:102CF00000000000000C020409A46E370000C103AC -:102D00000200008012A490BC000000000000000837 -:102D1000198090370000C50302010280829B90BC9D -:102D200031005E06D700001C080036920000C50383 -:102D300004B0008002006EBC0012C50304010080D4 -:102D4000A28D2FB032005E06D700001C080036921C -:102D50000000F303000000F872812F9500000000CE -:102D6000000000F842802F3408C0AF02120100407A -:102D7000A2CD39B2000016130000008002000090BE -:102D800008000000000000F893400139080000002E -:102D9000000000100900363200008012000000140C -:102DA00009C081D2000016130400008002C02CBCB0 -:102DB0000000161380000080A2802FB6600016135A -:102DC000040100F8828D2FB0000002048001808091 -:102DD000320B6AB600000000000000140840903278 -:102DE00000006A1000000038030038F22C0068066A -:102DF0000201008082CD81BC00005E0600000080E0 -:102E00000200009008000000000000F89340013923 -:102E10000800000000000010090036321000801287 -:102E200000000014894D81D70000161304000080B3 -:102E300002C02CBC0000161380000080A2802FB6B8 -:102E400060001613040100F8828D2FB00000020408 -:102E500080018080320B6AB600006A1000000038E2 -:102E6000030038F20000DF030420018052206EBC12 -:102E70000000161309010080020000B02600680659 -:102E80000000001C08003692250068060000001CA7 -:102E9000080036920000E503040100D81E80EDBC56 -:102EA0000000E103B70000D80EC0EDB20000E4035B -:102EB00004010080423BEEBC00000000000000E086 -:102EC0001E00EE3A00000000A70000D00E00EE3217 -:102ED00000000000007486CC02806C32000000000C -:102EE000000000000940E7320000E9038001808013 -:102EF000320B6AB6360016131200002C82CD2EB2A9 -:102F00000000EB030401008042C52CBC0000EC0370 -:102F1000000000CC0200009200000000000000CC85 -:102F200012C02C3A0000E70304010000190090BC15 -:102F300000000000007486C806C02C32080002049D -:102F4000000000F8C34001990000F1030400008074 -:102F5000028080BC0000161304550180B2DB2FBC38 -:102F6000000054100000002C090000F20000F603DD -:102F700000000080020000900000F50304000080C3 -:102F8000028080BC0000161304550180B2DB2FBC08 -:102F9000000054100000002CF90100F40000FF03B1 -:102FA00004000028098080B200000000000000D862 -:102FB000020000320000811100000008080000D269 -:102FC0000000FF0304000080028092BC180036005D -:102FD000000000F8730A03F9000002048001008079 -:102FE000A2802FB6000002041201000009C021B225 -:102FF00018000000000000F8730A033902043600CC -:10300000000000C00200369200000204800100802F -:10301000A2802FB6000002041201000009C021B2F4 -:1030200018003600000000F8730A03F900000000E1 -:10303000000000F80200003218003600000000F81E -:10304000738A029910000000000000E40300363289 -:1030500002000001000000E0030037320000000021 -:10306000000000E40300363204000001000000E02C -:1030700003003732AA040000000000E403003632E7 -:1030800009000001000000E00300373200000000EA -:10309000000000CC0F00003200070000000000E438 -:1030A0000300363206000001000000E00300373262 -:1030B00020000000000000E4030036320800000198 -:1030C000000000E00300373200010000000000E4CF -:1030D0000300363205000001000000E00300373233 -:1030E00030000000000000E4030036320700000159 -:1030F000000000E00300373200A00000000000E400 -:103100000300363208000008000000E003003732F8 -:1031100000000000000000A00200003200000000DB -:10312000000000000B000032000016048B0100A01C -:1031300012002ABA00000000000000A802000032BD -:1031400000000000000000E0070000320000190449 -:103150000601008002802ABC000000000000009CE4 -:103160000200003200000000000000D40200003223 -:1031700000000000000000CC02000032000000004F -:10318000000000D80200003200000000000000D063 -:103190000200003200000000000000DC02000032EB -:1031A00000000000000000F80200003200000000F3 -:1031B000000000C80200003200000000000000C44F -:1031C0000200003200001C048501009C12C029BAD4 -:1031D00000000000000000E4030036320B00000491 -:1031E000000000E00300373280000000000000E42F -:1031F0000300363213000004000000E00300373201 -:1032000000200000000000E4030036320C0000043F -:10321000000000E00300373200000000000000E47E -:10322000030006320F000004000000E00300373204 -:1032300000040100000000E4030037320D00000428 -:10324000000000E00300373200040000000000E44A -:103250000300363214000004000000E0030037329F -:103260009F000000000000E4030036321500000457 -:10327000000000E00300373200000000000000E41E -:103280000300363218000004000000E0030037326B -:1032900060000000000000E4030036321D0000045E -:1032A000000000E00300373200000000000000E4EE -:1032B000030004321E000004000000E00300373267 -:1032C00070000000000000E4030036321F0000041C -:1032D000000000E00300373200000000000000E4BE -:1032E0000300003220000004000000E00300373239 -:1032F000A0030000000000E40300363217000004C1 -:10330000000000E00300373240000000000000E44D -:10331000030036321B000004000000E003003732D7 -:1033200060000000000000E4030036321C000004CE -:10333000000000E00300373200000000000000E45D -:103340000340003216000004000000E003003732A2 -:1033500000010000000000E4030036321A000004FF -:10336000000000E00300373220010000000000E40C -:103370000300363219000004000000E00300373279 -:1033800080000000000000E4030036320B00000162 -:10339000000000E00300373200010000000000E4FC -:1033A000030036320C000001000000E00300373259 -:1033B000FEFF0000000000AC0200363200000000FA -:1033C000000000000900003218000000000000F8B2 -:1033D0000364023900004F0485010000190090BA0F -:1033E00025260000000000E4030036320100000141 -:1033F000000000E003003732000000000000008001 -:103400000F00003200000000000000840F000032B6 -:1034100008000000000000F8F34001390800000037 -:10342000000000F8E340013908000000000000F847 -:10343000C340013908000000000000F8B340013922 -:1034400008000000000000F8A34001390800000057 -:10345000000000F89340013908000000000000F867 -:103460008340013908000000000000F87340013972 -:1034700008000000000000F8634001390800000067 -:10348000000000F85340013908000000000000F877 -:103490004340013908000000000000F833400139C2 -:1034A00008000000000000F813400139000000008F -:1034B000000000F80380003200000000000000C897 -:1034C0003F80FC35000000000000009C020000323C -:1034D0000000000000000000030000323E00000079 -:1034E000000000D00200363200000000000000287A -:1034F000034038320000161304010080D20130B6B8 -:1035000000006704040100D012002DBCA0040000DC -:10351000000000E40300363203000001000000E078 -:103520000300373200000000170000D00200003214 -:1035300000000000000000ACE100003400000000CA -:10354000000001E00600003200000000000801E475 -:103550000600003200000000000E01EC0600003200 -:1035600000000000001001E0060000320000000032 -:10357000000000D012002D3A3E006F0402010080CE -:10358000820D2DBC020000000000009CAE0D023236 -:1035900000000000000000A802000032300000001F -:1035A000008886CC0700363200000000008A86CCF6 -:1035B0000700003A002400000000000409803632B1 -:1035C0000000161312000064024090B200000000D8 -:1035D000000000042940903A00007B0412000078AB -:1035E00009C020B20000161380010080F28197B656 -:1035F0001D00161380010078E9E500B80000000006 -:103600000000007809459030000079040201008034 -:10361000C28297BC0000000000000084020000325B -:1036200000000000000000CC030000320000810414 -:103630008E010080024028B20000BD10000000D8BA -:10364000020000D2AA1100000000008C0E003632E9 -:1036500052000000000000740E0036321800000016 -:10366000000000E40300363209000002000000E020 -:1036700003003732FECA0000000000E403003632C7 -:103680000A000002000000E00300373200008C0452 -:1036900012010000094020B200008A0400000080EE -:1036A0000200009000008C0412000004094020B2C7 -:1036B00000008F049F010080020090B200008E0481 -:1036C00012000008094020B202008A0404010078B8 -:1036D000092417B8060000000000007809641638B5 -:1036E00000008A0404010080028197BCFE000000F3 -:1036F0000000004403003632FE003600000000489F -:10370000030036920000161312000000094020B298 -:103710000000950412000004094020B20000980443 -:103720009F010080020090B2000097041200000880 -:10373000094020B200000000000000B402009032F6 -:103740000000161300000080020000900000161315 -:1037500000000080020000900000161300000080AE -:10376000020000900000161300000080020000908C -:1037700000001613000000800200009000001613E5 -:10378000000000800200009000001613000000807E -:10379000020000900600AA040000000C09641698BC -:1037A0000000A10200000014084090920000DB021B -:1037B00000000014084090923400C9030000001C6F -:1037C000080036921200C9030000001C080036925F -:1037D0003A00C9030000001C0800369200001613CE -:1037E00000000080020000900000BA0200000014F7 -:1037F000084090920000DE0400000080020000906B -:103800000000D4030000001408409092AB040000B4 -:103810000000008882CD903A0D00CD04000000FC2D -:1038200002E416980D00DF04000000FC02E4169884 -:103830000D00E804000000FC02E416980000F60405 -:103840000000008002000090000000050000000061 -:103850000940909D000006050000008002000090D5 -:1038600000001005000000800200009000001A0512 -:10387000000000800200009000002405000000000D -:103880000940909D00002B05000000800200009080 -:1038900000003405000000000940909D00003B0539 -:1038A00000000080020000900000AA050000000057 -:1038B000090000920000AA050000000009400092E3 -:1038C0001D07AC05000000A0020036920000BA05FA -:1038D000000000800200009000001613000000802D -:1038E000020000900000DE04000000DC0F40909217 -:1038F00000007E05000000800200009000008305AB -:10390000000000D40200009210009805000000841E -:103910001F6414980000DE04000000EC0E4090923A -:103920000000A40500000080020000900000DE04FA -:10393000000000D40E4090920000A7050000008017 -:103940000200009000004E06000000DC0E40909245 -:103950000000CB0500000080020000900800D005A8 -:10396000000000501F2416980000E805000000D851 -:10397000020000920D00F305000000FC02E416981E -:103980000000F405000000D00200009200001F01BA -:10399000000000D00200009200001513000000801B -:1039A000020000900000161300000080020000904A -:1039B00008000000000000F89340013900000000FA -:1039C00000000078094590300000161306010080C1 -:1039D000228097BC3F00161304010080820D00B0C6 -:1039E0000200D104B00000A0F20B00B900000000FA -:1039F000A00000046B4190340000020480010080AC -:103A00000240B0B600000204040000800280B0BC96 -:103A100000000000000000D802000032000000009A -:103A2000000000A822C02F370000000000000000A6 -:103A3000670100340042000000080000878D2A3A28 -:103A400000001613041000000700B0B200000000D0 -:103A5000001800000700D0320000161312000048C2 -:103A6000F2C138B418000000000000F8730A0339EE -:103A700002043600000000C0020036920800020472 -:103A8000000000F8934001990000E2049F000080CC -:103A9000020090B2000000000000000809409032CF -:103AA000000000000000000409C0FD320200E20432 -:103AB000B00000A0F20B00B9000000000000000000 -:103AC0000B80903200000000000000000D4090329A -:103AD00000000000A00000043B40B0310000DE0404 -:103AE0000400008002C02FBC8411DE040000008CA2 -:103AF0000E003692000016130200008002C12FBC97 -:103B000008000000000000F8934001390200EA04B8 -:103B1000B00000A0F20B00B90000ED0480010080AD -:103B20001240B0B600000000000000043B40B0337B -:103B30000000000000000004FD4BD0350000000034 -:103B4000000000080B00003200000000A000000C84 -:103B50001BE4B032000002040B000080020000B041 -:103B60000000F30404000080024090B21F00020431 -:103B700000000080114000990000F2040400008061 -:103B8000123EF8BA00000000000000800100F83288 -:103B900000000204000000900140F892000016139B -:103BA000800000800281FCB60000FA049F000080C3 -:103BB000020090B2000000000000000809409032AE -:103BC000000000000000000409C0FD3200001613D0 -:103BD00004010080428590B000000000000000E475 -:103BE0000380903209000004000000E00300373237 -:103BF00000000000000000E4034090320A000004CE -:103C0000000000E0030037320000DE04000000C8BE -:103C10000F81FC940000161302010080724290BCD8 -:103C20000000161306010080E24290BC000016134B -:103C300004010078096490B500000000000000E471 -:103C40007300903C10000004000000E003003732D5 -:103C50000000DE0400000080020000900000090562 -:103C60009F000080020090B20000000000000008E9 -:103C700009409032000000000000000409C0FD323D -:103C80000000161304010080428590B0000000007F -:103C9000000000E40380903201000004000000E016 -:103CA0000300373200000000000000E00F80903277 -:103CB00000000000000000E4034090320200000415 -:103CC000000000E0030037320000DE04000000E4E2 -:103CD0000F409092000013059F000080020090B2F8 -:103CE00000000000000000080940903200000000C1 -:103CF0000000000409C0FD3200001613040100801A -:103D0000428590B000000000000000E40380903283 -:103D100003000004000000E0030037320000000050 -:103D2000000000A80E80903200000000000000E4B7 -:103D30000340903204000004000000E0030037322A -:103D40000000DE04000000AC0E40909200001D0553 -:103D50009F000080020090B20000000000000008F8 -:103D600009409032000000000000000409C0FD324C -:103D70000000161304010080428590B0000000008E -:103D8000000000E40380903205000004000000E021 -:103D90000300373200000000000000E403409032CE -:103DA00006000004000000E00300373200000000BD -:103DB000000000440F8090320000DE040000004844 -:103DC0000F4090920000161306010080824290BCC2 -:103DD0000000161304010078096490B5000028055E -:103DE00004010080824290BC00000000000000003E -:103DF0000900003200000000000000E403009032DF -:103E000012000004000000E0030037320000DE046E -:103E1000000000401F40909C00002E059F00008085 -:103E2000020090B20000000000000008094090323B -:103E3000000000000000000409C0FD32000016135D -:103E400004010080428590B000000000000000E402 -:103E50000380903207000004000000E003003732C6 -:103E600000000000000000E403409032080000045D -:103E7000000000E0030037320000DE040000008094 -:103E8000020000900000161306010080824290BCE0 -:103E90000000161304010078096490B5000038058D -:103EA00004010080824290BC00000000000000007D -:103EB0000900003200000000000000E4030090321E -:103EC00011000004000000E0030037320000DE04AF -:103ED000000000FC1F40909C00003E059F000080F9 -:103EE000020090B20000000000000008094090327B -:103EF000000000000000000409C0FD3203090000BA -:103F0000000000280800363200005705000000308D -:103F1000080036D20000610500000044088000D28D -:103F20000000470504010080020084B2030E000077 -:103F300000000028080036328000570500000030DD -:103F4000080036D2000061050000004408C000D21D -:103F50000000470504010080020084B200004E0505 -:103F600000000044080001928002000000000000F0 -:103F7000070036328C0501000008000007003732C8 -:103F80000000161304100000078090B2000000002B -:103F900000180000074090320000000000000048B8 -:103FA000F2C138340000161312000080020000B085 -:103FB00018003600000000F8730A03F92000000022 -:103FC000000000E40300363209000002000000E0B7 -:103FD0000300373200000000000000E40340843298 -:103FE0000A000002000000E0030037328C050100E7 -:103FF000000000A802003732A0000000000000000E -:104000000900363200000000000000E00700003226 -:104010000000540506010000190090BC0000DE04F9 -:1040200000000080020000908C050100000000C824 -:1040300002003732800200000000003C08003632E7 -:1040400000000000000000340800013200005C05A0 -:1040500002000080D2E083BC0000000000000034B9 -:1040600008C083320000720500000080020000F0EA -:1040700000000000000000A0078083320000000064 -:1040800000000030D820833A00005A050401003CAB -:10409000D8E083BC00000000000100800200005056 -:1040A0000000000000000040080000320000000096 -:1040B00000000048080000328C050100000000C824 -:1040C0000200373200020000000000C8828D2C3A46 -:1040D000800000000000003C0800363200000000B4 -:1040E00000000078098078325A5A000004010080EC -:1040F000828D975C00006A0502010048A89E84BA80 -:1041000000000000000000481880843A00006805A4 -:104110000601003C28C083BC0000000000000078BD -:10412000098584301000000000000048888D843626 -:1041300000006F0590010048E8A584BA0000000067 -:10414000000000481880843A000000000000004889 -:104150000885843000000000040100800285845C32 -:104160000000000000010040084000520000000074 -:10417000000000E40300833201000002000000E0C0 -:10418000030037320C0078050000002CD8A082F91B -:1041900005000002000000E00300373200000000CC -:1041A0000000008002000030000000000001003824 -:1041B00008403E7200000000000000E403C08232AC -:1041C00002000002000000E003003732020000029B -:1041D000000000E003003732000000000000008013 -:1041E0000200003000007A0580000080F2403EB6F8 -:1041F0000000000000010080020000700000810546 -:104200009F000080020090B2000000000000000843 -:1042100009409032000000000000000409C0FD3297 -:1042200000000000000000840E8090320000DE04D8 -:10423000000000880E40909208000000000000F886 -:1042400093400139000087059F000080020090B272 -:10425000000000000000000809409032000000004B -:104260000000000409C0FD32000000000000002032 -:104270000740F5320000000000080020070000326F -:10428000000000000010002007C0F5320000000010 -:10429000001800200740F632000000000020002037 -:1042A0000780F632000000000028002007C0F63228 -:1042B00000000000003000200700F732000000007E -:1042C000003800200780FF3200000000000000D806 -:1042D0000200003200000000000000000740093228 -:1042E000000000000008000077C02937000000002F -:1042F000001000000780903200000000001800004D -:10430000074090320000161312000048F2C138B482 -:1043100018003600000000F8730A03F900000000DE -:1043200000000008C80100340000F603000000FC93 -:104330000200009200009A0580010080F24190B6D0 -:1043400000009B05000000C82F81FC9400000000C5 -:10435000000000C82F81FC35000000000000008034 -:104360000F45903000009E0502000080027EF8BCE0 -:1043700000000000000000840F00F8320000000080 -:10438000000000001940F837000000000000008421 -:104390003F40F83700000000000000840F64F83A46 -:1043A00000000000000000001900F83700000000C5 -:1043B000000000803F00F8370000DE0400000080AD -:1043C0000F24F89A0000A60580010080F24190B603 -:1043D0000000DE04000000C83F81FC940000DE0401 -:1043E000000000C83F81FC950000A9050401008081 -:1043F000024090BC000000000000000409C0003230 -:104400000000DE04000000E41E40909C000000005C -:10441000000000A8220090370000DE04000086C0E3 -:104420000740909208000000000000F89340013916 -:104430000D000000000000FC02E41638000000003F -:1044400000000000090002320000B40504000080F2 -:104450000200B0B200000000000000000B000032BB -:1044600020000000000000A0820D2A3A0000AF05E5 -:1044700004010000190090BC0000B60500000028EF -:104480007901009400000000000000C83F80FC3467 -:1044900040800000000000280980363200008111B1 -:1044A000000000D8020000D20000020404000080D6 -:1044B000028092BC18000000000000F8730A033963 -:1044C00002043600000000C002003692EA05C00572 -:1044D00004010080824D90BC00000000000000EC50 -:1044E0000F00153200FE1F00000000F00F003732F1 -:1044F000F0FF0000000000E80F00363298050000D1 -:10450000000000F40F0036320000C605000000C8AD -:104510004F80FC953623161304010080824D90BC19 -:1045200000000000000000EC0F80143200F81F00B3 -:10453000000000F00F003732C0FF0000000000E86C -:104540000F00363298270000000000F40F003632CA -:1045500000000000000000C84F80FC340400000090 -:10456000000000608F4D903A00001613600100803B -:10457000020000B0000016137A010080020000B0B3 -:104580000000421100000080020000D00000DE04A4 -:1045900000000080020000900000CD058001008036 -:1045A000024090B600000000000000C86F80FC349C -:1045B0000000CF0580010080124090B6000000008E -:1045C000000000C85F80FC340000DE0400000080B2 -:1045D000020000900000D20504010080B24190B0BA -:1045E0008007DE04000000C88F8DFC910000D40518 -:1045F00080000080124090B60000D505000000C881 -:104600007F80FC9500000000000000C87F80FC3423 -:104610000000D70580000080024090B60000D80559 -:10462000000000C88F80FC9500000000000000C85A -:104630008F80FC340000DA0580000080424090B694 -:104640000000DB05000000C89F80FC950000000012 -:10465000000000C89F80FC340000DD058000008061 -:10466000324090B60000DE05000000C8AF80FC9527 -:1046700000000000000000C8AF80FC340000E1052D -:1046800080000080224090B6841100000000008C61 -:104690000E0036320000E305000000C81F81FC95C3 -:1046A000AA1100000000008C0E003632000000004D -:1046B000000000C81F81FC340000161306010080B2 -:1046C0008202F5BC00001613030000780900F5BD56 -:1046D0000000161304010080E225F5B5100000006B -:1046E0000000004C1F2416380000DE0400000050BB -:1046F0001F00F59C8007161304000080828DFCB01B -:104700000000EC059F000080020090B20000000055 -:104710000000000809409032000000000000000482 -:1047200009C0FD3200000000000000001700F53A4B -:104730008C04010000080000070037320000161347 -:1047400004100000078090B2000000000018000074 -:10475000074090320000161312000040F2C138B436 -:1047600018003600000000F8730A03F90000DE04A8 -:1047700000000080020000900000DE04000000EC59 -:10478000034090920000161304000080024090BC89 -:104790000000F505B20000D8020000B200000000E1 -:1047A000000201EC16E46E3A08000000000000F878 -:1047B0009340013900001F06171001F802006EB285 -:1047C0000600000604010080828D2FB00300000067 -:1047D000000000F8828D2F3200C061100000002818 -:1047E000098036D200000000000201EC16C06E3CC9 -:1047F00000000000001886C80600003218003600CD -:10480000000000F8730A03F900000106000000D060 -:1048100002000092000007060419868002806CBC2A -:10482000000016138001008012802FB600000000E7 -:104830000000000009006E3200000000C108000402 -:1048400009006E3200000000C01586780FC06C327F -:1048500000000D068001008022802FB600000D06AA -:10486000001886C8064000920000161380010080E0 -:1048700022802FB6000000000040000009006E32C8 -:1048800000000000C248000409006E320000000071 -:10489000C01686780FC06C3200000D0680010080C3 -:1048A00012802FB600000000001886C806000032F3 -:1048B0000040000000000028098036320000150684 -:1048C0000402018002C06EBC00006110000201EC15 -:1048D00016C06EDC000013068000008002802FB638 -:1048E00000001506810000F822802FB40000150694 -:1048F000001886C80640009200001506820000F8E5 -:1049000012802FB400000000001886C80600003294 -:10491000000016130401008002002DBC00001613D5 -:104920000401008002802DBC00000000001086C839 -:1049300006000032000000000000000007C00A323C -:10494000003800000008000007003632000016138F -:1049500004100000070090B20000000000180000E2 -:10496000074090320000161312000040F2C138B424 -:1049700018003600000000F8730A03F90000000078 -:10498000170100F8A2802F34000016130210868051 -:1049900072826CBC00000000001086A842806C3758 -:1049A00000002A061200703802007EB200001613C2 -:1049B0001200703C02007EB200001613120070302C -:1049C00002007EB2000016131200703402007EB2A4 -:1049D0000000210602010080B2822ABC0000000013 -:1049E000170000D00200003206000006040100801B -:1049F000828D2FB00000FA050403018002C06EBC56 -:104A000000003506000000800200009000002C0627 -:104A10000403018002C06EBC00003506001086C889 -:104A200046802A9600000000001086C846802A367C -:104A3000000030068000008012802FB6030032068E -:104A4000220000F8828D2FB200003206001886C8BE -:104A500006000092000035068000008022802FB6FC -:104A600000000000C20100F802802F3500C0611074 -:104A700000000028098036D200000000000201EC8E -:104A800016C06E3C18003600000000F8730A03F9E7 -:104A900000000000001001E006802F32000000003E -:104AA000000000A8E100003400000000A20000FCAB -:104AB000020000320000F60380010080A2802FB6C1 -:104AC00000003B06B90100D8028001B20000F603E5 -:104AD000000000F802000092000000000000003812 -:104AE0001880F73A0000000000000038F8BF83305B -:104AF00000003F0604010080F2BD83BC0000F60305 -:104B0000A90000F80200009200C046061801000C3F -:104B1000A8CD3EB200004206840000741F40F7BAE0 -:104B20000000F603A90000F8020000920000000057 -:104B3000000000740F00003200C046061801000C8F -:104B4000A8CD3EB218003600000000F8738A03F9C1 -:104B500000004306000000B00200009200000000C8 -:104B60000000007C0F80833200000000002800005D -:104B70000700003200000000003000000700003293 -:104B800000010080003800000700373200000000FC -:104B9000003C000C0780833200001613120000480E -:104BA00002C080B20000161380010080A2802FB6E0 -:104BB0000000F603A9000008E80100940000540674 -:104BC00004010080A2C0EDBC52000000000000748F -:104BD0000E00363200000000000000C00E4001321E -:104BE000407E0500000000B40E00373200000000D7 -:104BF000000000C40E80073264005A06000000CC9A -:104C00000E003692640016130401008082CDEDBCC4 -:104C100029000000000000740E0036320000000081 -:104C2000000000C00E400032A08C0000000000B464 -:104C30000E00363200000000000000C40EC000323A -:104C400000000000000000CC0E80023210000000C6 -:104C5000000000E4337BEC391E000001000000E09E -:104C60000300373200000000000000C86EC0EC37BF -:104C70000000DE04000000D80EC0ED920000161304 -:104C800004310280A2DB2CBC00001613040100805A -:104C9000028080B200001613021C018052C06EBC5C -:104CA0002C0016130201008082CD81BC3F00161338 -:104CB0000200008082CD81BC3600670604000080BF -:104CC00082CD81BC0F0000000000001009003632C8 -:104CD0002C0000000000001489CD813C10008012DF -:104CE000001C011459E46ED96F0600000000008812 -:104CF00082CD813A0000161304010080028080B248 -:104D00000000161304310280A2DB2CBC0000161335 -:104D10000218018092C06EBC2C00161302000080A5 -:104D200082CD81BC10000000000000100900363266 -:104D3000100080120018011479E06ED96F0600008F -:104D40000000008882CD813AAE060000001801887C -:104D500082CD6E3AB70600000018018882CD6E3A07 -:104D6000C00600000018018882CD6E3AC906000016 -:104D70000018018882CD6E3AD20600000018018822 -:104D800082CD6E3ADB0600000018018882CD6E3AB3 -:104D9000E40600000018018882CD6E3AED0600009E -:104DA0000018018882CD6E3AF606000000180188CE -:104DB00082CD6E3AFF0600000018018882CD6E3A5F -:104DC000080700000018018882CD6E3A1107000024 -:104DD0000018018882CD6E3A1A0700000018018879 -:104DE00082CD6E3A230700000018018882CD6E3A0A -:104DF0002C0700000018018882CD6E3A35070000AC -:104E00000018018882CD6E3A3E0700000018018824 -:104E100082CD6E3A470700000018018882CD6E3AB5 -:104E2000500700000018018882CD6E3A5907000033 -:104E30000018018882CD6E3A6207000000180188D0 -:104E400082CD6E3A6B0700000018018882CD6E3A61 -:104E5000740700000018018882CD6E3A7D070000BB -:104E60000018018882CD6E3A86070000001801887C -:104E700082CD6E3A8F0700000018018882CD6E3A0D -:104E8000980700000018018882CD6E3AA107000043 -:104E90000018018882CD6E3AAA0700000018018828 -:104EA00082CD6E3AB30700000018018882CD6E3AB9 -:104EB000BC0700000018018882CD6E3AC5070000CB -:104EC0000018018882CD6E3ACE07000000180188D4 -:104ED00082CD6E3AD70700000018018882CD6E3A65 -:104EE000E00700000018018882CD6E3AE907000053 -:104EF0000018018882CD6E3AF20700000018018880 -:104F000082CD6E3AFB0700000018018882CD6E3A10 -:104F1000040800000018018882CD6E3A0D080000D8 -:104F20000018018882CD6E3A16080000001801882A -:104F300082CD6E3A1F0800000018018882CD6E3ABB -:104F40000000A803000000D4020000920000EC0260 -:104F5000000000800200009028080000001C01886A -:104F600082CD6E3A2D080000001C018882CD6E3A79 -:104F700032080000001C018882CD6E3A370800001C -:104F8000001C018882CD6E3A3C080000001C01889C -:104F900082CD6E3A41080000001C018882CD6E3A35 -:104FA00046080000001C018882CD6E3A4B080000C4 -:104FB000001C018882CD6E3A50080000001C018858 -:104FC00082CD6E3A55080000001C018882CD6E3AF1 -:104FD0005A080000001C018882CD6E3A5F0800006C -:104FE000001C018882CD6E3A64080000001C018814 -:104FF00082CD6E3A69080000001C018882CD6E3AAD -:105000006E080000001C018882CD6E3A7308000013 -:10501000001C018882CD6E3A78080000001C0188CF -:1050200082CD6E3A0000B003000000D4020000926E -:105030000000C603000000D4020000920000710AC4 -:10504000000000100880019200001613000000808C -:105050000200009000001613000000800200009083 -:1050600000001613000000800200009000001613DC -:105070000000008002000090000016130000008075 -:105080000200009000001613000000800200009053 -:1050900000001613000000800200009000001613AC -:1050A0000000008002000090000016130000008045 -:1050B000020000900000B10A000000100880009279 -:1050C000000016130000008002000090000016137C -:1050D0000000008002000090000016130000008015 -:1050E00002000090000016130000008002000090F3 -:1050F000000016130000008002000090000016134C -:1051000000000080020000900000161300000080E4 -:1051100002000090000016130000008002000090C2 -:105120000000161300000080020000900000C00A7A -:10513000000000100880009200001613000000809C -:105140000200009000001613000000800200009092 -:105150000000130B0000001008400192000016131D -:105160000000008002000090000016130000008084 -:105170000200009000001613000000800200009062 -:1051800000001613000000800200009000001613BB -:10519000000000800200009000001B0B00000010C7 -:1051A00008C000920000161300000080020000906A -:1051B00000001B0B0000001008C000920000220E2F -:1051C000000000100840019200001613000000804B -:1051D0000200009000001B0B0000001008C00092AD -:1051E000000016130000008002000090000016135B -:1051F00000000080020000900000161300000080F4 -:105200000200009000002E0B0000001008C0009269 -:1052100000001613000000800200009000002E0B1A -:105220000000001008C000920000220E00000010D4 -:105230000840019200001613000000800200009058 -:1052400000002E0B0000001008C000920000161392 -:105250000000008002000090000016130000008093 -:105260000200009000001613000000800200009071 -:1052700000002C0B0000001008C000920000161364 -:10528000000000800200009000002C0B00000010C5 -:1052900008C000920000220E000000100840019299 -:1052A00000001613000000800200009000002C0B8C -:1052B0000000001008C000920000161300000080DB -:1052C0000200009000001613000000800200009011 -:1052D000000016130000008002000090000016136A -:1052E00000000080020000900000F50B000000109C -:1052F00008C000920000180B000000100800019286 -:105300000000130B0000001008400192000016136B -:1053100000000080020000900000161300000080D2 -:1053200002000090000016130000008002000090B0 -:105330000000161300000080020000900000161309 -:1053400000000080020000900000161300000080A2 -:10535000020000900000EB0B00000010088000929B -:105360000000180B00000010080001920000130B51 -:105370000000001008400192000016130000008099 -:105380000200009000001613000000800200009050 -:1053900000001613000000800200009000001613A9 -:1053A0000000008002000090000016130000008042 -:1053B0000200009000001613000000800200009020 -:1053C0000000EB0B00000010080001920000180B19 -:1053D00000000010080001920000130B00000010F4 -:1053E00008400192000016130000008002000090A7 -:1053F0000000161300000080020000900000161349 -:1054000000000080020000900000161300000080E1 -:1054100002000090000016130000008002000090BF -:105420000000161300000080020000900000790CBC -:1054300000000010088000920000180B000000100F -:10544000080001920000130B0000001008400192B8 -:1054500000001613000000800200009000001613E8 -:105460000000008002000090000016130000008081 -:10547000020000900000161300000080020000905F -:1054800000001613000000800200009000001613B8 -:1054900000000080020000900000790C0000001065 -:1054A000080001920000180B000000100800019293 -:1054B0000000130B000000100840019200001613BA -:1054C0000000008002000090000016130000008021 -:1054D00002000090000016130000008002000090FF -:1054E0000000161300000080020000900000161358 -:1054F000000000800200009000002D0B0000001052 -:105500000880009200001613000000800200009046 -:1055100000002D0B00000010088000920000220EF9 -:1055200000000010084001920000161300000080E7 -:10553000020000900000161300000080020000909E -:1055400000001613000000800200009000001613F7 -:105550000000008002000090000016130000008090 -:105560000200009000002D0B0000001008000192C6 -:1055700000001613000000800200009000002D0BB8 -:1055800000000010080001920000220E0000001030 -:1055900008400192000016130000008002000090F5 -:1055A0000000161300000080020000900000161397 -:1055B0000000008002000090000016130000008030 -:1055C000020000900000161300000080020000900E -:1055D00000001613000000800200009000007D080B -:1055E0000000001008000192000016130000008067 -:1055F0000200009000007D080000001008400192A9 -:105600000000161300000080020000900000161336 -:1056100000000080020000900000161300000080CF -:1056200002000090000016130000008002000090AD -:105630000000161300000080020000900000430EDE -:1056400000000010084001920000390E0000001018 -:10565000084001920000430E000000100840019233 -:105660000000130B00000010084001920000161308 -:1056700000000080020000900000430E00000010B7 -:105680000840019200001613000000800200009004 -:105690000000161300000080020000900000B90A0C -:1056A00000000010084000920000B90A000000103D -:1056B000088000920000B90A0000001008C00092A3 -:1056C0000000B90A00000010080001920000BE0AA4 -:1056D00000000010084001920000B90A000000100C -:1056E000088001920000B90A0000001008C0019271 -:1056F0000000161300000080020000900000161346 -:1057000000000080020000900000161300000080DE -:10571000020000900000F60C0000001008800092CB -:105720000000F60C0000001008C000920000F60C0B -:1057300000000010080001920000130B0000001090 -:105740000840019200001613000000800200009043 -:105750000000F60C0000001008C0019200001613B3 -:10576000000000800200009000001613000000807E -:10577000020000900000161300000080020000905C -:1057800000001613000000800200009000001613B5 -:10579000000000800200009000001613000000804E -:1057A0000200009000004D0E000000100840019221 -:1057B0000000161300000080020000900000161385 -:1057C000000000800200009000001613000000801E -:1057D00002000090000016130000008002000090FC -:1057E0000000CB0E00000010084001920000CF0E18 -:1057F00000000010084001920000310E000000106F -:10580000084001920000CF0E0000001008400192F5 -:1058100000007D08000000100840019200001613EF -:1058200000000080020000900000CF0E0000001079 -:105830000840019200007E0800000010080002925B -:1058400000001613000000800200009000001613F4 -:1058500000000080020000900000D00E0000001048 -:10586000084001920000310E000000100840019233 -:105870000000D00E000000100840019200007D08DA -:105880000000001008400192000016130000008084 -:10589000020000900000D00E0000001008400192AD -:1058A0000000161300000080020000900000161394 -:1058B000000000800200009000001613000000802D -:1058C000020000900000D50E000000100880009239 -:1058D0000000D50E0000001008C000920000D50E98 -:1058E00000000010080001920000130B00000010DF -:1058F0000840019200001613000000800200009092 -:105900000000D50E0000001008C001920000161320 -:1059100000000080020000900000161300000080CC -:1059200002000090000016130000008002000090AA -:105930000000161300000080020000900000161303 -:10594000000000800200009000001613000000809C -:10595000020000900000161300000080020000907A -:105960000000A00A0000001008400092000016137A -:10597000000000800200009000001613000000806C -:10598000020000900000161300000080020000904A -:105990000000161300000080020000900000EA0ED4 -:1059A00000000010088000920000EA0E00000010C5 -:1059B00008C000920000EA0E0000001008000192EA -:1059C0000000130B000000100840019200001613A5 -:1059D00000000080020000900000EA0E00000010AD -:1059E00008C0019200001613000000800200009021 -:1059F0000000161300000080020000900000161343 -:105A000000000080020000900000030F0000001062 -:105A1000088000920000030F0000001008C00092F0 -:105A20000000030F00000010080001920000130B9B -:105A300000000010084001920000161300000080D2 -:105A4000020000900000030F0000001008C0019247 -:105A500000001613000000800200009000007D0886 -:105A600000000010080000920000161300000080E3 -:105A70000200009000007D080000001008800092E5 -:105A80000000150F0000001008C0009200007D0803 -:105A9000000000100800019200007D0800000010C6 -:105AA00008400192000016130000008002000090E0 -:105AB0000000161300000080020000900000161382 -:105AC000000000800200009000001613000000801B -:105AD00002000090000016130000008002000090F9 -:105AE00000007D0800000010088000920000260FD2 -:105AF000000000100880009200007D0800000010E7 -:105B00000800019200007D0800000010084001928A -:105B10000000161300000080020000900000161321 -:105B200000000080020000900000161300000080BA -:105B30000200009000001613000000800200009098 -:105B400000001613000000800200009000007D0895 -:105B500000000010088000920000260F00000010D6 -:105B60000800019200007D0800000010080001926A -:105B700000007D080000001008400192000016138C -:105B8000000000800200009000001613000000805A -:105B90000200009000001613000000800200009038 -:105BA0000000161300000080020000900000161391 -:105BB000000000800200009000001613000000802A -:105BC0000200009000007D08000000100880009294 -:105BD00000001613000000800200009000007D0805 -:105BE0000000001008400192000016130000008021 -:105BF00002000090000016130000008002000090D8 -:105C00000000161300000080020000900000161330 -:105C100000000080020000900000161300000080C9 -:105C2000020000900000FA0E0000001008800092B0 -:105C30000000FA0E0000001008C000920000FA0EEA -:105C400000000010080001920000130B000000107B -:105C5000084001920000161300000080020000902E -:105C60000000FA0E0000001008C001920000161398 -:105C70000000008002000090000016130000008069 -:105C80000200009000001613000000800200009047 -:105C900000001613000000800200009000001613A0 -:105CA0000000008002000090000016130000008039 -:105CB000020000900000390F00000010080002925E -:105CC0000000161300000080020000900000161370 -:105CD0000000008002000090000016130000008009 -:105CE00002000090000016130000008002000090E7 -:105CF0000000161300000080020000900000C00A9F -:105D00000000001008C0019200001613000000807F -:105D100002000090000016130000008002000090B6 -:105D20000000130B00000010084001920000161341 -:105D300000000080020000900000010B0000001035 -:105D400008C00192000016130000008002000090BD -:105D500000001613000000800200009000001613DF -:105D600000000080020000900000C00A0000001047 -:105D700008800092000016130000008002000090CE -:105D80000000161300000080020000900000130BBA -:105D9000000000100840019200001613000000806F -:105DA000020000900000010B0000001008C00192EA -:105DB000000016130000008002000090000016137F -:105DC0000000008002000090000016130000008018 -:105DD000020000900000260D0000001008800092D4 -:105DE0000000161300000080020000900000260D45 -:105DF00000000010088000920000220E0000001039 -:105E0000084001920000161300000080020000907C -:105E10000000260D000000100880009200001613FC -:105E200000000080020000900000161300000080B7 -:105E30000200009000001613000000800200009095 -:105E40000000260D0000001008000192000016134B -:105E500000000080020000900000260D00000010ED -:105E6000080001920000220E00000010084001927C -:105E70000000161300000080020000900000260DB4 -:105E800000000010080001920000161300000080BE -:105E90000200009000001613000000800200009035 -:105EA0000000161300000080020000900000260D84 -:105EB000000000100800019200001613000000808E -:105EC000020000900000260D000000100800019262 -:105ED0000000220E0000001008400192000016137E -:105EE00000000080020000900000260D000000105D -:105EF00008000192000016130000008002000090CC -:105F0000000016130000008002000090000016132D -:105F100000000080020000900000260D000000102C -:105F2000088000920000161300000080020000901C -:105F30000000260D00000010088000920000220ED4 -:105F400000000010084001920000161300000080BD -:105F5000020000900000260D000000100880009252 -:105F600000001613000000800200009000001613CD -:105F70000000008002000090000016130000008066 -:105F80000200009000001613000000800200009044 -:105F90000000161300000080020000900000260D93 -:105FA0000000001008C001920000220E0000001046 -:105FB00008400192000016130000008002000090CB -:105FC0000000260D0000001008C00192000016130A -:105FD0000000008002000090000016130000008006 -:105FE00002000090000016130000008002000090E4 -:105FF0000000AB0D00000010088000920000161396 -:1060000000000080020000900000161300000080D5 -:106010000200009000007D0800000010084001927E -:106020000000161300000080020000900000AB0D7D -:10603000000000100880009200001613000000808D -:106040000200009000001613000000800200009083 -:106050000000161300000080020000900000AB0D4D -:10606000000000100880009200001613000000805D -:106070000200009000001613000000800200009053 -:1060800000007D0800000010084001920000161377 -:1060900000000080020000900000AB0D0000001026 -:1060A00008C001920000161300000080020000905A -:1060B000000016130000008002000090000016137C -:1060C0000000008002000090000016130000008015 -:1060D00002000090000016130000008002000090F3 -:1060E00000001613000000800200009000007D08F0 -:1060F000000000100840019200001613000000800C -:10610000020000900000B50D0000001008C00192D0 -:10611000000016130000008002000090000016131B -:1061200000000080020000900000161300000080B4 -:106130000200009000001613000000800200009092 -:1061400000001613000000800200009000001613EB -:10615000000000800200009000007D080000001098 -:106160000840019200001613000000800200009019 -:106170000000B50D0000001008800092000016130A -:106180000000008002000090000016130000008054 -:106190000200009000001613000000800200009032 -:1061A000000016130000008002000090000016138B -:1061B0000000008002000090000016130000008024 -:1061C000020000900000B30E000000100840019291 -:1061D000000016130000008002000090000016135B -:1061E00000000080020000900000161300000080F4 -:1061F0000200009000008608000000100840009295 -:10620000000016130000008002000090000016132A -:1062100000000080020000900000161300000080C3 -:1062200002000090000016130000008002000090A1 -:106230000000161300000080020000900000DD083E -:10624000000000100880009200001613000000807B -:106250000200009000001613000000800200009071 -:106260000000C6090000001008000192000016138B -:10627000000000800200009000008508000000106F -:10628000080001920000D0090000001008000192EF -:106290000000D00900000010080001920000D009A1 -:1062A000000000100800019200001613000000809A -:1062B0000200009000001613000000800200009011 -:1062C0000000EF0800000010088000920000161384 -:1062D000000000800200009000008508000000100F -:1062E00008000192000016130000008002000090D8 -:1062F000000016130000008002000090000000095A -:1063000000000010088000920000C4090000001086 -:10631000088000920000850800000010080001922B -:106320000000161300000080020000900000E60943 -:1063300000000010084000920000E6090000001074 -:10634000088000920000E6090000001008C00092DA -:1063500000008508000000100800019200001613DC -:106360000000008002000090000016130000008072 -:106370000200009000000C0A0000001008C000920B -:106380000000161300000080020000900000850845 -:1063900000000010080001920000161300000080A9 -:1063A0000200009000001613000000800200009020 -:1063B00000000F0A000000100800019200000F0A00 -:1063C0000000001008000192000085080000001085 -:1063D00008000192000016130000008002000090E7 -:1063E0000000161300000080020000900000110A57 -:1063F00000000010088000920000110A0000001048 -:1064000008C00092000085080000001008000192FA -:1064100000001613000000800200009000008508B4 -:1064200000000010084000920000DC09000000108D -:10643000088000920000DC090000001008C00092F3 -:106440000000850800000010080001920000850887 -:1064500000000010080000920000850800000010F5 -:10646000084000920000250A0000001008800092F9 -:106470000000250A0000001008C0009200008508F6 -:1064800000000010080001920000161300000080B8 -:10649000020000900000161300000080020000902F -:1064A0000000600A000000100880009200008508CB -:1064B0000000001008C000920000850800000010D5 -:1064C00008000192000016130000008002000090F6 -:1064D00000001613000000800200009000003F0A38 -:1064E00000000010088000920000161300000080D9 -:1064F00002000090000085080000001008000192D2 -:106500000000161300000080020000900000161327 -:1065100000000080020000900000EC080000001065 -:106520000880009200001613000000800200009016 -:1065300000008508000000100800019200001613FA -:106540000000008002000090000016130000008090 -:10655000020000900000540A000000100880009221 -:106560000000540A0000001008C0009200008508D6 -:1065700000000010080001920000161300000080C7 -:10658000020000900000161300000080020000903E -:1065900000001C0A000000100880009200001C0A85 -:1065A0000000001008C000920000850800000010E4 -:1065B0000800019200001613000000800200009005 -:1065C00000001613000000800200009000006D0A19 -:1065D000000000100880009200006D0A000000100A -:1065E00008C0009200008508000000100800019219 -:1065F0000800F303001801E8762081990800EF03F2 -:10660000001801E87620819900004B1200000080FC -:10661000020000F0080082081D1901E8762081B907 -:106620000000F303000000F862812F950000F303DF -:106630008000008002812FB62A0016131200002C61 -:1066400082CD2EB20000F303000000F802812F94E7 -:106650000800F303001C01E876208199000016135E -:10666000800F018002C06EB600000000000000D85C -:106670000200003200000000000E01EC06C06E3582 -:106680005400000000000000070036320000000047 -:10669000000000BCA8002D37B40401000008000071 -:1066A000C7CD8B3A000000000000007899C02C375D -:1066B000B400000000000078898D973A000016139E -:1066C0000210000087BF97BA000000000018000009 -:1066D0000740FE320000161312000040F2C138B429 -:1066E000000000000090007809006E3200001613D0 -:1066F00004A0000009806EB20000950804A5000403 -:1067000009806EB200000000000000040900903211 -:106710000000161302010080026490BC000098087B -:1067200004010004096490BC0000000000000004A3 -:1067300009400032080000006E3402E81624903947 -:1067400000009908B71002E0068097B200009C088C -:1067500080000080F280FCB600009D08000000C8A8 -:10676000FF80FC9400009E089F990080821BEEBC75 -:1067700000000000009800E00E006E3200000000F3 -:10678000A70000800200003018003600000000F86A -:10679000730A03F9000000000010021C09006E32A9 -:1067A0004000A3080601008082CD91BC00C0A4086F -:1067B000001802E00680369200E00000001802E0B7 -:1067C00006803632000000000000002009800332FD -:1067D0000000A70880D7018032C06EB6000000001C -:1067E000000000204900923A0000000000980118C3 -:1067F00009006E3200000000000A022409C06E3257 -:106800000000000000C0012809806E320000B508B9 -:10681000800E018012C06EB602000000003C02EC47 -:106820000600363200000000000000004901923AE4 -:106830000000B10880D6018042C06EB60082000020 -:10684000001002E0A6CD913200A00000002C02E86A -:10685000060036322800BF08003A02EC06003692E5 -:1068600000000000D301001CD9C191340082000057 -:10687000001002E0A6CD913200A00000002C02E83A -:10688000060036323400BF08003A02EC06003692A9 -:1068900004000000003C02EC060036322800000034 -:1068A00000000000890D923A0000BB0880D60180EC -:1068B00042C06EB600860000001002E0A6CD913204 -:1068C00004A00000002C02E8060036321400BF08C5 -:1068D000003A02EC0600369200000000D301001CD2 -:1068E000D9C1913400860000001002E0A6CD91329B -:1068F00004A00000002C02E8060036322000BF0889 -:10690000003A02EC0600369212000000003802EC59 -:1069100086CD913A08000000002802E886249039CC -:1069200000000000002002E0962414370000000060 -:10693000004001E0068091320000C508040100809B -:10694000028092BC0000000000C001E0060000329E -:1069500000000000003000E00600003200000000EF -:1069600000B000E00600003220000000000000003F -:10697000070036320000000000000078A9002D3723 -:106980000005010000080000C78D973A00000000D4 -:106990000000007899C02C3700010000000000784A -:1069A000898D973A000016130210000087BF97BA2E -:1069B00000000000001800000740FE32000016131F -:1069C00012000048F2C138B40000D20880D7012C70 -:1069D00009C06EB200000000DAD701EC06C06E35C7 -:1069E00000000000005A01EC0640ED32AE0000004D -:1069F000000000781900363AAF0016130401008039 -:106A0000828D97BC00000000005C01E806808B329C -:106A10000000D7088001008062C092B6000000002C -:106A2000000000F882812F3418003600000000F8C2 -:106A3000730A03F9000000000004013808C06E3238 -:106A40000000161304C9018002806EBC0000000023 -:106A5000006201EC06808332010085081201002CDF -:106A600082CD2EB2000016130000008002000090BC -:106A700000000000005401FC02C06E320000000063 -:106A8000000000D80280013200C0E3081801000CA9 -:106A9000A8CD3EB2208000000000000808803632F9 -:106AA0002D00EF031201002C82CD2EB20000161330 -:106AB0000000008002000090000000000062013829 -:106AC00008C06E320008008000000028090037323C -:106AD0000060EB1100000008088036F20000161379 -:106AE000870601EC16C06EBC000085080B00008014 -:106AF000020000B0000085088000008072812FB67F -:106B000000000000000000F872812F343D0085086D -:106B10001201002C82CD2EB200001613000000805E -:106B200002000090000016130407018012C06EBC22 -:106B30000000161380000080B2812FB60000EF081D -:106B4000000000F8B2812F940000161304A0001872 -:106B500008006EB2000016130406018002C06EBC6D -:106B600000009E1200000080020000F000000013F0 -:106B70000078016008006EF20000F508120100C8FC -:106B8000020020B20000F80800000080020000901F -:106B9000000005091201005C088020B20000F8081E -:106BA0001201006002802CB2000016130000008069 -:106BB000020000900000FA0804000080024080BC3F -:106BC00000000000000000F81F80FF3A0000FD08F0 -:106BD00080010080A2802FB618003600CA0000F89D -:106BE000730A03F9000016130401008002802DBC13 -:106BF000000085088000008072812FB63D001613CA -:106C00001200002C82CD2EB200008508000000F892 -:106C100072812F94000016130406018002C06EBC1E -:106C20000000000000BC001408806E320000F8086C -:106C3000120000C8020020B20000F6081200005C3A -:106C4000088020B20000161304A0001808006EB2DD -:106C5000000000000000007879613832000016134F -:106C60001218024CE2256EB20000161304010080D7 -:106C700002402DBC080000000010020078E16E39CF -:106C8000000000000018002007000032070000008C -:106C90000000003878CAE939000016130400003CEF -:106CA000084080B2000000000090006C08006E32C6 -:106CB000000000000098004C08006E32000016131F -:106CC0000400008032E186B200000000510000D8CC -:106CD00002000032000000004D00000067E0833E2B -:106CE00000000000000800000700803200000000E3 -:106CF0000010000007C086320000000000180000ED -:106D000007C084320000000000000018D8A0813CB9 -:106D10000000840904B000E0D6206EBC0000161309 -:106D200009010080020000B0000043090400003C9B -:106D3000D8E083BC0000161304010080028081BCEF -:106D4000000024098000008092802FB600001C09FA -:106D50001201000009C021B218003600000000F83E -:106D6000730A03F91D0000000000007809A4173819 -:106D70000000210904010080128097BC0000161356 -:106D800080010080A2802FB600001B09670000F878 -:106D9000A2802FB500001C090000000009C021924C -:106DA0000000230904000080228097BC0000161315 -:106DB00004010080328097BC00000000C90100D8A7 -:106DC00002408432000027090400008072802DBC3C -:106DD0000000161312000044E2E038B2000034094B -:106DE000510000D812802D9A0000000000000078A9 -:106DF000F98183340000161312000044E2E538B232 -:106E000000002C098000008082802FB60000F7115E -:106E100000A0015008006EF20000000000F801E040 -:106E20000600853200002E09120100E802C021B2DE -:106E300018003600000000F8730A03F90000320958 -:106E40000401008002802DBC000016138001008028 -:106E5000A2802FB600002D09670000F8A2802FB590 -:106E600000001613120000E802C021B20000161341 -:106E70000401008072802DBC00000000510000D889 -:106E800002000032000039092A010000D82080BA2F -:106E9000000038091201000009C021B218003600B4 -:106EA000000000F8730A03F900000000000000D899 -:106EB000024084321D0016130400008002A417B89B -:106EC00000000000CAE0006C08006E320000000004 -:106ED00000E8004C08006E320000161304F00018A1 -:106EE00008006EB2000000000000003818818335F1 -:106EF0000000100904B00080829B81BC00001613C2 -:106F00000D010080020000B0000016139F00001465 -:106F1000184081BC00000000CA0100F842802F35F3 -:106F200008A0100912010040A2CD39B200001613CA -:106F3000000000800200009000004E09293402B8D1 -:106F400008806EB2000046091201000009C021B29B -:106F500018003600000000F8730A03F91D00000055 -:106F60000000007809A4173800004B0904010080D4 -:106F7000128097BC0000161380010080A2802FB6FB -:106F800000004509670000F8A2802FB500004609FF -:106F90000000000009C0219200004D09040000809B -:106FA000228097BC0000161304010080328097BC39 -:106FB00000000000C90100D8024084320000000037 -:106FC00000000078F9818334000016131200004499 -:106FD000E2E538B2000056092800006CD8E086BA15 -:106FE0000000F61100A0015008006EF200005609E2 -:106FF0001DF801E0060085B20000560980000080FF -:1070000002812FB62A0016131200002C82CD2EB258 -:1070100000000000000000F802812F3400005C092D -:1070200004A000E0068081B20000000000BC00E87F -:107030000640813200000000009000E006C0863269 -:1070400000000000009800E006C084320000161323 -:107050000400008032E186B2000070090000008068 -:10706000020000900000620980010080A2802FB61B -:1070700000005F091201000009C021B218003600AB -:10708000000000F8730A03F91D0062090401008082 -:1070900002A417B80000161380000080E2802FB60B -:1070A00000005E09000000F8E2802F94000000005C -:1070B00000E0006C08006E3200000000CAE8004CDE -:1070C00008006E32000016130400008032E186B220 -:1070D0000000161304F0001808006EB200006B09DF -:1070E00004B00080829B81BC000016130D0100805B -:1070F000020000B0000016139F000014184081BC6D -:1071000000000000CA0100F842802F3508A01613C5 -:1071100012000040A2CD39B20000000000A000E043 -:107120000680813200000000009800E006C0843232 -:1071300000000000009000E006C086320000161338 -:107140000400008032E186B20000000000BC00E8CC -:1071500006408132000076092A5D01E806808BB284 -:10716000000073091201000009C021B218003600A6 -:10717000000000F8730A03F91D007609040100807D -:1071800002A417B80000161380000080E2802FB61A -:1071900000007209000000F8E2802F9410247909A1 -:1071A000370000F8A28D2FB13D0016131200002CFD -:1071B00082CD2EB200000000000000F872812F3452 -:1071C00008000000CA1C01E8762081390000541034 -:1071D0000000002CF90100F400007F09800000800D -:1071E000E2802FB600007E091201000009C021B222 -:1071F00018003600000000F8730A03F91D0016138A -:107200000401008002A417B800001613800100805A -:1072100082802FB60000161304010080C20003BC58 -:10722000100000000018008067A173393000F603D9 -:107230001201005CA28D2CB2000016130000008029 -:107240000200009000008A098000008092802FB622 -:1072500018003600000000F8730A03F91D00161329 -:107260000400007809A417B8000089090400008010 -:10727000228097BC0000161304010080328097BC66 -:1072800000000000C90100D802408432000016133B -:1072900004010080D2E083BC000016132A000078AD -:1072A000F98183B40000161312000044E2E538B2FD -:1072B0000000641100000030030038F20000920961 -:1072C0001D000038188183B50000920980000080FD -:1072D00002812FB62A0016131200002C82CD2EB286 -:1072E00000000000000000F802812F340000161397 -:1072F000870601EC16C06EBC000096090B000080EA -:10730000020000B000000000CA0100F842802F34E3 -:1073100008C0161312000040A2CD39B2000099092E -:107320008000008082802FB60000F71100A001507D -:1073300008006EF20000000000F801E0060085324F -:1073400000009B091201000009C021B2180036009C -:10735000000000F8730A03F90000BD092A3502B8DD -:1073600008806EB200009E091201000009C021B21F -:1073700018003600000000F8730A03F9000000004E -:10738000000000F8A2802F350000B509040000803D -:10739000026180BC0000AD0980B8000009C06EB277 -:1073A0004000A50904000080820D90BC80001613E7 -:1073B00004010080820D90BC0000A50902B000808D -:1073C000821B84BC0000AD09000000F8B2812F943C -:1073D000000016130407018012C06EBC00001613D3 -:1073E00080000080B2812FB60000161380D6018085 -:1073F00052C06EB60000000000D601EC56C06E34DC -:1074000000000000000000601800863A0000000044 -:1074100000000080B701783400000000007801E02F -:10742000060086324000BD0904000080820D90BC39 -:107430000000161304A0001808006EB200009E128F -:1074400000000000D82080FA000016130600003C5F -:10745000182084BC0000161304B0003C88DB83BEF7 -:107460000000161380010080C20178B60000000001 -:1074700000000080F720783A00000000587801E012 -:10748000F620863A00000C0900000004F860809A9B -:107490000000B80980B9000009C06EB22F00BD0914 -:1074A0001201002C82CD2EB20000161300000080C5 -:1074B000020000904000BA0904010080820D90BCD7 -:1074C0003800BC09000000780900369280001613CD -:1074D00004010080820D90BC39000000000000789B -:1074E00009003632000016131200002CE2E52EB21D -:1074F000000016138001008082802FB60000161352 -:1075000004010080C20003BC1000000000180080CD -:1075100067A1733900000000005C01E806808B322F -:1075200010240000000000F8A28D2F3130008508E3 -:107530001201005CA28D2CB2000016130000008026 -:10754000020000900000161380010080C2812FB657 -:1075500000000009000000F8C2812F950000000023 -:10756000005401FC02C06E3200000000000000D890 -:107570000280013200C0CC091801000CA8CD3EB237 -:107580002080000000000008088036322D00EF0344 -:107590001201002C82CD2EB20000161300000080D4 -:1075A00002000090000000000062013808C06E3246 -:1075B0000008008000000028090037320060EB114D -:1075C00000000008088036F20000DA0900000080A0 -:1075D000020000900000D20980000080C2812FB616 -:1075E0000000D50900D001E806000092000000006C -:1075F000000000F8C2812F350000D50904D10180B8 -:1076000002806EBC0000000000D601EC26C06E3483 -:107610000000D7098000008092812FB60000DA09AF -:1076200000C801E80600009200000000000000F819 -:1076300092812F350000DA0904C9018002806EBCF6 -:107640000000000000D601EC16C06E341100850861 -:107650001201002C82CD2EB2000016130000008013 -:1076600002000090000085089A0100F842812FB5C1 -:107670000000E309120100C8020020B2000000006F -:10768000005C01EC0640003200008508370000F87D -:1076900042812FB400000000000000F872812F34F6 -:1076A0003D0085081201002C82CD2EB20000161379 -:1076B00000000080020000900000EE091201005C52 -:1076C000088020B20000DE091201006002802CB2A6 -:1076D0000000161300000080020000900000EB097B -:1076E000120100C8020020B200008508370000F82F -:1076F000D2812FB400000000000000F872812F3406 -:107700003D0085081201002C82CD2EB20000161318 -:1077100000000080020000900000EE091201005CF1 -:10772000088020B20000E7091201006002802CB23C -:10773000000016130000008002000090000000000E -:107740000000007879613832000016131218024CDC -:10775000E2256EB200000000003402B808806E32EC -:107760000000000000A0015008006E320000000080 -:107770000078016008006E320000F5099D110234A6 -:1077800009006EB20000000000F0018808006E32AF -:107790000000121200A8010809006EF200000000AB -:1077A000D4F801E00600853200000000DA5C01E850 -:1077B00006808B3200006411DD000030030038F2D7 -:1077C0000000FB092329020409806EB23E00161353 -:1077D0001200002C82CD2EB20800FF091D1C01E80A -:1077E000762081B90000FF098000008002812FB659 -:1077F0002A0016131200002C82CD2EB200000000C9 -:10780000000000F802812F34000054100000002C0A -:10781000F90100F40000030A9D010080074093B2C3 -:107820000000000000300080078088320000000067 -:10783000003800800700EE320000000000080080E1 -:1078400007C0853200000000001000800740903221 -:107850001000000000180080878D853700000000B0 -:107860000020008007008632000000000028008011 -:107870000700853200000A0A1201000009C021B287 -:1078800018003600000000F8730A03F93000F60310 -:107890001201005CA28D2CB20000161300000080C3 -:1078A000020000900012161304010080A28D2FB078 -:1078B0000000000000CC017809806E3200008508CD -:1078C000DCD101E806809792130085081201002C94 -:1078D00082CD2EB20000161300000080020000903E -:1078E0000000E30F00000018094081F20000C70FFC -:1078F00000A8012009006EF20000850880010080C8 -:10790000F2802FB60000190A120100C8020020B24E -:10791000000085088000008072812FB60000000002 -:10792000000000F872812F343D0085081201002C00 -:1079300082CD2EB2000016130000008002000090DD -:107940000000EE091201005C088020B20000150A58 -:107950001201006002802CB20000161300000080AB -:107960000200009000008508350100F812812FB553 -:1079700000000000000000D802800132000000007A -:10798000005401FC02C06E3200C0230A1801000C32 -:10799000A8CD3EB220800000D10100080880363218 -:1079A0003B00F3031201002C82CD2EB2000016130F -:1079B00000000080020000900000E2110098012801 -:1079C00009006EF2000085080000008002000090AF -:1079D00000002F0A80010080A2812FB600002F0A2C -:1079E0008000008042812FB61F00000000000010C0 -:1079F00009003632000080120000001409802FD2E6 -:107A00003C00000000000010090036320000801227 -:107A10000000001409803CD200002F0A085B01EC32 -:107A200006FB6EBC00000000005A01EC06000032AC -:107A300000002F0A370000F842812FB43D000000FB -:107A4000D701002C82CD2E320000360A8001008042 -:107A500092812FB60000161380000080C2812FB6DD -:107A600000003D0A08C901E806BB6EBC000000002A -:107A700000C801E806000032330016131200002C83 -:107A800082CD2EB20000F31100000028098001F21F -:107A900000008508000000800200009000003D0A00 -:107AA00080010080C2812FB6000016138000008084 -:107AB00092812FB600003D0A08D101E806BB6EBCDA -:107AC0000000000000D001E8060000323300161369 -:107AD0001200002C82CD2EB20000F311000000280D -:107AE00009C001F20000850800000080020000903B -:107AF0000000850880010080F2812FB618008508FB -:107B00000000002C82CD2E92000016130407018085 -:107B100012C06EBC0000430A120000C8020020B26E -:107B20000000460A1201005C088020B20000161313 -:107B30001200006002802CB200000000000000F87B -:107B40001F80FF3A0000F3031201002C72E02EB2F6 -:107B500000001613000000800200009000000000EA -:107B60000000007879613832000016131218024CB8 -:107B7000E2256EB200000000003402B808806E32C8 -:107B800000000000D4A0015008006E320000000088 -:107B9000DB79016008006E320000F711DD0000049F -:107BA000080000F21000000000180080878D853763 -:107BB0000000000000F801E0060085320000500AD5 -:107BC0001201000009C021B218003600000000F8C0 -:107BD000730A03F9300016131200005CA28D2CB258 -:107BE00000001613040701EC16C06EBC0000000074 -:107BF00000B000E00600003200008508DA5C01E811 -:107C000006808B92000085089F41018052206EBC47 -:107C100000005F0A9F98018052206EBC00000000A7 -:107C2000000000D80280013200000000005401FC76 -:107C300002C06E3200C05D0A1801000CA8CD3EB231 -:107C40002080850831000008088036B2000000005E -:107C5000000000F812812F343B0085081201002C2F -:107C600082CD2EB2000016130000008002000090AA -:107C70000000E2110098012809006EF2000085085A -:107C8000000000800200009000008508D54101E05E -:107C9000064081920000850804B0008002006EBC9E -:107CA000000000000090010008006E320000001388 -:107CB0000078016008006EF2000085080000008076 -:107CC0000200009000000000000C027809806E3273 -:107CD0000000670A04D4018012C06EBC00000000DE -:107CE000000000781980973700000000009001E044 -:107CF000E6256E3A0000001300000080020000F04C -:107D000000006B0A0000008002000090000085085F -:107D1000009001E00600809200000000009001E069 -:107D20000600803200000009000000800200009080 -:107D30000000161380000080F2802FB60000C70FED -:107D400000A8012009006EF20000140A80000080E3 -:107D5000F2802FB60000850800000080020000902D -:107D600000000000000000D8028001320000000086 -:107D70000000007809006E320200760A04B9008023 -:107D800082CD6EBC0000780A800000807280FCB654 -:107D900000007B0A000000FC020000920000780A4C -:107DA000800000808280FCB600007B0A000000FC9E -:107DB0000200009200001613040000800200F5BCCF -:107DC00000000000000000A842BD97300000000045 -:107DD000541809FEF2C07C3000C0810A1801000C62 -:107DE000A8CD3EB200000000000E01EC06000034F9 -:107DF00000000000005401EC06C02F32208000007B -:107E000000000008088036320000F3031201002C45 -:107E100082CD2EB2000016130000008002000090F8 -:107E2000000000000062013808C06E3200080080C7 -:107E300000000028090037320000EB1100000008A4 -:107E4000E80100F400001613040701EC16C06EBC34 -:107E500000000000000000A8A2002D370A0000006A -:107E6000000000780900363200000000001809E226 -:107E7000070000320000870A04010078198097BCCF -:107E80000200920A04B9008082CD6EBC0000004856 -:107E9000D6010078C9CD2C3200008B0AB6000080D4 -:107EA000020000B00000161312000064028097B2B6 -:107EB00000008D0A1208006402006EB200008E0AF3 -:107EC0001218006402006EB200008F0A12100064E3 -:107ED00002006EB200000000A65401EC06C02F3272 -:107EE00000007D08000E01EC060000940020004C0C -:107EF000D6010078C9CD2C320000930AB60000806C -:107F0000020000B00000161312000064028097B255 -:107F10000000950A1208006402006EB20000960A82 -:107F20001230006402006EB20000970A123800643A -:107F300002006EB20000980A1240006402006EB2A5 -:107F40000000990A1248006402006EB200009A0A0A -:107F50001210006402006EB200009B0A1218006446 -:107F600002006EB200009C0A1220006402006EB291 -:107F700000009D0A1228006402006EB2000000009A -:107F8000A65401EC06C02F3203007D08000E01EC60 -:107F90000600369200000000000000FC02000132E2 -:107FA0000000A30A0000001408803D9200000000B9 -:107FB000000000FC020001320000A60A040000DC00 -:107FC00053603DB318000000000000F8738A0339C5 -:107FD000A20A3600000000C0020036920000000035 -:107FE000005401FC02C06E3200000000000000D806 -:107FF0000280013200C0AC0A1801000CA8CD3EB2CC -:108000002080000000000008088036321500EF03D1 -:108010001201002C82CD2EB2000016130000008049 -:10802000020000900000000000280000070000325D -:10803000000000000030000007C02C320010008259 -:108040000038000007003732000016131200004805 -:1080500002C080B200007D08CA010008E801009457 -:10806000000016138001008062812FB62D001613C8 -:108070001200002C82CD2EB20000B50A1D01008036 -:10808000020000B000007D08000000F862812F951A -:10809000000016138000008002812FB6000000004F -:1080A000000000F802812F342A007D081201002C04 -:1080B00082CD2EB200001613000000800200009056 -:1080C0000000D7110000002C09C085D20000641107 -:1080D00000000030030038F20000F303230100F831 -:1080E00022812FB43E00F3031201002C82CD2EB268 -:1080F0000000161300000080020000900000D7115D -:108100000000002C09C085D20000F303000000F835 -:1081100022812F940000C50A380100D8028001B2E4 -:108120000000C30A1E000080020000B00000C50A63 -:108130001A010080020000B0000038120000006840 -:108140001F80F6FA0000F303000000800200009098 -:108150000000C90A12010060084023B2008200003A -:108160000000000808803632000038120000006469 -:108170001F40F6FA0000F3030000008002000090A8 -:108180000000161312000024080023B2000016138A -:108190001200002008C023B20000161312000018BD -:1081A000088023B200C0D40A1801000CA8CD3EB24A -:1081B0000000CC0A12000038028081B200001613C1 -:1081C0001200003C020082B20000161312000030C0 -:1081D000024082B20000161312000034020086B280 -:1081E00020800000000000080880363200003812AD -:1081F0000000005C1FC0F5FA0000F30300000080DF -:108200000200009000000000450000D8020000328B -:108210000000000000000000074080320000000065 -:10822000001000000740823200000000001800002B -:10823000070086320000161312000050F2C138B455 -:1082400000007A0F003001E016206EFA0000DD0A0F -:108250003801002CF8010BB40000DD0A020D028089 -:10826000A25B80BC000000000000002CC8C182346A -:108270000000DF0A8000008042812FB60000B40FAA -:1082800000000080020000F0000016139FA801E02B -:1082900016206EBC0000D40F00000080020000F029 -:1082A0000000E50A270100D8028001B200000000AA -:1082B000C700002CE8C08234000000000000000865 -:1082C000D801003400000000D54001E006008732EC -:1082D00008004B12001801E8762081F900006411B3 -:1082E00000000030030038F20000E90A2319000002 -:1082F000078081B23E0016131200002C82CD2EB2F0 -:108300000000EB0A1D210000070082B20000EE0A07 -:10831000000000F862812F950000EE0A80000080C6 -:1083200002812FB62A0016131200002C82CD2EB225 -:1083300000000000000000F802812F340000161336 -:1083400080000080A2802FB6000054100000002C96 -:10835000F90100F4000016130401008062802DBCB6 -:108360001000F40A2C30000017E02CB90000F60AC7 -:108370008E39000007C082B20000F60A0008000033 -:10838000070087920000F60A8E390000B7C182B458 -:108390000000000000080000070087320000F80A13 -:1083A000120100E802C021B218003600000000F8F7 -:1083B000730A03F90000F60A9F010014184081BCFB -:1083C0000000FE0A0400008002C085BC00001613F5 -:1083D0001200006802C585B00000000000000078AF -:1083E00009C58530000016130201008082BA97BCCF -:1083F000000016130601008092BA97BC0000161305 -:108400001200004802C080B2000016130401008070 -:10841000D28180B50000F603CA010008E88180948B -:10842000000016138001008082812FB60000040B2B -:108430001E000080020000B00000060B1A01008040 -:10844000020000B000003812000000681F80F6FA39 -:108450000000F303000000800200009000001613EB -:108460009FA801E016206EBC00007A0F00000014E7 -:10847000080000F200000A0B8000008042812FB645 -:108480000000B40F00000080020000F00000D40FD4 -:1084900000000080020000F000007F08040000805F -:1084A000024081BC00000E0B120100E802C021B2A4 -:1084B00018003600000000F8730A03F900000000FD -:1084C0000000007809C58530000016130201008005 -:1084D00082BA97BC000016130601008092BA97BCBE -:1084E00000007F081201006802C585B00000161365 -:1084F000000000800200009000007D0880000080E5 -:10850000F2C185B60000170B1C41028006C085B27F -:10851000000000000000006802C585300000000077 -:10852000000000701F00F73A00007D08000000F80E -:1085300022812F9400007D0880000080F2C185B662 -:108540000000D7110000002C09C085D20000F30301 -:10855000D20100941E40E99A00001613042000186E -:1085600008006EB20000161380000080F2812FB662 -:1085700000008C1200000080020000F000001613C2 -:1085800004010080028080BC0000161304510180A9 -:1085900002806EBC000016130421018002006EBC34 -:1085A00000000000003C00E8064081320000250B7E -:1085B0001F000080020000B00000220B9E400278E5 -:1085C000094068B20000161300000080020000900D -:1085D0000000290B8001008082812FB600007F08F7 -:1085E0002A3101E0060000B218000000CA0000F8BD -:1085F000730A03397F083600000000C0020036927B -:1086000000007F0880010080A2802FB618000000C3 -:10861000CA0000F8730A03397F083600000000C062 -:10862000020036920D002F0B000000580800369211 -:1086300000002F0B00000058080000921B000000F3 -:1086400000000058080036320000161304200018FD -:1086500008006EB20000161380000080F2812FB671 -:1086600000008C1200000080020000F000000000FA -:108670000030002808006E3200000000545401FC55 -:1086800002C06E320000940B380000A4088082B251 -:108690000000940B0428010408006EB200001613B9 -:1086A0009F500104A85B80BC00000000005001E85E -:1086B0000600003200005E0B0801007819A082BCA1 -:1086C00000000000002801E0A660803C00003C0B98 -:1086D0002A010014080000B200000000CA000014C3 -:1086E0001840813A0000C70F00A80120A9206EFAA7 -:1086F0000000161306010280821B92BC00000000DD -:10870000002001E0A6206E3C00000000003000E0E8 -:10871000060000320000000000A801E006009232CE -:1087200000000000000000D80280013200C0500BA1 -:108730001801000CA8CD3EB20000470B04000080D9 -:10874000024081BC0000000000000014080000325C -:1087500018000000000000F8730A0339410B3600CE -:10876000000000C0020036922080000000000028B7 -:108770000980363200008111000000D8020000D2CA -:1087800000004B0B04000080028092BC18003600F1 -:10879000000000F8730A03F900000000000000D890 -:1087A0000280013200C0500B1801000CA8CD3EB26F -:1087B00018000000000000F8738A03394B0B00001A -:1087C000000000C0020036320000360000000080C9 -:1087D0000200009000000000DE000008E801003404 -:1087E00000000000DF00013808C06E320000000009 -:1087F0000010000007000032000000000018000018 -:1088000007808232000000000030000007C02C32D8 -:108810000020008000380000070037320000000010 -:10882000CA3D000C078083320000000000000014E5 -:108830001840813A00005C0B040201EC16C06EBCCB -:1088400000000000C00100141840813A0000000040 -:10885000000000F892802F3400C016131200004070 -:10886000A28D39B20000D70B1201004802C080B2BD -:1088700000001613000000800200009000000000BD -:10888000000000280880973200000000000000A4CB -:1088900008808232000000000010006C18206E3A40 -:1088A000000000000018004C08006E320000C70FE6 -:1088B00000A8012019206EFA00001613060102809C -:1088C000821B92BC00000000002001E016206E3CDC -:1088D0000000000000A801E0060092320000690BD1 -:1088E000003801E006408092000000000060006C4B -:1088F00018206E3A000000000068004C08006E323C -:1089000000006B0B9F010004686080BC0000740BCA -:10891000000000181820009C000016138001008041 -:10892000A2802FB600006E0B120100E802C021B237 -:1089300018003600000000F8730A03F90000000078 -:10894000CA70001808006E320000670B0201008038 -:10895000626080BC000016139F000014184081BCA8 -:1089600000000000CA0100F802802F3500A0690B4A -:1089700012010040A28D39B20000161300000080E1 -:10898000020000900000790B80000080A2802FB6CA -:1089900000007C0B04000080A2A081BC0000161324 -:1089A0009F000014184081BC00000000CA0100F8BC -:1089B00002802F3500A0161312000040A28D39B29C -:1089C00000000000000000F8A2802F3500007C0BA2 -:1089D000120100E802C021B218003600000000F8C1 -:1089E000730A03F900000000002801E006000032CD -:1089F00000000000003C00E806408132000000005A -:108A0000003000E00680823200000000002000E01C -:108A10000680813200000000001000E006C08632AF -:108A200000000000001800E006C0843200001613A9 -:108A30000400008032E186B20000860B1F010008AE -:108A4000090000B20000970B0420018002006EBCF8 -:108A500000001613000000800200009010000000CB -:108A600000000010790B1638080000000000000C10 -:108A7000790B16380000000000000004A9002D3713 -:108A80000004010000000004C94D903A02000000FB -:108A9000000000A8820D913700000000000000A82F -:108AA00012A42A3A00008F0B80400280E2017CB6BB -:108AB0000000161304400278B93F7CB000000000AB -:108AC00000000008E9A5903A0000910B9F010010FA -:108AD000190091BC9F000000000000100900363210 -:108AE00000008A0B0401008042E490BC00001613D1 -:108AF00004210180829B90BC0000970B0000008045 -:108B000002000090000000000010006C08006E32AF -:108B1000000000000018004C08006E320000161320 -:108B20000400008032E186B200003210510000D80B -:108B3000020000F200009A0B0050013CA85B809CF0 -:108B400000007F08003001E00600009200009F0B4B -:108B50003E510100A81B80BA00000000DE0000F8B2 -:108B6000F2812F3400000000005801EC06C0EE3204 -:108B700000009F0B80010080328087B6000000005B -:108B8000000000F8E2802F340000E310603001E0C4 -:108B9000060000F20000E90B0000008002000090D7 -:108BA0000000000000000014080000320000A90BC3 -:108BB000040201EC16C06EBC00000000C9010014E4 -:108BC0001840813A00000000C001013808C06E3230 -:108BD00000000000DF0000A4A8608A3C000016131B -:108BE0000F000080020000B000C0AD0B1201004079 -:108BF000A28D39B200001613000000800200009020 -:108C000000000000003000E006000032000000001C -:108C1000DF0000A4A8608A3C000016130F0000804B -:108C2000020000B0000000000000013808C06E32F1 -:108C300000000000DEA8012099226E3A0000161301 -:108C400006010280821B92BC000016139F2001E0E7 -:108C500096226EBC0000B20B80000080F2802FB61E -:108C60000000C70F00000080020000F00000B90BF8 -:108C70001F5001E8060000B20000B50B04000080A0 -:108C800002C083BC0000B90B005001E8F660809C74 -:108C90000800000000400278399AFE3800001613E0 -:108CA0000201008082BA97BC000016130601008002 -:108CB00092BA97BC0800000000400268129AFE3881 -:108CC0000000BE0B2AA901E0060092B2180036008F -:108CD000CA0000F8730A03F91D00BE0B04000080EF -:108CE00002A417B80000BA0B04000014184081BC9D -:108CF00000001613000000800200009000006411C4 -:108D000000000030030038F20000C10B8001008039 -:108D100032802FB63E0016131200002C82CD2EB2E8 -:108D200000000000000000D80280013200C0D20B19 -:108D30001801000CA8CD3EB220800000C30000281E -:108D40000980363200008111000000D8020000D2F4 -:108D50000000C70B04000080028092BC00000000ED -:108D6000000000141840813A0000CC0B0400008081 -:108D7000024081BC18003600000000F8730A03F9B5 -:108D80000000D00B04000014184081BC0000C80B88 -:108D90001200000009C021B20000C90B00000080D1 -:108DA0000200009018003600000000F8738A03F9F2 -:108DB0000000641100000030030038F20000D00B06 -:108DC0008001008032802FB63E0016131200002C66 -:108DD00082CD2EB200000000C30000D80280013214 -:108DE00000C0CC0B1800000CA8CD3EB2000016133A -:108DF0008000008072802FB60020008000000028D4 -:108E0000090037320000661200000008E80100F493 -:108E1000000016131200004802C080B200000000DB -:108E2000000000141840813A0000161380010080F1 -:108E3000A2802FB618003600CA0000F8730A03F9A2 -:108E40001D0016130400008002A417B800001613BA -:108E50009F000014184081BC0000D80B0B0100805B -:108E6000020000B000004B1200000080020000F081 -:108E70000000E00B8001008092802FB62B00E60BF3 -:108E80001201002C82CD2EB20000161300000080CB -:108E9000020000900000E30B1D010080020000B002 -:108EA0000000E60B8001008062812FB600001613DF -:108EB00000000080020000900000E60B80000080AF -:108EC00002812FB62A0016131200002C82CD2EB27A -:108ED00000000000000000F802812F3400007D082F -:108EE00004000080028085BC00005D12000000804C -:108EF000020000F0000069060000001C0880859256 -:108F000000007F0880010080A2802FB600001613A9 -:108F10000000008002000090000016138000008016 -:108F2000E2802FB60000EE0B8001008082812FB618 -:108F3000000016130431018002006EBC00001613FD -:108F400004310080829B82BC000016130201008065 -:108F500012A082BC00000000CE0100D802800132C5 -:108F600000C0F50B1801000CA8CD3EB22080000017 -:108F70000000000808803632000038120000005C53 -:108F80001FC0F5FA0000F30300000080020000900B -:108F90000000161380000080A2802FB60000161378 -:108FA0008000008082802FB600001613040000802D -:108FB000028082BC00000000600000D80200003285 -:108FC0000000FD0B3F00003C084080B20000FD0B9C -:108FD00080010080E2812FB600000000DE0000F872 -:108FE000F2812F3400000000005801EC06C0EE3280 -:108FF000000000004D00000067E0833E000000001C -:10900000000800000700803200000000001000008F -:1090100007C08632000000000018000007C084323C -:109020000000490C04000028D8A082BC00001613E0 -:1090300009010080020000B00000000000000018DC -:10904000D8A0813C00001F0C0400003CD8E083BC89 -:109050000000161304010080028081BC0000090C8E -:109060000400008072802DBC000016131200005016 -:1090700002C038B200001D0C510000D812802D9A99 -:109080000000161312000050F2C138B40000160C94 -:10909000280000D8020000B20000130C80010080FC -:1090A000F2C185B600000F0C1F400284E60100B437 -:1090B0000000130C1D0100F822812FB40000130CD6 -:1090C000000000F862812F950000110C1D01008046 -:1090D000020000B000000000000000F862812F359F -:1090E00000000000004002800240683200001613B9 -:1090F0001F010080020000B00000150C343000E0B9 -:1091000016206EBC0000B40F00000080020000F0CA -:109110000000D50FDA5B01EC0640EDF218003600D6 -:10912000000000F8730A03F900001B0C0400008023 -:1091300072802DBC0000161380010080A2802FB623 -:109140000000160C670000F8A2802FB5000016136F -:10915000120000E802C021B20000161304010080D2 -:1091600072802DBC00000000510000D802000032C7 -:1091700000003E1000000000D82080FA0000FE0B26 -:109180004D00000067E0839E00001613120000509F -:10919000F2C138B400002C0C28000080084000B256 -:1091A0000000290C80010080F2C185B60000250C6A -:1091B0001F400284E60100B40000290C1D0100F8E4 -:1091C00022812FB40000290C000000F862812F9545 -:1091D0000000270C1D010080020000B0000000000C -:1091E000000000F862812F3500000000004002807E -:1091F00002406832000016131F010080020000B018 -:1092000000002B0C343000E016206EBC0000B40FC0 -:1092100000000080020000F00000D50FDA5B01ECD6 -:109220000640EDF200004F0C80000080E2802FB677 -:109230000000300C042100E0068081B200003E10E6 -:1092400000000034080000F200000000002000E0F0 -:109250000680813200000000003C00E806408132B8 -:109260000000360C2A1100E0D6E086BA180036005D -:10927000CA0000F8730A03F91D00360C04010080CF -:1092800002A417B80000320C9F010080180088BCAF -:1092900000001613000000800200009000004B1236 -:1092A00000000080020000F00000641100000030A7 -:1092B000030038F208003A0C231901E8762081B93E -:1092C0003E0016131200002C82CD2EB200003E0C80 -:1092D0001D1800E006C084B200003E0C8000008033 -:1092E00002812FB62A0016131200002C82CD2EB256 -:1092F00000000000000000F802812F34000054102C -:109300000000002CF90100F40000430C0400008070 -:10931000020088BC0000420C1201000009C021B20A -:1093200018003600000000F8730A03F91D00161338 -:109330000401008002A417B8000016130401008085 -:10934000028080BC000000000000007809C5853064 -:10935000000016130201008082BA97BC00001613A9 -:109360000601008092BA97BC0000F6031201006863 -:1093700002C585B0000016130000008002000090B6 -:10938000000000000030007819206E3C0000161329 -:1093900004010080E2A582BC00001613800000805A -:1093A000A2802FB60000161304010080020088BCC2 -:1093B0000000161304010080028080BC0000161318 -:1093C00012000050F2C138B400000000C0010138A2 -:1093D00008C06E320000530C040201EC16C06EBCD3 -:1093E00000C0161312000040A28D39B20000540CC8 -:1093F000C90100140800009200000000453000E0A0 -:10940000060000320000600C28000008E80100B4EB -:1094100000005D0C80010080F2C185B60000590C8F -:109420001F400284E60100B400005D0C1D0100F83D -:1094300022812FB400005D0C000000F862812F959E -:1094400000005B0C1D010080020000B00000000065 -:10945000000000F862812F3500000000004002800B -:1094600002406832000016131F010080020000B0A5 -:1094700000005F0C8000008042812FB60000B40F16 -:1094800000000080020000F00000D50FDA5B01EC64 -:109490000640EDF200200080DF000028090037328E -:1094A00000006612DE0000D8028001F208004B12B4 -:1094B000001801E8762081F90000641100000030F6 -:1094C000030038F20000660C8001008032802FB665 -:1094D0003E0016131200002C82CD2EB200006B0C41 -:1094E000290801E406C02DB20000700C1D000080A8 -:1094F000020000B00000700C8000008002812FB6D6 -:109500002A0016131200002C82CD2EB20000700C1F -:10951000000000F802812F9400006D0C1201000081 -:1095200009C021B218003600000000F8730A03F9E0 -:109530001D006F0C0401008002A417B800006C0C21 -:10954000000000141840819C2B0016131200002C00 -:1095500082CD2EB2000055100000002CF90100F45D -:109560000000730C04010080024081BC180036002A -:10957000000000F8730A03F90000161312000048F7 -:1095800002C080B2000000000000007809C58530EC -:10959000000016130201008082BA97BC0000161367 -:1095A0000601008092BA97BC0000F6031201006821 -:1095B00002C585B000001613000000800200009074 -:1095C000000016138000008082802FB60000161362 -:1095D00004310080829B82BC0000161302000080D0 -:1095E00012A082BC0000161304000080028082BC1E -:1095F0002500000000000010090036321000801223 -:1096000000000014A96080D900000000000000D80C -:109610000280013200C0840C1801000CA8CD3EB2BB -:109620002080000000000008088036320000381258 -:109630000000005C1FC0F5FA0000F303000000808A -:109640000200009000C00000000000F8A28D2F3141 -:1096500000000000000000D80200003200000000FE -:1096600000000000078081320000000000080000B8 -:1096700007008032000000000010000007C08632A2 -:10968000000000000018000007C08432000016131C -:1096900012000050F2C138B40000900C800000802D -:1096A00082802FB60000000000000068A860803CA7 -:1096B000000000000000003C084080320000D40F91 -:1096C00000000004088082F20000910C12010000EA -:1096D00009C021B218003600000000F8730A03F92F -:1096E0001D00940C0400008002A417B8000016139B -:1096F00080010080A2802FB60000900C000000F8CE -:10970000A2802F9500000000000000006820803A31 -:1097100000009A0C0400002868A082BC0000161308 -:109720000C000080020000B00000161380000080D2 -:10973000E2802FB600003E1000000080020000F022 -:109740000000860C000000D80200009200001613F2 -:1097500080000080A2802FB600000000000000D82A -:10976000028001320020008000000028090037320A -:109770000000621200000008E80100F41800360042 -:10978000CA0000F8730A03F90000A50C040201ECFA -:1097900016C06EBC00000000C00100F892802F349B -:1097A00000C0A30C12010040A28D39B200001613B4 -:1097B00000000080020000902B00A50C1201002C7C -:1097C00082CD2EB20000161300000080020000902F -:1097D000000016131F010080020000B00000A80C5A -:1097E0008001008082812FB60000161304310180B1 -:1097F00002006EBC00000000000000D802800132B0 -:109800000000AB0C12010060084023B20082B40CCF -:1098100000000008A88D809200001613120000249A -:10982000080023B2000016131200002008C023B263 -:109830000000161312000018088023B200C0C90CE3 -:109840001801000CA8CD3EB20000AE0C120000388A -:10985000028081B2000016131200003C020082B2A6 -:109860000000161312000030024082B200001613EE -:1098700012000034020086B22080000000000008C0 -:10988000A88D80320000BC0C80010080F2C185B63A -:109890000000B80C1F400284E60100B40000BC0CBC -:1098A0001D0100F822812FB40000BC0C000000F85C -:1098B00062812F950000BA0C1D010080020000B0EB -:1098C00000000000000000F862812F350000000059 -:1098D0000040028002406832000016131F01008021 -:1098E000020000B032000000000000100900363213 -:1098F0000000801200000014090080D2000016133E -:109900001200006802C585B0000000000000007869 -:1099100009C58530000016130201008082BA97BC89 -:10992000000016130601008092BA97BC0000C40C18 -:109930003400005C1FC0F5BA0000B40F00000080C6 -:10994000020000F00000C60C8000008092802FB65C -:1099500000007F08003000E00600009200007F0851 -:10996000120100E802C021B218000000000000F857 -:10997000730A03397F083600000000C002003692E7 -:1099800000000000450000D8024000320000000046 -:10999000410000000780863200000000000800003F -:1099A00007008032000000000010000007408232F3 -:1099B00000000000001800000700863200001613A7 -:1099C00012000050F2C138B400000000000000781E -:1099D000388087350000161380000080728087B6BB -:1099E0000000000000A001E016206E3A0000000018 -:1099F0000000007809C585300000000000A801E0E3 -:109A000016206E3C08000000D2010078E9E5833999 -:109A1000180016131F410284E6A197B90000D90C63 -:109A2000365101E816E083BC0000D90C1D0100800E -:109A3000020000B000000000000000F862812F3535 -:109A4000000016139F2001E0064080B20000DC0CED -:109A50008001008082812FB600000000003001E00C -:109A60000640803200000000000000D80280013271 -:109A70000000DF0C34180000078081B20000B40F32 -:109A800000000080020000F010004B1200300000C7 -:109A900017E02CF900100080003800000700373272 -:109AA0000000641100000030030038F20000E40CF4 -:109AB0008001008032802FB63E0016131200002C69 -:109AC00082CD2EB20000E90C29210000070082B2ED -:109AD0000000E70C1201000009C021B21800360096 -:109AE000000000F8730A03F91D00EF0C0401008068 -:109AF00002A417B80000E50C000000140800009252 -:109B00000000EC0C1D3100E0060000B20000EF0C7C -:109B10008001008062812FB60000161300000080D3 -:109B2000020000900000EF0C8000008002812FB640 -:109B30002A0016131200002C82CD2EB20000000065 -:109B4000000000F802812F3400005D120000002C9C -:109B5000F90100F400005410000000F8A2802FF476 -:109B60000000F40C04000080024081BC0000F40CF2 -:109B7000120100E802C021B218003600000000F80F -:109B8000730A03F90000F6031201004802C080B214 -:109B90000000161300000080020000900000FE0C80 -:109BA00080010080F2C185B60000FA0C1F400284DB -:109BB000E60100B40000FE0C1D0100F822812FB464 -:109BC0000000FE0C000000F862812F950000FC0CE4 -:109BD0001D010080020000B000000000000000F83D -:109BE00062812F3500000000004002800240683290 -:109BF000000016131F010080020000B00000000DDD -:109C000004000080024086BC0000AB1200900108F6 -:109C100009006EF20000DF1200000080020000F078 -:109C20000000070D330100D8028001B20000070DCB -:109C300080010080B20172B60000070D9FF0018024 -:109C400082DB87BC0000070D9FF8018022216EBCDB -:109C50000000000000E801E00600EE320000000015 -:109C600000F001E006C0873208000000001801E89B -:109C70007620813900000D0D80010080D2802FB642 -:109C800000000D0D04B0008002006EBC000000005A -:109C9000CD0000F872812F343D000D0D1201002C13 -:109CA00082CD2EB20000161300000080020000904A -:109CB00000001C0D270901E406C02DB200C0140DE0 -:109CC0001801000CA8CD3EB2000000000000007892 -:109CD00009C58530000016130201008082BA97BCC6 -:109CE000000016130601008092BA97BC00001613FC -:109CF0001200006802C585B020807F0800000008BF -:109D0000088036922C000000000000100900363256 -:109D1000000080120098011409006ED200000000BB -:109D2000004001E00640883200000000D508000035 -:109D300007408832000000000030000007C02C32CD -:109D400000400080CA3900000700373200001613B7 -:109D50001200004802C080B200600000000000084D -:109D6000088036320000200D1D000080020000B087 -:109D70000000200D8000008002812FB62A001613FB -:109D80001200002C82CD2EB200000000000000F86E -:109D900002812F34000055100000002CF90100F45E -:109DA000000000000000007809C58530000016138F -:109DB0000201008082BA97BC0000161306010080E1 -:109DC00092BA97BC0000F6031201006802C585B084 -:109DD0000000161300000080020000900000000048 -:109DE000545401FC02C06E3200000000000000D894 -:109DF0000280013200C02C0D1801000CA8CD3EB22B -:109E00002080000000000008088036320000F303C4 -:109E10001201002C72E02EB2000016130000008028 -:109E200002000090000016138001008082812FB68E -:109E300000008C120020001808006EF200001613BB -:109E40001F30002808006EB200000000000000A4CF -:109E500008808232000000000010006C08006E32A2 -:109E6000000000000018004C08006E3200001613BD -:109E70000400008032E186B2000032100000008051 -:109E8000020000F00000360D0050013CA85B809CF1 -:109E90000000161300000080020000900000000087 -:109EA00000500100A81B803A000000000000008064 -:109EB0000800003200000000510000D8020000320B -:109EC000000000004D00000067E0833E000000003D -:109ED00000080000070080320000000000100000B1 -:109EE00007C08632000000000018000007C084325E -:109EF00000006D0D04000028D8A082BC00001613DD -:109F000009010080020000B00000000000000018FD -:109F1000D8A0813C0000540D0400003CD8E083BC74 -:109F20000000161304010080028081BC0000450D72 -:109F30000400008072802DBC000016131200005037 -:109F400002C038B200004D0D510000D812802D9A89 -:109F50000000161312000050F2C138B41800360089 -:109F6000000000F8730A03F900004B0D04000080A4 -:109F700072802DBC0000161380010080A2802FB6D5 -:109F80000000460D670000F8A2802FB500001613F0 -:109F9000120000E802C021B2000016130401008084 -:109FA00072802DBC00000000510000D80200003279 -:109FB0000000520D2A010000D82080BA0000510D87 -:109FC0001201000009C021B218003600000000F89C -:109FD000730A03F900000000000000D80240843238 -:109FE0001D0016130400008002A417B800004610DC -:109FF0000060006C08006EF200003A0D4D00000099 -:10A0000067E0839E0000161312000050F2C138B4BE -:10A0100018003600000000F8730A03F91D005B0DFC -:10A020000400008002A417B800001613800100800D -:10A03000A2802FB60000550D670000F8A2802FB552 -:10A04000000016131200000009C021B21D001613F3 -:10A050000401008002A417B8080000000040027844 -:10A06000399AFE38000016130201008082BA97BCAC -:10A07000000016130601008092BA97BC0800161360 -:10A0800012400268129AFEB8000016130B000080FE -:10A09000020000B00000641100000030030038F23C -:10A0A000000016131F00006CD8E086BA00003210C2 -:10A0B000510000D8020000F20000650D0000003CD5 -:10A0C00008408092000016130000008002000090FB -:10A0D0000000390D04010080028081BC00006B0D7E -:10A0E00080010080A2802FB600006A0D12010000DE -:10A0F00009C021B218003600000000F8730A03F905 -:10A1000000000000000000D8024084321D00161339 -:10A110000400008002A417B8000046100060006C24 -:10A1200008006EF200003A0D4D00000067E0839ECB -:10A130000000161380000080A2802FB600000000EF -:10A14000C001013808C06E3200000000453000E058 -:10A15000060000320000161312000050F2C138B49D -:10A160000000750D040201EC16C06EBC000000007A -:10A17000C90100141840813A00C0750D1201004059 -:10A18000A28D39B20000161300000080020000907A -:10A1900000C00000000000F8A28D2F310000000078 -:10A1A00000A8012099226E3A0000161306010280D1 -:10A1B000821B92BC000016139F2001E096226EBC09 -:10A1C00000007B0D80000080F2802FB60000C70FDA -:10A1D00000000080020000F000007F0D0400003C41 -:10A1E000D8E083BC00007E0D9F3101E096226EBC5A -:10A1F00000000000003001E0060000320000860D83 -:10A20000005001E8F660809C0800000000400278E1 -:10A21000399AFE38000016130201008082BA97BCFA -:10A22000000016130601008092BA97BC08000000D7 -:10A2300000400268129AFE380000850D9F3101E04F -:10A2400096226EBC00000000003001E006000032E3 -:10A2500000000000005001E806000032000000008D -:10A2600000A801E00600923218003600000000F855 -:10A27000730A03F91D008B0D0400008002A417B8B7 -:10A280000000870D04000014184081BC0000161364 -:10A290000000008002000090000016138000008083 -:10A2A00072802FB600000000000000D8028001324A -:10A2B00000200080000000280900373200006612EC -:10A2C00000000008E80100F4000016131200004826 -:10A2D00002C080B20000641100000030030038F2B8 -:10A2E0000000930D23010014184081BA3E0016139C -:10A2F0001200002C82CD2EB20000161380010080C7 -:10A30000A2802FB618003600CA0000F8730A03F9BD -:10A310001D0016130400008002A417B800001613D5 -:10A320009F000014184081BC0000940D0B010080B8 -:10A33000020000B000004B1200000080020000F09C -:10A3400000009C0D2931010C09006EB22B007D0824 -:10A350001201002C82CD2EB20000161300000080E6 -:10A36000020000900000BE0F000C020009806EF297 -:10A370000000A50D000000800200009000005D12AA -:10A3800000000080020000F0000000000000001C3F -:10A39000080090320000A40D04000028098080B25B -:10A3A00000008111000000D8020000D20000A40DBE -:10A3B00004000080028092BC18003600000000F803 -:10A3C000730A03F900006806000000080800009204 -:10A3D0000000A80D1D010080020000B000007D08F3 -:10A3E0008001008062812FB60000161300000080FB -:10A3F0000200009000007D088000008002812FB6DE -:10A400002A0016131200002C82CD2EB200007D0807 -:10A41000000000F802812F940000161380010080D4 -:10A4200082812FB60000161304000018094081B283 -:10A430000000E30F00000080020000F00000C70FE2 -:10A4400000A8012009006EF2000000000030010C9D -:10A4500009006E320000BE0F000C020009806EF28F -:10A4600000007F08000000800200009000004B12F6 -:10A4700000000080020000F000005D12000000807B -:10A48000020000F0000068060000001C0800909226 -:10A4900000000000545401FC02C06E32000016138C -:10A4A0008001008082812FB6000016131F000080FB -:10A4B000020000B010000000000000A8780B163861 -:10A4C00008000000000000AC780B16380000000007 -:10A4D000000000B0A8002D3700040100000000B00B -:10A4E000C80D8B3A00000000005001B408806E32A5 -:10A4F0000000C70D0431019008006EB20200000098 -:10A50000000000C8828D8A3700000000000000C8EB -:10A51000C2A22C3A1800C50D86410278880D78B683 -:10A520000000161304000080A2E28ABC000016138B -:10A5300004410280B23F78B00000BE0D9F0100A828 -:10A5400018808ABC9F00BE0D000000A8080036924B -:10A550000000000000400204B83F78300000DA0D2F -:10A5600000000004D862809C00001613020C0280D8 -:10A57000A21B89BC000016138000008082802FB6C9 -:10A5800002000000000000C8828D8A370000000031 -:10A59000000000C8C2A22C3A1800D00D86410278F3 -:10A5A000880D78B60000161304000080A2E28ABC71 -:10A5B0000000161304410280B23F78B00000C90DBC -:10A5C0009F0100A818808ABC9F00C90D000000A848 -:10A5D000080036920000D30D28400204B83F78B03E -:10A5E00000000000C8010004D862803C000016137F -:10A5F0009F000080024080B20000D70D0201009051 -:10A60000182089BC00000000000000B408000032DF -:10A610000000C90D9F0100A818808ABC9F00C90DC9 -:10A62000000000A8080036920000DA0D0400009037 -:10A63000182089BA000016139F000004486280BCED -:10A6400000001613900000B448628BBA0300161382 -:10A6500004400200081EFFB80000E20D00000000E8 -:10A66000D822809A0000090E04000080A2E28ABC71 -:10A6700002000000000000C8828D8A370000000040 -:10A68000000000C8C2A22C3A1800070E86400278CB -:10A69000880D78B60000161304400204B83F78B065 -:10A6A0000300161304400200081EFFB83800000023 -:10A6B0000000001009003632000080120000001473 -:10A6C000090080D20000E80D12010060084023B2AA -:10A6D0000082000000000008088036320000F3030A -:10A6E0001201002C72E02EB2000016130000008050 -:10A6F000020000900000161312000024080023B28C -:10A70000000016131200002008C023B20000161328 -:10A7100012000018088023B200000000000000D8DA -:10A720000280013200C0F20D1801000CA8CD3EB22B -:10A730000000EC0D12000038028081B200001613F8 -:10A740001200003C020082B200001613120000301A -:10A75000024082B20000161312000034020086B2DA -:10A760002080E60D000000080880369200000000FE -:10A77000000000D802000032000000000038020093 -:10A78000B81B803A00000000643001E016206E3AE9 -:10A7900000000000000000000740803200000000C0 -:10A7A00000080000070080320000000000100000D8 -:10A7B00007408232000000000018000007008632C7 -:10A7C0000000161312000050F2C138B4000000005F -:10A7D000000000D8028001320000000000180000D4 -:10A7E0000780813200000000002000000700823254 -:10A7F000100000000030000017E02C3900000000BD -:10A8000000380000F7010B340000010E80010080C9 -:10A81000328087B60000000000380000B7017034B5 -:10A820000000000000000008E80100340000130EE2 -:10A83000020C0280A21B89BC18003600000000F840 -:10A84000730A03F90000641100000030030038F2BD -:10A85000000016131200004802C080B21800360033 -:10A86000000000F8730A03F90000DC0D9F0100A846 -:10A8700018808ABC9F00DC0D000000A808003692FA -:10A8800028000C0E0401008082CD81BC0000000075 -:10A890000020017809006E320000161304010080C8 -:10A8A00042A297BC00000E0E8001008032802FB6BD -:10A8B0003E0016131200002C82CD2EB20000100EA6 -:10A8C0001D010080020000B000007D08000000F8BB -:10A8D00062812F9500007D088000008002812FB6E4 -:10A8E0002A0016131200002C82CD2EB200007D0823 -:10A8F000000000F802812F940000000000380000E2 -:10A90000C70170340000641100000030030038F209 -:10A910000800170E231901E8762081B93E001613AE -:10A920001200002C82CD2EB20000190E1D010080F5 -:10A93000020000B000001C0E000000F862812F959C -:10A9400000001C0E8000008002812FB62A00161322 -:10A950001200002C82CD2EB200000000000000F892 -:10A9600002812F340000161380000080A2802FB6D1 -:10A97000000054100000002CF90100F40000200E2B -:10A98000120100E802C021B218003600000000F8F1 -:10A99000730A03F9000016131200004802C080B2C7 -:10A9A0000000F603000000F8A2802F9400000000D1 -:10A9B000000000D8028001320000000000300028B2 -:10A9C00008006E3200000000545401FC02C06E32D8 -:10A9D00000C02E0E1801000CA8CD3EB22080000051 -:10A9E000000000280980363200008111000000D8E4 -:10A9F000020000D200002B0E04000080028092BCF6 -:10AA000018000000000000F8730A03392C0E36000D -:10AA1000000000C00200369218003600000000F866 -:10AA2000738A03F900000000000000D802800132A0 -:10AA300000C02B0E1800000CA8CD3EB200200084F0 -:10AA400000000028090037320000621200000008F0 -:10AA5000E80100F400007D08000000800200009082 -:10AA600000000000000000D8028001320000000059 -:10AA7000545401FC02C06E3200C0370E1801000CA5 -:10AA8000A8CD3EB2208000000000000808803632C9 -:10AA90000000EF031201002C72E02EB2000016132A -:10AAA00000000080020000900000F3110000002868 -:10AAB000090002F200003F0E0000005C0800009256 -:10AAC00000000000000000D80280013200000000F9 -:10AAD000545401FC02C06E3200C03F0E1801000C3D -:10AAE000A8CD3EB220800000000000080880363269 -:10AAF000000038120000005C1FC0F5FA0000F303EC -:10AB000000000080020000900000000000300028DB -:10AB100008006E320020008400000028090037324F -:10AB20000000621200000008E80100F40000440E7A -:10AB300000000080020000900000000000000008FB -:10AB40000800003200004A0E0400008002C085B2F6 -:10AB500000004A0E80000080F2C185B60000490E58 -:10AB60001C41028006C085B20000000000000068A1 -:10AB700002C5853000000000000000701F00F73A99 -:10AB800000000000000000F822812F340000D00EE9 -:10AB900080010080A2802FB618000000000000F89D -:10ABA000730A0339D00E3600CA0000C00200369284 -:10ABB0000000990E8001008082812FB60000A10E56 -:10ABC0001F20010809006EB20000990E0430010830 -:10ABD000899B90BC0000560E0431018002006EBCBF -:10ABE0000000321000000080020000F00000540E4F -:10ABF0000050014808806E9200001613000000808B -:10AC00000200009000000000000000042861803C69 -:10AC100000006B0E000000002821809A000016132F -:10AC20009F000080028090B2000032100030014886 -:10AC300008006EF200005A0E00500104A85B809CD0 -:10AC400000001613000000800200009000000000C9 -:10AC500000500100A81B803A0000680E0700004861 -:10AC600018A084BC0800000000400200189AFE38BA -:10AC70000000161302010080823A80BC0000161307 -:10AC800006010080923A80BC0000000000000068CD -:10AC9000020080320000321000000080020000F04C -:10ACA0000000630E000000800200009000001613F8 -:10ACB00000000080020000900000680E07000048BD -:10ACC00018A084BC0800000000400200189AFE385A -:10ACD0000000161302010080823A80BC00001613A7 -:10ACE00006010080923A80BC0000600E00000068FF -:10ACF0000200809200006B0E0400004818A084BA85 -:10AD0000000016139F000004286180BC00000000B2 -:10AD1000000000002821803A00000000005401FCDF -:10AD200002C06E320000740E12010060084023B2AF -:10AD300000820000D6010008088036320300161396 -:10AD400004400200381AFFB8030000000000007839 -:10AD50000960803918000000D241028CE6A19739C1 -:10AD600000000000005001E8068084322900F3034F -:10AD70001201002C82CD2EB20000161300000080BC -:10AD8000020000900000161312000024080023B2F5 -:10AD9000000016131200002008C023B20000161392 -:10ADA00012000018088023B200000000000000D844 -:10ADB0000280013200C07F0E1801000CA8CD3EB207 -:10ADC00020800000D6010008088036320000790E8D -:10ADD00012000038028081B2000016131200003CFD -:10ADE000020082B20000161312000030024082B24C -:10ADF00000006E0E12010034020086B2000016132D -:10AE00000000008002000090080000000040025C8A -:10AE1000189AFE38000000000000004808000032C8 -:10AE200000000000000000D8020000320000000016 -:10AE30000000000007408032000000000008000011 -:10AE4000070080320000000000100000074082323E -:10AE500000000000001800000700863200001613F2 -:10AE600012000050F2C138B400000000D60100D832 -:10AE700002800132000000000018000007808132CB -:10AE800000000000002000000700823210000000D7 -:10AE90000030000017E02C3900008E0E800000808A -:10AEA000328087B60010008000380000070037327B -:10AEB00000008F0E0000008002000090001000884B -:10AEC000003800000700373218003600000000F894 -:10AED000730A03F9000000000000006802C0853218 -:10AEE000000016130201008082FA85BC00001613D0 -:10AEF0000601008092FA85BC0000000000000008F6 -:10AF0000E8010034000016131200004802C080B2AD -:10AF100018003600000000F8730A03F90000321030 -:10AF200000000080020000F000006B0E00000080B6 -:10AF3000020000900000A10E0000008002000090BE -:10AF40000000321000000080020000F000009C0EA3 -:10AF500000380200B81B809C0000A10E0000008099 -:10AF600002000090050000000000006802A0FE380A -:10AF7000050000000000007809A0FE38000016134C -:10AF80000201008082BA97BC0000161306010080FF -:10AF900092BA97BC0000990E00400280024068926D -:10AFA00000000000CA0100D8020000320000A50E17 -:10AFB00004B8018002006EBC000016139FB801782F -:10AFC000891BEEBC0000000000B801E0861BEE3CCF -:10AFD0004C000000000000000700363200000000B6 -:10AFE00000000078A9002D37B4040100000800001B -:10AFF000C78D973A000000000000007899C02C37F8 -:10B00000B400000000000078898D973A0000161304 -:10B010000210000087BF97BA00000000001800006F -:10B020000740FE320000161312000048F2C138B487 -:10B030000000AD0EB6000080020000B00020161324 -:10B0400012000064A2CD2CB200000000A600008017 -:10B05000020000300000B20E80010080A2802FB6F6 -:10B0600018003600CA0000F8730A03F900007D08D2 -:10B07000005401FC02C06E92000016138001008093 -:10B0800062812FB6000016138001008082812FB6E6 -:10B09000000016131F000080020000B00000000036 -:10B0A000005401FC02C06E320000BB0E12010060B1 -:10B0B000084023B2008200000000000808803632F9 -:10B0C0002900F3031201002C82CD2EB200001613CA -:10B0D00000000080020000900000161312000024FF -:10B0E000080023B2000016131200002008C023B28B -:10B0F0000000161312000018088023B200000000A0 -:10B10000000000D80280013200C0C60E1801000CF9 -:10B11000A8CD3EB220800000000000080880363232 -:10B120000000C00E12000038028081B20000161329 -:10B130001200003C020082B2000016131200003020 -:10B14000024082B20000B90E12010034020086B241 -:10B150000000161300000080020000900000321072 -:10B1600000000048080000F20800C90E0040025C20 -:10B17000189AFE980000161300000080020000904C -:10B180000000000000500100A81B803A0000810E62 -:10B190000000004808000092000016131F01008004 -:10B1A000020000B000000000005401FC02C06E323A -:10B1B0000000F31100000028098002F20000AD0E2B -:10B1C00000000080020000900000F3110000002841 -:10B1D000090002F20000D30E9A0100F862812FB438 -:10B1E00010240000000000F8A28D2F3100000000A4 -:10B1F00000D601EC06C06E342E007D081201002C32 -:10B2000082CD2EB2000016130000008002000090D4 -:10B210000000161304A9018002006EB20000DE0EC9 -:10B2200080010080F2C185B60000DA0E1F40028462 -:10B23000E60100B40000DE0E1D0100F822812FB4EB -:10B240000000DE0E000000F862812F950000DC0E89 -:10B250001D010080020000B000000000000000F8A6 -:10B2600062812F35000000000040028002406832F9 -:10B27000000016131F010080020000B00000E00E65 -:10B2800004980164881B87BC0000AB120090010881 -:10B2900009006EF20000DF1200000080020000F0E2 -:10B2A000000000000000007809C58530000016137A -:10B2B0000201008082BA97BC0000161306010080CC -:10B2C00092BA97BC000016131200006802C585B040 -:10B2D00000000000000000F8D2802F3500007F0839 -:10B2E000370000F8D2812FB400000000000000F801 -:10B2F00072812F343D007F081201002C82CD2EB2C6 -:10B300000000161300000080020000900000F20E02 -:10B3100080010080F2C185B60000EE0E1F4002845D -:10B32000E60100B40000F20E1D0100F822812FB4E6 -:10B330000000F20E000000F862812F950000F00E70 -:10B340001D010080020000B000000000000000F8B5 -:10B3500062812F3500000000004002800240683208 -:10B36000000016131F010080020000B00000000062 -:10B3700000D401EC16C06E3A000000000000007816 -:10B3800009C58530000016130201008082BA97BCFF -:10B39000000016130601008092BA97BC0000161335 -:10B3A0001200006802C585B000007F0804B000806C -:10B3B00002006EBC37007F081201002C82CD2EB235 -:10B3C0000000161300000080020000900000020F31 -:10B3D00080010080F2C185B60000FE0E1F4002848D -:10B3E000E60100B40000020F1D0100F822812FB415 -:10B3F0000000020F000000F862812F950000000F8E -:10B400001D010080020000B000000000000000F8F4 -:10B4100062812F3500000000004002800240683247 -:10B42000000016131F010080020000B000000F0F83 -:10B43000000000800200009000000B0F80010080DF -:10B44000F2C185B60000070F1F400284E60100B478 -:10B4500000000B0F1D0100F822812FB400000B0F1C -:10B46000000000F862812F950000090F1D01008087 -:10B47000020000B000000000000000F862812F35DB -:10B4800000000000004002800240683200001613F5 -:10B490001F010080020000B000000F0F370000F80D -:10B4A000D2812FB400000000000000F872812F3418 -:10B4B0003D000F0F1201002C82CD2EB2000016139A -:10B4C00000000080020000900000000000D401ECA9 -:10B4D00006000032000000000000007809C5853039 -:10B4E000000016130201008082BA97BC00001613F8 -:10B4F0000601008092BA97BC00007F081201006824 -:10B5000002C585B000001613000000800200009004 -:10B5100000007D0880010080F2812FB600007D08C8 -:10B5200080000080E2812FB60000190F80000080AB -:10B5300002812FB6000016131D010080020000B02A -:10B54000000016130458018002C06EBC00007D0884 -:10B55000085901EC06FB6EBC00000000000000D89A -:10B560000280013200000000545401FC02C06E321F -:10B5700000C0220F1801000CA8CD3EB20000000050 -:10B58000005801EC06FB6E3A208000000000000825 -:10B59000088036320000EF031201002C72E02EB258 -:10B5A00000001613000000800200009000005D12F1 -:10B5B000000000F8E2812FF40000250F060301804F -:10B5C00012C06EBC190068060000001C080036920C -:10B5D0001A0068060000001C0800369200001613CE -:10B5E00080010080F2812FB60000161380010080D8 -:10B5F000E2812FB60000161304550180B2DB2FBC88 -:10B6000000C00000000000F8A28D2F3100000000F3 -:10B61000000000D802800132002000C00000002895 -:10B6200009003732000000000030002808006E32A8 -:10B6300000000000453000E0060000320000621209 -:10B6400000000008E80100F40000340F040201ECDF -:10B6500016C06EBC00000000C90100141840813AF9 -:10B6600000000000000000F802802F3400C0340FFA -:10B6700012010040A28D39B20000161300000080B4 -:10B680000200009018003600CA0000F8730A03F99F -:10B690000000340F9F010014184081BC00007F0897 -:10B6A0008001008092802FB62B007F081201002CB1 -:10B6B00082CD2EB200001613000000800200009020 -:10B6C000000016131F0100D8028001B20000000024 -:10B6D000005401FC02C06E3200C0440F1801000C7F -:10B6E000A8CD3EB22080000000000028098036323C -:10B6F00000008111000000D8020000D20000410FBC -:10B7000004000080028092BC18000000000000F8D5 -:10B71000730A0339420F3600000000C0020036925F -:10B7200018003600000000F8738A03F900000000DA -:10B73000000000D80280013200C0410F1800000C48 -:10B74000A8CD3EB200005D12000000D8024000F219 -:10B7500000F04C0F1D400200A80D68B10000161348 -:10B760000B000080020000B0000016131E4002848F -:10B77000060000B200004A0F12000028020580B047 -:10B780000800450F000000F8234001990000450F14 -:10B7900012010068020580B000001613000000804E -:10B7A0000200009000004C0FB5000080020000B0C5 -:10B7B00000000000A50080A0360B6A3500000000E4 -:10B7C0000000005009C02932000000000056012886 -:10B7D00008C06E320000000000000078390B2E32E5 -:10B7E0000000000000000020F38197340000560F95 -:10B7F00004000078D90130B600001613040100805F -:10B80000328097BC0000000000000000B905303015 -:10B8100018000000000000F803A403390000000035 -:10B8200000000034330B2F3200006F0F040000784B -:10B83000D90130B60000161304010080328097BC95 -:10B840000000000000000078B905303000005D0FF6 -:10B850000400008042E529BC00000000000000F860 -:10B860000200003218000000000000F8738A02395C -:10B87000000000000000009C028097320A000000D7 -:10B880000000001009003632000080120000001491 -:10B8900009C029D20000690F25010008080000B284 -:10B8A0000000161380000080F20180B60000000046 -:10B8B0000000002C090580300000161302010080F2 -:10B8C00082FA92BC000016130601008092FA92BC24 -:10B8D0000000670F12000028020580B00800690F01 -:10B8E000000000F8234001990000690F1201006870 -:10B8F000020580B0000016130000008002000090D6 -:10B9000000006D0F0400008002402FBC000000000A -:10B910000000007809002C32210316130400008077 -:10B92000828D97BC9603161304000080828D97BC0D -:10B930000000161380000080A2802FB60000560F72 -:10B94000000000F4020000920000730F0400008069 -:10B9500042E529BC00000000000000F802000032AF -:10B9600018000000000000F8738A0239000000008F -:10B970000000009C0200953200000000CA0100D8BF -:10B9800002800132000000000030000007C02C32AD -:10B99000001000A00038000007003732000000004F -:10B9A000002000000700EE32000000000038000C0C -:10B9B00007808232000016131200004802C080B2D5 -:10B9C0000000F60300000008E80100940000930F57 -:10B9D00002000080A24280BC0000930F8000008023 -:10B9E000F2C185B60000930F1F400208B9BF68B0CE -:10B9F0000000830F80410280E28168B608000000E9 -:10BA00000000001079618039000016139F2001E0CA -:10BA100016206EBA00000000000000F822812F34CA -:10BA20001800000000400288E62191390000000063 -:10BA30000001005C08000072000000000000000C23 -:10BA400019A0903A0000930F06010080D2FF90BC2D -:10BA50000000870F2C410278F98168B400000000D3 -:10BA600000000078B9819734010000000000001048 -:10BA700009003632000080120000001459C085D73A -:10BA80000300000000400200291AFF3800000000F7 -:10BA900000380200B91B903A00000000D241028831 -:10BAA00016A0973A00000000450000D8024000327E -:10BAB000000016139F2001E016206EBA000000005F -:10BAC0000000000007408032000000000008000075 -:10BAD0002724903A000000000010000007008A327E -:10BAE0000000000012010058F2C138740000161363 -:10BAF00000000080020000900800A20F1A0000342D -:10BB0000796180B90000AE0F1E010080020000B014 -:10BB10000000AE0F1F400200094068B20000950F00 -:10BB200080000080E20190B6000016133800005437 -:10BB30001F40F5BA0000000000000008B93F903037 -:10BB400000000000002801E026246E3A08001613C9 -:10BB50001E00000009A4FEB83D0000000000001017 -:10BB6000090036320000801200000014090090D253 -:10BB70000000000000000078090590300000161356 -:10BB80000201008082BA97BC0000161306010080F3 -:10BB900092BA97BC0000AE0F12010068020590B087 -:10BBA0000000161300000080020000900000AE0F9D -:10BBB0008000008082812FB60000AC0F1F41020080 -:10BBC000094068B200000000002801E016206E3A2B -:10BBD0000000A80F80010080F2C185B600000000BF -:10BBE00000400284E60100340000000000000080F4 -:10BBF0000200003000000000004002800240683275 -:10BC000000001613380000541F40F5BA0000161348 -:10BC10009F2001E016206EBA0000000000010080A5 -:10BC2000020000700000A30F80000080E20190B6C7 -:10BC30000000970F000000541F40F59A000000001C -:10BC40000000005C08000032000016139F2001E095 -:10BC500016206EBA00000000000000F822812F3488 -:10BC6000180000001E410284E6619379000016135B -:10BC700000000080020000900000FFFF0000008034 -:10BC8000020000900000B90F1D5D01EC16C06EBCF3 -:10BC9000000000000F010080020000700000161379 -:10BCA000045D018002C06EBC00001613800000809D -:10BCB00042812FB600000000000100F8B2802F740E -:10BCC000000000000F010080020000700000B70FAC -:10BCD000045E01EC16C06EBC00000000005C01ECCC -:10BCE00006400032000000000001008002000070E9 -:10BCF0000000FFFF00000080020000900000000034 -:10BD00000420018082DB907C000016130420018057 -:10BD100002006EBC000016131F000080020000B07D -:10BD200000000000020C0280A2DB907C0000C40F27 -:10BD300006210180821B90BC2700C50F0000000077 -:10BD40000900369228000000000000000900363289 -:10BD5000000000000000008812002C3A0000FFFFE5 -:10BD600000000080020000900600000000000010AB -:10BD7000090036320000801200000014090092D23F -:10BD80000000161304000080020092BC00000000B6 -:10BD90002FA00178891B927A0000000006880178A4 -:10BDA000899B977C000000000034020409C06E3DAE -:10BDB00000000000000C020019A46E370000D20F32 -:10BDC0000200008002A497BC0000D20F0200008095 -:10BDD000020000B00100000000000078898D973754 -:10BDE0000000000002010280829B977C000000009E -:10BDF000000100F8F2802F740000FFFF00000080B7 -:10BE00000200009000000000DA5B01EC0640ED3219 -:10BE10002D000000000000100900363200008012E2 -:10BE2000005C011409806ED20000DA0F040100806A -:10BE3000024086BC0000000000A001E016206E3A1F -:10BE40000000DC0F00D401EC060000920000AB12F1 -:10BE50000090010809006EF20000000000A001E05F -:10BE600016206E3A0000DF12330100F882802FB4F2 -:10BE70000000DF129FF0018082DB87BC0000DF1230 -:10BE80009FF8018022216EBC0000000000E801E064 -:10BE90000600EE320000000000F001E006C087322C -:10BEA0000000DF1200000080020000900000FFFF91 -:10BEB00000000080020000900000161308000080BF -:10BEC000028091BC11000000000000100900363211 -:10BED0001000801200500114A99B91D91500000098 -:10BEE000000000100900363210000000002001148C -:10BEF000890D6E370000801200300114895B91D2E9 -:10BF00001A00000000000010090036320000801204 -:10BF10000000001409C02DD2000016130621018074 -:10BF2000829B91BC0000000000A8017809006E32DD -:10BF30000000161306010280829B97BC00000110CE -:10BF40000421013069246EBC000000000050010093 -:10BF5000A99B913A0000F90F1F400224094068B2E2 -:10BF60000000F00F80000080E24192B60000000067 -:10BF700000000008B97F92300000000000000000BF -:10BF80002924903C080000000000007899A4FE38A5 -:10BF9000000016130201008082BA97BC000016133D -:10BFA0000601008092BA97BC0800F00F12010068E9 -:10BFB00092A4FEB80000161300000080020000905A -:10BFC0000000161304290180821B90BC00000000B1 -:10BFD00000A801E066246E3A000016139F2001E0DD -:10BFE000060093B20000FE0F8000008082812FB611 -:10BFF0000000FF0F002801E0060000920000000092 -:10C00000003001E00600003200000000005001E8AE -:10C0100006000032000000000001008002000070F5 -:10C020000000071038510100A99B91BA00000510CB -:10C0300004410208B9FF68B0000016138041028075 -:10C04000E2C168B60000021000400280024068921F -:10C05000000014109F3101E066246EBC0000141033 -:10C06000003001E0060000920000111004280104D5 -:10C0700009006EB20000161306500180A25B90BC4E -:10C0800000000F109F010000192490BC0000000068 -:10C0900000A801E066246E3A00000000002801E0DC -:10C0A0000624003C00000000005001E806000032B9 -:10C0B000000016139F2001E0060093B2000000006C -:10C0C000000100800200007000000000002801E074 -:10C0D0000600003200001D1004000080020090BC29 -:10C0E0000000141004410208B9FF68B000001613E4 -:10C0F00080410280E2C168B6000011100040028059 -:10C10000024068920000181002000080222490BCB7 -:10C1100000001D1080400280F2C168B600000000DF -:10C120000040028CB6C1683500001D10000000F808 -:10C1300022812F940800000000400278399AFE38CE -:10C14000000016130201008082BA97BC000016138B -:10C150000601008092BA97BC0800161312400268CC -:10C16000129AFEB80000111004010000292490BCAE -:10C17000000000000000000809000032100000006C -:10C1800000000010790B1638080000000000000CB9 -:10C19000790B1638000016130400008042E490BCAE -:10C1A0000000000000000004A9002D370004010079 -:10C1B00000000004C94D903A02000000000000A8F1 -:10C1C000820D913700000000000000A812A42A3A56 -:10C1D0000000281080400280E2017CB600001613A7 -:10C1E00004400278B93F7CB0000000000000000865 -:10C1F000E9A5903A00002A109F010010190091BC97 -:10C200009F000000000000100900363200002310DB -:10C210000401008042E490BC0000000000000078AF -:10C22000C924903A000016130401008022A497BC90 -:10C230000000000000A801E066246E3A0000000043 -:10C24000005001E806009032000016139F2001E024 -:10C25000060093B2000000000001008002000070A0 -:10C260000000FFFF00000080020000901800341062 -:10C270001F41027888CD68B60000000000000088E9 -:10C2800012002C3A0000371080010080628087B6CF -:10C290000000161304410280B2FF68B000003210A3 -:10C2A000004002800240689203001613044002001E -:10C2B000381AFFB8000016131F400204B8FF68B018 -:10C2C0000000000000380200B81B803A2E00000079 -:10C2D0000000001009003632000080120000001437 -:10C2E000090080D200000000000100800200007000 -:10C2F0000000FFFF000000800200009000004510D9 -:10C3000080010080A2802FB60000421012010000C0 -:10C3100009C021B218003600000000F8730A03F9C2 -:10C3200000000000000000D8024084321D004510CB -:10C330000401008002A417B800003F109F01008094 -:10C34000180088BC00001613000000800200009056 -:10C35000000000000060006C08006E320000000069 -:10C36000CA68004C08006E320000161304700018F2 -:10C3700008006EB2200000000000001009003632F4 -:10C380001000801200000014A96081D90000000094 -:10C3900004000080A2A0817C000016130D01008023 -:10C3A000020000B000004F1080010080E2802FB634 -:10C3B00000004F101B000080020000B000000000D1 -:10C3C0000600008062E0837C000016139F000014CA -:10C3D000184081BC00000000CA0100F802802F351F -:10C3E00000A0000012010040A28D39720000161357 -:10C3F00000000080020000900000FFFF00000080AD -:10C400000200009000000000000801E406C02D3288 -:10C41000EEFF0000001001E0868D2F3100000000CB -:10C420000000001CB3E4393200005B100400007807 -:10C43000D90130B60000161304010080328097BC89 -:10C440000000000000000078B9053030180000003E -:10C45000000000F8E3A503390000000000000034EC -:10C46000330B2F320000000004000078D901307631 -:10C470000000161304010080328097BC0000000009 -:10C4800000000078B905303018000000000100F805 -:10C49000E3A503790000FFFF000000800200009088 -:10C4A000000016130401008002002DBC00001613CA -:10C4B0000401008002802DBC00000000000000CCC0 -:10C4C00002000032000066102000012C09C06EB28C -:10C4D00000006710001686CC06C092920000000093 -:10C4E000001486CC06C09232000000001201004009 -:10C4F000628E92520000161300000080020000902D -:10C500000000FFFF000000800200009000006D109E -:10C5100004000078D90130B6000016130401008031 -:10C52000428097BC6D103600000000C002003692B9 -:10C530006000161304010080828D2FB100000000FE -:10C54000000000140300383200000000000000E08A -:10C55000020030320000B91004000024D80130B6C7 -:10C560007210000000000088824D823A000016130D -:10C570000000008002000090000016130000008000 -:10C5800002000090000016130000008002000090DE -:10C590000000161300000080020000906D103600AD -:10C5A000000000C00200369200009E1000000080D3 -:10C5B0000200009000007A10000000204805309032 -:10C5C000000016130000008002000090000086109A -:10C5D000921101BC08006EB200000000000801DCEE -:10C5E00002406E3200007E101F1101E026C18BB5A3 -:10C5F000000086101D000080020000B00000000056 -:10C60000000000D80200003280020000000000009C -:10C61000070036320000000000000078A9002D3726 -:10C620002005010000080000C78D973A0A000000AD -:10C6300000000078890D8237000000000010000023 -:10C64000A7BA973A000000000018000007C0EA32BD -:10C65000000016131200004802C038B200008A1011 -:10C66000800E01BC08C06EB2000000000000000097 -:10C67000190E823200E0921012010048A20D90B211 -:10C68000000016130000008002000090000000006F -:10C69000000000D802400032B4000000000000009A -:10C6A000070036320000000000000078A9002D3796 -:10C6B0000004010000080000C78D973A0000000048 -:10C6C0000000007899008237000016130210000065 -:10C6D00087BF97BA00000000001800000740FE3234 -:10C6E0000000161312000048F2C138B418003600DA -:10C6F000000000F8730A03F90000000000000004C5 -:10C70000896038321D0000000000007809A4173845 -:10C71000000098108000008002C08BB600009910C5 -:10C7200004000080328097BC0000161300000080D7 -:10C73000020000900000161304010080028097BCE4 -:10C740000000000000000018F341903400009E102B -:10C7500004000078D90130B60000161304010080EF -:10C76000328097BC0000000000000000B9053030A6 -:10C7700018000000000000F803A4033900000000C6 -:10C780000000000019CE2C32006016131200004089 -:10C79000A20D90B200000000000000D8020000329C -:10C7A00060000000000000000700363200000000BA -:10C7B000000000BCA8002D37A00701000008000001 -:10C7C000C7CD8B3A0A0000000000007889CD2C37D5 -:10C7D0008002000000000078898D973A0000000078 -:10C7E00000100000A7BA973A0000000000180000EF -:10C7F00007C0EA320000161312000040F2C138B43C -:10C8000018003600000000F8730A03F90000000069 -:10C81000000801DC02406E321D00000000000078BC -:10C8200009A417380000161304010080028097BC89 -:10C83000000016138010018022016EB60A00B010AD -:10C840001F01007889CD2CB70000B7101D1001F82A -:10C8500002006EB2800200000000000007003632C5 -:10C860002005010000080000C7CD8B3A0000000041 -:10C8700000100000A7BA973A00000000001800005E -:10C8800007C0EA320000161312000040F2C138B4AB -:10C8900018003600000000F8730A03F900000000D9 -:10C8A000001001F802006E32EEFF16130401008042 -:10C8B000828D2FB000000000000100800200007097 -:10C8C000EEFF161304110180820D6EB0000000000F -:10C8D000001001F802006E3200000000000901DCC7 -:10C8E00002406E720000FFFF000000800200009016 -:10C8F0000000000000000000090000320E000000EF -:10C9000000000004894D0D3600000000000000000A -:10C9100007800B3200000000000800000700903282 -:10C920000000000000100000070036320000C210B6 -:10C930001200004CF2C138B400000000000000807A -:10C94000020000300000C3101200008002C021B2BB -:10C950000000000000000000E902903A0000BF1053 -:10C9600004010004194090BC000000000001008098 -:10C97000020000500000FFFF000000800200009055 -:10C980000000D21080010080A2802FB60000CC10E1 -:10C99000120100E802C021B218003600000000F8C1 -:10C9A000730A03F90000D1100400008002802DBC3E -:10C9B000000016130401008022802DBC0000161315 -:10C9C0009F000080180088BC0000CC10120100E815 -:10C9D00002C021B20000CB100000008002000090D5 -:10C9E00000000000CA0000D8024084320000161384 -:10C9F0000401008002402DBC0000161304000080DA -:10CA000002802DBC000000000040006C881C833AAE -:10CA1000000000000048004C0800723200001613AD -:10CA200008500018C82072BC0000000004000080FC -:10CA30000240817C00000000000000141840813C8E -:10CA40000000161302000020880182BA00000000D6 -:10CA5000000000D8020000320000000000000000CA -:10CA6000070006320000161304010080020036BCE5 -:10CA70000700000000080000774A093900000000A4 -:10CA8000001000000700823200000000CA190000F8 -:10CA9000074082320000161312000040F2C138B481 -:10CAA00000000000000100D8024084720000FFFF77 -:10CAB0000000008002000090000000004D00000017 -:10CAC00067E0833E0000000000080000070080329D -:10CAD000000000000010000007C0863200000000C7 -:10CAE0000018000007C0843200003C110400002838 -:10CAF000D8A082BC0000161309010080020000B01B -:10CB00000000000000000018D8A0813C0000FE10CA -:10CB10000400003CD8E083BC000016130401008030 -:10CB2000028081BC0000EF100400008072802DBCE8 -:10CB3000000016131200005002C038B20000F710B7 -:10CB4000510000D812802D9A0000161312000050D8 -:10CB5000F2C138B418003600000000F8730A03F977 -:10CB60000000F5100400008072802DBC0000161338 -:10CB700080010080A2802FB60000F010670000F84E -:10CB8000A2802FB500001613120000E802C021B2E7 -:10CB9000000016130401008072802DBC000000000C -:10CBA000510000D8020000320000FC102A010000F1 -:10CBB000D82080BA0000FB101201000009C021B289 -:10CBC00018003600000000F8730A03F900000000A6 -:10CBD000000000D8024084321D00161304000080BB -:10CBE00002A417B8000046100060006C08006EF246 -:10CBF0000000E4104D00000067E0839E0000161363 -:10CC000012000050F2C138B418003600000000F8DD -:10CC1000730A03F91D0005110400008002A417B86F -:10CC20000000161380010080A2802FB60000FF10C4 -:10CC3000670000F8A2802FB5000016131200000054 -:10CC400009C021B21D0016130401008002A417B808 -:10CC50000800000000400278399AFE3800001613E0 -:10CC60000201008082BA97BC000016130601008002 -:10CC700092BA97BC0800161312400268129AFEB8C6 -:10CC8000000016130B000080020000B000006411C9 -:10CC900000000030030038F200001B111F00006C80 -:10CCA000D8E086BA00003210510000D8020000F22D -:10CCB00000000F110000003C0840809200001B1192 -:10CCC000000000800200009000001311800100802D -:10CCD000F2812FB60000131180000080E2802FB691 -:10CCE0000000131180010080328087B60000000030 -:10CCF000000000F8E2802F340000E31004010080FF -:10CD0000028081BC0000191180010080A2802FB632 -:10CD1000000018111201000009C021B218003600ED -:10CD2000000000F8730A03F900000000000000D8BA -:10CD3000024084321D0016130400008002A417B8BC -:10CD4000000046100060006C08006EF20000E41065 -:10CD50004D00000067E0839E0000201180010080EC -:10CD6000E2802FB60000401180010080A2802FB623 -:10CD700018003600CA0000F8730A03F91D004011BC -:10CD80000401008002A417B8000016130000008000 -:10CD90000200009000000000000000A4A8608A3C8F -:10CDA0000000161304210180825B8ABC000024115C -:10CDB0002FA8012099226EBA0000C70F0000008042 -:10CDC000020000F00000161306010280821B92BCD4 -:10CDD0000000000000A801E0060092320000000000 -:10CDE000005001E80600003200002911232101E073 -:10CDF000060000B23E0016131200002C82CD2EB2A7 -:10CE000000001613043000E0068082B200003311E7 -:10CE1000042100E0068081B200001613800000802B -:10CE2000E2802FB60000311180010080A2802FB671 -:10CE3000000030111201000009C021B218003600B4 -:10CE4000000000F8730A03F900000000000000D899 -:10CE5000024084321D0016130400008002A417B89B -:10CE6000000046100060006C08006EF20000000038 -:10CE7000002000E00680813200000000003C00E855 -:10CE80000640813200000000001000E006C086323B -:10CE900000000000001800E006C0843200001613F5 -:10CEA0000400008032E186B2000000002A01008008 -:10CEB0000200007000003A111201000009C021B206 -:10CEC00018003600000000F8730A03F91D0016135D -:10CED0000400008002A417B800000000000100F860 -:10CEE000A2802F75000000000000003CD8E0833CC9 -:10CEF0000000161312000050F2C138B400001613DF -:10CF000080000080A2802FB600000000000000F822 -:10CF1000A2802F34000000000000008812002C3A8C -:10CF20000000FFFF000000800200009000000000F1 -:10CF3000000000000900003200000000000000783E -:10CF40000900003200000000000000A802000032CA -:10CF5000EE05481104010080820DF6BC00060000B9 -:10CF6000000000080900363200004A1100000004E9 -:10CF700009C00992002800000000000809003632AC -:10CF80000000000000000004098009321E000000BB -:10CF9000000060C087CD003700000000000860C0BE -:10CFA000078097320030000000000078898D2A3A0F -:10CFB000000016131200005C528197B400000000BC -:10CFC000000000002924903A0800000000000078CA -:10CFD000890D903600000000000000041940903CCC -:10CFE00000000000000000A852822A3A00084A11FE -:10CFF00002010080828D2ABC00005B1106000080C7 -:10D00000024090BC00001613120000A8020020B2DB -:10D010001E000000000000C087CD003700000000A7 -:10D02000000800C007809732000016131200005C51 -:10D0300052812AB400000000000000002924903A28 -:10D040000800000000000078890D9036000054119F -:10D0500004010004194090BC0500000000000078A5 -:10D06000890D903600000000000000A00E8097326D -:10D070000000161312000068028097B20000000042 -:10D08000000000A40E8097320000000000000000A5 -:10D090002924903A000000000000007859009036E2 -:10D0A00000005D1195010080222490BA000000006C -:10D0B00000010080020000500000FFFF000000801F -:10D0C0000200009000007E1104010078D90130B602 -:10D0D000000000000000002809C029320000000004 -:10D0E0000000009CB2452830000070118601000845 -:10D0F00009802FB2000000000000002C094081329E -:10D1000000000000000000F80200003200000000F3 -:10D11000000000F40200003218000000000000F8D7 -:10D12000738A0239000000000000009C02809232E5 -:10D1300000006F110407018002C06EBC000079116D -:10D14000C30701ECB6E46E9A00007911000601EC09 -:10D15000B6E46E9A0000161380010080528090B6EB -:10D16000000000000000002C0905803000000000D5 -:10D17000000000F80200003200000000000000F48F -:10D180000200003218000000000000F8738A023923 -:10D19000000000000000009C028092320000161384 -:10D1A0000201008082FA92BC000016130601008082 -:10D1B00092FA92BC0000D71100000080020000D05B -:10D1C000210000000000001009003632000080122B -:10D1D0000000001409C092D20000000000000030DE -:10D1E0000300383200007E1104010078D90130B606 -:10D1F000000067110000009CB2452890000000006C -:10D20000040000802280977C00001613000000803C -:10D21000020000900000FFFF00000080020000906C -:10D22000000016130400008002C0E8BC00001613C2 -:10D230000200008002C12FBC000000000000008836 -:10D2400002C0E83202008411B00000A0F20B00B965 -:10D25000000000000000000CABE4B03200008911B7 -:10D2600080010080F24BD0B600000000A000002832 -:10D2700009000032000000000001008002000050A0 -:10D2800000008B1104010080123EF8BA00009611D4 -:10D29000A0000004FD4BD09400009211800100809A -:10D2A000D28192B600009211800100802281FCB6EA -:10D2B00000000000A0000004FD4BD034000000007E -:10D2C0000000008401C02F32000000000000008038 -:10D2D000F1010034000000000000009401C02F3272 -:10D2E0000000961100000090F10100940000000081 -:10D2F000A000008401C02F32000000000000008068 -:10D30000F101F83400000000000000900140F83204 -:10D310000000000000010028090000520000161360 -:10D3200080010080F24BD0B600009C11040100285F -:10D330000934B0BA0000161380010080F24BD0B659 -:10D3400000009911B0000080020000B00000000051 -:10D35000A0000004FD4BD0350000000000010028B3 -:10D360000900005200009C11B00000A822C02FB795 -:10D3700000001613040084C037ACB0B200000000F7 -:10D38000A000000C0B000032FFFF0000000000783E -:10D39000A94DB0300000A411800000800240B0B65A -:10D3A00000001613800000801240B0B6000000009C -:10D3B00000000078698197350000000000008408B3 -:10D3C0000B007C320000000000000000E725013265 -:10D3D0000042000000080000878D2A3A000000008B -:10D3E000001000000700B03200000000001800002C -:10D3F0000700D0320000000012010048F2C138548A -:10D400000000161300000080020000900000AA1126 -:10D41000B00000A0020000B2000000000000000CFC -:10D42000ABE4B0320000AF11800100800240D0B602 -:10D4300000000000A00000280900003200000000E9 -:10D4400000010080020000500000B11104010080C2 -:10D45000123EF8BA0000C211A00000040D40D094A2 -:10D460000000BB1180010080D28192B60000BB1188 -:10D47000800100802281FCB600000000A0000004B2 -:10D480000D40D034000000000000007809C02F32A9 -:10D4900000000000000000FC02000032000000005C -:10D4A0000000008401C02F32000000000000008056 -:10D4B000F1010034000000000000009401C02F3290 -:10D4C0000000000000000090F10100340000C211D3 -:10D4D000000000FC0280979200000000A00000788D -:10D4E00009C02F3200000000000000FC02000032E2 -:10D4F000000000000000008401C02F320000000086 -:10D5000000000080F101F8340000000000000090ED -:10D510000140F83200000000000000FC0280973259 -:10D52000000000000001002809000052000016134E -:10D53000800100800240D0B60000C811040100281C -:10D540000934B0BA00001613800100800240D0B642 -:10D550000000C511B0000080020000B00000000013 -:10D56000A00000040D40D03500000000000100289C -:10D57000090000520000C811B00000A8020000B26B -:10D5800000001613040084C037ACB0B200000000E5 -:10D59000A000000C0B000032FFFF0000000000782C -:10D5A000A94DB0300000D011800000800240B0B61C -:10D5B00000001613800000801240B0B6000000008A -:10D5C00000000078698197350000000000008408A1 -:10D5D0000B007C320000000000000000E725013253 -:10D5E0000042000000080000878D2A3A0000000079 -:10D5F000001000000700B03200000000001800001A -:10D600000700D0320000000012010048F2C1385477 -:10D610000000161300000080020000900000FFFFD1 -:10D6200000000080020000900000D9111C40028020 -:10D6300006C092B244000000000100F8A28D2F52F3 -:10D64000000000000000007809C5923000001613A9 -:10D650000201008082BA97BC000016130601008008 -:10D6600092BA97BC000016131200006802C592B06F -:10D67000000016130B000080020000B02400000020 -:10D680000000001009003632000080120000001473 -:10D6900009C092D200000000000100701F00F75A7C -:10D6A0000000FFFF00000080020000902C0000003E -:10D6B0000000001009003632000080120000001443 -:10D6C000098092D200000000D50800000780923245 -:10D6D000000000000030000007C02C320040008035 -:10D6E000003800000700373200000000CA4101E0A6 -:10D6F00006809232000016131200004802C080B269 -:10D700000060000000010008088036720000FFFF82 -:10D7100000000080020000900000161380000080CE -:10D72000A2802FB6000016130401008062802DBC79 -:10D730000000000000380000078092320000000066 -:10D740000030000007C02C3200000000CA3D000C71 -:10D7500007808332000000001201004802C080727E -:10D760000000161300000080020000900000FFFF80 -:10D7700000000080020000900000000004570180BB -:10D7800002C06E7C00000000005701EC068092721F -:10D790000000FFFF00000080020000900000641104 -:10D7A00000000030030038F23300000000000010D9 -:10D7B00009003632100080120000001419A02CD984 -:10D7C0000000FB119D11020C09006EB20000FC115B -:10D7D00000F0011C09006E920000000000B8011C5E -:10D7E00009006E320000FE112CCD011809806EB2C6 -:10D7F000000000000000000CC9C1903400000212BB -:10D800003B29020409806EB20000161380D6018005 -:10D8100052C06EB60000000000D601EC56C06E3457 -:10D82000000000000000000CB9C19034000012128A -:10D8300000A8010809006EF2000006129D01008098 -:10D8400017E090BA000000000030008007C091325D -:10D8500000000912003800800700EE920000091253 -:10D860000401008002C091BC0000000000B801E08B -:10D870000600EE3200000000007001E00600863273 -:10D8800000000C123908008007C085B20000161392 -:10D8900080000080C2812FB600000000D9C901E8D5 -:10D8A0000680913200000000C811008007409032CD -:10D8B00000000F123B210080070086B2000000002C -:10D8C000DB0000601800863A00000000587801E094 -:10D8D0001620863A000000000029008007008572AB -:10D8E0000000FFFF00000080020000900000161200 -:10D8F000020C0280A29B90BC000000000000027895 -:10D9000029006E360000161202000080E2A590BCCD -:10D91000000000000000000809000032000018129A -:10D920009F89017849216EBC00000000000000784A -:10D93000090000320000000000000008E9A5903F47 -:10D9400000001E1204200208899B90BE0000000007 -:10D95000000A0258B89B90360000000000000078D2 -:10D9600049A1903A000000009F880180829B977C2B -:10D9700000000000008901E00680977200000000AE -:10D98000000B0258B89B90760000FFFF000000805B -:10D99000020000900000271280010080A2802FB6B4 -:10D9A000000025121201007809C021B218003600CB -:10D9B000000000F8730A03F9000016130401008048 -:10D9C00002802DBC00002712CA0000D802408492B9 -:10D9D0001500161304010078E96517B8000000006F -:10D9E000000000F8A2802F3500001613040100800B -:10D9F00002402DBC000016130400008002802DBCE4 -:10DA0000000000000040006C881C833A0000000009 -:10DA10000048004C0800723200001613085000182D -:10DA2000C82072BC000000000600008062A0827C5A -:10DA3000000016139F000014184081BC000016134C -:10DA400002000020880182BA00000000000000D817 -:10DA50000200003200000000000000000700063253 -:10DA60000000161304010080020036BC070000000D -:10DA700000080000774A093900000000001000008B -:10DA80000700823200000000CA19000007408232FD -:10DA90000000161312000040F2C138B4000000006C -:10DAA000000100D8024084720000FFFF00000080E7 -:10DAB000020000902B000000000000100900363228 -:10DAC000000080120000001409C085D2000042123C -:10DAD00080010080F2C185B600003E121F40028422 -:10DAE000E60100B4000042121D0100F822812FB4AB -:10DAF00000004212000000F862812F9500004012E1 -:10DB00001D010080020000B000000000000000F8CD -:10DB100062812F3500000000004002800240683220 -:10DB2000000016131F010080020000B00000161351 -:10DB30001200006802C585B00000000000000078F7 -:10DB400009C58530000016130201008082BA97BC17 -:10DB5000000016130601008092BA97BC0000000076 -:10DB60001D00008002000070010000000401008020 -:10DB7000A28D2F702A0016131200002C82CD2EB217 -:10DB800000000000000100F802812F740000FFFF78 -:10DB9000000000800200009080A8000004000080C7 -:10DBA000828D2F700000521280010080D2802FB62B -:10DBB000000016138000008072812FB60000521200 -:10DBC00004B0008002006EBC00000000000000F8FD -:10DBD00072812F343D0055121201002C82CD2EB2DD -:10DBE0000000161300000080020000900000551293 -:10DBF00080010080F2802FB63C0058121201002CE8 -:10DC000082CD2EB2000016130000008002000090AA -:10DC10000000581280010080B2802FB63500161324 -:10DC20001200002C82CD2EB200000000000000F88F -:10DC300042812F348000000004000080828D2F700C -:10DC40000200000004010080A28D2F703B0016131B -:10DC50001200002C82CD2EB200000000000100F85E -:10DC600012812F740000FFFF00000080020000906E -:10DC70000000161380000080A2802FB6000016134B -:10DC800004310280A2DB2CBC08000000001801E86F -:10DC900076208139EEFF0000000100F8828D2F719F -:10DCA0000000FFFF000000800200009000006612EC -:10DCB0000000013808C06EF20000000012010048A8 -:10DCC00002C0807200001613000000800200009065 -:10DCD0000000FFFF00000080020000900E00000026 -:10DCE00000000010090036320000801200380114D4 -:10DCF00009006ED200006A120438017809006EB281 -:10DD000000000000003801E0060000320000161399 -:10DD100080000080A2802FB600000000CA11000021 -:10DD20000780823200006E122E190000078097B221 -:10DD30000000000000000028E98192340000731206 -:10DD40002731000007C02CB200000000D5080000F9 -:10DD50000700873200000000C7000028E9809234E5 -:10DD600000000000004001E00600873200000000D3 -:10DD700000000008D8818034100000000039000045 -:10DD8000E7A092790000FFFF0000008002000090F1 -:10DD9000140000000000001009003632000080125C -:10DDA00000000014094090D2000016131200004435 -:10DDB00012E438B218003600000000F8730A03F9C4 -:10DDC00000007D120401008002802DBC00001613AB -:10DDD00080010080A2802FB600007812670000F852 -:10DDE000A2802FB500001613120000E802C021B275 -:10DDF000000016130401008072802DBC000000009A -:10DE0000000100D8024000720000FFFF0000008007 -:10DE1000020000901B00000000000010790A9139F8 -:10DE20000F00000000000010390B91390C000000B9 -:10DE300000000010590A913909008312F101001005 -:10DE4000690B91B903000000002486A8828D6C370D -:10DE500000000000000088E0070091320000000090 -:10DE6000000088E00740913200C089120201008062 -:10DE7000828D2ABC00008A12E12486C80600009226 -:10DE800003000000E12486C8868D2A3600000000C9 -:10DE900000010080020000500000FFFF0000008031 -:10DEA000020000900000921204300080829B81BC2E -:10DEB000000016130D010080020000B000001613D0 -:10DEC0009F3C001428806EBC000016138000008068 -:10DED000A2802FB600000000CA0100F802802F3592 -:10DEE00000A0161312000040A28D39B20000941257 -:10DEF00080390080E2806EB6000016138038008002 -:10DF0000F2806EB600C0161304010080A28D2FB0FF -:10DF100000C09A1204380078898D6EB010009A12F1 -:10DF20009F0100F8E2A52FB900001613040000803D -:10DF300002C0EEBC00000000005801EC06C0EE324A -:10DF4000000000000000008002000030000000001F -:10DF50000428001809006E720000E30F0000008022 -:10DF6000020000F00000C70F00A8012009006E9217 -:10DF70000000FFFF00000080020000900000A712D8 -:10DF800004B00080829B81BC000016130D0100804C -:10DF9000020000B0000016139FBC001428806EBC65 -:10DFA0000000161380000080A2802FB60000161318 -:10DFB00080B8008082806EB60000000000B800E8E3 -:10DFC00086806E3400000000CA0100F842802F35C0 -:10DFD00008A0000012010040A2CD39720000161303 -:10DFE00000000080020000900000161380B800803E -:10DFF00082806EB60000000000B800E886806E34B3 -:10E000000000000000010080020000700000FFFF1F -:10E0100000000080020000902800000000000010B6 -:10E02000090036320000801200000014098090D2EE -:10E030000000B01233CD01BC08806EB20000EE12B9 -:10E04000000000282922EEDC0000B512000000804C -:10E05000020000900000B51204B8012809006EB259 -:10E060000000B5129F710180C2216EBC0000161322 -:10E070009F000028A924EEBC0000EE12000000283A -:10E08000198092DF000000000000008002000030D4 -:10E090000000C91202810180829B90BC000016130F -:10E0A00004000080028090BCEE05C112060C0280C4 -:10E0B000828D6EBC00904C0000000084020037325C -:10E0C0000000BB12B8010080020000B00000B912CD -:10E0D000000000800200009000000000000000C46A -:10E0E000038090320000000000B001E096216E3CF9 -:10E0F00000000000619801E0060087320000000087 -:10E1000000D401EC0600003200000000A8000078F6 -:10E1100049403C370000CE1200000008E9A5909A63 -:10E120006089200000000084020037320000C41221 -:10E13000B8010080020000B00000C21200000080A0 -:10E140000200009000000000000000C40380903234 -:10E150000000000000B001E096216E3C00000000CD -:10E16000619801E0060087320000000000D401EC55 -:10E17000060000320000CE12A8000008198F909A05 -:10E18000000000000000007899A1893E0000000016 -:10E1900000000008E9A5903A0000000000B001E08E -:10E1A00096216E3C00000000619801E00600873275 -:10E1B0000000000000D401EC060000320000D11283 -:10E1C0000600008072A290BC00C0FF3F008001E00A -:10E1D00006003732000000000000000809C0893244 -:10E1E0000000D61204790180821B87BC0000D41283 -:10E1F00004B0008002006EBC0000D912D99001E08A -:10E20000068090920000DC128000008052812FB6C0 -:10E210000000DC12D54101E0060087920000D9120F -:10E220003C9001E0068090B200001613800100804F -:10E2300092812FB60000000000C801E806C08B32B2 -:10E24000000000009501008002802F720000DD12A6 -:10E250009F410180821B87BC0000000000010080FC -:10E260000200007000000000D99001E006809032AA -:10E2700000000000000100F872802F740000FFFF12 -:10E280000000008002000090270000000000001045 -:10E29000090036320000801200000014094087D2C5 -:10E2A0000000E7129FD8018022216EBC0000000010 -:10E2B0000B010080020000700000E7129FE0018067 -:10E2C000C2216EBC000000000B0100800200007043 -:10E2D0000000E7129FB00180D2216EBC0000000058 -:10E2E00000010080020000700000E9120668018051 -:10E2F000825B87BC00000000006801E006408732B6 -:10E300000000EB1237B001E0064087B200000000C9 -:10E31000000000F8D2802F340000000000D801E097 -:10E32000068084320000000000E101E006008772F0 -:10E330000000FFFF000000800200009000001613A4 -:10E3400008000080028092BC0000FB1204C101841E -:10E3500002006EB20500000000C001E8868D923711 -:10E360000300000000C401E8868D92370000000021 -:10E3700000000080020000300300000000C0012CFB -:10E38000898D6E360000000000C4012CA9DB923A92 -:10E39000000000000000002C29C0923600000000A0 -:10E3A0000000002C19FB923F000000000000002834 -:10E3B0002980923A000000000000002CA9E4923F5E -:10E3C000000000006FCC01E826FB923E0000000038 -:10E3D00000B901E0060000520000000000000094B7 -:10E3E000028092320000000000C001E006402832A6 -:10E3F000100000006FCC01E886CD2A360000000036 -:10E4000000B901E0060000520000FFFF000000809C -:10E41000020000900000161304B0008002006EB2EB -:10E4200000000000009001BC08006E3200000000F7 -:10E4300000B001BC88DB8B3E00000000009801BCEE -:10E4400088DB8B3A00000C139F0000BC88E18BBC7A -:10E4500000000C13040C0240A8DB8BBE000000007F -:10E4600000B00004881B843E0000091304B1008042 -:10E47000825B80BC00000000000100F8C2802F74A5 -:10E4800000000000040C0280A25B807C00000C13E2 -:10E490000468017819006EB60000000002000080D8 -:10E4A000E265807C2900000000000010090036327F -:10E4B000000080120000001409C08BD20000000090 -:10E4C0000000008812002C3A0000FFFF00000080CE -:10E4D000020000900000161304310280A2DB2CBC65 -:10E4E0000000161380000080A2802FB608000000F4 -:10E4F000001C01E876208139EEFF0000000100F8E1 -:10E50000828D2F710000FFFF00000080020000904C -:10E5100000001613000000B40F40FB940000000040 -:10E52000000000880F402B32000000000000009027 -:10E530000F00283200000000000000940F00293274 -:10E5400010000000000000B85F461839FF0000000E -:10E550000000009C0F003632000000000000009C0C -:10E560005FCAF935000000000000004403C0F93222 -:10E5700000000000000000E4030000324100001031 -:10E58000000000E00300373200000000000000E45B -:10E590000300003240000010000000E003003732AA -:10E5A00000002513670000980F802AB200000000C9 -:10E5B000000000A8020000320000231312C186E010 -:10E5C00007C021B20000000000B886C006802A32D1 -:10E5D0004C420000000000A8020036322713381415 -:10E5E000000000B00F003692000000000000009C08 -:10E5F0000200003200012414000000AC0F0036D2EB -:10E6000000000000000000AC0F802A320020000053 -:10E61000000000A802003632000000000000009C4C -:10E620000F007E3200000000000000A00F007E32CC -:10E6300000000000000000A40F007E320000000077 -:10E64000000000A80F007E3200000000000000A8BB -:10E6500002C0FA3200000000000000E007C0F932FA -:10E6600000000000000000E00700FA320000000097 -:10E67000000000E00740FA3200003B13000000E019 -:10E680000780FAD200000000000000E00780FB32A3 -:10E6900001006213040100B48F4DFBB002000000C2 -:10E6A000000000A002000039408000000000000CC3 -:10E6B000ABCDB032100000000000000C5BCAB039D6 -:10E6C000000000000000000C2BFEB03200006114BE -:10E6D000000000800200009000000000000000F830 -:10E6E0000300013200000000000100E007803F52FB -:10E6F00018000000000000F8738A023900000000D2 -:10E7000000000044530A1635000000000000009C81 -:10E710000F80963200000000000000A00FC096326B -:10E7200000000000000000A40F009732A260030068 -:10E730000000005803003732481300000000005C5E -:10E74000030036320000000000000050830D00344A -:10E750000000000000000048830D003400000000AD -:10E7600000000044530A003400003600000000801E -:10E7700002000090000000000000006809C0F932AB -:10E78000000000000000006C0900FA3200000000E8 -:10E79000000000700940FA3200005A1300000080A7 -:10E7A0000200009002000000000000A0F20B0039FF -:10E7B00000004F13800100801240B0B6000000003E -:10E7C000000000043B40B0330000000000000004E3 -:10E7D000FD4BD035000053130000000C0B00979246 -:10E7E00002000000000000A0F20B003900005313EB -:10E7F000000000046B01979400005313120000689E -:10E80000094020B2000054131200006C094020B2ED -:10E810000D000000000000FCA2E5163800005913AE -:10E820009F000080028096B200000000000000708F -:10E8300009C0963200005A130000006C09C0FD9216 -:10E840000000591312000070094020B200000000BF -:10E850000000009C0200003200000000000000D810 -:10E860000200003202005313040100BCAF2517B8A8 -:10E8700006005113040000BCAF6516B800004C132D -:10E880000400008022C0FBBC00006A13040000806A -:10E8900012C1FBBC200053130401008082CDFBBCDD -:10E8A00002000000000000A0F20B003900006B1312 -:10E8B00000000080020000D0641300000000008807 -:10E8C00082CDF93A00005A14000000800200009046 -:10E8D00000009313000000800200009000009413D9 -:10E8E00000000080020000900000981300000080EB -:10E8F000020000900000A0130000008002000090C1 -:10E900000000F91300000080020000900000531383 -:10E91000000000DC0F0097920000000000000000E3 -:10E920000700033240420000000000A80200363217 -:10E93000000000000008000007802A3200000000EC -:10E9400000100000070097320000000000180000CF -:10E9500007C096320880701312000040028036B261 -:10E960000000000000000080020000300000721370 -:10E970001200009C0FC021B21D007513040000801E -:10E9800072BE17B800007213000000F81E80EF9AE4 -:10E99000130000000000009C7FBE173800007813B1 -:10E9A0000400008012C0F9BC00007213000000F8DF -:10E9B0001E80EF9A000000000000009C0F007E32D5 -:10E9C00000000000000000A00F007E3200000000E8 -:10E9D000000000A40F007E320000000000010000D3 -:10E9E0000700FA52000000000000009C0200003204 -:10E9F0004C420000000000A8020036320000000077 -:10EA00000008000007802A3200004E140000008039 -:10EA1000020000D00000521400000080020000D06C -:10EA2000000000000000000CCBC1B034000000006A -:10EA30000000009C0200003200000000000000D82E -:10EA400002000032000081110000002809C0B0D28D -:10EA50000000821304000080028092B2000086133E -:10EA60001200009C0FC021B21D0089130400008019 -:10EA700072BE17B800008613000000F81E80EF9ADF -:10EA8000130000000000009C7FBE173800008C13AC -:10EA90000400008012C0F9BC00008613000000F8DA -:10EAA0001E80EF9A02008E13040100B48F4DFBB05C -:10EAB00000005313000000800200009008000000D6 -:10EAC000000000F89340013900000000000000B48D -:10EAD0001F40FB35FE0000000000004803003632F6 -:10EAE0000000000000000044030000340000821316 -:10EAF0000000000C8BC1B09400005E140008000000 -:10EB00000740FA9200004E14000800000740FAD2B5 -:10EB10000880951312000050028036B20000531492 -:10EB200000000080020000D000006014000000809F -:10EB300002000090000800000000009C0F00363228 -:10EB400000040100000000A80200373200000000AD -:10EB5000000000A00200003200000000000000E001 -:10EB60000700B03200000000000000A012002A3AA6 -:10EB700000009B130401009C1FC0F9BC00040100AD -:10EB8000000000A80200373202005D14000000A05F -:10EB9000F20B00990000A813040100800240FAB2B1 -:10EBA00000040100000000A8020037320000AA1390 -:10EBB00000000080020000D00000B71300000084B5 -:10EBC000020000D200000000000000E007C03C325C -:10EBD0000000A4138E010080024028B2000401004E -:10EBE000000000A40F0037320000931300000080E3 -:10EBF0000200009000040100000000A4CF4DFA3A8A -:10EC0000000093130000008002000090000000004C -:10EC10000000009C0F00003210000001000000AC5A -:10EC20000F0037320000BC1300000080020000D04B -:10EC30000800AC130401008082CDF9BC0000000084 -:10EC40000000009C0F0000320E000001000000AC2C -:10EC50000F0037320000BC1300000080020000D01B -:10EC60000B00B0130401008082CDF9BC200000002D -:10EC70000000009C0F0036320F000001000000ACC5 -:10EC80000F0037320000BC1300000080020000D0EB -:10EC90002700B4130401008082CDF9BC00000000FD -:10ECA0000001008002000050000000000000009CF5 -:10ECB0000F0000320F000001000000AC0F003732DF -:10ECC0000000BC1300000080020000D02000B91337 -:10ECD0000401008082CDF9BC00000000000100802A -:10ECE0000200005000000000000000E403C0F93200 -:10ECF0000D000001000000E00300373200000000BA -:10ED0000000000E003C0FA3200000000000000E054 -:10ED100007403E32000000000001009C1FC0F95A6D -:10ED200000000000000000E003C0F9320000000015 -:10ED3000000000E007403E32000000000000009CA0 -:10ED40001FC0F93AFF000000000100AC8FCDF95060 -:10ED5000000000000000009C0FC02F3200000000E7 -:10ED6000000000FC0200003200000000000000E093 -:10ED700007803E3200000000000000FC12C02F3A65 -:10ED80000F00C7130401008082CD2FBC00000000DB -:10ED9000000000E007803E3200000000000100FC9F -:10EDA00002C0F95200000000000000E007003A3203 -:10EDB00000000000000000E007403A3200000000C0 -:10EDC000000000E007803A3200000000000000E090 -:10EDD00007C03A32000000000000009C0FC02F3234 -:10EDE00000000000000000FC0200003200000000F3 -:10EDF000000000E007003D3200000000000000E0DD -:10EE000007403D320000D213830100FC12C02FBA2C -:10EE100000000000000100FC02C0F95200000000E8 -:10EE20000000009C0F0000320C00000000000008F1 -:10EE3000733E003900000000000000E0070030329F -:10EE4000000000000000009C1FC0F93A7000D713BA -:10EE50000401008082CDF9BC000000000000000C1D -:10EE60000300003200000000000000E00700303224 -:10EE7000000000000000001003000032000000004D -:10EE8000000000E007003032000000000000009C9D -:10EE90000F00003200000000000000A00FC0293267 -:10EEA000000000000000009C02C0F93200000000D9 -:10EEB000000000A40FC02C32000000000000009CE5 -:10EEC0000200FA32180000000000002C737EFA39AC -:10EED00000000000000000E0070030320000E013F6 -:10EEE0008501009C1FC0F9BA0000000000010080ED -:10EEF00002000050010000010000009C0F003732AA -:10EF00000000C11300000080020000D00E00EF13CB -:10EF10000401008082CDFABC00000000000000E087 -:10EF20000700003200000000000000E0070000328F -:10EF300000000000000000E0070000320000E913BC -:10EF40000000009C3FC0F99A1C00E91304010080F6 -:10EF500082CDFABC0200C1130000009C8FCDF9DA0B -:10EF600000000000000100800200005001000002CB -:10EF70000000009C0F0037320000C1130000008029 -:10EF8000020000D00E00F7130401008082CDFABC0D -:10EF900000000000000000E0070000320000F31352 -:10EFA0000000009C1FC0F99A2600F31304010080A2 -:10EFB00082CDFABC00000000000100800200005079 -:10EFC00000000000000000A80F40293200040100EA -:10EFD000000000A8020037320000E81300000080A3 -:10EFE000020000D00000F21300000080020000D0F8 -:10EFF0000000C51300000080020000D000000000E7 -:10F00000000000E00780183200000000000000E06F -:10F0100007401A3200000000000000E007001A322A -:10F0200000000000000000E007801A32000000002D -:10F03000000000E007C01A3200000000000000A03D -:10F040000F000032A26003000000005803003732B6 -:10F050000B1400000000005C0300363200000000CA -:10F060000000009C0F802A3200000B140400008076 -:10F07000024029B20000000000000050833E00342E -:10F080000000000000000048833E00340000000043 -:10F0900000000044530A003400000C1400000088F3 -:10F0A0000F402B9200000000000000900F0028325B -:10F0B00000000000000000940F0029320000000052 -:10F0C000000000980F802A3200000000000000A815 -:10F0D00002C0F93211143814000000B00F0036924B -:10F0E0000700141404000080824D29BC00000000B9 -:10F0F000000000A01F00FA3A000008140000009C65 -:10F100000F802A92C0010000000000AC0F003632D0 -:10F11000010000000000009C0200363200002414B0 -:10F1200000000080020000D01F001A1404000080BC -:10F1300082CD29BCC0000000000000AC8FCDFA3A9F -:10F14000000016140000009C12C0299A0000D6137B -:10F1500000000080020000D00000CC1300000080FE -:10F16000020000D00000221404000080528AFABC81 -:10F17000A260030000000058030037322214000090 -:10F180000000005C03003632000000000000005068 -:10F19000A33E00340000000000000048A33E0034FD -:10F1A0000000000000000044530A00340004010085 -:10F1B000000000A40F00373200009313000000800D -:10F1C0000200009000000000000000C402C0FA32FB -:10F1D000030000000000009C0F0036320000000019 -:10F1E000000000BC0F402F3200002B140400009CD4 -:10F1F0001FC0F9BC00002A140400008002402FB296 -:10F2000000002714000000E007002C9200002714E3 -:10F21000000000E00700369200000000000000E05F -:10F2200007402C3200000000000000E007802C3274 -:10F2300000000000000000E007C02C3200000000C9 -:10F24000000000E007002D3200000000000000E098 -:10F2500007402D3200000000000000E007802D3242 -:10F2600000000000000000E007C02D320000000098 -:10F27000000000E007C0FB3200000000000000E0DA -:10F2800007802F3200000000000000E007C02F328E -:10F2900018000000000000F8730A023900000000A6 -:10F2A000000100E007803F52FF0000000000004422 -:10F2B0000300363200000000000000E00700F932D1 -:10F2C00000000000000000E00740283200000000BD -:10F2D000000000E00780F832030000000000009CFE -:10F2E0000F00363200000000000000BC0FC02B32BF -:10F2F000000041140400009C1FC0F9BC0000401431 -:10F300000400008002C02BB200003D14000000E0A9 -:10F3100007C0289200003D14000000E0070036926C -:10F3200000000000000000E00740F932000000008B -:10F33000000000E00740293200000000000000E06B -:10F340000780293200000000000000E007C02932D9 -:10F3500000000000000000E007002A32000000006A -:10F36000000000E007402A3200000000000000E03A -:10F370000780F93200000000000000E007C02A32D8 -:10F3800000000000000000E007C02F320000000075 -:10F39000000000E007402B3200000000000000E009 -:10F3A00007802B3200000000000000E007C0FB32A5 -:10F3B00000000000000000880200FB320000000096 -:10F3C0000000009C0200003200000000000000D895 -:10F3D0000200003200000000001000000700973219 -:10F3E000000000000019000007C096520880521467 -:10F3F00012000048028036B20000000000000080C9 -:10F4000002000030000054141200009C0FC021B212 -:10F410001D0057140400008072BE17B80000541479 -:10F42000000000F81E80EF9A130000000000009C0E -:10F430007FBE1738000000000400008012C0F95C95 -:10F4400000005414000000F81E80EF9A0000000035 -:10F45000000000B40F40FB35000000000000009CDD -:10F46000020000324C420000000000A802003632C8 -:10F47000000000000008000007802A3200004E143F -:10F4800000000080020000D0000052140000008044 -:10F49000020000D0000000000000000CCBC1B0341E -:10F4A000000000000000009C02000032000000008C -:10F4B000000000D80200003200006B140000002899 -:10F4C00009C0B0D20000611404000080028092B232 -:10F4D000000065141200009C0FC021B21D006814CA -:10F4E0000400008072BE17B800006514000000F828 -:10F4F0001E80EF9A130000000000009C7FBE1738AA -:10F50000000053130400008012C0F9BC0000651411 -:10F51000000000F81E80EF9A00000000000000FCD0 -:10F520000200003202000000000000A0F20B0039CF -:10F5300000006F14040100280934B0BA0000000074 -:10F54000000100280900005200000000000000A88F -:10F5500022C02F3700000000000084C037ACB0325A -:10F56000000000000000000C0B000032FFFF000054 -:10F57000000000C0AF4DB030000075148000008066 -:10F580000240B0B600000000000000C06F01FC3572 -:10F590000000000000000000073F013200420000B0 -:10F5A00000080000878D2A3A0000000000100000CB -:10F5B0000700B03200000000001800000700D03241 -:10F5C00000000000000000C03FC13834000000000F -:10F5D00012010048F201FC5400007A14000000807F -:10F5E000020000900000FFFF000000800200009079 -:0CF5F000000036000000008002000090C7 -:00000001FF diff --git a/firmware/sxg/saharadownloadB.sys.ihex b/firmware/sxg/saharadownloadB.sys.ihex deleted file mode 100644 index 0309852..0000000 --- a/firmware/sxg/saharadownloadB.sys.ihex +++ /dev/null @@ -1,3385 +0,0 @@ -:10000000020000005CD300000C00000000000000B3 -:10001000FF1F00000100000000000088824D293A07 -:100020000000400300000080020000900000090072 -:100030000000008002000090000009000000008025 -:100040000200009000000900000000800200009003 -:10005000000009000000008002000090000009007C -:1000600000000080020000900000090000000080F5 -:1000700002000090000009000000008002000090D3 -:10008000FEFF0000000000AC020036320000360027 -:10009000000000A80200009200003610000000805E -:1000A0000200009000003610000000800200009066 -:1000B00000003610000000800200009000003610A2 -:1000C0000000008002000090000036100000008058 -:1000D0000200009000002000000000D80F8028924D -:1000E00000002100000000D80F80289200002200AC -:1000F000000000D80F80289200002300000000D8E4 -:100100000F402B9200002400000000D80F8028929E -:1001100000002500000000D80F8028920000260073 -:10012000000000D80F80289200002700000000D8AF -:100130000F80289200002800000000D80F8028922D -:1001400000002900000000D80F80289200002A003B -:10015000000000D80F8028920000360000000098B0 -:100160001E80E99A00002C00000000D80F80289221 -:1001700000002D00000000D80F80289200002E0003 -:10018000000000D80F80289200002F00000000D847 -:100190000F80289200003000000000D40F00009271 -:1001A00000003000000000D40F400092000030003A -:1001B000000000D40F80009200003400000000D442 -:1001C0000FC0009200003000000000D40F00019228 -:1001D00000003000000000D40F4001920000300009 -:1001E000000000D40F80019200003000000000D415 -:1001F0000FC0019200003000000000D40F000292F6 -:1002000000003000000000D40F40029200003000D7 -:10021000000000D40F800292000036100000008021 -:100220000200009000003000000000D40F00039294 -:1002300000003000000000D40F40039200003000A6 -:10024000000000D40F80039200003000000000D4B2 -:100250000FC0039200000000000000D05F3F003498 -:10026000000036100400008042FFFCB000000000D7 -:10027000000000881280FD3A000036100000008067 -:10028000020000903610361002010080828DFDBC05 -:1002900000000000000000881280FD3A000000000D -:1002A000000000F803C001323800000000010084A3 -:1002B000824D281A000036000000007409400092A8 -:1002C00000004F00000000FC020000920000480007 -:1002D000000000800200009000004D00000000902F -:1002E0000E80189200008F020000000008C02092CB -:1002F00000007F00000000000800219200008D0235 -:10030000000000000840219200007C000000000076 -:10031000088521900000F202000000EC02C0229249 -:100320000000CE0300000080020000900000560094 -:10033000000000FC0240189D00005100000000D0A9 -:1003400002000092000020030000008002000090E4 -:100350000000361000000080020000900000000045 -:10036000000100800200007000004C00000000004E -:1003700009C0219200004A0012010000088522B045 -:1003800018003600000000F8738A0299000084000B -:100390006A000080020000B008008400000000F83D -:1003A0002340019900000000000100E80200907263 -:1003B0000000361080010080B200E9B600003E0364 -:1003C0000000007C1EC0E79A08000000000000F852 -:1003D000134001390000320300000008B801009406 -:1003E000000036100300007809401ABD000000002C -:1003F000000000A0E125003408000000000000F823 -:10040000B340013900003E03B20000D8020000B240 -:1004100000004005001001F802006E920000590033 -:100420000A0100CC020000B200006A00030100FCD7 -:10043000024019BD08003E03000000F8A3400199E6 -:10044000000000000000008401C02F320000000006 -:1004500000000090F1010034000000000000009452 -:1004600001C02F3202005C00B00000A0F20B00B906 -:1004700000005F000401008002C0B0BC0000680002 -:10048000A000008002000090000061008001008058 -:10049000F24BD0B600006800A0000080020000907F -:1004A00000000000A0000004FD4BD03400006600F6 -:1004B000800100801281FCB600002D0F000000D8E2 -:1004C000020000D218000000000000F8730A03398F -:1004D00068003600000000C0020036920000040FE1 -:1004E000000000D8020000D218003600000000F81A -:1004F000730A03F900005900030100FC024018BD13 -:1005000000007B00030000FC024019BD0000000059 -:100510000000009401C02F320000000000000080A5 -:10052000F1010034000000000000008401C02F32FF -:1005300002006D00B00000A0F20B00B900007000D6 -:100540000401008002C0B0BC00007900A00000805F -:10055000020000900000720080010080F24BD0B6D3 -:1005600000007900A0000080020000900000000060 -:10057000A0000004FD4BD034000077008001008013 -:100580001281FCB600002D0F000000D8020000D23E -:1005900018000000000000F8730A033979003600E3 -:1005A000000000C0020036920000040F000000D8D6 -:1005B000020000D218003600000000F8730A03F9A8 -:1005C00000006A00030100FC024019BD0000590050 -:1005D000030100FC024018BD08003E03000000F8C3 -:1005E000A340019908000000000000F873400139A1 -:1005F0000000840080010080E20180B600008100DC -:1006000000000080020000900800ED020C0000F8DD -:10061000534001B90000830080010080E20180B6F0 -:100620000000361012000068020580B0000032039E -:100630000000006C1FC0F69A0000000000000000DF -:100640000805803000000000000000FC02000132BC -:10065000000000000000001008803D320000000093 -:10066000000000D40200003202A0000000000000E0 -:10067000A90D8032000088001200005402A438B294 -:10068000000200800000002C0800373218003600FD -:10069000000000F8730A03F90000000000080004DD -:1006A00008807232000090009F00005C080072B267 -:1006B00087008F008001008082CD85B00000A100FE -:1006C0000000002CD8C182940000A1000000002C82 -:1006D00088C18294000F99000401008082CD85B00A -:1006E00000009900800000804281FCB600003610B6 -:1006F00012000068020580B0000000000000006CDD -:100700001FC0F63A00000000000000FC02000132A9 -:1007100000009700040100DC43603DB30000320399 -:10072000000000FC0200009218000000000000F829 -:10073000738A033994003600000000C0020036922C -:1007400010009F0087000078792116B801009F00F3 -:1007500004010080828D97BC8700A8008700007884 -:1007600089CD85B000009E0004010080128097BCF6 -:100770000000A1000000002CD8C182940000A1005C -:100780000000002C88C182940000A8008001008035 -:10079000F2C085B60000A8000000002C98C1829429 -:1007A0000000A70080010080D2C182B60000A8002E -:1007B000800100807280FCB600000000001800A8D4 -:1007C000423D723000000000541889FCF2C07C30B9 -:1007D0000000CB0080010080F2C185B60000A900B6 -:1007E00000000080020000900000A3008000008054 -:1007F0008280FCB600000000540000FC02000032C1 -:100800008000802000000080C2CD85300000BE0046 -:100810000B000080020000B018000000000000780B -:1008200079A116382000CB0004000080828D97BC8F -:100830000000B500800100806280FCB68700B50032 -:100840008700007889CD85B00000B10004000080E9 -:10085000128097BC0000B50004010080228097BC84 -:100860000000B5008001008072C185B61000000054 -:1008700000000078796116380000BC000401008097 -:10088000328097BC0000CB000000002CB8C18294DD -:100890000000BC00800100805280FCB60000BC005B -:1008A0008000008072C185B60000BC00800100801D -:1008B00002C185B60000BC0080010080D2C185B6AF -:1008C000180000000000007879E116380000BC0034 -:1008D00004010080328097BC0000CB000000002C97 -:1008E000C8C1829400000000000000040800043227 -:1008F0000000CB000000002CA8C18294080000007A -:1009000000000078792117380000CB000400008037 -:10091000328097BC0000CB0004010080228097BC8D -:100920001F0000000012000889CD72300500000091 -:1009300000120000B9DC173800000000000000A819 -:10094000220090370000CB008000868022247CB6F5 -:100950000000361012000068020580B000000000A0 -:10096000000000FC020001320000C900040100DCAC -:1009700043603DB300003203000000FC020000921F -:1009800018000000000000F8738A0339C600360022 -:10099000000000C0020036920000CE00120100608C -:1009A000084023B2008200000000000808803632B0 -:1009B0000000C500000000641F40F69A00003610D9 -:1009C00012000024080023B200003610120000209C -:1009D00008C023B20000361012000018088023B2AD -:1009E00000000000000000FC020001320000D50001 -:1009F000040000DC43603DB318000000000000F874 -:100A0000738A0339D1003600000000C0020036921C -:100A100000000000000000FC020085320000000021 -:100A2000000000D80280013200000000000000D069 -:100A30000200003200C0E1001801000CA8CD3EB257 -:100A40000000D50012000038028081B200000000D2 -:100A50000000003C02008232000000000000003074 -:100A600002408232000000000000003402008632A2 -:100A700020800000000000080880363200000000DE -:100A80000000005C1FC0F53A00003203120100684C -:100A9000020580B0000036100000008002000090C7 -:100AA0000000000000180078090072320023E40002 -:100AB00004010080A2CD82B00000E500000000002B -:100AC00009000092000036109F16000029C172BC78 -:100AD00000000000001800000780813200000000C4 -:100AE0000020000007008232000000000028000003 -:100AF0000780973210000000003000001720903966 -:100B0000000000000038000007C082320000000032 -:100B1000000000D8020000320000000000000000C9 -:100B2000074080320000EE0080010080A2C182B642 -:100B30000000EF000008000057008097050000004B -:100B40000008000007A0043900003610041000005F -:100B5000074082B200000000001800000700863243 -:100B60000000F10012000050F2C138B41800360045 -:100B7000000000F8730A03F9000036101200006844 -:100B8000020580B00000F4001200004802C080B2EC -:100B900000003203CA010008E881809408000000C8 -:100BA000000000F89340013910000000540000FCE0 -:100BB000824D90360000F800F00100D8020000B22B -:100BC00000000000620401A802C06E3200000000B4 -:100BD0000004010059C06E370000000000040178D5 -:100BE00019C06E3A000000004E0401EC06BD9730BB -:100BF00000000000E00000F41E40EF3A000000009A -:100C000000188BCC074000320000000000000000FC -:100C100007400932000000000008000077C02937B3 -:100C20000000361004100000173D90BA00000000CC -:100C3000001800000780F432000003011200004099 -:100C4000F2C138B400000000000000FC32C02F30B8 -:100C5000000000000000001008803D32180036003F -:100C6000000000F8730A03F900000000000000D43F -:100C700002000032000090018038008022C072B66D -:100C800000000C01120000C8020020B20000130195 -:100C90001201005C088020B20000361012000060D3 -:100CA00002802CB218000000000000F8738A03399B -:100CB00009013600000000C002003692000000006A -:100CC000000000F81F80FF3A00000000000000FC58 -:100CD00032008530000068010400008042603DB3AE -:100CE00018000000000000F8738A03390F01360075 -:100CF000000000C002003692080000000000000062 -:100D000088CD853700000000000000200800723206 -:100D100000000000000800240800723200003610B5 -:100D20000410006C080072B2000000000018004CB3 -:100D3000080072320000361004200018080072B259 -:100D4000000000000030002808007232000000009F -:100D5000002800300800723200000000000000602F -:100D600008808232000022010600008062A082BC5E -:100D7000000000000000000007000632070000002D -:100D800000080000774A09390000361004100000FE -:100D9000070082B200000000CA190000074082323A -:100DA0000000210112000040F2C138B40000000030 -:100DB000000000D8024000320000470104380078EB -:100DC000D9C572B00000260180010080028097B66C -:100DD00000000000000000F882802F34000028018D -:100DE00080010080128097B600000000000000F82B -:100DF00092802F34040000000038003CB81C1738E3 -:100E0000000000000000003C28C083370000000004 -:100E1000003A002C08C07232000000000000001CE4 -:100E2000B8E0833A00000000CB2900200700003220 -:100E3000000046010400008002C081BC00000000E8 -:100E40000000003478A0813E000000000000001C7B -:100E5000D8E0813C00003501063A0080B25C83BCDA -:100E600000000000003A000089C172370700340119 -:100E70002B010004790A04B900000000CB00000433 -:100E80001941903400003801003A002C070000920C -:100E900000000000003A002CD7E0723C0000000087 -:100EA0000000000009000032000000000000000403 -:100EB00009000032000000000000000007648332D7 -:100EC000000000000008000007008032000036101B -:100ED0000410000007C086B20000000000180000E7 -:100EE00007C084320000550104000028D8A082BC4D -:100EF0000000000000000000D820803A00004101FE -:100F00000400008072802DBC00003F0112000044EC -:100F100012E438B200004201000000D812802D9A7D -:100F20000000BD0F00000004F94190F400004401EE -:100F300004000018D8A081BC00002D010000006C46 -:100F4000D8E0869A00007A0F0000004408802DF255 -:100F500000002D0100000030080000920000000099 -:100F6000CB19002007000032070049012B010004C3 -:100F7000790A02B900000000CB0000041941903446 -:100F8000000000004D000000A7A0813E000000000E -:100F90000008000007008032000036100410000036 -:100FA00007C086B2000000000018000007C08432AD -:100FB0000000550104000028D8A082BC00000000F9 -:100FC00000000000D820803A000052010400008098 -:100FD00072802DBC000050011200004412E438B2AF -:100FE00000005301000000D812802D9A0000BD0FB0 -:100FF00000000004F94190F400007A0F0000004462 -:1010000008802DF200004701000000300800009227 -:101010000000000000000004F94190340000560177 -:101020001200004412E438B218003600000000F844 -:10103000730A03F9000000000018000409807332ED -:1010400000000000002800088980733700000000BD -:101050000000008007008632410000000006008C7E -:101060000700363200005F012908008007C085B202 -:10107000000062012810008C070000B2000063012C -:101080000012008407000092000000000010008C95 -:10109000F7E0823A0000620128180080074090B211 -:1010A00000006301001200840700009200000000AD -:1010B0000012008427E482320000660104000080F0 -:1010C00042603DB318000000000000F8738A033945 -:1010D00063013600000000C00200369200000000EC -:1010E000000000FC02008532000036101200005C97 -:1010F00052812CB400000000000000D802800132B0 -:10110000000000000000008002003B3208406A013D -:10111000F0010008088036B2000000000004013829 -:1011200008C06E3200000000E00000F41E40EF3CFA -:10113000000071010B01008C080000B200006E017C -:10114000F2010080020000B000000000000000F08A -:101150000E003A3200008201E20000800E8083928D -:1011600000007101F2010078C93B3ABC00007B012C -:1011700002010080828097BC00000000000000A8EF -:101180000200E832000076010400008022A22ABC9E -:1011900000007A0104198B8002C07CBC00000000B2 -:1011A0000000008C18C0883A00000000000000A871 -:1011B00012802A3A00000000000000A802BD2A3078 -:1011C0000000740104010080E2A02ABC00007F013D -:1011D0000200008082C088BC00000000E20000081D -:1011E0000800003200000000000000A802808832E1 -:1011F0000000000000188BCC070000320000320312 -:10120000000000DC03000092000000000000003835 -:1012100008802A3200000000000000F00E003A3280 -:1012200000000000E20000800E802A320000000072 -:10123000000000A8028088320000000000188BCC5B -:101240000700003200000000000000DC0300003254 -:101250000000000000000000078083320000000052 -:101260000000000079C02937602000000000000065 -:10127000890D903A00000000CA0100D812802D3A72 -:101280000000000000000000070001320000000024 -:10129000000800000700903200000000001000006D -:1012A0000740E83200000000001800000780E83224 -:1012B00000000000000000FC0200003200003203C9 -:1012C00012010048F2C138B400008E010000008015 -:1012D00002000090000000000030007808807232A8 -:1012E0000400000000380054A85C16380B00000011 -:1012F0000038002CA8DC1638140000000000001C88 -:10130000884D853A0000000000000020080072327D -:1013100000000000000800240800723200000000F5 -:101320000010006C08007232000000000018004C31 -:10133000080072320000361004200018080072B253 -:101340000000000000280030080072320000A101F7 -:10135000083C0014188072BC00000000000000145B -:101360001840813C00000000000000000700063229 -:101370000700000000080000774A09390000361015 -:1013800004100000070082B200000000CA1900002B -:10139000074082320000A00112000040F2C138B4C0 -:1013A00000000000000000D80240003200000000F1 -:1013B0000000006478C029370210000000000064BB -:1013C000884D863A000000000000008008000032CE -:1013D0000000000000000040080000320000000093 -:1013E0004D00000077A0813E0000000000080000D2 -:1013F00007408632000036100410000007C086B295 -:10140000000000000018000007C084320000B9018D -:101410000400001CD8E081BC000000000000006453 -:10142000D860863A0000AF010400008072802DBCB5 -:101430000000AD011200004002C038B20000B5014A -:10144000000000D812802D9A0000AF011200004069 -:10145000F2C138B418003600000000F8730A03F92E -:101460000000B4010401008002802DBC0000B00126 -:10147000670000F8A2802FB500003610120000E8C7 -:1014800002C021B200000000000000D8024000327B -:101490000000B70104000018D8A081BC0000A6011C -:1014A0000000006CD8E0869A00005D0E0000004449 -:1014B00008802DF20000A601000000300800009214 -:1014C0000000B90112000040F2C138B41800360023 -:1014D000000000F8730A03F90000BE010401008057 -:1014E00002802DBC0000BA01670000F8A2802FB571 -:1014F00000003610120000E802C021B20000C9014D -:1015000004010080020084BC00000000000000D440 -:101510000240003200000000000000A42240853A92 -:10152000040000000018004088CD74360000000060 -:10153000000000402800843700000000000000D4B4 -:10154000020000321400C9010400001C880D84BC94 -:1015500000000000000000780961853A8000361024 -:1015600006010080828D97BC00000000000000642E -:10157000D860863A0000B501000000D80240009211 -:101580000000CB0104000018D8A081BC0000CD01F0 -:101590000000006CD8E0869A00005D0E0000004458 -:1015A00008802DF20000000000000030080000322A -:1015B00000000000000000D40240003200000000E3 -:1015C000000000A422C0823A000000000000003C9D -:1015D000B860853C0400D3018100006088CD74B6FA -:1015E0000000000000040028F8A0753C0000D401B1 -:1015F00000080074088075920000000000080028B0 -:10160000F8A0753C000000000000002808A1823C02 -:1016100000000000000000A4F2602A3A0000000070 -:101620000008004808007532000000000020007C1F -:10163000088075320900DA01041A007088CD74B090 -:1016400009000000001A004C87CD74317F000000B3 -:1016500000000064884D8631000000000000006436 -:101660002840863A00000000000000D80240003206 -:10167000000000000010000007408632000000005B -:10168000000000D8028000320000000000100000BE -:101690005761863A0000E301120000C8020020B240 -:1016A0000000E6011201005C088020B20000361044 -:1016B0001200006002802CB200000E012A0100D44A -:1016C000020000B218003600CA0000F8730A03F9DD -:1016D00000000F01000000F81F80FF9A00000000CA -:1016E000000000D4024000320800000000000000AA -:1016F00088CD8537000000000000001CE8A1823E74 -:1017000000000000000000A42240853A0000000014 -:1017100000080050078084320000ED0104010080C1 -:1017200072A082BC00000000001A004CC7E17432B5 -:10173000000000000000006808E1813A0000F001AC -:1017400090010078F9A186BA00000000000000783E -:101750001980973A00000000002000580780973257 -:1017600000000000000000D80280003200000000ED -:101770000000000007008432000000004008000064 -:101780005721803A0000F4011200004CF2C138B435 -:1017900000000000000000000821803A0000000066 -:1017A0000000000408C0813200000000510000D891 -:1017B00002C0003200000000000000D4020000322D -:1017C00000000000CB190020070000320700FC01D8 -:1017D0002B010084780A02B900000000CB000084CD -:1017E00018418834000000004D00000077A0813EC1 -:1017F00000000000000800000700803200003610E2 -:101800000410000007C086B20000000000180000AD -:1018100007C08432000036109F000028D8A082BC88 -:10182000000014020400001CD8E081BC0000080283 -:101830002D000000D82080BA00000502120100E847 -:1018400002C021B218003600000000F8730A03F944 -:10185000000007020401008022802DBC0000080265 -:10186000CD0100D80240849200000402000000F87C -:10187000A2802F9500000B020400008072802DBC16 -:10188000000009021200004412E238B20000120205 -:10189000000000D812802D9A000000000000008493 -:1018A000F841883400000C021200004412E238B201 -:1018B00018003600000000F8730A03F90000110256 -:1018C0000601008022802DBC00000D02670000F898 -:1018D000A2802FB500000E02000000E802C0219295 -:1018E00000000000000000D802C0003200005D0EC1 -:1018F0000000004408802DF20000FA0100000030D2 -:101900000800009200001A0280000080D2802FB6EA -:1019100000001702120100E802C021B218003600D0 -:10192000000000F8730A03F90000190204010080A6 -:1019300022802DBC00001A02000000D802408492D0 -:1019400000001602000000F8A2802F9500000000A1 -:10195000CD000084F841883400001B0212000044CE -:1019600012E238B200000000000000D40240003251 -:1019700000000000000000A422C0823A0000230200 -:1019800004010080420086BC0000000000080058EE -:1019900007408732000022028F010074184087BA86 -:1019A0000000000000000074080000320000250262 -:1019B00000040058F7A0869A00000000000000789C -:1019C000F9A0863A2800000000080058878D973C4F -:1019D00000000000000000D80240003218000000A3 -:1019E00000000000B7608539080000000008000012 -:1019F00087CD8537000028021200004CF2C138B4B0 -:101A0000000000000000004818A0843A0000000018 -:101A1000000000D40200003200000000000000803E -:101A200057A1863A410000000006008C07003632BC -:101A3000000000000008008007C0853200000000A0 -:101A40000010008C0740853200000000000000D824 -:101A5000028000320000361004000058088071B285 -:101A600000000000000000800880003218003600EE -:101A7000000000F8730A03F9000035020401008039 -:101A800002802DBC00003202000000F8A2802F95D9 -:101A90000000320204010080180088BC00003802F7 -:101AA00090190058E89C85BA00000000000000581A -:101AB0001880853A000000000018008007858530F6 -:101AC00000003D0204010080420086BC00000000CE -:101AD000000000D8024000320000000000000008B2 -:101AE0008980713700003E020012008427E4829250 -:101AF00000000000001200840700003200004202D3 -:101B0000270000FC020085B20000420204000080B1 -:101B100042603DB318000000000000F8738A0339EA -:101B20003E023600000000C002003692000036106F -:101B30001200005C52812CB40000450204010080B8 -:101B4000028082BC00006801000000D40200009204 -:101B50000000480204010018D8A081BC00005D0EFE -:101B60000000004408802DF20000E001C7010030B1 -:101B7000080000920000E001C701006CD8E0869ADE -:101B800008000000C60100F893400139000032034C -:101B900080018080320B6AB600000C0E0000003C11 -:101BA000030038F200004E020406018002C06EBC41 -:101BB00000003103000601EC56E06E9A00000000C0 -:101BC000C40701EC56E06E3A08C04F021200004014 -:101BD000A2CD39B218003600000000F8730A03F9EC -:101BE0000000361003B8000009C06EBD53020000AB -:101BF00000000088820D903A2F007C050000001C38 -:101C000008003692000036100000008002000090AC -:101C10002C007C050000001C0800369200003610E5 -:101C200000000080020000900000361000000080DC -:101C300002000090000036100000008002000090BA -:101C400038007C050000001C0800369239007C0535 -:101C50000000001C0800369208000000000000F898 -:101C60009340013900000C0E0000003C030038F2E4 -:101C700000000000000000F842802F3408C05E021F -:101C800012000040A2CD39B218003600000000F862 -:101C9000730A03F9000000000004017809C06E32E5 -:101CA00000000000006201EC068097320000000096 -:101CB000000601EC0640003200006302B50000D8C7 -:101CC000020000B200000000A50080A0360B6A34BC -:101CD00000000000003002E806C02C3200000000C6 -:101CE000001801E00600003200000000000000F8CB -:101CF00082852F3000007D050000001C0800369210 -:101D000008000000000000F89340013900006C0258 -:101D100080008080320B6AB6000032030000008031 -:101D20000200009000000C0E00000038030038F2A2 -:101D300000006F020402018002C06EBC000031038B -:101D4000000201EC56E06E9A00000000C00301ECB6 -:101D500056E06E3A00C0700212000040A28D39B207 -:101D600018003600000000F8730A03F900007C0236 -:101D70003828001809006EB200007502042101081D -:101D800069246EBC03007D050000001C080036922B -:101D90000000790202300080829B90BC0000780233 -:101DA0000603018012C06EBC04007D050000001C0B -:101DB0000800369205007D050000001C08003692E0 -:101DC00000007B020603018012C06EBC0B007D0583 -:101DD0000000001C080036920C007D050000001C6D -:101DE0000800369200007E020421010869246EBCBE -:101DF00003007D050000001C0800369200008202EE -:101E000002300080829B90BC0000810206030180AA -:101E100012C06EBC04007D050000001C0800369254 -:101E200005007D050000001C0800369200008402B9 -:101E30009F31010C69246EBC000000000000000C02 -:101E4000090000320000880204310004899B90BC24 -:101E5000000087020603018012C06EBC20007D05D1 -:101E60000000001C0800369221007D050000001CC7 -:101E70000800369200008A020402018012C06EBC83 -:101E800022007D050000001C0800369200008C0234 -:101E90000401000039A490BC23007D050000001C53 -:101EA0000800369224007D050000001C08003692D0 -:101EB000080036100C0000F8634001B910009102D0 -:101EC000C50100CC022015980800ED020C0000F8B6 -:101ED000434001B910000000C50100CC02201538B4 -:101EE00000000C0E0000003C030038F200009402D9 -:101EF0003601005C080580B00F007D050000001C65 -:101F00000800369210000000002C0200A9DB853981 -:101F1000000095021200005402A438B20000000034 -:101F20000008028C08C06E3200000000000C02980D -:101F300028806E37000000000000009C3822143713 -:101F400000009E020430002808006EB20000361027 -:101F50000410006C08006EB2000000000018004C75 -:101F600008006E32000036100420001808006EB21F -:101F70000500A1020038020078E16E99000000001F -:101F8000510000D802000032000000000038027842 -:101F900009C06E32050000006808000077A197397B -:101FA0000000A3021201000009C021B2180036008F -:101FB000000000F8730A03F900000000545401FC0B -:101FC00002C06E321410A70204000080A20D72B08D -:101FD0000000510F0000002809C002F20E007D052C -:101FE0000000001C080036920000B602331500A461 -:101FF00002C072B20000EA0280010080B20172B633 -:102000000101AD0204290080828D74BC080AEA0235 -:10201000042D0080828D74BC000000000030007C24 -:10202000080075320000B402003800881800759C62 -:10203000080AEA0204290080828D74BC10000000A6 -:10204000002C007C888D7537000000000030007C7B -:1020500068DD87320000B3029F390088188075BCA4 -:102060001000000000340088888D75370000B4022D -:10207000000000881880889C100000000034008850 -:10208000689D88390000B7029FF1018082DB87BC20 -:102090000000EA0200000080020000900000EA0256 -:1020A00080000080B20172B6000000000008004805 -:1020B0000800753200000000001000700800753242 -:1020C00000000000001C007438A275370000BC023C -:1020D000831B007808C074B200000000000000F804 -:1020E000C2802F340000CC029F780180C2216EBCD8 -:1020F0000000C0029F990164881B87BC0000CD02CC -:102100009F680164885B86BA0000000000000064DC -:102110000800003200000000001600A402C0723265 -:1021200000000000003C02A4B25B2A3A000000005C -:10213000003A027809C06E320000CE0208010004A5 -:10214000E8A575BC1000EA020B01001C080036B2BD -:102150000000CC0204A10180829B84BC00007D05AC -:102160009F980180C2216EBC00007D0506B10180F0 -:10217000825B87BC0000E9020B010080020000B016 -:102180000000CD0204990180C2216EBC0000E7026C -:1021900002D4018092FB6EBC16007D050000001C7D -:1021A0000800369217007D050000001C08003692DA -:1021B0001C007D050000001C080036920000D002C3 -:1021C00004A10180829B84BC0000D70206A8018084 -:1021D000825B80BC0000D40204A9018002006EBCB6 -:1021E0000000E80204A10180829B84BC0000E80298 -:1021F00004010080124080BC14007D050000001C1A -:10220000080036920000E8029FA0017829216EBCE8 -:102210000000E8020201008012A097BC0000CC027E -:1022200000000080020000900000E3020400008033 -:10223000028082BC0000DC0202000080A26080BC40 -:1022400006007D052C01001C080036B200C0E0022B -:1022500004010080A28D2FB006007D050000001C47 -:10226000080036920000E00204000080A26080BCFA -:102270000000DF020603018012C06EBC09007D056C -:102280000000001C080036920A007D050000001CBA -:10229000080036920000E2020603018012C06EBC04 -:1022A00007007D050000001C0800369208007D052F -:1022B0000000001C0800369202007D053801001C59 -:1022C000080036B20000E602020C0280A25B80BC6D -:1022D0001F007D050000001C080036921E007D05D1 -:1022E0000000001C080036920000EB0200000028ED -:1022F000094000920000EB020000002809800092D3 -:102300000000EB020000002809C000920000EB0270 -:1023100000000028090001920E00510F0000001C6F -:10232000080036F200007D050000008002000090E9 -:10233000100036102A0000CC022015B800000C0E48 -:102340000000003C030038F21D00F102800100781B -:1023500009E000B81D007D050000001C0800369251 -:1023600015007D050000001C0800369200000000EA -:102370000000001CA805283008000000000000F83C -:102380008340013900003E0380018080320B6AB631 -:1023900000000C0E00000038030038F27E0500003B -:1023A0000000008882CD813A0000F9021D41025CE4 -:1023B000F80168B441003103000000F8A28D2F91AC -:1023C00010000000D02C0200A9DB85390000960225 -:1023D0001201005402A438B20000FA02000000808A -:1023E000020000900000000304B0008002006EBCF8 -:1023F0000000000380B9008082806EB600002510C6 -:102400000078016008006EF230007C05D700001CE7 -:10241000080036920000020380010080D2812FB6AE -:1024200031007C05D700001C080036920000040330 -:102430008001008042812FB635007C05D700001C4A -:10244000080036920000110304A8010809006EB2CA -:102450000000000000200208899B903E0000000060 -:1024600000A00108899B903A000011039F88010891 -:10247000899B90BC000000000034020009C06E3D42 -:1024800000000000000C020409A46E3700000D03D8 -:102490000200008012A490BC0000000000000008B0 -:1024A000198090370000110302010280829B90BCCA -:1024B00031007C05D700001C080036920000110393 -:1024C00004B0008002006EBC001211030401008001 -:1024D000A28D2FB032007C05D700001C0800369278 -:1024E00000003103000000F872812F950000000009 -:1024F000000000F842802F3408C050021201004052 -:10250000A2CD39B200001303000000800200009049 -:1025100008000000000000F89340013900003E036D -:1025200080018080320B6AB60000000000000014B9 -:102530000840903200000C0E00000038030038F212 -:102540007E0500000000008882CD813A080000006E -:10255000000000F89340013900003E0380018080B4 -:10256000320B6AB600000C0E00000038030038F28F -:1025700000001F030420018052206EBC26007D0550 -:102580000000001C0800369225007D050000001C9C -:102590000800369200002503040100D81E80EDBC1F -:1025A00000002103B70000D80EC0EDB200002403E4 -:1025B00004010080423BEEBC00000000000000E08F -:1025C0001E00EE3A00000000A70000D00E00EE3220 -:1025D00000000000007486CC02806C320000000015 -:1025E000000000000940E7320000290380018080DC -:1025F000320B6AB6360028031200002C82CD2EB2B0 -:1026000000002B030401008042C52CBC00002C03F9 -:10261000000000CC0200009200000000000000CC8E -:1026200012C02C3A0000270304010000190090BCDE -:1026300000000000007486C806C02C3208003E036B -:10264000000000F8C34001990000FA0D0000002CC2 -:10265000090000F200003203000000800200009038 -:102660000000FA0D0000002CF90100F400003B030B -:1026700004000028098080B200000000000000D89B -:10268000020000320000F10E00000008080000D235 -:1026900000003B0304000080028092BC180036005A -:1026A000000000F8730A03F900003E038001008077 -:1026B000A2802FB600003E031201000009C021B223 -:1026C00018000000000000F8730A03393E033600CA -:1026D000000000C00200369200003E03800100802E -:1026E000A2802FB600003E031201000009C021B2F3 -:1026F00018003600000000F8730A03F9000000001B -:10270000000000F80200003218003600000000F857 -:10271000738A029910000000000000E403003632C2 -:1027200002000001000000E003003732000000005A -:10273000000000E40300363204000001000000E065 -:1027400003003732AA040000000000E40300363220 -:1027500009000001000000E0030037320000000023 -:10276000000000CC0F00003200070000000000E471 -:102770000300363206000001000000E0030037329B -:1027800020000000000000E40300363208000001D1 -:10279000000000E00300373200010000000000E408 -:1027A0000300363205000001000000E0030037326C -:1027B00030000000000000E4030036320700000192 -:1027C000000000E00300373200A00000000000E439 -:1027D0000300363208000008000000E00300373232 -:1027E00000000000000000A0020000320000000015 -:1027F000000000000B000032000052038B0100A01B -:1028000012002ABA00000000000000A802000032F6 -:1028100000000000000000E0070000320000550347 -:102820000601008002802ABC000000000000009C1D -:102830000200003200000000000000D4020000325C -:1028400000000000000000CC020000320000000088 -:10285000000000D80200003200000000000000D09C -:102860000200003200000000000000DC0200003224 -:1028700000000000000000F802000032000000002C -:10288000000000C80200003200000000000000C488 -:1028900002000032000058038501009C12C029BAD2 -:1028A00000000000000000E4030036320B000004CA -:1028B000000000E00300373280000000000000E468 -:1028C0000300363213000004000000E0030037323A -:1028D00000200000000000E4030036320C00000479 -:1028E000000000E00300373200000000000000E4B8 -:1028F000030006320F000004000000E0030037323E -:1029000000440000000000E4030036320D00000423 -:10291000000000E00300373200040000000000E483 -:102920000300363214000004000000E003003732D8 -:102930009F000000000000E4030036321500000490 -:10294000000000E00300373200000000000000E457 -:102950000300363218000004000000E003003732A4 -:1029600060000000000000E4030036321D00000497 -:10297000000000E00300373200000000000000E427 -:10298000030004321E000004000000E003003732A0 -:1029900070000000000000E4030036321F00000455 -:1029A000000000E00300373200000000000000E4F7 -:1029B0000300003220000004000000E00300373272 -:1029C000A0030000000000E40300363217000004FA -:1029D000000000E00300373240000000000000E487 -:1029E000030036321B000004000000E00300373211 -:1029F00060000000000000E4030036321C00000408 -:102A0000000000E00300373200000000000000E496 -:102A10000340003216000004000000E003003732DB -:102A200000010000000000E4030036321A00000438 -:102A3000000000E00300373220010000000000E445 -:102A40000300363219000004000000E003003732B2 -:102A500080000000000000E4030036320B0000019B -:102A6000000000E00300373200010000000000E435 -:102A7000030036320C000001000000E00300373292 -:102A8000FEFF0000000000AC020036320000000033 -:102A9000000000000900003218000000000000F8EB -:102AA0000364023900008B0385010000190090BA0D -:102AB00025260000000000E403003632010000017A -:102AC000000000E00300373200000000000000803A -:102AD0000F00003200000000000000840F000032F0 -:102AE00008000000000000F8F34001390800000071 -:102AF000000000F8E340013908000000000000F881 -:102B0000C340013908000000000000F8B34001395B -:102B100008000000000000F8A34001390800000090 -:102B2000000000F89340013908000000000000F8A0 -:102B30008340013908000000000000F873400139AB -:102B400008000000000000F86340013908000000A0 -:102B5000000000F85340013908000000000000F8B0 -:102B60004340013908000000000000F833400139FB -:102B700008000000000000F81340013900000000C8 -:102B8000000000F80380003200000000000000C8D0 -:102B90003F80FC35000000000000009C0200003275 -:102BA0000000000000000000030000326E00000082 -:102BB000000000D0020036320000000000000028B3 -:102BC000034038320000361004010080D20130B6D4 -:102BD0000000A303040100D012002DBCE00300009C -:102BE000000000E40300363203000001000000E0B2 -:102BF0000300373200000000170000D0020000324E -:102C000000000000000000ACE10000340000000003 -:102C1000000001E00600003200000000000801E4AE -:102C20000600003200000000000E01EC0600003239 -:102C300000000000001001E006000032000000006B -:102C4000000000D012002D3A6E00AB03020100809C -:102C5000820D2DBC020000000000009CAE0D02326F -:102C600000000000000000A8020000320000000088 -:102C7000008886CC0700363200000000008A86CC2F -:102C80000700003A002400000000000409803632EA -:102C90000000361012000064024090B200000000F4 -:102CA000000000042940903A0000B70312000078A9 -:102CB00009C020B2000000000000007809459030F3 -:102CC0000000B50302010080C28297BC0000000032 -:102CD000000000840200003200000000000000CC70 -:102CE000030000320000BB038E010080024028B2C6 -:102CF0000000510E000000D8020000D2150F0000A5 -:102D00000000008C0E0036325200000000000074FB -:102D10000E00363218000000000000E403003632D6 -:102D200009000002000000E003003732FECA000084 -:102D3000000000E4030036320A000002000000E058 -:102D4000030037320000C60312010000094020B220 -:102D50000000C40300000080020000900000C603D1 -:102D600012000004094020B20000C9039F01008046 -:102D7000020090B20000C80312000008094020B20F -:102D80000200C40304010078092417B806000000FB -:102D900000000078096416380000C40304010080B4 -:102DA000028197BCFE0000000000004403003632A0 -:102DB000FE00360000000048030036920000361086 -:102DC00012000000094020B20000CF0312000004EE -:102DD000094020B20000D2039F010080020090B29F -:102DE0000000D10312000008094020B200000000DA -:102DF000000000B402009032000036100000008095 -:102E000002000090000036100000008002000090D8 -:102E10000000361000000080020000900000361014 -:102E200000000080020000900000361000000080CA -:102E300002000090000036100000008002000090A8 -:102E400000003610000000800200009000003610E4 -:102E5000000000800200009000003610000000809A -:102E60000200009000003610000000800200009078 -:102E700000003610000000800200009000003610B4 -:102E8000000000800200009000003610000000806A -:102E9000020000900600EA030000000C0964169886 -:102EA00000004902000000140840909200006902EE -:102EB0000000001408409092340015030000001C2C -:102EC00008003692120015030000001C080036921C -:102ED0003A0015030000001C08003692000036106E -:102EE000000000800200009000005B02000000145F -:102EF0000840909200001D04000000800200009035 -:102F000000001A030000001408409092EB03000038 -:102F10000000008882CD903A0D000D04000000FCF6 -:102F200002E416980D001E04000000FC02E416984E -:102F30000D002704000000FC02E416980000340491 -:102F4000000000800200009000003D04000000002E -:102F50000940909D000040040000008002000090A5 -:102F600000004904000000800200009000005204AC -:102F7000000000800200009000005B0400000000E0 -:102F80000940909D00006004000000800200009055 -:102F900000006804000000000940909D00006D04DE -:102FA00000000080020000900000DC04000000002F -:102FB000090000920000DC040000000009400092BB -:102FC0001D07DE04000000A0020036920000EC04A1 -:102FD0000000008002000090000036100000008019 -:102FE0000200009000001D04000000DC0F409092E1 -:102FF0000000B00400000080020000900000B50452 -:10300000000000D4020000921000CA0400000084F6 -:103010001F64149800001D04000000EC0E40909204 -:103020000000D604000000800200009000001D0493 -:10303000000000D40E4090920000D90400000080EF -:103040000200009000006D05000000DC0E40909230 -:103050000000FB0400000080020000900800000552 -:10306000000000501F24169800000F05000000D833 -:10307000020000920D001905000000FC02E4169801 -:1030800000001A05000000D0020000920000F600C7 -:10309000000000D002000092000035100000008007 -:1030A0000200009000003610000000800200009036 -:1030B00008000000000000F8934001390000000003 -:1030C000000000780945903000003E0306010080B2 -:1030D000228097BC02001004B00000A0F20B00B9DF -:1030E00000000000A00000046B41903400003E038B -:1030F000800100800240B0B600003E030400008062 -:103100000280B0BC00000000000000D802000032C5 -:1031100000000000000000A822C02F3700000000BF -:1031200000000000670100340042000000080000B9 -:10313000878D2A3A00003610041000000700B0B254 -:1031400000000000001800000700D03200001A0440 -:1031500012000048F2C138B418000000000000F866 -:10316000730A03393E033600000000C002003692A5 -:1031700008003E03000000F893400199000021047C -:103180009F000080020090B20000000000000008D4 -:1031900009409032000000000000000409C0FD3228 -:1031A00002002104B00000A0F20B00B900000000F2 -:1031B000000000000B8090320000000000000000C2 -:1031C0000D40903200000000A00000043B40B031F0 -:1031D00000001D040400008002C02FBCF20E1D047C -:1031E0000000008C0E00369208000000000000F87D -:1031F0009340013902002804B00000A0F20B00B98E -:1032000000002B04800100801240B0B600000000D6 -:10321000000000043B40B033000000000000000448 -:10322000FD4BD03500000000000000080B0000320C -:1032300000000000A000000C1BE4B03200003E03C0 -:103240000B000080020000B0000031040400008088 -:10325000024090B21F003E03000000801140009920 -:103260000000300404000080123EF8BA00000000A4 -:10327000000000800100F83200003E0300000090D2 -:103280000140F89200003610800000800281FCB6F8 -:10329000000038049F000080020090B2000000008F -:1032A0000000000809409032000000000000000407 -:1032B00009C0FD3200000000000000E403809032ED -:1032C00009000004000000E00300373200000000A5 -:1032D000000000E4034090320A000004000000E017 -:1032E0000300373200001D04000000C80F81FC9469 -:1032F00000000000000000E47300903C1000000497 -:10330000000000E00300373200001D0400000080D0 -:1033100002000090000043049F000080020090B271 -:10332000000000000000000809409032000000008A -:103330000000000409C0FD3200000000000000E4AD -:103340000380903201000004000000E003003732E7 -:1033500000000000000000E00F809032000000003C -:10336000000000E40340903202000004000000E08E -:103370000300373200001D04000000E40F4090926B -:1033800000004C049F000080020090B2000000008A -:103390000000000809409032000000000000000416 -:1033A00009C0FD3200000000000000E403809032FC -:1033B00003000004000000E00300373200000000BA -:1033C000000000A80E80903200000000000000E421 -:1033D0000340903204000004000000E00300373294 -:1033E00000001D04000000AC0E4090920000550447 -:1033F0009F000080020090B2000000000000000862 -:1034000009409032000000000000000409C0FD32B5 -:1034100000000000000000E403809032050000047A -:10342000000000E00300373200000000000000E46C -:103430000340903206000004000000E00300373231 -:1034400000000000000000440F80903200001D04C6 -:10345000000000480F40909200005D0404010080CD -:10346000824290BC00000000000000000900003211 -:1034700000000000000000E403009032120000048D -:10348000000000E00300373200001D04000000408F -:103490001F40909C000063049F000080020090B2D7 -:1034A0000000000000000008094090320000000009 -:1034B0000000000409C0FD3200000000000000E42C -:1034C0000380903207000004000000E00300373260 -:1034D00000000000000000E40340903208000004F7 -:1034E000000000E00300373200001D0400000080EF -:1034F0000200009000006A0404010080824290BC37 -:103500000000000000000000090000320000000080 -:10351000000000E40300903211000004000000E00D -:103520000300373200001D04000000FC1F40909C87 -:10353000000070049F000080020090B200000000B4 -:103540000000000809409032000000000000000464 -:1035500009C0FD32030900000000002808003632CF -:103560000000890400000030080036D200009304F7 -:1035700000000044088000D20000790404010080AB -:10358000020084B2030E000000000028080036325A -:103590008000890400000030080036D20000930447 -:1035A0000000004408C000D200007904040100803B -:1035B000020084B200008004000000440800019270 -:1035C0008002000000000000070036328C45000039 -:1035D000000800000700363200003610041000001A -:1035E000078090B2000000000018000007409032F1 -:1035F0000000000000000048F2C1383400007E04E2 -:1036000012000080020000B018003600000000F830 -:10361000730A03F920000000000000E403003632C2 -:1036200009000002000000E0030037320000000043 -:10363000000000E4034084320A000002000000E0C1 -:10364000030037328C450000000000A8020036322B -:10365000A000000000000000090036320000000059 -:10366000000000E0070000320000860406010000B0 -:10367000190090BC00001D040000008002000090B2 -:103680008C450000000000C80200363280020000B5 -:103690000000003C0800363200000000000000344A -:1036A0000800013200008E0402000080D2E083BCDA -:1036B000000000000000003408C083320000A404B1 -:1036C00000000080020000F000000000000000A0E8 -:1036D000078083320000000000000030D820833AC9 -:1036E00000008C040401003CD8E083BC0000000012 -:1036F00000010080020000500000000000000040B7 -:1037000008000032000000000000004808000032FD -:103710008C450000000000C80200363200020000A4 -:10372000000000C8828D2C3A800000000000003CA0 -:10373000080036320000000000000078098078326E -:103740005A5A000004010080828D975C00009C049E -:1037500002010048A89E84BA000000000000004852 -:103760001880843A00009A040601003C28C083BCFB -:10377000000000000000007809858430100000007F -:1037800000000048888D84360000A10490010048A4 -:10379000E8A584BA00000000000000481880843AC0 -:1037A0000000000000000048088584300000000090 -:1037B000040100800285845C0000000000010040DC -:1037C0000840005200000000000000E403008332C3 -:1037D00001000002000000E0030037320C00AA04E0 -:1037E0000000002CD8A082F905000002000000E0D3 -:1037F00003003732000000000000008002000030AB -:10380000000000000001003808403E720000000087 -:10381000000000E403C0823202000002000000E069 -:103820000300373202000002000000E003003732DC -:103830000000000000000080020000300000AC0426 -:1038400080000080F2403EB60000000000010080D1 -:10385000020000700000B3049F000080020090B2DC -:103860000000000000000008094090320000000045 -:103870000000000409C0FD320000000000000084C8 -:103880000E80903200001D04000000880E409092CF -:1038900008000000000000F8934001390000B9045E -:1038A0009F000080020090B20000000000000008AD -:1038B00009409032000000000000000409C0FD3201 -:1038C00000000000000000200740F532000000006A -:1038D0000008002007000032000000000010002057 -:1038E00007C0F53200000000001800200740F63243 -:1038F00000000000002000200780F63200000000D9 -:103900000028002007C0F632000000000030002030 -:103910000700F73200000000003800200780FF3267 -:1039200000000000000000D802000032000000008B -:1039300000000000074009320000000000080000FD -:1039400077C0293700000000001000000780903287 -:103950000000000000180000074090320000C6047C -:1039600012000048F2C138B418003600000000F818 -:10397000730A03F90000000000000008C8010034C9 -:1039800000003203000000FC020000920000CC04A2 -:1039900080010080F24190B60000CD04000000C814 -:1039A0002F81FC9400000000000000C82F81FC352E -:1039B00000000000000000800F4590300000D0049F -:1039C00002000080027EF8BC0000000000000084BD -:1039D0000F00F83200000000000000001940F83726 -:1039E00000000000000000843F40F83700000000A5 -:1039F000000000840F64F83A00000000000000009E -:103A00001900F83700000000000000803F00F83780 -:103A100000001D04000000800F24F89A0000D80464 -:103A200080010080F24190B600001D04000000C833 -:103A30004F81FC9400001D04000000C84F81FC95DC -:103A40000000DB0404010080024090BC0000000084 -:103A50000000000409C0003200001D04000000E462 -:103A60001E40909C00000000000000A8220090373B -:103A700000001D04000086C007409092080000006E -:103A8000000000F8934001390D000000000000FC28 -:103A900002E41638000000000000000009000232B5 -:103AA0000000E604040000800200B0B20000000044 -:103AB000000000000B00003220000000000000A009 -:103AC000820D2A3A0000E10404010000190090BCB4 -:103AD0000000E804000000287901009400000000C4 -:103AE000000000C83F80FC34408000000000002837 -:103AF000098036320000F10E000000D8020000D22A -:103B000000003E0304000080028092BC1800000008 -:103B1000000000F8730A03393E033600000000C0BD -:103B200002003692EA05F20404010080824D90BC46 -:103B300000000000000000EC0F00153200FE1F0026 -:103B4000000000F00F003732F0FF0000000000E836 -:103B50000F00363298050000000000F40F003632E6 -:103B60000000F804000000C84F80FC953623361092 -:103B700004010080824D90BC00000000000000ECB9 -:103B80000F80143200F81F00000000F00F003732E1 -:103B9000C0FF0000000000E80F0036329827000048 -:103BA000000000F40F00363200000000000000C8E2 -:103BB0004F80FC3404000000000000608F4D903AFC -:103BC0000000BC0E00000080020000D000001D04B8 -:103BD00000000080020000900000FD0480010080D1 -:103BE000024090B600000000000000C86F80FC3466 -:103BF0000000FF0480010080124090B60000000029 -:103C0000000000C85F80FC3400001D04000000803C -:103C1000020000900000020504010080324090B0D4 -:103C200080011D04000000C88F8DFC910000040578 -:103C300080000080124090B600000505000000C81A -:103C40007F80FC9500000000000000C87F80FC34ED -:103C50000000070580000080024090B600000805C3 -:103C6000000000C88F80FC9500000000000000C824 -:103C70008F80FC3400000B0580000080224090B64D -:103C8000F20E00000000008C0E00363200000D0520 -:103C9000000000C81F81FC95150F00000000008C7B -:103CA0000E00363200000000000000C81F81FC3406 -:103CB000100000000000004C1F24163800001D04F6 -:103CC000000000501F00F59C000012059F000080BE -:103CD000020090B20000000000000008094090328D -:103CE000000000000000000409C0FD3200000000D8 -:103CF000000000001700F53A8C44000000080000A6 -:103D0000070036320000361004100000078090B221 -:103D10000000000000180000074090320000160567 -:103D200012000040F2C138B418003600000000F85C -:103D3000730A03F900001D040000008002000090D7 -:103D400000001D04000000EC0340909200001A05E2 -:103D5000B20000D8020000B200000000000201EC36 -:103D600016E46E3A08000000000000F893400139A4 -:103D700000004005171001F802006EB2060025058C -:103D800004010080828D2FB003000000000000F8C5 -:103D9000828D2F3200C0050E00000028098036D227 -:103DA00000000000000201EC16C06E3C00000000A4 -:103DB000001886C80600003218003600000000F81F -:103DC000730A03F900002605000000D002000092EB -:103DD00000002B050419868002806CBC00000000E6 -:103DE0000000000009006E3200000000C10800045D -:103DF00009006E3200000000C01586780FC06C32DA -:103E0000000030058001008022802FB600003005C0 -:103E1000001886C806400092000000000040000024 -:103E200009006E3200000000C248000409006E3232 -:103E300000000000C01686780FC06C32000030050C -:103E40008001008012802FB600000000001886C894 -:103E500006000032004000000000002809803632D1 -:103E6000000038050402018002C06EBC0000050E8F -:103E7000000201EC16C06EDC0000360580000080F8 -:103E800002802FB600003805810000F822802FB490 -:103E900000003805001886C806400092000038056A -:103EA000820000F812802FB400000000001886C8BD -:103EB0000600003200000000001086C80600003234 -:103EC000000000000000000007C00A3200380000B7 -:103ED0000008000007003632000036100410000011 -:103EE000070090B200000000001800000740903268 -:103EF00000003D0512000040F2C138B41800360041 -:103F0000000000F8730A03F900000000170100F830 -:103F1000A2802F3400000000001086A842806C3779 -:103F200000004A051200703802007EB20000361010 -:103F30001200703C02007EB2000036101200703099 -:103F400002007EB2000036101200703402007EB211 -:103F50000000410502010080B2822ABC000000007E -:103F6000170000D002000032060025050401008081 -:103F7000828D2FB000001F050403018002C06EBCBB -:103F800000005505000000800200009000004C0574 -:103F90000403018002C06EBC00005505001086C8F5 -:103FA00046802A9600000000001086C846802A3607 -:103FB000000050058000008012802FB603005205DB -:103FC000220000F8828D2FB200005205001886C82A -:103FD00006000092000055058000008022802FB668 -:103FE00000000000C20100F802802F3500C0050E5D -:103FF00000000028098036D200000000000201EC19 -:1040000016C06E3C18003600000000F8730A03F971 -:1040100000000000001001E006802F3200000000C8 -:10402000000000A8E100003400000000A20000FC35 -:10403000020000320000320380010080A2802FB60F -:1040400000005B05B90100D8028001B20000320314 -:10405000000000F80200009200000000000000389C -:104060001880F73A0000000000000038F8BF8330E5 -:1040700000005F0504010080F2BD83BC0000320334 -:10408000A90000F80200009200C066051801000CAB -:10409000A8CD3EB200006205840000741F40F7BA4C -:1040A00000003203A90000F80200009200000000A6 -:1040B000000000740F00003200C066051801000CFB -:1040C000A8CD3EB218003600000000F8738A03F94C -:1040D00000006305000000B0020000920000000034 -:1040E0000000007C0F8083320000000000280000E8 -:1040F000070000320000000000300000070000321E -:104100000001008000380000070037320000000086 -:10411000003C000C0780833200006B051200004851 -:1041200002C080B200003203A9000008E801009438 -:104130000000730504010080A2C0EDBC5200000025 -:10414000000000740E00363200000000000000C0C5 -:104150000E400132407E0500000000B40E003732F0 -:1041600000000000000000C40E80073264007805E3 -:10417000000000CC0E003692290000000000007400 -:104180000E00363200000000000000C00E40003279 -:10419000A08C0000000000B40E00363200000000C9 -:1041A000000000C40EC0003200000000000000CC7F -:1041B0000E80023210000000000000E4337BEC3976 -:1041C0001E000001000000E0030037320000000084 -:1041D000000000C86EC0EC3700001D04000000D8CD -:1041E0000EC0ED927E0500000000008882CD813A6D -:1041F0007E0500000000008882CD813ABD050000E8 -:104200000018018882CD6E3AC605000000180188AA -:1042100082CD6E3ACF0500000018018882CD6E3A3B -:10422000D80500000018018882CD6E3AE105000033 -:104230000018018882CD6E3AEA0500000018018856 -:1042400082CD6E3AF30500000018018882CD6E3AE7 -:10425000FC0500000018018882CD6E3A05060000BA -:104260000018018882CD6E3A0E0600000018018801 -:1042700082CD6E3A170600000018018882CD6E3A92 -:10428000200600000018018882CD6E3A2906000041 -:104290000018018882CD6E3A3206000000180188AD -:1042A00082CD6E3A3B0600000018018882CD6E3A3E -:1042B000440600000018018882CD6E3A4D060000C9 -:1042C0000018018882CD6E3A560600000018018859 -:1042D00082CD6E3A5F0600000018018882CD6E3AEA -:1042E000680600000018018882CD6E3A7106000051 -:1042F0000018018882CD6E3A7A0600000018018805 -:1043000082CD6E3A830600000018018882CD6E3A95 -:104310008C0600000018018882CD6E3A95060000D8 -:104320000018018882CD6E3A9E06000000180188B0 -:1043300082CD6E3AA70600000018018882CD6E3A41 -:10434000B00600000018018882CD6E3AB906000060 -:104350000018018882CD6E3AC2060000001801885C -:1043600082CD6E3ACB0600000018018882CD6E3AED -:10437000D40600000018018882CD6E3ADD060000E8 -:104380000018018882CD6E3AE60600000018018808 -:1043900082CD6E3AEF0600000018018882CD6E3A99 -:1043A000F80600000018018882CD6E3A010700006F -:1043B0000018018882CD6E3A0A07000000180188B3 -:1043C00082CD6E3A130700000018018882CD6E3A44 -:1043D0001C0700000018018882CD6E3A25070000F6 -:1043E0000018018882CD6E3A2E070000001801885F -:1043F00082CD6E3A0000F702000000D40200009265 -:1044000000007202000000800200009037070000E8 -:10441000001C018882CD6E3A3C070000001C018818 -:1044200082CD6E3A41070000001C018882CD6E3AB1 -:1044300046070000001C018882CD6E3A4B07000041 -:10444000001C018882CD6E3A50070000001C0188D4 -:1044500082CD6E3A55070000001C018882CD6E3A6D -:104460005A070000001C018882CD6E3A5F070000E9 -:10447000001C018882CD6E3A64070000001C018890 -:1044800082CD6E3A69070000001C018882CD6E3A29 -:104490006E070000001C018882CD6E3A7307000091 -:1044A000001C018882CD6E3A78070000001C01884C -:1044B00082CD6E3A7D070000001C018882CD6E3AE5 -:1044C00082070000001C018882CD6E3A8707000039 -:1044D000001C018882CD6E3A0000FC02000000D46E -:1044E0000200009200001203000000D402000092BB -:1044F00000003C0900000010088001920000361006 -:1045000000000080020000900000361000000080D3 -:1045100002000090000036100000008002000090B1 -:1045200000003610000000800200009000003610ED -:1045300000000080020000900000361000000080A3 -:104540000200009000003610000000800200009081 -:1045500000003610000000800200009000003610BD -:10456000000000800200009000007B0900000010A5 -:1045700008800092000036100000008002000090C9 -:10458000000036100000008002000090000036108D -:104590000000008002000090000036100000008043 -:1045A0000200009000003610000000800200009021 -:1045B000000036100000008002000090000036105D -:1045C0000000008002000090000036100000008013 -:1045D00002000090000036100000008002000090F1 -:1045E00000008809000000100880009200003610CA -:1045F00000000080020000900000361000000080E3 -:10460000020000900000CF09000000100840019255 -:1046100000003610000000800200009000003610FC -:1046200000000080020000900000361000000080B2 -:104630000200009000003610000000800200009090 -:104640000000361000000080020000900000D70932 -:104650000000001008C0009200003610000000802A -:10466000020000900000D7090000001008C000926E -:1046700000003D0C000000100840019200003610C0 -:1046800000000080020000900000D7090000001028 -:1046900008C0009200003610000000800200009068 -:1046A000000036100000008002000090000036106C -:1046B00000000080020000900000E40900000010EB -:1046C00008C0009200003610000000800200009038 -:1046D0000000E4090000001008C0009200003D0C3A -:1046E0000000001008400192000036100000008019 -:1046F000020000900000E4090000001008C00092D1 -:10470000000036100000008002000090000036100B -:1047100000000080020000900000361000000080C1 -:10472000020000900000E2090000001008C00092A2 -:104730000000361000000080020000900000E20936 -:104740000000001008C0009200003D0C00000010A6 -:104750000840019200003610000000800200009026 -:104760000000E2090000001008C0009200003610AE -:104770000000008002000090000036100000008061 -:10478000020000900000361000000080020000903F -:1047900000003610000000800200009000007A0A3D -:1047A0000000001008C000920000D40900000010B2 -:1047B000080001920000CF0900000010084001929B -:1047C000000036100000008002000090000036104B -:1047D0000000008002000090000036100000008001 -:1047E00002000090000036100000008002000090DF -:1047F000000036100000008002000090000036101B -:1048000000000080020000900000750A0000001007 -:10481000088000920000D4090000001008000192F6 -:104820000000CF090000001008400192000036107F -:1048300000000080020000900000361000000080A0 -:10484000020000900000361000000080020000907E -:1048500000003610000000800200009000003610BA -:104860000000008002000090000036100000008070 -:10487000020000900000750A00000010080001927C -:104880000000D40900000010080001920000CF09C8 -:104890000000001008400192000036100000008067 -:1048A000020000900000361000000080020000901E -:1048B000000036100000008002000090000036105A -:1048C0000000008002000090000036100000008010 -:1048D00002000090000036100000008002000090EE -:1048E0000000E40A00000010088000920000D409D3 -:1048F00000000010080001920000CF090000001025 -:104900000840019200003610000000800200009074 -:1049100000003610000000800200009000003610F9 -:1049200000000080020000900000361000000080AF -:10493000020000900000361000000080020000908D -:104940000000361000000080020000900000E40A21 -:1049500000000010080001920000D40900000010BF -:10496000080001920000CF090000001008400192E9 -:104970000000361000000080020000900000361099 -:10498000000000800200009000003610000000804F -:10499000020000900000361000000080020000902D -:1049A0000000361000000080020000900000E309C3 -:1049B0000000001008800092000036100000008007 -:1049C000020000900000E30900000010088000923F -:1049D00000003D0C0000001008400192000036105D -:1049E00000000080020000900000361000000080EF -:1049F00002000090000036100000008002000090CD -:104A00000000361000000080020000900000361008 -:104A100000000080020000900000E3090000001088 -:104A20000800019200003610000000800200009093 -:104A30000000E309000000100800019200003D0C96 -:104A400000000010084001920000361000000080B5 -:104A5000020000900000361000000080020000906C -:104A600000003610000000800200009000003610A8 -:104A7000000000800200009000003610000000805E -:104A8000020000900000361000000080020000903C -:104A900000008C0700000010080001920000361092 -:104AA000000000800200009000008C070000001051 -:104AB00008400192000036100000008002000090C3 -:104AC0000000361000000080020000900000361048 -:104AD00000000080020000900000361000000080FE -:104AE00002000090000036100000008002000090DC -:104AF00000005E0C00000010084001920000540C01 -:104B0000000000100840019200005E0C0000001040 -:104B1000084001920000CF090000001008400192F7 -:104B200000003610000000800200009000005E0CC3 -:104B300000000010084001920000361000000080C4 -:104B4000020000900000361000000080020000907B -:104B50000000810900000010084000920000810957 -:104B60000000001008800092000081090000001081 -:104B700008C00092000081090000001008000192A6 -:104B80000000860900000010084001920000810921 -:104B90000000001008800192000081090000001050 -:104BA00008C0019200003610000000800200009052 -:104BB0000000361000000080020000900000361057 -:104BC00000000080020000900000490B000000106F -:104BD000088000920000490B0000001008C00092FD -:104BE0000000490B00000010080001920000CF09EE -:104BF0000000001008400192000036100000008004 -:104C0000020000900000490B0000001008C0019253 -:104C100000003610000000800200009000003610F6 -:104C200000000080020000900000361000000080AC -:104C3000020000900000361000000080020000908A -:104C400000003610000000800200009000003610C6 -:104C500000000080020000900000680C00000010BE -:104C60000840019200003610000000800200009011 -:104C70000000361000000080020000900000361096 -:104C8000000000800200009000003610000000804C -:104C9000020000900000D80C0000001008400192B3 -:104CA0000000DB0C000000100840019200004C0CDA -:104CB00000000010084001920000DB0C0000001012 -:104CC0000840019200008C0700000010084001928B -:104CD0000000361000000080020000900000DB0C95 -:104CE000000000100840019200008D070000001035 -:104CF00008000292000036100000008002000090C0 -:104D00000000361000000080020000900000DC0C63 -:104D1000000000100840019200004C0C0000001040 -:104D2000084001920000DC0C0000001008400192D5 -:104D300000008C07000000100840019200003610AF -:104D400000000080020000900000DC0C0000001059 -:104D50000840019200003610000000800200009020 -:104D600000003610000000800200009000003610A5 -:104D700000000080020000900000E10C0000001024 -:104D8000088000920000E10C0000001008C00092B2 -:104D90000000E10C00000010080001920000CF09A3 -:104DA0000000001008400192000036100000008052 -:104DB000020000900000E10C0000001008C0019209 -:104DC0000000361000000080020000900000361045 -:104DD00000000080020000900000361000000080FB -:104DE00002000090000036100000008002000090D9 -:104DF0000000361000000080020000900000361015 -:104E000000000080020000900000361000000080CA -:104E10000200009000006A090000001008400092A3 -:104E200000003610000000800200009000003610E4 -:104E3000000000800200009000003610000000809A -:104E40000200009000003610000000800200009078 -:104E50000000F10C00000010088000920000F10C2E -:104E60000000001008C000920000F10C00000010CB -:104E7000080001920000CF090000001008400192D4 -:104E80000000361000000080020000900000F10CCD -:104E90000000001008C001920000361000000080E1 -:104EA0000200009000003610000000800200009018 -:104EB0000000361000000080020000900000050D88 -:104EC00000000010088000920000050D0000001096 -:104ED00008C000920000050D0000001008000192BB -:104EE0000000CF09000000100840019200003610B9 -:104EF00000000080020000900000050D000000107E -:104F000008C00192000036100000008002000090EE -:104F100000008C070000001008000092000036100E -:104F2000000000800200009000008C0700000010CC -:104F3000088000920000130D0000001008C00092CD -:104F400000008C07000000100800019200008C0790 -:104F500000000010084001920000361000000080A0 -:104F60000200009000003610000000800200009057 -:104F70000000361000000080020000900000361093 -:104F80000000008002000090000036100000008049 -:104F90000200009000008C070000001008800092C2 -:104FA0000000210D000000100880009200008C0716 -:104FB000000000100800019200008C0700000010A3 -:104FC00008400192000036100000008002000090AE -:104FD0000000361000000080020000900000361033 -:104FE00000000080020000900000361000000080E9 -:104FF00002000090000036100000008002000090C7 -:1050000000008C0700000010088000920000210DB5 -:10501000000000100800019200008C070000001042 -:105020000800019200008C07000000100840019267 -:1050300000003610000000800200009000003610D2 -:105040000000008002000090000036100000008088 -:105050000200009000003610000000800200009066 -:1050600000003610000000800200009000003610A2 -:10507000000000800200009000008C07000000107B -:1050800008800092000036100000008002000090AE -:1050900000008C070000001008400192000036104C -:1050A0000000008002000090000036100000008028 -:1050B0000200009000003610000000800200009006 -:1050C0000000361000000080020000900000361042 -:1050D00000000080020000900000FD0C00000010A5 -:1050E000088000920000FD0C0000001008C0009233 -:1050F0000000FD0C00000010080001920000CF0924 -:1051000000000010084001920000361000000080EE -:10511000020000900000FD0C0000001008C0019289 -:1051200000003610000000800200009000003610E1 -:105130000000008002000090000036100000008097 -:105140000200009000003610000000800200009075 -:1051500000003610000000800200009000003610B1 -:1051600000000080020000900000310D00000010DF -:10517000080002920000361000000080020000903B -:105180000000361000000080020000900000361081 -:105190000000008002000090000036100000008037 -:1051A0000200009000003610000000800200009015 -:1051B000000088090000001008C0019200003610AD -:1051C0000000008002000090000036100000008007 -:1051D000020000900000CF0900000010084001927A -:1051E0000000361000000080020000900000C1099D -:1051F0000000001008C0019200003610000000807E -:1052000002000090000036100000008002000090B4 -:1052100000003610000000800200009000008809A5 -:10522000000000100880009200003610000000808E -:105230000200009000003610000000800200009084 -:105240000000CF0900000010084001920000361055 -:1052500000000080020000900000C1090000001062 -:1052600008C001920000361000000080020000908B -:105270000000361000000080020000900000361090 -:10528000000000800200009000006F0B0000001082 -:10529000088000920000361000000080020000909C -:1052A00000006F0B000000100880009200003D0C11 -:1052B000000000100840019200003610000000803D -:1052C0000200009000006F0B0000001008800092A8 -:1052D0000000361000000080020000900000361030 -:1052E00000000080020000900000361000000080E6 -:1052F0000200009000006F0B0000001008000192F7 -:1053000000003610000000800200009000006F0BCB -:10531000000000100800019200003D0C0000001089 -:10532000084001920000361000000080020000904A -:1053300000006F0B00000010080001920000361002 -:105340000000008002000090000036100000008085 -:105350000200009000003610000000800200009063 -:1053600000006F0B000000100800019200003610D2 -:10537000000000800200009000006F0B0000001091 -:105380000800019200003D0C00000010084001924E -:1053900000003610000000800200009000006F0B3B -:1053A000000000100800019200003610000000808C -:1053B0000200009000003610000000800200009003 -:1053C00000003610000000800200009000006F0B0B -:1053D00000000010088000920000361000000080DD -:1053E0000200009000006F0B000000100880009287 -:1053F00000003D0C00000010084001920000361033 -:10540000000000800200009000006F0B0000001000 -:10541000088000920000361000000080020000901A -:1054200000003610000000800200009000003610DE -:105430000000008002000090000036100000008094 -:105440000200009000003610000000800200009072 -:1054500000006F0B0000001008C0019200003D0C1E -:10546000000000100840019200003610000000808B -:105470000200009000006F0B0000001008C00192B5 -:10548000000036100000008002000090000036107E -:105490000000008002000090000036100000008034 -:1054A000020000900000D70B00000010088000925E -:1054B000000036100000008002000090000036104E -:1054C000000000800200009000008C070000001027 -:1054D0000840019200003610000000800200009099 -:1054E0000000D70B0000001008800092000036106A -:1054F00000000080020000900000361000000080D4 -:1055000002000090000036100000008002000090B1 -:105510000000D70B00000010088000920000361039 -:1055200000000080020000900000361000000080A3 -:105530000200009000008C0700000010084001925B -:105540000000361000000080020000900000D70B21 -:105550000000001008C0019200003610000000801A -:105560000200009000003610000000800200009051 -:10557000000036100000008002000090000036108D -:105580000000008002000090000036100000008043 -:105590000200009000003610000000800200009021 -:1055A00000008C0700000010084001920000361037 -:1055B00000000080020000900000DF0B00000010DF -:1055C00008C0019200003610000000800200009028 -:1055D000000036100000008002000090000036102D -:1055E00000000080020000900000361000000080E3 -:1055F00002000090000036100000008002000090C1 -:1056000000003610000000800200009000008C07AF -:1056100000000010084001920000361000000080D9 -:10562000020000900000DF0B0000001008800092D4 -:1056300000003610000000800200009000003610CC -:105640000000008002000090000036100000008082 -:105650000200009000003610000000800200009060 -:10566000000036100000008002000090000036109C -:1056700000000080020000900000C30C0000001039 -:1056800008400192000036100000008002000090E7 -:10569000000036100000008002000090000036106C -:1056A000000000800200009000009407000000103D -:1056B00008400092000036100000008002000090B8 -:1056C000000036100000008002000090000036103C -:1056D00000000080020000900000361000000080F2 -:1056E00002000090000036100000008002000090D0 -:1056F0000000E6070000001008800092000036104D -:1057000000000080020000900000361000000080C1 -:105710000200009000009B080000001008000192A9 -:105720000000361000000080020000900000930787 -:1057300000000010080001920000A5080000001001 -:10574000080001920000A508000000100800019266 -:105750000000A508000000100800019200003610AB -:105760000000008002000090000036100000008061 -:10577000020000900000F507000000100880009271 -:105780000000361000000080020000900000930727 -:105790000000001008000192000036100000008098 -:1057A000020000900000361000000080020000900F -:1057B00000000308000000100880009200009A0812 -:1057C0000000001008800092000093070000001005 -:1057D00008000192000036100000008002000090D6 -:1057E0000000BB0800000010084000920000BB0849 -:1057F00000000010088000920000BB0800000010AC -:1058000008C00092000093070000001008000192F9 -:1058100000003610000000800200009000003610EA -:1058200000000080020000900000E008000000106E -:1058300008C00092000036100000008002000090B6 -:1058400000009307000000100800019200003610CD -:105850000000008002000090000036100000008070 -:10586000020000900000E208000000100800019211 -:105870000000E208000000100800019200009307F9 -:1058800000000010080001920000361000000080A7 -:10589000020000900000361000000080020000901E -:1058A0000000E40800000010088000920000E408F6 -:1058B0000000001008C000920000930700000010D4 -:1058C00008000192000036100000008002000090E5 -:1058D0000000930700000010084000920000B1088B -:1058E00000000010088000920000B10800000010C5 -:1058F00008C0009200009307000000100800019209 -:1059000000009307000000100800009200009307B9 -:1059100000000010084000920000F808000000108D -:10592000088000920000F8080000001008C00092F3 -:1059300000009307000000100800019200003610DC -:10594000000000800200009000003610000000807F -:105950000200009000002C09000000100880009256 -:10596000000093070000001008C000920000930799 -:1059700000000010080001920000361000000080B6 -:10598000020000900000361000000080020000902D -:1059900000000C0900000010088000920000361082 -:1059A000000000800200009000009307000000103B -:1059B00008000192000036100000008002000090F4 -:1059C0000000361000000080020000900000F40784 -:1059D00000000010088000920000361000000080D7 -:1059E00002000090000093070000001008000192E0 -:1059F0000000361000000080020000900000361009 -:105A0000000000800200009000002009000000104B -:105A100008800092000020090000001008C00092D9 -:105A200000009307000000100800019200003610EB -:105A3000000000800200009000003610000000808E -:105A4000020000900000EF080000001008800092A3 -:105A50000000EF080000001008C00092000093074B -:105A600000000010080001920000361000000080C5 -:105A7000020000900000361000000080020000903C -:105A80000000390900000010088000920000390968 -:105A90000000001008C000920000930700000010F2 -:105AA0000800019208003103001801E8762081996E -:105AB00008002F03001801E8762081990000990F53 -:105AC00000000080020000F0080091071D1901E8A5 -:105AD000762081B900003103000000F862812F9523 -:105AE000000031038000008002812FB62A003103BC -:105AF000D001002C82CD2E9208003103001C01E859 -:105B00007620819900000000000000D802000032D9 -:105B100000000000000E01EC06C06E3554000000CD -:105B2000000000000700363200000000000000BC4A -:105B3000A8002D37B44400000008000087CD8B3A40 -:105B4000000000000000007899C02C37B40000006D -:105B500000000078898D973A00003610021000008E -:105B600087BF97BA00000000001800000740FE320F -:105B700000009D0712000040F2C138B40000000090 -:105B80000090007809006E320000361004A000007A -:105B900009806EB20000A20704A5000409806EB25D -:105BA0000000000000000004090090320000A4077B -:105BB00004010004096490BC00000000000000041F -:105BC00009400032080000006E3402E816249039C3 -:105BD0000000A507B71002E0068097B20000A807F2 -:105BE00080000080F280FCB60000A907000000C819 -:105BF000FF80FC940000AA079F990080821BEEBCE6 -:105C000000000000009800E00E006E32000000006E -:105C1000A70000800200003018003600000000F8E5 -:105C2000730A03F9000000000010021C09006E3224 -:105C30004000AF070601008082CD91BC00C0B007D4 -:105C4000001802E00680369200E00000001802E032 -:105C50000680363200000000000000200980033278 -:105C60000000B30780D7018032C06EB6000000008C -:105C7000000000204900923A00000000009801183E -:105C800009006E3200000000000A022409C06E32D2 -:105C90000000000000C0012809806E320000C1072A -:105CA000800E018012C06EB602000000003C02ECC3 -:105CB0000600363200000000000000004901923A60 -:105CC0000000BD0780D6018042C06EB60082000091 -:105CD000001002E0A6CD913200A00000002C02E8E6 -:105CE000060036322800CB07003A02EC0600369256 -:105CF00000000000D301001CD9C1913400820000D3 -:105D0000001002E0A6CD913200A00000002C02E8B5 -:105D1000060036323400CB07003A02EC0600369219 -:105D200004000000003C02EC0600363228000000AF -:105D300000000000890D923A0000C70780D601805C -:105D400042C06EB600860000001002E0A6CD91327F -:105D500004A00000002C02E8060036321400CB0735 -:105D6000003A02EC0600369200000000D301001C4D -:105D7000D9C1913400860000001002E0A6CD913216 -:105D800004A00000002C02E8060036322000CB07F9 -:105D9000003A02EC0600369212000000003802ECD5 -:105DA00086CD913A08000000002802E88624903948 -:105DB00000000000002002E09624143700000000DC -:105DC000004001E0068091320000D107040100800C -:105DD000028092BC0000000000C001E0060000321A -:105DE00000000000003000E006000032000000006B -:105DF00000B000E0060000322000000000000000BB -:105E0000070036320000000000000078A9002D379E -:105E10000045000000080000878D973A0000000050 -:105E20000000007899C02C370001000000000078C5 -:105E3000898D973A000036100210000087BF97BA8C -:105E400000000000001800000740FE320000DA07E2 -:105E500012000048F2C138B40000DE0780D7012CE0 -:105E600009C06EB200000000DAD701EC06C06E3542 -:105E700000000000005A01EC0640ED320000000076 -:105E8000005C01E806808B320000E10780010080A1 -:105E900062C092B600000000000000F882812F343A -:105EA00018003600000000F8730A03F90000000033 -:105EB0000004013808C06E3200000000006201ECEE -:105EC00006808332010093071201002C82CD2EB28E -:105ED0000000E407000000800200009000000000C5 -:105EE000005401FC02C06E3200000000000000D827 -:105EF0000280013200C0EC071801000CA8CD3EB2B0 -:105F00002080000000000008088036322D002F039A -:105F10001201002C82CD2EB20000EA0700000080A2 -:105F200002000090000000000062013808C06E32DC -:105F300000080080000000280900373200604B0F85 -:105F400000000008088036F200009307040601EC08 -:105F500016C06EBC000093078000008072812FB6CF -:105F600000000000000000F872812F343D0093070C -:105F70001201002C82CD2EB20000F207000000803A -:105F8000020000900000F507000000F8B2812F9495 -:105F90000000CF0F00A0001808006EF200002510CE -:105FA0000078016008006EF20000F907120100C8D5 -:105FB000020020B20000FC070000008002000090F8 -:105FC000000006081201005C088020B20000FC07F7 -:105FD0001201006002802CB20000FA07000000806D -:105FE000020000900000FE0704000080024080BC18 -:105FF00000000000000000F81F80FF3A00000008C9 -:1060000080010080A2802FB618003600CA0000F878 -:10601000730A03F9000093078000008072812FB695 -:106020003D0001081200002C82CD2EB20000930723 -:10603000000000F872812F940000FC07120000C8D5 -:10604000020020B20000FA071200005C088020B2B3 -:106050000000361004A0001808006EB20000000016 -:106060000000007879613832000007081218024CED -:10607000E2256EB2080000000010020078E16E39DF -:106080000000000000180020070000320700000098 -:106090000000003878CAE939000036100400003CDE -:1060A000084080B2000036100490006C08006EB208 -:1060B000000000000098004C08006E320000000054 -:1060C000510000D802000032000000004D00000026 -:1060D00067E0833E000000000008000007008032F7 -:1060E000000000000010000007C086320000000021 -:1060F0000018000007C084320000000000000018F3 -:10610000D8A0813C0000680804B000E0D6206EBC36 -:10611000000038080400003CD8E083BC00001E08E2 -:106120008000008092802FB6000019081201000044 -:1061300009C021B218003600000000F8730A03F904 -:106140001D0000000000007809A4173800001D0899 -:1061500004010080128097BC00001808670000F856 -:10616000A2802FB5000019080000000009C021928C -:1061700000000000C90100D802408432000021085C -:106180000400008072802DBC00001F081200004433 -:10619000E2E038B200002C08510000D812802D9A9D -:1061A0000000000000000078F9818334000022081C -:1061B00012000044E2E538B20000260880000080AA -:1061C00082802FB60000550F00A0015008006EF22B -:1061D0000000000000F801E00600853200002808F9 -:1061E000120100E802C021B218003600000000F8D9 -:1061F000730A03F900002B080401008002802DBC03 -:1062000000002708670000F8A2802FB500003610B4 -:10621000120000E802C021B200000000510000D8C6 -:1062200002000032000030082A010000D82080BAA5 -:10623000000030081201000009C021B21800360029 -:10624000000000F8730A03F900000000000000D805 -:106250000240843200000000CAE0006C08006E3288 -:106260000000000000E8004C08006E32000036100C -:1062700004F0001808006EB20000000000000038B2 -:106280001881833500000F0804B00080829B81BC18 -:1062900000000000CA0100F842802F3508A00F0856 -:1062A00012010040A2CD39B2000036080000008083 -:1062B0000200009000004008293402B808806EB245 -:1062C00000003B081201000009C021B2180036008E -:1062D000000000F8730A03F91D00000000000078B8 -:1062E00009A4173800003F0804010080128097BC01 -:1062F00000003A08670000F8A2802FB500003B08B4 -:106300000000000009C0219200000000C90100D86F -:10631000024084320000000000000078F9818334DC -:106320000000410812000044E2E538B200004708CE -:106330002800006CD8E086BA0000540F00A001507D -:1063400008006EF2000047081DF801E0060085B263 -:10635000000047088000008002812FB62A0000005C -:10636000D001002C82CD2E3200004A0804A000E0AB -:10637000068081B200003610049000E006C086B2AC -:1063800000005808009800E006C0849200004F0802 -:1063900080010080A2802FB600004D08120100008D -:1063A00009C021B218003600000000F8730A03F992 -:1063B0001D004F080401008002A417B800004C081B -:1063C000000000F8E2802F940000361004E0006C1A -:1063D00008006EB200000000CAE8004C08006E32EF -:1063E0000000361004F0001808006EB200005508D6 -:1063F00004B00080829B81BC00000000CA0100F84C -:1064000042802F3508A0540812000040A2CD39B2B6 -:106410000000000000A000E00680813200000000C3 -:10642000009800E006C0843200003610049000E0BE -:1064300006C086B200005D082A5D01E806808BB2C6 -:1064400000005B081201000009C021B218003600EC -:10645000000000F8730A03F91D005D0804010080C4 -:1064600002A417B800005A08000000F8E2802F9438 -:1064700010246008370000F8A28D2FB13D005E089F -:106480001200002C82CD2EB200000000000000F8A7 -:1064900072812F3408000000CA1C01E8762081397F -:1064A0000000FA0D0000002CF90100F4000065085E -:1064B00080000080E2802FB6000065081201000015 -:1064C00009C021B218003600000000F8730A03F971 -:1064D000100000000018008067A1733930003203FB -:1064E0001201005CA28D2CB200003610000000806A -:1064F0000200009000006B088000008092802FB6A0 -:1065000018003600000000F8730A03F900000000CC -:10651000C90100D802408432000036102A000078F9 -:10652000F98183B400006C0812000044E2E538B23F -:106530000000DC0E00000030030038F2000071089B -:106540001D000038188183B50000710880000080AC -:1065500002812FB62A000000D001002C82CD2E32FD -:1065600000007408040601EC16C06EBC00000000B8 -:10657000CA0100F842802F3408C07308120000409E -:10658000A2CD39B2000077088000008082802FB64B -:106590000000550F00A0015008006EF2000000003E -:1065A00000F801E0060085320000790812010000C1 -:1065B00009C021B218003600000000F8730A03F980 -:1065C000000095082A3502B808806EB200007C08E9 -:1065D0001201000009C021B218003600000000F8C6 -:1065E000730A03F900000000000000F8A2802F35B4 -:1065F00000008E0804000080026180BC0000870853 -:1066000080B8000009C06EB240008208040000801B -:10661000820D90BC0000820802B00080821B84BC06 -:1066200000008708000000F8B2812F9400000000ED -:1066300000D601EC56C06E3400000000000000607F -:106640001800863A0000000000000080B70178348E -:1066500000000000007801E0060086324000950846 -:1066600004000080820D90BC0000361004A00018C9 -:1066700008006EB20000CF0F00000000D82080FAA2 -:10668000000036100600003C182084BC00003610C4 -:1066900004B0003C88DB83BE0000000000000080E6 -:1066A000F720783A00000000587801E0F620863A9A -:1066B00000000C0800000004F860809A00009108B7 -:1066C00080B9000009C06EB22F0095081201002C9D -:1066D00082CD2EB200008F080000008002000090E2 -:1066E0004000930804010080820D90BC380094089B -:1066F00000000078090036923900000000000078A0 -:1067000009003632000094081200002CE2E52EB297 -:10671000100000000018008067A17339000000001D -:10672000005C01E806808B3210240000000000F8B5 -:10673000A28D2F31300093071201005CA28D2CB284 -:1067400000003610000000800200009000000308E6 -:10675000000000F8C2812F9500000000005401FCE9 -:1067600002C06E3200000000000000D8028001323A -:1067700000C0A1081801000CA8CD3EB22080000086 -:1067800000000008088036322D002F031201002C73 -:1067900082CD2EB200009F08000000800200009011 -:1067A000000000000062013808C06E32000800805E -:1067B000000000280900373200604B0F000000087D -:1067C000088036F20000AF08000000800200009050 -:1067D0000000A70880000080C2812FB60000AA0830 -:1067E00000D001E80600009200000000000000F860 -:1067F000C2812F350000AA0804D1018002806EBC3E -:106800000000000000D601EC26C06E340000AC0889 -:106810008000008092812FB60000AF0800C801E818 -:106820000600009200000000000000F892812F3561 -:106830000000AF0804C9018002806EBC00000000A7 -:1068400000D601EC16C06E34110093071201002C23 -:1068500082CD2EB20000AF08000000800200009040 -:10686000000093079A0100F842812FB50000B80894 -:10687000120100C8020020B200000000005C01EC20 -:106880000640003200009307370000F842812FB421 -:1068900000000000000000F872812F343D009307D3 -:1068A0001201002C82CD2EB20000B608000000803C -:1068B000020000900000C3081201005C088020B2B2 -:1068C0000000B3081201006002802CB200003610F4 -:1068D00000000080020000900000C008120100C803 -:1068E000020020B200009307370000F8D2812FB4D5 -:1068F00000000000000000F872812F343D00930773 -:106900001201002C82CD2EB20000BE0800000080D3 -:10691000020000900000C3081201005C088020B251 -:106920000000BC081201006002802CB2000036108A -:1069300000000080020000900000000000000078CD -:10694000796138320000C4081218024CE2256EB298 -:1069500000000000003402B808806E320000000021 -:1069600000A0015008006E320000000000780160B5 -:1069700008006E320000CA089D11023409006EB290 -:106980000000000000F0018808006E3200006C0F6B -:1069900000A8010809006EF200000000D4F801E030 -:1069A0000600853200000000DA5C01E806808B32C8 -:1069B0000000DC0EDD000030030038F20000D008DB -:1069C0002329020409806EB23E00CF081200002C79 -:1069D00082CD2EB20800D3081D1C01E8762081B9B3 -:1069E0000000D3088000008002812FB62A0000003A -:1069F000D001002C82CD2E320000FA0D0000002CB8 -:106A0000F90100F40000D7089D010080074093B20F -:106A10000000000000300080078088320000000085 -:106A2000003800800700EE320000000000080080FF -:106A300007C085320000000000100080074090323F -:106A40001000000000180080878D853700000000CE -:106A5000002000800700863200000000002800802F -:106A6000070085320000DE081201000009C021B2D3 -:106A700018003600000000F8730A03F930003203F2 -:106A80001201005CA28D2CB20000361000000080C4 -:106A9000020000900000000000CC017809806E32F6 -:106AA00000009307DCD101E806809792130093075A -:106AB0001201002C82CD2EB20000E20800000080FE -:106AC000020000900000BA0D00000018094081F299 -:106AD0000000A30D00A8012009006EF2000093073A -:106AE00080010080F2802FB60000EC08120100C87F -:106AF000020020B2000093078000008072812FB650 -:106B000000000000000000F872812F343D00930760 -:106B10001201002C82CD2EB20000EA080000008095 -:106B2000020000900000C3081201005C088020B23F -:106B30000000E8081201006002802CB2000036104C -:106B4000000000800200009000009307350100F86B -:106B500012812FB500000000000000D80280013231 -:106B600000000000005401FC02C06E3200C0F608B4 -:106B70001801000CA8CD3EB220800000D101000811 -:106B8000088036323B0031031201002C82CD2EB238 -:106B90000000F40800000080020000900000440F94 -:106BA0000098012809006EF20000930700000080A1 -:106BB000020000900000FE0880010080A2812FB634 -:106BC0000000FE088000008042812FB60000FE0811 -:106BD000085B01EC06FB6EBC00000000005A01ECF3 -:106BE000060000320000FE08370000F842812FB492 -:106BF0003D000000D701002C82CD2E320000040998 -:106C00008001008092812FB600000A0908C901E8BE -:106C100006BB6EBC0000000000C801E806000032A0 -:106C2000330001091200002C82CD2EB20000510F5A -:106C300000000028098001F2000093070000008096 -:106C40000200009000000A0980010080C2812FB676 -:106C500000000A0908D101E806BB6EBC0000000074 -:106C600000D001E806000032330007091200002CB2 -:106C700082CD2EB20000510F0000002809C001F2A1 -:106C800000009307000000800200009000009307BE -:106C900080010080F2812FB6180093070000002CBD -:106CA00082CD2E9200000F09120000C8020020B20F -:106CB000000012091201005C088020B200003610AA -:106CC0001200006002802CB200000000000000F8FA -:106CD0001F80FF3A000031031201002C72E02EB237 -:106CE0000000100900000080020000900000000079 -:106CF0000000007879613832000013091218024C44 -:106D0000E2256EB200000000003402B808806E3246 -:106D100000000000D4A0015008006E320000000006 -:106D2000DB79016008006E320000550FDD000004C1 -:106D3000080000F21000000000180080878D8537E1 -:106D40000000000000F801E00600853200001C0988 -:106D50001201000009C021B218003600000000F83E -:106D6000730A03F9300036101200005CA28D2CB2B9 -:106D700000003610040701EC16C06EBC00000000D5 -:106D800000B000E00600003200009307DA5C01E882 -:106D900006808B92000093079F41018052206EBCB9 -:106DA00000002B099F98018052206EBC000000005B -:106DB000000000D80280013200000000005401FCF5 -:106DC00002C06E3200C029091801000CA8CD3EB2E5 -:106DD0002080930731000008088036B200000000D0 -:106DE000000000F812812F343B0093071201002CA1 -:106DF00082CD2EB200002709000000800200009022 -:106E00000000440F0098012809006EF2000093076B -:106E1000000000800200009000009307D54101E0CF -:106E2000064081920000930704B0008002006EBC0F -:106E3000000000000090010008006E3200002510E4 -:106E40000078016008006EF20000930700000080E7 -:106E50000200009000000000000C027809806E32F1 -:106E60000000330904D4018012C06EBC0000000091 -:106E7000000000781980973700000000009001E0C2 -:106E8000E6256E3A0000251000000080020000F0A8 -:106E90000000370900000080020000900000930706 -:106EA000009001E00600809200000000009001E0E8 -:106EB00006008032000003080000008002000090FD -:106EC0000000A30D00A8012009006EF20000E708F1 -:106ED00080000080F2802FB6000093070000008041 -:106EE0000200009000000000000000D80280013283 -:106EF000000000000000007809006E320200410925 -:106F000004B9008082CD6EBC00004309800000807F -:106F10007280FCB600004509000000FC02000092EF -:106F200000004309800000808280FCB60000450913 -:106F3000000000FC0200009200000000000000A819 -:106F400042BD973000000000541889FCF2C07C302C -:106F500000C04B091801000CA8CD3EB20000000093 -:106F6000000E01EC0600003400000000005401ECAB -:106F700006C02F3220800000000000080880363252 -:106F8000000031031201002C82CD2EB2000049090D -:106F90000000008002000090000000000062013844 -:106FA00008C06E3200080080000000280900373257 -:106FB00000004B0F00000008E80100F4000036104C -:106FC000040701EC16C06EBC00000000000000A821 -:106FD000A2002D370A0000000000007809003632B8 -:106FE00000000000001889E007000032000051098D -:106FF00004010078198097BC02005C0904B9008084 -:1070000082CD6EBC00000048D6010078C9CD2C327C -:1070100000005509B6000080020000B000005609CB -:1070200012000064028097B2000057091208006441 -:1070300002006EB2000058091218006402006EB21D -:10704000000059091210006402006EB20000000036 -:10705000A65401EC06C02F3200008C07000E01EC94 -:10706000060000940020004CD6010078C9CD2C32D7 -:1070700000005D09B6000080020000B000005E095B -:1070800012000064028097B200005F0912080064D9 -:1070900002006EB2000060091230006402006EB29D -:1070A000000061091238006402006EB2000062093B -:1070B0001240006402006EB20000630912480064CE -:1070C00002006EB2000064091210006402006EB289 -:1070D000000065091218006402006EB20000660923 -:1070E0001220006402006EB20000670912280064DA -:1070F00002006EB200000000A65401EC06C02F3260 -:1071000003008C07000E01EC060036920000000020 -:10711000000000FC0200013200006D0900000014B4 -:1071200008803D9200000000000000FC02000132D7 -:1071300000007009040000DC53603DB3180000003B -:10714000000000F8738A03396C093600000000C0A3 -:107150000200369200000000005401FC02C06E32B2 -:1071600000000000000000D80280013200C0760953 -:107170001801000CA8CD3EB22080000000000008DD -:107180000880363215002F031201002C82CD2EB25A -:107190000000740900000080020000900000000060 -:1071A000002800000700003200000000003000004E -:1071B00007C02C3200100082003800000700373270 -:1071C000000079091200004802C080B200008C075C -:1071D000CA010008E80100942D007B091200002C70 -:1071E00082CD2EB200007E091D010080020000B099 -:1071F00000008C07000000F862812F95000000005D -:10720000000000F802812F342A008C071201002CA4 -:1072100082CD2EB200007F090000008002000090A5 -:1072200000003F0F0000002C09C085D20000DC0EDA -:1072300000000030030038F200003103230100F8A1 -:1072400022812FB43E0031031201002C82CD2EB2D8 -:1072500000008409000000800200009000003F0F41 -:107260000000002C09C085D200003103000000F8A6 -:1072700022812F9400008D09380100D8028001B2CC -:1072800000008B091E000080020000B000008D0984 -:107290001A010080020000B000008C0F000000689E -:1072A0001F80F6FA00003103000000800200009009 -:1072B0000000910912010060084023B20082000022 -:1072C000000000080880363200008C0F00000064C7 -:1072D0001F40F6FA00003103000000800200009019 -:1072E0000000361012000024080023B200003610FF -:1072F0001200002008C023B200003610120000184F -:10730000088023B200C09C091801000CA8CD3EB231 -:107310000000940912000038028081B2000036108B -:107320001200003C020082B2000036101200003051 -:10733000024082B20000361012000034020086B211 -:1073400020800000000000080880363200008C0F0A -:107350000000005C1FC0F5FA00003103000000804F -:107360000200009000000000450000D8020000323A -:107370000000000000000000074080320000000014 -:1073800000100000074082320000000000180000DA -:10739000070086320000A00912000050F2C138B484 -:1073A0000000640D003001E016206EFA0000A5090F -:1073B0003801002CF8010BB40000A509020D028071 -:1073C000A25B80BC000000000000002CC8C1823419 -:1073D0000000A7098000008042812FB60000940DB4 -:1073E00000000080020000F00000AD0D00A801E0E8 -:1073F00016206EFC0000AC09270100D8028001B203 -:1074000000000000C700002CE8C08234000000002B -:1074100000000008D801003400000000D54001E061 -:10742000060087320800990F001801E8762081F9DC -:107430000000DC0E00000030030038F20000B0094C -:1074400023190000078081B23E00AF091200002C12 -:1074500082CD2EB20000B2091D210000070082B2C9 -:107460000000B409000000F862812F950000B40903 -:107470008000008002812FB62A000000D001002C7D -:1074800082CD2E320000FA0D0000002CF90100F42C -:107490001000B8092C30000017E02CB90000BA0920 -:1074A0008E39000007C082B20000BA09000800004F -:1074B000070087920000BA098E390000B7C182B474 -:1074C0000000000000080000070087320000BC092F -:1074D000120100E802C021B218003600000000F8D6 -:1074E000730A03F90000BA099F010014184081BC17 -:1074F0000000BF090400008002C085BC00003610F7 -:107500001200006802C585B00000BF0912000048E3 -:1075100002C080B200003203CA010008E8818094F2 -:107520000000C3091E000080020000B00000C50971 -:107530001A010080020000B000008C0F00000068FB -:107540001F80F6FA00003103000000800200009066 -:10755000000036109FA801E016206EBC0000640DEC -:1075600000000014080000F20000C909800000803B -:1075700042812FB60000940D00000080020000F050 -:107580000000AD0D00000080020000F000008E073A -:1075900004000080024081BC0000CD09120100E817 -:1075A00002C021B218003600000000F8730A03F987 -:1075B00000008E071201006802C585B00000361079 -:1075C000000000800200009000008C078000008016 -:1075D000F2C185B60000D3091C41028006C085B205 -:1075E000000000000000006802C5853000000000B7 -:1075F000000000701F00F73A00008C07000000F840 -:1076000022812F9400008C0780000080F2C185B693 -:1076100000003F0F0000002C09C085D2000031039C -:10762000D20100941E40E99A0000C40F0020001807 -:1076300008006EF20000DB091F000080020000B0AD -:107640000000D8099E400278094068B20000361058 -:1076500000000080020000900000DF09800100802F -:1076600082812FB600008E072A3101E0060000B2A9 -:1076700018000000CA0000F8730A03398E073600AC -:10768000000000C00200369200008E0780010080DA -:10769000A2802FB618000000CA0000F8730A033950 -:1076A0008E073600000000C0020036920D00E5098A -:1076B00000000058080036920000E509000000585C -:1076C000080000921B00000000000058080036323D -:1076D0000000C40F0020001808006EF20000000037 -:1076E0000030002808006E3200000000545401FCF5 -:1076F00002C06E320000300A380000A4088082B256 -:107700000000300A0428010408006EB200003610A0 -:107710009F500104A85B80BC00000000005001E8FD -:10772000060000320000110A0801007819A082BC8E -:1077300000000000002801E0A660803C0000F00985 -:107740002A010014080000B200000000CA00001462 -:107750001840813A0000A30D00A80120A9206EFA6C -:1077600000000000002001E0A6206E3C00000000A8 -:10777000003000E0060000320000000000A801E038 -:107780000600923200000000000000D802800132A2 -:1077900000C0030A1801000CA8CD3EB20000FA098F -:1077A00004000080024081BC0000000000000014C2 -:1077B0000800003218000000000000F8730A0339C6 -:1077C000F4093600000000C002003692208000005C -:1077D00000000028098036320000F10E000000D8B9 -:1077E000020000D20000FE0904000080028092BC6A -:1077F00018003600000000F8730A03F900000000CA -:10780000000000D80280013200C0030A1801000CF9 -:10781000A8CD3EB218000000000000F8738A0339BA -:10782000FE090000000000C00200363200003600F1 -:10783000000000800200009000000000DE00000850 -:10784000E801003400000000DF00013808C06E329B -:1078500000000000001000000700003200000000DF -:107860000018000007808232000000000030000095 -:1078700007C02C320020008000380000070037329B -:1078800000000000CA3D000C0780833200000000A9 -:10789000000000141840813A00000F0A040201ECB5 -:1078A00016C06EBC00000000C00100141840813AF0 -:1078B00000000000000000F892802F3400C00E0A83 -:1078C00012000040A28D39B20000690A120100487E -:1078D00002C080B200000F0A000000800200009089 -:1078E000000000000000002808809732000000001F -:1078F000000000A408808232000000000010006C2C -:1079000018206E3A000000000018004C08006E328B -:107910000000A30D00A8012019206EFA000000004D -:10792000002001E016206E3C0000000000A801E0ED -:107930000600923200001B0A003801E006408092E7 -:10794000000000000060006C18206E3A000000008B -:107950000068004C08006E3200001D0A9F01000400 -:10796000686080BC0000240A000000181820009CF9 -:1079700000001F0A120100E802C021B21800360000 -:10798000000000F8730A03F900000000CA70001834 -:1079900008006E320000190A02010080626080BC9B -:1079A00000000000CA0100F802802F3500A01B0A69 -:1079B00012010040A28D39B20000220A00000080AE -:1079C000020000900000280A80000080A2802FB6EC -:1079D00000002B0A04000080A2A081BC000000006F -:1079E000CA0100F802802F3500A0270A12000040CB -:1079F000A28D39B200000000000000F8A2802F35EF -:107A000000002B0A120100E802C021B21800360063 -:107A1000000000F8730A03F900000000002801E0EC -:107A20000600003200000000003000E006808232D4 -:107A300000000000002000E00680813200003610C7 -:107A4000041000E006C086B20000320A001800E010 -:107A500006C08492000036100410006C08006EB25C -:107A6000000000000018004C08006E320000E00D1D -:107A7000510000D8020000F20000350A0050013C1D -:107A8000A85B809C00008E07003001E00600009299 -:107A900000003A0A3E510100A81B80BA0000000015 -:107AA000DE0000F8F2812F3400000000005801ECE5 -:107AB00006C0EE3200003A0A80010080328087B6AC -:107AC00000000000000000F8E2802F340000730E78 -:107AD000603001E0060000F200008E070000008028 -:107AE00002000090000000000000001408000032B6 -:107AF0000000430A040201EC16C06EBC0000000046 -:107B0000C90100141840813A00000000C00101388A -:107B100008C06E3200000000DF0000A4A8608A3CAC -:107B200000C0460A12010040A28D39B20000410A8D -:107B3000000000800200009000000000003000E023 -:107B40000600003200000000DF0000A4A8608A3CAC -:107B5000000000000000013808C06E320000000084 -:107B6000DEA8012099226E3A0000490A2F2001E088 -:107B700096226EBC0000A30D00000080020000F001 -:107B800000004D0A1F5001E8060000B200004C0A38 -:107B90000400008002C083BC00004D0A005001E8D0 -:107BA000F660809C0800000000400268129AFE38CF -:107BB0000000510A2AA901E0060092B2180036001E -:107BC000CA0000F8730A03F91D00510A040000807E -:107BD00002A417B800004E0A000000141840819C4F -:107BE0000000DC0E00000030030038F20000540AF0 -:107BF0008001008032802FB63E00530A1200002C14 -:107C000082CD2EB200000000000000D802800132B8 -:107C100000C0650A1801000CA8CD3EB2208000000B -:107C2000C3000028098036320000F10E000000D8A1 -:107C3000020000D200005A0A04000080028092BCB8 -:107C400000000000000000141840813A00005F0AA4 -:107C500004000080024081BC18003600000000F8DB -:107C6000730A03F90000630A04000014184081BC81 -:107C700000005B0A1200000009C021B200005C0A8B -:107C8000000000800200009018003600000000F89C -:107C9000738A03F90000DC0E00000030030038F2A4 -:107CA0000000630A8001008032802FB63E00620A25 -:107CB0001200002C82CD2EB200000000C30000D8BC -:107CC0000280013200C05F0A1800000CA8CD3EB24D -:107CD0000020008000000028090037320000B10FAA -:107CE00000000008E80100F40000670A12000048E4 -:107CF00002C080B200000000000000141840813A69 -:107D000018003600CA0000F8730A03F90000690A77 -:107D100004010014184081BC0000990F000000808D -:107D2000020000F000006F0A8001008092802FB6F0 -:107D30002B00720A1201002C82CD2EB200006D0AB7 -:107D400000000080020000900000720A1D00008008 -:107D5000020000B00000720A8000008002812FB68D -:107D60002A000000D001002C82CD2E3200008C07AA -:107D700004000080028085BC0000AA0F0000008083 -:107D8000020000F000007D050000001C08808592C4 -:107D900000000000CE0100D80280013200C07A0A43 -:107DA0001801000CA8CD3EB22080000000000008A1 -:107DB0000880363200008C0F0000005C1FC0F5FA0E -:107DC000000031030000008002000090000000006D -:107DD000600000D80200003200007F0A3F00003C33 -:107DE000084080B200007F0A80010080E2812FB647 -:107DF00000000000DE0000F8F2812F3400000000D7 -:107E0000005801EC06C0EE32000000004D000000FA -:107E100067E0833E00000000000800000700803299 -:107E2000000000000010000007C0863200000000C3 -:107E30000018000007C084320000BE0A04000028B9 -:107E4000D8A082BC0000000000000018D8A0813C2F -:107E500000009C0A0400003CD8E083BC0000890AB2 -:107E60000400008072802DBC0000870A12000050C0 -:107E700002C038B200009A0A510000D812802D9A30 -:107E80000000890A12000050F2C138B40000950ABF -:107E9000280000D8020000B20000920A8001008091 -:107EA000F2C185B600008F0A1F400284E60100B4CB -:107EB0000000920A1D0100F822812FB40000920AEE -:107EC000000000F862812F950000910A1D010080DA -:107ED000020000B000000000000000F862812F35B1 -:107EE0000000000000400280024068320000940A56 -:107EF000343000E016206EBC0000940D00000080BD -:107F0000020000F00000AE0DDA5B01EC0640EDF27D -:107F100018003600000000F8730A03F90000990AFF -:107F20000400008072802DBC0000950A670000F8F4 -:107F3000A2802FB500003610120000E802C021B266 -:107F400000000000510000D8020000320000E80DDF -:107F500000000000D82080FA0000800A4D000000D8 -:107F600067E0839E00009C0A12000050F2C138B402 -:107F70000000A80A28000080084000B20000A50AFE -:107F800080010080F2C185B60000A20A1F40028471 -:107F9000E60100B40000A50A1D0100F822812FB4FB -:107FA0000000A50A000000F862812F950000A40AD5 -:107FB0001D010080020000B000000000000000F879 -:107FC00062812F35000000000040028002406832CC -:107FD0000000A70A343000E016206EBC0000940DAB -:107FE00000000080020000F00000AE0DDA5B01EC42 -:107FF0000640EDF20000BF0A80000080E2802FB64C -:108000000000AC0A042100E0068081B20000E80D07 -:1080100000000034080000F200000000002000E032 -:10802000068081320000B10A2A1100E0D6E086BA4B -:1080300018003600CA0000F8730A03F91D00B10ADF -:108040000401008002A417B80000AD0A9F0100805F -:10805000180088BC0000361000000080020000906C -:108060000000990F00000080020000F00000DC0E0C -:1080700000000030030038F20800B50A231901E8B7 -:10808000762081B93E00B40A1200002C82CD2EB2B7 -:108090000000B80A1D1800E006C084B20000B80A4B -:1080A0008000008002812FB62A000000D001002C41 -:1080B00082CD2E320000FA0D0000002CF90100F4F0 -:1080C0000000BC0A04000080020088BC0000BC0A5A -:1080D0001201000009C021B218003600000000F8AB -:1080E000730A03F9000032031201006802C585B06B -:1080F0000000361000000080020000900000BE0A60 -:1081000012000050F2C138B400000000C001013874 -:1081100008C06E320000C30A040201EC16C06EBC37 -:1081200000C0C10A12000040A28D39B20000C40A8A -:10813000C90100140800009200000000453000E072 -:10814000060000320000CF0A28000008E80100B451 -:108150000000CC0A80010080F2C185B60000C90A87 -:108160001F400284E60100B40000CC0A1D0100F8A3 -:1081700022812FB40000CC0A000000F862812F9504 -:108180000000CB0A1D010080020000B000000000CA -:10819000000000F862812F350000000000400280DE -:1081A000024068320000CE0A8000008042812FB673 -:1081B0000000940D00000080020000F00000AE0DF1 -:1081C000DA5B01EC0640EDF200200080DF000028C1 -:1081D000090037320000B10FDE0000D8028001F242 -:1081E0000800990F001801E8762081F90000DC0EE4 -:1081F00000000030030038F20000D50A8001008042 -:1082000032802FB63E00D40A1200002C82CD2EB24E -:108210000000D90A290801E406C02DB20000DE0AD8 -:108220001D000080020000B00000DE0A8000008017 -:1082300002812FB62A00DE0AD001002C82CD2E92B8 -:108240000000DB0A1201000009C021B2180036004C -:10825000000000F8730A03F91D00DD0A0401008024 -:1082600002A417B80000DA0A000000141840819C2C -:108270002B00DD0A1200002C82CD2EB20000FB0D77 -:108280000000002CF90100F40000E10A0401008064 -:10829000024081BC18003600000000F8730A03F9A0 -:1082A0000000E10A1200004802C080B20000320360 -:1082B0001201006802C585B00000E20A00000080DB -:1082C0000200009000000000000000D8028001328F -:1082D00000C0E90A1801000CA8CD3EB220800000C1 -:1082E000000000080880363200008C0F0000005C9F -:1082F0001FC0F5FA0000310300000080020000906A -:1083000000C00000000000F8A28D2F310000000026 -:10831000000000D802000032000000000000000051 -:108320000780813200000000000800000700803252 -:10833000000000000010000007C0863200000000AE -:108340000018000007C084320000EF0A120000503D -:10835000F2C138B40000F50A8000008082802FB698 -:108360000000000000000068A860803C00000000E1 -:108370000000003C084080320000AD0D0000000409 -:10838000088082F20000F60A1201000009C021B242 -:1083900018003600000000F8730A03F91D00F80AFF -:1083A0000400008002A417B80000F50A000000F8DD -:1083B000A2802F9500000000000000006820803A95 -:1083C0000000FC0A0400002868A082BC0000E80D40 -:1083D00000000080020000F00000EB0A000000D85E -:1083E0000200009200000000000000D8028001326C -:1083F0000020008000000028090037320000AD0F87 -:1084000000000008E80100F418003600CA0000F877 -:10841000730A03F90000060B040201EC16C06EBCDF -:1084200000000000C00100F892802F3400C0040B4F -:1084300012010040A28D39B20000020B0000008042 -:10844000020000902B00060B1201002C82CD2EB2F0 -:108450000000040B000000800200009000000000FB -:10846000000000D8028001320000090B12010060F8 -:10847000084023B20082120B00000008A88D8092F1 -:108480000000361012000024080023B2000036104D -:108490001200002008C023B200003610120000189D -:1084A000088023B200C0210B1801000CA8CD3EB2F9 -:1084B00000000C0B12000038028081B20000361060 -:1084C0001200003C020082B20000361012000030A0 -:1084D000024082B20000361012000034020086B260 -:1084E0002080000000000008A88D80320000190BD9 -:1084F00080010080F2C185B60000160B1F40028487 -:10850000E60100B40000190B1D0100F822812FB410 -:108510000000190B000000F862812F950000180B75 -:108520001D010080020000B000000000000000F803 -:1085300062812F3500000000004002800240683256 -:10854000000036101200006802C585B000001C0B48 -:108550003400005C1FC0F5BA0000940D00000080DC -:10856000020000F000001E0B8000008092802FB6F9 -:1085700000008E07003000E00600009200008E0729 -:10858000120100E802C021B218000000000000F84B -:10859000730A03398E073600000000C002003692CD -:1085A00000000000450000D802400032000000003A -:1085B0004100000007808632000000000008000033 -:1085C00007008032000000000010000007408232E7 -:1085D0000000000000180000070086320000260B93 -:1085E00012000050F2C138B4000000000000007812 -:1085F000388087350000000000A001E016206E3AA8 -:10860000000000000000007809C58530000000006F -:1086100000A801E016206E3C08000000D20100789E -:10862000E9E58339180036101F410284E6A197B9A5 -:108630000000300B365101E816E083BC0000300B1F -:108640001D010080020000B000000000000000F8E2 -:1086500062812F350000320B382101E0064080B2E4 -:1086600000000000003001E0064080320000000001 -:10867000000000D8028001320000350B34180000E1 -:10868000078081B20000940D00000080020000F01D -:108690001000990F0030000017E02CF90010008046 -:1086A00000380000070037320000DC0E0000003008 -:1086B000030038F200003A0B8001008032802FB6B0 -:1086C0003E00390B1200002C82CD2EB200003F0B71 -:1086D00029210000070082B200003D0B12010000BA -:1086E00009C021B218003600000000F8730A03F92F -:1086F0001D00420B0401008002A417B800003B0BD0 -:1087000000000014080000920000420B1D3000E041 -:10871000060000B20000420B8000008002812FB6EC -:108720002A000000D001002C82CD2E320000AA0FBA -:108730000000002CF90100F40000FA0D000000F820 -:10874000A2802FF40000470B04000080024081BC8F -:108750000000470B120100E802C021B218003600E9 -:10876000000000F8730A03F9000032031201004808 -:1087700002C080B20000470B0000008002000090A1 -:108780000000500B80010080F2C185B600004D0B47 -:108790001F400284E60100B40000500B1D0100F8E8 -:1087A00022812FB40000500B000000F862812F9549 -:1087B00000004F0B1D010080020000B0000000000F -:1087C000000000F862812F350000000000400280A8 -:1087D000024068320000520B04000080024086BC58 -:1087E0000000D70F0090010809006EF2000007108A -:1087F00000000080020000F00000590B330100D897 -:10880000028001B20000590B80010080B20172B6F3 -:108810000000590B9FF0018082DB87BC0000590BE0 -:108820009FF8018022216EBC0000000000E801E0FA -:108830000600EE320000000000F001E006C08732C2 -:1088400008000000001801E87620813900005F0B65 -:1088500080010080D2802FB600005F0B04B0008042 -:1088600002006EBC00000000CD0000F872812F34C1 -:108870003D005F0B1201002C82CD2EB200005D0B7B -:1088800000000080020000900000690B270901E44D -:1088900006C02DB200C0630B1801000CA8CD3EB27B -:1088A000000036101200006802C585B020808E07D7 -:1088B000000000080880369200000000004001E03F -:1088C0000640883200000000D508000007408832CA -:1088D000000000000030000007C02C320040008083 -:1088E000CA390000070037320000670B1200004849 -:1088F00002C080B20060000000000008088036322C -:1089000000006C0B1D000080020000B000006C0B2A -:108910008000008002812FB62A000000D001002CC8 -:1089200082CD2E320000FB0D0000002CF90100F476 -:10893000000032031201006802C585B00000361045 -:10894000000000800200009000000000545401FC70 -:1089500002C06E3200000000000000D80280013228 -:1089600000C0750B1801000CA8CD3EB2208000009D -:108970000000000808803632000031031201002C8C -:1089800072E02EB20000730B000000800200009025 -:108990000000C40F0020001808006EF2000036101E -:1089A0001F30002808006EB200000000000000A484 -:1089B00008808232000036100410006C08006EB28D -:1089C0000000E00D0018004C08006EF200007C0B67 -:1089D0000050013CA85B809C000036100000008025 -:1089E000020000900000000000500100A81B803A27 -:1089F00000000000510000D802000032000000001A -:108A00004D00000067E0833E000000000008000009 -:108A100007008032000000000010000007C086320E -:108A2000000000000018000007C084320000A60B00 -:108A300004000028D8A082BC00000000000000183C -:108A4000D8A0813C0000940B0400003CD8E083BC1B -:108A50000000880B0400008072802DBC0000860B93 -:108A60001200005002C038B200008E0B510000D836 -:108A700012802D9A0000880B12000050F2C138B409 -:108A800018003600000000F8730A03F900008D0B8F -:108A90000400008072802DBC0000890B670000F884 -:108AA000A2802FB500003610120000E802C021B2EB -:108AB00000000000510000D8020000320000920BBC -:108AC0002A010000D82080BA0000920B1201000099 -:108AD00009C021B218003600000000F8730A03F93B -:108AE00000000000000000D8024084320000F00DB9 -:108AF0000060006C08006EF200007F0B4D0000006B -:108B000067E0839E0000940B12000050F2C138B45D -:108B100018003600000000F8730A03F91D00990BD5 -:108B20000400008002A417B80000950B670000F84D -:108B3000A2802FB5000036101200000009C021B23B -:108B40000800361012400268129AFEB80000DC0ECF -:108B500000000030030038F2000036101F00006CE7 -:108B6000D8E086BA0000E00D510000D8020000F203 -:108B700000009F0B0000003C08408092000036106F -:108B8000000000800200009000007E0B04010080C5 -:108B9000028081BC0000A40B80010080A2802FB65F -:108BA0000000A40B1201000009C021B21800360019 -:108BB000000000F8730A03F900000000000000D86C -:108BC000024084320000F00D0060006C08006EF27C -:108BD00000007F0B4D00000067E0839E0000000056 -:108BE000C001013808C06E3200000000453000E0CE -:108BF000060000320000A80B12000050F2C138B489 -:108C00000000AD0B040201EC16C06EBC00000000B9 -:108C1000C90100141840813A00C0AD0B1201004098 -:108C2000A28D39B20000AB0B000000800200009062 -:108C300000C00000000000F8A28D2F3100000000ED -:108C400000A8012099226E3A0000B10B2F2001E00C -:108C500096226EBC0000A30D00000080020000F010 -:108C60000000B50B0400003CD8E083BC0000B40B4E -:108C70009F3101E096226EBC00000000003001E050 -:108C8000060000320000B90B005001E8F660809C3D -:108C90000800000000400268129AFE380000B80B7D -:108CA0009F3101E096226EBC00000000003001E020 -:108CB0000600003200000000005001E8060000320B -:108CC0000000000000A801E0060092321800360003 -:108CD000000000F8730A03F91D00BD0B04000080BA -:108CE00002A417B80000BA0B000000141840819CC1 -:108CF00000000000000000D8028001320020008047 -:108D000000000028090037320000B10F0000000801 -:108D1000E80100F40000C00B1200004802C080B25D -:108D20000000DC0E00000030030038F20000C40B2D -:108D300023010014184081BA3E00C30B1200002C1E -:108D400082CD2EB218003600CA0000F8730A03F96B -:108D50000000C40B04010014184081BC0000990FEE -:108D600000000080020000F00000CA0B2931010C55 -:108D700009006EB22B008C071201002C82CD2EB29E -:108D80000000C80B000000800200009000009C0D55 -:108D9000000C020009806EF20000D30B000000807E -:108DA000020000900000AA0F00000080020000F006 -:108DB000000000000000001C080090320000D20BF0 -:108DC00004000028098080B20000F10E000000D8E5 -:108DD000020000D20000D20B04000080028092BC8E -:108DE00018003600000000F8730A03F900007D0542 -:108DF000000000080800009200008C071D000080A1 -:108E0000020000B000008C078000008002812FB6B5 -:108E10002A00D50B1200002C82CD2EB200008C0748 -:108E2000000000F802812F940000BA0D0000001825 -:108E3000094081F20000A30D00A8012009006EF294 -:108E4000000000000030010C09006E3200009C0D93 -:108E5000000C020009806EF200008E070000008006 -:108E6000020000900000990F00000080020000F056 -:108E70000000AA0F00000080020000F000007D0545 -:108E80000000001C0800909200000000545401FCF7 -:108E900002C06E3210000000000000A8780B1638E7 -:108EA00008000000000000AC780B1638000000003D -:108EB000000000B0A8002D3700440000000000B002 -:108EC000880D8B3A00000000005001B408806E321B -:108ED0000000ED0B0431019008006EB202000000AA -:108EE000000000C8828D8A3700000000000000C822 -:108EF000C2A22C3A1800EB0B86410278880D78B696 -:108F00000000E60B9F0100A818808ABC9F00E60BBA -:108F1000000000A808003692000000000040020493 -:108F2000B83F78300000FB0B00000004D862809C42 -:108F300002000000000000C8828D8A370000000097 -:108F4000000000C8C2A22C3A1800F20B8641027839 -:108F5000880D78B60000ED0B9F0100A818808ABC30 -:108F60009F00ED0B000000A8080036920000F40BF3 -:108F700028400204B83F78B000000000C801000497 -:108F8000D862803C0000F80B02010090182089BCD8 -:108F900000000000000000B4080000320000ED0BEB -:108FA0009F0100A818808ABC9F00ED0B000000A85C -:108FB000080036920000FB0B04000090182089BACC -:108FC000000036109F000004486280BC000036108C -:108FD000900000B448628BBA0300361004400200CF -:108FE000081EFFB80000030C00000000D822809A81 -:108FF0000000280C04000080A2E28ABC02000000ED -:10900000000000C8828D8A3700000000000000C800 -:10901000C2A22C3A1800260C86400278880D78B639 -:109020000000361004400204B83F78B00300361048 -:1090300004400200081EFFB80000070C1201006087 -:10904000084023B200820000000000080880363289 -:10905000000031031201002C72E02EB20000050C5A -:109060000000008002000090000036101200002472 -:10907000080023B2000036101200002008C023B2FE -:109080000000361012000018088023B20000000013 -:10909000000000D80280013200C0110C1801000C41 -:1090A000A8CD3EB200000B0C12000038028081B245 -:1090B000000036101200003C020082B200003610A0 -:1090C00012000030024082B200003610120000345C -:1090D000020086B22080050C00000008088036924D -:1090E00000000000000000D8020000320000000074 -:1090F00000380200B81B803A00000000643001E034 -:1091000016206E3A00000000000000000740803288 -:10911000000000000008000007008032000000008E -:10912000001000000740823200000000001800001C -:10913000070086320000180C12000050F2C138B44B -:1091400000000000000000D8028001320000000092 -:10915000001800000780813200000000002000009D -:1091600007008232100000000030000017E02C39A8 -:109170000000000000380000F7010B340000200C54 -:1091800080010080328087B60000000000380000B7 -:10919000B70170340000000000000008E80100344E -:1091A00000002F0C020C0280A21B89BC18003600A4 -:1091B000000000F8730A03F90000DC0E0000003024 -:1091C000030038F20000240C1200004802C080B2F4 -:1091D00018003600000000F8730A03F90000FD0BC8 -:1091E0009F0100A818808ABC9F00FD0B000000A80A -:1091F0000800369200002A0C8001008032802FB6D1 -:109200003E00290C1200002C82CD2EB200002C0C46 -:109210001D010080020000B000008C07000000F873 -:1092200062812F9500008C078000008002812FB69C -:109230002A002D0C1200002C82CD2EB200008C07CB -:10924000000000F802812F940000000000380000A8 -:10925000C70170340000DC0E00000030030038F25B -:109260000800330C231901E8762081B93E00320C46 -:109270001200002C82CD2EB20000350C1D010080A2 -:10928000020000B00000380C000000F862812F9549 -:109290000000380C8000008002812FB62A00360CB6 -:1092A0001200002C82CD2EB200000000000000F859 -:1092B00002812F340000FA0D0000002CF90100F4A7 -:1092C00000003B0C120100E802C021B21800360079 -:1092D000000000F8730A03F900003B0C120000487C -:1092E00002C080B200003203000000F8A2802F9478 -:1092F00000000000000000D80280013200000000E1 -:109300000030002808006E3200000000545401FCB8 -:1093100002C06E3200C0490C1801000CA8CD3EB24C -:109320002080000000000028098036320000F10E85 -:10933000000000D8020000D20000460C04000080AB -:10934000028092BC18000000000000F8730A033984 -:10935000470C3600000000C00200369218003600AC -:10936000000000F8738A03F900000000000000D834 -:109370000280013200C0460C1800000CA8CD3EB29D -:109380000020008400000028090037320000AD0FE3 -:1093900000000008E80100F400008C0700000080D5 -:1093A0000200009000000000000000D8028001329E -:1093B00000000000545401FC02C06E3200C0520C88 -:1093C0001801000CA8CD3EB220800000000000086B -:1093D0000880363200002F031201002C72E02EB2FA -:1093E0000000500C00000080020000900000510FAF -:1093F00000000028090002F200005A0C0000005C86 -:109400000800009200000000000000D80280013235 -:1094100000000000545401FC02C06E3200C05A0C1F -:109420001801000CA8CD3EB220800000000000080A -:109430000880363200008C0F0000005C1FC0F5FA77 -:1094400000003103000000800200009000000000D6 -:109450000030002808006E32002000840000002840 -:10946000090037320000AD0F00000008E80100F4E9 -:1094700000005F0C0000008002000090000000006F -:1094800000000008080000320000650C04000080A5 -:1094900002C085B20000650C80000080F2C185B674 -:1094A0000000640C1C41028006C085B20000000070 -:1094B0000000006802C58530000000000000007058 -:1094C0001F00F73A00000000000000F822812F344E -:1094D0000000DC0C80010080A2802FB61800000084 -:1094E000000000F8730A0339DC0C3600CA0000C023 -:1094F000020036920000AD0C8001008082812FB600 -:109500000000B20C1F20010809006EB20000AD0C73 -:1095100004300108899B90BC0000710C043101806B -:1095200002006EBC0000E00D00000080020000F0B0 -:1095300000006F0C0050014808806E920000361049 -:109540000000008002000090000000000000000405 -:109550002861803C0000810C000000002821809AD6 -:109560000000E00D0030014808006EF20000740CAD -:1095700000500104A85B809C0000361000000080B1 -:10958000020000900000000000500100A81B803A7B -:1095900000007E0C0700004818A084BC08000000F2 -:1095A00000400200189AFE38000000000000006829 -:1095B000020080320000E00D00000080020000F098 -:1095C00000007B0C000000800200009000003610BC -:1095D000000000800200009000007E0C07000048A0 -:1095E00018A084BC0800000000400200189AFE3851 -:1095F0000000780C00000068020080920000810CDE -:109600000400004818A084BA000036109F0000042F -:10961000286180BC00000000000000002821803A82 -:1096200000000000005401FC02C06E3200008A0CF1 -:1096300012010060084023B200820000D601000839 -:10964000088036320300361004400200381AFFB892 -:109650000300000000000078096080391800000055 -:10966000D241028CE6A1973900000000005001E8C9 -:1096700006808432290031031201002C82CD2EB2E3 -:109680000000880C000000800200009000003610EE -:1096900012000024080023B200003610120000203F -:1096A00008C023B20000361012000018088023B250 -:1096B00000000000000000D80280013200C0950CBC -:1096C0001801000CA8CD3EB220800000D601000891 -:1096D0000880363200008F0C12000038028081B200 -:1096E000000036101200003C020082B2000036106A -:1096F00012000030024082B20000840C12010034DB -:10970000020086B2000036100000008002000090C7 -:10971000080000000040025C189AFE3800000000BB -:10972000000000480800003200000000000000D8DF -:1097300002000032000000000000000007408032FC -:109740000000000000080000070080320000000058 -:1097500000100000074082320000000000180000E6 -:109760000700863200009C0C12000050F2C138B491 -:1097700000000000D60100D8028001320000000085 -:109780000018000007808132000000000020000067 -:1097900007008232100000000030000017E02C3972 -:1097A0000000A40C80000080328087B6001000808A -:1097B00000380000070037320000A50C00000080D0 -:1097C00002000090001000880038000007003732C7 -:1097D00018003600000000F8730A03F900000000CA -:1097E0000000006802C08532000000000000000890 -:1097F000E80100340000A80C1200004802C080B24A -:1098000018003600000000F8730A03F90000E00DAC -:1098100000000080020000F00000810C00000080C9 -:10982000020000900000B20C0000008002000090D6 -:109830000000E00D00000080020000F00000B00C0D -:1098400000380200B81B809C0000B20C00000080B1 -:1098500002000090050000000000006802A0FE3831 -:109860000000AD0C00400280024068920000000041 -:10987000CA0100D8020000320000B50C04B8018013 -:1098800002006EBC0000000000B801E0861BEE3C48 -:109890004C0000000000000007003632000000000D -:1098A00000000078A9002D37B44400000008000033 -:1098B000878D973A000000000000007899C02C378F -:1098C000B400000000000078898D973A000036103F -:1098D0000210000087BF97BA0000000000180000C7 -:1098E0000740FE320000BC0C12000048F2C138B440 -:1098F0000000BD0CB6000080020000B00020BE0CCD -:1099000012000064A2CD2CB200000000A60000806E -:10991000020000300000C20C80010080A2802FB63F -:1099200018003600CA0000F8730A03F900008C071B -:10993000005401FC02C06E9200000000005401FCC3 -:1099400002C06E320000C80C12010060084023B251 -:109950000082000000000008088036322900310330 -:109960001201002C82CD2EB20000C60C0000008037 -:10997000020000900000361012000024080023B2FC -:10998000000036101200002008C023B2000036107C -:1099900012000018088023B200000000000000D868 -:1099A0000280013200C0D30C1801000CA8CD3EB2D9 -:1099B0002080000000000008088036320000CD0C36 -:1099C00012000038028081B2000036101200003C04 -:1099D000020082B20000361012000030024082B253 -:1099E0000000C60C12010034020086B200003610DE -:1099F00000000080020000900000E00D0000004820 -:109A0000080000F20800D60C0040025C189AFE988C -:109A100000003610000000800200009000000000EE -:109A200000500100A81B803A0000970C000000487D -:109A30000800009200000000005401FC02C06E32D9 -:109A40000000510F00000028098002F20000BD0C48 -:109A500000000080020000900000510F000000286C -:109A6000090002F20000DF0C9A0100F862812FB4B5 -:109A700010240000000000F8A28D2F31000000002B -:109A800000D601EC06C06E342E008C071201002CAB -:109A900082CD2EB20000DF0C00000080020000909A -:109AA0000000E80C80010080F2C185B60000E50CE2 -:109AB0001F400284E60100B40000E80C1D0100F81C -:109AC00022812FB40000E80C000000F862812F957D -:109AD0000000E70C1D010080020000B00000000043 -:109AE000000000F862812F35000000000040028075 -:109AF000024068320000EA0C04980164881B87BCAD -:109B00000000D70F0090010809006EF20000071056 -:109B100000000080020000F0000036101200006813 -:109B200002C585B000000000000000F8D2802F358B -:109B300000008E07370000F8D2812FB4000000002B -:109B4000000000F872812F343D008E071201002CB6 -:109B500082CD2EB20000EF0C0000008002000090C9 -:109B60000000F80C80010080F2C185B60000F50C01 -:109B70001F400284E60100B40000F80C1D0100F84B -:109B800022812FB40000F80C000000F862812F95AC -:109B90000000F70C1D010080020000B00000000072 -:109BA000000000F862812F350000000000400280B4 -:109BB000024068320000000000D401EC16C06E3A8A -:109BC000000036101200006802C585B000008E0744 -:109BD00004B0008002006EBC37008E071201002C1A -:109BE00082CD2EB20000FB0C00000080020000902D -:109BF0000000040D80010080F2C185B60000010D57 -:109C00001F400284E60100B40000040D1D0100F8AD -:109C100022812FB40000040D000000F862812F950E -:109C20000000030D1D010080020000B000000000D4 -:109C3000000000F862812F35000000000040028023 -:109C4000024068320000100D000000800200009009 -:109C500000000C0D80010080F2C185B60000090DE6 -:109C60001F400284E60100B400000C0D1D0100F845 -:109C700022812FB400000C0D000000F862812F95A6 -:109C800000000B0D1D010080020000B0000000006C -:109C9000000000F862812F350000000000400280C3 -:109CA000024068320000100D370000F8D2812FB456 -:109CB00000000000000000F872812F343D00100DFC -:109CC0001201002C82CD2EB200000E0D000000808B -:109CD000020000900000000000D401EC06000032F9 -:109CE00000008E071201006802C585B00000361022 -:109CF000000000800200009000008C0780010080BE -:109D0000F2812FB600008C0780000080E2812FB620 -:109D100000008C07085901EC06FB6EBC0000000037 -:109D2000000000D80280013200000000545401FC01 -:109D300002C06E3200C01D0D1801000CA8CD3EB24D -:109D400000000000005801EC06FB6E3A2080000085 -:109D5000000000080880363200002F031201002C9A -:109D600072E02EB200001B0D000000800200009087 -:109D70000000AA0F000000F8E2812FF40000200D7F -:109D80000603018012C06EBC19007D050000001C96 -:109D9000080036921A007D050000001C080036926B -:109DA00000C00000000000F8A28D2F31000000006C -:109DB000000000D802800132002000C0000000280E -:109DC00009003732000000000030002808006E3221 -:109DD00000000000453000E0060000320000AD0F3A -:109DE00000000008E80100F400002C0D040201EC62 -:109DF00016C06EBC00000000C90100141840813A72 -:109E000000000000000000F802802F3400C02C0D7C -:109E100012010040A28D39B200002A0D000000801E -:109E20000200009018003600CA0000F8730A03F917 -:109E300000002C0D9F010014184081BC00008E070B -:109E40008001008092802FB62B008E071201002C1B -:109E500082CD2EB200002F0D000000800200009085 -:109E6000000036101F0100D8028001B2000000007F -:109E7000005401FC02C06E3200C03C0D1801000C01 -:109E8000A8CD3EB2208000000000002809803632B4 -:109E90000000F10E000000D8020000D20000390DD1 -:109EA00004000080028092BC18000000000000F84E -:109EB000730A03393A0D3600000000C002003692E2 -:109EC00018003600000000F8738A03F90000000053 -:109ED000000000D80280013200C0390D1800000CCB -:109EE000A8CD3EB20000AA0F000000D8024000F248 -:109EF00000F0430D1D400200A80D68B100003610AF -:109F00001E400284060000B20000410D120000282D -:109F1000020580B008003D0D000000F823400199C3 -:109F200000003D0D12010068020580B000003610EF -:109F300000000080020000900000430DB50000808A -:109F4000020000B000000000A50080A0360B6A35BA -:109F5000000000000000005009C02932000000008D -:109F60000056012808C06E32000000000000007892 -:109F7000390B2E320000000000000020F3819734DE -:109F800000004C0D04000078D90130B6000000003C -:109F900000000000B905303018000000000000F893 -:109FA00003A403390000000000000034330B2F32FB -:109FB0000000590D04000078D90130B600000000FF -:109FC00000000078B90530300000520D0400008018 -:109FD00042E529BC00000000000000F80200003249 -:109FE00018000000000000F8738A02390000000029 -:109FF0000000009C028097320000580D25010008E7 -:10A00000080000B20000560D12000028020580B0C2 -:10A010000800580D000000F8234001990000580D79 -:10A0200012010068020580B00000361000000080B8 -:10A030000200009000004C0D000000F402000092AD -:10A0400000005D0D0400008042E529BC0000000016 -:10A05000000000F80200003218000000000000F8C4 -:10A06000738A0239000000000000009C0200953253 -:10A0700000000000CA0100D8028001320000000088 -:10A080000030000007C02C32001000A00038000093 -:10A090000700373200000000002000000700EE3209 -:10A0A000000000000038000C078082320000620DC2 -:10A0B0001200004802C080B2000032030000000815 -:10A0C000E801009400007A0D02000080A24280BCEA -:10A0D00000007A0D80000080F2C185B600007A0D84 -:10A0E0001F400208B9BF68B000006C0D80410280BB -:10A0F000E28168B608000000000000107961803934 -:10A1000000000000D22101E016206E3A1800000085 -:10A1100000400288E6219139000000000001005C47 -:10A1200008000072000000000000000C19A0903A26 -:10A1300000007A0D06010080D2FF90BC0000700D77 -:10A140002C410278F98168B400000000000000781A -:10A15000B98197340300000000400200291AFF383B -:10A160000000000000380200B91B903A0000000017 -:10A17000D241028816A0973A00000000450000D89E -:10A1800002400032000036109F2001E016206EBA17 -:10A1900000000000000000000740803200000000C6 -:10A1A000000800002724903A000000000010000082 -:10A1B00007008A320000000012010058F2C1387412 -:10A1C0000000780D00000080020000900800840D5F -:10A1D0001A000034796180B900008F0D1E010080E3 -:10A1E000020000B000008F0D1F400200094068B25D -:10A1F00000007C0D80000080E20190B60000361067 -:10A20000380000541F40F5BA0000000000000008AC -:10A21000B93F903000000000002801E026246E3A8B -:10A22000080036101E00000009A4FEB800008F0DC3 -:10A2300012010068020590B0000036100000008096 -:10A240000200009000008F0D8000008082812FB6F8 -:10A2500000008D0D1F410200094068B2000000009F -:10A26000002801E016206E3A00008A0D800100806F -:10A27000F2C185B60000000000400284E60100340F -:10A28000000000000000008002000030000000001C -:10A29000004002800240683200003610380000544E -:10A2A0001F40F5BA00000000002101E016206E7A80 -:10A2B0000000850D80000080E20190B600007E0D58 -:10A2C000000000541F40F59A000000000000005CF0 -:10A2D0000800003200000000D22101E016206E3A92 -:10A2E000180000001E410284E661937900003610D8 -:10A2F00000000080020000900000FFFF00000080CE -:10A30000020000900000970D1D5D01EC16C06EBCB0 -:10A31000000000000F01008002000070000000003B -:10A32000000100F8B2802F74000000000F010080CF -:10A33000020000700000960D045E01EC16C06EBCB9 -:10A3400000000000005C01EC06400032000000004C -:10A3500000010080020000700000FFFF000000808C -:10A3600002000090000000000420018082DB907C4D -:10A3700000000000020C0280A2DB907C0000A00D17 -:10A3800006210180821B90BC2700A10D0000000067 -:10A390000900369228000000000000000900363253 -:10A3A000000000000000008812002C3A0000FFFFAF -:10A3B0000000008002000090000000002FA0017843 -:10A3C000891B927A0000000006880178899B977C9F -:10A3D000000000000034020409C06E3D00000000CF -:10A3E000000C020019A46E370000AB0D02000080C3 -:10A3F00002A497BC0000AB0D02000080020000B078 -:10A400000100000000000078898D973700000000EF -:10A4100002010280829B977C00000000000100F88E -:10A42000F2802F740000FFFF000000800200009007 -:10A4300000000000DA5B01EC0640ED320000B10DD7 -:10A4400004010080024086BC0000000000A001E082 -:10A4500016206E3A0000B30D00D401EC0600009205 -:10A460000000D70F0090010809006EF20000000004 -:10A4700000A001E016206E3A00000710330100F83A -:10A4800082802FB4000007109FF0018082DB87BC20 -:10A49000000007109FF8018022216EBC0000000020 -:10A4A00000E801E00600EE320000000000F001E0EC -:10A4B00006C08732000007100000008002000090F4 -:10A4C0000000FFFF00000080020000900000C50DAA -:10A4D0000421013069246EBC0000BF0D1F4002241E -:10A4E000094068B20000BB0D80000080E24192B6D6 -:10A4F0000800BB0D1201006892A4FEB800003610DF -:10A5000000000080020000900000000000A801E0B0 -:10A5100066246E3A0000C20D382001E0060093B2B6 -:10A520000000C30D002801E00600009200000000BA -:10A53000003001E00600003200000000005001E899 -:10A5400006000032000000000001008002000070E0 -:10A550000000CA0D38510100A99B91BA0000C80D36 -:10A5600004410208B9FF68B00000C60D0040028037 -:10A57000024068920000D50D9F3101E066246EBC58 -:10A580000000D50D003001E0060000920000D30D60 -:10A590000428010409006EB20000D10D9F010000E3 -:10A5A000192490BC0000000000A801E066246E3A67 -:10A5B00000000000002801E00624003C000000002C -:10A5C000005001E806000032000036109F2001E034 -:10A5D000060093B20000000000010080020000703D -:10A5E00000000000002801E0060000320000DB0D42 -:10A5F00004000080020090BC0000D50D0441020858 -:10A60000B9FF68B00000D30D00400280024068929C -:10A610000000D90D02000080222490BC0000DB0D58 -:10A6200080400280F2C168B6000000000040028C49 -:10A63000B6C168350000DB0D000000F822812F94C0 -:10A640000800361012400268129AFEB80000D30DBE -:10A6500004010000292490BC0000000000A801E0D3 -:10A6600066246E3A00000000005001E806009032B7 -:10A67000000036109F2001E0060093B200000000A9 -:10A6800000010080020000700000FFFF0000008059 -:10A69000020000901800E20D1F41027888CD68B6D4 -:10A6A000000000000000008812002C3A0000E40DB9 -:10A6B00080010080628087B60000E00D00400280CB -:10A6C000024068920300361004400200381AFFB8B6 -:10A6D000000036101F400204B8FF68B00000000000 -:10A6E00000390200B81B807A0000FFFF00000080E4 -:10A6F000020000900000EF0D80010080A2802FB6C4 -:10A700000000EC0D1201000009C021B21800360053 -:10A71000000000F8730A03F900000000000000D8F0 -:10A72000024084321D00EF0D0401008002A417B81E -:10A730000000E90D9F010080180088BC0000361061 -:10A740000000008002000090000000000060006C2B -:10A7500008006E3200000000CA68004C08006E322B -:10A76000000036100470001808006EB200000000EF -:10A7700004000080A2A0817C0000F60D8001008012 -:10A78000E2802FB60000F60D1B000080020000B032 -:10A79000000000000600008062E0837C00000000F2 -:10A7A000CA0100F802802F3500A00000120100400D -:10A7B000A28D39720000F70D0000008002000090A9 -:10A7C0000000FFFF00000080020000900000000079 -:10A7D000000801E406C02D32EEFF0000001001E089 -:10A7E000868D2F31000000000000001CB3E43932D8 -:10A7F0000000000E04000078D90130B6000000000F -:10A8000000000078B905303018000000000000F8A2 -:10A81000E3A503390000000000000034330B2F32A1 -:10A820000000000004000078D9013076000000002C -:10A8300000000078B905303018000000000100F871 -:10A84000E3A503790000FFFF0000008002000090F4 -:10A8500000000000000000CC020000320000080EE2 -:10A860002000012C09C06EB20000090E001686CC33 -:10A8700006C0929200000000001486CC06C09232FE -:10A880000000000012010040628E92520000090E8A -:10A8900000000080020000900000FFFF0000008028 -:10A8A0000200009000000E0E04000078D90130B6BE -:10A8B0000E0E3600000000C00200369200000000BC -:10A8C000000000140300383200000000000000E027 -:10A8D0000200303200004E0E04000024D80130B6D1 -:10A8E000120E000000000088824D823A00003610EF -:10A8F0000000008002000090000036100000008080 -:10A90000020000900000361000000080020000905D -:10A910000000361000000080020000900E0E36008D -:10A92000000000C0020036920000380E00000080D7 -:10A930000200009000001A0E000000204805309030 -:10A940000000361000000080020000900000260E7B -:10A95000921101BC08006EB200000000000801DC8A -:10A9600002406E3200001E0E1F1101E026C18BB5A1 -:10A970000000260E1D000080020000B00000000054 -:10A98000000000D802000032800200000000000039 -:10A99000070036320000000000000078A9002D37C3 -:10A9A0002045000000080000878D973A0A0000004B -:10A9B00000000078890D82370000000000100000C0 -:10A9C000A7BA973A000000000018000007C0EA325A -:10A9D0000000250E1200004802C038B200002A0E06 -:10A9E000800E01BC08C06EB2000000000000000034 -:10A9F000190E823200E0320E12010048A20D90B210 -:10AA00000000280E000000800200009000000000FE -:10AA1000000000D802400032B40000000000000036 -:10AA2000070036320000000000000078A9002D3732 -:10AA30000044000000080000878D973A00000000E5 -:10AA400000000078990082370000361002100000E4 -:10AA500087BF97BA00000000001800000740FE32D0 -:10AA60000000310E12000048F2C138B41800360060 -:10AA7000000000F8730A03F9000000000000000461 -:10AA8000896038320000000000000018F341903463 -:10AA90000000380E04000078D90130B60000000034 -:10AAA00000000000B905303018000000000000F878 -:10AAB00003A40339000000000000000019CE2C326E -:10AAC0000060390E12000040A20D90B2000000009C -:10AAD000000000D80200003260000000000000000A -:10AAE0000700363200000000000000BCA8002D372F -:10AAF000A04700000008000087CD8B3A0A00000044 -:10AB00000000007889CD2C3780020000000000781A -:10AB1000898D973A0000000000100000A7BA973A0C -:10AB2000000000000018000007C0EA320000420EDA -:10AB300012000040F2C138B418003600000000F8DE -:10AB4000730A03F900000000000801DC02406E32C5 -:10AB50000A00470E1F01007889CD2CB700000000C5 -:10AB60001D1001F802006E7280020000000000005B -:10AB700007003632204500000008000087CD8B3AE0 -:10AB80000000000000100000A7BA973A0000000083 -:10AB90000018000007C0EA3200004B0E120000400F -:10ABA000F2C138B418003600000000F8730A03F947 -:10ABB00000000000001101F802006E7200000000A9 -:10ABC000001001F802006E3200000000000901DCF4 -:10ABD00002406E720000FFFF000000800200009043 -:10ABE0000000000000000000090000320E0000001C -:10ABF00000000004894D0D36000000000000000038 -:10AC000007800B32000000000008000007009032AF -:10AC10000000000000100000070036320000560E51 -:10AC20001200004CF2C138B40000000000000080A7 -:10AC3000020000300000570E1200008002C021B256 -:10AC40000000000000000000E902903A0000530EEE -:10AC500004010004194090BC0000000000010080C5 -:10AC6000020000500000FFFF000000800200009082 -:10AC70000000650E80010080A2802FB60000600EEB -:10AC8000120100E802C021B218003600000000F8EE -:10AC9000730A03F90000640E0400008002802DBCDA -:10ACA000000036109F000080180088BC0000600E75 -:10ACB000120100E802C021B200005F0E0000008017 -:10ACC0000200009000000000CA0000D80240843258 -:10ACD000000000000040006C881C833A0000000067 -:10ACE0000048004C0800723200003610085000186E -:10ACF000C82072BC00000000040000800240817C7B -:10AD000000000000000000141840813C00003610D4 -:10AD100002000020880182BA00000000000000D874 -:10AD200002000032000000000000000007000632B0 -:10AD30000700000000080000774A09390000000001 -:10AD4000001000000700823200000000CA19000055 -:10AD5000074082320000700E12000040F2C138B489 -:10AD600000000000000100D8024084720000FFFFD4 -:10AD70000000008002000090000000004D00000074 -:10AD800067E0833E000000000008000007008032FA -:10AD9000000000000010000007C086320000000024 -:10ADA0000018000007C084320000B70E040000281D -:10ADB000D8A082BC0000000000000018D8A0813C90 -:10ADC0000000890E0400003CD8E083BC00007D0E2A -:10ADD0000400008072802DBC00007B0E1200005029 -:10ADE00002C038B20000830E510000D812802D9AA4 -:10ADF00000007D0E12000050F2C138B41800360079 -:10AE0000000000F8730A03F90000820E04000080BD -:10AE100072802DBC00007E0E670000F8A2802FB566 -:10AE200000003610120000E802C021B2000000004D -:10AE3000510000D8020000320000870E2A010000F5 -:10AE4000D82080BA0000870E1201000009C021B28C -:10AE500018003600000000F8730A03F90000000033 -:10AE6000000000D8024084320000F00D0060006C49 -:10AE700008006EF20000740E4D00000067E0839E33 -:10AE80000000890E12000050F2C138B418003600DC -:10AE9000000000F8730A03F91D008E0E0400008004 -:10AEA00002A417B800008A0E670000F8A2802FB530 -:10AEB000000036101200000009C021B20800361050 -:10AEC00012400268129AFEB80000DC0E000000304A -:10AED000030038F200009F0E1F00006CD8E086BA15 -:10AEE0000000E00D510000D8020000F20000940EB6 -:10AEF0000000003C0840809200009F0E000000808F -:10AF0000020000900000980E80010080F2812FB6B0 -:10AF10000000980E80000080E2802FB60000980E9E -:10AF200080010080328087B600000000000000F839 -:10AF3000E2802F340000730E04010080028081BC87 -:10AF400000009D0E80010080A2802FB600009D0EA3 -:10AF50001201000009C021B218003600000000F8FC -:10AF6000730A03F900000000000000D80240843298 -:10AF70000000F00D0060006C08006EF20000740E1E -:10AF80004D00000067E0839E0000A30E800100805A -:10AF9000E2802FB60000BA0E80010080A2802FB69A -:10AFA00018000000CA0000F8730A0339BA0E360010 -:10AFB000000000C00200369200000000000000A463 -:10AFC000A8608A3C0000A60E2FA8012099226EBA24 -:10AFD0000000A30D00000080020000F0000000004F -:10AFE00000A801E00600923200000000005001E8D5 -:10AFF000060000320000AA0E232101E0060000B284 -:10B000003E00A90E1200002C82CD2EB20000361098 -:10B01000043000E0068082B20000B20E042100E09D -:10B02000068081B20000B00E80010080A2802FB6A1 -:10B030000000B00E1201000009C021B21800360055 -:10B04000000000F8730A03F900000000000000D8B7 -:10B05000024084320000F00D0060006C08006EF2C7 -:10B0600000000000002000E0068081320000361061 -:10B07000041000E006C086B2000000002A1900E0BB -:10B0800006C0847200000000000000F8A2802F3586 -:10B09000000000001201000009C0217218003600F3 -:10B0A000000000F8730A0399000000000000003C53 -:10B0B000D8E0833C0000B80E12000050F2C138B452 -:10B0C00000000000000000F8A2802F340000000003 -:10B0D0000000008812002C3A0000FFFF00000080F2 -:10B0E0000200009000000000000000000900003293 -:10B0F000000000000000007809000032000000009D -:10B10000000000A802000032EE05C20E040100801B -:10B11000820DF6BC0006000000000008090036326F -:10B120000000C40E0000000409C0099200280000BD -:10B130000000000809003632000000000000000492 -:10B14000098009321E000000000060C087CD003772 -:10B1500000000000000860C0078097320030000047 -:10B1600000000078898D2A3A000036101200005C39 -:10B17000528197B400000000000000002924903A9A -:10B180000800000000000078890D903600000000E3 -:10B19000000000041940903C00000000000000A8DE -:10B1A00052822A3A0008C40E02010080828D2ABC15 -:10B1B0000000D50E06000080024090BC0000361052 -:10B1C000120000A8020020B21E000000000000C013 -:10B1D00087CD003700000000000800C007809732CC -:10B1E000000036101200005C52812AB400000000FA -:10B1F000000000002924903A0800000000000078B8 -:10B20000890D90360000CE0E04010004194090BC58 -:10B210000500000000000078890D9036000036100F -:10B2200012000068028097B20000000000000000D9 -:10B230002924903A00000000000000785900903660 -:10B240000000D60E95010080222490BA0000000074 -:10B2500000010080020000500000FFFF000000809D -:10B26000020000900000000004010078D90130764F -:10B27000000000000000002809C029320000000082 -:10B280000000009CB24528300000E80E860100084E -:10B2900009802FB2000000000000002C094081321C -:10B2A00000000000000000F8020000320000000072 -:10B2B000000000F40200003218000000000000F856 -:10B2C000738A0239000000000000009C0280923264 -:10B2D0000000E70E0407018002C06EBC0000ED0E06 -:10B2E000C30701ECB6E46E9A0000ED0E000601EC17 -:10B2F000B6E46E9A000000000000002C09058030C2 -:10B3000000000000000000F8020000320000000011 -:10B31000000000F40200003218000000000000F8F5 -:10B32000738A023900003F0F0000009C028092D215 -:10B330000000000000000030030038320000000070 -:10B3400004010078D90130760000DF0E0000009C77 -:10B35000B24528900000FFFF00000080020000902E -:10B36000000000000000008802C0E8320200F20E77 -:10B37000B00000A0F20B00B9000000000000000CBB -:10B38000ABE4B0320000F70E80010080F24BD0B683 -:10B3900000000000A00000280900003200000000AA -:10B3A00000010080020000500000F90E040100803E -:10B3B000123EF8BA0000040FA0000004FD4BD09428 -:10B3C0000000000F80010080D28192B60000000FC3 -:10B3D000800100802281FCB600000000A000000473 -:10B3E000FD4BD034000000000000008401C02F326B -:10B3F0000000000000000080F101003400000000A7 -:10B400000000009401C02F320000040F00000090E3 -:10B41000F101009400000000A000008401C02F3260 -:10B420000000000000000080F101F834000000007E -:10B43000000000900140F8320000000000010028E8 -:10B44000090000520000080F040100280934B0BAB6 -:10B450000000050FB0000080020000B000000000F6 -:10B46000A0000004FD4BD0350000000000010028C2 -:10B47000090000520000080FB00000A822C02FB73A -:10B480000000060F040084C037ACB0B2000000001A -:10B49000A000000C0B000032FFFF0000000000784D -:10B4A000A94DB03000000F0F800000800240B0B600 -:10B4B000000000000000007869819735000000005E -:10B4C000000084080B007C32000000000000000037 -:10B4D000E72501320042000000080000878D2A3A6B -:10B4E00000000000001000000700B0320000000063 -:10B4F000001800000700D0320000000012010048D0 -:10B50000F2C138540000130F0000008002000090C8 -:10B510000000150FB00000A0020000B20000000003 -:10B520000000000CABE4B03200001A0F8001008074 -:10B530000240D0B600000000A00000280900003240 -:10B5400000000000000100800200005000001C0FFD -:10B5500004010080123EF8BA00002D0FA000000484 -:10B560000D40D0940000260F80010080D28192B659 -:10B570000000260F800100802281FCB60000000040 -:10B58000A00000040D40D03400000000000000784E -:10B5900009C02F3200000000000000FC0200003251 -:10B5A000000000000000008401C02F3200000000F5 -:10B5B00000000080F1010034000000000000009451 -:10B5C00001C02F320000000000000090F1010034A3 -:10B5D00000002D0F000000FC028097920000000088 -:10B5E000A000007809C02F3200000000000000FC1D -:10B5F00002000032000000000000008401C02F3271 -:10B600000000000000000080F101F834000000009C -:10B61000000000900140F83200000000000000FC33 -:10B62000028097320000000000010028090000524B -:10B630000000310F040100280934B0BA00002E0FB9 -:10B64000B0000080020000B000000000A000000474 -:10B650000D40D03500000000000100280900005214 -:10B660000000310FB00000A8020000B200002F0F50 -:10B67000040084C037ACB0B200000000A000000C91 -:10B680000B000032FFFF000000000078A94DB03031 -:10B690000000380F800000800240B0B600000000BB -:10B6A00000000078698197350000000000008408E0 -:10B6B0000B007C320000000000000000E725013292 -:10B6C0000042000000080000878D2A3A00000000B8 -:10B6D000001000000700B032000000000018000059 -:10B6E0000700D0320000000012010048F2C13854B7 -:10B6F00000003C0F00000080020000900000FFFFEF -:10B7000000000080020000900000410F1C400280F9 -:10B7100006C092B244000000000100F8A28D2F5232 -:10B72000000036101200006802C592B00000000050 -:10B73000000100701F00F75A0000FFFF00000080AA -:10B740000200009000000000D5080000078092323F -:10B75000000000000030000007C02C3200400080D4 -:10B76000003800000700373200000000CA4101E045 -:10B77000068092320000480F1200004802C080B2DA -:10B780000060000000010008088036720000FFFF22 -:10B79000000000800200009000000000003800005F -:10B7A00007809232000000000030000007C02C32F9 -:10B7B00000000000CA3D000C07808332000000003A -:10B7C0001201004802C0807200004E0F000000808D -:10B7D000020000900000FFFF0000008002000090C7 -:10B7E000000000000457018002C06E7C00000000D1 -:10B7F000005701EC068092720000FFFF00000080FD -:10B80000020000900000DC0E00000030030038F25F -:10B810000000570F9D11020C09006EB20000580F76 -:10B8200000F0011C09006E920000000000B8011C2D -:10B8300009006E3200005A0F2CCD011809806EB23B -:10B84000000000000000000CC9C1903400005D0F32 -:10B850003B29020409806EB20000000000D601EC12 -:10B8600056C06E34000000000000000CB9C19034D6 -:10B8700000006C0F00A8010809006EF20000610FC3 -:10B880009D01008017E090BA0000000000300080A9 -:10B8900007C091320000640F003800800700EE926C -:10B8A0000000640F0401008002C091BC0000000091 -:10B8B00000B801E00600EE3200000000007001E078 -:10B8C000060086320000660F3908008007C085B286 -:10B8D00000000000D9C901E8068091320000000094 -:10B8E000C8110080074090320000690F3B210080A2 -:10B8F000070086B200000000DB0000601800863AF6 -:10B9000000000000587801E01620863A0000000090 -:10B9100000290080070085720000FFFF0000008002 -:10B92000020000900000700F020C0280A29B90BCED -:10B93000000000000000027829006E360000700F41 -:10B9400002000080E2A590BC00000000000000089A -:10B95000090000320000720F9F89017849216EBCF6 -:10B960000000000000000078090000320000000024 -:10B9700000000008E9A5903F0000780F04200208AD -:10B98000899B90BE00000000000A0258B89B9036C8 -:10B99000000000000000007849A1903A000000007B -:10B9A0009F880180829B977C00000000008901E055 -:10B9B0000680977200000000000B0258B89B90763A -:10B9C0000000FFFF000000800200009000007F0FD9 -:10B9D00080010080A2802FB600007E0F1201007847 -:10B9E00009C021B218003600000000F8730A03F9FC -:10B9F00000007F0FCA0000D80240849200000000BF -:10BA0000000000F8A2802F35000000000040006C0C -:10BA1000881C833A000000000048004C0800723285 -:10BA20000000361008500018C82072BC000000004A -:10BA30000600008062A0827C000036100200002018 -:10BA4000880182BA00000000000000D80200003225 -:10BA500000000000000000000700063207000000A0 -:10BA600000080000774A09390000000000100000BB -:10BA70000700823200000000CA190000074082322D -:10BA80000000890F12000040F2C138B4000000002D -:10BA9000000100D8024084720000FFFF0000008017 -:10BAA000020000900000930F80010080F2C185B673 -:10BAB0000000900F1F400284E60100B40000930FC5 -:10BAC0001D0100F822812FB40000930F000000F840 -:10BAD00062812F950000920F1D010080020000B0CE -:10BAE00000000000000000F862812F350000000017 -:10BAF00000400280024068320000361012000068E8 -:10BB000002C585B0000000001D000080020000702A -:10BB10000100000004010080A28D2F702A00960F02 -:10BB20001200002C82CD2EB200000000000100F8AF -:10BB300002812F740000FFFF0000008002000090CF -:10BB400080A8000004000080828D2F7000009F0FED -:10BB500080010080D2802FB600009F0F04B00080CB -:10BB600002006EBC00000000000000F872812F345B -:10BB70003D00A20F1201002C82CD2EB200009D0FBD -:10BB800000000080020000900000A20F80010080F1 -:10BB9000F2802FB63C00A50F1201002C82CD2EB2F0 -:10BBA0000000A00F00000080020000900000A50F20 -:10BBB00080010080B2802FB63500A30F1200002C48 -:10BBC00082CD2EB200000000000000F842812F3428 -:10BBD0008000000004000080828D2F7002000000B1 -:10BBE00004010080A28D2F703B00A70F1200002CD3 -:10BBF00082CD2EB200000000000100F812812F74E7 -:10BC00000000FFFF0000008002000090080000001C -:10BC1000001801E876208139EEFF0000000100F8ED -:10BC2000828D2F710000FFFF000000800200009055 -:10BC30000000B10F0000013808C06EF200000000E3 -:10BC40001201004802C080720000AE0F00000080A8 -:10BC5000020000900000FFFF000000800200009042 -:10BC60000000B30F0438017809006EB20000000034 -:10BC7000003801E00600003200000000CA11000098 -:10BC8000078082320000B60F2E190000078097B29D -:10BC90000000000000000028E98192340000BB0F82 -:10BCA0002731000007C02CB200000000D5080000BA -:10BCB0000700873200000000C7000028E9809234A6 -:10BCC00000000000004001E0060087320000000094 -:10BCD00000000008D8818034100000000039000006 -:10BCE000E7A092790000FFFF0000008002000090B2 -:10BCF0000000BD0F1200004412E438B218003600F4 -:10BD0000000000F8730A03F90000C20F040100806C -:10BD100002802DBC0000BE0F670000F8A2802FB586 -:10BD200000003610120000E802C021B2000000003E -:10BD3000000100D8024000720000FFFF00000080F8 -:10BD4000020000900000C70F04300080829B81BC7D -:10BD500000000000CA0100F802802F3500A0C60FC5 -:10BD600012000040A28D39B200C0CB0F0438007819 -:10BD7000898D6EB01000CB0F9F0100F8E2A52FB99E -:10BD800000000000005801EC06C0EE320000000088 -:10BD900000000080020000300000000004280018AD -:10BDA00009006E720000BA0D00000080020000F071 -:10BDB0000000A30D00A8012009006E920000FFFF03 -:10BDC00000000080020000900000D40F04B000804A -:10BDD000829B81BC0000000000B800E886806E34C1 -:10BDE00000000000CA0100F842802F3508A00000C2 -:10BDF00012010040A2CD39720000D20F0000008075 -:10BE0000020000900000000000B800E886806E3458 -:10BE10000000000000010080020000700000FFFF31 -:10BE200000000080020000900000DA0F33CD01BC5A -:10BE300008806EB200001410000000282922EEDCF9 -:10BE40000000DF0F00000080020000900000DF0F04 -:10BE500004B8012809006EB20000DF0F9F71018055 -:10BE6000C2216EBC000036109F000028A924EEBC41 -:10BE70000000141000000028198092DF000000006C -:10BE800000000080020000300000F20F02810180FB -:10BE9000829B90BCEE05EA0F060C0280828D6EBC80 -:10BEA00000904C0000000084020037320000E40FD4 -:10BEB000B8010080020000B00000E20F0000008026 -:10BEC0000200009000000000000000C403809032D7 -:10BED0000000000000B001E096216E3C0000000070 -:10BEE000619801E0060087320000000000D401ECF8 -:10BEF0000600003200000000A800007849403C37EE -:10BF00000000F70F00000008E9A5909A6089200062 -:10BF100000000084020037320000ED0FB8010080FD -:10BF2000020000B00000EB0F000000800200009053 -:10BF300000000000000000C40380903200000000F8 -:10BF400000B001E096216E3C00000000619801E025 -:10BF5000060087320000000000D401EC0600003229 -:10BF60000000F70FA8000008198F909A0000000049 -:10BF70000000007899A1893E000000000000000840 -:10BF8000E9A5903A0000000000B001E096216E3C67 -:10BF900000000000619801E0060087320000000008 -:10BFA00000D401EC060000320000FA0F0600008009 -:10BFB00072A290BC00C0FF3F008001E00600373253 -:10BFC000000000000000000809C089320000FF0FD7 -:10BFD00004790180821B87BC0000FD0F04B0008043 -:10BFE00002006EBC00000110D99001E00680909222 -:10BFF000000004108000008052812FB60000041061 -:10C00000D54101E006008792000001103C9001E05C -:10C01000068090B20000000000C801E806C08B3224 -:10C02000000000009501008002802F7200000510C2 -:10C030009F410180821B87BC00000000000100803E -:10C040000200007000000000D99001E006809032EC -:10C0500000000000000100F872802F740000FFFF54 -:10C06000000000800200009000000D109FD80180A9 -:10C0700022216EBC000000000B0100800200007055 -:10C0800000000D109FE00180C2216EBC0000000086 -:10C090000B0100800200007000000D109FB00180B5 -:10C0A000D2216EBC00000000000100800200007080 -:10C0B00000000F1006680180825B87BC0000000052 -:10C0C000006801E0064087320000111037B001E03F -:10C0D000064087B200000000000000F8D2802F3434 -:10C0E0000000000000D801E006808432000000005B -:10C0F00000E101E0060087720000FFFF0000008001 -:10C10000020000900000201004C1018402006EB201 -:10C110000500000000C001E8868D92370300000092 -:10C1200000C401E8868D9237000000000000008006 -:10C13000020000300300000000C0012C898D6E3623 -:10C140000000000000C4012CA9DB923A00000000AE -:10C150000000002C29C09236000000000000002CD6 -:10C1600019FB923F00000000000000282980923A4D -:10C17000000000000000002CA9E4923F0000000035 -:10C180006FCC01E826FB923E0000000000B901E000 -:10C19000060000520000000000000094028092326D -:10C1A0000000000000C001E006402832100000003E -:10C1B0006FCC01E886CD2A360000000000B901E00E -:10C1C000060000520000FFFF000000800200009007 -:10C1D00000000000009001BC08006E32000000006A -:10C1E00000B001BC88DB8B3E00000000009801BC61 -:10C1F00088DB8B3A000030109F0000BC88E18BBCCC -:10C2000000003010040C0240A8DB8BBE00000000D0 -:10C2100000B00004881B843E00002D1004B1008093 -:10C22000825B80BC00000000000100F8C2802F7417 -:10C2300000000000040C0280A25B807C0000301033 -:10C240000468017819006EB600000000020000804A -:10C25000E265807C000000000000008812002C3A9B -:10C260000000FFFF000000800200009008000000B6 -:10C27000001C01E876208139EEFF0000000100F883 -:10C28000828D2F710000FFFF0000008002000090EF -:10C2900000003610000000B40F40FB9400000000C6 -:10C2A000000000880F402B320000000000000090CA -:10C2B0000F00283200000000000000940F00293217 -:10C2C00010000000000000B85F461839FF000000B1 -:10C2D0000000009C0F003632000000000000009CAF -:10C2E0005FCAF935000000000000004403C0F932C5 -:10C2F00000000000000000E40300003241000010D4 -:10C30000000000E00300373200000000000000E4FD -:10C310000300003240000010000000E0030037324C -:10C3200000004510670000980F802AB2000000004E -:10C33000000000A8020000320000431012C186E095 -:10C3400007C021B20000000000B886C006802A3273 -:10C350004C420000000000A802003632471058117D -:10C36000000000B00F003692000000000000009CAA -:10C370000200003200014411000000AC0F0036D270 -:10C3800000000000000000AC0F802A3200200000F6 -:10C39000000000A802003632000000000000009CEF -:10C3A0000F007E3200000000000000A00F007E326F -:10C3B00000000000000000A40F007E32000000001A -:10C3C000000000A80F007E3200000000000000A85E -:10C3D00002C0FA3200000000000000E007C0F9329D -:10C3E00000000000000000E00700FA32000000003A -:10C3F000000000E00740FA3200005B10000000E09F -:10C400000780FAD200000000000000E00780FB3245 -:10C4100001008210040100B48F4DFBB00200000047 -:10C42000000000A002000039408000000000000C65 -:10C43000ABCDB032100000000000000C5BCAB03978 -:10C44000000000000000000C2BFEB0320000811143 -:10C45000000000800200009000000000000000F8D2 -:10C460000300013200000000000100E007803F529D -:10C4700018000000000000F8738A02390000000074 -:10C4800000000044530A1635000000000000009C24 -:10C490000F80963200000000000000A00FC096320E -:10C4A00000000000000000A40F009732A26003000B -:10C4B0000000005803003732681000000000005CE4 -:10C4C000030036320000000000000050830D0034ED -:10C4D0000000000000000048830D00340000000050 -:10C4E00000000044530A00340000360000000080C1 -:10C4F00002000090000000000000006809C0F9324E -:10C50000000000000000006C0900FA32000000008A -:10C51000000000700940FA3200007A10000000802C -:10C520000200009002000000000000A0F20B0039A1 -:10C5300000006F10800100801240B0B600000000C3 -:10C54000000000043B40B033000000000000000485 -:10C55000FD4BD035000073100000000C0B009792CB -:10C5600002000000000000A0F20B00390000731070 -:10C57000000000046B019794000073101200006823 -:10C58000094020B2000074101200006C094020B273 -:10C590000D000000000000FCA2E516380000791034 -:10C5A0009F000080028096B2000000000000007032 -:10C5B00009C0963200007A100000006C09C0FD929C -:10C5C0000000791012000070094020B20000000045 -:10C5D0000000009C0200003200000000000000D8B3 -:10C5E0000200003202007310040100BCAF2517B82E -:10C5F00006007110040000BCAF6516B800006C1096 -:10C600000400008022C0FBBC00008A1004000080EF -:10C6100012C1FBBC200073100401008082CDFBBC62 -:10C6200002000000000000A0F20B003900008B1097 -:10C6300000000080020000D084100000000000888C -:10C6400082CDF93A00007A110000008002000090CB -:10C650000000B31000000080020000900000B41041 -:10C6600000000080020000900000B8100000008070 -:10C67000020000900000C010000000800200009046 -:10C6800000001911000000800200009000007310EB -:10C69000000000DC0F009792000000000000000086 -:10C6A0000700033240420000000000A802003632BA -:10C6B000000000000008000007802A32000000008F -:10C6C0000010000007009732000000000018000072 -:10C6D00007C096320880901012000040028036B2E7 -:10C6E00000000000000000800200003000009210F6 -:10C6F0001200009C0FC021B21D00951004000080A4 -:10C7000072BE17B800009210000000F81E80EF9A69 -:10C71000130000000000009C7FBE17380000981036 -:10C720000400008012C0F9BC00009210000000F864 -:10C730001E80EF9A000000000000009C0F007E3277 -:10C7400000000000000000A00F007E32000000008A -:10C75000000000A40F007E32000000000001000075 -:10C760000700FA52000000000000009C02000032A6 -:10C770004C420000000000A8020036320000000019 -:10C780000008000007802A3200006E1100000080BF -:10C79000020000D00000721100000080020000D0F2 -:10C7A000000000000000000CCBC1B034000000000D -:10C7B0000000009C0200003200000000000000D8D1 -:10C7C000020000320000F10E0000002809C0B0D2C3 -:10C7D0000000A21004000080028092B20000A610A7 -:10C7E0001200009C0FC021B21D00A910040000809F -:10C7F00072BE17B80000A610000000F81E80EF9A65 -:10C80000130000000000009C7FBE17380000AC1031 -:10C810000400008012C0F9BC0000A610000000F85F -:10C820001E80EF9A0200AE10040100B48F4DFBB0E1 -:10C83000000073100000008002000090080000005B -:10C84000000000F89340013900000000000000B42F -:10C850001F40FB35FE000000000000480300363298 -:10C860000000000000000044030000340000A2109B -:10C870000000000C8BC1B09400007E110008000085 -:10C880000740FA9200006E11000800000740FAD23B -:10C890000880B51012000050028036B200007311FB -:10C8A00000000080020000D0000080110000008025 -:10C8B00002000090000800000000009C0F003632CB -:10C8C00000440000000000A8020036320000000012 -:10C8D000000000A00200003200000000000000E0A4 -:10C8E0000700B03200000000000000A012002A3A49 -:10C8F0000000BB100401009C1FC0F9BC00440000F4 -:10C90000000000A80200363202007D11000000A0E5 -:10C91000F20B00990000C810040100800240FAB236 -:10C9200000440000000000A8020036320000CA10D7 -:10C9300000000080020000D00000D710000000843A -:10C94000020000D200000000000000E007C03C32FE -:10C950000000C4108E010080024028B20044000094 -:10C96000000000A40F0036320000B3100000008069 -:10C970000200009000440000000000A48F4DFA3A2D -:10C980000000B310000000800200009000000000D2 -:10C990000000009C0F00003210000001000000ACFD -:10C9A0000F0037320000DC1000000080020000D0D1 -:10C9B0000800CC100401008082CDF9BC000000000A -:10C9C0000000009C0F0000320E000001000000ACCF -:10C9D0000F0037320000DC1000000080020000D0A1 -:10C9E0000B00D0100401008082CDF9BC20000000B3 -:10C9F0000000009C0F0036320F000001000000AC68 -:10CA00000F0037320000DC1000000080020000D070 -:10CA10002700D4100401008082CDF9BC0000000082 -:10CA20000001008002000050000000000000009C97 -:10CA30000F0000320F000001000000AC0F00373281 -:10CA40000000DC1000000080020000D02000D9109F -:10CA50000401008082CDF9BC0000000000010080CC -:10CA60000200005000000000000000E403C0F932A2 -:10CA70000D000001000000E003003732000000005C -:10CA8000000000E003C0FA3200000000000000E0F7 -:10CA900007403E32000000000001009C1FC0F95A10 -:10CAA00000000000000000E003C0F93200000000B8 -:10CAB000000000E007403E32000000000000009C43 -:10CAC0001FC0F93AFF000000000100AC8FCDF95003 -:10CAD000000000000000009C0FC02F32000000008A -:10CAE000000000FC0200003200000000000000E036 -:10CAF00007803E3200000000000000FC12C02F3A08 -:10CB00000F00E7100401008082CD2FBC0000000060 -:10CB1000000000E007803E3200000000000100FC41 -:10CB200002C0F95200000000000000E007003A32A5 -:10CB300000000000000000E007403A320000000062 -:10CB4000000000E007803A3200000000000000E032 -:10CB500007C03A32000000000000009C0FC02F32D6 -:10CB600000000000000000FC020000320000000095 -:10CB7000000000E007003D3200000000000000E07F -:10CB800007403D320000F210830100FC12C02FBAB2 -:10CB900000000000000100FC02C0F952000000008B -:10CBA0000000009C0F0000320C0000000000000894 -:10CBB000733E003900000000000000E00700303242 -:10CBC000000000000000009C1FC0F93A7000F71040 -:10CBD0000401008082CDF9BC000000000000000CC0 -:10CBE0000300003200000000000000E007003032C7 -:10CBF00000000000000000100300003200000000F0 -:10CC0000000000E007003032000000000000009C3F -:10CC10000F00003200000000000000A00FC0293209 -:10CC2000000000000000009C02C0F932000000007B -:10CC3000000000A40FC02C32000000000000009C87 -:10CC40000200FA32180000000000002C737EFA394E -:10CC500000000000000000E007003032000000117A -:10CC60008501009C1FC0F9BA00000000000100808F -:10CC700002000050010000010000009C0F0037324C -:10CC80000000E11000000080020000D00E000F1133 -:10CC90000401008082CDFABC00000000000000E02A -:10CCA0000700003200000000000000E00700003232 -:10CCB00000000000000000E0070000320000091141 -:10CCC0000000009C3FC0F99A1C000911040100807B -:10CCD00082CDFABC0200E1100000009C8FCDF9DA91 -:10CCE000000000000001008002000050010000026E -:10CCF0000000009C0F0037320000E11000000080AF -:10CD0000020000D00E0017110401008082CDFABC91 -:10CD100000000000000000E00700003200001311D6 -:10CD20000000009C1FC0F99A260013110401008026 -:10CD300082CDFABC0000000000010080020000501B -:10CD400000000000000000A80F402932004400004D -:10CD5000000000A802003632000008110000008028 -:10CD6000020000D00000121100000080020000D07C -:10CD70000000E51000000080020000D0000000006C -:10CD8000000000E00780183200000000000000E012 -:10CD900007401A3200000000000000E007001A32CD -:10CDA00000000000000000E007801A3200000000D0 -:10CDB000000000E007C01A3200000000000000A0E0 -:10CDC0000F000032A2600300000000580300373259 -:10CDD0002B1100000000005C030036320000000050 -:10CDE0000000009C0F802A3200002B1104000080FC -:10CDF000024029B20000000000000050833E0034D1 -:10CE00000000000000000048833E003400000000E5 -:10CE100000000044530A003400002C110000008878 -:10CE20000F402B9200000000000000900F002832FD -:10CE300000000000000000940F00293200000000F4 -:10CE4000000000980F802A3200000000000000A8B7 -:10CE500002C0F93231115811000000B00F003692B3 -:10CE60000700341104000080824D29BC000000003E -:10CE7000000000A01F00FA3A000028110000009CEA -:10CE80000F802A92C0010000000000AC0F00363273 -:10CE9000010000000000009C020036320000441136 -:10CEA00000000080020000D01F003A110400008042 -:10CEB00082CD29BCC0000000000000AC8FCDFA3A42 -:10CEC000000036110000009C12C0299A0000F610E4 -:10CED00000000080020000D00000EC100000008084 -:10CEE000020000D00000421104000080528AFABC07 -:10CEF000A260030000000058030037324211000016 -:10CF00000000005C0300363200000000000000500A -:10CF1000A33E00340000000000000048A33E00349F -:10CF20000000000000000044530A003400440000E8 -:10CF3000000000A40F0036320000B3100000008093 -:10CF40000200009000000000000000C402C0FA329D -:10CF5000030000000000009C0F00363200000000BB -:10CF6000000000BC0F402F3200004B110400009C59 -:10CF70001FC0F9BC00004A110400008002402FB21B -:10CF800000004711000000E007002C92000047114C -:10CF9000000000E00700369200000000000000E002 -:10CFA00007402C3200000000000000E007802C3217 -:10CFB00000000000000000E007C02C32000000006C -:10CFC000000000E007002D3200000000000000E03B -:10CFD00007402D3200000000000000E007802D32E5 -:10CFE00000000000000000E007C02D32000000003B -:10CFF000000000E007C0FB3200000000000000E07D -:10D0000007802F3200000000000000E007C02F3230 -:10D0100018000000000000F8730A02390000000048 -:10D02000000100E007803F52FF00000000000044C4 -:10D030000300363200000000000000E00700F93273 -:10D0400000000000000000E007402832000000005F -:10D05000000000E00780F832030000000000009CA0 -:10D060000F00363200000000000000BC0FC02B3261 -:10D07000000061110400009C1FC0F9BC0000601199 -:10D080000400008002C02BB200005D11000000E02F -:10D0900007C0289200005D11000000E007003692F2 -:10D0A00000000000000000E00740F932000000002E -:10D0B000000000E00740293200000000000000E00E -:10D0C0000780293200000000000000E007C029327C -:10D0D00000000000000000E007002A32000000000D -:10D0E000000000E007402A3200000000000000E0DD -:10D0F0000780F93200000000000000E007C02A327B -:10D1000000000000000000E007C02F320000000017 -:10D11000000000E007402B3200000000000000E0AB -:10D1200007802B3200000000000000E007C0FB3247 -:10D1300000000000000000880200FB320000000038 -:10D140000000009C0200003200000000000000D837 -:10D1500002000032000000000010000007009732BB -:10D16000000000000019000007C0965208807211EC -:10D1700012000048028036B200000000000000806B -:10D1800002000030000074111200009C0FC021B298 -:10D190001D0077110400008072BE17B800007411E2 -:10D1A000000000F81E80EF9A130000000000009CB1 -:10D1B0007FBE1738000000000400008012C0F95C38 -:10D1C00000007411000000F81E80EF9A00000000BB -:10D1D000000000B40F40FB35000000000000009C80 -:10D1E000020000324C420000000000A8020036326B -:10D1F000000000000008000007802A3200006E11C5 -:10D2000000000080020000D00000721100000080C9 -:10D21000020000D0000000000000000CCBC1B034C0 -:10D22000000000000000009C02000032000000002E -:10D23000000000D80200003200008B11000000281E -:10D2400009C0B0D20000811104000080028092B2B7 -:10D25000000085111200009C0FC021B21D00881132 -:10D260000400008072BE17B800008511000000F8AD -:10D270001E80EF9A130000000000009C7FBE17384C -:10D28000000073100400008012C0F9BC000085117A -:10D29000000000F81E80EF9A00000000000000FC73 -:10D2A0000200003202000000000000A0F20B003972 -:10D2B00000008F11040100280934B0BA00000000FA -:10D2C000000100280900005200000000000000A832 -:10D2D00022C02F3700000000000084C037ACB032FD -:10D2E000000000000000000C0B000032FFFF0000F7 -:10D2F000000000C0AF4DB0300000951180000080EC -:10D300000240B0B600000000000000C06F01FC3514 -:10D310000000000000000000073F01320042000052 -:10D3200000080000878D2A3A00000000001000006D -:10D330000700B03200000000001800000700D032E3 -:10D3400000000000000000C03FC1383400000000B1 -:10D3500012010048F201FC5400009A110000008004 -:10D36000020000900000FFFF00000080020000901B -:0CD3700000003600000000800200009069 -:00000001FF -- cgit v0.10.2 From 0f8e5c298fc801e8eca69e1409604c05d36e0cc4 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Mon, 6 Apr 2009 17:41:48 -0700 Subject: Add README.AddingFirmware file. Basically telling people not to. Signed-off-by: David Woodhouse diff --git a/firmware/README.AddingFirmware b/firmware/README.AddingFirmware new file mode 100644 index 0000000..e24cd89 --- /dev/null +++ b/firmware/README.AddingFirmware @@ -0,0 +1,34 @@ + + DO NOT ADD FIRMWARE TO THIS DIRECTORY. + ====================================== + +This directory is only here to contain firmware images extracted from old +device drivers which predate the common use of request_firmware(). + +As we update those drivers to use request_firmware() and keep a clean +separation between code and firmware, we put the extracted firmware +here. + +This directory is _NOT_ for adding arbitrary new firmware images. The +place to add those is the separate linux-firmware repository: + + git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git + +That repository contains all these firmware images which have been +extracted from older drivers, as well various new firmware images which +we were never permitted to include in a GPL'd work, but which we _have_ +been permitted to redistribute under separate cover. + +To submit firmware to that repository, please send either a git binary +diff or preferably a git pull request to: + David Woodhouse + +Your commit should include an update to the WHENCE file clearly +identifying the licence under which the firmware is available, and +that it is redistributable. If the licence is long and involved, it's +permitted to include it in a separate file and refer to it from the +WHENCE file. + +Ideally, your commit should contain a Signed-Off-By: from someone +authoritative on the licensing of the firmware in question (i.e. from +within the company that owns the code). -- cgit v0.10.2 From 13614e37e94da4606a300ee6fe25c8c4a19ee670 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Mon, 6 Apr 2009 16:01:46 +0200 Subject: ACPI: Adjust Kelvin offset to match local implementation The exact offset between Kelvin and degree Celsius is 273.15. However ACPI handles temperature values with a single decimal place. As a consequence, some implementations use an offset of 273.1 and others use an offset of 273.2. Try to find out which one is being used, to present the most accurate and visually appealing number. Tested on a Sony Vaio PGC-GR214EP (which uses 273.1) and a Lenovo Thinkpad T60p (which uses 273.2). Signed-off-by: Jean Delvare Acked-by: Zhang Rui Signed-off-by: Len Brown diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index e8c143c..ddbb7c8f 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -192,6 +192,7 @@ struct acpi_thermal { struct acpi_handle_list devices; struct thermal_zone_device *thermal_zone; int tz_enabled; + int kelvin_offset; struct mutex lock; }; @@ -581,7 +582,7 @@ static void acpi_thermal_check(void *data) } /* sys I/F for generic thermal sysfs support */ -#define KELVIN_TO_MILLICELSIUS(t) (t * 100 - 273200) +#define KELVIN_TO_MILLICELSIUS(t, off) (((t) - (off)) * 100) static int thermal_get_temp(struct thermal_zone_device *thermal, unsigned long *temp) @@ -596,7 +597,7 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, if (result) return result; - *temp = KELVIN_TO_MILLICELSIUS(tz->temperature); + *temp = KELVIN_TO_MILLICELSIUS(tz->temperature, tz->kelvin_offset); return 0; } @@ -702,7 +703,8 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, if (tz->trips.critical.flags.valid) { if (!trip) { *temp = KELVIN_TO_MILLICELSIUS( - tz->trips.critical.temperature); + tz->trips.critical.temperature, + tz->kelvin_offset); return 0; } trip--; @@ -711,7 +713,8 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, if (tz->trips.hot.flags.valid) { if (!trip) { *temp = KELVIN_TO_MILLICELSIUS( - tz->trips.hot.temperature); + tz->trips.hot.temperature, + tz->kelvin_offset); return 0; } trip--; @@ -720,7 +723,8 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, if (tz->trips.passive.flags.valid) { if (!trip) { *temp = KELVIN_TO_MILLICELSIUS( - tz->trips.passive.temperature); + tz->trips.passive.temperature, + tz->kelvin_offset); return 0; } trip--; @@ -730,7 +734,8 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, tz->trips.active[i].flags.valid; i++) { if (!trip) { *temp = KELVIN_TO_MILLICELSIUS( - tz->trips.active[i].temperature); + tz->trips.active[i].temperature, + tz->kelvin_offset); return 0; } trip--; @@ -745,7 +750,8 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal, if (tz->trips.critical.flags.valid) { *temperature = KELVIN_TO_MILLICELSIUS( - tz->trips.critical.temperature); + tz->trips.critical.temperature, + tz->kelvin_offset); return 0; } else return -EINVAL; @@ -1334,6 +1340,25 @@ static int acpi_thermal_get_info(struct acpi_thermal *tz) return 0; } +/* + * The exact offset between Kelvin and degree Celsius is 273.15. However ACPI + * handles temperature values with a single decimal place. As a consequence, + * some implementations use an offset of 273.1 and others use an offset of + * 273.2. Try to find out which one is being used, to present the most + * accurate and visually appealing number. + * + * The heuristic below should work for all ACPI thermal zones which have a + * critical trip point with a value being a multiple of 0.5 degree Celsius. + */ +static void acpi_thermal_guess_offset(struct acpi_thermal *tz) +{ + if (tz->trips.critical.flags.valid && + (tz->trips.critical.temperature % 5) == 1) + tz->kelvin_offset = 2731; + else + tz->kelvin_offset = 2732; +} + static int acpi_thermal_add(struct acpi_device *device) { int result = 0; @@ -1360,6 +1385,8 @@ static int acpi_thermal_add(struct acpi_device *device) if (result) goto free_memory; + acpi_thermal_guess_offset(tz); + result = acpi_thermal_register_thermal_zone(tz); if (result) goto free_memory; -- cgit v0.10.2 From d22616942804798105e61428afa41a9132421bb9 Mon Sep 17 00:00:00 2001 From: Huang Weiyi Date: Mon, 6 Apr 2009 17:16:46 +0800 Subject: ACPI: cpufreq: remove dupilcated #include Remove dupilicated #include in arch/x86/kernel/cpu/cpufreq/longhaul.c. Signed-off-by: Huang Weiyi Signed-off-by: Len Brown diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index 0bd48e6..ce2ed3e 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include -- cgit v0.10.2 From a3c270561ea4455cbcea0ac2b53335655d9fc805 Mon Sep 17 00:00:00 2001 From: Hannes Eder Date: Thu, 5 Mar 2009 20:15:44 +0100 Subject: NULL noise: drivers/platform/x86/panasonic-laptop.c Fix this sparse warning: drivers/platform/x86/panasonic-laptop.c:273:70: warning: Using plain integer as NULL pointer Signed-off-by: Hannes Eder Signed-off-by: Len Brown diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index a5ce4bc..41cf3e7 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c @@ -271,7 +271,7 @@ static int acpi_pcc_retrieve_biosdata(struct pcc_acpi *pcc, u32 *sinf) union acpi_object *hkey = NULL; int i; - status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SINF, 0, + status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SINF, NULL, &buffer); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, -- cgit v0.10.2 From 33b571501553ceb008c0aef8b89e932d4efda2a2 Mon Sep 17 00:00:00 2001 From: Len Brown Date: Mon, 15 Dec 2008 22:09:26 -0500 Subject: ACPI: delete acpi_device.g_list unused Signed-off-by: Len Brown diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index e63f2fe..8ff510b 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -491,7 +491,6 @@ static int acpi_device_register(struct acpi_device *device, */ INIT_LIST_HEAD(&device->children); INIT_LIST_HEAD(&device->node); - INIT_LIST_HEAD(&device->g_list); INIT_LIST_HEAD(&device->wakeup_list); new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL); @@ -521,11 +520,9 @@ static int acpi_device_register(struct acpi_device *device, } dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no); - if (device->parent) { + if (device->parent) list_add_tail(&device->node, &device->parent->children); - list_add_tail(&device->g_list, &device->parent->g_list); - } else - list_add_tail(&device->g_list, &acpi_device_list); + if (device->wakeup.flags.valid) list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list); mutex_unlock(&acpi_device_lock); @@ -550,11 +547,8 @@ static int acpi_device_register(struct acpi_device *device, return 0; end: mutex_lock(&acpi_device_lock); - if (device->parent) { + if (device->parent) list_del(&device->node); - list_del(&device->g_list); - } else - list_del(&device->g_list); list_del(&device->wakeup_list); mutex_unlock(&acpi_device_lock); return result; @@ -563,11 +557,8 @@ static int acpi_device_register(struct acpi_device *device, static void acpi_device_unregister(struct acpi_device *device, int type) { mutex_lock(&acpi_device_lock); - if (device->parent) { + if (device->parent) list_del(&device->node); - list_del(&device->g_list); - } else - list_del(&device->g_list); list_del(&device->wakeup_list); mutex_unlock(&acpi_device_lock); diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index a222851..c34b110 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -270,7 +270,6 @@ struct acpi_device { struct list_head children; struct list_head node; struct list_head wakeup_list; - struct list_head g_list; struct acpi_device_status status; struct acpi_device_flags flags; struct acpi_device_pnp pnp; -- cgit v0.10.2 From f7d7f866baacc283967ce82ebdfe5d2801059a11 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Mon, 6 Apr 2009 23:04:40 -0700 Subject: x86, intel-iommu: fix X2APIC && !ACPI build failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This build failure: | drivers/pci/dmar.c:47: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘dmar_tbl_size’ | drivers/pci/dmar.c:62: warning: ‘struct acpi_dmar_device_scope’ declared inside parameter list | drivers/pci/dmar.c:62: warning: its scope is only this definition or declaration, which is probably not what you want Triggers due to this commit: d0b03bd: x2apic/intr-remap: decouple interrupt remapping from x2apic Which exposed a pre-existing but dormant fragility of the 'select X86_X2APIC' it moved around and turned that fragility into a build failure. Replace it with a proper 'depends on' construct. Signed-off-by: David Woodhouse LKML-Reference: <1239084280.22733.404.camel@macbook.infradead.org> Signed-off-by: Ingo Molnar diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4b34082..bc25b9f 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -252,17 +252,13 @@ config SMP config X86_X2APIC bool "Support x2apic" - depends on X86_LOCAL_APIC && X86_64 - select INTR_REMAP + depends on X86_LOCAL_APIC && X86_64 && INTR_REMAP ---help--- This enables x2apic support on CPUs that have this feature. This allows 32-bit apic IDs (so it can support very large systems), and accesses the local apic via MSRs not via mmio. - ( On certain CPU models you may need to enable INTR_REMAP too, - to get functional x2apic mode. ) - If you don't know what to do here, say N. config SPARSE_IRQ -- cgit v0.10.2 From 1e274a582710e95d93b86e8d47e9fcce4ca09d01 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 7 Apr 2009 10:59:25 -0700 Subject: x86, setup: un-resequence mode setting for VGA 80x34 and 80x60 modes Impact: Fixes these modes on at least one system The rewrite of the setup code into C resequenced the font setting and register reprogramming phases of configuring nonstandard VGA modes which use 480 scan lines in text mode. However, there exists at least one board (Micro-Star MS-7383 version 2.0) on which this resequencing causes an unusable display. Revert to the original sequencing: set up 480-line mode, install the font, and then adjust the vertical end register appropriately. This failure was masked by the fact that the 480-line setup was broken until checkin 5f641356127712fbdce0eee120e5ce115860c17f (therefore this is not a -stable candidate bug fix.) Reported-by: Andi Kleen Signed-off-by: H. Peter Anvin diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index 95d86ce..9e0587a 100644 --- a/arch/x86/boot/video-vga.c +++ b/arch/x86/boot/video-vga.c @@ -129,22 +129,18 @@ u16 vga_crtc(void) return (inb(0x3cc) & 1) ? 0x3d4 : 0x3b4; } -static void vga_set_480_scanlines(int lines) +static void vga_set_480_scanlines(void) { u16 crtc; /* CRTC base address */ u8 csel; /* CRTC miscellaneous output register */ - u8 ovfw; /* CRTC overflow register */ - int end = lines-1; crtc = vga_crtc(); - ovfw = 0x3c | ((end >> (8-1)) & 0x02) | ((end >> (9-6)) & 0x40); - out_idx(0x0c, crtc, 0x11); /* Vertical sync end, unlock CR0-7 */ out_idx(0x0b, crtc, 0x06); /* Vertical total */ - out_idx(ovfw, crtc, 0x07); /* Vertical overflow */ + out_idx(0x3e, crtc, 0x07); /* Vertical overflow */ out_idx(0xea, crtc, 0x10); /* Vertical sync start */ - out_idx(end, crtc, 0x12); /* Vertical display end */ + out_idx(0xdf, crtc, 0x12); /* Vertical display end */ out_idx(0xe7, crtc, 0x15); /* Vertical blank start */ out_idx(0x04, crtc, 0x16); /* Vertical blank end */ csel = inb(0x3cc); @@ -153,21 +149,38 @@ static void vga_set_480_scanlines(int lines) outb(csel, 0x3c2); } +static void vga_set_vertical_end(int lines) +{ + u16 crtc; /* CRTC base address */ + u8 ovfw; /* CRTC overflow register */ + int end = lines-1; + + crtc = vga_crtc(); + + ovfw = 0x3c | ((end >> (8-1)) & 0x02) | ((end >> (9-6)) & 0x40); + + out_idx(ovfw, crtc, 0x07); /* Vertical overflow */ + out_idx(end, crtc, 0x12); /* Vertical display end */ +} + static void vga_set_80x30(void) { - vga_set_480_scanlines(30*16); + vga_set_480_scanlines(); + vga_set_vertical_end(30*16); } static void vga_set_80x34(void) { + vga_set_480_scanlines(); vga_set_14font(); - vga_set_480_scanlines(34*14); + vga_set_vertical_end(34*14); } static void vga_set_80x60(void) { + vga_set_480_scanlines(); vga_set_8font(); - vga_set_480_scanlines(60*8); + vga_set_vertical_end(60*8); } static int vga_set_mode(struct mode_info *mode) -- cgit v0.10.2 From 0f2ddca66d70c8ccba7486cf2d79c6b60e777abd Mon Sep 17 00:00:00 2001 From: "From: Thiemo Nagel" Date: Tue, 7 Apr 2009 14:07:47 -0400 Subject: ext4: check block device size on mount Signed-off-by: Thiemo Nagel Signed-off-by: "Theodore Ts'o" diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 9987bba..2958f4e 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2508,6 +2508,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) if (EXT4_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext4; + /* check blocks count against device size */ + blocks_count = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits; + if (blocks_count && ext4_blocks_count(es) > blocks_count) { + printk(KERN_WARNING "EXT4-fs: bad geometry: block count %llu " + "exceeds size of device (%llu blocks)\n", + ext4_blocks_count(es), blocks_count); + goto failed_mount; + } + /* * It makes no sense for the first data block to be beyond the end * of the filesystem. -- cgit v0.10.2 From 5d38258ec026921a7b266f4047ebeaa75db358e5 Mon Sep 17 00:00:00 2001 From: Vegard Nossum Date: Tue, 7 Apr 2009 10:55:38 +0200 Subject: ACPI battery: fix async boot oops > BUG: unable to handle kernel NULL pointer dereference at (null) What happens is that the battery module's init sections are being freed before the async callback (which was marked __init) has run. This theory is supported by the fact that the bad RIP value is a vmalloc address. The immediate fix is to make this a non-init call. (A better long-term fix is of course to wait with init-section unloading until a module's async initcalls have been run, which would allow us to discard this function which is still only run once, after all. Perhaps a new async_initcall() function for the async/module API, if this is needed for other modules in the future?) Reported-by: Arkadiusz Miskiewicz Signed-off-by: Vegard Nossum Tested-by: Alessandro Suardi Tested-by: Rafael J. Wysocki Signed-off-by: Len Brown diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index b0de631..3c7d894 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -903,7 +903,7 @@ static struct acpi_driver acpi_battery_driver = { }, }; -static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie) +static void acpi_battery_init_async(void *unused, async_cookie_t cookie) { if (acpi_disabled) return; -- cgit v0.10.2 From 342d550db1bc0b879007a8cdb38645558e839680 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:06 +0000 Subject: ACPI: thermal: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Signed-off-by: Bjorn Helgaas CC: Zhang Rui Signed-off-by: Len Brown diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index e8c143c..0914eaa 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -98,6 +98,7 @@ MODULE_PARM_DESC(psv, "Disable or override all passive trip points."); static int acpi_thermal_add(struct acpi_device *device); static int acpi_thermal_remove(struct acpi_device *device, int type); static int acpi_thermal_resume(struct acpi_device *device); +static void acpi_thermal_notify(struct acpi_device *device, u32 event); static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file); static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file); static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file); @@ -123,6 +124,7 @@ static struct acpi_driver acpi_thermal_driver = { .add = acpi_thermal_add, .remove = acpi_thermal_remove, .resume = acpi_thermal_resume, + .notify = acpi_thermal_notify, }, }; @@ -1264,17 +1266,14 @@ static int acpi_thermal_remove_fs(struct acpi_device *device) Driver Interface -------------------------------------------------------------------------- */ -static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data) +static void acpi_thermal_notify(struct acpi_device *device, u32 event) { - struct acpi_thermal *tz = data; - struct acpi_device *device = NULL; + struct acpi_thermal *tz = acpi_driver_data(device); if (!tz) return; - device = tz->device; - switch (event) { case ACPI_THERMAL_NOTIFY_TEMPERATURE: acpi_thermal_check(tz); @@ -1298,8 +1297,6 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data) "Unsupported event [0x%x]\n", event)); break; } - - return; } static int acpi_thermal_get_info(struct acpi_thermal *tz) @@ -1337,7 +1334,6 @@ static int acpi_thermal_get_info(struct acpi_thermal *tz) static int acpi_thermal_add(struct acpi_device *device) { int result = 0; - acpi_status status = AE_OK; struct acpi_thermal *tz = NULL; @@ -1368,21 +1364,11 @@ static int acpi_thermal_add(struct acpi_device *device) if (result) goto unregister_thermal_zone; - status = acpi_install_notify_handler(device->handle, - ACPI_DEVICE_NOTIFY, - acpi_thermal_notify, tz); - if (ACPI_FAILURE(status)) { - result = -ENODEV; - goto remove_fs; - } - printk(KERN_INFO PREFIX "%s [%s] (%ld C)\n", acpi_device_name(device), acpi_device_bid(device), KELVIN_TO_CELSIUS(tz->temperature)); goto end; -remove_fs: - acpi_thermal_remove_fs(device); unregister_thermal_zone: thermal_zone_device_unregister(tz->thermal_zone); free_memory: @@ -1393,7 +1379,6 @@ end: static int acpi_thermal_remove(struct acpi_device *device, int type) { - acpi_status status = AE_OK; struct acpi_thermal *tz = NULL; if (!device || !acpi_driver_data(device)) @@ -1401,10 +1386,6 @@ static int acpi_thermal_remove(struct acpi_device *device, int type) tz = acpi_driver_data(device); - status = acpi_remove_notify_handler(device->handle, - ACPI_DEVICE_NOTIFY, - acpi_thermal_notify); - acpi_thermal_remove_fs(device); acpi_thermal_unregister_thermal_zone(tz); mutex_destroy(&tz->lock); -- cgit v0.10.2 From 7015558fca5ee82fc17227b61d88ddaa02d82242 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:11 +0000 Subject: ACPI: video: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Signed-off-by: Bjorn Helgaas CC: Zhang Rui Signed-off-by: Len Brown diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index ab06143..cd4fb75 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c @@ -79,6 +79,7 @@ module_param(brightness_switch_enabled, bool, 0644); static int acpi_video_bus_add(struct acpi_device *device); static int acpi_video_bus_remove(struct acpi_device *device, int type); static int acpi_video_resume(struct acpi_device *device); +static void acpi_video_bus_notify(struct acpi_device *device, u32 event); static const struct acpi_device_id video_device_ids[] = { {ACPI_VIDEO_HID, 0}, @@ -94,6 +95,7 @@ static struct acpi_driver acpi_video_bus = { .add = acpi_video_bus_add, .remove = acpi_video_bus_remove, .resume = acpi_video_resume, + .notify = acpi_video_bus_notify, }, }; @@ -1986,17 +1988,15 @@ static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) return acpi_video_bus_DOS(video, 0, 1); } -static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data) +static void acpi_video_bus_notify(struct acpi_device *device, u32 event) { - struct acpi_video_bus *video = data; - struct acpi_device *device = NULL; + struct acpi_video_bus *video = acpi_driver_data(device); struct input_dev *input; int keycode; if (!video) return; - device = video->device; input = video->input; switch (event) { @@ -2127,7 +2127,6 @@ static int acpi_video_resume(struct acpi_device *device) static int acpi_video_bus_add(struct acpi_device *device) { - acpi_status status; struct acpi_video_bus *video; struct input_dev *input; int error; @@ -2169,20 +2168,10 @@ static int acpi_video_bus_add(struct acpi_device *device) acpi_video_bus_get_devices(video, device); acpi_video_bus_start_devices(video); - status = acpi_install_notify_handler(device->handle, - ACPI_DEVICE_NOTIFY, - acpi_video_bus_notify, video); - if (ACPI_FAILURE(status)) { - printk(KERN_ERR PREFIX - "Error installing notify handler\n"); - error = -ENODEV; - goto err_stop_video; - } - video->input = input = input_allocate_device(); if (!input) { error = -ENOMEM; - goto err_uninstall_notify; + goto err_stop_video; } snprintf(video->phys, sizeof(video->phys), @@ -2218,9 +2207,6 @@ static int acpi_video_bus_add(struct acpi_device *device) err_free_input_dev: input_free_device(input); - err_uninstall_notify: - acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, - acpi_video_bus_notify); err_stop_video: acpi_video_bus_stop_devices(video); acpi_video_bus_put_devices(video); @@ -2235,7 +2221,6 @@ static int acpi_video_bus_add(struct acpi_device *device) static int acpi_video_bus_remove(struct acpi_device *device, int type) { - acpi_status status = 0; struct acpi_video_bus *video = NULL; @@ -2245,11 +2230,6 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type) video = acpi_driver_data(device); acpi_video_bus_stop_devices(video); - - status = acpi_remove_notify_handler(video->device->handle, - ACPI_DEVICE_NOTIFY, - acpi_video_bus_notify); - acpi_video_bus_put_devices(video); acpi_video_bus_remove_fs(device); -- cgit v0.10.2 From 700b6721cd1b891b67c2dcee046be12154a21fd6 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:16 +0000 Subject: fujitsu-laptop: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Tested by Tony on Fujitsu-Siemens Lifebook S6420 [FJNB1E6] with BIOS 1.18 (01/09/2009). Tested by Jonathan on Fujitsu S7020. Signed-off-by: Bjorn Helgaas Acked-By: Tony Vroon Tested-By: Tony Vroon Acked-by: Jonathan Woithe Tested-by: Jonathan Woithe Signed-off-by: Len Brown diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index 45940f3..10f8796 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -203,7 +203,7 @@ struct led_classdev kblamps_led = { static u32 dbg_level = 0x03; #endif -static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data); +static void acpi_fujitsu_notify(struct acpi_device *device, u32 event); /* Fujitsu ACPI interface function */ @@ -658,7 +658,6 @@ static struct dmi_system_id fujitsu_dmi_table[] = { static int acpi_fujitsu_add(struct acpi_device *device) { - acpi_status status; acpi_handle handle; int result = 0; int state = 0; @@ -673,20 +672,10 @@ static int acpi_fujitsu_add(struct acpi_device *device) sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); device->driver_data = fujitsu; - status = acpi_install_notify_handler(device->handle, - ACPI_DEVICE_NOTIFY, - acpi_fujitsu_notify, fujitsu); - - if (ACPI_FAILURE(status)) { - printk(KERN_ERR "Error installing notify handler\n"); - error = -ENODEV; - goto err_stop; - } - fujitsu->input = input = input_allocate_device(); if (!input) { error = -ENOMEM; - goto err_uninstall_notify; + goto err_stop; } snprintf(fujitsu->phys, sizeof(fujitsu->phys), @@ -743,9 +732,6 @@ static int acpi_fujitsu_add(struct acpi_device *device) end: err_free_input_dev: input_free_device(input); -err_uninstall_notify: - acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, - acpi_fujitsu_notify); err_stop: return result; @@ -753,7 +739,6 @@ err_stop: static int acpi_fujitsu_remove(struct acpi_device *device, int type) { - acpi_status status; struct fujitsu_t *fujitsu = NULL; if (!device || !acpi_driver_data(device)) @@ -761,10 +746,6 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) fujitsu = acpi_driver_data(device); - status = acpi_remove_notify_handler(fujitsu->acpi_handle, - ACPI_DEVICE_NOTIFY, - acpi_fujitsu_notify); - if (!device || !acpi_driver_data(device)) return -EINVAL; @@ -775,7 +756,7 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) /* Brightness notify */ -static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) +static void acpi_fujitsu_notify(struct acpi_device *device, u32 event) { struct input_dev *input; int keycode; @@ -829,8 +810,6 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) input_report_key(input, keycode, 0); input_sync(input); } - - return; } /* ACPI device for hotkey handling */ @@ -1107,6 +1086,7 @@ static struct acpi_driver acpi_fujitsu_driver = { .ops = { .add = acpi_fujitsu_add, .remove = acpi_fujitsu_remove, + .notify = acpi_fujitsu_notify, }, }; -- cgit v0.10.2 From b4ec0275464756f4fd4108b4a4ca7aff61358ad3 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:22 +0000 Subject: fujitsu-laptop: use .notify method instead of installing hotkey handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Tested by Tony on Fujitsu-Siemens Lifebook S6420 [FJNB1E6] with BIOS 1.18 (01/09/2009). Tested by Jonathan on Fujitsu S7020. Signed-off-by: Bjorn Helgaas Acked-By: Tony Vroon Tested-By: Tony Vroon Acked-by: Jonathan Woithe Tested-by: Jonathan Woithe Signed-off-by: Len Brown diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index 10f8796..218b9a1 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -174,8 +174,7 @@ struct fujitsu_hotkey_t { static struct fujitsu_hotkey_t *fujitsu_hotkey; -static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, - void *data); +static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event); #ifdef CONFIG_LEDS_CLASS static enum led_brightness logolamp_get(struct led_classdev *cdev); @@ -816,7 +815,6 @@ static void acpi_fujitsu_notify(struct acpi_device *device, u32 event) static int acpi_fujitsu_hotkey_add(struct acpi_device *device) { - acpi_status status; acpi_handle handle; int result = 0; int state = 0; @@ -833,17 +831,6 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); device->driver_data = fujitsu_hotkey; - status = acpi_install_notify_handler(device->handle, - ACPI_DEVICE_NOTIFY, - acpi_fujitsu_hotkey_notify, - fujitsu_hotkey); - - if (ACPI_FAILURE(status)) { - printk(KERN_ERR "Error installing notify handler\n"); - error = -ENODEV; - goto err_stop; - } - /* kfifo */ spin_lock_init(&fujitsu_hotkey->fifo_lock); fujitsu_hotkey->fifo = @@ -858,7 +845,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) fujitsu_hotkey->input = input = input_allocate_device(); if (!input) { error = -ENOMEM; - goto err_uninstall_notify; + goto err_free_fifo; } snprintf(fujitsu_hotkey->phys, sizeof(fujitsu_hotkey->phys), @@ -954,9 +941,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) end: err_free_input_dev: input_free_device(input); -err_uninstall_notify: - acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, - acpi_fujitsu_hotkey_notify); +err_free_fifo: kfifo_free(fujitsu_hotkey->fifo); err_stop: @@ -965,7 +950,6 @@ err_stop: static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) { - acpi_status status; struct fujitsu_hotkey_t *fujitsu_hotkey = NULL; if (!device || !acpi_driver_data(device)) @@ -973,10 +957,6 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) fujitsu_hotkey = acpi_driver_data(device); - status = acpi_remove_notify_handler(fujitsu_hotkey->acpi_handle, - ACPI_DEVICE_NOTIFY, - acpi_fujitsu_hotkey_notify); - fujitsu_hotkey->acpi_handle = NULL; kfifo_free(fujitsu_hotkey->fifo); @@ -984,8 +964,7 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) return 0; } -static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, - void *data) +static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event) { struct input_dev *input; int keycode, keycode_r; @@ -1068,8 +1047,6 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, input_sync(input); break; } - - return; } /* Initialization */ @@ -1102,6 +1079,7 @@ static struct acpi_driver acpi_fujitsu_hotkey_driver = { .ops = { .add = acpi_fujitsu_hotkey_add, .remove = acpi_fujitsu_hotkey_remove, + .notify = acpi_fujitsu_hotkey_notify, }, }; -- cgit v0.10.2 From cddd1f71d972a43c88f0ef91e1b71023539cd6e0 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:27 +0000 Subject: panasonic-laptop: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Signed-off-by: Bjorn Helgaas CC: Harald Welte Signed-off-by: Len Brown diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index a5ce4bc..1a11de0 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c @@ -176,6 +176,7 @@ enum SINF_BITS { SINF_NUM_BATTERIES = 0, static int acpi_pcc_hotkey_add(struct acpi_device *device); static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type); static int acpi_pcc_hotkey_resume(struct acpi_device *device); +static void acpi_pcc_hotkey_notify(struct acpi_device *device, u32 event); static const struct acpi_device_id pcc_device_ids[] = { { "MAT0012", 0}, @@ -194,6 +195,7 @@ static struct acpi_driver acpi_pcc_driver = { .add = acpi_pcc_hotkey_add, .remove = acpi_pcc_hotkey_remove, .resume = acpi_pcc_hotkey_resume, + .notify = acpi_pcc_hotkey_notify, }, }; @@ -527,9 +529,9 @@ static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc) return; } -static void acpi_pcc_hotkey_notify(acpi_handle handle, u32 event, void *data) +static void acpi_pcc_hotkey_notify(struct acpi_device *device, u32 event) { - struct pcc_acpi *pcc = (struct pcc_acpi *) data; + struct pcc_acpi *pcc = acpi_driver_data(device); switch (event) { case HKEY_NOTIFY: @@ -599,7 +601,6 @@ static int acpi_pcc_hotkey_resume(struct acpi_device *device) static int acpi_pcc_hotkey_add(struct acpi_device *device) { - acpi_status status; struct pcc_acpi *pcc; int num_sifr, result; @@ -640,22 +641,11 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) goto out_sinf; } - /* initialize hotkey input device */ - status = acpi_install_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, - acpi_pcc_hotkey_notify, pcc); - - if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, - "Error installing notify handler\n")); - result = -ENODEV; - goto out_input; - } - /* initialize backlight */ pcc->backlight = backlight_device_register("panasonic", NULL, pcc, &pcc_backlight_ops); if (IS_ERR(pcc->backlight)) - goto out_notify; + goto out_input; if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, @@ -680,9 +670,6 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) out_backlight: backlight_device_unregister(pcc->backlight); -out_notify: - acpi_remove_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, - acpi_pcc_hotkey_notify); out_input: input_unregister_device(pcc->input_dev); /* no need to input_free_device() since core input API refcount and @@ -723,9 +710,6 @@ static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type) backlight_device_unregister(pcc->backlight); - acpi_remove_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, - acpi_pcc_hotkey_notify); - input_unregister_device(pcc->input_dev); /* no need to input_free_device() since core input API refcount and * free()s the device */ -- cgit v0.10.2 From 8037d6e67709cf497134bbabd77b07dfc7c31fd6 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:32 +0000 Subject: sony-laptop: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Signed-off-by: Bjorn Helgaas CC: Mattia Dongili Signed-off-by: Len Brown diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index a90ec5c..d3c92d7 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c @@ -914,7 +914,7 @@ static struct sony_nc_event sony_127_events[] = { /* * ACPI callbacks */ -static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) +static void sony_nc_notify(struct acpi_device *device, u32 event) { u32 ev = event; @@ -933,7 +933,7 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) struct sony_nc_event *key_event; if (sony_call_snc_handle(key_handle, 0x200, &result)) { - dprintk("sony_acpi_notify, unable to decode" + dprintk("sony_nc_notify, unable to decode" " event 0x%.2x 0x%.2x\n", key_handle, ev); /* restore the original event */ @@ -968,7 +968,7 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) } else sony_laptop_report_input_event(ev); - dprintk("sony_acpi_notify, event: 0x%.2x\n", ev); + dprintk("sony_nc_notify, event: 0x%.2x\n", ev); acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, ev); } @@ -1276,15 +1276,6 @@ static int sony_nc_add(struct acpi_device *device) goto outwalk; } - status = acpi_install_notify_handler(sony_nc_acpi_handle, - ACPI_DEVICE_NOTIFY, - sony_acpi_notify, NULL); - if (ACPI_FAILURE(status)) { - printk(KERN_WARNING DRV_PFX "unable to install notify handler (%u)\n", status); - result = -ENODEV; - goto outinput; - } - if (acpi_video_backlight_support()) { printk(KERN_INFO DRV_PFX "brightness ignored, must be " "controlled by ACPI video driver\n"); @@ -1362,13 +1353,6 @@ static int sony_nc_add(struct acpi_device *device) if (sony_backlight_device) backlight_device_unregister(sony_backlight_device); - status = acpi_remove_notify_handler(sony_nc_acpi_handle, - ACPI_DEVICE_NOTIFY, - sony_acpi_notify); - if (ACPI_FAILURE(status)) - printk(KERN_WARNING DRV_PFX "unable to remove notify handler\n"); - - outinput: sony_laptop_remove_input(); outwalk: @@ -1378,7 +1362,6 @@ static int sony_nc_add(struct acpi_device *device) static int sony_nc_remove(struct acpi_device *device, int type) { - acpi_status status; struct sony_nc_value *item; if (sony_backlight_device) @@ -1386,12 +1369,6 @@ static int sony_nc_remove(struct acpi_device *device, int type) sony_nc_acpi_device = NULL; - status = acpi_remove_notify_handler(sony_nc_acpi_handle, - ACPI_DEVICE_NOTIFY, - sony_acpi_notify); - if (ACPI_FAILURE(status)) - printk(KERN_WARNING DRV_PFX "unable to remove notify handler\n"); - for (item = sony_nc_values; item->name; ++item) { device_remove_file(&sony_pf_device->dev, &item->devattr); } @@ -1425,6 +1402,7 @@ static struct acpi_driver sony_nc_driver = { .add = sony_nc_add, .remove = sony_nc_remove, .resume = sony_nc_resume, + .notify = sony_nc_notify, }, }; -- cgit v0.10.2 From f61bb93927fbc2933abe870813daba9d331aa121 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 7 Apr 2009 15:37:37 +0000 Subject: ACPI: WMI: use .notify method instead of installing handler directly This patch adds a .notify() method. The presence of .notify() causes Linux/ACPI to manage event handlers and notify handlers on our behalf, so we don't have to install and remove them ourselves. Signed-off-by: Bjorn Helgaas CC: Carlos Corbacho Signed-off-by: Len Brown diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 2f269e11..043b208 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -81,6 +81,7 @@ static struct wmi_block wmi_blocks; static int acpi_wmi_remove(struct acpi_device *device, int type); static int acpi_wmi_add(struct acpi_device *device); +static void acpi_wmi_notify(struct acpi_device *device, u32 event); static const struct acpi_device_id wmi_device_ids[] = { {"PNP0C14", 0}, @@ -96,6 +97,7 @@ static struct acpi_driver acpi_wmi_driver = { .ops = { .add = acpi_wmi_add, .remove = acpi_wmi_remove, + .notify = acpi_wmi_notify, }, }; @@ -643,12 +645,11 @@ acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address, } } -static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data) +static void acpi_wmi_notify(struct acpi_device *device, u32 event) { struct guid_block *block; struct wmi_block *wblock; struct list_head *p; - struct acpi_device *device = data; list_for_each(p, &wmi_blocks.list) { wblock = list_entry(p, struct wmi_block, list); @@ -669,9 +670,6 @@ static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data) static int acpi_wmi_remove(struct acpi_device *device, int type) { - acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, - acpi_wmi_notify); - acpi_remove_address_space_handler(device->handle, ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); @@ -683,13 +681,6 @@ static int __init acpi_wmi_add(struct acpi_device *device) acpi_status status; int result = 0; - status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, - acpi_wmi_notify, device); - if (ACPI_FAILURE(status)) { - printk(KERN_ERR PREFIX "Error installing notify handler\n"); - return -ENODEV; - } - status = acpi_install_address_space_handler(device->handle, ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler, -- cgit v0.10.2 From fdbdc7fc79c02ae4ede869d514179a2c65633d28 Mon Sep 17 00:00:00 2001 From: Len Brown Date: Tue, 7 Apr 2009 17:33:58 -0400 Subject: ACPICA: delete check for AML access to port 0x81-83 Sony laptops apparently write 4-bytes (rather than 1 byte) to debug port 0x80, which spews error messages: Denied AML access to port 0x00000080/4 (DMA1 0x0081-0x0083) [20090320] http://bugzilla.kernel.org/show_bug.cgi?id=13036 Signed-off-by: Len Brown diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index bd3c937..7737afb 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c @@ -90,7 +90,6 @@ static const struct acpi_port_info acpi_protected_ports[] = { {"PIT2", 0x0048, 0x004B, ACPI_OSI_WIN_XP}, {"RTC", 0x0070, 0x0071, ACPI_OSI_WIN_XP}, {"CMOS", 0x0074, 0x0076, ACPI_OSI_WIN_XP}, - {"DMA1", 0x0081, 0x0083, ACPI_OSI_WIN_XP}, {"DMA1L", 0x0087, 0x0087, ACPI_OSI_WIN_XP}, {"DMA2", 0x0089, 0x008B, ACPI_OSI_WIN_XP}, {"DMA2L", 0x008F, 0x008F, ACPI_OSI_WIN_XP}, -- cgit v0.10.2 From e4f6937222dbb61b8b8e62caca3d32e648b3b14b Mon Sep 17 00:00:00 2001 From: Venkatesh Pallipadi Date: Mon, 6 Apr 2009 11:26:07 -0700 Subject: ACPI x86: Cleanup acpi_cpufreq structures related to aperf/mperf Change structure name to make the code cleaner and simpler. No functionality change in this patch. Signed-off-by: Venkatesh Pallipadi Signed-off-by: Len Brown diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 19f6b9d..340bdbe 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -241,23 +241,23 @@ static u32 get_cur_val(const struct cpumask *mask) return cmd.val; } -struct perf_cur { +struct perf_pair { union { struct { u32 lo; u32 hi; } split; u64 whole; - } aperf_cur, mperf_cur; + } aperf, mperf; }; static long read_measured_perf_ctrs(void *_cur) { - struct perf_cur *cur = _cur; + struct perf_pair *cur = _cur; - rdmsr(MSR_IA32_APERF, cur->aperf_cur.split.lo, cur->aperf_cur.split.hi); - rdmsr(MSR_IA32_MPERF, cur->mperf_cur.split.lo, cur->mperf_cur.split.hi); + rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi); + rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi); wrmsr(MSR_IA32_APERF, 0, 0); wrmsr(MSR_IA32_MPERF, 0, 0); @@ -281,7 +281,7 @@ static long read_measured_perf_ctrs(void *_cur) static unsigned int get_measured_perf(struct cpufreq_policy *policy, unsigned int cpu) { - struct perf_cur cur; + struct perf_pair cur; unsigned int perf_percent; unsigned int retval; @@ -294,39 +294,37 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, * Get an approximate value. Return failure in case we cannot get * an approximate value. */ - if (unlikely(cur.aperf_cur.split.hi || cur.mperf_cur.split.hi)) { + if (unlikely(cur.aperf.split.hi || cur.mperf.split.hi)) { int shift_count; u32 h; - h = max_t(u32, cur.aperf_cur.split.hi, cur.mperf_cur.split.hi); + h = max_t(u32, cur.aperf.split.hi, cur.mperf.split.hi); shift_count = fls(h); - cur.aperf_cur.whole >>= shift_count; - cur.mperf_cur.whole >>= shift_count; + cur.aperf.whole >>= shift_count; + cur.mperf.whole >>= shift_count; } - if (((unsigned long)(-1) / 100) < cur.aperf_cur.split.lo) { + if (((unsigned long)(-1) / 100) < cur.aperf.split.lo) { int shift_count = 7; - cur.aperf_cur.split.lo >>= shift_count; - cur.mperf_cur.split.lo >>= shift_count; + cur.aperf.split.lo >>= shift_count; + cur.mperf.split.lo >>= shift_count; } - if (cur.aperf_cur.split.lo && cur.mperf_cur.split.lo) - perf_percent = (cur.aperf_cur.split.lo * 100) / - cur.mperf_cur.split.lo; + if (cur.aperf.split.lo && cur.mperf.split.lo) + perf_percent = (cur.aperf.split.lo * 100) / cur.mperf.split.lo; else perf_percent = 0; #else - if (unlikely(((unsigned long)(-1) / 100) < cur.aperf_cur.whole)) { + if (unlikely(((unsigned long)(-1) / 100) < cur.aperf.whole)) { int shift_count = 7; - cur.aperf_cur.whole >>= shift_count; - cur.mperf_cur.whole >>= shift_count; + cur.aperf.whole >>= shift_count; + cur.mperf.whole >>= shift_count; } - if (cur.aperf_cur.whole && cur.mperf_cur.whole) - perf_percent = (cur.aperf_cur.whole * 100) / - cur.mperf_cur.whole; + if (cur.aperf.whole && cur.mperf.whole) + perf_percent = (cur.aperf.whole * 100) / cur.mperf.whole; else perf_percent = 0; -- cgit v0.10.2 From 18b2646fe3babeb40b34a0c1751e0bf5adfdc64c Mon Sep 17 00:00:00 2001 From: Venkatesh Pallipadi Date: Mon, 6 Apr 2009 11:26:08 -0700 Subject: ACPI x86: Make aperf/mperf MSR access in acpi_cpufreq read_only Do not write zeroes to APERF and MPERF by ondemand governor. With this change, other users can share these MSRs for reads. Signed-off-by: Venkatesh Pallipadi Signed-off-by: Len Brown diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 340bdbe..9d3af38 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -68,6 +68,7 @@ struct acpi_cpufreq_data { unsigned int max_freq; unsigned int resume; unsigned int cpu_feature; + u64 saved_aperf, saved_mperf; }; static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data); @@ -259,9 +260,6 @@ static long read_measured_perf_ctrs(void *_cur) rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi); rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi); - wrmsr(MSR_IA32_APERF, 0, 0); - wrmsr(MSR_IA32_MPERF, 0, 0); - return 0; } @@ -281,13 +279,20 @@ static long read_measured_perf_ctrs(void *_cur) static unsigned int get_measured_perf(struct cpufreq_policy *policy, unsigned int cpu) { - struct perf_pair cur; + struct perf_pair readin, cur; unsigned int perf_percent; unsigned int retval; - if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur)) + if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin)) return 0; + cur.aperf.whole = readin.aperf.whole - + per_cpu(drv_data, cpu)->saved_aperf; + cur.mperf.whole = readin.mperf.whole - + per_cpu(drv_data, cpu)->saved_mperf; + per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole; + per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole; + #ifdef __i386__ /* * We dont want to do 64 bit divide with 32 bit kernel -- cgit v0.10.2 From db954b5898dd3ef3ef93f4144158ea8f97deb058 Mon Sep 17 00:00:00 2001 From: Venkatesh Pallipadi Date: Mon, 6 Apr 2009 18:51:29 -0700 Subject: x86 ACPI: Add support for Always Running APIC timer Add support for Always Running APIC timer, CPUID_0x6_EAX_Bit2. This bit means the APIC timer continues to run even when CPU is in deep C-states. The advantage is that we can use LAPIC timer on these CPUs always, and there is no need for "slow to read and program" external timers (HPET/PIT) and the timer broadcast logic and related code in C-state entry and exit. Signed-off-by: Venkatesh Pallipadi Acked-by: H. Peter Anvin Signed-off-by: Len Brown diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 0beba0d..bb83b1c 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -154,6 +154,7 @@ * CPUID levels like 0x6, 0xA etc */ #define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */ +#define X86_FEATURE_ARAT (7*32+ 1) /* Always Running APIC Timer */ /* Virtualization flags: Linux defined */ #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 098ec84..f287092 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -431,6 +431,12 @@ static void __cpuinit setup_APIC_timer(void) { struct clock_event_device *levt = &__get_cpu_var(lapic_events); + if (cpu_has(¤t_cpu_data, X86_FEATURE_ARAT)) { + lapic_clockevent.features &= ~CLOCK_EVT_FEAT_C3STOP; + /* Make LAPIC timer preferrable over percpu HPET */ + lapic_clockevent.rating = 150; + } + memcpy(levt, &lapic_clockevent, sizeof(*levt)); levt->cpumask = cpumask_of(smp_processor_id()); diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c index 8220ae6..c965e52 100644 --- a/arch/x86/kernel/cpu/addon_cpuid_features.c +++ b/arch/x86/kernel/cpu/addon_cpuid_features.c @@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { { X86_FEATURE_IDA, CR_EAX, 1, 0x00000006 }, + { X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006 }, { 0, 0, 0, 0 } }; diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 4e6e758..6fe1214 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -145,6 +145,9 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr, struct acpi_processor_power *pwr = &pr->power; u8 type = local_apic_timer_c2_ok ? ACPI_STATE_C3 : ACPI_STATE_C2; + if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT)) + return; + /* * Check, if one of the previous states already marked the lapic * unstable -- cgit v0.10.2 From bd4e6c18ae02a492094621072e540df02e866f61 Mon Sep 17 00:00:00 2001 From: Wim Van Sebroeck Date: Wed, 25 Mar 2009 19:20:10 +0000 Subject: [WATCHDOG] i6300esb.c: Cleanup Cleanup to keep checkpatch.pl happy. Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/i6300esb.c b/drivers/watchdog/i6300esb.c index 2dbe835..cfbb01c 100644 --- a/drivers/watchdog/i6300esb.c +++ b/drivers/watchdog/i6300esb.c @@ -52,10 +52,10 @@ #define ESB_LOCK_REG 0x68 /* WDT lock register */ /* Memory mapped registers */ -#define ESB_TIMER1_REG BASEADDR + 0x00 /* Timer1 value after each reset */ -#define ESB_TIMER2_REG BASEADDR + 0x04 /* Timer2 value after each reset */ -#define ESB_GINTSR_REG BASEADDR + 0x08 /* General Interrupt Status Register */ -#define ESB_RELOAD_REG BASEADDR + 0x0c /* Reload register */ +#define ESB_TIMER1_REG (BASEADDR + 0x00)/* Timer1 value after each reset */ +#define ESB_TIMER2_REG (BASEADDR + 0x04)/* Timer2 value after each reset */ +#define ESB_GINTSR_REG (BASEADDR + 0x08)/* General Interrupt Status Register */ +#define ESB_RELOAD_REG (BASEADDR + 0x0c)/* Reload register */ /* Lock register bits */ #define ESB_WDT_FUNC (0x01 << 2) /* Watchdog functionality */ @@ -143,7 +143,7 @@ static int esb_timer_stop(void) spin_unlock(&esb_lock); /* Returns 0 if the timer was disabled, non-zero otherwise */ - return (val & 0x01); + return val & 0x01; } static void esb_timer_keepalive(void) -- cgit v0.10.2 From 31838d9dac17dce6d68d985fd28c10d7a756dc4d Mon Sep 17 00:00:00 2001 From: Wim Van Sebroeck Date: Wed, 25 Mar 2009 19:14:45 +0000 Subject: [WATCHDOG] i6300esb.c: Fix the GETSTATUS and GETBOOTSTATUS ioctls. The WDIOC_GETSTATUS and WDIOC_GETBOOTSTATUS should return WDIOF_* flags (and not counter values, ...) Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/i6300esb.c b/drivers/watchdog/i6300esb.c index cfbb01c..8a0ef65 100644 --- a/drivers/watchdog/i6300esb.c +++ b/drivers/watchdog/i6300esb.c @@ -68,6 +68,7 @@ #define ESB_WDT_INTTYPE (0x11 << 0) /* Interrupt type on timer1 timeout */ /* Reload register bits */ +#define ESB_WDT_TIMEOUT (0x01 << 9) /* Watchdog timed out */ #define ESB_WDT_RELOAD (0x01 << 8) /* prevent timeout */ /* Magic constants */ @@ -87,7 +88,6 @@ static struct platform_device *esb_platform_device; /* 30 sec default heartbeat (1 < heartbeat < 2*1023) */ #define WATCHDOG_HEARTBEAT 30 static int heartbeat = WATCHDOG_HEARTBEAT; /* in seconds */ - module_param(heartbeat, int, 0); MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1 2 * 0x03ff) { + heartbeat = WATCHDOG_HEARTBEAT; printk(KERN_INFO PFX "heartbeat value must be 1 Date: Fri, 20 Feb 2009 19:44:59 +0100 Subject: [WATCHDOG] orion5x_wdt: Add shutdown callback, use watchdog ping function * Added a callback to disable the watchdog on shutdown. * Use a separate ping function to reduce the number of register accesses if the watchdog is already enabled and just needs to be reloaded. * Minor cleanup of function names. Signed-off-by: Thomas Reitmayr Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/orion5x_wdt.c b/drivers/watchdog/orion5x_wdt.c index e81441f..7529616 100644 --- a/drivers/watchdog/orion5x_wdt.c +++ b/drivers/watchdog/orion5x_wdt.c @@ -42,7 +42,17 @@ static unsigned int wdt_tclk; static unsigned long wdt_status; static spinlock_t wdt_lock; -static void wdt_enable(void) +static void orion5x_wdt_ping(void) +{ + spin_lock(&wdt_lock); + + /* Reload watchdog duration */ + writel(wdt_tclk * heartbeat, WDT_VAL); + + spin_unlock(&wdt_lock); +} + +static void orion5x_wdt_enable(void) { u32 reg; @@ -69,7 +79,7 @@ static void wdt_enable(void) spin_unlock(&wdt_lock); } -static void wdt_disable(void) +static void orion5x_wdt_disable(void) { u32 reg; @@ -101,7 +111,7 @@ static int orion5x_wdt_open(struct inode *inode, struct file *file) if (test_and_set_bit(WDT_IN_USE, &wdt_status)) return -EBUSY; clear_bit(WDT_OK_TO_CLOSE, &wdt_status); - wdt_enable(); + orion5x_wdt_enable(); return nonseekable_open(inode, file); } @@ -122,18 +132,28 @@ static ssize_t orion5x_wdt_write(struct file *file, const char *data, set_bit(WDT_OK_TO_CLOSE, &wdt_status); } } - wdt_enable(); + orion5x_wdt_ping(); } return len; } -static struct watchdog_info ident = { +static int orion5x_wdt_settimeout(int new_time) +{ + if ((new_time <= 0) || (new_time > wdt_max_duration)) + return -EINVAL; + + /* Set new watchdog time to be used when + * orion5x_wdt_enable() or orion5x_wdt_ping() is called. */ + heartbeat = new_time; + return 0; +} + +static const struct watchdog_info ident = { .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, .identity = "Orion5x Watchdog", }; - static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -152,7 +172,7 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, break; case WDIOC_KEEPALIVE: - wdt_enable(); + orion5x_wdt_ping(); ret = 0; break; @@ -161,12 +181,11 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, if (ret) break; - if (time <= 0 || time > wdt_max_duration) { + if (orion5x_wdt_settimeout(time)) { ret = -EINVAL; break; } - heartbeat = time; - wdt_enable(); + orion5x_wdt_ping(); /* Fall through */ case WDIOC_GETTIMEOUT: @@ -187,7 +206,7 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, static int orion5x_wdt_release(struct inode *inode, struct file *file) { if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) - wdt_disable(); + orion5x_wdt_disable(); else printk(KERN_CRIT "WATCHDOG: Device closed unexpectedly - " "timer will not stop\n"); @@ -230,7 +249,7 @@ static int __devinit orion5x_wdt_probe(struct platform_device *pdev) orion5x_wdt_miscdev.parent = &pdev->dev; wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk; - if (heartbeat <= 0 || heartbeat > wdt_max_duration) + if (orion5x_wdt_settimeout(heartbeat)) heartbeat = wdt_max_duration; ret = misc_register(&orion5x_wdt_miscdev); @@ -247,7 +266,7 @@ static int __devexit orion5x_wdt_remove(struct platform_device *pdev) int ret; if (test_bit(WDT_IN_USE, &wdt_status)) { - wdt_disable(); + orion5x_wdt_disable(); clear_bit(WDT_IN_USE, &wdt_status); } @@ -258,9 +277,16 @@ static int __devexit orion5x_wdt_remove(struct platform_device *pdev) return ret; } +static void orion5x_wdt_shutdown(struct platform_device *pdev) +{ + if (test_bit(WDT_IN_USE, &wdt_status)) + orion5x_wdt_disable(); +} + static struct platform_driver orion5x_wdt_driver = { .probe = orion5x_wdt_probe, .remove = __devexit_p(orion5x_wdt_remove), + .shutdown = orion5x_wdt_shutdown, .driver = { .owner = THIS_MODULE, .name = "orion5x_wdt", @@ -285,10 +311,11 @@ MODULE_AUTHOR("Sylver Bruneau "); MODULE_DESCRIPTION("Orion5x Processor Watchdog"); module_param(heartbeat, int, 0); -MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds"); +MODULE_PARM_DESC(heartbeat, "Initial watchdog heartbeat in seconds"); module_param(nowayout, int, 0); -MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); MODULE_LICENSE("GPL"); MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); -- cgit v0.10.2 From b8f75b0d79671cb53d94e4ddd1db89502a7dc90e Mon Sep 17 00:00:00 2001 From: Paulius Zaleckas Date: Tue, 31 Mar 2009 15:46:57 +0300 Subject: [WATCHDOG] remove ARM26 sections Removes ARM26 sections from Kconfig and Makefile, because ARM26 is long gone. Signed-off-by: Paulius Zaleckas Acked-by: Russell King Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 6302414..5eb8f21 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -240,8 +240,6 @@ config ORION5X_WATCHDOG To compile this driver as a module, choose M here: the module will be called orion5x_wdt. -# ARM26 Architecture - # AVR32 Architecture config AT32AP700X_WDT diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index 806b3eb..7f8c56b 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -42,8 +42,6 @@ obj-$(CONFIG_IOP_WATCHDOG) += iop_wdt.o obj-$(CONFIG_DAVINCI_WATCHDOG) += davinci_wdt.o obj-$(CONFIG_ORION5X_WATCHDOG) += orion5x_wdt.o -# ARM26 Architecture - # AVR32 Architecture obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o -- cgit v0.10.2 From 47dec7c6c48a12bdacdf5f935f10f44e66d9c98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 28 Mar 2009 00:26:26 +0100 Subject: [WATCHDOG] at91rm9200_wdt.c: move probe function to .devinit.text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A pointer to at91wdt_probe is passed to the core via platform_driver_register and so the function must not disappear when the .init sections are discarded. Otherwise (if also having HOTPLUG=y) unbinding and binding a device to the driver via sysfs will result in an oops as does a device being registered late. An alternative to this patch is using platform_driver_probe instead of platform_driver_register plus removing the pointer to the probe function from the struct platform_driver. Signed-off-by: Uwe Kleine-König Cc: Andrew Victor Cc: Russell King Cc: Jean-Christophe PLAGNIOL-VILLARD Cc: Ilpo Jarvinen Cc: Andrew Morton Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/at91rm9200_wdt.c b/drivers/watchdog/at91rm9200_wdt.c index e35d545..29e52c2 100644 --- a/drivers/watchdog/at91rm9200_wdt.c +++ b/drivers/watchdog/at91rm9200_wdt.c @@ -197,7 +197,7 @@ static struct miscdevice at91wdt_miscdev = { .fops = &at91wdt_fops, }; -static int __init at91wdt_probe(struct platform_device *pdev) +static int __devinit at91wdt_probe(struct platform_device *pdev) { int res; @@ -214,7 +214,7 @@ static int __init at91wdt_probe(struct platform_device *pdev) return 0; } -static int __exit at91wdt_remove(struct platform_device *pdev) +static int __devexit at91wdt_remove(struct platform_device *pdev) { int res; @@ -252,7 +252,7 @@ static int at91wdt_resume(struct platform_device *pdev) static struct platform_driver at91wdt_driver = { .probe = at91wdt_probe, - .remove = __exit_p(at91wdt_remove), + .remove = __devexit_p(at91wdt_remove), .shutdown = at91wdt_shutdown, .suspend = at91wdt_suspend, .resume = at91wdt_resume, -- cgit v0.10.2 From c98d58e00d8562520c9a69e688f007b860faebaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 28 Mar 2009 00:26:45 +0100 Subject: [WATCHDOG] ks8695_wdt.c: move probe function to .devinit.text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A pointer to ks8695wdt_probe is passed to the core via platform_driver_register and so the function must not disappear when the .init sections are discarded. Otherwise (if also having HOTPLUG=y) unbinding and binding a device to the driver via sysfs will result in an oops as does a device being registered late. An alternative to this patch is using platform_driver_probe instead of platform_driver_register plus removing the pointer to the probe function from the struct platform_driver. Signed-off-by: Uwe Kleine-König Cc: Alexey Dobriyan Cc: Alan Cox Cc: Andrew Morton Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/ks8695_wdt.c b/drivers/watchdog/ks8695_wdt.c index 74c92d3..ae38321 100644 --- a/drivers/watchdog/ks8695_wdt.c +++ b/drivers/watchdog/ks8695_wdt.c @@ -221,7 +221,7 @@ static struct miscdevice ks8695wdt_miscdev = { .fops = &ks8695wdt_fops, }; -static int __init ks8695wdt_probe(struct platform_device *pdev) +static int __devinit ks8695wdt_probe(struct platform_device *pdev) { int res; @@ -238,7 +238,7 @@ static int __init ks8695wdt_probe(struct platform_device *pdev) return 0; } -static int __exit ks8695wdt_remove(struct platform_device *pdev) +static int __devexit ks8695wdt_remove(struct platform_device *pdev) { int res; @@ -276,7 +276,7 @@ static int ks8695wdt_resume(struct platform_device *pdev) static struct platform_driver ks8695wdt_driver = { .probe = ks8695wdt_probe, - .remove = __exit_p(ks8695wdt_remove), + .remove = __devexit_p(ks8695wdt_remove), .shutdown = ks8695wdt_shutdown, .suspend = ks8695wdt_suspend, .resume = ks8695wdt_resume, -- cgit v0.10.2 From 0e3912c75f42986c17d955542247bf04c6eef738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 28 Mar 2009 00:26:56 +0100 Subject: [WATCHDOG] omap_wdt.c: move probe function to .devinit.text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A pointer to omap_wdt_probe is passed to the core via platform_driver_register and so the function must not disappear when the .init sections are discarded. Otherwise (if also having HOTPLUG=y) unbinding and binding a device to the driver via sysfs will result in an oops as does a device being registered late. An alternative to this patch is using platform_driver_probe instead of platform_driver_register plus removing the pointer to the probe function from the struct platform_driver. Signed-off-by: Uwe Kleine-König Cc: Alan Cox Cc: Felipe Balbi Cc: George G. Davis Cc: Andrew Morton Signed-off-by: Wim Van Sebroeck diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index aa5ad6e..f271385 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -258,7 +258,7 @@ static const struct file_operations omap_wdt_fops = { .release = omap_wdt_release, }; -static int __init omap_wdt_probe(struct platform_device *pdev) +static int __devinit omap_wdt_probe(struct platform_device *pdev) { struct resource *res, *mem; struct omap_wdt_dev *wdev; @@ -367,7 +367,7 @@ static void omap_wdt_shutdown(struct platform_device *pdev) omap_wdt_disable(wdev); } -static int omap_wdt_remove(struct platform_device *pdev) +static int __devexit omap_wdt_remove(struct platform_device *pdev) { struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -426,7 +426,7 @@ static int omap_wdt_resume(struct platform_device *pdev) static struct platform_driver omap_wdt_driver = { .probe = omap_wdt_probe, - .remove = omap_wdt_remove, + .remove = __devexit_p(omap_wdt_remove), .shutdown = omap_wdt_shutdown, .suspend = omap_wdt_suspend, .resume = omap_wdt_resume, -- cgit v0.10.2 From 59cc1dd97ca9ac0363ef2f770901fbd86e2b970a Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Tue, 7 Apr 2009 23:53:26 -0700 Subject: Input: i8042 - add HP DV9700 to the noloop list Reported-by: Kenneth Crudup Signed-off-by: Dmitry Torokhov diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 6fa2def..83ed2d5 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -151,6 +151,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { DMI_MATCH(DMI_PRODUCT_VERSION, "01"), }, }, + { + .ident = "HP DV9700", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), + }, + }, { } }; -- cgit v0.10.2 From 0ce49d6da993adf8b17b7f3ed9805ade14a6a6f3 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 8 Apr 2009 01:22:36 -0700 Subject: qla1280: Fix off-by-some error in firmware loading. We were calculating the wrong address for the start of the data. Signed-off-by: David Woodhouse Tested-by: Jeremy Higdon diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 351b56c..d030db9 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c @@ -1663,7 +1663,7 @@ qla1280_load_firmware_pio(struct scsi_qla_host *ha) /* Load RISC code. */ risc_address = ha->fwstart; - fw_data = (const __le16 *)&fw->data[4]; + fw_data = (const __le16 *)&fw->data[6]; risc_code_size = (fw->size - 6) / 2; for (i = 0; i < risc_code_size; i++) { @@ -1722,7 +1722,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha) /* Load RISC code. */ risc_address = ha->fwstart; - fw_data = (const __le16 *)&fw->data[4]; + fw_data = (const __le16 *)&fw->data[6]; risc_code_size = (fw->size - 6) / 2; dprintk(1, "%s: DMA RISC code (%i) words\n", -- cgit v0.10.2 From f876d346e3807647b1de411de6a86c44821896ca Mon Sep 17 00:00:00 2001 From: Tetsuo Handa Date: Wed, 8 Apr 2009 14:05:43 +0900 Subject: tracing: append a comma to INIT_FTRACE_GRAPH Impact: dont break future extensions of INIT_TASK While not a problem right now, due to lack of a comma, build fails if elements are appended to INIT_TASK() macro in development code: arch/x86/kernel/init_task.c:33: error: request for member `XXXXXXXXXX' in something not a structure or union arch/x86/kernel/init_task.c:33: error: initializer element is not constant arch/x86/kernel/init_task.c:33: error: (near initialization for `init_task.ret_stack') make[1]: *** [arch/x86/kernel/init_task.o] Error 1 make: *** [arch/x86/kernel] Error 2 Signed-off-by: Tetsuo Handa Cc: srostedt@redhat.com LKML-Reference: <200904080505.n3855hcn017109@www262.sakura.ne.jp> Signed-off-by: Ingo Molnar diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index da5405d..ff112a8 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -357,7 +357,7 @@ struct ftrace_graph_ret { #ifdef CONFIG_FUNCTION_GRAPH_TRACER /* for init task */ -#define INIT_FTRACE_GRAPH .ret_stack = NULL +#define INIT_FTRACE_GRAPH .ret_stack = NULL, /* * Stack of return addresses for functions -- cgit v0.10.2 From 6bbc0b08db0750c2564578bd1be909bc8f7dee1a Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 00:54:27 -0700 Subject: sparc64: get_cells() can't be marked __init Signed-off-by: David S. Miller diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index b4a12c9..27381f1 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c @@ -99,8 +99,7 @@ static inline u64 of_read_addr(const u32 *cell, int size) return r; } -static void __init get_cells(struct device_node *dp, - int *addrc, int *sizec) +static void get_cells(struct device_node *dp, int *addrc, int *sizec) { if (addrc) *addrc = of_n_addr_cells(dp); -- cgit v0.10.2 From 19ab6db66ce1b32de54ecb474f16ade3247f8323 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 00:47:44 -0700 Subject: sparc64: Fix section mismatch warnings in power driver. Signed-off-by: David S. Miller diff --git a/arch/sparc/kernel/power.c b/arch/sparc/kernel/power.c index ae88f06..e2a045c 100644 --- a/arch/sparc/kernel/power.c +++ b/arch/sparc/kernel/power.c @@ -23,7 +23,7 @@ static irqreturn_t power_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static int __init has_button_interrupt(unsigned int irq, struct device_node *dp) +static int __devinit has_button_interrupt(unsigned int irq, struct device_node *dp) { if (irq == 0xffffffff) return 0; -- cgit v0.10.2 From 9a2ed5cc9ef6cb60abd3ea66d7be549d8023581a Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 01:03:58 -0700 Subject: sparc64: Fix section mismatch warnings in PCI controller drivers. Signed-off-by: David S. Miller diff --git a/arch/sparc/kernel/pci_fire.c b/arch/sparc/kernel/pci_fire.c index 9462b68..d53f45b 100644 --- a/arch/sparc/kernel/pci_fire.c +++ b/arch/sparc/kernel/pci_fire.c @@ -409,8 +409,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm) upa_writeq(~(u64)0, pbm->pbm_regs + FIRE_PEC_IENAB); } -static int __init pci_fire_pbm_init(struct pci_pbm_info *pbm, - struct of_device *op, u32 portid) +static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm, + struct of_device *op, u32 portid) { const struct linux_prom64_registers *regs; struct device_node *dp = op->node; diff --git a/arch/sparc/kernel/pci_psycho.c b/arch/sparc/kernel/pci_psycho.c index 3b34344..142b9d6 100644 --- a/arch/sparc/kernel/pci_psycho.c +++ b/arch/sparc/kernel/pci_psycho.c @@ -365,8 +365,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm) pci_config_write8(addr, 64); } -static void __init psycho_scan_bus(struct pci_pbm_info *pbm, - struct device *parent) +static void __devinit psycho_scan_bus(struct pci_pbm_info *pbm, + struct device *parent) { pbm_config_busmastering(pbm); pbm->is_66mhz_capable = 0; @@ -482,8 +482,8 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm, #define PSYCHO_MEMSPACE_B 0x180000000UL #define PSYCHO_MEMSPACE_SIZE 0x07fffffffUL -static void __init psycho_pbm_init(struct pci_pbm_info *pbm, - struct of_device *op, int is_pbm_a) +static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm, + struct of_device *op, int is_pbm_a) { psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO); psycho_pbm_strbuf_init(pbm, is_pbm_a); diff --git a/arch/sparc/kernel/pci_sabre.c b/arch/sparc/kernel/pci_sabre.c index 713257b..ba6fbeb 100644 --- a/arch/sparc/kernel/pci_sabre.c +++ b/arch/sparc/kernel/pci_sabre.c @@ -402,8 +402,8 @@ static void apb_init(struct pci_bus *sabre_bus) } } -static void __init sabre_scan_bus(struct pci_pbm_info *pbm, - struct device *parent) +static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm, + struct device *parent) { static int once; @@ -442,8 +442,8 @@ static void __init sabre_scan_bus(struct pci_pbm_info *pbm, sabre_register_error_handlers(pbm); } -static void __init sabre_pbm_init(struct pci_pbm_info *pbm, - struct of_device *op) +static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm, + struct of_device *op) { psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE); pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 0ef0ab3..5db5ebe 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -545,8 +545,8 @@ static const struct dma_ops sun4v_dma_ops = { .sync_sg_for_cpu = dma_4v_sync_sg_for_cpu, }; -static void __init pci_sun4v_scan_bus(struct pci_pbm_info *pbm, - struct device *parent) +static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm, + struct device *parent) { struct property *prop; struct device_node *dp; @@ -559,8 +559,8 @@ static void __init pci_sun4v_scan_bus(struct pci_pbm_info *pbm, /* XXX register error interrupt handlers XXX */ } -static unsigned long __init probe_existing_entries(struct pci_pbm_info *pbm, - struct iommu *iommu) +static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm, + struct iommu *iommu) { struct iommu_arena *arena = &iommu->arena; unsigned long i, cnt = 0; @@ -587,7 +587,7 @@ static unsigned long __init probe_existing_entries(struct pci_pbm_info *pbm, return cnt; } -static int __init pci_sun4v_iommu_init(struct pci_pbm_info *pbm) +static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm) { static const u32 vdma_default[] = { 0x80000000, 0x80000000 }; struct iommu *iommu = pbm->iommu; @@ -889,8 +889,8 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm) } #endif /* !(CONFIG_PCI_MSI) */ -static int __init pci_sun4v_pbm_init(struct pci_pbm_info *pbm, - struct of_device *op, u32 devhandle) +static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm, + struct of_device *op, u32 devhandle) { struct device_node *dp = op->node; int err; diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 2c8dfeb..c30dc9a 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -70,8 +70,8 @@ extern struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; #define MAX_BANKS 32 -static struct linux_prom64_registers pavail[MAX_BANKS] __initdata; -static int pavail_ents __initdata; +static struct linux_prom64_registers pavail[MAX_BANKS] __devinitdata; +static int pavail_ents __devinitdata; static int cmp_p64(const void *a, const void *b) { @@ -1841,7 +1841,7 @@ void __init paging_init(void) printk("Booting Linux...\n"); } -int __init page_in_phys_avail(unsigned long paddr) +int __devinit page_in_phys_avail(unsigned long paddr) { int i; -- cgit v0.10.2 From 7816238a539bf56311f04e7ff17076f66d5c902a Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 00:45:51 -0700 Subject: sparc: Fix section mismatch warnings in cs4231 sound driver. Signed-off-by: David S. Miller diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index 7d93fa7..8d13d93 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -703,7 +703,7 @@ static int snd_cs4231_timer_stop(struct snd_timer *timer) return 0; } -static void __init snd_cs4231_init(struct snd_cs4231 *chip) +static void __devinit snd_cs4231_init(struct snd_cs4231 *chip) { unsigned long flags; @@ -1020,7 +1020,7 @@ static snd_pcm_uframes_t snd_cs4231_capture_pointer( return bytes_to_frames(substream->runtime, ptr); } -static int __init snd_cs4231_probe(struct snd_cs4231 *chip) +static int __devinit snd_cs4231_probe(struct snd_cs4231 *chip) { unsigned long flags; int i; @@ -1219,7 +1219,7 @@ static struct snd_pcm_ops snd_cs4231_capture_ops = { .pointer = snd_cs4231_capture_pointer, }; -static int __init snd_cs4231_pcm(struct snd_card *card) +static int __devinit snd_cs4231_pcm(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; struct snd_pcm *pcm; @@ -1248,7 +1248,7 @@ static int __init snd_cs4231_pcm(struct snd_card *card) return 0; } -static int __init snd_cs4231_timer(struct snd_card *card) +static int __devinit snd_cs4231_timer(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; struct snd_timer *timer; @@ -1499,7 +1499,7 @@ static int snd_cs4231_put_double(struct snd_kcontrol *kcontrol, .private_value = (left_reg) | ((right_reg) << 8) | ((shift_left) << 16) | \ ((shift_right) << 19) | ((mask) << 24) | ((invert) << 22) } -static struct snd_kcontrol_new snd_cs4231_controls[] __initdata = { +static struct snd_kcontrol_new snd_cs4231_controls[] __devinitdata = { CS4231_DOUBLE("PCM Playback Switch", 0, CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 7, 7, 1, 1), CS4231_DOUBLE("PCM Playback Volume", 0, CS4231_LEFT_OUTPUT, @@ -1538,7 +1538,7 @@ CS4231_SINGLE("Line Out Switch", 0, CS4231_PIN_CTRL, 6, 1, 1), CS4231_SINGLE("Headphone Out Switch", 0, CS4231_PIN_CTRL, 7, 1, 1) }; -static int __init snd_cs4231_mixer(struct snd_card *card) +static int __devinit snd_cs4231_mixer(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; int err, idx; @@ -1559,7 +1559,7 @@ static int __init snd_cs4231_mixer(struct snd_card *card) static int dev; -static int __init cs4231_attach_begin(struct snd_card **rcard) +static int __devinit cs4231_attach_begin(struct snd_card **rcard) { struct snd_card *card; struct snd_cs4231 *chip; @@ -1590,7 +1590,7 @@ static int __init cs4231_attach_begin(struct snd_card **rcard) return 0; } -static int __init cs4231_attach_finish(struct snd_card *card) +static int __devinit cs4231_attach_finish(struct snd_card *card) { struct snd_cs4231 *chip = card->private_data; int err; @@ -1794,9 +1794,9 @@ static struct snd_device_ops snd_cs4231_sbus_dev_ops = { .dev_free = snd_cs4231_sbus_dev_free, }; -static int __init snd_cs4231_sbus_create(struct snd_card *card, - struct of_device *op, - int dev) +static int __devinit snd_cs4231_sbus_create(struct snd_card *card, + struct of_device *op, + int dev) { struct snd_cs4231 *chip = card->private_data; int err; @@ -1960,9 +1960,9 @@ static struct snd_device_ops snd_cs4231_ebus_dev_ops = { .dev_free = snd_cs4231_ebus_dev_free, }; -static int __init snd_cs4231_ebus_create(struct snd_card *card, - struct of_device *op, - int dev) +static int __devinit snd_cs4231_ebus_create(struct snd_card *card, + struct of_device *op, + int dev) { struct snd_cs4231 *chip = card->private_data; int err; -- cgit v0.10.2 From f5d378ace9a5bd08cef344df096ea0c871e99c18 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 01:08:09 -0700 Subject: serial: sunsu: sunsu_kbd_ms_init needs to be __devinit Signed-off-by: David S. Miller diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index a4dc79b1..47c6837 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c @@ -1178,7 +1178,7 @@ static struct uart_driver sunsu_reg = { .major = TTY_MAJOR, }; -static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up) +static int __devinit sunsu_kbd_ms_init(struct uart_sunsu_port *up) { int quot, baud; #ifdef CONFIG_SERIO -- cgit v0.10.2 From 01c4538158051768ecb7953396d10af8ae8a2518 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Tue, 7 Apr 2009 01:05:22 -0700 Subject: sparc64: add_node_ranges() must be __init Signed-off-by: David S. Miller diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index c30dc9a..f26a352 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -968,7 +968,7 @@ int of_node_to_nid(struct device_node *dp) return nid; } -static void add_node_ranges(void) +static void __init add_node_ranges(void) { int i; -- cgit v0.10.2 From 018ef96969098487ea3fdabd904d775a4cd93975 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 8 Apr 2009 03:55:30 -0700 Subject: sparc: Hook up sys_preadv and sys_pwritev Signed-off-by: David S. Miller diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index 031f038..b8eb71e 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h @@ -392,8 +392,10 @@ #define __NR_pipe2 321 #define __NR_inotify_init1 322 #define __NR_accept4 323 +#define __NR_preadv 324 +#define __NR_pwritev 325 -#define NR_SYSCALLS 324 +#define NR_SYSCALLS 326 #ifdef __32bit_syscall_numbers__ /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index dccc95d..00ec3b1 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -81,4 +81,4 @@ sys_call_table: /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 -/*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 +/*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv, sys_pwritev diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index a8000b1..82b5bf8 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -82,7 +82,7 @@ sys_call_table32: .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 -/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 +/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv, compat_sys_pwritev #endif /* CONFIG_COMPAT */ @@ -156,4 +156,4 @@ sys_call_table: .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 -/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 +/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv, sys_pwritev -- cgit v0.10.2 From aa07573b2bd0fee5a7537cb663fbb2de60278801 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Wed, 8 Apr 2009 14:12:47 +0200 Subject: ide: Fix host drivers that need IRQF_SHARED commit 255115fb35f80735c21a1cbe9809e9795a3af26e ("ide: allow host drivers to specify IRQ flags") added irq_flags fields to struct ide_port_info and struct ide_host. Drivers can now set ide_port_info.irq_flags = IRQF_SHARED, while init_irq() passes ide_host.irq_flags to request_irq(). Unfortunately ide_host.irq_flags is never set, causing (on ARAnyM): | Uniform Multi-Platform E-IDE driver | ide: Falcon IDE controller | Probing IDE interface ide0... | hda: Sarge m68k, ATA DISK drive | init_irq: sa = 0 | ide0: disabled, unable to get IRQ 15 | ide0: failed to initialize IDE interface | ide0: disabling port Solve this by copying ide_port_info.irq_flags to ide_host.irq_flags in ide_host_alloc(). This bug probably affects the following IDE host drivers: - buddha - delkin_cb - falconide - gayle - ide-cs - macide - q40ide - scc_pata - sgiioc4 Signed-off-by: Geert Uytterhoeven Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index d8c1c3e..c1ef8c8 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1314,6 +1314,7 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws) host->get_lock = d->get_lock; host->release_lock = d->release_lock; host->host_flags = d->host_flags; + host->irq_flags = d->irq_flags; } return host; -- cgit v0.10.2 From d18812070efc658267f7573eec5ce7810128bfeb Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Wed, 8 Apr 2009 14:12:48 +0200 Subject: ide: falconide/q40ide - Use __ide_mm_{in,out}sw() for data Both of commits f94116aeec7a299640dd692128e1d22178affa8d ("ide: cleanup ") and 15a453a955f89f6545118770c669b52e925368bd ("ide: include only when needed") break falconide: | Uniform Multi-Platform E-IDE driver | ide: Falcon IDE controller | Probing IDE interface ide0... | hda: Sarge m68k, ATA DISK drive | ide0 at 0xfff00000 on irq 15 (serialized) | ide-gd driver 1.18 | hda: max request size: 128KiB | hda: 2118816 sectors (1084 MB) w/256KiB Cache, CHS=2102/16/63 | hda:<4>hda: lost interrupt This happens because falconide relies on {in,out}sw() being redefined in , as included by , which is no longer the case. Use __ide_mm_{in,out}sw() from instead, just like ide_{in,out}put_data() do. The same problem seems to exist in q40ide. Signed-off-by: Geert Uytterhoeven Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c index afa2af9..0e2df67 100644 --- a/drivers/ide/falconide.c +++ b/drivers/ide/falconide.c @@ -20,6 +20,7 @@ #include #include #include +#include #define DRV_NAME "falconide" @@ -67,8 +68,10 @@ static void falconide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, { unsigned long data_addr = drive->hwif->io_ports.data_addr; - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) - return insw(data_addr, buf, (len + 1) / 2); + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { + __ide_mm_insw(data_addr, buf, (len + 1) / 2); + return; + } raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2); } @@ -78,8 +81,10 @@ static void falconide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, { unsigned long data_addr = drive->hwif->io_ports.data_addr; - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) - return outsw(data_addr, buf, (len + 1) / 2); + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { + __ide_mm_outsw(data_addr, buf, (len + 1) / 2); + return; + } raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2); } diff --git a/drivers/ide/q40ide.c b/drivers/ide/q40ide.c index d007e7f..c793466 100644 --- a/drivers/ide/q40ide.c +++ b/drivers/ide/q40ide.c @@ -16,6 +16,8 @@ #include #include +#include + /* * Bases of the IDE interfaces */ @@ -77,8 +79,10 @@ static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, { unsigned long data_addr = drive->hwif->io_ports.data_addr; - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) - return insw(data_addr, buf, (len + 1) / 2); + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { + __ide_mm_insw(data_addr, buf, (len + 1) / 2); + return; + } raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2); } @@ -88,8 +92,10 @@ static void q40ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, { unsigned long data_addr = drive->hwif->io_ports.data_addr; - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) - return outsw(data_addr, buf, (len + 1) / 2); + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { + __ide_mm_outsw(data_addr, buf, (len + 1) / 2); + return; + } raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2); } -- cgit v0.10.2 From edafcf73dca2f9531c78eec130df84a8c9654b3b Mon Sep 17 00:00:00 2001 From: Grant Grundler Date: Wed, 8 Apr 2009 14:12:49 +0200 Subject: ide: remove wmb() from ide-dma-sff.c and scc_pata.c This patch: o replaces "mask" variable in ide_dma_end() with #define. o removes use of wmb() in ide-dma-sff.c and scc_pata.c. o is not tested - I don't have (or want) the HW. Signed-off-by: Grant Grundler Cc: KOBAYASHI Yoshitake Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-dma-sff.c b/drivers/ide/ide-dma-sff.c index 16fc46e..e4cdf78 100644 --- a/drivers/ide/ide-dma-sff.c +++ b/drivers/ide/ide-dma-sff.c @@ -277,8 +277,6 @@ void ide_dma_start(ide_drive_t *drive) dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD); outb(dma_cmd | ATA_DMA_START, hwif->dma_base + ATA_DMA_CMD); } - - wmb(); } EXPORT_SYMBOL_GPL(ide_dma_start); @@ -286,7 +284,7 @@ EXPORT_SYMBOL_GPL(ide_dma_start); int ide_dma_end(ide_drive_t *drive) { ide_hwif_t *hwif = drive->hwif; - u8 dma_stat = 0, dma_cmd = 0, mask; + u8 dma_stat = 0, dma_cmd = 0; /* stop DMA */ if (hwif->host_flags & IDE_HFLAG_MMIO) { @@ -304,11 +302,10 @@ int ide_dma_end(ide_drive_t *drive) /* clear INTR & ERROR bits */ ide_dma_sff_write_status(hwif, dma_stat | ATA_DMA_ERR | ATA_DMA_INTR); - wmb(); +#define CHECK_DMA_MASK (ATA_DMA_ACTIVE | ATA_DMA_ERR | ATA_DMA_INTR) /* verify good DMA status */ - mask = ATA_DMA_ACTIVE | ATA_DMA_ERR | ATA_DMA_INTR; - if ((dma_stat & mask) != ATA_DMA_INTR) + if ((dma_stat & CHECK_DMA_MASK) != ATA_DMA_INTR) return 0x10 | dma_stat; return 0; } diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 6d8dbd9..55e48db 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -337,7 +337,6 @@ static void scc_dma_start(ide_drive_t *drive) /* start DMA */ scc_ide_outb(dma_cmd | 1, hwif->dma_base); - wmb(); } static int __scc_dma_end(ide_drive_t *drive) @@ -354,7 +353,6 @@ static int __scc_dma_end(ide_drive_t *drive) /* clear the INTR & ERROR bits */ scc_ide_outb(dma_stat | 6, hwif->dma_base + 4); /* verify good DMA status */ - wmb(); return (dma_stat & 7) != 4 ? (0x10 | dma_stat) : 0; } -- cgit v0.10.2 From 253275c52c8f5848df63f140977ef19800f2dfca Mon Sep 17 00:00:00 2001 From: Atsushi Nemoto Date: Wed, 8 Apr 2009 14:12:49 +0200 Subject: tx4939ide: remove wmb() * define CHECK_DMA_MASK * remove use of wmb() Reported-by: Grant Grundler Reviewed-by: Grant Grundler Signed-off-by: Atsushi Nemoto diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index 0040a9a..2e27fcd 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -327,15 +327,15 @@ static int tx4939ide_dma_end(ide_drive_t *drive) /* read and clear the INTR & ERROR bits */ dma_stat = tx4939ide_clear_dma_status(base); - wmb(); +#define CHECK_DMA_MASK (ATA_DMA_ACTIVE | ATA_DMA_ERR | ATA_DMA_INTR) /* verify good DMA status */ - if ((dma_stat & (ATA_DMA_INTR | ATA_DMA_ERR | ATA_DMA_ACTIVE)) == 0 && + if ((dma_stat & CHECK_DMA_MASK) == 0 && (ctl & (TX4939IDE_INT_XFEREND | TX4939IDE_INT_HOST)) == (TX4939IDE_INT_XFEREND | TX4939IDE_INT_HOST)) /* INT_IDE lost... bug? */ return 0; - return ((dma_stat & (ATA_DMA_INTR | ATA_DMA_ERR | ATA_DMA_ACTIVE)) != + return ((dma_stat & CHECK_DMA_MASK) != ATA_DMA_INTR) ? 0x10 | dma_stat : 0; } -- cgit v0.10.2 From add4d9a9838fc9a3b3d1886b6ce96cfc08386e9b Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:12:50 +0200 Subject: ide-h8300: remove mm_{inw|outw}() Remove two no longer used functions that I've overlooked... Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-h8300.c b/drivers/ide/ide-h8300.c index dac9a6d..8a064d7 100644 --- a/drivers/ide/ide-h8300.c +++ b/drivers/ide/ide-h8300.c @@ -22,28 +22,6 @@ (r); \ }) -static void mm_outw(u16 d, unsigned long a) -{ - __asm__("mov.b %w0,r2h\n\t" - "mov.b %x0,r2l\n\t" - "mov.w r2,@%1" - : - :"r"(d),"r"(a) - :"er2"); -} - -static u16 mm_inw(unsigned long a) -{ - register u16 r __asm__("er0"); - __asm__("mov.w @%1,r2\n\t" - "mov.b r2l,%x0\n\t" - "mov.b r2h,%w0" - :"=r"(r) - :"r"(a) - :"er2"); - return r; -} - static void h8300_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { ide_hwif_t *hwif = drive->hwif; -- cgit v0.10.2 From 7636e455ea00755b863340570eb47a3652624da3 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:12:51 +0200 Subject: at91_ide: remove custom tf_{read|load}() methods Since tf_{read|load}() methods of this driver have now become identical to their standard counterparts using MMIO accesses, there's no need to override those anymore... Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index 8eda552..c035bb0 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c @@ -185,80 +185,6 @@ static void ide_mm_outb(u8 value, unsigned long port) writeb(value, (void __iomem *) port); } -static void at91_ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; - - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; - - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) - ide_mm_outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) - ide_mm_outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) - ide_mm_outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) - ide_mm_outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) - ide_mm_outb(tf->hob_lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) - ide_mm_outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) - ide_mm_outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) - ide_mm_outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) - ide_mm_outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) - ide_mm_outb(tf->lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) - ide_mm_outb((tf->device & HIHI) | drive->select, io_ports->device_addr); -} - -static void at91_ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - - /* be sure we're looking at the low order bits */ - ide_mm_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) - tf->error = ide_mm_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) - tf->nsect = ide_mm_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) - tf->lbal = ide_mm_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) - tf->lbam = ide_mm_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) - tf->lbah = ide_mm_inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) - tf->device = ide_mm_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - ide_mm_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) - tf->hob_error = ide_mm_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) - tf->hob_nsect = ide_mm_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) - tf->hob_lbal = ide_mm_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) - tf->hob_lbam = ide_mm_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) - tf->hob_lbah = ide_mm_inb(io_ports->lbah_addr); - } -} - static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) { struct ide_timing *timing; @@ -284,8 +210,8 @@ static const struct ide_tp_ops at91_ide_tp_ops = { .write_devctl = ide_write_devctl, .dev_select = ide_dev_select, - .tf_load = at91_ide_tf_load, - .tf_read = at91_ide_tf_read, + .tf_load = ide_tf_load, + .tf_read = ide_tf_read, .input_data = at91_ide_input_data, .output_data = at91_ide_output_data, -- cgit v0.10.2 From cfd30daa0d6cbdb0bbc2bc40a10097231b23b204 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:12:51 +0200 Subject: ide-h8300: remove custom tf_{read|load}() methods Since tf_{read|load}() methods of this driver have now become identical to their standard counterparts using I/O port accesses, there's no need to override those anymore... Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-h8300.c b/drivers/ide/ide-h8300.c index 8a064d7..c06ebdc 100644 --- a/drivers/ide/ide-h8300.c +++ b/drivers/ide/ide-h8300.c @@ -22,81 +22,6 @@ (r); \ }) -static void h8300_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; - - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; - - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) - outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) - outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) - outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) - outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) - outb(tf->hob_lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) - outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) - outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) - outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) - outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) - outb(tf->lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) - outb((tf->device & HIHI) | drive->select, - io_ports->device_addr); -} - -static void h8300_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - - /* be sure we're looking at the low order bits */ - outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) - tf->error = inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) - tf->nsect = inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) - tf->lbal = inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) - tf->lbam = inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) - tf->lbah = inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) - tf->device = inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) - tf->hob_error = inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) - tf->hob_nsect = inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) - tf->hob_lbal = inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) - tf->hob_lbam = inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) - tf->hob_lbah = inb(io_ports->lbah_addr); - } -} - static void mm_outsw(unsigned long addr, void *buf, u32 len) { unsigned short *bp = (unsigned short *)buf; @@ -130,8 +55,8 @@ static const struct ide_tp_ops h8300_tp_ops = { .write_devctl = ide_write_devctl, .dev_select = ide_dev_select, - .tf_load = h8300_tf_load, - .tf_read = h8300_tf_read, + .tf_load = ide_tf_load, + .tf_read = ide_tf_read, .input_data = h8300_input_data, .output_data = h8300_output_data, -- cgit v0.10.2 From 8e59bfde31e69fb1f630ec0efd24a50c5a51b0bf Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Wed, 8 Apr 2009 14:12:51 +0200 Subject: ide-cd: move status checking into the IRQ handler There should be no functional change resulting from this patch. Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 35729a4..a4afd90 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -271,29 +271,18 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) * 1: if the request will be going through error recovery. * 2: if the request should be ended. */ -static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) +static int cdrom_decode_status(ide_drive_t *drive, u8 stat) { ide_hwif_t *hwif = drive->hwif; struct request *rq = hwif->rq; - int stat, err, sense_key; - - /* check for errors */ - stat = hwif->tp_ops->read_status(hwif); - - if (stat_ret) - *stat_ret = stat; - - if (OK_STAT(stat, good_stat, BAD_R_STAT)) - return 0; + int err, sense_key; /* get the IDE error register */ err = ide_read_error(drive); sense_key = err >> 4; - ide_debug_log(IDE_DBG_RQ, "stat: 0x%x, good_stat: 0x%x, cmd[0]: 0x%x, " - "rq->cmd_type: 0x%x, err: 0x%x", - stat, good_stat, rq->cmd[0], rq->cmd_type, - err); + ide_debug_log(IDE_DBG_RQ, "cmd[0]: 0x%x, rq->cmd_type: 0x%x, err: 0x%x", + rq->cmd[0], rq->cmd_type, err); if (blk_sense_request(rq)) { /* @@ -624,12 +613,12 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) struct ide_cmd *cmd = &hwif->cmd; struct request *rq = hwif->rq; ide_expiry_t *expiry = NULL; - int dma_error = 0, dma, stat, thislen, uptodate = 0; + int dma_error = 0, dma, thislen, uptodate = 0; int write = (rq_data_dir(rq) == WRITE) ? 1 : 0, rc, nsectors; int sense = blk_sense_request(rq); unsigned int timeout; u16 len; - u8 ireason; + u8 ireason, stat; ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x", rq->cmd[0], write); @@ -648,11 +637,16 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) } } - rc = cdrom_decode_status(drive, 0, &stat); - if (rc) { - if (rc == 2) - goto out_end; - return ide_stopped; + /* check status */ + stat = hwif->tp_ops->read_status(hwif); + + if (!OK_STAT(stat, 0, BAD_R_STAT)) { + rc = cdrom_decode_status(drive, stat); + if (rc) { + if (rc == 2) + goto out_end; + return ide_stopped; + } } /* using dma, transfer is complete now */ -- cgit v0.10.2 From 805ec58ad7fd1f65eeb75ed38f11bd08fbd3b988 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Wed, 8 Apr 2009 14:12:52 +0200 Subject: ide-cd: carve out an ide_cd_breathe()-helper for fs write requests There should be no functional change resulting from this patch. Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index a4afd90..7bbdeb7 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -265,7 +265,43 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) cdrom_analyze_sense_data(drive, NULL, sense); } + /* + * Allow the drive 5 seconds to recover; some devices will return NOT_READY + * while flushing data from cache. + * + * returns: 0 failed (write timeout expired) + * 1 success + */ +static int ide_cd_breathe(ide_drive_t *drive, struct request *rq) +{ + + struct cdrom_info *info = drive->driver_data; + + if (!rq->errors) + info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY; + + rq->errors = 1; + + if (time_after(jiffies, info->write_timeout)) + return 0; + else { + struct request_queue *q = drive->queue; + unsigned long flags; + + /* + * take a breather relying on the unplug timer to kick us again + */ + + spin_lock_irqsave(q->queue_lock, flags); + blk_plug_device(q); + spin_unlock_irqrestore(q->queue_lock, flags); + + return 1; + } +} + +/** * Returns: * 0: if the request should be continued. * 1: if the request will be going through error recovery. @@ -348,36 +384,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) /* fail the request */ printk(KERN_ERR PFX "%s: tray open\n", drive->name); - do_end_request = 1; } else { - struct cdrom_info *info = drive->driver_data; - - /* - * Allow the drive 5 seconds to recover, some - * devices will return this error while flushing - * data from cache. - */ - if (!rq->errors) - info->write_timeout = jiffies + - ATAPI_WAIT_WRITE_BUSY; - rq->errors = 1; - if (time_after(jiffies, info->write_timeout)) - do_end_request = 1; - else { - struct request_queue *q = drive->queue; - unsigned long flags; - - /* - * take a breather relying on the unplug - * timer to kick us again - */ - spin_lock_irqsave(q->queue_lock, flags); - blk_plug_device(q); - spin_unlock_irqrestore(q->queue_lock, flags); - + if (ide_cd_breathe(drive, rq)) return 1; - } } + do_end_request = 1; } else if (sense_key == UNIT_ATTENTION) { /* media change */ cdrom_saw_media_change(drive); -- cgit v0.10.2 From d68bab503e64e87c464c5a27a56877a04e4404b5 Mon Sep 17 00:00:00 2001 From: Atsushi Nemoto Date: Wed, 8 Apr 2009 14:12:52 +0200 Subject: tx493[89]ide: Remove big endian version of tx493[89]ide_tf_{load,read} Now tx493[89]ide_tf_{load,read} do not contain word I/O operations. They are endian-free now. Signed-off-by: Atsushi Nemoto Cc: Sergei Shtylyov , Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/tx4938ide.c b/drivers/ide/tx4938ide.c index 4cb79c4..e33d764 100644 --- a/drivers/ide/tx4938ide.c +++ b/drivers/ide/tx4938ide.c @@ -72,91 +72,6 @@ static void tx4938ide_set_pio_mode(ide_drive_t *drive, const u8 pio) #ifdef __BIG_ENDIAN /* custom iops (independent from SWAP_IO_SPACE) */ -static u8 tx4938ide_inb(unsigned long port) -{ - return __raw_readb((void __iomem *)port); -} - -static void tx4938ide_outb(u8 value, unsigned long port) -{ - __raw_writeb(value, (void __iomem *)port); -} - -static void tx4938ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 HIHI = cmd->tf_flags & IDE_TFLAG_LBA48 ? 0xE0 : 0xEF; - - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; - - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) - tx4938ide_outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) - tx4938ide_outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) - tx4938ide_outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) - tx4938ide_outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) - tx4938ide_outb(tf->hob_lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) - tx4938ide_outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) - tx4938ide_outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) - tx4938ide_outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) - tx4938ide_outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) - tx4938ide_outb(tf->lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) - tx4938ide_outb((tf->device & HIHI) | drive->select, - io_ports->device_addr); -} - -static void tx4938ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - - /* be sure we're looking at the low order bits */ - tx4938ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) - tf->error = tx4938ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) - tf->nsect = tx4938ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) - tf->lbal = tx4938ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) - tf->lbam = tx4938ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) - tf->lbah = tx4938ide_inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) - tf->device = tx4938ide_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - tx4938ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) - tf->hob_error = tx4938ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) - tf->hob_nsect = tx4938ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) - tf->hob_lbal = tx4938ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) - tf->hob_lbam = tx4938ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) - tf->hob_lbah = tx4938ide_inb(io_ports->lbah_addr); - } -} - static void tx4938ide_input_data_swap(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, unsigned int len) { @@ -190,8 +105,8 @@ static const struct ide_tp_ops tx4938ide_tp_ops = { .write_devctl = ide_write_devctl, .dev_select = ide_dev_select, - .tf_load = tx4938ide_tf_load, - .tf_read = tx4938ide_tf_read, + .tf_load = ide_tf_load, + .tf_read = ide_tf_read, .input_data = tx4938ide_input_data_swap, .output_data = tx4938ide_output_data_swap, diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index 2e27fcd..f9b6878 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -434,96 +434,17 @@ static void tx4939ide_tf_load_fixup(ide_drive_t *drive) tx4939ide_writew(sysctl, base, TX4939IDE_Sys_Ctl); } -#ifdef __BIG_ENDIAN - -/* custom iops (independent from SWAP_IO_SPACE) */ -static u8 tx4939ide_inb(unsigned long port) -{ - return __raw_readb((void __iomem *)port); -} - -static void tx4939ide_outb(u8 value, unsigned long port) -{ - __raw_writeb(value, (void __iomem *)port); -} - static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 HIHI = cmd->tf_flags & IDE_TFLAG_LBA48 ? 0xE0 : 0xEF; - - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; - - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) - tx4939ide_outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) - tx4939ide_outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) - tx4939ide_outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) - tx4939ide_outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) - tx4939ide_outb(tf->hob_lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) - tx4939ide_outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) - tx4939ide_outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) - tx4939ide_outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) - tx4939ide_outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) - tx4939ide_outb(tf->lbah, io_ports->lbah_addr); - - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) { - tx4939ide_outb((tf->device & HIHI) | drive->select, - io_ports->device_addr); + ide_tf_load(drive, cmd); + + if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) tx4939ide_tf_load_fixup(drive); - } } -static void tx4939ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_hwif_t *hwif = drive->hwif; - struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - - /* be sure we're looking at the low order bits */ - tx4939ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) - tf->error = tx4939ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) - tf->nsect = tx4939ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) - tf->lbal = tx4939ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) - tf->lbam = tx4939ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) - tf->lbah = tx4939ide_inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) - tf->device = tx4939ide_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - tx4939ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) - tf->hob_error = tx4939ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) - tf->hob_nsect = tx4939ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) - tf->hob_lbal = tx4939ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) - tf->hob_lbam = tx4939ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) - tf->hob_lbah = tx4939ide_inb(io_ports->lbah_addr); - } -} +#ifdef __BIG_ENDIAN +/* custom iops (independent from SWAP_IO_SPACE) */ static void tx4939ide_input_data_swap(ide_drive_t *drive, struct request *rq, void *buf, unsigned int len) { @@ -558,7 +479,7 @@ static const struct ide_tp_ops tx4939ide_tp_ops = { .dev_select = ide_dev_select, .tf_load = tx4939ide_tf_load, - .tf_read = tx4939ide_tf_read, + .tf_read = ide_tf_read, .input_data = tx4939ide_input_data_swap, .output_data = tx4939ide_output_data_swap, @@ -566,14 +487,6 @@ static const struct ide_tp_ops tx4939ide_tp_ops = { #else /* __LITTLE_ENDIAN */ -static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) -{ - ide_tf_load(drive, cmd); - - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) - tx4939ide_tf_load_fixup(drive); -} - static const struct ide_tp_ops tx4939ide_tp_ops = { .exec_command = ide_exec_command, .read_status = ide_read_status, -- cgit v0.10.2 From aa24d9783d1dcba1a25451dadb6fb0ee092bd8df Mon Sep 17 00:00:00 2001 From: Atsushi Nemoto Date: Wed, 8 Apr 2009 14:12:52 +0200 Subject: tx4939ide: Fix tx4939ide_{in,out}put_data_swap argument The commit adb1af9 ("ide: pass command instead of request to ide_pio_datablock()") missed tx4939ide driver. Signed-off-by: Atsushi Nemoto Cc: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index f9b6878..bee9461 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -445,7 +445,7 @@ static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) #ifdef __BIG_ENDIAN /* custom iops (independent from SWAP_IO_SPACE) */ -static void tx4939ide_input_data_swap(ide_drive_t *drive, struct request *rq, +static void tx4939ide_input_data_swap(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, unsigned int len) { unsigned long port = drive->hwif->io_ports.data_addr; @@ -457,7 +457,7 @@ static void tx4939ide_input_data_swap(ide_drive_t *drive, struct request *rq, __ide_flush_dcache_range((unsigned long)buf, roundup(len, 2)); } -static void tx4939ide_output_data_swap(ide_drive_t *drive, struct request *rq, +static void tx4939ide_output_data_swap(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, unsigned int len) { unsigned long port = drive->hwif->io_ports.data_addr; -- cgit v0.10.2 From 1597cd82504174c816c39cefabacd8a27b993ce0 Mon Sep 17 00:00:00 2001 From: Huang Weiyi Date: Wed, 8 Apr 2009 14:12:53 +0200 Subject: ide: remove unused #include Remove unused #include in drivers/ide/at91_ide.c. Signed-off-by: Huang Weiyi Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index c035bb0..4f3725d 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c @@ -20,7 +20,6 @@ * */ -#include #include #include #include -- cgit v0.10.2 From dfa4411cc3a690011cab90e9a536938795366cf9 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Wed, 8 Apr 2009 14:12:53 +0200 Subject: ide-cd: respect REQ_QUIET for fs requests in cdrom_decode_status() There should be no functional change resulting from this patch. Suggested-by: Bartlomiej Zolnierkiewicz Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 7bbdeb7..c84abd6 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -312,6 +312,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) ide_hwif_t *hwif = drive->hwif; struct request *rq = hwif->rq; int err, sense_key; + u8 quiet = rq->cmd_flags & REQ_QUIET; /* get the IDE error register */ err = ide_read_error(drive); @@ -354,7 +355,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) * drive doesn't have that capability. * cdrom_log_sense() knows this! */ - } else if (!(rq->cmd_flags & REQ_QUIET)) { + } else if (!quiet) { /* otherwise, print an error */ ide_dump_status(drive, "packet command error", stat); } @@ -382,7 +383,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) cdrom_saw_media_change(drive); /* fail the request */ - printk(KERN_ERR PFX "%s: tray open\n", + if (!quiet) + printk(KERN_ERR PFX "%s: tray open\n", drive->name); } else { if (ide_cd_breathe(drive, rq)) @@ -405,19 +407,23 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) * No point in retrying after an illegal request or data * protect error. */ - ide_dump_status(drive, "command error", stat); + if (!quiet) + ide_dump_status(drive, "command error", stat); do_end_request = 1; } else if (sense_key == MEDIUM_ERROR) { /* * No point in re-trying a zillion times on a bad * sector. If we got here the error is not correctable. */ - ide_dump_status(drive, "media error (bad sector)", - stat); + if (!quiet) + ide_dump_status(drive, "media error " + "(bad sector)", stat); do_end_request = 1; } else if (sense_key == BLANK_CHECK) { /* disk appears blank ?? */ - ide_dump_status(drive, "media error (blank)", stat); + if (!quiet) + ide_dump_status(drive, "media error (blank)", + stat); do_end_request = 1; } else if ((err & ~ATA_ABORTED) != 0) { /* go to the default handler for other errors */ -- cgit v0.10.2 From 98036abf31994244cb5772ecc291f4293a52c20b Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Wed, 8 Apr 2009 14:12:53 +0200 Subject: ide-cd: update debugging support Signed-off-by: Borislav Petkov [bart: extracted from "ide-cd: cleanup cdrom_decode_status" patch] Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index c84abd6..e946f0e 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -318,8 +318,9 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) err = ide_read_error(drive); sense_key = err >> 4; - ide_debug_log(IDE_DBG_RQ, "cmd[0]: 0x%x, rq->cmd_type: 0x%x, err: 0x%x", - rq->cmd[0], rq->cmd_type, err); + ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, rq->cmd_type: 0x%x, err: 0x%x, " + "stat 0x%x", + rq->cmd[0], rq->cmd_type, err, stat); if (blk_sense_request(rq)) { /* @@ -637,8 +638,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) u16 len; u8 ireason, stat; - ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x", - rq->cmd[0], write); + ide_debug_log(IDE_DBG_PC, "cmd: 0x%x, write: 0x%x", rq->cmd[0], write); /* check for errors */ dma = drive->dma; -- cgit v0.10.2 From e01f251fd09fa7cb3d352eac7de17bb5d5bd1f9d Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Wed, 8 Apr 2009 14:12:53 +0200 Subject: ide-cd: convert cdrom_decode_status() to use switch statements Based on earlier work by Borislav Petkov. Convert cdrom_decode_status() to use switch statements in preparation to unify handling of fs and pc requests. While at it: - remove superfluous comments and do minor CodingStyle fixups There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index e946f0e..43db330 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -340,15 +340,14 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) if (blk_pc_request(rq) && !rq->errors) rq->errors = SAM_STAT_CHECK_CONDITION; - /* check for tray open */ - if (sense_key == NOT_READY) { + switch (sense_key) { + case NOT_READY: cdrom_saw_media_change(drive); - } else if (sense_key == UNIT_ATTENTION) { - /* check for media change */ + break; + case UNIT_ATTENTION: cdrom_saw_media_change(drive); return 0; - } else if (sense_key == ILLEGAL_REQUEST && - rq->cmd[0] == GPCMD_START_STOP_UNIT) { + case ILLEGAL_REQUEST: /* * Don't print error message for this condition-- * SFF8090i indicates that 5/24/00 is the correct @@ -356,9 +355,13 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) * drive doesn't have that capability. * cdrom_log_sense() knows this! */ - } else if (!quiet) { - /* otherwise, print an error */ - ide_dump_status(drive, "packet command error", stat); + if (rq->cmd[0] == GPCMD_START_STOP_UNIT) + break; + /* fall-through */ + default: + if (!quiet) + ide_dump_status(drive, "packet command error", + stat); } rq->cmd_flags |= REQ_FAILED; @@ -378,12 +381,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) if (blk_noretry_request(rq)) do_end_request = 1; - if (sense_key == NOT_READY) { - /* tray open */ + switch (sense_key) { + case NOT_READY: if (rq_data_dir(rq) == READ) { cdrom_saw_media_change(drive); - /* fail the request */ if (!quiet) printk(KERN_ERR PFX "%s: tray open\n", drive->name); @@ -392,8 +394,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) return 1; } do_end_request = 1; - } else if (sense_key == UNIT_ATTENTION) { - /* media change */ + break; + case UNIT_ATTENTION: cdrom_saw_media_change(drive); /* @@ -402,8 +404,9 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) */ if (++rq->errors > ERROR_MAX) do_end_request = 1; - } else if (sense_key == ILLEGAL_REQUEST || - sense_key == DATA_PROTECT) { + break; + case ILLEGAL_REQUEST: + case DATA_PROTECT: /* * No point in retrying after an illegal request or data * protect error. @@ -411,7 +414,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) if (!quiet) ide_dump_status(drive, "command error", stat); do_end_request = 1; - } else if (sense_key == MEDIUM_ERROR) { + break; + case MEDIUM_ERROR: /* * No point in re-trying a zillion times on a bad * sector. If we got here the error is not correctable. @@ -420,19 +424,22 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) ide_dump_status(drive, "media error " "(bad sector)", stat); do_end_request = 1; - } else if (sense_key == BLANK_CHECK) { + break; + case BLANK_CHECK: /* disk appears blank ?? */ if (!quiet) ide_dump_status(drive, "media error (blank)", stat); do_end_request = 1; - } else if ((err & ~ATA_ABORTED) != 0) { - /* go to the default handler for other errors */ - ide_error(drive, "cdrom_decode_status", stat); - return 1; - } else if ((++rq->errors > ERROR_MAX)) { - /* we've racked up too many retries, abort */ - do_end_request = 1; + break; + default: + if (err & ~ATA_ABORTED) { + /* go to the default handler for other errors */ + ide_error(drive, "cdrom_decode_status", stat); + return 1; + } else if (++rq->errors > ERROR_MAX) + /* we've racked up too many retries, abort */ + do_end_request = 1; } /* -- cgit v0.10.2 From 1920c48d796ce7240ba267cb0be85c51895258f8 Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Wed, 8 Apr 2009 14:12:54 +0200 Subject: ide-cd: unify handling of fs and pc requests in cdrom_decode_status() Based on earlier work by Borislav Petkov. Unify handling of fs and pc requests in cdrom_decode_status(). While at it: - remove unreachable code The only change in functionality is that for pc requests more detailed error message will be printed for following sense keys: * ILLEGAL_REQUEST * DATA_PROTECT * MEDIUM_ERROR * BLANK_CHECK Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 43db330..ffbaa6d 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -330,8 +330,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) */ rq->cmd_flags |= REQ_FAILED; return 2; - } else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) { - /* All other functions, except for READ. */ + } else { + int do_end_request = 0; /* * if we have an error, pass back CHECK_CONDITION as the @@ -340,53 +340,16 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) if (blk_pc_request(rq) && !rq->errors) rq->errors = SAM_STAT_CHECK_CONDITION; - switch (sense_key) { - case NOT_READY: - cdrom_saw_media_change(drive); - break; - case UNIT_ATTENTION: - cdrom_saw_media_change(drive); - return 0; - case ILLEGAL_REQUEST: - /* - * Don't print error message for this condition-- - * SFF8090i indicates that 5/24/00 is the correct - * response to a request to close the tray if the - * drive doesn't have that capability. - * cdrom_log_sense() knows this! - */ - if (rq->cmd[0] == GPCMD_START_STOP_UNIT) - break; - /* fall-through */ - default: - if (!quiet) - ide_dump_status(drive, "packet command error", - stat); - } - - rq->cmd_flags |= REQ_FAILED; - - /* - * instead of playing games with moving completions around, - * remove failed request completely and end it when the - * request sense has completed - */ - goto end_request; - - } else if (blk_fs_request(rq)) { - int do_end_request = 0; - - /* handle errors from READ and WRITE requests */ - if (blk_noretry_request(rq)) do_end_request = 1; switch (sense_key) { case NOT_READY: - if (rq_data_dir(rq) == READ) { + if (blk_fs_request(rq) == 0 || + rq_data_dir(rq) == READ) { cdrom_saw_media_change(drive); - if (!quiet) + if (blk_fs_request(rq) && !quiet) printk(KERN_ERR PFX "%s: tray open\n", drive->name); } else { @@ -398,6 +361,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) case UNIT_ATTENTION: cdrom_saw_media_change(drive); + if (blk_fs_request(rq) == 0) + return 0; /* * Arrange to retry the request but be sure to give up * if we've retried too many times. @@ -406,6 +371,16 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) do_end_request = 1; break; case ILLEGAL_REQUEST: + /* + * Don't print error message for this condition-- + * SFF8090i indicates that 5/24/00 is the correct + * response to a request to close the tray if the + * drive doesn't have that capability. + * cdrom_log_sense() knows this! + */ + if (rq->cmd[0] == GPCMD_START_STOP_UNIT) + break; + /* fall-through */ case DATA_PROTECT: /* * No point in retrying after an illegal request or data @@ -433,6 +408,8 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) do_end_request = 1; break; default: + if (blk_fs_request(rq) == 0) + break; if (err & ~ATA_ABORTED) { /* go to the default handler for other errors */ ide_error(drive, "cdrom_decode_status", stat); @@ -442,6 +419,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) do_end_request = 1; } + if (blk_fs_request(rq) == 0) { + rq->cmd_flags |= REQ_FAILED; + do_end_request = 1; + } + /* * End a request through request sense analysis when we have * sense data. We need this in order to perform end of media @@ -457,9 +439,6 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) if (stat & ATA_ERR) cdrom_queue_request_sense(drive, NULL, NULL); return 1; - } else { - blk_dump_rq_flags(rq, PFX "bad rq"); - return 2; } end_request: -- cgit v0.10.2 From 674f0ea111bc9bff1b4e4841d7da38933c5e3b59 Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Wed, 8 Apr 2009 14:12:54 +0200 Subject: ide-cd: fix intendation in cdrom_decode_status() Based on earlier work by Borislav Petkov. Fix intendation in cdrom_decode_status(), no real code changes. While at it: - beautify comments There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index ffbaa6d..3ce1eaf 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -311,7 +311,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) { ide_hwif_t *hwif = drive->hwif; struct request *rq = hwif->rq; - int err, sense_key; + int err, sense_key, do_end_request = 0; u8 quiet = rq->cmd_flags & REQ_QUIET; /* get the IDE error register */ @@ -330,117 +330,108 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) */ rq->cmd_flags |= REQ_FAILED; return 2; - } else { - int do_end_request = 0; - - /* - * if we have an error, pass back CHECK_CONDITION as the - * scsi status byte - */ - if (blk_pc_request(rq) && !rq->errors) - rq->errors = SAM_STAT_CHECK_CONDITION; + } - if (blk_noretry_request(rq)) - do_end_request = 1; + /* if we have an error, pass CHECK_CONDITION as the SCSI status byte */ + if (blk_pc_request(rq) && !rq->errors) + rq->errors = SAM_STAT_CHECK_CONDITION; - switch (sense_key) { - case NOT_READY: - if (blk_fs_request(rq) == 0 || - rq_data_dir(rq) == READ) { - cdrom_saw_media_change(drive); + if (blk_noretry_request(rq)) + do_end_request = 1; - if (blk_fs_request(rq) && !quiet) - printk(KERN_ERR PFX "%s: tray open\n", - drive->name); - } else { - if (ide_cd_breathe(drive, rq)) - return 1; - } - do_end_request = 1; - break; - case UNIT_ATTENTION: + switch (sense_key) { + case NOT_READY: + if (blk_fs_request(rq) == 0 || rq_data_dir(rq) == READ) { cdrom_saw_media_change(drive); - if (blk_fs_request(rq) == 0) - return 0; - /* - * Arrange to retry the request but be sure to give up - * if we've retried too many times. - */ - if (++rq->errors > ERROR_MAX) - do_end_request = 1; - break; - case ILLEGAL_REQUEST: - /* - * Don't print error message for this condition-- - * SFF8090i indicates that 5/24/00 is the correct - * response to a request to close the tray if the - * drive doesn't have that capability. - * cdrom_log_sense() knows this! - */ - if (rq->cmd[0] == GPCMD_START_STOP_UNIT) - break; - /* fall-through */ - case DATA_PROTECT: - /* - * No point in retrying after an illegal request or data - * protect error. - */ - if (!quiet) - ide_dump_status(drive, "command error", stat); - do_end_request = 1; - break; - case MEDIUM_ERROR: - /* - * No point in re-trying a zillion times on a bad - * sector. If we got here the error is not correctable. - */ - if (!quiet) - ide_dump_status(drive, "media error " - "(bad sector)", stat); - do_end_request = 1; - break; - case BLANK_CHECK: - /* disk appears blank ?? */ - if (!quiet) - ide_dump_status(drive, "media error (blank)", - stat); - do_end_request = 1; - break; - default: - if (blk_fs_request(rq) == 0) - break; - if (err & ~ATA_ABORTED) { - /* go to the default handler for other errors */ - ide_error(drive, "cdrom_decode_status", stat); + if (blk_fs_request(rq) && !quiet) + printk(KERN_ERR PFX "%s: tray open\n", + drive->name); + } else { + if (ide_cd_breathe(drive, rq)) return 1; - } else if (++rq->errors > ERROR_MAX) - /* we've racked up too many retries, abort */ - do_end_request = 1; } + do_end_request = 1; + break; + case UNIT_ATTENTION: + cdrom_saw_media_change(drive); - if (blk_fs_request(rq) == 0) { - rq->cmd_flags |= REQ_FAILED; - do_end_request = 1; - } + if (blk_fs_request(rq) == 0) + return 0; /* - * End a request through request sense analysis when we have - * sense data. We need this in order to perform end of media - * processing. + * Arrange to retry the request but be sure to give up if we've + * retried too many times. */ - if (do_end_request) - goto end_request; - + if (++rq->errors > ERROR_MAX) + do_end_request = 1; + break; + case ILLEGAL_REQUEST: + /* + * Don't print error message for this condition -- SFF8090i + * indicates that 5/24/00 is the correct response to a request + * to close the tray if the drive doesn't have that capability. + * + * cdrom_log_sense() knows this! + */ + if (rq->cmd[0] == GPCMD_START_STOP_UNIT) + break; + /* fall-through */ + case DATA_PROTECT: /* - * If we got a CHECK_CONDITION status, queue - * a request sense command. + * No point in retrying after an illegal request or data + * protect error. */ - if (stat & ATA_ERR) - cdrom_queue_request_sense(drive, NULL, NULL); - return 1; + if (!quiet) + ide_dump_status(drive, "command error", stat); + do_end_request = 1; + break; + case MEDIUM_ERROR: + /* + * No point in re-trying a zillion times on a bad sector. + * If we got here the error is not correctable. + */ + if (!quiet) + ide_dump_status(drive, "media error " + "(bad sector)", stat); + do_end_request = 1; + break; + case BLANK_CHECK: + /* disk appears blank? */ + if (!quiet) + ide_dump_status(drive, "media error (blank)", + stat); + do_end_request = 1; + break; + default: + if (blk_fs_request(rq) == 0) + break; + if (err & ~ATA_ABORTED) { + /* go to the default handler for other errors */ + ide_error(drive, "cdrom_decode_status", stat); + return 1; + } else if (++rq->errors > ERROR_MAX) + /* we've racked up too many retries, abort */ + do_end_request = 1; } + if (blk_fs_request(rq) == 0) { + rq->cmd_flags |= REQ_FAILED; + do_end_request = 1; + } + + /* + * End a request through request sense analysis when we have sense data. + * We need this in order to perform end of media processing. + */ + if (do_end_request) + goto end_request; + + /* if we got a CHECK_CONDITION status, queue a request sense command */ + if (stat & ATA_ERR) + cdrom_queue_request_sense(drive, NULL, NULL); + return 1; + end_request: if (stat & ATA_ERR) { struct request_queue *q = drive->queue; -- cgit v0.10.2 From 60f85019c6c8c1aebf3485a313e0da094bc95d07 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:01 +0200 Subject: ide: replace IDE_TFLAG_* flags by IDE_VALID_* Replace IDE_TFLAG_{IN|OUT}_* flags meaning to the taskfile register validity on input/output by the IDE_VALID_* flags and introduce 4 symmetric 8-bit register validity indicator subfields, 'valid.{input/output}.{tf|hob}', into the 'struct ide_cmd' instead of using the 'tf_flags' field for that purpose (this field can then be turned from 32-bit into 8-bit one). Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c index 12f4369..f0db4d3 100644 --- a/drivers/ide/ide-acpi.c +++ b/drivers/ide/ide-acpi.c @@ -319,7 +319,8 @@ static int do_drive_set_taskfiles(ide_drive_t *drive, /* convert GTF to taskfile */ memset(&cmd, 0, sizeof(cmd)); memcpy(&cmd.tf_array[7], gtf, REGS_PER_GTF); - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; err = ide_no_data_taskfile(drive, &cmd); if (err) { diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 3e43b88..a359323 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c @@ -257,8 +257,7 @@ void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) struct ide_cmd cmd; memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_IN_LBAH | IDE_TFLAG_IN_LBAM | - IDE_TFLAG_IN_NSECT; + cmd.valid.in.tf = IDE_VALID_LBAH | IDE_VALID_LBAM | IDE_VALID_NSECT; drive->hwif->tp_ops->tf_read(drive, &cmd); @@ -439,12 +438,12 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) return ide_started; } -static void ide_init_packet_cmd(struct ide_cmd *cmd, u32 tf_flags, +static void ide_init_packet_cmd(struct ide_cmd *cmd, u8 valid_tf, u16 bcount, u8 dma) { - cmd->protocol = dma ? ATAPI_PROT_DMA : ATAPI_PROT_PIO; - cmd->tf_flags |= IDE_TFLAG_OUT_LBAH | IDE_TFLAG_OUT_LBAM | - IDE_TFLAG_OUT_FEATURE | tf_flags; + cmd->protocol = dma ? ATAPI_PROT_DMA : ATAPI_PROT_PIO; + cmd->valid.out.tf = IDE_VALID_LBAH | IDE_VALID_LBAM | + IDE_VALID_FEATURE | valid_tf; cmd->tf.command = ATA_CMD_PACKET; cmd->tf.feature = dma; /* Use PIO/DMA */ cmd->tf.lbam = bcount & 0xff; @@ -456,7 +455,7 @@ static u8 ide_read_ireason(ide_drive_t *drive) struct ide_cmd cmd; memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_IN_NSECT; + cmd.valid.in.tf = IDE_VALID_NSECT; drive->hwif->tp_ops->tf_read(drive, &cmd); @@ -588,12 +587,12 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) ide_expiry_t *expiry = NULL; struct request *rq = hwif->rq; unsigned int timeout; - u32 tf_flags; u16 bcount; + u8 valid_tf; u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT); if (dev_is_idecd(drive)) { - tf_flags = IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL; + valid_tf = IDE_VALID_NSECT | IDE_VALID_LBAL; bcount = ide_cd_get_xferlen(rq); expiry = ide_cd_expiry; timeout = ATAPI_WAIT_PC; @@ -607,7 +606,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) pc->xferred = 0; pc->cur_pos = pc->buf; - tf_flags = IDE_TFLAG_OUT_DEVICE; + valid_tf = IDE_VALID_DEVICE; bcount = ((drive->media == ide_tape) ? pc->req_xfer : min(pc->req_xfer, 63 * 1024)); @@ -627,7 +626,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) : WAIT_TAPE_CMD; } - ide_init_packet_cmd(cmd, tf_flags, bcount, drive->dma); + ide_init_packet_cmd(cmd, valid_tf, bcount, drive->dma); (void)do_rw_taskfile(drive, cmd); diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index c998cf8..235263e 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -97,7 +97,8 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, } memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; if (drive->dev_flags & IDE_DFLAG_LBA) { if (lba48) { @@ -116,7 +117,9 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, tf->lbam = (u8)(block >> 8); tf->lbah = (u8)(block >> 16); - cmd.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB); + cmd.valid.out.hob = IDE_VALID_OUT_HOB; + cmd.valid.in.hob = IDE_VALID_IN_HOB; + cmd.tf_flags |= IDE_TFLAG_LBA48; } else { tf->nsect = nsectors & 0xff; tf->lbal = block; @@ -220,9 +223,13 @@ static u64 idedisk_read_native_max_address(ide_drive_t *drive, int lba48) tf->command = ATA_CMD_READ_NATIVE_MAX; tf->device = ATA_LBA; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; - if (lba48) - cmd.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB); + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; + if (lba48) { + cmd.valid.out.hob = IDE_VALID_OUT_HOB; + cmd.valid.in.hob = IDE_VALID_IN_HOB; + cmd.tf_flags = IDE_TFLAG_LBA48; + } ide_no_data_taskfile(drive, &cmd); @@ -260,9 +267,13 @@ static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48) } tf->device |= ATA_LBA; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; - if (lba48) - cmd.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB); + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; + if (lba48) { + cmd.valid.out.hob = IDE_VALID_OUT_HOB; + cmd.valid.in.hob = IDE_VALID_IN_HOB; + cmd.tf_flags = IDE_TFLAG_LBA48; + } ide_no_data_taskfile(drive, &cmd); @@ -395,8 +406,8 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) cmd->tf.command = ATA_CMD_FLUSH_EXT; else cmd->tf.command = ATA_CMD_FLUSH; - cmd->tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE | - IDE_TFLAG_DYN; + cmd->valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd->tf_flags = IDE_TFLAG_DYN; cmd->protocol = ATA_PROT_NODATA; rq->cmd_type = REQ_TYPE_ATA_TASKFILE; @@ -457,7 +468,8 @@ static int ide_do_setfeature(ide_drive_t *drive, u8 feature, u8 nsect) cmd.tf.feature = feature; cmd.tf.nsect = nsect; cmd.tf.command = ATA_CMD_SET_FEATURES; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; return ide_no_data_taskfile(drive, &cmd); } @@ -533,7 +545,8 @@ static int do_idedisk_flushcache(ide_drive_t *drive) cmd.tf.command = ATA_CMD_FLUSH_EXT; else cmd.tf.command = ATA_CMD_FLUSH; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; return ide_no_data_taskfile(drive, &cmd); } @@ -715,7 +728,8 @@ static int ide_disk_set_doorlock(ide_drive_t *drive, struct gendisk *disk, memset(&cmd, 0, sizeof(cmd)); cmd.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; ret = ide_no_data_taskfile(drive, &cmd); diff --git a/drivers/ide/ide-disk_proc.c b/drivers/ide/ide-disk_proc.c index eaea3be..19f263b 100644 --- a/drivers/ide/ide-disk_proc.c +++ b/drivers/ide/ide-disk_proc.c @@ -13,7 +13,8 @@ static int smart_enable(ide_drive_t *drive) tf->lbam = ATA_SMART_LBAM_PASS; tf->lbah = ATA_SMART_LBAH_PASS; tf->command = ATA_CMD_SMART; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; return ide_no_data_taskfile(drive, &cmd); } @@ -29,7 +30,8 @@ static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd) tf->lbam = ATA_SMART_LBAM_PASS; tf->lbah = ATA_SMART_LBAH_PASS; tf->command = ATA_CMD_SMART; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; cmd.protocol = ATA_PROT_PIO; return ide_raw_taskfile(drive, &cmd, buf, 1); diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 9cac281..8b0b2e9 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -91,6 +91,7 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_taskfile *tf = &cmd->tf; void (*tf_outb)(u8 addr, unsigned long port); + u8 valid = cmd->valid.out.hob; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; @@ -102,29 +103,31 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) HIHI = 0xFF; - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) + if (valid & IDE_VALID_FEATURE) tf_outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) + if (valid & IDE_VALID_NSECT) tf_outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) + if (valid & IDE_VALID_LBAL) tf_outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) + if (valid & IDE_VALID_LBAM) tf_outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) + if (valid & IDE_VALID_LBAH) tf_outb(tf->hob_lbah, io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) + valid = cmd->valid.out.tf; + + if (valid & IDE_VALID_FEATURE) tf_outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) + if (valid & IDE_VALID_NSECT) tf_outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) + if (valid & IDE_VALID_LBAL) tf_outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) + if (valid & IDE_VALID_LBAM) tf_outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) + if (valid & IDE_VALID_LBAH) tf_outb(tf->lbah, io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) + if (valid & IDE_VALID_DEVICE) tf_outb((tf->device & HIHI) | drive->select, io_ports->device_addr); } @@ -137,6 +140,7 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) struct ide_taskfile *tf = &cmd->tf; void (*tf_outb)(u8 addr, unsigned long port); u8 (*tf_inb)(unsigned long port); + u8 valid = cmd->valid.in.tf; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; if (mmio) { @@ -150,31 +154,33 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) /* be sure we're looking at the low order bits */ tf_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) + if (valid & IDE_VALID_ERROR) tf->error = tf_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) + if (valid & IDE_VALID_NSECT) tf->nsect = tf_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) + if (valid & IDE_VALID_LBAL) tf->lbal = tf_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) + if (valid & IDE_VALID_LBAM) tf->lbam = tf_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) + if (valid & IDE_VALID_LBAH) tf->lbah = tf_inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) + if (valid & IDE_VALID_DEVICE) tf->device = tf_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { tf_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) + valid = cmd->valid.in.hob; + + if (valid & IDE_VALID_ERROR) tf->hob_error = tf_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) + if (valid & IDE_VALID_NSECT) tf->hob_nsect = tf_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) + if (valid & IDE_VALID_LBAL) tf->hob_lbal = tf_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) + if (valid & IDE_VALID_LBAM) tf->hob_lbam = tf_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) + if (valid & IDE_VALID_LBAH) tf->hob_lbah = tf_inb(io_ports->lbah_addr); } } diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 1deb6d2..99bb0a9 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -205,8 +205,9 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive) return ide_stopped; } - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE | - IDE_TFLAG_CUSTOM_HANDLER; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; + cmd.tf_flags = IDE_TFLAG_CUSTOM_HANDLER; do_rw_taskfile(drive, &cmd); diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index 7701427..b11df4b 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c @@ -141,11 +141,12 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) tf->lbal = args[1]; tf->lbam = 0x4f; tf->lbah = 0xc2; - cmd.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_IN_NSECT; + cmd.valid.out.tf = IDE_VALID_OUT_TF; + cmd.valid.in.tf = IDE_VALID_NSECT; } else { tf->nsect = args[1]; - cmd.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT | - IDE_TFLAG_IN_NSECT; + cmd.valid.out.tf = IDE_VALID_FEATURE | IDE_VALID_NSECT; + cmd.valid.in.tf = IDE_VALID_NSECT; } tf->command = args[0]; cmd.protocol = args[3] ? ATA_PROT_PIO : ATA_PROT_NODATA; @@ -207,7 +208,8 @@ static int ide_task_ioctl(ide_drive_t *drive, unsigned long arg) memset(&cmd, 0, sizeof(cmd)); memcpy(&cmd.tf_array[7], &args[1], 6); cmd.tf.command = args[0]; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; err = ide_no_data_taskfile(drive, &cmd); diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 27bb70d..0fdf0df 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -40,7 +40,7 @@ u8 ide_read_error(ide_drive_t *drive) struct ide_cmd cmd; memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_IN_ERROR; + cmd.valid.in.tf = IDE_VALID_ERROR; drive->hwif->tp_ops->tf_read(drive, &cmd); @@ -348,7 +348,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) tp_ops->write_devctl(hwif, ATA_NIEN | ATA_DEVCTL_OBS); memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT; + cmd.valid.out.tf = IDE_VALID_FEATURE | IDE_VALID_NSECT; cmd.tf.feature = SETFEATURES_XFER; cmd.tf.nsect = speed; diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 217b7fd..c9ef77c 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c @@ -71,11 +71,12 @@ static void ide_dump_sector(ide_drive_t *drive) u8 lba48 = !!(drive->dev_flags & IDE_DFLAG_LBA48); memset(&cmd, 0, sizeof(cmd)); - if (lba48) - cmd.tf_flags = IDE_TFLAG_IN_LBA | IDE_TFLAG_IN_HOB_LBA | - IDE_TFLAG_LBA48; - else - cmd.tf_flags = IDE_TFLAG_IN_LBA | IDE_TFLAG_IN_DEVICE; + if (lba48) { + cmd.valid.in.tf = IDE_VALID_LBA; + cmd.valid.in.hob = IDE_VALID_LBA; + cmd.tf_flags = IDE_TFLAG_LBA48; + } else + cmd.valid.in.tf = IDE_VALID_LBA | IDE_VALID_DEVICE; drive->hwif->tp_ops->tf_read(drive, &cmd); diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index 9490b44..310d03f 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c @@ -74,7 +74,8 @@ ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) tf->lbal = 0x4c; tf->lbam = 0x4e; tf->lbah = 0x55; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; } else /* cmd == REQ_UNPARK_HEADS */ tf->command = ATA_CMD_CHK_POWER; diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c index bb7858e..0d8a151 100644 --- a/drivers/ide/ide-pm.c +++ b/drivers/ide/ide-pm.c @@ -163,7 +163,8 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq) return ide_stopped; out_do_tf: - cmd->tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd->valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd->valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; cmd->protocol = ATA_PROT_NODATA; return do_rw_taskfile(drive, cmd); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index c1ef8c8..6a98d7c 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -287,7 +287,7 @@ int ide_dev_read_id(ide_drive_t *drive, u8 cmd, u16 *id) memset(&cmd, 0, sizeof(cmd)); /* disable DMA & overlap */ - cmd.tf_flags = IDE_TFLAG_OUT_FEATURE; + cmd.valid.out.tf = IDE_VALID_FEATURE; tp_ops->tf_load(drive, &cmd); } @@ -340,7 +340,7 @@ static u8 ide_read_device(ide_drive_t *drive) struct ide_cmd cmd; memset(&cmd, 0, sizeof(cmd)); - cmd.tf_flags = IDE_TFLAG_IN_DEVICE; + cmd.valid.in.tf = IDE_VALID_DEVICE; drive->hwif->tp_ops->tf_read(drive, &cmd); diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 10a88bf..3242698 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c @@ -204,8 +204,8 @@ static int set_xfer_rate (ide_drive_t *drive, int arg) cmd.tf.command = ATA_CMD_SET_FEATURES; cmd.tf.feature = SETFEATURES_XFER; cmd.tf.nsect = (u8)arg; - cmd.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT | - IDE_TFLAG_IN_NSECT; + cmd.valid.out.tf = IDE_VALID_FEATURE | IDE_VALID_NSECT; + cmd.valid.in.tf = IDE_VALID_NSECT; err = ide_no_data_taskfile(drive, &cmd); diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 243421c..dc84f8b 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -47,7 +47,8 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf) cmd.tf.command = ATA_CMD_ID_ATA; else cmd.tf.command = ATA_CMD_ID_ATAPI; - cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; cmd.protocol = ATA_PROT_PIO; return ide_raw_taskfile(drive, &cmd, buf, 1); @@ -494,11 +495,14 @@ int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) memcpy(&cmd.tf_array[6], req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE); - cmd.tf_flags = IDE_TFLAG_IO_16BIT | IDE_TFLAG_DEVICE | - IDE_TFLAG_IN_TF; + cmd.valid.out.tf = IDE_VALID_DEVICE; + cmd.valid.in.tf = IDE_VALID_DEVICE | IDE_VALID_IN_TF; + cmd.tf_flags = IDE_TFLAG_IO_16BIT; - if (drive->dev_flags & IDE_DFLAG_LBA48) - cmd.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_IN_HOB); + if (drive->dev_flags & IDE_DFLAG_LBA48) { + cmd.tf_flags |= IDE_TFLAG_LBA48; + cmd.valid.in.hob = IDE_VALID_IN_HOB; + } if (req_task->out_flags.all) { cmd.ftf_flags |= IDE_FTFLAG_FLAGGED; @@ -507,28 +511,28 @@ int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) cmd.ftf_flags |= IDE_FTFLAG_OUT_DATA; if (req_task->out_flags.b.nsector_hob) - cmd.tf_flags |= IDE_TFLAG_OUT_HOB_NSECT; + cmd.valid.out.hob |= IDE_VALID_NSECT; if (req_task->out_flags.b.sector_hob) - cmd.tf_flags |= IDE_TFLAG_OUT_HOB_LBAL; + cmd.valid.out.hob |= IDE_VALID_LBAL; if (req_task->out_flags.b.lcyl_hob) - cmd.tf_flags |= IDE_TFLAG_OUT_HOB_LBAM; + cmd.valid.out.hob |= IDE_VALID_LBAM; if (req_task->out_flags.b.hcyl_hob) - cmd.tf_flags |= IDE_TFLAG_OUT_HOB_LBAH; + cmd.valid.out.hob |= IDE_VALID_LBAH; if (req_task->out_flags.b.error_feature) - cmd.tf_flags |= IDE_TFLAG_OUT_FEATURE; + cmd.valid.out.tf |= IDE_VALID_FEATURE; if (req_task->out_flags.b.nsector) - cmd.tf_flags |= IDE_TFLAG_OUT_NSECT; + cmd.valid.out.tf |= IDE_VALID_NSECT; if (req_task->out_flags.b.sector) - cmd.tf_flags |= IDE_TFLAG_OUT_LBAL; + cmd.valid.out.tf |= IDE_VALID_LBAL; if (req_task->out_flags.b.lcyl) - cmd.tf_flags |= IDE_TFLAG_OUT_LBAM; + cmd.valid.out.tf |= IDE_VALID_LBAM; if (req_task->out_flags.b.hcyl) - cmd.tf_flags |= IDE_TFLAG_OUT_LBAH; + cmd.valid.out.tf |= IDE_VALID_LBAH; } else { - cmd.tf_flags |= IDE_TFLAG_OUT_TF; + cmd.valid.out.tf |= IDE_VALID_OUT_TF; if (cmd.tf_flags & IDE_TFLAG_LBA48) - cmd.tf_flags |= IDE_TFLAG_OUT_HOB; + cmd.valid.out.hob |= IDE_VALID_OUT_HOB; } if (req_task->in_flags.b.data) diff --git a/drivers/ide/ns87415.c b/drivers/ide/ns87415.c index 71a39fb..0208dd3 100644 --- a/drivers/ide/ns87415.c +++ b/drivers/ide/ns87415.c @@ -65,35 +65,38 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_taskfile *tf = &cmd->tf; + u8 valid = cmd->valid.in.tf; /* be sure we're looking at the low order bits */ outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) + if (valid & IDE_VALID_ERROR) tf->error = inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) + if (valid & IDE_VALID_NSECT) tf->nsect = inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) + if (valid & IDE_VALID_LBAL) tf->lbal = inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) + if (valid & IDE_VALID_LBAM) tf->lbam = inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) + if (valid & IDE_VALID_LBAH) tf->lbah = inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) + if (valid & IDE_VALID_DEVICE) tf->device = superio_ide_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) + valid = cmd->valid.in.hob; + + if (valid & IDE_VALID_ERROR) tf->hob_error = inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) + if (valid & IDE_VALID_NSECT) tf->hob_nsect = inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) + if (valid & IDE_VALID_LBAL) tf->hob_lbal = inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) + if (valid & IDE_VALID_LBAM) tf->hob_lbam = inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) + if (valid & IDE_VALID_LBAH) tf->hob_lbah = inb(io_ports->lbah_addr); } } diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 55e48db..38a715e 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -649,34 +649,37 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_taskfile *tf = &cmd->tf; + u8 valid = cmd->valid.out.hob; u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) HIHI = 0xFF; - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) + if (valid & IDE_VALID_FEATURE) scc_ide_outb(tf->hob_feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) + if (valid & IDE_VALID_NSECT) scc_ide_outb(tf->hob_nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) + if (valid & IDE_VALID_LBAL) scc_ide_outb(tf->hob_lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) + if (valid & IDE_VALID_LBAM) scc_ide_outb(tf->hob_lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) + if (valid & IDE_VALID_LBAH) scc_ide_outb(tf->hob_lbah, io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) + valid = cmd->valid.out.tf; + + if (valid & IDE_VALID_FEATURE) scc_ide_outb(tf->feature, io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) + if (valid & IDE_VALID_NSECT) scc_ide_outb(tf->nsect, io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) + if (valid & IDE_VALID_LBAL) scc_ide_outb(tf->lbal, io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) + if (valid & IDE_VALID_LBAM) scc_ide_outb(tf->lbam, io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) + if (valid & IDE_VALID_LBAH) scc_ide_outb(tf->lbah, io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) + if (valid & IDE_VALID_DEVICE) scc_ide_outb((tf->device & HIHI) | drive->select, io_ports->device_addr); } @@ -685,35 +688,38 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_taskfile *tf = &cmd->tf; + u8 valid = cmd->valid.in.tf; /* be sure we're looking at the low order bits */ scc_ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) + if (valid & IDE_VALID_ERROR) tf->error = scc_ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) + if (valid & IDE_VALID_NSECT) tf->nsect = scc_ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) + if (valid & IDE_VALID_LBAL) tf->lbal = scc_ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) + if (valid & IDE_VALID_LBAM) tf->lbam = scc_ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) + if (valid & IDE_VALID_LBAH) tf->lbah = scc_ide_inb(io_ports->lbah_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) + if (valid & IDE_VALID_DEVICE) tf->device = scc_ide_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { scc_ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) + valid = cmd->valid.in.hob; + + if (valid & IDE_VALID_ERROR) tf->hob_error = scc_ide_inb(io_ports->feature_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) + if (valid & IDE_VALID_NSECT) tf->hob_nsect = scc_ide_inb(io_ports->nsect_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) + if (valid & IDE_VALID_LBAL) tf->hob_lbal = scc_ide_inb(io_ports->lbal_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) + if (valid & IDE_VALID_LBAM) tf->hob_lbam = scc_ide_inb(io_ports->lbam_addr); - if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) + if (valid & IDE_VALID_LBAH) tf->hob_lbah = scc_ide_inb(io_ports->lbah_addr); } } diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index bee9461..af8b0f6 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -438,7 +438,7 @@ static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { ide_tf_load(drive, cmd); - if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) + if (cmd->valid.out.tf & IDE_VALID_DEVICE) tx4939ide_tf_load_fixup(drive); } diff --git a/include/linux/ide.h b/include/linux/ide.h index a5d26f6..58951f5 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -240,65 +240,38 @@ typedef enum { } ide_startstop_t; enum { + IDE_VALID_ERROR = (1 << 1), + IDE_VALID_FEATURE = IDE_VALID_ERROR, + IDE_VALID_NSECT = (1 << 2), + IDE_VALID_LBAL = (1 << 3), + IDE_VALID_LBAM = (1 << 4), + IDE_VALID_LBAH = (1 << 5), + IDE_VALID_DEVICE = (1 << 6), + IDE_VALID_LBA = IDE_VALID_LBAL | + IDE_VALID_LBAM | + IDE_VALID_LBAH, + IDE_VALID_OUT_TF = IDE_VALID_FEATURE | + IDE_VALID_NSECT | + IDE_VALID_LBA, + IDE_VALID_IN_TF = IDE_VALID_NSECT | + IDE_VALID_LBA, + IDE_VALID_OUT_HOB = IDE_VALID_OUT_TF, + IDE_VALID_IN_HOB = IDE_VALID_ERROR | + IDE_VALID_NSECT | + IDE_VALID_LBA, +}; + +enum { IDE_TFLAG_LBA48 = (1 << 0), - IDE_TFLAG_OUT_HOB_FEATURE = (1 << 1), - IDE_TFLAG_OUT_HOB_NSECT = (1 << 2), - IDE_TFLAG_OUT_HOB_LBAL = (1 << 3), - IDE_TFLAG_OUT_HOB_LBAM = (1 << 4), - IDE_TFLAG_OUT_HOB_LBAH = (1 << 5), - IDE_TFLAG_OUT_HOB = IDE_TFLAG_OUT_HOB_FEATURE | - IDE_TFLAG_OUT_HOB_NSECT | - IDE_TFLAG_OUT_HOB_LBAL | - IDE_TFLAG_OUT_HOB_LBAM | - IDE_TFLAG_OUT_HOB_LBAH, - IDE_TFLAG_OUT_FEATURE = (1 << 6), - IDE_TFLAG_OUT_NSECT = (1 << 7), - IDE_TFLAG_OUT_LBAL = (1 << 8), - IDE_TFLAG_OUT_LBAM = (1 << 9), - IDE_TFLAG_OUT_LBAH = (1 << 10), - IDE_TFLAG_OUT_TF = IDE_TFLAG_OUT_FEATURE | - IDE_TFLAG_OUT_NSECT | - IDE_TFLAG_OUT_LBAL | - IDE_TFLAG_OUT_LBAM | - IDE_TFLAG_OUT_LBAH, - IDE_TFLAG_OUT_DEVICE = (1 << 11), - IDE_TFLAG_WRITE = (1 << 12), - IDE_TFLAG_CUSTOM_HANDLER = (1 << 13), - IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 14), - IDE_TFLAG_IN_HOB_ERROR = (1 << 15), - IDE_TFLAG_IN_HOB_NSECT = (1 << 16), - IDE_TFLAG_IN_HOB_LBAL = (1 << 17), - IDE_TFLAG_IN_HOB_LBAM = (1 << 18), - IDE_TFLAG_IN_HOB_LBAH = (1 << 19), - IDE_TFLAG_IN_HOB_LBA = IDE_TFLAG_IN_HOB_LBAL | - IDE_TFLAG_IN_HOB_LBAM | - IDE_TFLAG_IN_HOB_LBAH, - IDE_TFLAG_IN_HOB = IDE_TFLAG_IN_HOB_ERROR | - IDE_TFLAG_IN_HOB_NSECT | - IDE_TFLAG_IN_HOB_LBA, - IDE_TFLAG_IN_ERROR = (1 << 20), - IDE_TFLAG_IN_NSECT = (1 << 21), - IDE_TFLAG_IN_LBAL = (1 << 22), - IDE_TFLAG_IN_LBAM = (1 << 23), - IDE_TFLAG_IN_LBAH = (1 << 24), - IDE_TFLAG_IN_LBA = IDE_TFLAG_IN_LBAL | - IDE_TFLAG_IN_LBAM | - IDE_TFLAG_IN_LBAH, - IDE_TFLAG_IN_TF = IDE_TFLAG_IN_NSECT | - IDE_TFLAG_IN_LBA, - IDE_TFLAG_IN_DEVICE = (1 << 25), - IDE_TFLAG_HOB = IDE_TFLAG_OUT_HOB | - IDE_TFLAG_IN_HOB, - IDE_TFLAG_TF = IDE_TFLAG_OUT_TF | - IDE_TFLAG_IN_TF, - IDE_TFLAG_DEVICE = IDE_TFLAG_OUT_DEVICE | - IDE_TFLAG_IN_DEVICE, + IDE_TFLAG_WRITE = (1 << 1), + IDE_TFLAG_CUSTOM_HANDLER = (1 << 2), + IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 3), /* force 16-bit I/O operations */ - IDE_TFLAG_IO_16BIT = (1 << 26), + IDE_TFLAG_IO_16BIT = (1 << 4), /* struct ide_cmd was allocated using kmalloc() */ - IDE_TFLAG_DYN = (1 << 27), - IDE_TFLAG_FS = (1 << 28), - IDE_TFLAG_MULTI_PIO = (1 << 29), + IDE_TFLAG_DYN = (1 << 5), + IDE_TFLAG_FS = (1 << 6), + IDE_TFLAG_MULTI_PIO = (1 << 7), }; enum { @@ -346,8 +319,16 @@ struct ide_cmd { struct ide_taskfile tf; u8 tf_array[14]; }; + + struct { + struct { + u8 tf; + u8 hob; + } out, in; + } valid; + + u8 tf_flags; u8 ftf_flags; /* for TASKFILE ioctl */ - u32 tf_flags; int protocol; int sg_nents; /* number of sg entries */ -- cgit v0.10.2 From 745483f10c6cefb303007c6873e2bfce54efa8ed Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:02 +0200 Subject: ide: simplify 'struct ide_taskfile' Make 'struct ide_taskfile' cover only 8 register values and thus put two such fields ('tf' and 'hob') into 'struct ide_cmd', dropping unnecessary 'tf_array' field from it. This required changing the prototype of ide_get_lba_addr() and ide_tf_dump(). Signed-off-by: Sergei Shtylyov [bart: fix setting of ATA_LBA bit for LBA48 commands in __ide_do_rw_disk()] Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c index f0db4d3..77f79d2 100644 --- a/drivers/ide/ide-acpi.c +++ b/drivers/ide/ide-acpi.c @@ -318,7 +318,7 @@ static int do_drive_set_taskfiles(ide_drive_t *drive, /* convert GTF to taskfile */ memset(&cmd, 0, sizeof(cmd)); - memcpy(&cmd.tf_array[7], gtf, REGS_PER_GTF); + memcpy(&cmd.tf.feature, gtf, REGS_PER_GTF); cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 235263e..a9fbe2c 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -105,17 +105,19 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, pr_debug("%s: LBA=0x%012llx\n", drive->name, (unsigned long long)block); - tf->hob_nsect = (nsectors >> 8) & 0xff; - tf->hob_lbal = (u8)(block >> 24); - if (sizeof(block) != 4) { - tf->hob_lbam = (u8)((u64)block >> 32); - tf->hob_lbah = (u8)((u64)block >> 40); - } - tf->nsect = nsectors & 0xff; tf->lbal = (u8) block; tf->lbam = (u8)(block >> 8); tf->lbah = (u8)(block >> 16); + tf->device = ATA_LBA; + + tf = &cmd.hob; + tf->nsect = (nsectors >> 8) & 0xff; + tf->lbal = (u8)(block >> 24); + if (sizeof(block) != 4) { + tf->lbam = (u8)((u64)block >> 32); + tf->lbah = (u8)((u64)block >> 40); + } cmd.valid.out.hob = IDE_VALID_OUT_HOB; cmd.valid.in.hob = IDE_VALID_IN_HOB; @@ -125,10 +127,8 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, tf->lbal = block; tf->lbam = block >>= 8; tf->lbah = block >>= 8; - tf->device = (block >> 8) & 0xf; + tf->device = ((block >> 8) & 0xf) | ATA_LBA; } - - tf->device |= ATA_LBA; } else { unsigned int sect, head, cyl, track; @@ -235,7 +235,7 @@ static u64 idedisk_read_native_max_address(ide_drive_t *drive, int lba48) /* if OK, compute maximum address value */ if (!(tf->status & ATA_ERR)) - addr = ide_get_lba_addr(tf, lba48) + 1; + addr = ide_get_lba_addr(&cmd, lba48) + 1; return addr; } @@ -257,9 +257,9 @@ static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48) tf->lbam = (addr_req >>= 8) & 0xff; tf->lbah = (addr_req >>= 8) & 0xff; if (lba48) { - tf->hob_lbal = (addr_req >>= 8) & 0xff; - tf->hob_lbam = (addr_req >>= 8) & 0xff; - tf->hob_lbah = (addr_req >>= 8) & 0xff; + cmd.hob.lbal = (addr_req >>= 8) & 0xff; + cmd.hob.lbam = (addr_req >>= 8) & 0xff; + cmd.hob.lbah = (addr_req >>= 8) & 0xff; tf->command = ATA_CMD_SET_MAX_EXT; } else { tf->device = (addr_req >>= 8) & 0x0f; @@ -279,7 +279,7 @@ static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48) /* if OK, compute maximum address value */ if (!(tf->status & ATA_ERR)) - addr_set = ide_get_lba_addr(tf, lba48) + 1; + addr_set = ide_get_lba_addr(&cmd, lba48) + 1; return addr_set; } diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 8b0b2e9..45a424b 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -89,7 +89,7 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { ide_hwif_t *hwif = drive->hwif; struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; + struct ide_taskfile *tf = &cmd->hob; void (*tf_outb)(u8 addr, unsigned long port); u8 valid = cmd->valid.out.hob; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; @@ -104,16 +104,17 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) HIHI = 0xFF; if (valid & IDE_VALID_FEATURE) - tf_outb(tf->hob_feature, io_ports->feature_addr); + tf_outb(tf->feature, io_ports->feature_addr); if (valid & IDE_VALID_NSECT) - tf_outb(tf->hob_nsect, io_ports->nsect_addr); + tf_outb(tf->nsect, io_ports->nsect_addr); if (valid & IDE_VALID_LBAL) - tf_outb(tf->hob_lbal, io_ports->lbal_addr); + tf_outb(tf->lbal, io_ports->lbal_addr); if (valid & IDE_VALID_LBAM) - tf_outb(tf->hob_lbam, io_ports->lbam_addr); + tf_outb(tf->lbam, io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) - tf_outb(tf->hob_lbah, io_ports->lbah_addr); + tf_outb(tf->lbah, io_ports->lbah_addr); + tf = &cmd->tf; valid = cmd->valid.out.tf; if (valid & IDE_VALID_FEATURE) @@ -170,18 +171,19 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) if (cmd->tf_flags & IDE_TFLAG_LBA48) { tf_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + tf = &cmd->hob; valid = cmd->valid.in.hob; if (valid & IDE_VALID_ERROR) - tf->hob_error = tf_inb(io_ports->feature_addr); + tf->error = tf_inb(io_ports->feature_addr); if (valid & IDE_VALID_NSECT) - tf->hob_nsect = tf_inb(io_ports->nsect_addr); + tf->nsect = tf_inb(io_ports->nsect_addr); if (valid & IDE_VALID_LBAL) - tf->hob_lbal = tf_inb(io_ports->lbal_addr); + tf->lbal = tf_inb(io_ports->lbal_addr); if (valid & IDE_VALID_LBAM) - tf->hob_lbam = tf_inb(io_ports->lbam_addr); + tf->lbam = tf_inb(io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) - tf->hob_lbah = tf_inb(io_ports->lbah_addr); + tf->lbah = tf_inb(io_ports->lbah_addr); } } EXPORT_SYMBOL_GPL(ide_tf_read); diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 99bb0a9..e71c72b 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -86,8 +86,8 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) tp_ops->input_data(drive, cmd, data, 2); - tf->data = data[0]; - tf->hob_data = data[1]; + cmd->tf.data = data[0]; + cmd->hob.data = data[1]; } tp_ops->tf_read(drive, cmd); @@ -97,7 +97,7 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) if (tf->lbal != 0xc4) { printk(KERN_ERR "%s: head unload failed!\n", drive->name); - ide_tf_dump(drive->name, tf); + ide_tf_dump(drive->name, cmd); } else drive->dev_flags |= IDE_DFLAG_PARKED; } diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index b11df4b..c1c25eb 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c @@ -206,7 +206,7 @@ static int ide_task_ioctl(ide_drive_t *drive, unsigned long arg) return -EFAULT; memset(&cmd, 0, sizeof(cmd)); - memcpy(&cmd.tf_array[7], &args[1], 6); + memcpy(&cmd.tf.feature, &args[1], 6); cmd.tf.command = args[0]; cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; @@ -214,7 +214,7 @@ static int ide_task_ioctl(ide_drive_t *drive, unsigned long arg) err = ide_no_data_taskfile(drive, &cmd); args[0] = cmd.tf.command; - memcpy(&args[1], &cmd.tf_array[7], 6); + memcpy(&args[1], &cmd.tf.feature, 6); if (copy_to_user(p, args, 7)) err = -EFAULT; diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index c9ef77c..6857e6a 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c @@ -49,16 +49,17 @@ static void ide_dump_opcode(ide_drive_t *drive) printk(KERN_CONT "0x%02x\n", cmd->tf.command); } -u64 ide_get_lba_addr(struct ide_taskfile *tf, int lba48) +u64 ide_get_lba_addr(struct ide_cmd *cmd, int lba48) { + struct ide_taskfile *tf = &cmd->tf; u32 high, low; - if (lba48) - high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) | - tf->hob_lbal; - else - high = tf->device & 0xf; low = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal; + if (lba48) { + tf = &cmd->hob; + high = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal; + } else + high = tf->device & 0xf; return ((u64)high << 24) | low; } @@ -82,7 +83,7 @@ static void ide_dump_sector(ide_drive_t *drive) if (lba48 || (tf->device & ATA_LBA)) printk(KERN_CONT ", LBAsect=%llu", - (unsigned long long)ide_get_lba_addr(tf, lba48)); + (unsigned long long)ide_get_lba_addr(&cmd, lba48)); else printk(KERN_CONT ", CHS=%d/%d/%d", (tf->lbah << 8) + tf->lbam, tf->device & 0xf, tf->lbal); diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index dc84f8b..3160be4 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -23,17 +23,16 @@ #include #include -void ide_tf_dump(const char *s, struct ide_taskfile *tf) +void ide_tf_dump(const char *s, struct ide_cmd *cmd) { #ifdef DEBUG printk("%s: tf: feat 0x%02x nsect 0x%02x lbal 0x%02x " "lbam 0x%02x lbah 0x%02x dev 0x%02x cmd 0x%02x\n", - s, tf->feature, tf->nsect, tf->lbal, - tf->lbam, tf->lbah, tf->device, tf->command); - printk("%s: hob: nsect 0x%02x lbal 0x%02x " - "lbam 0x%02x lbah 0x%02x\n", - s, tf->hob_nsect, tf->hob_lbal, - tf->hob_lbam, tf->hob_lbah); + s, cmd->tf.feature, cmd->tf.nsect, + cmd->tf.lbal, cmd->tf.lbam, cmd->tf.lbah, + cmd->tf.device, cmd->tf.command); + printk("%s: hob: nsect 0x%02x lbal 0x%02x lbam 0x%02x lbah 0x%02x\n", + s, cmd->hob.nsect, cmd->hob.lbal, cmd->hob.lbam, cmd->hob.lbah); #endif } @@ -80,12 +79,12 @@ ide_startstop_t do_rw_taskfile(ide_drive_t *drive, struct ide_cmd *orig_cmd) memcpy(cmd, orig_cmd, sizeof(*cmd)); if ((cmd->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) { - ide_tf_dump(drive->name, tf); + ide_tf_dump(drive->name, cmd); tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); SELECT_MASK(drive, 0); if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) { - u8 data[2] = { tf->data, tf->hob_data }; + u8 data[2] = { cmd->tf.data, cmd->hob.data }; tp_ops->output_data(drive, cmd, data, 2); } @@ -490,10 +489,8 @@ int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) memset(&cmd, 0, sizeof(cmd)); - memcpy(&cmd.tf_array[0], req_task->hob_ports, - HDIO_DRIVE_HOB_HDR_SIZE - 2); - memcpy(&cmd.tf_array[6], req_task->io_ports, - HDIO_DRIVE_TASK_HDR_SIZE); + memcpy(&cmd.hob, req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2); + memcpy(&cmd.tf, req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE); cmd.valid.out.tf = IDE_VALID_DEVICE; cmd.valid.in.tf = IDE_VALID_DEVICE | IDE_VALID_IN_TF; @@ -598,7 +595,7 @@ int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) if (req_task->req_cmd == IDE_DRIVE_TASK_NO_DATA) nsect = 0; else if (!nsect) { - nsect = (cmd.tf.hob_nsect << 8) | cmd.tf.nsect; + nsect = (cmd.hob.nsect << 8) | cmd.tf.nsect; if (!nsect) { printk(KERN_ERR "%s: in/out command without data\n", @@ -610,10 +607,8 @@ int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) err = ide_raw_taskfile(drive, &cmd, data_buf, nsect); - memcpy(req_task->hob_ports, &cmd.tf_array[0], - HDIO_DRIVE_HOB_HDR_SIZE - 2); - memcpy(req_task->io_ports, &cmd.tf_array[6], - HDIO_DRIVE_TASK_HDR_SIZE); + memcpy(req_task->hob_ports, &cmd.hob, HDIO_DRIVE_HOB_HDR_SIZE - 2); + memcpy(req_task->io_ports, &cmd.tf, HDIO_DRIVE_TASK_HDR_SIZE); if ((cmd.ftf_flags & IDE_FTFLAG_SET_IN_FLAGS) && req_task->in_flags.all == 0) { diff --git a/drivers/ide/ns87415.c b/drivers/ide/ns87415.c index 0208dd3..3ab5bb1 100644 --- a/drivers/ide/ns87415.c +++ b/drivers/ide/ns87415.c @@ -86,18 +86,19 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) if (cmd->tf_flags & IDE_TFLAG_LBA48) { outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + tf = &cmd->hob; valid = cmd->valid.in.hob; if (valid & IDE_VALID_ERROR) - tf->hob_error = inb(io_ports->feature_addr); + tf->error = inb(io_ports->feature_addr); if (valid & IDE_VALID_NSECT) - tf->hob_nsect = inb(io_ports->nsect_addr); + tf->nsect = inb(io_ports->nsect_addr); if (valid & IDE_VALID_LBAL) - tf->hob_lbal = inb(io_ports->lbal_addr); + tf->lbal = inb(io_ports->lbal_addr); if (valid & IDE_VALID_LBAM) - tf->hob_lbam = inb(io_ports->lbam_addr); + tf->lbam = inb(io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) - tf->hob_lbah = inb(io_ports->lbah_addr); + tf->lbah = inb(io_ports->lbah_addr); } } diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 38a715e..1238d55 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -648,7 +648,7 @@ static int __devinit init_setup_scc(struct pci_dev *dev, static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; + struct ide_taskfile *tf = &cmd->hob; u8 valid = cmd->valid.out.hob; u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; @@ -656,16 +656,17 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) HIHI = 0xFF; if (valid & IDE_VALID_FEATURE) - scc_ide_outb(tf->hob_feature, io_ports->feature_addr); + scc_ide_outb(tf->feature, io_ports->feature_addr); if (valid & IDE_VALID_NSECT) - scc_ide_outb(tf->hob_nsect, io_ports->nsect_addr); + scc_ide_outb(tf->nsect, io_ports->nsect_addr); if (valid & IDE_VALID_LBAL) - scc_ide_outb(tf->hob_lbal, io_ports->lbal_addr); + scc_ide_outb(tf->lbal, io_ports->lbal_addr); if (valid & IDE_VALID_LBAM) - scc_ide_outb(tf->hob_lbam, io_ports->lbam_addr); + scc_ide_outb(tf->lbam, io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) - scc_ide_outb(tf->hob_lbah, io_ports->lbah_addr); + scc_ide_outb(tf->lbah, io_ports->lbah_addr); + tf = &cmd->tf; valid = cmd->valid.out.tf; if (valid & IDE_VALID_FEATURE) @@ -709,18 +710,19 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) if (cmd->tf_flags & IDE_TFLAG_LBA48) { scc_ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + tf = &cmd->hob; valid = cmd->valid.in.hob; if (valid & IDE_VALID_ERROR) - tf->hob_error = scc_ide_inb(io_ports->feature_addr); + tf->error = scc_ide_inb(io_ports->feature_addr); if (valid & IDE_VALID_NSECT) - tf->hob_nsect = scc_ide_inb(io_ports->nsect_addr); + tf->nsect = scc_ide_inb(io_ports->nsect_addr); if (valid & IDE_VALID_LBAL) - tf->hob_lbal = scc_ide_inb(io_ports->lbal_addr); + tf->lbal = scc_ide_inb(io_ports->lbal_addr); if (valid & IDE_VALID_LBAM) - tf->hob_lbam = scc_ide_inb(io_ports->lbam_addr); + tf->lbam = scc_ide_inb(io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) - tf->hob_lbah = scc_ide_inb(io_ports->lbah_addr); + tf->lbah = scc_ide_inb(io_ports->lbah_addr); } } diff --git a/include/linux/ide.h b/include/linux/ide.h index 58951f5..e2ea38d 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -282,44 +282,25 @@ enum { }; struct ide_taskfile { - u8 hob_data; /* 0: high data byte (for TASKFILE IOCTL) */ - /* 1-5: additional data to support LBA48 */ - union { - u8 hob_error; /* read: error */ - u8 hob_feature; /* write: feature */ - }; - - u8 hob_nsect; - u8 hob_lbal; - u8 hob_lbam; - u8 hob_lbah; - - u8 data; /* 6: low data byte (for TASKFILE IOCTL) */ - - union { /*  7: */ - u8 error; /* read: error */ - u8 feature; /* write: feature */ + u8 data; /* 0: data byte (for TASKFILE ioctl) */ + union { /* 1: */ + u8 error; /* read: error */ + u8 feature; /* write: feature */ }; - - u8 nsect; /* 8: number of sectors */ - u8 lbal; /* 9: LBA low */ - u8 lbam; /* 10: LBA mid */ - u8 lbah; /* 11: LBA high */ - - u8 device; /* 12: device select */ - - union { /* 13: */ - u8 status; /*  read: status  */ + u8 nsect; /* 2: number of sectors */ + u8 lbal; /* 3: LBA low */ + u8 lbam; /* 4: LBA mid */ + u8 lbah; /* 5: LBA high */ + u8 device; /* 6: device select */ + union { /* 7: */ + u8 status; /* read: status */ u8 command; /* write: command */ }; }; struct ide_cmd { - union { - struct ide_taskfile tf; - u8 tf_array[14]; - }; - + struct ide_taskfile tf; + struct ide_taskfile hob; struct { struct { u8 tf; @@ -1143,7 +1124,7 @@ extern int ide_devset_execute(ide_drive_t *drive, void ide_complete_cmd(ide_drive_t *, struct ide_cmd *, u8, u8); int ide_complete_rq(ide_drive_t *, int, unsigned int); -void ide_tf_dump(const char *, struct ide_taskfile *); +void ide_tf_dump(const char *, struct ide_cmd *); void ide_exec_command(ide_hwif_t *, u8); u8 ide_read_status(ide_hwif_t *); @@ -1510,7 +1491,7 @@ static inline void ide_set_hwifdata (ide_hwif_t * hwif, void *data) extern void ide_toggle_bounce(ide_drive_t *drive, int on); -u64 ide_get_lba_addr(struct ide_taskfile *, int); +u64 ide_get_lba_addr(struct ide_cmd *, int); u8 ide_dump_status(ide_drive_t *, const char *, u8); struct ide_timing { -- cgit v0.10.2 From 4109d19af73826aa6fee1a1b951670381be88f8b Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:02 +0200 Subject: ide: move common code out of tf_load() method Move device register masking (and setting drive->select) out of tf_load() method and into the only function that needs to use this code, do_rw_taskfile()... Signed-off-by: Sergei Shtylyov [bart: fix whitespace error] Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 45a424b..7950b3b 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -93,16 +93,12 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) void (*tf_outb)(u8 addr, unsigned long port); u8 valid = cmd->valid.out.hob; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; - u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; if (mmio) tf_outb = ide_mm_outb; else tf_outb = ide_outb; - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; - if (valid & IDE_VALID_FEATURE) tf_outb(tf->feature, io_ports->feature_addr); if (valid & IDE_VALID_NSECT) @@ -127,10 +123,8 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) tf_outb(tf->lbam, io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) tf_outb(tf->lbah, io_ports->lbah_addr); - if (valid & IDE_VALID_DEVICE) - tf_outb((tf->device & HIHI) | drive->select, - io_ports->device_addr); + tf_outb(tf->device, io_ports->device_addr); } EXPORT_SYMBOL_GPL(ide_tf_load); diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 3160be4..0318a4c 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -88,6 +88,16 @@ ide_startstop_t do_rw_taskfile(ide_drive_t *drive, struct ide_cmd *orig_cmd) tp_ops->output_data(drive, cmd, data, 2); } + + if (cmd->valid.out.tf & IDE_VALID_DEVICE) { + u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? + 0xE0 : 0xEF; + + if (!(cmd->ftf_flags & IDE_FTFLAG_FLAGGED)) + cmd->tf.device &= HIHI; + cmd->tf.device |= drive->select; + } + tp_ops->tf_load(drive, cmd); } diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 1238d55..f5a6fa0 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -650,10 +650,6 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_taskfile *tf = &cmd->hob; u8 valid = cmd->valid.out.hob; - u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; - - if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) - HIHI = 0xFF; if (valid & IDE_VALID_FEATURE) scc_ide_outb(tf->feature, io_ports->feature_addr); @@ -679,10 +675,8 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) scc_ide_outb(tf->lbam, io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) scc_ide_outb(tf->lbah, io_ports->lbah_addr); - if (valid & IDE_VALID_DEVICE) - scc_ide_outb((tf->device & HIHI) | drive->select, - io_ports->device_addr); + scc_ide_outb(tf->device, io_ports->device_addr); } static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) -- cgit v0.10.2 From 30881b9ac91e7c23e0ceb8414ab7de1961809bdd Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:02 +0200 Subject: ide: call write_devctl() method from tf_read() method Use write_devctl() method to clear/set the HOB bit in tf_read() method. Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 7950b3b..66c2776 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -133,21 +133,17 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) ide_hwif_t *hwif = drive->hwif; struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_taskfile *tf = &cmd->tf; - void (*tf_outb)(u8 addr, unsigned long port); u8 (*tf_inb)(unsigned long port); u8 valid = cmd->valid.in.tf; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; - if (mmio) { - tf_outb = ide_mm_outb; + if (mmio) tf_inb = ide_mm_inb; - } else { - tf_outb = ide_outb; + else tf_inb = ide_inb; - } /* be sure we're looking at the low order bits */ - tf_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); + hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); if (valid & IDE_VALID_ERROR) tf->error = tf_inb(io_ports->feature_addr); @@ -163,7 +159,7 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->device = tf_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { - tf_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + hwif->tp_ops->write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); tf = &cmd->hob; valid = cmd->valid.in.hob; diff --git a/drivers/ide/ns87415.c b/drivers/ide/ns87415.c index 3ab5bb1..f1305f4 100644 --- a/drivers/ide/ns87415.c +++ b/drivers/ide/ns87415.c @@ -68,7 +68,7 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) u8 valid = cmd->valid.in.tf; /* be sure we're looking at the low order bits */ - outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); + ide_write_devctl(hwif, ATA_DEVCTL_OBS); if (valid & IDE_VALID_ERROR) tf->error = inb(io_ports->feature_addr); @@ -84,7 +84,7 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->device = superio_ide_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { - outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + ide_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); tf = &cmd->hob; valid = cmd->valid.in.hob; diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index f5a6fa0..feabf54 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -686,7 +686,7 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) u8 valid = cmd->valid.in.tf; /* be sure we're looking at the low order bits */ - scc_ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); + scc_write_devctl(hwif, ATA_DEVCTL_OBS); if (valid & IDE_VALID_ERROR) tf->error = scc_ide_inb(io_ports->feature_addr); @@ -702,7 +702,7 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->device = scc_ide_inb(io_ports->device_addr); if (cmd->tf_flags & IDE_TFLAG_LBA48) { - scc_ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); + scc_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); tf = &cmd->hob; valid = cmd->valid.in.hob; -- cgit v0.10.2 From c9ff9e7b64138d87023b733e618f29a1d58543f7 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:03 +0200 Subject: ide: refactor tf_load() method Simplify tf_load() method, making it deal only with 'struct ide_taskfile' and the validity flags that the upper layer passes, and moving the code that deals with the high order bytes into the only function interested, do_rw_taskfile(). This should stop the needless code duplication in this method and so make it about twice smaller than it was; along with simplifying the setup for the method call, this should save both time and space... Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 66c2776..481e221 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -85,13 +85,11 @@ void ide_dev_select(ide_drive_t *drive) } EXPORT_SYMBOL_GPL(ide_dev_select); -void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) +void ide_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) { ide_hwif_t *hwif = drive->hwif; struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->hob; void (*tf_outb)(u8 addr, unsigned long port); - u8 valid = cmd->valid.out.hob; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; if (mmio) @@ -109,20 +107,6 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) tf_outb(tf->lbam, io_ports->lbam_addr); if (valid & IDE_VALID_LBAH) tf_outb(tf->lbah, io_ports->lbah_addr); - - tf = &cmd->tf; - valid = cmd->valid.out.tf; - - if (valid & IDE_VALID_FEATURE) - tf_outb(tf->feature, io_ports->feature_addr); - if (valid & IDE_VALID_NSECT) - tf_outb(tf->nsect, io_ports->nsect_addr); - if (valid & IDE_VALID_LBAL) - tf_outb(tf->lbal, io_ports->lbal_addr); - if (valid & IDE_VALID_LBAM) - tf_outb(tf->lbam, io_ports->lbam_addr); - if (valid & IDE_VALID_LBAH) - tf_outb(tf->lbah, io_ports->lbah_addr); if (valid & IDE_VALID_DEVICE) tf_outb(tf->device, io_ports->device_addr); } diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 0fdf0df..6f1ed42 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -312,10 +312,10 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) { ide_hwif_t *hwif = drive->hwif; const struct ide_tp_ops *tp_ops = hwif->tp_ops; + struct ide_taskfile tf; u16 *id = drive->id, i; int error = 0; u8 stat; - struct ide_cmd cmd; #ifdef CONFIG_BLK_DEV_IDEDMA if (hwif->dma_ops) /* check if host supports DMA */ @@ -347,12 +347,11 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) udelay(1); tp_ops->write_devctl(hwif, ATA_NIEN | ATA_DEVCTL_OBS); - memset(&cmd, 0, sizeof(cmd)); - cmd.valid.out.tf = IDE_VALID_FEATURE | IDE_VALID_NSECT; - cmd.tf.feature = SETFEATURES_XFER; - cmd.tf.nsect = speed; + memset(&tf, 0, sizeof(tf)); + tf.feature = SETFEATURES_XFER; + tf.nsect = speed; - tp_ops->tf_load(drive, &cmd); + tp_ops->tf_load(drive, &tf, IDE_VALID_FEATURE | IDE_VALID_NSECT); tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 6a98d7c..44d7816 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -283,13 +283,11 @@ int ide_dev_read_id(ide_drive_t *drive, u8 cmd, u16 *id) * identify command to be sure of reply */ if (cmd == ATA_CMD_ID_ATAPI) { - struct ide_cmd cmd; + struct ide_taskfile tf; - memset(&cmd, 0, sizeof(cmd)); + memset(&tf, 0, sizeof(tf)); /* disable DMA & overlap */ - cmd.valid.out.tf = IDE_VALID_FEATURE; - - tp_ops->tf_load(drive, &cmd); + tp_ops->tf_load(drive, &tf, IDE_VALID_FEATURE); } /* ask drive for ID */ diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 0318a4c..b1806ed 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -98,7 +98,8 @@ ide_startstop_t do_rw_taskfile(ide_drive_t *drive, struct ide_cmd *orig_cmd) cmd->tf.device |= drive->select; } - tp_ops->tf_load(drive, cmd); + tp_ops->tf_load(drive, &cmd->hob, cmd->valid.out.hob); + tp_ops->tf_load(drive, &cmd->tf, cmd->valid.out.tf); } switch (cmd->protocol) { diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index feabf54..5ecb70c 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -645,25 +645,9 @@ static int __devinit init_setup_scc(struct pci_dev *dev, return rc; } -static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) +static void scc_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; - struct ide_taskfile *tf = &cmd->hob; - u8 valid = cmd->valid.out.hob; - - if (valid & IDE_VALID_FEATURE) - scc_ide_outb(tf->feature, io_ports->feature_addr); - if (valid & IDE_VALID_NSECT) - scc_ide_outb(tf->nsect, io_ports->nsect_addr); - if (valid & IDE_VALID_LBAL) - scc_ide_outb(tf->lbal, io_ports->lbal_addr); - if (valid & IDE_VALID_LBAM) - scc_ide_outb(tf->lbam, io_ports->lbam_addr); - if (valid & IDE_VALID_LBAH) - scc_ide_outb(tf->lbah, io_ports->lbah_addr); - - tf = &cmd->tf; - valid = cmd->valid.out.tf; if (valid & IDE_VALID_FEATURE) scc_ide_outb(tf->feature, io_ports->feature_addr); diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c index af8b0f6..564422d 100644 --- a/drivers/ide/tx4939ide.c +++ b/drivers/ide/tx4939ide.c @@ -434,11 +434,12 @@ static void tx4939ide_tf_load_fixup(ide_drive_t *drive) tx4939ide_writew(sysctl, base, TX4939IDE_Sys_Ctl); } -static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd) +static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, + u8 valid) { - ide_tf_load(drive, cmd); + ide_tf_load(drive, tf, valid); - if (cmd->valid.out.tf & IDE_VALID_DEVICE) + if (valid & IDE_VALID_DEVICE) tx4939ide_tf_load_fixup(drive); } diff --git a/include/linux/ide.h b/include/linux/ide.h index e2ea38d..0ba1c6a 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -624,7 +624,7 @@ struct ide_tp_ops { void (*write_devctl)(struct hwif_s *, u8); void (*dev_select)(ide_drive_t *); - void (*tf_load)(ide_drive_t *, struct ide_cmd *); + void (*tf_load)(ide_drive_t *, struct ide_taskfile *, u8); void (*tf_read)(ide_drive_t *, struct ide_cmd *); void (*input_data)(ide_drive_t *, struct ide_cmd *, @@ -1132,7 +1132,7 @@ u8 ide_read_altstatus(ide_hwif_t *); void ide_write_devctl(ide_hwif_t *, u8); void ide_dev_select(ide_drive_t *); -void ide_tf_load(ide_drive_t *, struct ide_cmd *); +void ide_tf_load(ide_drive_t *, struct ide_taskfile *, u8); void ide_tf_read(ide_drive_t *, struct ide_cmd *); void ide_input_data(ide_drive_t *, struct ide_cmd *, void *, unsigned int); -- cgit v0.10.2 From 3153c26b54230d025c6d536e8d3015def4524906 Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Wed, 8 Apr 2009 14:13:03 +0200 Subject: ide: refactor tf_read() method Simplify tf_read() method, making it deal only with 'struct ide_taskfile' and the validity flags that the upper layer passes, and factoring out the code that deals with the high order bytes into ide_tf_readback() to be called from the only two functions interested, ide_complete_cmd() and ide_dump_sector(). This should stop the needless code duplication in this method and so make it about twice smaller than it was; along with simplifying the setup for the method call, this should save both time and space... Signed-off-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index a359323..7201b17 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c @@ -254,15 +254,13 @@ EXPORT_SYMBOL_GPL(ide_cd_get_xferlen); void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) { - struct ide_cmd cmd; + struct ide_taskfile tf; - memset(&cmd, 0, sizeof(cmd)); - cmd.valid.in.tf = IDE_VALID_LBAH | IDE_VALID_LBAM | IDE_VALID_NSECT; + drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT | + IDE_VALID_LBAM | IDE_VALID_LBAH); - drive->hwif->tp_ops->tf_read(drive, &cmd); - - *bcount = (cmd.tf.lbah << 8) | cmd.tf.lbam; - *ireason = cmd.tf.nsect & 3; + *bcount = (tf.lbah << 8) | tf.lbam; + *ireason = tf.nsect & 3; } EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); @@ -452,14 +450,11 @@ static void ide_init_packet_cmd(struct ide_cmd *cmd, u8 valid_tf, static u8 ide_read_ireason(ide_drive_t *drive) { - struct ide_cmd cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.valid.in.tf = IDE_VALID_NSECT; + struct ide_taskfile tf; - drive->hwif->tp_ops->tf_read(drive, &cmd); + drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT); - return cmd.tf.nsect & 3; + return tf.nsect & 3; } static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 481e221..46721c4 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c @@ -112,13 +112,11 @@ void ide_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) } EXPORT_SYMBOL_GPL(ide_tf_load); -void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) +void ide_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) { ide_hwif_t *hwif = drive->hwif; struct ide_io_ports *io_ports = &hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; u8 (*tf_inb)(unsigned long port); - u8 valid = cmd->valid.in.tf; u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; if (mmio) @@ -126,9 +124,6 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) else tf_inb = ide_inb; - /* be sure we're looking at the low order bits */ - hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); - if (valid & IDE_VALID_ERROR) tf->error = tf_inb(io_ports->feature_addr); if (valid & IDE_VALID_NSECT) @@ -141,24 +136,6 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->lbah = tf_inb(io_ports->lbah_addr); if (valid & IDE_VALID_DEVICE) tf->device = tf_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - hwif->tp_ops->write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); - - tf = &cmd->hob; - valid = cmd->valid.in.hob; - - if (valid & IDE_VALID_ERROR) - tf->error = tf_inb(io_ports->feature_addr); - if (valid & IDE_VALID_NSECT) - tf->nsect = tf_inb(io_ports->nsect_addr); - if (valid & IDE_VALID_LBAL) - tf->lbal = tf_inb(io_ports->lbal_addr); - if (valid & IDE_VALID_LBAM) - tf->lbam = tf_inb(io_ports->lbam_addr); - if (valid & IDE_VALID_LBAH) - tf->lbah = tf_inb(io_ports->lbah_addr); - } } EXPORT_SYMBOL_GPL(ide_tf_read); diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index e71c72b..2ae02b8 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -90,7 +90,7 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) cmd->hob.data = data[1]; } - tp_ops->tf_read(drive, cmd); + ide_tf_readback(drive, cmd); if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) && tf_cmd == ATA_CMD_IDLEIMMEDIATE) { diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 6f1ed42..c19a221 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -37,14 +37,11 @@ void SELECT_MASK(ide_drive_t *drive, int mask) u8 ide_read_error(ide_drive_t *drive) { - struct ide_cmd cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.valid.in.tf = IDE_VALID_ERROR; + struct ide_taskfile tf; - drive->hwif->tp_ops->tf_read(drive, &cmd); + drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_ERROR); - return cmd.tf.error; + return tf.error; } EXPORT_SYMBOL_GPL(ide_read_error); diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 6857e6a..56ff8c4 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c @@ -79,7 +79,7 @@ static void ide_dump_sector(ide_drive_t *drive) } else cmd.valid.in.tf = IDE_VALID_LBA | IDE_VALID_DEVICE; - drive->hwif->tp_ops->tf_read(drive, &cmd); + ide_tf_readback(drive, &cmd); if (lba48 || (tf->device & ATA_LBA)) printk(KERN_CONT ", LBAsect=%llu", diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 44d7816..7f264ed 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -335,14 +335,11 @@ int ide_busy_sleep(ide_hwif_t *hwif, unsigned long timeout, int altstatus) static u8 ide_read_device(ide_drive_t *drive) { - struct ide_cmd cmd; + struct ide_taskfile tf; - memset(&cmd, 0, sizeof(cmd)); - cmd.valid.in.tf = IDE_VALID_DEVICE; + drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_DEVICE); - drive->hwif->tp_ops->tf_read(drive, &cmd); - - return cmd.tf.device; + return tf.device; } /** diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index b1806ed..4aa6223 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -23,6 +23,23 @@ #include #include +void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd) +{ + ide_hwif_t *hwif = drive->hwif; + const struct ide_tp_ops *tp_ops = hwif->tp_ops; + + /* Be sure we're looking at the low order bytes */ + tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); + + tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf); + + if (cmd->tf_flags & IDE_TFLAG_LBA48) { + tp_ops->write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); + + tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob); + } +} + void ide_tf_dump(const char *s, struct ide_cmd *cmd) { #ifdef DEBUG diff --git a/drivers/ide/ns87415.c b/drivers/ide/ns87415.c index f1305f4..95327a2 100644 --- a/drivers/ide/ns87415.c +++ b/drivers/ide/ns87415.c @@ -61,14 +61,10 @@ static u8 superio_dma_sff_read_status(ide_hwif_t *hwif) return superio_ide_inb(hwif->dma_base + ATA_DMA_STATUS); } -static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) +static void superio_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, + u8 valid) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 valid = cmd->valid.in.tf; - - /* be sure we're looking at the low order bits */ - ide_write_devctl(hwif, ATA_DEVCTL_OBS); if (valid & IDE_VALID_ERROR) tf->error = inb(io_ports->feature_addr); @@ -82,24 +78,6 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->lbah = inb(io_ports->lbah_addr); if (valid & IDE_VALID_DEVICE) tf->device = superio_ide_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - ide_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); - - tf = &cmd->hob; - valid = cmd->valid.in.hob; - - if (valid & IDE_VALID_ERROR) - tf->error = inb(io_ports->feature_addr); - if (valid & IDE_VALID_NSECT) - tf->nsect = inb(io_ports->nsect_addr); - if (valid & IDE_VALID_LBAL) - tf->lbal = inb(io_ports->lbal_addr); - if (valid & IDE_VALID_LBAM) - tf->lbam = inb(io_ports->lbam_addr); - if (valid & IDE_VALID_LBAH) - tf->lbah = inb(io_ports->lbah_addr); - } } static void ns87415_dev_select(ide_drive_t *drive); diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 5ecb70c..5be41f2 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -663,14 +663,9 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) scc_ide_outb(tf->device, io_ports->device_addr); } -static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) +static void scc_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) { struct ide_io_ports *io_ports = &drive->hwif->io_ports; - struct ide_taskfile *tf = &cmd->tf; - u8 valid = cmd->valid.in.tf; - - /* be sure we're looking at the low order bits */ - scc_write_devctl(hwif, ATA_DEVCTL_OBS); if (valid & IDE_VALID_ERROR) tf->error = scc_ide_inb(io_ports->feature_addr); @@ -684,24 +679,6 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) tf->lbah = scc_ide_inb(io_ports->lbah_addr); if (valid & IDE_VALID_DEVICE) tf->device = scc_ide_inb(io_ports->device_addr); - - if (cmd->tf_flags & IDE_TFLAG_LBA48) { - scc_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); - - tf = &cmd->hob; - valid = cmd->valid.in.hob; - - if (valid & IDE_VALID_ERROR) - tf->error = scc_ide_inb(io_ports->feature_addr); - if (valid & IDE_VALID_NSECT) - tf->nsect = scc_ide_inb(io_ports->nsect_addr); - if (valid & IDE_VALID_LBAL) - tf->lbal = scc_ide_inb(io_ports->lbal_addr); - if (valid & IDE_VALID_LBAM) - tf->lbam = scc_ide_inb(io_ports->lbam_addr); - if (valid & IDE_VALID_LBAH) - tf->lbah = scc_ide_inb(io_ports->lbah_addr); - } } static void scc_input_data(ide_drive_t *drive, struct ide_cmd *cmd, diff --git a/include/linux/ide.h b/include/linux/ide.h index 0ba1c6a..ff65fff 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -625,7 +625,7 @@ struct ide_tp_ops { void (*dev_select)(ide_drive_t *); void (*tf_load)(ide_drive_t *, struct ide_taskfile *, u8); - void (*tf_read)(ide_drive_t *, struct ide_cmd *); + void (*tf_read)(ide_drive_t *, struct ide_taskfile *, u8); void (*input_data)(ide_drive_t *, struct ide_cmd *, void *, unsigned int); @@ -1124,6 +1124,7 @@ extern int ide_devset_execute(ide_drive_t *drive, void ide_complete_cmd(ide_drive_t *, struct ide_cmd *, u8, u8); int ide_complete_rq(ide_drive_t *, int, unsigned int); +void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd); void ide_tf_dump(const char *, struct ide_cmd *); void ide_exec_command(ide_hwif_t *, u8); @@ -1133,7 +1134,7 @@ void ide_write_devctl(ide_hwif_t *, u8); void ide_dev_select(ide_drive_t *); void ide_tf_load(ide_drive_t *, struct ide_taskfile *, u8); -void ide_tf_read(ide_drive_t *, struct ide_cmd *); +void ide_tf_read(ide_drive_t *, struct ide_taskfile *, u8); void ide_input_data(ide_drive_t *, struct ide_cmd *, void *, unsigned int); void ide_output_data(ide_drive_t *, struct ide_cmd *, void *, unsigned int); -- cgit v0.10.2 From 3c8a48e9a94be1e063f2f8d7d5f6f691423a3e71 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Wed, 8 Apr 2009 14:13:03 +0200 Subject: ide-cd: reverse NOT_READY sense key logic Make the case of flushing the drive's cache explicit. There should be no functional change resulting from this patch. Signed-off-by: Borislav Petkov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 3ce1eaf..3aec19d 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -341,15 +341,15 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) switch (sense_key) { case NOT_READY: - if (blk_fs_request(rq) == 0 || rq_data_dir(rq) == READ) { + if (blk_fs_request(rq) && rq_data_dir(rq) == WRITE) { + if (ide_cd_breathe(drive, rq)) + return 1; + } else { cdrom_saw_media_change(drive); if (blk_fs_request(rq) && !quiet) printk(KERN_ERR PFX "%s: tray open\n", drive->name); - } else { - if (ide_cd_breathe(drive, rq)) - return 1; } do_end_request = 1; break; -- cgit v0.10.2 From 55c590b64e70cb9922ff56703578ec271eaaca02 Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Wed, 8 Apr 2009 14:13:04 +0200 Subject: at91_ide: remove unused ide_mm_{outb,inb} Cc: Sergei Shtylyov Signed-off-by: Stanislaw Gruszka diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index 4f3725d..c48dc61 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c @@ -174,16 +174,6 @@ static void at91_ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, leave_16bit(chipselect, mode); } -static u8 ide_mm_inb(unsigned long port) -{ - return readb((void __iomem *) port); -} - -static void ide_mm_outb(u8 value, unsigned long port) -{ - writeb(value, (void __iomem *) port); -} - static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) { struct ide_timing *timing; -- cgit v0.10.2 From fb4252e59452c18b88af014a2c4ee697bbf8cbc6 Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Wed, 8 Apr 2009 14:13:04 +0200 Subject: at91_ide: turn on PIO 6 support As we have already PIO 6 transfer mode supported in IDE layer, we can turn it on in the driver. Signed-off-by: Stanislaw Gruszka Tested-by: "Steve Wootton" Cc: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index c48dc61..403d0e4 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c @@ -215,7 +215,7 @@ static const struct ide_port_info at91_ide_port_info __initdata = { .tp_ops = &at91_ide_tp_ops, .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, - .pio_mask = ATA_PIO5, + .pio_mask = ATA_PIO6, }; /* -- cgit v0.10.2 From f0edef8c8b35f04b89311590dd6f1249f07fab3a Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Wed, 8 Apr 2009 14:13:04 +0200 Subject: xsysace: Fix dereferencing of cf_id after hd_driveid removal Commit 4aaf2fec718f6fbf38668edf733a0ab09a49cab1 (xsysace: make it 'struct hd_driveid'-free) converted the cf_id member of 'struct ace_device' from a 'struct hd_driveid' to a u16 array. However, references to the base of the structure were still using the '&' operator. When the address was used with the ata_id_u32() macro, the compiler used the size of the entire array instead of sizeof(u16) to calculate the offset from the base address. This patch removes the use of the '&' operator from all references of cf_id to fix the bug and remove future confusion. Signed-off-by: Grant Likely Signed-off-by: Bartlomiej Zolnierkiewicz diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index 6cccdc3..4aecf5d 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c @@ -563,7 +563,7 @@ static void ace_fsm_dostate(struct ace_device *ace) case ACE_FSM_STATE_IDENTIFY_PREPARE: /* Send identify command */ ace->fsm_task = ACE_TASK_IDENTIFY; - ace->data_ptr = &ace->cf_id; + ace->data_ptr = ace->cf_id; ace->data_count = ACE_BUF_PER_SECTOR; ace_out(ace, ACE_SECCNTCMD, ACE_SECCNTCMD_IDENTIFY); @@ -608,8 +608,8 @@ static void ace_fsm_dostate(struct ace_device *ace) break; case ACE_FSM_STATE_IDENTIFY_COMPLETE: - ace_fix_driveid(&ace->cf_id[0]); - ace_dump_mem(&ace->cf_id, 512); /* Debug: Dump out disk ID */ + ace_fix_driveid(ace->cf_id); + ace_dump_mem(ace->cf_id, 512); /* Debug: Dump out disk ID */ if (ace->data_result) { /* Error occured, disable the disk */ @@ -622,9 +622,9 @@ static void ace_fsm_dostate(struct ace_device *ace) /* Record disk parameters */ set_capacity(ace->gd, - ata_id_u32(&ace->cf_id, ATA_ID_LBA_CAPACITY)); + ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); dev_info(ace->dev, "capacity: %i sectors\n", - ata_id_u32(&ace->cf_id, ATA_ID_LBA_CAPACITY)); + ata_id_u32(ace->cf_id, ATA_ID_LBA_CAPACITY)); } /* We're done, drop to IDLE state and notify waiters */ @@ -923,7 +923,7 @@ static int ace_release(struct gendisk *disk, fmode_t mode) static int ace_getgeo(struct block_device *bdev, struct hd_geometry *geo) { struct ace_device *ace = bdev->bd_disk->private_data; - u16 *cf_id = &ace->cf_id[0]; + u16 *cf_id = ace->cf_id; dev_dbg(ace->dev, "ace_getgeo()\n"); -- cgit v0.10.2 From ac15e95090c2588ada4904c8c4ae8edd347acdf0 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Tue, 7 Apr 2009 17:51:49 -0700 Subject: leds: just ignore invalid GPIOs in leds-gpio Fix build problems with leds-gpio: CC drivers/leds/leds-gpio.o drivers/leds/leds-gpio.c: In function 'create_gpio_led': drivers/leds/leds-gpio.c:85: warning: 'return' with no value, in function returning non-void Signed-off-by: David Brownell Signed-off-by: Richard Purdie diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 102ef4a..d210905 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -82,7 +82,7 @@ static int __devinit create_gpio_led(const struct gpio_led *template, if (!gpio_is_valid(template->gpio)) { printk(KERN_INFO "Skipping unavilable LED gpio %d (%s)\n", template->gpio, template->name); - return; + return 0; } ret = gpio_request(template->gpio, template->name); -- cgit v0.10.2 From 022624a758dc9489388a99ad29577b4c8c09237c Mon Sep 17 00:00:00 2001 From: Zhaolei Date: Fri, 27 Mar 2009 17:09:10 +0800 Subject: printk: fix wrong format string iter for printk printk("%Q"); Output before patch: %QQ Output after patch: %Q Signed-off-by: Zhao Lei Acked-by: Lai Jiangshan Acked-by: Frederic Weisbecker Cc: torvalds@linux-foundation.org Cc: Steven Rostedt LKML-Reference: <49CC97B6.7040809@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/lib/vsprintf.c b/lib/vsprintf.c index be3001f..7536ace 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1051,13 +1051,6 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) if (str < end) *str = '%'; ++str; - if (*fmt) { - if (str < end) - *str = *fmt; - ++str; - } else { - --fmt; - } break; case FORMAT_TYPE_NRCHARS: { @@ -1339,8 +1332,6 @@ do { \ break; case FORMAT_TYPE_INVALID: - if (!*fmt) - --fmt; break; case FORMAT_TYPE_NRCHARS: { @@ -1523,13 +1514,6 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) if (str < end) *str = '%'; ++str; - if (*fmt) { - if (str < end) - *str = *fmt; - ++str; - } else { - --fmt; - } break; case FORMAT_TYPE_NRCHARS: -- cgit v0.10.2 From 01fad98a1f1d3b38adcbab4bd97f7f4cb983ffb5 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Wed, 8 Apr 2009 17:27:59 +0200 Subject: sched: refresh MAINTAINERS entry Peter has become a co-maintainer of the scheduler during the last year, and Robert has become inactive - update the MAINTAINERS entry. Acked-by: Peter Zijlstra Signed-off-by: Ingo Molnar diff --git a/MAINTAINERS b/MAINTAINERS index c3b2159..718b50a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3873,8 +3873,8 @@ S: Maintained SCHEDULER P: Ingo Molnar M: mingo@elte.hu -P: Robert Love [the preemptible kernel bits] -M: rml@tech9.net +P: Peter Zijlstra +M: peterz@infradead.org L: linux-kernel@vger.kernel.org S: Maintained -- cgit v0.10.2 From 08d63b10db943d4e1ff5ae3abc33467f037477f3 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Wed, 8 Apr 2009 08:00:01 -0700 Subject: x86: make 64 bit to use default_inquire_remote_apic Impact: restore old behavior for flat and phys_flat Signed-off-by: Yinhai Lu Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 0014714..306e5e8 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c @@ -212,7 +212,7 @@ struct apic apic_flat = { .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .wait_for_init_deassert = NULL, .smp_callin_clear_local_apic = NULL, - .inquire_remote_apic = NULL, + .inquire_remote_apic = default_inquire_remote_apic, .read = native_apic_mem_read, .write = native_apic_mem_write, @@ -362,7 +362,7 @@ struct apic apic_physflat = { .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, .wait_for_init_deassert = NULL, .smp_callin_clear_local_apic = NULL, - .inquire_remote_apic = NULL, + .inquire_remote_apic = default_inquire_remote_apic, .read = native_apic_mem_read, .write = native_apic_mem_write, -- cgit v0.10.2 From 6279a751fe096a21dc7704e918d570d3ff06e769 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Fri, 27 Mar 2009 01:06:07 +0100 Subject: posix-timers: fix RLIMIT_CPU && fork() See http://bugzilla.kernel.org/show_bug.cgi?id=12911 copy_signal() copies signal->rlim, but RLIMIT_CPU is "lost". Because posix_cpu_timers_init_group() sets cputime_expires.prof_exp = 0 and thus fastpath_timer_check() returns false unless we have other expired cpu timers. Change copy_signal() to set cputime_expires.prof_exp if we have RLIMIT_CPU. Also, set cputimer.running = 1 in that case. This is not strictly necessary, but imho makes sense. Reported-by: Peter Lojkin Signed-off-by: Oleg Nesterov Acked-by: Peter Zijlstra Cc: Peter Lojkin Cc: Roland McGrath Cc: stable@kernel.org LKML-Reference: <20090327000607.GA10104@redhat.com> Signed-off-by: Ingo Molnar diff --git a/kernel/fork.c b/kernel/fork.c index 4854c2c..9b51a1b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -808,6 +808,12 @@ static void posix_cpu_timers_init_group(struct signal_struct *sig) sig->cputime_expires.virt_exp = cputime_zero; sig->cputime_expires.sched_exp = 0; + if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) { + sig->cputime_expires.prof_exp = + secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur); + sig->cputimer.running = 1; + } + /* The timer lists. */ INIT_LIST_HEAD(&sig->cpu_timers[0]); INIT_LIST_HEAD(&sig->cpu_timers[1]); @@ -823,11 +829,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) atomic_inc(¤t->signal->live); return 0; } - sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); - - if (sig) - posix_cpu_timers_init_group(sig); + sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); tsk->signal = sig; if (!sig) return -ENOMEM; @@ -865,6 +868,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim); task_unlock(current->group_leader); + posix_cpu_timers_init_group(sig); + acct_init_pacct(&sig->pacct); tty_audit_fork(sig); -- cgit v0.10.2 From 8f2e586567b1bad72dac7c3810fe9a2ef7117506 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Fri, 27 Mar 2009 01:06:10 +0100 Subject: posix-timers: fix RLIMIT_CPU && setitimer(CPUCLOCK_PROF) update_rlimit_cpu() tries to optimize out set_process_cpu_timer() in case when we already have CPUCLOCK_PROF timer which should expire first. But it uses cputime_lt() instead of cputime_gt(). Test case: int main(void) { struct itimerval it = { .it_value = { .tv_sec = 1000 }, }; assert(!setitimer(ITIMER_PROF, &it, NULL)); struct rlimit rl = { .rlim_cur = 1, .rlim_max = 1, }; assert(!setrlimit(RLIMIT_CPU, &rl)); for (;;) ; return 0; } Without this patch, the task is not killed as RLIMIT_CPU demands. Signed-off-by: Oleg Nesterov Acked-by: Peter Zijlstra Cc: Peter Lojkin Cc: Roland McGrath Cc: stable@kernel.org LKML-Reference: <20090327000610.GA10108@redhat.com> Signed-off-by: Ingo Molnar diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 8e5d9a6..bb53185 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -18,7 +18,7 @@ void update_rlimit_cpu(unsigned long rlim_new) cputime = secs_to_cputime(rlim_new); if (cputime_eq(current->signal->it_prof_expires, cputime_zero) || - cputime_lt(current->signal->it_prof_expires, cputime)) { + cputime_gt(current->signal->it_prof_expires, cputime)) { spin_lock_irq(¤t->sighand->siglock); set_process_cpu_timer(current, CPUCLOCK_PROF, &cputime, NULL); spin_unlock_irq(¤t->sighand->siglock); -- cgit v0.10.2 From c5da9a2bb24a7928c39495cdabf98d3f7931bde5 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Thu, 26 Mar 2009 20:45:28 +0000 Subject: x86: DMI match for the Dell DXP061 as it needs BIOS reboot Closes http://bugzilla.kernel.org/show_bug.cgi?12901 Signed-off-by: Alan Cox LKML-Reference: <20090326204524.4454.8776.stgit@localhost.localdomain> Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 2aef36d..1340dad 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -224,6 +224,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"), }, }, + { /* Handle problems with rebooting on Dell DXP061 */ + .callback = set_bios_reboot, + .ident = "Dell DXP061", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Dell DXP061"), + }, + }, { } }; -- cgit v0.10.2 From 59d138120d18930ba9a5466662d45a2bd2223455 Mon Sep 17 00:00:00 2001 From: Hidetoshi Seto Date: Wed, 25 Mar 2009 10:50:34 +0900 Subject: x86: smarten /proc/interrupts output for new counters Now /proc/interrupts of tip tree has new counters: PLT: Platform interrupts Format change of output, as like that by commit: commit 7a81d9a7da03d2f27840d659f97ef140d032f609 x86: smarten /proc/interrupts output should be applied to these new counters too. Signed-off-by: Hidetoshi Seto Cc: Jan Beulich LKML-Reference: <49C98DEA.8060208@jp.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 3aaf7b9..c3fe010 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -65,7 +65,7 @@ static int show_other_interrupts(struct seq_file *p, int prec) seq_printf(p, " Spurious interrupts\n"); #endif if (generic_interrupt_extension) { - seq_printf(p, "PLT: "); + seq_printf(p, "%*s: ", prec, "PLT"); for_each_online_cpu(j) seq_printf(p, "%10u ", irq_stats(j)->generic_irqs); seq_printf(p, " Platform interrupts\n"); -- cgit v0.10.2 From 6e34eeddf7deec1444bbddab533f03f520d8458c Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 7 Apr 2009 18:12:43 -0400 Subject: block_write_full_page: switch synchronous writes to use WRITE_SYNC_PLUG Now that we have a distinction between WRITE_SYNC and WRITE_SYNC_PLUG, use WRITE_SYNC_PLUG in __block_write_full_page() to avoid unplugging the block device I/O queue between each page that gets flushed out. Otherwise, when we run sync() or fsync() and we need to write out a large number of pages, the block device queue will get unplugged between for every page that is flushed out, which will be a pretty serious performance regression caused by commit a64c8610. Signed-off-by: "Theodore Ts'o" diff --git a/fs/buffer.c b/fs/buffer.c index 6e35762..13edf7a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1596,6 +1596,16 @@ EXPORT_SYMBOL(unmap_underlying_metadata); * locked buffer. This only can happen if someone has written the buffer * directly, with submit_bh(). At the address_space level PageWriteback * prevents this contention from occurring. + * + * If block_write_full_page() is called with wbc->sync_mode == + * WB_SYNC_ALL, the writes are posted using WRITE_SYNC_PLUG; this + * causes the writes to be flagged as synchronous writes, but the + * block device queue will NOT be unplugged, since usually many pages + * will be pushed to the out before the higher-level caller actually + * waits for the writes to be completed. The various wait functions, + * such as wait_on_writeback_range() will ultimately call sync_page() + * which will ultimately call blk_run_backing_dev(), which will end up + * unplugging the device queue. */ static int __block_write_full_page(struct inode *inode, struct page *page, get_block_t *get_block, struct writeback_control *wbc) @@ -1606,7 +1616,8 @@ static int __block_write_full_page(struct inode *inode, struct page *page, struct buffer_head *bh, *head; const unsigned blocksize = 1 << inode->i_blkbits; int nr_underway = 0; - int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE); + int write_op = (wbc->sync_mode == WB_SYNC_ALL ? + WRITE_SYNC_PLUG : WRITE); BUG_ON(!PageLocked(page)); -- cgit v0.10.2 From 430db323fae7665da721768949ade6304811c648 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 7 Apr 2009 18:25:01 -0400 Subject: ext3: Try to avoid starting a transaction in writepage for data=writepage This does the same as commit 9e80d407736161d9b8b0c5a0d44f786e44c322ea (avoid starting a transaction when no block allocation is needed) but for data=writeback mode of ext3. We also cleanup the data=ordered case a bit to stick to coding style... Signed-off-by: Jan Kara Signed-off-by: "Theodore Ts'o" diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 466a332..fcfa243 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -1521,12 +1521,16 @@ static int ext3_ordered_writepage(struct page *page, if (!page_has_buffers(page)) { create_empty_buffers(page, inode->i_sb->s_blocksize, (1 << BH_Dirty)|(1 << BH_Uptodate)); - } else if (!walk_page_buffers(NULL, page_buffers(page), 0, PAGE_CACHE_SIZE, NULL, buffer_unmapped)) { - /* Provide NULL instead of get_block so that we catch bugs if buffers weren't really mapped */ - return block_write_full_page(page, NULL, wbc); + page_bufs = page_buffers(page); + } else { + page_bufs = page_buffers(page); + if (!walk_page_buffers(NULL, page_bufs, 0, PAGE_CACHE_SIZE, + NULL, buffer_unmapped)) { + /* Provide NULL get_block() to catch bugs if buffers + * weren't really mapped */ + return block_write_full_page(page, NULL, wbc); + } } - page_bufs = page_buffers(page); - handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode)); if (IS_ERR(handle)) { @@ -1581,6 +1585,15 @@ static int ext3_writeback_writepage(struct page *page, if (ext3_journal_current_handle()) goto out_fail; + if (page_has_buffers(page)) { + if (!walk_page_buffers(NULL, page_buffers(page), 0, + PAGE_CACHE_SIZE, NULL, buffer_unmapped)) { + /* Provide NULL get_block() to catch bugs if buffers + * weren't really mapped */ + return block_write_full_page(page, NULL, wbc); + } + } + handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode)); if (IS_ERR(handle)) { ret = PTR_ERR(handle); -- cgit v0.10.2 From 2b3fffefea993a94c386b2d96de2d09469c343d1 Mon Sep 17 00:00:00 2001 From: Alexander Beregalov Date: Tue, 7 Apr 2009 21:21:42 -0700 Subject: befs: fix build on parisc fs/befs/super.c:85: error: 'PAGE_SIZE' undeclared Signed-off-by: Alexander Beregalov Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds diff --git a/fs/befs/super.c b/fs/befs/super.c index 41f2b4d..ca40f82 100644 --- a/fs/befs/super.c +++ b/fs/befs/super.c @@ -8,6 +8,7 @@ */ #include +#include /* for PAGE_SIZE */ #include "befs.h" #include "super.h" -- cgit v0.10.2 From 4c967291fc875a53de7126d256ad5e48f42a6521 Mon Sep 17 00:00:00 2001 From: Nobuhiro Iwamatsu Date: Tue, 7 Apr 2009 21:21:43 -0700 Subject: nommu: fix typo vma->pg_off to vma->vm_pgoff 6260a4b0521a41189b2c2a8119096c1e21dbdf2c ("/proc/pid/maps: don't show pgoff of pure ANON VMAs" had a typo. fs/proc/task_nommu.c:138: error: 'struct vm_area_struct' has no member named 'pg_off' distcc[21484] ERROR: compile fs/proc/task_nommu.c on sprygo/32 failed Signed-off-by: Nobuhiro Iwamatsu Cc: KAMEZAWA Hiroyuki Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 12c2037..64a72e2 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c @@ -135,7 +135,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) struct inode *inode = vma->vm_file->f_path.dentry->d_inode; dev = inode->i_sb->s_dev; ino = inode->i_ino; - pgoff = (loff_t)vma->pg_off << PAGE_SHIFT; + pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; } seq_printf(m, -- cgit v0.10.2 From 3a709703538c471530405556dda136fd0d82b0dc Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 7 Apr 2009 23:21:06 -0700 Subject: ptrace: some checkpatch fixes This fixes all the checkpatch --file complaints about kernel/ptrace.c and also removes an unused #include. I've verified that there are no changes to the compiled code on x86_64. Signed-off-by: Roland McGrath [ Removed the parts that just split a line - Linus ] Signed-off-by: Linus Torvalds diff --git a/kernel/ptrace.c b/kernel/ptrace.c index aaad0ec..64191fa 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -21,9 +21,7 @@ #include #include #include - -#include -#include +#include /* @@ -48,7 +46,7 @@ void __ptrace_link(struct task_struct *child, struct task_struct *new_parent) list_add(&child->ptrace_entry, &new_parent->ptraced); child->parent = new_parent; } - + /* * Turn a tracing stop into a normal stop now, since with no tracer there * would be no way to wake it up with SIGCONT or SIGKILL. If there was a @@ -173,7 +171,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) task_lock(task); err = __ptrace_may_access(task, mode); task_unlock(task); - return (!err ? true : false); + return !err; } int ptrace_attach(struct task_struct *task) @@ -358,7 +356,7 @@ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst copied += retval; src += retval; dst += retval; - len -= retval; + len -= retval; } return copied; } @@ -383,7 +381,7 @@ int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long ds copied += retval; src += retval; dst += retval; - len -= retval; + len -= retval; } return copied; } @@ -496,9 +494,9 @@ static int ptrace_resume(struct task_struct *child, long request, long data) if (unlikely(!arch_has_single_step())) return -EIO; user_enable_single_step(child); - } - else + } else { user_disable_single_step(child); + } child->exit_code = data; wake_up_process(child); -- cgit v0.10.2 From 3e44ddd44ea59354221b811605745ec453130c06 Mon Sep 17 00:00:00 2001 From: Jarkko Lavinen Date: Thu, 27 Nov 2008 14:30:32 +0200 Subject: mmc: Accept EXT_CSD rev 1.3 since it is backwards compatible with 1.2 Signed-off-by: Jarkko Lavinen Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index c232d11..06084db 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -208,7 +208,7 @@ static int mmc_read_ext_csd(struct mmc_card *card) } ext_csd_struct = ext_csd[EXT_CSD_REV]; - if (ext_csd_struct > 2) { + if (ext_csd_struct > 3) { printk(KERN_ERR "%s: unrecognised EXT_CSD structure " "version %d\n", mmc_hostname(card->host), ext_csd_struct); -- cgit v0.10.2 From b513b6cc0fcbb0ef733eec487618da7ea2d7cc61 Mon Sep 17 00:00:00 2001 From: Paulius Zaleckas Date: Wed, 25 Mar 2009 11:17:42 +0200 Subject: imxmmc: init-exit rework Add __init __exit for appropriate probe and remove functions. Conver to platform_driver_probe() Signed-off-by: Paulius Zaleckas Acked-by: Sascha Hauer Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c index eb29b1d..0fa7af3 100644 --- a/drivers/mmc/host/imxmmc.c +++ b/drivers/mmc/host/imxmmc.c @@ -938,7 +938,7 @@ static void imxmci_check_status(unsigned long data) mod_timer(&host->timer, jiffies + (HZ>>1)); } -static int imxmci_probe(struct platform_device *pdev) +static int __init imxmci_probe(struct platform_device *pdev) { struct mmc_host *mmc; struct imxmci_host *host = NULL; @@ -1079,7 +1079,7 @@ out: return ret; } -static int imxmci_remove(struct platform_device *pdev) +static int __exit imxmci_remove(struct platform_device *pdev) { struct mmc_host *mmc = platform_get_drvdata(pdev); @@ -1145,8 +1145,7 @@ static int imxmci_resume(struct platform_device *dev) #endif /* CONFIG_PM */ static struct platform_driver imxmci_driver = { - .probe = imxmci_probe, - .remove = imxmci_remove, + .remove = __exit_p(imxmci_remove), .suspend = imxmci_suspend, .resume = imxmci_resume, .driver = { @@ -1157,7 +1156,7 @@ static struct platform_driver imxmci_driver = { static int __init imxmci_init(void) { - return platform_driver_register(&imxmci_driver); + return platform_driver_probe(&imxmci_driver, imxmci_probe); } static void __exit imxmci_exit(void) -- cgit v0.10.2 From 34b28950168abd7ad55fe3493ea21f1340c7294a Mon Sep 17 00:00:00 2001 From: Paulius Zaleckas Date: Wed, 25 Mar 2009 11:18:50 +0200 Subject: imxmmc: move RSSR BLR DMA request source (RSSR) needs to be set only once (in probe). DMA burst length (BLR) need to be set only in set_ios() This cleans up imxmci_setup_data() and should make it a little bit faster :) Signed-off-by: Paulius Zaleckas Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c index 0fa7af3..e0be21a 100644 --- a/drivers/mmc/host/imxmmc.c +++ b/drivers/mmc/host/imxmmc.c @@ -307,13 +307,6 @@ static void imxmci_setup_data(struct imxmci_host *host, struct mmc_data *data) wmb(); - if (host->actual_bus_width == MMC_BUS_WIDTH_4) - BLR(host->dma) = 0; /* burst 64 byte read / 64 bytes write */ - else - BLR(host->dma) = 16; /* burst 16 byte read / 16 bytes write */ - - RSSR(host->dma) = DMA_REQ_SDHC; - set_bit(IMXMCI_PEND_DMA_DATA_b, &host->pending_events); clear_bit(IMXMCI_PEND_CPU_DATA_b, &host->pending_events); @@ -818,9 +811,11 @@ static void imxmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) if (ios->bus_width == MMC_BUS_WIDTH_4) { host->actual_bus_width = MMC_BUS_WIDTH_4; imx_gpio_mode(PB11_PF_SD_DAT3); + BLR(host->dma) = 0; /* burst 64 byte read/write */ } else { host->actual_bus_width = MMC_BUS_WIDTH_1; imx_gpio_mode(GPIO_PORTB | GPIO_IN | GPIO_PUEN | 11); + BLR(host->dma) = 16; /* burst 16 byte read/write */ } if (host->power_mode != ios->power_mode) { @@ -1034,6 +1029,7 @@ static int __init imxmci_probe(struct platform_device *pdev) } host->dma_allocated = 1; imx_dma_setup_handlers(host->dma, imxmci_dma_irq, NULL, host); + RSSR(host->dma) = DMA_REQ_SDHC; tasklet_init(&host->tasklet, imxmci_tasklet_fnc, (unsigned long)host); host->status_reg=0; -- cgit v0.10.2 From 32710e8fd537adeb53f98dec92e4a77caac512f5 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 8 Apr 2009 20:14:54 +0200 Subject: New mail address for Pierre Ossman Signed-off-by: Pierre Ossman diff --git a/MAINTAINERS b/MAINTAINERS index c3b2159..d96e745 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3057,7 +3057,7 @@ S: Supported MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM P: Pierre Ossman -M: drzeus-mmc@drzeus.cx +M: pierre@ossman.eu L: linux-kernel@vger.kernel.org S: Maintained @@ -3939,7 +3939,7 @@ S: Maintained SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER P: Pierre Ossman -M: drzeus-sdhci@drzeus.cx +M: pierre@ossman.eu L: sdhci-devel@lists.ossman.eu S: Maintained @@ -4926,7 +4926,7 @@ S: Maintained W83L51xD SD/MMC CARD INTERFACE DRIVER P: Pierre Ossman -M: drzeus-wbsd@drzeus.cx +M: pierre@ossman.eu L: linux-kernel@vger.kernel.org S: Maintained diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index c5b316e..cd37962 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c @@ -729,6 +729,6 @@ static void __exit sdhci_drv_exit(void) module_init(sdhci_drv_init); module_exit(sdhci_drv_exit); -MODULE_AUTHOR("Pierre Ossman "); +MODULE_AUTHOR("Pierre Ossman "); MODULE_DESCRIPTION("Secure Digital Host Controller Interface PCI driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 30d8e3d..9234be2 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1935,7 +1935,7 @@ module_exit(sdhci_drv_exit); module_param(debug_quirks, uint, 0444); -MODULE_AUTHOR("Pierre Ossman "); +MODULE_AUTHOR("Pierre Ossman "); MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c index adda379..89bf8cd 100644 --- a/drivers/mmc/host/wbsd.c +++ b/drivers/mmc/host/wbsd.c @@ -2036,7 +2036,7 @@ module_param_named(irq, param_irq, uint, 0444); module_param_named(dma, param_dma, int, 0444); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Pierre Ossman "); +MODULE_AUTHOR("Pierre Ossman "); MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver"); #ifdef CONFIG_PNP -- cgit v0.10.2 From 00adadc12196c7b3e8923729e728162267e98ff7 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Mon, 6 Apr 2009 15:01:19 +0300 Subject: omap_hsmmc: Flush posted write to IRQ Spurious IRQs seen on MMC after 2.6.29. Flush posted write in IRQ handler. The interrupt line is released by clearing the error status bits in the MMCHS_STAT register, which must occur before the interrupt handler returns to avoid unwanted irqs. Hence the need to flush the posted write. Signed-off-by: Kevin Hilman Signed-off-by: Adrian Hunter Acked-by: Tony Lindgen Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index d183be6..a752788 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -434,6 +434,8 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) if (host->mrq == NULL) { OMAP_HSMMC_WRITE(host->base, STAT, OMAP_HSMMC_READ(host->base, STAT)); + /* Flush posted write */ + OMAP_HSMMC_READ(host->base, STAT); return IRQ_HANDLED; } @@ -489,6 +491,8 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) } OMAP_HSMMC_WRITE(host->base, STAT, status); + /* Flush posted write */ + OMAP_HSMMC_READ(host->base, STAT); if (end_cmd || (status & CC)) mmc_omap_cmd_done(host, host->cmd); -- cgit v0.10.2 From 9d9f25c036dd584db175552a7d162403d3ab54b3 Mon Sep 17 00:00:00 2001 From: Wolfgang Muees Date: Tue, 7 Apr 2009 14:48:16 +0100 Subject: mmc_spi: do not check CID and CSD blocks with CRC16 Some cards are not able to calculate a valid CRC16 value for CID and CSD reads (CRC for 512 byte data blocks is OK). By moving the CRC enable after the read of CID and CSD, these cards can be used. This patch was tested with a faulty 8 GByte takeMS Class 6 SDHC card. This patch was suggested by Pierre Ossman. Signed-off-by: Wolfgang Muees Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 26fc098..cd81c39 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -363,15 +363,6 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, goto err; /* - * For SPI, enable CRC as appropriate. - */ - if (mmc_host_is_spi(host)) { - err = mmc_spi_set_crc(host, use_spi_crc); - if (err) - goto err; - } - - /* * Fetch CID from card. */ if (mmc_host_is_spi(host)) @@ -458,6 +449,18 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, } /* + * For SPI, enable CRC as appropriate. + * This CRC enable is located AFTER the reading of the + * card registers because some SDHC cards are not able + * to provide valid CRCs for non-512-byte blocks. + */ + if (mmc_host_is_spi(host)) { + err = mmc_spi_set_crc(host, use_spi_crc); + if (err) + goto free_card; + } + + /* * Attempt to change to high-speed (if supported) */ err = mmc_switch_hs(card); -- cgit v0.10.2 From 56e303ebeec7ef43dbd9d7998f8ad1a9f75d59bc Mon Sep 17 00:00:00 2001 From: Wolfgang Muees Date: Tue, 7 Apr 2009 15:26:30 +0100 Subject: mmc_spi: convert timeout handling to jiffies and avoid busy waiting SD/MMC card timeouts can be very high. So avoid busy-waiting, using the scheduler. Calculate all timeouts in jiffies units, because this will give us the correct sign when to involve the scheduler. Signed-off-by: Wolfgang Muees Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index 72f8bde..ed02ebd 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c @@ -24,7 +24,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include +#include #include #include #include @@ -95,7 +95,7 @@ * reads which takes nowhere near that long. Older cards may be able to use * shorter timeouts ... but why bother? */ -#define r1b_timeout ktime_set(3, 0) +#define r1b_timeout (HZ * 3) /****************************************************************************/ @@ -183,12 +183,11 @@ mmc_spi_readbytes(struct mmc_spi_host *host, unsigned len) return status; } -static int -mmc_spi_skip(struct mmc_spi_host *host, ktime_t timeout, unsigned n, u8 byte) +static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, + unsigned n, u8 byte) { u8 *cp = host->data->status; - - timeout = ktime_add(timeout, ktime_get()); + unsigned long start = jiffies; while (1) { int status; @@ -203,22 +202,26 @@ mmc_spi_skip(struct mmc_spi_host *host, ktime_t timeout, unsigned n, u8 byte) return cp[i]; } - /* REVISIT investigate msleep() to avoid busy-wait I/O - * in at least some cases. - */ - if (ktime_to_ns(ktime_sub(ktime_get(), timeout)) > 0) + if (time_is_before_jiffies(start + timeout)) break; + + /* If we need long timeouts, we may release the CPU. + * We use jiffies here because we want to have a relation + * between elapsed time and the blocking of the scheduler. + */ + if (time_is_before_jiffies(start+1)) + schedule(); } return -ETIMEDOUT; } static inline int -mmc_spi_wait_unbusy(struct mmc_spi_host *host, ktime_t timeout) +mmc_spi_wait_unbusy(struct mmc_spi_host *host, unsigned long timeout) { return mmc_spi_skip(host, timeout, sizeof(host->data->status), 0); } -static int mmc_spi_readtoken(struct mmc_spi_host *host, ktime_t timeout) +static int mmc_spi_readtoken(struct mmc_spi_host *host, unsigned long timeout) { return mmc_spi_skip(host, timeout, 1, 0xff); } @@ -607,7 +610,7 @@ mmc_spi_setup_data_message( */ static int mmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t, - ktime_t timeout) + unsigned long timeout) { struct spi_device *spi = host->spi; int status, i; @@ -717,7 +720,7 @@ mmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t, */ static int mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, - ktime_t timeout) + unsigned long timeout) { struct spi_device *spi = host->spi; int status; @@ -803,7 +806,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, unsigned n_sg; int multiple = (data->blocks > 1); u32 clock_rate; - ktime_t timeout; + unsigned long timeout; if (data->flags & MMC_DATA_READ) direction = DMA_FROM_DEVICE; @@ -817,8 +820,9 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, else clock_rate = spi->max_speed_hz; - timeout = ktime_add_ns(ktime_set(0, 0), data->timeout_ns + - data->timeout_clks * 1000000 / clock_rate); + timeout = data->timeout_ns + + data->timeout_clks * 1000000 / clock_rate; + timeout = usecs_to_jiffies((unsigned int)(timeout / 1000)) + 1; /* Handle scatterlist segments one at a time, with synch for * each 512-byte block -- cgit v0.10.2 From d31f65e8464927f2cfdee6b0b01b9e3a8ce5db9c Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Tue, 7 Apr 2009 17:04:33 -0700 Subject: mmc: Fix compile for omap_hsmmc.c This fixes the issue noted by Russell King: drivers/mmc/host/omap_hsmmc.c: In function 'mmc_omap_xfer_done': drivers/mmc/host/omap_hsmmc.c:301: error: implicit declaration of function 'mmc_omap_fclk_lazy_disable' This got broken by 4a694dc915c9a223044ce21fc0d99e63facd1d64. Signed-off-by: Tony Lindgren Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index a752788..d765df2 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -298,7 +298,6 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data) struct mmc_request *mrq = host->mrq; host->mrq = NULL; - mmc_omap_fclk_lazy_disable(host); mmc_request_done(host->mmc, mrq); return; } -- cgit v0.10.2 From a8fe29d8bcdfbf85ba26c7f3522c4bdfbc83e71d Mon Sep 17 00:00:00 2001 From: Jarkko Lavinen Date: Wed, 8 Apr 2009 11:18:32 +0300 Subject: omap_hsmmc: Do not expect cmd/data to be non-null when CC/TC occurs With spurious interrupt cmd can be null even when we have CC set in irq status. Fixes: NB#106295 - prevent potential kernel crash in the MMC driver Signed-off-by: Jarkko Lavinen Signed-off-by: Adrian Hunter Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index d765df2..e62a22a 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -493,7 +493,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) /* Flush posted write */ OMAP_HSMMC_READ(host->base, STAT); - if (end_cmd || (status & CC)) + if (end_cmd || ((status & CC) && host->cmd)) mmc_omap_cmd_done(host, host->cmd); if (end_trans || (status & TC)) mmc_omap_xfer_done(host, data); -- cgit v0.10.2 From ab5a643cf597f2214feb6ff7288c72589661bde1 Mon Sep 17 00:00:00 2001 From: Wolfgang Muees Date: Wed, 8 Apr 2009 09:48:58 +0100 Subject: mmc_spi: support for non-byte-aligned cards A very large subset of SD cards in the market send their responses and data non-byte-aligned. So add logic to the mmc spi driver to handle this mess. Signed-off-by: Wolfgang Muees Signed-off-by: Pierre Ossman diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index ed02ebd..f48349d 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c @@ -254,6 +254,10 @@ static int mmc_spi_response_get(struct mmc_spi_host *host, u8 *cp = host->data->status; u8 *end = cp + host->t.len; int value = 0; + int bitshift; + u8 leftover = 0; + unsigned short rotator; + int i; char tag[32]; snprintf(tag, sizeof(tag), " ... CMD%d response SPI_%s", @@ -271,9 +275,8 @@ static int mmc_spi_response_get(struct mmc_spi_host *host, /* Data block reads (R1 response types) may need more data... */ if (cp == end) { - unsigned i; - cp = host->data->status; + end = cp+1; /* Card sends N(CR) (== 1..8) bytes of all-ones then one * status byte ... and we already scanned 2 bytes. @@ -298,20 +301,34 @@ static int mmc_spi_response_get(struct mmc_spi_host *host, } checkstatus: - if (*cp & 0x80) { - dev_dbg(&host->spi->dev, "%s: INVALID RESPONSE, %02x\n", - tag, *cp); - value = -EBADR; - goto done; + bitshift = 0; + if (*cp & 0x80) { + /* Houston, we have an ugly card with a bit-shifted response */ + rotator = *cp++ << 8; + /* read the next byte */ + if (cp == end) { + value = mmc_spi_readbytes(host, 1); + if (value < 0) + goto done; + cp = host->data->status; + end = cp+1; + } + rotator |= *cp++; + while (rotator & 0x8000) { + bitshift++; + rotator <<= 1; + } + cmd->resp[0] = rotator >> 8; + leftover = rotator; + } else { + cmd->resp[0] = *cp++; } - - cmd->resp[0] = *cp++; cmd->error = 0; /* Status byte: the entire seven-bit R1 response. */ if (cmd->resp[0] != 0) { if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS - | R1_SPI_ILLEGAL_COMMAND) + | R1_SPI_ILLEGAL_COMMAND) & cmd->resp[0]) value = -EINVAL; else if (R1_SPI_COM_CRC & cmd->resp[0]) @@ -339,12 +356,45 @@ checkstatus: * SPI R5 == R1 + data byte; IO_RW_DIRECT */ case MMC_RSP_SPI_R2: - cmd->resp[0] |= *cp << 8; + /* read the next byte */ + if (cp == end) { + value = mmc_spi_readbytes(host, 1); + if (value < 0) + goto done; + cp = host->data->status; + end = cp+1; + } + if (bitshift) { + rotator = leftover << 8; + rotator |= *cp << bitshift; + cmd->resp[0] |= (rotator & 0xFF00); + } else { + cmd->resp[0] |= *cp << 8; + } break; /* SPI R3, R4, or R7 == R1 + 4 bytes */ case MMC_RSP_SPI_R3: - cmd->resp[1] = get_unaligned_be32(cp); + rotator = leftover << 8; + cmd->resp[1] = 0; + for (i = 0; i < 4; i++) { + cmd->resp[1] <<= 8; + /* read the next byte */ + if (cp == end) { + value = mmc_spi_readbytes(host, 1); + if (value < 0) + goto done; + cp = host->data->status; + end = cp+1; + } + if (bitshift) { + rotator |= *cp++ << bitshift; + cmd->resp[1] |= (rotator >> 8); + rotator <<= 8; + } else { + cmd->resp[1] |= *cp++; + } + } break; /* SPI R1 == just one status byte */ @@ -725,6 +775,8 @@ mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, struct spi_device *spi = host->spi; int status; struct scratch *scratch = host->data; + unsigned int bitshift; + u8 leftover; /* At least one SD card sends an all-zeroes byte when N(CX) * applies, before the all-ones bytes ... just cope with that. @@ -736,38 +788,60 @@ mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, if (status == 0xff || status == 0) status = mmc_spi_readtoken(host, timeout); - if (status == SPI_TOKEN_SINGLE) { - if (host->dma_dev) { - dma_sync_single_for_device(host->dma_dev, - host->data_dma, sizeof(*scratch), - DMA_BIDIRECTIONAL); - dma_sync_single_for_device(host->dma_dev, - t->rx_dma, t->len, - DMA_FROM_DEVICE); - } + if (status < 0) { + dev_dbg(&spi->dev, "read error %02x (%d)\n", status, status); + return status; + } - status = spi_sync(spi, &host->m); + /* The token may be bit-shifted... + * the first 0-bit precedes the data stream. + */ + bitshift = 7; + while (status & 0x80) { + status <<= 1; + bitshift--; + } + leftover = status << 1; - if (host->dma_dev) { - dma_sync_single_for_cpu(host->dma_dev, - host->data_dma, sizeof(*scratch), - DMA_BIDIRECTIONAL); - dma_sync_single_for_cpu(host->dma_dev, - t->rx_dma, t->len, - DMA_FROM_DEVICE); - } + if (host->dma_dev) { + dma_sync_single_for_device(host->dma_dev, + host->data_dma, sizeof(*scratch), + DMA_BIDIRECTIONAL); + dma_sync_single_for_device(host->dma_dev, + t->rx_dma, t->len, + DMA_FROM_DEVICE); + } - } else { - dev_dbg(&spi->dev, "read error %02x (%d)\n", status, status); + status = spi_sync(spi, &host->m); - /* we've read extra garbage, timed out, etc */ - if (status < 0) - return status; + if (host->dma_dev) { + dma_sync_single_for_cpu(host->dma_dev, + host->data_dma, sizeof(*scratch), + DMA_BIDIRECTIONAL); + dma_sync_single_for_cpu(host->dma_dev, + t->rx_dma, t->len, + DMA_FROM_DEVICE); + } - /* low four bits are an R2 subset, fifth seems to be - * vendor specific ... map them all to generic error.. + if (bitshift) { + /* Walk through the data and the crc and do + * all the magic to get byte-aligned data. */ - return -EIO; + u8 *cp = t->rx_buf; + unsigned int len; + unsigned int bitright = 8 - bitshift; + u8 temp; + for (len = t->len; len; len--) { + temp = *cp; + *cp++ = leftover | (temp >> bitshift); + leftover = temp << bitright; + } + cp = (u8 *) &scratch->crc_val; + temp = *cp; + *cp++ = leftover | (temp >> bitshift); + leftover = temp << bitright; + temp = *cp; + *cp = leftover | (temp >> bitshift); } if (host->mmc->use_spi_crc) { -- cgit v0.10.2 From 8bd239d2ef00ed3319bf7384acd19c8253f0bb68 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Wed, 8 Apr 2009 01:32:20 +0100 Subject: [ARM] 5447/1: Add SZ_32K This adds a SZ_32K define to the available sizes. I need it for an upcoming platform support. Signed-off-by: Linus Walleij Signed-off-by: Russell King diff --git a/arch/arm/include/asm/sizes.h b/arch/arm/include/asm/sizes.h index c10d1aa..ada93a8 100644 --- a/arch/arm/include/asm/sizes.h +++ b/arch/arm/include/asm/sizes.h @@ -32,6 +32,7 @@ #define SZ_4K 0x00001000 #define SZ_8K 0x00002000 #define SZ_16K 0x00004000 +#define SZ_32K 0x00008000 #define SZ_64K 0x00010000 #define SZ_128K 0x00020000 #define SZ_256K 0x00040000 -- cgit v0.10.2 From d0176f612f5c3edca00b9d0cc65555ad34843ec7 Mon Sep 17 00:00:00 2001 From: Justin Waters Date: Fri, 3 Apr 2009 21:03:59 +0100 Subject: [ARM] 5445/1: AT91: Remove flexible array from USBH platform data The flexible array in the USBH platform data is not safe to copy. The compiler will not allocate any extra memory for the non-init platform data structure (in the *_devices.c files) since it isn't given any defaults at compile time. When the probe function attempts to address that array, it will actually attempt to access data in an adjacent structure. Since there are currently no (known) implementations of the at91 USBH IP with more than 2 vbus pins, I am capping the value at 2. If somebody tries to assign more, then the compiler will produce a warning. Signed-off-by: Justin Waters Acked-by: David Brownell Acked-by: Andrew Victor Signed-off-by: Russell King diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 793fe7b..e6afff8 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h @@ -87,7 +87,7 @@ extern void __init at91_add_device_eth(struct at91_eth_data *data); /* USB Host */ struct at91_usbh_data { u8 ports; /* number of ports on root hub */ - u8 vbus_pin[]; /* port power-control pin */ + u8 vbus_pin[2]; /* port power-control pin */ }; extern void __init at91_add_device_usbh(struct at91_usbh_data *data); -- cgit v0.10.2 From 3d6fdf7563d0a67c6973cf421f7405524ed8bdaf Mon Sep 17 00:00:00 2001 From: Justin Waters Date: Fri, 3 Apr 2009 21:06:53 +0100 Subject: [ARM] 5446/1: ohci-at91: Limit vbus_pin assignment to the size of the array Currently, the vbus_pin assignment loop is limited by the value of the "ports" variable in the platform data. Now that the vbus_pin array is no longer flexible, we can use its actual size. Signed-off-by: Justin Waters Acked-by: Andrew Victor Signed-off-by: Russell King diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 4ed228a..bb5e6f6 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c @@ -280,7 +280,7 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) * are always powered while this driver is active, and use * active-low power switches. */ - for (i = 0; i < pdata->ports; i++) { + for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { if (pdata->vbus_pin[i] <= 0) continue; gpio_request(pdata->vbus_pin[i], "ohci_vbus"); @@ -298,7 +298,7 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) int i; if (pdata) { - for (i = 0; i < pdata->ports; i++) { + for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { if (pdata->vbus_pin[i] <= 0) continue; gpio_direction_output(pdata->vbus_pin[i], 1); -- cgit v0.10.2 From d2ca39f262806aa2f035f680a14aa55ff9e3d889 Mon Sep 17 00:00:00 2001 From: Yossi Etigin Date: Wed, 8 Apr 2009 13:42:33 -0700 Subject: RDMA/cma: Create cm id even when IB port is down When doing rdma_resolve_addr(), if the relevant IB port is down, the function fails and the cm_id is not bound to the correct device. Therefore, application does not have a device handle and cannot wait for the port to become active. The function fails because the underlying IPoIB interface is not joined to the broadcast group and therefore the SA does not have a multicast record to take a Q_Key from. The fix is to use lazy Q_Key resolution - cma_set_qkey() will set id_priv->qkey if it was not set, and will be called just before the Q_Key is really required. Signed-off-by: Yossi Etigin Acked-by: Sean Hefty Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 3f9c03a..851de83 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -297,21 +297,25 @@ static void cma_detach_from_dev(struct rdma_id_private *id_priv) id_priv->cma_dev = NULL; } -static int cma_set_qkey(struct ib_device *device, u8 port_num, - enum rdma_port_space ps, - struct rdma_dev_addr *dev_addr, u32 *qkey) +static int cma_set_qkey(struct rdma_id_private *id_priv) { struct ib_sa_mcmember_rec rec; int ret = 0; - switch (ps) { + if (id_priv->qkey) + return 0; + + switch (id_priv->id.ps) { case RDMA_PS_UDP: - *qkey = RDMA_UDP_QKEY; + id_priv->qkey = RDMA_UDP_QKEY; break; case RDMA_PS_IPOIB: - ib_addr_get_mgid(dev_addr, &rec.mgid); - ret = ib_sa_get_mcmember_rec(device, port_num, &rec.mgid, &rec); - *qkey = be32_to_cpu(rec.qkey); + ib_addr_get_mgid(&id_priv->id.route.addr.dev_addr, &rec.mgid); + ret = ib_sa_get_mcmember_rec(id_priv->id.device, + id_priv->id.port_num, &rec.mgid, + &rec); + if (!ret) + id_priv->qkey = be32_to_cpu(rec.qkey); break; default: break; @@ -341,12 +345,7 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv) ret = ib_find_cached_gid(cma_dev->device, &gid, &id_priv->id.port_num, NULL); if (!ret) { - ret = cma_set_qkey(cma_dev->device, - id_priv->id.port_num, - id_priv->id.ps, dev_addr, - &id_priv->qkey); - if (!ret) - cma_attach_to_dev(id_priv, cma_dev); + cma_attach_to_dev(id_priv, cma_dev); break; } } @@ -578,6 +577,10 @@ static int cma_ib_init_qp_attr(struct rdma_id_private *id_priv, *qp_attr_mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT; if (cma_is_ud_ps(id_priv->id.ps)) { + ret = cma_set_qkey(id_priv); + if (ret) + return ret; + qp_attr->qkey = id_priv->qkey; *qp_attr_mask |= IB_QP_QKEY; } else { @@ -2201,6 +2204,12 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id, event.status = ib_event->param.sidr_rep_rcvd.status; break; } + ret = cma_set_qkey(id_priv); + if (ret) { + event.event = RDMA_CM_EVENT_ADDR_ERROR; + event.status = -EINVAL; + break; + } if (id_priv->qkey != rep->qkey) { event.event = RDMA_CM_EVENT_UNREACHABLE; event.status = -EINVAL; @@ -2480,10 +2489,14 @@ static int cma_send_sidr_rep(struct rdma_id_private *id_priv, const void *private_data, int private_data_len) { struct ib_cm_sidr_rep_param rep; + int ret; memset(&rep, 0, sizeof rep); rep.status = status; if (status == IB_SIDR_SUCCESS) { + ret = cma_set_qkey(id_priv); + if (ret) + return ret; rep.qp_num = id_priv->qp_num; rep.qkey = id_priv->qkey; } -- cgit v0.10.2 From 8851d3712a73649e1ae0d4620e7690c8db8742df Mon Sep 17 00:00:00 2001 From: Tony Luck Date: Wed, 8 Apr 2009 13:46:14 -0700 Subject: [IA64] wire up preadv/pwritev system calls Gerd Hoffmann added these to Linux. Let ia64 use them. Signed-off-by: Tony Luck diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 9015979..10a9eb0 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h @@ -308,11 +308,13 @@ #define __NR_dup3 1316 #define __NR_pipe2 1317 #define __NR_inotify_init1 1318 +#define __NR_preadv 1319 +#define __NR_pwritev 1320 #ifdef __KERNEL__ -#define NR_syscalls 295 /* length of syscall table */ +#define NR_syscalls 297 /* length of syscall table */ /* * The following defines stop scripts/checksyscalls.sh from complaining about diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 8dc6966..7bebac0 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S @@ -1803,6 +1803,8 @@ sys_call_table: data8 sys_dup3 data8 sys_pipe2 data8 sys_inotify_init1 + data8 sys_preadv + data8 sys_pwritev // 1320 .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ -- cgit v0.10.2 From 6a3335b43342b42dd6c69b4bbbde15d622cb49ca Mon Sep 17 00:00:00 2001 From: Or Gerlitz Date: Wed, 8 Apr 2009 13:52:01 -0700 Subject: IPoIB: Document newish features Update the documentation to include connected mode, stateless offloads and interrupt moderation, and add a reference to the connected mode RFC. Signed-off-by: Or Gerlitz Signed-off-by: Roland Dreier diff --git a/Documentation/infiniband/ipoib.txt b/Documentation/infiniband/ipoib.txt index 864ff32..6d40f00 100644 --- a/Documentation/infiniband/ipoib.txt +++ b/Documentation/infiniband/ipoib.txt @@ -24,6 +24,49 @@ Partitions and P_Keys The P_Key for any interface is given by the "pkey" file, and the main interface for a subinterface is in "parent." +Datagram vs Connected modes + + The IPoIB driver supports two modes of operation: datagram and + connected. The mode is set and read through an interface's + /sys/class/net//mode file. + + In datagram mode, the IB UD (Unreliable Datagram) transport is used + and so the interface MTU has is equal to the IB L2 MTU minus the + IPoIB encapsulation header (4 bytes). For example, in a typical IB + fabric with a 2K MTU, the IPoIB MTU will be 2048 - 4 = 2044 bytes. + + In connected mode, the IB RC (Reliable Connected) transport is used. + Connected mode is to takes advantage of the connected nature of the + IB transport and allows an MTU up to the maximal IP packet size of + 64K, which reduces the number of IP packets needed for handling + large UDP datagrams, TCP segments, etc and increases the performance + for large messages. + + In connected mode, the interface's UD QP is still used for multicast + and communication with peers that don't support connected mode. In + this case, RX emulation of ICMP PMTU packets is used to cause the + networking stack to use the smaller UD MTU for these neighbours. + +Stateless offloads + + If the IB HW supports IPoIB stateless offloads, IPoIB advertises + TCP/IP checksum and/or Large Send (LSO) offloading capability to the + network stack. + + Large Receive (LRO) offloading is also implemented and may be turned + on/off using ethtool calls. Currently LRO is supported only for + checksum offload capable devices. + + Stateless offloads are supported only in datagram mode. + +Interrupt moderation + + If the underlying IB device supports CQ event moderation, one can + use ethtool to set interrupt mitigation parameters and thus reduce + the overhead incurred by handling interrupts. The main code path of + IPoIB doesn't use events for TX completion signaling so only RX + moderation is supported. + Debugging Information By compiling the IPoIB driver with CONFIG_INFINIBAND_IPOIB_DEBUG set @@ -55,3 +98,5 @@ References http://ietf.org/rfc/rfc4391.txt IP over InfiniBand (IPoIB) Architecture (RFC 4392) http://ietf.org/rfc/rfc4392.txt + IP over InfiniBand: Connected Mode (RFC 4755) + http://ietf.org/rfc/rfc4755.txt -- cgit v0.10.2 From 7a5efb62f6ae366cefac6be475434906c5061e15 Mon Sep 17 00:00:00 2001 From: Don Wood Date: Wed, 8 Apr 2009 14:21:02 -0700 Subject: RDMA/nes: Fix incorrect casts on 32-bit architectures The were some incorrect casts to unsigned long that caused 64-bit values to be truncated on 32-bit architectures and made the driver pass invalid adresses and lengths to the hardware. The problems were primarily seen with kernels with highmem configured but some could show up in non-highmem kernels, too. Signed-off-by: Don Wood Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 04b12ad..17621de 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h @@ -289,8 +289,8 @@ static inline __le32 get_crc_value(struct nes_v4_quad *nes_quad) static inline void set_wqe_64bit_value(__le32 *wqe_words, u32 index, u64 value) { - wqe_words[index] = cpu_to_le32((u32) ((unsigned long)value)); - wqe_words[index + 1] = cpu_to_le32((u32)(upper_32_bits((unsigned long)value))); + wqe_words[index] = cpu_to_le32((u32) value); + wqe_words[index + 1] = cpu_to_le32(upper_32_bits(value)); } static inline void diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 5242515..7c94247 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -2690,6 +2690,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) struct ib_mr *ibmr = NULL; struct ib_phys_buf ibphysbuf; struct nes_pd *nespd; + u64 tagged_offset; @@ -2755,10 +2756,11 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ibphysbuf.addr = nesqp->ietf_frame_pbase; ibphysbuf.size = conn_param->private_data_len + sizeof(struct ietf_mpa_frame); + tagged_offset = (u64)(unsigned long)nesqp->ietf_frame; ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd, &ibphysbuf, 1, IB_ACCESS_LOCAL_WRITE, - (u64 *)&nesqp->ietf_frame); + &tagged_offset); if (!ibmr) { nes_debug(NES_DBG_CM, "Unable to register memory region" "for lSMM for cm_node = %p \n", @@ -2782,7 +2784,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) sizeof(struct ietf_mpa_frame)); set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX, - (u64)nesqp->ietf_frame); + (u64)(unsigned long)nesqp->ietf_frame); wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = cpu_to_le32(conn_param->private_data_len + sizeof(struct ietf_mpa_frame)); -- cgit v0.10.2 From 79fc3d7410c861c8ced5b81a5c3759f6bbf891dc Mon Sep 17 00:00:00 2001 From: Faisal Latif Date: Wed, 8 Apr 2009 14:22:20 -0700 Subject: RDMA/nes: Fix error handling issues Fix issues found by static code analysis: (1) Check if cm_node was successfully created for loopback connection. (2) schedule_nes_timer() does not free up allocated memory after encountering an error. There is a WARN_ON() for this condition. (3) there is a cm_node->freed flag which is set but not used. Reported-by: Dan Carpenter Signed-off-by: Faisal Latif Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 7c94247..a09caf5 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -426,6 +426,7 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, if (type == NES_TIMER_TYPE_CLOSE) { new_send->timetosend += (HZ/10); if (cm_node->recv_entry) { + kfree(new_send); WARN_ON(1); return -EINVAL; } @@ -1262,7 +1263,6 @@ static int rem_ref_cm_node(struct nes_cm_core *cm_core, cm_node->nesqp = NULL; } - cm_node->freed = 1; kfree(cm_node); return 0; } @@ -1999,13 +1999,17 @@ static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core, if (loopbackremotelistener == NULL) { create_event(cm_node, NES_CM_EVENT_ABORTED); } else { - atomic_inc(&cm_loopbacks); loopback_cm_info = *cm_info; loopback_cm_info.loc_port = cm_info->rem_port; loopback_cm_info.rem_port = cm_info->loc_port; loopback_cm_info.cm_id = loopbackremotelistener->cm_id; loopbackremotenode = make_cm_node(cm_core, nesvnic, &loopback_cm_info, loopbackremotelistener); + if (!loopbackremotenode) { + rem_ref_cm_node(cm_node->cm_core, cm_node); + return NULL; + } + atomic_inc(&cm_loopbacks); loopbackremotenode->loopbackpartner = cm_node; loopbackremotenode->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE; diff --git a/drivers/infiniband/hw/nes/nes_cm.h b/drivers/infiniband/hw/nes/nes_cm.h index d5f7782..80bba18 100644 --- a/drivers/infiniband/hw/nes/nes_cm.h +++ b/drivers/infiniband/hw/nes/nes_cm.h @@ -298,7 +298,6 @@ struct nes_cm_node { struct nes_vnic *nesvnic; int apbvt_set; int accept_pend; - int freed; struct list_head timer_entry; struct list_head reset_entry; struct nes_qp *nesqp; -- cgit v0.10.2 From 5962c2c8036b4dcf10ec6c481be656ae4700b664 Mon Sep 17 00:00:00 2001 From: Faisal Latif Date: Wed, 8 Apr 2009 14:23:55 -0700 Subject: RDMA/nes: Fix nes_nic_cm_xmit() error handling We are getting crash or hung situation when we are running network cable pull tests during RDMA traffic. In schedule_nes_timer(), we return an error if nes_nic_cm_xmit() returns failure. This is changed to success as skb is being put on the timer routines to be processed later. In send_syn() case, we are indicating connect failure once from nes_connect() and the other when the rexmit retries expires. The other issue is skb->users which we are incrementing before calling nes_nic_cm_xmit() which calls dev_queue_xmit() but in case of failure we are decrementing the skb->users at the same time putting the skb on the rexmit path. Even if dev_queue_xmit() fails, the skb->users is decremented already. We are removing the decrement of skb->users in case of failure from both schedule_nes_timer() as well as from nes_cm_timer_tick(). There is also extra check in nes_cm_timer_tick() for rexmit failure which does a break from the loop is removed. This causes problem as the other nodes have their cm_node->ref_count incremented and are not processed. Signed-off-by: Faisal Latif Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index a09caf5..dbd9a75 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -446,8 +446,8 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, if (ret != NETDEV_TX_OK) { nes_debug(NES_DBG_CM, "Error sending packet %p " "(jiffies = %lu)\n", new_send, jiffies); - atomic_dec(&new_send->skb->users); new_send->timetosend = jiffies; + ret = NETDEV_TX_OK; } else { cm_packets_sent++; if (!send_retrans) { @@ -631,7 +631,6 @@ static void nes_cm_timer_tick(unsigned long pass) nes_debug(NES_DBG_CM, "rexmit failed for " "node=%p\n", cm_node); cm_packets_bounced++; - atomic_dec(&send_entry->skb->users); send_entry->retrycount--; nexttimeout = jiffies + NES_SHORT_TIME; settimer = 1; @@ -667,11 +666,6 @@ static void nes_cm_timer_tick(unsigned long pass) spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags); rem_ref_cm_node(cm_node->cm_core, cm_node); - if (ret != NETDEV_TX_OK) { - nes_debug(NES_DBG_CM, "rexmit failed for cm_node=%p\n", - cm_node); - break; - } } if (settimer) { -- cgit v0.10.2 From 1b9493248cf5e9f1ecc045488100cbf3ccd91be1 Mon Sep 17 00:00:00 2001 From: Chien Tung Date: Wed, 8 Apr 2009 14:27:09 -0700 Subject: RDMA/nes: Fix SFP+ PHY initialization SFP+ PHY initialization has very long delays, incorrect settings for direct attach copper cables, and inconsistent link detection. Adjust delays to the minimum required by the PHY. Worst case is now less than 4 seconds. Add new register settings for direct attach cables. Change link detection logic to use two new registers for more consistent link state detection. Reorganize code to shorten line length. Signed-off-by: Chien Tung Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 52e7340..466c730 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c @@ -757,6 +757,10 @@ static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count, ((port_count > 2) && (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G))) { /* init serdes 1 */ + if (nesadapter->phy_type[0] == NES_PHY_TYPE_ARGUS) { + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000); + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000); + } nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000000FF); if (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G) { serdes_common_control = nes_read_indexed(nesdev, @@ -1259,203 +1263,155 @@ int nes_init_phy(struct nes_device *nesdev) { struct nes_adapter *nesadapter = nesdev->nesadapter; u32 counter = 0; - u32 sds_common_control0; + u32 sds; u32 mac_index = nesdev->mac_index; u32 tx_config = 0; u16 phy_data; u32 temp_phy_data = 0; u32 temp_phy_data2 = 0; - u32 i = 0; + u8 phy_type = nesadapter->phy_type[mac_index]; + u8 phy_index = nesadapter->phy_index[mac_index]; if ((nesadapter->OneG_Mode) && - (nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) { + (phy_type != NES_PHY_TYPE_PUMA_1G)) { nes_debug(NES_DBG_PHY, "1G PHY, mac_index = %d.\n", mac_index); - if (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_1G) { - printk(PFX "%s: Programming mdc config for 1G\n", __func__); + if (phy_type == NES_PHY_TYPE_1G) { tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG); tx_config &= 0xFFFFFFE3; tx_config |= 0x04; nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config); } - nes_read_1G_phy_reg(nesdev, 1, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 1 phy address %u = 0x%X.\n", - nesadapter->phy_index[mac_index], phy_data); - nes_write_1G_phy_reg(nesdev, 23, nesadapter->phy_index[mac_index], 0xb000); + nes_read_1G_phy_reg(nesdev, 1, phy_index, &phy_data); + nes_write_1G_phy_reg(nesdev, 23, phy_index, 0xb000); /* Reset the PHY */ - nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], 0x8000); + nes_write_1G_phy_reg(nesdev, 0, phy_index, 0x8000); udelay(100); counter = 0; do { - nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0 = 0x%X.\n", phy_data); - if (counter++ > 100) break; + nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); + if (counter++ > 100) + break; } while (phy_data & 0x8000); /* Setting no phy loopback */ phy_data &= 0xbfff; phy_data |= 0x1140; - nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], phy_data); - nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0 = 0x%X.\n", phy_data); - - nes_read_1G_phy_reg(nesdev, 0x17, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x17 = 0x%X.\n", phy_data); - - nes_read_1G_phy_reg(nesdev, 0x1e, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x1e = 0x%X.\n", phy_data); + nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data); + nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); + nes_read_1G_phy_reg(nesdev, 0x17, phy_index, &phy_data); + nes_read_1G_phy_reg(nesdev, 0x1e, phy_index, &phy_data); /* Setting the interrupt mask */ - nes_read_1G_phy_reg(nesdev, 0x19, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x19 = 0x%X.\n", phy_data); - nes_write_1G_phy_reg(nesdev, 0x19, nesadapter->phy_index[mac_index], 0xffee); - - nes_read_1G_phy_reg(nesdev, 0x19, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x19 = 0x%X.\n", phy_data); + nes_read_1G_phy_reg(nesdev, 0x19, phy_index, &phy_data); + nes_write_1G_phy_reg(nesdev, 0x19, phy_index, 0xffee); + nes_read_1G_phy_reg(nesdev, 0x19, phy_index, &phy_data); /* turning on flow control */ - nes_read_1G_phy_reg(nesdev, 4, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x4 = 0x%X.\n", phy_data); - nes_write_1G_phy_reg(nesdev, 4, nesadapter->phy_index[mac_index], - (phy_data & ~(0x03E0)) | 0xc00); - /* nes_write_1G_phy_reg(nesdev, 4, nesadapter->phy_index[mac_index], - phy_data | 0xc00); */ - nes_read_1G_phy_reg(nesdev, 4, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x4 = 0x%X.\n", phy_data); - - nes_read_1G_phy_reg(nesdev, 9, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x9 = 0x%X.\n", phy_data); - /* Clear Half duplex */ - nes_write_1G_phy_reg(nesdev, 9, nesadapter->phy_index[mac_index], - phy_data & ~(0x0100)); - nes_read_1G_phy_reg(nesdev, 9, nesadapter->phy_index[mac_index], &phy_data); - nes_debug(NES_DBG_PHY, "Phy data from register 0x9 = 0x%X.\n", phy_data); + nes_read_1G_phy_reg(nesdev, 4, phy_index, &phy_data); + nes_write_1G_phy_reg(nesdev, 4, phy_index, (phy_data & ~(0x03E0)) | 0xc00); + nes_read_1G_phy_reg(nesdev, 4, phy_index, &phy_data); - nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], &phy_data); - nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[mac_index], phy_data | 0x0300); - } else { - if ((nesadapter->phy_type[mac_index] == NES_PHY_TYPE_IRIS) || - (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_ARGUS)) { - /* setup 10G MDIO operation */ - tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG); - tx_config &= 0xFFFFFFE3; - tx_config |= 0x15; - nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config); - } - if ((nesadapter->phy_type[mac_index] == NES_PHY_TYPE_ARGUS)) { - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee); + /* Clear Half duplex */ + nes_read_1G_phy_reg(nesdev, 9, phy_index, &phy_data); + nes_write_1G_phy_reg(nesdev, 9, phy_index, phy_data & ~(0x0100)); + nes_read_1G_phy_reg(nesdev, 9, phy_index, &phy_data); - temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - mdelay(10); - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee); - temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); + nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data | 0x0300); - /* - * if firmware is already running (like from a - * driver un-load/load, don't do anything. - */ - if (temp_phy_data == temp_phy_data2) { - /* configure QT2505 AMCC PHY */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0x0000, 0x8000); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc300, 0x0000); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc302, 0x0044); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc318, 0x0052); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc319, 0x0008); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc31a, 0x0098); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0026, 0x0E00); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0027, 0x0001); - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0x0028, 0xA528); + return 0; + } - /* - * remove micro from reset; chip boots from ROM, - * uploads EEPROM f/w image, uC executes f/w - */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc300, 0x0002); + if ((phy_type == NES_PHY_TYPE_IRIS) || + (phy_type == NES_PHY_TYPE_ARGUS)) { + /* setup 10G MDIO operation */ + tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG); + tx_config &= 0xFFFFFFE3; + tx_config |= 0x15; + nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config); + } + if ((phy_type == NES_PHY_TYPE_ARGUS)) { + /* Check firmware heartbeat */ + nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee); + temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + udelay(1500); + nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee); + temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - /* - * wait for heart beat to start to - * know loading is done - */ - counter = 0; - do { - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee); - temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - if (counter++ > 1000) { - nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from heartbeat check \n"); - break; - } - mdelay(100); - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7ee); - temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - } while ((temp_phy_data2 == temp_phy_data)); + if (temp_phy_data != temp_phy_data2) + return 0; - /* - * wait for tracking to start to know - * f/w is good to go - */ - counter = 0; - do { - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x3, 0xd7fd); - temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - if (counter++ > 1000) { - nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from status check \n"); - break; - } - mdelay(1000); - /* - * nes_debug(NES_DBG_PHY, "AMCC PHY- phy_status not ready yet = 0x%02X\n", - * temp_phy_data); - */ - } while (((temp_phy_data & 0xff) != 0x50) && ((temp_phy_data & 0xff) != 0x70)); - - /* set LOS Control invert RXLOSB_I_PADINV */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd003, 0x0000); - /* set LOS Control to mask of RXLOSB_I */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xc314, 0x0042); - /* set LED1 to input mode (LED1 and LED2 share same LED) */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd006, 0x0007); - /* set LED2 to RX link_status and activity */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd007, 0x000A); - /* set LED3 to RX link_status */ - nes_write_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 0x1, 0xd008, 0x0009); + /* no heartbeat, configure the PHY */ + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0000); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098); + nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00); + nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0001); - /* - * reset the res-calibration on t2 - * serdes; ensures it is stable after - * the amcc phy is stable - */ + /* setup LEDs */ + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd006, 0x0007); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd007, 0x000A); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd008, 0x0009); - sds_common_control0 = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0); - sds_common_control0 |= 0x1; - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds_common_control0); + nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0028, 0xA528); - /* release the res-calibration reset */ - sds_common_control0 &= 0xfffffffe; - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds_common_control0); + /* Bring PHY out of reset */ + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0002); - i = 0; - while (((nes_read32(nesdev->regs + NES_SOFTWARE_RESET) & 0x00000040) != 0x00000040) - && (i++ < 5000)) { - /* mdelay(1); */ - } + /* Check for heartbeat */ + counter = 0; + mdelay(690); + nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee); + temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + do { + if (counter++ > 150) { + nes_debug(NES_DBG_PHY, "No PHY heartbeat\n"); + break; + } + mdelay(1); + nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee); + temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + } while ((temp_phy_data2 == temp_phy_data)); - /* - * wait for link train done before moving on, - * or will get an interupt storm - */ - counter = 0; - do { - temp_phy_data = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 + - (0x200 * (nesdev->mac_index & 1))); - if (counter++ > 1000) { - nes_debug(NES_DBG_PHY, "AMCC PHY- breaking from link train wait \n"); - break; - } - mdelay(1); - } while (((temp_phy_data & 0x0f1f0000) != 0x0f0f0000)); + /* wait for tracking */ + counter = 0; + do { + nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7fd); + temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + if (counter++ > 300) { + nes_debug(NES_DBG_PHY, "PHY did not track\n"); + break; } - } + mdelay(10); + } while (((temp_phy_data & 0xff) != 0x50) && ((temp_phy_data & 0xff) != 0x70)); + + /* setup signal integrity */ + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd003, 0x0000); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00D, 0x00FE); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00E, 0x0032); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xF00F, 0x0002); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc314, 0x0063); + + /* reset serdes */ + sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + + mac_index * 0x200); + sds |= 0x1; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + + mac_index * 0x200, sds); + sds &= 0xfffffffe; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0 + + mac_index * 0x200, sds); + + counter = 0; + while (((nes_read32(nesdev->regs + NES_SOFTWARE_RESET) & 0x00000040) != 0x00000040) + && (counter++ < 5000)) + ; } return 0; } @@ -2483,19 +2439,18 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9004); nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9005); /* check link status */ - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1); + nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 0x9003); temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - u32temp = 100; - do { - nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 1, 1); - phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); - if ((phy_data == temp_phy_data) || (!(--u32temp))) - break; - temp_phy_data = phy_data; - } while (1); + nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021); + nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 3, 0x0021); + phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); + + phy_data = (!temp_phy_data && (phy_data == 0x8000)) ? 0x4 : 0x0; + nes_debug(NES_DBG_PHY, "%s: Phy data = 0x%04X, link was %s.\n", - __func__, phy_data, nesadapter->mac_link_down ? "DOWN" : "UP"); + __func__, phy_data, nesadapter->mac_link_down[mac_index] ? "DOWN" : "UP"); break; case NES_PHY_TYPE_PUMA_1G: -- cgit v0.10.2 From a4849fc157cdbe4fb68cfe37e7222697f003deb5 Mon Sep 17 00:00:00 2001 From: Chien Tung Date: Wed, 8 Apr 2009 14:27:18 -0700 Subject: RDMA/nes: Add wide_ppm_offset parm for switch compatibility We have observed unstable link with a new BNT switch. Add wide_ppm_offset parameter to allow the user to control the clock ppm offset on the CX4 interface for better compatibility. Default is 100ppm, setting it to 1 will increase it to 300ppm. Change default SerDes1 reference clock to external source. Signed-off-by: Chien Tung Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 466c730..f797064 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c @@ -46,6 +46,10 @@ static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR; module_param(nes_lro_max_aggr, uint, 0444); MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation"); +static int wide_ppm_offset; +module_param(wide_ppm_offset, int, 0644); +MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"); + static u32 crit_err_count; u32 int_mod_timer_init; u32 int_mod_cq_depth_256; @@ -546,8 +550,11 @@ struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) { msleep(1); } if (int_cnt > 1) { + u32 sds; spin_lock_irqsave(&nesadapter->phy_lock, flags); - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, 0x0000F088); + sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1); + sds |= 0x00000040; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, sds); mh_detected++; reset_value = nes_read32(nesdev->regs+NES_SOFTWARE_RESET); reset_value |= 0x0000003d; @@ -736,43 +743,48 @@ static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count, { int i; u32 u32temp; - u32 serdes_common_control; + u32 sds; if (hw_rev != NE020_REV) { /* init serdes 0 */ + if (wide_ppm_offset && (nesadapter->phy_type[0] == NES_PHY_TYPE_CX4)) + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000FFFAA); + else + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF); - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL0, 0x000000FF); if (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G) { - serdes_common_control = nes_read_indexed(nesdev, - NES_IDX_ETH_SERDES_COMMON_CONTROL0); - serdes_common_control |= 0x000000100; - nes_write_indexed(nesdev, - NES_IDX_ETH_SERDES_COMMON_CONTROL0, - serdes_common_control); - } else if (!OneG_Mode) { - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE0, 0x11110000); + sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0); + sds |= 0x00000100; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, sds); } - if (((port_count > 1) && - (nesadapter->phy_type[0] != NES_PHY_TYPE_PUMA_1G)) || - ((port_count > 2) && - (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G))) { - /* init serdes 1 */ - if (nesadapter->phy_type[0] == NES_PHY_TYPE_ARGUS) { - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000); - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000); - } - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000000FF); - if (nesadapter->phy_type[0] == NES_PHY_TYPE_PUMA_1G) { - serdes_common_control = nes_read_indexed(nesdev, - NES_IDX_ETH_SERDES_COMMON_CONTROL1); - serdes_common_control |= 0x000000100; - nes_write_indexed(nesdev, - NES_IDX_ETH_SERDES_COMMON_CONTROL1, - serdes_common_control); - } else if (!OneG_Mode) { - nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE1, 0x11110000); - } + if (!OneG_Mode) + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE0, 0x11110000); + + if (port_count < 2) + return 0; + + /* init serdes 1 */ + switch (nesadapter->phy_type[1]) { + case NES_PHY_TYPE_ARGUS: + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000); + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000); + break; + case NES_PHY_TYPE_CX4: + sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1); + sds &= 0xFFFFFFBF; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, sds); + if (wide_ppm_offset) + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000FFFAA); + else + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_CDR_CONTROL1, 0x000000FF); + break; + case NES_PHY_TYPE_PUMA_1G: + sds = nes_read_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1); + sds |= 0x000000100; + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL1, sds); } + if (!OneG_Mode) + nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE1, 0x11110000); } else { /* init serdes 0 */ nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_COMMON_CONTROL0, 0x00000008); @@ -2315,6 +2327,7 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) u16 temp_phy_data; u32 pcs_val = 0x0f0f0000; u32 pcs_mask = 0x0f1f0000; + u32 cdr_ctrl; spin_lock_irqsave(&nesadapter->phy_lock, flags); if (nesadapter->mac_sw_state[mac_number] != NES_MAC_SW_IDLE) { @@ -2466,6 +2479,17 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) } if (phy_data & 0x0004) { + if (wide_ppm_offset && + (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_CX4) && + (nesadapter->hw_rev != NE020_REV)) { + cdr_ctrl = nes_read_indexed(nesdev, + NES_IDX_ETH_SERDES_CDR_CONTROL0 + + mac_index * 0x200); + nes_write_indexed(nesdev, + NES_IDX_ETH_SERDES_CDR_CONTROL0 + + mac_index * 0x200, + cdr_ctrl | 0x000F0000); + } nesadapter->mac_link_down[mac_index] = 0; list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) { nes_debug(NES_DBG_PHY, "The Link is UP!!. linkup was %d\n", @@ -2480,6 +2504,17 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) } } } else { + if (wide_ppm_offset && + (nesadapter->phy_type[mac_index] == NES_PHY_TYPE_CX4) && + (nesadapter->hw_rev != NE020_REV)) { + cdr_ctrl = nes_read_indexed(nesdev, + NES_IDX_ETH_SERDES_CDR_CONTROL0 + + mac_index * 0x200); + nes_write_indexed(nesdev, + NES_IDX_ETH_SERDES_CDR_CONTROL0 + + mac_index * 0x200, + cdr_ctrl & 0xFFF0FFFF); + } nesadapter->mac_link_down[mac_index] = 1; list_for_each_entry(nesvnic, &nesadapter->nesvnic_list[mac_index], list) { nes_debug(NES_DBG_PHY, "The Link is Down!!. linkup was %d\n", diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index f41a871..13bc26a 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h @@ -35,6 +35,7 @@ #include +#define NES_PHY_TYPE_CX4 1 #define NES_PHY_TYPE_1G 2 #define NES_PHY_TYPE_IRIS 3 #define NES_PHY_TYPE_ARGUS 4 -- cgit v0.10.2 From 4303565df4eb425851ddd22136fec69bdfeede61 Mon Sep 17 00:00:00 2001 From: Chien Tung Date: Wed, 8 Apr 2009 14:27:56 -0700 Subject: RDMA/nes: Add support for new SFP+ PHY Add new register settings for new SFP+ PHY/firmware. Add new PHY to to nes_netdev_get/set_settings. Signed-off-by: Chien Tung Signed-off-by: Roland Dreier diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index f797064..d6fc9ae 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c @@ -765,7 +765,8 @@ static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count, /* init serdes 1 */ switch (nesadapter->phy_type[1]) { - case NES_PHY_TYPE_ARGUS: + case NES_PHY_TYPE_ARGUS: + case NES_PHY_TYPE_SFP_D: nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000); nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000); break; @@ -1337,14 +1338,16 @@ int nes_init_phy(struct nes_device *nesdev) } if ((phy_type == NES_PHY_TYPE_IRIS) || - (phy_type == NES_PHY_TYPE_ARGUS)) { + (phy_type == NES_PHY_TYPE_ARGUS) || + (phy_type == NES_PHY_TYPE_SFP_D)) { /* setup 10G MDIO operation */ tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG); tx_config &= 0xFFFFFFE3; tx_config |= 0x15; nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config); } - if ((phy_type == NES_PHY_TYPE_ARGUS)) { + if ((phy_type == NES_PHY_TYPE_ARGUS) || + (phy_type == NES_PHY_TYPE_SFP_D)) { /* Check firmware heartbeat */ nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee); temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); @@ -1358,10 +1361,15 @@ int nes_init_phy(struct nes_device *nesdev) /* no heartbeat, configure the PHY */ nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000); nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0000); - nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C); nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A); nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052); - nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008); + if (phy_type == NES_PHY_TYPE_ARGUS) { + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008); + } else { + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x0004); + nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0038); + } nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098); nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00); nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0001); @@ -2442,6 +2450,7 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) break; case NES_PHY_TYPE_ARGUS: + case NES_PHY_TYPE_SFP_D: /* clear the alarms */ nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0x0008); nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc001); diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 13bc26a..c3654c6 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h @@ -42,6 +42,7 @@ #define NES_PHY_TYPE_PUMA_1G 5 #define NES_PHY_TYPE_PUMA_10G 6 #define NES_PHY_TYPE_GLADIUS 7 +#define NES_PHY_TYPE_SFP_D 8 #define NES_MULTICAST_PF_MAX 8 diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index ecb1f6f..c6e6611 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c @@ -1426,49 +1426,55 @@ static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd struct nes_vnic *nesvnic = netdev_priv(netdev); struct nes_device *nesdev = nesvnic->nesdev; struct nes_adapter *nesadapter = nesdev->nesadapter; + u32 mac_index = nesdev->mac_index; + u8 phy_type = nesadapter->phy_type[mac_index]; + u8 phy_index = nesadapter->phy_index[mac_index]; u16 phy_data; et_cmd->duplex = DUPLEX_FULL; et_cmd->port = PORT_MII; + et_cmd->maxtxpkt = 511; + et_cmd->maxrxpkt = 511; if (nesadapter->OneG_Mode) { et_cmd->speed = SPEED_1000; - if (nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_PUMA_1G) { + if (phy_type == NES_PHY_TYPE_PUMA_1G) { et_cmd->supported = SUPPORTED_1000baseT_Full; et_cmd->advertising = ADVERTISED_1000baseT_Full; et_cmd->autoneg = AUTONEG_DISABLE; et_cmd->transceiver = XCVR_INTERNAL; - et_cmd->phy_address = nesdev->mac_index; + et_cmd->phy_address = mac_index; } else { - et_cmd->supported = SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg; - et_cmd->advertising = ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg; - nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index], &phy_data); + et_cmd->supported = SUPPORTED_1000baseT_Full + | SUPPORTED_Autoneg; + et_cmd->advertising = ADVERTISED_1000baseT_Full + | ADVERTISED_Autoneg; + nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); if (phy_data & 0x1000) et_cmd->autoneg = AUTONEG_ENABLE; else et_cmd->autoneg = AUTONEG_DISABLE; et_cmd->transceiver = XCVR_EXTERNAL; - et_cmd->phy_address = nesadapter->phy_index[nesdev->mac_index]; + et_cmd->phy_address = phy_index; } + return 0; + } + if ((phy_type == NES_PHY_TYPE_IRIS) || + (phy_type == NES_PHY_TYPE_ARGUS) || + (phy_type == NES_PHY_TYPE_SFP_D)) { + et_cmd->transceiver = XCVR_EXTERNAL; + et_cmd->port = PORT_FIBRE; + et_cmd->supported = SUPPORTED_FIBRE; + et_cmd->advertising = ADVERTISED_FIBRE; + et_cmd->phy_address = phy_index; } else { - if ((nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_IRIS) || - (nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_ARGUS)) { - et_cmd->transceiver = XCVR_EXTERNAL; - et_cmd->port = PORT_FIBRE; - et_cmd->supported = SUPPORTED_FIBRE; - et_cmd->advertising = ADVERTISED_FIBRE; - et_cmd->phy_address = nesadapter->phy_index[nesdev->mac_index]; - } else { - et_cmd->transceiver = XCVR_INTERNAL; - et_cmd->supported = SUPPORTED_10000baseT_Full; - et_cmd->advertising = ADVERTISED_10000baseT_Full; - et_cmd->phy_address = nesdev->mac_index; - } - et_cmd->speed = SPEED_10000; - et_cmd->autoneg = AUTONEG_DISABLE; + et_cmd->transceiver = XCVR_INTERNAL; + et_cmd->supported = SUPPORTED_10000baseT_Full; + et_cmd->advertising = ADVERTISED_10000baseT_Full; + et_cmd->phy_address = mac_index; } - et_cmd->maxtxpkt = 511; - et_cmd->maxrxpkt = 511; + et_cmd->speed = SPEED_10000; + et_cmd->autoneg = AUTONEG_DISABLE; return 0; } -- cgit v0.10.2 From 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Wed, 8 Apr 2009 20:13:16 +0100 Subject: tty: MAX3100 Thou shalt remember to use 'git add' or errors shall be visited on your downloads and there shall be wrath from on list and much gnashing of teeth. Thou shalt remember to use git status or there shall be catcalls and much embarrasment shall come to pass. Signed-off-by: Alan "I'm hiding" Cox Signed-off-by: Linus Torvalds diff --git a/drivers/serial/max3100.c b/drivers/serial/max3100.c new file mode 100644 index 0000000..9fd33e5 --- /dev/null +++ b/drivers/serial/max3100.c @@ -0,0 +1,927 @@ +/* + * + * Copyright (C) 2008 Christian Pellegrin + * + * 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. + * + * + * Notes: the MAX3100 doesn't provide an interrupt on CTS so we have + * to use polling for flow control. TX empty IRQ is unusable, since + * writing conf clears FIFO buffer and we cannot have this interrupt + * always asking us for attention. + * + * Example platform data: + + static struct plat_max3100 max3100_plat_data = { + .loopback = 0, + .crystal = 0, + .poll_time = 100, + }; + + static struct spi_board_info spi_board_info[] = { + { + .modalias = "max3100", + .platform_data = &max3100_plat_data, + .irq = IRQ_EINT12, + .max_speed_hz = 5*1000*1000, + .chip_select = 0, + }, + }; + + * The initial minor number is 209 in the low-density serial port: + * mknod /dev/ttyMAX0 c 204 209 + */ + +#define MAX3100_MAJOR 204 +#define MAX3100_MINOR 209 +/* 4 MAX3100s should be enough for everyone */ +#define MAX_MAX3100 4 + +#include +#include +#include +#include +#include +#include + +#include + +#define MAX3100_C (1<<14) +#define MAX3100_D (0<<14) +#define MAX3100_W (1<<15) +#define MAX3100_RX (0<<15) + +#define MAX3100_WC (MAX3100_W | MAX3100_C) +#define MAX3100_RC (MAX3100_RX | MAX3100_C) +#define MAX3100_WD (MAX3100_W | MAX3100_D) +#define MAX3100_RD (MAX3100_RX | MAX3100_D) +#define MAX3100_CMD (3 << 14) + +#define MAX3100_T (1<<14) +#define MAX3100_R (1<<15) + +#define MAX3100_FEN (1<<13) +#define MAX3100_SHDN (1<<12) +#define MAX3100_TM (1<<11) +#define MAX3100_RM (1<<10) +#define MAX3100_PM (1<<9) +#define MAX3100_RAM (1<<8) +#define MAX3100_IR (1<<7) +#define MAX3100_ST (1<<6) +#define MAX3100_PE (1<<5) +#define MAX3100_L (1<<4) +#define MAX3100_BAUD (0xf) + +#define MAX3100_TE (1<<10) +#define MAX3100_RAFE (1<<10) +#define MAX3100_RTS (1<<9) +#define MAX3100_CTS (1<<9) +#define MAX3100_PT (1<<8) +#define MAX3100_DATA (0xff) + +#define MAX3100_RT (MAX3100_R | MAX3100_T) +#define MAX3100_RTC (MAX3100_RT | MAX3100_CTS | MAX3100_RAFE) + +/* the following simulate a status reg for ignore_status_mask */ +#define MAX3100_STATUS_PE 1 +#define MAX3100_STATUS_FE 2 +#define MAX3100_STATUS_OE 4 + +struct max3100_port { + struct uart_port port; + struct spi_device *spi; + + int cts; /* last CTS received for flow ctrl */ + int tx_empty; /* last TX empty bit */ + + spinlock_t conf_lock; /* shared data */ + int conf_commit; /* need to make changes */ + int conf; /* configuration for the MAX31000 + * (bits 0-7, bits 8-11 are irqs) */ + int rts_commit; /* need to change rts */ + int rts; /* rts status */ + int baud; /* current baud rate */ + + int parity; /* keeps track if we should send parity */ +#define MAX3100_PARITY_ON 1 +#define MAX3100_PARITY_ODD 2 +#define MAX3100_7BIT 4 + int rx_enabled; /* if we should rx chars */ + + int irq; /* irq assigned to the max3100 */ + + int minor; /* minor number */ + int crystal; /* 1 if 3.6864Mhz crystal 0 for 1.8432 */ + int loopback; /* 1 if we are in loopback mode */ + + /* for handling irqs: need workqueue since we do spi_sync */ + struct workqueue_struct *workqueue; + struct work_struct work; + /* set to 1 to make the workhandler exit as soon as possible */ + int force_end_work; + /* need to know we are suspending to avoid deadlock on workqueue */ + int suspending; + + /* hook for suspending MAX3100 via dedicated pin */ + void (*max3100_hw_suspend) (int suspend); + + /* poll time (in ms) for ctrl lines */ + int poll_time; + /* and its timer */ + struct timer_list timer; +}; + +static struct max3100_port *max3100s[MAX_MAX3100]; /* the chips */ +static DEFINE_MUTEX(max3100s_lock); /* race on probe */ + +static int max3100_do_parity(struct max3100_port *s, u16 c) +{ + int parity; + + if (s->parity & MAX3100_PARITY_ODD) + parity = 1; + else + parity = 0; + + if (s->parity & MAX3100_7BIT) + c &= 0x7f; + else + c &= 0xff; + + parity = parity ^ (hweight8(c) & 1); + return parity; +} + +static int max3100_check_parity(struct max3100_port *s, u16 c) +{ + return max3100_do_parity(s, c) == ((c >> 8) & 1); +} + +static void max3100_calc_parity(struct max3100_port *s, u16 *c) +{ + if (s->parity & MAX3100_7BIT) + *c &= 0x7f; + else + *c &= 0xff; + + if (s->parity & MAX3100_PARITY_ON) + *c |= max3100_do_parity(s, *c) << 8; +} + +static void max3100_work(struct work_struct *w); + +static void max3100_dowork(struct max3100_port *s) +{ + if (!s->force_end_work && !work_pending(&s->work) && + !freezing(current) && !s->suspending) + queue_work(s->workqueue, &s->work); +} + +static void max3100_timeout(unsigned long data) +{ + struct max3100_port *s = (struct max3100_port *)data; + + if (s->port.info) { + max3100_dowork(s); + mod_timer(&s->timer, jiffies + s->poll_time); + } +} + +static int max3100_sr(struct max3100_port *s, u16 tx, u16 *rx) +{ + struct spi_message message; + u16 etx, erx; + int status; + struct spi_transfer tran = { + .tx_buf = &etx, + .rx_buf = &erx, + .len = 2, + }; + + etx = cpu_to_be16(tx); + spi_message_init(&message); + spi_message_add_tail(&tran, &message); + status = spi_sync(s->spi, &message); + if (status) { + dev_warn(&s->spi->dev, "error while calling spi_sync\n"); + return -EIO; + } + *rx = be16_to_cpu(erx); + s->tx_empty = (*rx & MAX3100_T) > 0; + dev_dbg(&s->spi->dev, "%04x - %04x\n", tx, *rx); + return 0; +} + +static int max3100_handlerx(struct max3100_port *s, u16 rx) +{ + unsigned int ch, flg, status = 0; + int ret = 0, cts; + + if (rx & MAX3100_R && s->rx_enabled) { + dev_dbg(&s->spi->dev, "%s\n", __func__); + ch = rx & (s->parity & MAX3100_7BIT ? 0x7f : 0xff); + if (rx & MAX3100_RAFE) { + s->port.icount.frame++; + flg = TTY_FRAME; + status |= MAX3100_STATUS_FE; + } else { + if (s->parity & MAX3100_PARITY_ON) { + if (max3100_check_parity(s, rx)) { + s->port.icount.rx++; + flg = TTY_NORMAL; + } else { + s->port.icount.parity++; + flg = TTY_PARITY; + status |= MAX3100_STATUS_PE; + } + } else { + s->port.icount.rx++; + flg = TTY_NORMAL; + } + } + uart_insert_char(&s->port, status, MAX3100_STATUS_OE, ch, flg); + ret = 1; + } + + cts = (rx & MAX3100_CTS) > 0; + if (s->cts != cts) { + s->cts = cts; + uart_handle_cts_change(&s->port, cts ? TIOCM_CTS : 0); + } + + return ret; +} + +static void max3100_work(struct work_struct *w) +{ + struct max3100_port *s = container_of(w, struct max3100_port, work); + int rxchars; + u16 tx, rx; + int conf, cconf, rts, crts; + struct circ_buf *xmit = &s->port.info->xmit; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + rxchars = 0; + do { + spin_lock(&s->conf_lock); + conf = s->conf; + cconf = s->conf_commit; + s->conf_commit = 0; + rts = s->rts; + crts = s->rts_commit; + s->rts_commit = 0; + spin_unlock(&s->conf_lock); + if (cconf) + max3100_sr(s, MAX3100_WC | conf, &rx); + if (crts) { + max3100_sr(s, MAX3100_WD | MAX3100_TE | + (s->rts ? MAX3100_RTS : 0), &rx); + rxchars += max3100_handlerx(s, rx); + } + + max3100_sr(s, MAX3100_RD, &rx); + rxchars += max3100_handlerx(s, rx); + + if (rx & MAX3100_T) { + tx = 0xffff; + if (s->port.x_char) { + tx = s->port.x_char; + s->port.icount.tx++; + s->port.x_char = 0; + } else if (!uart_circ_empty(xmit) && + !uart_tx_stopped(&s->port)) { + tx = xmit->buf[xmit->tail]; + xmit->tail = (xmit->tail + 1) & + (UART_XMIT_SIZE - 1); + s->port.icount.tx++; + } + if (tx != 0xffff) { + max3100_calc_parity(s, &tx); + tx |= MAX3100_WD | (s->rts ? MAX3100_RTS : 0); + max3100_sr(s, tx, &rx); + rxchars += max3100_handlerx(s, rx); + } + } + + if (rxchars > 16 && s->port.info->port.tty != NULL) { + tty_flip_buffer_push(s->port.info->port.tty); + rxchars = 0; + } + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) + uart_write_wakeup(&s->port); + + } while (!s->force_end_work && + !freezing(current) && + ((rx & MAX3100_R) || + (!uart_circ_empty(xmit) && + !uart_tx_stopped(&s->port)))); + + if (rxchars > 0 && s->port.info->port.tty != NULL) + tty_flip_buffer_push(s->port.info->port.tty); +} + +static irqreturn_t max3100_irq(int irqno, void *dev_id) +{ + struct max3100_port *s = dev_id; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + max3100_dowork(s); + return IRQ_HANDLED; +} + +static void max3100_enable_ms(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + if (s->poll_time > 0) + mod_timer(&s->timer, jiffies); + dev_dbg(&s->spi->dev, "%s\n", __func__); +} + +static void max3100_start_tx(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + max3100_dowork(s); +} + +static void max3100_stop_rx(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + s->rx_enabled = 0; + spin_lock(&s->conf_lock); + s->conf &= ~MAX3100_RM; + s->conf_commit = 1; + spin_unlock(&s->conf_lock); + max3100_dowork(s); +} + +static unsigned int max3100_tx_empty(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + /* may not be truly up-to-date */ + max3100_dowork(s); + return s->tx_empty; +} + +static unsigned int max3100_get_mctrl(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + /* may not be truly up-to-date */ + max3100_dowork(s); + /* always assert DCD and DSR since these lines are not wired */ + return (s->cts ? TIOCM_CTS : 0) | TIOCM_DSR | TIOCM_CAR; +} + +static void max3100_set_mctrl(struct uart_port *port, unsigned int mctrl) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + int rts; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + rts = (mctrl & TIOCM_RTS) > 0; + + spin_lock(&s->conf_lock); + if (s->rts != rts) { + s->rts = rts; + s->rts_commit = 1; + max3100_dowork(s); + } + spin_unlock(&s->conf_lock); +} + +static void +max3100_set_termios(struct uart_port *port, struct ktermios *termios, + struct ktermios *old) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + int baud = 0; + unsigned cflag; + u32 param_new, param_mask, parity = 0; + struct tty_struct *tty = s->port.info->port.tty; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + if (!tty) + return; + + cflag = termios->c_cflag; + param_new = 0; + param_mask = 0; + + baud = tty_get_baud_rate(tty); + param_new = s->conf & MAX3100_BAUD; + switch (baud) { + case 300: + if (s->crystal) + baud = s->baud; + else + param_new = 15; + break; + case 600: + param_new = 14 + s->crystal; + break; + case 1200: + param_new = 13 + s->crystal; + break; + case 2400: + param_new = 12 + s->crystal; + break; + case 4800: + param_new = 11 + s->crystal; + break; + case 9600: + param_new = 10 + s->crystal; + break; + case 19200: + param_new = 9 + s->crystal; + break; + case 38400: + param_new = 8 + s->crystal; + break; + case 57600: + param_new = 1 + s->crystal; + break; + case 115200: + param_new = 0 + s->crystal; + break; + case 230400: + if (s->crystal) + param_new = 0; + else + baud = s->baud; + break; + default: + baud = s->baud; + } + tty_encode_baud_rate(tty, baud, baud); + s->baud = baud; + param_mask |= MAX3100_BAUD; + + if ((cflag & CSIZE) == CS8) { + param_new &= ~MAX3100_L; + parity &= ~MAX3100_7BIT; + } else { + param_new |= MAX3100_L; + parity |= MAX3100_7BIT; + cflag = (cflag & ~CSIZE) | CS7; + } + param_mask |= MAX3100_L; + + if (cflag & CSTOPB) + param_new |= MAX3100_ST; + else + param_new &= ~MAX3100_ST; + param_mask |= MAX3100_ST; + + if (cflag & PARENB) { + param_new |= MAX3100_PE; + parity |= MAX3100_PARITY_ON; + } else { + param_new &= ~MAX3100_PE; + parity &= ~MAX3100_PARITY_ON; + } + param_mask |= MAX3100_PE; + + if (cflag & PARODD) + parity |= MAX3100_PARITY_ODD; + else + parity &= ~MAX3100_PARITY_ODD; + + /* mask termios capabilities we don't support */ + cflag &= ~CMSPAR; + termios->c_cflag = cflag; + + s->port.ignore_status_mask = 0; + if (termios->c_iflag & IGNPAR) + s->port.ignore_status_mask |= + MAX3100_STATUS_PE | MAX3100_STATUS_FE | + MAX3100_STATUS_OE; + + /* we are sending char from a workqueue so enable */ + s->port.info->port.tty->low_latency = 1; + + if (s->poll_time > 0) + del_timer_sync(&s->timer); + + uart_update_timeout(port, termios->c_cflag, baud); + + spin_lock(&s->conf_lock); + s->conf = (s->conf & ~param_mask) | (param_new & param_mask); + s->conf_commit = 1; + s->parity = parity; + spin_unlock(&s->conf_lock); + max3100_dowork(s); + + if (UART_ENABLE_MS(&s->port, termios->c_cflag)) + max3100_enable_ms(&s->port); +} + +static void max3100_shutdown(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + if (s->suspending) + return; + + s->force_end_work = 1; + + if (s->poll_time > 0) + del_timer_sync(&s->timer); + + if (s->workqueue) { + flush_workqueue(s->workqueue); + destroy_workqueue(s->workqueue); + s->workqueue = NULL; + } + if (s->irq) + free_irq(s->irq, s); + + /* set shutdown mode to save power */ + if (s->max3100_hw_suspend) + s->max3100_hw_suspend(1); + else { + u16 tx, rx; + + tx = MAX3100_WC | MAX3100_SHDN; + max3100_sr(s, tx, &rx); + } +} + +static int max3100_startup(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + char b[12]; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + s->conf = MAX3100_RM; + s->baud = s->crystal ? 230400 : 115200; + s->rx_enabled = 1; + + if (s->suspending) + return 0; + + s->force_end_work = 0; + s->parity = 0; + s->rts = 0; + + sprintf(b, "max3100-%d", s->minor); + s->workqueue = create_freezeable_workqueue(b); + if (!s->workqueue) { + dev_warn(&s->spi->dev, "cannot create workqueue\n"); + return -EBUSY; + } + INIT_WORK(&s->work, max3100_work); + + if (request_irq(s->irq, max3100_irq, + IRQF_TRIGGER_FALLING, "max3100", s) < 0) { + dev_warn(&s->spi->dev, "cannot allocate irq %d\n", s->irq); + s->irq = 0; + destroy_workqueue(s->workqueue); + s->workqueue = NULL; + return -EBUSY; + } + + if (s->loopback) { + u16 tx, rx; + tx = 0x4001; + max3100_sr(s, tx, &rx); + } + + if (s->max3100_hw_suspend) + s->max3100_hw_suspend(0); + s->conf_commit = 1; + max3100_dowork(s); + /* wait for clock to settle */ + msleep(50); + + max3100_enable_ms(&s->port); + + return 0; +} + +static const char *max3100_type(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + return s->port.type == PORT_MAX3100 ? "MAX3100" : NULL; +} + +static void max3100_release_port(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); +} + +static void max3100_config_port(struct uart_port *port, int flags) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + if (flags & UART_CONFIG_TYPE) + s->port.type = PORT_MAX3100; +} + +static int max3100_verify_port(struct uart_port *port, + struct serial_struct *ser) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + int ret = -EINVAL; + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + if (ser->type == PORT_UNKNOWN || ser->type == PORT_MAX3100) + ret = 0; + return ret; +} + +static void max3100_stop_tx(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); +} + +static int max3100_request_port(struct uart_port *port) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + return 0; +} + +static void max3100_break_ctl(struct uart_port *port, int break_state) +{ + struct max3100_port *s = container_of(port, + struct max3100_port, + port); + + dev_dbg(&s->spi->dev, "%s\n", __func__); +} + +static struct uart_ops max3100_ops = { + .tx_empty = max3100_tx_empty, + .set_mctrl = max3100_set_mctrl, + .get_mctrl = max3100_get_mctrl, + .stop_tx = max3100_stop_tx, + .start_tx = max3100_start_tx, + .stop_rx = max3100_stop_rx, + .enable_ms = max3100_enable_ms, + .break_ctl = max3100_break_ctl, + .startup = max3100_startup, + .shutdown = max3100_shutdown, + .set_termios = max3100_set_termios, + .type = max3100_type, + .release_port = max3100_release_port, + .request_port = max3100_request_port, + .config_port = max3100_config_port, + .verify_port = max3100_verify_port, +}; + +static struct uart_driver max3100_uart_driver = { + .owner = THIS_MODULE, + .driver_name = "ttyMAX", + .dev_name = "ttyMAX", + .major = MAX3100_MAJOR, + .minor = MAX3100_MINOR, + .nr = MAX_MAX3100, +}; +static int uart_driver_registered; + +static int __devinit max3100_probe(struct spi_device *spi) +{ + int i, retval; + struct plat_max3100 *pdata; + u16 tx, rx; + + mutex_lock(&max3100s_lock); + + if (!uart_driver_registered) { + uart_driver_registered = 1; + retval = uart_register_driver(&max3100_uart_driver); + if (retval) { + printk(KERN_ERR "Couldn't register max3100 uart driver\n"); + mutex_unlock(&max3100s_lock); + return retval; + } + } + + for (i = 0; i < MAX_MAX3100; i++) + if (!max3100s[i]) + break; + if (i == MAX_MAX3100) { + dev_warn(&spi->dev, "too many MAX3100 chips\n"); + mutex_unlock(&max3100s_lock); + return -ENOMEM; + } + + max3100s[i] = kzalloc(sizeof(struct max3100_port), GFP_KERNEL); + if (!max3100s[i]) { + dev_warn(&spi->dev, + "kmalloc for max3100 structure %d failed!\n", i); + mutex_unlock(&max3100s_lock); + return -ENOMEM; + } + max3100s[i]->spi = spi; + max3100s[i]->irq = spi->irq; + spin_lock_init(&max3100s[i]->conf_lock); + dev_set_drvdata(&spi->dev, max3100s[i]); + pdata = spi->dev.platform_data; + max3100s[i]->crystal = pdata->crystal; + max3100s[i]->loopback = pdata->loopback; + max3100s[i]->poll_time = pdata->poll_time * HZ / 1000; + if (pdata->poll_time > 0 && max3100s[i]->poll_time == 0) + max3100s[i]->poll_time = 1; + max3100s[i]->max3100_hw_suspend = pdata->max3100_hw_suspend; + max3100s[i]->minor = i; + init_timer(&max3100s[i]->timer); + max3100s[i]->timer.function = max3100_timeout; + max3100s[i]->timer.data = (unsigned long) max3100s[i]; + + dev_dbg(&spi->dev, "%s: adding port %d\n", __func__, i); + max3100s[i]->port.irq = max3100s[i]->irq; + max3100s[i]->port.uartclk = max3100s[i]->crystal ? 3686400 : 1843200; + max3100s[i]->port.fifosize = 16; + max3100s[i]->port.ops = &max3100_ops; + max3100s[i]->port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; + max3100s[i]->port.line = i; + max3100s[i]->port.type = PORT_MAX3100; + max3100s[i]->port.dev = &spi->dev; + retval = uart_add_one_port(&max3100_uart_driver, &max3100s[i]->port); + if (retval < 0) + dev_warn(&spi->dev, + "uart_add_one_port failed for line %d with error %d\n", + i, retval); + + /* set shutdown mode to save power. Will be woken-up on open */ + if (max3100s[i]->max3100_hw_suspend) + max3100s[i]->max3100_hw_suspend(1); + else { + tx = MAX3100_WC | MAX3100_SHDN; + max3100_sr(max3100s[i], tx, &rx); + } + mutex_unlock(&max3100s_lock); + return 0; +} + +static int __devexit max3100_remove(struct spi_device *spi) +{ + struct max3100_port *s = dev_get_drvdata(&spi->dev); + int i; + + mutex_lock(&max3100s_lock); + + /* find out the index for the chip we are removing */ + for (i = 0; i < MAX_MAX3100; i++) + if (max3100s[i] == s) + break; + + dev_dbg(&spi->dev, "%s: removing port %d\n", __func__, i); + uart_remove_one_port(&max3100_uart_driver, &max3100s[i]->port); + kfree(max3100s[i]); + max3100s[i] = NULL; + + /* check if this is the last chip we have */ + for (i = 0; i < MAX_MAX3100; i++) + if (max3100s[i]) { + mutex_unlock(&max3100s_lock); + return 0; + } + pr_debug("removing max3100 driver\n"); + uart_unregister_driver(&max3100_uart_driver); + + mutex_unlock(&max3100s_lock); + return 0; +} + +#ifdef CONFIG_PM + +static int max3100_suspend(struct spi_device *spi, pm_message_t state) +{ + struct max3100_port *s = dev_get_drvdata(&spi->dev); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + disable_irq(s->irq); + + s->suspending = 1; + uart_suspend_port(&max3100_uart_driver, &s->port); + + if (s->max3100_hw_suspend) + s->max3100_hw_suspend(1); + else { + /* no HW suspend, so do SW one */ + u16 tx, rx; + + tx = MAX3100_WC | MAX3100_SHDN; + max3100_sr(s, tx, &rx); + } + return 0; +} + +static int max3100_resume(struct spi_device *spi) +{ + struct max3100_port *s = dev_get_drvdata(&spi->dev); + + dev_dbg(&s->spi->dev, "%s\n", __func__); + + if (s->max3100_hw_suspend) + s->max3100_hw_suspend(0); + uart_resume_port(&max3100_uart_driver, &s->port); + s->suspending = 0; + + enable_irq(s->irq); + + s->conf_commit = 1; + if (s->workqueue) + max3100_dowork(s); + + return 0; +} + +#else +#define max3100_suspend NULL +#define max3100_resume NULL +#endif + +static struct spi_driver max3100_driver = { + .driver = { + .name = "max3100", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + + .probe = max3100_probe, + .remove = __devexit_p(max3100_remove), + .suspend = max3100_suspend, + .resume = max3100_resume, +}; + +static int __init max3100_init(void) +{ + return spi_register_driver(&max3100_driver); +} +module_init(max3100_init); + +static void __exit max3100_exit(void) +{ + spi_unregister_driver(&max3100_driver); +} +module_exit(max3100_exit); + +MODULE_DESCRIPTION("MAX3100 driver"); +MODULE_AUTHOR("Christian Pellegrin "); +MODULE_LICENSE("GPL"); diff --git a/include/linux/serial_max3100.h b/include/linux/serial_max3100.h new file mode 100644 index 0000000..4976bef --- /dev/null +++ b/include/linux/serial_max3100.h @@ -0,0 +1,52 @@ +/* + * + * Copyright (C) 2007 Christian Pellegrin + * + * 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. + */ + + +#ifndef _LINUX_SERIAL_MAX3100_H +#define _LINUX_SERIAL_MAX3100_H 1 + + +/** + * struct plat_max3100 - MAX3100 SPI UART platform data + * @loopback: force MAX3100 in loopback + * @crystal: 1 for 3.6864 Mhz, 0 for 1.8432 + * @max3100_hw_suspend: MAX3100 has a shutdown pin. This is a hook + * called on suspend and resume to activate it. + * @poll_time: poll time for CTS signal in ms, 0 disables (so no hw + * flow ctrl is possible but you have less CPU usage) + * + * You should use this structure in your machine description to specify + * how the MAX3100 is connected. Example: + * + * static struct plat_max3100 max3100_plat_data = { + * .loopback = 0, + * .crystal = 0, + * .poll_time = 100, + * }; + * + * static struct spi_board_info spi_board_info[] = { + * { + * .modalias = "max3100", + * .platform_data = &max3100_plat_data, + * .irq = IRQ_EINT12, + * .max_speed_hz = 5*1000*1000, + * .chip_select = 0, + * }, + * }; + * + **/ +struct plat_max3100 { + int loopback; + int crystal; + void (*max3100_hw_suspend) (int suspend); + int poll_time; +}; + +#endif -- cgit v0.10.2 From 5bf37ec3e0f5eb79f23e024a7fbc8f3557c087f0 Mon Sep 17 00:00:00 2001 From: "Serge E. Hallyn" Date: Wed, 8 Apr 2009 16:55:58 -0500 Subject: cap_prctl: don't set error to 0 at 'no_change' One-liner: capsh --print is broken without this patch. In certain cases, cap_prctl returns error > 0 for success. However, the 'no_change' label was always setting error to 0. As a result, for example, 'prctl(CAP_BSET_READ, N)' would always return 0. It should return 1 if a process has N in its bounding set (as by default it does). I'm keeping the no_change label even though it's now functionally the same as 'error'. Signed-off-by: Serge Hallyn Acked-by: David Howells Signed-off-by: James Morris diff --git a/security/commoncap.c b/security/commoncap.c index 7cd61a5..beac025 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -916,7 +916,6 @@ changed: return commit_creds(new); no_change: - error = 0; error: abort_creds(new); return error; -- cgit v0.10.2 From 9c47008d13add50ec4597a8b9eee200c515282c8 Mon Sep 17 00:00:00 2001 From: "Martin K. Petersen" Date: Thu, 9 Apr 2009 00:27:12 +0100 Subject: dm: add integrity support This patch provides support for data integrity passthrough in the device mapper. - If one or more component devices support integrity an integrity profile is preallocated for the DM device. - If all component devices have compatible profiles the DM device is flagged as capable. - Handle integrity metadata when splitting and cloning bios. Signed-off-by: Martin K. Petersen Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index f010965..823ceba 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1047,6 +1047,19 @@ static int populate_table(struct dm_table *table, return dm_table_complete(table); } +static int table_prealloc_integrity(struct dm_table *t, + struct mapped_device *md) +{ + struct list_head *devices = dm_table_get_devices(t); + struct dm_dev_internal *dd; + + list_for_each_entry(dd, devices, list) + if (bdev_get_integrity(dd->dm_dev.bdev)) + return blk_integrity_register(dm_disk(md), NULL); + + return 0; +} + static int table_load(struct dm_ioctl *param, size_t param_size) { int r; @@ -1068,6 +1081,14 @@ static int table_load(struct dm_ioctl *param, size_t param_size) goto out; } + r = table_prealloc_integrity(t, md); + if (r) { + DMERR("%s: could not register integrity profile.", + dm_device_name(md)); + dm_table_destroy(t); + goto out; + } + down_write(&_hash_lock); hc = dm_get_mdptr(md); if (!hc || hc->md != md) { diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index e8361b1..02d0b48 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -879,6 +879,45 @@ struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector) return &t->targets[(KEYS_PER_NODE * n) + k]; } +/* + * Set the integrity profile for this device if all devices used have + * matching profiles. + */ +static void dm_table_set_integrity(struct dm_table *t) +{ + struct list_head *devices = dm_table_get_devices(t); + struct dm_dev_internal *prev = NULL, *dd = NULL; + + if (!blk_get_integrity(dm_disk(t->md))) + return; + + list_for_each_entry(dd, devices, list) { + if (prev && + blk_integrity_compare(prev->dm_dev.bdev->bd_disk, + dd->dm_dev.bdev->bd_disk) < 0) { + DMWARN("%s: integrity not set: %s and %s mismatch", + dm_device_name(t->md), + prev->dm_dev.bdev->bd_disk->disk_name, + dd->dm_dev.bdev->bd_disk->disk_name); + goto no_integrity; + } + prev = dd; + } + + if (!prev || !bdev_get_integrity(prev->dm_dev.bdev)) + goto no_integrity; + + blk_integrity_register(dm_disk(t->md), + bdev_get_integrity(prev->dm_dev.bdev)); + + return; + +no_integrity: + blk_integrity_register(dm_disk(t->md), NULL); + + return; +} + void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) { /* @@ -899,6 +938,7 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) else queue_flag_set_unlocked(QUEUE_FLAG_CLUSTER, q); + dm_table_set_integrity(t); } unsigned int dm_table_get_num_targets(struct dm_table *t) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 788ba96..25d86e2 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -700,6 +700,12 @@ static struct bio *split_bvec(struct bio *bio, sector_t sector, clone->bi_io_vec->bv_len = clone->bi_size; clone->bi_flags |= 1 << BIO_CLONED; + if (bio_integrity(bio)) { + bio_integrity_clone(clone, bio, GFP_NOIO); + bio_integrity_trim(clone, + bio_sector_offset(bio, idx, offset), len); + } + return clone; } @@ -721,6 +727,14 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector, clone->bi_size = to_bytes(len); clone->bi_flags &= ~(1 << BIO_SEG_VALID); + if (bio_integrity(bio)) { + bio_integrity_clone(clone, bio, GFP_NOIO); + + if (idx != bio->bi_idx || clone->bi_size < bio->bi_size) + bio_integrity_trim(clone, + bio_sector_offset(bio, idx, 0), len); + } + return clone; } @@ -1193,6 +1207,7 @@ static void free_dev(struct mapped_device *md) mempool_destroy(md->tio_pool); mempool_destroy(md->io_pool); bioset_free(md->bs); + blk_integrity_unregister(md->disk); del_gendisk(md->disk); free_minor(minor); -- cgit v0.10.2 From 692d0eb9e02cf81fb387ff891f53840db2f3110a Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:13 +0100 Subject: dm: remove limited barrier support Prepare for full barrier implementation: first remove the restricted support. Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index bfa107f..79fb53e 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c @@ -142,7 +142,6 @@ static struct target_type linear_target = { .status = linear_status, .ioctl = linear_ioctl, .merge = linear_merge, - .features = DM_TARGET_SUPPORTS_BARRIERS, }; int __init dm_linear_init(void) diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 02d0b48..429b50b 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -52,8 +52,6 @@ struct dm_table { sector_t *highs; struct dm_target *targets; - unsigned barriers_supported:1; - /* * Indicates the rw permissions for the new logical * device. This should be a combination of FMODE_READ @@ -243,7 +241,6 @@ int dm_table_create(struct dm_table **result, fmode_t mode, INIT_LIST_HEAD(&t->devices); atomic_set(&t->holders, 0); - t->barriers_supported = 1; if (!num_targets) num_targets = KEYS_PER_NODE; @@ -751,10 +748,6 @@ int dm_table_add_target(struct dm_table *t, const char *type, /* FIXME: the plan is to combine high here and then have * the merge fn apply the target level restrictions. */ combine_restrictions_low(&t->limits, &tgt->limits); - - if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS)) - t->barriers_supported = 0; - return 0; bad: @@ -799,12 +792,6 @@ int dm_table_complete(struct dm_table *t) check_for_valid_limits(&t->limits); - /* - * We only support barriers if there is exactly one underlying device. - */ - if (!list_is_singular(&t->devices)) - t->barriers_supported = 0; - /* how many indexes will the btree have ? */ leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); @@ -1059,12 +1046,6 @@ struct mapped_device *dm_table_get_md(struct dm_table *t) return t->md; } -int dm_table_barrier_ok(struct dm_table *t) -{ - return t->barriers_supported; -} -EXPORT_SYMBOL(dm_table_barrier_ok); - EXPORT_SYMBOL(dm_vcalloc); EXPORT_SYMBOL(dm_get_device); EXPORT_SYMBOL(dm_put_device); diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 25d86e2..ab3b5d8 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -851,11 +851,7 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio) bio_io_error(bio); return; } - if (unlikely(bio_barrier(bio) && !dm_table_barrier_ok(ci.map))) { - dm_table_put(ci.map); - bio_endio(bio, -EOPNOTSUPP); - return; - } + ci.md = md; ci.bio = bio; ci.io = alloc_io(md); @@ -937,6 +933,15 @@ static int dm_request(struct request_queue *q, struct bio *bio) struct mapped_device *md = q->queuedata; int cpu; + /* + * There is no use in forwarding any barrier request since we can't + * guarantee it is (or can be) handled by the targets correctly. + */ + if (unlikely(bio_barrier(bio))) { + bio_endio(bio, -EOPNOTSUPP); + return 0; + } + down_read(&md->io_lock); cpu = part_stat_lock(); diff --git a/drivers/md/dm.h b/drivers/md/dm.h index b48397c..a31506d 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h @@ -52,7 +52,6 @@ int dm_table_any_congested(struct dm_table *t, int bdi_bits); * To check the return value from dm_table_find_target(). */ #define dm_target_is_valid(t) ((t)->table) -int dm_table_barrier_ok(struct dm_table *t); /*----------------------------------------------------------------- * A registry of target types. diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 66ec05a..ded2d7c 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -116,7 +116,6 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d); /* * Target features */ -#define DM_TARGET_SUPPORTS_BARRIERS 0x00000001 struct target_type { uint64_t features; -- cgit v0.10.2 From df12ee996378a5917e9555169fe278ecca0612d4 Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 9 Apr 2009 00:27:13 +0100 Subject: dm: rearrange dm_wq_work Refactor dm_wq_work() to make later patch more readable. Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index ab3b5d8..020a9e1 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1437,18 +1437,19 @@ static void dm_wq_work(struct work_struct *work) down_write(&md->io_lock); -next_bio: - spin_lock_irq(&md->deferred_lock); - c = bio_list_pop(&md->deferred); - spin_unlock_irq(&md->deferred_lock); + while (1) { + spin_lock_irq(&md->deferred_lock); + c = bio_list_pop(&md->deferred); + spin_unlock_irq(&md->deferred_lock); + + if (!c) { + clear_bit(DMF_BLOCK_IO, &md->flags); + break; + } - if (c) { __split_and_process_bio(md, c); - goto next_bio; } - clear_bit(DMF_BLOCK_IO, &md->flags); - up_write(&md->io_lock); } -- cgit v0.10.2 From 1eb787ec183d1267cac95aae632e92dee05ed50a Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 9 Apr 2009 00:27:14 +0100 Subject: dm: split DMF_BLOCK_IO flag into two Split the DMF_BLOCK_IO flag into two. DMF_BLOCK_IO_FOR_SUSPEND is set when I/O must be blocked while suspending a device. DMF_QUEUE_IO_TO_THREAD is set when I/O must be queued to a worker thread for later processing. Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 020a9e1..7cac722 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -89,12 +89,13 @@ union map_info *dm_get_mapinfo(struct bio *bio) /* * Bits for the md->flags field. */ -#define DMF_BLOCK_IO 0 +#define DMF_BLOCK_IO_FOR_SUSPEND 0 #define DMF_SUSPENDED 1 #define DMF_FROZEN 2 #define DMF_FREEING 3 #define DMF_DELETING 4 #define DMF_NOFLUSH_SUSPENDING 5 +#define DMF_QUEUE_IO_TO_THREAD 6 /* * Work processed by per-device workqueue. @@ -439,7 +440,7 @@ static int queue_io(struct mapped_device *md, struct bio *bio) { down_write(&md->io_lock); - if (!test_bit(DMF_BLOCK_IO, &md->flags)) { + if (!test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) { up_write(&md->io_lock); return 1; } @@ -950,10 +951,10 @@ static int dm_request(struct request_queue *q, struct bio *bio) part_stat_unlock(); /* - * If we're suspended we have to queue - * this io for later. + * If we're suspended or the thread is processing barriers + * we have to queue this io for later. */ - while (test_bit(DMF_BLOCK_IO, &md->flags)) { + while (test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) { up_read(&md->io_lock); if (bio_rw(bio) != READA) @@ -997,7 +998,7 @@ static int dm_any_congested(void *congested_data, int bdi_bits) struct mapped_device *md = congested_data; struct dm_table *map; - if (!test_bit(DMF_BLOCK_IO, &md->flags)) { + if (!test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) { map = dm_get_table(md); if (map) { r = dm_table_any_congested(map, bdi_bits); @@ -1443,7 +1444,8 @@ static void dm_wq_work(struct work_struct *work) spin_unlock_irq(&md->deferred_lock); if (!c) { - clear_bit(DMF_BLOCK_IO, &md->flags); + clear_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); + clear_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags); break; } @@ -1574,10 +1576,12 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) } /* - * First we set the BLOCK_IO flag so no more ios will be mapped. + * First we set the DMF_QUEUE_IO_TO_THREAD flag so no more ios + * will be mapped. */ down_write(&md->io_lock); - set_bit(DMF_BLOCK_IO, &md->flags); + set_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); + set_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags); up_write(&md->io_lock); -- cgit v0.10.2 From 54d9a1b4513b96cbd835ca6866c6a604d194b2ae Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 9 Apr 2009 00:27:14 +0100 Subject: dm: simplify dm_request loop Refactor the code in dm_request(). Require the new DMF_BLOCK_FOR_SUSPEND flag on readahead bios we will discard so we don't drop such bios while processing a barrier. Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 7cac722..bb97ec8 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -929,7 +929,6 @@ out: */ static int dm_request(struct request_queue *q, struct bio *bio) { - int r = -EIO; int rw = bio_data_dir(bio); struct mapped_device *md = q->queuedata; int cpu; @@ -957,11 +956,14 @@ static int dm_request(struct request_queue *q, struct bio *bio) while (test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) { up_read(&md->io_lock); - if (bio_rw(bio) != READA) - r = queue_io(md, bio); + if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) && + bio_rw(bio) == READA) { + bio_io_error(bio); + return 0; + } - if (r <= 0) - goto out_req; + if (!queue_io(md, bio)) + return 0; /* * We're in a while loop, because someone could suspend @@ -973,12 +975,6 @@ static int dm_request(struct request_queue *q, struct bio *bio) __split_and_process_bio(md, bio); up_read(&md->io_lock); return 0; - -out_req: - if (r < 0) - bio_io_error(bio); - - return 0; } static void dm_unplug_all(struct request_queue *q) -- cgit v0.10.2 From 3b00b2036fac7a7667d0676a0f80eee575b8c32b Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:15 +0100 Subject: dm: rework queueing and suspension Rework shutting down on suspend and document the associated rules. Drop write lock in __split_and_process_bio to allow more processing concurrency. Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bb97ec8..9746c1e 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1434,18 +1434,21 @@ static void dm_wq_work(struct work_struct *work) down_write(&md->io_lock); - while (1) { + while (!test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) { spin_lock_irq(&md->deferred_lock); c = bio_list_pop(&md->deferred); spin_unlock_irq(&md->deferred_lock); if (!c) { - clear_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); clear_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags); break; } + up_write(&md->io_lock); + __split_and_process_bio(md, c); + + down_write(&md->io_lock); } up_write(&md->io_lock); @@ -1453,8 +1456,9 @@ static void dm_wq_work(struct work_struct *work) static void dm_queue_flush(struct mapped_device *md) { + clear_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); + smp_mb__after_clear_bit(); queue_work(md->wq, &md->work); - flush_workqueue(md->wq); } /* @@ -1572,22 +1576,36 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) } /* - * First we set the DMF_QUEUE_IO_TO_THREAD flag so no more ios - * will be mapped. + * Here we must make sure that no processes are submitting requests + * to target drivers i.e. no one may be executing + * __split_and_process_bio. This is called from dm_request and + * dm_wq_work. + * + * To get all processes out of __split_and_process_bio in dm_request, + * we take the write lock. To prevent any process from reentering + * __split_and_process_bio from dm_request, we set + * DMF_QUEUE_IO_TO_THREAD. + * + * To quiesce the thread (dm_wq_work), we set DMF_BLOCK_IO_FOR_SUSPEND + * and call flush_workqueue(md->wq). flush_workqueue will wait until + * dm_wq_work exits and DMF_BLOCK_IO_FOR_SUSPEND will prevent any + * further calls to __split_and_process_bio from dm_wq_work. */ down_write(&md->io_lock); set_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); set_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags); - up_write(&md->io_lock); + flush_workqueue(md->wq); + /* - * Wait for the already-mapped ios to complete. + * At this point no more requests are entering target request routines. + * We call dm_wait_for_completion to wait for all existing requests + * to finish. */ r = dm_wait_for_completion(md, TASK_INTERRUPTIBLE); down_write(&md->io_lock); - if (noflush) clear_bit(DMF_NOFLUSH_SUSPENDING, &md->flags); up_write(&md->io_lock); @@ -1600,6 +1618,12 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) goto out; /* pushback list is already flushed, so skip flush */ } + /* + * If dm_wait_for_completion returned 0, the device is completely + * quiescent now. There is no request-processing activity. All new + * requests are being added to md->deferred list. + */ + dm_table_postsuspend_targets(map); set_bit(DMF_SUSPENDED, &md->flags); -- cgit v0.10.2 From 92c639021ca6e962645114f02e356e7feb131d0b Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:15 +0100 Subject: dm: remove dm_request loop Remove queue_io return value and a loop in dm_request. IO may be submitted to a worker thread with queue_io(). queue_io() sets DMF_QUEUE_IO_TO_THREAD so that all further IO is queued for the thread. When the thread finishes its work, it clears DMF_QUEUE_IO_TO_THREAD and from this point on, requests are submitted from dm_request again. This will be used for processing barriers. Remove the loop in dm_request. queue_io() can submit I/Os to the worker thread even if DMF_QUEUE_IO_TO_THREAD was not set. Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 9746c1e..db022e5 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -436,21 +436,18 @@ static void end_io_acct(struct dm_io *io) /* * Add the bio to the list of deferred io. */ -static int queue_io(struct mapped_device *md, struct bio *bio) +static void queue_io(struct mapped_device *md, struct bio *bio) { down_write(&md->io_lock); - if (!test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) { - up_write(&md->io_lock); - return 1; - } - spin_lock_irq(&md->deferred_lock); bio_list_add(&md->deferred, bio); spin_unlock_irq(&md->deferred_lock); + if (!test_and_set_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) + queue_work(md->wq, &md->work); + up_write(&md->io_lock); - return 0; /* deferred successfully */ } /* @@ -953,7 +950,7 @@ static int dm_request(struct request_queue *q, struct bio *bio) * If we're suspended or the thread is processing barriers * we have to queue this io for later. */ - while (test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) { + if (unlikely(test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags))) { up_read(&md->io_lock); if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) && @@ -962,14 +959,9 @@ static int dm_request(struct request_queue *q, struct bio *bio) return 0; } - if (!queue_io(md, bio)) - return 0; + queue_io(md, bio); - /* - * We're in a while loop, because someone could suspend - * before we get to the following read lock. - */ - down_read(&md->io_lock); + return 0; } __split_and_process_bio(md, bio); -- cgit v0.10.2 From af7e466a1acededbc10beaba9eec8531d561c566 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:16 +0100 Subject: dm: implement basic barrier support Barriers are submitted to a worker thread that issues them in-order. The thread is modified so that when it sees a barrier request it waits for all pending IO before the request then submits the barrier and waits for it. (We must wait, otherwise it could be intermixed with following requests.) Errors from the barrier request are recorded in a per-device barrier_error variable. There may be only one barrier request in progress at once. For now, the barrier request is converted to a non-barrier request when sending it to the underlying device. This patch guarantees correct barrier behavior if the underlying device doesn't perform write-back caching. The same requirement existed before barriers were supported in dm. Bottom layer barrier support (sending barriers by target drivers) and handling devices with write-back caches will be done in further patches. Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm.c b/drivers/md/dm.c index db022e5..8a994be 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -125,6 +125,11 @@ struct mapped_device { spinlock_t deferred_lock; /* + * An error from the barrier request currently being processed. + */ + int barrier_error; + + /* * Processing queue (flush/barriers) */ struct workqueue_struct *wq; @@ -425,6 +430,10 @@ static void end_io_acct(struct dm_io *io) part_stat_add(cpu, &dm_disk(md)->part0, ticks[rw], duration); part_stat_unlock(); + /* + * After this is decremented the bio must not be touched if it is + * a barrier. + */ dm_disk(md)->part0.in_flight = pending = atomic_dec_return(&md->pending); @@ -531,25 +540,35 @@ static void dec_pending(struct dm_io *io, int error) */ spin_lock_irqsave(&md->deferred_lock, flags); if (__noflush_suspending(md)) - bio_list_add(&md->deferred, io->bio); + bio_list_add_head(&md->deferred, io->bio); else /* noflush suspend was interrupted. */ io->error = -EIO; spin_unlock_irqrestore(&md->deferred_lock, flags); } - end_io_acct(io); - io_error = io->error; bio = io->bio; - free_io(md, io); + if (bio_barrier(bio)) { + /* + * There can be just one barrier request so we use + * a per-device variable for error reporting. + * Note that you can't touch the bio after end_io_acct + */ + md->barrier_error = io_error; + end_io_acct(io); + } else { + end_io_acct(io); - if (io_error != DM_ENDIO_REQUEUE) { - trace_block_bio_complete(md->queue, bio); + if (io_error != DM_ENDIO_REQUEUE) { + trace_block_bio_complete(md->queue, bio); - bio_endio(bio, io_error); + bio_endio(bio, io_error); + } } + + free_io(md, io); } } @@ -691,7 +710,7 @@ static struct bio *split_bvec(struct bio *bio, sector_t sector, clone->bi_sector = sector; clone->bi_bdev = bio->bi_bdev; - clone->bi_rw = bio->bi_rw; + clone->bi_rw = bio->bi_rw & ~(1 << BIO_RW_BARRIER); clone->bi_vcnt = 1; clone->bi_size = to_bytes(len); clone->bi_io_vec->bv_offset = offset; @@ -718,6 +737,7 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector, clone = bio_alloc_bioset(GFP_NOIO, bio->bi_max_vecs, bs); __bio_clone(clone, bio); + clone->bi_rw &= ~(1 << BIO_RW_BARRIER); clone->bi_destructor = dm_bio_destructor; clone->bi_sector = sector; clone->bi_idx = idx; @@ -846,7 +866,10 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio) ci.map = dm_get_table(md); if (unlikely(!ci.map)) { - bio_io_error(bio); + if (!bio_barrier(bio)) + bio_io_error(bio); + else + md->barrier_error = -EIO; return; } @@ -930,15 +953,6 @@ static int dm_request(struct request_queue *q, struct bio *bio) struct mapped_device *md = q->queuedata; int cpu; - /* - * There is no use in forwarding any barrier request since we can't - * guarantee it is (or can be) handled by the targets correctly. - */ - if (unlikely(bio_barrier(bio))) { - bio_endio(bio, -EOPNOTSUPP); - return 0; - } - down_read(&md->io_lock); cpu = part_stat_lock(); @@ -950,7 +964,8 @@ static int dm_request(struct request_queue *q, struct bio *bio) * If we're suspended or the thread is processing barriers * we have to queue this io for later. */ - if (unlikely(test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags))) { + if (unlikely(test_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags)) || + unlikely(bio_barrier(bio))) { up_read(&md->io_lock); if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) && @@ -1415,6 +1430,36 @@ static int dm_wait_for_completion(struct mapped_device *md, int interruptible) return r; } +static int dm_flush(struct mapped_device *md) +{ + dm_wait_for_completion(md, TASK_UNINTERRUPTIBLE); + return 0; +} + +static void process_barrier(struct mapped_device *md, struct bio *bio) +{ + int error = dm_flush(md); + + if (unlikely(error)) { + bio_endio(bio, error); + return; + } + if (bio_empty_barrier(bio)) { + bio_endio(bio, 0); + return; + } + + __split_and_process_bio(md, bio); + + error = dm_flush(md); + + if (!error && md->barrier_error) + error = md->barrier_error; + + if (md->barrier_error != DM_ENDIO_REQUEUE) + bio_endio(bio, error); +} + /* * Process the deferred bios */ @@ -1438,7 +1483,10 @@ static void dm_wq_work(struct work_struct *work) up_write(&md->io_lock); - __split_and_process_bio(md, c); + if (bio_barrier(c)) + process_barrier(md, c); + else + __split_and_process_bio(md, c); down_write(&md->io_lock); } -- cgit v0.10.2 From 73830857bca6f6c9dbd48e906daea50bea42d676 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:16 +0100 Subject: dm kcopyd: prepare for callback race fix Use a variable in segment_complete() to point to the dm_kcopyd_client struct and only release job->pages in run_complete_job() if any are defined. These changes are needed by the next patch. Cc: stable@kernel.org Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c index 0a225da..9d37907 100644 --- a/drivers/md/dm-kcopyd.c +++ b/drivers/md/dm-kcopyd.c @@ -297,7 +297,8 @@ static int run_complete_job(struct kcopyd_job *job) dm_kcopyd_notify_fn fn = job->fn; struct dm_kcopyd_client *kc = job->kc; - kcopyd_put_pages(kc, job->pages); + if (job->pages) + kcopyd_put_pages(kc, job->pages); mempool_free(job, kc->job_pool); fn(read_err, write_err, context); @@ -461,6 +462,7 @@ static void segment_complete(int read_err, unsigned long write_err, sector_t progress = 0; sector_t count = 0; struct kcopyd_job *job = (struct kcopyd_job *) context; + struct dm_kcopyd_client *kc = job->kc; mutex_lock(&job->lock); @@ -490,7 +492,7 @@ static void segment_complete(int read_err, unsigned long write_err, if (count) { int i; - struct kcopyd_job *sub_job = mempool_alloc(job->kc->job_pool, + struct kcopyd_job *sub_job = mempool_alloc(kc->job_pool, GFP_NOIO); *sub_job = *job; -- cgit v0.10.2 From 340cd44451fb0bfa542365e6b4b565bbd44836e2 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 9 Apr 2009 00:27:17 +0100 Subject: dm kcopyd: fix callback race If the thread calling dm_kcopyd_copy is delayed due to scheduling inside split_job/segment_complete and the subjobs complete before the loop in split_job completes, the kcopyd callback could be invoked from the thread that called dm_kcopyd_copy instead of the kcopyd workqueue. dm_kcopyd_copy -> split_job -> segment_complete -> job->fn() Snapshots depend on the fact that callbacks are called from the singlethreaded kcopyd workqueue and expect that there is no racing between individual callbacks. The racing between callbacks can lead to corruption of exception store and it can also mean that exception store callbacks are called twice for the same exception - a likely reason for crashes reported inside pending_complete() / remove_exception(). This patch fixes two problems: 1. job->fn being called from the thread that submitted the job (see above). - Fix: hand over the completion callback to the kcopyd thread. 2. job->fn(read_err, write_err, job->context); in segment_complete reports the error of the last subjob, not the union of all errors. - Fix: pass job->write_err to the callback to report all error bits (it is done already in run_complete_job) Cc: stable@kernel.org Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c index 9d37907..3e3fc06 100644 --- a/drivers/md/dm-kcopyd.c +++ b/drivers/md/dm-kcopyd.c @@ -511,13 +511,16 @@ static void segment_complete(int read_err, unsigned long write_err, } else if (atomic_dec_and_test(&job->sub_jobs)) { /* - * To avoid a race we must keep the job around - * until after the notify function has completed. - * Otherwise the client may try and stop the job - * after we've completed. + * Queue the completion callback to the kcopyd thread. + * + * Some callers assume that all the completions are called + * from a single thread and don't race with each other. + * + * We must not call the callback directly here because this + * code may not be executing in the thread. */ - job->fn(read_err, write_err, job->context); - mempool_free(job, job->kc->job_pool); + push(&kc->complete_jobs, job); + wake(kc); } } @@ -530,6 +533,8 @@ static void split_job(struct kcopyd_job *job) { int i; + atomic_inc(&job->kc->nr_jobs); + atomic_set(&job->sub_jobs, SPLIT_COUNT); for (i = 0; i < SPLIT_COUNT; i++) segment_complete(0, 0u, job); -- cgit v0.10.2 From 3217ab97f14c5c8f9f975ed8c40c351164b0b10e Mon Sep 17 00:00:00 2001 From: Vitaliy Gusev Date: Thu, 9 Apr 2009 09:50:35 -0600 Subject: kthread: Don't looking for a task in create_kthread() #2 Remove the unnecessary find_task_by_pid_ns(). kthread() can just use "current" to get the same result. Signed-off-by: Vitaliy Gusev Acked-by: Oleg Nesterov Signed-off-by: Rusty Russell diff --git a/kernel/kthread.c b/kernel/kthread.c index 84bbadd..c013bf0 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -76,6 +76,7 @@ static int kthread(void *_create) /* OK, tell user we're spawned, wait for stop or wakeup */ __set_current_state(TASK_UNINTERRUPTIBLE); + create->result = current; complete(&create->started); schedule(); @@ -101,9 +102,6 @@ static void create_kthread(struct kthread_create_info *create) } else { struct sched_param param = { .sched_priority = 0 }; wait_for_completion(&create->started); - read_lock(&tasklist_lock); - create->result = find_task_by_pid_ns(pid, &init_pid_ns); - read_unlock(&tasklist_lock); /* * root may have changed our (kthreadd's) priority or CPU mask. * The kernel thread should not inherit these properties. -- cgit v0.10.2 From 1c99315bb36b5d776210546d438ca928dc9b1f22 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Thu, 9 Apr 2009 09:50:36 -0600 Subject: kthread: move sched-realeted initialization from kthreadd context kthreadd is the single thread which implements ths "create" request, move sched_setscheduler/etc from create_kthread() to kthread_create() to improve the scalability. We should be careful with sched_setscheduler(), use _nochek helper. Signed-off-by: Oleg Nesterov Cc: Christoph Hellwig Cc: "Eric W. Biederman" Cc: Ingo Molnar Cc: Pavel Emelyanov Cc: Vitaliy Gusev Signed-off-by: Rusty Russell diff --git a/kernel/kthread.c b/kernel/kthread.c index c013bf0..4ebaf85 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -97,19 +97,10 @@ static void create_kthread(struct kthread_create_info *create) /* We want our own signal handler (we take no signals by default). */ pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD); - if (pid < 0) { + if (pid < 0) create->result = ERR_PTR(pid); - } else { - struct sched_param param = { .sched_priority = 0 }; + else wait_for_completion(&create->started); - /* - * root may have changed our (kthreadd's) priority or CPU mask. - * The kernel thread should not inherit these properties. - */ - sched_setscheduler(create->result, SCHED_NORMAL, ¶m); - set_user_nice(create->result, KTHREAD_NICE_LEVEL); - set_cpus_allowed_ptr(create->result, cpu_all_mask); - } complete(&create->done); } @@ -152,11 +143,20 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), wait_for_completion(&create.done); if (!IS_ERR(create.result)) { + struct sched_param param = { .sched_priority = 0 }; va_list args; + va_start(args, namefmt); vsnprintf(create.result->comm, sizeof(create.result->comm), namefmt, args); va_end(args); + /* + * root may have changed our (kthreadd's) priority or CPU mask. + * The kernel thread should not inherit these properties. + */ + sched_setscheduler_nocheck(create.result, SCHED_NORMAL, ¶m); + set_user_nice(create.result, KTHREAD_NICE_LEVEL); + set_cpus_allowed_ptr(create.result, cpu_all_mask); } return create.result; } -- cgit v0.10.2 From 6b44003e5ca66a3fffeb5bc90f40ada2c4340896 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 9 Apr 2009 09:50:37 -0600 Subject: work_on_cpu(): rewrite it to create a kernel thread on demand Impact: circular locking bugfix The various implemetnations and proposed implemetnations of work_on_cpu() are vulnerable to various deadlocks because they all used queues of some form. Unrelated pieces of kernel code thus gained dependencies wherein if one work_on_cpu() caller holds a lock which some other work_on_cpu() callback also takes, the kernel could rarely deadlock. Fix this by creating a short-lived kernel thread for each work_on_cpu() invokation. This is not terribly fast, but the only current caller of work_on_cpu() is pci_call_probe(). It would be nice to find some other way of doing the node-local allocations in the PCI probe code so that we can zap work_on_cpu() altogether. The code there is rather nasty. I can't think of anything simple at this time... Cc: Ingo Molnar Signed-off-by: Andrew Morton Signed-off-by: Rusty Russell diff --git a/kernel/workqueue.c b/kernel/workqueue.c index b6b966c..f71fb2a 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -966,20 +966,20 @@ undo: } #ifdef CONFIG_SMP -static struct workqueue_struct *work_on_cpu_wq __read_mostly; struct work_for_cpu { - struct work_struct work; + struct completion completion; long (*fn)(void *); void *arg; long ret; }; -static void do_work_for_cpu(struct work_struct *w) +static int do_work_for_cpu(void *_wfc) { - struct work_for_cpu *wfc = container_of(w, struct work_for_cpu, work); - + struct work_for_cpu *wfc = _wfc; wfc->ret = wfc->fn(wfc->arg); + complete(&wfc->completion); + return 0; } /** @@ -990,17 +990,23 @@ static void do_work_for_cpu(struct work_struct *w) * * This will return the value @fn returns. * It is up to the caller to ensure that the cpu doesn't go offline. + * The caller must not hold any locks which would prevent @fn from completing. */ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) { - struct work_for_cpu wfc; - - INIT_WORK(&wfc.work, do_work_for_cpu); - wfc.fn = fn; - wfc.arg = arg; - queue_work_on(cpu, work_on_cpu_wq, &wfc.work); - flush_work(&wfc.work); - + struct task_struct *sub_thread; + struct work_for_cpu wfc = { + .completion = COMPLETION_INITIALIZER_ONSTACK(wfc.completion), + .fn = fn, + .arg = arg, + }; + + sub_thread = kthread_create(do_work_for_cpu, &wfc, "work_for_cpu"); + if (IS_ERR(sub_thread)) + return PTR_ERR(sub_thread); + kthread_bind(sub_thread, cpu); + wake_up_process(sub_thread); + wait_for_completion(&wfc.completion); return wfc.ret; } EXPORT_SYMBOL_GPL(work_on_cpu); @@ -1016,8 +1022,4 @@ void __init init_workqueues(void) hotcpu_notifier(workqueue_cpu_callback, 0); keventd_wq = create_workqueue("events"); BUG_ON(!keventd_wq); -#ifdef CONFIG_SMP - work_on_cpu_wq = create_workqueue("work_on_cpu"); - BUG_ON(!work_on_cpu_wq); -#endif } -- cgit v0.10.2 From 47788c58e66c050982241d9a05eb690daceb05a9 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Wed, 8 Apr 2009 20:40:59 +0200 Subject: tracing/syscalls: use a dedicated file header Impact: fix build warnings and possibe compat misbehavior on IA64 Building a kernel on ia64 might trigger these ugly build warnings: CC arch/ia64/ia32/sys_ia32.o In file included from arch/ia64/ia32/sys_ia32.c:55: arch/ia64/ia32/ia32priv.h:290:1: warning: "elf_check_arch" redefined In file included from include/linux/elf.h:7, from include/linux/module.h:14, from include/linux/ftrace.h:8, from include/linux/syscalls.h:68, from arch/ia64/ia32/sys_ia32.c:18: arch/ia64/include/asm/elf.h:19:1: warning: this is the location of the previous definition [...] sys_ia32.c includes linux/syscalls.h which in turn includes linux/ftrace.h to import the syscalls tracing prototypes. But including ftrace.h can pull too much things for a low level file, especially on ia64 where the ia32 private headers conflict with higher level headers. Now we isolate the syscall tracing headers in their own lightweight file. Reported-by: Tony Luck Tested-by: Tony Luck Signed-off-by: Frederic Weisbecker Acked-by: Tony Luck Signed-off-by: Steven Rostedt Cc: Peter Zijlstra Cc: Jason Baron Cc: "Frank Ch. Eigler" Cc: Mathieu Desnoyers Cc: KOSAKI Motohiro Cc: Lai Jiangshan Cc: Jiaying Zhang Cc: Michael Rubin Cc: Martin Bligh Cc: Michael Davidson LKML-Reference: <20090408184058.GB6017@nowhere> Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 70a10ca..18dfa30 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index fe9345c..23b7c8f 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -35,6 +34,8 @@ #include #include +#include + #include "tls.h" enum x86_regset { diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index ff112a8..8a0c2f2 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -511,33 +511,4 @@ static inline void trace_hw_branch_oops(void) {} #endif /* CONFIG_HW_BRANCH_TRACER */ -/* - * A syscall entry in the ftrace syscalls array. - * - * @name: name of the syscall - * @nb_args: number of parameters it takes - * @types: list of types as strings - * @args: list of args as strings (args[i] matches types[i]) - */ -struct syscall_metadata { - const char *name; - int nb_args; - const char **types; - const char **args; -}; - -#ifdef CONFIG_FTRACE_SYSCALLS -extern void arch_init_ftrace_syscalls(void); -extern struct syscall_metadata *syscall_nr_to_meta(int nr); -extern void start_ftrace_syscalls(void); -extern void stop_ftrace_syscalls(void); -extern void ftrace_syscall_enter(struct pt_regs *regs); -extern void ftrace_syscall_exit(struct pt_regs *regs); -#else -static inline void start_ftrace_syscalls(void) { } -static inline void stop_ftrace_syscalls(void) { } -static inline void ftrace_syscall_enter(struct pt_regs *regs) { } -static inline void ftrace_syscall_exit(struct pt_regs *regs) { } -#endif - #endif /* _LINUX_FTRACE_H */ diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 6470f74..dabe4ad 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -65,7 +65,7 @@ struct old_linux_dirent; #include #include #include -#include +#include #define __SC_DECL1(t1, a1) t1 a1 #define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) diff --git a/include/trace/syscall.h b/include/trace/syscall.h new file mode 100644 index 0000000..8cfe515 --- /dev/null +++ b/include/trace/syscall.h @@ -0,0 +1,35 @@ +#ifndef _TRACE_SYSCALL_H +#define _TRACE_SYSCALL_H + +#include + +/* + * A syscall entry in the ftrace syscalls array. + * + * @name: name of the syscall + * @nb_args: number of parameters it takes + * @types: list of types as strings + * @args: list of args as strings (args[i] matches types[i]) + */ +struct syscall_metadata { + const char *name; + int nb_args; + const char **types; + const char **args; +}; + +#ifdef CONFIG_FTRACE_SYSCALLS +extern void arch_init_ftrace_syscalls(void); +extern struct syscall_metadata *syscall_nr_to_meta(int nr); +extern void start_ftrace_syscalls(void); +extern void stop_ftrace_syscalls(void); +extern void ftrace_syscall_enter(struct pt_regs *regs); +extern void ftrace_syscall_exit(struct pt_regs *regs); +#else +static inline void start_ftrace_syscalls(void) { } +static inline void stop_ftrace_syscalls(void) { } +static inline void ftrace_syscall_enter(struct pt_regs *regs) { } +static inline void ftrace_syscall_exit(struct pt_regs *regs) { } +#endif + +#endif /* _TRACE_SYSCALL_H */ diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index a2a3af2..5e57964 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -1,5 +1,5 @@ +#include #include -#include #include #include "trace_output.h" -- cgit v0.10.2 From 9eb85125ce218a8b8d9a7c982510388e227adbec Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Thu, 9 Apr 2009 11:19:40 +0800 Subject: blktrace: pass the right pointer to kfree() Impact: fix kfree crash with non-standard act_mask string If passing a string with leading white spaces to strstrip(), the returned ptr != the original ptr. This bug was introduced by me. Signed-off-by: Li Zefan Cc: Jens Axboe Cc: Arnaldo Carvalho de Melo LKML-Reference: <49DD694C.8020902@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index b32ff44..921ef5d 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -1377,12 +1377,12 @@ static int blk_trace_str2mask(const char *str) { int i; int mask = 0; - char *s, *token; + char *buf, *s, *token; - s = kstrdup(str, GFP_KERNEL); - if (s == NULL) + buf = kstrdup(str, GFP_KERNEL); + if (buf == NULL) return -ENOMEM; - s = strstrip(s); + s = strstrip(buf); while (1) { token = strsep(&s, ","); @@ -1403,7 +1403,7 @@ static int blk_trace_str2mask(const char *str) break; } } - kfree(s); + kfree(buf); return mask; } -- cgit v0.10.2 From f20ab9c38fb85b4dde8b4139788ab9e735a35279 Mon Sep 17 00:00:00 2001 From: Jaswinder Singh Rajput Date: Wed, 8 Apr 2009 22:49:46 +0530 Subject: x86: cpu_debug remove execute permission It seems by mistake these files got execute permissions so removing it. Signed-off-by: Jaswinder Singh Rajput LKML-Reference: <1239211186.9037.2.camel@ht.satnam> Signed-off-by: Ingo Molnar diff --git a/arch/x86/include/asm/cpu_debug.h b/arch/x86/include/asm/cpu_debug.h old mode 100755 new mode 100644 diff --git a/arch/x86/kernel/cpu/cpu_debug.c b/arch/x86/kernel/cpu/cpu_debug.c old mode 100755 new mode 100644 -- cgit v0.10.2 From 66bb74888eb4bef4ba7c87c931ecb7ecca3a240c Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Thu, 9 Apr 2009 11:40:27 +0800 Subject: tracing: consolidate documents Move kmemtrace.txt, tracepoints.txt, ftrace.txt and mmiotrace.txt to the new trace/ directory. I didnt find any references to those documents in both source files and documents, so no extra work needs to be done. Signed-off-by: Li Zefan Acked-by: Pekka Paalanen Cc: Steven Rostedt Cc: Frederic Weisbecker Cc: Mathieu Desnoyers LKML-Reference: <49DD6E2B.6090200@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/Documentation/ftrace.txt b/Documentation/ftrace.txt deleted file mode 100644 index fd9a3e6..0000000 --- a/Documentation/ftrace.txt +++ /dev/null @@ -1,1828 +0,0 @@ - ftrace - Function Tracer - ======================== - -Copyright 2008 Red Hat Inc. - Author: Steven Rostedt - License: The GNU Free Documentation License, Version 1.2 - (dual licensed under the GPL v2) -Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton, - John Kacur, and David Teigland. - -Written for: 2.6.28-rc2 - -Introduction ------------- - -Ftrace is an internal tracer designed to help out developers and -designers of systems to find what is going on inside the kernel. -It can be used for debugging or analyzing latencies and -performance issues that take place outside of user-space. - -Although ftrace is the function tracer, it also includes an -infrastructure that allows for other types of tracing. Some of -the tracers that are currently in ftrace include a tracer to -trace context switches, the time it takes for a high priority -task to run after it was woken up, the time interrupts are -disabled, and more (ftrace allows for tracer plugins, which -means that the list of tracers can always grow). - - -The File System ---------------- - -Ftrace uses the debugfs file system to hold the control files as -well as the files to display output. - -To mount the debugfs system: - - # mkdir /debug - # mount -t debugfs nodev /debug - -( Note: it is more common to mount at /sys/kernel/debug, but for - simplicity this document will use /debug) - -That's it! (assuming that you have ftrace configured into your kernel) - -After mounting the debugfs, you can see a directory called -"tracing". This directory contains the control and output files -of ftrace. Here is a list of some of the key files: - - - Note: all time values are in microseconds. - - current_tracer: - - This is used to set or display the current tracer - that is configured. - - available_tracers: - - This holds the different types of tracers that - have been compiled into the kernel. The - tracers listed here can be configured by - echoing their name into current_tracer. - - tracing_enabled: - - This sets or displays whether the current_tracer - is activated and tracing or not. Echo 0 into this - file to disable the tracer or 1 to enable it. - - trace: - - This file holds the output of the trace in a human - readable format (described below). - - latency_trace: - - This file shows the same trace but the information - is organized more to display possible latencies - in the system (described below). - - trace_pipe: - - The output is the same as the "trace" file but this - file is meant to be streamed with live tracing. - Reads from this file will block until new data - is retrieved. Unlike the "trace" and "latency_trace" - files, this file is a consumer. This means reading - from this file causes sequential reads to display - more current data. Once data is read from this - file, it is consumed, and will not be read - again with a sequential read. The "trace" and - "latency_trace" files are static, and if the - tracer is not adding more data, they will display - the same information every time they are read. - - trace_options: - - This file lets the user control the amount of data - that is displayed in one of the above output - files. - - tracing_max_latency: - - Some of the tracers record the max latency. - For example, the time interrupts are disabled. - This time is saved in this file. The max trace - will also be stored, and displayed by either - "trace" or "latency_trace". A new max trace will - only be recorded if the latency is greater than - the value in this file. (in microseconds) - - buffer_size_kb: - - This sets or displays the number of kilobytes each CPU - buffer can hold. The tracer buffers are the same size - for each CPU. The displayed number is the size of the - CPU buffer and not total size of all buffers. The - trace buffers are allocated in pages (blocks of memory - that the kernel uses for allocation, usually 4 KB in size). - If the last page allocated has room for more bytes - than requested, the rest of the page will be used, - making the actual allocation bigger than requested. - ( Note, the size may not be a multiple of the page size - due to buffer managment overhead. ) - - This can only be updated when the current_tracer - is set to "nop". - - tracing_cpumask: - - This is a mask that lets the user only trace - on specified CPUS. The format is a hex string - representing the CPUS. - - set_ftrace_filter: - - When dynamic ftrace is configured in (see the - section below "dynamic ftrace"), the code is dynamically - modified (code text rewrite) to disable calling of the - function profiler (mcount). This lets tracing be configured - in with practically no overhead in performance. This also - has a side effect of enabling or disabling specific functions - to be traced. Echoing names of functions into this file - will limit the trace to only those functions. - - set_ftrace_notrace: - - This has an effect opposite to that of - set_ftrace_filter. Any function that is added here will not - be traced. If a function exists in both set_ftrace_filter - and set_ftrace_notrace, the function will _not_ be traced. - - set_ftrace_pid: - - Have the function tracer only trace a single thread. - - set_graph_function: - - Set a "trigger" function where tracing should start - with the function graph tracer (See the section - "dynamic ftrace" for more details). - - available_filter_functions: - - This lists the functions that ftrace - has processed and can trace. These are the function - names that you can pass to "set_ftrace_filter" or - "set_ftrace_notrace". (See the section "dynamic ftrace" - below for more details.) - - -The Tracers ------------ - -Here is the list of current tracers that may be configured. - - "function" - - Function call tracer to trace all kernel functions. - - "function_graph_tracer" - - Similar to the function tracer except that the - function tracer probes the functions on their entry - whereas the function graph tracer traces on both entry - and exit of the functions. It then provides the ability - to draw a graph of function calls similar to C code - source. - - "sched_switch" - - Traces the context switches and wakeups between tasks. - - "irqsoff" - - Traces the areas that disable interrupts and saves - the trace with the longest max latency. - See tracing_max_latency. When a new max is recorded, - it replaces the old trace. It is best to view this - trace via the latency_trace file. - - "preemptoff" - - Similar to irqsoff but traces and records the amount of - time for which preemption is disabled. - - "preemptirqsoff" - - Similar to irqsoff and preemptoff, but traces and - records the largest time for which irqs and/or preemption - is disabled. - - "wakeup" - - Traces and records the max latency that it takes for - the highest priority task to get scheduled after - it has been woken up. - - "hw-branch-tracer" - - Uses the BTS CPU feature on x86 CPUs to traces all - branches executed. - - "nop" - - This is the "trace nothing" tracer. To remove all - tracers from tracing simply echo "nop" into - current_tracer. - - -Examples of using the tracer ----------------------------- - -Here are typical examples of using the tracers when controlling -them only with the debugfs interface (without using any -user-land utilities). - -Output format: --------------- - -Here is an example of the output format of the file "trace" - - -------- -# tracer: function -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-4251 [01] 10152.583854: path_put <-path_walk - bash-4251 [01] 10152.583855: dput <-path_put - bash-4251 [01] 10152.583855: _atomic_dec_and_lock <-dput - -------- - -A header is printed with the tracer name that is represented by -the trace. In this case the tracer is "function". Then a header -showing the format. Task name "bash", the task PID "4251", the -CPU that it was running on "01", the timestamp in . -format, the function name that was traced "path_put" and the -parent function that called this function "path_walk". The -timestamp is the time at which the function was entered. - -The sched_switch tracer also includes tracing of task wakeups -and context switches. - - ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 2916:115:S - ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 10:115:S - ksoftirqd/1-7 [01] 1453.070013: 7:115:R ==> 10:115:R - events/1-10 [01] 1453.070013: 10:115:S ==> 2916:115:R - kondemand/1-2916 [01] 1453.070013: 2916:115:S ==> 7:115:R - ksoftirqd/1-7 [01] 1453.070013: 7:115:S ==> 0:140:R - -Wake ups are represented by a "+" and the context switches are -shown as "==>". The format is: - - Context switches: - - Previous task Next Task - - :: ==> :: - - Wake ups: - - Current task Task waking up - - :: + :: - -The prio is the internal kernel priority, which is the inverse -of the priority that is usually displayed by user-space tools. -Zero represents the highest priority (99). Prio 100 starts the -"nice" priorities with 100 being equal to nice -20 and 139 being -nice 19. The prio "140" is reserved for the idle task which is -the lowest priority thread (pid 0). - - -Latency trace format --------------------- - -For traces that display latency times, the latency_trace file -gives somewhat more information to see why a latency happened. -Here is a typical trace. - -# tracer: irqsoff -# -irqsoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 97 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: swapper-0 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: apic_timer_interrupt - => ended at: do_softirq - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - -0 0d..1 0us+: trace_hardirqs_off_thunk (apic_timer_interrupt) - -0 0d.s. 97us : __do_softirq (do_softirq) - -0 0d.s1 98us : trace_hardirqs_on (do_softirq) - - -This shows that the current tracer is "irqsoff" tracing the time -for which interrupts were disabled. It gives the trace version -and the version of the kernel upon which this was executed on -(2.6.26-rc8). Then it displays the max latency in microsecs (97 -us). The number of trace entries displayed and the total number -recorded (both are three: #3/3). The type of preemption that was -used (PREEMPT). VP, KP, SP, and HP are always zero and are -reserved for later use. #P is the number of online CPUS (#P:2). - -The task is the process that was running when the latency -occurred. (swapper pid: 0). - -The start and stop (the functions in which the interrupts were -disabled and enabled respectively) that caused the latencies: - - apic_timer_interrupt is where the interrupts were disabled. - do_softirq is where they were enabled again. - -The next lines after the header are the trace itself. The header -explains which is which. - - cmd: The name of the process in the trace. - - pid: The PID of that process. - - CPU#: The CPU which the process was running on. - - irqs-off: 'd' interrupts are disabled. '.' otherwise. - Note: If the architecture does not support a way to - read the irq flags variable, an 'X' will always - be printed here. - - need-resched: 'N' task need_resched is set, '.' otherwise. - - hardirq/softirq: - 'H' - hard irq occurred inside a softirq. - 'h' - hard irq is running - 's' - soft irq is running - '.' - normal context. - - preempt-depth: The level of preempt_disabled - -The above is mostly meaningful for kernel developers. - - time: This differs from the trace file output. The trace file output - includes an absolute timestamp. The timestamp used by the - latency_trace file is relative to the start of the trace. - - delay: This is just to help catch your eye a bit better. And - needs to be fixed to be only relative to the same CPU. - The marks are determined by the difference between this - current trace and the next trace. - '!' - greater than preempt_mark_thresh (default 100) - '+' - greater than 1 microsecond - ' ' - less than or equal to 1 microsecond. - - The rest is the same as the 'trace' file. - - -trace_options -------------- - -The trace_options file is used to control what gets printed in -the trace output. To see what is available, simply cat the file: - - cat /debug/tracing/trace_options - print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \ - noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj - -To disable one of the options, echo in the option prepended with -"no". - - echo noprint-parent > /debug/tracing/trace_options - -To enable an option, leave off the "no". - - echo sym-offset > /debug/tracing/trace_options - -Here are the available options: - - print-parent - On function traces, display the calling (parent) - function as well as the function being traced. - - print-parent: - bash-4000 [01] 1477.606694: simple_strtoul <-strict_strtoul - - noprint-parent: - bash-4000 [01] 1477.606694: simple_strtoul - - - sym-offset - Display not only the function name, but also the - offset in the function. For example, instead of - seeing just "ktime_get", you will see - "ktime_get+0xb/0x20". - - sym-offset: - bash-4000 [01] 1477.606694: simple_strtoul+0x6/0xa0 - - sym-addr - this will also display the function address as well - as the function name. - - sym-addr: - bash-4000 [01] 1477.606694: simple_strtoul - - verbose - This deals with the latency_trace file. - - bash 4000 1 0 00000000 00010a95 [58127d26] 1720.415ms \ - (+0.000ms): simple_strtoul (strict_strtoul) - - raw - This will display raw numbers. This option is best for - use with user applications that can translate the raw - numbers better than having it done in the kernel. - - hex - Similar to raw, but the numbers will be in a hexadecimal - format. - - bin - This will print out the formats in raw binary. - - block - TBD (needs update) - - stacktrace - This is one of the options that changes the trace - itself. When a trace is recorded, so is the stack - of functions. This allows for back traces of - trace sites. - - userstacktrace - This option changes the trace. It records a - stacktrace of the current userspace thread. - - sym-userobj - when user stacktrace are enabled, look up which - object the address belongs to, and print a - relative address. This is especially useful when - ASLR is on, otherwise you don't get a chance to - resolve the address to object/file/line after - the app is no longer running - - The lookup is performed when you read - trace,trace_pipe,latency_trace. Example: - - a.out-1623 [000] 40874.465068: /root/a.out[+0x480] <-/root/a.out[+0 -x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6] - - sched-tree - trace all tasks that are on the runqueue, at - every scheduling event. Will add overhead if - there's a lot of tasks running at once. - - -sched_switch ------------- - -This tracer simply records schedule switches. Here is an example -of how to use it. - - # echo sched_switch > /debug/tracing/current_tracer - # echo 1 > /debug/tracing/tracing_enabled - # sleep 1 - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/trace - -# tracer: sched_switch -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-3997 [01] 240.132281: 3997:120:R + 4055:120:R - bash-3997 [01] 240.132284: 3997:120:R ==> 4055:120:R - sleep-4055 [01] 240.132371: 4055:120:S ==> 3997:120:R - bash-3997 [01] 240.132454: 3997:120:R + 4055:120:S - bash-3997 [01] 240.132457: 3997:120:R ==> 4055:120:R - sleep-4055 [01] 240.132460: 4055:120:D ==> 3997:120:R - bash-3997 [01] 240.132463: 3997:120:R + 4055:120:D - bash-3997 [01] 240.132465: 3997:120:R ==> 4055:120:R - -0 [00] 240.132589: 0:140:R + 4:115:S - -0 [00] 240.132591: 0:140:R ==> 4:115:R - ksoftirqd/0-4 [00] 240.132595: 4:115:S ==> 0:140:R - -0 [00] 240.132598: 0:140:R + 4:115:S - -0 [00] 240.132599: 0:140:R ==> 4:115:R - ksoftirqd/0-4 [00] 240.132603: 4:115:S ==> 0:140:R - sleep-4055 [01] 240.133058: 4055:120:S ==> 3997:120:R - [...] - - -As we have discussed previously about this format, the header -shows the name of the trace and points to the options. The -"FUNCTION" is a misnomer since here it represents the wake ups -and context switches. - -The sched_switch file only lists the wake ups (represented with -'+') and context switches ('==>') with the previous task or -current task first followed by the next task or task waking up. -The format for both of these is PID:KERNEL-PRIO:TASK-STATE. -Remember that the KERNEL-PRIO is the inverse of the actual -priority with zero (0) being the highest priority and the nice -values starting at 100 (nice -20). Below is a quick chart to map -the kernel priority to user land priorities. - - Kernel priority: 0 to 99 ==> user RT priority 99 to 0 - Kernel priority: 100 to 139 ==> user nice -20 to 19 - Kernel priority: 140 ==> idle task priority - -The task states are: - - R - running : wants to run, may not actually be running - S - sleep : process is waiting to be woken up (handles signals) - D - disk sleep (uninterruptible sleep) : process must be woken up - (ignores signals) - T - stopped : process suspended - t - traced : process is being traced (with something like gdb) - Z - zombie : process waiting to be cleaned up - X - unknown - - -ftrace_enabled --------------- - -The following tracers (listed below) give different output -depending on whether or not the sysctl ftrace_enabled is set. To -set ftrace_enabled, one can either use the sysctl function or -set it via the proc file system interface. - - sysctl kernel.ftrace_enabled=1 - - or - - echo 1 > /proc/sys/kernel/ftrace_enabled - -To disable ftrace_enabled simply replace the '1' with '0' in the -above commands. - -When ftrace_enabled is set the tracers will also record the -functions that are within the trace. The descriptions of the -tracers will also show an example with ftrace enabled. - - -irqsoff -------- - -When interrupts are disabled, the CPU can not react to any other -external event (besides NMIs and SMIs). This prevents the timer -interrupt from triggering or the mouse interrupt from letting -the kernel know of a new mouse event. The result is a latency -with the reaction time. - -The irqsoff tracer tracks the time for which interrupts are -disabled. When a new maximum latency is hit, the tracer saves -the trace leading up to that latency point so that every time a -new maximum is reached, the old saved trace is discarded and the -new trace is saved. - -To reset the maximum, echo 0 into tracing_max_latency. Here is -an example: - - # echo irqsoff > /debug/tracing/current_tracer - # echo 0 > /debug/tracing/tracing_max_latency - # echo 1 > /debug/tracing/tracing_enabled - # ls -ltr - [...] - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/latency_trace -# tracer: irqsoff -# -irqsoff latency trace v1.1.5 on 2.6.26 --------------------------------------------------------------------- - latency: 12 us, #3/3, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: bash-3730 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: sys_setpgid - => ended at: sys_setpgid - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - bash-3730 1d... 0us : _write_lock_irq (sys_setpgid) - bash-3730 1d..1 1us+: _write_unlock_irq (sys_setpgid) - bash-3730 1d..2 14us : trace_hardirqs_on (sys_setpgid) - - -Here we see that that we had a latency of 12 microsecs (which is -very good). The _write_lock_irq in sys_setpgid disabled -interrupts. The difference between the 12 and the displayed -timestamp 14us occurred because the clock was incremented -between the time of recording the max latency and the time of -recording the function that had that latency. - -Note the above example had ftrace_enabled not set. If we set the -ftrace_enabled, we get a much larger output: - -# tracer: irqsoff -# -irqsoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 50 us, #101/101, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: ls-4339 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: __alloc_pages_internal - => ended at: __alloc_pages_internal - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - ls-4339 0...1 0us+: get_page_from_freelist (__alloc_pages_internal) - ls-4339 0d..1 3us : rmqueue_bulk (get_page_from_freelist) - ls-4339 0d..1 3us : _spin_lock (rmqueue_bulk) - ls-4339 0d..1 4us : add_preempt_count (_spin_lock) - ls-4339 0d..2 4us : __rmqueue (rmqueue_bulk) - ls-4339 0d..2 5us : __rmqueue_smallest (__rmqueue) - ls-4339 0d..2 5us : __mod_zone_page_state (__rmqueue_smallest) - ls-4339 0d..2 6us : __rmqueue (rmqueue_bulk) - ls-4339 0d..2 6us : __rmqueue_smallest (__rmqueue) - ls-4339 0d..2 7us : __mod_zone_page_state (__rmqueue_smallest) - ls-4339 0d..2 7us : __rmqueue (rmqueue_bulk) - ls-4339 0d..2 8us : __rmqueue_smallest (__rmqueue) -[...] - ls-4339 0d..2 46us : __rmqueue_smallest (__rmqueue) - ls-4339 0d..2 47us : __mod_zone_page_state (__rmqueue_smallest) - ls-4339 0d..2 47us : __rmqueue (rmqueue_bulk) - ls-4339 0d..2 48us : __rmqueue_smallest (__rmqueue) - ls-4339 0d..2 48us : __mod_zone_page_state (__rmqueue_smallest) - ls-4339 0d..2 49us : _spin_unlock (rmqueue_bulk) - ls-4339 0d..2 49us : sub_preempt_count (_spin_unlock) - ls-4339 0d..1 50us : get_page_from_freelist (__alloc_pages_internal) - ls-4339 0d..2 51us : trace_hardirqs_on (__alloc_pages_internal) - - - -Here we traced a 50 microsecond latency. But we also see all the -functions that were called during that time. Note that by -enabling function tracing, we incur an added overhead. This -overhead may extend the latency times. But nevertheless, this -trace has provided some very helpful debugging information. - - -preemptoff ----------- - -When preemption is disabled, we may be able to receive -interrupts but the task cannot be preempted and a higher -priority task must wait for preemption to be enabled again -before it can preempt a lower priority task. - -The preemptoff tracer traces the places that disable preemption. -Like the irqsoff tracer, it records the maximum latency for -which preemption was disabled. The control of preemptoff tracer -is much like the irqsoff tracer. - - # echo preemptoff > /debug/tracing/current_tracer - # echo 0 > /debug/tracing/tracing_max_latency - # echo 1 > /debug/tracing/tracing_enabled - # ls -ltr - [...] - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/latency_trace -# tracer: preemptoff -# -preemptoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 29 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: do_IRQ - => ended at: __do_softirq - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - sshd-4261 0d.h. 0us+: irq_enter (do_IRQ) - sshd-4261 0d.s. 29us : _local_bh_enable (__do_softirq) - sshd-4261 0d.s1 30us : trace_preempt_on (__do_softirq) - - -This has some more changes. Preemption was disabled when an -interrupt came in (notice the 'h'), and was enabled while doing -a softirq. (notice the 's'). But we also see that interrupts -have been disabled when entering the preempt off section and -leaving it (the 'd'). We do not know if interrupts were enabled -in the mean time. - -# tracer: preemptoff -# -preemptoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 63 us, #87/87, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: remove_wait_queue - => ended at: __do_softirq - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - sshd-4261 0d..1 0us : _spin_lock_irqsave (remove_wait_queue) - sshd-4261 0d..1 1us : _spin_unlock_irqrestore (remove_wait_queue) - sshd-4261 0d..1 2us : do_IRQ (common_interrupt) - sshd-4261 0d..1 2us : irq_enter (do_IRQ) - sshd-4261 0d..1 2us : idle_cpu (irq_enter) - sshd-4261 0d..1 3us : add_preempt_count (irq_enter) - sshd-4261 0d.h1 3us : idle_cpu (irq_enter) - sshd-4261 0d.h. 4us : handle_fasteoi_irq (do_IRQ) -[...] - sshd-4261 0d.h. 12us : add_preempt_count (_spin_lock) - sshd-4261 0d.h1 12us : ack_ioapic_quirk_irq (handle_fasteoi_irq) - sshd-4261 0d.h1 13us : move_native_irq (ack_ioapic_quirk_irq) - sshd-4261 0d.h1 13us : _spin_unlock (handle_fasteoi_irq) - sshd-4261 0d.h1 14us : sub_preempt_count (_spin_unlock) - sshd-4261 0d.h1 14us : irq_exit (do_IRQ) - sshd-4261 0d.h1 15us : sub_preempt_count (irq_exit) - sshd-4261 0d..2 15us : do_softirq (irq_exit) - sshd-4261 0d... 15us : __do_softirq (do_softirq) - sshd-4261 0d... 16us : __local_bh_disable (__do_softirq) - sshd-4261 0d... 16us+: add_preempt_count (__local_bh_disable) - sshd-4261 0d.s4 20us : add_preempt_count (__local_bh_disable) - sshd-4261 0d.s4 21us : sub_preempt_count (local_bh_enable) - sshd-4261 0d.s5 21us : sub_preempt_count (local_bh_enable) -[...] - sshd-4261 0d.s6 41us : add_preempt_count (__local_bh_disable) - sshd-4261 0d.s6 42us : sub_preempt_count (local_bh_enable) - sshd-4261 0d.s7 42us : sub_preempt_count (local_bh_enable) - sshd-4261 0d.s5 43us : add_preempt_count (__local_bh_disable) - sshd-4261 0d.s5 43us : sub_preempt_count (local_bh_enable_ip) - sshd-4261 0d.s6 44us : sub_preempt_count (local_bh_enable_ip) - sshd-4261 0d.s5 44us : add_preempt_count (__local_bh_disable) - sshd-4261 0d.s5 45us : sub_preempt_count (local_bh_enable) -[...] - sshd-4261 0d.s. 63us : _local_bh_enable (__do_softirq) - sshd-4261 0d.s1 64us : trace_preempt_on (__do_softirq) - - -The above is an example of the preemptoff trace with -ftrace_enabled set. Here we see that interrupts were disabled -the entire time. The irq_enter code lets us know that we entered -an interrupt 'h'. Before that, the functions being traced still -show that it is not in an interrupt, but we can see from the -functions themselves that this is not the case. - -Notice that __do_softirq when called does not have a -preempt_count. It may seem that we missed a preempt enabling. -What really happened is that the preempt count is held on the -thread's stack and we switched to the softirq stack (4K stacks -in effect). The code does not copy the preempt count, but -because interrupts are disabled, we do not need to worry about -it. Having a tracer like this is good for letting people know -what really happens inside the kernel. - - -preemptirqsoff --------------- - -Knowing the locations that have interrupts disabled or -preemption disabled for the longest times is helpful. But -sometimes we would like to know when either preemption and/or -interrupts are disabled. - -Consider the following code: - - local_irq_disable(); - call_function_with_irqs_off(); - preempt_disable(); - call_function_with_irqs_and_preemption_off(); - local_irq_enable(); - call_function_with_preemption_off(); - preempt_enable(); - -The irqsoff tracer will record the total length of -call_function_with_irqs_off() and -call_function_with_irqs_and_preemption_off(). - -The preemptoff tracer will record the total length of -call_function_with_irqs_and_preemption_off() and -call_function_with_preemption_off(). - -But neither will trace the time that interrupts and/or -preemption is disabled. This total time is the time that we can -not schedule. To record this time, use the preemptirqsoff -tracer. - -Again, using this trace is much like the irqsoff and preemptoff -tracers. - - # echo preemptirqsoff > /debug/tracing/current_tracer - # echo 0 > /debug/tracing/tracing_max_latency - # echo 1 > /debug/tracing/tracing_enabled - # ls -ltr - [...] - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/latency_trace -# tracer: preemptirqsoff -# -preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 293 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: ls-4860 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: apic_timer_interrupt - => ended at: __do_softirq - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - ls-4860 0d... 0us!: trace_hardirqs_off_thunk (apic_timer_interrupt) - ls-4860 0d.s. 294us : _local_bh_enable (__do_softirq) - ls-4860 0d.s1 294us : trace_preempt_on (__do_softirq) - - - -The trace_hardirqs_off_thunk is called from assembly on x86 when -interrupts are disabled in the assembly code. Without the -function tracing, we do not know if interrupts were enabled -within the preemption points. We do see that it started with -preemption enabled. - -Here is a trace with ftrace_enabled set: - - -# tracer: preemptirqsoff -# -preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 105 us, #183/183, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) - ----------------- - => started at: write_chan - => ended at: __do_softirq - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - ls-4473 0.N.. 0us : preempt_schedule (write_chan) - ls-4473 0dN.1 1us : _spin_lock (schedule) - ls-4473 0dN.1 2us : add_preempt_count (_spin_lock) - ls-4473 0d..2 2us : put_prev_task_fair (schedule) -[...] - ls-4473 0d..2 13us : set_normalized_timespec (ktime_get_ts) - ls-4473 0d..2 13us : __switch_to (schedule) - sshd-4261 0d..2 14us : finish_task_switch (schedule) - sshd-4261 0d..2 14us : _spin_unlock_irq (finish_task_switch) - sshd-4261 0d..1 15us : add_preempt_count (_spin_lock_irqsave) - sshd-4261 0d..2 16us : _spin_unlock_irqrestore (hrtick_set) - sshd-4261 0d..2 16us : do_IRQ (common_interrupt) - sshd-4261 0d..2 17us : irq_enter (do_IRQ) - sshd-4261 0d..2 17us : idle_cpu (irq_enter) - sshd-4261 0d..2 18us : add_preempt_count (irq_enter) - sshd-4261 0d.h2 18us : idle_cpu (irq_enter) - sshd-4261 0d.h. 18us : handle_fasteoi_irq (do_IRQ) - sshd-4261 0d.h. 19us : _spin_lock (handle_fasteoi_irq) - sshd-4261 0d.h. 19us : add_preempt_count (_spin_lock) - sshd-4261 0d.h1 20us : _spin_unlock (handle_fasteoi_irq) - sshd-4261 0d.h1 20us : sub_preempt_count (_spin_unlock) -[...] - sshd-4261 0d.h1 28us : _spin_unlock (handle_fasteoi_irq) - sshd-4261 0d.h1 29us : sub_preempt_count (_spin_unlock) - sshd-4261 0d.h2 29us : irq_exit (do_IRQ) - sshd-4261 0d.h2 29us : sub_preempt_count (irq_exit) - sshd-4261 0d..3 30us : do_softirq (irq_exit) - sshd-4261 0d... 30us : __do_softirq (do_softirq) - sshd-4261 0d... 31us : __local_bh_disable (__do_softirq) - sshd-4261 0d... 31us+: add_preempt_count (__local_bh_disable) - sshd-4261 0d.s4 34us : add_preempt_count (__local_bh_disable) -[...] - sshd-4261 0d.s3 43us : sub_preempt_count (local_bh_enable_ip) - sshd-4261 0d.s4 44us : sub_preempt_count (local_bh_enable_ip) - sshd-4261 0d.s3 44us : smp_apic_timer_interrupt (apic_timer_interrupt) - sshd-4261 0d.s3 45us : irq_enter (smp_apic_timer_interrupt) - sshd-4261 0d.s3 45us : idle_cpu (irq_enter) - sshd-4261 0d.s3 46us : add_preempt_count (irq_enter) - sshd-4261 0d.H3 46us : idle_cpu (irq_enter) - sshd-4261 0d.H3 47us : hrtimer_interrupt (smp_apic_timer_interrupt) - sshd-4261 0d.H3 47us : ktime_get (hrtimer_interrupt) -[...] - sshd-4261 0d.H3 81us : tick_program_event (hrtimer_interrupt) - sshd-4261 0d.H3 82us : ktime_get (tick_program_event) - sshd-4261 0d.H3 82us : ktime_get_ts (ktime_get) - sshd-4261 0d.H3 83us : getnstimeofday (ktime_get_ts) - sshd-4261 0d.H3 83us : set_normalized_timespec (ktime_get_ts) - sshd-4261 0d.H3 84us : clockevents_program_event (tick_program_event) - sshd-4261 0d.H3 84us : lapic_next_event (clockevents_program_event) - sshd-4261 0d.H3 85us : irq_exit (smp_apic_timer_interrupt) - sshd-4261 0d.H3 85us : sub_preempt_count (irq_exit) - sshd-4261 0d.s4 86us : sub_preempt_count (irq_exit) - sshd-4261 0d.s3 86us : add_preempt_count (__local_bh_disable) -[...] - sshd-4261 0d.s1 98us : sub_preempt_count (net_rx_action) - sshd-4261 0d.s. 99us : add_preempt_count (_spin_lock_irq) - sshd-4261 0d.s1 99us+: _spin_unlock_irq (run_timer_softirq) - sshd-4261 0d.s. 104us : _local_bh_enable (__do_softirq) - sshd-4261 0d.s. 104us : sub_preempt_count (_local_bh_enable) - sshd-4261 0d.s. 105us : _local_bh_enable (__do_softirq) - sshd-4261 0d.s1 105us : trace_preempt_on (__do_softirq) - - -This is a very interesting trace. It started with the preemption -of the ls task. We see that the task had the "need_resched" bit -set via the 'N' in the trace. Interrupts were disabled before -the spin_lock at the beginning of the trace. We see that a -schedule took place to run sshd. When the interrupts were -enabled, we took an interrupt. On return from the interrupt -handler, the softirq ran. We took another interrupt while -running the softirq as we see from the capital 'H'. - - -wakeup ------- - -In a Real-Time environment it is very important to know the -wakeup time it takes for the highest priority task that is woken -up to the time that it executes. This is also known as "schedule -latency". I stress the point that this is about RT tasks. It is -also important to know the scheduling latency of non-RT tasks, -but the average schedule latency is better for non-RT tasks. -Tools like LatencyTop are more appropriate for such -measurements. - -Real-Time environments are interested in the worst case latency. -That is the longest latency it takes for something to happen, -and not the average. We can have a very fast scheduler that may -only have a large latency once in a while, but that would not -work well with Real-Time tasks. The wakeup tracer was designed -to record the worst case wakeups of RT tasks. Non-RT tasks are -not recorded because the tracer only records one worst case and -tracing non-RT tasks that are unpredictable will overwrite the -worst case latency of RT tasks. - -Since this tracer only deals with RT tasks, we will run this -slightly differently than we did with the previous tracers. -Instead of performing an 'ls', we will run 'sleep 1' under -'chrt' which changes the priority of the task. - - # echo wakeup > /debug/tracing/current_tracer - # echo 0 > /debug/tracing/tracing_max_latency - # echo 1 > /debug/tracing/tracing_enabled - # chrt -f 5 sleep 1 - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/latency_trace -# tracer: wakeup -# -wakeup latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 4 us, #2/2, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: sleep-4901 (uid:0 nice:0 policy:1 rt_prio:5) - ----------------- - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / - -0 1d.h4 0us+: try_to_wake_up (wake_up_process) - -0 1d..4 4us : schedule (cpu_idle) - - -Running this on an idle system, we see that it only took 4 -microseconds to perform the task switch. Note, since the trace -marker in the schedule is before the actual "switch", we stop -the tracing when the recorded task is about to schedule in. This -may change if we add a new marker at the end of the scheduler. - -Notice that the recorded task is 'sleep' with the PID of 4901 -and it has an rt_prio of 5. This priority is user-space priority -and not the internal kernel priority. The policy is 1 for -SCHED_FIFO and 2 for SCHED_RR. - -Doing the same with chrt -r 5 and ftrace_enabled set. - -# tracer: wakeup -# -wakeup latency trace v1.1.5 on 2.6.26-rc8 --------------------------------------------------------------------- - latency: 50 us, #60/60, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) - ----------------- - | task: sleep-4068 (uid:0 nice:0 policy:2 rt_prio:5) - ----------------- - -# _------=> CPU# -# / _-----=> irqs-off -# | / _----=> need-resched -# || / _---=> hardirq/softirq -# ||| / _--=> preempt-depth -# |||| / -# ||||| delay -# cmd pid ||||| time | caller -# \ / ||||| \ | / -ksoftirq-7 1d.H3 0us : try_to_wake_up (wake_up_process) -ksoftirq-7 1d.H4 1us : sub_preempt_count (marker_probe_cb) -ksoftirq-7 1d.H3 2us : check_preempt_wakeup (try_to_wake_up) -ksoftirq-7 1d.H3 3us : update_curr (check_preempt_wakeup) -ksoftirq-7 1d.H3 4us : calc_delta_mine (update_curr) -ksoftirq-7 1d.H3 5us : __resched_task (check_preempt_wakeup) -ksoftirq-7 1d.H3 6us : task_wake_up_rt (try_to_wake_up) -ksoftirq-7 1d.H3 7us : _spin_unlock_irqrestore (try_to_wake_up) -[...] -ksoftirq-7 1d.H2 17us : irq_exit (smp_apic_timer_interrupt) -ksoftirq-7 1d.H2 18us : sub_preempt_count (irq_exit) -ksoftirq-7 1d.s3 19us : sub_preempt_count (irq_exit) -ksoftirq-7 1..s2 20us : rcu_process_callbacks (__do_softirq) -[...] -ksoftirq-7 1..s2 26us : __rcu_process_callbacks (rcu_process_callbacks) -ksoftirq-7 1d.s2 27us : _local_bh_enable (__do_softirq) -ksoftirq-7 1d.s2 28us : sub_preempt_count (_local_bh_enable) -ksoftirq-7 1.N.3 29us : sub_preempt_count (ksoftirqd) -ksoftirq-7 1.N.2 30us : _cond_resched (ksoftirqd) -ksoftirq-7 1.N.2 31us : __cond_resched (_cond_resched) -ksoftirq-7 1.N.2 32us : add_preempt_count (__cond_resched) -ksoftirq-7 1.N.2 33us : schedule (__cond_resched) -ksoftirq-7 1.N.2 33us : add_preempt_count (schedule) -ksoftirq-7 1.N.3 34us : hrtick_clear (schedule) -ksoftirq-7 1dN.3 35us : _spin_lock (schedule) -ksoftirq-7 1dN.3 36us : add_preempt_count (_spin_lock) -ksoftirq-7 1d..4 37us : put_prev_task_fair (schedule) -ksoftirq-7 1d..4 38us : update_curr (put_prev_task_fair) -[...] -ksoftirq-7 1d..5 47us : _spin_trylock (tracing_record_cmdline) -ksoftirq-7 1d..5 48us : add_preempt_count (_spin_trylock) -ksoftirq-7 1d..6 49us : _spin_unlock (tracing_record_cmdline) -ksoftirq-7 1d..6 49us : sub_preempt_count (_spin_unlock) -ksoftirq-7 1d..4 50us : schedule (__cond_resched) - -The interrupt went off while running ksoftirqd. This task runs -at SCHED_OTHER. Why did not we see the 'N' set early? This may -be a harmless bug with x86_32 and 4K stacks. On x86_32 with 4K -stacks configured, the interrupt and softirq run with their own -stack. Some information is held on the top of the task's stack -(need_resched and preempt_count are both stored there). The -setting of the NEED_RESCHED bit is done directly to the task's -stack, but the reading of the NEED_RESCHED is done by looking at -the current stack, which in this case is the stack for the hard -interrupt. This hides the fact that NEED_RESCHED has been set. -We do not see the 'N' until we switch back to the task's -assigned stack. - -function --------- - -This tracer is the function tracer. Enabling the function tracer -can be done from the debug file system. Make sure the -ftrace_enabled is set; otherwise this tracer is a nop. - - # sysctl kernel.ftrace_enabled=1 - # echo function > /debug/tracing/current_tracer - # echo 1 > /debug/tracing/tracing_enabled - # usleep 1 - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/trace -# tracer: function -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-4003 [00] 123.638713: finish_task_switch <-schedule - bash-4003 [00] 123.638714: _spin_unlock_irq <-finish_task_switch - bash-4003 [00] 123.638714: sub_preempt_count <-_spin_unlock_irq - bash-4003 [00] 123.638715: hrtick_set <-schedule - bash-4003 [00] 123.638715: _spin_lock_irqsave <-hrtick_set - bash-4003 [00] 123.638716: add_preempt_count <-_spin_lock_irqsave - bash-4003 [00] 123.638716: _spin_unlock_irqrestore <-hrtick_set - bash-4003 [00] 123.638717: sub_preempt_count <-_spin_unlock_irqrestore - bash-4003 [00] 123.638717: hrtick_clear <-hrtick_set - bash-4003 [00] 123.638718: sub_preempt_count <-schedule - bash-4003 [00] 123.638718: sub_preempt_count <-preempt_schedule - bash-4003 [00] 123.638719: wait_for_completion <-__stop_machine_run - bash-4003 [00] 123.638719: wait_for_common <-wait_for_completion - bash-4003 [00] 123.638720: _spin_lock_irq <-wait_for_common - bash-4003 [00] 123.638720: add_preempt_count <-_spin_lock_irq -[...] - - -Note: function tracer uses ring buffers to store the above -entries. The newest data may overwrite the oldest data. -Sometimes using echo to stop the trace is not sufficient because -the tracing could have overwritten the data that you wanted to -record. For this reason, it is sometimes better to disable -tracing directly from a program. This allows you to stop the -tracing at the point that you hit the part that you are -interested in. To disable the tracing directly from a C program, -something like following code snippet can be used: - -int trace_fd; -[...] -int main(int argc, char *argv[]) { - [...] - trace_fd = open("/debug/tracing/tracing_enabled", O_WRONLY); - [...] - if (condition_hit()) { - write(trace_fd, "0", 1); - } - [...] -} - -Note: Here we hard coded the path name. The debugfs mount is not -guaranteed to be at /debug (and is more commonly at -/sys/kernel/debug). For simple one time traces, the above is -sufficent. For anything else, a search through /proc/mounts may -be needed to find where the debugfs file-system is mounted. - - -Single thread tracing ---------------------- - -By writing into /debug/tracing/set_ftrace_pid you can trace a -single thread. For example: - -# cat /debug/tracing/set_ftrace_pid -no pid -# echo 3111 > /debug/tracing/set_ftrace_pid -# cat /debug/tracing/set_ftrace_pid -3111 -# echo function > /debug/tracing/current_tracer -# cat /debug/tracing/trace | head - # tracer: function - # - # TASK-PID CPU# TIMESTAMP FUNCTION - # | | | | | - yum-updatesd-3111 [003] 1637.254676: finish_task_switch <-thread_return - yum-updatesd-3111 [003] 1637.254681: hrtimer_cancel <-schedule_hrtimeout_range - yum-updatesd-3111 [003] 1637.254682: hrtimer_try_to_cancel <-hrtimer_cancel - yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel - yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll - yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll -# echo -1 > /debug/tracing/set_ftrace_pid -# cat /debug/tracing/trace |head - # tracer: function - # - # TASK-PID CPU# TIMESTAMP FUNCTION - # | | | | | - ##### CPU 3 buffer started #### - yum-updatesd-3111 [003] 1701.957688: free_poll_entry <-poll_freewait - yum-updatesd-3111 [003] 1701.957689: remove_wait_queue <-free_poll_entry - yum-updatesd-3111 [003] 1701.957691: fput <-free_poll_entry - yum-updatesd-3111 [003] 1701.957692: audit_syscall_exit <-sysret_audit - yum-updatesd-3111 [003] 1701.957693: path_put <-audit_syscall_exit - -If you want to trace a function when executing, you could use -something like this simple program: - -#include -#include -#include -#include -#include -#include - -int main (int argc, char **argv) -{ - if (argc < 1) - exit(-1); - - if (fork() > 0) { - int fd, ffd; - char line[64]; - int s; - - ffd = open("/debug/tracing/current_tracer", O_WRONLY); - if (ffd < 0) - exit(-1); - write(ffd, "nop", 3); - - fd = open("/debug/tracing/set_ftrace_pid", O_WRONLY); - s = sprintf(line, "%d\n", getpid()); - write(fd, line, s); - - write(ffd, "function", 8); - - close(fd); - close(ffd); - - execvp(argv[1], argv+1); - } - - return 0; -} - - -hw-branch-tracer (x86 only) ---------------------------- - -This tracer uses the x86 last branch tracing hardware feature to -collect a branch trace on all cpus with relatively low overhead. - -The tracer uses a fixed-size circular buffer per cpu and only -traces ring 0 branches. The trace file dumps that buffer in the -following format: - -# tracer: hw-branch-tracer -# -# CPU# TO <- FROM - 0 scheduler_tick+0xb5/0x1bf <- task_tick_idle+0x5/0x6 - 2 run_posix_cpu_timers+0x2b/0x72a <- run_posix_cpu_timers+0x25/0x72a - 0 scheduler_tick+0x139/0x1bf <- scheduler_tick+0xed/0x1bf - 0 scheduler_tick+0x17c/0x1bf <- scheduler_tick+0x148/0x1bf - 2 run_posix_cpu_timers+0x9e/0x72a <- run_posix_cpu_timers+0x5e/0x72a - 0 scheduler_tick+0x1b6/0x1bf <- scheduler_tick+0x1aa/0x1bf - - -The tracer may be used to dump the trace for the oops'ing cpu on -a kernel oops into the system log. To enable this, -ftrace_dump_on_oops must be set. To set ftrace_dump_on_oops, one -can either use the sysctl function or set it via the proc system -interface. - - sysctl kernel.ftrace_dump_on_oops=1 - -or - - echo 1 > /proc/sys/kernel/ftrace_dump_on_oops - - -Here's an example of such a dump after a null pointer -dereference in a kernel module: - -[57848.105921] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 -[57848.106019] IP: [] open+0x6/0x14 [oops] -[57848.106019] PGD 2354e9067 PUD 2375e7067 PMD 0 -[57848.106019] Oops: 0002 [#1] SMP -[57848.106019] last sysfs file: /sys/devices/pci0000:00/0000:00:1e.0/0000:20:05.0/local_cpus -[57848.106019] Dumping ftrace buffer: -[57848.106019] --------------------------------- -[...] -[57848.106019] 0 chrdev_open+0xe6/0x165 <- cdev_put+0x23/0x24 -[57848.106019] 0 chrdev_open+0x117/0x165 <- chrdev_open+0xfa/0x165 -[57848.106019] 0 chrdev_open+0x120/0x165 <- chrdev_open+0x11c/0x165 -[57848.106019] 0 chrdev_open+0x134/0x165 <- chrdev_open+0x12b/0x165 -[57848.106019] 0 open+0x0/0x14 [oops] <- chrdev_open+0x144/0x165 -[57848.106019] 0 page_fault+0x0/0x30 <- open+0x6/0x14 [oops] -[57848.106019] 0 error_entry+0x0/0x5b <- page_fault+0x4/0x30 -[57848.106019] 0 error_kernelspace+0x0/0x31 <- error_entry+0x59/0x5b -[57848.106019] 0 error_sti+0x0/0x1 <- error_kernelspace+0x2d/0x31 -[57848.106019] 0 page_fault+0x9/0x30 <- error_sti+0x0/0x1 -[57848.106019] 0 do_page_fault+0x0/0x881 <- page_fault+0x1a/0x30 -[...] -[57848.106019] 0 do_page_fault+0x66b/0x881 <- is_prefetch+0x1ee/0x1f2 -[57848.106019] 0 do_page_fault+0x6e0/0x881 <- do_page_fault+0x67a/0x881 -[57848.106019] 0 oops_begin+0x0/0x96 <- do_page_fault+0x6e0/0x881 -[57848.106019] 0 trace_hw_branch_oops+0x0/0x2d <- oops_begin+0x9/0x96 -[...] -[57848.106019] 0 ds_suspend_bts+0x2a/0xe3 <- ds_suspend_bts+0x1a/0xe3 -[57848.106019] --------------------------------- -[57848.106019] CPU 0 -[57848.106019] Modules linked in: oops -[57848.106019] Pid: 5542, comm: cat Tainted: G W 2.6.28 #23 -[57848.106019] RIP: 0010:[] [] open+0x6/0x14 [oops] -[57848.106019] RSP: 0018:ffff880235457d48 EFLAGS: 00010246 -[...] - - -function graph tracer ---------------------------- - -This tracer is similar to the function tracer except that it -probes a function on its entry and its exit. This is done by -using a dynamically allocated stack of return addresses in each -task_struct. On function entry the tracer overwrites the return -address of each function traced to set a custom probe. Thus the -original return address is stored on the stack of return address -in the task_struct. - -Probing on both ends of a function leads to special features -such as: - -- measure of a function's time execution -- having a reliable call stack to draw function calls graph - -This tracer is useful in several situations: - -- you want to find the reason of a strange kernel behavior and - need to see what happens in detail on any areas (or specific - ones). - -- you are experiencing weird latencies but it's difficult to - find its origin. - -- you want to find quickly which path is taken by a specific - function - -- you just want to peek inside a working kernel and want to see - what happens there. - -# tracer: function_graph -# -# CPU DURATION FUNCTION CALLS -# | | | | | | | - - 0) | sys_open() { - 0) | do_sys_open() { - 0) | getname() { - 0) | kmem_cache_alloc() { - 0) 1.382 us | __might_sleep(); - 0) 2.478 us | } - 0) | strncpy_from_user() { - 0) | might_fault() { - 0) 1.389 us | __might_sleep(); - 0) 2.553 us | } - 0) 3.807 us | } - 0) 7.876 us | } - 0) | alloc_fd() { - 0) 0.668 us | _spin_lock(); - 0) 0.570 us | expand_files(); - 0) 0.586 us | _spin_unlock(); - - -There are several columns that can be dynamically -enabled/disabled. You can use every combination of options you -want, depending on your needs. - -- The cpu number on which the function executed is default - enabled. It is sometimes better to only trace one cpu (see - tracing_cpu_mask file) or you might sometimes see unordered - function calls while cpu tracing switch. - - hide: echo nofuncgraph-cpu > /debug/tracing/trace_options - show: echo funcgraph-cpu > /debug/tracing/trace_options - -- The duration (function's time of execution) is displayed on - the closing bracket line of a function or on the same line - than the current function in case of a leaf one. It is default - enabled. - - hide: echo nofuncgraph-duration > /debug/tracing/trace_options - show: echo funcgraph-duration > /debug/tracing/trace_options - -- The overhead field precedes the duration field in case of - reached duration thresholds. - - hide: echo nofuncgraph-overhead > /debug/tracing/trace_options - show: echo funcgraph-overhead > /debug/tracing/trace_options - depends on: funcgraph-duration - - ie: - - 0) | up_write() { - 0) 0.646 us | _spin_lock_irqsave(); - 0) 0.684 us | _spin_unlock_irqrestore(); - 0) 3.123 us | } - 0) 0.548 us | fput(); - 0) + 58.628 us | } - - [...] - - 0) | putname() { - 0) | kmem_cache_free() { - 0) 0.518 us | __phys_addr(); - 0) 1.757 us | } - 0) 2.861 us | } - 0) ! 115.305 us | } - 0) ! 116.402 us | } - - + means that the function exceeded 10 usecs. - ! means that the function exceeded 100 usecs. - - -- The task/pid field displays the thread cmdline and pid which - executed the function. It is default disabled. - - hide: echo nofuncgraph-proc > /debug/tracing/trace_options - show: echo funcgraph-proc > /debug/tracing/trace_options - - ie: - - # tracer: function_graph - # - # CPU TASK/PID DURATION FUNCTION CALLS - # | | | | | | | | | - 0) sh-4802 | | d_free() { - 0) sh-4802 | | call_rcu() { - 0) sh-4802 | | __call_rcu() { - 0) sh-4802 | 0.616 us | rcu_process_gp_end(); - 0) sh-4802 | 0.586 us | check_for_new_grace_period(); - 0) sh-4802 | 2.899 us | } - 0) sh-4802 | 4.040 us | } - 0) sh-4802 | 5.151 us | } - 0) sh-4802 | + 49.370 us | } - - -- The absolute time field is an absolute timestamp given by the - system clock since it started. A snapshot of this time is - given on each entry/exit of functions - - hide: echo nofuncgraph-abstime > /debug/tracing/trace_options - show: echo funcgraph-abstime > /debug/tracing/trace_options - - ie: - - # - # TIME CPU DURATION FUNCTION CALLS - # | | | | | | | | - 360.774522 | 1) 0.541 us | } - 360.774522 | 1) 4.663 us | } - 360.774523 | 1) 0.541 us | __wake_up_bit(); - 360.774524 | 1) 6.796 us | } - 360.774524 | 1) 7.952 us | } - 360.774525 | 1) 9.063 us | } - 360.774525 | 1) 0.615 us | journal_mark_dirty(); - 360.774527 | 1) 0.578 us | __brelse(); - 360.774528 | 1) | reiserfs_prepare_for_journal() { - 360.774528 | 1) | unlock_buffer() { - 360.774529 | 1) | wake_up_bit() { - 360.774529 | 1) | bit_waitqueue() { - 360.774530 | 1) 0.594 us | __phys_addr(); - - -You can put some comments on specific functions by using -trace_printk() For example, if you want to put a comment inside -the __might_sleep() function, you just have to include - and call trace_printk() inside __might_sleep() - -trace_printk("I'm a comment!\n") - -will produce: - - 1) | __might_sleep() { - 1) | /* I'm a comment! */ - 1) 1.449 us | } - - -You might find other useful features for this tracer in the -following "dynamic ftrace" section such as tracing only specific -functions or tasks. - -dynamic ftrace --------------- - -If CONFIG_DYNAMIC_FTRACE is set, the system will run with -virtually no overhead when function tracing is disabled. The way -this works is the mcount function call (placed at the start of -every kernel function, produced by the -pg switch in gcc), -starts of pointing to a simple return. (Enabling FTRACE will -include the -pg switch in the compiling of the kernel.) - -At compile time every C file object is run through the -recordmcount.pl script (located in the scripts directory). This -script will process the C object using objdump to find all the -locations in the .text section that call mcount. (Note, only the -.text section is processed, since processing other sections like -.init.text may cause races due to those sections being freed). - -A new section called "__mcount_loc" is created that holds -references to all the mcount call sites in the .text section. -This section is compiled back into the original object. The -final linker will add all these references into a single table. - -On boot up, before SMP is initialized, the dynamic ftrace code -scans this table and updates all the locations into nops. It -also records the locations, which are added to the -available_filter_functions list. Modules are processed as they -are loaded and before they are executed. When a module is -unloaded, it also removes its functions from the ftrace function -list. This is automatic in the module unload code, and the -module author does not need to worry about it. - -When tracing is enabled, kstop_machine is called to prevent -races with the CPUS executing code being modified (which can -cause the CPU to do undesireable things), and the nops are -patched back to calls. But this time, they do not call mcount -(which is just a function stub). They now call into the ftrace -infrastructure. - -One special side-effect to the recording of the functions being -traced is that we can now selectively choose which functions we -wish to trace and which ones we want the mcount calls to remain -as nops. - -Two files are used, one for enabling and one for disabling the -tracing of specified functions. They are: - - set_ftrace_filter - -and - - set_ftrace_notrace - -A list of available functions that you can add to these files is -listed in: - - available_filter_functions - - # cat /debug/tracing/available_filter_functions -put_prev_task_idle -kmem_cache_create -pick_next_task_rt -get_online_cpus -pick_next_task_fair -mutex_lock -[...] - -If I am only interested in sys_nanosleep and hrtimer_interrupt: - - # echo sys_nanosleep hrtimer_interrupt \ - > /debug/tracing/set_ftrace_filter - # echo ftrace > /debug/tracing/current_tracer - # echo 1 > /debug/tracing/tracing_enabled - # usleep 1 - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/trace -# tracer: ftrace -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - usleep-4134 [00] 1317.070017: hrtimer_interrupt <-smp_apic_timer_interrupt - usleep-4134 [00] 1317.070111: sys_nanosleep <-syscall_call - -0 [00] 1317.070115: hrtimer_interrupt <-smp_apic_timer_interrupt - -To see which functions are being traced, you can cat the file: - - # cat /debug/tracing/set_ftrace_filter -hrtimer_interrupt -sys_nanosleep - - -Perhaps this is not enough. The filters also allow simple wild -cards. Only the following are currently available - - * - will match functions that begin with - * - will match functions that end with - ** - will match functions that have in it - -These are the only wild cards which are supported. - - * will not work. - -Note: It is better to use quotes to enclose the wild cards, - otherwise the shell may expand the parameters into names - of files in the local directory. - - # echo 'hrtimer_*' > /debug/tracing/set_ftrace_filter - -Produces: - -# tracer: ftrace -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-4003 [00] 1480.611794: hrtimer_init <-copy_process - bash-4003 [00] 1480.611941: hrtimer_start <-hrtick_set - bash-4003 [00] 1480.611956: hrtimer_cancel <-hrtick_clear - bash-4003 [00] 1480.611956: hrtimer_try_to_cancel <-hrtimer_cancel - -0 [00] 1480.612019: hrtimer_get_next_event <-get_next_timer_interrupt - -0 [00] 1480.612025: hrtimer_get_next_event <-get_next_timer_interrupt - -0 [00] 1480.612032: hrtimer_get_next_event <-get_next_timer_interrupt - -0 [00] 1480.612037: hrtimer_get_next_event <-get_next_timer_interrupt - -0 [00] 1480.612382: hrtimer_get_next_event <-get_next_timer_interrupt - - -Notice that we lost the sys_nanosleep. - - # cat /debug/tracing/set_ftrace_filter -hrtimer_run_queues -hrtimer_run_pending -hrtimer_init -hrtimer_cancel -hrtimer_try_to_cancel -hrtimer_forward -hrtimer_start -hrtimer_reprogram -hrtimer_force_reprogram -hrtimer_get_next_event -hrtimer_interrupt -hrtimer_nanosleep -hrtimer_wakeup -hrtimer_get_remaining -hrtimer_get_res -hrtimer_init_sleeper - - -This is because the '>' and '>>' act just like they do in bash. -To rewrite the filters, use '>' -To append to the filters, use '>>' - -To clear out a filter so that all functions will be recorded -again: - - # echo > /debug/tracing/set_ftrace_filter - # cat /debug/tracing/set_ftrace_filter - # - -Again, now we want to append. - - # echo sys_nanosleep > /debug/tracing/set_ftrace_filter - # cat /debug/tracing/set_ftrace_filter -sys_nanosleep - # echo 'hrtimer_*' >> /debug/tracing/set_ftrace_filter - # cat /debug/tracing/set_ftrace_filter -hrtimer_run_queues -hrtimer_run_pending -hrtimer_init -hrtimer_cancel -hrtimer_try_to_cancel -hrtimer_forward -hrtimer_start -hrtimer_reprogram -hrtimer_force_reprogram -hrtimer_get_next_event -hrtimer_interrupt -sys_nanosleep -hrtimer_nanosleep -hrtimer_wakeup -hrtimer_get_remaining -hrtimer_get_res -hrtimer_init_sleeper - - -The set_ftrace_notrace prevents those functions from being -traced. - - # echo '*preempt*' '*lock*' > /debug/tracing/set_ftrace_notrace - -Produces: - -# tracer: ftrace -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - bash-4043 [01] 115.281644: finish_task_switch <-schedule - bash-4043 [01] 115.281645: hrtick_set <-schedule - bash-4043 [01] 115.281645: hrtick_clear <-hrtick_set - bash-4043 [01] 115.281646: wait_for_completion <-__stop_machine_run - bash-4043 [01] 115.281647: wait_for_common <-wait_for_completion - bash-4043 [01] 115.281647: kthread_stop <-stop_machine_run - bash-4043 [01] 115.281648: init_waitqueue_head <-kthread_stop - bash-4043 [01] 115.281648: wake_up_process <-kthread_stop - bash-4043 [01] 115.281649: try_to_wake_up <-wake_up_process - -We can see that there's no more lock or preempt tracing. - - -Dynamic ftrace with the function graph tracer ---------------------------------------------- - -Although what has been explained above concerns both the -function tracer and the function-graph-tracer, there are some -special features only available in the function-graph tracer. - -If you want to trace only one function and all of its children, -you just have to echo its name into set_graph_function: - - echo __do_fault > set_graph_function - -will produce the following "expanded" trace of the __do_fault() -function: - - 0) | __do_fault() { - 0) | filemap_fault() { - 0) | find_lock_page() { - 0) 0.804 us | find_get_page(); - 0) | __might_sleep() { - 0) 1.329 us | } - 0) 3.904 us | } - 0) 4.979 us | } - 0) 0.653 us | _spin_lock(); - 0) 0.578 us | page_add_file_rmap(); - 0) 0.525 us | native_set_pte_at(); - 0) 0.585 us | _spin_unlock(); - 0) | unlock_page() { - 0) 0.541 us | page_waitqueue(); - 0) 0.639 us | __wake_up_bit(); - 0) 2.786 us | } - 0) + 14.237 us | } - 0) | __do_fault() { - 0) | filemap_fault() { - 0) | find_lock_page() { - 0) 0.698 us | find_get_page(); - 0) | __might_sleep() { - 0) 1.412 us | } - 0) 3.950 us | } - 0) 5.098 us | } - 0) 0.631 us | _spin_lock(); - 0) 0.571 us | page_add_file_rmap(); - 0) 0.526 us | native_set_pte_at(); - 0) 0.586 us | _spin_unlock(); - 0) | unlock_page() { - 0) 0.533 us | page_waitqueue(); - 0) 0.638 us | __wake_up_bit(); - 0) 2.793 us | } - 0) + 14.012 us | } - -You can also expand several functions at once: - - echo sys_open > set_graph_function - echo sys_close >> set_graph_function - -Now if you want to go back to trace all functions you can clear -this special filter via: - - echo > set_graph_function - - -trace_pipe ----------- - -The trace_pipe outputs the same content as the trace file, but -the effect on the tracing is different. Every read from -trace_pipe is consumed. This means that subsequent reads will be -different. The trace is live. - - # echo function > /debug/tracing/current_tracer - # cat /debug/tracing/trace_pipe > /tmp/trace.out & -[1] 4153 - # echo 1 > /debug/tracing/tracing_enabled - # usleep 1 - # echo 0 > /debug/tracing/tracing_enabled - # cat /debug/tracing/trace -# tracer: function -# -# TASK-PID CPU# TIMESTAMP FUNCTION -# | | | | | - - # - # cat /tmp/trace.out - bash-4043 [00] 41.267106: finish_task_switch <-schedule - bash-4043 [00] 41.267106: hrtick_set <-schedule - bash-4043 [00] 41.267107: hrtick_clear <-hrtick_set - bash-4043 [00] 41.267108: wait_for_completion <-__stop_machine_run - bash-4043 [00] 41.267108: wait_for_common <-wait_for_completion - bash-4043 [00] 41.267109: kthread_stop <-stop_machine_run - bash-4043 [00] 41.267109: init_waitqueue_head <-kthread_stop - bash-4043 [00] 41.267110: wake_up_process <-kthread_stop - bash-4043 [00] 41.267110: try_to_wake_up <-wake_up_process - bash-4043 [00] 41.267111: select_task_rq_rt <-try_to_wake_up - - -Note, reading the trace_pipe file will block until more input is -added. By changing the tracer, trace_pipe will issue an EOF. We -needed to set the function tracer _before_ we "cat" the -trace_pipe file. - - -trace entries -------------- - -Having too much or not enough data can be troublesome in -diagnosing an issue in the kernel. The file buffer_size_kb is -used to modify the size of the internal trace buffers. The -number listed is the number of entries that can be recorded per -CPU. To know the full size, multiply the number of possible CPUS -with the number of entries. - - # cat /debug/tracing/buffer_size_kb -1408 (units kilobytes) - -Note, to modify this, you must have tracing completely disabled. -To do that, echo "nop" into the current_tracer. If the -current_tracer is not set to "nop", an EINVAL error will be -returned. - - # echo nop > /debug/tracing/current_tracer - # echo 10000 > /debug/tracing/buffer_size_kb - # cat /debug/tracing/buffer_size_kb -10000 (units kilobytes) - -The number of pages which will be allocated is limited to a -percentage of available memory. Allocating too much will produce -an error. - - # echo 1000000000000 > /debug/tracing/buffer_size_kb --bash: echo: write error: Cannot allocate memory - # cat /debug/tracing/buffer_size_kb -85 - ------------ - -More details can be found in the source code, in the -kernel/tracing/*.c files. diff --git a/Documentation/trace/ftrace.txt b/Documentation/trace/ftrace.txt new file mode 100644 index 0000000..fd9a3e6 --- /dev/null +++ b/Documentation/trace/ftrace.txt @@ -0,0 +1,1828 @@ + ftrace - Function Tracer + ======================== + +Copyright 2008 Red Hat Inc. + Author: Steven Rostedt + License: The GNU Free Documentation License, Version 1.2 + (dual licensed under the GPL v2) +Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton, + John Kacur, and David Teigland. + +Written for: 2.6.28-rc2 + +Introduction +------------ + +Ftrace is an internal tracer designed to help out developers and +designers of systems to find what is going on inside the kernel. +It can be used for debugging or analyzing latencies and +performance issues that take place outside of user-space. + +Although ftrace is the function tracer, it also includes an +infrastructure that allows for other types of tracing. Some of +the tracers that are currently in ftrace include a tracer to +trace context switches, the time it takes for a high priority +task to run after it was woken up, the time interrupts are +disabled, and more (ftrace allows for tracer plugins, which +means that the list of tracers can always grow). + + +The File System +--------------- + +Ftrace uses the debugfs file system to hold the control files as +well as the files to display output. + +To mount the debugfs system: + + # mkdir /debug + # mount -t debugfs nodev /debug + +( Note: it is more common to mount at /sys/kernel/debug, but for + simplicity this document will use /debug) + +That's it! (assuming that you have ftrace configured into your kernel) + +After mounting the debugfs, you can see a directory called +"tracing". This directory contains the control and output files +of ftrace. Here is a list of some of the key files: + + + Note: all time values are in microseconds. + + current_tracer: + + This is used to set or display the current tracer + that is configured. + + available_tracers: + + This holds the different types of tracers that + have been compiled into the kernel. The + tracers listed here can be configured by + echoing their name into current_tracer. + + tracing_enabled: + + This sets or displays whether the current_tracer + is activated and tracing or not. Echo 0 into this + file to disable the tracer or 1 to enable it. + + trace: + + This file holds the output of the trace in a human + readable format (described below). + + latency_trace: + + This file shows the same trace but the information + is organized more to display possible latencies + in the system (described below). + + trace_pipe: + + The output is the same as the "trace" file but this + file is meant to be streamed with live tracing. + Reads from this file will block until new data + is retrieved. Unlike the "trace" and "latency_trace" + files, this file is a consumer. This means reading + from this file causes sequential reads to display + more current data. Once data is read from this + file, it is consumed, and will not be read + again with a sequential read. The "trace" and + "latency_trace" files are static, and if the + tracer is not adding more data, they will display + the same information every time they are read. + + trace_options: + + This file lets the user control the amount of data + that is displayed in one of the above output + files. + + tracing_max_latency: + + Some of the tracers record the max latency. + For example, the time interrupts are disabled. + This time is saved in this file. The max trace + will also be stored, and displayed by either + "trace" or "latency_trace". A new max trace will + only be recorded if the latency is greater than + the value in this file. (in microseconds) + + buffer_size_kb: + + This sets or displays the number of kilobytes each CPU + buffer can hold. The tracer buffers are the same size + for each CPU. The displayed number is the size of the + CPU buffer and not total size of all buffers. The + trace buffers are allocated in pages (blocks of memory + that the kernel uses for allocation, usually 4 KB in size). + If the last page allocated has room for more bytes + than requested, the rest of the page will be used, + making the actual allocation bigger than requested. + ( Note, the size may not be a multiple of the page size + due to buffer managment overhead. ) + + This can only be updated when the current_tracer + is set to "nop". + + tracing_cpumask: + + This is a mask that lets the user only trace + on specified CPUS. The format is a hex string + representing the CPUS. + + set_ftrace_filter: + + When dynamic ftrace is configured in (see the + section below "dynamic ftrace"), the code is dynamically + modified (code text rewrite) to disable calling of the + function profiler (mcount). This lets tracing be configured + in with practically no overhead in performance. This also + has a side effect of enabling or disabling specific functions + to be traced. Echoing names of functions into this file + will limit the trace to only those functions. + + set_ftrace_notrace: + + This has an effect opposite to that of + set_ftrace_filter. Any function that is added here will not + be traced. If a function exists in both set_ftrace_filter + and set_ftrace_notrace, the function will _not_ be traced. + + set_ftrace_pid: + + Have the function tracer only trace a single thread. + + set_graph_function: + + Set a "trigger" function where tracing should start + with the function graph tracer (See the section + "dynamic ftrace" for more details). + + available_filter_functions: + + This lists the functions that ftrace + has processed and can trace. These are the function + names that you can pass to "set_ftrace_filter" or + "set_ftrace_notrace". (See the section "dynamic ftrace" + below for more details.) + + +The Tracers +----------- + +Here is the list of current tracers that may be configured. + + "function" + + Function call tracer to trace all kernel functions. + + "function_graph_tracer" + + Similar to the function tracer except that the + function tracer probes the functions on their entry + whereas the function graph tracer traces on both entry + and exit of the functions. It then provides the ability + to draw a graph of function calls similar to C code + source. + + "sched_switch" + + Traces the context switches and wakeups between tasks. + + "irqsoff" + + Traces the areas that disable interrupts and saves + the trace with the longest max latency. + See tracing_max_latency. When a new max is recorded, + it replaces the old trace. It is best to view this + trace via the latency_trace file. + + "preemptoff" + + Similar to irqsoff but traces and records the amount of + time for which preemption is disabled. + + "preemptirqsoff" + + Similar to irqsoff and preemptoff, but traces and + records the largest time for which irqs and/or preemption + is disabled. + + "wakeup" + + Traces and records the max latency that it takes for + the highest priority task to get scheduled after + it has been woken up. + + "hw-branch-tracer" + + Uses the BTS CPU feature on x86 CPUs to traces all + branches executed. + + "nop" + + This is the "trace nothing" tracer. To remove all + tracers from tracing simply echo "nop" into + current_tracer. + + +Examples of using the tracer +---------------------------- + +Here are typical examples of using the tracers when controlling +them only with the debugfs interface (without using any +user-land utilities). + +Output format: +-------------- + +Here is an example of the output format of the file "trace" + + -------- +# tracer: function +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + bash-4251 [01] 10152.583854: path_put <-path_walk + bash-4251 [01] 10152.583855: dput <-path_put + bash-4251 [01] 10152.583855: _atomic_dec_and_lock <-dput + -------- + +A header is printed with the tracer name that is represented by +the trace. In this case the tracer is "function". Then a header +showing the format. Task name "bash", the task PID "4251", the +CPU that it was running on "01", the timestamp in . +format, the function name that was traced "path_put" and the +parent function that called this function "path_walk". The +timestamp is the time at which the function was entered. + +The sched_switch tracer also includes tracing of task wakeups +and context switches. + + ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 2916:115:S + ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 10:115:S + ksoftirqd/1-7 [01] 1453.070013: 7:115:R ==> 10:115:R + events/1-10 [01] 1453.070013: 10:115:S ==> 2916:115:R + kondemand/1-2916 [01] 1453.070013: 2916:115:S ==> 7:115:R + ksoftirqd/1-7 [01] 1453.070013: 7:115:S ==> 0:140:R + +Wake ups are represented by a "+" and the context switches are +shown as "==>". The format is: + + Context switches: + + Previous task Next Task + + :: ==> :: + + Wake ups: + + Current task Task waking up + + :: + :: + +The prio is the internal kernel priority, which is the inverse +of the priority that is usually displayed by user-space tools. +Zero represents the highest priority (99). Prio 100 starts the +"nice" priorities with 100 being equal to nice -20 and 139 being +nice 19. The prio "140" is reserved for the idle task which is +the lowest priority thread (pid 0). + + +Latency trace format +-------------------- + +For traces that display latency times, the latency_trace file +gives somewhat more information to see why a latency happened. +Here is a typical trace. + +# tracer: irqsoff +# +irqsoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 97 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: swapper-0 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: apic_timer_interrupt + => ended at: do_softirq + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + -0 0d..1 0us+: trace_hardirqs_off_thunk (apic_timer_interrupt) + -0 0d.s. 97us : __do_softirq (do_softirq) + -0 0d.s1 98us : trace_hardirqs_on (do_softirq) + + +This shows that the current tracer is "irqsoff" tracing the time +for which interrupts were disabled. It gives the trace version +and the version of the kernel upon which this was executed on +(2.6.26-rc8). Then it displays the max latency in microsecs (97 +us). The number of trace entries displayed and the total number +recorded (both are three: #3/3). The type of preemption that was +used (PREEMPT). VP, KP, SP, and HP are always zero and are +reserved for later use. #P is the number of online CPUS (#P:2). + +The task is the process that was running when the latency +occurred. (swapper pid: 0). + +The start and stop (the functions in which the interrupts were +disabled and enabled respectively) that caused the latencies: + + apic_timer_interrupt is where the interrupts were disabled. + do_softirq is where they were enabled again. + +The next lines after the header are the trace itself. The header +explains which is which. + + cmd: The name of the process in the trace. + + pid: The PID of that process. + + CPU#: The CPU which the process was running on. + + irqs-off: 'd' interrupts are disabled. '.' otherwise. + Note: If the architecture does not support a way to + read the irq flags variable, an 'X' will always + be printed here. + + need-resched: 'N' task need_resched is set, '.' otherwise. + + hardirq/softirq: + 'H' - hard irq occurred inside a softirq. + 'h' - hard irq is running + 's' - soft irq is running + '.' - normal context. + + preempt-depth: The level of preempt_disabled + +The above is mostly meaningful for kernel developers. + + time: This differs from the trace file output. The trace file output + includes an absolute timestamp. The timestamp used by the + latency_trace file is relative to the start of the trace. + + delay: This is just to help catch your eye a bit better. And + needs to be fixed to be only relative to the same CPU. + The marks are determined by the difference between this + current trace and the next trace. + '!' - greater than preempt_mark_thresh (default 100) + '+' - greater than 1 microsecond + ' ' - less than or equal to 1 microsecond. + + The rest is the same as the 'trace' file. + + +trace_options +------------- + +The trace_options file is used to control what gets printed in +the trace output. To see what is available, simply cat the file: + + cat /debug/tracing/trace_options + print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \ + noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj + +To disable one of the options, echo in the option prepended with +"no". + + echo noprint-parent > /debug/tracing/trace_options + +To enable an option, leave off the "no". + + echo sym-offset > /debug/tracing/trace_options + +Here are the available options: + + print-parent - On function traces, display the calling (parent) + function as well as the function being traced. + + print-parent: + bash-4000 [01] 1477.606694: simple_strtoul <-strict_strtoul + + noprint-parent: + bash-4000 [01] 1477.606694: simple_strtoul + + + sym-offset - Display not only the function name, but also the + offset in the function. For example, instead of + seeing just "ktime_get", you will see + "ktime_get+0xb/0x20". + + sym-offset: + bash-4000 [01] 1477.606694: simple_strtoul+0x6/0xa0 + + sym-addr - this will also display the function address as well + as the function name. + + sym-addr: + bash-4000 [01] 1477.606694: simple_strtoul + + verbose - This deals with the latency_trace file. + + bash 4000 1 0 00000000 00010a95 [58127d26] 1720.415ms \ + (+0.000ms): simple_strtoul (strict_strtoul) + + raw - This will display raw numbers. This option is best for + use with user applications that can translate the raw + numbers better than having it done in the kernel. + + hex - Similar to raw, but the numbers will be in a hexadecimal + format. + + bin - This will print out the formats in raw binary. + + block - TBD (needs update) + + stacktrace - This is one of the options that changes the trace + itself. When a trace is recorded, so is the stack + of functions. This allows for back traces of + trace sites. + + userstacktrace - This option changes the trace. It records a + stacktrace of the current userspace thread. + + sym-userobj - when user stacktrace are enabled, look up which + object the address belongs to, and print a + relative address. This is especially useful when + ASLR is on, otherwise you don't get a chance to + resolve the address to object/file/line after + the app is no longer running + + The lookup is performed when you read + trace,trace_pipe,latency_trace. Example: + + a.out-1623 [000] 40874.465068: /root/a.out[+0x480] <-/root/a.out[+0 +x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6] + + sched-tree - trace all tasks that are on the runqueue, at + every scheduling event. Will add overhead if + there's a lot of tasks running at once. + + +sched_switch +------------ + +This tracer simply records schedule switches. Here is an example +of how to use it. + + # echo sched_switch > /debug/tracing/current_tracer + # echo 1 > /debug/tracing/tracing_enabled + # sleep 1 + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/trace + +# tracer: sched_switch +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + bash-3997 [01] 240.132281: 3997:120:R + 4055:120:R + bash-3997 [01] 240.132284: 3997:120:R ==> 4055:120:R + sleep-4055 [01] 240.132371: 4055:120:S ==> 3997:120:R + bash-3997 [01] 240.132454: 3997:120:R + 4055:120:S + bash-3997 [01] 240.132457: 3997:120:R ==> 4055:120:R + sleep-4055 [01] 240.132460: 4055:120:D ==> 3997:120:R + bash-3997 [01] 240.132463: 3997:120:R + 4055:120:D + bash-3997 [01] 240.132465: 3997:120:R ==> 4055:120:R + -0 [00] 240.132589: 0:140:R + 4:115:S + -0 [00] 240.132591: 0:140:R ==> 4:115:R + ksoftirqd/0-4 [00] 240.132595: 4:115:S ==> 0:140:R + -0 [00] 240.132598: 0:140:R + 4:115:S + -0 [00] 240.132599: 0:140:R ==> 4:115:R + ksoftirqd/0-4 [00] 240.132603: 4:115:S ==> 0:140:R + sleep-4055 [01] 240.133058: 4055:120:S ==> 3997:120:R + [...] + + +As we have discussed previously about this format, the header +shows the name of the trace and points to the options. The +"FUNCTION" is a misnomer since here it represents the wake ups +and context switches. + +The sched_switch file only lists the wake ups (represented with +'+') and context switches ('==>') with the previous task or +current task first followed by the next task or task waking up. +The format for both of these is PID:KERNEL-PRIO:TASK-STATE. +Remember that the KERNEL-PRIO is the inverse of the actual +priority with zero (0) being the highest priority and the nice +values starting at 100 (nice -20). Below is a quick chart to map +the kernel priority to user land priorities. + + Kernel priority: 0 to 99 ==> user RT priority 99 to 0 + Kernel priority: 100 to 139 ==> user nice -20 to 19 + Kernel priority: 140 ==> idle task priority + +The task states are: + + R - running : wants to run, may not actually be running + S - sleep : process is waiting to be woken up (handles signals) + D - disk sleep (uninterruptible sleep) : process must be woken up + (ignores signals) + T - stopped : process suspended + t - traced : process is being traced (with something like gdb) + Z - zombie : process waiting to be cleaned up + X - unknown + + +ftrace_enabled +-------------- + +The following tracers (listed below) give different output +depending on whether or not the sysctl ftrace_enabled is set. To +set ftrace_enabled, one can either use the sysctl function or +set it via the proc file system interface. + + sysctl kernel.ftrace_enabled=1 + + or + + echo 1 > /proc/sys/kernel/ftrace_enabled + +To disable ftrace_enabled simply replace the '1' with '0' in the +above commands. + +When ftrace_enabled is set the tracers will also record the +functions that are within the trace. The descriptions of the +tracers will also show an example with ftrace enabled. + + +irqsoff +------- + +When interrupts are disabled, the CPU can not react to any other +external event (besides NMIs and SMIs). This prevents the timer +interrupt from triggering or the mouse interrupt from letting +the kernel know of a new mouse event. The result is a latency +with the reaction time. + +The irqsoff tracer tracks the time for which interrupts are +disabled. When a new maximum latency is hit, the tracer saves +the trace leading up to that latency point so that every time a +new maximum is reached, the old saved trace is discarded and the +new trace is saved. + +To reset the maximum, echo 0 into tracing_max_latency. Here is +an example: + + # echo irqsoff > /debug/tracing/current_tracer + # echo 0 > /debug/tracing/tracing_max_latency + # echo 1 > /debug/tracing/tracing_enabled + # ls -ltr + [...] + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/latency_trace +# tracer: irqsoff +# +irqsoff latency trace v1.1.5 on 2.6.26 +-------------------------------------------------------------------- + latency: 12 us, #3/3, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: bash-3730 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: sys_setpgid + => ended at: sys_setpgid + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + bash-3730 1d... 0us : _write_lock_irq (sys_setpgid) + bash-3730 1d..1 1us+: _write_unlock_irq (sys_setpgid) + bash-3730 1d..2 14us : trace_hardirqs_on (sys_setpgid) + + +Here we see that that we had a latency of 12 microsecs (which is +very good). The _write_lock_irq in sys_setpgid disabled +interrupts. The difference between the 12 and the displayed +timestamp 14us occurred because the clock was incremented +between the time of recording the max latency and the time of +recording the function that had that latency. + +Note the above example had ftrace_enabled not set. If we set the +ftrace_enabled, we get a much larger output: + +# tracer: irqsoff +# +irqsoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 50 us, #101/101, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: ls-4339 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: __alloc_pages_internal + => ended at: __alloc_pages_internal + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + ls-4339 0...1 0us+: get_page_from_freelist (__alloc_pages_internal) + ls-4339 0d..1 3us : rmqueue_bulk (get_page_from_freelist) + ls-4339 0d..1 3us : _spin_lock (rmqueue_bulk) + ls-4339 0d..1 4us : add_preempt_count (_spin_lock) + ls-4339 0d..2 4us : __rmqueue (rmqueue_bulk) + ls-4339 0d..2 5us : __rmqueue_smallest (__rmqueue) + ls-4339 0d..2 5us : __mod_zone_page_state (__rmqueue_smallest) + ls-4339 0d..2 6us : __rmqueue (rmqueue_bulk) + ls-4339 0d..2 6us : __rmqueue_smallest (__rmqueue) + ls-4339 0d..2 7us : __mod_zone_page_state (__rmqueue_smallest) + ls-4339 0d..2 7us : __rmqueue (rmqueue_bulk) + ls-4339 0d..2 8us : __rmqueue_smallest (__rmqueue) +[...] + ls-4339 0d..2 46us : __rmqueue_smallest (__rmqueue) + ls-4339 0d..2 47us : __mod_zone_page_state (__rmqueue_smallest) + ls-4339 0d..2 47us : __rmqueue (rmqueue_bulk) + ls-4339 0d..2 48us : __rmqueue_smallest (__rmqueue) + ls-4339 0d..2 48us : __mod_zone_page_state (__rmqueue_smallest) + ls-4339 0d..2 49us : _spin_unlock (rmqueue_bulk) + ls-4339 0d..2 49us : sub_preempt_count (_spin_unlock) + ls-4339 0d..1 50us : get_page_from_freelist (__alloc_pages_internal) + ls-4339 0d..2 51us : trace_hardirqs_on (__alloc_pages_internal) + + + +Here we traced a 50 microsecond latency. But we also see all the +functions that were called during that time. Note that by +enabling function tracing, we incur an added overhead. This +overhead may extend the latency times. But nevertheless, this +trace has provided some very helpful debugging information. + + +preemptoff +---------- + +When preemption is disabled, we may be able to receive +interrupts but the task cannot be preempted and a higher +priority task must wait for preemption to be enabled again +before it can preempt a lower priority task. + +The preemptoff tracer traces the places that disable preemption. +Like the irqsoff tracer, it records the maximum latency for +which preemption was disabled. The control of preemptoff tracer +is much like the irqsoff tracer. + + # echo preemptoff > /debug/tracing/current_tracer + # echo 0 > /debug/tracing/tracing_max_latency + # echo 1 > /debug/tracing/tracing_enabled + # ls -ltr + [...] + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/latency_trace +# tracer: preemptoff +# +preemptoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 29 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: do_IRQ + => ended at: __do_softirq + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + sshd-4261 0d.h. 0us+: irq_enter (do_IRQ) + sshd-4261 0d.s. 29us : _local_bh_enable (__do_softirq) + sshd-4261 0d.s1 30us : trace_preempt_on (__do_softirq) + + +This has some more changes. Preemption was disabled when an +interrupt came in (notice the 'h'), and was enabled while doing +a softirq. (notice the 's'). But we also see that interrupts +have been disabled when entering the preempt off section and +leaving it (the 'd'). We do not know if interrupts were enabled +in the mean time. + +# tracer: preemptoff +# +preemptoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 63 us, #87/87, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: remove_wait_queue + => ended at: __do_softirq + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + sshd-4261 0d..1 0us : _spin_lock_irqsave (remove_wait_queue) + sshd-4261 0d..1 1us : _spin_unlock_irqrestore (remove_wait_queue) + sshd-4261 0d..1 2us : do_IRQ (common_interrupt) + sshd-4261 0d..1 2us : irq_enter (do_IRQ) + sshd-4261 0d..1 2us : idle_cpu (irq_enter) + sshd-4261 0d..1 3us : add_preempt_count (irq_enter) + sshd-4261 0d.h1 3us : idle_cpu (irq_enter) + sshd-4261 0d.h. 4us : handle_fasteoi_irq (do_IRQ) +[...] + sshd-4261 0d.h. 12us : add_preempt_count (_spin_lock) + sshd-4261 0d.h1 12us : ack_ioapic_quirk_irq (handle_fasteoi_irq) + sshd-4261 0d.h1 13us : move_native_irq (ack_ioapic_quirk_irq) + sshd-4261 0d.h1 13us : _spin_unlock (handle_fasteoi_irq) + sshd-4261 0d.h1 14us : sub_preempt_count (_spin_unlock) + sshd-4261 0d.h1 14us : irq_exit (do_IRQ) + sshd-4261 0d.h1 15us : sub_preempt_count (irq_exit) + sshd-4261 0d..2 15us : do_softirq (irq_exit) + sshd-4261 0d... 15us : __do_softirq (do_softirq) + sshd-4261 0d... 16us : __local_bh_disable (__do_softirq) + sshd-4261 0d... 16us+: add_preempt_count (__local_bh_disable) + sshd-4261 0d.s4 20us : add_preempt_count (__local_bh_disable) + sshd-4261 0d.s4 21us : sub_preempt_count (local_bh_enable) + sshd-4261 0d.s5 21us : sub_preempt_count (local_bh_enable) +[...] + sshd-4261 0d.s6 41us : add_preempt_count (__local_bh_disable) + sshd-4261 0d.s6 42us : sub_preempt_count (local_bh_enable) + sshd-4261 0d.s7 42us : sub_preempt_count (local_bh_enable) + sshd-4261 0d.s5 43us : add_preempt_count (__local_bh_disable) + sshd-4261 0d.s5 43us : sub_preempt_count (local_bh_enable_ip) + sshd-4261 0d.s6 44us : sub_preempt_count (local_bh_enable_ip) + sshd-4261 0d.s5 44us : add_preempt_count (__local_bh_disable) + sshd-4261 0d.s5 45us : sub_preempt_count (local_bh_enable) +[...] + sshd-4261 0d.s. 63us : _local_bh_enable (__do_softirq) + sshd-4261 0d.s1 64us : trace_preempt_on (__do_softirq) + + +The above is an example of the preemptoff trace with +ftrace_enabled set. Here we see that interrupts were disabled +the entire time. The irq_enter code lets us know that we entered +an interrupt 'h'. Before that, the functions being traced still +show that it is not in an interrupt, but we can see from the +functions themselves that this is not the case. + +Notice that __do_softirq when called does not have a +preempt_count. It may seem that we missed a preempt enabling. +What really happened is that the preempt count is held on the +thread's stack and we switched to the softirq stack (4K stacks +in effect). The code does not copy the preempt count, but +because interrupts are disabled, we do not need to worry about +it. Having a tracer like this is good for letting people know +what really happens inside the kernel. + + +preemptirqsoff +-------------- + +Knowing the locations that have interrupts disabled or +preemption disabled for the longest times is helpful. But +sometimes we would like to know when either preemption and/or +interrupts are disabled. + +Consider the following code: + + local_irq_disable(); + call_function_with_irqs_off(); + preempt_disable(); + call_function_with_irqs_and_preemption_off(); + local_irq_enable(); + call_function_with_preemption_off(); + preempt_enable(); + +The irqsoff tracer will record the total length of +call_function_with_irqs_off() and +call_function_with_irqs_and_preemption_off(). + +The preemptoff tracer will record the total length of +call_function_with_irqs_and_preemption_off() and +call_function_with_preemption_off(). + +But neither will trace the time that interrupts and/or +preemption is disabled. This total time is the time that we can +not schedule. To record this time, use the preemptirqsoff +tracer. + +Again, using this trace is much like the irqsoff and preemptoff +tracers. + + # echo preemptirqsoff > /debug/tracing/current_tracer + # echo 0 > /debug/tracing/tracing_max_latency + # echo 1 > /debug/tracing/tracing_enabled + # ls -ltr + [...] + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/latency_trace +# tracer: preemptirqsoff +# +preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 293 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: ls-4860 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: apic_timer_interrupt + => ended at: __do_softirq + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + ls-4860 0d... 0us!: trace_hardirqs_off_thunk (apic_timer_interrupt) + ls-4860 0d.s. 294us : _local_bh_enable (__do_softirq) + ls-4860 0d.s1 294us : trace_preempt_on (__do_softirq) + + + +The trace_hardirqs_off_thunk is called from assembly on x86 when +interrupts are disabled in the assembly code. Without the +function tracing, we do not know if interrupts were enabled +within the preemption points. We do see that it started with +preemption enabled. + +Here is a trace with ftrace_enabled set: + + +# tracer: preemptirqsoff +# +preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 105 us, #183/183, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) + ----------------- + => started at: write_chan + => ended at: __do_softirq + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + ls-4473 0.N.. 0us : preempt_schedule (write_chan) + ls-4473 0dN.1 1us : _spin_lock (schedule) + ls-4473 0dN.1 2us : add_preempt_count (_spin_lock) + ls-4473 0d..2 2us : put_prev_task_fair (schedule) +[...] + ls-4473 0d..2 13us : set_normalized_timespec (ktime_get_ts) + ls-4473 0d..2 13us : __switch_to (schedule) + sshd-4261 0d..2 14us : finish_task_switch (schedule) + sshd-4261 0d..2 14us : _spin_unlock_irq (finish_task_switch) + sshd-4261 0d..1 15us : add_preempt_count (_spin_lock_irqsave) + sshd-4261 0d..2 16us : _spin_unlock_irqrestore (hrtick_set) + sshd-4261 0d..2 16us : do_IRQ (common_interrupt) + sshd-4261 0d..2 17us : irq_enter (do_IRQ) + sshd-4261 0d..2 17us : idle_cpu (irq_enter) + sshd-4261 0d..2 18us : add_preempt_count (irq_enter) + sshd-4261 0d.h2 18us : idle_cpu (irq_enter) + sshd-4261 0d.h. 18us : handle_fasteoi_irq (do_IRQ) + sshd-4261 0d.h. 19us : _spin_lock (handle_fasteoi_irq) + sshd-4261 0d.h. 19us : add_preempt_count (_spin_lock) + sshd-4261 0d.h1 20us : _spin_unlock (handle_fasteoi_irq) + sshd-4261 0d.h1 20us : sub_preempt_count (_spin_unlock) +[...] + sshd-4261 0d.h1 28us : _spin_unlock (handle_fasteoi_irq) + sshd-4261 0d.h1 29us : sub_preempt_count (_spin_unlock) + sshd-4261 0d.h2 29us : irq_exit (do_IRQ) + sshd-4261 0d.h2 29us : sub_preempt_count (irq_exit) + sshd-4261 0d..3 30us : do_softirq (irq_exit) + sshd-4261 0d... 30us : __do_softirq (do_softirq) + sshd-4261 0d... 31us : __local_bh_disable (__do_softirq) + sshd-4261 0d... 31us+: add_preempt_count (__local_bh_disable) + sshd-4261 0d.s4 34us : add_preempt_count (__local_bh_disable) +[...] + sshd-4261 0d.s3 43us : sub_preempt_count (local_bh_enable_ip) + sshd-4261 0d.s4 44us : sub_preempt_count (local_bh_enable_ip) + sshd-4261 0d.s3 44us : smp_apic_timer_interrupt (apic_timer_interrupt) + sshd-4261 0d.s3 45us : irq_enter (smp_apic_timer_interrupt) + sshd-4261 0d.s3 45us : idle_cpu (irq_enter) + sshd-4261 0d.s3 46us : add_preempt_count (irq_enter) + sshd-4261 0d.H3 46us : idle_cpu (irq_enter) + sshd-4261 0d.H3 47us : hrtimer_interrupt (smp_apic_timer_interrupt) + sshd-4261 0d.H3 47us : ktime_get (hrtimer_interrupt) +[...] + sshd-4261 0d.H3 81us : tick_program_event (hrtimer_interrupt) + sshd-4261 0d.H3 82us : ktime_get (tick_program_event) + sshd-4261 0d.H3 82us : ktime_get_ts (ktime_get) + sshd-4261 0d.H3 83us : getnstimeofday (ktime_get_ts) + sshd-4261 0d.H3 83us : set_normalized_timespec (ktime_get_ts) + sshd-4261 0d.H3 84us : clockevents_program_event (tick_program_event) + sshd-4261 0d.H3 84us : lapic_next_event (clockevents_program_event) + sshd-4261 0d.H3 85us : irq_exit (smp_apic_timer_interrupt) + sshd-4261 0d.H3 85us : sub_preempt_count (irq_exit) + sshd-4261 0d.s4 86us : sub_preempt_count (irq_exit) + sshd-4261 0d.s3 86us : add_preempt_count (__local_bh_disable) +[...] + sshd-4261 0d.s1 98us : sub_preempt_count (net_rx_action) + sshd-4261 0d.s. 99us : add_preempt_count (_spin_lock_irq) + sshd-4261 0d.s1 99us+: _spin_unlock_irq (run_timer_softirq) + sshd-4261 0d.s. 104us : _local_bh_enable (__do_softirq) + sshd-4261 0d.s. 104us : sub_preempt_count (_local_bh_enable) + sshd-4261 0d.s. 105us : _local_bh_enable (__do_softirq) + sshd-4261 0d.s1 105us : trace_preempt_on (__do_softirq) + + +This is a very interesting trace. It started with the preemption +of the ls task. We see that the task had the "need_resched" bit +set via the 'N' in the trace. Interrupts were disabled before +the spin_lock at the beginning of the trace. We see that a +schedule took place to run sshd. When the interrupts were +enabled, we took an interrupt. On return from the interrupt +handler, the softirq ran. We took another interrupt while +running the softirq as we see from the capital 'H'. + + +wakeup +------ + +In a Real-Time environment it is very important to know the +wakeup time it takes for the highest priority task that is woken +up to the time that it executes. This is also known as "schedule +latency". I stress the point that this is about RT tasks. It is +also important to know the scheduling latency of non-RT tasks, +but the average schedule latency is better for non-RT tasks. +Tools like LatencyTop are more appropriate for such +measurements. + +Real-Time environments are interested in the worst case latency. +That is the longest latency it takes for something to happen, +and not the average. We can have a very fast scheduler that may +only have a large latency once in a while, but that would not +work well with Real-Time tasks. The wakeup tracer was designed +to record the worst case wakeups of RT tasks. Non-RT tasks are +not recorded because the tracer only records one worst case and +tracing non-RT tasks that are unpredictable will overwrite the +worst case latency of RT tasks. + +Since this tracer only deals with RT tasks, we will run this +slightly differently than we did with the previous tracers. +Instead of performing an 'ls', we will run 'sleep 1' under +'chrt' which changes the priority of the task. + + # echo wakeup > /debug/tracing/current_tracer + # echo 0 > /debug/tracing/tracing_max_latency + # echo 1 > /debug/tracing/tracing_enabled + # chrt -f 5 sleep 1 + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/latency_trace +# tracer: wakeup +# +wakeup latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 4 us, #2/2, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: sleep-4901 (uid:0 nice:0 policy:1 rt_prio:5) + ----------------- + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / + -0 1d.h4 0us+: try_to_wake_up (wake_up_process) + -0 1d..4 4us : schedule (cpu_idle) + + +Running this on an idle system, we see that it only took 4 +microseconds to perform the task switch. Note, since the trace +marker in the schedule is before the actual "switch", we stop +the tracing when the recorded task is about to schedule in. This +may change if we add a new marker at the end of the scheduler. + +Notice that the recorded task is 'sleep' with the PID of 4901 +and it has an rt_prio of 5. This priority is user-space priority +and not the internal kernel priority. The policy is 1 for +SCHED_FIFO and 2 for SCHED_RR. + +Doing the same with chrt -r 5 and ftrace_enabled set. + +# tracer: wakeup +# +wakeup latency trace v1.1.5 on 2.6.26-rc8 +-------------------------------------------------------------------- + latency: 50 us, #60/60, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) + ----------------- + | task: sleep-4068 (uid:0 nice:0 policy:2 rt_prio:5) + ----------------- + +# _------=> CPU# +# / _-----=> irqs-off +# | / _----=> need-resched +# || / _---=> hardirq/softirq +# ||| / _--=> preempt-depth +# |||| / +# ||||| delay +# cmd pid ||||| time | caller +# \ / ||||| \ | / +ksoftirq-7 1d.H3 0us : try_to_wake_up (wake_up_process) +ksoftirq-7 1d.H4 1us : sub_preempt_count (marker_probe_cb) +ksoftirq-7 1d.H3 2us : check_preempt_wakeup (try_to_wake_up) +ksoftirq-7 1d.H3 3us : update_curr (check_preempt_wakeup) +ksoftirq-7 1d.H3 4us : calc_delta_mine (update_curr) +ksoftirq-7 1d.H3 5us : __resched_task (check_preempt_wakeup) +ksoftirq-7 1d.H3 6us : task_wake_up_rt (try_to_wake_up) +ksoftirq-7 1d.H3 7us : _spin_unlock_irqrestore (try_to_wake_up) +[...] +ksoftirq-7 1d.H2 17us : irq_exit (smp_apic_timer_interrupt) +ksoftirq-7 1d.H2 18us : sub_preempt_count (irq_exit) +ksoftirq-7 1d.s3 19us : sub_preempt_count (irq_exit) +ksoftirq-7 1..s2 20us : rcu_process_callbacks (__do_softirq) +[...] +ksoftirq-7 1..s2 26us : __rcu_process_callbacks (rcu_process_callbacks) +ksoftirq-7 1d.s2 27us : _local_bh_enable (__do_softirq) +ksoftirq-7 1d.s2 28us : sub_preempt_count (_local_bh_enable) +ksoftirq-7 1.N.3 29us : sub_preempt_count (ksoftirqd) +ksoftirq-7 1.N.2 30us : _cond_resched (ksoftirqd) +ksoftirq-7 1.N.2 31us : __cond_resched (_cond_resched) +ksoftirq-7 1.N.2 32us : add_preempt_count (__cond_resched) +ksoftirq-7 1.N.2 33us : schedule (__cond_resched) +ksoftirq-7 1.N.2 33us : add_preempt_count (schedule) +ksoftirq-7 1.N.3 34us : hrtick_clear (schedule) +ksoftirq-7 1dN.3 35us : _spin_lock (schedule) +ksoftirq-7 1dN.3 36us : add_preempt_count (_spin_lock) +ksoftirq-7 1d..4 37us : put_prev_task_fair (schedule) +ksoftirq-7 1d..4 38us : update_curr (put_prev_task_fair) +[...] +ksoftirq-7 1d..5 47us : _spin_trylock (tracing_record_cmdline) +ksoftirq-7 1d..5 48us : add_preempt_count (_spin_trylock) +ksoftirq-7 1d..6 49us : _spin_unlock (tracing_record_cmdline) +ksoftirq-7 1d..6 49us : sub_preempt_count (_spin_unlock) +ksoftirq-7 1d..4 50us : schedule (__cond_resched) + +The interrupt went off while running ksoftirqd. This task runs +at SCHED_OTHER. Why did not we see the 'N' set early? This may +be a harmless bug with x86_32 and 4K stacks. On x86_32 with 4K +stacks configured, the interrupt and softirq run with their own +stack. Some information is held on the top of the task's stack +(need_resched and preempt_count are both stored there). The +setting of the NEED_RESCHED bit is done directly to the task's +stack, but the reading of the NEED_RESCHED is done by looking at +the current stack, which in this case is the stack for the hard +interrupt. This hides the fact that NEED_RESCHED has been set. +We do not see the 'N' until we switch back to the task's +assigned stack. + +function +-------- + +This tracer is the function tracer. Enabling the function tracer +can be done from the debug file system. Make sure the +ftrace_enabled is set; otherwise this tracer is a nop. + + # sysctl kernel.ftrace_enabled=1 + # echo function > /debug/tracing/current_tracer + # echo 1 > /debug/tracing/tracing_enabled + # usleep 1 + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/trace +# tracer: function +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + bash-4003 [00] 123.638713: finish_task_switch <-schedule + bash-4003 [00] 123.638714: _spin_unlock_irq <-finish_task_switch + bash-4003 [00] 123.638714: sub_preempt_count <-_spin_unlock_irq + bash-4003 [00] 123.638715: hrtick_set <-schedule + bash-4003 [00] 123.638715: _spin_lock_irqsave <-hrtick_set + bash-4003 [00] 123.638716: add_preempt_count <-_spin_lock_irqsave + bash-4003 [00] 123.638716: _spin_unlock_irqrestore <-hrtick_set + bash-4003 [00] 123.638717: sub_preempt_count <-_spin_unlock_irqrestore + bash-4003 [00] 123.638717: hrtick_clear <-hrtick_set + bash-4003 [00] 123.638718: sub_preempt_count <-schedule + bash-4003 [00] 123.638718: sub_preempt_count <-preempt_schedule + bash-4003 [00] 123.638719: wait_for_completion <-__stop_machine_run + bash-4003 [00] 123.638719: wait_for_common <-wait_for_completion + bash-4003 [00] 123.638720: _spin_lock_irq <-wait_for_common + bash-4003 [00] 123.638720: add_preempt_count <-_spin_lock_irq +[...] + + +Note: function tracer uses ring buffers to store the above +entries. The newest data may overwrite the oldest data. +Sometimes using echo to stop the trace is not sufficient because +the tracing could have overwritten the data that you wanted to +record. For this reason, it is sometimes better to disable +tracing directly from a program. This allows you to stop the +tracing at the point that you hit the part that you are +interested in. To disable the tracing directly from a C program, +something like following code snippet can be used: + +int trace_fd; +[...] +int main(int argc, char *argv[]) { + [...] + trace_fd = open("/debug/tracing/tracing_enabled", O_WRONLY); + [...] + if (condition_hit()) { + write(trace_fd, "0", 1); + } + [...] +} + +Note: Here we hard coded the path name. The debugfs mount is not +guaranteed to be at /debug (and is more commonly at +/sys/kernel/debug). For simple one time traces, the above is +sufficent. For anything else, a search through /proc/mounts may +be needed to find where the debugfs file-system is mounted. + + +Single thread tracing +--------------------- + +By writing into /debug/tracing/set_ftrace_pid you can trace a +single thread. For example: + +# cat /debug/tracing/set_ftrace_pid +no pid +# echo 3111 > /debug/tracing/set_ftrace_pid +# cat /debug/tracing/set_ftrace_pid +3111 +# echo function > /debug/tracing/current_tracer +# cat /debug/tracing/trace | head + # tracer: function + # + # TASK-PID CPU# TIMESTAMP FUNCTION + # | | | | | + yum-updatesd-3111 [003] 1637.254676: finish_task_switch <-thread_return + yum-updatesd-3111 [003] 1637.254681: hrtimer_cancel <-schedule_hrtimeout_range + yum-updatesd-3111 [003] 1637.254682: hrtimer_try_to_cancel <-hrtimer_cancel + yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel + yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll + yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll +# echo -1 > /debug/tracing/set_ftrace_pid +# cat /debug/tracing/trace |head + # tracer: function + # + # TASK-PID CPU# TIMESTAMP FUNCTION + # | | | | | + ##### CPU 3 buffer started #### + yum-updatesd-3111 [003] 1701.957688: free_poll_entry <-poll_freewait + yum-updatesd-3111 [003] 1701.957689: remove_wait_queue <-free_poll_entry + yum-updatesd-3111 [003] 1701.957691: fput <-free_poll_entry + yum-updatesd-3111 [003] 1701.957692: audit_syscall_exit <-sysret_audit + yum-updatesd-3111 [003] 1701.957693: path_put <-audit_syscall_exit + +If you want to trace a function when executing, you could use +something like this simple program: + +#include +#include +#include +#include +#include +#include + +int main (int argc, char **argv) +{ + if (argc < 1) + exit(-1); + + if (fork() > 0) { + int fd, ffd; + char line[64]; + int s; + + ffd = open("/debug/tracing/current_tracer", O_WRONLY); + if (ffd < 0) + exit(-1); + write(ffd, "nop", 3); + + fd = open("/debug/tracing/set_ftrace_pid", O_WRONLY); + s = sprintf(line, "%d\n", getpid()); + write(fd, line, s); + + write(ffd, "function", 8); + + close(fd); + close(ffd); + + execvp(argv[1], argv+1); + } + + return 0; +} + + +hw-branch-tracer (x86 only) +--------------------------- + +This tracer uses the x86 last branch tracing hardware feature to +collect a branch trace on all cpus with relatively low overhead. + +The tracer uses a fixed-size circular buffer per cpu and only +traces ring 0 branches. The trace file dumps that buffer in the +following format: + +# tracer: hw-branch-tracer +# +# CPU# TO <- FROM + 0 scheduler_tick+0xb5/0x1bf <- task_tick_idle+0x5/0x6 + 2 run_posix_cpu_timers+0x2b/0x72a <- run_posix_cpu_timers+0x25/0x72a + 0 scheduler_tick+0x139/0x1bf <- scheduler_tick+0xed/0x1bf + 0 scheduler_tick+0x17c/0x1bf <- scheduler_tick+0x148/0x1bf + 2 run_posix_cpu_timers+0x9e/0x72a <- run_posix_cpu_timers+0x5e/0x72a + 0 scheduler_tick+0x1b6/0x1bf <- scheduler_tick+0x1aa/0x1bf + + +The tracer may be used to dump the trace for the oops'ing cpu on +a kernel oops into the system log. To enable this, +ftrace_dump_on_oops must be set. To set ftrace_dump_on_oops, one +can either use the sysctl function or set it via the proc system +interface. + + sysctl kernel.ftrace_dump_on_oops=1 + +or + + echo 1 > /proc/sys/kernel/ftrace_dump_on_oops + + +Here's an example of such a dump after a null pointer +dereference in a kernel module: + +[57848.105921] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 +[57848.106019] IP: [] open+0x6/0x14 [oops] +[57848.106019] PGD 2354e9067 PUD 2375e7067 PMD 0 +[57848.106019] Oops: 0002 [#1] SMP +[57848.106019] last sysfs file: /sys/devices/pci0000:00/0000:00:1e.0/0000:20:05.0/local_cpus +[57848.106019] Dumping ftrace buffer: +[57848.106019] --------------------------------- +[...] +[57848.106019] 0 chrdev_open+0xe6/0x165 <- cdev_put+0x23/0x24 +[57848.106019] 0 chrdev_open+0x117/0x165 <- chrdev_open+0xfa/0x165 +[57848.106019] 0 chrdev_open+0x120/0x165 <- chrdev_open+0x11c/0x165 +[57848.106019] 0 chrdev_open+0x134/0x165 <- chrdev_open+0x12b/0x165 +[57848.106019] 0 open+0x0/0x14 [oops] <- chrdev_open+0x144/0x165 +[57848.106019] 0 page_fault+0x0/0x30 <- open+0x6/0x14 [oops] +[57848.106019] 0 error_entry+0x0/0x5b <- page_fault+0x4/0x30 +[57848.106019] 0 error_kernelspace+0x0/0x31 <- error_entry+0x59/0x5b +[57848.106019] 0 error_sti+0x0/0x1 <- error_kernelspace+0x2d/0x31 +[57848.106019] 0 page_fault+0x9/0x30 <- error_sti+0x0/0x1 +[57848.106019] 0 do_page_fault+0x0/0x881 <- page_fault+0x1a/0x30 +[...] +[57848.106019] 0 do_page_fault+0x66b/0x881 <- is_prefetch+0x1ee/0x1f2 +[57848.106019] 0 do_page_fault+0x6e0/0x881 <- do_page_fault+0x67a/0x881 +[57848.106019] 0 oops_begin+0x0/0x96 <- do_page_fault+0x6e0/0x881 +[57848.106019] 0 trace_hw_branch_oops+0x0/0x2d <- oops_begin+0x9/0x96 +[...] +[57848.106019] 0 ds_suspend_bts+0x2a/0xe3 <- ds_suspend_bts+0x1a/0xe3 +[57848.106019] --------------------------------- +[57848.106019] CPU 0 +[57848.106019] Modules linked in: oops +[57848.106019] Pid: 5542, comm: cat Tainted: G W 2.6.28 #23 +[57848.106019] RIP: 0010:[] [] open+0x6/0x14 [oops] +[57848.106019] RSP: 0018:ffff880235457d48 EFLAGS: 00010246 +[...] + + +function graph tracer +--------------------------- + +This tracer is similar to the function tracer except that it +probes a function on its entry and its exit. This is done by +using a dynamically allocated stack of return addresses in each +task_struct. On function entry the tracer overwrites the return +address of each function traced to set a custom probe. Thus the +original return address is stored on the stack of return address +in the task_struct. + +Probing on both ends of a function leads to special features +such as: + +- measure of a function's time execution +- having a reliable call stack to draw function calls graph + +This tracer is useful in several situations: + +- you want to find the reason of a strange kernel behavior and + need to see what happens in detail on any areas (or specific + ones). + +- you are experiencing weird latencies but it's difficult to + find its origin. + +- you want to find quickly which path is taken by a specific + function + +- you just want to peek inside a working kernel and want to see + what happens there. + +# tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + + 0) | sys_open() { + 0) | do_sys_open() { + 0) | getname() { + 0) | kmem_cache_alloc() { + 0) 1.382 us | __might_sleep(); + 0) 2.478 us | } + 0) | strncpy_from_user() { + 0) | might_fault() { + 0) 1.389 us | __might_sleep(); + 0) 2.553 us | } + 0) 3.807 us | } + 0) 7.876 us | } + 0) | alloc_fd() { + 0) 0.668 us | _spin_lock(); + 0) 0.570 us | expand_files(); + 0) 0.586 us | _spin_unlock(); + + +There are several columns that can be dynamically +enabled/disabled. You can use every combination of options you +want, depending on your needs. + +- The cpu number on which the function executed is default + enabled. It is sometimes better to only trace one cpu (see + tracing_cpu_mask file) or you might sometimes see unordered + function calls while cpu tracing switch. + + hide: echo nofuncgraph-cpu > /debug/tracing/trace_options + show: echo funcgraph-cpu > /debug/tracing/trace_options + +- The duration (function's time of execution) is displayed on + the closing bracket line of a function or on the same line + than the current function in case of a leaf one. It is default + enabled. + + hide: echo nofuncgraph-duration > /debug/tracing/trace_options + show: echo funcgraph-duration > /debug/tracing/trace_options + +- The overhead field precedes the duration field in case of + reached duration thresholds. + + hide: echo nofuncgraph-overhead > /debug/tracing/trace_options + show: echo funcgraph-overhead > /debug/tracing/trace_options + depends on: funcgraph-duration + + ie: + + 0) | up_write() { + 0) 0.646 us | _spin_lock_irqsave(); + 0) 0.684 us | _spin_unlock_irqrestore(); + 0) 3.123 us | } + 0) 0.548 us | fput(); + 0) + 58.628 us | } + + [...] + + 0) | putname() { + 0) | kmem_cache_free() { + 0) 0.518 us | __phys_addr(); + 0) 1.757 us | } + 0) 2.861 us | } + 0) ! 115.305 us | } + 0) ! 116.402 us | } + + + means that the function exceeded 10 usecs. + ! means that the function exceeded 100 usecs. + + +- The task/pid field displays the thread cmdline and pid which + executed the function. It is default disabled. + + hide: echo nofuncgraph-proc > /debug/tracing/trace_options + show: echo funcgraph-proc > /debug/tracing/trace_options + + ie: + + # tracer: function_graph + # + # CPU TASK/PID DURATION FUNCTION CALLS + # | | | | | | | | | + 0) sh-4802 | | d_free() { + 0) sh-4802 | | call_rcu() { + 0) sh-4802 | | __call_rcu() { + 0) sh-4802 | 0.616 us | rcu_process_gp_end(); + 0) sh-4802 | 0.586 us | check_for_new_grace_period(); + 0) sh-4802 | 2.899 us | } + 0) sh-4802 | 4.040 us | } + 0) sh-4802 | 5.151 us | } + 0) sh-4802 | + 49.370 us | } + + +- The absolute time field is an absolute timestamp given by the + system clock since it started. A snapshot of this time is + given on each entry/exit of functions + + hide: echo nofuncgraph-abstime > /debug/tracing/trace_options + show: echo funcgraph-abstime > /debug/tracing/trace_options + + ie: + + # + # TIME CPU DURATION FUNCTION CALLS + # | | | | | | | | + 360.774522 | 1) 0.541 us | } + 360.774522 | 1) 4.663 us | } + 360.774523 | 1) 0.541 us | __wake_up_bit(); + 360.774524 | 1) 6.796 us | } + 360.774524 | 1) 7.952 us | } + 360.774525 | 1) 9.063 us | } + 360.774525 | 1) 0.615 us | journal_mark_dirty(); + 360.774527 | 1) 0.578 us | __brelse(); + 360.774528 | 1) | reiserfs_prepare_for_journal() { + 360.774528 | 1) | unlock_buffer() { + 360.774529 | 1) | wake_up_bit() { + 360.774529 | 1) | bit_waitqueue() { + 360.774530 | 1) 0.594 us | __phys_addr(); + + +You can put some comments on specific functions by using +trace_printk() For example, if you want to put a comment inside +the __might_sleep() function, you just have to include + and call trace_printk() inside __might_sleep() + +trace_printk("I'm a comment!\n") + +will produce: + + 1) | __might_sleep() { + 1) | /* I'm a comment! */ + 1) 1.449 us | } + + +You might find other useful features for this tracer in the +following "dynamic ftrace" section such as tracing only specific +functions or tasks. + +dynamic ftrace +-------------- + +If CONFIG_DYNAMIC_FTRACE is set, the system will run with +virtually no overhead when function tracing is disabled. The way +this works is the mcount function call (placed at the start of +every kernel function, produced by the -pg switch in gcc), +starts of pointing to a simple return. (Enabling FTRACE will +include the -pg switch in the compiling of the kernel.) + +At compile time every C file object is run through the +recordmcount.pl script (located in the scripts directory). This +script will process the C object using objdump to find all the +locations in the .text section that call mcount. (Note, only the +.text section is processed, since processing other sections like +.init.text may cause races due to those sections being freed). + +A new section called "__mcount_loc" is created that holds +references to all the mcount call sites in the .text section. +This section is compiled back into the original object. The +final linker will add all these references into a single table. + +On boot up, before SMP is initialized, the dynamic ftrace code +scans this table and updates all the locations into nops. It +also records the locations, which are added to the +available_filter_functions list. Modules are processed as they +are loaded and before they are executed. When a module is +unloaded, it also removes its functions from the ftrace function +list. This is automatic in the module unload code, and the +module author does not need to worry about it. + +When tracing is enabled, kstop_machine is called to prevent +races with the CPUS executing code being modified (which can +cause the CPU to do undesireable things), and the nops are +patched back to calls. But this time, they do not call mcount +(which is just a function stub). They now call into the ftrace +infrastructure. + +One special side-effect to the recording of the functions being +traced is that we can now selectively choose which functions we +wish to trace and which ones we want the mcount calls to remain +as nops. + +Two files are used, one for enabling and one for disabling the +tracing of specified functions. They are: + + set_ftrace_filter + +and + + set_ftrace_notrace + +A list of available functions that you can add to these files is +listed in: + + available_filter_functions + + # cat /debug/tracing/available_filter_functions +put_prev_task_idle +kmem_cache_create +pick_next_task_rt +get_online_cpus +pick_next_task_fair +mutex_lock +[...] + +If I am only interested in sys_nanosleep and hrtimer_interrupt: + + # echo sys_nanosleep hrtimer_interrupt \ + > /debug/tracing/set_ftrace_filter + # echo ftrace > /debug/tracing/current_tracer + # echo 1 > /debug/tracing/tracing_enabled + # usleep 1 + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/trace +# tracer: ftrace +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + usleep-4134 [00] 1317.070017: hrtimer_interrupt <-smp_apic_timer_interrupt + usleep-4134 [00] 1317.070111: sys_nanosleep <-syscall_call + -0 [00] 1317.070115: hrtimer_interrupt <-smp_apic_timer_interrupt + +To see which functions are being traced, you can cat the file: + + # cat /debug/tracing/set_ftrace_filter +hrtimer_interrupt +sys_nanosleep + + +Perhaps this is not enough. The filters also allow simple wild +cards. Only the following are currently available + + * - will match functions that begin with + * - will match functions that end with + ** - will match functions that have in it + +These are the only wild cards which are supported. + + * will not work. + +Note: It is better to use quotes to enclose the wild cards, + otherwise the shell may expand the parameters into names + of files in the local directory. + + # echo 'hrtimer_*' > /debug/tracing/set_ftrace_filter + +Produces: + +# tracer: ftrace +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + bash-4003 [00] 1480.611794: hrtimer_init <-copy_process + bash-4003 [00] 1480.611941: hrtimer_start <-hrtick_set + bash-4003 [00] 1480.611956: hrtimer_cancel <-hrtick_clear + bash-4003 [00] 1480.611956: hrtimer_try_to_cancel <-hrtimer_cancel + -0 [00] 1480.612019: hrtimer_get_next_event <-get_next_timer_interrupt + -0 [00] 1480.612025: hrtimer_get_next_event <-get_next_timer_interrupt + -0 [00] 1480.612032: hrtimer_get_next_event <-get_next_timer_interrupt + -0 [00] 1480.612037: hrtimer_get_next_event <-get_next_timer_interrupt + -0 [00] 1480.612382: hrtimer_get_next_event <-get_next_timer_interrupt + + +Notice that we lost the sys_nanosleep. + + # cat /debug/tracing/set_ftrace_filter +hrtimer_run_queues +hrtimer_run_pending +hrtimer_init +hrtimer_cancel +hrtimer_try_to_cancel +hrtimer_forward +hrtimer_start +hrtimer_reprogram +hrtimer_force_reprogram +hrtimer_get_next_event +hrtimer_interrupt +hrtimer_nanosleep +hrtimer_wakeup +hrtimer_get_remaining +hrtimer_get_res +hrtimer_init_sleeper + + +This is because the '>' and '>>' act just like they do in bash. +To rewrite the filters, use '>' +To append to the filters, use '>>' + +To clear out a filter so that all functions will be recorded +again: + + # echo > /debug/tracing/set_ftrace_filter + # cat /debug/tracing/set_ftrace_filter + # + +Again, now we want to append. + + # echo sys_nanosleep > /debug/tracing/set_ftrace_filter + # cat /debug/tracing/set_ftrace_filter +sys_nanosleep + # echo 'hrtimer_*' >> /debug/tracing/set_ftrace_filter + # cat /debug/tracing/set_ftrace_filter +hrtimer_run_queues +hrtimer_run_pending +hrtimer_init +hrtimer_cancel +hrtimer_try_to_cancel +hrtimer_forward +hrtimer_start +hrtimer_reprogram +hrtimer_force_reprogram +hrtimer_get_next_event +hrtimer_interrupt +sys_nanosleep +hrtimer_nanosleep +hrtimer_wakeup +hrtimer_get_remaining +hrtimer_get_res +hrtimer_init_sleeper + + +The set_ftrace_notrace prevents those functions from being +traced. + + # echo '*preempt*' '*lock*' > /debug/tracing/set_ftrace_notrace + +Produces: + +# tracer: ftrace +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + bash-4043 [01] 115.281644: finish_task_switch <-schedule + bash-4043 [01] 115.281645: hrtick_set <-schedule + bash-4043 [01] 115.281645: hrtick_clear <-hrtick_set + bash-4043 [01] 115.281646: wait_for_completion <-__stop_machine_run + bash-4043 [01] 115.281647: wait_for_common <-wait_for_completion + bash-4043 [01] 115.281647: kthread_stop <-stop_machine_run + bash-4043 [01] 115.281648: init_waitqueue_head <-kthread_stop + bash-4043 [01] 115.281648: wake_up_process <-kthread_stop + bash-4043 [01] 115.281649: try_to_wake_up <-wake_up_process + +We can see that there's no more lock or preempt tracing. + + +Dynamic ftrace with the function graph tracer +--------------------------------------------- + +Although what has been explained above concerns both the +function tracer and the function-graph-tracer, there are some +special features only available in the function-graph tracer. + +If you want to trace only one function and all of its children, +you just have to echo its name into set_graph_function: + + echo __do_fault > set_graph_function + +will produce the following "expanded" trace of the __do_fault() +function: + + 0) | __do_fault() { + 0) | filemap_fault() { + 0) | find_lock_page() { + 0) 0.804 us | find_get_page(); + 0) | __might_sleep() { + 0) 1.329 us | } + 0) 3.904 us | } + 0) 4.979 us | } + 0) 0.653 us | _spin_lock(); + 0) 0.578 us | page_add_file_rmap(); + 0) 0.525 us | native_set_pte_at(); + 0) 0.585 us | _spin_unlock(); + 0) | unlock_page() { + 0) 0.541 us | page_waitqueue(); + 0) 0.639 us | __wake_up_bit(); + 0) 2.786 us | } + 0) + 14.237 us | } + 0) | __do_fault() { + 0) | filemap_fault() { + 0) | find_lock_page() { + 0) 0.698 us | find_get_page(); + 0) | __might_sleep() { + 0) 1.412 us | } + 0) 3.950 us | } + 0) 5.098 us | } + 0) 0.631 us | _spin_lock(); + 0) 0.571 us | page_add_file_rmap(); + 0) 0.526 us | native_set_pte_at(); + 0) 0.586 us | _spin_unlock(); + 0) | unlock_page() { + 0) 0.533 us | page_waitqueue(); + 0) 0.638 us | __wake_up_bit(); + 0) 2.793 us | } + 0) + 14.012 us | } + +You can also expand several functions at once: + + echo sys_open > set_graph_function + echo sys_close >> set_graph_function + +Now if you want to go back to trace all functions you can clear +this special filter via: + + echo > set_graph_function + + +trace_pipe +---------- + +The trace_pipe outputs the same content as the trace file, but +the effect on the tracing is different. Every read from +trace_pipe is consumed. This means that subsequent reads will be +different. The trace is live. + + # echo function > /debug/tracing/current_tracer + # cat /debug/tracing/trace_pipe > /tmp/trace.out & +[1] 4153 + # echo 1 > /debug/tracing/tracing_enabled + # usleep 1 + # echo 0 > /debug/tracing/tracing_enabled + # cat /debug/tracing/trace +# tracer: function +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | + + # + # cat /tmp/trace.out + bash-4043 [00] 41.267106: finish_task_switch <-schedule + bash-4043 [00] 41.267106: hrtick_set <-schedule + bash-4043 [00] 41.267107: hrtick_clear <-hrtick_set + bash-4043 [00] 41.267108: wait_for_completion <-__stop_machine_run + bash-4043 [00] 41.267108: wait_for_common <-wait_for_completion + bash-4043 [00] 41.267109: kthread_stop <-stop_machine_run + bash-4043 [00] 41.267109: init_waitqueue_head <-kthread_stop + bash-4043 [00] 41.267110: wake_up_process <-kthread_stop + bash-4043 [00] 41.267110: try_to_wake_up <-wake_up_process + bash-4043 [00] 41.267111: select_task_rq_rt <-try_to_wake_up + + +Note, reading the trace_pipe file will block until more input is +added. By changing the tracer, trace_pipe will issue an EOF. We +needed to set the function tracer _before_ we "cat" the +trace_pipe file. + + +trace entries +------------- + +Having too much or not enough data can be troublesome in +diagnosing an issue in the kernel. The file buffer_size_kb is +used to modify the size of the internal trace buffers. The +number listed is the number of entries that can be recorded per +CPU. To know the full size, multiply the number of possible CPUS +with the number of entries. + + # cat /debug/tracing/buffer_size_kb +1408 (units kilobytes) + +Note, to modify this, you must have tracing completely disabled. +To do that, echo "nop" into the current_tracer. If the +current_tracer is not set to "nop", an EINVAL error will be +returned. + + # echo nop > /debug/tracing/current_tracer + # echo 10000 > /debug/tracing/buffer_size_kb + # cat /debug/tracing/buffer_size_kb +10000 (units kilobytes) + +The number of pages which will be allocated is limited to a +percentage of available memory. Allocating too much will produce +an error. + + # echo 1000000000000 > /debug/tracing/buffer_size_kb +-bash: echo: write error: Cannot allocate memory + # cat /debug/tracing/buffer_size_kb +85 + +----------- + +More details can be found in the source code, in the +kernel/tracing/*.c files. diff --git a/Documentation/trace/kmemtrace.txt b/Documentation/trace/kmemtrace.txt new file mode 100644 index 0000000..a956d9b --- /dev/null +++ b/Documentation/trace/kmemtrace.txt @@ -0,0 +1,126 @@ + kmemtrace - Kernel Memory Tracer + + by Eduard - Gabriel Munteanu + + +I. Introduction +=============== + +kmemtrace helps kernel developers figure out two things: +1) how different allocators (SLAB, SLUB etc.) perform +2) how kernel code allocates memory and how much + +To do this, we trace every allocation and export information to the userspace +through the relay interface. We export things such as the number of requested +bytes, the number of bytes actually allocated (i.e. including internal +fragmentation), whether this is a slab allocation or a plain kmalloc() and so +on. + +The actual analysis is performed by a userspace tool (see section III for +details on where to get it from). It logs the data exported by the kernel, +processes it and (as of writing this) can provide the following information: +- the total amount of memory allocated and fragmentation per call-site +- the amount of memory allocated and fragmentation per allocation +- total memory allocated and fragmentation in the collected dataset +- number of cross-CPU allocation and frees (makes sense in NUMA environments) + +Moreover, it can potentially find inconsistent and erroneous behavior in +kernel code, such as using slab free functions on kmalloc'ed memory or +allocating less memory than requested (but not truly failed allocations). + +kmemtrace also makes provisions for tracing on some arch and analysing the +data on another. + +II. Design and goals +==================== + +kmemtrace was designed to handle rather large amounts of data. Thus, it uses +the relay interface to export whatever is logged to userspace, which then +stores it. Analysis and reporting is done asynchronously, that is, after the +data is collected and stored. By design, it allows one to log and analyse +on different machines and different arches. + +As of writing this, the ABI is not considered stable, though it might not +change much. However, no guarantees are made about compatibility yet. When +deemed stable, the ABI should still allow easy extension while maintaining +backward compatibility. This is described further in Documentation/ABI. + +Summary of design goals: + - allow logging and analysis to be done across different machines + - be fast and anticipate usage in high-load environments (*) + - be reasonably extensible + - make it possible for GNU/Linux distributions to have kmemtrace + included in their repositories + +(*) - one of the reasons Pekka Enberg's original userspace data analysis + tool's code was rewritten from Perl to C (although this is more than a + simple conversion) + + +III. Quick usage guide +====================== + +1) Get a kernel that supports kmemtrace and build it accordingly (i.e. enable +CONFIG_KMEMTRACE). + +2) Get the userspace tool and build it: +$ git-clone git://repo.or.cz/kmemtrace-user.git # current repository +$ cd kmemtrace-user/ +$ ./autogen.sh +$ ./configure +$ make + +3) Boot the kmemtrace-enabled kernel if you haven't, preferably in the +'single' runlevel (so that relay buffers don't fill up easily), and run +kmemtrace: +# '$' does not mean user, but root here. +$ mount -t debugfs none /sys/kernel/debug +$ mount -t proc none /proc +$ cd path/to/kmemtrace-user/ +$ ./kmemtraced +Wait a bit, then stop it with CTRL+C. +$ cat /sys/kernel/debug/kmemtrace/total_overruns # Check if we didn't + # overrun, should + # be zero. +$ (Optionally) [Run kmemtrace_check separately on each cpu[0-9]*.out file to + check its correctness] +$ ./kmemtrace-report + +Now you should have a nice and short summary of how the allocator performs. + +IV. FAQ and known issues +======================== + +Q: 'cat /sys/kernel/debug/kmemtrace/total_overruns' is non-zero, how do I fix +this? Should I worry? +A: If it's non-zero, this affects kmemtrace's accuracy, depending on how +large the number is. You can fix it by supplying a higher +'kmemtrace.subbufs=N' kernel parameter. +--- + +Q: kmemtrace_check reports errors, how do I fix this? Should I worry? +A: This is a bug and should be reported. It can occur for a variety of +reasons: + - possible bugs in relay code + - possible misuse of relay by kmemtrace + - timestamps being collected unorderly +Or you may fix it yourself and send us a patch. +--- + +Q: kmemtrace_report shows many errors, how do I fix this? Should I worry? +A: This is a known issue and I'm working on it. These might be true errors +in kernel code, which may have inconsistent behavior (e.g. allocating memory +with kmem_cache_alloc() and freeing it with kfree()). Pekka Enberg pointed +out this behavior may work with SLAB, but may fail with other allocators. + +It may also be due to lack of tracing in some unusual allocator functions. + +We don't want bug reports regarding this issue yet. +--- + +V. See also +=========== + +Documentation/kernel-parameters.txt +Documentation/ABI/testing/debugfs-kmemtrace + diff --git a/Documentation/trace/mmiotrace.txt b/Documentation/trace/mmiotrace.txt new file mode 100644 index 0000000..5731c67 --- /dev/null +++ b/Documentation/trace/mmiotrace.txt @@ -0,0 +1,163 @@ + In-kernel memory-mapped I/O tracing + + +Home page and links to optional user space tools: + + http://nouveau.freedesktop.org/wiki/MmioTrace + +MMIO tracing was originally developed by Intel around 2003 for their Fault +Injection Test Harness. In Dec 2006 - Jan 2007, using the code from Intel, +Jeff Muizelaar created a tool for tracing MMIO accesses with the Nouveau +project in mind. Since then many people have contributed. + +Mmiotrace was built for reverse engineering any memory-mapped IO device with +the Nouveau project as the first real user. Only x86 and x86_64 architectures +are supported. + +Out-of-tree mmiotrace was originally modified for mainline inclusion and +ftrace framework by Pekka Paalanen . + + +Preparation +----------- + +Mmiotrace feature is compiled in by the CONFIG_MMIOTRACE option. Tracing is +disabled by default, so it is safe to have this set to yes. SMP systems are +supported, but tracing is unreliable and may miss events if more than one CPU +is on-line, therefore mmiotrace takes all but one CPU off-line during run-time +activation. You can re-enable CPUs by hand, but you have been warned, there +is no way to automatically detect if you are losing events due to CPUs racing. + + +Usage Quick Reference +--------------------- + +$ mount -t debugfs debugfs /debug +$ echo mmiotrace > /debug/tracing/current_tracer +$ cat /debug/tracing/trace_pipe > mydump.txt & +Start X or whatever. +$ echo "X is up" > /debug/tracing/trace_marker +$ echo nop > /debug/tracing/current_tracer +Check for lost events. + + +Usage +----- + +Make sure debugfs is mounted to /debug. If not, (requires root privileges) +$ mount -t debugfs debugfs /debug + +Check that the driver you are about to trace is not loaded. + +Activate mmiotrace (requires root privileges): +$ echo mmiotrace > /debug/tracing/current_tracer + +Start storing the trace: +$ cat /debug/tracing/trace_pipe > mydump.txt & +The 'cat' process should stay running (sleeping) in the background. + +Load the driver you want to trace and use it. Mmiotrace will only catch MMIO +accesses to areas that are ioremapped while mmiotrace is active. + +During tracing you can place comments (markers) into the trace by +$ echo "X is up" > /debug/tracing/trace_marker +This makes it easier to see which part of the (huge) trace corresponds to +which action. It is recommended to place descriptive markers about what you +do. + +Shut down mmiotrace (requires root privileges): +$ echo nop > /debug/tracing/current_tracer +The 'cat' process exits. If it does not, kill it by issuing 'fg' command and +pressing ctrl+c. + +Check that mmiotrace did not lose events due to a buffer filling up. Either +$ grep -i lost mydump.txt +which tells you exactly how many events were lost, or use +$ dmesg +to view your kernel log and look for "mmiotrace has lost events" warning. If +events were lost, the trace is incomplete. You should enlarge the buffers and +try again. Buffers are enlarged by first seeing how large the current buffers +are: +$ cat /debug/tracing/buffer_size_kb +gives you a number. Approximately double this number and write it back, for +instance: +$ echo 128000 > /debug/tracing/buffer_size_kb +Then start again from the top. + +If you are doing a trace for a driver project, e.g. Nouveau, you should also +do the following before sending your results: +$ lspci -vvv > lspci.txt +$ dmesg > dmesg.txt +$ tar zcf pciid-nick-mmiotrace.tar.gz mydump.txt lspci.txt dmesg.txt +and then send the .tar.gz file. The trace compresses considerably. Replace +"pciid" and "nick" with the PCI ID or model name of your piece of hardware +under investigation and your nick name. + + +How Mmiotrace Works +------------------- + +Access to hardware IO-memory is gained by mapping addresses from PCI bus by +calling one of the ioremap_*() functions. Mmiotrace is hooked into the +__ioremap() function and gets called whenever a mapping is created. Mapping is +an event that is recorded into the trace log. Note, that ISA range mappings +are not caught, since the mapping always exists and is returned directly. + +MMIO accesses are recorded via page faults. Just before __ioremap() returns, +the mapped pages are marked as not present. Any access to the pages causes a +fault. The page fault handler calls mmiotrace to handle the fault. Mmiotrace +marks the page present, sets TF flag to achieve single stepping and exits the +fault handler. The instruction that faulted is executed and debug trap is +entered. Here mmiotrace again marks the page as not present. The instruction +is decoded to get the type of operation (read/write), data width and the value +read or written. These are stored to the trace log. + +Setting the page present in the page fault handler has a race condition on SMP +machines. During the single stepping other CPUs may run freely on that page +and events can be missed without a notice. Re-enabling other CPUs during +tracing is discouraged. + + +Trace Log Format +---------------- + +The raw log is text and easily filtered with e.g. grep and awk. One record is +one line in the log. A record starts with a keyword, followed by keyword +dependant arguments. Arguments are separated by a space, or continue until the +end of line. The format for version 20070824 is as follows: + +Explanation Keyword Space separated arguments +--------------------------------------------------------------------------- + +read event R width, timestamp, map id, physical, value, PC, PID +write event W width, timestamp, map id, physical, value, PC, PID +ioremap event MAP timestamp, map id, physical, virtual, length, PC, PID +iounmap event UNMAP timestamp, map id, PC, PID +marker MARK timestamp, text +version VERSION the string "20070824" +info for reader LSPCI one line from lspci -v +PCI address map PCIDEV space separated /proc/bus/pci/devices data +unk. opcode UNKNOWN timestamp, map id, physical, data, PC, PID + +Timestamp is in seconds with decimals. Physical is a PCI bus address, virtual +is a kernel virtual address. Width is the data width in bytes and value is the +data value. Map id is an arbitrary id number identifying the mapping that was +used in an operation. PC is the program counter and PID is process id. PC is +zero if it is not recorded. PID is always zero as tracing MMIO accesses +originating in user space memory is not yet supported. + +For instance, the following awk filter will pass all 32-bit writes that target +physical addresses in the range [0xfb73ce40, 0xfb800000[ + +$ awk '/W 4 / { adr=strtonum($5); if (adr >= 0xfb73ce40 && +adr < 0xfb800000) print; }' + + +Tools for Developers +-------------------- + +The user space tools include utilities for: +- replacing numeric addresses and values with hardware register names +- replaying MMIO logs, i.e., re-executing the recorded writes + + diff --git a/Documentation/trace/tracepoints.txt b/Documentation/trace/tracepoints.txt new file mode 100644 index 0000000..c0e1cee --- /dev/null +++ b/Documentation/trace/tracepoints.txt @@ -0,0 +1,116 @@ + Using the Linux Kernel Tracepoints + + Mathieu Desnoyers + + +This document introduces Linux Kernel Tracepoints and their use. It +provides examples of how to insert tracepoints in the kernel and +connect probe functions to them and provides some examples of probe +functions. + + +* Purpose of tracepoints + +A tracepoint placed in code provides a hook to call a function (probe) +that you can provide at runtime. A tracepoint can be "on" (a probe is +connected to it) or "off" (no probe is attached). When a tracepoint is +"off" it has no effect, except for adding a tiny time penalty +(checking a condition for a branch) and space penalty (adding a few +bytes for the function call at the end of the instrumented function +and adds a data structure in a separate section). When a tracepoint +is "on", the function you provide is called each time the tracepoint +is executed, in the execution context of the caller. When the function +provided ends its execution, it returns to the caller (continuing from +the tracepoint site). + +You can put tracepoints at important locations in the code. They are +lightweight hooks that can pass an arbitrary number of parameters, +which prototypes are described in a tracepoint declaration placed in a +header file. + +They can be used for tracing and performance accounting. + + +* Usage + +Two elements are required for tracepoints : + +- A tracepoint definition, placed in a header file. +- The tracepoint statement, in C code. + +In order to use tracepoints, you should include linux/tracepoint.h. + +In include/trace/subsys.h : + +#include + +DECLARE_TRACE(subsys_eventname, + TP_PROTO(int firstarg, struct task_struct *p), + TP_ARGS(firstarg, p)); + +In subsys/file.c (where the tracing statement must be added) : + +#include + +DEFINE_TRACE(subsys_eventname); + +void somefct(void) +{ + ... + trace_subsys_eventname(arg, task); + ... +} + +Where : +- subsys_eventname is an identifier unique to your event + - subsys is the name of your subsystem. + - eventname is the name of the event to trace. + +- TP_PROTO(int firstarg, struct task_struct *p) is the prototype of the + function called by this tracepoint. + +- TP_ARGS(firstarg, p) are the parameters names, same as found in the + prototype. + +Connecting a function (probe) to a tracepoint is done by providing a +probe (function to call) for the specific tracepoint through +register_trace_subsys_eventname(). Removing a probe is done through +unregister_trace_subsys_eventname(); it will remove the probe. + +tracepoint_synchronize_unregister() must be called before the end of +the module exit function to make sure there is no caller left using +the probe. This, and the fact that preemption is disabled around the +probe call, make sure that probe removal and module unload are safe. +See the "Probe example" section below for a sample probe module. + +The tracepoint mechanism supports inserting multiple instances of the +same tracepoint, but a single definition must be made of a given +tracepoint name over all the kernel to make sure no type conflict will +occur. Name mangling of the tracepoints is done using the prototypes +to make sure typing is correct. Verification of probe type correctness +is done at the registration site by the compiler. Tracepoints can be +put in inline functions, inlined static functions, and unrolled loops +as well as regular functions. + +The naming scheme "subsys_event" is suggested here as a convention +intended to limit collisions. Tracepoint names are global to the +kernel: they are considered as being the same whether they are in the +core kernel image or in modules. + +If the tracepoint has to be used in kernel modules, an +EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be +used to export the defined tracepoints. + +* Probe / tracepoint example + +See the example provided in samples/tracepoints + +Compile them with your kernel. They are built during 'make' (not +'make modules') when CONFIG_SAMPLE_TRACEPOINTS=m. + +Run, as root : +modprobe tracepoint-sample (insmod order is not important) +modprobe tracepoint-probe-sample +cat /proc/tracepoint-sample (returns an expected error) +rmmod tracepoint-sample tracepoint-probe-sample +dmesg diff --git a/Documentation/tracepoints.txt b/Documentation/tracepoints.txt deleted file mode 100644 index c0e1cee..0000000 --- a/Documentation/tracepoints.txt +++ /dev/null @@ -1,116 +0,0 @@ - Using the Linux Kernel Tracepoints - - Mathieu Desnoyers - - -This document introduces Linux Kernel Tracepoints and their use. It -provides examples of how to insert tracepoints in the kernel and -connect probe functions to them and provides some examples of probe -functions. - - -* Purpose of tracepoints - -A tracepoint placed in code provides a hook to call a function (probe) -that you can provide at runtime. A tracepoint can be "on" (a probe is -connected to it) or "off" (no probe is attached). When a tracepoint is -"off" it has no effect, except for adding a tiny time penalty -(checking a condition for a branch) and space penalty (adding a few -bytes for the function call at the end of the instrumented function -and adds a data structure in a separate section). When a tracepoint -is "on", the function you provide is called each time the tracepoint -is executed, in the execution context of the caller. When the function -provided ends its execution, it returns to the caller (continuing from -the tracepoint site). - -You can put tracepoints at important locations in the code. They are -lightweight hooks that can pass an arbitrary number of parameters, -which prototypes are described in a tracepoint declaration placed in a -header file. - -They can be used for tracing and performance accounting. - - -* Usage - -Two elements are required for tracepoints : - -- A tracepoint definition, placed in a header file. -- The tracepoint statement, in C code. - -In order to use tracepoints, you should include linux/tracepoint.h. - -In include/trace/subsys.h : - -#include - -DECLARE_TRACE(subsys_eventname, - TP_PROTO(int firstarg, struct task_struct *p), - TP_ARGS(firstarg, p)); - -In subsys/file.c (where the tracing statement must be added) : - -#include - -DEFINE_TRACE(subsys_eventname); - -void somefct(void) -{ - ... - trace_subsys_eventname(arg, task); - ... -} - -Where : -- subsys_eventname is an identifier unique to your event - - subsys is the name of your subsystem. - - eventname is the name of the event to trace. - -- TP_PROTO(int firstarg, struct task_struct *p) is the prototype of the - function called by this tracepoint. - -- TP_ARGS(firstarg, p) are the parameters names, same as found in the - prototype. - -Connecting a function (probe) to a tracepoint is done by providing a -probe (function to call) for the specific tracepoint through -register_trace_subsys_eventname(). Removing a probe is done through -unregister_trace_subsys_eventname(); it will remove the probe. - -tracepoint_synchronize_unregister() must be called before the end of -the module exit function to make sure there is no caller left using -the probe. This, and the fact that preemption is disabled around the -probe call, make sure that probe removal and module unload are safe. -See the "Probe example" section below for a sample probe module. - -The tracepoint mechanism supports inserting multiple instances of the -same tracepoint, but a single definition must be made of a given -tracepoint name over all the kernel to make sure no type conflict will -occur. Name mangling of the tracepoints is done using the prototypes -to make sure typing is correct. Verification of probe type correctness -is done at the registration site by the compiler. Tracepoints can be -put in inline functions, inlined static functions, and unrolled loops -as well as regular functions. - -The naming scheme "subsys_event" is suggested here as a convention -intended to limit collisions. Tracepoint names are global to the -kernel: they are considered as being the same whether they are in the -core kernel image or in modules. - -If the tracepoint has to be used in kernel modules, an -EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be -used to export the defined tracepoints. - -* Probe / tracepoint example - -See the example provided in samples/tracepoints - -Compile them with your kernel. They are built during 'make' (not -'make modules') when CONFIG_SAMPLE_TRACEPOINTS=m. - -Run, as root : -modprobe tracepoint-sample (insmod order is not important) -modprobe tracepoint-probe-sample -cat /proc/tracepoint-sample (returns an expected error) -rmmod tracepoint-sample tracepoint-probe-sample -dmesg diff --git a/Documentation/tracers/mmiotrace.txt b/Documentation/tracers/mmiotrace.txt deleted file mode 100644 index 5731c67..0000000 --- a/Documentation/tracers/mmiotrace.txt +++ /dev/null @@ -1,163 +0,0 @@ - In-kernel memory-mapped I/O tracing - - -Home page and links to optional user space tools: - - http://nouveau.freedesktop.org/wiki/MmioTrace - -MMIO tracing was originally developed by Intel around 2003 for their Fault -Injection Test Harness. In Dec 2006 - Jan 2007, using the code from Intel, -Jeff Muizelaar created a tool for tracing MMIO accesses with the Nouveau -project in mind. Since then many people have contributed. - -Mmiotrace was built for reverse engineering any memory-mapped IO device with -the Nouveau project as the first real user. Only x86 and x86_64 architectures -are supported. - -Out-of-tree mmiotrace was originally modified for mainline inclusion and -ftrace framework by Pekka Paalanen . - - -Preparation ------------ - -Mmiotrace feature is compiled in by the CONFIG_MMIOTRACE option. Tracing is -disabled by default, so it is safe to have this set to yes. SMP systems are -supported, but tracing is unreliable and may miss events if more than one CPU -is on-line, therefore mmiotrace takes all but one CPU off-line during run-time -activation. You can re-enable CPUs by hand, but you have been warned, there -is no way to automatically detect if you are losing events due to CPUs racing. - - -Usage Quick Reference ---------------------- - -$ mount -t debugfs debugfs /debug -$ echo mmiotrace > /debug/tracing/current_tracer -$ cat /debug/tracing/trace_pipe > mydump.txt & -Start X or whatever. -$ echo "X is up" > /debug/tracing/trace_marker -$ echo nop > /debug/tracing/current_tracer -Check for lost events. - - -Usage ------ - -Make sure debugfs is mounted to /debug. If not, (requires root privileges) -$ mount -t debugfs debugfs /debug - -Check that the driver you are about to trace is not loaded. - -Activate mmiotrace (requires root privileges): -$ echo mmiotrace > /debug/tracing/current_tracer - -Start storing the trace: -$ cat /debug/tracing/trace_pipe > mydump.txt & -The 'cat' process should stay running (sleeping) in the background. - -Load the driver you want to trace and use it. Mmiotrace will only catch MMIO -accesses to areas that are ioremapped while mmiotrace is active. - -During tracing you can place comments (markers) into the trace by -$ echo "X is up" > /debug/tracing/trace_marker -This makes it easier to see which part of the (huge) trace corresponds to -which action. It is recommended to place descriptive markers about what you -do. - -Shut down mmiotrace (requires root privileges): -$ echo nop > /debug/tracing/current_tracer -The 'cat' process exits. If it does not, kill it by issuing 'fg' command and -pressing ctrl+c. - -Check that mmiotrace did not lose events due to a buffer filling up. Either -$ grep -i lost mydump.txt -which tells you exactly how many events were lost, or use -$ dmesg -to view your kernel log and look for "mmiotrace has lost events" warning. If -events were lost, the trace is incomplete. You should enlarge the buffers and -try again. Buffers are enlarged by first seeing how large the current buffers -are: -$ cat /debug/tracing/buffer_size_kb -gives you a number. Approximately double this number and write it back, for -instance: -$ echo 128000 > /debug/tracing/buffer_size_kb -Then start again from the top. - -If you are doing a trace for a driver project, e.g. Nouveau, you should also -do the following before sending your results: -$ lspci -vvv > lspci.txt -$ dmesg > dmesg.txt -$ tar zcf pciid-nick-mmiotrace.tar.gz mydump.txt lspci.txt dmesg.txt -and then send the .tar.gz file. The trace compresses considerably. Replace -"pciid" and "nick" with the PCI ID or model name of your piece of hardware -under investigation and your nick name. - - -How Mmiotrace Works -------------------- - -Access to hardware IO-memory is gained by mapping addresses from PCI bus by -calling one of the ioremap_*() functions. Mmiotrace is hooked into the -__ioremap() function and gets called whenever a mapping is created. Mapping is -an event that is recorded into the trace log. Note, that ISA range mappings -are not caught, since the mapping always exists and is returned directly. - -MMIO accesses are recorded via page faults. Just before __ioremap() returns, -the mapped pages are marked as not present. Any access to the pages causes a -fault. The page fault handler calls mmiotrace to handle the fault. Mmiotrace -marks the page present, sets TF flag to achieve single stepping and exits the -fault handler. The instruction that faulted is executed and debug trap is -entered. Here mmiotrace again marks the page as not present. The instruction -is decoded to get the type of operation (read/write), data width and the value -read or written. These are stored to the trace log. - -Setting the page present in the page fault handler has a race condition on SMP -machines. During the single stepping other CPUs may run freely on that page -and events can be missed without a notice. Re-enabling other CPUs during -tracing is discouraged. - - -Trace Log Format ----------------- - -The raw log is text and easily filtered with e.g. grep and awk. One record is -one line in the log. A record starts with a keyword, followed by keyword -dependant arguments. Arguments are separated by a space, or continue until the -end of line. The format for version 20070824 is as follows: - -Explanation Keyword Space separated arguments ---------------------------------------------------------------------------- - -read event R width, timestamp, map id, physical, value, PC, PID -write event W width, timestamp, map id, physical, value, PC, PID -ioremap event MAP timestamp, map id, physical, virtual, length, PC, PID -iounmap event UNMAP timestamp, map id, PC, PID -marker MARK timestamp, text -version VERSION the string "20070824" -info for reader LSPCI one line from lspci -v -PCI address map PCIDEV space separated /proc/bus/pci/devices data -unk. opcode UNKNOWN timestamp, map id, physical, data, PC, PID - -Timestamp is in seconds with decimals. Physical is a PCI bus address, virtual -is a kernel virtual address. Width is the data width in bytes and value is the -data value. Map id is an arbitrary id number identifying the mapping that was -used in an operation. PC is the program counter and PID is process id. PC is -zero if it is not recorded. PID is always zero as tracing MMIO accesses -originating in user space memory is not yet supported. - -For instance, the following awk filter will pass all 32-bit writes that target -physical addresses in the range [0xfb73ce40, 0xfb800000[ - -$ awk '/W 4 / { adr=strtonum($5); if (adr >= 0xfb73ce40 && -adr < 0xfb800000) print; }' - - -Tools for Developers --------------------- - -The user space tools include utilities for: -- replacing numeric addresses and values with hardware register names -- replaying MMIO logs, i.e., re-executing the recorded writes - - diff --git a/Documentation/vm/kmemtrace.txt b/Documentation/vm/kmemtrace.txt deleted file mode 100644 index a956d9b..0000000 --- a/Documentation/vm/kmemtrace.txt +++ /dev/null @@ -1,126 +0,0 @@ - kmemtrace - Kernel Memory Tracer - - by Eduard - Gabriel Munteanu - - -I. Introduction -=============== - -kmemtrace helps kernel developers figure out two things: -1) how different allocators (SLAB, SLUB etc.) perform -2) how kernel code allocates memory and how much - -To do this, we trace every allocation and export information to the userspace -through the relay interface. We export things such as the number of requested -bytes, the number of bytes actually allocated (i.e. including internal -fragmentation), whether this is a slab allocation or a plain kmalloc() and so -on. - -The actual analysis is performed by a userspace tool (see section III for -details on where to get it from). It logs the data exported by the kernel, -processes it and (as of writing this) can provide the following information: -- the total amount of memory allocated and fragmentation per call-site -- the amount of memory allocated and fragmentation per allocation -- total memory allocated and fragmentation in the collected dataset -- number of cross-CPU allocation and frees (makes sense in NUMA environments) - -Moreover, it can potentially find inconsistent and erroneous behavior in -kernel code, such as using slab free functions on kmalloc'ed memory or -allocating less memory than requested (but not truly failed allocations). - -kmemtrace also makes provisions for tracing on some arch and analysing the -data on another. - -II. Design and goals -==================== - -kmemtrace was designed to handle rather large amounts of data. Thus, it uses -the relay interface to export whatever is logged to userspace, which then -stores it. Analysis and reporting is done asynchronously, that is, after the -data is collected and stored. By design, it allows one to log and analyse -on different machines and different arches. - -As of writing this, the ABI is not considered stable, though it might not -change much. However, no guarantees are made about compatibility yet. When -deemed stable, the ABI should still allow easy extension while maintaining -backward compatibility. This is described further in Documentation/ABI. - -Summary of design goals: - - allow logging and analysis to be done across different machines - - be fast and anticipate usage in high-load environments (*) - - be reasonably extensible - - make it possible for GNU/Linux distributions to have kmemtrace - included in their repositories - -(*) - one of the reasons Pekka Enberg's original userspace data analysis - tool's code was rewritten from Perl to C (although this is more than a - simple conversion) - - -III. Quick usage guide -====================== - -1) Get a kernel that supports kmemtrace and build it accordingly (i.e. enable -CONFIG_KMEMTRACE). - -2) Get the userspace tool and build it: -$ git-clone git://repo.or.cz/kmemtrace-user.git # current repository -$ cd kmemtrace-user/ -$ ./autogen.sh -$ ./configure -$ make - -3) Boot the kmemtrace-enabled kernel if you haven't, preferably in the -'single' runlevel (so that relay buffers don't fill up easily), and run -kmemtrace: -# '$' does not mean user, but root here. -$ mount -t debugfs none /sys/kernel/debug -$ mount -t proc none /proc -$ cd path/to/kmemtrace-user/ -$ ./kmemtraced -Wait a bit, then stop it with CTRL+C. -$ cat /sys/kernel/debug/kmemtrace/total_overruns # Check if we didn't - # overrun, should - # be zero. -$ (Optionally) [Run kmemtrace_check separately on each cpu[0-9]*.out file to - check its correctness] -$ ./kmemtrace-report - -Now you should have a nice and short summary of how the allocator performs. - -IV. FAQ and known issues -======================== - -Q: 'cat /sys/kernel/debug/kmemtrace/total_overruns' is non-zero, how do I fix -this? Should I worry? -A: If it's non-zero, this affects kmemtrace's accuracy, depending on how -large the number is. You can fix it by supplying a higher -'kmemtrace.subbufs=N' kernel parameter. ---- - -Q: kmemtrace_check reports errors, how do I fix this? Should I worry? -A: This is a bug and should be reported. It can occur for a variety of -reasons: - - possible bugs in relay code - - possible misuse of relay by kmemtrace - - timestamps being collected unorderly -Or you may fix it yourself and send us a patch. ---- - -Q: kmemtrace_report shows many errors, how do I fix this? Should I worry? -A: This is a known issue and I'm working on it. These might be true errors -in kernel code, which may have inconsistent behavior (e.g. allocating memory -with kmem_cache_alloc() and freeing it with kfree()). Pekka Enberg pointed -out this behavior may work with SLAB, but may fail with other allocators. - -It may also be due to lack of tracing in some unusual allocator functions. - -We don't want bug reports regarding this issue yet. ---- - -V. See also -=========== - -Documentation/kernel-parameters.txt -Documentation/ABI/testing/debugfs-kmemtrace - -- cgit v0.10.2 From e3c8ca8336707062f3f7cb1cd7e6b3c753baccdd Mon Sep 17 00:00:00 2001 From: Nathan Lynch Date: Wed, 8 Apr 2009 19:45:12 -0500 Subject: sched: do not count frozen tasks toward load Freezing tasks via the cgroup freezer causes the load average to climb because the freezer's current implementation puts frozen tasks in uninterruptible sleep (D state). Some applications which perform job-scheduling functions consult the load average when making decisions. If a cgroup is frozen, the load average does not provide a useful measure of the system's utilization to such applications. This is especially inconvenient if the job scheduler employs the cgroup freezer as a mechanism for preempting low priority jobs. Contrast this with using SIGSTOP for the same purpose: the stopped tasks do not count toward system load. Change task_contributes_to_load() to return false if the task is frozen. This results in /proc/loadavg behavior that better meets users' expectations. Signed-off-by: Nathan Lynch Acked-by: Andrew Morton Acked-by: Nigel Cunningham Tested-by: Nigel Cunningham Cc: Cc: containers@lists.linux-foundation.org Cc: linux-pm@lists.linux-foundation.org Cc: Matt Helsley LKML-Reference: <20090408194512.47a99b95@manatee.lan> Signed-off-by: Ingo Molnar diff --git a/include/linux/sched.h b/include/linux/sched.h index 98e1fe5..b4c38bc 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -205,7 +205,8 @@ extern unsigned long long time_sync_thresh; #define task_is_stopped_or_traced(task) \ ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) #define task_contributes_to_load(task) \ - ((task->state & TASK_UNINTERRUPTIBLE) != 0) + ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ + (task->flags & PF_FROZEN) == 0) #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) -- cgit v0.10.2 From 97c18e2c7a8e36d2d83d50ee070314aadac73a11 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 9 Apr 2009 10:35:47 +0800 Subject: module: try_then_request_module must wait Since the whole point of try_then_request_module is to retry the operation after a module has been loaded, we must wait for the module to fully load. Otherwise all sort of things start breaking, e.g., you won't be able to read your encrypted disks on the first attempt. Signed-off-by: Herbert Xu Tested-by: Maciej Rutecki Tested-by: Patrick McHardy Signed-off-by: Linus Torvalds diff --git a/include/linux/kmod.h b/include/linux/kmod.h index d5fa565..384ca8b 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -34,7 +34,7 @@ extern int __request_module(bool wait, const char *name, ...) \ #define request_module(mod...) __request_module(true, mod) #define request_module_nowait(mod...) __request_module(false, mod) #define try_then_request_module(x, mod...) \ - ((x) ?: (__request_module(false, mod), (x))) + ((x) ?: (__request_module(true, mod), (x))) #else static inline int request_module(const char *name, ...) { return -ENOSYS; } static inline int request_module_nowait(const char *name, ...) { return -ENOSYS; } -- cgit v0.10.2 From 36cd3c9f925b9307236505ae7ad1ad7ac4d4357c Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Thu, 9 Apr 2009 18:48:34 +0200 Subject: mutex: have non-spinning mutexes on s390 by default Impact: performance regression fix for s390 The adaptive spinning mutexes will not always do what one would expect on virtualized architectures like s390. Especially the cpu_relax() loop in mutex_spin_on_owner might hurt if the mutex holding cpu has been scheduled away by the hypervisor. We would end up in a cpu_relax() loop when there is no chance that the state of the mutex changes until the target cpu has been scheduled again by the hypervisor. For that reason we should change the default behaviour to no-spin on s390. We do have an instruction which allows to yield the current cpu in favour of a different target cpu. Also we have an instruction which allows us to figure out if the target cpu is physically backed. However we need to do some performance tests until we can come up with a solution that will do the right thing on s390. Signed-off-by: Heiko Carstens Acked-by: Peter Zijlstra Cc: Martin Schwidefsky Cc: Christian Borntraeger LKML-Reference: <20090409184834.7a0df7b2@osiris.boeblingen.de.ibm.com> Signed-off-by: Ingo Molnar diff --git a/arch/Kconfig b/arch/Kconfig index dc81b34..78a35e9 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -109,3 +109,6 @@ config HAVE_CLK config HAVE_DMA_API_DEBUG bool + +config HAVE_DEFAULT_NO_SPIN_MUTEXES + bool diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index dcb667c..2eca5fe 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -82,6 +82,7 @@ config S390 select USE_GENERIC_SMP_HELPERS if SMP select HAVE_SYSCALL_WRAPPERS select HAVE_FUNCTION_TRACER + select HAVE_DEFAULT_NO_SPIN_MUTEXES select HAVE_OPROFILE select HAVE_KPROBES select HAVE_KRETPROBES diff --git a/kernel/mutex.c b/kernel/mutex.c index 5d79781..507cf2b 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -148,7 +148,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, preempt_disable(); mutex_acquire(&lock->dep_map, subclass, 0, ip); -#if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) +#if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) && \ + !defined(CONFIG_HAVE_DEFAULT_NO_SPIN_MUTEXES) /* * Optimistic spinning. * -- cgit v0.10.2 From 91e58b6e95a9c6b9efd928ae352eae5e75ae598c Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 9 Apr 2009 18:18:47 +0100 Subject: MN10300: Convert obsolete no_irq_type to no_irq_chip Convert the last remaining users to no_irq_chip. Signed-off-by: Thomas Gleixner Signed-off-by: David Howells Signed-off-by: Linus Torvalds diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c index 50fdb5c..4c3c58e 100644 --- a/arch/mn10300/kernel/irq.c +++ b/arch/mn10300/kernel/irq.c @@ -140,7 +140,7 @@ void __init init_IRQ(void) int irq; for (irq = 0; irq < NR_IRQS; irq++) - if (irq_desc[irq].chip == &no_irq_type) + if (irq_desc[irq].chip == &no_irq_chip) /* due to the PIC latching interrupt requests, even * when the IRQ is disabled, IRQ_PENDING is superfluous * and we can use handle_level_irq() for edge-triggered -- cgit v0.10.2 From 11ff5f6affe9b75f115a900a5584db339d46002b Mon Sep 17 00:00:00 2001 From: Stoyan Gaydarov Date: Thu, 9 Apr 2009 17:10:28 +0100 Subject: afs: BUG to BUG_ON changes Signed-off-by: Stoyan Gaydarov Signed-off-by: David Howells Signed-off-by: Linus Torvalds diff --git a/fs/afs/netdevices.c b/fs/afs/netdevices.c index 49f1894..7ad3650 100644 --- a/fs/afs/netdevices.c +++ b/fs/afs/netdevices.c @@ -20,8 +20,7 @@ int afs_get_MAC_address(u8 *mac, size_t maclen) struct net_device *dev; int ret = -ENODEV; - if (maclen != ETH_ALEN) - BUG(); + BUG_ON(maclen != ETH_ALEN); rtnl_lock(); dev = __dev_getfirstbyhwtype(&init_net, ARPHRD_ETHER); -- cgit v0.10.2 From 34574dd10b6d0697b86703388d6d6af9cbf4bb48 Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 9 Apr 2009 17:14:05 +0100 Subject: keys: Handle there being no fallback destination keyring for request_key() When request_key() is called, without there being any standard process keyrings on which to fall back if a destination keyring is not specified, an oops is liable to occur when construct_alloc_key() calls down_write() on dest_keyring's semaphore. Due to function inlining this may be seen as an oops in down_write() as called from request_key_and_link(). This situation crops up during boot, where request_key() is called from within the kernel (such as in CIFS mounts) where nobody is actually logged in, and so PAM has not had a chance to create a session keyring and user keyrings to act as the fallback. To fix this, make construct_alloc_key() not attempt to cache a key if there is no fallback key if no destination keyring is given specifically. Signed-off-by: David Howells Tested-by: Jeff Layton Signed-off-by: Linus Torvalds diff --git a/security/keys/request_key.c b/security/keys/request_key.c index 22a3158..03fe63e 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c @@ -311,7 +311,8 @@ static int construct_alloc_key(struct key_type *type, set_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags); - down_write(&dest_keyring->sem); + if (dest_keyring) + down_write(&dest_keyring->sem); /* attach the key to the destination keyring under lock, but we do need * to do another check just in case someone beat us to it whilst we @@ -322,10 +323,12 @@ static int construct_alloc_key(struct key_type *type, if (!IS_ERR(key_ref)) goto key_already_present; - __key_link(dest_keyring, key); + if (dest_keyring) + __key_link(dest_keyring, key); mutex_unlock(&key_construction_mutex); - up_write(&dest_keyring->sem); + if (dest_keyring) + up_write(&dest_keyring->sem); mutex_unlock(&user->cons_lock); *_key = key; kleave(" = 0 [%d]", key_serial(key)); -- cgit v0.10.2 From 6fde836b54f1f0ca3d3c8b7aaf44165a08fe0f9f Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 9 Apr 2009 17:32:55 +0100 Subject: FRV: Use in NOMMU mode asm-frv/pgtable.h could just #include in NOMMU mode rather than #defining macros for lazy MMU and CPU stuff. Signed-off-by: David Howells Signed-off-by: Linus Torvalds diff --git a/include/asm-frv/pgtable.h b/include/asm-frv/pgtable.h index e16fdb1..3323301 100644 --- a/include/asm-frv/pgtable.h +++ b/include/asm-frv/pgtable.h @@ -71,10 +71,8 @@ static inline int pte_file(pte_t pte) { return 0; } #define swapper_pg_dir ((pgd_t *) NULL) #define pgtable_cache_init() do {} while (0) -#define arch_enter_lazy_mmu_mode() do {} while (0) -#define arch_leave_lazy_mmu_mode() do {} while (0) -#define arch_enter_lazy_cpu_mode() do {} while (0) -#define arch_leave_lazy_cpu_mode() do {} while (0) + +#include #else /* !CONFIG_MMU */ /*****************************************************************************/ -- cgit v0.10.2 From 62b8e680e61d3f48f2a12ee248ca03ea8f376926 Mon Sep 17 00:00:00 2001 From: David Howells Date: Thu, 9 Apr 2009 18:41:23 +0100 Subject: MN10300: Kill MN10300's own profiling Kconfig Kill MN10300's own profiling Kconfig as this is superfluous given that the profiling options have moved to init/Kconfig and arch/Kconfig. Not only is this now superfluous, but the dependencies are not correct. Signed-off-by: David Howells Signed-off-by: Linus Torvalds diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 41d1682..3559267 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -370,5 +370,3 @@ source "security/Kconfig" source "crypto/Kconfig" source "lib/Kconfig" - -source "arch/mn10300/oprofile/Kconfig" diff --git a/arch/mn10300/oprofile/Kconfig b/arch/mn10300/oprofile/Kconfig deleted file mode 100644 index 19d3773..0000000 --- a/arch/mn10300/oprofile/Kconfig +++ /dev/null @@ -1,23 +0,0 @@ - -menu "Profiling support" - depends on EXPERIMENTAL - -config PROFILING - bool "Profiling support (EXPERIMENTAL)" - help - Say Y here to enable the extended profiling support mechanisms used - by profilers such as OProfile. - - -config OPROFILE - tristate "OProfile system profiling (EXPERIMENTAL)" - depends on PROFILING - help - OProfile is a profiling system capable of profiling the - whole system, include the kernel, kernel modules, libraries, - and applications. - - If unsure, say N. - -endmenu - -- cgit v0.10.2 From 3b3809ac5375f614bbf8671cddeae3c693aa584e Mon Sep 17 00:00:00 2001 From: Masami Hiramatsu Date: Thu, 9 Apr 2009 10:55:33 -0700 Subject: x86: fix set_fixmap to use phys_addr_t Use phys_addr_t for receiving a physical address argument instead of unsigned long. This allows fixmap to handle pages higher than 4GB on x86-32. Signed-off-by: Masami Hiramatsu Cc: Ingo Molnar Acked-by: Mathieu Desnoyers Signed-off-by: Linus Torvalds diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 81937a5..2d81af3 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -151,11 +151,11 @@ extern pte_t *pkmap_page_table; void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); void native_set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t flags); + phys_addr_t phys, pgprot_t flags); #ifndef CONFIG_PARAVIRT static inline void __set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t flags) + phys_addr_t phys, pgprot_t flags) { native_set_fixmap(idx, phys, flags); } diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 7727aa8..378e369 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -347,7 +347,7 @@ struct pv_mmu_ops { /* Sometimes the physical address is a pfn, and sometimes its an mfn. We can tell which is which from the index. */ void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, - unsigned long phys, pgprot_t flags); + phys_addr_t phys, pgprot_t flags); }; struct raw_spinlock; @@ -1432,7 +1432,7 @@ static inline void arch_leave_lazy_mmu_mode(void) void arch_flush_lazy_mmu_mode(void); static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, - unsigned long phys, pgprot_t flags) + phys_addr_t phys, pgprot_t flags) { pv_mmu_ops.set_fixmap(idx, phys, flags); } diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 5b7c7c84..7aa03a5 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -345,7 +345,8 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) fixmaps_set++; } -void native_set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags) +void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys, + pgprot_t flags) { __native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags)); } diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index db3802f..2a81838 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -1750,7 +1750,7 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, } #endif /* CONFIG_X86_64 */ -static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) +static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) { pte_t pte; -- cgit v0.10.2 From 187934655fa0637d4ef3967d4543c6dcccf33058 Mon Sep 17 00:00:00 2001 From: David Howells Date: Fri, 10 Apr 2009 01:48:01 +0100 Subject: FRV: Fix indentation errors to keep git-am happy when moving arch header files Fix indentation errors to keep git-am happy when moving arch header files. Signed-off-by: David Howells diff --git a/include/asm-frv/thread_info.h b/include/asm-frv/thread_info.h index b7ac6bf..bb53ab7 100644 --- a/include/asm-frv/thread_info.h +++ b/include/asm-frv/thread_info.h @@ -38,9 +38,9 @@ struct thread_info { int preempt_count; /* 0 => preemptable, <0 => BUG */ mm_segment_t addr_limit; /* thread address space: - 0-0xBFFFFFFF for user-thead - 0-0xFFFFFFFF for kernel-thread - */ + * 0-0xBFFFFFFF for user-thead + * 0-0xFFFFFFFF for kernel-thread + */ struct restart_block restart_block; __u8 supervisor_stack[0]; -- cgit v0.10.2 From e69cc9278831139660cb99bde52908f145338d77 Mon Sep 17 00:00:00 2001 From: David Howells Date: Fri, 10 Apr 2009 01:48:06 +0100 Subject: FRV: Move to arch/frv/include/asm/ Move arch headers from include/asm-frv/ to arch/frv/include/asm/. Signed-off-by: David Howells diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild new file mode 100644 index 0000000..0f8956d --- /dev/null +++ b/arch/frv/include/asm/Kbuild @@ -0,0 +1,5 @@ +include include/asm-generic/Kbuild.asm + +header-y += registers.h + +unifdef-y += termios.h diff --git a/arch/frv/include/asm/atomic.h b/arch/frv/include/asm/atomic.h new file mode 100644 index 0000000..296c35c --- /dev/null +++ b/arch/frv/include/asm/atomic.h @@ -0,0 +1,198 @@ +/* atomic.h: atomic operation emulation for FR-V + * + * For an explanation of how atomic ops work in this arch, see: + * Documentation/frv/atomic-ops.txt + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_ATOMIC_H +#define _ASM_ATOMIC_H + +#include +#include +#include + +#ifdef CONFIG_SMP +#error not SMP safe +#endif + +/* + * Atomic operations that C can't guarantee us. Useful for + * resource counting etc.. + * + * We do not have SMP systems, so we don't have to deal with that. + */ + +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + +#define ATOMIC_INIT(i) { (i) } +#define atomic_read(v) ((v)->counter) +#define atomic_set(v, i) (((v)->counter) = (i)) + +#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS +static inline int atomic_add_return(int i, atomic_t *v) +{ + unsigned long val; + + asm("0: \n" + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ + " ckeq icc3,cc7 \n" + " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ + " add%I2 %1,%2,%1 \n" + " cst.p %1,%M0 ,cc3,#1 \n" + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ + " beq icc3,#0,0b \n" + : "+U"(v->counter), "=&r"(val) + : "NPr"(i) + : "memory", "cc7", "cc3", "icc3" + ); + + return val; +} + +static inline int atomic_sub_return(int i, atomic_t *v) +{ + unsigned long val; + + asm("0: \n" + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ + " ckeq icc3,cc7 \n" + " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ + " sub%I2 %1,%2,%1 \n" + " cst.p %1,%M0 ,cc3,#1 \n" + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ + " beq icc3,#0,0b \n" + : "+U"(v->counter), "=&r"(val) + : "NPr"(i) + : "memory", "cc7", "cc3", "icc3" + ); + + return val; +} + +#else + +extern int atomic_add_return(int i, atomic_t *v); +extern int atomic_sub_return(int i, atomic_t *v); + +#endif + +static inline int atomic_add_negative(int i, atomic_t *v) +{ + return atomic_add_return(i, v) < 0; +} + +static inline void atomic_add(int i, atomic_t *v) +{ + atomic_add_return(i, v); +} + +static inline void atomic_sub(int i, atomic_t *v) +{ + atomic_sub_return(i, v); +} + +static inline void atomic_inc(atomic_t *v) +{ + atomic_add_return(1, v); +} + +static inline void atomic_dec(atomic_t *v) +{ + atomic_sub_return(1, v); +} + +#define atomic_dec_return(v) atomic_sub_return(1, (v)) +#define atomic_inc_return(v) atomic_add_return(1, (v)) + +#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) +#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) +#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) + +/*****************************************************************************/ +/* + * exchange value with memory + */ +#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS + +#define xchg(ptr, x) \ +({ \ + __typeof__(ptr) __xg_ptr = (ptr); \ + __typeof__(*(ptr)) __xg_orig; \ + \ + switch (sizeof(__xg_orig)) { \ + case 4: \ + asm volatile( \ + "swap%I0 %M0,%1" \ + : "+m"(*__xg_ptr), "=r"(__xg_orig) \ + : "1"(x) \ + : "memory" \ + ); \ + break; \ + \ + default: \ + __xg_orig = (__typeof__(__xg_orig))0; \ + asm volatile("break"); \ + break; \ + } \ + \ + __xg_orig; \ +}) + +#else + +extern uint32_t __xchg_32(uint32_t i, volatile void *v); + +#define xchg(ptr, x) \ +({ \ + __typeof__(ptr) __xg_ptr = (ptr); \ + __typeof__(*(ptr)) __xg_orig; \ + \ + switch (sizeof(__xg_orig)) { \ + case 4: __xg_orig = (__typeof__(*(ptr))) __xchg_32((uint32_t) x, __xg_ptr); break; \ + default: \ + __xg_orig = (__typeof__(__xg_orig))0; \ + asm volatile("break"); \ + break; \ + } \ + __xg_orig; \ +}) + +#endif + +#define tas(ptr) (xchg((ptr), 1)) + +#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new)) +#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) + +static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) +{ + int c, old; + c = atomic_read(v); + for (;;) { + if (unlikely(c == (u))) + break; + old = atomic_cmpxchg((v), c, c + (a)); + if (likely(old == c)) + break; + c = old; + } + return c != (u); +} + +#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) + +#include +#endif /* _ASM_ATOMIC_H */ diff --git a/arch/frv/include/asm/auxvec.h b/arch/frv/include/asm/auxvec.h new file mode 100644 index 0000000..0771077 --- /dev/null +++ b/arch/frv/include/asm/auxvec.h @@ -0,0 +1,4 @@ +#ifndef __FRV_AUXVEC_H +#define __FRV_AUXVEC_H + +#endif diff --git a/arch/frv/include/asm/ax88796.h b/arch/frv/include/asm/ax88796.h new file mode 100644 index 0000000..637e980 --- /dev/null +++ b/arch/frv/include/asm/ax88796.h @@ -0,0 +1,22 @@ +/* ax88796.h: access points to the driver for the AX88796 NE2000 clone + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_AX88796_H +#define _ASM_AX88796_H + +#include + +#define AX88796_IOADDR (__region_CS1 + 0x200) +#define AX88796_IRQ IRQ_CPU_EXTERNAL7 +#define AX88796_FULL_DUPLEX 0 /* force full duplex */ +#define AX88796_BUS_INFO "CS1#+0x200" /* bus info for ethtool */ + +#endif /* _ASM_AX88796_H */ diff --git a/arch/frv/include/asm/bitops.h b/arch/frv/include/asm/bitops.h new file mode 100644 index 0000000..287f6f6 --- /dev/null +++ b/arch/frv/include/asm/bitops.h @@ -0,0 +1,412 @@ +/* bitops.h: bit operations for the Fujitsu FR-V CPUs + * + * For an explanation of how atomic ops work in this arch, see: + * Documentation/frv/atomic-ops.txt + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_BITOPS_H +#define _ASM_BITOPS_H + +#include +#include + +#ifdef __KERNEL__ + +#ifndef _LINUX_BITOPS_H +#error only can be included directly +#endif + +#include + +/* + * clear_bit() doesn't provide any barrier for the compiler. + */ +#define smp_mb__before_clear_bit() barrier() +#define smp_mb__after_clear_bit() barrier() + +#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS +static inline +unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v) +{ + unsigned long old, tmp; + + asm volatile( + "0: \n" + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ + " ckeq icc3,cc7 \n" + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ + " and%I3 %1,%3,%2 \n" + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ + " beq icc3,#0,0b \n" + : "+U"(*v), "=&r"(old), "=r"(tmp) + : "NPr"(~mask) + : "memory", "cc7", "cc3", "icc3" + ); + + return old; +} + +static inline +unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v) +{ + unsigned long old, tmp; + + asm volatile( + "0: \n" + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ + " ckeq icc3,cc7 \n" + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ + " or%I3 %1,%3,%2 \n" + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ + " beq icc3,#0,0b \n" + : "+U"(*v), "=&r"(old), "=r"(tmp) + : "NPr"(mask) + : "memory", "cc7", "cc3", "icc3" + ); + + return old; +} + +static inline +unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v) +{ + unsigned long old, tmp; + + asm volatile( + "0: \n" + " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ + " ckeq icc3,cc7 \n" + " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ + " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ + " xor%I3 %1,%3,%2 \n" + " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ + " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ + " beq icc3,#0,0b \n" + : "+U"(*v), "=&r"(old), "=r"(tmp) + : "NPr"(mask) + : "memory", "cc7", "cc3", "icc3" + ); + + return old; +} + +#else + +extern unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v); +extern unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v); +extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v); + +#endif + +#define atomic_clear_mask(mask, v) atomic_test_and_ANDNOT_mask((mask), (v)) +#define atomic_set_mask(mask, v) atomic_test_and_OR_mask((mask), (v)) + +static inline int test_and_clear_bit(int nr, volatile void *addr) +{ + volatile unsigned long *ptr = addr; + unsigned long mask = 1UL << (nr & 31); + ptr += nr >> 5; + return (atomic_test_and_ANDNOT_mask(mask, ptr) & mask) != 0; +} + +static inline int test_and_set_bit(int nr, volatile void *addr) +{ + volatile unsigned long *ptr = addr; + unsigned long mask = 1UL << (nr & 31); + ptr += nr >> 5; + return (atomic_test_and_OR_mask(mask, ptr) & mask) != 0; +} + +static inline int test_and_change_bit(int nr, volatile void *addr) +{ + volatile unsigned long *ptr = addr; + unsigned long mask = 1UL << (nr & 31); + ptr += nr >> 5; + return (atomic_test_and_XOR_mask(mask, ptr) & mask) != 0; +} + +static inline void clear_bit(int nr, volatile void *addr) +{ + test_and_clear_bit(nr, addr); +} + +static inline void set_bit(int nr, volatile void *addr) +{ + test_and_set_bit(nr, addr); +} + +static inline void change_bit(int nr, volatile void * addr) +{ + test_and_change_bit(nr, addr); +} + +static inline void __clear_bit(int nr, volatile void * addr) +{ + volatile unsigned long *a = addr; + int mask; + + a += nr >> 5; + mask = 1 << (nr & 31); + *a &= ~mask; +} + +static inline void __set_bit(int nr, volatile void * addr) +{ + volatile unsigned long *a = addr; + int mask; + + a += nr >> 5; + mask = 1 << (nr & 31); + *a |= mask; +} + +static inline void __change_bit(int nr, volatile void *addr) +{ + volatile unsigned long *a = addr; + int mask; + + a += nr >> 5; + mask = 1 << (nr & 31); + *a ^= mask; +} + +static inline int __test_and_clear_bit(int nr, volatile void * addr) +{ + volatile unsigned long *a = addr; + int mask, retval; + + a += nr >> 5; + mask = 1 << (nr & 31); + retval = (mask & *a) != 0; + *a &= ~mask; + return retval; +} + +static inline int __test_and_set_bit(int nr, volatile void * addr) +{ + volatile unsigned long *a = addr; + int mask, retval; + + a += nr >> 5; + mask = 1 << (nr & 31); + retval = (mask & *a) != 0; + *a |= mask; + return retval; +} + +static inline int __test_and_change_bit(int nr, volatile void * addr) +{ + volatile unsigned long *a = addr; + int mask, retval; + + a += nr >> 5; + mask = 1 << (nr & 31); + retval = (mask & *a) != 0; + *a ^= mask; + return retval; +} + +/* + * This routine doesn't need to be atomic. + */ +static inline int __constant_test_bit(int nr, const volatile void * addr) +{ + return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; +} + +static inline int __test_bit(int nr, const volatile void * addr) +{ + int * a = (int *) addr; + int mask; + + a += nr >> 5; + mask = 1 << (nr & 0x1f); + return ((mask & *a) != 0); +} + +#define test_bit(nr,addr) \ +(__builtin_constant_p(nr) ? \ + __constant_test_bit((nr),(addr)) : \ + __test_bit((nr),(addr))) + +#include + +/** + * fls - find last bit set + * @x: the word to search + * + * This is defined the same way as ffs: + * - return 32..1 to indicate bit 31..0 most significant bit set + * - return 0 to indicate no bits set + */ +#define fls(x) \ +({ \ + int bit; \ + \ + asm(" subcc %1,gr0,gr0,icc0 \n" \ + " ckne icc0,cc4 \n" \ + " cscan.p %1,gr0,%0 ,cc4,#1 \n" \ + " csub %0,%0,%0 ,cc4,#0 \n" \ + " csub %2,%0,%0 ,cc4,#1 \n" \ + : "=&r"(bit) \ + : "r"(x), "r"(32) \ + : "icc0", "cc4" \ + ); \ + \ + bit; \ +}) + +/** + * fls64 - find last bit set in a 64-bit value + * @n: the value to search + * + * This is defined the same way as ffs: + * - return 64..1 to indicate bit 63..0 most significant bit set + * - return 0 to indicate no bits set + */ +static inline __attribute__((const)) +int fls64(u64 n) +{ + union { + u64 ll; + struct { u32 h, l; }; + } _; + int bit, x, y; + + _.ll = n; + + asm(" subcc.p %3,gr0,gr0,icc0 \n" + " subcc %4,gr0,gr0,icc1 \n" + " ckne icc0,cc4 \n" + " ckne icc1,cc5 \n" + " norcr cc4,cc5,cc6 \n" + " csub.p %0,%0,%0 ,cc6,1 \n" + " orcr cc5,cc4,cc4 \n" + " andcr cc4,cc5,cc4 \n" + " cscan.p %3,gr0,%0 ,cc4,0 \n" + " setlos #64,%1 \n" + " cscan.p %4,gr0,%0 ,cc4,1 \n" + " setlos #32,%2 \n" + " csub.p %1,%0,%0 ,cc4,0 \n" + " csub %2,%0,%0 ,cc4,1 \n" + : "=&r"(bit), "=r"(x), "=r"(y) + : "0r"(_.h), "r"(_.l) + : "icc0", "icc1", "cc4", "cc5", "cc6" + ); + return bit; + +} + +/** + * ffs - find first bit set + * @x: the word to search + * + * - return 32..1 to indicate bit 31..0 most least significant bit set + * - return 0 to indicate no bits set + */ +static inline __attribute__((const)) +int ffs(int x) +{ + /* Note: (x & -x) gives us a mask that is the least significant + * (rightmost) 1-bit of the value in x. + */ + return fls(x & -x); +} + +/** + * __ffs - find first bit set + * @x: the word to search + * + * - return 31..0 to indicate bit 31..0 most least significant bit set + * - if no bits are set in x, the result is undefined + */ +static inline __attribute__((const)) +int __ffs(unsigned long x) +{ + int bit; + asm("scan %1,gr0,%0" : "=r"(bit) : "r"(x & -x)); + return 31 - bit; +} + +/** + * __fls - find last (most-significant) set bit in a long word + * @word: the word to search + * + * Undefined if no set bit exists, so code should check against 0 first. + */ +static inline unsigned long __fls(unsigned long word) +{ + unsigned long bit; + asm("scan %1,gr0,%0" : "=r"(bit) : "r"(word)); + return bit; +} + +/* + * special slimline version of fls() for calculating ilog2_u32() + * - note: no protection against n == 0 + */ +#define ARCH_HAS_ILOG2_U32 +static inline __attribute__((const)) +int __ilog2_u32(u32 n) +{ + int bit; + asm("scan %1,gr0,%0" : "=r"(bit) : "r"(n)); + return 31 - bit; +} + +/* + * special slimline version of fls64() for calculating ilog2_u64() + * - note: no protection against n == 0 + */ +#define ARCH_HAS_ILOG2_U64 +static inline __attribute__((const)) +int __ilog2_u64(u64 n) +{ + union { + u64 ll; + struct { u32 h, l; }; + } _; + int bit, x, y; + + _.ll = n; + + asm(" subcc %3,gr0,gr0,icc0 \n" + " ckeq icc0,cc4 \n" + " cscan.p %3,gr0,%0 ,cc4,0 \n" + " setlos #63,%1 \n" + " cscan.p %4,gr0,%0 ,cc4,1 \n" + " setlos #31,%2 \n" + " csub.p %1,%0,%0 ,cc4,0 \n" + " csub %2,%0,%0 ,cc4,1 \n" + : "=&r"(bit), "=r"(x), "=r"(y) + : "0r"(_.h), "r"(_.l) + : "icc0", "cc4" + ); + return bit; +} + +#include +#include +#include + +#include + +#define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr)) +#define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr)) + +#include + +#endif /* __KERNEL__ */ + +#endif /* _ASM_BITOPS_H */ diff --git a/arch/frv/include/asm/bug.h b/arch/frv/include/asm/bug.h new file mode 100644 index 0000000..6b1b44d --- /dev/null +++ b/arch/frv/include/asm/bug.h @@ -0,0 +1,53 @@ +/* bug.h: FRV bug trapping + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_BUG_H +#define _ASM_BUG_H + +#include + +#ifdef CONFIG_BUG +/* + * Tell the user there is some problem. + */ +extern asmlinkage void __debug_bug_trap(int signr); + +#ifdef CONFIG_NO_KERNEL_MSG +#define _debug_bug_printk() +#else +extern void __debug_bug_printk(const char *file, unsigned line); +#define _debug_bug_printk() __debug_bug_printk(__FILE__, __LINE__) +#endif + +#define _debug_bug_trap(signr) \ +do { \ + __debug_bug_trap(signr); \ + asm volatile("nop"); \ +} while(0) + +#define HAVE_ARCH_BUG +#define BUG() \ +do { \ + _debug_bug_printk(); \ + _debug_bug_trap(6 /*SIGABRT*/); \ +} while (0) + +#ifdef CONFIG_GDBSTUB +#define HAVE_ARCH_KGDB_RAISE +#define kgdb_raise(signr) do { _debug_bug_trap(signr); } while(0) + +#define HAVE_ARCH_KGDB_BAD_PAGE +#define kgdb_bad_page(page) do { kgdb_raise(SIGABRT); } while(0) +#endif +#endif + +#include + +#endif diff --git a/arch/frv/include/asm/bugs.h b/arch/frv/include/asm/bugs.h new file mode 100644 index 0000000..f2382be --- /dev/null +++ b/arch/frv/include/asm/bugs.h @@ -0,0 +1,14 @@ +/* bugs.h: arch bug checking entry + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +static inline void check_bugs(void) +{ +} diff --git a/arch/frv/include/asm/busctl-regs.h b/arch/frv/include/asm/busctl-regs.h new file mode 100644 index 0000000..bb0ff48 --- /dev/null +++ b/arch/frv/include/asm/busctl-regs.h @@ -0,0 +1,41 @@ +/* busctl-regs.h: FR400-series CPU bus controller registers + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_BUSCTL_REGS_H +#define _ASM_BUSCTL_REGS_H + +/* bus controller registers */ +#define __get_LGCR() ({ *(volatile unsigned long *)(0xfe000010); }) +#define __get_LMAICR() ({ *(volatile unsigned long *)(0xfe000030); }) +#define __get_LEMBR() ({ *(volatile unsigned long *)(0xfe000040); }) +#define __get_LEMAM() ({ *(volatile unsigned long *)(0xfe000048); }) +#define __get_LCR(R) ({ *(volatile unsigned long *)(0xfe000100 + 8*(R)); }) +#define __get_LSBR(R) ({ *(volatile unsigned long *)(0xfe000c00 + 8*(R)); }) +#define __get_LSAM(R) ({ *(volatile unsigned long *)(0xfe000d00 + 8*(R)); }) + +#define __set_LGCR(V) do { *(volatile unsigned long *)(0xfe000010) = (V); } while(0) +#define __set_LMAICR(V) do { *(volatile unsigned long *)(0xfe000030) = (V); } while(0) +#define __set_LEMBR(V) do { *(volatile unsigned long *)(0xfe000040) = (V); } while(0) +#define __set_LEMAM(V) do { *(volatile unsigned long *)(0xfe000048) = (V); } while(0) +#define __set_LCR(R,V) do { *(volatile unsigned long *)(0xfe000100 + 8*(R)) = (V); } while(0) +#define __set_LSBR(R,V) do { *(volatile unsigned long *)(0xfe000c00 + 8*(R)) = (V); } while(0) +#define __set_LSAM(R,V) do { *(volatile unsigned long *)(0xfe000d00 + 8*(R)) = (V); } while(0) + +/* FR401 SDRAM controller registers */ +#define __get_DBR(R) ({ *(volatile unsigned long *)(0xfe000e00 + 8*(R)); }) +#define __get_DAM(R) ({ *(volatile unsigned long *)(0xfe000f00 + 8*(R)); }) + +/* FR551 SDRAM controller registers */ +#define __get_DARS(R) ({ *(volatile unsigned long *)(0xfeff0100 + 8*(R)); }) +#define __get_DAMK(R) ({ *(volatile unsigned long *)(0xfeff0110 + 8*(R)); }) + + +#endif /* _ASM_BUSCTL_REGS_H */ diff --git a/arch/frv/include/asm/byteorder.h b/arch/frv/include/asm/byteorder.h new file mode 100644 index 0000000..f29b759 --- /dev/null +++ b/arch/frv/include/asm/byteorder.h @@ -0,0 +1,6 @@ +#ifndef _ASM_BYTEORDER_H +#define _ASM_BYTEORDER_H + +#include + +#endif /* _ASM_BYTEORDER_H */ diff --git a/arch/frv/include/asm/cache.h b/arch/frv/include/asm/cache.h new file mode 100644 index 0000000..2797163 --- /dev/null +++ b/arch/frv/include/asm/cache.h @@ -0,0 +1,23 @@ +/* cache.h: FRV cache definitions + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef __ASM_CACHE_H +#define __ASM_CACHE_H + + +/* bytes per L1 cache line */ +#define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) +#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) + +#define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) +#define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) + +#endif diff --git a/arch/frv/include/asm/cacheflush.h b/arch/frv/include/asm/cacheflush.h new file mode 100644 index 0000000..432a69e --- /dev/null +++ b/arch/frv/include/asm/cacheflush.h @@ -0,0 +1,104 @@ +/* cacheflush.h: FRV cache flushing routines + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_CACHEFLUSH_H +#define _ASM_CACHEFLUSH_H + +/* Keep includes the same across arches. */ +#include + +/* + * virtually-indexed cache management (our cache is physically indexed) + */ +#define flush_cache_all() do {} while(0) +#define flush_cache_mm(mm) do {} while(0) +#define flush_cache_dup_mm(mm) do {} while(0) +#define flush_cache_range(mm, start, end) do {} while(0) +#define flush_cache_page(vma, vmaddr, pfn) do {} while(0) +#define flush_cache_vmap(start, end) do {} while(0) +#define flush_cache_vunmap(start, end) do {} while(0) +#define flush_dcache_mmap_lock(mapping) do {} while(0) +#define flush_dcache_mmap_unlock(mapping) do {} while(0) + +/* + * physically-indexed cache management + * - see arch/frv/lib/cache.S + */ +extern void frv_dcache_writeback(unsigned long start, unsigned long size); +extern void frv_cache_invalidate(unsigned long start, unsigned long size); +extern void frv_icache_invalidate(unsigned long start, unsigned long size); +extern void frv_cache_wback_inv(unsigned long start, unsigned long size); + +static inline void __flush_cache_all(void) +{ + asm volatile(" dcef @(gr0,gr0),#1 \n" + " icei @(gr0,gr0),#1 \n" + " membar \n" + : : : "memory" + ); +} + +/* dcache/icache coherency... */ +#ifdef CONFIG_MMU +extern void flush_dcache_page(struct page *page); +#else +static inline void flush_dcache_page(struct page *page) +{ + unsigned long addr = page_to_phys(page); + frv_dcache_writeback(addr, addr + PAGE_SIZE); +} +#endif + +static inline void flush_page_to_ram(struct page *page) +{ + flush_dcache_page(page); +} + +static inline void flush_icache(void) +{ + __flush_cache_all(); +} + +static inline void flush_icache_range(unsigned long start, unsigned long end) +{ + frv_cache_wback_inv(start, end); +} + +#ifdef CONFIG_MMU +extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, + unsigned long start, unsigned long len); +#else +static inline void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, + unsigned long start, unsigned long len) +{ + frv_cache_wback_inv(start, start + len); +} +#endif + +static inline void flush_icache_page(struct vm_area_struct *vma, struct page *page) +{ + flush_icache_user_range(vma, page, page_to_phys(page), PAGE_SIZE); +} + +/* + * permit ptrace to access another process's address space through the icache + * and the dcache + */ +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { \ + memcpy((dst), (src), (len)); \ + flush_icache_user_range((vma), (page), (vaddr), (len)); \ +} while(0) + +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy((dst), (src), (len)) + +#endif /* _ASM_CACHEFLUSH_H */ diff --git a/arch/frv/include/asm/checksum.h b/arch/frv/include/asm/checksum.h new file mode 100644 index 0000000..269da09 --- /dev/null +++ b/arch/frv/include/asm/checksum.h @@ -0,0 +1,180 @@ +/* checksum.h: FRV checksumming + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_CHECKSUM_H +#define _ASM_CHECKSUM_H + +#include + +/* + * computes the checksum of a memory block at buff, length len, + * and adds in "sum" (32-bit) + * + * returns a 32-bit number suitable for feeding into itself + * or csum_tcpudp_magic + * + * this function must be called with even lengths, except + * for the last fragment, which may be odd + * + * it's best to have buff aligned on a 32-bit boundary + */ +__wsum csum_partial(const void *buff, int len, __wsum sum); + +/* + * the same as csum_partial, but copies from src while it + * checksums + * + * here even more important to align src and dst on a 32-bit (or even + * better 64-bit) boundary + */ +__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum); + +/* + * the same as csum_partial_copy, but copies from user space. + * + * here even more important to align src and dst on a 32-bit (or even + * better 64-bit) boundary + */ +extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst, + int len, __wsum sum, int *csum_err); + +/* + * This is a version of ip_compute_csum() optimized for IP headers, + * which always checksum on 4 octet boundaries. + * + */ +static inline +__sum16 ip_fast_csum(const void *iph, unsigned int ihl) +{ + unsigned int tmp, inc, sum = 0; + + asm(" addcc gr0,gr0,gr0,icc0\n" /* clear icc0.C */ + " subi %1,#4,%1 \n" + "0: \n" + " ldu.p @(%1,%3),%4 \n" + " subicc %2,#1,%2,icc1 \n" + " addxcc.p %4,%0,%0,icc0 \n" + " bhi icc1,#2,0b \n" + + /* fold the 33-bit result into 16-bits */ + " addxcc gr0,%0,%0,icc0 \n" + " srli %0,#16,%1 \n" + " sethi #0,%0 \n" + " add %1,%0,%0 \n" + " srli %0,#16,%1 \n" + " add %1,%0,%0 \n" + + : "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (inc), "=&r"(tmp) + : "0" (sum), "1" (iph), "2" (ihl), "3" (4), + "m"(*(volatile struct { int _[100]; } *)iph) + : "icc0", "icc1", "memory" + ); + + return (__force __sum16)~sum; +} + +/* + * Fold a partial checksum + */ +static inline __sum16 csum_fold(__wsum sum) +{ + unsigned int tmp; + + asm(" srli %0,#16,%1 \n" + " sethi #0,%0 \n" + " add %1,%0,%0 \n" + " srli %0,#16,%1 \n" + " add %1,%0,%0 \n" + : "=r"(sum), "=&r"(tmp) + : "0"(sum) + ); + + return (__force __sum16)~sum; +} + +/* + * computes the checksum of the TCP/UDP pseudo-header + * returns a 16-bit checksum, already complemented + */ +static inline __wsum +csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, + unsigned short proto, __wsum sum) +{ + asm(" addcc %1,%0,%0,icc0 \n" + " addxcc %2,%0,%0,icc0 \n" + " addxcc %3,%0,%0,icc0 \n" + " addxcc gr0,%0,%0,icc0 \n" + : "=r" (sum) + : "r" (daddr), "r" (saddr), "r" (len + proto), "0"(sum) + : "icc0" + ); + return sum; +} + +static inline __sum16 +csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len, + unsigned short proto, __wsum sum) +{ + return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); +} + +/* + * this routine is used for miscellaneous IP-like checksums, mainly + * in icmp.c + */ +extern __sum16 ip_compute_csum(const void *buff, int len); + +#define _HAVE_ARCH_IPV6_CSUM +static inline __sum16 +csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, + __u32 len, unsigned short proto, __wsum sum) +{ + unsigned long tmp, tmp2; + + asm(" addcc %2,%0,%0,icc0 \n" + + /* add up the source addr */ + " ldi @(%3,0),%1 \n" + " addxcc %1,%0,%0,icc0 \n" + " ldi @(%3,4),%2 \n" + " addxcc %2,%0,%0,icc0 \n" + " ldi @(%3,8),%1 \n" + " addxcc %1,%0,%0,icc0 \n" + " ldi @(%3,12),%2 \n" + " addxcc %2,%0,%0,icc0 \n" + + /* add up the dest addr */ + " ldi @(%4,0),%1 \n" + " addxcc %1,%0,%0,icc0 \n" + " ldi @(%4,4),%2 \n" + " addxcc %2,%0,%0,icc0 \n" + " ldi @(%4,8),%1 \n" + " addxcc %1,%0,%0,icc0 \n" + " ldi @(%4,12),%2 \n" + " addxcc %2,%0,%0,icc0 \n" + + /* fold the 33-bit result into 16-bits */ + " addxcc gr0,%0,%0,icc0 \n" + " srli %0,#16,%1 \n" + " sethi #0,%0 \n" + " add %1,%0,%0 \n" + " srli %0,#16,%1 \n" + " add %1,%0,%0 \n" + + : "=r" (sum), "=&r" (tmp), "=r" (tmp2) + : "r" (saddr), "r" (daddr), "0" (sum), "2" (len + proto) + : "icc0" + ); + + return (__force __sum16)~sum; +} + +#endif /* _ASM_CHECKSUM_H */ diff --git a/arch/frv/include/asm/cpu-irqs.h b/arch/frv/include/asm/cpu-irqs.h new file mode 100644 index 0000000..478f349 --- /dev/null +++ b/arch/frv/include/asm/cpu-irqs.h @@ -0,0 +1,81 @@ +/* cpu-irqs.h: on-CPU peripheral irqs + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_CPU_IRQS_H +#define _ASM_CPU_IRQS_H + +#ifndef __ASSEMBLY__ + +/* IRQ to level mappings */ +#define IRQ_GDBSTUB_LEVEL 15 +#define IRQ_UART_LEVEL 13 + +#ifdef CONFIG_GDBSTUB_UART0 +#define IRQ_UART0_LEVEL IRQ_GDBSTUB_LEVEL +#else +#define IRQ_UART0_LEVEL IRQ_UART_LEVEL +#endif + +#ifdef CONFIG_GDBSTUB_UART1 +#define IRQ_UART1_LEVEL IRQ_GDBSTUB_LEVEL +#else +#define IRQ_UART1_LEVEL IRQ_UART_LEVEL +#endif + +#define IRQ_DMA0_LEVEL 14 +#define IRQ_DMA1_LEVEL 14 +#define IRQ_DMA2_LEVEL 14 +#define IRQ_DMA3_LEVEL 14 +#define IRQ_DMA4_LEVEL 14 +#define IRQ_DMA5_LEVEL 14 +#define IRQ_DMA6_LEVEL 14 +#define IRQ_DMA7_LEVEL 14 + +#define IRQ_TIMER0_LEVEL 12 +#define IRQ_TIMER1_LEVEL 11 +#define IRQ_TIMER2_LEVEL 10 + +#define IRQ_XIRQ0_LEVEL 1 +#define IRQ_XIRQ1_LEVEL 2 +#define IRQ_XIRQ2_LEVEL 3 +#define IRQ_XIRQ3_LEVEL 4 +#define IRQ_XIRQ4_LEVEL 5 +#define IRQ_XIRQ5_LEVEL 6 +#define IRQ_XIRQ6_LEVEL 7 +#define IRQ_XIRQ7_LEVEL 8 + +/* IRQ IDs presented to drivers */ +#define IRQ_CPU__UNUSED IRQ_BASE_CPU +#define IRQ_CPU_UART0 (IRQ_BASE_CPU + IRQ_UART0_LEVEL) +#define IRQ_CPU_UART1 (IRQ_BASE_CPU + IRQ_UART1_LEVEL) +#define IRQ_CPU_TIMER0 (IRQ_BASE_CPU + IRQ_TIMER0_LEVEL) +#define IRQ_CPU_TIMER1 (IRQ_BASE_CPU + IRQ_TIMER1_LEVEL) +#define IRQ_CPU_TIMER2 (IRQ_BASE_CPU + IRQ_TIMER2_LEVEL) +#define IRQ_CPU_DMA0 (IRQ_BASE_CPU + IRQ_DMA0_LEVEL) +#define IRQ_CPU_DMA1 (IRQ_BASE_CPU + IRQ_DMA1_LEVEL) +#define IRQ_CPU_DMA2 (IRQ_BASE_CPU + IRQ_DMA2_LEVEL) +#define IRQ_CPU_DMA3 (IRQ_BASE_CPU + IRQ_DMA3_LEVEL) +#define IRQ_CPU_DMA4 (IRQ_BASE_CPU + IRQ_DMA4_LEVEL) +#define IRQ_CPU_DMA5 (IRQ_BASE_CPU + IRQ_DMA5_LEVEL) +#define IRQ_CPU_DMA6 (IRQ_BASE_CPU + IRQ_DMA6_LEVEL) +#define IRQ_CPU_DMA7 (IRQ_BASE_CPU + IRQ_DMA7_LEVEL) +#define IRQ_CPU_EXTERNAL0 (IRQ_BASE_CPU + IRQ_XIRQ0_LEVEL) +#define IRQ_CPU_EXTERNAL1 (IRQ_BASE_CPU + IRQ_XIRQ1_LEVEL) +#define IRQ_CPU_EXTERNAL2 (IRQ_BASE_CPU + IRQ_XIRQ2_LEVEL) +#define IRQ_CPU_EXTERNAL3 (IRQ_BASE_CPU + IRQ_XIRQ3_LEVEL) +#define IRQ_CPU_EXTERNAL4 (IRQ_BASE_CPU + IRQ_XIRQ4_LEVEL) +#define IRQ_CPU_EXTERNAL5 (IRQ_BASE_CPU + IRQ_XIRQ5_LEVEL) +#define IRQ_CPU_EXTERNAL6 (IRQ_BASE_CPU + IRQ_XIRQ6_LEVEL) +#define IRQ_CPU_EXTERNAL7 (IRQ_BASE_CPU + IRQ_XIRQ7_LEVEL) + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_CPU_IRQS_H */ diff --git a/arch/frv/include/asm/cpumask.h b/arch/frv/include/asm/cpumask.h new file mode 100644 index 0000000..d999c20 --- /dev/null +++ b/arch/frv/include/asm/cpumask.h @@ -0,0 +1,6 @@ +#ifndef _ASM_CPUMASK_H +#define _ASM_CPUMASK_H + +#include + +#endif /* _ASM_CPUMASK_H */ diff --git a/arch/frv/include/asm/cputime.h b/arch/frv/include/asm/cputime.h new file mode 100644 index 0000000..f6c373a --- /dev/null +++ b/arch/frv/include/asm/cputime.h @@ -0,0 +1,6 @@ +#ifndef _ASM_CPUTIME_H +#define _ASM_CPUTIME_H + +#include + +#endif /* _ASM_CPUTIME_H */ diff --git a/arch/frv/include/asm/current.h b/arch/frv/include/asm/current.h new file mode 100644 index 0000000..86b0274 --- /dev/null +++ b/arch/frv/include/asm/current.h @@ -0,0 +1,30 @@ +/* current.h: FRV current task pointer + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_CURRENT_H +#define _ASM_CURRENT_H + +#ifndef __ASSEMBLY__ + +/* + * dedicate GR29 to keeping the current task pointer + */ +register struct task_struct *current asm("gr29"); + +#define get_current() current + +#else + +#define CURRENT gr29 + +#endif + +#endif /* _ASM_CURRENT_H */ diff --git a/arch/frv/include/asm/delay.h b/arch/frv/include/asm/delay.h new file mode 100644 index 0000000..597b4eb --- /dev/null +++ b/arch/frv/include/asm/delay.h @@ -0,0 +1,50 @@ +/* delay.h: FRV delay code + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_DELAY_H +#define _ASM_DELAY_H + +#include +#include + +/* + * delay loop - runs at __core_clock_speed_HZ / 2 [there are 2 insns in the loop] + */ +extern unsigned long __delay_loops_MHz; + +static inline void __delay(unsigned long loops) +{ + asm volatile("1: subicc %0,#1,%0,icc0 \n" + " bnc icc0,#2,1b \n" + : "=r" (loops) + : "0" (loops) + : "icc0" + ); +} + +/* + * Use only for very small delays ( < 1 msec). Should probably use a + * lookup table, really, as the multiplications take much too long with + * short delays. This is a "reasonable" implementation, though (and the + * first constant multiplications gets optimized away if the delay is + * a constant) + */ + +extern unsigned long loops_per_jiffy; + +static inline void udelay(unsigned long usecs) +{ + __delay(usecs * __delay_loops_MHz); +} + +#define ndelay(n) udelay((n) * 5) + +#endif /* _ASM_DELAY_H */ diff --git a/arch/frv/include/asm/device.h b/arch/frv/include/asm/device.h new file mode 100644 index 0000000..d8f9872 --- /dev/null +++ b/arch/frv/include/asm/device.h @@ -0,0 +1,7 @@ +/* + * Arch specific extensions to struct device + * + * This file is released under the GPLv2 + */ +#include + diff --git a/arch/frv/include/asm/div64.h b/arch/frv/include/asm/div64.h new file mode 100644 index 0000000..6cd978c --- /dev/null +++ b/arch/frv/include/asm/div64.h @@ -0,0 +1 @@ +#include diff --git a/arch/frv/include/asm/dm9000.h b/arch/frv/include/asm/dm9000.h new file mode 100644 index 0000000..f6f48fd --- /dev/null +++ b/arch/frv/include/asm/dm9000.h @@ -0,0 +1,37 @@ +/* dm9000.h: Davicom DM9000 adapter configuration + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_DM9000_H +#define _ASM_DM9000_H + +#include + +#define DM9000_ARCH_IOBASE (__region_CS6 + 0x300) +#define DM9000_ARCH_IRQ IRQ_CPU_EXTERNAL3 /* XIRQ #3 (shared with FPGA) */ +#undef DM9000_ARCH_IRQ_ACTLOW /* IRQ pin active high */ +#define DM9000_ARCH_BUS_INFO "CS6#+0x300" /* bus info for ethtool */ + +#undef __is_PCI_IO +#define __is_PCI_IO(addr) 0 /* not PCI */ + +#undef inl +#define inl(addr) \ +({ \ + unsigned long __ioaddr = (unsigned long) addr; \ + uint32_t x = readl(__ioaddr); \ + ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | ((x >> 24) & 0xff); \ +}) + +#undef insl +#define insl(a,b,l) __insl(a,b,l,0) /* don't byte-swap */ + + +#endif /* _ASM_DM9000_H */ diff --git a/arch/frv/include/asm/dma-mapping.h b/arch/frv/include/asm/dma-mapping.h new file mode 100644 index 0000000..b289887 --- /dev/null +++ b/arch/frv/include/asm/dma-mapping.h @@ -0,0 +1,174 @@ +#ifndef _ASM_DMA_MAPPING_H +#define _ASM_DMA_MAPPING_H + +#include +#include +#include +#include +#include + +#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) +#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) + +extern unsigned long __nongprelbss dma_coherent_mem_start; +extern unsigned long __nongprelbss dma_coherent_mem_end; + +void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp); +void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle); + +/* + * Map a single buffer of the indicated size for DMA in streaming mode. + * The 32-bit bus address to use is returned. + * + * Once the device is given the dma address, the device owns this memory + * until either pci_unmap_single or pci_dma_sync_single is performed. + */ +extern dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, + enum dma_data_direction direction); + +/* + * Unmap a single streaming mode DMA translation. The dma_addr and size + * must match what was provided for in a previous pci_map_single call. All + * other usages are undefined. + * + * After this call, reads by the cpu to the buffer are guarenteed to see + * whatever the device wrote there. + */ +static inline +void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); +} + +/* + * Map a set of buffers described by scatterlist in streaming + * mode for DMA. This is the scather-gather version of the + * above pci_map_single interface. Here the scatter gather list + * elements are each tagged with the appropriate dma address + * and length. They are obtained via sg_dma_{address,length}(SG). + * + * NOTE: An implementation may be able to use a smaller number of + * DMA address/length pairs than there are SG table elements. + * (for example via virtual mapping capabilities) + * The routine returns the number of addr/length pairs actually + * used, at most nents. + * + * Device ownership issues as mentioned above for pci_map_single are + * the same here. + */ +extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, + enum dma_data_direction direction); + +/* + * Unmap a set of streaming mode DMA translations. + * Again, cpu read rules concerning calls here are the same as for + * pci_unmap_single() above. + */ +static inline +void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); +} + +extern +dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, + size_t size, enum dma_data_direction direction); + +static inline +void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); +} + + +static inline +void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, + enum dma_data_direction direction) +{ +} + +static inline +void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, + enum dma_data_direction direction) +{ + flush_write_buffers(); +} + +static inline +void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ +} + +static inline +void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ + flush_write_buffers(); +} + +static inline +void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ +} + +static inline +void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ + flush_write_buffers(); +} + +static inline +int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) +{ + return 0; +} + +static inline +int dma_supported(struct device *dev, u64 mask) +{ + /* + * we fall back to GFP_DMA when the mask isn't all 1s, + * so we can't guarantee allocations that must be + * within a tighter range than GFP_DMA.. + */ + if (mask < 0x00ffffff) + return 0; + + return 1; +} + +static inline +int dma_set_mask(struct device *dev, u64 mask) +{ + if (!dev->dma_mask || !dma_supported(dev, mask)) + return -EIO; + + *dev->dma_mask = mask; + + return 0; +} + +static inline +int dma_get_cache_alignment(void) +{ + return 1 << L1_CACHE_SHIFT; +} + +#define dma_is_consistent(d, h) (1) + +static inline +void dma_cache_sync(struct device *dev, void *vaddr, size_t size, + enum dma_data_direction direction) +{ + flush_write_buffers(); +} + +#endif /* _ASM_DMA_MAPPING_H */ diff --git a/arch/frv/include/asm/dma.h b/arch/frv/include/asm/dma.h new file mode 100644 index 0000000..683c47d --- /dev/null +++ b/arch/frv/include/asm/dma.h @@ -0,0 +1,125 @@ +/* dma.h: FRV DMA controller management + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_DMA_H +#define _ASM_DMA_H + +//#define DMA_DEBUG 1 + +#include + +#undef MAX_DMA_CHANNELS /* don't use kernel/dma.c */ + +/* under 2.4 this is actually needed by the new bootmem allocator */ +#define MAX_DMA_ADDRESS PAGE_OFFSET + +/* + * FRV DMA controller management + */ +typedef irqreturn_t (*dma_irq_handler_t)(int dmachan, unsigned long cstr, void *data); + +extern void frv_dma_init(void); + +extern int frv_dma_open(const char *devname, + unsigned long dmamask, + int dmacap, + dma_irq_handler_t handler, + unsigned long irq_flags, + void *data); + +/* channels required */ +#define FRV_DMA_MASK_ANY ULONG_MAX /* any channel */ + +/* capabilities required */ +#define FRV_DMA_CAP_DREQ 0x01 /* DMA request pin */ +#define FRV_DMA_CAP_DACK 0x02 /* DMA ACK pin */ +#define FRV_DMA_CAP_DONE 0x04 /* DMA done pin */ + +extern void frv_dma_close(int dma); + +extern void frv_dma_config(int dma, unsigned long ccfr, unsigned long cctr, unsigned long apr); + +extern void frv_dma_start(int dma, + unsigned long sba, unsigned long dba, + unsigned long pix, unsigned long six, unsigned long bcl); + +extern void frv_dma_restart_circular(int dma, unsigned long six); + +extern void frv_dma_stop(int dma); + +extern int is_frv_dma_interrupting(int dma); + +extern void frv_dma_dump(int dma); + +extern void frv_dma_status_clear(int dma); + +#define FRV_DMA_NCHANS 8 +#define FRV_DMA_4CHANS 4 +#define FRV_DMA_8CHANS 8 + +#define DMAC_CCFRx 0x00 /* channel configuration reg */ +#define DMAC_CCFRx_CM_SHIFT 16 +#define DMAC_CCFRx_CM_DA 0x00000000 +#define DMAC_CCFRx_CM_SCA 0x00010000 +#define DMAC_CCFRx_CM_DCA 0x00020000 +#define DMAC_CCFRx_CM_2D 0x00030000 +#define DMAC_CCFRx_ATS_SHIFT 8 +#define DMAC_CCFRx_RS_INTERN 0x00000000 +#define DMAC_CCFRx_RS_EXTERN 0x00000001 +#define DMAC_CCFRx_RS_SHIFT 0 + +#define DMAC_CSTRx 0x08 /* channel status reg */ +#define DMAC_CSTRx_FS 0x0000003f +#define DMAC_CSTRx_NE 0x00000100 +#define DMAC_CSTRx_FED 0x00000200 +#define DMAC_CSTRx_WER 0x00000800 +#define DMAC_CSTRx_RER 0x00001000 +#define DMAC_CSTRx_CE 0x00002000 +#define DMAC_CSTRx_INT 0x00800000 +#define DMAC_CSTRx_BUSY 0x80000000 + +#define DMAC_CCTRx 0x10 /* channel control reg */ +#define DMAC_CCTRx_DSIZ_1 0x00000000 +#define DMAC_CCTRx_DSIZ_2 0x00000001 +#define DMAC_CCTRx_DSIZ_4 0x00000002 +#define DMAC_CCTRx_DSIZ_32 0x00000005 +#define DMAC_CCTRx_DAU_HOLD 0x00000000 +#define DMAC_CCTRx_DAU_INC 0x00000010 +#define DMAC_CCTRx_DAU_DEC 0x00000020 +#define DMAC_CCTRx_SSIZ_1 0x00000000 +#define DMAC_CCTRx_SSIZ_2 0x00000100 +#define DMAC_CCTRx_SSIZ_4 0x00000200 +#define DMAC_CCTRx_SSIZ_32 0x00000500 +#define DMAC_CCTRx_SAU_HOLD 0x00000000 +#define DMAC_CCTRx_SAU_INC 0x00001000 +#define DMAC_CCTRx_SAU_DEC 0x00002000 +#define DMAC_CCTRx_FC 0x08000000 +#define DMAC_CCTRx_ICE 0x10000000 +#define DMAC_CCTRx_IE 0x40000000 +#define DMAC_CCTRx_ACT 0x80000000 + +#define DMAC_SBAx 0x18 /* source base address reg */ +#define DMAC_DBAx 0x20 /* data base address reg */ +#define DMAC_PIXx 0x28 /* primary index reg */ +#define DMAC_SIXx 0x30 /* secondary index reg */ +#define DMAC_BCLx 0x38 /* byte count limit reg */ +#define DMAC_APRx 0x40 /* alternate pointer reg */ + +/* + * required for PCI + MODULES + */ +#ifdef CONFIG_PCI +extern int isa_dma_bridge_buggy; +#else +#define isa_dma_bridge_buggy (0) +#endif + +#endif /* _ASM_DMA_H */ diff --git a/arch/frv/include/asm/elf.h b/arch/frv/include/asm/elf.h new file mode 100644 index 0000000..7279ec07d --- /dev/null +++ b/arch/frv/include/asm/elf.h @@ -0,0 +1,142 @@ +/* elf.h: FR-V ELF definitions + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from include/asm-m68knommu/elf.h + * + * 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. + */ +#ifndef __ASM_ELF_H +#define __ASM_ELF_H + +#include +#include + +struct elf32_hdr; + +/* + * ELF header e_flags defines. + */ +#define EF_FRV_GPR_MASK 0x00000003 /* mask for # of gprs */ +#define EF_FRV_GPR32 0x00000001 /* Only uses GR on 32-register */ +#define EF_FRV_GPR64 0x00000002 /* Only uses GR on 64-register */ +#define EF_FRV_FPR_MASK 0x0000000c /* mask for # of fprs */ +#define EF_FRV_FPR32 0x00000004 /* Only uses FR on 32-register */ +#define EF_FRV_FPR64 0x00000008 /* Only uses FR on 64-register */ +#define EF_FRV_FPR_NONE 0x0000000C /* Uses software floating-point */ +#define EF_FRV_DWORD_MASK 0x00000030 /* mask for dword support */ +#define EF_FRV_DWORD_YES 0x00000010 /* Assumes stack aligned to 8-byte boundaries. */ +#define EF_FRV_DWORD_NO 0x00000020 /* Assumes stack aligned to 4-byte boundaries. */ +#define EF_FRV_DOUBLE 0x00000040 /* Uses double instructions. */ +#define EF_FRV_MEDIA 0x00000080 /* Uses media instructions. */ +#define EF_FRV_PIC 0x00000100 /* Uses position independent code. */ +#define EF_FRV_NON_PIC_RELOCS 0x00000200 /* Does not use position Independent code. */ +#define EF_FRV_MULADD 0x00000400 /* -mmuladd */ +#define EF_FRV_BIGPIC 0x00000800 /* -fPIC */ +#define EF_FRV_LIBPIC 0x00001000 /* -mlibrary-pic */ +#define EF_FRV_G0 0x00002000 /* -G 0, no small data ptr */ +#define EF_FRV_NOPACK 0x00004000 /* -mnopack */ +#define EF_FRV_FDPIC 0x00008000 /* -mfdpic */ +#define EF_FRV_CPU_MASK 0xff000000 /* specific cpu bits */ +#define EF_FRV_CPU_GENERIC 0x00000000 /* Set CPU type is FR-V */ +#define EF_FRV_CPU_FR500 0x01000000 /* Set CPU type is FR500 */ +#define EF_FRV_CPU_FR300 0x02000000 /* Set CPU type is FR300 */ +#define EF_FRV_CPU_SIMPLE 0x03000000 /* SIMPLE */ +#define EF_FRV_CPU_TOMCAT 0x04000000 /* Tomcat, FR500 prototype */ +#define EF_FRV_CPU_FR400 0x05000000 /* Set CPU type is FR400 */ +#define EF_FRV_CPU_FR550 0x06000000 /* Set CPU type is FR550 */ +#define EF_FRV_CPU_FR405 0x07000000 /* Set CPU type is FR405 */ +#define EF_FRV_CPU_FR450 0x08000000 /* Set CPU type is FR450 */ + +/* + * FR-V ELF relocation types + */ + + +/* + * ELF register definitions.. + */ +typedef unsigned long elf_greg_t; + +#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +typedef struct user_fpmedia_regs elf_fpregset_t; + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +extern int elf_check_arch(const struct elf32_hdr *hdr); + +#define elf_check_fdpic(x) ((x)->e_flags & EF_FRV_FDPIC && !((x)->e_flags & EF_FRV_NON_PIC_RELOCS)) +#define elf_check_const_displacement(x) ((x)->e_flags & EF_FRV_PIC) + +/* + * These are used to set parameters in the core dumps. + */ +#define ELF_CLASS ELFCLASS32 +#define ELF_DATA ELFDATA2MSB +#define ELF_ARCH EM_FRV + +#define ELF_PLAT_INIT(_r) \ +do { \ + __kernel_frame0_ptr->gr16 = 0; \ + __kernel_frame0_ptr->gr17 = 0; \ + __kernel_frame0_ptr->gr18 = 0; \ + __kernel_frame0_ptr->gr19 = 0; \ + __kernel_frame0_ptr->gr20 = 0; \ + __kernel_frame0_ptr->gr21 = 0; \ + __kernel_frame0_ptr->gr22 = 0; \ + __kernel_frame0_ptr->gr23 = 0; \ + __kernel_frame0_ptr->gr24 = 0; \ + __kernel_frame0_ptr->gr25 = 0; \ + __kernel_frame0_ptr->gr26 = 0; \ + __kernel_frame0_ptr->gr27 = 0; \ + __kernel_frame0_ptr->gr29 = 0; \ +} while(0) + +#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map_addr, _interp_map_addr, _dynamic_addr) \ +do { \ + __kernel_frame0_ptr->gr16 = _exec_map_addr; \ + __kernel_frame0_ptr->gr17 = _interp_map_addr; \ + __kernel_frame0_ptr->gr18 = _dynamic_addr; \ + __kernel_frame0_ptr->gr19 = 0; \ + __kernel_frame0_ptr->gr20 = 0; \ + __kernel_frame0_ptr->gr21 = 0; \ + __kernel_frame0_ptr->gr22 = 0; \ + __kernel_frame0_ptr->gr23 = 0; \ + __kernel_frame0_ptr->gr24 = 0; \ + __kernel_frame0_ptr->gr25 = 0; \ + __kernel_frame0_ptr->gr26 = 0; \ + __kernel_frame0_ptr->gr27 = 0; \ + __kernel_frame0_ptr->gr29 = 0; \ +} while(0) + +#define USE_ELF_CORE_DUMP +#define ELF_FDPIC_CORE_EFLAGS EF_FRV_FDPIC +#define ELF_EXEC_PAGESIZE 16384 + +/* This is the location that an ET_DYN program is loaded if exec'ed. Typical + use of this is to invoke "./ld.so someprog" to test out a new version of + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +#define ELF_ET_DYN_BASE 0x08000000UL + +/* This yields a mask that user programs can use to figure out what + instruction set this cpu supports. */ + +#define ELF_HWCAP (0) + +/* This yields a string that ld.so will use to load implementation + specific libraries for optimization. This is more specific in + intent than poking at uname or /proc/cpuinfo. */ + +#define ELF_PLATFORM (NULL) + +#define SET_PERSONALITY(ex) set_personality(PER_LINUX) + +#endif diff --git a/arch/frv/include/asm/emergency-restart.h b/arch/frv/include/asm/emergency-restart.h new file mode 100644 index 0000000..108d8c4 --- /dev/null +++ b/arch/frv/include/asm/emergency-restart.h @@ -0,0 +1,6 @@ +#ifndef _ASM_EMERGENCY_RESTART_H +#define _ASM_EMERGENCY_RESTART_H + +#include + +#endif /* _ASM_EMERGENCY_RESTART_H */ diff --git a/arch/frv/include/asm/errno.h b/arch/frv/include/asm/errno.h new file mode 100644 index 0000000..d010795c --- /dev/null +++ b/arch/frv/include/asm/errno.h @@ -0,0 +1,7 @@ +#ifndef _ASM_ERRNO_H +#define _ASM_ERRNO_H + +#include + +#endif /* _ASM_ERRNO_H */ + diff --git a/arch/frv/include/asm/fb.h b/arch/frv/include/asm/fb.h new file mode 100644 index 0000000..c7df380 --- /dev/null +++ b/arch/frv/include/asm/fb.h @@ -0,0 +1,12 @@ +#ifndef _ASM_FB_H_ +#define _ASM_FB_H_ +#include + +#define fb_pgprotect(...) do {} while (0) + +static inline int fb_is_primary_device(struct fb_info *info) +{ + return 0; +} + +#endif /* _ASM_FB_H_ */ diff --git a/arch/frv/include/asm/fcntl.h b/arch/frv/include/asm/fcntl.h new file mode 100644 index 0000000..46ab12d --- /dev/null +++ b/arch/frv/include/asm/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/arch/frv/include/asm/fpu.h b/arch/frv/include/asm/fpu.h new file mode 100644 index 0000000..d73c60b --- /dev/null +++ b/arch/frv/include/asm/fpu.h @@ -0,0 +1,11 @@ +#ifndef __ASM_FPU_H +#define __ASM_FPU_H + + +/* + * MAX floating point unit state size (FSAVE/FRESTORE) + */ + +#define kernel_fpu_end() do { asm volatile("bar":::"memory"); preempt_enable(); } while(0) + +#endif /* __ASM_FPU_H */ diff --git a/arch/frv/include/asm/ftrace.h b/arch/frv/include/asm/ftrace.h new file mode 100644 index 0000000..40a8c17 --- /dev/null +++ b/arch/frv/include/asm/ftrace.h @@ -0,0 +1 @@ +/* empty */ diff --git a/arch/frv/include/asm/futex.h b/arch/frv/include/asm/futex.h new file mode 100644 index 0000000..08b3d1d --- /dev/null +++ b/arch/frv/include/asm/futex.h @@ -0,0 +1,19 @@ +#ifndef _ASM_FUTEX_H +#define _ASM_FUTEX_H + +#ifdef __KERNEL__ + +#include +#include +#include + +extern int futex_atomic_op_inuser(int encoded_op, int __user *uaddr); + +static inline int +futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +{ + return -ENOSYS; +} + +#endif +#endif diff --git a/arch/frv/include/asm/gdb-stub.h b/arch/frv/include/asm/gdb-stub.h new file mode 100644 index 0000000..24f9738 --- /dev/null +++ b/arch/frv/include/asm/gdb-stub.h @@ -0,0 +1,140 @@ +/* gdb-stub.h: FRV GDB stub + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from asm-mips/gdb-stub.h (c) 1995 Andreas Busse + * + * 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. + */ +#ifndef __ASM_GDB_STUB_H +#define __ASM_GDB_STUB_H + +#undef GDBSTUB_DEBUG_PROTOCOL + +#include + +/* + * important register numbers in GDB protocol + * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7, + * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15, + * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23, + * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31, + * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39, + * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47, + * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55, + * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63, + * - FR0, FR1, FR2, FR3, FR4, FR5, FR6, FR7, + * - FR8, FR9, FR10, FR11, FR12, FR13, FR14, FR15, + * - FR16, FR17, FR18, FR19, FR20, FR21, FR22, FR23, + * - FR24, FR25, FR26, FR27, FR28, FR29, FR30, FR31, + * - FR32, FR33, FR34, FR35, FR36, FR37, FR38, FR39, + * - FR40, FR41, FR42, FR43, FR44, FR45, FR46, FR47, + * - FR48, FR49, FR50, FR51, FR52, FR53, FR54, FR55, + * - FR56, FR57, FR58, FR59, FR60, FR61, FR62, FR63, + * - PC, PSR, CCR, CCCR, + * - _X132, _X133, _X134 + * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3, + * - SCR0, SCR1, SCR2, SCR3, + * - LR, LCR, + * - IACC0H, IACC0L, + * - FSR0, + * - ACC0, ACC1, ACC2, ACC3, ACC4, ACC5, ACC6, ACC7, + * - ACCG0123, ACCG4567, + * - MSR0, MSR1, + * - GNER0, GNER1, + * - FNER0, FNER1, + */ +#define GDB_REG_GR(N) (N) +#define GDB_REG_FR(N) (64+(N)) +#define GDB_REG_PC 128 +#define GDB_REG_PSR 129 +#define GDB_REG_CCR 130 +#define GDB_REG_CCCR 131 +#define GDB_REG_TBR 135 +#define GDB_REG_BRR 136 +#define GDB_REG_DBAR(N) (137+(N)) +#define GDB_REG_SCR(N) (141+(N)) +#define GDB_REG_LR 145 +#define GDB_REG_LCR 146 +#define GDB_REG_FSR0 149 +#define GDB_REG_ACC(N) (150+(N)) +#define GDB_REG_ACCG(N) (158+(N)/4) +#define GDB_REG_MSR(N) (160+(N)) +#define GDB_REG_GNER(N) (162+(N)) +#define GDB_REG_FNER(N) (164+(N)) + +#define GDB_REG_SP GDB_REG_GR(1) +#define GDB_REG_FP GDB_REG_GR(2) + +#ifndef _LANGUAGE_ASSEMBLY + +/* + * Prototypes + */ +extern void show_registers_only(struct pt_regs *regs); + +extern void gdbstub_init(void); +extern void gdbstub(int type); +extern void gdbstub_exit(int status); + +extern void gdbstub_io_init(void); +extern void gdbstub_set_baud(unsigned baud); +extern int gdbstub_rx_char(unsigned char *_ch, int nonblock); +extern void gdbstub_tx_char(unsigned char ch); +extern void gdbstub_tx_flush(void); +extern void gdbstub_do_rx(void); + +extern asmlinkage void __debug_stub_init_break(void); +extern asmlinkage void __break_hijack_kernel_event(void); +extern asmlinkage void __break_hijack_kernel_event_breaks_here(void); +extern asmlinkage void start_kernel(void); + +extern asmlinkage void gdbstub_rx_handler(void); +extern asmlinkage void gdbstub_rx_irq(void); +extern asmlinkage void gdbstub_intercept(void); + +extern uint32_t __entry_usertrap_table[]; +extern uint32_t __entry_kerneltrap_table[]; + +extern volatile u8 gdbstub_rx_buffer[PAGE_SIZE]; +extern volatile u32 gdbstub_rx_inp; +extern volatile u32 gdbstub_rx_outp; +extern volatile u8 gdbstub_rx_overflow; +extern u8 gdbstub_rx_unget; + +extern void gdbstub_printk(const char *fmt, ...); +extern void debug_to_serial(const char *p, int n); +extern void console_set_baud(unsigned baud); + +#ifdef GDBSTUB_DEBUG_PROTOCOL +#define gdbstub_proto(FMT,...) gdbstub_printk(FMT,##__VA_ARGS__) +#else +#define gdbstub_proto(FMT,...) ({ 0; }) +#endif + +/* + * we dedicate GR31 to keeping a pointer to the gdbstub exception frame + * - gr31 is destroyed on entry to the gdbstub if !MMU + * - gr31 is saved in scr3 on entry to the gdbstub if in !MMU + */ +register struct frv_frame0 *__debug_frame0 asm("gr31"); + +#define __debug_frame (&__debug_frame0->regs) +#define __debug_user_context (&__debug_frame0->uc) +#define __debug_regs (&__debug_frame0->debug) +#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X))) + +struct frv_debug_status { + unsigned long bpsr; + unsigned long dcr; + unsigned long brr; + unsigned long nmar; +}; + +extern struct frv_debug_status __debug_status; + +#endif /* _LANGUAGE_ASSEMBLY */ +#endif /* __ASM_GDB_STUB_H */ diff --git a/arch/frv/include/asm/gpio-regs.h b/arch/frv/include/asm/gpio-regs.h new file mode 100644 index 0000000..9edf5d5 --- /dev/null +++ b/arch/frv/include/asm/gpio-regs.h @@ -0,0 +1,116 @@ +/* gpio-regs.h: on-chip general purpose I/O registers + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_GPIO_REGS +#define _ASM_GPIO_REGS + +#define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) + +#define __get_PDR() ({ __reg(0xfeff0400); }) +#define __set_PDR(V) do { __reg(0xfeff0400) = (V); mb(); } while(0) + +#define __get_GPDR() ({ __reg(0xfeff0408); }) +#define __set_GPDR(V) do { __reg(0xfeff0408) = (V); mb(); } while(0) + +#define __get_SIR() ({ __reg(0xfeff0410); }) +#define __set_SIR(V) do { __reg(0xfeff0410) = (V); mb(); } while(0) + +#define __get_SOR() ({ __reg(0xfeff0418); }) +#define __set_SOR(V) do { __reg(0xfeff0418) = (V); mb(); } while(0) + +#define __set_PDSR(V) do { __reg(0xfeff0420) = (V); mb(); } while(0) + +#define __set_PDCR(V) do { __reg(0xfeff0428) = (V); mb(); } while(0) + +#define __get_RSTR() ({ __reg(0xfeff0500); }) +#define __set_RSTR(V) do { __reg(0xfeff0500) = (V); mb(); } while(0) + + + +/* PDR definitions */ +#define PDR_GPIO_DATA(X) (1 << (X)) + +/* GPDR definitions */ +#define GPDR_INPUT 0 +#define GPDR_OUTPUT 1 +#define GPDR_DREQ0_BIT 0x00001000 +#define GPDR_DREQ1_BIT 0x00008000 +#define GPDR_DREQ2_BIT 0x00040000 +#define GPDR_DREQ3_BIT 0x00080000 +#define GPDR_DREQ4_BIT 0x00004000 +#define GPDR_DREQ5_BIT 0x00020000 +#define GPDR_DREQ6_BIT 0x00100000 +#define GPDR_DREQ7_BIT 0x00200000 +#define GPDR_DACK0_BIT 0x00002000 +#define GPDR_DACK1_BIT 0x00010000 +#define GPDR_DACK2_BIT 0x00100000 +#define GPDR_DACK3_BIT 0x00200000 +#define GPDR_DONE0_BIT 0x00004000 +#define GPDR_DONE1_BIT 0x00020000 +#define GPDR_GPIO_DIR(X,D) ((D) << (X)) + +/* SIR definitions */ +#define SIR_GPIO_INPUT 0 +#define SIR_DREQ7_INPUT 0x00200000 +#define SIR_DREQ6_INPUT 0x00100000 +#define SIR_DREQ3_INPUT 0x00080000 +#define SIR_DREQ2_INPUT 0x00040000 +#define SIR_DREQ5_INPUT 0x00020000 +#define SIR_DREQ1_INPUT 0x00008000 +#define SIR_DREQ4_INPUT 0x00004000 +#define SIR_DREQ0_INPUT 0x00001000 +#define SIR_RXD1_INPUT 0x00000400 +#define SIR_CTS0_INPUT 0x00000100 +#define SIR_RXD0_INPUT 0x00000040 +#define SIR_GATE1_INPUT 0x00000020 +#define SIR_GATE0_INPUT 0x00000010 +#define SIR_IRQ3_INPUT 0x00000008 +#define SIR_IRQ2_INPUT 0x00000004 +#define SIR_IRQ1_INPUT 0x00000002 +#define SIR_IRQ0_INPUT 0x00000001 +#define SIR_DREQ_BITS (SIR_DREQ0_INPUT | SIR_DREQ1_INPUT | \ + SIR_DREQ2_INPUT | SIR_DREQ3_INPUT | \ + SIR_DREQ4_INPUT | SIR_DREQ5_INPUT | \ + SIR_DREQ6_INPUT | SIR_DREQ7_INPUT) + +/* SOR definitions */ +#define SOR_GPIO_OUTPUT 0 +#define SOR_DACK3_OUTPUT 0x00200000 +#define SOR_DACK2_OUTPUT 0x00100000 +#define SOR_DONE1_OUTPUT 0x00020000 +#define SOR_DACK1_OUTPUT 0x00010000 +#define SOR_DONE0_OUTPUT 0x00004000 +#define SOR_DACK0_OUTPUT 0x00002000 +#define SOR_TXD1_OUTPUT 0x00000800 +#define SOR_RTS0_OUTPUT 0x00000200 +#define SOR_TXD0_OUTPUT 0x00000080 +#define SOR_TOUT1_OUTPUT 0x00000020 +#define SOR_TOUT0_OUTPUT 0x00000010 +#define SOR_DONE_BITS (SOR_DONE0_OUTPUT | SOR_DONE1_OUTPUT) +#define SOR_DACK_BITS (SOR_DACK0_OUTPUT | SOR_DACK1_OUTPUT | \ + SOR_DACK2_OUTPUT | SOR_DACK3_OUTPUT) + +/* PDSR definitions */ +#define PDSR_UNCHANGED 0 +#define PDSR_SET_BIT(X) (1 << (X)) + +/* PDCR definitions */ +#define PDCR_UNCHANGED 0 +#define PDCR_CLEAR_BIT(X) (1 << (X)) + +/* RSTR definitions */ +/* Read Only */ +#define RSTR_POWERON 0x00000400 +#define RSTR_SOFTRESET_STATUS 0x00000100 +/* Write Only */ +#define RSTR_SOFTRESET 0x00000001 + +#endif /* _ASM_GPIO_REGS */ diff --git a/arch/frv/include/asm/hardirq.h b/arch/frv/include/asm/hardirq.h new file mode 100644 index 0000000..fc47515 --- /dev/null +++ b/arch/frv/include/asm/hardirq.h @@ -0,0 +1,35 @@ +/* hardirq.h: FRV hardware IRQ management + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef __ASM_HARDIRQ_H +#define __ASM_HARDIRQ_H + +#include +#include + +typedef struct { + unsigned int __softirq_pending; + unsigned long idle_timestamp; +} ____cacheline_aligned irq_cpustat_t; + +#include /* Standard mappings for irq_cpustat_t above */ + +#ifdef CONFIG_SMP +#error SMP not available on FR-V +#endif /* CONFIG_SMP */ + +extern atomic_t irq_err_count; +static inline void ack_bad_irq(int irq) +{ + atomic_inc(&irq_err_count); +} + +#endif diff --git a/arch/frv/include/asm/highmem.h b/arch/frv/include/asm/highmem.h new file mode 100644 index 0000000..68e4677 --- /dev/null +++ b/arch/frv/include/asm/highmem.h @@ -0,0 +1,182 @@ +/* highmem.h: virtual kernel memory mappings for high memory + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from include/asm-i386/highmem.h + * + * See Documentation/frv/mmu-layout.txt for more information. + * + * 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. + */ + +#ifndef _ASM_HIGHMEM_H +#define _ASM_HIGHMEM_H + +#ifdef __KERNEL__ + +#include +#include +#include +#include +#include + +#define NR_TLB_LINES 64 /* number of lines in the TLB */ + +#ifndef __ASSEMBLY__ + +#include +#include +#include + +#ifdef CONFIG_DEBUG_HIGHMEM +#define HIGHMEM_DEBUG 1 +#else +#define HIGHMEM_DEBUG 0 +#endif + +/* declarations for highmem.c */ +extern unsigned long highstart_pfn, highend_pfn; + +#define kmap_prot PAGE_KERNEL +#define kmap_pte ______kmap_pte_in_TLB +extern pte_t *pkmap_page_table; + +#define flush_cache_kmaps() do { } while (0) + +/* + * Right now we initialize only a single pte table. It can be extended + * easily, subsequent pte tables have to be allocated in one physical + * chunk of RAM. + */ +#define LAST_PKMAP PTRS_PER_PTE +#define LAST_PKMAP_MASK (LAST_PKMAP - 1) +#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) +#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +extern void *kmap_high(struct page *page); +extern void kunmap_high(struct page *page); + +extern void *kmap(struct page *page); +extern void kunmap(struct page *page); + +extern struct page *kmap_atomic_to_page(void *ptr); + +#endif /* !__ASSEMBLY__ */ + +/* + * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap + * gives a more generic (and caching) interface. But kmap_atomic can + * be used in IRQ contexts, so in some (very limited) cases we need + * it. + */ +#define KMAP_ATOMIC_CACHE_DAMR 8 + +#ifndef __ASSEMBLY__ + +#define __kmap_atomic_primary(type, paddr, ampr) \ +({ \ + unsigned long damlr, dampr; \ + \ + dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ + \ + if (type != __KM_CACHE) \ + asm volatile("movgs %0,dampr"#ampr :: "r"(dampr) : "memory"); \ + else \ + asm volatile("movgs %0,iampr"#ampr"\n" \ + "movgs %0,dampr"#ampr"\n" \ + :: "r"(dampr) : "memory" \ + ); \ + \ + asm("movsg damlr"#ampr",%0" : "=r"(damlr)); \ + \ + /*printk("DAMR"#ampr": PRIM sl=%d L=%08lx P=%08lx\n", type, damlr, dampr);*/ \ + \ + (void *) damlr; \ +}) + +#define __kmap_atomic_secondary(slot, paddr) \ +({ \ + unsigned long damlr = KMAP_ATOMIC_SECONDARY_FRAME + (slot) * PAGE_SIZE; \ + unsigned long dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ + \ + asm volatile("movgs %0,tplr \n" \ + "movgs %1,tppr \n" \ + "tlbpr %0,gr0,#2,#1" \ + : : "r"(damlr), "r"(dampr) : "memory"); \ + \ + /*printk("TLB: SECN sl=%d L=%08lx P=%08lx\n", slot, damlr, dampr);*/ \ + \ + (void *) damlr; \ +}) + +static inline void *kmap_atomic(struct page *page, enum km_type type) +{ + unsigned long paddr; + + pagefault_disable(); + debug_kmap_atomic(type); + paddr = page_to_phys(page); + + switch (type) { + case 0: return __kmap_atomic_primary(0, paddr, 2); + case 1: return __kmap_atomic_primary(1, paddr, 3); + case 2: return __kmap_atomic_primary(2, paddr, 4); + case 3: return __kmap_atomic_primary(3, paddr, 5); + case 4: return __kmap_atomic_primary(4, paddr, 6); + case 5: return __kmap_atomic_primary(5, paddr, 7); + case 6: return __kmap_atomic_primary(6, paddr, 8); + case 7: return __kmap_atomic_primary(7, paddr, 9); + case 8: return __kmap_atomic_primary(8, paddr, 10); + + case 9 ... 9 + NR_TLB_LINES - 1: + return __kmap_atomic_secondary(type - 9, paddr); + + default: + BUG(); + return NULL; + } +} + +#define __kunmap_atomic_primary(type, ampr) \ +do { \ + asm volatile("movgs gr0,dampr"#ampr"\n" ::: "memory"); \ + if (type == __KM_CACHE) \ + asm volatile("movgs gr0,iampr"#ampr"\n" ::: "memory"); \ +} while(0) + +#define __kunmap_atomic_secondary(slot, vaddr) \ +do { \ + asm volatile("tlbpr %0,gr0,#4,#1" : : "r"(vaddr) : "memory"); \ +} while(0) + +static inline void kunmap_atomic(void *kvaddr, enum km_type type) +{ + switch (type) { + case 0: __kunmap_atomic_primary(0, 2); break; + case 1: __kunmap_atomic_primary(1, 3); break; + case 2: __kunmap_atomic_primary(2, 4); break; + case 3: __kunmap_atomic_primary(3, 5); break; + case 4: __kunmap_atomic_primary(4, 6); break; + case 5: __kunmap_atomic_primary(5, 7); break; + case 6: __kunmap_atomic_primary(6, 8); break; + case 7: __kunmap_atomic_primary(7, 9); break; + case 8: __kunmap_atomic_primary(8, 10); break; + + case 9 ... 9 + NR_TLB_LINES - 1: + __kunmap_atomic_secondary(type - 9, kvaddr); + break; + + default: + BUG(); + } + pagefault_enable(); +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/frv/include/asm/hw_irq.h b/arch/frv/include/asm/hw_irq.h new file mode 100644 index 0000000..522ad37 --- /dev/null +++ b/arch/frv/include/asm/hw_irq.h @@ -0,0 +1,16 @@ +/* hw_irq.h: FR-V specific h/w IRQ stuff + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_HW_IRQ_H +#define _ASM_HW_IRQ_H + + +#endif /* _ASM_HW_IRQ_H */ diff --git a/arch/frv/include/asm/init.h b/arch/frv/include/asm/init.h new file mode 100644 index 0000000..8b15838 --- /dev/null +++ b/arch/frv/include/asm/init.h @@ -0,0 +1,12 @@ +#ifndef _ASM_INIT_H +#define _ASM_INIT_H + +#define __init __attribute__ ((__section__ (".text.init"))) +#define __initdata __attribute__ ((__section__ (".data.init"))) +/* For assembly routines */ +#define __INIT .section ".text.init",#alloc,#execinstr +#define __FINIT .previous +#define __INITDATA .section ".data.init",#alloc,#write + +#endif + diff --git a/arch/frv/include/asm/io.h b/arch/frv/include/asm/io.h new file mode 100644 index 0000000..ca7475e --- /dev/null +++ b/arch/frv/include/asm/io.h @@ -0,0 +1,392 @@ +/* io.h: FRV I/O operations + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + * + * This gets interesting when talking to the PCI bus - the CPU is in big endian + * mode, the PCI bus is little endian and the hardware in the middle can do + * byte swapping + */ +#ifndef _ASM_IO_H +#define _ASM_IO_H + +#ifdef __KERNEL__ + +#include +#include +#include +#include +#include + +/* + * swap functions are sometimes needed to interface little-endian hardware + */ + +static inline unsigned short _swapw(unsigned short v) +{ + return ((v << 8) | (v >> 8)); +} + +static inline unsigned long _swapl(unsigned long v) +{ + return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24)); +} + +//#define __iormb() asm volatile("membar") +//#define __iowmb() asm volatile("membar") + +#define __raw_readb __builtin_read8 +#define __raw_readw __builtin_read16 +#define __raw_readl __builtin_read32 + +#define __raw_writeb(datum, addr) __builtin_write8(addr, datum) +#define __raw_writew(datum, addr) __builtin_write16(addr, datum) +#define __raw_writel(datum, addr) __builtin_write32(addr, datum) + +static inline void io_outsb(unsigned int addr, const void *buf, int len) +{ + unsigned long __ioaddr = (unsigned long) addr; + const uint8_t *bp = buf; + + while (len--) + __builtin_write8((volatile void __iomem *) __ioaddr, *bp++); +} + +static inline void io_outsw(unsigned int addr, const void *buf, int len) +{ + unsigned long __ioaddr = (unsigned long) addr; + const uint16_t *bp = buf; + + while (len--) + __builtin_write16((volatile void __iomem *) __ioaddr, (*bp++)); +} + +extern void __outsl_ns(unsigned int addr, const void *buf, int len); +extern void __outsl_sw(unsigned int addr, const void *buf, int len); +static inline void __outsl(unsigned int addr, const void *buf, int len, int swap) +{ + unsigned long __ioaddr = (unsigned long) addr; + + if (!swap) + __outsl_ns(__ioaddr, buf, len); + else + __outsl_sw(__ioaddr, buf, len); +} + +static inline void io_insb(unsigned long addr, void *buf, int len) +{ + uint8_t *bp = buf; + + while (len--) + *bp++ = __builtin_read8((volatile void __iomem *) addr); +} + +static inline void io_insw(unsigned long addr, void *buf, int len) +{ + uint16_t *bp = buf; + + while (len--) + *bp++ = __builtin_read16((volatile void __iomem *) addr); +} + +extern void __insl_ns(unsigned long addr, void *buf, int len); +extern void __insl_sw(unsigned long addr, void *buf, int len); +static inline void __insl(unsigned long addr, void *buf, int len, int swap) +{ + if (!swap) + __insl_ns(addr, buf, len); + else + __insl_sw(addr, buf, len); +} + +#define mmiowb() mb() + +/* + * make the short names macros so specific devices + * can override them as required + */ + +static inline void memset_io(volatile void __iomem *addr, unsigned char val, int count) +{ + memset((void __force *) addr, val, count); +} + +static inline void memcpy_fromio(void *dst, const volatile void __iomem *src, int count) +{ + memcpy(dst, (void __force *) src, count); +} + +static inline void memcpy_toio(volatile void __iomem *dst, const void *src, int count) +{ + memcpy((void __force *) dst, src, count); +} + +static inline uint8_t inb(unsigned long addr) +{ + return __builtin_read8((void __iomem *)addr); +} + +static inline uint16_t inw(unsigned long addr) +{ + uint16_t ret = __builtin_read16((void __iomem *)addr); + + if (__is_PCI_IO(addr)) + ret = _swapw(ret); + + return ret; +} + +static inline uint32_t inl(unsigned long addr) +{ + uint32_t ret = __builtin_read32((void __iomem *)addr); + + if (__is_PCI_IO(addr)) + ret = _swapl(ret); + + return ret; +} + +static inline void outb(uint8_t datum, unsigned long addr) +{ + __builtin_write8((void __iomem *)addr, datum); +} + +static inline void outw(uint16_t datum, unsigned long addr) +{ + if (__is_PCI_IO(addr)) + datum = _swapw(datum); + __builtin_write16((void __iomem *)addr, datum); +} + +static inline void outl(uint32_t datum, unsigned long addr) +{ + if (__is_PCI_IO(addr)) + datum = _swapl(datum); + __builtin_write32((void __iomem *)addr, datum); +} + +#define inb_p(addr) inb(addr) +#define inw_p(addr) inw(addr) +#define inl_p(addr) inl(addr) +#define outb_p(x,addr) outb(x,addr) +#define outw_p(x,addr) outw(x,addr) +#define outl_p(x,addr) outl(x,addr) + +#define outsb(a,b,l) io_outsb(a,b,l) +#define outsw(a,b,l) io_outsw(a,b,l) +#define outsl(a,b,l) __outsl(a,b,l,0) + +#define insb(a,b,l) io_insb(a,b,l) +#define insw(a,b,l) io_insw(a,b,l) +#define insl(a,b,l) __insl(a,b,l,0) + +#define IO_SPACE_LIMIT 0xffffffff + +static inline uint8_t readb(const volatile void __iomem *addr) +{ + return __builtin_read8((__force void volatile __iomem *) addr); +} + +static inline uint16_t readw(const volatile void __iomem *addr) +{ + uint16_t ret = __builtin_read16((__force void volatile __iomem *)addr); + + if (__is_PCI_MEM(addr)) + ret = _swapw(ret); + return ret; +} + +static inline uint32_t readl(const volatile void __iomem *addr) +{ + uint32_t ret = __builtin_read32((__force void volatile __iomem *)addr); + + if (__is_PCI_MEM(addr)) + ret = _swapl(ret); + + return ret; +} + +#define readb_relaxed readb +#define readw_relaxed readw +#define readl_relaxed readl + +static inline void writeb(uint8_t datum, volatile void __iomem *addr) +{ + __builtin_write8(addr, datum); + if (__is_PCI_MEM(addr)) + __flush_PCI_writes(); +} + +static inline void writew(uint16_t datum, volatile void __iomem *addr) +{ + if (__is_PCI_MEM(addr)) + datum = _swapw(datum); + + __builtin_write16(addr, datum); + if (__is_PCI_MEM(addr)) + __flush_PCI_writes(); +} + +static inline void writel(uint32_t datum, volatile void __iomem *addr) +{ + if (__is_PCI_MEM(addr)) + datum = _swapl(datum); + + __builtin_write32(addr, datum); + if (__is_PCI_MEM(addr)) + __flush_PCI_writes(); +} + + +/* Values for nocacheflag and cmode */ +#define IOMAP_FULL_CACHING 0 +#define IOMAP_NOCACHE_SER 1 +#define IOMAP_NOCACHE_NONSER 2 +#define IOMAP_WRITETHROUGH 3 + +extern void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); + +static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size) +{ + return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); +} + +static inline void __iomem *ioremap_nocache(unsigned long physaddr, unsigned long size) +{ + return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); +} + +static inline void __iomem *ioremap_writethrough(unsigned long physaddr, unsigned long size) +{ + return __ioremap(physaddr, size, IOMAP_WRITETHROUGH); +} + +static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned long size) +{ + return __ioremap(physaddr, size, IOMAP_FULL_CACHING); +} + +#define ioremap_wc ioremap_nocache + +extern void iounmap(void volatile __iomem *addr); + +static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) +{ + return (void __iomem *) port; +} + +static inline void ioport_unmap(void __iomem *p) +{ +} + +static inline void flush_write_buffers(void) +{ + __asm__ __volatile__ ("membar" : : :"memory"); +} + +/* + * do appropriate I/O accesses for token type + */ +static inline unsigned int ioread8(void __iomem *p) +{ + return __builtin_read8(p); +} + +static inline unsigned int ioread16(void __iomem *p) +{ + uint16_t ret = __builtin_read16(p); + if (__is_PCI_addr(p)) + ret = _swapw(ret); + return ret; +} + +static inline unsigned int ioread32(void __iomem *p) +{ + uint32_t ret = __builtin_read32(p); + if (__is_PCI_addr(p)) + ret = _swapl(ret); + return ret; +} + +static inline void iowrite8(u8 val, void __iomem *p) +{ + __builtin_write8(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void iowrite16(u16 val, void __iomem *p) +{ + if (__is_PCI_addr(p)) + val = _swapw(val); + __builtin_write16(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void iowrite32(u32 val, void __iomem *p) +{ + if (__is_PCI_addr(p)) + val = _swapl(val); + __builtin_write32(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void ioread8_rep(void __iomem *p, void *dst, unsigned long count) +{ + io_insb((unsigned long) p, dst, count); +} + +static inline void ioread16_rep(void __iomem *p, void *dst, unsigned long count) +{ + io_insw((unsigned long) p, dst, count); +} + +static inline void ioread32_rep(void __iomem *p, void *dst, unsigned long count) +{ + __insl_ns((unsigned long) p, dst, count); +} + +static inline void iowrite8_rep(void __iomem *p, const void *src, unsigned long count) +{ + io_outsb((unsigned long) p, src, count); +} + +static inline void iowrite16_rep(void __iomem *p, const void *src, unsigned long count) +{ + io_outsw((unsigned long) p, src, count); +} + +static inline void iowrite32_rep(void __iomem *p, const void *src, unsigned long count) +{ + __outsl_ns((unsigned long) p, src, count); +} + +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +struct pci_dev; +extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); +static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) +{ +} + + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + +#endif /* __KERNEL__ */ + +#endif /* _ASM_IO_H */ diff --git a/arch/frv/include/asm/ioctl.h b/arch/frv/include/asm/ioctl.h new file mode 100644 index 0000000..b279fe0 --- /dev/null +++ b/arch/frv/include/asm/ioctl.h @@ -0,0 +1 @@ +#include diff --git a/arch/frv/include/asm/ioctls.h b/arch/frv/include/asm/ioctls.h new file mode 100644 index 0000000..d0c30e3 --- /dev/null +++ b/arch/frv/include/asm/ioctls.h @@ -0,0 +1,86 @@ +#ifndef __ASM_IOCTLS_H__ +#define __ASM_IOCTLS_H__ + +#include + +/* 0x54 is just a magic number to make these relatively unique ('T') */ + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define FIONREAD 0x541B +#define TIOCINQ FIONREAD +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#define FIONBIO 0x5421 +#define TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ +#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */ +#define TIOCSBRK 0x5427 /* BSD compatibility */ +#define TIOCCBRK 0x5428 /* BSD compatibility */ +#define TIOCGSID 0x5429 /* Return the session ID of FD */ +#define TCGETS2 _IOR('T',0x2A, struct termios2) +#define TCSETS2 _IOW('T',0x2B, struct termios2) +#define TCSETSW2 _IOW('T',0x2C, struct termios2) +#define TCSETSF2 _IOW('T',0x2D, struct termios2) +#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ +#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ + +#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */ +#define FIOCLEX 0x5451 +#define FIOASYNC 0x5452 +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ +#define TIOCSERGETLSR 0x5459 /* Get line status register */ +#define TIOCSERGETMULTI 0x545A /* Get multiport config */ +#define TIOCSERSETMULTI 0x545B /* Set multiport config */ + +#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ +#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ +#define FIOQSIZE 0x545E + +/* Used for packet mode */ +#define TIOCPKT_DATA 0 +#define TIOCPKT_FLUSHREAD 1 +#define TIOCPKT_FLUSHWRITE 2 +#define TIOCPKT_STOP 4 +#define TIOCPKT_START 8 +#define TIOCPKT_NOSTOP 16 +#define TIOCPKT_DOSTOP 32 + +#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ + +#endif /* __ASM_IOCTLS_H__ */ + diff --git a/arch/frv/include/asm/ipcbuf.h b/arch/frv/include/asm/ipcbuf.h new file mode 100644 index 0000000..b546f67 --- /dev/null +++ b/arch/frv/include/asm/ipcbuf.h @@ -0,0 +1,30 @@ +#ifndef __ASM_IPCBUF_H__ +#define __ASM_IPCBUF_H__ + +/* + * The user_ipc_perm structure for FR-V architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 32-bit mode_t and seq + * - 2 miscellaneous 32-bit values + */ + +struct ipc64_perm +{ + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned short __pad1; + unsigned short seq; + unsigned short __pad2; + unsigned long __unused1; + unsigned long __unused2; +}; + +#endif /* __ASM_IPCBUF_H__ */ + diff --git a/arch/frv/include/asm/irc-regs.h b/arch/frv/include/asm/irc-regs.h new file mode 100644 index 0000000..afa30ae --- /dev/null +++ b/arch/frv/include/asm/irc-regs.h @@ -0,0 +1,53 @@ +/* irc-regs.h: on-chip interrupt controller registers + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_IRC_REGS +#define _ASM_IRC_REGS + +#define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) + +#define __get_TM0() ({ __reg(0xfeff9800); }) +#define __get_TM1() ({ __reg(0xfeff9808); }) +#define __set_TM1(V) do { __reg(0xfeff9808) = (V); mb(); } while(0) + +#define __set_TM1x(XI,V) \ +do { \ + int shift = (XI) * 2 + 16; \ + unsigned long tm1 = __reg(0xfeff9808); \ + tm1 &= ~(0x3 << shift); \ + tm1 |= (V) << shift; \ + __reg(0xfeff9808) = tm1; \ + mb(); \ +} while(0) + +#define __get_RS(C) ({ (__reg(0xfeff9810) >> ((C)+16)) & 1; }) + +#define __clr_RC(C) do { __reg(0xfeff9818) = 1 << ((C)+16); mb(); } while(0) + +#define __get_MASK(C) ({ (__reg(0xfeff9820) >> ((C)+16)) & 1; }) +#define __set_MASK(C) do { __reg(0xfeff9820) |= 1 << ((C)+16); mb(); } while(0) +#define __clr_MASK(C) do { __reg(0xfeff9820) &= ~(1 << ((C)+16)); mb(); } while(0) + +#define __get_MASK_all() __get_MASK(0) +#define __set_MASK_all() __set_MASK(0) +#define __clr_MASK_all() __clr_MASK(0) + +#define __get_IRL() ({ (__reg(0xfeff9828) >> 16) & 0xf; }) +#define __clr_IRL() do { __reg(0xfeff9828) = 0x100000; mb(); } while(0) + +#define __get_IRR(N) ({ __reg(0xfeff9840 + (N) * 8); }) +#define __set_IRR(N,V) do { __reg(0xfeff9840 + (N) * 8) = (V); } while(0) + +#define __get_IITMR(N) ({ __reg(0xfeff9880 + (N) * 8); }) +#define __set_IITMR(N,V) do { __reg(0xfeff9880 + (N) * 8) = (V); } while(0) + + +#endif /* _ASM_IRC_REGS */ diff --git a/arch/frv/include/asm/irq.h b/arch/frv/include/asm/irq.h new file mode 100644 index 0000000..3a66ebd --- /dev/null +++ b/arch/frv/include/asm/irq.h @@ -0,0 +1,30 @@ +/* irq.h: FRV IRQ definitions + * + * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_IRQ_H_ +#define _ASM_IRQ_H_ + +#define NR_IRQS 48 +#define IRQ_BASE_CPU (0 * 16) +#define IRQ_BASE_FPGA (1 * 16) +#define IRQ_BASE_MB93493 (2 * 16) + +/* probe returns a 32-bit IRQ mask:-/ */ +#define MIN_PROBE_IRQ (NR_IRQS - 32) + +#ifndef __ASSEMBLY__ +static inline int irq_canonicalize(int irq) +{ + return irq; +} +#endif + +#endif /* _ASM_IRQ_H_ */ diff --git a/arch/frv/include/asm/irq_regs.h b/arch/frv/include/asm/irq_regs.h new file mode 100644 index 0000000..d22e832 --- /dev/null +++ b/arch/frv/include/asm/irq_regs.h @@ -0,0 +1,27 @@ +/* FRV per-CPU frame pointer holder + * + * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_IRQ_REGS_H +#define _ASM_IRQ_REGS_H + +/* + * Per-cpu current frame pointer - the location of the last exception frame on + * the stack + * - on FRV, GR28 is dedicated to keeping a pointer to the current exception + * frame + */ +#define ARCH_HAS_OWN_IRQ_REGS + +#ifndef __ASSEMBLY__ +#define get_irq_regs() (__frame) +#endif + +#endif /* _ASM_IRQ_REGS_H */ diff --git a/arch/frv/include/asm/kdebug.h b/arch/frv/include/asm/kdebug.h new file mode 100644 index 0000000..6ece1b0 --- /dev/null +++ b/arch/frv/include/asm/kdebug.h @@ -0,0 +1 @@ +#include diff --git a/arch/frv/include/asm/kmap_types.h b/arch/frv/include/asm/kmap_types.h new file mode 100644 index 0000000..f8e16b2 --- /dev/null +++ b/arch/frv/include/asm/kmap_types.h @@ -0,0 +1,29 @@ + +#ifndef _ASM_KMAP_TYPES_H +#define _ASM_KMAP_TYPES_H + +enum km_type { + /* arch specific kmaps - change the numbers attached to these at your peril */ + __KM_CACHE, /* cache flush page attachment point */ + __KM_PGD, /* current page directory */ + __KM_ITLB_PTD, /* current instruction TLB miss page table lookup */ + __KM_DTLB_PTD, /* current data TLB miss page table lookup */ + + /* general kmaps */ + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_PTE0, + KM_PTE1, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; + +#endif diff --git a/arch/frv/include/asm/linkage.h b/arch/frv/include/asm/linkage.h new file mode 100644 index 0000000..636c1bc --- /dev/null +++ b/arch/frv/include/asm/linkage.h @@ -0,0 +1,7 @@ +#ifndef __ASM_LINKAGE_H +#define __ASM_LINKAGE_H + +#define __ALIGN .align 4 +#define __ALIGN_STR ".align 4" + +#endif diff --git a/arch/frv/include/asm/local.h b/arch/frv/include/asm/local.h new file mode 100644 index 0000000..c27bdf0 --- /dev/null +++ b/arch/frv/include/asm/local.h @@ -0,0 +1,6 @@ +#ifndef _ASM_LOCAL_H +#define _ASM_LOCAL_H + +#include + +#endif /* _ASM_LOCAL_H */ diff --git a/arch/frv/include/asm/math-emu.h b/arch/frv/include/asm/math-emu.h new file mode 100644 index 0000000..0c8f731 --- /dev/null +++ b/arch/frv/include/asm/math-emu.h @@ -0,0 +1,301 @@ +#ifndef _ASM_MATH_EMU_H +#define _ASM_MATH_EMU_H + +#include +#include + +/* Status Register bits */ + +/* accrued exception bits */ +#define FPSR_AEXC_INEX 3 +#define FPSR_AEXC_DZ 4 +#define FPSR_AEXC_UNFL 5 +#define FPSR_AEXC_OVFL 6 +#define FPSR_AEXC_IOP 7 + +/* exception status bits */ +#define FPSR_EXC_INEX1 8 +#define FPSR_EXC_INEX2 9 +#define FPSR_EXC_DZ 10 +#define FPSR_EXC_UNFL 11 +#define FPSR_EXC_OVFL 12 +#define FPSR_EXC_OPERR 13 +#define FPSR_EXC_SNAN 14 +#define FPSR_EXC_BSUN 15 + +/* quotient byte, assumes big-endian, of course */ +#define FPSR_QUOTIENT(fpsr) (*((signed char *) &(fpsr) + 1)) + +/* condition code bits */ +#define FPSR_CC_NAN 24 +#define FPSR_CC_INF 25 +#define FPSR_CC_Z 26 +#define FPSR_CC_NEG 27 + + +/* Control register bits */ + +/* rounding mode */ +#define FPCR_ROUND_RN 0 /* round to nearest/even */ +#define FPCR_ROUND_RZ 1 /* round to zero */ +#define FPCR_ROUND_RM 2 /* minus infinity */ +#define FPCR_ROUND_RP 3 /* plus infinity */ + +/* rounding precision */ +#define FPCR_PRECISION_X 0 /* long double */ +#define FPCR_PRECISION_S 1 /* double */ +#define FPCR_PRECISION_D 2 /* float */ + + +/* Flags to select the debugging output */ +#define PDECODE 0 +#define PEXECUTE 1 +#define PCONV 2 +#define PNORM 3 +#define PREGISTER 4 +#define PINSTR 5 +#define PUNIMPL 6 +#define PMOVEM 7 + +#define PMDECODE (1< +#include + +union fp_mant64 { + unsigned long long m64; + unsigned long m32[2]; +}; + +union fp_mant128 { + unsigned long long m64[2]; + unsigned long m32[4]; +}; + +/* internal representation of extended fp numbers */ +struct fp_ext { + unsigned char lowmant; + unsigned char sign; + unsigned short exp; + union fp_mant64 mant; +}; + +/* C representation of FPU registers */ +/* NOTE: if you change this, you have to change the assembler offsets + below and the size in , too */ +struct fp_data { + struct fp_ext fpreg[8]; + unsigned int fpcr; + unsigned int fpsr; + unsigned int fpiar; + unsigned short prec; + unsigned short rnd; + struct fp_ext temp[2]; +}; + +#if FPU_EMU_DEBUG +extern unsigned int fp_debugprint; + +#define dprint(bit, fmt, args...) ({ \ + if (fp_debugprint & (1 << (bit))) \ + printk(fmt, ## args); \ +}) +#else +#define dprint(bit, fmt, args...) +#endif + +#define uprint(str) ({ \ + static int __count = 3; \ + \ + if (__count > 0) { \ + printk("You just hit an unimplemented " \ + "fpu instruction (%s)\n", str); \ + printk("Please report this to ....\n"); \ + __count--; \ + } \ +}) + +#define FPDATA ((struct fp_data *)current->thread.fp) + +#else /* __ASSEMBLY__ */ + +#define FPDATA %a2 + +/* offsets from the base register to the floating point data in the task struct */ +#define FPD_FPREG (TASK_THREAD+THREAD_FPREG+0) +#define FPD_FPCR (TASK_THREAD+THREAD_FPREG+96) +#define FPD_FPSR (TASK_THREAD+THREAD_FPREG+100) +#define FPD_FPIAR (TASK_THREAD+THREAD_FPREG+104) +#define FPD_PREC (TASK_THREAD+THREAD_FPREG+108) +#define FPD_RND (TASK_THREAD+THREAD_FPREG+110) +#define FPD_TEMPFP1 (TASK_THREAD+THREAD_FPREG+112) +#define FPD_TEMPFP2 (TASK_THREAD+THREAD_FPREG+124) +#define FPD_SIZEOF (TASK_THREAD+THREAD_FPREG+136) + +/* offsets on the stack to access saved registers, + * these are only used during instruction decoding + * where we always know how deep we're on the stack. + */ +#define FPS_DO (PT_D0) +#define FPS_D1 (PT_D1) +#define FPS_D2 (PT_D2) +#define FPS_A0 (PT_A0) +#define FPS_A1 (PT_A1) +#define FPS_A2 (PT_A2) +#define FPS_SR (PT_SR) +#define FPS_PC (PT_PC) +#define FPS_EA (PT_PC+6) +#define FPS_PC2 (PT_PC+10) + +.macro fp_get_fp_reg + lea (FPD_FPREG,FPDATA,%d0.w*4),%a0 + lea (%a0,%d0.w*8),%a0 +.endm + +/* Macros used to get/put the current program counter. + * 020/030 use a different stack frame then 040/060, for the + * 040/060 the return pc points already to the next location, + * so this only needs to be modified for jump instructions. + */ +.macro fp_get_pc dest + move.l (FPS_PC+4,%sp),\dest +.endm + +.macro fp_put_pc src,jump=0 + move.l \src,(FPS_PC+4,%sp) +.endm + +.macro fp_get_instr_data f,s,dest,label + getuser \f,%sp@(FPS_PC+4)@(0),\dest,\label,%sp@(FPS_PC+4) + addq.l #\s,%sp@(FPS_PC+4) +.endm + +.macro fp_get_instr_word dest,label,addr + fp_get_instr_data w,2,\dest,\label,\addr +.endm + +.macro fp_get_instr_long dest,label,addr + fp_get_instr_data l,4,\dest,\label,\addr +.endm + +/* These macros are used to read from/write to user space + * on error we jump to the fixup section, load the fault + * address into %a0 and jump to the exit. + * (derived from ) + */ +.macro getuser size,src,dest,label,addr +| printf ,"[\size<%08x]",1,\addr +.Lu1\@: moves\size \src,\dest + + .section .fixup,"ax" + .even +.Lu2\@: move.l \addr,%a0 + jra \label + .previous + + .section __ex_table,"a" + .align 4 + .long .Lu1\@,.Lu2\@ + .previous +.endm + +.macro putuser size,src,dest,label,addr +| printf ,"[\size>%08x]",1,\addr +.Lu1\@: moves\size \src,\dest +.Lu2\@: + + .section .fixup,"ax" + .even +.Lu3\@: move.l \addr,%a0 + jra \label + .previous + + .section __ex_table,"a" + .align 4 + .long .Lu1\@,.Lu3\@ + .long .Lu2\@,.Lu3\@ + .previous +.endm + + +.macro movestack nr,arg1,arg2,arg3,arg4,arg5 + .if \nr + movestack (\nr-1),\arg2,\arg3,\arg4,\arg5 + move.l \arg1,-(%sp) + .endif +.endm + +.macro printf bit=-1,string,nr=0,arg1,arg2,arg3,arg4,arg5 +#ifdef FPU_EMU_DEBUG + .data +.Lpdata\@: + .string "\string" + .previous + + movem.l %d0/%d1/%a0/%a1,-(%sp) + .if \bit+1 +#if 0 + moveq #\bit,%d0 + andw #7,%d0 + btst %d0,fp_debugprint+((31-\bit)/8) +#else + btst #\bit,fp_debugprint+((31-\bit)/8) +#endif + jeq .Lpskip\@ + .endif + movestack \nr,\arg1,\arg2,\arg3,\arg4,\arg5 + pea .Lpdata\@ + jsr printk + lea ((\nr+1)*4,%sp),%sp +.Lpskip\@: + movem.l (%sp)+,%d0/%d1/%a0/%a1 +#endif +.endm + +.macro printx bit,fp +#ifdef FPU_EMU_DEBUG + movem.l %d0/%a0,-(%sp) + lea \fp,%a0 +#if 0 + moveq #'+',%d0 + tst.w (%a0) + jeq .Lx1\@ + moveq #'-',%d0 +.Lx1\@: printf \bit," %c",1,%d0 + move.l (4,%a0),%d0 + bclr #31,%d0 + jne .Lx2\@ + printf \bit,"0." + jra .Lx3\@ +.Lx2\@: printf \bit,"1." +.Lx3\@: printf \bit,"%08x%08x",2,%d0,%a0@(8) + move.w (2,%a0),%d0 + ext.l %d0 + printf \bit,"E%04x",1,%d0 +#else + printf \bit," %08x%08x%08x",3,%a0@,%a0@(4),%a0@(8) +#endif + movem.l (%sp)+,%d0/%a0 +#endif +.endm + +.macro debug instr,args +#ifdef FPU_EMU_DEBUG + \instr \args +#endif +.endm + + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_FRV_MATH_EMU_H */ + diff --git a/arch/frv/include/asm/mb-regs.h b/arch/frv/include/asm/mb-regs.h new file mode 100644 index 0000000..219e5f9 --- /dev/null +++ b/arch/frv/include/asm/mb-regs.h @@ -0,0 +1,200 @@ +/* mb-regs.h: motherboard registers + * + * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB_REGS_H +#define _ASM_MB_REGS_H + +#include +#include +#include + +#ifndef __ASSEMBLY__ +/* gcc builtins, annotated */ + +unsigned long __builtin_read8(volatile void __iomem *); +unsigned long __builtin_read16(volatile void __iomem *); +unsigned long __builtin_read32(volatile void __iomem *); +void __builtin_write8(volatile void __iomem *, unsigned char); +void __builtin_write16(volatile void __iomem *, unsigned short); +void __builtin_write32(volatile void __iomem *, unsigned long); +#endif + +#define __region_IO KERNEL_IO_START /* the region from 0xe0000000 to 0xffffffff has suitable + * protection laid over the top for use in memory-mapped + * I/O + */ + +#define __region_CS0 0xff000000 /* Boot ROMs area */ + +#ifdef CONFIG_MB93091_VDK +/* + * VDK motherboard and CPU card specific stuff + */ + +#include + +#define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 +#define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 + +#define __region_CS2 0xe0000000 /* SLBUS/PCI I/O space */ +#define __region_CS2_M 0x0fffffff /* mask */ +#define __region_CS2_C 0x00000000 /* control */ +#define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ +#define __region_CS5_M 0x00ffffff +#define __region_CS5_C 0x00010000 +#define __region_CS7 0xf1000000 /* CB70 CPU-card PCMCIA port I/O space */ +#define __region_CS7_M 0x00ffffff +#define __region_CS7_C 0x00410701 +#define __region_CS1 0xfc000000 /* SLBUS/PCI bridge control registers */ +#define __region_CS1_M 0x000fffff +#define __region_CS1_C 0x00000000 +#define __region_CS6 0xfc100000 /* CB70 CPU-card DM9000 LAN I/O space */ +#define __region_CS6_M 0x000fffff +#define __region_CS6_C 0x00400707 +#define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ +#define __region_CS3_M 0x000fffff +#define __region_CS3_C 0xc8100000 +#define __region_CS4 0xfd000000 /* CB70 CPU-card extra flash space */ +#define __region_CS4_M 0x00ffffff +#define __region_CS4_C 0x00000f07 + +#define __region_PCI_IO (__region_CS2 + 0x04000000UL) +#define __region_PCI_MEM (__region_CS2 + 0x08000000UL) +#define __flush_PCI_writes() \ +do { \ + __builtin_write8((volatile void __iomem *) __region_PCI_MEM, 0); \ +} while(0) + +#define __is_PCI_IO(addr) \ + (((unsigned long)(addr) >> 24) - (__region_PCI_IO >> 24) < (0x04000000UL >> 24)) + +#define __is_PCI_MEM(addr) \ + ((unsigned long)(addr) - __region_PCI_MEM < 0x08000000UL) + +#define __is_PCI_addr(addr) \ + ((unsigned long)(addr) - __region_PCI_IO < 0x0c000000UL) + +#define __get_CLKSW() ({ *(volatile unsigned long *)(__region_CS2 + 0x0130000cUL) & 0xffUL; }) +#define __get_CLKIN() (__get_CLKSW() * 125U * 100000U / 24U) + +#ifndef __ASSEMBLY__ +extern int __nongprelbss mb93090_mb00_detected; +#endif + +#define __addr_LEDS() (__region_CS2 + 0x01200004UL) +#ifdef CONFIG_MB93090_MB00 +#define __set_LEDS(X) \ +do { \ + if (mb93090_mb00_detected) \ + __builtin_write32((void __iomem *) __addr_LEDS(), ~(X)); \ +} while (0) +#else +#define __set_LEDS(X) +#endif + +#define __addr_LCD() (__region_CS2 + 0x01200008UL) +#define __get_LCD(B) __builtin_read32((volatile void __iomem *) (B)) +#define __set_LCD(B,X) __builtin_write32((volatile void __iomem *) (B), (X)) + +#define LCD_D 0x000000ff /* LCD data bus */ +#define LCD_RW 0x00000100 /* LCD R/W signal */ +#define LCD_RS 0x00000200 /* LCD Register Select */ +#define LCD_E 0x00000400 /* LCD Start Enable Signal */ + +#define LCD_CMD_CLEAR (LCD_E|0x001) +#define LCD_CMD_HOME (LCD_E|0x002) +#define LCD_CMD_CURSOR_INC (LCD_E|0x004) +#define LCD_CMD_SCROLL_INC (LCD_E|0x005) +#define LCD_CMD_CURSOR_DEC (LCD_E|0x006) +#define LCD_CMD_SCROLL_DEC (LCD_E|0x007) +#define LCD_CMD_OFF (LCD_E|0x008) +#define LCD_CMD_ON(CRSR,BLINK) (LCD_E|0x00c|(CRSR<<1)|BLINK) +#define LCD_CMD_CURSOR_MOVE_L (LCD_E|0x010) +#define LCD_CMD_CURSOR_MOVE_R (LCD_E|0x014) +#define LCD_CMD_DISPLAY_SHIFT_L (LCD_E|0x018) +#define LCD_CMD_DISPLAY_SHIFT_R (LCD_E|0x01c) +#define LCD_CMD_FUNCSET(DL,N,F) (LCD_E|0x020|(DL<<4)|(N<<3)|(F<<2)) +#define LCD_CMD_SET_CG_ADDR(X) (LCD_E|0x040|X) +#define LCD_CMD_SET_DD_ADDR(X) (LCD_E|0x080|X) +#define LCD_CMD_READ_BUSY (LCD_E|LCD_RW) +#define LCD_DATA_WRITE(X) (LCD_E|LCD_RS|(X)) +#define LCD_DATA_READ (LCD_E|LCD_RS|LCD_RW) + +#else +/* + * PDK unit specific stuff + */ + +#include + +#define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 +#define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 + +#define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ +#define __region_CS5_M 0x00ffffff /* mask */ +#define __region_CS5_C 0x00010000 /* control */ +#define __region_CS2 0x20000000 /* FPGA registers */ +#define __region_CS2_M 0x000fffff +#define __region_CS2_C 0x00000000 +#define __region_CS1 0xfc100000 /* LAN registers */ +#define __region_CS1_M 0x000fffff +#define __region_CS1_C 0x00010404 +#define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ +#define __region_CS3_M 0x000fffff +#define __region_CS3_C 0xc8000000 +#define __region_CS4 0xfd000000 /* extra ROMs area */ +#define __region_CS4_M 0x00ffffff +#define __region_CS4_C 0x00000f07 + +#define __region_CS6 0xfe000000 /* not used - hide behind CPU resource I/O regs */ +#define __region_CS6_M 0x000fffff +#define __region_CS6_C 0x00000f07 +#define __region_CS7 0xfe000000 /* not used - hide behind CPU resource I/O regs */ +#define __region_CS7_M 0x000fffff +#define __region_CS7_C 0x00000f07 + +#define __is_PCI_IO(addr) 0 /* no PCI */ +#define __is_PCI_MEM(addr) 0 +#define __is_PCI_addr(addr) 0 +#define __region_PCI_IO 0 +#define __region_PCI_MEM 0 +#define __flush_PCI_writes() do { } while(0) + +#define __get_CLKSW() 0UL +#define __get_CLKIN() 66000000UL + +#define __addr_LEDS() (__region_CS2 + 0x00000023UL) +#define __set_LEDS(X) __builtin_write8((volatile void __iomem *) __addr_LEDS(), (X)) + +#define __addr_FPGATR() (__region_CS2 + 0x00000030UL) +#define __set_FPGATR(X) __builtin_write32((volatile void __iomem *) __addr_FPGATR(), (X)) +#define __get_FPGATR() __builtin_read32((volatile void __iomem *) __addr_FPGATR()) + +#define MB93093_FPGA_FPGATR_AUDIO_CLK 0x00000003 + +#define __set_FPGATR_AUDIO_CLK(V) \ + __set_FPGATR((__get_FPGATR() & ~MB93093_FPGA_FPGATR_AUDIO_CLK) | (V)) + +#define MB93093_FPGA_FPGATR_AUDIO_CLK_OFF 0x0 +#define MB93093_FPGA_FPGATR_AUDIO_CLK_11MHz 0x1 +#define MB93093_FPGA_FPGATR_AUDIO_CLK_12MHz 0x2 +#define MB93093_FPGA_FPGATR_AUDIO_CLK_02MHz 0x3 + +#define MB93093_FPGA_SWR_PUSHSWMASK (0x1F<<26) +#define MB93093_FPGA_SWR_PUSHSW4 (1<<29) + +#define __addr_FPGA_SWR ((volatile void __iomem *)(__region_CS2 + 0x28UL)) +#define __get_FPGA_PUSHSW1_5() (__builtin_read32(__addr_FPGA_SWR) & MB93093_FPGA_SWR_PUSHSWMASK) + + +#endif + +#endif /* _ASM_MB_REGS_H */ diff --git a/arch/frv/include/asm/mb86943a.h b/arch/frv/include/asm/mb86943a.h new file mode 100644 index 0000000..e87ef92 --- /dev/null +++ b/arch/frv/include/asm/mb86943a.h @@ -0,0 +1,42 @@ +/* mb86943a.h: MB86943 SPARClite <-> PCI bridge registers + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB86943A_H +#define _ASM_MB86943A_H + +#include + +#define __reg_MB86943_sl_ctl *(volatile uint32_t *) (__region_CS1 + 0x00) + +#define MB86943_SL_CTL_BUS_WIDTH_64 0x00000001 +#define MB86943_SL_CTL_AS_HOST 0x00000002 +#define MB86943_SL_CTL_DRCT_MASTER_SWAP 0x00000004 +#define MB86943_SL_CTL_DRCT_SLAVE_SWAP 0x00000008 +#define MB86943_SL_CTL_PCI_CONFIG_SWAP 0x00000010 +#define MB86943_SL_CTL_ECS0_ENABLE 0x00000020 +#define MB86943_SL_CTL_ECS1_ENABLE 0x00000040 +#define MB86943_SL_CTL_ECS2_ENABLE 0x00000080 + +#define __reg_MB86943_ecs_ctl(N) *(volatile uint32_t *) (__region_CS1 + 0x08 + (0x08*(N))) +#define __reg_MB86943_ecs_range(N) *(volatile uint32_t *) (__region_CS1 + 0x20 + (0x10*(N))) +#define __reg_MB86943_ecs_base(N) *(volatile uint32_t *) (__region_CS1 + 0x28 + (0x10*(N))) + +#define __reg_MB86943_sl_pci_io_range *(volatile uint32_t *) (__region_CS1 + 0x50) +#define __reg_MB86943_sl_pci_io_base *(volatile uint32_t *) (__region_CS1 + 0x58) +#define __reg_MB86943_sl_pci_mem_range *(volatile uint32_t *) (__region_CS1 + 0x60) +#define __reg_MB86943_sl_pci_mem_base *(volatile uint32_t *) (__region_CS1 + 0x68) +#define __reg_MB86943_pci_sl_io_base *(volatile uint32_t *) (__region_CS1 + 0x70) +#define __reg_MB86943_pci_sl_mem_base *(volatile uint32_t *) (__region_CS1 + 0x78) + +#define __reg_MB86943_pci_arbiter *(volatile uint32_t *) (__region_CS2 + 0x01300014) +#define MB86943_PCIARB_EN 0x00000001 + +#endif /* _ASM_MB86943A_H */ diff --git a/arch/frv/include/asm/mb93091-fpga-irqs.h b/arch/frv/include/asm/mb93091-fpga-irqs.h new file mode 100644 index 0000000..19778c5b --- /dev/null +++ b/arch/frv/include/asm/mb93091-fpga-irqs.h @@ -0,0 +1,42 @@ +/* mb93091-fpga-irqs.h: MB93091 CPU board FPGA IRQs + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB93091_FPGA_IRQS_H +#define _ASM_MB93091_FPGA_IRQS_H + +#include + +#ifndef __ASSEMBLY__ + +/* IRQ IDs presented to drivers */ +enum { + IRQ_FPGA__UNUSED = IRQ_BASE_FPGA, + IRQ_FPGA_SYSINT_BUS_EXPANSION_1, + IRQ_FPGA_SL_BUS_EXPANSION_2, + IRQ_FPGA_PCI_INTD, + IRQ_FPGA_PCI_INTC, + IRQ_FPGA_PCI_INTB, + IRQ_FPGA_PCI_INTA, + IRQ_FPGA_SL_BUS_EXPANSION_7, + IRQ_FPGA_SYSINT_BUS_EXPANSION_8, + IRQ_FPGA_SL_BUS_EXPANSION_9, + IRQ_FPGA_MB86943_PCI_INTA, + IRQ_FPGA_MB86943_SLBUS_SIDE, + IRQ_FPGA_RTL8029_INTA, + IRQ_FPGA_SYSINT_BUS_EXPANSION_13, + IRQ_FPGA_SL_BUS_EXPANSION_14, + IRQ_FPGA_NMI, +}; + + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_MB93091_FPGA_IRQS_H */ diff --git a/arch/frv/include/asm/mb93093-fpga-irqs.h b/arch/frv/include/asm/mb93093-fpga-irqs.h new file mode 100644 index 0000000..590266b --- /dev/null +++ b/arch/frv/include/asm/mb93093-fpga-irqs.h @@ -0,0 +1,29 @@ +/* mb93093-fpga-irqs.h: MB93093 CPU board FPGA IRQs + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB93093_FPGA_IRQS_H +#define _ASM_MB93093_FPGA_IRQS_H + +#include + +#ifndef __ASSEMBLY__ + +/* IRQ IDs presented to drivers */ +enum { + IRQ_FPGA_PUSH_BUTTON_SW1_5 = IRQ_BASE_FPGA + 8, + IRQ_FPGA_ROCKER_C_SW8 = IRQ_BASE_FPGA + 9, + IRQ_FPGA_ROCKER_C_SW9 = IRQ_BASE_FPGA + 10, +}; + + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_MB93093_FPGA_IRQS_H */ diff --git a/arch/frv/include/asm/mb93493-irqs.h b/arch/frv/include/asm/mb93493-irqs.h new file mode 100644 index 0000000..82c7aed --- /dev/null +++ b/arch/frv/include/asm/mb93493-irqs.h @@ -0,0 +1,50 @@ +/* mb93493-irqs.h: MB93493 companion chip IRQs + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB93493_IRQS_H +#define _ASM_MB93493_IRQS_H + +#include + +#ifndef __ASSEMBLY__ + +/* IRQ IDs presented to drivers */ +enum { + IRQ_MB93493_VDC = IRQ_BASE_MB93493 + 0, + IRQ_MB93493_VCC = IRQ_BASE_MB93493 + 1, + IRQ_MB93493_AUDIO_OUT = IRQ_BASE_MB93493 + 2, + IRQ_MB93493_I2C_0 = IRQ_BASE_MB93493 + 3, + IRQ_MB93493_I2C_1 = IRQ_BASE_MB93493 + 4, + IRQ_MB93493_USB = IRQ_BASE_MB93493 + 5, + IRQ_MB93493_LOCAL_BUS = IRQ_BASE_MB93493 + 7, + IRQ_MB93493_PCMCIA = IRQ_BASE_MB93493 + 8, + IRQ_MB93493_GPIO = IRQ_BASE_MB93493 + 9, + IRQ_MB93493_AUDIO_IN = IRQ_BASE_MB93493 + 10, +}; + +/* IRQ multiplexor mappings */ +#define ROUTE_VIA_IRQ0 0 /* route IRQ by way of CPU external IRQ 0 */ +#define ROUTE_VIA_IRQ1 1 /* route IRQ by way of CPU external IRQ 1 */ + +#define IRQ_MB93493_VDC_ROUTE ROUTE_VIA_IRQ0 +#define IRQ_MB93493_VCC_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_AUDIO_OUT_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_I2C_0_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_I2C_1_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_USB_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_LOCAL_BUS_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_PCMCIA_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_GPIO_ROUTE ROUTE_VIA_IRQ1 +#define IRQ_MB93493_AUDIO_IN_ROUTE ROUTE_VIA_IRQ1 + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_MB93493_IRQS_H */ diff --git a/arch/frv/include/asm/mb93493-regs.h b/arch/frv/include/asm/mb93493-regs.h new file mode 100644 index 0000000..8a1f6aa --- /dev/null +++ b/arch/frv/include/asm/mb93493-regs.h @@ -0,0 +1,281 @@ +/* mb93493-regs.h: MB93493 companion chip registers + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MB93493_REGS_H +#define _ASM_MB93493_REGS_H + +#include +#include + +#define __addr_MB93493(X) ((volatile unsigned long *)(__region_CS3 + (X))) +#define __get_MB93493(X) ({ *(volatile unsigned long *)(__region_CS3 + (X)); }) + +#define __set_MB93493(X,V) \ +do { \ + *(volatile unsigned long *)(__region_CS3 + (X)) = (V); mb(); \ +} while(0) + +#define __get_MB93493_STSR(X) __get_MB93493(0x3c0 + (X) * 4) +#define __set_MB93493_STSR(X,V) __set_MB93493(0x3c0 + (X) * 4, (V)) +#define MB93493_STSR_EN + +#define __addr_MB93493_IQSR(X) __addr_MB93493(0x3d0 + (X) * 4) +#define __get_MB93493_IQSR(X) __get_MB93493(0x3d0 + (X) * 4) +#define __set_MB93493_IQSR(X,V) __set_MB93493(0x3d0 + (X) * 4, (V)) + +#define __get_MB93493_DQSR(X) __get_MB93493(0x3e0 + (X) * 4) +#define __set_MB93493_DQSR(X,V) __set_MB93493(0x3e0 + (X) * 4, (V)) + +#define __get_MB93493_LBSER() __get_MB93493(0x3f0) +#define __set_MB93493_LBSER(V) __set_MB93493(0x3f0, (V)) + +#define MB93493_LBSER_VDC 0x00010000 +#define MB93493_LBSER_VCC 0x00020000 +#define MB93493_LBSER_AUDIO 0x00040000 +#define MB93493_LBSER_I2C_0 0x00080000 +#define MB93493_LBSER_I2C_1 0x00100000 +#define MB93493_LBSER_USB 0x00200000 +#define MB93493_LBSER_GPIO 0x00800000 +#define MB93493_LBSER_PCMCIA 0x01000000 + +#define __get_MB93493_LBSR() __get_MB93493(0x3fc) +#define __set_MB93493_LBSR(V) __set_MB93493(0x3fc, (V)) + +/* + * video display controller + */ +#define __get_MB93493_VDC(X) __get_MB93493(MB93493_VDC_##X) +#define __set_MB93493_VDC(X,V) __set_MB93493(MB93493_VDC_##X, (V)) + +#define MB93493_VDC_RCURSOR 0x140 /* cursor position */ +#define MB93493_VDC_RCT1 0x144 /* cursor colour 1 */ +#define MB93493_VDC_RCT2 0x148 /* cursor colour 2 */ +#define MB93493_VDC_RHDC 0x150 /* horizontal display period */ +#define MB93493_VDC_RH_MARGINS 0x154 /* horizontal margin sizes */ +#define MB93493_VDC_RVDC 0x158 /* vertical display period */ +#define MB93493_VDC_RV_MARGINS 0x15c /* vertical margin sizes */ +#define MB93493_VDC_RC 0x170 /* VDC control */ +#define MB93493_VDC_RCLOCK 0x174 /* clock divider, DMA req delay */ +#define MB93493_VDC_RBLACK 0x178 /* black insert sizes */ +#define MB93493_VDC_RS 0x17c /* VDC status */ + +#define __addr_MB93493_VDC_BCI(X) ({ (volatile unsigned long *)(__region_CS3 + 0x000 + (X)); }) +#define __addr_MB93493_VDC_TPO(X) (__region_CS3 + 0x1c0 + (X)) + +#define VDC_TPO_WIDTH 32 + +#define VDC_RC_DSR 0x00000080 /* VDC master reset */ + +#define VDC_RS_IT 0x00060000 /* interrupt indicators */ +#define VDC_RS_IT_UNDERFLOW 0x00040000 /* - underflow event */ +#define VDC_RS_IT_VSYNC 0x00020000 /* - VSYNC event */ +#define VDC_RS_DFI 0x00010000 /* current interlace field number */ +#define VDC_RS_DFI_TOP 0x00000000 /* - top field */ +#define VDC_RS_DFI_BOTTOM 0x00010000 /* - bottom field */ +#define VDC_RS_DCSR 0x00000010 /* cursor state */ +#define VDC_RS_DCM 0x00000003 /* display mode */ +#define VDC_RS_DCM_DISABLED 0x00000000 /* - display disabled */ +#define VDC_RS_DCM_STOPPED 0x00000001 /* - VDC stopped */ +#define VDC_RS_DCM_FREERUNNING 0x00000002 /* - VDC free-running */ +#define VDC_RS_DCM_TRANSFERRING 0x00000003 /* - data being transferred to VDC */ + +/* + * video capture controller + */ +#define __get_MB93493_VCC(X) __get_MB93493(MB93493_VCC_##X) +#define __set_MB93493_VCC(X,V) __set_MB93493(MB93493_VCC_##X, (V)) + +#define MB93493_VCC_RREDUCT 0x104 /* reduction rate */ +#define MB93493_VCC_RHY 0x108 /* horizontal brightness filter coefficients */ +#define MB93493_VCC_RHC 0x10c /* horizontal colour-difference filter coefficients */ +#define MB93493_VCC_RHSIZE 0x110 /* horizontal cycle sizes */ +#define MB93493_VCC_RHBC 0x114 /* horizontal back porch size */ +#define MB93493_VCC_RVCC 0x118 /* vertical capture period */ +#define MB93493_VCC_RVBC 0x11c /* vertical back porch period */ +#define MB93493_VCC_RV 0x120 /* vertical filter coefficients */ +#define MB93493_VCC_RDTS 0x128 /* DMA transfer size */ +#define MB93493_VCC_RDTS_4B 0x01000000 /* 4-byte transfer */ +#define MB93493_VCC_RDTS_32B 0x03000000 /* 32-byte transfer */ +#define MB93493_VCC_RDTS_SHIFT 24 +#define MB93493_VCC_RCC 0x130 /* VCC control */ +#define MB93493_VCC_RIS 0x134 /* VCC interrupt status */ + +#define __addr_MB93493_VCC_TPI(X) (__region_CS3 + 0x180 + (X)) + +#define VCC_RHSIZE_RHCC 0x000007ff +#define VCC_RHSIZE_RHCC_SHIFT 0 +#define VCC_RHSIZE_RHTCC 0x0fff0000 +#define VCC_RHSIZE_RHTCC_SHIFT 16 + +#define VCC_RVBC_RVBC 0x00003f00 +#define VCC_RVBC_RVBC_SHIFT 8 + +#define VCC_RREDUCT_RHR 0x07ff0000 +#define VCC_RREDUCT_RHR_SHIFT 16 +#define VCC_RREDUCT_RVR 0x000007ff +#define VCC_RREDUCT_RVR_SHIFT 0 + +#define VCC_RCC_CE 0x00000001 /* VCC enable */ +#define VCC_RCC_CS 0x00000002 /* request video capture start */ +#define VCC_RCC_CPF 0x0000000c /* pixel format */ +#define VCC_RCC_CPF_YCBCR_16 0x00000000 /* - YCbCr 4:2:2 16-bit format */ +#define VCC_RCC_CPF_RGB 0x00000004 /* - RGB 4:4:4 format */ +#define VCC_RCC_CPF_YCBCR_24 0x00000008 /* - YCbCr 4:2:2 24-bit format */ +#define VCC_RCC_CPF_BT656 0x0000000c /* - ITU R-BT.656 format */ +#define VCC_RCC_CPF_SHIFT 2 +#define VCC_RCC_CSR 0x00000080 /* request reset */ +#define VCC_RCC_HSIP 0x00000100 /* HSYNC polarity */ +#define VCC_RCC_HSIP_LOACT 0x00000000 /* - low active */ +#define VCC_RCC_HSIP_HIACT 0x00000100 /* - high active */ +#define VCC_RCC_VSIP 0x00000200 /* VSYNC polarity */ +#define VCC_RCC_VSIP_LOACT 0x00000000 /* - low active */ +#define VCC_RCC_VSIP_HIACT 0x00000200 /* - high active */ +#define VCC_RCC_CIE 0x00000800 /* interrupt enable */ +#define VCC_RCC_CFP 0x00001000 /* RGB pixel packing */ +#define VCC_RCC_CFP_4TO3 0x00000000 /* - pack 4 pixels into 3 words */ +#define VCC_RCC_CFP_1TO1 0x00001000 /* - pack 1 pixel into 1 words */ +#define VCC_RCC_CSM 0x00006000 /* interlace specification */ +#define VCC_RCC_CSM_ONEPASS 0x00002000 /* - non-interlaced */ +#define VCC_RCC_CSM_INTERLACE 0x00004000 /* - interlaced */ +#define VCC_RCC_CSM_SHIFT 13 +#define VCC_RCC_ES 0x00008000 /* capture start polarity */ +#define VCC_RCC_ES_NEG 0x00000000 /* - negative edge */ +#define VCC_RCC_ES_POS 0x00008000 /* - positive edge */ +#define VCC_RCC_IFI 0x00080000 /* inferlace field evaluation reverse */ +#define VCC_RCC_FDTS 0x00300000 /* interlace field start */ +#define VCC_RCC_FDTS_3_8 0x00000000 /* - 3/8 of horizontal entire cycle */ +#define VCC_RCC_FDTS_1_4 0x00100000 /* - 1/4 of horizontal entire cycle */ +#define VCC_RCC_FDTS_7_16 0x00200000 /* - 7/16 of horizontal entire cycle */ +#define VCC_RCC_FDTS_SHIFT 20 +#define VCC_RCC_MOV 0x00400000 /* test bit - always set to 1 */ +#define VCC_RCC_STP 0x00800000 /* request video capture stop */ +#define VCC_RCC_TO 0x01000000 /* input during top-field only */ + +#define VCC_RIS_VSYNC 0x01000000 /* VSYNC interrupt */ +#define VCC_RIS_OV 0x02000000 /* overflow interrupt */ +#define VCC_RIS_BOTTOM 0x08000000 /* interlace bottom field */ +#define VCC_RIS_STARTED 0x10000000 /* capture started */ + +/* + * I2C + */ +#define MB93493_I2C_BSR 0x340 /* bus status */ +#define MB93493_I2C_BCR 0x344 /* bus control */ +#define MB93493_I2C_CCR 0x348 /* clock control */ +#define MB93493_I2C_ADR 0x34c /* address */ +#define MB93493_I2C_DTR 0x350 /* data */ +#define MB93493_I2C_BC2R 0x35c /* bus control 2 */ + +#define __addr_MB93493_I2C(port,X) (__region_CS3 + MB93493_I2C_##X + ((port)*0x20)) +#define __get_MB93493_I2C(port,X) __get_MB93493(MB93493_I2C_##X + ((port)*0x20)) +#define __set_MB93493_I2C(port,X,V) __set_MB93493(MB93493_I2C_##X + ((port)*0x20), (V)) + +#define I2C_BSR_BB (1 << 7) + +/* + * audio controller (I2S) registers + */ +#define __get_MB93493_I2S(X) __get_MB93493(MB93493_I2S_##X) +#define __set_MB93493_I2S(X,V) __set_MB93493(MB93493_I2S_##X, (V)) + +#define MB93493_I2S_ALDR 0x300 /* L-channel data */ +#define MB93493_I2S_ARDR 0x304 /* R-channel data */ +#define MB93493_I2S_APDR 0x308 /* 16-bit packed data */ +#define MB93493_I2S_AISTR 0x310 /* status */ +#define MB93493_I2S_AICR 0x314 /* control */ + +#define __addr_MB93493_I2S_ALDR(X) (__region_CS3 + MB93493_I2S_ALDR + (X)) +#define __addr_MB93493_I2S_ARDR(X) (__region_CS3 + MB93493_I2S_ARDR + (X)) +#define __addr_MB93493_I2S_APDR(X) (__region_CS3 + MB93493_I2S_APDR + (X)) +#define __addr_MB93493_I2S_ADR(X) (__region_CS3 + 0x320 + (X)) + +#define I2S_AISTR_OTST 0x00000003 /* status of output data transfer */ +#define I2S_AISTR_OTR 0x00000010 /* output transfer request pending */ +#define I2S_AISTR_OUR 0x00000020 /* output FIFO underrun detected */ +#define I2S_AISTR_OOR 0x00000040 /* output FIFO overrun detected */ +#define I2S_AISTR_ODS 0x00000100 /* output DMA transfer size */ +#define I2S_AISTR_ODE 0x00000400 /* output DMA transfer request enable */ +#define I2S_AISTR_OTRIE 0x00001000 /* output transfer request interrupt enable */ +#define I2S_AISTR_OURIE 0x00002000 /* output FIFO underrun interrupt enable */ +#define I2S_AISTR_OORIE 0x00004000 /* output FIFO overrun interrupt enable */ +#define I2S_AISTR__OUT_MASK 0x00007570 +#define I2S_AISTR_ITST 0x00030000 /* status of input data transfer */ +#define I2S_AISTR_ITST_SHIFT 16 +#define I2S_AISTR_ITR 0x00100000 /* input transfer request pending */ +#define I2S_AISTR_IUR 0x00200000 /* input FIFO underrun detected */ +#define I2S_AISTR_IOR 0x00400000 /* input FIFO overrun detected */ +#define I2S_AISTR_IDS 0x01000000 /* input DMA transfer size */ +#define I2S_AISTR_IDE 0x04000000 /* input DMA transfer request enable */ +#define I2S_AISTR_ITRIE 0x10000000 /* input transfer request interrupt enable */ +#define I2S_AISTR_IURIE 0x20000000 /* input FIFO underrun interrupt enable */ +#define I2S_AISTR_IORIE 0x40000000 /* input FIFO overrun interrupt enable */ +#define I2S_AISTR__IN_MASK 0x75700000 + +#define I2S_AICR_MI 0x00000001 /* mono input requested */ +#define I2S_AICR_AMI 0x00000002 /* relation between LRCKI/FS1 and SDI */ +#define I2S_AICR_LRI 0x00000004 /* function of LRCKI pin */ +#define I2S_AICR_SDMI 0x00000070 /* format of input audio data */ +#define I2S_AICR_SDMI_SHIFT 4 +#define I2S_AICR_CLI 0x00000080 /* input FIFO clearing control */ +#define I2S_AICR_IM 0x00000300 /* input state control */ +#define I2S_AICR_IM_SHIFT 8 +#define I2S_AICR__IN_MASK 0x000003f7 +#define I2S_AICR_MO 0x00001000 /* mono output requested */ +#define I2S_AICR_AMO 0x00002000 /* relation between LRCKO/FS0 and SDO */ +#define I2S_AICR_AMO_SHIFT 13 +#define I2S_AICR_LRO 0x00004000 /* function of LRCKO pin */ +#define I2S_AICR_SDMO 0x00070000 /* format of output audio data */ +#define I2S_AICR_SDMO_SHIFT 16 +#define I2S_AICR_CLO 0x00080000 /* output FIFO clearing control */ +#define I2S_AICR_OM 0x00100000 /* output state control */ +#define I2S_AICR__OUT_MASK 0x001f7000 +#define I2S_AICR_DIV 0x03000000 /* frequency division rate */ +#define I2S_AICR_DIV_SHIFT 24 +#define I2S_AICR_FL 0x20000000 /* frame length */ +#define I2S_AICR_FS 0x40000000 /* frame sync method */ +#define I2S_AICR_ME 0x80000000 /* master enable */ + +/* + * PCMCIA + */ +#define __addr_MB93493_PCMCIA(X) ((volatile unsigned long *)(__region_CS5 + (X))) + +/* + * GPIO + */ +#define __get_MB93493_GPIO_PDR(X) __get_MB93493(0x380 + (X) * 0xc0) +#define __set_MB93493_GPIO_PDR(X,V) __set_MB93493(0x380 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_GPDR(X) __get_MB93493(0x384 + (X) * 0xc0) +#define __set_MB93493_GPIO_GPDR(X,V) __set_MB93493(0x384 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_SIR(X) __get_MB93493(0x388 + (X) * 0xc0) +#define __set_MB93493_GPIO_SIR(X,V) __set_MB93493(0x388 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_SOR(X) __get_MB93493(0x38c + (X) * 0xc0) +#define __set_MB93493_GPIO_SOR(X,V) __set_MB93493(0x38c + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_PDSR(X) __get_MB93493(0x390 + (X) * 0xc0) +#define __set_MB93493_GPIO_PDSR(X,V) __set_MB93493(0x390 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_PDCR(X) __get_MB93493(0x394 + (X) * 0xc0) +#define __set_MB93493_GPIO_PDCR(X,V) __set_MB93493(0x394 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_INTST(X) __get_MB93493(0x398 + (X) * 0xc0) +#define __set_MB93493_GPIO_INTST(X,V) __set_MB93493(0x398 + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_IEHL(X) __get_MB93493(0x39c + (X) * 0xc0) +#define __set_MB93493_GPIO_IEHL(X,V) __set_MB93493(0x39c + (X) * 0xc0, (V)) + +#define __get_MB93493_GPIO_IELH(X) __get_MB93493(0x3a0 + (X) * 0xc0) +#define __set_MB93493_GPIO_IELH(X,V) __set_MB93493(0x3a0 + (X) * 0xc0, (V)) + +#endif /* _ASM_MB93493_REGS_H */ diff --git a/arch/frv/include/asm/mc146818rtc.h b/arch/frv/include/asm/mc146818rtc.h new file mode 100644 index 0000000..90dfb7a --- /dev/null +++ b/arch/frv/include/asm/mc146818rtc.h @@ -0,0 +1,16 @@ +/* mc146818rtc.h: RTC defs + * + * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MC146818RTC_H +#define _ASM_MC146818RTC_H + + +#endif /* _ASM_MC146818RTC_H */ diff --git a/arch/frv/include/asm/mem-layout.h b/arch/frv/include/asm/mem-layout.h new file mode 100644 index 0000000..2947764 --- /dev/null +++ b/arch/frv/include/asm/mem-layout.h @@ -0,0 +1,86 @@ +/* mem-layout.h: memory layout + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MEM_LAYOUT_H +#define _ASM_MEM_LAYOUT_H + +#ifndef __ASSEMBLY__ +#define __UL(X) ((unsigned long) (X)) +#else +#define __UL(X) (X) +#endif + +/* + * PAGE_SHIFT determines the page size + */ +#define PAGE_SHIFT 14 + +#ifndef __ASSEMBLY__ +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#else +#define PAGE_SIZE (1 << PAGE_SHIFT) +#endif + +#define PAGE_MASK (~(PAGE_SIZE-1)) + +/* + * the slab must be aligned such that load- and store-double instructions don't + * fault if used + */ +#define ARCH_KMALLOC_MINALIGN 8 +#define ARCH_SLAB_MINALIGN 8 + +/*****************************************************************************/ +/* + * virtual memory layout from kernel's point of view + */ +#define PAGE_OFFSET ((unsigned long) &__page_offset) + +#ifdef CONFIG_MMU + +/* see Documentation/frv/mmu-layout.txt */ +#define KERNEL_LOWMEM_START __UL(0xc0000000) +#define KERNEL_LOWMEM_END __UL(0xd0000000) +#define VMALLOC_START __UL(0xd0000000) +#define VMALLOC_END __UL(0xd8000000) +#define PKMAP_BASE __UL(0xd8000000) +#define PKMAP_END __UL(0xdc000000) +#define KMAP_ATOMIC_SECONDARY_FRAME __UL(0xdc000000) +#define KMAP_ATOMIC_PRIMARY_FRAME __UL(0xdd000000) + +#endif + +#define KERNEL_IO_START __UL(0xe0000000) + + +/*****************************************************************************/ +/* + * memory layout from userspace's point of view + */ +#define BRK_BASE __UL(2 * 1024 * 1024 + PAGE_SIZE) +#define STACK_TOP __UL(2 * 1024 * 1024) +#define STACK_TOP_MAX __UL(0xc0000000) + +/* userspace process size */ +#ifdef CONFIG_MMU +#define TASK_SIZE (PAGE_OFFSET) +#else +#define TASK_SIZE __UL(0xFFFFFFFFUL) +#endif + +/* base of area at which unspecified mmaps will start */ +#ifdef CONFIG_BINFMT_ELF_FDPIC +#define TASK_UNMAPPED_BASE __UL(16 * 1024 * 1024) +#else +#define TASK_UNMAPPED_BASE __UL(TASK_SIZE / 3) +#endif + +#endif /* _ASM_MEM_LAYOUT_H */ diff --git a/arch/frv/include/asm/mman.h b/arch/frv/include/asm/mman.h new file mode 100644 index 0000000..b4371e9 --- /dev/null +++ b/arch/frv/include/asm/mman.h @@ -0,0 +1,18 @@ +#ifndef __ASM_MMAN_H__ +#define __ASM_MMAN_H__ + +#include + +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ +#define MAP_NONBLOCK 0x10000 /* do not block on IO */ + +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ + +#endif /* __ASM_MMAN_H__ */ + diff --git a/arch/frv/include/asm/mmu.h b/arch/frv/include/asm/mmu.h new file mode 100644 index 0000000..86ca0e8 --- /dev/null +++ b/arch/frv/include/asm/mmu.h @@ -0,0 +1,41 @@ +/* mmu.h: memory management context for FR-V with or without MMU support + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_MMU_H +#define _ASM_MMU_H + +typedef struct { +#ifdef CONFIG_MMU + struct list_head id_link; /* link in list of context ID owners */ + unsigned short id; /* MMU context ID */ + unsigned short id_busy; /* true if ID is in CXNR */ + unsigned long itlb_cached_pge; /* [SCR0] PGE cached for insn TLB handler */ + unsigned long itlb_ptd_mapping; /* [DAMR4] PTD mapping for itlb cached PGE */ + unsigned long dtlb_cached_pge; /* [SCR1] PGE cached for data TLB handler */ + unsigned long dtlb_ptd_mapping; /* [DAMR5] PTD mapping for dtlb cached PGE */ + +#else + unsigned long end_brk; + +#endif + +#ifdef CONFIG_BINFMT_ELF_FDPIC + unsigned long exec_fdpic_loadmap; + unsigned long interp_fdpic_loadmap; +#endif + +} mm_context_t; + +#ifdef CONFIG_MMU +extern int __nongpreldata cxn_pinned; +extern int cxn_pin_by_pid(pid_t pid); +#endif + +#endif /* _ASM_MMU_H */ diff --git a/arch/frv/include/asm/mmu_context.h b/arch/frv/include/asm/mmu_context.h new file mode 100644 index 0000000..c7daa39 --- /dev/null +++ b/arch/frv/include/asm/mmu_context.h @@ -0,0 +1,50 @@ +/* mmu_context.h: MMU context management routines + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_MMU_CONTEXT_H +#define _ASM_MMU_CONTEXT_H + +#include +#include +#include +#include + +static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) +{ +} + +#ifdef CONFIG_MMU +extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); +extern void change_mm_context(mm_context_t *old, mm_context_t *ctx, pgd_t *_pgd); +extern void destroy_context(struct mm_struct *mm); + +#else +#define init_new_context(tsk, mm) ({ 0; }) +#define change_mm_context(old, ctx, _pml4) do {} while(0) +#define destroy_context(mm) do {} while(0) +#endif + +#define switch_mm(prev, next, tsk) \ +do { \ + if (prev != next) \ + change_mm_context(&prev->context, &next->context, next->pgd); \ +} while(0) + +#define activate_mm(prev, next) \ +do { \ + change_mm_context(&prev->context, &next->context, next->pgd); \ +} while(0) + +#define deactivate_mm(tsk, mm) \ +do { \ +} while(0) + +#endif diff --git a/arch/frv/include/asm/module.h b/arch/frv/include/asm/module.h new file mode 100644 index 0000000..3d5c636 --- /dev/null +++ b/arch/frv/include/asm/module.h @@ -0,0 +1,28 @@ +/* module.h: FRV module stuff + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_MODULE_H +#define _ASM_MODULE_H + +struct mod_arch_specific +{ +}; + +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Ehdr Elf32_Ehdr + +/* + * Include the architecture version. + */ +#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " " + +#endif /* _ASM_MODULE_H */ + diff --git a/arch/frv/include/asm/msgbuf.h b/arch/frv/include/asm/msgbuf.h new file mode 100644 index 0000000..97ceb55 --- /dev/null +++ b/arch/frv/include/asm/msgbuf.h @@ -0,0 +1,32 @@ +#ifndef _ASM_MSGBUF_H +#define _ASM_MSGBUF_H + +/* + * The msqid64_ds structure for FR-V architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct msqid64_ds { + struct ipc64_perm msg_perm; + __kernel_time_t msg_stime; /* last msgsnd time */ + unsigned long __unused1; + __kernel_time_t msg_rtime; /* last msgrcv time */ + unsigned long __unused2; + __kernel_time_t msg_ctime; /* last change time */ + unsigned long __unused3; + unsigned long msg_cbytes; /* current number of bytes on queue */ + unsigned long msg_qnum; /* number of messages in queue */ + unsigned long msg_qbytes; /* max number of bytes on queue */ + __kernel_pid_t msg_lspid; /* pid of last msgsnd */ + __kernel_pid_t msg_lrpid; /* last receive pid */ + unsigned long __unused4; + unsigned long __unused5; +}; + +#endif /* _ASM_MSGBUF_H */ + diff --git a/arch/frv/include/asm/mutex.h b/arch/frv/include/asm/mutex.h new file mode 100644 index 0000000..458c1f7 --- /dev/null +++ b/arch/frv/include/asm/mutex.h @@ -0,0 +1,9 @@ +/* + * Pull in the generic implementation for the mutex fastpath. + * + * TODO: implement optimized primitives instead, or leave the generic + * implementation in place, or pick the atomic_xchg() based generic + * implementation. (see asm-generic/mutex-xchg.h for details) + */ + +#include diff --git a/arch/frv/include/asm/page.h b/arch/frv/include/asm/page.h new file mode 100644 index 0000000..bd9c220 --- /dev/null +++ b/arch/frv/include/asm/page.h @@ -0,0 +1,78 @@ +#ifndef _ASM_PAGE_H +#define _ASM_PAGE_H + +#include +#include +#include +#include + +#ifndef __ASSEMBLY__ + +#define get_user_page(vaddr) __get_free_page(GFP_KERNEL) +#define free_user_page(page, addr) free_page(addr) + +#define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) +#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE) + +#define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) +#define copy_user_page(vto, vfrom, vaddr, topg) memcpy((vto), (vfrom), PAGE_SIZE) + +/* + * These are used to make use of C type-checking.. + */ +typedef struct { unsigned long pte; } pte_t; +typedef struct { unsigned long ste[64];} pmd_t; +typedef struct { pmd_t pue[1]; } pud_t; +typedef struct { pud_t pge[1]; } pgd_t; +typedef struct { unsigned long pgprot; } pgprot_t; +typedef struct page *pgtable_t; + +#define pte_val(x) ((x).pte) +#define pmd_val(x) ((x).ste[0]) +#define pud_val(x) ((x).pue[0]) +#define pgd_val(x) ((x).pge[0]) +#define pgprot_val(x) ((x).pgprot) + +#define __pte(x) ((pte_t) { (x) } ) +#define __pmd(x) ((pmd_t) { (x) } ) +#define __pud(x) ((pud_t) { (x) } ) +#define __pgd(x) ((pgd_t) { (x) } ) +#define __pgprot(x) ((pgprot_t) { (x) } ) +#define PTE_MASK PAGE_MASK + +#define devmem_is_allowed(pfn) 1 + +#define __pa(vaddr) virt_to_phys((void *) (unsigned long) (vaddr)) +#define __va(paddr) phys_to_virt((unsigned long) (paddr)) + +#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) + +extern unsigned long max_low_pfn; +extern unsigned long min_low_pfn; +extern unsigned long max_pfn; + +#ifdef CONFIG_MMU +#define pfn_valid(pfn) ((pfn) < max_mapnr) +#else +#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) +#define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) + +#endif + +#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) +#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) + + +#ifdef CONFIG_MMU +#define VM_DATA_DEFAULT_FLAGS \ + (VM_READ | VM_WRITE | \ + ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#endif + +#endif /* __ASSEMBLY__ */ + +#include +#include + +#endif /* _ASM_PAGE_H */ diff --git a/arch/frv/include/asm/param.h b/arch/frv/include/asm/param.h new file mode 100644 index 0000000..6859dd5 --- /dev/null +++ b/arch/frv/include/asm/param.h @@ -0,0 +1,22 @@ +#ifndef _ASM_PARAM_H +#define _ASM_PARAM_H + +#ifdef __KERNEL__ +#define HZ CONFIG_HZ /* Internal kernel timer frequency */ +#define USER_HZ 100 /* .. some user interfaces are in "ticks" */ +#define CLOCKS_PER_SEC (USER_HZ) /* like times() */ +#endif + +#ifndef HZ +#define HZ 100 +#endif + +#define EXEC_PAGESIZE 16384 + +#ifndef NOGROUP +#define NOGROUP (-1) +#endif + +#define MAXHOSTNAMELEN 64 /* max length of hostname */ + +#endif /* _ASM_PARAM_H */ diff --git a/arch/frv/include/asm/pci.h b/arch/frv/include/asm/pci.h new file mode 100644 index 0000000..585d9b4 --- /dev/null +++ b/arch/frv/include/asm/pci.h @@ -0,0 +1,118 @@ +/* pci.h: FR-V specific PCI declarations + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from include/asm-m68k/pci.h + * + * 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. + */ + +#ifndef ASM_PCI_H +#define ASM_PCI_H + +#include +#include +#include +#include + +struct pci_dev; + +#define pcibios_assign_all_busses() 0 + +extern void pcibios_set_master(struct pci_dev *dev); + +extern void pcibios_penalize_isa_irq(int irq); + +#ifdef CONFIG_MMU +extern void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle); +extern void consistent_free(void *vaddr); +extern void consistent_sync(void *vaddr, size_t size, int direction); +extern void consistent_sync_page(struct page *page, unsigned long offset, + size_t size, int direction); +#endif + +extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, + dma_addr_t *dma_handle); + +extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, + void *vaddr, dma_addr_t dma_handle); + +/* Return the index of the PCI controller for device PDEV. */ +#define pci_controller_num(PDEV) (0) + +/* The PCI address space does equal the physical memory + * address space. The networking and block device layers use + * this boolean for bounce buffer decisions. + */ +#define PCI_DMA_BUS_IS_PHYS (1) + +/* pci_unmap_{page,single} is a nop so... */ +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) +#define pci_unmap_addr(PTR, ADDR_NAME) (0) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) +#define pci_unmap_len(PTR, LEN_NAME) (0) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) + +#ifdef CONFIG_PCI +static inline void pci_dma_burst_advice(struct pci_dev *pdev, + enum pci_dma_burst_strategy *strat, + unsigned long *strategy_parameter) +{ + *strat = PCI_DMA_BURST_INFINITY; + *strategy_parameter = ~0UL; +} +#endif + +/* + * These are pretty much arbitary with the CoMEM implementation. + * We have the whole address space to ourselves. + */ +#define PCIBIOS_MIN_IO 0x100 +#define PCIBIOS_MIN_MEM 0x00010000 + +/* Make physical memory consistent for a single + * streaming mode DMA translation after a transfer. + * + * If you perform a pci_map_single() but wish to interrogate the + * buffer using the cpu, yet do not wish to teardown the PCI dma + * mapping, you must call this function before doing so. At the + * next point you give the PCI dma address back to the card, the + * device again owns the buffer. + */ +static inline void pci_dma_sync_single(struct pci_dev *hwdev, + dma_addr_t dma_handle, + size_t size, int direction) +{ + if (direction == PCI_DMA_NONE) + BUG(); + + frv_cache_wback_inv((unsigned long)bus_to_virt(dma_handle), + (unsigned long)bus_to_virt(dma_handle) + size); +} + +/* Make physical memory consistent for a set of streaming + * mode DMA translations after a transfer. + * + * The same as pci_dma_sync_single but for a scatter-gather list, + * same rules and usage. + */ +static inline void pci_dma_sync_sg(struct pci_dev *hwdev, + struct scatterlist *sg, + int nelems, int direction) +{ + int i; + + if (direction == PCI_DMA_NONE) + BUG(); + + for (i = 0; i < nelems; i++) + frv_cache_wback_inv(sg_dma_address(&sg[i]), + sg_dma_address(&sg[i])+sg_dma_len(&sg[i])); +} + + +#endif diff --git a/arch/frv/include/asm/percpu.h b/arch/frv/include/asm/percpu.h new file mode 100644 index 0000000..2cad3f8 --- /dev/null +++ b/arch/frv/include/asm/percpu.h @@ -0,0 +1,6 @@ +#ifndef __ASM_PERCPU_H +#define __ASM_PERCPU_H + +#include + +#endif /* __ASM_PERCPU_H */ diff --git a/arch/frv/include/asm/pgalloc.h b/arch/frv/include/asm/pgalloc.h new file mode 100644 index 0000000..971e6ad --- /dev/null +++ b/arch/frv/include/asm/pgalloc.h @@ -0,0 +1,69 @@ +/* pgalloc.h: Page allocation routines for FRV + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + * + * Derived from: + * include/asm-m68knommu/pgalloc.h + * include/asm-i386/pgalloc.h + */ +#ifndef _ASM_PGALLOC_H +#define _ASM_PGALLOC_H + +#include +#include + +#ifdef CONFIG_MMU + +#define pmd_populate_kernel(mm, pmd, pte) __set_pmd(pmd, __pa(pte) | _PAGE_TABLE) +#define pmd_populate(MM, PMD, PAGE) \ +do { \ + __set_pmd((PMD), page_to_pfn(PAGE) << PAGE_SHIFT | _PAGE_TABLE); \ +} while(0) +#define pmd_pgtable(pmd) pmd_page(pmd) + +/* + * Allocate and free page tables. + */ + +extern pgd_t *pgd_alloc(struct mm_struct *); +extern void pgd_free(struct mm_struct *mm, pgd_t *); + +extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); + +extern pgtable_t pte_alloc_one(struct mm_struct *, unsigned long); + +static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) +{ + free_page((unsigned long)pte); +} + +static inline void pte_free(struct mm_struct *mm, pgtable_t pte) +{ + pgtable_page_dtor(pte); + __free_page(pte); +} + +#define __pte_free_tlb(tlb,pte) \ +do { \ + pgtable_page_dtor(pte); \ + tlb_remove_page((tlb),(pte)); \ +} while (0) + +/* + * allocating and freeing a pmd is trivial: the 1-entry pmd is + * inside the pgd, so has no extra memory associated with it. + * (In the PAE case we free the pmds as part of the pgd.) + */ +#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); }) +#define pmd_free(mm, x) do { } while (0) +#define __pmd_free_tlb(tlb,x) do { } while (0) + +#endif /* CONFIG_MMU */ + +#endif /* _ASM_PGALLOC_H */ diff --git a/arch/frv/include/asm/pgtable.h b/arch/frv/include/asm/pgtable.h new file mode 100644 index 0000000..3323301 --- /dev/null +++ b/arch/frv/include/asm/pgtable.h @@ -0,0 +1,549 @@ +/* pgtable.h: FR-V page table mangling + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + * + * Derived from: + * include/asm-m68knommu/pgtable.h + * include/asm-i386/pgtable.h + */ + +#ifndef _ASM_PGTABLE_H +#define _ASM_PGTABLE_H + +#include +#include +#include + +#ifndef __ASSEMBLY__ +#include +#include +#include +#include +#include +struct vm_area_struct; +#endif + +#ifndef __ASSEMBLY__ +#if defined(CONFIG_HIGHPTE) +typedef unsigned long pte_addr_t; +#else +typedef pte_t *pte_addr_t; +#endif +#endif + +/*****************************************************************************/ +/* + * MMU-less operation case first + */ +#ifndef CONFIG_MMU + +#define pgd_present(pgd) (1) /* pages are always present on NO_MM */ +#define pgd_none(pgd) (0) +#define pgd_bad(pgd) (0) +#define pgd_clear(pgdp) +#define kern_addr_valid(addr) (1) +#define pmd_offset(a, b) ((void *) 0) + +#define PAGE_NONE __pgprot(0) /* these mean nothing to NO_MM */ +#define PAGE_SHARED __pgprot(0) /* these mean nothing to NO_MM */ +#define PAGE_COPY __pgprot(0) /* these mean nothing to NO_MM */ +#define PAGE_READONLY __pgprot(0) /* these mean nothing to NO_MM */ +#define PAGE_KERNEL __pgprot(0) /* these mean nothing to NO_MM */ + +#define __swp_type(x) (0) +#define __swp_offset(x) (0) +#define __swp_entry(typ,off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) +#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) +#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) + +#ifndef __ASSEMBLY__ +static inline int pte_file(pte_t pte) { return 0; } +#endif + +#define ZERO_PAGE(vaddr) ({ BUG(); NULL; }) + +#define swapper_pg_dir ((pgd_t *) NULL) + +#define pgtable_cache_init() do {} while (0) + +#include + +#else /* !CONFIG_MMU */ +/*****************************************************************************/ +/* + * then MMU operation + */ + +/* + * ZERO_PAGE is a global shared page that is always zero: used + * for zero-mapped memory areas etc.. + */ +#ifndef __ASSEMBLY__ +extern unsigned long empty_zero_page; +#define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page) +#endif + +/* + * we use 2-level page tables, folding the PMD (mid-level table) into the PGE (top-level entry) + * [see Documentation/frv/mmu-layout.txt] + * + * Page Directory: + * - Size: 16KB + * - 64 PGEs per PGD + * - Each PGE holds 1 PUD and covers 64MB + * + * Page Upper Directory: + * - Size: 256B + * - 1 PUE per PUD + * - Each PUE holds 1 PMD and covers 64MB + * + * Page Mid-Level Directory + * - Size: 256B + * - 1 PME per PMD + * - Each PME holds 64 STEs, all of which point to separate chunks of the same Page Table + * - All STEs are instantiated at the same time + * + * Page Table + * - Size: 16KB + * - 4096 PTEs per PT + * - Each Linux PT is subdivided into 64 FR451 PT's, each of which holds 64 entries + * + * Pages + * - Size: 4KB + * + * total PTEs + * = 1 PML4E * 64 PGEs * 1 PUEs * 1 PMEs * 4096 PTEs + * = 1 PML4E * 64 PGEs * 64 STEs * 64 PTEs/FR451-PT + * = 262144 (or 256 * 1024) + */ +#define PGDIR_SHIFT 26 +#define PGDIR_SIZE (1UL << PGDIR_SHIFT) +#define PGDIR_MASK (~(PGDIR_SIZE - 1)) +#define PTRS_PER_PGD 64 + +#define PUD_SHIFT 26 +#define PTRS_PER_PUD 1 +#define PUD_SIZE (1UL << PUD_SHIFT) +#define PUD_MASK (~(PUD_SIZE - 1)) +#define PUE_SIZE 256 + +#define PMD_SHIFT 26 +#define PMD_SIZE (1UL << PMD_SHIFT) +#define PMD_MASK (~(PMD_SIZE - 1)) +#define PTRS_PER_PMD 1 +#define PME_SIZE 256 + +#define __frv_PT_SIZE 256 + +#define PTRS_PER_PTE 4096 + +#define USER_PGDS_IN_LAST_PML4 (TASK_SIZE / PGDIR_SIZE) +#define FIRST_USER_ADDRESS 0 + +#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT) +#define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS) + +#define TWOLEVEL_PGDIR_SHIFT 26 +#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT) +#define BOOT_KERNEL_PGD_PTRS (PTRS_PER_PGD - BOOT_USER_PGD_PTRS) + +#ifndef __ASSEMBLY__ + +extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; + +#define pte_ERROR(e) \ + printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte) +#define pmd_ERROR(e) \ + printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) +#define pud_ERROR(e) \ + printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(e))) +#define pgd_ERROR(e) \ + printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(pgd_val(e)))) + +/* + * Certain architectures need to do special things when PTEs + * within a page table are directly modified. Thus, the following + * hook is made available. + */ +#define set_pte(pteptr, pteval) \ +do { \ + *(pteptr) = (pteval); \ + asm volatile("dcf %M0" :: "U"(*pteptr)); \ +} while(0) +#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) + +/* + * pgd_offset() returns a (pgd_t *) + * pgd_index() is used get the offset into the pgd page's array of pgd_t's; + */ +#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) + +/* + * a shortcut which implies the use of the kernel's pgd, instead + * of a process's + */ +#define pgd_offset_k(address) pgd_offset(&init_mm, address) + +/* + * The "pgd_xxx()" functions here are trivial for a folded two-level + * setup: the pud is never bad, and a pud always exists (as it's folded + * into the pgd entry) + */ +static inline int pgd_none(pgd_t pgd) { return 0; } +static inline int pgd_bad(pgd_t pgd) { return 0; } +static inline int pgd_present(pgd_t pgd) { return 1; } +static inline void pgd_clear(pgd_t *pgd) { } + +#define pgd_populate(mm, pgd, pud) do { } while (0) +/* + * (puds are folded into pgds so this doesn't get actually called, + * but the define is needed for a generic inline function.) + */ +#define set_pgd(pgdptr, pgdval) \ +do { \ + memcpy((pgdptr), &(pgdval), sizeof(pgd_t)); \ + asm volatile("dcf %M0" :: "U"(*(pgdptr))); \ +} while(0) + +static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) +{ + return (pud_t *) pgd; +} + +#define pgd_page(pgd) (pud_page((pud_t){ pgd })) +#define pgd_page_vaddr(pgd) (pud_page_vaddr((pud_t){ pgd })) + +/* + * allocating and freeing a pud is trivial: the 1-entry pud is + * inside the pgd, so has no extra memory associated with it. + */ +#define pud_alloc_one(mm, address) NULL +#define pud_free(mm, x) do { } while (0) +#define __pud_free_tlb(tlb, x) do { } while (0) + +/* + * The "pud_xxx()" functions here are trivial for a folded two-level + * setup: the pmd is never bad, and a pmd always exists (as it's folded + * into the pud entry) + */ +static inline int pud_none(pud_t pud) { return 0; } +static inline int pud_bad(pud_t pud) { return 0; } +static inline int pud_present(pud_t pud) { return 1; } +static inline void pud_clear(pud_t *pud) { } + +#define pud_populate(mm, pmd, pte) do { } while (0) + +/* + * (pmds are folded into puds so this doesn't get actually called, + * but the define is needed for a generic inline function.) + */ +#define set_pud(pudptr, pudval) set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval }) + +#define pud_page(pud) (pmd_page((pmd_t){ pud })) +#define pud_page_vaddr(pud) (pmd_page_vaddr((pmd_t){ pud })) + +/* + * (pmds are folded into pgds so this doesn't get actually called, + * but the define is needed for a generic inline function.) + */ +extern void __set_pmd(pmd_t *pmdptr, unsigned long __pmd); + +#define set_pmd(pmdptr, pmdval) \ +do { \ + __set_pmd((pmdptr), (pmdval).ste[0]); \ +} while(0) + +#define __pmd_index(address) 0 + +static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address) +{ + return (pmd_t *) dir + __pmd_index(address); +} + +#define pte_same(a, b) ((a).pte == (b).pte) +#define pte_page(x) (mem_map + ((unsigned long)(((x).pte >> PAGE_SHIFT)))) +#define pte_none(x) (!(x).pte) +#define pte_pfn(x) ((unsigned long)(((x).pte >> PAGE_SHIFT))) +#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) +#define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) + +#define VMALLOC_VMADDR(x) ((unsigned long) (x)) + +#endif /* !__ASSEMBLY__ */ + +/* + * control flags in AMPR registers and TLB entries + */ +#define _PAGE_BIT_PRESENT xAMPRx_V_BIT +#define _PAGE_BIT_WP DAMPRx_WP_BIT +#define _PAGE_BIT_NOCACHE xAMPRx_C_BIT +#define _PAGE_BIT_SUPER xAMPRx_S_BIT +#define _PAGE_BIT_ACCESSED xAMPRx_RESERVED8_BIT +#define _PAGE_BIT_DIRTY xAMPRx_M_BIT +#define _PAGE_BIT_NOTGLOBAL xAMPRx_NG_BIT + +#define _PAGE_PRESENT xAMPRx_V +#define _PAGE_WP DAMPRx_WP +#define _PAGE_NOCACHE xAMPRx_C +#define _PAGE_SUPER xAMPRx_S +#define _PAGE_ACCESSED xAMPRx_RESERVED8 /* accessed if set */ +#define _PAGE_DIRTY xAMPRx_M +#define _PAGE_NOTGLOBAL xAMPRx_NG + +#define _PAGE_RESERVED_MASK (xAMPRx_RESERVED8 | xAMPRx_RESERVED13) + +#define _PAGE_FILE 0x002 /* set:pagecache unset:swap */ +#define _PAGE_PROTNONE 0x000 /* If not present */ + +#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) + +#define __PGPROT_BASE \ + (_PAGE_PRESENT | xAMPRx_SS_16Kb | xAMPRx_D | _PAGE_NOTGLOBAL | _PAGE_ACCESSED) + +#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) +#define PAGE_SHARED __pgprot(__PGPROT_BASE) +#define PAGE_COPY __pgprot(__PGPROT_BASE | _PAGE_WP) +#define PAGE_READONLY __pgprot(__PGPROT_BASE | _PAGE_WP) + +#define __PAGE_KERNEL (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY) +#define __PAGE_KERNEL_NOCACHE (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_NOCACHE) +#define __PAGE_KERNEL_RO (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_WP) + +#define MAKE_GLOBAL(x) __pgprot((x) & ~_PAGE_NOTGLOBAL) + +#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL) +#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) +#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) + +#define _PAGE_TABLE (_PAGE_PRESENT | xAMPRx_SS_16Kb) + +#ifndef __ASSEMBLY__ + +/* + * The FR451 can do execute protection by virtue of having separate TLB miss handlers for + * instruction access and for data access. However, we don't have enough reserved bits to say + * "execute only", so we don't bother. If you can read it, you can execute it and vice versa. + */ +#define __P000 PAGE_NONE +#define __P001 PAGE_READONLY +#define __P010 PAGE_COPY +#define __P011 PAGE_COPY +#define __P100 PAGE_READONLY +#define __P101 PAGE_READONLY +#define __P110 PAGE_COPY +#define __P111 PAGE_COPY + +#define __S000 PAGE_NONE +#define __S001 PAGE_READONLY +#define __S010 PAGE_SHARED +#define __S011 PAGE_SHARED +#define __S100 PAGE_READONLY +#define __S101 PAGE_READONLY +#define __S110 PAGE_SHARED +#define __S111 PAGE_SHARED + +/* + * Define this to warn about kernel memory accesses that are + * done without a 'access_ok(VERIFY_WRITE,..)' + */ +#undef TEST_ACCESS_OK + +#define pte_present(x) (pte_val(x) & _PAGE_PRESENT) +#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) + +#define pmd_none(x) (!pmd_val(x)) +#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) +#define pmd_bad(x) (pmd_val(x) & xAMPRx_SS) +#define pmd_clear(xp) do { __set_pmd(xp, 0); } while(0) + +#define pmd_page_vaddr(pmd) \ + ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) + +#ifndef CONFIG_DISCONTIGMEM +#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) +#endif + +#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) + +/* + * The following only work if pte_present() is true. + * Undefined behaviour if not.. + */ +static inline int pte_dirty(pte_t pte) { return (pte).pte & _PAGE_DIRTY; } +static inline int pte_young(pte_t pte) { return (pte).pte & _PAGE_ACCESSED; } +static inline int pte_write(pte_t pte) { return !((pte).pte & _PAGE_WP); } +static inline int pte_special(pte_t pte) { return 0; } + +static inline pte_t pte_mkclean(pte_t pte) { (pte).pte &= ~_PAGE_DIRTY; return pte; } +static inline pte_t pte_mkold(pte_t pte) { (pte).pte &= ~_PAGE_ACCESSED; return pte; } +static inline pte_t pte_wrprotect(pte_t pte) { (pte).pte |= _PAGE_WP; return pte; } +static inline pte_t pte_mkdirty(pte_t pte) { (pte).pte |= _PAGE_DIRTY; return pte; } +static inline pte_t pte_mkyoung(pte_t pte) { (pte).pte |= _PAGE_ACCESSED; return pte; } +static inline pte_t pte_mkwrite(pte_t pte) { (pte).pte &= ~_PAGE_WP; return pte; } +static inline pte_t pte_mkspecial(pte_t pte) { return pte; } + +static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) +{ + int i = test_and_clear_bit(_PAGE_BIT_ACCESSED, ptep); + asm volatile("dcf %M0" :: "U"(*ptep)); + return i; +} + +static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) +{ + unsigned long x = xchg(&ptep->pte, 0); + asm volatile("dcf %M0" :: "U"(*ptep)); + return __pte(x); +} + +static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) +{ + set_bit(_PAGE_BIT_WP, ptep); + asm volatile("dcf %M0" :: "U"(*ptep)); +} + +/* + * Macro to mark a page protection value as "uncacheable" + */ +#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NOCACHE)) + +/* + * Conversion functions: convert a page and protection to a page entry, + * and a page entry and page directory to the page they refer to. + */ + +#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) +#define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE) + +/* This takes a physical page address that is used by the remapping functions */ +#define mk_pte_phys(physpage, pgprot) pfn_pte((physpage) >> PAGE_SHIFT, pgprot) + +static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) +{ + pte.pte &= _PAGE_CHG_MASK; + pte.pte |= pgprot_val(newprot); + return pte; +} + +/* to find an entry in a page-table-directory. */ +#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) +#define pgd_index_k(addr) pgd_index(addr) + +/* Find an entry in the bottom-level page table.. */ +#define __pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) + +/* + * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] + * + * this macro returns the index of the entry in the pte page which would + * control the given virtual address + */ +#define pte_index(address) \ + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) +#define pte_offset_kernel(dir, address) \ + ((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(address)) + +#if defined(CONFIG_HIGHPTE) +#define pte_offset_map(dir, address) \ + ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + pte_index(address)) +#define pte_offset_map_nested(dir, address) \ + ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + pte_index(address)) +#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0) +#define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) +#else +#define pte_offset_map(dir, address) \ + ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address)) +#define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address)) +#define pte_unmap(pte) do { } while (0) +#define pte_unmap_nested(pte) do { } while (0) +#endif + +/* + * Handle swap and file entries + * - the PTE is encoded in the following format: + * bit 0: Must be 0 (!_PAGE_PRESENT) + * bit 1: Type: 0 for swap, 1 for file (_PAGE_FILE) + * bits 2-7: Swap type + * bits 8-31: Swap offset + * bits 2-31: File pgoff + */ +#define __swp_type(x) (((x).val >> 2) & 0x1f) +#define __swp_offset(x) ((x).val >> 8) +#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) }) +#define __pte_to_swp_entry(_pte) ((swp_entry_t) { (_pte).pte }) +#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) + +static inline int pte_file(pte_t pte) +{ + return pte.pte & _PAGE_FILE; +} + +#define PTE_FILE_MAX_BITS 29 + +#define pte_to_pgoff(PTE) ((PTE).pte >> 2) +#define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE) + +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +#define PageSkip(page) (0) +#define kern_addr_valid(addr) (1) + +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ + remap_pfn_range(vma, vaddr, pfn, size, prot) + +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR +#define __HAVE_ARCH_PTEP_SET_WRPROTECT +#define __HAVE_ARCH_PTE_SAME +#include + +/* + * preload information about a newly instantiated PTE into the SCR0/SCR1 PGE cache + */ +static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) +{ + struct mm_struct *mm; + unsigned long ampr; + + mm = current->mm; + if (mm) { + pgd_t *pge = pgd_offset(mm, address); + pud_t *pue = pud_offset(pge, address); + pmd_t *pme = pmd_offset(pue, address); + + ampr = pme->ste[0] & 0xffffff00; + ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | + xAMPRx_V; + } else { + address = ULONG_MAX; + ampr = 0; + } + + asm volatile("movgs %0,scr0\n" + "movgs %0,scr1\n" + "movgs %1,dampr4\n" + "movgs %1,dampr5\n" + : + : "r"(address), "r"(ampr) + ); +} + +#ifdef CONFIG_PROC_FS +extern char *proc_pid_status_frv_cxnr(struct mm_struct *mm, char *buffer); +#endif + +extern void __init pgtable_cache_init(void); + +#endif /* !__ASSEMBLY__ */ +#endif /* !CONFIG_MMU */ + +#ifndef __ASSEMBLY__ +extern void __init paging_init(void); +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_PGTABLE_H */ diff --git a/arch/frv/include/asm/poll.h b/arch/frv/include/asm/poll.h new file mode 100644 index 0000000..0d01479 --- /dev/null +++ b/arch/frv/include/asm/poll.h @@ -0,0 +1,12 @@ +#ifndef _ASM_POLL_H +#define _ASM_POLL_H + +#define POLLWRNORM POLLOUT +#define POLLWRBAND 256 + +#include + +#undef POLLREMOVE + +#endif + diff --git a/arch/frv/include/asm/posix_types.h b/arch/frv/include/asm/posix_types.h new file mode 100644 index 0000000..a9f1f5b --- /dev/null +++ b/arch/frv/include/asm/posix_types.h @@ -0,0 +1,62 @@ +#ifndef _ASM_POSIX_TYPES_H +#define _ASM_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc. Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_timer_t; +typedef int __kernel_clockid_t; +typedef int __kernel_daddr_t; +typedef char * __kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; +typedef unsigned int __kernel_uid32_t; +typedef unsigned int __kernel_gid32_t; + +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; +typedef unsigned short __kernel_old_dev_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +#if defined(__KERNEL__) + +#undef __FD_SET +#define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) + +#undef __FD_CLR +#define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) + +#undef __FD_ISSET +#define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) + +#undef __FD_ZERO +#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) + +#endif /* defined(__KERNEL__) */ + +#endif + diff --git a/arch/frv/include/asm/processor.h b/arch/frv/include/asm/processor.h new file mode 100644 index 0000000..3744f2e --- /dev/null +++ b/arch/frv/include/asm/processor.h @@ -0,0 +1,153 @@ +/* processor.h: FRV processor definitions + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_PROCESSOR_H +#define _ASM_PROCESSOR_H + +#include + +#ifndef __ASSEMBLY__ +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +#define current_text_addr() ({ __label__ _l; _l: &&_l;}) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Forward declaration, a strange C thing */ +struct task_struct; + +/* + * CPU type and hardware bug flags. Kept separately for each CPU. + */ +struct cpuinfo_frv { +#ifdef CONFIG_MMU + unsigned long *pgd_quick; + unsigned long *pte_quick; + unsigned long pgtable_cache_sz; +#endif +} __cacheline_aligned; + +extern struct cpuinfo_frv __nongprelbss boot_cpu_data; + +#define cpu_data (&boot_cpu_data) +#define current_cpu_data boot_cpu_data + +/* + * Bus types + */ +#define EISA_bus 0 +#define MCA_bus 0 + +struct thread_struct { + struct pt_regs *frame; /* [GR28] exception frame ptr for this thread */ + struct task_struct *curr; /* [GR29] current pointer for this thread */ + unsigned long sp; /* [GR1 ] kernel stack pointer */ + unsigned long fp; /* [GR2 ] kernel frame pointer */ + unsigned long lr; /* link register */ + unsigned long pc; /* program counter */ + unsigned long gr[12]; /* [GR16-GR27] */ + unsigned long sched_lr; /* LR from schedule() */ + + union { + struct pt_regs *frame0; /* top (user) stack frame */ + struct user_context *user; /* userspace context */ + }; +} __attribute__((aligned(8))); + +extern struct pt_regs *__kernel_frame0_ptr; +extern struct task_struct *__kernel_current_task; + +#endif + +#ifndef __ASSEMBLY__ +#define INIT_THREAD_FRAME0 \ + ((struct pt_regs *) \ + (sizeof(init_stack) + (unsigned long) init_stack - sizeof(struct user_context))) + +#define INIT_THREAD { \ + NULL, \ + (struct task_struct *) init_stack, \ + 0, 0, 0, 0, \ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ + 0, \ + { INIT_THREAD_FRAME0 }, \ +} + +/* + * do necessary setup to start up a newly executed thread. + * - need to discard the frame stacked by init() invoking the execve syscall + */ +#define start_thread(_regs, _pc, _usp) \ +do { \ + set_fs(USER_DS); /* reads from user space */ \ + __frame = __kernel_frame0_ptr; \ + __frame->pc = (_pc); \ + __frame->psr &= ~PSR_S; \ + __frame->sp = (_usp); \ +} while(0) + +extern void prepare_to_copy(struct task_struct *tsk); + +/* Free all resources held by a thread. */ +static inline void release_thread(struct task_struct *dead_task) +{ +} + +extern asmlinkage int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); +extern asmlinkage void save_user_regs(struct user_context *target); +extern asmlinkage void *restore_user_regs(const struct user_context *target, ...); + +#define copy_segments(tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) +#define forget_segments() do { } while (0) + +/* + * Free current thread data structures etc.. + */ +static inline void exit_thread(void) +{ +} + +/* + * Return saved PC of a blocked thread. + */ +extern unsigned long thread_saved_pc(struct task_struct *tsk); + +unsigned long get_wchan(struct task_struct *p); + +#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc) +#define KSTK_ESP(tsk) ((tsk)->thread.frame0->sp) + +/* Allocation and freeing of basic task resources. */ +extern struct task_struct *alloc_task_struct(void); +extern void free_task_struct(struct task_struct *p); + +#define cpu_relax() barrier() + +/* data cache prefetch */ +#define ARCH_HAS_PREFETCH +static inline void prefetch(const void *x) +{ + asm volatile("dcpl %0,gr0,#0" : : "r"(x)); +} + +#endif /* __ASSEMBLY__ */ +#endif /* _ASM_PROCESSOR_H */ diff --git a/arch/frv/include/asm/ptrace.h b/arch/frv/include/asm/ptrace.h new file mode 100644 index 0000000..cf69340 --- /dev/null +++ b/arch/frv/include/asm/ptrace.h @@ -0,0 +1,83 @@ +/* ptrace.h: ptrace() relevant definitions + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_PTRACE_H +#define _ASM_PTRACE_H + +#include +#ifdef __KERNEL__ +#include + +#define in_syscall(regs) (((regs)->tbr & TBR_TT) == TBR_TT_TRAP0) +#endif + + +#define PT_PSR 0 +#define PT_ISR 1 +#define PT_CCR 2 +#define PT_CCCR 3 +#define PT_LR 4 +#define PT_LCR 5 +#define PT_PC 6 + +#define PT__STATUS 7 /* exception status */ +#define PT_SYSCALLNO 8 /* syscall number or -1 */ +#define PT_ORIG_GR8 9 /* saved GR8 for signal handling */ +#define PT_GNER0 10 +#define PT_GNER1 11 +#define PT_IACC0H 12 +#define PT_IACC0L 13 + +#define PT_GR(j) ( 14 + (j)) /* GRj for 0<=j<=63 */ +#define PT_FR(j) ( 78 + (j)) /* FRj for 0<=j<=63 */ +#define PT_FNER(j) (142 + (j)) /* FNERj for 0<=j<=1 */ +#define PT_MSR(j) (144 + (j)) /* MSRj for 0<=j<=2 */ +#define PT_ACC(j) (146 + (j)) /* ACCj for 0<=j<=7 */ +#define PT_ACCG(jklm) (154 + (jklm)) /* ACCGjklm for 0<=jklm<=1 (reads four regs per slot) */ +#define PT_FSR(j) (156 + (j)) /* FSRj for 0<=j<=0 */ +#define PT__GPEND 78 +#define PT__END 157 + +#define PT_TBR PT_GR(0) +#define PT_SP PT_GR(1) +#define PT_FP PT_GR(2) +#define PT_PREV_FRAME PT_GR(28) /* previous exception frame pointer (old gr28 value) */ +#define PT_CURR_TASK PT_GR(29) /* current task */ + + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 +#define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */ + +#define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ +#define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +/* + * we dedicate GR28 to keeping a pointer to the current exception frame + * - gr28 is destroyed on entry to the kernel from userspace + */ +register struct pt_regs *__frame asm("gr28"); + +#define user_mode(regs) (!((regs)->psr & PSR_S)) +#define instruction_pointer(regs) ((regs)->pc) + +extern unsigned long user_stack(const struct pt_regs *); +extern void show_regs(struct pt_regs *); +#define profile_pc(regs) ((regs)->pc) +#endif + +#endif /* !__ASSEMBLY__ */ +#endif /* _ASM_PTRACE_H */ diff --git a/arch/frv/include/asm/registers.h b/arch/frv/include/asm/registers.h new file mode 100644 index 0000000..9666119 --- /dev/null +++ b/arch/frv/include/asm/registers.h @@ -0,0 +1,232 @@ +/* registers.h: register frame declarations + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +/* + * notes: + * + * (1) that the members of all these structures are carefully aligned to permit + * usage of STD/STDF instructions + * + * (2) if you change these structures, you must change the code in + * arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c} + * + * + * the kernel stack space block looks like this: + * + * +0x2000 +---------------------- + * | union { + * | struct frv_frame0 { + * | struct user_context { + * | struct user_int_regs + * | struct user_fpmedia_regs + * | } + * | struct frv_debug_regs + * | } + * | struct pt_regs [user exception] + * | } + * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) + * | + * | kernel stack + * | + * |...................... + * | struct pt_regs [kernel exception] + * |...................... <-- __kernel_frame0_ptr (maybe GR28) + * | + * | kernel stack + * | + * |...................... <-- stack pointer (GR1) + * | + * | unused stack space + * | + * +---------------------- + * | struct thread_info + * +0x0000 +---------------------- <-- __current_thread_info (GR15); + * + * note that GR28 points to the current exception frame + */ + +#ifndef _ASM_REGISTERS_H +#define _ASM_REGISTERS_H + +#ifndef __ASSEMBLY__ +#define __OFFSET(X,N) ((X)+(N)*4) +#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx +#else +#define __OFFSET(X,N) ((X)+(N)*4) +#define __OFFSETC(X,N) ((X)+(N)) +#endif + +/*****************************************************************************/ +/* + * Exception/Interrupt frame + * - held on kernel stack + * - 8-byte aligned on stack (old SP is saved in frame) + * - GR0 is fixed 0, so we don't save it + */ +#ifndef __ASSEMBLY__ + +struct pt_regs { + unsigned long psr; /* Processor Status Register */ + unsigned long isr; /* Integer Status Register */ + unsigned long ccr; /* Condition Code Register */ + unsigned long cccr; /* Condition Code for Conditional Insns Register */ + unsigned long lr; /* Link Register */ + unsigned long lcr; /* Loop Count Register */ + unsigned long pc; /* Program Counter Register */ + unsigned long __status; /* exception status */ + unsigned long syscallno; /* syscall number or -1 */ + unsigned long orig_gr8; /* original syscall arg #1 */ + unsigned long gner0; + unsigned long gner1; + unsigned long long iacc0; + unsigned long tbr; /* GR0 is fixed zero, so we use this for TBR */ + unsigned long sp; /* GR1: USP/KSP */ + unsigned long fp; /* GR2: FP */ + unsigned long gr3; + unsigned long gr4; + unsigned long gr5; + unsigned long gr6; + unsigned long gr7; /* syscall number */ + unsigned long gr8; /* 1st syscall param; syscall return */ + unsigned long gr9; /* 2nd syscall param */ + unsigned long gr10; /* 3rd syscall param */ + unsigned long gr11; /* 4th syscall param */ + unsigned long gr12; /* 5th syscall param */ + unsigned long gr13; /* 6th syscall param */ + unsigned long gr14; + unsigned long gr15; + unsigned long gr16; /* GP pointer */ + unsigned long gr17; /* small data */ + unsigned long gr18; /* PIC/PID */ + unsigned long gr19; + unsigned long gr20; + unsigned long gr21; + unsigned long gr22; + unsigned long gr23; + unsigned long gr24; + unsigned long gr25; + unsigned long gr26; + unsigned long gr27; + struct pt_regs *next_frame; /* GR28 - next exception frame */ + unsigned long gr29; /* GR29 - OS reserved */ + unsigned long gr30; /* GR30 - OS reserved */ + unsigned long gr31; /* GR31 - OS reserved */ +} __attribute__((aligned(8))); + +#endif + +#define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ +#define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ +#define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ +#define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ +#define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ + +#define REG_GR(R) __OFFSET(REG_GR0, (R)) + +#define REG_SP REG_GR(1) +#define REG_FP REG_GR(2) +#define REG_PREV_FRAME REG_GR(28) /* previous exception frame pointer (old gr28 value) */ +#define REG_CURR_TASK REG_GR(29) /* current task */ + +/*****************************************************************************/ +/* + * debugging registers + */ +#ifndef __ASSEMBLY__ + +struct frv_debug_regs +{ + unsigned long dcr; + unsigned long ibar[4] __attribute__((aligned(8))); + unsigned long dbar[4] __attribute__((aligned(8))); + unsigned long dbdr[4][4] __attribute__((aligned(8))); + unsigned long dbmr[4][4] __attribute__((aligned(8))); +} __attribute__((aligned(8))); + +#endif + +/*****************************************************************************/ +/* + * userspace registers + */ +#ifndef __ASSEMBLY__ + +struct user_int_regs +{ + /* integer registers + * - up to gr[31] mirror pt_regs + * - total size must be multiple of 8 bytes + */ + unsigned long psr; /* Processor Status Register */ + unsigned long isr; /* Integer Status Register */ + unsigned long ccr; /* Condition Code Register */ + unsigned long cccr; /* Condition Code for Conditional Insns Register */ + unsigned long lr; /* Link Register */ + unsigned long lcr; /* Loop Count Register */ + unsigned long pc; /* Program Counter Register */ + unsigned long __status; /* exception status */ + unsigned long syscallno; /* syscall number or -1 */ + unsigned long orig_gr8; /* original syscall arg #1 */ + unsigned long gner[2]; + unsigned long long iacc[1]; + + union { + unsigned long tbr; + unsigned long gr[64]; + }; +}; + +struct user_fpmedia_regs +{ + /* FP/Media registers */ + unsigned long fr[64]; + unsigned long fner[2]; + unsigned long msr[2]; + unsigned long acc[8]; + unsigned char accg[8]; + unsigned long fsr[1]; +}; + +struct user_context +{ + struct user_int_regs i; + struct user_fpmedia_regs f; + + /* we provide a context extension so that we can save the regs for CPUs that + * implement many more of Fujitsu's lavish register spec + */ + void *extension; +} __attribute__((aligned(8))); + +struct frv_frame0 { + union { + struct pt_regs regs; + struct user_context uc; + }; + + struct frv_debug_regs debug; + +} __attribute__((aligned(32))); + +#endif + +#define __INT_GR(R) __OFFSET(__INT_GR0, (R)) + +#define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R)) +#define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R)) +#define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R)) +#define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R)) +#define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R)) +#define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R)) + +#define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16) + +#endif /* _ASM_REGISTERS_H */ diff --git a/arch/frv/include/asm/resource.h b/arch/frv/include/asm/resource.h new file mode 100644 index 0000000..5fc6054 --- /dev/null +++ b/arch/frv/include/asm/resource.h @@ -0,0 +1,7 @@ +#ifndef _ASM_RESOURCE_H +#define _ASM_RESOURCE_H + +#include + +#endif /* _ASM_RESOURCE_H */ + diff --git a/arch/frv/include/asm/scatterlist.h b/arch/frv/include/asm/scatterlist.h new file mode 100644 index 0000000..4bca8a2 --- /dev/null +++ b/arch/frv/include/asm/scatterlist.h @@ -0,0 +1,46 @@ +#ifndef _ASM_SCATTERLIST_H +#define _ASM_SCATTERLIST_H + +#include + +/* + * Drivers must set either ->address or (preferred) page and ->offset + * to indicate where data must be transferred to/from. + * + * Using page is recommended since it handles highmem data as well as + * low mem. ->address is restricted to data which has a virtual mapping, and + * it will go away in the future. Updating to page can be automated very + * easily -- something like + * + * sg->address = some_ptr; + * + * can be rewritten as + * + * sg_set_buf(sg, some_ptr, length); + * + * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens + */ +struct scatterlist { +#ifdef CONFIG_DEBUG_SG + unsigned long sg_magic; +#endif + unsigned long page_link; + unsigned int offset; /* for highmem, page offset */ + + dma_addr_t dma_address; + unsigned int length; +}; + +/* + * These macros should be used after a pci_map_sg call has been done + * to get bus addresses of each of the SG entries and their lengths. + * You should only work with the number of sg entries pci_map_sg + * returns, or alternatively stop on the first sg_dma_len(sg) which + * is 0. + */ +#define sg_dma_address(sg) ((sg)->dma_address) +#define sg_dma_len(sg) ((sg)->length) + +#define ISA_DMA_THRESHOLD (0xffffffffUL) + +#endif /* !_ASM_SCATTERLIST_H */ diff --git a/arch/frv/include/asm/sections.h b/arch/frv/include/asm/sections.h new file mode 100644 index 0000000..17d0fb1 --- /dev/null +++ b/arch/frv/include/asm/sections.h @@ -0,0 +1,46 @@ +/* sections.h: linkage layout variables + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SECTIONS_H +#define _ASM_SECTIONS_H + +#ifndef __ASSEMBLY__ + +#include +#include + +#ifdef __KERNEL__ + +/* + * we don't want to put variables in the GP-REL section if they're not used very much - that would + * be waste since GP-REL addressing is limited to GP16+/-2048 + */ +#define __nongpreldata __attribute__((section(".data"))) +#define __nongprelbss __attribute__((section(".bss"))) + +/* + * linker symbols + */ +extern const void __kernel_image_start, __kernel_image_end, __page_offset; + +extern unsigned long __nongprelbss memory_start; +extern unsigned long __nongprelbss memory_end; +extern unsigned long __nongprelbss rom_length; + +/* determine if we're running from ROM */ +static inline int is_in_rom(unsigned long addr) +{ + return 0; /* default case: not in ROM */ +} + +#endif +#endif +#endif /* _ASM_SECTIONS_H */ diff --git a/arch/frv/include/asm/segment.h b/arch/frv/include/asm/segment.h new file mode 100644 index 0000000..e3616a6 --- /dev/null +++ b/arch/frv/include/asm/segment.h @@ -0,0 +1,45 @@ +/* segment.h: MMU segment settings + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SEGMENT_H +#define _ASM_SEGMENT_H + + +#ifndef __ASSEMBLY__ + +typedef struct { + unsigned long seg; +} mm_segment_t; + +#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) + +#define KERNEL_DS MAKE_MM_SEG(0xdfffffffUL) + +#ifdef CONFIG_MMU +#define USER_DS MAKE_MM_SEG(TASK_SIZE - 1) +#else +#define USER_DS KERNEL_DS +#endif + +#define get_ds() (KERNEL_DS) +#define get_fs() (__current_thread_info->addr_limit) +#define segment_eq(a,b) ((a).seg == (b).seg) +#define __kernel_ds_p() segment_eq(get_fs(), KERNEL_DS) +#define get_addr_limit() (get_fs().seg) + +#define set_fs(_x) \ +do { \ + __current_thread_info->addr_limit = (_x); \ +} while(0) + + +#endif /* __ASSEMBLY__ */ +#endif /* _ASM_SEGMENT_H */ diff --git a/arch/frv/include/asm/sembuf.h b/arch/frv/include/asm/sembuf.h new file mode 100644 index 0000000..164b127 --- /dev/null +++ b/arch/frv/include/asm/sembuf.h @@ -0,0 +1,26 @@ +#ifndef _ASM_SEMBUF_H +#define _ASM_SEMBUF_H + +/* + * The semid64_ds structure for FR-V architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct semid64_ds { + struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ + __kernel_time_t sem_otime; /* last semop time */ + unsigned long __unused1; + __kernel_time_t sem_ctime; /* last change time */ + unsigned long __unused2; + unsigned long sem_nsems; /* no. of semaphores in array */ + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _ASM_SEMBUF_H */ + diff --git a/arch/frv/include/asm/serial-regs.h b/arch/frv/include/asm/serial-regs.h new file mode 100644 index 0000000..e1286bd --- /dev/null +++ b/arch/frv/include/asm/serial-regs.h @@ -0,0 +1,44 @@ +/* serial-regs.h: serial port registers + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SERIAL_REGS_H +#define _ASM_SERIAL_REGS_H + +#include +#include + +#define SERIAL_ICLK 33333333 /* the target serial input clock */ +#define UART0_BASE 0xfeff9c00 +#define UART1_BASE 0xfeff9c40 + +#define __get_UART0(R) ({ __reg(UART0_BASE + (R) * 8) >> 24; }) +#define __get_UART1(R) ({ __reg(UART1_BASE + (R) * 8) >> 24; }) +#define __set_UART0(R,V) do { __reg(UART0_BASE + (R) * 8) = (V) << 24; } while(0) +#define __set_UART1(R,V) do { __reg(UART1_BASE + (R) * 8) = (V) << 24; } while(0) + +#define __get_UART0_LSR() ({ __get_UART0(UART_LSR); }) +#define __get_UART1_LSR() ({ __get_UART1(UART_LSR); }) + +#define __set_UART0_IER(V) __set_UART0(UART_IER,(V)) +#define __set_UART1_IER(V) __set_UART1(UART_IER,(V)) + +/* serial prescaler select register */ +#define __get_UCPSR() ({ *(volatile unsigned long *)(0xfeff9c90); }) +#define __set_UCPSR(V) do { *(volatile unsigned long *)(0xfeff9c90) = (V); } while(0) +#define UCPSR_SELECT0 0x07000000 +#define UCPSR_SELECT1 0x38000000 + +/* serial prescaler base value register */ +#define __get_UCPVR() ({ *(volatile unsigned long *)(0xfeff9c98); mb(); }) +#define __set_UCPVR(V) do { *(volatile unsigned long *)(0xfeff9c98) = (V) << 24; mb(); } while(0) + + +#endif /* _ASM_SERIAL_REGS_H */ diff --git a/arch/frv/include/asm/serial.h b/arch/frv/include/asm/serial.h new file mode 100644 index 0000000..dbb8259 --- /dev/null +++ b/arch/frv/include/asm/serial.h @@ -0,0 +1,18 @@ +/* + * serial.h + * + * Copyright (C) 2003 Develer S.r.l. (http://www.develer.com/) + * Author: Bernardo Innocenti + * + * Based on linux/include/asm-i386/serial.h + */ +#include + +/* + * the base baud is derived from the clock speed and so is variable + */ +#define BASE_BAUD 0 + +#define STD_COM_FLAGS ASYNC_BOOT_AUTOCONF + +#define SERIAL_PORT_DFNS diff --git a/arch/frv/include/asm/setup.h b/arch/frv/include/asm/setup.h new file mode 100644 index 0000000..afd787c --- /dev/null +++ b/arch/frv/include/asm/setup.h @@ -0,0 +1,31 @@ +/* setup.h: setup stuff + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SETUP_H +#define _ASM_SETUP_H + +#define COMMAND_LINE_SIZE 512 + +#ifdef __KERNEL__ + +#include + +#ifndef __ASSEMBLY__ + +#ifdef CONFIG_MMU +extern unsigned long __initdata num_mappedpages; +#endif + +#endif /* !__ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_SETUP_H */ diff --git a/arch/frv/include/asm/shmbuf.h b/arch/frv/include/asm/shmbuf.h new file mode 100644 index 0000000..4c6e711 --- /dev/null +++ b/arch/frv/include/asm/shmbuf.h @@ -0,0 +1,43 @@ +#ifndef _ASM_SHMBUF_H +#define _ASM_SHMBUF_H + +/* + * The shmid64_ds structure for FR-V architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct shmid64_ds { + struct ipc64_perm shm_perm; /* operation perms */ + size_t shm_segsz; /* size of segment (bytes) */ + __kernel_time_t shm_atime; /* last attach time */ + unsigned long __unused1; + __kernel_time_t shm_dtime; /* last detach time */ + unsigned long __unused2; + __kernel_time_t shm_ctime; /* last change time */ + unsigned long __unused3; + __kernel_pid_t shm_cpid; /* pid of creator */ + __kernel_pid_t shm_lpid; /* pid of last operator */ + unsigned long shm_nattch; /* no. of current attaches */ + unsigned long __unused4; + unsigned long __unused5; +}; + +struct shminfo64 { + unsigned long shmmax; + unsigned long shmmin; + unsigned long shmmni; + unsigned long shmseg; + unsigned long shmall; + unsigned long __unused1; + unsigned long __unused2; + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _ASM_SHMBUF_H */ + diff --git a/arch/frv/include/asm/shmparam.h b/arch/frv/include/asm/shmparam.h new file mode 100644 index 0000000..ab71100 --- /dev/null +++ b/arch/frv/include/asm/shmparam.h @@ -0,0 +1,7 @@ +#ifndef _ASM_SHMPARAM_H +#define _ASM_SHMPARAM_H + +#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ + +#endif /* _ASM_SHMPARAM_H */ + diff --git a/arch/frv/include/asm/sigcontext.h b/arch/frv/include/asm/sigcontext.h new file mode 100644 index 0000000..3b263f3 --- /dev/null +++ b/arch/frv/include/asm/sigcontext.h @@ -0,0 +1,26 @@ +/* sigcontext.h: FRV signal context + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_SIGCONTEXT_H +#define _ASM_SIGCONTEXT_H + +#include + +/* + * Signal context structure - contains all info to do with the state + * before the signal handler was invoked. Note: only add new entries + * to the end of the structure. + */ +struct sigcontext { + struct user_context sc_context; + unsigned long sc_oldmask; /* old sigmask */ +} __attribute__((aligned(8))); + +#endif diff --git a/arch/frv/include/asm/siginfo.h b/arch/frv/include/asm/siginfo.h new file mode 100644 index 0000000..d3fd1ca --- /dev/null +++ b/arch/frv/include/asm/siginfo.h @@ -0,0 +1,12 @@ +#ifndef _ASM_SIGINFO_H +#define _ASM_SIGINFO_H + +#include +#include + +#define FPE_MDAOVF (__SI_FAULT|9) /* media overflow */ +#undef NSIGFPE +#define NSIGFPE 9 + +#endif + diff --git a/arch/frv/include/asm/signal.h b/arch/frv/include/asm/signal.h new file mode 100644 index 0000000..2079197 --- /dev/null +++ b/arch/frv/include/asm/signal.h @@ -0,0 +1,161 @@ +#ifndef _ASM_SIGNAL_H +#define _ASM_SIGNAL_H + +#include + +/* Avoid too many header ordering problems. */ +struct siginfo; + +#ifdef __KERNEL__ +/* Most things should be clean enough to redefine this at will, if care + is taken to make libc match. */ + +#define _NSIG 64 +#define _NSIG_BPW 32 +#define _NSIG_WORDS (_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t; /* at least 32 bits */ + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +#else +/* Here we must cater to libcs that poke about in kernel headers. */ + +#define NSIG 32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +/* +#define SIGLOST 29 +*/ +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +/* These should not be considered constants from userland. */ +#define SIGRTMIN 32 +#define SIGRTMAX (_NSIG-1) + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 /* not supported yet */ +#define SA_SIGINFO 0x00000004 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +#define SA_RESTORER 0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +#include + +#ifdef __KERNEL__ +struct old_sigaction { + __sighandler_t sa_handler; + old_sigset_t sa_mask; + unsigned long sa_flags; + __sigrestore_t sa_restorer; +}; + +struct sigaction { + __sighandler_t sa_handler; + unsigned long sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; /* mask last for extensibility */ +}; + +struct k_sigaction { + struct sigaction sa; +}; +#else +/* Here we must cater to libcs that poke about in kernel headers. */ + +struct sigaction { + union { + __sighandler_t _sa_handler; + void (*_sa_sigaction)(int, struct siginfo *, void *); + } _u; + sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +}; + +#define sa_handler _u._sa_handler +#define sa_sigaction _u._sa_sigaction + +#endif /* __KERNEL__ */ + +typedef struct sigaltstack { + void __user *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +#define ptrace_signal_deliver(regs, cookie) do { } while (0) + +#ifdef __KERNEL__ + +#include +#undef __HAVE_ARCH_SIG_BITOPS + +#endif /* __KERNEL__ */ + +#endif /* _ASM_SIGNAL_H */ diff --git a/arch/frv/include/asm/smp.h b/arch/frv/include/asm/smp.h new file mode 100644 index 0000000..38349ec --- /dev/null +++ b/arch/frv/include/asm/smp.h @@ -0,0 +1,9 @@ +#ifndef __ASM_SMP_H +#define __ASM_SMP_H + + +#ifdef CONFIG_SMP +#error SMP not supported +#endif + +#endif diff --git a/arch/frv/include/asm/socket.h b/arch/frv/include/asm/socket.h new file mode 100644 index 0000000..57c3d40 --- /dev/null +++ b/arch/frv/include/asm/socket.h @@ -0,0 +1,61 @@ +#ifndef _ASM_SOCKET_H +#define _ASM_SOCKET_H + +#include + +/* For setsockopt(2) */ +#define SOL_SOCKET 1 + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 + +#define SO_PEERNAME 28 +#define SO_TIMESTAMP 29 +#define SCM_TIMESTAMP SO_TIMESTAMP + +#define SO_ACCEPTCONN 30 + +#define SO_PEERSEC 31 +#define SO_PASSSEC 34 +#define SO_TIMESTAMPNS 35 +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS + +#define SO_MARK 36 + +#define SO_TIMESTAMPING 37 +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif /* _ASM_SOCKET_H */ + diff --git a/arch/frv/include/asm/sockios.h b/arch/frv/include/asm/sockios.h new file mode 100644 index 0000000..5dbdd13 --- /dev/null +++ b/arch/frv/include/asm/sockios.h @@ -0,0 +1,14 @@ +#ifndef _ASM_SOCKIOS__ +#define _ASM_SOCKIOS__ + +/* Socket-level I/O control calls. */ +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ + +#endif /* _ASM_SOCKIOS__ */ + diff --git a/arch/frv/include/asm/spinlock.h b/arch/frv/include/asm/spinlock.h new file mode 100644 index 0000000..fe385f4 --- /dev/null +++ b/arch/frv/include/asm/spinlock.h @@ -0,0 +1,17 @@ +/* spinlock.h: spinlocks for FR-V + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SPINLOCK_H +#define _ASM_SPINLOCK_H + +#error no spinlocks for FR-V yet + +#endif /* _ASM_SPINLOCK_H */ diff --git a/arch/frv/include/asm/spr-regs.h b/arch/frv/include/asm/spr-regs.h new file mode 100644 index 0000000..01e6af5 --- /dev/null +++ b/arch/frv/include/asm/spr-regs.h @@ -0,0 +1,416 @@ +/* spr-regs.h: special-purpose registers on the FRV + * + * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SPR_REGS_H +#define _ASM_SPR_REGS_H + +/* + * PSR - Processor Status Register + */ +#define PSR_ET 0x00000001 /* enable interrupts/exceptions flag */ +#define PSR_PS 0x00000002 /* previous supervisor mode flag */ +#define PSR_S 0x00000004 /* supervisor mode flag */ +#define PSR_PIL 0x00000078 /* processor external interrupt level */ +#define PSR_PIL_0 0x00000000 /* - no interrupt in progress */ +#define PSR_PIL_13 0x00000068 /* - debugging only */ +#define PSR_PIL_14 0x00000070 /* - debugging in progress */ +#define PSR_PIL_15 0x00000078 /* - NMI in progress */ +#define PSR_EM 0x00000080 /* enable media operation */ +#define PSR_EF 0x00000100 /* enable FPU operation */ +#define PSR_BE 0x00001000 /* endianness mode */ +#define PSR_BE_LE 0x00000000 /* - little endian mode */ +#define PSR_BE_BE 0x00001000 /* - big endian mode */ +#define PSR_CM 0x00002000 /* conditional mode */ +#define PSR_NEM 0x00004000 /* non-excepting mode */ +#define PSR_ICE 0x00010000 /* in-circuit emulation mode */ +#define PSR_VERSION_SHIFT 24 /* CPU silicon ID */ +#define PSR_IMPLE_SHIFT 28 /* CPU core ID */ + +#define PSR_VERSION(psr) (((psr) >> PSR_VERSION_SHIFT) & 0xf) +#define PSR_IMPLE(psr) (((psr) >> PSR_IMPLE_SHIFT) & 0xf) + +#define PSR_IMPLE_FR401 0x2 +#define PSR_VERSION_FR401_MB93401 0x0 +#define PSR_VERSION_FR401_MB93401A 0x1 +#define PSR_VERSION_FR401_MB93403 0x2 + +#define PSR_IMPLE_FR405 0x4 +#define PSR_VERSION_FR405_MB93405 0x0 + +#define PSR_IMPLE_FR451 0x5 +#define PSR_VERSION_FR451_MB93451 0x0 + +#define PSR_IMPLE_FR501 0x1 +#define PSR_VERSION_FR501_MB93501 0x1 +#define PSR_VERSION_FR501_MB93501A 0x2 + +#define PSR_IMPLE_FR551 0x3 +#define PSR_VERSION_FR551_MB93555 0x1 + +#define __get_PSR() ({ unsigned long x; asm volatile("movsg psr,%0" : "=r"(x)); x; }) +#define __set_PSR(V) do { asm volatile("movgs %0,psr" : : "r"(V)); } while(0) + +/* + * TBR - Trap Base Register + */ +#define TBR_TT 0x00000ff0 +#define TBR_TT_INSTR_MMU_MISS (0x01 << 4) +#define TBR_TT_INSTR_ACC_ERROR (0x02 << 4) +#define TBR_TT_INSTR_ACC_EXCEP (0x03 << 4) +#define TBR_TT_PRIV_INSTR (0x06 << 4) +#define TBR_TT_ILLEGAL_INSTR (0x07 << 4) +#define TBR_TT_FP_EXCEPTION (0x0d << 4) +#define TBR_TT_MP_EXCEPTION (0x0e << 4) +#define TBR_TT_DATA_ACC_ERROR (0x11 << 4) +#define TBR_TT_DATA_MMU_MISS (0x12 << 4) +#define TBR_TT_DATA_ACC_EXCEP (0x13 << 4) +#define TBR_TT_DATA_STR_ERROR (0x14 << 4) +#define TBR_TT_DIVISION_EXCEP (0x17 << 4) +#define TBR_TT_COMMIT_EXCEP (0x19 << 4) +#define TBR_TT_INSTR_TLB_MISS (0x1a << 4) +#define TBR_TT_DATA_TLB_MISS (0x1b << 4) +#define TBR_TT_DATA_DAT_EXCEP (0x1d << 4) +#define TBR_TT_DECREMENT_TIMER (0x1f << 4) +#define TBR_TT_COMPOUND_EXCEP (0x20 << 4) +#define TBR_TT_INTERRUPT_1 (0x21 << 4) +#define TBR_TT_INTERRUPT_2 (0x22 << 4) +#define TBR_TT_INTERRUPT_3 (0x23 << 4) +#define TBR_TT_INTERRUPT_4 (0x24 << 4) +#define TBR_TT_INTERRUPT_5 (0x25 << 4) +#define TBR_TT_INTERRUPT_6 (0x26 << 4) +#define TBR_TT_INTERRUPT_7 (0x27 << 4) +#define TBR_TT_INTERRUPT_8 (0x28 << 4) +#define TBR_TT_INTERRUPT_9 (0x29 << 4) +#define TBR_TT_INTERRUPT_10 (0x2a << 4) +#define TBR_TT_INTERRUPT_11 (0x2b << 4) +#define TBR_TT_INTERRUPT_12 (0x2c << 4) +#define TBR_TT_INTERRUPT_13 (0x2d << 4) +#define TBR_TT_INTERRUPT_14 (0x2e << 4) +#define TBR_TT_INTERRUPT_15 (0x2f << 4) +#define TBR_TT_TRAP0 (0x80 << 4) +#define TBR_TT_TRAP1 (0x81 << 4) +#define TBR_TT_TRAP2 (0x82 << 4) +#define TBR_TT_TRAP3 (0x83 << 4) +#define TBR_TT_TRAP120 (0xf8 << 4) +#define TBR_TT_TRAP121 (0xf9 << 4) +#define TBR_TT_TRAP122 (0xfa << 4) +#define TBR_TT_TRAP123 (0xfb << 4) +#define TBR_TT_TRAP124 (0xfc << 4) +#define TBR_TT_TRAP125 (0xfd << 4) +#define TBR_TT_TRAP126 (0xfe << 4) +#define TBR_TT_BREAK (0xff << 4) + +#define TBR_TT_ATOMIC_CMPXCHG32 TBR_TT_TRAP120 +#define TBR_TT_ATOMIC_XCHG32 TBR_TT_TRAP121 +#define TBR_TT_ATOMIC_XOR TBR_TT_TRAP122 +#define TBR_TT_ATOMIC_OR TBR_TT_TRAP123 +#define TBR_TT_ATOMIC_AND TBR_TT_TRAP124 +#define TBR_TT_ATOMIC_SUB TBR_TT_TRAP125 +#define TBR_TT_ATOMIC_ADD TBR_TT_TRAP126 + +#define __get_TBR() ({ unsigned long x; asm volatile("movsg tbr,%0" : "=r"(x)); x; }) + +/* + * HSR0 - Hardware Status Register 0 + */ +#define HSR0_PDM 0x00000007 /* power down mode */ +#define HSR0_PDM_NORMAL 0x00000000 /* - normal mode */ +#define HSR0_PDM_CORE_SLEEP 0x00000001 /* - CPU core sleep mode */ +#define HSR0_PDM_BUS_SLEEP 0x00000003 /* - bus sleep mode */ +#define HSR0_PDM_PLL_RUN 0x00000005 /* - PLL run */ +#define HSR0_PDM_PLL_STOP 0x00000007 /* - PLL stop */ +#define HSR0_GRLE 0x00000040 /* GR lower register set enable */ +#define HSR0_GRHE 0x00000080 /* GR higher register set enable */ +#define HSR0_FRLE 0x00000100 /* FR lower register set enable */ +#define HSR0_FRHE 0x00000200 /* FR higher register set enable */ +#define HSR0_GRN 0x00000400 /* GR quantity */ +#define HSR0_GRN_64 0x00000000 /* - 64 GR registers */ +#define HSR0_GRN_32 0x00000400 /* - 32 GR registers */ +#define HSR0_FRN 0x00000800 /* FR quantity */ +#define HSR0_FRN_64 0x00000000 /* - 64 FR registers */ +#define HSR0_FRN_32 0x00000800 /* - 32 FR registers */ +#define HSR0_SA 0x00001000 /* start address (RAMBOOT#) */ +#define HSR0_ETMI 0x00008000 /* enable TIMERI (64-bit up timer) */ +#define HSR0_ETMD 0x00004000 /* enable TIMERD (32-bit down timer) */ +#define HSR0_PEDAT 0x00010000 /* previous DAT mode */ +#define HSR0_XEDAT 0x00020000 /* exception DAT mode */ +#define HSR0_EDAT 0x00080000 /* enable DAT mode */ +#define HSR0_RME 0x00400000 /* enable RAM mode */ +#define HSR0_EMEM 0x00800000 /* enable MMU_Miss mask */ +#define HSR0_EXMMU 0x01000000 /* enable extended MMU mode */ +#define HSR0_EDMMU 0x02000000 /* enable data MMU */ +#define HSR0_EIMMU 0x04000000 /* enable instruction MMU */ +#define HSR0_CBM 0x08000000 /* copy back mode */ +#define HSR0_CBM_WRITE_THRU 0x00000000 /* - write through */ +#define HSR0_CBM_COPY_BACK 0x08000000 /* - copy back */ +#define HSR0_NWA 0x10000000 /* no write allocate */ +#define HSR0_DCE 0x40000000 /* data cache enable */ +#define HSR0_ICE 0x80000000 /* instruction cache enable */ + +#define __get_HSR(R) ({ unsigned long x; asm volatile("movsg hsr"#R",%0" : "=r"(x)); x; }) +#define __set_HSR(R,V) do { asm volatile("movgs %0,hsr"#R : : "r"(V)); } while(0) + +/* + * CCR - Condition Codes Register + */ +#define CCR_FCC0 0x0000000f /* FP/Media condition 0 (fcc0 reg) */ +#define CCR_FCC1 0x000000f0 /* FP/Media condition 1 (fcc1 reg) */ +#define CCR_FCC2 0x00000f00 /* FP/Media condition 2 (fcc2 reg) */ +#define CCR_FCC3 0x0000f000 /* FP/Media condition 3 (fcc3 reg) */ +#define CCR_ICC0 0x000f0000 /* Integer condition 0 (icc0 reg) */ +#define CCR_ICC0_C 0x00010000 /* - Carry flag */ +#define CCR_ICC0_V 0x00020000 /* - Overflow flag */ +#define CCR_ICC0_Z 0x00040000 /* - Zero flag */ +#define CCR_ICC0_N 0x00080000 /* - Negative flag */ +#define CCR_ICC1 0x00f00000 /* Integer condition 1 (icc1 reg) */ +#define CCR_ICC2 0x0f000000 /* Integer condition 2 (icc2 reg) */ +#define CCR_ICC3 0xf0000000 /* Integer condition 3 (icc3 reg) */ + +/* + * CCCR - Condition Codes for Conditional Instructions Register + */ +#define CCCR_CC0 0x00000003 /* condition 0 (cc0 reg) */ +#define CCCR_CC0_FALSE 0x00000002 /* - condition is false */ +#define CCCR_CC0_TRUE 0x00000003 /* - condition is true */ +#define CCCR_CC1 0x0000000c /* condition 1 (cc1 reg) */ +#define CCCR_CC2 0x00000030 /* condition 2 (cc2 reg) */ +#define CCCR_CC3 0x000000c0 /* condition 3 (cc3 reg) */ +#define CCCR_CC4 0x00000300 /* condition 4 (cc4 reg) */ +#define CCCR_CC5 0x00000c00 /* condition 5 (cc5 reg) */ +#define CCCR_CC6 0x00003000 /* condition 6 (cc6 reg) */ +#define CCCR_CC7 0x0000c000 /* condition 7 (cc7 reg) */ + +/* + * ISR - Integer Status Register + */ +#define ISR_EMAM 0x00000001 /* memory misaligned access handling */ +#define ISR_EMAM_EXCEPTION 0x00000000 /* - generate exception */ +#define ISR_EMAM_FUDGE 0x00000001 /* - mask out invalid address bits */ +#define ISR_AEXC 0x00000004 /* accrued [overflow] exception */ +#define ISR_DTT 0x00000018 /* division type trap */ +#define ISR_DTT_IGNORE 0x00000000 /* - ignore division error */ +#define ISR_DTT_DIVBYZERO 0x00000008 /* - generate exception */ +#define ISR_DTT_OVERFLOW 0x00000010 /* - record overflow */ +#define ISR_EDE 0x00000020 /* enable division exception */ +#define ISR_PLI 0x20000000 /* pre-load instruction information */ +#define ISR_QI 0x80000000 /* quad data implementation information */ + +/* + * EPCR0 - Exception PC Register + */ +#define EPCR0_V 0x00000001 /* register content validity indicator */ +#define EPCR0_PC 0xfffffffc /* faulting instruction address */ + +/* + * ESR0/14/15 - Exception Status Register + */ +#define ESRx_VALID 0x00000001 /* register content validity indicator */ +#define ESRx_EC 0x0000003e /* exception type */ +#define ESRx_EC_DATA_STORE 0x00000000 /* - data_store_error */ +#define ESRx_EC_INSN_ACCESS 0x00000006 /* - instruction_access_error */ +#define ESRx_EC_PRIV_INSN 0x00000008 /* - privileged_instruction */ +#define ESRx_EC_ILL_INSN 0x0000000a /* - illegal_instruction */ +#define ESRx_EC_MP_EXCEP 0x0000001c /* - mp_exception */ +#define ESRx_EC_DATA_ACCESS 0x00000020 /* - data_access_error */ +#define ESRx_EC_DIVISION 0x00000026 /* - division_exception */ +#define ESRx_EC_ITLB_MISS 0x00000034 /* - instruction_access_TLB_miss */ +#define ESRx_EC_DTLB_MISS 0x00000036 /* - data_access_TLB_miss */ +#define ESRx_EC_DATA_ACCESS_DAT 0x0000003a /* - data_access_DAT_exception */ + +#define ESR0_IAEC 0x00000100 /* info for instruction-access-exception */ +#define ESR0_IAEC_RESV 0x00000000 /* - reserved */ +#define ESR0_IAEC_PROT_VIOL 0x00000100 /* - protection violation */ + +#define ESR0_ATXC 0x00f00000 /* address translation exception code */ +#define ESR0_ATXC_MMU_MISS 0x00000000 /* - MMU miss exception and more (?) */ +#define ESR0_ATXC_MULTI_DAT 0x00800000 /* - multiple DAT entry hit */ +#define ESR0_ATXC_MULTI_SAT 0x00900000 /* - multiple SAT entry hit */ +#define ESR0_ATXC_AMRTLB_MISS 0x00a00000 /* - MMU/TLB miss exception */ +#define ESR0_ATXC_PRIV_EXCEP 0x00c00000 /* - privilege protection fault */ +#define ESR0_ATXC_WP_EXCEP 0x00d00000 /* - write protection fault */ + +#define ESR0_EAV 0x00000800 /* true if EAR0 register valid */ +#define ESR15_EAV 0x00000800 /* true if EAR15 register valid */ + +/* + * ESFR1 - Exception Status Valid Flag Register + */ +#define ESFR1_ESR0 0x00000001 /* true if ESR0 is valid */ +#define ESFR1_ESR14 0x00004000 /* true if ESR14 is valid */ +#define ESFR1_ESR15 0x00008000 /* true if ESR15 is valid */ + +/* + * MSR - Media Status Register + */ +#define MSR0_AOVF 0x00000001 /* overflow exception accrued */ +#define MSRx_OVF 0x00000002 /* overflow exception detected */ +#define MSRx_SIE 0x0000003c /* last SIMD instruction exception detected */ +#define MSRx_SIE_NONE 0x00000000 /* - none detected */ +#define MSRx_SIE_FRkHI_ACCk 0x00000020 /* - exception at FRkHI or ACCk */ +#define MSRx_SIE_FRkLO_ACCk1 0x00000010 /* - exception at FRkLO or ACCk+1 */ +#define MSRx_SIE_FRk1HI_ACCk2 0x00000008 /* - exception at FRk+1HI or ACCk+2 */ +#define MSRx_SIE_FRk1LO_ACCk3 0x00000004 /* - exception at FRk+1LO or ACCk+3 */ +#define MSR0_MTT 0x00007000 /* type of last media trap detected */ +#define MSR0_MTT_NONE 0x00000000 /* - none detected */ +#define MSR0_MTT_OVERFLOW 0x00001000 /* - overflow detected */ +#define MSR0_HI 0x00c00000 /* hardware implementation */ +#define MSR0_HI_ROUNDING 0x00000000 /* - rounding mode */ +#define MSR0_HI_NONROUNDING 0x00c00000 /* - non-rounding mode */ +#define MSR0_EMCI 0x01000000 /* enable media custom instructions */ +#define MSR0_SRDAV 0x10000000 /* select rounding mode of MAVEH */ +#define MSR0_SRDAV_RDAV 0x00000000 /* - controlled by MSR.RDAV */ +#define MSR0_SRDAV_RD 0x10000000 /* - controlled by MSR.RD */ +#define MSR0_RDAV 0x20000000 /* rounding mode of MAVEH */ +#define MSR0_RDAV_NEAREST_MI 0x00000000 /* - round to nearest minus */ +#define MSR0_RDAV_NEAREST_PL 0x20000000 /* - round to nearest plus */ +#define MSR0_RD 0xc0000000 /* rounding mode */ +#define MSR0_RD_NEAREST 0x00000000 /* - nearest */ +#define MSR0_RD_ZERO 0x40000000 /* - zero */ +#define MSR0_RD_POS_INF 0x80000000 /* - postive infinity */ +#define MSR0_RD_NEG_INF 0xc0000000 /* - negative infinity */ + +/* + * IAMPR0-7 - Instruction Address Mapping Register + * DAMPR0-7 - Data Address Mapping Register + */ +#define xAMPRx_V 0x00000001 /* register content validity indicator */ +#define DAMPRx_WP 0x00000002 /* write protect */ +#define DAMPRx_WP_RW 0x00000000 /* - read/write */ +#define DAMPRx_WP_RO 0x00000002 /* - read-only */ +#define xAMPRx_C 0x00000004 /* cached/uncached */ +#define xAMPRx_C_CACHED 0x00000000 /* - cached */ +#define xAMPRx_C_UNCACHED 0x00000004 /* - uncached */ +#define xAMPRx_S 0x00000008 /* supervisor only */ +#define xAMPRx_S_USER 0x00000000 /* - userspace can access */ +#define xAMPRx_S_KERNEL 0x00000008 /* - kernel only */ +#define xAMPRx_SS 0x000000f0 /* segment size */ +#define xAMPRx_SS_16Kb 0x00000000 /* - 16 kilobytes */ +#define xAMPRx_SS_64Kb 0x00000010 /* - 64 kilobytes */ +#define xAMPRx_SS_256Kb 0x00000020 /* - 256 kilobytes */ +#define xAMPRx_SS_1Mb 0x00000030 /* - 1 megabyte */ +#define xAMPRx_SS_2Mb 0x00000040 /* - 2 megabytes */ +#define xAMPRx_SS_4Mb 0x00000050 /* - 4 megabytes */ +#define xAMPRx_SS_8Mb 0x00000060 /* - 8 megabytes */ +#define xAMPRx_SS_16Mb 0x00000070 /* - 16 megabytes */ +#define xAMPRx_SS_32Mb 0x00000080 /* - 32 megabytes */ +#define xAMPRx_SS_64Mb 0x00000090 /* - 64 megabytes */ +#define xAMPRx_SS_128Mb 0x000000a0 /* - 128 megabytes */ +#define xAMPRx_SS_256Mb 0x000000b0 /* - 256 megabytes */ +#define xAMPRx_SS_512Mb 0x000000c0 /* - 512 megabytes */ +#define xAMPRx_RESERVED8 0x00000100 /* reserved bit */ +#define xAMPRx_NG 0x00000200 /* non-global */ +#define xAMPRx_L 0x00000400 /* locked */ +#define xAMPRx_M 0x00000800 /* modified */ +#define xAMPRx_D 0x00001000 /* DAT entry */ +#define xAMPRx_RESERVED13 0x00002000 /* reserved bit */ +#define xAMPRx_PPFN 0xfff00000 /* physical page frame number */ + +#define xAMPRx_V_BIT 0 +#define DAMPRx_WP_BIT 1 +#define xAMPRx_C_BIT 2 +#define xAMPRx_S_BIT 3 +#define xAMPRx_RESERVED8_BIT 8 +#define xAMPRx_NG_BIT 9 +#define xAMPRx_L_BIT 10 +#define xAMPRx_M_BIT 11 +#define xAMPRx_D_BIT 12 +#define xAMPRx_RESERVED13_BIT 13 + +#define __get_IAMPR(R) ({ unsigned long x; asm volatile("movsg iampr"#R",%0" : "=r"(x)); x; }) +#define __get_DAMPR(R) ({ unsigned long x; asm volatile("movsg dampr"#R",%0" : "=r"(x)); x; }) + +#define __get_IAMLR(R) ({ unsigned long x; asm volatile("movsg iamlr"#R",%0" : "=r"(x)); x; }) +#define __get_DAMLR(R) ({ unsigned long x; asm volatile("movsg damlr"#R",%0" : "=r"(x)); x; }) + +#define __set_IAMPR(R,V) do { asm volatile("movgs %0,iampr"#R : : "r"(V)); } while(0) +#define __set_DAMPR(R,V) do { asm volatile("movgs %0,dampr"#R : : "r"(V)); } while(0) + +#define __set_IAMLR(R,V) do { asm volatile("movgs %0,iamlr"#R : : "r"(V)); } while(0) +#define __set_DAMLR(R,V) do { asm volatile("movgs %0,damlr"#R : : "r"(V)); } while(0) + +#define save_dampr(R, _dampr) \ +do { \ + asm volatile("movsg dampr"R",%0" : "=r"(_dampr)); \ +} while(0) + +#define restore_dampr(R, _dampr) \ +do { \ + asm volatile("movgs %0,dampr"R :: "r"(_dampr)); \ +} while(0) + +/* + * AMCR - Address Mapping Control Register + */ +#define AMCR_IAMRN 0x000000ff /* quantity of IAMPR registers */ +#define AMCR_DAMRN 0x0000ff00 /* quantity of DAMPR registers */ + +/* + * TTBR - Address Translation Table Base Register + */ +#define __get_TTBR() ({ unsigned long x; asm volatile("movsg ttbr,%0" : "=r"(x)); x; }) + +/* + * TPXR - TLB Probe Extend Register + */ +#define TPXR_E 0x00000001 +#define TPXR_LMAX_SHIFT 20 +#define TPXR_LMAX_SMASK 0xf +#define TPXR_WMAX_SHIFT 24 +#define TPXR_WMAX_SMASK 0xf +#define TPXR_WAY_SHIFT 28 +#define TPXR_WAY_SMASK 0xf + +/* + * DCR - Debug Control Register + */ +#define DCR_IBCE3 0x00000001 /* break on conditional insn pointed to by IBAR3 */ +#define DCR_IBE3 0x00000002 /* break on insn pointed to by IBAR3 */ +#define DCR_IBCE1 0x00000004 /* break on conditional insn pointed to by IBAR2 */ +#define DCR_IBE1 0x00000008 /* break on insn pointed to by IBAR2 */ +#define DCR_IBCE2 0x00000010 /* break on conditional insn pointed to by IBAR1 */ +#define DCR_IBE2 0x00000020 /* break on insn pointed to by IBAR1 */ +#define DCR_IBCE0 0x00000040 /* break on conditional insn pointed to by IBAR0 */ +#define DCR_IBE0 0x00000080 /* break on insn pointed to by IBAR0 */ + +#define DCR_DDBE1 0x00004000 /* use DBDR1x when checking DBAR1 */ +#define DCR_DWBE1 0x00008000 /* break on store to address in DBAR1/DBMR1x */ +#define DCR_DRBE1 0x00010000 /* break on load from address in DBAR1/DBMR1x */ +#define DCR_DDBE0 0x00020000 /* use DBDR0x when checking DBAR0 */ +#define DCR_DWBE0 0x00040000 /* break on store to address in DBAR0/DBMR0x */ +#define DCR_DRBE0 0x00080000 /* break on load from address in DBAR0/DBMR0x */ + +#define DCR_EIM 0x0c000000 /* external interrupt disable */ +#define DCR_IBM 0x10000000 /* instruction break disable */ +#define DCR_SE 0x20000000 /* single step enable */ +#define DCR_EBE 0x40000000 /* exception break enable */ + +/* + * BRR - Break Interrupt Request Register + */ +#define BRR_ST 0x00000001 /* single-step detected */ +#define BRR_SB 0x00000002 /* break instruction detected */ +#define BRR_BB 0x00000004 /* branch with hint detected */ +#define BRR_CBB 0x00000008 /* branch to LR detected */ +#define BRR_IBx 0x000000f0 /* hardware breakpoint detected */ +#define BRR_DBx 0x00000f00 /* hardware watchpoint detected */ +#define BRR_DBNEx 0x0000f000 /* ? */ +#define BRR_EBTT 0x00ff0000 /* trap type of exception break */ +#define BRR_TB 0x10000000 /* external break request detected */ +#define BRR_CB 0x20000000 /* ICE break command detected */ +#define BRR_EB 0x40000000 /* exception break detected */ + +/* + * BPSR - Break PSR Save Register + */ +#define BPSR_BET 0x00000001 /* former PSR.ET */ +#define BPSR_BS 0x00001000 /* former PSR.S */ + +#endif /* _ASM_SPR_REGS_H */ diff --git a/arch/frv/include/asm/stat.h b/arch/frv/include/asm/stat.h new file mode 100644 index 0000000..ce56de9 --- /dev/null +++ b/arch/frv/include/asm/stat.h @@ -0,0 +1,100 @@ +#ifndef _ASM_STAT_H +#define _ASM_STAT_H + +struct __old_kernel_stat { + unsigned short st_dev; + unsigned short st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned long st_size; + unsigned long st_atime; + unsigned long st_mtime; + unsigned long st_ctime; +}; + +/* This matches struct stat in uClibc/glibc. */ +struct stat { + unsigned char __pad1[6]; + unsigned short st_dev; + + unsigned long __pad2; + unsigned long st_ino; + + unsigned short __pad3; + unsigned short st_mode; + unsigned short __pad4; + unsigned short st_nlink; + + unsigned short __pad5; + unsigned short st_uid; + unsigned short __pad6; + unsigned short st_gid; + + unsigned char __pad7[6]; + unsigned short st_rdev; + + unsigned long __pad8; + unsigned long st_size; + + unsigned long __pad9; /* align 64-bit st_blocks to 2-word */ + unsigned long st_blksize; + + unsigned long __pad10; /* future possible st_blocks high bits */ + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + + unsigned long __unused1; + unsigned long st_atime; + + unsigned long __unused2; + unsigned long st_mtime; + + unsigned long __unused3; + unsigned long st_ctime; + + unsigned long long __unused4; +}; + +/* This matches struct stat64 in uClibc/glibc. The layout is exactly + the same as that of struct stat above, with 64-bit types taking up + space that was formerly used by padding. stat syscalls are still + different from stat64, though, in that the former tests for + overflow. */ +struct stat64 { + unsigned char __pad1[6]; + unsigned short st_dev; + + unsigned long long st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned long st_uid; + unsigned long st_gid; + + unsigned char __pad2[6]; + unsigned short st_rdev; + + long long st_size; + + unsigned long __pad3; /* align 64-bit st_blocks to 2-word */ + unsigned long st_blksize; + + unsigned long __pad4; /* future possible st_blocks high bits */ + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + + unsigned long st_atime_nsec; + unsigned long st_atime; + + unsigned int st_mtime_nsec; + unsigned long st_mtime; + + unsigned long st_ctime_nsec; + unsigned long st_ctime; + + unsigned long long __unused4; +}; + +#endif /* _ASM_STAT_H */ diff --git a/arch/frv/include/asm/statfs.h b/arch/frv/include/asm/statfs.h new file mode 100644 index 0000000..741f586 --- /dev/null +++ b/arch/frv/include/asm/statfs.h @@ -0,0 +1,7 @@ +#ifndef _ASM_STATFS_H +#define _ASM_STATFS_H + +#include + +#endif /* _ASM_STATFS_H */ + diff --git a/arch/frv/include/asm/string.h b/arch/frv/include/asm/string.h new file mode 100644 index 0000000..5ed310f --- /dev/null +++ b/arch/frv/include/asm/string.h @@ -0,0 +1,51 @@ +/* string.h: FRV string handling + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_STRING_H_ +#define _ASM_STRING_H_ + +#ifdef __KERNEL__ /* only set these up for kernel code */ + +#define __HAVE_ARCH_MEMSET 1 +#define __HAVE_ARCH_MEMCPY 1 + +extern void *memset(void *, int, __kernel_size_t); +extern void *memcpy(void *, const void *, __kernel_size_t); + +#else /* KERNEL */ + +/* + * let user libraries deal with these, + * IMHO the kernel has no place defining these functions for user apps + */ + +#define __HAVE_ARCH_STRCPY 1 +#define __HAVE_ARCH_STRNCPY 1 +#define __HAVE_ARCH_STRCAT 1 +#define __HAVE_ARCH_STRNCAT 1 +#define __HAVE_ARCH_STRCMP 1 +#define __HAVE_ARCH_STRNCMP 1 +#define __HAVE_ARCH_STRNICMP 1 +#define __HAVE_ARCH_STRCHR 1 +#define __HAVE_ARCH_STRRCHR 1 +#define __HAVE_ARCH_STRSTR 1 +#define __HAVE_ARCH_STRLEN 1 +#define __HAVE_ARCH_STRNLEN 1 +#define __HAVE_ARCH_MEMSET 1 +#define __HAVE_ARCH_MEMCPY 1 +#define __HAVE_ARCH_MEMMOVE 1 +#define __HAVE_ARCH_MEMSCAN 1 +#define __HAVE_ARCH_MEMCMP 1 +#define __HAVE_ARCH_MEMCHR 1 +#define __HAVE_ARCH_STRTOK 1 + +#endif /* KERNEL */ +#endif /* _ASM_STRING_H_ */ diff --git a/arch/frv/include/asm/suspend.h b/arch/frv/include/asm/suspend.h new file mode 100644 index 0000000..5fa7b5a --- /dev/null +++ b/arch/frv/include/asm/suspend.h @@ -0,0 +1,20 @@ +/* suspend.h: suspension stuff + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SUSPEND_H +#define _ASM_SUSPEND_H + +static inline int arch_prepare_suspend(void) +{ + return 0; +} + +#endif /* _ASM_SUSPEND_H */ diff --git a/arch/frv/include/asm/swab.h b/arch/frv/include/asm/swab.h new file mode 100644 index 0000000..f305834 --- /dev/null +++ b/arch/frv/include/asm/swab.h @@ -0,0 +1,10 @@ +#ifndef _ASM_SWAB_H +#define _ASM_SWAB_H + +#include + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) +# define __SWAB_64_THRU_32__ +#endif + +#endif /* _ASM_SWAB_H */ diff --git a/arch/frv/include/asm/system.h b/arch/frv/include/asm/system.h new file mode 100644 index 0000000..7742ec0 --- /dev/null +++ b/arch/frv/include/asm/system.h @@ -0,0 +1,301 @@ +/* system.h: FR-V CPU control definitions + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_SYSTEM_H +#define _ASM_SYSTEM_H + +#include +#include +#include + +struct thread_struct; + +/* + * switch_to(prev, next) should switch from task `prev' to `next' + * `prev' will never be the same as `next'. + * The `mb' is to tell GCC not to cache `current' across this call. + */ +extern asmlinkage +struct task_struct *__switch_to(struct thread_struct *prev_thread, + struct thread_struct *next_thread, + struct task_struct *prev); + +#define switch_to(prev, next, last) \ +do { \ + (prev)->thread.sched_lr = \ + (unsigned long) __builtin_return_address(0); \ + (last) = __switch_to(&(prev)->thread, &(next)->thread, (prev)); \ + mb(); \ +} while(0) + +/* + * interrupt flag manipulation + * - use virtual interrupt management since touching the PSR is slow + * - ICC2.Z: T if interrupts virtually disabled + * - ICC2.C: F if interrupts really disabled + * - if Z==1 upon interrupt: + * - C is set to 0 + * - interrupts are really disabled + * - entry.S returns immediately + * - uses TIHI (TRAP if Z==0 && C==0) #2 to really reenable interrupts + * - if taken, the trap: + * - sets ICC2.C + * - enables interrupts + */ +#define local_irq_disable() \ +do { \ + /* set Z flag, but don't change the C flag */ \ + asm volatile(" andcc gr0,gr0,gr0,icc2 \n" \ + : \ + : \ + : "memory", "icc2" \ + ); \ +} while(0) + +#define local_irq_enable() \ +do { \ + /* clear Z flag and then test the C flag */ \ + asm volatile(" oricc gr0,#1,gr0,icc2 \n" \ + " tihi icc2,gr0,#2 \n" \ + : \ + : \ + : "memory", "icc2" \ + ); \ +} while(0) + +#define local_save_flags(flags) \ +do { \ + typecheck(unsigned long, flags); \ + asm volatile("movsg ccr,%0" \ + : "=r"(flags) \ + : \ + : "memory"); \ + \ + /* shift ICC2.Z to bit 0 */ \ + flags >>= 26; \ + \ + /* make flags 1 if interrupts disabled, 0 otherwise */ \ + flags &= 1UL; \ +} while(0) + +#define irqs_disabled() \ + ({unsigned long flags; local_save_flags(flags); !!flags; }) + +#define local_irq_save(flags) \ +do { \ + typecheck(unsigned long, flags); \ + local_save_flags(flags); \ + local_irq_disable(); \ +} while(0) + +#define local_irq_restore(flags) \ +do { \ + typecheck(unsigned long, flags); \ + \ + /* load the Z flag by turning 1 if disabled into 0 if disabled \ + * and thus setting the Z flag but not the C flag */ \ + asm volatile(" xoricc %0,#1,gr0,icc2 \n" \ + /* then test Z=0 and C=0 */ \ + " tihi icc2,gr0,#2 \n" \ + : \ + : "r"(flags) \ + : "memory", "icc2" \ + ); \ + \ +} while(0) + +/* + * real interrupt flag manipulation + */ +#define __local_irq_disable() \ +do { \ + unsigned long psr; \ + asm volatile(" movsg psr,%0 \n" \ + " andi %0,%2,%0 \n" \ + " ori %0,%1,%0 \n" \ + " movgs %0,psr \n" \ + : "=r"(psr) \ + : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ + : "memory"); \ +} while(0) + +#define __local_irq_enable() \ +do { \ + unsigned long psr; \ + asm volatile(" movsg psr,%0 \n" \ + " andi %0,%1,%0 \n" \ + " movgs %0,psr \n" \ + : "=r"(psr) \ + : "i" (~PSR_PIL) \ + : "memory"); \ +} while(0) + +#define __local_save_flags(flags) \ +do { \ + typecheck(unsigned long, flags); \ + asm("movsg psr,%0" \ + : "=r"(flags) \ + : \ + : "memory"); \ +} while(0) + +#define __local_irq_save(flags) \ +do { \ + unsigned long npsr; \ + typecheck(unsigned long, flags); \ + asm volatile(" movsg psr,%0 \n" \ + " andi %0,%3,%1 \n" \ + " ori %1,%2,%1 \n" \ + " movgs %1,psr \n" \ + : "=r"(flags), "=r"(npsr) \ + : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ + : "memory"); \ +} while(0) + +#define __local_irq_restore(flags) \ +do { \ + typecheck(unsigned long, flags); \ + asm volatile(" movgs %0,psr \n" \ + : \ + : "r" (flags) \ + : "memory"); \ +} while(0) + +#define __irqs_disabled() \ + ((__get_PSR() & PSR_PIL) >= PSR_PIL_14) + +/* + * Force strict CPU ordering. + */ +#define nop() asm volatile ("nop"::) +#define mb() asm volatile ("membar" : : :"memory") +#define rmb() asm volatile ("membar" : : :"memory") +#define wmb() asm volatile ("membar" : : :"memory") +#define read_barrier_depends() do { } while (0) + +#ifdef CONFIG_SMP +#define smp_mb() mb() +#define smp_rmb() rmb() +#define smp_wmb() wmb() +#define smp_read_barrier_depends() read_barrier_depends() +#define set_mb(var, value) \ + do { xchg(&var, (value)); } while (0) +#else +#define smp_mb() barrier() +#define smp_rmb() barrier() +#define smp_wmb() barrier() +#define smp_read_barrier_depends() do {} while(0) +#define set_mb(var, value) \ + do { var = (value); barrier(); } while (0) +#endif + +extern void die_if_kernel(const char *, ...) __attribute__((format(printf, 1, 2))); +extern void free_initmem(void); + +#define arch_align_stack(x) (x) + +/*****************************************************************************/ +/* + * compare and conditionally exchange value with memory + * - if (*ptr == test) then orig = *ptr; *ptr = test; + * - if (*ptr != test) then orig = *ptr; + */ +#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS + +#define cmpxchg(ptr, test, new) \ +({ \ + __typeof__(ptr) __xg_ptr = (ptr); \ + __typeof__(*(ptr)) __xg_orig, __xg_tmp; \ + __typeof__(*(ptr)) __xg_test = (test); \ + __typeof__(*(ptr)) __xg_new = (new); \ + \ + switch (sizeof(__xg_orig)) { \ + case 4: \ + asm volatile( \ + "0: \n" \ + " orcc gr0,gr0,gr0,icc3 \n" \ + " ckeq icc3,cc7 \n" \ + " ld.p %M0,%1 \n" \ + " orcr cc7,cc7,cc3 \n" \ + " sub%I4cc %1,%4,%2,icc0 \n" \ + " bne icc0,#0,1f \n" \ + " cst.p %3,%M0 ,cc3,#1 \n" \ + " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ + " beq icc3,#0,0b \n" \ + "1: \n" \ + : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ + : "r"(__xg_new), "NPr"(__xg_test) \ + : "memory", "cc7", "cc3", "icc3", "icc0" \ + ); \ + break; \ + \ + default: \ + __xg_orig = (__typeof__(__xg_orig))0; \ + asm volatile("break"); \ + break; \ + } \ + \ + __xg_orig; \ +}) + +#else + +extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); + +#define cmpxchg(ptr, test, new) \ +({ \ + __typeof__(ptr) __xg_ptr = (ptr); \ + __typeof__(*(ptr)) __xg_orig; \ + __typeof__(*(ptr)) __xg_test = (test); \ + __typeof__(*(ptr)) __xg_new = (new); \ + \ + switch (sizeof(__xg_orig)) { \ + case 4: __xg_orig = (__force __typeof__(*ptr)) \ + __cmpxchg_32((__force uint32_t *)__xg_ptr, \ + (__force uint32_t)__xg_test, \ + (__force uint32_t)__xg_new); break; \ + default: \ + __xg_orig = (__typeof__(__xg_orig))0; \ + asm volatile("break"); \ + break; \ + } \ + \ + __xg_orig; \ +}) + +#endif + +#include + +static inline unsigned long __cmpxchg_local(volatile void *ptr, + unsigned long old, + unsigned long new, int size) +{ + switch (size) { + case 4: + return cmpxchg((unsigned long *)ptr, old, new); + default: + return __cmpxchg_local_generic(ptr, old, new, size); + } + + return old; +} + +/* + * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make + * them available. + */ +#define cmpxchg_local(ptr, o, n) \ + ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ + (unsigned long)(n), sizeof(*(ptr)))) +#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) + +#endif /* _ASM_SYSTEM_H */ diff --git a/arch/frv/include/asm/termbits.h b/arch/frv/include/asm/termbits.h new file mode 100644 index 0000000..5568492 --- /dev/null +++ b/arch/frv/include/asm/termbits.h @@ -0,0 +1,202 @@ +#ifndef _ASM_TERMBITS_H__ +#define _ASM_TERMBITS_H__ + +#include + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define NCCS 19 +struct termios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ +}; + +struct termios2 { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +struct ktermios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +/* c_cc characters */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + + +/* c_iflag bits */ +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +/* c_oflag bits */ +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +/* c_cflag bit meaning */ +#define CBAUD 0010017 +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#define EXTA B19200 +#define EXTB B38400 +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#define CBAUDEX 0010000 +#define BOTHER 0010000 +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 +#define CIBAUD 002003600000 /* Input baud rate */ +#define CTVB 004000000000 /* VisioBraille Terminal flow control */ +#define CMSPAR 010000000000 /* mark or space (stick) parity */ +#define CRTSCTS 020000000000 /* flow control */ + +#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ + +/* c_lflag bits */ +#define ISIG 0000001 +#define ICANON 0000002 +#define XCASE 0000004 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define IEXTEN 0100000 + + +/* tcflow() and TCXONC use these */ +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +#endif /* _ASM_TERMBITS_H__ */ + diff --git a/arch/frv/include/asm/termios.h b/arch/frv/include/asm/termios.h new file mode 100644 index 0000000..a62fb58 --- /dev/null +++ b/arch/frv/include/asm/termios.h @@ -0,0 +1,58 @@ +#ifndef _ASM_TERMIOS_H +#define _ASM_TERMIOS_H + +#include +#include + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +#ifdef __KERNEL__ +/* intr=^C quit=^| erase=del kill=^U + eof=^D vtime=\0 vmin=\1 sxtc=\0 + start=^Q stop=^S susp=^Z eol=\0 + reprint=^R discard=^U werase=^W lnext=^V + eol2=\0 +*/ +#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" +#endif + +/* modem lines */ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 + +#define TIOCM_MODEM_BITS TIOCM_OUT2 /* IRDA support */ + +/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ + +#ifdef __KERNEL__ +#include +#endif + +#endif /* _ASM_TERMIOS_H */ diff --git a/arch/frv/include/asm/thread_info.h b/arch/frv/include/asm/thread_info.h new file mode 100644 index 0000000..bb53ab7 --- /dev/null +++ b/arch/frv/include/asm/thread_info.h @@ -0,0 +1,144 @@ +/* thread_info.h: description + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * Derived from include/asm-i386/thread_info.h + * + * 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. + */ + +#ifndef _ASM_THREAD_INFO_H +#define _ASM_THREAD_INFO_H + +#ifdef __KERNEL__ + +#ifndef __ASSEMBLY__ +#include +#endif + +#define THREAD_SIZE 8192 + +/* + * low level task data that entry.S needs immediate access to + * - this struct should fit entirely inside of one cache line + * - this struct shares the supervisor stack pages + * - if the contents of this structure are changed, the assembly constants must also be changed + */ +#ifndef __ASSEMBLY__ + +struct thread_info { + struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + unsigned long flags; /* low level flags */ + unsigned long status; /* thread-synchronous flags */ + __u32 cpu; /* current CPU */ + int preempt_count; /* 0 => preemptable, <0 => BUG */ + + mm_segment_t addr_limit; /* thread address space: + * 0-0xBFFFFFFF for user-thead + * 0-0xFFFFFFFF for kernel-thread + */ + struct restart_block restart_block; + + __u8 supervisor_stack[0]; +}; + +#else /* !__ASSEMBLY__ */ + +#include + +#endif + +#define PREEMPT_ACTIVE 0x10000000 + +/* + * macros/functions for gaining access to the thread information structure + * + * preempt_count needs to be 1 initially, until the scheduler is functional. + */ +#ifndef __ASSEMBLY__ + +#define INIT_THREAD_INFO(tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +/* how to get the thread information struct from C */ +register struct thread_info *__current_thread_info asm("gr15"); + +#define current_thread_info() ({ __current_thread_info; }) + +#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR + +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define alloc_thread_info(tsk) \ + ({ \ + struct thread_info *ret; \ + \ + ret = kzalloc(THREAD_SIZE, GFP_KERNEL); \ + \ + ret; \ + }) +#else +#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) +#endif + +#define free_thread_info(info) kfree(info) + +#endif /* __ASSEMBLY__ */ + +/* + * thread information flags + * - these are process state flags that various assembly files may need to access + * - pending work-to-be-done flags are in LSW + * - other flags in MSW + */ +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_SIGPENDING 1 /* signal pending */ +#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ +#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ +#define TIF_IRET 4 /* return with iret */ +#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ +#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_MEMDIE 17 /* OOM killer killed process */ +#define TIF_FREEZE 18 /* freezing for suspend */ + +#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) +#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) +#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) +#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) +#define _TIF_IRET (1 << TIF_IRET) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) +#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) +#define _TIF_FREEZE (1 << TIF_FREEZE) + +#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ +#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ + +/* + * Thread-synchronous status. + * + * This is different from the flags in that nobody else + * ever touches our thread-synchronous status, so we don't + * have to worry about atomic accesses. + */ +#define TS_USEDFPM 0x0001 /* FPU/Media was used by this task this quantum (SMP) */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_THREAD_INFO_H */ diff --git a/arch/frv/include/asm/timer-regs.h b/arch/frv/include/asm/timer-regs.h new file mode 100644 index 0000000..6c5a871 --- /dev/null +++ b/arch/frv/include/asm/timer-regs.h @@ -0,0 +1,106 @@ +/* timer-regs.h: hardware timer register definitions + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_TIMER_REGS_H +#define _ASM_TIMER_REGS_H + +#include + +extern unsigned long __nongprelbss __clkin_clock_speed_HZ; +extern unsigned long __nongprelbss __ext_bus_clock_speed_HZ; +extern unsigned long __nongprelbss __res_bus_clock_speed_HZ; +extern unsigned long __nongprelbss __sdram_clock_speed_HZ; +extern unsigned long __nongprelbss __core_bus_clock_speed_HZ; +extern unsigned long __nongprelbss __core_clock_speed_HZ; +extern unsigned long __nongprelbss __dsu_clock_speed_HZ; +extern unsigned long __nongprelbss __serial_clock_speed_HZ; + +#define __get_CLKC() ({ *(volatile unsigned long *)(0xfeff9a00); }) + +static inline void __set_CLKC(unsigned long v) +{ + int tmp; + + asm volatile(" st%I0.p %2,%M0 \n" + " setlos %3,%1 \n" + " membar \n" + "0: \n" + " subicc %1,#1,%1,icc0 \n" + " bnc icc0,#1,0b \n" + : "=m"(*(volatile unsigned long *) 0xfeff9a00), "=r"(tmp) + : "r"(v), "i"(256) + : "icc0"); +} + +#define __get_TCTR() ({ *(volatile unsigned long *)(0xfeff9418); }) +#define __get_TPRV() ({ *(volatile unsigned long *)(0xfeff9420); }) +#define __get_TPRCKSL() ({ *(volatile unsigned long *)(0xfeff9428); }) +#define __get_TCSR(T) ({ *(volatile unsigned long *)(0xfeff9400 + 8 * (T)); }) +#define __get_TxCKSL(T) ({ *(volatile unsigned long *)(0xfeff9430 + 8 * (T)); }) + +#define __get_TCSR_DATA(T) ({ __get_TCSR(T) >> 24; }) + +#define __set_TCTR(V) do { *(volatile unsigned long *)(0xfeff9418) = (V); mb(); } while(0) +#define __set_TPRV(V) do { *(volatile unsigned long *)(0xfeff9420) = (V) << 24; mb(); } while(0) +#define __set_TPRCKSL(V) do { *(volatile unsigned long *)(0xfeff9428) = (V); mb(); } while(0) +#define __set_TCSR(T,V) \ +do { *(volatile unsigned long *)(0xfeff9400 + 8 * (T)) = (V); mb(); } while(0) + +#define __set_TxCKSL(T,V) \ +do { *(volatile unsigned long *)(0xfeff9430 + 8 * (T)) = (V); mb(); } while(0) + +#define __set_TCSR_DATA(T,V) __set_TCSR(T, (V) << 24) +#define __set_TxCKSL_DATA(T,V) __set_TxCKSL(T, TxCKSL_EIGHT | __TxCKSL_SELECT((V))) + +/* clock control register */ +#define CLKC_CMODE 0x0f000000 +#define CLKC_SLPL 0x000f0000 +#define CLKC_P0 0x00000100 +#define CLKC_CM 0x00000003 + +#define CLKC_CMODE_s 24 + +/* timer control register - non-readback mode */ +#define TCTR_MODE_0 0x00000000 +#define TCTR_MODE_2 0x04000000 +#define TCTR_MODE_4 0x08000000 +#define TCTR_MODE_5 0x0a000000 +#define TCTR_RL_LATCH 0x00000000 +#define TCTR_RL_RW_LOW8 0x10000000 +#define TCTR_RL_RW_HIGH8 0x20000000 +#define TCTR_RL_RW_LH8 0x30000000 +#define TCTR_SC_CTR0 0x00000000 +#define TCTR_SC_CTR1 0x40000000 +#define TCTR_SC_CTR2 0x80000000 + +/* timer control register - readback mode */ +#define TCTR_CNT0 0x02000000 +#define TCTR_CNT1 0x04000000 +#define TCTR_CNT2 0x08000000 +#define TCTR_NSTATUS 0x10000000 +#define TCTR_NCOUNT 0x20000000 +#define TCTR_SC_READBACK 0xc0000000 + +/* timer control status registers - non-readback mode */ +#define TCSRx_DATA 0xff000000 + +/* timer control status registers - readback mode */ +#define TCSRx_OUTPUT 0x80000000 +#define TCSRx_NULLCOUNT 0x40000000 +#define TCSRx_RL 0x30000000 +#define TCSRx_MODE 0x07000000 + +/* timer clock select registers */ +#define TxCKSL_SELECT 0x0f000000 +#define __TxCKSL_SELECT(X) ((X) << 24) +#define TxCKSL_EIGHT 0xf0000000 + +#endif /* _ASM_TIMER_REGS_H */ diff --git a/arch/frv/include/asm/timex.h b/arch/frv/include/asm/timex.h new file mode 100644 index 0000000..a89bdde --- /dev/null +++ b/arch/frv/include/asm/timex.h @@ -0,0 +1,20 @@ +/* timex.h: FR-V architecture timex specifications + */ +#ifndef _ASM_TIMEX_H +#define _ASM_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ + +typedef unsigned long cycles_t; + +static inline cycles_t get_cycles(void) +{ + return 0; +} + +#define vxtime_lock() do {} while (0) +#define vxtime_unlock() do {} while (0) + +#endif + diff --git a/arch/frv/include/asm/tlb.h b/arch/frv/include/asm/tlb.h new file mode 100644 index 0000000..cd458eb --- /dev/null +++ b/arch/frv/include/asm/tlb.h @@ -0,0 +1,27 @@ +#ifndef _ASM_TLB_H +#define _ASM_TLB_H + +#include + +#ifdef CONFIG_MMU +extern void check_pgt_cache(void); +#else +#define check_pgt_cache() do {} while(0) +#endif + +/* + * we don't need any special per-pte or per-vma handling... + */ +#define tlb_start_vma(tlb, vma) do { } while (0) +#define tlb_end_vma(tlb, vma) do { } while (0) +#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) + +/* + * .. because we flush the whole mm when it fills up + */ +#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) + +#include + +#endif /* _ASM_TLB_H */ + diff --git a/arch/frv/include/asm/tlbflush.h b/arch/frv/include/asm/tlbflush.h new file mode 100644 index 0000000..7ac5eaf --- /dev/null +++ b/arch/frv/include/asm/tlbflush.h @@ -0,0 +1,73 @@ +/* tlbflush.h: TLB flushing functions + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_TLBFLUSH_H +#define _ASM_TLBFLUSH_H + +#include +#include + +#ifdef CONFIG_MMU + +#ifndef __ASSEMBLY__ +extern void asmlinkage __flush_tlb_all(void); +extern void asmlinkage __flush_tlb_mm(unsigned long contextid); +extern void asmlinkage __flush_tlb_page(unsigned long contextid, unsigned long start); +extern void asmlinkage __flush_tlb_range(unsigned long contextid, + unsigned long start, unsigned long end); +#endif /* !__ASSEMBLY__ */ + +#define flush_tlb_all() \ +do { \ + preempt_disable(); \ + __flush_tlb_all(); \ + preempt_enable(); \ +} while(0) + +#define flush_tlb_mm(mm) \ +do { \ + preempt_disable(); \ + __flush_tlb_mm((mm)->context.id); \ + preempt_enable(); \ +} while(0) + +#define flush_tlb_range(vma,start,end) \ +do { \ + preempt_disable(); \ + __flush_tlb_range((vma)->vm_mm->context.id, start, end); \ + preempt_enable(); \ +} while(0) + +#define flush_tlb_page(vma,addr) \ +do { \ + preempt_disable(); \ + __flush_tlb_page((vma)->vm_mm->context.id, addr); \ + preempt_enable(); \ +} while(0) + + +#define __flush_tlb_global() flush_tlb_all() +#define flush_tlb() flush_tlb_all() +#define flush_tlb_kernel_range(start, end) flush_tlb_all() + +#else + +#define flush_tlb() BUG() +#define flush_tlb_all() BUG() +#define flush_tlb_mm(mm) BUG() +#define flush_tlb_page(vma,addr) BUG() +#define flush_tlb_range(mm,start,end) BUG() +#define flush_tlb_kernel_range(start, end) BUG() + +#endif + + +#endif /* _ASM_TLBFLUSH_H */ diff --git a/arch/frv/include/asm/topology.h b/arch/frv/include/asm/topology.h new file mode 100644 index 0000000..9427243 --- /dev/null +++ b/arch/frv/include/asm/topology.h @@ -0,0 +1,12 @@ +#ifndef _ASM_TOPOLOGY_H +#define _ASM_TOPOLOGY_H + +#ifdef CONFIG_NUMA + +#error NUMA not supported yet + +#endif /* CONFIG_NUMA */ + +#include + +#endif /* _ASM_TOPOLOGY_H */ diff --git a/arch/frv/include/asm/types.h b/arch/frv/include/asm/types.h new file mode 100644 index 0000000..613bf1e --- /dev/null +++ b/arch/frv/include/asm/types.h @@ -0,0 +1,40 @@ +/* types.h: FRV types + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_TYPES_H +#define _ASM_TYPES_H + +#include + +#ifndef __ASSEMBLY__ + +typedef unsigned short umode_t; + +#endif /* __ASSEMBLY__ */ + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +#define BITS_PER_LONG 32 + +#ifndef __ASSEMBLY__ + +/* Dma addresses are 32-bits wide. */ + +typedef u32 dma_addr_t; + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_TYPES_H */ diff --git a/arch/frv/include/asm/uaccess.h b/arch/frv/include/asm/uaccess.h new file mode 100644 index 0000000..53650c9 --- /dev/null +++ b/arch/frv/include/asm/uaccess.h @@ -0,0 +1,321 @@ +/* uaccess.h: userspace accessor functions + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_UACCESS_H +#define _ASM_UACCESS_H + +/* + * User space memory access functions + */ +#include +#include +#include +#include + +#define HAVE_ARCH_UNMAPPED_AREA /* we decide where to put mmaps */ + +#define __ptr(x) ((unsigned long __force *)(x)) + +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 + +#define __addr_ok(addr) ((unsigned long)(addr) < get_addr_limit()) + +/* + * check that a range of addresses falls within the current address limit + */ +static inline int ___range_ok(unsigned long addr, unsigned long size) +{ +#ifdef CONFIG_MMU + int flag = -EFAULT, tmp; + + asm volatile ( + " addcc %3,%2,%1,icc0 \n" /* set C-flag if addr+size>4GB */ + " subcc.p %1,%4,gr0,icc1 \n" /* jump if addr+size>limit */ + " bc icc0,#0,0f \n" + " bhi icc1,#0,0f \n" + " setlos #0,%0 \n" /* mark okay */ + "0: \n" + : "=r"(flag), "=&r"(tmp) + : "r"(addr), "r"(size), "r"(get_addr_limit()), "0"(flag) + ); + + return flag; + +#else + + if (addr < memory_start || + addr > memory_end || + size > memory_end - memory_start || + addr + size > memory_end) + return -EFAULT; + + return 0; +#endif +} + +#define __range_ok(addr,size) ___range_ok((unsigned long) (addr), (unsigned long) (size)) + +#define access_ok(type,addr,size) (__range_ok((void __user *)(addr), (size)) == 0) +#define __access_ok(addr,size) (__range_ok((addr), (size)) == 0) + +/* + * The exception table consists of pairs of addresses: the first is the + * address of an instruction that is allowed to fault, and the second is + * the address at which the program should continue. No registers are + * modified, so it is entirely up to the continuation code to figure out + * what to do. + * + * All the routines below use bits of fixup code that are out of line + * with the main instruction path. This means when everything is well, + * we don't even have to jump over them. Further, they do not intrude + * on our cache or tlb entries. + */ +struct exception_table_entry +{ + unsigned long insn, fixup; +}; + +/* Returns 0 if exception not found and fixup otherwise. */ +extern unsigned long search_exception_table(unsigned long); + + +/* + * These are the main single-value transfer routines. They automatically + * use the right size if we just have the right pointer type. + */ +#define __put_user(x, ptr) \ +({ \ + int __pu_err = 0; \ + \ + typeof(*(ptr)) __pu_val = (x); \ + __chk_user_ptr(ptr); \ + \ + switch (sizeof (*(ptr))) { \ + case 1: \ + __put_user_asm(__pu_err, __pu_val, ptr, "b", "r"); \ + break; \ + case 2: \ + __put_user_asm(__pu_err, __pu_val, ptr, "h", "r"); \ + break; \ + case 4: \ + __put_user_asm(__pu_err, __pu_val, ptr, "", "r"); \ + break; \ + case 8: \ + __put_user_asm(__pu_err, __pu_val, ptr, "d", "e"); \ + break; \ + default: \ + __pu_err = __put_user_bad(); \ + break; \ + } \ + __pu_err; \ +}) + +#define put_user(x, ptr) \ +({ \ + typeof(*(ptr)) __user *_p = (ptr); \ + int _e; \ + \ + _e = __range_ok(_p, sizeof(*_p)); \ + if (_e == 0) \ + _e = __put_user((x), _p); \ + _e; \ +}) + +extern int __put_user_bad(void); + +/* + * Tell gcc we read from memory instead of writing: this is because + * we do not write to any memory gcc knows about, so there are no + * aliasing issues. + */ + +#ifdef CONFIG_MMU + +#define __put_user_asm(err,x,ptr,dsize,constraint) \ +do { \ + asm volatile("1: st"dsize"%I1 %2,%M1 \n" \ + "2: \n" \ + ".subsection 2 \n" \ + "3: setlos %3,%0 \n" \ + " bra 2b \n" \ + ".previous \n" \ + ".section __ex_table,\"a\" \n" \ + " .balign 8 \n" \ + " .long 1b,3b \n" \ + ".previous" \ + : "=r" (err) \ + : "m" (*__ptr(ptr)), constraint (x), "i"(-EFAULT), "0"(err) \ + : "memory"); \ +} while (0) + +#else + +#define __put_user_asm(err,x,ptr,bwl,con) \ +do { \ + asm(" st"bwl"%I0 %1,%M0 \n" \ + " membar \n" \ + : \ + : "m" (*__ptr(ptr)), con (x) \ + : "memory"); \ +} while (0) + +#endif + +/*****************************************************************************/ +/* + * + */ +#define __get_user(x, ptr) \ +({ \ + int __gu_err = 0; \ + __chk_user_ptr(ptr); \ + \ + switch (sizeof(*(ptr))) { \ + case 1: { \ + unsigned char __gu_val; \ + __get_user_asm(__gu_err, __gu_val, ptr, "ub", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ + break; \ + } \ + case 2: { \ + unsigned short __gu_val; \ + __get_user_asm(__gu_err, __gu_val, ptr, "uh", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ + break; \ + } \ + case 4: { \ + unsigned int __gu_val; \ + __get_user_asm(__gu_err, __gu_val, ptr, "", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ + break; \ + } \ + case 8: { \ + unsigned long long __gu_val; \ + __get_user_asm(__gu_err, __gu_val, ptr, "d", "=e"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ + break; \ + } \ + default: \ + __gu_err = __get_user_bad(); \ + break; \ + } \ + __gu_err; \ +}) + +#define get_user(x, ptr) \ +({ \ + const typeof(*(ptr)) __user *_p = (ptr);\ + int _e; \ + \ + _e = __range_ok(_p, sizeof(*_p)); \ + if (likely(_e == 0)) \ + _e = __get_user((x), _p); \ + else \ + (x) = (typeof(x)) 0; \ + _e; \ +}) + +extern int __get_user_bad(void); + +#ifdef CONFIG_MMU + +#define __get_user_asm(err,x,ptr,dtype,constraint) \ +do { \ + asm("1: ld"dtype"%I2 %M2,%1 \n" \ + "2: \n" \ + ".subsection 2 \n" \ + "3: setlos %3,%0 \n" \ + " setlos #0,%1 \n" \ + " bra 2b \n" \ + ".previous \n" \ + ".section __ex_table,\"a\" \n" \ + " .balign 8 \n" \ + " .long 1b,3b \n" \ + ".previous" \ + : "=r" (err), constraint (x) \ + : "m" (*__ptr(ptr)), "i"(-EFAULT), "0"(err) \ + ); \ +} while(0) + +#else + +#define __get_user_asm(err,x,ptr,bwl,con) \ + asm(" ld"bwl"%I1 %M1,%0 \n" \ + " membar \n" \ + : con(x) \ + : "m" (*__ptr(ptr))) + +#endif + +/*****************************************************************************/ +/* + * + */ +#define ____force(x) (__force void *)(void __user *)(x) +#ifdef CONFIG_MMU +extern long __memset_user(void *dst, unsigned long count); +extern long __memcpy_user(void *dst, const void *src, unsigned long count); + +#define clear_user(dst,count) __memset_user(____force(dst), (count)) +#define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), ____force(from), (n)) +#define __copy_to_user_inatomic(to, from, n) __memcpy_user(____force(to), (from), (n)) + +#else + +#define clear_user(dst,count) (memset(____force(dst), 0, (count)), 0) +#define __copy_from_user_inatomic(to, from, n) (memcpy((to), ____force(from), (n)), 0) +#define __copy_to_user_inatomic(to, from, n) (memcpy(____force(to), (from), (n)), 0) + +#endif + +#define __clear_user clear_user + +static inline unsigned long __must_check +__copy_to_user(void __user *to, const void *from, unsigned long n) +{ + might_sleep(); + return __copy_to_user_inatomic(to, from, n); +} + +static inline unsigned long +__copy_from_user(void *to, const void __user *from, unsigned long n) +{ + might_sleep(); + return __copy_from_user_inatomic(to, from, n); +} + +static inline long copy_from_user(void *to, const void __user *from, unsigned long n) +{ + unsigned long ret = n; + + if (likely(__access_ok(from, n))) + ret = __copy_from_user(to, from, n); + + if (unlikely(ret != 0)) + memset(to + (n - ret), 0, ret); + + return ret; +} + +static inline long copy_to_user(void __user *to, const void *from, unsigned long n) +{ + return likely(__access_ok(to, n)) ? __copy_to_user(to, from, n) : n; +} + +extern long strncpy_from_user(char *dst, const char __user *src, long count); +extern long strnlen_user(const char __user *src, long count); + +#define strlen_user(str) strnlen_user(str, 32767) + +extern unsigned long search_exception_table(unsigned long addr); + +#endif /* _ASM_UACCESS_H */ diff --git a/arch/frv/include/asm/ucontext.h b/arch/frv/include/asm/ucontext.h new file mode 100644 index 0000000..8d8c0c9 --- /dev/null +++ b/arch/frv/include/asm/ucontext.h @@ -0,0 +1,12 @@ +#ifndef _ASM_UCONTEXT_H +#define _ASM_UCONTEXT_H + +struct ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; /* mask last for extensibility */ +}; + +#endif diff --git a/arch/frv/include/asm/unaligned.h b/arch/frv/include/asm/unaligned.h new file mode 100644 index 0000000..6c61c05 --- /dev/null +++ b/arch/frv/include/asm/unaligned.h @@ -0,0 +1,22 @@ +/* unaligned.h: unaligned access handler + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_UNALIGNED_H +#define _ASM_UNALIGNED_H + +#include +#include +#include + +#define get_unaligned __get_unaligned_be +#define put_unaligned __put_unaligned_be + +#endif /* _ASM_UNALIGNED_H */ diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h new file mode 100644 index 0000000..edcfaf5 --- /dev/null +++ b/arch/frv/include/asm/unistd.h @@ -0,0 +1,382 @@ +#ifndef _ASM_UNISTD_H_ +#define _ASM_UNISTD_H_ + +/* + * This file contains the system call numbers. + */ + +#define __NR_restart_syscall 0 +#define __NR_exit 1 +#define __NR_fork 2 +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_waitpid 7 +#define __NR_creat 8 +#define __NR_link 9 +#define __NR_unlink 10 +#define __NR_execve 11 +#define __NR_chdir 12 +#define __NR_time 13 +#define __NR_mknod 14 +#define __NR_chmod 15 +#define __NR_lchown 16 +#define __NR_break 17 +#define __NR_oldstat 18 +#define __NR_lseek 19 +#define __NR_getpid 20 +#define __NR_mount 21 +#define __NR_umount 22 +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_stime 25 +#define __NR_ptrace 26 +#define __NR_alarm 27 +#define __NR_oldfstat 28 +#define __NR_pause 29 +#define __NR_utime 30 +#define __NR_stty 31 +#define __NR_gtty 32 +#define __NR_access 33 +#define __NR_nice 34 +#define __NR_ftime 35 +#define __NR_sync 36 +#define __NR_kill 37 +#define __NR_rename 38 +#define __NR_mkdir 39 +#define __NR_rmdir 40 +#define __NR_dup 41 +#define __NR_pipe 42 +#define __NR_times 43 +#define __NR_prof 44 +#define __NR_brk 45 +#define __NR_setgid 46 +#define __NR_getgid 47 +#define __NR_signal 48 +#define __NR_geteuid 49 +#define __NR_getegid 50 +#define __NR_acct 51 +#define __NR_umount2 52 +#define __NR_lock 53 +#define __NR_ioctl 54 +#define __NR_fcntl 55 +#define __NR_mpx 56 +#define __NR_setpgid 57 +#define __NR_ulimit 58 +// #define __NR_oldolduname /* 59 */ obsolete +#define __NR_umask 60 +#define __NR_chroot 61 +#define __NR_ustat 62 +#define __NR_dup2 63 +#define __NR_getppid 64 +#define __NR_getpgrp 65 +#define __NR_setsid 66 +#define __NR_sigaction 67 +#define __NR_sgetmask 68 +#define __NR_ssetmask 69 +#define __NR_setreuid 70 +#define __NR_setregid 71 +#define __NR_sigsuspend 72 +#define __NR_sigpending 73 +#define __NR_sethostname 74 +#define __NR_setrlimit 75 +#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ +#define __NR_getrusage 77 +#define __NR_gettimeofday 78 +#define __NR_settimeofday 79 +#define __NR_getgroups 80 +#define __NR_setgroups 81 +#define __NR_select 82 +#define __NR_symlink 83 +#define __NR_oldlstat 84 +#define __NR_readlink 85 +#define __NR_uselib 86 +#define __NR_swapon 87 +#define __NR_reboot 88 +#define __NR_readdir 89 +// #define __NR_mmap 90 /* obsolete - not implemented */ +#define __NR_munmap 91 +#define __NR_truncate 92 +#define __NR_ftruncate 93 +#define __NR_fchmod 94 +#define __NR_fchown 95 +#define __NR_getpriority 96 +#define __NR_setpriority 97 +// #define __NR_profil /* 98 */ obsolete +#define __NR_statfs 99 +#define __NR_fstatfs 100 +// #define __NR_ioperm /* 101 */ not supported +#define __NR_socketcall 102 +#define __NR_syslog 103 +#define __NR_setitimer 104 +#define __NR_getitimer 105 +#define __NR_stat 106 +#define __NR_lstat 107 +#define __NR_fstat 108 +// #define __NR_olduname /* 109 */ obsolete +// #define __NR_iopl /* 110 */ not supported +#define __NR_vhangup 111 +// #define __NR_idle /* 112 */ Obsolete +// #define __NR_vm86old /* 113 */ not supported +#define __NR_wait4 114 +#define __NR_swapoff 115 +#define __NR_sysinfo 116 +#define __NR_ipc 117 +#define __NR_fsync 118 +#define __NR_sigreturn 119 +#define __NR_clone 120 +#define __NR_setdomainname 121 +#define __NR_uname 122 +// #define __NR_modify_ldt /* 123 */ not supported +#define __NR_cacheflush 123 +#define __NR_adjtimex 124 +#define __NR_mprotect 125 +#define __NR_sigprocmask 126 +#define __NR_create_module 127 +#define __NR_init_module 128 +#define __NR_delete_module 129 +#define __NR_get_kernel_syms 130 +#define __NR_quotactl 131 +#define __NR_getpgid 132 +#define __NR_fchdir 133 +#define __NR_bdflush 134 +#define __NR_sysfs 135 +#define __NR_personality 136 +#define __NR_afs_syscall 137 /* Syscall for Andrew File System */ +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#define __NR__llseek 140 +#define __NR_getdents 141 +#define __NR__newselect 142 +#define __NR_flock 143 +#define __NR_msync 144 +#define __NR_readv 145 +#define __NR_writev 146 +#define __NR_getsid 147 +#define __NR_fdatasync 148 +#define __NR__sysctl 149 +#define __NR_mlock 150 +#define __NR_munlock 151 +#define __NR_mlockall 152 +#define __NR_munlockall 153 +#define __NR_sched_setparam 154 +#define __NR_sched_getparam 155 +#define __NR_sched_setscheduler 156 +#define __NR_sched_getscheduler 157 +#define __NR_sched_yield 158 +#define __NR_sched_get_priority_max 159 +#define __NR_sched_get_priority_min 160 +#define __NR_sched_rr_get_interval 161 +#define __NR_nanosleep 162 +#define __NR_mremap 163 +#define __NR_setresuid 164 +#define __NR_getresuid 165 +// #define __NR_vm86 /* 166 */ not supported +#define __NR_query_module 167 +#define __NR_poll 168 +#define __NR_nfsservctl 169 +#define __NR_setresgid 170 +#define __NR_getresgid 171 +#define __NR_prctl 172 +#define __NR_rt_sigreturn 173 +#define __NR_rt_sigaction 174 +#define __NR_rt_sigprocmask 175 +#define __NR_rt_sigpending 176 +#define __NR_rt_sigtimedwait 177 +#define __NR_rt_sigqueueinfo 178 +#define __NR_rt_sigsuspend 179 +#define __NR_pread64 180 +#define __NR_pwrite64 181 +#define __NR_chown 182 +#define __NR_getcwd 183 +#define __NR_capget 184 +#define __NR_capset 185 +#define __NR_sigaltstack 186 +#define __NR_sendfile 187 +#define __NR_getpmsg 188 /* some people actually want streams */ +#define __NR_putpmsg 189 /* some people actually want streams */ +#define __NR_vfork 190 +#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ +#define __NR_mmap2 192 +#define __NR_truncate64 193 +#define __NR_ftruncate64 194 +#define __NR_stat64 195 +#define __NR_lstat64 196 +#define __NR_fstat64 197 +#define __NR_lchown32 198 +#define __NR_getuid32 199 +#define __NR_getgid32 200 +#define __NR_geteuid32 201 +#define __NR_getegid32 202 +#define __NR_setreuid32 203 +#define __NR_setregid32 204 +#define __NR_getgroups32 205 +#define __NR_setgroups32 206 +#define __NR_fchown32 207 +#define __NR_setresuid32 208 +#define __NR_getresuid32 209 +#define __NR_setresgid32 210 +#define __NR_getresgid32 211 +#define __NR_chown32 212 +#define __NR_setuid32 213 +#define __NR_setgid32 214 +#define __NR_setfsuid32 215 +#define __NR_setfsgid32 216 +#define __NR_pivot_root 217 +#define __NR_mincore 218 +#define __NR_madvise 219 + +#define __NR_getdents64 220 +#define __NR_fcntl64 221 +#define __NR_security 223 /* syscall for security modules */ +#define __NR_gettid 224 +#define __NR_readahead 225 +#define __NR_setxattr 226 +#define __NR_lsetxattr 227 +#define __NR_fsetxattr 228 +#define __NR_getxattr 229 +#define __NR_lgetxattr 230 +#define __NR_fgetxattr 231 +#define __NR_listxattr 232 +#define __NR_llistxattr 233 +#define __NR_flistxattr 234 +#define __NR_removexattr 235 +#define __NR_lremovexattr 236 +#define __NR_fremovexattr 237 +#define __NR_tkill 238 +#define __NR_sendfile64 239 +#define __NR_futex 240 +#define __NR_sched_setaffinity 241 +#define __NR_sched_getaffinity 242 +#define __NR_set_thread_area 243 +#define __NR_get_thread_area 244 +#define __NR_io_setup 245 +#define __NR_io_destroy 246 +#define __NR_io_getevents 247 +#define __NR_io_submit 248 +#define __NR_io_cancel 249 +#define __NR_fadvise64 250 + +#define __NR_exit_group 252 +#define __NR_lookup_dcookie 253 +#define __NR_epoll_create 254 +#define __NR_epoll_ctl 255 +#define __NR_epoll_wait 256 +#define __NR_remap_file_pages 257 +#define __NR_set_tid_address 258 +#define __NR_timer_create 259 +#define __NR_timer_settime (__NR_timer_create+1) +#define __NR_timer_gettime (__NR_timer_create+2) +#define __NR_timer_getoverrun (__NR_timer_create+3) +#define __NR_timer_delete (__NR_timer_create+4) +#define __NR_clock_settime (__NR_timer_create+5) +#define __NR_clock_gettime (__NR_timer_create+6) +#define __NR_clock_getres (__NR_timer_create+7) +#define __NR_clock_nanosleep (__NR_timer_create+8) +#define __NR_statfs64 268 +#define __NR_fstatfs64 269 +#define __NR_tgkill 270 +#define __NR_utimes 271 +#define __NR_fadvise64_64 272 +#define __NR_vserver 273 +#define __NR_mbind 274 +#define __NR_get_mempolicy 275 +#define __NR_set_mempolicy 276 +#define __NR_mq_open 277 +#define __NR_mq_unlink (__NR_mq_open+1) +#define __NR_mq_timedsend (__NR_mq_open+2) +#define __NR_mq_timedreceive (__NR_mq_open+3) +#define __NR_mq_notify (__NR_mq_open+4) +#define __NR_mq_getsetattr (__NR_mq_open+5) +#define __NR_kexec_load 283 +#define __NR_waitid 284 +/* #define __NR_sys_setaltroot 285 */ +#define __NR_add_key 286 +#define __NR_request_key 287 +#define __NR_keyctl 288 +#define __NR_ioprio_set 289 +#define __NR_ioprio_get 290 +#define __NR_inotify_init 291 +#define __NR_inotify_add_watch 292 +#define __NR_inotify_rm_watch 293 +#define __NR_migrate_pages 294 +#define __NR_openat 295 +#define __NR_mkdirat 296 +#define __NR_mknodat 297 +#define __NR_fchownat 298 +#define __NR_futimesat 299 +#define __NR_fstatat64 300 +#define __NR_unlinkat 301 +#define __NR_renameat 302 +#define __NR_linkat 303 +#define __NR_symlinkat 304 +#define __NR_readlinkat 305 +#define __NR_fchmodat 306 +#define __NR_faccessat 307 +#define __NR_pselect6 308 +#define __NR_ppoll 309 +#define __NR_unshare 310 +#define __NR_set_robust_list 311 +#define __NR_get_robust_list 312 +#define __NR_splice 313 +#define __NR_sync_file_range 314 +#define __NR_tee 315 +#define __NR_vmsplice 316 +#define __NR_move_pages 317 +#define __NR_getcpu 318 +#define __NR_epoll_pwait 319 +#define __NR_utimensat 320 +#define __NR_signalfd 321 +#define __NR_timerfd_create 322 +#define __NR_eventfd 323 +#define __NR_fallocate 324 +#define __NR_timerfd_settime 325 +#define __NR_timerfd_gettime 326 +#define __NR_signalfd4 327 +#define __NR_eventfd2 328 +#define __NR_epoll_create1 329 +#define __NR_dup3 330 +#define __NR_pipe2 331 +#define __NR_inotify_init1 332 + +#ifdef __KERNEL__ + +#define NR_syscalls 333 + +#define __ARCH_WANT_IPC_PARSE_VERSION +/* #define __ARCH_WANT_OLD_READDIR */ +#define __ARCH_WANT_OLD_STAT +#define __ARCH_WANT_STAT64 +#define __ARCH_WANT_SYS_ALARM +/* #define __ARCH_WANT_SYS_GETHOSTNAME */ +#define __ARCH_WANT_SYS_PAUSE +/* #define __ARCH_WANT_SYS_SGETMASK */ +/* #define __ARCH_WANT_SYS_SIGNAL */ +#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_SYS_UTIME +#define __ARCH_WANT_SYS_WAITPID +#define __ARCH_WANT_SYS_SOCKETCALL +#define __ARCH_WANT_SYS_FADVISE64 +#define __ARCH_WANT_SYS_GETPGRP +#define __ARCH_WANT_SYS_LLSEEK +#define __ARCH_WANT_SYS_NICE +/* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */ +#define __ARCH_WANT_SYS_OLDUMOUNT +/* #define __ARCH_WANT_SYS_SIGPENDING */ +#define __ARCH_WANT_SYS_SIGPROCMASK +#define __ARCH_WANT_SYS_RT_SIGACTION +#define __ARCH_WANT_SYS_RT_SIGSUSPEND + +/* + * "Conditional" syscalls + * + * What we want is __attribute__((weak,alias("sys_ni_syscall"))), + * but it doesn't work on all toolchains, so we just do it by hand + */ +#ifndef cond_syscall +#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif + +#endif /* __KERNEL__ */ +#endif /* _ASM_UNISTD_H_ */ diff --git a/arch/frv/include/asm/user.h b/arch/frv/include/asm/user.h new file mode 100644 index 0000000..82fa8fa --- /dev/null +++ b/arch/frv/include/asm/user.h @@ -0,0 +1,80 @@ +/* user.h: FR-V core file format stuff + * + * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_USER_H +#define _ASM_USER_H + +#include +#include + +/* Core file format: The core file is written in such a way that gdb + * can understand it and provide useful information to the user (under + * linux we use the 'trad-core' bfd). There are quite a number of + * obstacles to being able to view the contents of the floating point + * registers, and until these are solved you will not be able to view + * the contents of them. Actually, you can read in the core file and + * look at the contents of the user struct to find out what the + * floating point registers contain. + * + * The actual file contents are as follows: + * UPAGE: + * 1 page consisting of a user struct that tells gdb what is present + * in the file. Directly after this is a copy of the task_struct, + * which is currently not used by gdb, but it may come in useful at + * some point. All of the registers are stored as part of the + * upage. The upage should always be only one page. + * + * DATA: + * The data area is stored. We use current->end_text to + * current->brk to pick up all of the user variables, plus any + * memory that may have been malloced. No attempt is made to + * determine if a page is demand-zero or if a page is totally + * unused, we just cover the entire range. All of the addresses are + * rounded in such a way that an integral number of pages is + * written. + * + * STACK: + * We need the stack information in order to get a meaningful + * backtrace. We need to write the data from (esp) to + * current->start_stack, so we round each of these off in order to + * be able to write an integer number of pages. The minimum core + * file size is 3 pages, or 12288 bytes. + */ + +/* When the kernel dumps core, it starts by dumping the user struct - + * this will be used by gdb to figure out where the data and stack segments + * are within the file, and what virtual addresses to use. + */ +struct user { + /* We start with the registers, to mimic the way that "memory" is returned + * from the ptrace(3,...) function. */ + struct user_context regs; + + /* The rest of this junk is to help gdb figure out what goes where */ + unsigned long u_tsize; /* Text segment size (pages). */ + unsigned long u_dsize; /* Data segment size (pages). */ + unsigned long u_ssize; /* Stack segment size (pages). */ + unsigned long start_code; /* Starting virtual address of text. */ + unsigned long start_stack; /* Starting virtual address of stack area. + * This is actually the bottom of the stack, + * the top of the stack is always found in the + * esp register. */ + long int signal; /* Signal that caused the core dump. */ + + unsigned long magic; /* To uniquely identify a core file */ + char u_comm[32]; /* User command that was responsible */ +}; + +#define NBPG PAGE_SIZE +#define UPAGES 1 +#define HOST_TEXT_START_ADDR (u.start_code) +#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) + +#endif diff --git a/arch/frv/include/asm/vga.h b/arch/frv/include/asm/vga.h new file mode 100644 index 0000000..a702c80 --- /dev/null +++ b/arch/frv/include/asm/vga.h @@ -0,0 +1,17 @@ +/* vga.h: VGA register stuff + * + * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ + +#ifndef _ASM_VGA_H +#define _ASM_VGA_H + + + +#endif /* _ASM_VGA_H */ diff --git a/arch/frv/include/asm/virtconvert.h b/arch/frv/include/asm/virtconvert.h new file mode 100644 index 0000000..59788fa --- /dev/null +++ b/arch/frv/include/asm/virtconvert.h @@ -0,0 +1,41 @@ +/* virtconvert.h: virtual/physical/page address convertion + * + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * 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. + */ +#ifndef _ASM_VIRTCONVERT_H +#define _ASM_VIRTCONVERT_H + +/* + * Macros used for converting between virtual and physical mappings. + */ + +#ifdef __KERNEL__ + +#include + +#ifdef CONFIG_MMU + +#define phys_to_virt(vaddr) ((void *) ((unsigned long)(vaddr) + PAGE_OFFSET)) +#define virt_to_phys(vaddr) ((unsigned long) (vaddr) - PAGE_OFFSET) + +#else + +#define phys_to_virt(vaddr) ((void *) (vaddr)) +#define virt_to_phys(vaddr) ((unsigned long) (vaddr)) + +#endif + +#define virt_to_bus virt_to_phys +#define bus_to_virt phys_to_virt + +#define __page_address(page) (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT)) +#define page_to_phys(page) virt_to_phys((void *)__page_address(page)) + +#endif +#endif diff --git a/arch/frv/include/asm/xor.h b/arch/frv/include/asm/xor.h new file mode 100644 index 0000000..c82eb12 --- /dev/null +++ b/arch/frv/include/asm/xor.h @@ -0,0 +1 @@ +#include diff --git a/include/asm-frv/Kbuild b/include/asm-frv/Kbuild deleted file mode 100644 index 0f8956d..0000000 --- a/include/asm-frv/Kbuild +++ /dev/null @@ -1,5 +0,0 @@ -include include/asm-generic/Kbuild.asm - -header-y += registers.h - -unifdef-y += termios.h diff --git a/include/asm-frv/atomic.h b/include/asm-frv/atomic.h deleted file mode 100644 index 296c35c..0000000 --- a/include/asm-frv/atomic.h +++ /dev/null @@ -1,198 +0,0 @@ -/* atomic.h: atomic operation emulation for FR-V - * - * For an explanation of how atomic ops work in this arch, see: - * Documentation/frv/atomic-ops.txt - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_ATOMIC_H -#define _ASM_ATOMIC_H - -#include -#include -#include - -#ifdef CONFIG_SMP -#error not SMP safe -#endif - -/* - * Atomic operations that C can't guarantee us. Useful for - * resource counting etc.. - * - * We do not have SMP systems, so we don't have to deal with that. - */ - -/* Atomic operations are already serializing */ -#define smp_mb__before_atomic_dec() barrier() -#define smp_mb__after_atomic_dec() barrier() -#define smp_mb__before_atomic_inc() barrier() -#define smp_mb__after_atomic_inc() barrier() - -#define ATOMIC_INIT(i) { (i) } -#define atomic_read(v) ((v)->counter) -#define atomic_set(v, i) (((v)->counter) = (i)) - -#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS -static inline int atomic_add_return(int i, atomic_t *v) -{ - unsigned long val; - - asm("0: \n" - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ - " ckeq icc3,cc7 \n" - " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ - " add%I2 %1,%2,%1 \n" - " cst.p %1,%M0 ,cc3,#1 \n" - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ - " beq icc3,#0,0b \n" - : "+U"(v->counter), "=&r"(val) - : "NPr"(i) - : "memory", "cc7", "cc3", "icc3" - ); - - return val; -} - -static inline int atomic_sub_return(int i, atomic_t *v) -{ - unsigned long val; - - asm("0: \n" - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ - " ckeq icc3,cc7 \n" - " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ - " sub%I2 %1,%2,%1 \n" - " cst.p %1,%M0 ,cc3,#1 \n" - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ - " beq icc3,#0,0b \n" - : "+U"(v->counter), "=&r"(val) - : "NPr"(i) - : "memory", "cc7", "cc3", "icc3" - ); - - return val; -} - -#else - -extern int atomic_add_return(int i, atomic_t *v); -extern int atomic_sub_return(int i, atomic_t *v); - -#endif - -static inline int atomic_add_negative(int i, atomic_t *v) -{ - return atomic_add_return(i, v) < 0; -} - -static inline void atomic_add(int i, atomic_t *v) -{ - atomic_add_return(i, v); -} - -static inline void atomic_sub(int i, atomic_t *v) -{ - atomic_sub_return(i, v); -} - -static inline void atomic_inc(atomic_t *v) -{ - atomic_add_return(1, v); -} - -static inline void atomic_dec(atomic_t *v) -{ - atomic_sub_return(1, v); -} - -#define atomic_dec_return(v) atomic_sub_return(1, (v)) -#define atomic_inc_return(v) atomic_add_return(1, (v)) - -#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) -#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) -#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) - -/*****************************************************************************/ -/* - * exchange value with memory - */ -#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS - -#define xchg(ptr, x) \ -({ \ - __typeof__(ptr) __xg_ptr = (ptr); \ - __typeof__(*(ptr)) __xg_orig; \ - \ - switch (sizeof(__xg_orig)) { \ - case 4: \ - asm volatile( \ - "swap%I0 %M0,%1" \ - : "+m"(*__xg_ptr), "=r"(__xg_orig) \ - : "1"(x) \ - : "memory" \ - ); \ - break; \ - \ - default: \ - __xg_orig = (__typeof__(__xg_orig))0; \ - asm volatile("break"); \ - break; \ - } \ - \ - __xg_orig; \ -}) - -#else - -extern uint32_t __xchg_32(uint32_t i, volatile void *v); - -#define xchg(ptr, x) \ -({ \ - __typeof__(ptr) __xg_ptr = (ptr); \ - __typeof__(*(ptr)) __xg_orig; \ - \ - switch (sizeof(__xg_orig)) { \ - case 4: __xg_orig = (__typeof__(*(ptr))) __xchg_32((uint32_t) x, __xg_ptr); break; \ - default: \ - __xg_orig = (__typeof__(__xg_orig))0; \ - asm volatile("break"); \ - break; \ - } \ - __xg_orig; \ -}) - -#endif - -#define tas(ptr) (xchg((ptr), 1)) - -#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new)) -#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) - -static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) -{ - int c, old; - c = atomic_read(v); - for (;;) { - if (unlikely(c == (u))) - break; - old = atomic_cmpxchg((v), c, c + (a)); - if (likely(old == c)) - break; - c = old; - } - return c != (u); -} - -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) - -#include -#endif /* _ASM_ATOMIC_H */ diff --git a/include/asm-frv/auxvec.h b/include/asm-frv/auxvec.h deleted file mode 100644 index 0771077..0000000 --- a/include/asm-frv/auxvec.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __FRV_AUXVEC_H -#define __FRV_AUXVEC_H - -#endif diff --git a/include/asm-frv/ax88796.h b/include/asm-frv/ax88796.h deleted file mode 100644 index 637e980..0000000 --- a/include/asm-frv/ax88796.h +++ /dev/null @@ -1,22 +0,0 @@ -/* ax88796.h: access points to the driver for the AX88796 NE2000 clone - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_AX88796_H -#define _ASM_AX88796_H - -#include - -#define AX88796_IOADDR (__region_CS1 + 0x200) -#define AX88796_IRQ IRQ_CPU_EXTERNAL7 -#define AX88796_FULL_DUPLEX 0 /* force full duplex */ -#define AX88796_BUS_INFO "CS1#+0x200" /* bus info for ethtool */ - -#endif /* _ASM_AX88796_H */ diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h deleted file mode 100644 index 287f6f6..0000000 --- a/include/asm-frv/bitops.h +++ /dev/null @@ -1,412 +0,0 @@ -/* bitops.h: bit operations for the Fujitsu FR-V CPUs - * - * For an explanation of how atomic ops work in this arch, see: - * Documentation/frv/atomic-ops.txt - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_BITOPS_H -#define _ASM_BITOPS_H - -#include -#include - -#ifdef __KERNEL__ - -#ifndef _LINUX_BITOPS_H -#error only can be included directly -#endif - -#include - -/* - * clear_bit() doesn't provide any barrier for the compiler. - */ -#define smp_mb__before_clear_bit() barrier() -#define smp_mb__after_clear_bit() barrier() - -#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS -static inline -unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v) -{ - unsigned long old, tmp; - - asm volatile( - "0: \n" - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ - " ckeq icc3,cc7 \n" - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ - " and%I3 %1,%3,%2 \n" - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ - " beq icc3,#0,0b \n" - : "+U"(*v), "=&r"(old), "=r"(tmp) - : "NPr"(~mask) - : "memory", "cc7", "cc3", "icc3" - ); - - return old; -} - -static inline -unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v) -{ - unsigned long old, tmp; - - asm volatile( - "0: \n" - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ - " ckeq icc3,cc7 \n" - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ - " or%I3 %1,%3,%2 \n" - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ - " beq icc3,#0,0b \n" - : "+U"(*v), "=&r"(old), "=r"(tmp) - : "NPr"(mask) - : "memory", "cc7", "cc3", "icc3" - ); - - return old; -} - -static inline -unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v) -{ - unsigned long old, tmp; - - asm volatile( - "0: \n" - " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ - " ckeq icc3,cc7 \n" - " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ - " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ - " xor%I3 %1,%3,%2 \n" - " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ - " beq icc3,#0,0b \n" - : "+U"(*v), "=&r"(old), "=r"(tmp) - : "NPr"(mask) - : "memory", "cc7", "cc3", "icc3" - ); - - return old; -} - -#else - -extern unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v); -extern unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v); -extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v); - -#endif - -#define atomic_clear_mask(mask, v) atomic_test_and_ANDNOT_mask((mask), (v)) -#define atomic_set_mask(mask, v) atomic_test_and_OR_mask((mask), (v)) - -static inline int test_and_clear_bit(int nr, volatile void *addr) -{ - volatile unsigned long *ptr = addr; - unsigned long mask = 1UL << (nr & 31); - ptr += nr >> 5; - return (atomic_test_and_ANDNOT_mask(mask, ptr) & mask) != 0; -} - -static inline int test_and_set_bit(int nr, volatile void *addr) -{ - volatile unsigned long *ptr = addr; - unsigned long mask = 1UL << (nr & 31); - ptr += nr >> 5; - return (atomic_test_and_OR_mask(mask, ptr) & mask) != 0; -} - -static inline int test_and_change_bit(int nr, volatile void *addr) -{ - volatile unsigned long *ptr = addr; - unsigned long mask = 1UL << (nr & 31); - ptr += nr >> 5; - return (atomic_test_and_XOR_mask(mask, ptr) & mask) != 0; -} - -static inline void clear_bit(int nr, volatile void *addr) -{ - test_and_clear_bit(nr, addr); -} - -static inline void set_bit(int nr, volatile void *addr) -{ - test_and_set_bit(nr, addr); -} - -static inline void change_bit(int nr, volatile void * addr) -{ - test_and_change_bit(nr, addr); -} - -static inline void __clear_bit(int nr, volatile void * addr) -{ - volatile unsigned long *a = addr; - int mask; - - a += nr >> 5; - mask = 1 << (nr & 31); - *a &= ~mask; -} - -static inline void __set_bit(int nr, volatile void * addr) -{ - volatile unsigned long *a = addr; - int mask; - - a += nr >> 5; - mask = 1 << (nr & 31); - *a |= mask; -} - -static inline void __change_bit(int nr, volatile void *addr) -{ - volatile unsigned long *a = addr; - int mask; - - a += nr >> 5; - mask = 1 << (nr & 31); - *a ^= mask; -} - -static inline int __test_and_clear_bit(int nr, volatile void * addr) -{ - volatile unsigned long *a = addr; - int mask, retval; - - a += nr >> 5; - mask = 1 << (nr & 31); - retval = (mask & *a) != 0; - *a &= ~mask; - return retval; -} - -static inline int __test_and_set_bit(int nr, volatile void * addr) -{ - volatile unsigned long *a = addr; - int mask, retval; - - a += nr >> 5; - mask = 1 << (nr & 31); - retval = (mask & *a) != 0; - *a |= mask; - return retval; -} - -static inline int __test_and_change_bit(int nr, volatile void * addr) -{ - volatile unsigned long *a = addr; - int mask, retval; - - a += nr >> 5; - mask = 1 << (nr & 31); - retval = (mask & *a) != 0; - *a ^= mask; - return retval; -} - -/* - * This routine doesn't need to be atomic. - */ -static inline int __constant_test_bit(int nr, const volatile void * addr) -{ - return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; -} - -static inline int __test_bit(int nr, const volatile void * addr) -{ - int * a = (int *) addr; - int mask; - - a += nr >> 5; - mask = 1 << (nr & 0x1f); - return ((mask & *a) != 0); -} - -#define test_bit(nr,addr) \ -(__builtin_constant_p(nr) ? \ - __constant_test_bit((nr),(addr)) : \ - __test_bit((nr),(addr))) - -#include - -/** - * fls - find last bit set - * @x: the word to search - * - * This is defined the same way as ffs: - * - return 32..1 to indicate bit 31..0 most significant bit set - * - return 0 to indicate no bits set - */ -#define fls(x) \ -({ \ - int bit; \ - \ - asm(" subcc %1,gr0,gr0,icc0 \n" \ - " ckne icc0,cc4 \n" \ - " cscan.p %1,gr0,%0 ,cc4,#1 \n" \ - " csub %0,%0,%0 ,cc4,#0 \n" \ - " csub %2,%0,%0 ,cc4,#1 \n" \ - : "=&r"(bit) \ - : "r"(x), "r"(32) \ - : "icc0", "cc4" \ - ); \ - \ - bit; \ -}) - -/** - * fls64 - find last bit set in a 64-bit value - * @n: the value to search - * - * This is defined the same way as ffs: - * - return 64..1 to indicate bit 63..0 most significant bit set - * - return 0 to indicate no bits set - */ -static inline __attribute__((const)) -int fls64(u64 n) -{ - union { - u64 ll; - struct { u32 h, l; }; - } _; - int bit, x, y; - - _.ll = n; - - asm(" subcc.p %3,gr0,gr0,icc0 \n" - " subcc %4,gr0,gr0,icc1 \n" - " ckne icc0,cc4 \n" - " ckne icc1,cc5 \n" - " norcr cc4,cc5,cc6 \n" - " csub.p %0,%0,%0 ,cc6,1 \n" - " orcr cc5,cc4,cc4 \n" - " andcr cc4,cc5,cc4 \n" - " cscan.p %3,gr0,%0 ,cc4,0 \n" - " setlos #64,%1 \n" - " cscan.p %4,gr0,%0 ,cc4,1 \n" - " setlos #32,%2 \n" - " csub.p %1,%0,%0 ,cc4,0 \n" - " csub %2,%0,%0 ,cc4,1 \n" - : "=&r"(bit), "=r"(x), "=r"(y) - : "0r"(_.h), "r"(_.l) - : "icc0", "icc1", "cc4", "cc5", "cc6" - ); - return bit; - -} - -/** - * ffs - find first bit set - * @x: the word to search - * - * - return 32..1 to indicate bit 31..0 most least significant bit set - * - return 0 to indicate no bits set - */ -static inline __attribute__((const)) -int ffs(int x) -{ - /* Note: (x & -x) gives us a mask that is the least significant - * (rightmost) 1-bit of the value in x. - */ - return fls(x & -x); -} - -/** - * __ffs - find first bit set - * @x: the word to search - * - * - return 31..0 to indicate bit 31..0 most least significant bit set - * - if no bits are set in x, the result is undefined - */ -static inline __attribute__((const)) -int __ffs(unsigned long x) -{ - int bit; - asm("scan %1,gr0,%0" : "=r"(bit) : "r"(x & -x)); - return 31 - bit; -} - -/** - * __fls - find last (most-significant) set bit in a long word - * @word: the word to search - * - * Undefined if no set bit exists, so code should check against 0 first. - */ -static inline unsigned long __fls(unsigned long word) -{ - unsigned long bit; - asm("scan %1,gr0,%0" : "=r"(bit) : "r"(word)); - return bit; -} - -/* - * special slimline version of fls() for calculating ilog2_u32() - * - note: no protection against n == 0 - */ -#define ARCH_HAS_ILOG2_U32 -static inline __attribute__((const)) -int __ilog2_u32(u32 n) -{ - int bit; - asm("scan %1,gr0,%0" : "=r"(bit) : "r"(n)); - return 31 - bit; -} - -/* - * special slimline version of fls64() for calculating ilog2_u64() - * - note: no protection against n == 0 - */ -#define ARCH_HAS_ILOG2_U64 -static inline __attribute__((const)) -int __ilog2_u64(u64 n) -{ - union { - u64 ll; - struct { u32 h, l; }; - } _; - int bit, x, y; - - _.ll = n; - - asm(" subcc %3,gr0,gr0,icc0 \n" - " ckeq icc0,cc4 \n" - " cscan.p %3,gr0,%0 ,cc4,0 \n" - " setlos #63,%1 \n" - " cscan.p %4,gr0,%0 ,cc4,1 \n" - " setlos #31,%2 \n" - " csub.p %1,%0,%0 ,cc4,0 \n" - " csub %2,%0,%0 ,cc4,1 \n" - : "=&r"(bit), "=r"(x), "=r"(y) - : "0r"(_.h), "r"(_.l) - : "icc0", "cc4" - ); - return bit; -} - -#include -#include -#include - -#include - -#define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr)) -#define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr)) - -#include - -#endif /* __KERNEL__ */ - -#endif /* _ASM_BITOPS_H */ diff --git a/include/asm-frv/bug.h b/include/asm-frv/bug.h deleted file mode 100644 index 6b1b44d..0000000 --- a/include/asm-frv/bug.h +++ /dev/null @@ -1,53 +0,0 @@ -/* bug.h: FRV bug trapping - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_BUG_H -#define _ASM_BUG_H - -#include - -#ifdef CONFIG_BUG -/* - * Tell the user there is some problem. - */ -extern asmlinkage void __debug_bug_trap(int signr); - -#ifdef CONFIG_NO_KERNEL_MSG -#define _debug_bug_printk() -#else -extern void __debug_bug_printk(const char *file, unsigned line); -#define _debug_bug_printk() __debug_bug_printk(__FILE__, __LINE__) -#endif - -#define _debug_bug_trap(signr) \ -do { \ - __debug_bug_trap(signr); \ - asm volatile("nop"); \ -} while(0) - -#define HAVE_ARCH_BUG -#define BUG() \ -do { \ - _debug_bug_printk(); \ - _debug_bug_trap(6 /*SIGABRT*/); \ -} while (0) - -#ifdef CONFIG_GDBSTUB -#define HAVE_ARCH_KGDB_RAISE -#define kgdb_raise(signr) do { _debug_bug_trap(signr); } while(0) - -#define HAVE_ARCH_KGDB_BAD_PAGE -#define kgdb_bad_page(page) do { kgdb_raise(SIGABRT); } while(0) -#endif -#endif - -#include - -#endif diff --git a/include/asm-frv/bugs.h b/include/asm-frv/bugs.h deleted file mode 100644 index f2382be..0000000 --- a/include/asm-frv/bugs.h +++ /dev/null @@ -1,14 +0,0 @@ -/* bugs.h: arch bug checking entry - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -static inline void check_bugs(void) -{ -} diff --git a/include/asm-frv/busctl-regs.h b/include/asm-frv/busctl-regs.h deleted file mode 100644 index bb0ff48..0000000 --- a/include/asm-frv/busctl-regs.h +++ /dev/null @@ -1,41 +0,0 @@ -/* busctl-regs.h: FR400-series CPU bus controller registers - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_BUSCTL_REGS_H -#define _ASM_BUSCTL_REGS_H - -/* bus controller registers */ -#define __get_LGCR() ({ *(volatile unsigned long *)(0xfe000010); }) -#define __get_LMAICR() ({ *(volatile unsigned long *)(0xfe000030); }) -#define __get_LEMBR() ({ *(volatile unsigned long *)(0xfe000040); }) -#define __get_LEMAM() ({ *(volatile unsigned long *)(0xfe000048); }) -#define __get_LCR(R) ({ *(volatile unsigned long *)(0xfe000100 + 8*(R)); }) -#define __get_LSBR(R) ({ *(volatile unsigned long *)(0xfe000c00 + 8*(R)); }) -#define __get_LSAM(R) ({ *(volatile unsigned long *)(0xfe000d00 + 8*(R)); }) - -#define __set_LGCR(V) do { *(volatile unsigned long *)(0xfe000010) = (V); } while(0) -#define __set_LMAICR(V) do { *(volatile unsigned long *)(0xfe000030) = (V); } while(0) -#define __set_LEMBR(V) do { *(volatile unsigned long *)(0xfe000040) = (V); } while(0) -#define __set_LEMAM(V) do { *(volatile unsigned long *)(0xfe000048) = (V); } while(0) -#define __set_LCR(R,V) do { *(volatile unsigned long *)(0xfe000100 + 8*(R)) = (V); } while(0) -#define __set_LSBR(R,V) do { *(volatile unsigned long *)(0xfe000c00 + 8*(R)) = (V); } while(0) -#define __set_LSAM(R,V) do { *(volatile unsigned long *)(0xfe000d00 + 8*(R)) = (V); } while(0) - -/* FR401 SDRAM controller registers */ -#define __get_DBR(R) ({ *(volatile unsigned long *)(0xfe000e00 + 8*(R)); }) -#define __get_DAM(R) ({ *(volatile unsigned long *)(0xfe000f00 + 8*(R)); }) - -/* FR551 SDRAM controller registers */ -#define __get_DARS(R) ({ *(volatile unsigned long *)(0xfeff0100 + 8*(R)); }) -#define __get_DAMK(R) ({ *(volatile unsigned long *)(0xfeff0110 + 8*(R)); }) - - -#endif /* _ASM_BUSCTL_REGS_H */ diff --git a/include/asm-frv/byteorder.h b/include/asm-frv/byteorder.h deleted file mode 100644 index f29b759..0000000 --- a/include/asm-frv/byteorder.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_BYTEORDER_H -#define _ASM_BYTEORDER_H - -#include - -#endif /* _ASM_BYTEORDER_H */ diff --git a/include/asm-frv/cache.h b/include/asm-frv/cache.h deleted file mode 100644 index 2797163..0000000 --- a/include/asm-frv/cache.h +++ /dev/null @@ -1,23 +0,0 @@ -/* cache.h: FRV cache definitions - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef __ASM_CACHE_H -#define __ASM_CACHE_H - - -/* bytes per L1 cache line */ -#define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) -#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) - -#define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) -#define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) - -#endif diff --git a/include/asm-frv/cacheflush.h b/include/asm-frv/cacheflush.h deleted file mode 100644 index 432a69e..0000000 --- a/include/asm-frv/cacheflush.h +++ /dev/null @@ -1,104 +0,0 @@ -/* cacheflush.h: FRV cache flushing routines - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_CACHEFLUSH_H -#define _ASM_CACHEFLUSH_H - -/* Keep includes the same across arches. */ -#include - -/* - * virtually-indexed cache management (our cache is physically indexed) - */ -#define flush_cache_all() do {} while(0) -#define flush_cache_mm(mm) do {} while(0) -#define flush_cache_dup_mm(mm) do {} while(0) -#define flush_cache_range(mm, start, end) do {} while(0) -#define flush_cache_page(vma, vmaddr, pfn) do {} while(0) -#define flush_cache_vmap(start, end) do {} while(0) -#define flush_cache_vunmap(start, end) do {} while(0) -#define flush_dcache_mmap_lock(mapping) do {} while(0) -#define flush_dcache_mmap_unlock(mapping) do {} while(0) - -/* - * physically-indexed cache management - * - see arch/frv/lib/cache.S - */ -extern void frv_dcache_writeback(unsigned long start, unsigned long size); -extern void frv_cache_invalidate(unsigned long start, unsigned long size); -extern void frv_icache_invalidate(unsigned long start, unsigned long size); -extern void frv_cache_wback_inv(unsigned long start, unsigned long size); - -static inline void __flush_cache_all(void) -{ - asm volatile(" dcef @(gr0,gr0),#1 \n" - " icei @(gr0,gr0),#1 \n" - " membar \n" - : : : "memory" - ); -} - -/* dcache/icache coherency... */ -#ifdef CONFIG_MMU -extern void flush_dcache_page(struct page *page); -#else -static inline void flush_dcache_page(struct page *page) -{ - unsigned long addr = page_to_phys(page); - frv_dcache_writeback(addr, addr + PAGE_SIZE); -} -#endif - -static inline void flush_page_to_ram(struct page *page) -{ - flush_dcache_page(page); -} - -static inline void flush_icache(void) -{ - __flush_cache_all(); -} - -static inline void flush_icache_range(unsigned long start, unsigned long end) -{ - frv_cache_wback_inv(start, end); -} - -#ifdef CONFIG_MMU -extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, - unsigned long start, unsigned long len); -#else -static inline void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, - unsigned long start, unsigned long len) -{ - frv_cache_wback_inv(start, start + len); -} -#endif - -static inline void flush_icache_page(struct vm_area_struct *vma, struct page *page) -{ - flush_icache_user_range(vma, page, page_to_phys(page), PAGE_SIZE); -} - -/* - * permit ptrace to access another process's address space through the icache - * and the dcache - */ -#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ -do { \ - memcpy((dst), (src), (len)); \ - flush_icache_user_range((vma), (page), (vaddr), (len)); \ -} while(0) - -#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ - memcpy((dst), (src), (len)) - -#endif /* _ASM_CACHEFLUSH_H */ diff --git a/include/asm-frv/checksum.h b/include/asm-frv/checksum.h deleted file mode 100644 index 269da09..0000000 --- a/include/asm-frv/checksum.h +++ /dev/null @@ -1,180 +0,0 @@ -/* checksum.h: FRV checksumming - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_CHECKSUM_H -#define _ASM_CHECKSUM_H - -#include - -/* - * computes the checksum of a memory block at buff, length len, - * and adds in "sum" (32-bit) - * - * returns a 32-bit number suitable for feeding into itself - * or csum_tcpudp_magic - * - * this function must be called with even lengths, except - * for the last fragment, which may be odd - * - * it's best to have buff aligned on a 32-bit boundary - */ -__wsum csum_partial(const void *buff, int len, __wsum sum); - -/* - * the same as csum_partial, but copies from src while it - * checksums - * - * here even more important to align src and dst on a 32-bit (or even - * better 64-bit) boundary - */ -__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum); - -/* - * the same as csum_partial_copy, but copies from user space. - * - * here even more important to align src and dst on a 32-bit (or even - * better 64-bit) boundary - */ -extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst, - int len, __wsum sum, int *csum_err); - -/* - * This is a version of ip_compute_csum() optimized for IP headers, - * which always checksum on 4 octet boundaries. - * - */ -static inline -__sum16 ip_fast_csum(const void *iph, unsigned int ihl) -{ - unsigned int tmp, inc, sum = 0; - - asm(" addcc gr0,gr0,gr0,icc0\n" /* clear icc0.C */ - " subi %1,#4,%1 \n" - "0: \n" - " ldu.p @(%1,%3),%4 \n" - " subicc %2,#1,%2,icc1 \n" - " addxcc.p %4,%0,%0,icc0 \n" - " bhi icc1,#2,0b \n" - - /* fold the 33-bit result into 16-bits */ - " addxcc gr0,%0,%0,icc0 \n" - " srli %0,#16,%1 \n" - " sethi #0,%0 \n" - " add %1,%0,%0 \n" - " srli %0,#16,%1 \n" - " add %1,%0,%0 \n" - - : "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (inc), "=&r"(tmp) - : "0" (sum), "1" (iph), "2" (ihl), "3" (4), - "m"(*(volatile struct { int _[100]; } *)iph) - : "icc0", "icc1", "memory" - ); - - return (__force __sum16)~sum; -} - -/* - * Fold a partial checksum - */ -static inline __sum16 csum_fold(__wsum sum) -{ - unsigned int tmp; - - asm(" srli %0,#16,%1 \n" - " sethi #0,%0 \n" - " add %1,%0,%0 \n" - " srli %0,#16,%1 \n" - " add %1,%0,%0 \n" - : "=r"(sum), "=&r"(tmp) - : "0"(sum) - ); - - return (__force __sum16)~sum; -} - -/* - * computes the checksum of the TCP/UDP pseudo-header - * returns a 16-bit checksum, already complemented - */ -static inline __wsum -csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, - unsigned short proto, __wsum sum) -{ - asm(" addcc %1,%0,%0,icc0 \n" - " addxcc %2,%0,%0,icc0 \n" - " addxcc %3,%0,%0,icc0 \n" - " addxcc gr0,%0,%0,icc0 \n" - : "=r" (sum) - : "r" (daddr), "r" (saddr), "r" (len + proto), "0"(sum) - : "icc0" - ); - return sum; -} - -static inline __sum16 -csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len, - unsigned short proto, __wsum sum) -{ - return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); -} - -/* - * this routine is used for miscellaneous IP-like checksums, mainly - * in icmp.c - */ -extern __sum16 ip_compute_csum(const void *buff, int len); - -#define _HAVE_ARCH_IPV6_CSUM -static inline __sum16 -csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, - __u32 len, unsigned short proto, __wsum sum) -{ - unsigned long tmp, tmp2; - - asm(" addcc %2,%0,%0,icc0 \n" - - /* add up the source addr */ - " ldi @(%3,0),%1 \n" - " addxcc %1,%0,%0,icc0 \n" - " ldi @(%3,4),%2 \n" - " addxcc %2,%0,%0,icc0 \n" - " ldi @(%3,8),%1 \n" - " addxcc %1,%0,%0,icc0 \n" - " ldi @(%3,12),%2 \n" - " addxcc %2,%0,%0,icc0 \n" - - /* add up the dest addr */ - " ldi @(%4,0),%1 \n" - " addxcc %1,%0,%0,icc0 \n" - " ldi @(%4,4),%2 \n" - " addxcc %2,%0,%0,icc0 \n" - " ldi @(%4,8),%1 \n" - " addxcc %1,%0,%0,icc0 \n" - " ldi @(%4,12),%2 \n" - " addxcc %2,%0,%0,icc0 \n" - - /* fold the 33-bit result into 16-bits */ - " addxcc gr0,%0,%0,icc0 \n" - " srli %0,#16,%1 \n" - " sethi #0,%0 \n" - " add %1,%0,%0 \n" - " srli %0,#16,%1 \n" - " add %1,%0,%0 \n" - - : "=r" (sum), "=&r" (tmp), "=r" (tmp2) - : "r" (saddr), "r" (daddr), "0" (sum), "2" (len + proto) - : "icc0" - ); - - return (__force __sum16)~sum; -} - -#endif /* _ASM_CHECKSUM_H */ diff --git a/include/asm-frv/cpu-irqs.h b/include/asm-frv/cpu-irqs.h deleted file mode 100644 index 478f349..0000000 --- a/include/asm-frv/cpu-irqs.h +++ /dev/null @@ -1,81 +0,0 @@ -/* cpu-irqs.h: on-CPU peripheral irqs - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_CPU_IRQS_H -#define _ASM_CPU_IRQS_H - -#ifndef __ASSEMBLY__ - -/* IRQ to level mappings */ -#define IRQ_GDBSTUB_LEVEL 15 -#define IRQ_UART_LEVEL 13 - -#ifdef CONFIG_GDBSTUB_UART0 -#define IRQ_UART0_LEVEL IRQ_GDBSTUB_LEVEL -#else -#define IRQ_UART0_LEVEL IRQ_UART_LEVEL -#endif - -#ifdef CONFIG_GDBSTUB_UART1 -#define IRQ_UART1_LEVEL IRQ_GDBSTUB_LEVEL -#else -#define IRQ_UART1_LEVEL IRQ_UART_LEVEL -#endif - -#define IRQ_DMA0_LEVEL 14 -#define IRQ_DMA1_LEVEL 14 -#define IRQ_DMA2_LEVEL 14 -#define IRQ_DMA3_LEVEL 14 -#define IRQ_DMA4_LEVEL 14 -#define IRQ_DMA5_LEVEL 14 -#define IRQ_DMA6_LEVEL 14 -#define IRQ_DMA7_LEVEL 14 - -#define IRQ_TIMER0_LEVEL 12 -#define IRQ_TIMER1_LEVEL 11 -#define IRQ_TIMER2_LEVEL 10 - -#define IRQ_XIRQ0_LEVEL 1 -#define IRQ_XIRQ1_LEVEL 2 -#define IRQ_XIRQ2_LEVEL 3 -#define IRQ_XIRQ3_LEVEL 4 -#define IRQ_XIRQ4_LEVEL 5 -#define IRQ_XIRQ5_LEVEL 6 -#define IRQ_XIRQ6_LEVEL 7 -#define IRQ_XIRQ7_LEVEL 8 - -/* IRQ IDs presented to drivers */ -#define IRQ_CPU__UNUSED IRQ_BASE_CPU -#define IRQ_CPU_UART0 (IRQ_BASE_CPU + IRQ_UART0_LEVEL) -#define IRQ_CPU_UART1 (IRQ_BASE_CPU + IRQ_UART1_LEVEL) -#define IRQ_CPU_TIMER0 (IRQ_BASE_CPU + IRQ_TIMER0_LEVEL) -#define IRQ_CPU_TIMER1 (IRQ_BASE_CPU + IRQ_TIMER1_LEVEL) -#define IRQ_CPU_TIMER2 (IRQ_BASE_CPU + IRQ_TIMER2_LEVEL) -#define IRQ_CPU_DMA0 (IRQ_BASE_CPU + IRQ_DMA0_LEVEL) -#define IRQ_CPU_DMA1 (IRQ_BASE_CPU + IRQ_DMA1_LEVEL) -#define IRQ_CPU_DMA2 (IRQ_BASE_CPU + IRQ_DMA2_LEVEL) -#define IRQ_CPU_DMA3 (IRQ_BASE_CPU + IRQ_DMA3_LEVEL) -#define IRQ_CPU_DMA4 (IRQ_BASE_CPU + IRQ_DMA4_LEVEL) -#define IRQ_CPU_DMA5 (IRQ_BASE_CPU + IRQ_DMA5_LEVEL) -#define IRQ_CPU_DMA6 (IRQ_BASE_CPU + IRQ_DMA6_LEVEL) -#define IRQ_CPU_DMA7 (IRQ_BASE_CPU + IRQ_DMA7_LEVEL) -#define IRQ_CPU_EXTERNAL0 (IRQ_BASE_CPU + IRQ_XIRQ0_LEVEL) -#define IRQ_CPU_EXTERNAL1 (IRQ_BASE_CPU + IRQ_XIRQ1_LEVEL) -#define IRQ_CPU_EXTERNAL2 (IRQ_BASE_CPU + IRQ_XIRQ2_LEVEL) -#define IRQ_CPU_EXTERNAL3 (IRQ_BASE_CPU + IRQ_XIRQ3_LEVEL) -#define IRQ_CPU_EXTERNAL4 (IRQ_BASE_CPU + IRQ_XIRQ4_LEVEL) -#define IRQ_CPU_EXTERNAL5 (IRQ_BASE_CPU + IRQ_XIRQ5_LEVEL) -#define IRQ_CPU_EXTERNAL6 (IRQ_BASE_CPU + IRQ_XIRQ6_LEVEL) -#define IRQ_CPU_EXTERNAL7 (IRQ_BASE_CPU + IRQ_XIRQ7_LEVEL) - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_CPU_IRQS_H */ diff --git a/include/asm-frv/cpumask.h b/include/asm-frv/cpumask.h deleted file mode 100644 index d999c20..0000000 --- a/include/asm-frv/cpumask.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_CPUMASK_H -#define _ASM_CPUMASK_H - -#include - -#endif /* _ASM_CPUMASK_H */ diff --git a/include/asm-frv/cputime.h b/include/asm-frv/cputime.h deleted file mode 100644 index f6c373a..0000000 --- a/include/asm-frv/cputime.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_CPUTIME_H -#define _ASM_CPUTIME_H - -#include - -#endif /* _ASM_CPUTIME_H */ diff --git a/include/asm-frv/current.h b/include/asm-frv/current.h deleted file mode 100644 index 86b0274..0000000 --- a/include/asm-frv/current.h +++ /dev/null @@ -1,30 +0,0 @@ -/* current.h: FRV current task pointer - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_CURRENT_H -#define _ASM_CURRENT_H - -#ifndef __ASSEMBLY__ - -/* - * dedicate GR29 to keeping the current task pointer - */ -register struct task_struct *current asm("gr29"); - -#define get_current() current - -#else - -#define CURRENT gr29 - -#endif - -#endif /* _ASM_CURRENT_H */ diff --git a/include/asm-frv/delay.h b/include/asm-frv/delay.h deleted file mode 100644 index 597b4eb..0000000 --- a/include/asm-frv/delay.h +++ /dev/null @@ -1,50 +0,0 @@ -/* delay.h: FRV delay code - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_DELAY_H -#define _ASM_DELAY_H - -#include -#include - -/* - * delay loop - runs at __core_clock_speed_HZ / 2 [there are 2 insns in the loop] - */ -extern unsigned long __delay_loops_MHz; - -static inline void __delay(unsigned long loops) -{ - asm volatile("1: subicc %0,#1,%0,icc0 \n" - " bnc icc0,#2,1b \n" - : "=r" (loops) - : "0" (loops) - : "icc0" - ); -} - -/* - * Use only for very small delays ( < 1 msec). Should probably use a - * lookup table, really, as the multiplications take much too long with - * short delays. This is a "reasonable" implementation, though (and the - * first constant multiplications gets optimized away if the delay is - * a constant) - */ - -extern unsigned long loops_per_jiffy; - -static inline void udelay(unsigned long usecs) -{ - __delay(usecs * __delay_loops_MHz); -} - -#define ndelay(n) udelay((n) * 5) - -#endif /* _ASM_DELAY_H */ diff --git a/include/asm-frv/device.h b/include/asm-frv/device.h deleted file mode 100644 index d8f9872..0000000 --- a/include/asm-frv/device.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Arch specific extensions to struct device - * - * This file is released under the GPLv2 - */ -#include - diff --git a/include/asm-frv/div64.h b/include/asm-frv/div64.h deleted file mode 100644 index 6cd978c..0000000 --- a/include/asm-frv/div64.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-frv/dm9000.h b/include/asm-frv/dm9000.h deleted file mode 100644 index f6f48fd..0000000 --- a/include/asm-frv/dm9000.h +++ /dev/null @@ -1,37 +0,0 @@ -/* dm9000.h: Davicom DM9000 adapter configuration - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_DM9000_H -#define _ASM_DM9000_H - -#include - -#define DM9000_ARCH_IOBASE (__region_CS6 + 0x300) -#define DM9000_ARCH_IRQ IRQ_CPU_EXTERNAL3 /* XIRQ #3 (shared with FPGA) */ -#undef DM9000_ARCH_IRQ_ACTLOW /* IRQ pin active high */ -#define DM9000_ARCH_BUS_INFO "CS6#+0x300" /* bus info for ethtool */ - -#undef __is_PCI_IO -#define __is_PCI_IO(addr) 0 /* not PCI */ - -#undef inl -#define inl(addr) \ -({ \ - unsigned long __ioaddr = (unsigned long) addr; \ - uint32_t x = readl(__ioaddr); \ - ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | ((x >> 24) & 0xff); \ -}) - -#undef insl -#define insl(a,b,l) __insl(a,b,l,0) /* don't byte-swap */ - - -#endif /* _ASM_DM9000_H */ diff --git a/include/asm-frv/dma-mapping.h b/include/asm-frv/dma-mapping.h deleted file mode 100644 index b289887..0000000 --- a/include/asm-frv/dma-mapping.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef _ASM_DMA_MAPPING_H -#define _ASM_DMA_MAPPING_H - -#include -#include -#include -#include -#include - -#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) -#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) - -extern unsigned long __nongprelbss dma_coherent_mem_start; -extern unsigned long __nongprelbss dma_coherent_mem_end; - -void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp); -void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle); - -/* - * Map a single buffer of the indicated size for DMA in streaming mode. - * The 32-bit bus address to use is returned. - * - * Once the device is given the dma address, the device owns this memory - * until either pci_unmap_single or pci_dma_sync_single is performed. - */ -extern dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, - enum dma_data_direction direction); - -/* - * Unmap a single streaming mode DMA translation. The dma_addr and size - * must match what was provided for in a previous pci_map_single call. All - * other usages are undefined. - * - * After this call, reads by the cpu to the buffer are guarenteed to see - * whatever the device wrote there. - */ -static inline -void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); -} - -/* - * Map a set of buffers described by scatterlist in streaming - * mode for DMA. This is the scather-gather version of the - * above pci_map_single interface. Here the scatter gather list - * elements are each tagged with the appropriate dma address - * and length. They are obtained via sg_dma_{address,length}(SG). - * - * NOTE: An implementation may be able to use a smaller number of - * DMA address/length pairs than there are SG table elements. - * (for example via virtual mapping capabilities) - * The routine returns the number of addr/length pairs actually - * used, at most nents. - * - * Device ownership issues as mentioned above for pci_map_single are - * the same here. - */ -extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, - enum dma_data_direction direction); - -/* - * Unmap a set of streaming mode DMA translations. - * Again, cpu read rules concerning calls here are the same as for - * pci_unmap_single() above. - */ -static inline -void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); -} - -extern -dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, - size_t size, enum dma_data_direction direction); - -static inline -void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); -} - - -static inline -void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, - enum dma_data_direction direction) -{ -} - -static inline -void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, - enum dma_data_direction direction) -{ - flush_write_buffers(); -} - -static inline -void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, - unsigned long offset, size_t size, - enum dma_data_direction direction) -{ -} - -static inline -void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, - unsigned long offset, size_t size, - enum dma_data_direction direction) -{ - flush_write_buffers(); -} - -static inline -void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, - enum dma_data_direction direction) -{ -} - -static inline -void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, - enum dma_data_direction direction) -{ - flush_write_buffers(); -} - -static inline -int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) -{ - return 0; -} - -static inline -int dma_supported(struct device *dev, u64 mask) -{ - /* - * we fall back to GFP_DMA when the mask isn't all 1s, - * so we can't guarantee allocations that must be - * within a tighter range than GFP_DMA.. - */ - if (mask < 0x00ffffff) - return 0; - - return 1; -} - -static inline -int dma_set_mask(struct device *dev, u64 mask) -{ - if (!dev->dma_mask || !dma_supported(dev, mask)) - return -EIO; - - *dev->dma_mask = mask; - - return 0; -} - -static inline -int dma_get_cache_alignment(void) -{ - return 1 << L1_CACHE_SHIFT; -} - -#define dma_is_consistent(d, h) (1) - -static inline -void dma_cache_sync(struct device *dev, void *vaddr, size_t size, - enum dma_data_direction direction) -{ - flush_write_buffers(); -} - -#endif /* _ASM_DMA_MAPPING_H */ diff --git a/include/asm-frv/dma.h b/include/asm-frv/dma.h deleted file mode 100644 index 683c47d..0000000 --- a/include/asm-frv/dma.h +++ /dev/null @@ -1,125 +0,0 @@ -/* dma.h: FRV DMA controller management - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_DMA_H -#define _ASM_DMA_H - -//#define DMA_DEBUG 1 - -#include - -#undef MAX_DMA_CHANNELS /* don't use kernel/dma.c */ - -/* under 2.4 this is actually needed by the new bootmem allocator */ -#define MAX_DMA_ADDRESS PAGE_OFFSET - -/* - * FRV DMA controller management - */ -typedef irqreturn_t (*dma_irq_handler_t)(int dmachan, unsigned long cstr, void *data); - -extern void frv_dma_init(void); - -extern int frv_dma_open(const char *devname, - unsigned long dmamask, - int dmacap, - dma_irq_handler_t handler, - unsigned long irq_flags, - void *data); - -/* channels required */ -#define FRV_DMA_MASK_ANY ULONG_MAX /* any channel */ - -/* capabilities required */ -#define FRV_DMA_CAP_DREQ 0x01 /* DMA request pin */ -#define FRV_DMA_CAP_DACK 0x02 /* DMA ACK pin */ -#define FRV_DMA_CAP_DONE 0x04 /* DMA done pin */ - -extern void frv_dma_close(int dma); - -extern void frv_dma_config(int dma, unsigned long ccfr, unsigned long cctr, unsigned long apr); - -extern void frv_dma_start(int dma, - unsigned long sba, unsigned long dba, - unsigned long pix, unsigned long six, unsigned long bcl); - -extern void frv_dma_restart_circular(int dma, unsigned long six); - -extern void frv_dma_stop(int dma); - -extern int is_frv_dma_interrupting(int dma); - -extern void frv_dma_dump(int dma); - -extern void frv_dma_status_clear(int dma); - -#define FRV_DMA_NCHANS 8 -#define FRV_DMA_4CHANS 4 -#define FRV_DMA_8CHANS 8 - -#define DMAC_CCFRx 0x00 /* channel configuration reg */ -#define DMAC_CCFRx_CM_SHIFT 16 -#define DMAC_CCFRx_CM_DA 0x00000000 -#define DMAC_CCFRx_CM_SCA 0x00010000 -#define DMAC_CCFRx_CM_DCA 0x00020000 -#define DMAC_CCFRx_CM_2D 0x00030000 -#define DMAC_CCFRx_ATS_SHIFT 8 -#define DMAC_CCFRx_RS_INTERN 0x00000000 -#define DMAC_CCFRx_RS_EXTERN 0x00000001 -#define DMAC_CCFRx_RS_SHIFT 0 - -#define DMAC_CSTRx 0x08 /* channel status reg */ -#define DMAC_CSTRx_FS 0x0000003f -#define DMAC_CSTRx_NE 0x00000100 -#define DMAC_CSTRx_FED 0x00000200 -#define DMAC_CSTRx_WER 0x00000800 -#define DMAC_CSTRx_RER 0x00001000 -#define DMAC_CSTRx_CE 0x00002000 -#define DMAC_CSTRx_INT 0x00800000 -#define DMAC_CSTRx_BUSY 0x80000000 - -#define DMAC_CCTRx 0x10 /* channel control reg */ -#define DMAC_CCTRx_DSIZ_1 0x00000000 -#define DMAC_CCTRx_DSIZ_2 0x00000001 -#define DMAC_CCTRx_DSIZ_4 0x00000002 -#define DMAC_CCTRx_DSIZ_32 0x00000005 -#define DMAC_CCTRx_DAU_HOLD 0x00000000 -#define DMAC_CCTRx_DAU_INC 0x00000010 -#define DMAC_CCTRx_DAU_DEC 0x00000020 -#define DMAC_CCTRx_SSIZ_1 0x00000000 -#define DMAC_CCTRx_SSIZ_2 0x00000100 -#define DMAC_CCTRx_SSIZ_4 0x00000200 -#define DMAC_CCTRx_SSIZ_32 0x00000500 -#define DMAC_CCTRx_SAU_HOLD 0x00000000 -#define DMAC_CCTRx_SAU_INC 0x00001000 -#define DMAC_CCTRx_SAU_DEC 0x00002000 -#define DMAC_CCTRx_FC 0x08000000 -#define DMAC_CCTRx_ICE 0x10000000 -#define DMAC_CCTRx_IE 0x40000000 -#define DMAC_CCTRx_ACT 0x80000000 - -#define DMAC_SBAx 0x18 /* source base address reg */ -#define DMAC_DBAx 0x20 /* data base address reg */ -#define DMAC_PIXx 0x28 /* primary index reg */ -#define DMAC_SIXx 0x30 /* secondary index reg */ -#define DMAC_BCLx 0x38 /* byte count limit reg */ -#define DMAC_APRx 0x40 /* alternate pointer reg */ - -/* - * required for PCI + MODULES - */ -#ifdef CONFIG_PCI -extern int isa_dma_bridge_buggy; -#else -#define isa_dma_bridge_buggy (0) -#endif - -#endif /* _ASM_DMA_H */ diff --git a/include/asm-frv/elf.h b/include/asm-frv/elf.h deleted file mode 100644 index 7279ec07d..0000000 --- a/include/asm-frv/elf.h +++ /dev/null @@ -1,142 +0,0 @@ -/* elf.h: FR-V ELF definitions - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from include/asm-m68knommu/elf.h - * - * 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. - */ -#ifndef __ASM_ELF_H -#define __ASM_ELF_H - -#include -#include - -struct elf32_hdr; - -/* - * ELF header e_flags defines. - */ -#define EF_FRV_GPR_MASK 0x00000003 /* mask for # of gprs */ -#define EF_FRV_GPR32 0x00000001 /* Only uses GR on 32-register */ -#define EF_FRV_GPR64 0x00000002 /* Only uses GR on 64-register */ -#define EF_FRV_FPR_MASK 0x0000000c /* mask for # of fprs */ -#define EF_FRV_FPR32 0x00000004 /* Only uses FR on 32-register */ -#define EF_FRV_FPR64 0x00000008 /* Only uses FR on 64-register */ -#define EF_FRV_FPR_NONE 0x0000000C /* Uses software floating-point */ -#define EF_FRV_DWORD_MASK 0x00000030 /* mask for dword support */ -#define EF_FRV_DWORD_YES 0x00000010 /* Assumes stack aligned to 8-byte boundaries. */ -#define EF_FRV_DWORD_NO 0x00000020 /* Assumes stack aligned to 4-byte boundaries. */ -#define EF_FRV_DOUBLE 0x00000040 /* Uses double instructions. */ -#define EF_FRV_MEDIA 0x00000080 /* Uses media instructions. */ -#define EF_FRV_PIC 0x00000100 /* Uses position independent code. */ -#define EF_FRV_NON_PIC_RELOCS 0x00000200 /* Does not use position Independent code. */ -#define EF_FRV_MULADD 0x00000400 /* -mmuladd */ -#define EF_FRV_BIGPIC 0x00000800 /* -fPIC */ -#define EF_FRV_LIBPIC 0x00001000 /* -mlibrary-pic */ -#define EF_FRV_G0 0x00002000 /* -G 0, no small data ptr */ -#define EF_FRV_NOPACK 0x00004000 /* -mnopack */ -#define EF_FRV_FDPIC 0x00008000 /* -mfdpic */ -#define EF_FRV_CPU_MASK 0xff000000 /* specific cpu bits */ -#define EF_FRV_CPU_GENERIC 0x00000000 /* Set CPU type is FR-V */ -#define EF_FRV_CPU_FR500 0x01000000 /* Set CPU type is FR500 */ -#define EF_FRV_CPU_FR300 0x02000000 /* Set CPU type is FR300 */ -#define EF_FRV_CPU_SIMPLE 0x03000000 /* SIMPLE */ -#define EF_FRV_CPU_TOMCAT 0x04000000 /* Tomcat, FR500 prototype */ -#define EF_FRV_CPU_FR400 0x05000000 /* Set CPU type is FR400 */ -#define EF_FRV_CPU_FR550 0x06000000 /* Set CPU type is FR550 */ -#define EF_FRV_CPU_FR405 0x07000000 /* Set CPU type is FR405 */ -#define EF_FRV_CPU_FR450 0x08000000 /* Set CPU type is FR450 */ - -/* - * FR-V ELF relocation types - */ - - -/* - * ELF register definitions.. - */ -typedef unsigned long elf_greg_t; - -#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) -typedef elf_greg_t elf_gregset_t[ELF_NGREG]; - -typedef struct user_fpmedia_regs elf_fpregset_t; - -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -extern int elf_check_arch(const struct elf32_hdr *hdr); - -#define elf_check_fdpic(x) ((x)->e_flags & EF_FRV_FDPIC && !((x)->e_flags & EF_FRV_NON_PIC_RELOCS)) -#define elf_check_const_displacement(x) ((x)->e_flags & EF_FRV_PIC) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS ELFCLASS32 -#define ELF_DATA ELFDATA2MSB -#define ELF_ARCH EM_FRV - -#define ELF_PLAT_INIT(_r) \ -do { \ - __kernel_frame0_ptr->gr16 = 0; \ - __kernel_frame0_ptr->gr17 = 0; \ - __kernel_frame0_ptr->gr18 = 0; \ - __kernel_frame0_ptr->gr19 = 0; \ - __kernel_frame0_ptr->gr20 = 0; \ - __kernel_frame0_ptr->gr21 = 0; \ - __kernel_frame0_ptr->gr22 = 0; \ - __kernel_frame0_ptr->gr23 = 0; \ - __kernel_frame0_ptr->gr24 = 0; \ - __kernel_frame0_ptr->gr25 = 0; \ - __kernel_frame0_ptr->gr26 = 0; \ - __kernel_frame0_ptr->gr27 = 0; \ - __kernel_frame0_ptr->gr29 = 0; \ -} while(0) - -#define ELF_FDPIC_PLAT_INIT(_regs, _exec_map_addr, _interp_map_addr, _dynamic_addr) \ -do { \ - __kernel_frame0_ptr->gr16 = _exec_map_addr; \ - __kernel_frame0_ptr->gr17 = _interp_map_addr; \ - __kernel_frame0_ptr->gr18 = _dynamic_addr; \ - __kernel_frame0_ptr->gr19 = 0; \ - __kernel_frame0_ptr->gr20 = 0; \ - __kernel_frame0_ptr->gr21 = 0; \ - __kernel_frame0_ptr->gr22 = 0; \ - __kernel_frame0_ptr->gr23 = 0; \ - __kernel_frame0_ptr->gr24 = 0; \ - __kernel_frame0_ptr->gr25 = 0; \ - __kernel_frame0_ptr->gr26 = 0; \ - __kernel_frame0_ptr->gr27 = 0; \ - __kernel_frame0_ptr->gr29 = 0; \ -} while(0) - -#define USE_ELF_CORE_DUMP -#define ELF_FDPIC_CORE_EFLAGS EF_FRV_FDPIC -#define ELF_EXEC_PAGESIZE 16384 - -/* This is the location that an ET_DYN program is loaded if exec'ed. Typical - use of this is to invoke "./ld.so someprog" to test out a new version of - the loader. We need to make sure that it is out of the way of the program - that it will "exec", and that there is sufficient room for the brk. */ - -#define ELF_ET_DYN_BASE 0x08000000UL - -/* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. */ - -#define ELF_HWCAP (0) - -/* This yields a string that ld.so will use to load implementation - specific libraries for optimization. This is more specific in - intent than poking at uname or /proc/cpuinfo. */ - -#define ELF_PLATFORM (NULL) - -#define SET_PERSONALITY(ex) set_personality(PER_LINUX) - -#endif diff --git a/include/asm-frv/emergency-restart.h b/include/asm-frv/emergency-restart.h deleted file mode 100644 index 108d8c4..0000000 --- a/include/asm-frv/emergency-restart.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_EMERGENCY_RESTART_H -#define _ASM_EMERGENCY_RESTART_H - -#include - -#endif /* _ASM_EMERGENCY_RESTART_H */ diff --git a/include/asm-frv/errno.h b/include/asm-frv/errno.h deleted file mode 100644 index d010795c..0000000 --- a/include/asm-frv/errno.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _ASM_ERRNO_H -#define _ASM_ERRNO_H - -#include - -#endif /* _ASM_ERRNO_H */ - diff --git a/include/asm-frv/fb.h b/include/asm-frv/fb.h deleted file mode 100644 index c7df380..0000000 --- a/include/asm-frv/fb.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_FB_H_ -#define _ASM_FB_H_ -#include - -#define fb_pgprotect(...) do {} while (0) - -static inline int fb_is_primary_device(struct fb_info *info) -{ - return 0; -} - -#endif /* _ASM_FB_H_ */ diff --git a/include/asm-frv/fcntl.h b/include/asm-frv/fcntl.h deleted file mode 100644 index 46ab12d..0000000 --- a/include/asm-frv/fcntl.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-frv/fpu.h b/include/asm-frv/fpu.h deleted file mode 100644 index d73c60b..0000000 --- a/include/asm-frv/fpu.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __ASM_FPU_H -#define __ASM_FPU_H - - -/* - * MAX floating point unit state size (FSAVE/FRESTORE) - */ - -#define kernel_fpu_end() do { asm volatile("bar":::"memory"); preempt_enable(); } while(0) - -#endif /* __ASM_FPU_H */ diff --git a/include/asm-frv/ftrace.h b/include/asm-frv/ftrace.h deleted file mode 100644 index 40a8c17..0000000 --- a/include/asm-frv/ftrace.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/include/asm-frv/futex.h b/include/asm-frv/futex.h deleted file mode 100644 index 08b3d1d..0000000 --- a/include/asm-frv/futex.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _ASM_FUTEX_H -#define _ASM_FUTEX_H - -#ifdef __KERNEL__ - -#include -#include -#include - -extern int futex_atomic_op_inuser(int encoded_op, int __user *uaddr); - -static inline int -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) -{ - return -ENOSYS; -} - -#endif -#endif diff --git a/include/asm-frv/gdb-stub.h b/include/asm-frv/gdb-stub.h deleted file mode 100644 index 24f9738..0000000 --- a/include/asm-frv/gdb-stub.h +++ /dev/null @@ -1,140 +0,0 @@ -/* gdb-stub.h: FRV GDB stub - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from asm-mips/gdb-stub.h (c) 1995 Andreas Busse - * - * 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. - */ -#ifndef __ASM_GDB_STUB_H -#define __ASM_GDB_STUB_H - -#undef GDBSTUB_DEBUG_PROTOCOL - -#include - -/* - * important register numbers in GDB protocol - * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7, - * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15, - * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23, - * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31, - * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39, - * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47, - * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55, - * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63, - * - FR0, FR1, FR2, FR3, FR4, FR5, FR6, FR7, - * - FR8, FR9, FR10, FR11, FR12, FR13, FR14, FR15, - * - FR16, FR17, FR18, FR19, FR20, FR21, FR22, FR23, - * - FR24, FR25, FR26, FR27, FR28, FR29, FR30, FR31, - * - FR32, FR33, FR34, FR35, FR36, FR37, FR38, FR39, - * - FR40, FR41, FR42, FR43, FR44, FR45, FR46, FR47, - * - FR48, FR49, FR50, FR51, FR52, FR53, FR54, FR55, - * - FR56, FR57, FR58, FR59, FR60, FR61, FR62, FR63, - * - PC, PSR, CCR, CCCR, - * - _X132, _X133, _X134 - * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3, - * - SCR0, SCR1, SCR2, SCR3, - * - LR, LCR, - * - IACC0H, IACC0L, - * - FSR0, - * - ACC0, ACC1, ACC2, ACC3, ACC4, ACC5, ACC6, ACC7, - * - ACCG0123, ACCG4567, - * - MSR0, MSR1, - * - GNER0, GNER1, - * - FNER0, FNER1, - */ -#define GDB_REG_GR(N) (N) -#define GDB_REG_FR(N) (64+(N)) -#define GDB_REG_PC 128 -#define GDB_REG_PSR 129 -#define GDB_REG_CCR 130 -#define GDB_REG_CCCR 131 -#define GDB_REG_TBR 135 -#define GDB_REG_BRR 136 -#define GDB_REG_DBAR(N) (137+(N)) -#define GDB_REG_SCR(N) (141+(N)) -#define GDB_REG_LR 145 -#define GDB_REG_LCR 146 -#define GDB_REG_FSR0 149 -#define GDB_REG_ACC(N) (150+(N)) -#define GDB_REG_ACCG(N) (158+(N)/4) -#define GDB_REG_MSR(N) (160+(N)) -#define GDB_REG_GNER(N) (162+(N)) -#define GDB_REG_FNER(N) (164+(N)) - -#define GDB_REG_SP GDB_REG_GR(1) -#define GDB_REG_FP GDB_REG_GR(2) - -#ifndef _LANGUAGE_ASSEMBLY - -/* - * Prototypes - */ -extern void show_registers_only(struct pt_regs *regs); - -extern void gdbstub_init(void); -extern void gdbstub(int type); -extern void gdbstub_exit(int status); - -extern void gdbstub_io_init(void); -extern void gdbstub_set_baud(unsigned baud); -extern int gdbstub_rx_char(unsigned char *_ch, int nonblock); -extern void gdbstub_tx_char(unsigned char ch); -extern void gdbstub_tx_flush(void); -extern void gdbstub_do_rx(void); - -extern asmlinkage void __debug_stub_init_break(void); -extern asmlinkage void __break_hijack_kernel_event(void); -extern asmlinkage void __break_hijack_kernel_event_breaks_here(void); -extern asmlinkage void start_kernel(void); - -extern asmlinkage void gdbstub_rx_handler(void); -extern asmlinkage void gdbstub_rx_irq(void); -extern asmlinkage void gdbstub_intercept(void); - -extern uint32_t __entry_usertrap_table[]; -extern uint32_t __entry_kerneltrap_table[]; - -extern volatile u8 gdbstub_rx_buffer[PAGE_SIZE]; -extern volatile u32 gdbstub_rx_inp; -extern volatile u32 gdbstub_rx_outp; -extern volatile u8 gdbstub_rx_overflow; -extern u8 gdbstub_rx_unget; - -extern void gdbstub_printk(const char *fmt, ...); -extern void debug_to_serial(const char *p, int n); -extern void console_set_baud(unsigned baud); - -#ifdef GDBSTUB_DEBUG_PROTOCOL -#define gdbstub_proto(FMT,...) gdbstub_printk(FMT,##__VA_ARGS__) -#else -#define gdbstub_proto(FMT,...) ({ 0; }) -#endif - -/* - * we dedicate GR31 to keeping a pointer to the gdbstub exception frame - * - gr31 is destroyed on entry to the gdbstub if !MMU - * - gr31 is saved in scr3 on entry to the gdbstub if in !MMU - */ -register struct frv_frame0 *__debug_frame0 asm("gr31"); - -#define __debug_frame (&__debug_frame0->regs) -#define __debug_user_context (&__debug_frame0->uc) -#define __debug_regs (&__debug_frame0->debug) -#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X))) - -struct frv_debug_status { - unsigned long bpsr; - unsigned long dcr; - unsigned long brr; - unsigned long nmar; -}; - -extern struct frv_debug_status __debug_status; - -#endif /* _LANGUAGE_ASSEMBLY */ -#endif /* __ASM_GDB_STUB_H */ diff --git a/include/asm-frv/gpio-regs.h b/include/asm-frv/gpio-regs.h deleted file mode 100644 index 9edf5d5..0000000 --- a/include/asm-frv/gpio-regs.h +++ /dev/null @@ -1,116 +0,0 @@ -/* gpio-regs.h: on-chip general purpose I/O registers - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_GPIO_REGS -#define _ASM_GPIO_REGS - -#define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) - -#define __get_PDR() ({ __reg(0xfeff0400); }) -#define __set_PDR(V) do { __reg(0xfeff0400) = (V); mb(); } while(0) - -#define __get_GPDR() ({ __reg(0xfeff0408); }) -#define __set_GPDR(V) do { __reg(0xfeff0408) = (V); mb(); } while(0) - -#define __get_SIR() ({ __reg(0xfeff0410); }) -#define __set_SIR(V) do { __reg(0xfeff0410) = (V); mb(); } while(0) - -#define __get_SOR() ({ __reg(0xfeff0418); }) -#define __set_SOR(V) do { __reg(0xfeff0418) = (V); mb(); } while(0) - -#define __set_PDSR(V) do { __reg(0xfeff0420) = (V); mb(); } while(0) - -#define __set_PDCR(V) do { __reg(0xfeff0428) = (V); mb(); } while(0) - -#define __get_RSTR() ({ __reg(0xfeff0500); }) -#define __set_RSTR(V) do { __reg(0xfeff0500) = (V); mb(); } while(0) - - - -/* PDR definitions */ -#define PDR_GPIO_DATA(X) (1 << (X)) - -/* GPDR definitions */ -#define GPDR_INPUT 0 -#define GPDR_OUTPUT 1 -#define GPDR_DREQ0_BIT 0x00001000 -#define GPDR_DREQ1_BIT 0x00008000 -#define GPDR_DREQ2_BIT 0x00040000 -#define GPDR_DREQ3_BIT 0x00080000 -#define GPDR_DREQ4_BIT 0x00004000 -#define GPDR_DREQ5_BIT 0x00020000 -#define GPDR_DREQ6_BIT 0x00100000 -#define GPDR_DREQ7_BIT 0x00200000 -#define GPDR_DACK0_BIT 0x00002000 -#define GPDR_DACK1_BIT 0x00010000 -#define GPDR_DACK2_BIT 0x00100000 -#define GPDR_DACK3_BIT 0x00200000 -#define GPDR_DONE0_BIT 0x00004000 -#define GPDR_DONE1_BIT 0x00020000 -#define GPDR_GPIO_DIR(X,D) ((D) << (X)) - -/* SIR definitions */ -#define SIR_GPIO_INPUT 0 -#define SIR_DREQ7_INPUT 0x00200000 -#define SIR_DREQ6_INPUT 0x00100000 -#define SIR_DREQ3_INPUT 0x00080000 -#define SIR_DREQ2_INPUT 0x00040000 -#define SIR_DREQ5_INPUT 0x00020000 -#define SIR_DREQ1_INPUT 0x00008000 -#define SIR_DREQ4_INPUT 0x00004000 -#define SIR_DREQ0_INPUT 0x00001000 -#define SIR_RXD1_INPUT 0x00000400 -#define SIR_CTS0_INPUT 0x00000100 -#define SIR_RXD0_INPUT 0x00000040 -#define SIR_GATE1_INPUT 0x00000020 -#define SIR_GATE0_INPUT 0x00000010 -#define SIR_IRQ3_INPUT 0x00000008 -#define SIR_IRQ2_INPUT 0x00000004 -#define SIR_IRQ1_INPUT 0x00000002 -#define SIR_IRQ0_INPUT 0x00000001 -#define SIR_DREQ_BITS (SIR_DREQ0_INPUT | SIR_DREQ1_INPUT | \ - SIR_DREQ2_INPUT | SIR_DREQ3_INPUT | \ - SIR_DREQ4_INPUT | SIR_DREQ5_INPUT | \ - SIR_DREQ6_INPUT | SIR_DREQ7_INPUT) - -/* SOR definitions */ -#define SOR_GPIO_OUTPUT 0 -#define SOR_DACK3_OUTPUT 0x00200000 -#define SOR_DACK2_OUTPUT 0x00100000 -#define SOR_DONE1_OUTPUT 0x00020000 -#define SOR_DACK1_OUTPUT 0x00010000 -#define SOR_DONE0_OUTPUT 0x00004000 -#define SOR_DACK0_OUTPUT 0x00002000 -#define SOR_TXD1_OUTPUT 0x00000800 -#define SOR_RTS0_OUTPUT 0x00000200 -#define SOR_TXD0_OUTPUT 0x00000080 -#define SOR_TOUT1_OUTPUT 0x00000020 -#define SOR_TOUT0_OUTPUT 0x00000010 -#define SOR_DONE_BITS (SOR_DONE0_OUTPUT | SOR_DONE1_OUTPUT) -#define SOR_DACK_BITS (SOR_DACK0_OUTPUT | SOR_DACK1_OUTPUT | \ - SOR_DACK2_OUTPUT | SOR_DACK3_OUTPUT) - -/* PDSR definitions */ -#define PDSR_UNCHANGED 0 -#define PDSR_SET_BIT(X) (1 << (X)) - -/* PDCR definitions */ -#define PDCR_UNCHANGED 0 -#define PDCR_CLEAR_BIT(X) (1 << (X)) - -/* RSTR definitions */ -/* Read Only */ -#define RSTR_POWERON 0x00000400 -#define RSTR_SOFTRESET_STATUS 0x00000100 -/* Write Only */ -#define RSTR_SOFTRESET 0x00000001 - -#endif /* _ASM_GPIO_REGS */ diff --git a/include/asm-frv/hardirq.h b/include/asm-frv/hardirq.h deleted file mode 100644 index fc47515..0000000 --- a/include/asm-frv/hardirq.h +++ /dev/null @@ -1,35 +0,0 @@ -/* hardirq.h: FRV hardware IRQ management - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef __ASM_HARDIRQ_H -#define __ASM_HARDIRQ_H - -#include -#include - -typedef struct { - unsigned int __softirq_pending; - unsigned long idle_timestamp; -} ____cacheline_aligned irq_cpustat_t; - -#include /* Standard mappings for irq_cpustat_t above */ - -#ifdef CONFIG_SMP -#error SMP not available on FR-V -#endif /* CONFIG_SMP */ - -extern atomic_t irq_err_count; -static inline void ack_bad_irq(int irq) -{ - atomic_inc(&irq_err_count); -} - -#endif diff --git a/include/asm-frv/highmem.h b/include/asm-frv/highmem.h deleted file mode 100644 index 68e4677..0000000 --- a/include/asm-frv/highmem.h +++ /dev/null @@ -1,182 +0,0 @@ -/* highmem.h: virtual kernel memory mappings for high memory - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from include/asm-i386/highmem.h - * - * See Documentation/frv/mmu-layout.txt for more information. - * - * 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. - */ - -#ifndef _ASM_HIGHMEM_H -#define _ASM_HIGHMEM_H - -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include - -#define NR_TLB_LINES 64 /* number of lines in the TLB */ - -#ifndef __ASSEMBLY__ - -#include -#include -#include - -#ifdef CONFIG_DEBUG_HIGHMEM -#define HIGHMEM_DEBUG 1 -#else -#define HIGHMEM_DEBUG 0 -#endif - -/* declarations for highmem.c */ -extern unsigned long highstart_pfn, highend_pfn; - -#define kmap_prot PAGE_KERNEL -#define kmap_pte ______kmap_pte_in_TLB -extern pte_t *pkmap_page_table; - -#define flush_cache_kmaps() do { } while (0) - -/* - * Right now we initialize only a single pte table. It can be extended - * easily, subsequent pte tables have to be allocated in one physical - * chunk of RAM. - */ -#define LAST_PKMAP PTRS_PER_PTE -#define LAST_PKMAP_MASK (LAST_PKMAP - 1) -#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) -#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) - -extern void *kmap_high(struct page *page); -extern void kunmap_high(struct page *page); - -extern void *kmap(struct page *page); -extern void kunmap(struct page *page); - -extern struct page *kmap_atomic_to_page(void *ptr); - -#endif /* !__ASSEMBLY__ */ - -/* - * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap - * gives a more generic (and caching) interface. But kmap_atomic can - * be used in IRQ contexts, so in some (very limited) cases we need - * it. - */ -#define KMAP_ATOMIC_CACHE_DAMR 8 - -#ifndef __ASSEMBLY__ - -#define __kmap_atomic_primary(type, paddr, ampr) \ -({ \ - unsigned long damlr, dampr; \ - \ - dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ - \ - if (type != __KM_CACHE) \ - asm volatile("movgs %0,dampr"#ampr :: "r"(dampr) : "memory"); \ - else \ - asm volatile("movgs %0,iampr"#ampr"\n" \ - "movgs %0,dampr"#ampr"\n" \ - :: "r"(dampr) : "memory" \ - ); \ - \ - asm("movsg damlr"#ampr",%0" : "=r"(damlr)); \ - \ - /*printk("DAMR"#ampr": PRIM sl=%d L=%08lx P=%08lx\n", type, damlr, dampr);*/ \ - \ - (void *) damlr; \ -}) - -#define __kmap_atomic_secondary(slot, paddr) \ -({ \ - unsigned long damlr = KMAP_ATOMIC_SECONDARY_FRAME + (slot) * PAGE_SIZE; \ - unsigned long dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ - \ - asm volatile("movgs %0,tplr \n" \ - "movgs %1,tppr \n" \ - "tlbpr %0,gr0,#2,#1" \ - : : "r"(damlr), "r"(dampr) : "memory"); \ - \ - /*printk("TLB: SECN sl=%d L=%08lx P=%08lx\n", slot, damlr, dampr);*/ \ - \ - (void *) damlr; \ -}) - -static inline void *kmap_atomic(struct page *page, enum km_type type) -{ - unsigned long paddr; - - pagefault_disable(); - debug_kmap_atomic(type); - paddr = page_to_phys(page); - - switch (type) { - case 0: return __kmap_atomic_primary(0, paddr, 2); - case 1: return __kmap_atomic_primary(1, paddr, 3); - case 2: return __kmap_atomic_primary(2, paddr, 4); - case 3: return __kmap_atomic_primary(3, paddr, 5); - case 4: return __kmap_atomic_primary(4, paddr, 6); - case 5: return __kmap_atomic_primary(5, paddr, 7); - case 6: return __kmap_atomic_primary(6, paddr, 8); - case 7: return __kmap_atomic_primary(7, paddr, 9); - case 8: return __kmap_atomic_primary(8, paddr, 10); - - case 9 ... 9 + NR_TLB_LINES - 1: - return __kmap_atomic_secondary(type - 9, paddr); - - default: - BUG(); - return NULL; - } -} - -#define __kunmap_atomic_primary(type, ampr) \ -do { \ - asm volatile("movgs gr0,dampr"#ampr"\n" ::: "memory"); \ - if (type == __KM_CACHE) \ - asm volatile("movgs gr0,iampr"#ampr"\n" ::: "memory"); \ -} while(0) - -#define __kunmap_atomic_secondary(slot, vaddr) \ -do { \ - asm volatile("tlbpr %0,gr0,#4,#1" : : "r"(vaddr) : "memory"); \ -} while(0) - -static inline void kunmap_atomic(void *kvaddr, enum km_type type) -{ - switch (type) { - case 0: __kunmap_atomic_primary(0, 2); break; - case 1: __kunmap_atomic_primary(1, 3); break; - case 2: __kunmap_atomic_primary(2, 4); break; - case 3: __kunmap_atomic_primary(3, 5); break; - case 4: __kunmap_atomic_primary(4, 6); break; - case 5: __kunmap_atomic_primary(5, 7); break; - case 6: __kunmap_atomic_primary(6, 8); break; - case 7: __kunmap_atomic_primary(7, 9); break; - case 8: __kunmap_atomic_primary(8, 10); break; - - case 9 ... 9 + NR_TLB_LINES - 1: - __kunmap_atomic_secondary(type - 9, kvaddr); - break; - - default: - BUG(); - } - pagefault_enable(); -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_HIGHMEM_H */ diff --git a/include/asm-frv/hw_irq.h b/include/asm-frv/hw_irq.h deleted file mode 100644 index 522ad37..0000000 --- a/include/asm-frv/hw_irq.h +++ /dev/null @@ -1,16 +0,0 @@ -/* hw_irq.h: FR-V specific h/w IRQ stuff - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_HW_IRQ_H -#define _ASM_HW_IRQ_H - - -#endif /* _ASM_HW_IRQ_H */ diff --git a/include/asm-frv/init.h b/include/asm-frv/init.h deleted file mode 100644 index 8b15838..0000000 --- a/include/asm-frv/init.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_INIT_H -#define _ASM_INIT_H - -#define __init __attribute__ ((__section__ (".text.init"))) -#define __initdata __attribute__ ((__section__ (".data.init"))) -/* For assembly routines */ -#define __INIT .section ".text.init",#alloc,#execinstr -#define __FINIT .previous -#define __INITDATA .section ".data.init",#alloc,#write - -#endif - diff --git a/include/asm-frv/io.h b/include/asm-frv/io.h deleted file mode 100644 index ca7475e..0000000 --- a/include/asm-frv/io.h +++ /dev/null @@ -1,392 +0,0 @@ -/* io.h: FRV I/O operations - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - * - * This gets interesting when talking to the PCI bus - the CPU is in big endian - * mode, the PCI bus is little endian and the hardware in the middle can do - * byte swapping - */ -#ifndef _ASM_IO_H -#define _ASM_IO_H - -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include - -/* - * swap functions are sometimes needed to interface little-endian hardware - */ - -static inline unsigned short _swapw(unsigned short v) -{ - return ((v << 8) | (v >> 8)); -} - -static inline unsigned long _swapl(unsigned long v) -{ - return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24)); -} - -//#define __iormb() asm volatile("membar") -//#define __iowmb() asm volatile("membar") - -#define __raw_readb __builtin_read8 -#define __raw_readw __builtin_read16 -#define __raw_readl __builtin_read32 - -#define __raw_writeb(datum, addr) __builtin_write8(addr, datum) -#define __raw_writew(datum, addr) __builtin_write16(addr, datum) -#define __raw_writel(datum, addr) __builtin_write32(addr, datum) - -static inline void io_outsb(unsigned int addr, const void *buf, int len) -{ - unsigned long __ioaddr = (unsigned long) addr; - const uint8_t *bp = buf; - - while (len--) - __builtin_write8((volatile void __iomem *) __ioaddr, *bp++); -} - -static inline void io_outsw(unsigned int addr, const void *buf, int len) -{ - unsigned long __ioaddr = (unsigned long) addr; - const uint16_t *bp = buf; - - while (len--) - __builtin_write16((volatile void __iomem *) __ioaddr, (*bp++)); -} - -extern void __outsl_ns(unsigned int addr, const void *buf, int len); -extern void __outsl_sw(unsigned int addr, const void *buf, int len); -static inline void __outsl(unsigned int addr, const void *buf, int len, int swap) -{ - unsigned long __ioaddr = (unsigned long) addr; - - if (!swap) - __outsl_ns(__ioaddr, buf, len); - else - __outsl_sw(__ioaddr, buf, len); -} - -static inline void io_insb(unsigned long addr, void *buf, int len) -{ - uint8_t *bp = buf; - - while (len--) - *bp++ = __builtin_read8((volatile void __iomem *) addr); -} - -static inline void io_insw(unsigned long addr, void *buf, int len) -{ - uint16_t *bp = buf; - - while (len--) - *bp++ = __builtin_read16((volatile void __iomem *) addr); -} - -extern void __insl_ns(unsigned long addr, void *buf, int len); -extern void __insl_sw(unsigned long addr, void *buf, int len); -static inline void __insl(unsigned long addr, void *buf, int len, int swap) -{ - if (!swap) - __insl_ns(addr, buf, len); - else - __insl_sw(addr, buf, len); -} - -#define mmiowb() mb() - -/* - * make the short names macros so specific devices - * can override them as required - */ - -static inline void memset_io(volatile void __iomem *addr, unsigned char val, int count) -{ - memset((void __force *) addr, val, count); -} - -static inline void memcpy_fromio(void *dst, const volatile void __iomem *src, int count) -{ - memcpy(dst, (void __force *) src, count); -} - -static inline void memcpy_toio(volatile void __iomem *dst, const void *src, int count) -{ - memcpy((void __force *) dst, src, count); -} - -static inline uint8_t inb(unsigned long addr) -{ - return __builtin_read8((void __iomem *)addr); -} - -static inline uint16_t inw(unsigned long addr) -{ - uint16_t ret = __builtin_read16((void __iomem *)addr); - - if (__is_PCI_IO(addr)) - ret = _swapw(ret); - - return ret; -} - -static inline uint32_t inl(unsigned long addr) -{ - uint32_t ret = __builtin_read32((void __iomem *)addr); - - if (__is_PCI_IO(addr)) - ret = _swapl(ret); - - return ret; -} - -static inline void outb(uint8_t datum, unsigned long addr) -{ - __builtin_write8((void __iomem *)addr, datum); -} - -static inline void outw(uint16_t datum, unsigned long addr) -{ - if (__is_PCI_IO(addr)) - datum = _swapw(datum); - __builtin_write16((void __iomem *)addr, datum); -} - -static inline void outl(uint32_t datum, unsigned long addr) -{ - if (__is_PCI_IO(addr)) - datum = _swapl(datum); - __builtin_write32((void __iomem *)addr, datum); -} - -#define inb_p(addr) inb(addr) -#define inw_p(addr) inw(addr) -#define inl_p(addr) inl(addr) -#define outb_p(x,addr) outb(x,addr) -#define outw_p(x,addr) outw(x,addr) -#define outl_p(x,addr) outl(x,addr) - -#define outsb(a,b,l) io_outsb(a,b,l) -#define outsw(a,b,l) io_outsw(a,b,l) -#define outsl(a,b,l) __outsl(a,b,l,0) - -#define insb(a,b,l) io_insb(a,b,l) -#define insw(a,b,l) io_insw(a,b,l) -#define insl(a,b,l) __insl(a,b,l,0) - -#define IO_SPACE_LIMIT 0xffffffff - -static inline uint8_t readb(const volatile void __iomem *addr) -{ - return __builtin_read8((__force void volatile __iomem *) addr); -} - -static inline uint16_t readw(const volatile void __iomem *addr) -{ - uint16_t ret = __builtin_read16((__force void volatile __iomem *)addr); - - if (__is_PCI_MEM(addr)) - ret = _swapw(ret); - return ret; -} - -static inline uint32_t readl(const volatile void __iomem *addr) -{ - uint32_t ret = __builtin_read32((__force void volatile __iomem *)addr); - - if (__is_PCI_MEM(addr)) - ret = _swapl(ret); - - return ret; -} - -#define readb_relaxed readb -#define readw_relaxed readw -#define readl_relaxed readl - -static inline void writeb(uint8_t datum, volatile void __iomem *addr) -{ - __builtin_write8(addr, datum); - if (__is_PCI_MEM(addr)) - __flush_PCI_writes(); -} - -static inline void writew(uint16_t datum, volatile void __iomem *addr) -{ - if (__is_PCI_MEM(addr)) - datum = _swapw(datum); - - __builtin_write16(addr, datum); - if (__is_PCI_MEM(addr)) - __flush_PCI_writes(); -} - -static inline void writel(uint32_t datum, volatile void __iomem *addr) -{ - if (__is_PCI_MEM(addr)) - datum = _swapl(datum); - - __builtin_write32(addr, datum); - if (__is_PCI_MEM(addr)) - __flush_PCI_writes(); -} - - -/* Values for nocacheflag and cmode */ -#define IOMAP_FULL_CACHING 0 -#define IOMAP_NOCACHE_SER 1 -#define IOMAP_NOCACHE_NONSER 2 -#define IOMAP_WRITETHROUGH 3 - -extern void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); - -static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size) -{ - return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); -} - -static inline void __iomem *ioremap_nocache(unsigned long physaddr, unsigned long size) -{ - return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); -} - -static inline void __iomem *ioremap_writethrough(unsigned long physaddr, unsigned long size) -{ - return __ioremap(physaddr, size, IOMAP_WRITETHROUGH); -} - -static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned long size) -{ - return __ioremap(physaddr, size, IOMAP_FULL_CACHING); -} - -#define ioremap_wc ioremap_nocache - -extern void iounmap(void volatile __iomem *addr); - -static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) -{ - return (void __iomem *) port; -} - -static inline void ioport_unmap(void __iomem *p) -{ -} - -static inline void flush_write_buffers(void) -{ - __asm__ __volatile__ ("membar" : : :"memory"); -} - -/* - * do appropriate I/O accesses for token type - */ -static inline unsigned int ioread8(void __iomem *p) -{ - return __builtin_read8(p); -} - -static inline unsigned int ioread16(void __iomem *p) -{ - uint16_t ret = __builtin_read16(p); - if (__is_PCI_addr(p)) - ret = _swapw(ret); - return ret; -} - -static inline unsigned int ioread32(void __iomem *p) -{ - uint32_t ret = __builtin_read32(p); - if (__is_PCI_addr(p)) - ret = _swapl(ret); - return ret; -} - -static inline void iowrite8(u8 val, void __iomem *p) -{ - __builtin_write8(p, val); - if (__is_PCI_MEM(p)) - __flush_PCI_writes(); -} - -static inline void iowrite16(u16 val, void __iomem *p) -{ - if (__is_PCI_addr(p)) - val = _swapw(val); - __builtin_write16(p, val); - if (__is_PCI_MEM(p)) - __flush_PCI_writes(); -} - -static inline void iowrite32(u32 val, void __iomem *p) -{ - if (__is_PCI_addr(p)) - val = _swapl(val); - __builtin_write32(p, val); - if (__is_PCI_MEM(p)) - __flush_PCI_writes(); -} - -static inline void ioread8_rep(void __iomem *p, void *dst, unsigned long count) -{ - io_insb((unsigned long) p, dst, count); -} - -static inline void ioread16_rep(void __iomem *p, void *dst, unsigned long count) -{ - io_insw((unsigned long) p, dst, count); -} - -static inline void ioread32_rep(void __iomem *p, void *dst, unsigned long count) -{ - __insl_ns((unsigned long) p, dst, count); -} - -static inline void iowrite8_rep(void __iomem *p, const void *src, unsigned long count) -{ - io_outsb((unsigned long) p, src, count); -} - -static inline void iowrite16_rep(void __iomem *p, const void *src, unsigned long count) -{ - io_outsw((unsigned long) p, src, count); -} - -static inline void iowrite32_rep(void __iomem *p, const void *src, unsigned long count) -{ - __outsl_ns((unsigned long) p, src, count); -} - -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ -struct pci_dev; -extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); -static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) -{ -} - - -/* - * Convert a physical pointer to a virtual kernel pointer for /dev/mem - * access - */ -#define xlate_dev_mem_ptr(p) __va(p) - -/* - * Convert a virtual cached pointer to an uncached pointer - */ -#define xlate_dev_kmem_ptr(p) p - -#endif /* __KERNEL__ */ - -#endif /* _ASM_IO_H */ diff --git a/include/asm-frv/ioctl.h b/include/asm-frv/ioctl.h deleted file mode 100644 index b279fe0..0000000 --- a/include/asm-frv/ioctl.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-frv/ioctls.h b/include/asm-frv/ioctls.h deleted file mode 100644 index d0c30e3..0000000 --- a/include/asm-frv/ioctls.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef __ASM_IOCTLS_H__ -#define __ASM_IOCTLS_H__ - -#include - -/* 0x54 is just a magic number to make these relatively unique ('T') */ - -#define TCGETS 0x5401 -#define TCSETS 0x5402 -#define TCSETSW 0x5403 -#define TCSETSF 0x5404 -#define TCGETA 0x5405 -#define TCSETA 0x5406 -#define TCSETAW 0x5407 -#define TCSETAF 0x5408 -#define TCSBRK 0x5409 -#define TCXONC 0x540A -#define TCFLSH 0x540B -#define TIOCEXCL 0x540C -#define TIOCNXCL 0x540D -#define TIOCSCTTY 0x540E -#define TIOCGPGRP 0x540F -#define TIOCSPGRP 0x5410 -#define TIOCOUTQ 0x5411 -#define TIOCSTI 0x5412 -#define TIOCGWINSZ 0x5413 -#define TIOCSWINSZ 0x5414 -#define TIOCMGET 0x5415 -#define TIOCMBIS 0x5416 -#define TIOCMBIC 0x5417 -#define TIOCMSET 0x5418 -#define TIOCGSOFTCAR 0x5419 -#define TIOCSSOFTCAR 0x541A -#define FIONREAD 0x541B -#define TIOCINQ FIONREAD -#define TIOCLINUX 0x541C -#define TIOCCONS 0x541D -#define TIOCGSERIAL 0x541E -#define TIOCSSERIAL 0x541F -#define TIOCPKT 0x5420 -#define FIONBIO 0x5421 -#define TIOCNOTTY 0x5422 -#define TIOCSETD 0x5423 -#define TIOCGETD 0x5424 -#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TIOCSBRK 0x5427 /* BSD compatibility */ -#define TIOCCBRK 0x5428 /* BSD compatibility */ -#define TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TCGETS2 _IOR('T',0x2A, struct termios2) -#define TCSETS2 _IOW('T',0x2B, struct termios2) -#define TCSETSW2 _IOW('T',0x2C, struct termios2) -#define TCSETSF2 _IOW('T',0x2D, struct termios2) -#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define FIOCLEX 0x5451 -#define FIOASYNC 0x5452 -#define TIOCSERCONFIG 0x5453 -#define TIOCSERGWILD 0x5454 -#define TIOCSERSWILD 0x5455 -#define TIOCGLCKTRMIOS 0x5456 -#define TIOCSLCKTRMIOS 0x5457 -#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define FIOQSIZE 0x545E - -/* Used for packet mode */ -#define TIOCPKT_DATA 0 -#define TIOCPKT_FLUSHREAD 1 -#define TIOCPKT_FLUSHWRITE 2 -#define TIOCPKT_STOP 4 -#define TIOCPKT_START 8 -#define TIOCPKT_NOSTOP 16 -#define TIOCPKT_DOSTOP 32 - -#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ - -#endif /* __ASM_IOCTLS_H__ */ - diff --git a/include/asm-frv/ipcbuf.h b/include/asm-frv/ipcbuf.h deleted file mode 100644 index b546f67..0000000 --- a/include/asm-frv/ipcbuf.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __ASM_IPCBUF_H__ -#define __ASM_IPCBUF_H__ - -/* - * The user_ipc_perm structure for FR-V architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 32-bit mode_t and seq - * - 2 miscellaneous 32-bit values - */ - -struct ipc64_perm -{ - __kernel_key_t key; - __kernel_uid32_t uid; - __kernel_gid32_t gid; - __kernel_uid32_t cuid; - __kernel_gid32_t cgid; - __kernel_mode_t mode; - unsigned short __pad1; - unsigned short seq; - unsigned short __pad2; - unsigned long __unused1; - unsigned long __unused2; -}; - -#endif /* __ASM_IPCBUF_H__ */ - diff --git a/include/asm-frv/irc-regs.h b/include/asm-frv/irc-regs.h deleted file mode 100644 index afa30ae..0000000 --- a/include/asm-frv/irc-regs.h +++ /dev/null @@ -1,53 +0,0 @@ -/* irc-regs.h: on-chip interrupt controller registers - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_IRC_REGS -#define _ASM_IRC_REGS - -#define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) - -#define __get_TM0() ({ __reg(0xfeff9800); }) -#define __get_TM1() ({ __reg(0xfeff9808); }) -#define __set_TM1(V) do { __reg(0xfeff9808) = (V); mb(); } while(0) - -#define __set_TM1x(XI,V) \ -do { \ - int shift = (XI) * 2 + 16; \ - unsigned long tm1 = __reg(0xfeff9808); \ - tm1 &= ~(0x3 << shift); \ - tm1 |= (V) << shift; \ - __reg(0xfeff9808) = tm1; \ - mb(); \ -} while(0) - -#define __get_RS(C) ({ (__reg(0xfeff9810) >> ((C)+16)) & 1; }) - -#define __clr_RC(C) do { __reg(0xfeff9818) = 1 << ((C)+16); mb(); } while(0) - -#define __get_MASK(C) ({ (__reg(0xfeff9820) >> ((C)+16)) & 1; }) -#define __set_MASK(C) do { __reg(0xfeff9820) |= 1 << ((C)+16); mb(); } while(0) -#define __clr_MASK(C) do { __reg(0xfeff9820) &= ~(1 << ((C)+16)); mb(); } while(0) - -#define __get_MASK_all() __get_MASK(0) -#define __set_MASK_all() __set_MASK(0) -#define __clr_MASK_all() __clr_MASK(0) - -#define __get_IRL() ({ (__reg(0xfeff9828) >> 16) & 0xf; }) -#define __clr_IRL() do { __reg(0xfeff9828) = 0x100000; mb(); } while(0) - -#define __get_IRR(N) ({ __reg(0xfeff9840 + (N) * 8); }) -#define __set_IRR(N,V) do { __reg(0xfeff9840 + (N) * 8) = (V); } while(0) - -#define __get_IITMR(N) ({ __reg(0xfeff9880 + (N) * 8); }) -#define __set_IITMR(N,V) do { __reg(0xfeff9880 + (N) * 8) = (V); } while(0) - - -#endif /* _ASM_IRC_REGS */ diff --git a/include/asm-frv/irq.h b/include/asm-frv/irq.h deleted file mode 100644 index 3a66ebd..0000000 --- a/include/asm-frv/irq.h +++ /dev/null @@ -1,30 +0,0 @@ -/* irq.h: FRV IRQ definitions - * - * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_IRQ_H_ -#define _ASM_IRQ_H_ - -#define NR_IRQS 48 -#define IRQ_BASE_CPU (0 * 16) -#define IRQ_BASE_FPGA (1 * 16) -#define IRQ_BASE_MB93493 (2 * 16) - -/* probe returns a 32-bit IRQ mask:-/ */ -#define MIN_PROBE_IRQ (NR_IRQS - 32) - -#ifndef __ASSEMBLY__ -static inline int irq_canonicalize(int irq) -{ - return irq; -} -#endif - -#endif /* _ASM_IRQ_H_ */ diff --git a/include/asm-frv/irq_regs.h b/include/asm-frv/irq_regs.h deleted file mode 100644 index d22e832..0000000 --- a/include/asm-frv/irq_regs.h +++ /dev/null @@ -1,27 +0,0 @@ -/* FRV per-CPU frame pointer holder - * - * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_IRQ_REGS_H -#define _ASM_IRQ_REGS_H - -/* - * Per-cpu current frame pointer - the location of the last exception frame on - * the stack - * - on FRV, GR28 is dedicated to keeping a pointer to the current exception - * frame - */ -#define ARCH_HAS_OWN_IRQ_REGS - -#ifndef __ASSEMBLY__ -#define get_irq_regs() (__frame) -#endif - -#endif /* _ASM_IRQ_REGS_H */ diff --git a/include/asm-frv/kdebug.h b/include/asm-frv/kdebug.h deleted file mode 100644 index 6ece1b0..0000000 --- a/include/asm-frv/kdebug.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-frv/kmap_types.h b/include/asm-frv/kmap_types.h deleted file mode 100644 index f8e16b2..0000000 --- a/include/asm-frv/kmap_types.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef _ASM_KMAP_TYPES_H -#define _ASM_KMAP_TYPES_H - -enum km_type { - /* arch specific kmaps - change the numbers attached to these at your peril */ - __KM_CACHE, /* cache flush page attachment point */ - __KM_PGD, /* current page directory */ - __KM_ITLB_PTD, /* current instruction TLB miss page table lookup */ - __KM_DTLB_PTD, /* current data TLB miss page table lookup */ - - /* general kmaps */ - KM_BOUNCE_READ, - KM_SKB_SUNRPC_DATA, - KM_SKB_DATA_SOFTIRQ, - KM_USER0, - KM_USER1, - KM_BIO_SRC_IRQ, - KM_BIO_DST_IRQ, - KM_PTE0, - KM_PTE1, - KM_IRQ0, - KM_IRQ1, - KM_SOFTIRQ0, - KM_SOFTIRQ1, - KM_TYPE_NR -}; - -#endif diff --git a/include/asm-frv/linkage.h b/include/asm-frv/linkage.h deleted file mode 100644 index 636c1bc..0000000 --- a/include/asm-frv/linkage.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __ASM_LINKAGE_H -#define __ASM_LINKAGE_H - -#define __ALIGN .align 4 -#define __ALIGN_STR ".align 4" - -#endif diff --git a/include/asm-frv/local.h b/include/asm-frv/local.h deleted file mode 100644 index c27bdf0..0000000 --- a/include/asm-frv/local.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_LOCAL_H -#define _ASM_LOCAL_H - -#include - -#endif /* _ASM_LOCAL_H */ diff --git a/include/asm-frv/math-emu.h b/include/asm-frv/math-emu.h deleted file mode 100644 index 0c8f731..0000000 --- a/include/asm-frv/math-emu.h +++ /dev/null @@ -1,301 +0,0 @@ -#ifndef _ASM_MATH_EMU_H -#define _ASM_MATH_EMU_H - -#include -#include - -/* Status Register bits */ - -/* accrued exception bits */ -#define FPSR_AEXC_INEX 3 -#define FPSR_AEXC_DZ 4 -#define FPSR_AEXC_UNFL 5 -#define FPSR_AEXC_OVFL 6 -#define FPSR_AEXC_IOP 7 - -/* exception status bits */ -#define FPSR_EXC_INEX1 8 -#define FPSR_EXC_INEX2 9 -#define FPSR_EXC_DZ 10 -#define FPSR_EXC_UNFL 11 -#define FPSR_EXC_OVFL 12 -#define FPSR_EXC_OPERR 13 -#define FPSR_EXC_SNAN 14 -#define FPSR_EXC_BSUN 15 - -/* quotient byte, assumes big-endian, of course */ -#define FPSR_QUOTIENT(fpsr) (*((signed char *) &(fpsr) + 1)) - -/* condition code bits */ -#define FPSR_CC_NAN 24 -#define FPSR_CC_INF 25 -#define FPSR_CC_Z 26 -#define FPSR_CC_NEG 27 - - -/* Control register bits */ - -/* rounding mode */ -#define FPCR_ROUND_RN 0 /* round to nearest/even */ -#define FPCR_ROUND_RZ 1 /* round to zero */ -#define FPCR_ROUND_RM 2 /* minus infinity */ -#define FPCR_ROUND_RP 3 /* plus infinity */ - -/* rounding precision */ -#define FPCR_PRECISION_X 0 /* long double */ -#define FPCR_PRECISION_S 1 /* double */ -#define FPCR_PRECISION_D 2 /* float */ - - -/* Flags to select the debugging output */ -#define PDECODE 0 -#define PEXECUTE 1 -#define PCONV 2 -#define PNORM 3 -#define PREGISTER 4 -#define PINSTR 5 -#define PUNIMPL 6 -#define PMOVEM 7 - -#define PMDECODE (1< -#include - -union fp_mant64 { - unsigned long long m64; - unsigned long m32[2]; -}; - -union fp_mant128 { - unsigned long long m64[2]; - unsigned long m32[4]; -}; - -/* internal representation of extended fp numbers */ -struct fp_ext { - unsigned char lowmant; - unsigned char sign; - unsigned short exp; - union fp_mant64 mant; -}; - -/* C representation of FPU registers */ -/* NOTE: if you change this, you have to change the assembler offsets - below and the size in , too */ -struct fp_data { - struct fp_ext fpreg[8]; - unsigned int fpcr; - unsigned int fpsr; - unsigned int fpiar; - unsigned short prec; - unsigned short rnd; - struct fp_ext temp[2]; -}; - -#if FPU_EMU_DEBUG -extern unsigned int fp_debugprint; - -#define dprint(bit, fmt, args...) ({ \ - if (fp_debugprint & (1 << (bit))) \ - printk(fmt, ## args); \ -}) -#else -#define dprint(bit, fmt, args...) -#endif - -#define uprint(str) ({ \ - static int __count = 3; \ - \ - if (__count > 0) { \ - printk("You just hit an unimplemented " \ - "fpu instruction (%s)\n", str); \ - printk("Please report this to ....\n"); \ - __count--; \ - } \ -}) - -#define FPDATA ((struct fp_data *)current->thread.fp) - -#else /* __ASSEMBLY__ */ - -#define FPDATA %a2 - -/* offsets from the base register to the floating point data in the task struct */ -#define FPD_FPREG (TASK_THREAD+THREAD_FPREG+0) -#define FPD_FPCR (TASK_THREAD+THREAD_FPREG+96) -#define FPD_FPSR (TASK_THREAD+THREAD_FPREG+100) -#define FPD_FPIAR (TASK_THREAD+THREAD_FPREG+104) -#define FPD_PREC (TASK_THREAD+THREAD_FPREG+108) -#define FPD_RND (TASK_THREAD+THREAD_FPREG+110) -#define FPD_TEMPFP1 (TASK_THREAD+THREAD_FPREG+112) -#define FPD_TEMPFP2 (TASK_THREAD+THREAD_FPREG+124) -#define FPD_SIZEOF (TASK_THREAD+THREAD_FPREG+136) - -/* offsets on the stack to access saved registers, - * these are only used during instruction decoding - * where we always know how deep we're on the stack. - */ -#define FPS_DO (PT_D0) -#define FPS_D1 (PT_D1) -#define FPS_D2 (PT_D2) -#define FPS_A0 (PT_A0) -#define FPS_A1 (PT_A1) -#define FPS_A2 (PT_A2) -#define FPS_SR (PT_SR) -#define FPS_PC (PT_PC) -#define FPS_EA (PT_PC+6) -#define FPS_PC2 (PT_PC+10) - -.macro fp_get_fp_reg - lea (FPD_FPREG,FPDATA,%d0.w*4),%a0 - lea (%a0,%d0.w*8),%a0 -.endm - -/* Macros used to get/put the current program counter. - * 020/030 use a different stack frame then 040/060, for the - * 040/060 the return pc points already to the next location, - * so this only needs to be modified for jump instructions. - */ -.macro fp_get_pc dest - move.l (FPS_PC+4,%sp),\dest -.endm - -.macro fp_put_pc src,jump=0 - move.l \src,(FPS_PC+4,%sp) -.endm - -.macro fp_get_instr_data f,s,dest,label - getuser \f,%sp@(FPS_PC+4)@(0),\dest,\label,%sp@(FPS_PC+4) - addq.l #\s,%sp@(FPS_PC+4) -.endm - -.macro fp_get_instr_word dest,label,addr - fp_get_instr_data w,2,\dest,\label,\addr -.endm - -.macro fp_get_instr_long dest,label,addr - fp_get_instr_data l,4,\dest,\label,\addr -.endm - -/* These macros are used to read from/write to user space - * on error we jump to the fixup section, load the fault - * address into %a0 and jump to the exit. - * (derived from ) - */ -.macro getuser size,src,dest,label,addr -| printf ,"[\size<%08x]",1,\addr -.Lu1\@: moves\size \src,\dest - - .section .fixup,"ax" - .even -.Lu2\@: move.l \addr,%a0 - jra \label - .previous - - .section __ex_table,"a" - .align 4 - .long .Lu1\@,.Lu2\@ - .previous -.endm - -.macro putuser size,src,dest,label,addr -| printf ,"[\size>%08x]",1,\addr -.Lu1\@: moves\size \src,\dest -.Lu2\@: - - .section .fixup,"ax" - .even -.Lu3\@: move.l \addr,%a0 - jra \label - .previous - - .section __ex_table,"a" - .align 4 - .long .Lu1\@,.Lu3\@ - .long .Lu2\@,.Lu3\@ - .previous -.endm - - -.macro movestack nr,arg1,arg2,arg3,arg4,arg5 - .if \nr - movestack (\nr-1),\arg2,\arg3,\arg4,\arg5 - move.l \arg1,-(%sp) - .endif -.endm - -.macro printf bit=-1,string,nr=0,arg1,arg2,arg3,arg4,arg5 -#ifdef FPU_EMU_DEBUG - .data -.Lpdata\@: - .string "\string" - .previous - - movem.l %d0/%d1/%a0/%a1,-(%sp) - .if \bit+1 -#if 0 - moveq #\bit,%d0 - andw #7,%d0 - btst %d0,fp_debugprint+((31-\bit)/8) -#else - btst #\bit,fp_debugprint+((31-\bit)/8) -#endif - jeq .Lpskip\@ - .endif - movestack \nr,\arg1,\arg2,\arg3,\arg4,\arg5 - pea .Lpdata\@ - jsr printk - lea ((\nr+1)*4,%sp),%sp -.Lpskip\@: - movem.l (%sp)+,%d0/%d1/%a0/%a1 -#endif -.endm - -.macro printx bit,fp -#ifdef FPU_EMU_DEBUG - movem.l %d0/%a0,-(%sp) - lea \fp,%a0 -#if 0 - moveq #'+',%d0 - tst.w (%a0) - jeq .Lx1\@ - moveq #'-',%d0 -.Lx1\@: printf \bit," %c",1,%d0 - move.l (4,%a0),%d0 - bclr #31,%d0 - jne .Lx2\@ - printf \bit,"0." - jra .Lx3\@ -.Lx2\@: printf \bit,"1." -.Lx3\@: printf \bit,"%08x%08x",2,%d0,%a0@(8) - move.w (2,%a0),%d0 - ext.l %d0 - printf \bit,"E%04x",1,%d0 -#else - printf \bit," %08x%08x%08x",3,%a0@,%a0@(4),%a0@(8) -#endif - movem.l (%sp)+,%d0/%a0 -#endif -.endm - -.macro debug instr,args -#ifdef FPU_EMU_DEBUG - \instr \args -#endif -.endm - - -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_FRV_MATH_EMU_H */ - diff --git a/include/asm-frv/mb-regs.h b/include/asm-frv/mb-regs.h deleted file mode 100644 index 219e5f9..0000000 --- a/include/asm-frv/mb-regs.h +++ /dev/null @@ -1,200 +0,0 @@ -/* mb-regs.h: motherboard registers - * - * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB_REGS_H -#define _ASM_MB_REGS_H - -#include -#include -#include - -#ifndef __ASSEMBLY__ -/* gcc builtins, annotated */ - -unsigned long __builtin_read8(volatile void __iomem *); -unsigned long __builtin_read16(volatile void __iomem *); -unsigned long __builtin_read32(volatile void __iomem *); -void __builtin_write8(volatile void __iomem *, unsigned char); -void __builtin_write16(volatile void __iomem *, unsigned short); -void __builtin_write32(volatile void __iomem *, unsigned long); -#endif - -#define __region_IO KERNEL_IO_START /* the region from 0xe0000000 to 0xffffffff has suitable - * protection laid over the top for use in memory-mapped - * I/O - */ - -#define __region_CS0 0xff000000 /* Boot ROMs area */ - -#ifdef CONFIG_MB93091_VDK -/* - * VDK motherboard and CPU card specific stuff - */ - -#include - -#define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 -#define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 - -#define __region_CS2 0xe0000000 /* SLBUS/PCI I/O space */ -#define __region_CS2_M 0x0fffffff /* mask */ -#define __region_CS2_C 0x00000000 /* control */ -#define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ -#define __region_CS5_M 0x00ffffff -#define __region_CS5_C 0x00010000 -#define __region_CS7 0xf1000000 /* CB70 CPU-card PCMCIA port I/O space */ -#define __region_CS7_M 0x00ffffff -#define __region_CS7_C 0x00410701 -#define __region_CS1 0xfc000000 /* SLBUS/PCI bridge control registers */ -#define __region_CS1_M 0x000fffff -#define __region_CS1_C 0x00000000 -#define __region_CS6 0xfc100000 /* CB70 CPU-card DM9000 LAN I/O space */ -#define __region_CS6_M 0x000fffff -#define __region_CS6_C 0x00400707 -#define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ -#define __region_CS3_M 0x000fffff -#define __region_CS3_C 0xc8100000 -#define __region_CS4 0xfd000000 /* CB70 CPU-card extra flash space */ -#define __region_CS4_M 0x00ffffff -#define __region_CS4_C 0x00000f07 - -#define __region_PCI_IO (__region_CS2 + 0x04000000UL) -#define __region_PCI_MEM (__region_CS2 + 0x08000000UL) -#define __flush_PCI_writes() \ -do { \ - __builtin_write8((volatile void __iomem *) __region_PCI_MEM, 0); \ -} while(0) - -#define __is_PCI_IO(addr) \ - (((unsigned long)(addr) >> 24) - (__region_PCI_IO >> 24) < (0x04000000UL >> 24)) - -#define __is_PCI_MEM(addr) \ - ((unsigned long)(addr) - __region_PCI_MEM < 0x08000000UL) - -#define __is_PCI_addr(addr) \ - ((unsigned long)(addr) - __region_PCI_IO < 0x0c000000UL) - -#define __get_CLKSW() ({ *(volatile unsigned long *)(__region_CS2 + 0x0130000cUL) & 0xffUL; }) -#define __get_CLKIN() (__get_CLKSW() * 125U * 100000U / 24U) - -#ifndef __ASSEMBLY__ -extern int __nongprelbss mb93090_mb00_detected; -#endif - -#define __addr_LEDS() (__region_CS2 + 0x01200004UL) -#ifdef CONFIG_MB93090_MB00 -#define __set_LEDS(X) \ -do { \ - if (mb93090_mb00_detected) \ - __builtin_write32((void __iomem *) __addr_LEDS(), ~(X)); \ -} while (0) -#else -#define __set_LEDS(X) -#endif - -#define __addr_LCD() (__region_CS2 + 0x01200008UL) -#define __get_LCD(B) __builtin_read32((volatile void __iomem *) (B)) -#define __set_LCD(B,X) __builtin_write32((volatile void __iomem *) (B), (X)) - -#define LCD_D 0x000000ff /* LCD data bus */ -#define LCD_RW 0x00000100 /* LCD R/W signal */ -#define LCD_RS 0x00000200 /* LCD Register Select */ -#define LCD_E 0x00000400 /* LCD Start Enable Signal */ - -#define LCD_CMD_CLEAR (LCD_E|0x001) -#define LCD_CMD_HOME (LCD_E|0x002) -#define LCD_CMD_CURSOR_INC (LCD_E|0x004) -#define LCD_CMD_SCROLL_INC (LCD_E|0x005) -#define LCD_CMD_CURSOR_DEC (LCD_E|0x006) -#define LCD_CMD_SCROLL_DEC (LCD_E|0x007) -#define LCD_CMD_OFF (LCD_E|0x008) -#define LCD_CMD_ON(CRSR,BLINK) (LCD_E|0x00c|(CRSR<<1)|BLINK) -#define LCD_CMD_CURSOR_MOVE_L (LCD_E|0x010) -#define LCD_CMD_CURSOR_MOVE_R (LCD_E|0x014) -#define LCD_CMD_DISPLAY_SHIFT_L (LCD_E|0x018) -#define LCD_CMD_DISPLAY_SHIFT_R (LCD_E|0x01c) -#define LCD_CMD_FUNCSET(DL,N,F) (LCD_E|0x020|(DL<<4)|(N<<3)|(F<<2)) -#define LCD_CMD_SET_CG_ADDR(X) (LCD_E|0x040|X) -#define LCD_CMD_SET_DD_ADDR(X) (LCD_E|0x080|X) -#define LCD_CMD_READ_BUSY (LCD_E|LCD_RW) -#define LCD_DATA_WRITE(X) (LCD_E|LCD_RS|(X)) -#define LCD_DATA_READ (LCD_E|LCD_RS|LCD_RW) - -#else -/* - * PDK unit specific stuff - */ - -#include - -#define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 -#define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 - -#define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ -#define __region_CS5_M 0x00ffffff /* mask */ -#define __region_CS5_C 0x00010000 /* control */ -#define __region_CS2 0x20000000 /* FPGA registers */ -#define __region_CS2_M 0x000fffff -#define __region_CS2_C 0x00000000 -#define __region_CS1 0xfc100000 /* LAN registers */ -#define __region_CS1_M 0x000fffff -#define __region_CS1_C 0x00010404 -#define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ -#define __region_CS3_M 0x000fffff -#define __region_CS3_C 0xc8000000 -#define __region_CS4 0xfd000000 /* extra ROMs area */ -#define __region_CS4_M 0x00ffffff -#define __region_CS4_C 0x00000f07 - -#define __region_CS6 0xfe000000 /* not used - hide behind CPU resource I/O regs */ -#define __region_CS6_M 0x000fffff -#define __region_CS6_C 0x00000f07 -#define __region_CS7 0xfe000000 /* not used - hide behind CPU resource I/O regs */ -#define __region_CS7_M 0x000fffff -#define __region_CS7_C 0x00000f07 - -#define __is_PCI_IO(addr) 0 /* no PCI */ -#define __is_PCI_MEM(addr) 0 -#define __is_PCI_addr(addr) 0 -#define __region_PCI_IO 0 -#define __region_PCI_MEM 0 -#define __flush_PCI_writes() do { } while(0) - -#define __get_CLKSW() 0UL -#define __get_CLKIN() 66000000UL - -#define __addr_LEDS() (__region_CS2 + 0x00000023UL) -#define __set_LEDS(X) __builtin_write8((volatile void __iomem *) __addr_LEDS(), (X)) - -#define __addr_FPGATR() (__region_CS2 + 0x00000030UL) -#define __set_FPGATR(X) __builtin_write32((volatile void __iomem *) __addr_FPGATR(), (X)) -#define __get_FPGATR() __builtin_read32((volatile void __iomem *) __addr_FPGATR()) - -#define MB93093_FPGA_FPGATR_AUDIO_CLK 0x00000003 - -#define __set_FPGATR_AUDIO_CLK(V) \ - __set_FPGATR((__get_FPGATR() & ~MB93093_FPGA_FPGATR_AUDIO_CLK) | (V)) - -#define MB93093_FPGA_FPGATR_AUDIO_CLK_OFF 0x0 -#define MB93093_FPGA_FPGATR_AUDIO_CLK_11MHz 0x1 -#define MB93093_FPGA_FPGATR_AUDIO_CLK_12MHz 0x2 -#define MB93093_FPGA_FPGATR_AUDIO_CLK_02MHz 0x3 - -#define MB93093_FPGA_SWR_PUSHSWMASK (0x1F<<26) -#define MB93093_FPGA_SWR_PUSHSW4 (1<<29) - -#define __addr_FPGA_SWR ((volatile void __iomem *)(__region_CS2 + 0x28UL)) -#define __get_FPGA_PUSHSW1_5() (__builtin_read32(__addr_FPGA_SWR) & MB93093_FPGA_SWR_PUSHSWMASK) - - -#endif - -#endif /* _ASM_MB_REGS_H */ diff --git a/include/asm-frv/mb86943a.h b/include/asm-frv/mb86943a.h deleted file mode 100644 index e87ef92..0000000 --- a/include/asm-frv/mb86943a.h +++ /dev/null @@ -1,42 +0,0 @@ -/* mb86943a.h: MB86943 SPARClite <-> PCI bridge registers - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB86943A_H -#define _ASM_MB86943A_H - -#include - -#define __reg_MB86943_sl_ctl *(volatile uint32_t *) (__region_CS1 + 0x00) - -#define MB86943_SL_CTL_BUS_WIDTH_64 0x00000001 -#define MB86943_SL_CTL_AS_HOST 0x00000002 -#define MB86943_SL_CTL_DRCT_MASTER_SWAP 0x00000004 -#define MB86943_SL_CTL_DRCT_SLAVE_SWAP 0x00000008 -#define MB86943_SL_CTL_PCI_CONFIG_SWAP 0x00000010 -#define MB86943_SL_CTL_ECS0_ENABLE 0x00000020 -#define MB86943_SL_CTL_ECS1_ENABLE 0x00000040 -#define MB86943_SL_CTL_ECS2_ENABLE 0x00000080 - -#define __reg_MB86943_ecs_ctl(N) *(volatile uint32_t *) (__region_CS1 + 0x08 + (0x08*(N))) -#define __reg_MB86943_ecs_range(N) *(volatile uint32_t *) (__region_CS1 + 0x20 + (0x10*(N))) -#define __reg_MB86943_ecs_base(N) *(volatile uint32_t *) (__region_CS1 + 0x28 + (0x10*(N))) - -#define __reg_MB86943_sl_pci_io_range *(volatile uint32_t *) (__region_CS1 + 0x50) -#define __reg_MB86943_sl_pci_io_base *(volatile uint32_t *) (__region_CS1 + 0x58) -#define __reg_MB86943_sl_pci_mem_range *(volatile uint32_t *) (__region_CS1 + 0x60) -#define __reg_MB86943_sl_pci_mem_base *(volatile uint32_t *) (__region_CS1 + 0x68) -#define __reg_MB86943_pci_sl_io_base *(volatile uint32_t *) (__region_CS1 + 0x70) -#define __reg_MB86943_pci_sl_mem_base *(volatile uint32_t *) (__region_CS1 + 0x78) - -#define __reg_MB86943_pci_arbiter *(volatile uint32_t *) (__region_CS2 + 0x01300014) -#define MB86943_PCIARB_EN 0x00000001 - -#endif /* _ASM_MB86943A_H */ diff --git a/include/asm-frv/mb93091-fpga-irqs.h b/include/asm-frv/mb93091-fpga-irqs.h deleted file mode 100644 index 19778c5b..0000000 --- a/include/asm-frv/mb93091-fpga-irqs.h +++ /dev/null @@ -1,42 +0,0 @@ -/* mb93091-fpga-irqs.h: MB93091 CPU board FPGA IRQs - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB93091_FPGA_IRQS_H -#define _ASM_MB93091_FPGA_IRQS_H - -#include - -#ifndef __ASSEMBLY__ - -/* IRQ IDs presented to drivers */ -enum { - IRQ_FPGA__UNUSED = IRQ_BASE_FPGA, - IRQ_FPGA_SYSINT_BUS_EXPANSION_1, - IRQ_FPGA_SL_BUS_EXPANSION_2, - IRQ_FPGA_PCI_INTD, - IRQ_FPGA_PCI_INTC, - IRQ_FPGA_PCI_INTB, - IRQ_FPGA_PCI_INTA, - IRQ_FPGA_SL_BUS_EXPANSION_7, - IRQ_FPGA_SYSINT_BUS_EXPANSION_8, - IRQ_FPGA_SL_BUS_EXPANSION_9, - IRQ_FPGA_MB86943_PCI_INTA, - IRQ_FPGA_MB86943_SLBUS_SIDE, - IRQ_FPGA_RTL8029_INTA, - IRQ_FPGA_SYSINT_BUS_EXPANSION_13, - IRQ_FPGA_SL_BUS_EXPANSION_14, - IRQ_FPGA_NMI, -}; - - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_MB93091_FPGA_IRQS_H */ diff --git a/include/asm-frv/mb93093-fpga-irqs.h b/include/asm-frv/mb93093-fpga-irqs.h deleted file mode 100644 index 590266b..0000000 --- a/include/asm-frv/mb93093-fpga-irqs.h +++ /dev/null @@ -1,29 +0,0 @@ -/* mb93093-fpga-irqs.h: MB93093 CPU board FPGA IRQs - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB93093_FPGA_IRQS_H -#define _ASM_MB93093_FPGA_IRQS_H - -#include - -#ifndef __ASSEMBLY__ - -/* IRQ IDs presented to drivers */ -enum { - IRQ_FPGA_PUSH_BUTTON_SW1_5 = IRQ_BASE_FPGA + 8, - IRQ_FPGA_ROCKER_C_SW8 = IRQ_BASE_FPGA + 9, - IRQ_FPGA_ROCKER_C_SW9 = IRQ_BASE_FPGA + 10, -}; - - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_MB93093_FPGA_IRQS_H */ diff --git a/include/asm-frv/mb93493-irqs.h b/include/asm-frv/mb93493-irqs.h deleted file mode 100644 index 82c7aed..0000000 --- a/include/asm-frv/mb93493-irqs.h +++ /dev/null @@ -1,50 +0,0 @@ -/* mb93493-irqs.h: MB93493 companion chip IRQs - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB93493_IRQS_H -#define _ASM_MB93493_IRQS_H - -#include - -#ifndef __ASSEMBLY__ - -/* IRQ IDs presented to drivers */ -enum { - IRQ_MB93493_VDC = IRQ_BASE_MB93493 + 0, - IRQ_MB93493_VCC = IRQ_BASE_MB93493 + 1, - IRQ_MB93493_AUDIO_OUT = IRQ_BASE_MB93493 + 2, - IRQ_MB93493_I2C_0 = IRQ_BASE_MB93493 + 3, - IRQ_MB93493_I2C_1 = IRQ_BASE_MB93493 + 4, - IRQ_MB93493_USB = IRQ_BASE_MB93493 + 5, - IRQ_MB93493_LOCAL_BUS = IRQ_BASE_MB93493 + 7, - IRQ_MB93493_PCMCIA = IRQ_BASE_MB93493 + 8, - IRQ_MB93493_GPIO = IRQ_BASE_MB93493 + 9, - IRQ_MB93493_AUDIO_IN = IRQ_BASE_MB93493 + 10, -}; - -/* IRQ multiplexor mappings */ -#define ROUTE_VIA_IRQ0 0 /* route IRQ by way of CPU external IRQ 0 */ -#define ROUTE_VIA_IRQ1 1 /* route IRQ by way of CPU external IRQ 1 */ - -#define IRQ_MB93493_VDC_ROUTE ROUTE_VIA_IRQ0 -#define IRQ_MB93493_VCC_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_AUDIO_OUT_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_I2C_0_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_I2C_1_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_USB_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_LOCAL_BUS_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_PCMCIA_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_GPIO_ROUTE ROUTE_VIA_IRQ1 -#define IRQ_MB93493_AUDIO_IN_ROUTE ROUTE_VIA_IRQ1 - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_MB93493_IRQS_H */ diff --git a/include/asm-frv/mb93493-regs.h b/include/asm-frv/mb93493-regs.h deleted file mode 100644 index 8a1f6aa..0000000 --- a/include/asm-frv/mb93493-regs.h +++ /dev/null @@ -1,281 +0,0 @@ -/* mb93493-regs.h: MB93493 companion chip registers - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MB93493_REGS_H -#define _ASM_MB93493_REGS_H - -#include -#include - -#define __addr_MB93493(X) ((volatile unsigned long *)(__region_CS3 + (X))) -#define __get_MB93493(X) ({ *(volatile unsigned long *)(__region_CS3 + (X)); }) - -#define __set_MB93493(X,V) \ -do { \ - *(volatile unsigned long *)(__region_CS3 + (X)) = (V); mb(); \ -} while(0) - -#define __get_MB93493_STSR(X) __get_MB93493(0x3c0 + (X) * 4) -#define __set_MB93493_STSR(X,V) __set_MB93493(0x3c0 + (X) * 4, (V)) -#define MB93493_STSR_EN - -#define __addr_MB93493_IQSR(X) __addr_MB93493(0x3d0 + (X) * 4) -#define __get_MB93493_IQSR(X) __get_MB93493(0x3d0 + (X) * 4) -#define __set_MB93493_IQSR(X,V) __set_MB93493(0x3d0 + (X) * 4, (V)) - -#define __get_MB93493_DQSR(X) __get_MB93493(0x3e0 + (X) * 4) -#define __set_MB93493_DQSR(X,V) __set_MB93493(0x3e0 + (X) * 4, (V)) - -#define __get_MB93493_LBSER() __get_MB93493(0x3f0) -#define __set_MB93493_LBSER(V) __set_MB93493(0x3f0, (V)) - -#define MB93493_LBSER_VDC 0x00010000 -#define MB93493_LBSER_VCC 0x00020000 -#define MB93493_LBSER_AUDIO 0x00040000 -#define MB93493_LBSER_I2C_0 0x00080000 -#define MB93493_LBSER_I2C_1 0x00100000 -#define MB93493_LBSER_USB 0x00200000 -#define MB93493_LBSER_GPIO 0x00800000 -#define MB93493_LBSER_PCMCIA 0x01000000 - -#define __get_MB93493_LBSR() __get_MB93493(0x3fc) -#define __set_MB93493_LBSR(V) __set_MB93493(0x3fc, (V)) - -/* - * video display controller - */ -#define __get_MB93493_VDC(X) __get_MB93493(MB93493_VDC_##X) -#define __set_MB93493_VDC(X,V) __set_MB93493(MB93493_VDC_##X, (V)) - -#define MB93493_VDC_RCURSOR 0x140 /* cursor position */ -#define MB93493_VDC_RCT1 0x144 /* cursor colour 1 */ -#define MB93493_VDC_RCT2 0x148 /* cursor colour 2 */ -#define MB93493_VDC_RHDC 0x150 /* horizontal display period */ -#define MB93493_VDC_RH_MARGINS 0x154 /* horizontal margin sizes */ -#define MB93493_VDC_RVDC 0x158 /* vertical display period */ -#define MB93493_VDC_RV_MARGINS 0x15c /* vertical margin sizes */ -#define MB93493_VDC_RC 0x170 /* VDC control */ -#define MB93493_VDC_RCLOCK 0x174 /* clock divider, DMA req delay */ -#define MB93493_VDC_RBLACK 0x178 /* black insert sizes */ -#define MB93493_VDC_RS 0x17c /* VDC status */ - -#define __addr_MB93493_VDC_BCI(X) ({ (volatile unsigned long *)(__region_CS3 + 0x000 + (X)); }) -#define __addr_MB93493_VDC_TPO(X) (__region_CS3 + 0x1c0 + (X)) - -#define VDC_TPO_WIDTH 32 - -#define VDC_RC_DSR 0x00000080 /* VDC master reset */ - -#define VDC_RS_IT 0x00060000 /* interrupt indicators */ -#define VDC_RS_IT_UNDERFLOW 0x00040000 /* - underflow event */ -#define VDC_RS_IT_VSYNC 0x00020000 /* - VSYNC event */ -#define VDC_RS_DFI 0x00010000 /* current interlace field number */ -#define VDC_RS_DFI_TOP 0x00000000 /* - top field */ -#define VDC_RS_DFI_BOTTOM 0x00010000 /* - bottom field */ -#define VDC_RS_DCSR 0x00000010 /* cursor state */ -#define VDC_RS_DCM 0x00000003 /* display mode */ -#define VDC_RS_DCM_DISABLED 0x00000000 /* - display disabled */ -#define VDC_RS_DCM_STOPPED 0x00000001 /* - VDC stopped */ -#define VDC_RS_DCM_FREERUNNING 0x00000002 /* - VDC free-running */ -#define VDC_RS_DCM_TRANSFERRING 0x00000003 /* - data being transferred to VDC */ - -/* - * video capture controller - */ -#define __get_MB93493_VCC(X) __get_MB93493(MB93493_VCC_##X) -#define __set_MB93493_VCC(X,V) __set_MB93493(MB93493_VCC_##X, (V)) - -#define MB93493_VCC_RREDUCT 0x104 /* reduction rate */ -#define MB93493_VCC_RHY 0x108 /* horizontal brightness filter coefficients */ -#define MB93493_VCC_RHC 0x10c /* horizontal colour-difference filter coefficients */ -#define MB93493_VCC_RHSIZE 0x110 /* horizontal cycle sizes */ -#define MB93493_VCC_RHBC 0x114 /* horizontal back porch size */ -#define MB93493_VCC_RVCC 0x118 /* vertical capture period */ -#define MB93493_VCC_RVBC 0x11c /* vertical back porch period */ -#define MB93493_VCC_RV 0x120 /* vertical filter coefficients */ -#define MB93493_VCC_RDTS 0x128 /* DMA transfer size */ -#define MB93493_VCC_RDTS_4B 0x01000000 /* 4-byte transfer */ -#define MB93493_VCC_RDTS_32B 0x03000000 /* 32-byte transfer */ -#define MB93493_VCC_RDTS_SHIFT 24 -#define MB93493_VCC_RCC 0x130 /* VCC control */ -#define MB93493_VCC_RIS 0x134 /* VCC interrupt status */ - -#define __addr_MB93493_VCC_TPI(X) (__region_CS3 + 0x180 + (X)) - -#define VCC_RHSIZE_RHCC 0x000007ff -#define VCC_RHSIZE_RHCC_SHIFT 0 -#define VCC_RHSIZE_RHTCC 0x0fff0000 -#define VCC_RHSIZE_RHTCC_SHIFT 16 - -#define VCC_RVBC_RVBC 0x00003f00 -#define VCC_RVBC_RVBC_SHIFT 8 - -#define VCC_RREDUCT_RHR 0x07ff0000 -#define VCC_RREDUCT_RHR_SHIFT 16 -#define VCC_RREDUCT_RVR 0x000007ff -#define VCC_RREDUCT_RVR_SHIFT 0 - -#define VCC_RCC_CE 0x00000001 /* VCC enable */ -#define VCC_RCC_CS 0x00000002 /* request video capture start */ -#define VCC_RCC_CPF 0x0000000c /* pixel format */ -#define VCC_RCC_CPF_YCBCR_16 0x00000000 /* - YCbCr 4:2:2 16-bit format */ -#define VCC_RCC_CPF_RGB 0x00000004 /* - RGB 4:4:4 format */ -#define VCC_RCC_CPF_YCBCR_24 0x00000008 /* - YCbCr 4:2:2 24-bit format */ -#define VCC_RCC_CPF_BT656 0x0000000c /* - ITU R-BT.656 format */ -#define VCC_RCC_CPF_SHIFT 2 -#define VCC_RCC_CSR 0x00000080 /* request reset */ -#define VCC_RCC_HSIP 0x00000100 /* HSYNC polarity */ -#define VCC_RCC_HSIP_LOACT 0x00000000 /* - low active */ -#define VCC_RCC_HSIP_HIACT 0x00000100 /* - high active */ -#define VCC_RCC_VSIP 0x00000200 /* VSYNC polarity */ -#define VCC_RCC_VSIP_LOACT 0x00000000 /* - low active */ -#define VCC_RCC_VSIP_HIACT 0x00000200 /* - high active */ -#define VCC_RCC_CIE 0x00000800 /* interrupt enable */ -#define VCC_RCC_CFP 0x00001000 /* RGB pixel packing */ -#define VCC_RCC_CFP_4TO3 0x00000000 /* - pack 4 pixels into 3 words */ -#define VCC_RCC_CFP_1TO1 0x00001000 /* - pack 1 pixel into 1 words */ -#define VCC_RCC_CSM 0x00006000 /* interlace specification */ -#define VCC_RCC_CSM_ONEPASS 0x00002000 /* - non-interlaced */ -#define VCC_RCC_CSM_INTERLACE 0x00004000 /* - interlaced */ -#define VCC_RCC_CSM_SHIFT 13 -#define VCC_RCC_ES 0x00008000 /* capture start polarity */ -#define VCC_RCC_ES_NEG 0x00000000 /* - negative edge */ -#define VCC_RCC_ES_POS 0x00008000 /* - positive edge */ -#define VCC_RCC_IFI 0x00080000 /* inferlace field evaluation reverse */ -#define VCC_RCC_FDTS 0x00300000 /* interlace field start */ -#define VCC_RCC_FDTS_3_8 0x00000000 /* - 3/8 of horizontal entire cycle */ -#define VCC_RCC_FDTS_1_4 0x00100000 /* - 1/4 of horizontal entire cycle */ -#define VCC_RCC_FDTS_7_16 0x00200000 /* - 7/16 of horizontal entire cycle */ -#define VCC_RCC_FDTS_SHIFT 20 -#define VCC_RCC_MOV 0x00400000 /* test bit - always set to 1 */ -#define VCC_RCC_STP 0x00800000 /* request video capture stop */ -#define VCC_RCC_TO 0x01000000 /* input during top-field only */ - -#define VCC_RIS_VSYNC 0x01000000 /* VSYNC interrupt */ -#define VCC_RIS_OV 0x02000000 /* overflow interrupt */ -#define VCC_RIS_BOTTOM 0x08000000 /* interlace bottom field */ -#define VCC_RIS_STARTED 0x10000000 /* capture started */ - -/* - * I2C - */ -#define MB93493_I2C_BSR 0x340 /* bus status */ -#define MB93493_I2C_BCR 0x344 /* bus control */ -#define MB93493_I2C_CCR 0x348 /* clock control */ -#define MB93493_I2C_ADR 0x34c /* address */ -#define MB93493_I2C_DTR 0x350 /* data */ -#define MB93493_I2C_BC2R 0x35c /* bus control 2 */ - -#define __addr_MB93493_I2C(port,X) (__region_CS3 + MB93493_I2C_##X + ((port)*0x20)) -#define __get_MB93493_I2C(port,X) __get_MB93493(MB93493_I2C_##X + ((port)*0x20)) -#define __set_MB93493_I2C(port,X,V) __set_MB93493(MB93493_I2C_##X + ((port)*0x20), (V)) - -#define I2C_BSR_BB (1 << 7) - -/* - * audio controller (I2S) registers - */ -#define __get_MB93493_I2S(X) __get_MB93493(MB93493_I2S_##X) -#define __set_MB93493_I2S(X,V) __set_MB93493(MB93493_I2S_##X, (V)) - -#define MB93493_I2S_ALDR 0x300 /* L-channel data */ -#define MB93493_I2S_ARDR 0x304 /* R-channel data */ -#define MB93493_I2S_APDR 0x308 /* 16-bit packed data */ -#define MB93493_I2S_AISTR 0x310 /* status */ -#define MB93493_I2S_AICR 0x314 /* control */ - -#define __addr_MB93493_I2S_ALDR(X) (__region_CS3 + MB93493_I2S_ALDR + (X)) -#define __addr_MB93493_I2S_ARDR(X) (__region_CS3 + MB93493_I2S_ARDR + (X)) -#define __addr_MB93493_I2S_APDR(X) (__region_CS3 + MB93493_I2S_APDR + (X)) -#define __addr_MB93493_I2S_ADR(X) (__region_CS3 + 0x320 + (X)) - -#define I2S_AISTR_OTST 0x00000003 /* status of output data transfer */ -#define I2S_AISTR_OTR 0x00000010 /* output transfer request pending */ -#define I2S_AISTR_OUR 0x00000020 /* output FIFO underrun detected */ -#define I2S_AISTR_OOR 0x00000040 /* output FIFO overrun detected */ -#define I2S_AISTR_ODS 0x00000100 /* output DMA transfer size */ -#define I2S_AISTR_ODE 0x00000400 /* output DMA transfer request enable */ -#define I2S_AISTR_OTRIE 0x00001000 /* output transfer request interrupt enable */ -#define I2S_AISTR_OURIE 0x00002000 /* output FIFO underrun interrupt enable */ -#define I2S_AISTR_OORIE 0x00004000 /* output FIFO overrun interrupt enable */ -#define I2S_AISTR__OUT_MASK 0x00007570 -#define I2S_AISTR_ITST 0x00030000 /* status of input data transfer */ -#define I2S_AISTR_ITST_SHIFT 16 -#define I2S_AISTR_ITR 0x00100000 /* input transfer request pending */ -#define I2S_AISTR_IUR 0x00200000 /* input FIFO underrun detected */ -#define I2S_AISTR_IOR 0x00400000 /* input FIFO overrun detected */ -#define I2S_AISTR_IDS 0x01000000 /* input DMA transfer size */ -#define I2S_AISTR_IDE 0x04000000 /* input DMA transfer request enable */ -#define I2S_AISTR_ITRIE 0x10000000 /* input transfer request interrupt enable */ -#define I2S_AISTR_IURIE 0x20000000 /* input FIFO underrun interrupt enable */ -#define I2S_AISTR_IORIE 0x40000000 /* input FIFO overrun interrupt enable */ -#define I2S_AISTR__IN_MASK 0x75700000 - -#define I2S_AICR_MI 0x00000001 /* mono input requested */ -#define I2S_AICR_AMI 0x00000002 /* relation between LRCKI/FS1 and SDI */ -#define I2S_AICR_LRI 0x00000004 /* function of LRCKI pin */ -#define I2S_AICR_SDMI 0x00000070 /* format of input audio data */ -#define I2S_AICR_SDMI_SHIFT 4 -#define I2S_AICR_CLI 0x00000080 /* input FIFO clearing control */ -#define I2S_AICR_IM 0x00000300 /* input state control */ -#define I2S_AICR_IM_SHIFT 8 -#define I2S_AICR__IN_MASK 0x000003f7 -#define I2S_AICR_MO 0x00001000 /* mono output requested */ -#define I2S_AICR_AMO 0x00002000 /* relation between LRCKO/FS0 and SDO */ -#define I2S_AICR_AMO_SHIFT 13 -#define I2S_AICR_LRO 0x00004000 /* function of LRCKO pin */ -#define I2S_AICR_SDMO 0x00070000 /* format of output audio data */ -#define I2S_AICR_SDMO_SHIFT 16 -#define I2S_AICR_CLO 0x00080000 /* output FIFO clearing control */ -#define I2S_AICR_OM 0x00100000 /* output state control */ -#define I2S_AICR__OUT_MASK 0x001f7000 -#define I2S_AICR_DIV 0x03000000 /* frequency division rate */ -#define I2S_AICR_DIV_SHIFT 24 -#define I2S_AICR_FL 0x20000000 /* frame length */ -#define I2S_AICR_FS 0x40000000 /* frame sync method */ -#define I2S_AICR_ME 0x80000000 /* master enable */ - -/* - * PCMCIA - */ -#define __addr_MB93493_PCMCIA(X) ((volatile unsigned long *)(__region_CS5 + (X))) - -/* - * GPIO - */ -#define __get_MB93493_GPIO_PDR(X) __get_MB93493(0x380 + (X) * 0xc0) -#define __set_MB93493_GPIO_PDR(X,V) __set_MB93493(0x380 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_GPDR(X) __get_MB93493(0x384 + (X) * 0xc0) -#define __set_MB93493_GPIO_GPDR(X,V) __set_MB93493(0x384 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_SIR(X) __get_MB93493(0x388 + (X) * 0xc0) -#define __set_MB93493_GPIO_SIR(X,V) __set_MB93493(0x388 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_SOR(X) __get_MB93493(0x38c + (X) * 0xc0) -#define __set_MB93493_GPIO_SOR(X,V) __set_MB93493(0x38c + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_PDSR(X) __get_MB93493(0x390 + (X) * 0xc0) -#define __set_MB93493_GPIO_PDSR(X,V) __set_MB93493(0x390 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_PDCR(X) __get_MB93493(0x394 + (X) * 0xc0) -#define __set_MB93493_GPIO_PDCR(X,V) __set_MB93493(0x394 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_INTST(X) __get_MB93493(0x398 + (X) * 0xc0) -#define __set_MB93493_GPIO_INTST(X,V) __set_MB93493(0x398 + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_IEHL(X) __get_MB93493(0x39c + (X) * 0xc0) -#define __set_MB93493_GPIO_IEHL(X,V) __set_MB93493(0x39c + (X) * 0xc0, (V)) - -#define __get_MB93493_GPIO_IELH(X) __get_MB93493(0x3a0 + (X) * 0xc0) -#define __set_MB93493_GPIO_IELH(X,V) __set_MB93493(0x3a0 + (X) * 0xc0, (V)) - -#endif /* _ASM_MB93493_REGS_H */ diff --git a/include/asm-frv/mc146818rtc.h b/include/asm-frv/mc146818rtc.h deleted file mode 100644 index 90dfb7a..0000000 --- a/include/asm-frv/mc146818rtc.h +++ /dev/null @@ -1,16 +0,0 @@ -/* mc146818rtc.h: RTC defs - * - * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MC146818RTC_H -#define _ASM_MC146818RTC_H - - -#endif /* _ASM_MC146818RTC_H */ diff --git a/include/asm-frv/mem-layout.h b/include/asm-frv/mem-layout.h deleted file mode 100644 index 2947764..0000000 --- a/include/asm-frv/mem-layout.h +++ /dev/null @@ -1,86 +0,0 @@ -/* mem-layout.h: memory layout - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MEM_LAYOUT_H -#define _ASM_MEM_LAYOUT_H - -#ifndef __ASSEMBLY__ -#define __UL(X) ((unsigned long) (X)) -#else -#define __UL(X) (X) -#endif - -/* - * PAGE_SHIFT determines the page size - */ -#define PAGE_SHIFT 14 - -#ifndef __ASSEMBLY__ -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#else -#define PAGE_SIZE (1 << PAGE_SHIFT) -#endif - -#define PAGE_MASK (~(PAGE_SIZE-1)) - -/* - * the slab must be aligned such that load- and store-double instructions don't - * fault if used - */ -#define ARCH_KMALLOC_MINALIGN 8 -#define ARCH_SLAB_MINALIGN 8 - -/*****************************************************************************/ -/* - * virtual memory layout from kernel's point of view - */ -#define PAGE_OFFSET ((unsigned long) &__page_offset) - -#ifdef CONFIG_MMU - -/* see Documentation/frv/mmu-layout.txt */ -#define KERNEL_LOWMEM_START __UL(0xc0000000) -#define KERNEL_LOWMEM_END __UL(0xd0000000) -#define VMALLOC_START __UL(0xd0000000) -#define VMALLOC_END __UL(0xd8000000) -#define PKMAP_BASE __UL(0xd8000000) -#define PKMAP_END __UL(0xdc000000) -#define KMAP_ATOMIC_SECONDARY_FRAME __UL(0xdc000000) -#define KMAP_ATOMIC_PRIMARY_FRAME __UL(0xdd000000) - -#endif - -#define KERNEL_IO_START __UL(0xe0000000) - - -/*****************************************************************************/ -/* - * memory layout from userspace's point of view - */ -#define BRK_BASE __UL(2 * 1024 * 1024 + PAGE_SIZE) -#define STACK_TOP __UL(2 * 1024 * 1024) -#define STACK_TOP_MAX __UL(0xc0000000) - -/* userspace process size */ -#ifdef CONFIG_MMU -#define TASK_SIZE (PAGE_OFFSET) -#else -#define TASK_SIZE __UL(0xFFFFFFFFUL) -#endif - -/* base of area at which unspecified mmaps will start */ -#ifdef CONFIG_BINFMT_ELF_FDPIC -#define TASK_UNMAPPED_BASE __UL(16 * 1024 * 1024) -#else -#define TASK_UNMAPPED_BASE __UL(TASK_SIZE / 3) -#endif - -#endif /* _ASM_MEM_LAYOUT_H */ diff --git a/include/asm-frv/mman.h b/include/asm-frv/mman.h deleted file mode 100644 index b4371e9..0000000 --- a/include/asm-frv/mman.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __ASM_MMAN_H__ -#define __ASM_MMAN_H__ - -#include - -#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ -#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ -#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ -#define MAP_LOCKED 0x2000 /* pages are locked */ -#define MAP_NORESERVE 0x4000 /* don't check for reservations */ -#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ -#define MAP_NONBLOCK 0x10000 /* do not block on IO */ - -#define MCL_CURRENT 1 /* lock all current mappings */ -#define MCL_FUTURE 2 /* lock all future mappings */ - -#endif /* __ASM_MMAN_H__ */ - diff --git a/include/asm-frv/mmu.h b/include/asm-frv/mmu.h deleted file mode 100644 index 86ca0e8..0000000 --- a/include/asm-frv/mmu.h +++ /dev/null @@ -1,41 +0,0 @@ -/* mmu.h: memory management context for FR-V with or without MMU support - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_MMU_H -#define _ASM_MMU_H - -typedef struct { -#ifdef CONFIG_MMU - struct list_head id_link; /* link in list of context ID owners */ - unsigned short id; /* MMU context ID */ - unsigned short id_busy; /* true if ID is in CXNR */ - unsigned long itlb_cached_pge; /* [SCR0] PGE cached for insn TLB handler */ - unsigned long itlb_ptd_mapping; /* [DAMR4] PTD mapping for itlb cached PGE */ - unsigned long dtlb_cached_pge; /* [SCR1] PGE cached for data TLB handler */ - unsigned long dtlb_ptd_mapping; /* [DAMR5] PTD mapping for dtlb cached PGE */ - -#else - unsigned long end_brk; - -#endif - -#ifdef CONFIG_BINFMT_ELF_FDPIC - unsigned long exec_fdpic_loadmap; - unsigned long interp_fdpic_loadmap; -#endif - -} mm_context_t; - -#ifdef CONFIG_MMU -extern int __nongpreldata cxn_pinned; -extern int cxn_pin_by_pid(pid_t pid); -#endif - -#endif /* _ASM_MMU_H */ diff --git a/include/asm-frv/mmu_context.h b/include/asm-frv/mmu_context.h deleted file mode 100644 index c7daa39..0000000 --- a/include/asm-frv/mmu_context.h +++ /dev/null @@ -1,50 +0,0 @@ -/* mmu_context.h: MMU context management routines - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_MMU_CONTEXT_H -#define _ASM_MMU_CONTEXT_H - -#include -#include -#include -#include - -static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) -{ -} - -#ifdef CONFIG_MMU -extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); -extern void change_mm_context(mm_context_t *old, mm_context_t *ctx, pgd_t *_pgd); -extern void destroy_context(struct mm_struct *mm); - -#else -#define init_new_context(tsk, mm) ({ 0; }) -#define change_mm_context(old, ctx, _pml4) do {} while(0) -#define destroy_context(mm) do {} while(0) -#endif - -#define switch_mm(prev, next, tsk) \ -do { \ - if (prev != next) \ - change_mm_context(&prev->context, &next->context, next->pgd); \ -} while(0) - -#define activate_mm(prev, next) \ -do { \ - change_mm_context(&prev->context, &next->context, next->pgd); \ -} while(0) - -#define deactivate_mm(tsk, mm) \ -do { \ -} while(0) - -#endif diff --git a/include/asm-frv/module.h b/include/asm-frv/module.h deleted file mode 100644 index 3d5c636..0000000 --- a/include/asm-frv/module.h +++ /dev/null @@ -1,28 +0,0 @@ -/* module.h: FRV module stuff - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_MODULE_H -#define _ASM_MODULE_H - -struct mod_arch_specific -{ -}; - -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Ehdr Elf32_Ehdr - -/* - * Include the architecture version. - */ -#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " " - -#endif /* _ASM_MODULE_H */ - diff --git a/include/asm-frv/msgbuf.h b/include/asm-frv/msgbuf.h deleted file mode 100644 index 97ceb55..0000000 --- a/include/asm-frv/msgbuf.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _ASM_MSGBUF_H -#define _ASM_MSGBUF_H - -/* - * The msqid64_ds structure for FR-V architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct msqid64_ds { - struct ipc64_perm msg_perm; - __kernel_time_t msg_stime; /* last msgsnd time */ - unsigned long __unused1; - __kernel_time_t msg_rtime; /* last msgrcv time */ - unsigned long __unused2; - __kernel_time_t msg_ctime; /* last change time */ - unsigned long __unused3; - unsigned long msg_cbytes; /* current number of bytes on queue */ - unsigned long msg_qnum; /* number of messages in queue */ - unsigned long msg_qbytes; /* max number of bytes on queue */ - __kernel_pid_t msg_lspid; /* pid of last msgsnd */ - __kernel_pid_t msg_lrpid; /* last receive pid */ - unsigned long __unused4; - unsigned long __unused5; -}; - -#endif /* _ASM_MSGBUF_H */ - diff --git a/include/asm-frv/mutex.h b/include/asm-frv/mutex.h deleted file mode 100644 index 458c1f7..0000000 --- a/include/asm-frv/mutex.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Pull in the generic implementation for the mutex fastpath. - * - * TODO: implement optimized primitives instead, or leave the generic - * implementation in place, or pick the atomic_xchg() based generic - * implementation. (see asm-generic/mutex-xchg.h for details) - */ - -#include diff --git a/include/asm-frv/page.h b/include/asm-frv/page.h deleted file mode 100644 index bd9c220..0000000 --- a/include/asm-frv/page.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef _ASM_PAGE_H -#define _ASM_PAGE_H - -#include -#include -#include -#include - -#ifndef __ASSEMBLY__ - -#define get_user_page(vaddr) __get_free_page(GFP_KERNEL) -#define free_user_page(page, addr) free_page(addr) - -#define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) -#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE) - -#define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) -#define copy_user_page(vto, vfrom, vaddr, topg) memcpy((vto), (vfrom), PAGE_SIZE) - -/* - * These are used to make use of C type-checking.. - */ -typedef struct { unsigned long pte; } pte_t; -typedef struct { unsigned long ste[64];} pmd_t; -typedef struct { pmd_t pue[1]; } pud_t; -typedef struct { pud_t pge[1]; } pgd_t; -typedef struct { unsigned long pgprot; } pgprot_t; -typedef struct page *pgtable_t; - -#define pte_val(x) ((x).pte) -#define pmd_val(x) ((x).ste[0]) -#define pud_val(x) ((x).pue[0]) -#define pgd_val(x) ((x).pge[0]) -#define pgprot_val(x) ((x).pgprot) - -#define __pte(x) ((pte_t) { (x) } ) -#define __pmd(x) ((pmd_t) { (x) } ) -#define __pud(x) ((pud_t) { (x) } ) -#define __pgd(x) ((pgd_t) { (x) } ) -#define __pgprot(x) ((pgprot_t) { (x) } ) -#define PTE_MASK PAGE_MASK - -#define devmem_is_allowed(pfn) 1 - -#define __pa(vaddr) virt_to_phys((void *) (unsigned long) (vaddr)) -#define __va(paddr) phys_to_virt((unsigned long) (paddr)) - -#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) - -extern unsigned long max_low_pfn; -extern unsigned long min_low_pfn; -extern unsigned long max_pfn; - -#ifdef CONFIG_MMU -#define pfn_valid(pfn) ((pfn) < max_mapnr) -#else -#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) -#define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) - -#endif - -#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) - - -#ifdef CONFIG_MMU -#define VM_DATA_DEFAULT_FLAGS \ - (VM_READ | VM_WRITE | \ - ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ - VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -#endif - -#endif /* __ASSEMBLY__ */ - -#include -#include - -#endif /* _ASM_PAGE_H */ diff --git a/include/asm-frv/param.h b/include/asm-frv/param.h deleted file mode 100644 index 6859dd5..0000000 --- a/include/asm-frv/param.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _ASM_PARAM_H -#define _ASM_PARAM_H - -#ifdef __KERNEL__ -#define HZ CONFIG_HZ /* Internal kernel timer frequency */ -#define USER_HZ 100 /* .. some user interfaces are in "ticks" */ -#define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -#endif - -#ifndef HZ -#define HZ 100 -#endif - -#define EXEC_PAGESIZE 16384 - -#ifndef NOGROUP -#define NOGROUP (-1) -#endif - -#define MAXHOSTNAMELEN 64 /* max length of hostname */ - -#endif /* _ASM_PARAM_H */ diff --git a/include/asm-frv/pci.h b/include/asm-frv/pci.h deleted file mode 100644 index 585d9b4..0000000 --- a/include/asm-frv/pci.h +++ /dev/null @@ -1,118 +0,0 @@ -/* pci.h: FR-V specific PCI declarations - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from include/asm-m68k/pci.h - * - * 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. - */ - -#ifndef ASM_PCI_H -#define ASM_PCI_H - -#include -#include -#include -#include - -struct pci_dev; - -#define pcibios_assign_all_busses() 0 - -extern void pcibios_set_master(struct pci_dev *dev); - -extern void pcibios_penalize_isa_irq(int irq); - -#ifdef CONFIG_MMU -extern void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle); -extern void consistent_free(void *vaddr); -extern void consistent_sync(void *vaddr, size_t size, int direction); -extern void consistent_sync_page(struct page *page, unsigned long offset, - size_t size, int direction); -#endif - -extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, - dma_addr_t *dma_handle); - -extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, - void *vaddr, dma_addr_t dma_handle); - -/* Return the index of the PCI controller for device PDEV. */ -#define pci_controller_num(PDEV) (0) - -/* The PCI address space does equal the physical memory - * address space. The networking and block device layers use - * this boolean for bounce buffer decisions. - */ -#define PCI_DMA_BUS_IS_PHYS (1) - -/* pci_unmap_{page,single} is a nop so... */ -#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) -#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) -#define pci_unmap_addr(PTR, ADDR_NAME) (0) -#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) -#define pci_unmap_len(PTR, LEN_NAME) (0) -#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) - -#ifdef CONFIG_PCI -static inline void pci_dma_burst_advice(struct pci_dev *pdev, - enum pci_dma_burst_strategy *strat, - unsigned long *strategy_parameter) -{ - *strat = PCI_DMA_BURST_INFINITY; - *strategy_parameter = ~0UL; -} -#endif - -/* - * These are pretty much arbitary with the CoMEM implementation. - * We have the whole address space to ourselves. - */ -#define PCIBIOS_MIN_IO 0x100 -#define PCIBIOS_MIN_MEM 0x00010000 - -/* Make physical memory consistent for a single - * streaming mode DMA translation after a transfer. - * - * If you perform a pci_map_single() but wish to interrogate the - * buffer using the cpu, yet do not wish to teardown the PCI dma - * mapping, you must call this function before doing so. At the - * next point you give the PCI dma address back to the card, the - * device again owns the buffer. - */ -static inline void pci_dma_sync_single(struct pci_dev *hwdev, - dma_addr_t dma_handle, - size_t size, int direction) -{ - if (direction == PCI_DMA_NONE) - BUG(); - - frv_cache_wback_inv((unsigned long)bus_to_virt(dma_handle), - (unsigned long)bus_to_virt(dma_handle) + size); -} - -/* Make physical memory consistent for a set of streaming - * mode DMA translations after a transfer. - * - * The same as pci_dma_sync_single but for a scatter-gather list, - * same rules and usage. - */ -static inline void pci_dma_sync_sg(struct pci_dev *hwdev, - struct scatterlist *sg, - int nelems, int direction) -{ - int i; - - if (direction == PCI_DMA_NONE) - BUG(); - - for (i = 0; i < nelems; i++) - frv_cache_wback_inv(sg_dma_address(&sg[i]), - sg_dma_address(&sg[i])+sg_dma_len(&sg[i])); -} - - -#endif diff --git a/include/asm-frv/percpu.h b/include/asm-frv/percpu.h deleted file mode 100644 index 2cad3f8..0000000 --- a/include/asm-frv/percpu.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __ASM_PERCPU_H -#define __ASM_PERCPU_H - -#include - -#endif /* __ASM_PERCPU_H */ diff --git a/include/asm-frv/pgalloc.h b/include/asm-frv/pgalloc.h deleted file mode 100644 index 971e6ad..0000000 --- a/include/asm-frv/pgalloc.h +++ /dev/null @@ -1,69 +0,0 @@ -/* pgalloc.h: Page allocation routines for FRV - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - * - * Derived from: - * include/asm-m68knommu/pgalloc.h - * include/asm-i386/pgalloc.h - */ -#ifndef _ASM_PGALLOC_H -#define _ASM_PGALLOC_H - -#include -#include - -#ifdef CONFIG_MMU - -#define pmd_populate_kernel(mm, pmd, pte) __set_pmd(pmd, __pa(pte) | _PAGE_TABLE) -#define pmd_populate(MM, PMD, PAGE) \ -do { \ - __set_pmd((PMD), page_to_pfn(PAGE) << PAGE_SHIFT | _PAGE_TABLE); \ -} while(0) -#define pmd_pgtable(pmd) pmd_page(pmd) - -/* - * Allocate and free page tables. - */ - -extern pgd_t *pgd_alloc(struct mm_struct *); -extern void pgd_free(struct mm_struct *mm, pgd_t *); - -extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); - -extern pgtable_t pte_alloc_one(struct mm_struct *, unsigned long); - -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) -{ - free_page((unsigned long)pte); -} - -static inline void pte_free(struct mm_struct *mm, pgtable_t pte) -{ - pgtable_page_dtor(pte); - __free_page(pte); -} - -#define __pte_free_tlb(tlb,pte) \ -do { \ - pgtable_page_dtor(pte); \ - tlb_remove_page((tlb),(pte)); \ -} while (0) - -/* - * allocating and freeing a pmd is trivial: the 1-entry pmd is - * inside the pgd, so has no extra memory associated with it. - * (In the PAE case we free the pmds as part of the pgd.) - */ -#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); }) -#define pmd_free(mm, x) do { } while (0) -#define __pmd_free_tlb(tlb,x) do { } while (0) - -#endif /* CONFIG_MMU */ - -#endif /* _ASM_PGALLOC_H */ diff --git a/include/asm-frv/pgtable.h b/include/asm-frv/pgtable.h deleted file mode 100644 index 3323301..0000000 --- a/include/asm-frv/pgtable.h +++ /dev/null @@ -1,549 +0,0 @@ -/* pgtable.h: FR-V page table mangling - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - * - * Derived from: - * include/asm-m68knommu/pgtable.h - * include/asm-i386/pgtable.h - */ - -#ifndef _ASM_PGTABLE_H -#define _ASM_PGTABLE_H - -#include -#include -#include - -#ifndef __ASSEMBLY__ -#include -#include -#include -#include -#include -struct vm_area_struct; -#endif - -#ifndef __ASSEMBLY__ -#if defined(CONFIG_HIGHPTE) -typedef unsigned long pte_addr_t; -#else -typedef pte_t *pte_addr_t; -#endif -#endif - -/*****************************************************************************/ -/* - * MMU-less operation case first - */ -#ifndef CONFIG_MMU - -#define pgd_present(pgd) (1) /* pages are always present on NO_MM */ -#define pgd_none(pgd) (0) -#define pgd_bad(pgd) (0) -#define pgd_clear(pgdp) -#define kern_addr_valid(addr) (1) -#define pmd_offset(a, b) ((void *) 0) - -#define PAGE_NONE __pgprot(0) /* these mean nothing to NO_MM */ -#define PAGE_SHARED __pgprot(0) /* these mean nothing to NO_MM */ -#define PAGE_COPY __pgprot(0) /* these mean nothing to NO_MM */ -#define PAGE_READONLY __pgprot(0) /* these mean nothing to NO_MM */ -#define PAGE_KERNEL __pgprot(0) /* these mean nothing to NO_MM */ - -#define __swp_type(x) (0) -#define __swp_offset(x) (0) -#define __swp_entry(typ,off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) -#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) -#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) - -#ifndef __ASSEMBLY__ -static inline int pte_file(pte_t pte) { return 0; } -#endif - -#define ZERO_PAGE(vaddr) ({ BUG(); NULL; }) - -#define swapper_pg_dir ((pgd_t *) NULL) - -#define pgtable_cache_init() do {} while (0) - -#include - -#else /* !CONFIG_MMU */ -/*****************************************************************************/ -/* - * then MMU operation - */ - -/* - * ZERO_PAGE is a global shared page that is always zero: used - * for zero-mapped memory areas etc.. - */ -#ifndef __ASSEMBLY__ -extern unsigned long empty_zero_page; -#define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page) -#endif - -/* - * we use 2-level page tables, folding the PMD (mid-level table) into the PGE (top-level entry) - * [see Documentation/frv/mmu-layout.txt] - * - * Page Directory: - * - Size: 16KB - * - 64 PGEs per PGD - * - Each PGE holds 1 PUD and covers 64MB - * - * Page Upper Directory: - * - Size: 256B - * - 1 PUE per PUD - * - Each PUE holds 1 PMD and covers 64MB - * - * Page Mid-Level Directory - * - Size: 256B - * - 1 PME per PMD - * - Each PME holds 64 STEs, all of which point to separate chunks of the same Page Table - * - All STEs are instantiated at the same time - * - * Page Table - * - Size: 16KB - * - 4096 PTEs per PT - * - Each Linux PT is subdivided into 64 FR451 PT's, each of which holds 64 entries - * - * Pages - * - Size: 4KB - * - * total PTEs - * = 1 PML4E * 64 PGEs * 1 PUEs * 1 PMEs * 4096 PTEs - * = 1 PML4E * 64 PGEs * 64 STEs * 64 PTEs/FR451-PT - * = 262144 (or 256 * 1024) - */ -#define PGDIR_SHIFT 26 -#define PGDIR_SIZE (1UL << PGDIR_SHIFT) -#define PGDIR_MASK (~(PGDIR_SIZE - 1)) -#define PTRS_PER_PGD 64 - -#define PUD_SHIFT 26 -#define PTRS_PER_PUD 1 -#define PUD_SIZE (1UL << PUD_SHIFT) -#define PUD_MASK (~(PUD_SIZE - 1)) -#define PUE_SIZE 256 - -#define PMD_SHIFT 26 -#define PMD_SIZE (1UL << PMD_SHIFT) -#define PMD_MASK (~(PMD_SIZE - 1)) -#define PTRS_PER_PMD 1 -#define PME_SIZE 256 - -#define __frv_PT_SIZE 256 - -#define PTRS_PER_PTE 4096 - -#define USER_PGDS_IN_LAST_PML4 (TASK_SIZE / PGDIR_SIZE) -#define FIRST_USER_ADDRESS 0 - -#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT) -#define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS) - -#define TWOLEVEL_PGDIR_SHIFT 26 -#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT) -#define BOOT_KERNEL_PGD_PTRS (PTRS_PER_PGD - BOOT_USER_PGD_PTRS) - -#ifndef __ASSEMBLY__ - -extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; - -#define pte_ERROR(e) \ - printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte) -#define pmd_ERROR(e) \ - printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) -#define pud_ERROR(e) \ - printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(e))) -#define pgd_ERROR(e) \ - printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(pgd_val(e)))) - -/* - * Certain architectures need to do special things when PTEs - * within a page table are directly modified. Thus, the following - * hook is made available. - */ -#define set_pte(pteptr, pteval) \ -do { \ - *(pteptr) = (pteval); \ - asm volatile("dcf %M0" :: "U"(*pteptr)); \ -} while(0) -#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) - -/* - * pgd_offset() returns a (pgd_t *) - * pgd_index() is used get the offset into the pgd page's array of pgd_t's; - */ -#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) - -/* - * a shortcut which implies the use of the kernel's pgd, instead - * of a process's - */ -#define pgd_offset_k(address) pgd_offset(&init_mm, address) - -/* - * The "pgd_xxx()" functions here are trivial for a folded two-level - * setup: the pud is never bad, and a pud always exists (as it's folded - * into the pgd entry) - */ -static inline int pgd_none(pgd_t pgd) { return 0; } -static inline int pgd_bad(pgd_t pgd) { return 0; } -static inline int pgd_present(pgd_t pgd) { return 1; } -static inline void pgd_clear(pgd_t *pgd) { } - -#define pgd_populate(mm, pgd, pud) do { } while (0) -/* - * (puds are folded into pgds so this doesn't get actually called, - * but the define is needed for a generic inline function.) - */ -#define set_pgd(pgdptr, pgdval) \ -do { \ - memcpy((pgdptr), &(pgdval), sizeof(pgd_t)); \ - asm volatile("dcf %M0" :: "U"(*(pgdptr))); \ -} while(0) - -static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) -{ - return (pud_t *) pgd; -} - -#define pgd_page(pgd) (pud_page((pud_t){ pgd })) -#define pgd_page_vaddr(pgd) (pud_page_vaddr((pud_t){ pgd })) - -/* - * allocating and freeing a pud is trivial: the 1-entry pud is - * inside the pgd, so has no extra memory associated with it. - */ -#define pud_alloc_one(mm, address) NULL -#define pud_free(mm, x) do { } while (0) -#define __pud_free_tlb(tlb, x) do { } while (0) - -/* - * The "pud_xxx()" functions here are trivial for a folded two-level - * setup: the pmd is never bad, and a pmd always exists (as it's folded - * into the pud entry) - */ -static inline int pud_none(pud_t pud) { return 0; } -static inline int pud_bad(pud_t pud) { return 0; } -static inline int pud_present(pud_t pud) { return 1; } -static inline void pud_clear(pud_t *pud) { } - -#define pud_populate(mm, pmd, pte) do { } while (0) - -/* - * (pmds are folded into puds so this doesn't get actually called, - * but the define is needed for a generic inline function.) - */ -#define set_pud(pudptr, pudval) set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval }) - -#define pud_page(pud) (pmd_page((pmd_t){ pud })) -#define pud_page_vaddr(pud) (pmd_page_vaddr((pmd_t){ pud })) - -/* - * (pmds are folded into pgds so this doesn't get actually called, - * but the define is needed for a generic inline function.) - */ -extern void __set_pmd(pmd_t *pmdptr, unsigned long __pmd); - -#define set_pmd(pmdptr, pmdval) \ -do { \ - __set_pmd((pmdptr), (pmdval).ste[0]); \ -} while(0) - -#define __pmd_index(address) 0 - -static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address) -{ - return (pmd_t *) dir + __pmd_index(address); -} - -#define pte_same(a, b) ((a).pte == (b).pte) -#define pte_page(x) (mem_map + ((unsigned long)(((x).pte >> PAGE_SHIFT)))) -#define pte_none(x) (!(x).pte) -#define pte_pfn(x) ((unsigned long)(((x).pte >> PAGE_SHIFT))) -#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -#define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) - -#define VMALLOC_VMADDR(x) ((unsigned long) (x)) - -#endif /* !__ASSEMBLY__ */ - -/* - * control flags in AMPR registers and TLB entries - */ -#define _PAGE_BIT_PRESENT xAMPRx_V_BIT -#define _PAGE_BIT_WP DAMPRx_WP_BIT -#define _PAGE_BIT_NOCACHE xAMPRx_C_BIT -#define _PAGE_BIT_SUPER xAMPRx_S_BIT -#define _PAGE_BIT_ACCESSED xAMPRx_RESERVED8_BIT -#define _PAGE_BIT_DIRTY xAMPRx_M_BIT -#define _PAGE_BIT_NOTGLOBAL xAMPRx_NG_BIT - -#define _PAGE_PRESENT xAMPRx_V -#define _PAGE_WP DAMPRx_WP -#define _PAGE_NOCACHE xAMPRx_C -#define _PAGE_SUPER xAMPRx_S -#define _PAGE_ACCESSED xAMPRx_RESERVED8 /* accessed if set */ -#define _PAGE_DIRTY xAMPRx_M -#define _PAGE_NOTGLOBAL xAMPRx_NG - -#define _PAGE_RESERVED_MASK (xAMPRx_RESERVED8 | xAMPRx_RESERVED13) - -#define _PAGE_FILE 0x002 /* set:pagecache unset:swap */ -#define _PAGE_PROTNONE 0x000 /* If not present */ - -#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) - -#define __PGPROT_BASE \ - (_PAGE_PRESENT | xAMPRx_SS_16Kb | xAMPRx_D | _PAGE_NOTGLOBAL | _PAGE_ACCESSED) - -#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) -#define PAGE_SHARED __pgprot(__PGPROT_BASE) -#define PAGE_COPY __pgprot(__PGPROT_BASE | _PAGE_WP) -#define PAGE_READONLY __pgprot(__PGPROT_BASE | _PAGE_WP) - -#define __PAGE_KERNEL (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY) -#define __PAGE_KERNEL_NOCACHE (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_NOCACHE) -#define __PAGE_KERNEL_RO (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_WP) - -#define MAKE_GLOBAL(x) __pgprot((x) & ~_PAGE_NOTGLOBAL) - -#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL) -#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) -#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) - -#define _PAGE_TABLE (_PAGE_PRESENT | xAMPRx_SS_16Kb) - -#ifndef __ASSEMBLY__ - -/* - * The FR451 can do execute protection by virtue of having separate TLB miss handlers for - * instruction access and for data access. However, we don't have enough reserved bits to say - * "execute only", so we don't bother. If you can read it, you can execute it and vice versa. - */ -#define __P000 PAGE_NONE -#define __P001 PAGE_READONLY -#define __P010 PAGE_COPY -#define __P011 PAGE_COPY -#define __P100 PAGE_READONLY -#define __P101 PAGE_READONLY -#define __P110 PAGE_COPY -#define __P111 PAGE_COPY - -#define __S000 PAGE_NONE -#define __S001 PAGE_READONLY -#define __S010 PAGE_SHARED -#define __S011 PAGE_SHARED -#define __S100 PAGE_READONLY -#define __S101 PAGE_READONLY -#define __S110 PAGE_SHARED -#define __S111 PAGE_SHARED - -/* - * Define this to warn about kernel memory accesses that are - * done without a 'access_ok(VERIFY_WRITE,..)' - */ -#undef TEST_ACCESS_OK - -#define pte_present(x) (pte_val(x) & _PAGE_PRESENT) -#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) - -#define pmd_none(x) (!pmd_val(x)) -#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) -#define pmd_bad(x) (pmd_val(x) & xAMPRx_SS) -#define pmd_clear(xp) do { __set_pmd(xp, 0); } while(0) - -#define pmd_page_vaddr(pmd) \ - ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) - -#ifndef CONFIG_DISCONTIGMEM -#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) -#endif - -#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) - -/* - * The following only work if pte_present() is true. - * Undefined behaviour if not.. - */ -static inline int pte_dirty(pte_t pte) { return (pte).pte & _PAGE_DIRTY; } -static inline int pte_young(pte_t pte) { return (pte).pte & _PAGE_ACCESSED; } -static inline int pte_write(pte_t pte) { return !((pte).pte & _PAGE_WP); } -static inline int pte_special(pte_t pte) { return 0; } - -static inline pte_t pte_mkclean(pte_t pte) { (pte).pte &= ~_PAGE_DIRTY; return pte; } -static inline pte_t pte_mkold(pte_t pte) { (pte).pte &= ~_PAGE_ACCESSED; return pte; } -static inline pte_t pte_wrprotect(pte_t pte) { (pte).pte |= _PAGE_WP; return pte; } -static inline pte_t pte_mkdirty(pte_t pte) { (pte).pte |= _PAGE_DIRTY; return pte; } -static inline pte_t pte_mkyoung(pte_t pte) { (pte).pte |= _PAGE_ACCESSED; return pte; } -static inline pte_t pte_mkwrite(pte_t pte) { (pte).pte &= ~_PAGE_WP; return pte; } -static inline pte_t pte_mkspecial(pte_t pte) { return pte; } - -static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) -{ - int i = test_and_clear_bit(_PAGE_BIT_ACCESSED, ptep); - asm volatile("dcf %M0" :: "U"(*ptep)); - return i; -} - -static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) -{ - unsigned long x = xchg(&ptep->pte, 0); - asm volatile("dcf %M0" :: "U"(*ptep)); - return __pte(x); -} - -static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) -{ - set_bit(_PAGE_BIT_WP, ptep); - asm volatile("dcf %M0" :: "U"(*ptep)); -} - -/* - * Macro to mark a page protection value as "uncacheable" - */ -#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NOCACHE)) - -/* - * Conversion functions: convert a page and protection to a page entry, - * and a page entry and page directory to the page they refer to. - */ - -#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) -#define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE) - -/* This takes a physical page address that is used by the remapping functions */ -#define mk_pte_phys(physpage, pgprot) pfn_pte((physpage) >> PAGE_SHIFT, pgprot) - -static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) -{ - pte.pte &= _PAGE_CHG_MASK; - pte.pte |= pgprot_val(newprot); - return pte; -} - -/* to find an entry in a page-table-directory. */ -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) -#define pgd_index_k(addr) pgd_index(addr) - -/* Find an entry in the bottom-level page table.. */ -#define __pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) - -/* - * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] - * - * this macro returns the index of the entry in the pte page which would - * control the given virtual address - */ -#define pte_index(address) \ - (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define pte_offset_kernel(dir, address) \ - ((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(address)) - -#if defined(CONFIG_HIGHPTE) -#define pte_offset_map(dir, address) \ - ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + pte_index(address)) -#define pte_offset_map_nested(dir, address) \ - ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + pte_index(address)) -#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0) -#define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) -#else -#define pte_offset_map(dir, address) \ - ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address)) -#define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address)) -#define pte_unmap(pte) do { } while (0) -#define pte_unmap_nested(pte) do { } while (0) -#endif - -/* - * Handle swap and file entries - * - the PTE is encoded in the following format: - * bit 0: Must be 0 (!_PAGE_PRESENT) - * bit 1: Type: 0 for swap, 1 for file (_PAGE_FILE) - * bits 2-7: Swap type - * bits 8-31: Swap offset - * bits 2-31: File pgoff - */ -#define __swp_type(x) (((x).val >> 2) & 0x1f) -#define __swp_offset(x) ((x).val >> 8) -#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) }) -#define __pte_to_swp_entry(_pte) ((swp_entry_t) { (_pte).pte }) -#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) - -static inline int pte_file(pte_t pte) -{ - return pte.pte & _PAGE_FILE; -} - -#define PTE_FILE_MAX_BITS 29 - -#define pte_to_pgoff(PTE) ((PTE).pte >> 2) -#define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE) - -/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ -#define PageSkip(page) (0) -#define kern_addr_valid(addr) (1) - -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ - remap_pfn_range(vma, vaddr, pfn, size, prot) - -#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG -#define __HAVE_ARCH_PTEP_GET_AND_CLEAR -#define __HAVE_ARCH_PTEP_SET_WRPROTECT -#define __HAVE_ARCH_PTE_SAME -#include - -/* - * preload information about a newly instantiated PTE into the SCR0/SCR1 PGE cache - */ -static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) -{ - struct mm_struct *mm; - unsigned long ampr; - - mm = current->mm; - if (mm) { - pgd_t *pge = pgd_offset(mm, address); - pud_t *pue = pud_offset(pge, address); - pmd_t *pme = pmd_offset(pue, address); - - ampr = pme->ste[0] & 0xffffff00; - ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | - xAMPRx_V; - } else { - address = ULONG_MAX; - ampr = 0; - } - - asm volatile("movgs %0,scr0\n" - "movgs %0,scr1\n" - "movgs %1,dampr4\n" - "movgs %1,dampr5\n" - : - : "r"(address), "r"(ampr) - ); -} - -#ifdef CONFIG_PROC_FS -extern char *proc_pid_status_frv_cxnr(struct mm_struct *mm, char *buffer); -#endif - -extern void __init pgtable_cache_init(void); - -#endif /* !__ASSEMBLY__ */ -#endif /* !CONFIG_MMU */ - -#ifndef __ASSEMBLY__ -extern void __init paging_init(void); -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_PGTABLE_H */ diff --git a/include/asm-frv/poll.h b/include/asm-frv/poll.h deleted file mode 100644 index 0d01479..0000000 --- a/include/asm-frv/poll.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_POLL_H -#define _ASM_POLL_H - -#define POLLWRNORM POLLOUT -#define POLLWRBAND 256 - -#include - -#undef POLLREMOVE - -#endif - diff --git a/include/asm-frv/posix_types.h b/include/asm-frv/posix_types.h deleted file mode 100644 index a9f1f5b..0000000 --- a/include/asm-frv/posix_types.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef _ASM_POSIX_TYPES_H -#define _ASM_POSIX_TYPES_H - -/* - * This file is generally used by user-level software, so you need to - * be a little careful about namespace pollution etc. Also, we cannot - * assume GCC is being used. - */ - -typedef unsigned long __kernel_ino_t; -typedef unsigned short __kernel_mode_t; -typedef unsigned short __kernel_nlink_t; -typedef long __kernel_off_t; -typedef int __kernel_pid_t; -typedef unsigned short __kernel_ipc_pid_t; -typedef unsigned short __kernel_uid_t; -typedef unsigned short __kernel_gid_t; -typedef unsigned int __kernel_size_t; -typedef int __kernel_ssize_t; -typedef int __kernel_ptrdiff_t; -typedef long __kernel_time_t; -typedef long __kernel_suseconds_t; -typedef long __kernel_clock_t; -typedef int __kernel_timer_t; -typedef int __kernel_clockid_t; -typedef int __kernel_daddr_t; -typedef char * __kernel_caddr_t; -typedef unsigned short __kernel_uid16_t; -typedef unsigned short __kernel_gid16_t; -typedef unsigned int __kernel_uid32_t; -typedef unsigned int __kernel_gid32_t; - -typedef unsigned short __kernel_old_uid_t; -typedef unsigned short __kernel_old_gid_t; -typedef unsigned short __kernel_old_dev_t; - -#ifdef __GNUC__ -typedef long long __kernel_loff_t; -#endif - -typedef struct { - int val[2]; -} __kernel_fsid_t; - -#if defined(__KERNEL__) - -#undef __FD_SET -#define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) - -#undef __FD_CLR -#define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) - -#undef __FD_ISSET -#define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) - -#undef __FD_ZERO -#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) - -#endif /* defined(__KERNEL__) */ - -#endif - diff --git a/include/asm-frv/processor.h b/include/asm-frv/processor.h deleted file mode 100644 index 3744f2e..0000000 --- a/include/asm-frv/processor.h +++ /dev/null @@ -1,153 +0,0 @@ -/* processor.h: FRV processor definitions - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_PROCESSOR_H -#define _ASM_PROCESSOR_H - -#include - -#ifndef __ASSEMBLY__ -/* - * Default implementation of macro that returns current - * instruction pointer ("program counter"). - */ -#define current_text_addr() ({ __label__ _l; _l: &&_l;}) - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Forward declaration, a strange C thing */ -struct task_struct; - -/* - * CPU type and hardware bug flags. Kept separately for each CPU. - */ -struct cpuinfo_frv { -#ifdef CONFIG_MMU - unsigned long *pgd_quick; - unsigned long *pte_quick; - unsigned long pgtable_cache_sz; -#endif -} __cacheline_aligned; - -extern struct cpuinfo_frv __nongprelbss boot_cpu_data; - -#define cpu_data (&boot_cpu_data) -#define current_cpu_data boot_cpu_data - -/* - * Bus types - */ -#define EISA_bus 0 -#define MCA_bus 0 - -struct thread_struct { - struct pt_regs *frame; /* [GR28] exception frame ptr for this thread */ - struct task_struct *curr; /* [GR29] current pointer for this thread */ - unsigned long sp; /* [GR1 ] kernel stack pointer */ - unsigned long fp; /* [GR2 ] kernel frame pointer */ - unsigned long lr; /* link register */ - unsigned long pc; /* program counter */ - unsigned long gr[12]; /* [GR16-GR27] */ - unsigned long sched_lr; /* LR from schedule() */ - - union { - struct pt_regs *frame0; /* top (user) stack frame */ - struct user_context *user; /* userspace context */ - }; -} __attribute__((aligned(8))); - -extern struct pt_regs *__kernel_frame0_ptr; -extern struct task_struct *__kernel_current_task; - -#endif - -#ifndef __ASSEMBLY__ -#define INIT_THREAD_FRAME0 \ - ((struct pt_regs *) \ - (sizeof(init_stack) + (unsigned long) init_stack - sizeof(struct user_context))) - -#define INIT_THREAD { \ - NULL, \ - (struct task_struct *) init_stack, \ - 0, 0, 0, 0, \ - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ - 0, \ - { INIT_THREAD_FRAME0 }, \ -} - -/* - * do necessary setup to start up a newly executed thread. - * - need to discard the frame stacked by init() invoking the execve syscall - */ -#define start_thread(_regs, _pc, _usp) \ -do { \ - set_fs(USER_DS); /* reads from user space */ \ - __frame = __kernel_frame0_ptr; \ - __frame->pc = (_pc); \ - __frame->psr &= ~PSR_S; \ - __frame->sp = (_usp); \ -} while(0) - -extern void prepare_to_copy(struct task_struct *tsk); - -/* Free all resources held by a thread. */ -static inline void release_thread(struct task_struct *dead_task) -{ -} - -extern asmlinkage int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -extern asmlinkage void save_user_regs(struct user_context *target); -extern asmlinkage void *restore_user_regs(const struct user_context *target, ...); - -#define copy_segments(tsk, mm) do { } while (0) -#define release_segments(mm) do { } while (0) -#define forget_segments() do { } while (0) - -/* - * Free current thread data structures etc.. - */ -static inline void exit_thread(void) -{ -} - -/* - * Return saved PC of a blocked thread. - */ -extern unsigned long thread_saved_pc(struct task_struct *tsk); - -unsigned long get_wchan(struct task_struct *p); - -#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc) -#define KSTK_ESP(tsk) ((tsk)->thread.frame0->sp) - -/* Allocation and freeing of basic task resources. */ -extern struct task_struct *alloc_task_struct(void); -extern void free_task_struct(struct task_struct *p); - -#define cpu_relax() barrier() - -/* data cache prefetch */ -#define ARCH_HAS_PREFETCH -static inline void prefetch(const void *x) -{ - asm volatile("dcpl %0,gr0,#0" : : "r"(x)); -} - -#endif /* __ASSEMBLY__ */ -#endif /* _ASM_PROCESSOR_H */ diff --git a/include/asm-frv/ptrace.h b/include/asm-frv/ptrace.h deleted file mode 100644 index cf69340..0000000 --- a/include/asm-frv/ptrace.h +++ /dev/null @@ -1,83 +0,0 @@ -/* ptrace.h: ptrace() relevant definitions - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_PTRACE_H -#define _ASM_PTRACE_H - -#include -#ifdef __KERNEL__ -#include - -#define in_syscall(regs) (((regs)->tbr & TBR_TT) == TBR_TT_TRAP0) -#endif - - -#define PT_PSR 0 -#define PT_ISR 1 -#define PT_CCR 2 -#define PT_CCCR 3 -#define PT_LR 4 -#define PT_LCR 5 -#define PT_PC 6 - -#define PT__STATUS 7 /* exception status */ -#define PT_SYSCALLNO 8 /* syscall number or -1 */ -#define PT_ORIG_GR8 9 /* saved GR8 for signal handling */ -#define PT_GNER0 10 -#define PT_GNER1 11 -#define PT_IACC0H 12 -#define PT_IACC0L 13 - -#define PT_GR(j) ( 14 + (j)) /* GRj for 0<=j<=63 */ -#define PT_FR(j) ( 78 + (j)) /* FRj for 0<=j<=63 */ -#define PT_FNER(j) (142 + (j)) /* FNERj for 0<=j<=1 */ -#define PT_MSR(j) (144 + (j)) /* MSRj for 0<=j<=2 */ -#define PT_ACC(j) (146 + (j)) /* ACCj for 0<=j<=7 */ -#define PT_ACCG(jklm) (154 + (jklm)) /* ACCGjklm for 0<=jklm<=1 (reads four regs per slot) */ -#define PT_FSR(j) (156 + (j)) /* FSRj for 0<=j<=0 */ -#define PT__GPEND 78 -#define PT__END 157 - -#define PT_TBR PT_GR(0) -#define PT_SP PT_GR(1) -#define PT_FP PT_GR(2) -#define PT_PREV_FRAME PT_GR(28) /* previous exception frame pointer (old gr28 value) */ -#define PT_CURR_TASK PT_GR(29) /* current task */ - - -/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ -#define PTRACE_GETREGS 12 -#define PTRACE_SETREGS 13 -#define PTRACE_GETFPREGS 14 -#define PTRACE_SETFPREGS 15 -#define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */ - -#define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ -#define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ - -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -/* - * we dedicate GR28 to keeping a pointer to the current exception frame - * - gr28 is destroyed on entry to the kernel from userspace - */ -register struct pt_regs *__frame asm("gr28"); - -#define user_mode(regs) (!((regs)->psr & PSR_S)) -#define instruction_pointer(regs) ((regs)->pc) - -extern unsigned long user_stack(const struct pt_regs *); -extern void show_regs(struct pt_regs *); -#define profile_pc(regs) ((regs)->pc) -#endif - -#endif /* !__ASSEMBLY__ */ -#endif /* _ASM_PTRACE_H */ diff --git a/include/asm-frv/registers.h b/include/asm-frv/registers.h deleted file mode 100644 index 9666119..0000000 --- a/include/asm-frv/registers.h +++ /dev/null @@ -1,232 +0,0 @@ -/* registers.h: register frame declarations - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -/* - * notes: - * - * (1) that the members of all these structures are carefully aligned to permit - * usage of STD/STDF instructions - * - * (2) if you change these structures, you must change the code in - * arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c} - * - * - * the kernel stack space block looks like this: - * - * +0x2000 +---------------------- - * | union { - * | struct frv_frame0 { - * | struct user_context { - * | struct user_int_regs - * | struct user_fpmedia_regs - * | } - * | struct frv_debug_regs - * | } - * | struct pt_regs [user exception] - * | } - * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) - * | - * | kernel stack - * | - * |...................... - * | struct pt_regs [kernel exception] - * |...................... <-- __kernel_frame0_ptr (maybe GR28) - * | - * | kernel stack - * | - * |...................... <-- stack pointer (GR1) - * | - * | unused stack space - * | - * +---------------------- - * | struct thread_info - * +0x0000 +---------------------- <-- __current_thread_info (GR15); - * - * note that GR28 points to the current exception frame - */ - -#ifndef _ASM_REGISTERS_H -#define _ASM_REGISTERS_H - -#ifndef __ASSEMBLY__ -#define __OFFSET(X,N) ((X)+(N)*4) -#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx -#else -#define __OFFSET(X,N) ((X)+(N)*4) -#define __OFFSETC(X,N) ((X)+(N)) -#endif - -/*****************************************************************************/ -/* - * Exception/Interrupt frame - * - held on kernel stack - * - 8-byte aligned on stack (old SP is saved in frame) - * - GR0 is fixed 0, so we don't save it - */ -#ifndef __ASSEMBLY__ - -struct pt_regs { - unsigned long psr; /* Processor Status Register */ - unsigned long isr; /* Integer Status Register */ - unsigned long ccr; /* Condition Code Register */ - unsigned long cccr; /* Condition Code for Conditional Insns Register */ - unsigned long lr; /* Link Register */ - unsigned long lcr; /* Loop Count Register */ - unsigned long pc; /* Program Counter Register */ - unsigned long __status; /* exception status */ - unsigned long syscallno; /* syscall number or -1 */ - unsigned long orig_gr8; /* original syscall arg #1 */ - unsigned long gner0; - unsigned long gner1; - unsigned long long iacc0; - unsigned long tbr; /* GR0 is fixed zero, so we use this for TBR */ - unsigned long sp; /* GR1: USP/KSP */ - unsigned long fp; /* GR2: FP */ - unsigned long gr3; - unsigned long gr4; - unsigned long gr5; - unsigned long gr6; - unsigned long gr7; /* syscall number */ - unsigned long gr8; /* 1st syscall param; syscall return */ - unsigned long gr9; /* 2nd syscall param */ - unsigned long gr10; /* 3rd syscall param */ - unsigned long gr11; /* 4th syscall param */ - unsigned long gr12; /* 5th syscall param */ - unsigned long gr13; /* 6th syscall param */ - unsigned long gr14; - unsigned long gr15; - unsigned long gr16; /* GP pointer */ - unsigned long gr17; /* small data */ - unsigned long gr18; /* PIC/PID */ - unsigned long gr19; - unsigned long gr20; - unsigned long gr21; - unsigned long gr22; - unsigned long gr23; - unsigned long gr24; - unsigned long gr25; - unsigned long gr26; - unsigned long gr27; - struct pt_regs *next_frame; /* GR28 - next exception frame */ - unsigned long gr29; /* GR29 - OS reserved */ - unsigned long gr30; /* GR30 - OS reserved */ - unsigned long gr31; /* GR31 - OS reserved */ -} __attribute__((aligned(8))); - -#endif - -#define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ -#define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ -#define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ -#define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ -#define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ - -#define REG_GR(R) __OFFSET(REG_GR0, (R)) - -#define REG_SP REG_GR(1) -#define REG_FP REG_GR(2) -#define REG_PREV_FRAME REG_GR(28) /* previous exception frame pointer (old gr28 value) */ -#define REG_CURR_TASK REG_GR(29) /* current task */ - -/*****************************************************************************/ -/* - * debugging registers - */ -#ifndef __ASSEMBLY__ - -struct frv_debug_regs -{ - unsigned long dcr; - unsigned long ibar[4] __attribute__((aligned(8))); - unsigned long dbar[4] __attribute__((aligned(8))); - unsigned long dbdr[4][4] __attribute__((aligned(8))); - unsigned long dbmr[4][4] __attribute__((aligned(8))); -} __attribute__((aligned(8))); - -#endif - -/*****************************************************************************/ -/* - * userspace registers - */ -#ifndef __ASSEMBLY__ - -struct user_int_regs -{ - /* integer registers - * - up to gr[31] mirror pt_regs - * - total size must be multiple of 8 bytes - */ - unsigned long psr; /* Processor Status Register */ - unsigned long isr; /* Integer Status Register */ - unsigned long ccr; /* Condition Code Register */ - unsigned long cccr; /* Condition Code for Conditional Insns Register */ - unsigned long lr; /* Link Register */ - unsigned long lcr; /* Loop Count Register */ - unsigned long pc; /* Program Counter Register */ - unsigned long __status; /* exception status */ - unsigned long syscallno; /* syscall number or -1 */ - unsigned long orig_gr8; /* original syscall arg #1 */ - unsigned long gner[2]; - unsigned long long iacc[1]; - - union { - unsigned long tbr; - unsigned long gr[64]; - }; -}; - -struct user_fpmedia_regs -{ - /* FP/Media registers */ - unsigned long fr[64]; - unsigned long fner[2]; - unsigned long msr[2]; - unsigned long acc[8]; - unsigned char accg[8]; - unsigned long fsr[1]; -}; - -struct user_context -{ - struct user_int_regs i; - struct user_fpmedia_regs f; - - /* we provide a context extension so that we can save the regs for CPUs that - * implement many more of Fujitsu's lavish register spec - */ - void *extension; -} __attribute__((aligned(8))); - -struct frv_frame0 { - union { - struct pt_regs regs; - struct user_context uc; - }; - - struct frv_debug_regs debug; - -} __attribute__((aligned(32))); - -#endif - -#define __INT_GR(R) __OFFSET(__INT_GR0, (R)) - -#define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R)) -#define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R)) -#define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R)) -#define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R)) -#define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R)) -#define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R)) - -#define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16) - -#endif /* _ASM_REGISTERS_H */ diff --git a/include/asm-frv/resource.h b/include/asm-frv/resource.h deleted file mode 100644 index 5fc6054..0000000 --- a/include/asm-frv/resource.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _ASM_RESOURCE_H -#define _ASM_RESOURCE_H - -#include - -#endif /* _ASM_RESOURCE_H */ - diff --git a/include/asm-frv/scatterlist.h b/include/asm-frv/scatterlist.h deleted file mode 100644 index 4bca8a2..0000000 --- a/include/asm-frv/scatterlist.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _ASM_SCATTERLIST_H -#define _ASM_SCATTERLIST_H - -#include - -/* - * Drivers must set either ->address or (preferred) page and ->offset - * to indicate where data must be transferred to/from. - * - * Using page is recommended since it handles highmem data as well as - * low mem. ->address is restricted to data which has a virtual mapping, and - * it will go away in the future. Updating to page can be automated very - * easily -- something like - * - * sg->address = some_ptr; - * - * can be rewritten as - * - * sg_set_buf(sg, some_ptr, length); - * - * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens - */ -struct scatterlist { -#ifdef CONFIG_DEBUG_SG - unsigned long sg_magic; -#endif - unsigned long page_link; - unsigned int offset; /* for highmem, page offset */ - - dma_addr_t dma_address; - unsigned int length; -}; - -/* - * These macros should be used after a pci_map_sg call has been done - * to get bus addresses of each of the SG entries and their lengths. - * You should only work with the number of sg entries pci_map_sg - * returns, or alternatively stop on the first sg_dma_len(sg) which - * is 0. - */ -#define sg_dma_address(sg) ((sg)->dma_address) -#define sg_dma_len(sg) ((sg)->length) - -#define ISA_DMA_THRESHOLD (0xffffffffUL) - -#endif /* !_ASM_SCATTERLIST_H */ diff --git a/include/asm-frv/sections.h b/include/asm-frv/sections.h deleted file mode 100644 index 17d0fb1..0000000 --- a/include/asm-frv/sections.h +++ /dev/null @@ -1,46 +0,0 @@ -/* sections.h: linkage layout variables - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SECTIONS_H -#define _ASM_SECTIONS_H - -#ifndef __ASSEMBLY__ - -#include -#include - -#ifdef __KERNEL__ - -/* - * we don't want to put variables in the GP-REL section if they're not used very much - that would - * be waste since GP-REL addressing is limited to GP16+/-2048 - */ -#define __nongpreldata __attribute__((section(".data"))) -#define __nongprelbss __attribute__((section(".bss"))) - -/* - * linker symbols - */ -extern const void __kernel_image_start, __kernel_image_end, __page_offset; - -extern unsigned long __nongprelbss memory_start; -extern unsigned long __nongprelbss memory_end; -extern unsigned long __nongprelbss rom_length; - -/* determine if we're running from ROM */ -static inline int is_in_rom(unsigned long addr) -{ - return 0; /* default case: not in ROM */ -} - -#endif -#endif -#endif /* _ASM_SECTIONS_H */ diff --git a/include/asm-frv/segment.h b/include/asm-frv/segment.h deleted file mode 100644 index e3616a6..0000000 --- a/include/asm-frv/segment.h +++ /dev/null @@ -1,45 +0,0 @@ -/* segment.h: MMU segment settings - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SEGMENT_H -#define _ASM_SEGMENT_H - - -#ifndef __ASSEMBLY__ - -typedef struct { - unsigned long seg; -} mm_segment_t; - -#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) - -#define KERNEL_DS MAKE_MM_SEG(0xdfffffffUL) - -#ifdef CONFIG_MMU -#define USER_DS MAKE_MM_SEG(TASK_SIZE - 1) -#else -#define USER_DS KERNEL_DS -#endif - -#define get_ds() (KERNEL_DS) -#define get_fs() (__current_thread_info->addr_limit) -#define segment_eq(a,b) ((a).seg == (b).seg) -#define __kernel_ds_p() segment_eq(get_fs(), KERNEL_DS) -#define get_addr_limit() (get_fs().seg) - -#define set_fs(_x) \ -do { \ - __current_thread_info->addr_limit = (_x); \ -} while(0) - - -#endif /* __ASSEMBLY__ */ -#endif /* _ASM_SEGMENT_H */ diff --git a/include/asm-frv/sembuf.h b/include/asm-frv/sembuf.h deleted file mode 100644 index 164b127..0000000 --- a/include/asm-frv/sembuf.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _ASM_SEMBUF_H -#define _ASM_SEMBUF_H - -/* - * The semid64_ds structure for FR-V architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct semid64_ds { - struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ - __kernel_time_t sem_otime; /* last semop time */ - unsigned long __unused1; - __kernel_time_t sem_ctime; /* last change time */ - unsigned long __unused2; - unsigned long sem_nsems; /* no. of semaphores in array */ - unsigned long __unused3; - unsigned long __unused4; -}; - -#endif /* _ASM_SEMBUF_H */ - diff --git a/include/asm-frv/serial-regs.h b/include/asm-frv/serial-regs.h deleted file mode 100644 index e1286bd..0000000 --- a/include/asm-frv/serial-regs.h +++ /dev/null @@ -1,44 +0,0 @@ -/* serial-regs.h: serial port registers - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SERIAL_REGS_H -#define _ASM_SERIAL_REGS_H - -#include -#include - -#define SERIAL_ICLK 33333333 /* the target serial input clock */ -#define UART0_BASE 0xfeff9c00 -#define UART1_BASE 0xfeff9c40 - -#define __get_UART0(R) ({ __reg(UART0_BASE + (R) * 8) >> 24; }) -#define __get_UART1(R) ({ __reg(UART1_BASE + (R) * 8) >> 24; }) -#define __set_UART0(R,V) do { __reg(UART0_BASE + (R) * 8) = (V) << 24; } while(0) -#define __set_UART1(R,V) do { __reg(UART1_BASE + (R) * 8) = (V) << 24; } while(0) - -#define __get_UART0_LSR() ({ __get_UART0(UART_LSR); }) -#define __get_UART1_LSR() ({ __get_UART1(UART_LSR); }) - -#define __set_UART0_IER(V) __set_UART0(UART_IER,(V)) -#define __set_UART1_IER(V) __set_UART1(UART_IER,(V)) - -/* serial prescaler select register */ -#define __get_UCPSR() ({ *(volatile unsigned long *)(0xfeff9c90); }) -#define __set_UCPSR(V) do { *(volatile unsigned long *)(0xfeff9c90) = (V); } while(0) -#define UCPSR_SELECT0 0x07000000 -#define UCPSR_SELECT1 0x38000000 - -/* serial prescaler base value register */ -#define __get_UCPVR() ({ *(volatile unsigned long *)(0xfeff9c98); mb(); }) -#define __set_UCPVR(V) do { *(volatile unsigned long *)(0xfeff9c98) = (V) << 24; mb(); } while(0) - - -#endif /* _ASM_SERIAL_REGS_H */ diff --git a/include/asm-frv/serial.h b/include/asm-frv/serial.h deleted file mode 100644 index dbb8259..0000000 --- a/include/asm-frv/serial.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * serial.h - * - * Copyright (C) 2003 Develer S.r.l. (http://www.develer.com/) - * Author: Bernardo Innocenti - * - * Based on linux/include/asm-i386/serial.h - */ -#include - -/* - * the base baud is derived from the clock speed and so is variable - */ -#define BASE_BAUD 0 - -#define STD_COM_FLAGS ASYNC_BOOT_AUTOCONF - -#define SERIAL_PORT_DFNS diff --git a/include/asm-frv/setup.h b/include/asm-frv/setup.h deleted file mode 100644 index afd787c..0000000 --- a/include/asm-frv/setup.h +++ /dev/null @@ -1,31 +0,0 @@ -/* setup.h: setup stuff - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SETUP_H -#define _ASM_SETUP_H - -#define COMMAND_LINE_SIZE 512 - -#ifdef __KERNEL__ - -#include - -#ifndef __ASSEMBLY__ - -#ifdef CONFIG_MMU -extern unsigned long __initdata num_mappedpages; -#endif - -#endif /* !__ASSEMBLY__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_SETUP_H */ diff --git a/include/asm-frv/shmbuf.h b/include/asm-frv/shmbuf.h deleted file mode 100644 index 4c6e711..0000000 --- a/include/asm-frv/shmbuf.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _ASM_SHMBUF_H -#define _ASM_SHMBUF_H - -/* - * The shmid64_ds structure for FR-V architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct shmid64_ds { - struct ipc64_perm shm_perm; /* operation perms */ - size_t shm_segsz; /* size of segment (bytes) */ - __kernel_time_t shm_atime; /* last attach time */ - unsigned long __unused1; - __kernel_time_t shm_dtime; /* last detach time */ - unsigned long __unused2; - __kernel_time_t shm_ctime; /* last change time */ - unsigned long __unused3; - __kernel_pid_t shm_cpid; /* pid of creator */ - __kernel_pid_t shm_lpid; /* pid of last operator */ - unsigned long shm_nattch; /* no. of current attaches */ - unsigned long __unused4; - unsigned long __unused5; -}; - -struct shminfo64 { - unsigned long shmmax; - unsigned long shmmin; - unsigned long shmmni; - unsigned long shmseg; - unsigned long shmall; - unsigned long __unused1; - unsigned long __unused2; - unsigned long __unused3; - unsigned long __unused4; -}; - -#endif /* _ASM_SHMBUF_H */ - diff --git a/include/asm-frv/shmparam.h b/include/asm-frv/shmparam.h deleted file mode 100644 index ab71100..0000000 --- a/include/asm-frv/shmparam.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _ASM_SHMPARAM_H -#define _ASM_SHMPARAM_H - -#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ - -#endif /* _ASM_SHMPARAM_H */ - diff --git a/include/asm-frv/sigcontext.h b/include/asm-frv/sigcontext.h deleted file mode 100644 index 3b263f3..0000000 --- a/include/asm-frv/sigcontext.h +++ /dev/null @@ -1,26 +0,0 @@ -/* sigcontext.h: FRV signal context - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_SIGCONTEXT_H -#define _ASM_SIGCONTEXT_H - -#include - -/* - * Signal context structure - contains all info to do with the state - * before the signal handler was invoked. Note: only add new entries - * to the end of the structure. - */ -struct sigcontext { - struct user_context sc_context; - unsigned long sc_oldmask; /* old sigmask */ -} __attribute__((aligned(8))); - -#endif diff --git a/include/asm-frv/siginfo.h b/include/asm-frv/siginfo.h deleted file mode 100644 index d3fd1ca..0000000 --- a/include/asm-frv/siginfo.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_SIGINFO_H -#define _ASM_SIGINFO_H - -#include -#include - -#define FPE_MDAOVF (__SI_FAULT|9) /* media overflow */ -#undef NSIGFPE -#define NSIGFPE 9 - -#endif - diff --git a/include/asm-frv/signal.h b/include/asm-frv/signal.h deleted file mode 100644 index 2079197..0000000 --- a/include/asm-frv/signal.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef _ASM_SIGNAL_H -#define _ASM_SIGNAL_H - -#include - -/* Avoid too many header ordering problems. */ -struct siginfo; - -#ifdef __KERNEL__ -/* Most things should be clean enough to redefine this at will, if care - is taken to make libc match. */ - -#define _NSIG 64 -#define _NSIG_BPW 32 -#define _NSIG_WORDS (_NSIG / _NSIG_BPW) - -typedef unsigned long old_sigset_t; /* at least 32 bits */ - -typedef struct { - unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -#else -/* Here we must cater to libcs that poke about in kernel headers. */ - -#define NSIG 32 -typedef unsigned long sigset_t; - -#endif /* __KERNEL__ */ - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGTRAP 5 -#define SIGABRT 6 -#define SIGIOT 6 -#define SIGBUS 7 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGSTKFLT 16 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGTSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 -#define SIGURG 23 -#define SIGXCPU 24 -#define SIGXFSZ 25 -#define SIGVTALRM 26 -#define SIGPROF 27 -#define SIGWINCH 28 -#define SIGIO 29 -#define SIGPOLL SIGIO -/* -#define SIGLOST 29 -*/ -#define SIGPWR 30 -#define SIGSYS 31 -#define SIGUNUSED 31 - -/* These should not be considered constants from userland. */ -#define SIGRTMIN 32 -#define SIGRTMAX (_NSIG-1) - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 /* not supported yet */ -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - -#define SA_RESTORER 0x04000000 - -/* - * sigaltstack controls - */ -#define SS_ONSTACK 1 -#define SS_DISABLE 2 - -#define MINSIGSTKSZ 2048 -#define SIGSTKSZ 8192 - -#include - -#ifdef __KERNEL__ -struct old_sigaction { - __sighandler_t sa_handler; - old_sigset_t sa_mask; - unsigned long sa_flags; - __sigrestore_t sa_restorer; -}; - -struct sigaction { - __sighandler_t sa_handler; - unsigned long sa_flags; - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ -}; - -struct k_sigaction { - struct sigaction sa; -}; -#else -/* Here we must cater to libcs that poke about in kernel headers. */ - -struct sigaction { - union { - __sighandler_t _sa_handler; - void (*_sa_sigaction)(int, struct siginfo *, void *); - } _u; - sigset_t sa_mask; - unsigned long sa_flags; - void (*sa_restorer)(void); -}; - -#define sa_handler _u._sa_handler -#define sa_sigaction _u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { - void __user *ss_sp; - int ss_flags; - size_t ss_size; -} stack_t; - -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -#ifdef __KERNEL__ - -#include -#undef __HAVE_ARCH_SIG_BITOPS - -#endif /* __KERNEL__ */ - -#endif /* _ASM_SIGNAL_H */ diff --git a/include/asm-frv/smp.h b/include/asm-frv/smp.h deleted file mode 100644 index 38349ec..0000000 --- a/include/asm-frv/smp.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __ASM_SMP_H -#define __ASM_SMP_H - - -#ifdef CONFIG_SMP -#error SMP not supported -#endif - -#endif diff --git a/include/asm-frv/socket.h b/include/asm-frv/socket.h deleted file mode 100644 index 57c3d40..0000000 --- a/include/asm-frv/socket.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _ASM_SOCKET_H -#define _ASM_SOCKET_H - -#include - -/* For setsockopt(2) */ -#define SOL_SOCKET 1 - -#define SO_DEBUG 1 -#define SO_REUSEADDR 2 -#define SO_TYPE 3 -#define SO_ERROR 4 -#define SO_DONTROUTE 5 -#define SO_BROADCAST 6 -#define SO_SNDBUF 7 -#define SO_RCVBUF 8 -#define SO_SNDBUFFORCE 32 -#define SO_RCVBUFFORCE 33 -#define SO_KEEPALIVE 9 -#define SO_OOBINLINE 10 -#define SO_NO_CHECK 11 -#define SO_PRIORITY 12 -#define SO_LINGER 13 -#define SO_BSDCOMPAT 14 -/* To add :#define SO_REUSEPORT 15 */ -#define SO_PASSCRED 16 -#define SO_PEERCRED 17 -#define SO_RCVLOWAT 18 -#define SO_SNDLOWAT 19 -#define SO_RCVTIMEO 20 -#define SO_SNDTIMEO 21 - -/* Security levels - as per NRL IPv6 - don't actually do anything */ -#define SO_SECURITY_AUTHENTICATION 22 -#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 -#define SO_SECURITY_ENCRYPTION_NETWORK 24 - -#define SO_BINDTODEVICE 25 - -/* Socket filtering */ -#define SO_ATTACH_FILTER 26 -#define SO_DETACH_FILTER 27 - -#define SO_PEERNAME 28 -#define SO_TIMESTAMP 29 -#define SCM_TIMESTAMP SO_TIMESTAMP - -#define SO_ACCEPTCONN 30 - -#define SO_PEERSEC 31 -#define SO_PASSSEC 34 -#define SO_TIMESTAMPNS 35 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS - -#define SO_MARK 36 - -#define SO_TIMESTAMPING 37 -#define SCM_TIMESTAMPING SO_TIMESTAMPING - -#endif /* _ASM_SOCKET_H */ - diff --git a/include/asm-frv/sockios.h b/include/asm-frv/sockios.h deleted file mode 100644 index 5dbdd13..0000000 --- a/include/asm-frv/sockios.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _ASM_SOCKIOS__ -#define _ASM_SOCKIOS__ - -/* Socket-level I/O control calls. */ -#define FIOSETOWN 0x8901 -#define SIOCSPGRP 0x8902 -#define FIOGETOWN 0x8903 -#define SIOCGPGRP 0x8904 -#define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ -#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ - -#endif /* _ASM_SOCKIOS__ */ - diff --git a/include/asm-frv/spinlock.h b/include/asm-frv/spinlock.h deleted file mode 100644 index fe385f4..0000000 --- a/include/asm-frv/spinlock.h +++ /dev/null @@ -1,17 +0,0 @@ -/* spinlock.h: spinlocks for FR-V - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SPINLOCK_H -#define _ASM_SPINLOCK_H - -#error no spinlocks for FR-V yet - -#endif /* _ASM_SPINLOCK_H */ diff --git a/include/asm-frv/spr-regs.h b/include/asm-frv/spr-regs.h deleted file mode 100644 index 01e6af5..0000000 --- a/include/asm-frv/spr-regs.h +++ /dev/null @@ -1,416 +0,0 @@ -/* spr-regs.h: special-purpose registers on the FRV - * - * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SPR_REGS_H -#define _ASM_SPR_REGS_H - -/* - * PSR - Processor Status Register - */ -#define PSR_ET 0x00000001 /* enable interrupts/exceptions flag */ -#define PSR_PS 0x00000002 /* previous supervisor mode flag */ -#define PSR_S 0x00000004 /* supervisor mode flag */ -#define PSR_PIL 0x00000078 /* processor external interrupt level */ -#define PSR_PIL_0 0x00000000 /* - no interrupt in progress */ -#define PSR_PIL_13 0x00000068 /* - debugging only */ -#define PSR_PIL_14 0x00000070 /* - debugging in progress */ -#define PSR_PIL_15 0x00000078 /* - NMI in progress */ -#define PSR_EM 0x00000080 /* enable media operation */ -#define PSR_EF 0x00000100 /* enable FPU operation */ -#define PSR_BE 0x00001000 /* endianness mode */ -#define PSR_BE_LE 0x00000000 /* - little endian mode */ -#define PSR_BE_BE 0x00001000 /* - big endian mode */ -#define PSR_CM 0x00002000 /* conditional mode */ -#define PSR_NEM 0x00004000 /* non-excepting mode */ -#define PSR_ICE 0x00010000 /* in-circuit emulation mode */ -#define PSR_VERSION_SHIFT 24 /* CPU silicon ID */ -#define PSR_IMPLE_SHIFT 28 /* CPU core ID */ - -#define PSR_VERSION(psr) (((psr) >> PSR_VERSION_SHIFT) & 0xf) -#define PSR_IMPLE(psr) (((psr) >> PSR_IMPLE_SHIFT) & 0xf) - -#define PSR_IMPLE_FR401 0x2 -#define PSR_VERSION_FR401_MB93401 0x0 -#define PSR_VERSION_FR401_MB93401A 0x1 -#define PSR_VERSION_FR401_MB93403 0x2 - -#define PSR_IMPLE_FR405 0x4 -#define PSR_VERSION_FR405_MB93405 0x0 - -#define PSR_IMPLE_FR451 0x5 -#define PSR_VERSION_FR451_MB93451 0x0 - -#define PSR_IMPLE_FR501 0x1 -#define PSR_VERSION_FR501_MB93501 0x1 -#define PSR_VERSION_FR501_MB93501A 0x2 - -#define PSR_IMPLE_FR551 0x3 -#define PSR_VERSION_FR551_MB93555 0x1 - -#define __get_PSR() ({ unsigned long x; asm volatile("movsg psr,%0" : "=r"(x)); x; }) -#define __set_PSR(V) do { asm volatile("movgs %0,psr" : : "r"(V)); } while(0) - -/* - * TBR - Trap Base Register - */ -#define TBR_TT 0x00000ff0 -#define TBR_TT_INSTR_MMU_MISS (0x01 << 4) -#define TBR_TT_INSTR_ACC_ERROR (0x02 << 4) -#define TBR_TT_INSTR_ACC_EXCEP (0x03 << 4) -#define TBR_TT_PRIV_INSTR (0x06 << 4) -#define TBR_TT_ILLEGAL_INSTR (0x07 << 4) -#define TBR_TT_FP_EXCEPTION (0x0d << 4) -#define TBR_TT_MP_EXCEPTION (0x0e << 4) -#define TBR_TT_DATA_ACC_ERROR (0x11 << 4) -#define TBR_TT_DATA_MMU_MISS (0x12 << 4) -#define TBR_TT_DATA_ACC_EXCEP (0x13 << 4) -#define TBR_TT_DATA_STR_ERROR (0x14 << 4) -#define TBR_TT_DIVISION_EXCEP (0x17 << 4) -#define TBR_TT_COMMIT_EXCEP (0x19 << 4) -#define TBR_TT_INSTR_TLB_MISS (0x1a << 4) -#define TBR_TT_DATA_TLB_MISS (0x1b << 4) -#define TBR_TT_DATA_DAT_EXCEP (0x1d << 4) -#define TBR_TT_DECREMENT_TIMER (0x1f << 4) -#define TBR_TT_COMPOUND_EXCEP (0x20 << 4) -#define TBR_TT_INTERRUPT_1 (0x21 << 4) -#define TBR_TT_INTERRUPT_2 (0x22 << 4) -#define TBR_TT_INTERRUPT_3 (0x23 << 4) -#define TBR_TT_INTERRUPT_4 (0x24 << 4) -#define TBR_TT_INTERRUPT_5 (0x25 << 4) -#define TBR_TT_INTERRUPT_6 (0x26 << 4) -#define TBR_TT_INTERRUPT_7 (0x27 << 4) -#define TBR_TT_INTERRUPT_8 (0x28 << 4) -#define TBR_TT_INTERRUPT_9 (0x29 << 4) -#define TBR_TT_INTERRUPT_10 (0x2a << 4) -#define TBR_TT_INTERRUPT_11 (0x2b << 4) -#define TBR_TT_INTERRUPT_12 (0x2c << 4) -#define TBR_TT_INTERRUPT_13 (0x2d << 4) -#define TBR_TT_INTERRUPT_14 (0x2e << 4) -#define TBR_TT_INTERRUPT_15 (0x2f << 4) -#define TBR_TT_TRAP0 (0x80 << 4) -#define TBR_TT_TRAP1 (0x81 << 4) -#define TBR_TT_TRAP2 (0x82 << 4) -#define TBR_TT_TRAP3 (0x83 << 4) -#define TBR_TT_TRAP120 (0xf8 << 4) -#define TBR_TT_TRAP121 (0xf9 << 4) -#define TBR_TT_TRAP122 (0xfa << 4) -#define TBR_TT_TRAP123 (0xfb << 4) -#define TBR_TT_TRAP124 (0xfc << 4) -#define TBR_TT_TRAP125 (0xfd << 4) -#define TBR_TT_TRAP126 (0xfe << 4) -#define TBR_TT_BREAK (0xff << 4) - -#define TBR_TT_ATOMIC_CMPXCHG32 TBR_TT_TRAP120 -#define TBR_TT_ATOMIC_XCHG32 TBR_TT_TRAP121 -#define TBR_TT_ATOMIC_XOR TBR_TT_TRAP122 -#define TBR_TT_ATOMIC_OR TBR_TT_TRAP123 -#define TBR_TT_ATOMIC_AND TBR_TT_TRAP124 -#define TBR_TT_ATOMIC_SUB TBR_TT_TRAP125 -#define TBR_TT_ATOMIC_ADD TBR_TT_TRAP126 - -#define __get_TBR() ({ unsigned long x; asm volatile("movsg tbr,%0" : "=r"(x)); x; }) - -/* - * HSR0 - Hardware Status Register 0 - */ -#define HSR0_PDM 0x00000007 /* power down mode */ -#define HSR0_PDM_NORMAL 0x00000000 /* - normal mode */ -#define HSR0_PDM_CORE_SLEEP 0x00000001 /* - CPU core sleep mode */ -#define HSR0_PDM_BUS_SLEEP 0x00000003 /* - bus sleep mode */ -#define HSR0_PDM_PLL_RUN 0x00000005 /* - PLL run */ -#define HSR0_PDM_PLL_STOP 0x00000007 /* - PLL stop */ -#define HSR0_GRLE 0x00000040 /* GR lower register set enable */ -#define HSR0_GRHE 0x00000080 /* GR higher register set enable */ -#define HSR0_FRLE 0x00000100 /* FR lower register set enable */ -#define HSR0_FRHE 0x00000200 /* FR higher register set enable */ -#define HSR0_GRN 0x00000400 /* GR quantity */ -#define HSR0_GRN_64 0x00000000 /* - 64 GR registers */ -#define HSR0_GRN_32 0x00000400 /* - 32 GR registers */ -#define HSR0_FRN 0x00000800 /* FR quantity */ -#define HSR0_FRN_64 0x00000000 /* - 64 FR registers */ -#define HSR0_FRN_32 0x00000800 /* - 32 FR registers */ -#define HSR0_SA 0x00001000 /* start address (RAMBOOT#) */ -#define HSR0_ETMI 0x00008000 /* enable TIMERI (64-bit up timer) */ -#define HSR0_ETMD 0x00004000 /* enable TIMERD (32-bit down timer) */ -#define HSR0_PEDAT 0x00010000 /* previous DAT mode */ -#define HSR0_XEDAT 0x00020000 /* exception DAT mode */ -#define HSR0_EDAT 0x00080000 /* enable DAT mode */ -#define HSR0_RME 0x00400000 /* enable RAM mode */ -#define HSR0_EMEM 0x00800000 /* enable MMU_Miss mask */ -#define HSR0_EXMMU 0x01000000 /* enable extended MMU mode */ -#define HSR0_EDMMU 0x02000000 /* enable data MMU */ -#define HSR0_EIMMU 0x04000000 /* enable instruction MMU */ -#define HSR0_CBM 0x08000000 /* copy back mode */ -#define HSR0_CBM_WRITE_THRU 0x00000000 /* - write through */ -#define HSR0_CBM_COPY_BACK 0x08000000 /* - copy back */ -#define HSR0_NWA 0x10000000 /* no write allocate */ -#define HSR0_DCE 0x40000000 /* data cache enable */ -#define HSR0_ICE 0x80000000 /* instruction cache enable */ - -#define __get_HSR(R) ({ unsigned long x; asm volatile("movsg hsr"#R",%0" : "=r"(x)); x; }) -#define __set_HSR(R,V) do { asm volatile("movgs %0,hsr"#R : : "r"(V)); } while(0) - -/* - * CCR - Condition Codes Register - */ -#define CCR_FCC0 0x0000000f /* FP/Media condition 0 (fcc0 reg) */ -#define CCR_FCC1 0x000000f0 /* FP/Media condition 1 (fcc1 reg) */ -#define CCR_FCC2 0x00000f00 /* FP/Media condition 2 (fcc2 reg) */ -#define CCR_FCC3 0x0000f000 /* FP/Media condition 3 (fcc3 reg) */ -#define CCR_ICC0 0x000f0000 /* Integer condition 0 (icc0 reg) */ -#define CCR_ICC0_C 0x00010000 /* - Carry flag */ -#define CCR_ICC0_V 0x00020000 /* - Overflow flag */ -#define CCR_ICC0_Z 0x00040000 /* - Zero flag */ -#define CCR_ICC0_N 0x00080000 /* - Negative flag */ -#define CCR_ICC1 0x00f00000 /* Integer condition 1 (icc1 reg) */ -#define CCR_ICC2 0x0f000000 /* Integer condition 2 (icc2 reg) */ -#define CCR_ICC3 0xf0000000 /* Integer condition 3 (icc3 reg) */ - -/* - * CCCR - Condition Codes for Conditional Instructions Register - */ -#define CCCR_CC0 0x00000003 /* condition 0 (cc0 reg) */ -#define CCCR_CC0_FALSE 0x00000002 /* - condition is false */ -#define CCCR_CC0_TRUE 0x00000003 /* - condition is true */ -#define CCCR_CC1 0x0000000c /* condition 1 (cc1 reg) */ -#define CCCR_CC2 0x00000030 /* condition 2 (cc2 reg) */ -#define CCCR_CC3 0x000000c0 /* condition 3 (cc3 reg) */ -#define CCCR_CC4 0x00000300 /* condition 4 (cc4 reg) */ -#define CCCR_CC5 0x00000c00 /* condition 5 (cc5 reg) */ -#define CCCR_CC6 0x00003000 /* condition 6 (cc6 reg) */ -#define CCCR_CC7 0x0000c000 /* condition 7 (cc7 reg) */ - -/* - * ISR - Integer Status Register - */ -#define ISR_EMAM 0x00000001 /* memory misaligned access handling */ -#define ISR_EMAM_EXCEPTION 0x00000000 /* - generate exception */ -#define ISR_EMAM_FUDGE 0x00000001 /* - mask out invalid address bits */ -#define ISR_AEXC 0x00000004 /* accrued [overflow] exception */ -#define ISR_DTT 0x00000018 /* division type trap */ -#define ISR_DTT_IGNORE 0x00000000 /* - ignore division error */ -#define ISR_DTT_DIVBYZERO 0x00000008 /* - generate exception */ -#define ISR_DTT_OVERFLOW 0x00000010 /* - record overflow */ -#define ISR_EDE 0x00000020 /* enable division exception */ -#define ISR_PLI 0x20000000 /* pre-load instruction information */ -#define ISR_QI 0x80000000 /* quad data implementation information */ - -/* - * EPCR0 - Exception PC Register - */ -#define EPCR0_V 0x00000001 /* register content validity indicator */ -#define EPCR0_PC 0xfffffffc /* faulting instruction address */ - -/* - * ESR0/14/15 - Exception Status Register - */ -#define ESRx_VALID 0x00000001 /* register content validity indicator */ -#define ESRx_EC 0x0000003e /* exception type */ -#define ESRx_EC_DATA_STORE 0x00000000 /* - data_store_error */ -#define ESRx_EC_INSN_ACCESS 0x00000006 /* - instruction_access_error */ -#define ESRx_EC_PRIV_INSN 0x00000008 /* - privileged_instruction */ -#define ESRx_EC_ILL_INSN 0x0000000a /* - illegal_instruction */ -#define ESRx_EC_MP_EXCEP 0x0000001c /* - mp_exception */ -#define ESRx_EC_DATA_ACCESS 0x00000020 /* - data_access_error */ -#define ESRx_EC_DIVISION 0x00000026 /* - division_exception */ -#define ESRx_EC_ITLB_MISS 0x00000034 /* - instruction_access_TLB_miss */ -#define ESRx_EC_DTLB_MISS 0x00000036 /* - data_access_TLB_miss */ -#define ESRx_EC_DATA_ACCESS_DAT 0x0000003a /* - data_access_DAT_exception */ - -#define ESR0_IAEC 0x00000100 /* info for instruction-access-exception */ -#define ESR0_IAEC_RESV 0x00000000 /* - reserved */ -#define ESR0_IAEC_PROT_VIOL 0x00000100 /* - protection violation */ - -#define ESR0_ATXC 0x00f00000 /* address translation exception code */ -#define ESR0_ATXC_MMU_MISS 0x00000000 /* - MMU miss exception and more (?) */ -#define ESR0_ATXC_MULTI_DAT 0x00800000 /* - multiple DAT entry hit */ -#define ESR0_ATXC_MULTI_SAT 0x00900000 /* - multiple SAT entry hit */ -#define ESR0_ATXC_AMRTLB_MISS 0x00a00000 /* - MMU/TLB miss exception */ -#define ESR0_ATXC_PRIV_EXCEP 0x00c00000 /* - privilege protection fault */ -#define ESR0_ATXC_WP_EXCEP 0x00d00000 /* - write protection fault */ - -#define ESR0_EAV 0x00000800 /* true if EAR0 register valid */ -#define ESR15_EAV 0x00000800 /* true if EAR15 register valid */ - -/* - * ESFR1 - Exception Status Valid Flag Register - */ -#define ESFR1_ESR0 0x00000001 /* true if ESR0 is valid */ -#define ESFR1_ESR14 0x00004000 /* true if ESR14 is valid */ -#define ESFR1_ESR15 0x00008000 /* true if ESR15 is valid */ - -/* - * MSR - Media Status Register - */ -#define MSR0_AOVF 0x00000001 /* overflow exception accrued */ -#define MSRx_OVF 0x00000002 /* overflow exception detected */ -#define MSRx_SIE 0x0000003c /* last SIMD instruction exception detected */ -#define MSRx_SIE_NONE 0x00000000 /* - none detected */ -#define MSRx_SIE_FRkHI_ACCk 0x00000020 /* - exception at FRkHI or ACCk */ -#define MSRx_SIE_FRkLO_ACCk1 0x00000010 /* - exception at FRkLO or ACCk+1 */ -#define MSRx_SIE_FRk1HI_ACCk2 0x00000008 /* - exception at FRk+1HI or ACCk+2 */ -#define MSRx_SIE_FRk1LO_ACCk3 0x00000004 /* - exception at FRk+1LO or ACCk+3 */ -#define MSR0_MTT 0x00007000 /* type of last media trap detected */ -#define MSR0_MTT_NONE 0x00000000 /* - none detected */ -#define MSR0_MTT_OVERFLOW 0x00001000 /* - overflow detected */ -#define MSR0_HI 0x00c00000 /* hardware implementation */ -#define MSR0_HI_ROUNDING 0x00000000 /* - rounding mode */ -#define MSR0_HI_NONROUNDING 0x00c00000 /* - non-rounding mode */ -#define MSR0_EMCI 0x01000000 /* enable media custom instructions */ -#define MSR0_SRDAV 0x10000000 /* select rounding mode of MAVEH */ -#define MSR0_SRDAV_RDAV 0x00000000 /* - controlled by MSR.RDAV */ -#define MSR0_SRDAV_RD 0x10000000 /* - controlled by MSR.RD */ -#define MSR0_RDAV 0x20000000 /* rounding mode of MAVEH */ -#define MSR0_RDAV_NEAREST_MI 0x00000000 /* - round to nearest minus */ -#define MSR0_RDAV_NEAREST_PL 0x20000000 /* - round to nearest plus */ -#define MSR0_RD 0xc0000000 /* rounding mode */ -#define MSR0_RD_NEAREST 0x00000000 /* - nearest */ -#define MSR0_RD_ZERO 0x40000000 /* - zero */ -#define MSR0_RD_POS_INF 0x80000000 /* - postive infinity */ -#define MSR0_RD_NEG_INF 0xc0000000 /* - negative infinity */ - -/* - * IAMPR0-7 - Instruction Address Mapping Register - * DAMPR0-7 - Data Address Mapping Register - */ -#define xAMPRx_V 0x00000001 /* register content validity indicator */ -#define DAMPRx_WP 0x00000002 /* write protect */ -#define DAMPRx_WP_RW 0x00000000 /* - read/write */ -#define DAMPRx_WP_RO 0x00000002 /* - read-only */ -#define xAMPRx_C 0x00000004 /* cached/uncached */ -#define xAMPRx_C_CACHED 0x00000000 /* - cached */ -#define xAMPRx_C_UNCACHED 0x00000004 /* - uncached */ -#define xAMPRx_S 0x00000008 /* supervisor only */ -#define xAMPRx_S_USER 0x00000000 /* - userspace can access */ -#define xAMPRx_S_KERNEL 0x00000008 /* - kernel only */ -#define xAMPRx_SS 0x000000f0 /* segment size */ -#define xAMPRx_SS_16Kb 0x00000000 /* - 16 kilobytes */ -#define xAMPRx_SS_64Kb 0x00000010 /* - 64 kilobytes */ -#define xAMPRx_SS_256Kb 0x00000020 /* - 256 kilobytes */ -#define xAMPRx_SS_1Mb 0x00000030 /* - 1 megabyte */ -#define xAMPRx_SS_2Mb 0x00000040 /* - 2 megabytes */ -#define xAMPRx_SS_4Mb 0x00000050 /* - 4 megabytes */ -#define xAMPRx_SS_8Mb 0x00000060 /* - 8 megabytes */ -#define xAMPRx_SS_16Mb 0x00000070 /* - 16 megabytes */ -#define xAMPRx_SS_32Mb 0x00000080 /* - 32 megabytes */ -#define xAMPRx_SS_64Mb 0x00000090 /* - 64 megabytes */ -#define xAMPRx_SS_128Mb 0x000000a0 /* - 128 megabytes */ -#define xAMPRx_SS_256Mb 0x000000b0 /* - 256 megabytes */ -#define xAMPRx_SS_512Mb 0x000000c0 /* - 512 megabytes */ -#define xAMPRx_RESERVED8 0x00000100 /* reserved bit */ -#define xAMPRx_NG 0x00000200 /* non-global */ -#define xAMPRx_L 0x00000400 /* locked */ -#define xAMPRx_M 0x00000800 /* modified */ -#define xAMPRx_D 0x00001000 /* DAT entry */ -#define xAMPRx_RESERVED13 0x00002000 /* reserved bit */ -#define xAMPRx_PPFN 0xfff00000 /* physical page frame number */ - -#define xAMPRx_V_BIT 0 -#define DAMPRx_WP_BIT 1 -#define xAMPRx_C_BIT 2 -#define xAMPRx_S_BIT 3 -#define xAMPRx_RESERVED8_BIT 8 -#define xAMPRx_NG_BIT 9 -#define xAMPRx_L_BIT 10 -#define xAMPRx_M_BIT 11 -#define xAMPRx_D_BIT 12 -#define xAMPRx_RESERVED13_BIT 13 - -#define __get_IAMPR(R) ({ unsigned long x; asm volatile("movsg iampr"#R",%0" : "=r"(x)); x; }) -#define __get_DAMPR(R) ({ unsigned long x; asm volatile("movsg dampr"#R",%0" : "=r"(x)); x; }) - -#define __get_IAMLR(R) ({ unsigned long x; asm volatile("movsg iamlr"#R",%0" : "=r"(x)); x; }) -#define __get_DAMLR(R) ({ unsigned long x; asm volatile("movsg damlr"#R",%0" : "=r"(x)); x; }) - -#define __set_IAMPR(R,V) do { asm volatile("movgs %0,iampr"#R : : "r"(V)); } while(0) -#define __set_DAMPR(R,V) do { asm volatile("movgs %0,dampr"#R : : "r"(V)); } while(0) - -#define __set_IAMLR(R,V) do { asm volatile("movgs %0,iamlr"#R : : "r"(V)); } while(0) -#define __set_DAMLR(R,V) do { asm volatile("movgs %0,damlr"#R : : "r"(V)); } while(0) - -#define save_dampr(R, _dampr) \ -do { \ - asm volatile("movsg dampr"R",%0" : "=r"(_dampr)); \ -} while(0) - -#define restore_dampr(R, _dampr) \ -do { \ - asm volatile("movgs %0,dampr"R :: "r"(_dampr)); \ -} while(0) - -/* - * AMCR - Address Mapping Control Register - */ -#define AMCR_IAMRN 0x000000ff /* quantity of IAMPR registers */ -#define AMCR_DAMRN 0x0000ff00 /* quantity of DAMPR registers */ - -/* - * TTBR - Address Translation Table Base Register - */ -#define __get_TTBR() ({ unsigned long x; asm volatile("movsg ttbr,%0" : "=r"(x)); x; }) - -/* - * TPXR - TLB Probe Extend Register - */ -#define TPXR_E 0x00000001 -#define TPXR_LMAX_SHIFT 20 -#define TPXR_LMAX_SMASK 0xf -#define TPXR_WMAX_SHIFT 24 -#define TPXR_WMAX_SMASK 0xf -#define TPXR_WAY_SHIFT 28 -#define TPXR_WAY_SMASK 0xf - -/* - * DCR - Debug Control Register - */ -#define DCR_IBCE3 0x00000001 /* break on conditional insn pointed to by IBAR3 */ -#define DCR_IBE3 0x00000002 /* break on insn pointed to by IBAR3 */ -#define DCR_IBCE1 0x00000004 /* break on conditional insn pointed to by IBAR2 */ -#define DCR_IBE1 0x00000008 /* break on insn pointed to by IBAR2 */ -#define DCR_IBCE2 0x00000010 /* break on conditional insn pointed to by IBAR1 */ -#define DCR_IBE2 0x00000020 /* break on insn pointed to by IBAR1 */ -#define DCR_IBCE0 0x00000040 /* break on conditional insn pointed to by IBAR0 */ -#define DCR_IBE0 0x00000080 /* break on insn pointed to by IBAR0 */ - -#define DCR_DDBE1 0x00004000 /* use DBDR1x when checking DBAR1 */ -#define DCR_DWBE1 0x00008000 /* break on store to address in DBAR1/DBMR1x */ -#define DCR_DRBE1 0x00010000 /* break on load from address in DBAR1/DBMR1x */ -#define DCR_DDBE0 0x00020000 /* use DBDR0x when checking DBAR0 */ -#define DCR_DWBE0 0x00040000 /* break on store to address in DBAR0/DBMR0x */ -#define DCR_DRBE0 0x00080000 /* break on load from address in DBAR0/DBMR0x */ - -#define DCR_EIM 0x0c000000 /* external interrupt disable */ -#define DCR_IBM 0x10000000 /* instruction break disable */ -#define DCR_SE 0x20000000 /* single step enable */ -#define DCR_EBE 0x40000000 /* exception break enable */ - -/* - * BRR - Break Interrupt Request Register - */ -#define BRR_ST 0x00000001 /* single-step detected */ -#define BRR_SB 0x00000002 /* break instruction detected */ -#define BRR_BB 0x00000004 /* branch with hint detected */ -#define BRR_CBB 0x00000008 /* branch to LR detected */ -#define BRR_IBx 0x000000f0 /* hardware breakpoint detected */ -#define BRR_DBx 0x00000f00 /* hardware watchpoint detected */ -#define BRR_DBNEx 0x0000f000 /* ? */ -#define BRR_EBTT 0x00ff0000 /* trap type of exception break */ -#define BRR_TB 0x10000000 /* external break request detected */ -#define BRR_CB 0x20000000 /* ICE break command detected */ -#define BRR_EB 0x40000000 /* exception break detected */ - -/* - * BPSR - Break PSR Save Register - */ -#define BPSR_BET 0x00000001 /* former PSR.ET */ -#define BPSR_BS 0x00001000 /* former PSR.S */ - -#endif /* _ASM_SPR_REGS_H */ diff --git a/include/asm-frv/stat.h b/include/asm-frv/stat.h deleted file mode 100644 index ce56de9..0000000 --- a/include/asm-frv/stat.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef _ASM_STAT_H -#define _ASM_STAT_H - -struct __old_kernel_stat { - unsigned short st_dev; - unsigned short st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned long st_size; - unsigned long st_atime; - unsigned long st_mtime; - unsigned long st_ctime; -}; - -/* This matches struct stat in uClibc/glibc. */ -struct stat { - unsigned char __pad1[6]; - unsigned short st_dev; - - unsigned long __pad2; - unsigned long st_ino; - - unsigned short __pad3; - unsigned short st_mode; - unsigned short __pad4; - unsigned short st_nlink; - - unsigned short __pad5; - unsigned short st_uid; - unsigned short __pad6; - unsigned short st_gid; - - unsigned char __pad7[6]; - unsigned short st_rdev; - - unsigned long __pad8; - unsigned long st_size; - - unsigned long __pad9; /* align 64-bit st_blocks to 2-word */ - unsigned long st_blksize; - - unsigned long __pad10; /* future possible st_blocks high bits */ - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - - unsigned long __unused1; - unsigned long st_atime; - - unsigned long __unused2; - unsigned long st_mtime; - - unsigned long __unused3; - unsigned long st_ctime; - - unsigned long long __unused4; -}; - -/* This matches struct stat64 in uClibc/glibc. The layout is exactly - the same as that of struct stat above, with 64-bit types taking up - space that was formerly used by padding. stat syscalls are still - different from stat64, though, in that the former tests for - overflow. */ -struct stat64 { - unsigned char __pad1[6]; - unsigned short st_dev; - - unsigned long long st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - unsigned long st_uid; - unsigned long st_gid; - - unsigned char __pad2[6]; - unsigned short st_rdev; - - long long st_size; - - unsigned long __pad3; /* align 64-bit st_blocks to 2-word */ - unsigned long st_blksize; - - unsigned long __pad4; /* future possible st_blocks high bits */ - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - - unsigned long st_atime_nsec; - unsigned long st_atime; - - unsigned int st_mtime_nsec; - unsigned long st_mtime; - - unsigned long st_ctime_nsec; - unsigned long st_ctime; - - unsigned long long __unused4; -}; - -#endif /* _ASM_STAT_H */ diff --git a/include/asm-frv/statfs.h b/include/asm-frv/statfs.h deleted file mode 100644 index 741f586..0000000 --- a/include/asm-frv/statfs.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _ASM_STATFS_H -#define _ASM_STATFS_H - -#include - -#endif /* _ASM_STATFS_H */ - diff --git a/include/asm-frv/string.h b/include/asm-frv/string.h deleted file mode 100644 index 5ed310f..0000000 --- a/include/asm-frv/string.h +++ /dev/null @@ -1,51 +0,0 @@ -/* string.h: FRV string handling - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_STRING_H_ -#define _ASM_STRING_H_ - -#ifdef __KERNEL__ /* only set these up for kernel code */ - -#define __HAVE_ARCH_MEMSET 1 -#define __HAVE_ARCH_MEMCPY 1 - -extern void *memset(void *, int, __kernel_size_t); -extern void *memcpy(void *, const void *, __kernel_size_t); - -#else /* KERNEL */ - -/* - * let user libraries deal with these, - * IMHO the kernel has no place defining these functions for user apps - */ - -#define __HAVE_ARCH_STRCPY 1 -#define __HAVE_ARCH_STRNCPY 1 -#define __HAVE_ARCH_STRCAT 1 -#define __HAVE_ARCH_STRNCAT 1 -#define __HAVE_ARCH_STRCMP 1 -#define __HAVE_ARCH_STRNCMP 1 -#define __HAVE_ARCH_STRNICMP 1 -#define __HAVE_ARCH_STRCHR 1 -#define __HAVE_ARCH_STRRCHR 1 -#define __HAVE_ARCH_STRSTR 1 -#define __HAVE_ARCH_STRLEN 1 -#define __HAVE_ARCH_STRNLEN 1 -#define __HAVE_ARCH_MEMSET 1 -#define __HAVE_ARCH_MEMCPY 1 -#define __HAVE_ARCH_MEMMOVE 1 -#define __HAVE_ARCH_MEMSCAN 1 -#define __HAVE_ARCH_MEMCMP 1 -#define __HAVE_ARCH_MEMCHR 1 -#define __HAVE_ARCH_STRTOK 1 - -#endif /* KERNEL */ -#endif /* _ASM_STRING_H_ */ diff --git a/include/asm-frv/suspend.h b/include/asm-frv/suspend.h deleted file mode 100644 index 5fa7b5a..0000000 --- a/include/asm-frv/suspend.h +++ /dev/null @@ -1,20 +0,0 @@ -/* suspend.h: suspension stuff - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SUSPEND_H -#define _ASM_SUSPEND_H - -static inline int arch_prepare_suspend(void) -{ - return 0; -} - -#endif /* _ASM_SUSPEND_H */ diff --git a/include/asm-frv/swab.h b/include/asm-frv/swab.h deleted file mode 100644 index f305834..0000000 --- a/include/asm-frv/swab.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _ASM_SWAB_H -#define _ASM_SWAB_H - -#include - -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) -# define __SWAB_64_THRU_32__ -#endif - -#endif /* _ASM_SWAB_H */ diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h deleted file mode 100644 index 7742ec0..0000000 --- a/include/asm-frv/system.h +++ /dev/null @@ -1,301 +0,0 @@ -/* system.h: FR-V CPU control definitions - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_SYSTEM_H -#define _ASM_SYSTEM_H - -#include -#include -#include - -struct thread_struct; - -/* - * switch_to(prev, next) should switch from task `prev' to `next' - * `prev' will never be the same as `next'. - * The `mb' is to tell GCC not to cache `current' across this call. - */ -extern asmlinkage -struct task_struct *__switch_to(struct thread_struct *prev_thread, - struct thread_struct *next_thread, - struct task_struct *prev); - -#define switch_to(prev, next, last) \ -do { \ - (prev)->thread.sched_lr = \ - (unsigned long) __builtin_return_address(0); \ - (last) = __switch_to(&(prev)->thread, &(next)->thread, (prev)); \ - mb(); \ -} while(0) - -/* - * interrupt flag manipulation - * - use virtual interrupt management since touching the PSR is slow - * - ICC2.Z: T if interrupts virtually disabled - * - ICC2.C: F if interrupts really disabled - * - if Z==1 upon interrupt: - * - C is set to 0 - * - interrupts are really disabled - * - entry.S returns immediately - * - uses TIHI (TRAP if Z==0 && C==0) #2 to really reenable interrupts - * - if taken, the trap: - * - sets ICC2.C - * - enables interrupts - */ -#define local_irq_disable() \ -do { \ - /* set Z flag, but don't change the C flag */ \ - asm volatile(" andcc gr0,gr0,gr0,icc2 \n" \ - : \ - : \ - : "memory", "icc2" \ - ); \ -} while(0) - -#define local_irq_enable() \ -do { \ - /* clear Z flag and then test the C flag */ \ - asm volatile(" oricc gr0,#1,gr0,icc2 \n" \ - " tihi icc2,gr0,#2 \n" \ - : \ - : \ - : "memory", "icc2" \ - ); \ -} while(0) - -#define local_save_flags(flags) \ -do { \ - typecheck(unsigned long, flags); \ - asm volatile("movsg ccr,%0" \ - : "=r"(flags) \ - : \ - : "memory"); \ - \ - /* shift ICC2.Z to bit 0 */ \ - flags >>= 26; \ - \ - /* make flags 1 if interrupts disabled, 0 otherwise */ \ - flags &= 1UL; \ -} while(0) - -#define irqs_disabled() \ - ({unsigned long flags; local_save_flags(flags); !!flags; }) - -#define local_irq_save(flags) \ -do { \ - typecheck(unsigned long, flags); \ - local_save_flags(flags); \ - local_irq_disable(); \ -} while(0) - -#define local_irq_restore(flags) \ -do { \ - typecheck(unsigned long, flags); \ - \ - /* load the Z flag by turning 1 if disabled into 0 if disabled \ - * and thus setting the Z flag but not the C flag */ \ - asm volatile(" xoricc %0,#1,gr0,icc2 \n" \ - /* then test Z=0 and C=0 */ \ - " tihi icc2,gr0,#2 \n" \ - : \ - : "r"(flags) \ - : "memory", "icc2" \ - ); \ - \ -} while(0) - -/* - * real interrupt flag manipulation - */ -#define __local_irq_disable() \ -do { \ - unsigned long psr; \ - asm volatile(" movsg psr,%0 \n" \ - " andi %0,%2,%0 \n" \ - " ori %0,%1,%0 \n" \ - " movgs %0,psr \n" \ - : "=r"(psr) \ - : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ - : "memory"); \ -} while(0) - -#define __local_irq_enable() \ -do { \ - unsigned long psr; \ - asm volatile(" movsg psr,%0 \n" \ - " andi %0,%1,%0 \n" \ - " movgs %0,psr \n" \ - : "=r"(psr) \ - : "i" (~PSR_PIL) \ - : "memory"); \ -} while(0) - -#define __local_save_flags(flags) \ -do { \ - typecheck(unsigned long, flags); \ - asm("movsg psr,%0" \ - : "=r"(flags) \ - : \ - : "memory"); \ -} while(0) - -#define __local_irq_save(flags) \ -do { \ - unsigned long npsr; \ - typecheck(unsigned long, flags); \ - asm volatile(" movsg psr,%0 \n" \ - " andi %0,%3,%1 \n" \ - " ori %1,%2,%1 \n" \ - " movgs %1,psr \n" \ - : "=r"(flags), "=r"(npsr) \ - : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ - : "memory"); \ -} while(0) - -#define __local_irq_restore(flags) \ -do { \ - typecheck(unsigned long, flags); \ - asm volatile(" movgs %0,psr \n" \ - : \ - : "r" (flags) \ - : "memory"); \ -} while(0) - -#define __irqs_disabled() \ - ((__get_PSR() & PSR_PIL) >= PSR_PIL_14) - -/* - * Force strict CPU ordering. - */ -#define nop() asm volatile ("nop"::) -#define mb() asm volatile ("membar" : : :"memory") -#define rmb() asm volatile ("membar" : : :"memory") -#define wmb() asm volatile ("membar" : : :"memory") -#define read_barrier_depends() do { } while (0) - -#ifdef CONFIG_SMP -#define smp_mb() mb() -#define smp_rmb() rmb() -#define smp_wmb() wmb() -#define smp_read_barrier_depends() read_barrier_depends() -#define set_mb(var, value) \ - do { xchg(&var, (value)); } while (0) -#else -#define smp_mb() barrier() -#define smp_rmb() barrier() -#define smp_wmb() barrier() -#define smp_read_barrier_depends() do {} while(0) -#define set_mb(var, value) \ - do { var = (value); barrier(); } while (0) -#endif - -extern void die_if_kernel(const char *, ...) __attribute__((format(printf, 1, 2))); -extern void free_initmem(void); - -#define arch_align_stack(x) (x) - -/*****************************************************************************/ -/* - * compare and conditionally exchange value with memory - * - if (*ptr == test) then orig = *ptr; *ptr = test; - * - if (*ptr != test) then orig = *ptr; - */ -#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS - -#define cmpxchg(ptr, test, new) \ -({ \ - __typeof__(ptr) __xg_ptr = (ptr); \ - __typeof__(*(ptr)) __xg_orig, __xg_tmp; \ - __typeof__(*(ptr)) __xg_test = (test); \ - __typeof__(*(ptr)) __xg_new = (new); \ - \ - switch (sizeof(__xg_orig)) { \ - case 4: \ - asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " ld.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " sub%I4cc %1,%4,%2,icc0 \n" \ - " bne icc0,#0,1f \n" \ - " cst.p %3,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - "1: \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ - : "r"(__xg_new), "NPr"(__xg_test) \ - : "memory", "cc7", "cc3", "icc3", "icc0" \ - ); \ - break; \ - \ - default: \ - __xg_orig = (__typeof__(__xg_orig))0; \ - asm volatile("break"); \ - break; \ - } \ - \ - __xg_orig; \ -}) - -#else - -extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); - -#define cmpxchg(ptr, test, new) \ -({ \ - __typeof__(ptr) __xg_ptr = (ptr); \ - __typeof__(*(ptr)) __xg_orig; \ - __typeof__(*(ptr)) __xg_test = (test); \ - __typeof__(*(ptr)) __xg_new = (new); \ - \ - switch (sizeof(__xg_orig)) { \ - case 4: __xg_orig = (__force __typeof__(*ptr)) \ - __cmpxchg_32((__force uint32_t *)__xg_ptr, \ - (__force uint32_t)__xg_test, \ - (__force uint32_t)__xg_new); break; \ - default: \ - __xg_orig = (__typeof__(__xg_orig))0; \ - asm volatile("break"); \ - break; \ - } \ - \ - __xg_orig; \ -}) - -#endif - -#include - -static inline unsigned long __cmpxchg_local(volatile void *ptr, - unsigned long old, - unsigned long new, int size) -{ - switch (size) { - case 4: - return cmpxchg((unsigned long *)ptr, old, new); - default: - return __cmpxchg_local_generic(ptr, old, new, size); - } - - return old; -} - -/* - * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make - * them available. - */ -#define cmpxchg_local(ptr, o, n) \ - ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ - (unsigned long)(n), sizeof(*(ptr)))) -#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) - -#endif /* _ASM_SYSTEM_H */ diff --git a/include/asm-frv/termbits.h b/include/asm-frv/termbits.h deleted file mode 100644 index 5568492..0000000 --- a/include/asm-frv/termbits.h +++ /dev/null @@ -1,202 +0,0 @@ -#ifndef _ASM_TERMBITS_H__ -#define _ASM_TERMBITS_H__ - -#include - -typedef unsigned char cc_t; -typedef unsigned int speed_t; -typedef unsigned int tcflag_t; - -#define NCCS 19 -struct termios { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ -}; - -struct termios2 { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -struct ktermios { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define VINTR 0 -#define VQUIT 1 -#define VERASE 2 -#define VKILL 3 -#define VEOF 4 -#define VTIME 5 -#define VMIN 6 -#define VSWTC 7 -#define VSTART 8 -#define VSTOP 9 -#define VSUSP 10 -#define VEOL 11 -#define VREPRINT 12 -#define VDISCARD 13 -#define VWERASE 14 -#define VLNEXT 15 -#define VEOL2 16 - - -/* c_iflag bits */ -#define IGNBRK 0000001 -#define BRKINT 0000002 -#define IGNPAR 0000004 -#define PARMRK 0000010 -#define INPCK 0000020 -#define ISTRIP 0000040 -#define INLCR 0000100 -#define IGNCR 0000200 -#define ICRNL 0000400 -#define IUCLC 0001000 -#define IXON 0002000 -#define IXANY 0004000 -#define IXOFF 0010000 -#define IMAXBEL 0020000 -#define IUTF8 0040000 - -/* c_oflag bits */ -#define OPOST 0000001 -#define OLCUC 0000002 -#define ONLCR 0000004 -#define OCRNL 0000010 -#define ONOCR 0000020 -#define ONLRET 0000040 -#define OFILL 0000100 -#define OFDEL 0000200 -#define NLDLY 0000400 -#define NL0 0000000 -#define NL1 0000400 -#define CRDLY 0003000 -#define CR0 0000000 -#define CR1 0001000 -#define CR2 0002000 -#define CR3 0003000 -#define TABDLY 0014000 -#define TAB0 0000000 -#define TAB1 0004000 -#define TAB2 0010000 -#define TAB3 0014000 -#define XTABS 0014000 -#define BSDLY 0020000 -#define BS0 0000000 -#define BS1 0020000 -#define VTDLY 0040000 -#define VT0 0000000 -#define VT1 0040000 -#define FFDLY 0100000 -#define FF0 0000000 -#define FF1 0100000 - -/* c_cflag bit meaning */ -#define CBAUD 0010017 -#define B0 0000000 /* hang up */ -#define B50 0000001 -#define B75 0000002 -#define B110 0000003 -#define B134 0000004 -#define B150 0000005 -#define B200 0000006 -#define B300 0000007 -#define B600 0000010 -#define B1200 0000011 -#define B1800 0000012 -#define B2400 0000013 -#define B4800 0000014 -#define B9600 0000015 -#define B19200 0000016 -#define B38400 0000017 -#define EXTA B19200 -#define EXTB B38400 -#define CSIZE 0000060 -#define CS5 0000000 -#define CS6 0000020 -#define CS7 0000040 -#define CS8 0000060 -#define CSTOPB 0000100 -#define CREAD 0000200 -#define PARENB 0000400 -#define PARODD 0001000 -#define HUPCL 0002000 -#define CLOCAL 0004000 -#define CBAUDEX 0010000 -#define BOTHER 0010000 -#define B57600 0010001 -#define B115200 0010002 -#define B230400 0010003 -#define B460800 0010004 -#define B500000 0010005 -#define B576000 0010006 -#define B921600 0010007 -#define B1000000 0010010 -#define B1152000 0010011 -#define B1500000 0010012 -#define B2000000 0010013 -#define B2500000 0010014 -#define B3000000 0010015 -#define B3500000 0010016 -#define B4000000 0010017 -#define CIBAUD 002003600000 /* Input baud rate */ -#define CTVB 004000000000 /* VisioBraille Terminal flow control */ -#define CMSPAR 010000000000 /* mark or space (stick) parity */ -#define CRTSCTS 020000000000 /* flow control */ - -#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define ISIG 0000001 -#define ICANON 0000002 -#define XCASE 0000004 -#define ECHO 0000010 -#define ECHOE 0000020 -#define ECHOK 0000040 -#define ECHONL 0000100 -#define NOFLSH 0000200 -#define TOSTOP 0000400 -#define ECHOCTL 0001000 -#define ECHOPRT 0002000 -#define ECHOKE 0004000 -#define FLUSHO 0010000 -#define PENDIN 0040000 -#define IEXTEN 0100000 - - -/* tcflow() and TCXONC use these */ -#define TCOOFF 0 -#define TCOON 1 -#define TCIOFF 2 -#define TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TCIFLUSH 0 -#define TCOFLUSH 1 -#define TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TCSANOW 0 -#define TCSADRAIN 1 -#define TCSAFLUSH 2 - -#endif /* _ASM_TERMBITS_H__ */ - diff --git a/include/asm-frv/termios.h b/include/asm-frv/termios.h deleted file mode 100644 index a62fb58..0000000 --- a/include/asm-frv/termios.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _ASM_TERMIOS_H -#define _ASM_TERMIOS_H - -#include -#include - -struct winsize { - unsigned short ws_row; - unsigned short ws_col; - unsigned short ws_xpixel; - unsigned short ws_ypixel; -}; - -#define NCC 8 -struct termio { - unsigned short c_iflag; /* input mode flags */ - unsigned short c_oflag; /* output mode flags */ - unsigned short c_cflag; /* control mode flags */ - unsigned short c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[NCC]; /* control characters */ -}; - -#ifdef __KERNEL__ -/* intr=^C quit=^| erase=del kill=^U - eof=^D vtime=\0 vmin=\1 sxtc=\0 - start=^Q stop=^S susp=^Z eol=\0 - reprint=^R discard=^U werase=^W lnext=^V - eol2=\0 -*/ -#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" -#endif - -/* modem lines */ -#define TIOCM_LE 0x001 -#define TIOCM_DTR 0x002 -#define TIOCM_RTS 0x004 -#define TIOCM_ST 0x008 -#define TIOCM_SR 0x010 -#define TIOCM_CTS 0x020 -#define TIOCM_CAR 0x040 -#define TIOCM_RNG 0x080 -#define TIOCM_DSR 0x100 -#define TIOCM_CD TIOCM_CAR -#define TIOCM_RI TIOCM_RNG -#define TIOCM_OUT1 0x2000 -#define TIOCM_OUT2 0x4000 -#define TIOCM_LOOP 0x8000 - -#define TIOCM_MODEM_BITS TIOCM_OUT2 /* IRDA support */ - -/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ - -#ifdef __KERNEL__ -#include -#endif - -#endif /* _ASM_TERMIOS_H */ diff --git a/include/asm-frv/thread_info.h b/include/asm-frv/thread_info.h deleted file mode 100644 index bb53ab7..0000000 --- a/include/asm-frv/thread_info.h +++ /dev/null @@ -1,144 +0,0 @@ -/* thread_info.h: description - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * Derived from include/asm-i386/thread_info.h - * - * 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. - */ - -#ifndef _ASM_THREAD_INFO_H -#define _ASM_THREAD_INFO_H - -#ifdef __KERNEL__ - -#ifndef __ASSEMBLY__ -#include -#endif - -#define THREAD_SIZE 8192 - -/* - * low level task data that entry.S needs immediate access to - * - this struct should fit entirely inside of one cache line - * - this struct shares the supervisor stack pages - * - if the contents of this structure are changed, the assembly constants must also be changed - */ -#ifndef __ASSEMBLY__ - -struct thread_info { - struct task_struct *task; /* main task structure */ - struct exec_domain *exec_domain; /* execution domain */ - unsigned long flags; /* low level flags */ - unsigned long status; /* thread-synchronous flags */ - __u32 cpu; /* current CPU */ - int preempt_count; /* 0 => preemptable, <0 => BUG */ - - mm_segment_t addr_limit; /* thread address space: - * 0-0xBFFFFFFF for user-thead - * 0-0xFFFFFFFF for kernel-thread - */ - struct restart_block restart_block; - - __u8 supervisor_stack[0]; -}; - -#else /* !__ASSEMBLY__ */ - -#include - -#endif - -#define PREEMPT_ACTIVE 0x10000000 - -/* - * macros/functions for gaining access to the thread information structure - * - * preempt_count needs to be 1 initially, until the scheduler is functional. - */ -#ifndef __ASSEMBLY__ - -#define INIT_THREAD_INFO(tsk) \ -{ \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ - .flags = 0, \ - .cpu = 0, \ - .preempt_count = 1, \ - .addr_limit = KERNEL_DS, \ - .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ -} - -#define init_thread_info (init_thread_union.thread_info) -#define init_stack (init_thread_union.stack) - -/* how to get the thread information struct from C */ -register struct thread_info *__current_thread_info asm("gr15"); - -#define current_thread_info() ({ __current_thread_info; }) - -#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR - -/* thread information allocation */ -#ifdef CONFIG_DEBUG_STACK_USAGE -#define alloc_thread_info(tsk) \ - ({ \ - struct thread_info *ret; \ - \ - ret = kzalloc(THREAD_SIZE, GFP_KERNEL); \ - \ - ret; \ - }) -#else -#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) -#endif - -#define free_thread_info(info) kfree(info) - -#endif /* __ASSEMBLY__ */ - -/* - * thread information flags - * - these are process state flags that various assembly files may need to access - * - pending work-to-be-done flags are in LSW - * - other flags in MSW - */ -#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ -#define TIF_SIGPENDING 1 /* signal pending */ -#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ -#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ -#define TIF_IRET 4 /* return with iret */ -#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ -#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17 /* OOM killer killed process */ -#define TIF_FREEZE 18 /* freezing for suspend */ - -#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) -#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) -#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) -#define _TIF_IRET (1 << TIF_IRET) -#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) -#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) -#define _TIF_FREEZE (1 << TIF_FREEZE) - -#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ -#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ - -/* - * Thread-synchronous status. - * - * This is different from the flags in that nobody else - * ever touches our thread-synchronous status, so we don't - * have to worry about atomic accesses. - */ -#define TS_USEDFPM 0x0001 /* FPU/Media was used by this task this quantum (SMP) */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_THREAD_INFO_H */ diff --git a/include/asm-frv/timer-regs.h b/include/asm-frv/timer-regs.h deleted file mode 100644 index 6c5a871..0000000 --- a/include/asm-frv/timer-regs.h +++ /dev/null @@ -1,106 +0,0 @@ -/* timer-regs.h: hardware timer register definitions - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_TIMER_REGS_H -#define _ASM_TIMER_REGS_H - -#include - -extern unsigned long __nongprelbss __clkin_clock_speed_HZ; -extern unsigned long __nongprelbss __ext_bus_clock_speed_HZ; -extern unsigned long __nongprelbss __res_bus_clock_speed_HZ; -extern unsigned long __nongprelbss __sdram_clock_speed_HZ; -extern unsigned long __nongprelbss __core_bus_clock_speed_HZ; -extern unsigned long __nongprelbss __core_clock_speed_HZ; -extern unsigned long __nongprelbss __dsu_clock_speed_HZ; -extern unsigned long __nongprelbss __serial_clock_speed_HZ; - -#define __get_CLKC() ({ *(volatile unsigned long *)(0xfeff9a00); }) - -static inline void __set_CLKC(unsigned long v) -{ - int tmp; - - asm volatile(" st%I0.p %2,%M0 \n" - " setlos %3,%1 \n" - " membar \n" - "0: \n" - " subicc %1,#1,%1,icc0 \n" - " bnc icc0,#1,0b \n" - : "=m"(*(volatile unsigned long *) 0xfeff9a00), "=r"(tmp) - : "r"(v), "i"(256) - : "icc0"); -} - -#define __get_TCTR() ({ *(volatile unsigned long *)(0xfeff9418); }) -#define __get_TPRV() ({ *(volatile unsigned long *)(0xfeff9420); }) -#define __get_TPRCKSL() ({ *(volatile unsigned long *)(0xfeff9428); }) -#define __get_TCSR(T) ({ *(volatile unsigned long *)(0xfeff9400 + 8 * (T)); }) -#define __get_TxCKSL(T) ({ *(volatile unsigned long *)(0xfeff9430 + 8 * (T)); }) - -#define __get_TCSR_DATA(T) ({ __get_TCSR(T) >> 24; }) - -#define __set_TCTR(V) do { *(volatile unsigned long *)(0xfeff9418) = (V); mb(); } while(0) -#define __set_TPRV(V) do { *(volatile unsigned long *)(0xfeff9420) = (V) << 24; mb(); } while(0) -#define __set_TPRCKSL(V) do { *(volatile unsigned long *)(0xfeff9428) = (V); mb(); } while(0) -#define __set_TCSR(T,V) \ -do { *(volatile unsigned long *)(0xfeff9400 + 8 * (T)) = (V); mb(); } while(0) - -#define __set_TxCKSL(T,V) \ -do { *(volatile unsigned long *)(0xfeff9430 + 8 * (T)) = (V); mb(); } while(0) - -#define __set_TCSR_DATA(T,V) __set_TCSR(T, (V) << 24) -#define __set_TxCKSL_DATA(T,V) __set_TxCKSL(T, TxCKSL_EIGHT | __TxCKSL_SELECT((V))) - -/* clock control register */ -#define CLKC_CMODE 0x0f000000 -#define CLKC_SLPL 0x000f0000 -#define CLKC_P0 0x00000100 -#define CLKC_CM 0x00000003 - -#define CLKC_CMODE_s 24 - -/* timer control register - non-readback mode */ -#define TCTR_MODE_0 0x00000000 -#define TCTR_MODE_2 0x04000000 -#define TCTR_MODE_4 0x08000000 -#define TCTR_MODE_5 0x0a000000 -#define TCTR_RL_LATCH 0x00000000 -#define TCTR_RL_RW_LOW8 0x10000000 -#define TCTR_RL_RW_HIGH8 0x20000000 -#define TCTR_RL_RW_LH8 0x30000000 -#define TCTR_SC_CTR0 0x00000000 -#define TCTR_SC_CTR1 0x40000000 -#define TCTR_SC_CTR2 0x80000000 - -/* timer control register - readback mode */ -#define TCTR_CNT0 0x02000000 -#define TCTR_CNT1 0x04000000 -#define TCTR_CNT2 0x08000000 -#define TCTR_NSTATUS 0x10000000 -#define TCTR_NCOUNT 0x20000000 -#define TCTR_SC_READBACK 0xc0000000 - -/* timer control status registers - non-readback mode */ -#define TCSRx_DATA 0xff000000 - -/* timer control status registers - readback mode */ -#define TCSRx_OUTPUT 0x80000000 -#define TCSRx_NULLCOUNT 0x40000000 -#define TCSRx_RL 0x30000000 -#define TCSRx_MODE 0x07000000 - -/* timer clock select registers */ -#define TxCKSL_SELECT 0x0f000000 -#define __TxCKSL_SELECT(X) ((X) << 24) -#define TxCKSL_EIGHT 0xf0000000 - -#endif /* _ASM_TIMER_REGS_H */ diff --git a/include/asm-frv/timex.h b/include/asm-frv/timex.h deleted file mode 100644 index a89bdde..0000000 --- a/include/asm-frv/timex.h +++ /dev/null @@ -1,20 +0,0 @@ -/* timex.h: FR-V architecture timex specifications - */ -#ifndef _ASM_TIMEX_H -#define _ASM_TIMEX_H - -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ -#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ - -typedef unsigned long cycles_t; - -static inline cycles_t get_cycles(void) -{ - return 0; -} - -#define vxtime_lock() do {} while (0) -#define vxtime_unlock() do {} while (0) - -#endif - diff --git a/include/asm-frv/tlb.h b/include/asm-frv/tlb.h deleted file mode 100644 index cd458eb..0000000 --- a/include/asm-frv/tlb.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _ASM_TLB_H -#define _ASM_TLB_H - -#include - -#ifdef CONFIG_MMU -extern void check_pgt_cache(void); -#else -#define check_pgt_cache() do {} while(0) -#endif - -/* - * we don't need any special per-pte or per-vma handling... - */ -#define tlb_start_vma(tlb, vma) do { } while (0) -#define tlb_end_vma(tlb, vma) do { } while (0) -#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) - -/* - * .. because we flush the whole mm when it fills up - */ -#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) - -#include - -#endif /* _ASM_TLB_H */ - diff --git a/include/asm-frv/tlbflush.h b/include/asm-frv/tlbflush.h deleted file mode 100644 index 7ac5eaf..0000000 --- a/include/asm-frv/tlbflush.h +++ /dev/null @@ -1,73 +0,0 @@ -/* tlbflush.h: TLB flushing functions - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_TLBFLUSH_H -#define _ASM_TLBFLUSH_H - -#include -#include - -#ifdef CONFIG_MMU - -#ifndef __ASSEMBLY__ -extern void asmlinkage __flush_tlb_all(void); -extern void asmlinkage __flush_tlb_mm(unsigned long contextid); -extern void asmlinkage __flush_tlb_page(unsigned long contextid, unsigned long start); -extern void asmlinkage __flush_tlb_range(unsigned long contextid, - unsigned long start, unsigned long end); -#endif /* !__ASSEMBLY__ */ - -#define flush_tlb_all() \ -do { \ - preempt_disable(); \ - __flush_tlb_all(); \ - preempt_enable(); \ -} while(0) - -#define flush_tlb_mm(mm) \ -do { \ - preempt_disable(); \ - __flush_tlb_mm((mm)->context.id); \ - preempt_enable(); \ -} while(0) - -#define flush_tlb_range(vma,start,end) \ -do { \ - preempt_disable(); \ - __flush_tlb_range((vma)->vm_mm->context.id, start, end); \ - preempt_enable(); \ -} while(0) - -#define flush_tlb_page(vma,addr) \ -do { \ - preempt_disable(); \ - __flush_tlb_page((vma)->vm_mm->context.id, addr); \ - preempt_enable(); \ -} while(0) - - -#define __flush_tlb_global() flush_tlb_all() -#define flush_tlb() flush_tlb_all() -#define flush_tlb_kernel_range(start, end) flush_tlb_all() - -#else - -#define flush_tlb() BUG() -#define flush_tlb_all() BUG() -#define flush_tlb_mm(mm) BUG() -#define flush_tlb_page(vma,addr) BUG() -#define flush_tlb_range(mm,start,end) BUG() -#define flush_tlb_kernel_range(start, end) BUG() - -#endif - - -#endif /* _ASM_TLBFLUSH_H */ diff --git a/include/asm-frv/topology.h b/include/asm-frv/topology.h deleted file mode 100644 index 9427243..0000000 --- a/include/asm-frv/topology.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_TOPOLOGY_H -#define _ASM_TOPOLOGY_H - -#ifdef CONFIG_NUMA - -#error NUMA not supported yet - -#endif /* CONFIG_NUMA */ - -#include - -#endif /* _ASM_TOPOLOGY_H */ diff --git a/include/asm-frv/types.h b/include/asm-frv/types.h deleted file mode 100644 index 613bf1e..0000000 --- a/include/asm-frv/types.h +++ /dev/null @@ -1,40 +0,0 @@ -/* types.h: FRV types - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_TYPES_H -#define _ASM_TYPES_H - -#include - -#ifndef __ASSEMBLY__ - -typedef unsigned short umode_t; - -#endif /* __ASSEMBLY__ */ - -/* - * These aren't exported outside the kernel to avoid name space clashes - */ -#ifdef __KERNEL__ - -#define BITS_PER_LONG 32 - -#ifndef __ASSEMBLY__ - -/* Dma addresses are 32-bits wide. */ - -typedef u32 dma_addr_t; - -#endif /* __ASSEMBLY__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_TYPES_H */ diff --git a/include/asm-frv/uaccess.h b/include/asm-frv/uaccess.h deleted file mode 100644 index 53650c9..0000000 --- a/include/asm-frv/uaccess.h +++ /dev/null @@ -1,321 +0,0 @@ -/* uaccess.h: userspace accessor functions - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_UACCESS_H -#define _ASM_UACCESS_H - -/* - * User space memory access functions - */ -#include -#include -#include -#include - -#define HAVE_ARCH_UNMAPPED_AREA /* we decide where to put mmaps */ - -#define __ptr(x) ((unsigned long __force *)(x)) - -#define VERIFY_READ 0 -#define VERIFY_WRITE 1 - -#define __addr_ok(addr) ((unsigned long)(addr) < get_addr_limit()) - -/* - * check that a range of addresses falls within the current address limit - */ -static inline int ___range_ok(unsigned long addr, unsigned long size) -{ -#ifdef CONFIG_MMU - int flag = -EFAULT, tmp; - - asm volatile ( - " addcc %3,%2,%1,icc0 \n" /* set C-flag if addr+size>4GB */ - " subcc.p %1,%4,gr0,icc1 \n" /* jump if addr+size>limit */ - " bc icc0,#0,0f \n" - " bhi icc1,#0,0f \n" - " setlos #0,%0 \n" /* mark okay */ - "0: \n" - : "=r"(flag), "=&r"(tmp) - : "r"(addr), "r"(size), "r"(get_addr_limit()), "0"(flag) - ); - - return flag; - -#else - - if (addr < memory_start || - addr > memory_end || - size > memory_end - memory_start || - addr + size > memory_end) - return -EFAULT; - - return 0; -#endif -} - -#define __range_ok(addr,size) ___range_ok((unsigned long) (addr), (unsigned long) (size)) - -#define access_ok(type,addr,size) (__range_ok((void __user *)(addr), (size)) == 0) -#define __access_ok(addr,size) (__range_ok((addr), (size)) == 0) - -/* - * The exception table consists of pairs of addresses: the first is the - * address of an instruction that is allowed to fault, and the second is - * the address at which the program should continue. No registers are - * modified, so it is entirely up to the continuation code to figure out - * what to do. - * - * All the routines below use bits of fixup code that are out of line - * with the main instruction path. This means when everything is well, - * we don't even have to jump over them. Further, they do not intrude - * on our cache or tlb entries. - */ -struct exception_table_entry -{ - unsigned long insn, fixup; -}; - -/* Returns 0 if exception not found and fixup otherwise. */ -extern unsigned long search_exception_table(unsigned long); - - -/* - * These are the main single-value transfer routines. They automatically - * use the right size if we just have the right pointer type. - */ -#define __put_user(x, ptr) \ -({ \ - int __pu_err = 0; \ - \ - typeof(*(ptr)) __pu_val = (x); \ - __chk_user_ptr(ptr); \ - \ - switch (sizeof (*(ptr))) { \ - case 1: \ - __put_user_asm(__pu_err, __pu_val, ptr, "b", "r"); \ - break; \ - case 2: \ - __put_user_asm(__pu_err, __pu_val, ptr, "h", "r"); \ - break; \ - case 4: \ - __put_user_asm(__pu_err, __pu_val, ptr, "", "r"); \ - break; \ - case 8: \ - __put_user_asm(__pu_err, __pu_val, ptr, "d", "e"); \ - break; \ - default: \ - __pu_err = __put_user_bad(); \ - break; \ - } \ - __pu_err; \ -}) - -#define put_user(x, ptr) \ -({ \ - typeof(*(ptr)) __user *_p = (ptr); \ - int _e; \ - \ - _e = __range_ok(_p, sizeof(*_p)); \ - if (_e == 0) \ - _e = __put_user((x), _p); \ - _e; \ -}) - -extern int __put_user_bad(void); - -/* - * Tell gcc we read from memory instead of writing: this is because - * we do not write to any memory gcc knows about, so there are no - * aliasing issues. - */ - -#ifdef CONFIG_MMU - -#define __put_user_asm(err,x,ptr,dsize,constraint) \ -do { \ - asm volatile("1: st"dsize"%I1 %2,%M1 \n" \ - "2: \n" \ - ".subsection 2 \n" \ - "3: setlos %3,%0 \n" \ - " bra 2b \n" \ - ".previous \n" \ - ".section __ex_table,\"a\" \n" \ - " .balign 8 \n" \ - " .long 1b,3b \n" \ - ".previous" \ - : "=r" (err) \ - : "m" (*__ptr(ptr)), constraint (x), "i"(-EFAULT), "0"(err) \ - : "memory"); \ -} while (0) - -#else - -#define __put_user_asm(err,x,ptr,bwl,con) \ -do { \ - asm(" st"bwl"%I0 %1,%M0 \n" \ - " membar \n" \ - : \ - : "m" (*__ptr(ptr)), con (x) \ - : "memory"); \ -} while (0) - -#endif - -/*****************************************************************************/ -/* - * - */ -#define __get_user(x, ptr) \ -({ \ - int __gu_err = 0; \ - __chk_user_ptr(ptr); \ - \ - switch (sizeof(*(ptr))) { \ - case 1: { \ - unsigned char __gu_val; \ - __get_user_asm(__gu_err, __gu_val, ptr, "ub", "=r"); \ - (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ - break; \ - } \ - case 2: { \ - unsigned short __gu_val; \ - __get_user_asm(__gu_err, __gu_val, ptr, "uh", "=r"); \ - (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ - break; \ - } \ - case 4: { \ - unsigned int __gu_val; \ - __get_user_asm(__gu_err, __gu_val, ptr, "", "=r"); \ - (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ - break; \ - } \ - case 8: { \ - unsigned long long __gu_val; \ - __get_user_asm(__gu_err, __gu_val, ptr, "d", "=e"); \ - (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ - break; \ - } \ - default: \ - __gu_err = __get_user_bad(); \ - break; \ - } \ - __gu_err; \ -}) - -#define get_user(x, ptr) \ -({ \ - const typeof(*(ptr)) __user *_p = (ptr);\ - int _e; \ - \ - _e = __range_ok(_p, sizeof(*_p)); \ - if (likely(_e == 0)) \ - _e = __get_user((x), _p); \ - else \ - (x) = (typeof(x)) 0; \ - _e; \ -}) - -extern int __get_user_bad(void); - -#ifdef CONFIG_MMU - -#define __get_user_asm(err,x,ptr,dtype,constraint) \ -do { \ - asm("1: ld"dtype"%I2 %M2,%1 \n" \ - "2: \n" \ - ".subsection 2 \n" \ - "3: setlos %3,%0 \n" \ - " setlos #0,%1 \n" \ - " bra 2b \n" \ - ".previous \n" \ - ".section __ex_table,\"a\" \n" \ - " .balign 8 \n" \ - " .long 1b,3b \n" \ - ".previous" \ - : "=r" (err), constraint (x) \ - : "m" (*__ptr(ptr)), "i"(-EFAULT), "0"(err) \ - ); \ -} while(0) - -#else - -#define __get_user_asm(err,x,ptr,bwl,con) \ - asm(" ld"bwl"%I1 %M1,%0 \n" \ - " membar \n" \ - : con(x) \ - : "m" (*__ptr(ptr))) - -#endif - -/*****************************************************************************/ -/* - * - */ -#define ____force(x) (__force void *)(void __user *)(x) -#ifdef CONFIG_MMU -extern long __memset_user(void *dst, unsigned long count); -extern long __memcpy_user(void *dst, const void *src, unsigned long count); - -#define clear_user(dst,count) __memset_user(____force(dst), (count)) -#define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), ____force(from), (n)) -#define __copy_to_user_inatomic(to, from, n) __memcpy_user(____force(to), (from), (n)) - -#else - -#define clear_user(dst,count) (memset(____force(dst), 0, (count)), 0) -#define __copy_from_user_inatomic(to, from, n) (memcpy((to), ____force(from), (n)), 0) -#define __copy_to_user_inatomic(to, from, n) (memcpy(____force(to), (from), (n)), 0) - -#endif - -#define __clear_user clear_user - -static inline unsigned long __must_check -__copy_to_user(void __user *to, const void *from, unsigned long n) -{ - might_sleep(); - return __copy_to_user_inatomic(to, from, n); -} - -static inline unsigned long -__copy_from_user(void *to, const void __user *from, unsigned long n) -{ - might_sleep(); - return __copy_from_user_inatomic(to, from, n); -} - -static inline long copy_from_user(void *to, const void __user *from, unsigned long n) -{ - unsigned long ret = n; - - if (likely(__access_ok(from, n))) - ret = __copy_from_user(to, from, n); - - if (unlikely(ret != 0)) - memset(to + (n - ret), 0, ret); - - return ret; -} - -static inline long copy_to_user(void __user *to, const void *from, unsigned long n) -{ - return likely(__access_ok(to, n)) ? __copy_to_user(to, from, n) : n; -} - -extern long strncpy_from_user(char *dst, const char __user *src, long count); -extern long strnlen_user(const char __user *src, long count); - -#define strlen_user(str) strnlen_user(str, 32767) - -extern unsigned long search_exception_table(unsigned long addr); - -#endif /* _ASM_UACCESS_H */ diff --git a/include/asm-frv/ucontext.h b/include/asm-frv/ucontext.h deleted file mode 100644 index 8d8c0c9..0000000 --- a/include/asm-frv/ucontext.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ASM_UCONTEXT_H -#define _ASM_UCONTEXT_H - -struct ucontext { - unsigned long uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext uc_mcontext; - sigset_t uc_sigmask; /* mask last for extensibility */ -}; - -#endif diff --git a/include/asm-frv/unaligned.h b/include/asm-frv/unaligned.h deleted file mode 100644 index 6c61c05..0000000 --- a/include/asm-frv/unaligned.h +++ /dev/null @@ -1,22 +0,0 @@ -/* unaligned.h: unaligned access handler - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_UNALIGNED_H -#define _ASM_UNALIGNED_H - -#include -#include -#include - -#define get_unaligned __get_unaligned_be -#define put_unaligned __put_unaligned_be - -#endif /* _ASM_UNALIGNED_H */ diff --git a/include/asm-frv/unistd.h b/include/asm-frv/unistd.h deleted file mode 100644 index edcfaf5..0000000 --- a/include/asm-frv/unistd.h +++ /dev/null @@ -1,382 +0,0 @@ -#ifndef _ASM_UNISTD_H_ -#define _ASM_UNISTD_H_ - -/* - * This file contains the system call numbers. - */ - -#define __NR_restart_syscall 0 -#define __NR_exit 1 -#define __NR_fork 2 -#define __NR_read 3 -#define __NR_write 4 -#define __NR_open 5 -#define __NR_close 6 -#define __NR_waitpid 7 -#define __NR_creat 8 -#define __NR_link 9 -#define __NR_unlink 10 -#define __NR_execve 11 -#define __NR_chdir 12 -#define __NR_time 13 -#define __NR_mknod 14 -#define __NR_chmod 15 -#define __NR_lchown 16 -#define __NR_break 17 -#define __NR_oldstat 18 -#define __NR_lseek 19 -#define __NR_getpid 20 -#define __NR_mount 21 -#define __NR_umount 22 -#define __NR_setuid 23 -#define __NR_getuid 24 -#define __NR_stime 25 -#define __NR_ptrace 26 -#define __NR_alarm 27 -#define __NR_oldfstat 28 -#define __NR_pause 29 -#define __NR_utime 30 -#define __NR_stty 31 -#define __NR_gtty 32 -#define __NR_access 33 -#define __NR_nice 34 -#define __NR_ftime 35 -#define __NR_sync 36 -#define __NR_kill 37 -#define __NR_rename 38 -#define __NR_mkdir 39 -#define __NR_rmdir 40 -#define __NR_dup 41 -#define __NR_pipe 42 -#define __NR_times 43 -#define __NR_prof 44 -#define __NR_brk 45 -#define __NR_setgid 46 -#define __NR_getgid 47 -#define __NR_signal 48 -#define __NR_geteuid 49 -#define __NR_getegid 50 -#define __NR_acct 51 -#define __NR_umount2 52 -#define __NR_lock 53 -#define __NR_ioctl 54 -#define __NR_fcntl 55 -#define __NR_mpx 56 -#define __NR_setpgid 57 -#define __NR_ulimit 58 -// #define __NR_oldolduname /* 59 */ obsolete -#define __NR_umask 60 -#define __NR_chroot 61 -#define __NR_ustat 62 -#define __NR_dup2 63 -#define __NR_getppid 64 -#define __NR_getpgrp 65 -#define __NR_setsid 66 -#define __NR_sigaction 67 -#define __NR_sgetmask 68 -#define __NR_ssetmask 69 -#define __NR_setreuid 70 -#define __NR_setregid 71 -#define __NR_sigsuspend 72 -#define __NR_sigpending 73 -#define __NR_sethostname 74 -#define __NR_setrlimit 75 -#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ -#define __NR_getrusage 77 -#define __NR_gettimeofday 78 -#define __NR_settimeofday 79 -#define __NR_getgroups 80 -#define __NR_setgroups 81 -#define __NR_select 82 -#define __NR_symlink 83 -#define __NR_oldlstat 84 -#define __NR_readlink 85 -#define __NR_uselib 86 -#define __NR_swapon 87 -#define __NR_reboot 88 -#define __NR_readdir 89 -// #define __NR_mmap 90 /* obsolete - not implemented */ -#define __NR_munmap 91 -#define __NR_truncate 92 -#define __NR_ftruncate 93 -#define __NR_fchmod 94 -#define __NR_fchown 95 -#define __NR_getpriority 96 -#define __NR_setpriority 97 -// #define __NR_profil /* 98 */ obsolete -#define __NR_statfs 99 -#define __NR_fstatfs 100 -// #define __NR_ioperm /* 101 */ not supported -#define __NR_socketcall 102 -#define __NR_syslog 103 -#define __NR_setitimer 104 -#define __NR_getitimer 105 -#define __NR_stat 106 -#define __NR_lstat 107 -#define __NR_fstat 108 -// #define __NR_olduname /* 109 */ obsolete -// #define __NR_iopl /* 110 */ not supported -#define __NR_vhangup 111 -// #define __NR_idle /* 112 */ Obsolete -// #define __NR_vm86old /* 113 */ not supported -#define __NR_wait4 114 -#define __NR_swapoff 115 -#define __NR_sysinfo 116 -#define __NR_ipc 117 -#define __NR_fsync 118 -#define __NR_sigreturn 119 -#define __NR_clone 120 -#define __NR_setdomainname 121 -#define __NR_uname 122 -// #define __NR_modify_ldt /* 123 */ not supported -#define __NR_cacheflush 123 -#define __NR_adjtimex 124 -#define __NR_mprotect 125 -#define __NR_sigprocmask 126 -#define __NR_create_module 127 -#define __NR_init_module 128 -#define __NR_delete_module 129 -#define __NR_get_kernel_syms 130 -#define __NR_quotactl 131 -#define __NR_getpgid 132 -#define __NR_fchdir 133 -#define __NR_bdflush 134 -#define __NR_sysfs 135 -#define __NR_personality 136 -#define __NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define __NR_setfsuid 138 -#define __NR_setfsgid 139 -#define __NR__llseek 140 -#define __NR_getdents 141 -#define __NR__newselect 142 -#define __NR_flock 143 -#define __NR_msync 144 -#define __NR_readv 145 -#define __NR_writev 146 -#define __NR_getsid 147 -#define __NR_fdatasync 148 -#define __NR__sysctl 149 -#define __NR_mlock 150 -#define __NR_munlock 151 -#define __NR_mlockall 152 -#define __NR_munlockall 153 -#define __NR_sched_setparam 154 -#define __NR_sched_getparam 155 -#define __NR_sched_setscheduler 156 -#define __NR_sched_getscheduler 157 -#define __NR_sched_yield 158 -#define __NR_sched_get_priority_max 159 -#define __NR_sched_get_priority_min 160 -#define __NR_sched_rr_get_interval 161 -#define __NR_nanosleep 162 -#define __NR_mremap 163 -#define __NR_setresuid 164 -#define __NR_getresuid 165 -// #define __NR_vm86 /* 166 */ not supported -#define __NR_query_module 167 -#define __NR_poll 168 -#define __NR_nfsservctl 169 -#define __NR_setresgid 170 -#define __NR_getresgid 171 -#define __NR_prctl 172 -#define __NR_rt_sigreturn 173 -#define __NR_rt_sigaction 174 -#define __NR_rt_sigprocmask 175 -#define __NR_rt_sigpending 176 -#define __NR_rt_sigtimedwait 177 -#define __NR_rt_sigqueueinfo 178 -#define __NR_rt_sigsuspend 179 -#define __NR_pread64 180 -#define __NR_pwrite64 181 -#define __NR_chown 182 -#define __NR_getcwd 183 -#define __NR_capget 184 -#define __NR_capset 185 -#define __NR_sigaltstack 186 -#define __NR_sendfile 187 -#define __NR_getpmsg 188 /* some people actually want streams */ -#define __NR_putpmsg 189 /* some people actually want streams */ -#define __NR_vfork 190 -#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define __NR_mmap2 192 -#define __NR_truncate64 193 -#define __NR_ftruncate64 194 -#define __NR_stat64 195 -#define __NR_lstat64 196 -#define __NR_fstat64 197 -#define __NR_lchown32 198 -#define __NR_getuid32 199 -#define __NR_getgid32 200 -#define __NR_geteuid32 201 -#define __NR_getegid32 202 -#define __NR_setreuid32 203 -#define __NR_setregid32 204 -#define __NR_getgroups32 205 -#define __NR_setgroups32 206 -#define __NR_fchown32 207 -#define __NR_setresuid32 208 -#define __NR_getresuid32 209 -#define __NR_setresgid32 210 -#define __NR_getresgid32 211 -#define __NR_chown32 212 -#define __NR_setuid32 213 -#define __NR_setgid32 214 -#define __NR_setfsuid32 215 -#define __NR_setfsgid32 216 -#define __NR_pivot_root 217 -#define __NR_mincore 218 -#define __NR_madvise 219 - -#define __NR_getdents64 220 -#define __NR_fcntl64 221 -#define __NR_security 223 /* syscall for security modules */ -#define __NR_gettid 224 -#define __NR_readahead 225 -#define __NR_setxattr 226 -#define __NR_lsetxattr 227 -#define __NR_fsetxattr 228 -#define __NR_getxattr 229 -#define __NR_lgetxattr 230 -#define __NR_fgetxattr 231 -#define __NR_listxattr 232 -#define __NR_llistxattr 233 -#define __NR_flistxattr 234 -#define __NR_removexattr 235 -#define __NR_lremovexattr 236 -#define __NR_fremovexattr 237 -#define __NR_tkill 238 -#define __NR_sendfile64 239 -#define __NR_futex 240 -#define __NR_sched_setaffinity 241 -#define __NR_sched_getaffinity 242 -#define __NR_set_thread_area 243 -#define __NR_get_thread_area 244 -#define __NR_io_setup 245 -#define __NR_io_destroy 246 -#define __NR_io_getevents 247 -#define __NR_io_submit 248 -#define __NR_io_cancel 249 -#define __NR_fadvise64 250 - -#define __NR_exit_group 252 -#define __NR_lookup_dcookie 253 -#define __NR_epoll_create 254 -#define __NR_epoll_ctl 255 -#define __NR_epoll_wait 256 -#define __NR_remap_file_pages 257 -#define __NR_set_tid_address 258 -#define __NR_timer_create 259 -#define __NR_timer_settime (__NR_timer_create+1) -#define __NR_timer_gettime (__NR_timer_create+2) -#define __NR_timer_getoverrun (__NR_timer_create+3) -#define __NR_timer_delete (__NR_timer_create+4) -#define __NR_clock_settime (__NR_timer_create+5) -#define __NR_clock_gettime (__NR_timer_create+6) -#define __NR_clock_getres (__NR_timer_create+7) -#define __NR_clock_nanosleep (__NR_timer_create+8) -#define __NR_statfs64 268 -#define __NR_fstatfs64 269 -#define __NR_tgkill 270 -#define __NR_utimes 271 -#define __NR_fadvise64_64 272 -#define __NR_vserver 273 -#define __NR_mbind 274 -#define __NR_get_mempolicy 275 -#define __NR_set_mempolicy 276 -#define __NR_mq_open 277 -#define __NR_mq_unlink (__NR_mq_open+1) -#define __NR_mq_timedsend (__NR_mq_open+2) -#define __NR_mq_timedreceive (__NR_mq_open+3) -#define __NR_mq_notify (__NR_mq_open+4) -#define __NR_mq_getsetattr (__NR_mq_open+5) -#define __NR_kexec_load 283 -#define __NR_waitid 284 -/* #define __NR_sys_setaltroot 285 */ -#define __NR_add_key 286 -#define __NR_request_key 287 -#define __NR_keyctl 288 -#define __NR_ioprio_set 289 -#define __NR_ioprio_get 290 -#define __NR_inotify_init 291 -#define __NR_inotify_add_watch 292 -#define __NR_inotify_rm_watch 293 -#define __NR_migrate_pages 294 -#define __NR_openat 295 -#define __NR_mkdirat 296 -#define __NR_mknodat 297 -#define __NR_fchownat 298 -#define __NR_futimesat 299 -#define __NR_fstatat64 300 -#define __NR_unlinkat 301 -#define __NR_renameat 302 -#define __NR_linkat 303 -#define __NR_symlinkat 304 -#define __NR_readlinkat 305 -#define __NR_fchmodat 306 -#define __NR_faccessat 307 -#define __NR_pselect6 308 -#define __NR_ppoll 309 -#define __NR_unshare 310 -#define __NR_set_robust_list 311 -#define __NR_get_robust_list 312 -#define __NR_splice 313 -#define __NR_sync_file_range 314 -#define __NR_tee 315 -#define __NR_vmsplice 316 -#define __NR_move_pages 317 -#define __NR_getcpu 318 -#define __NR_epoll_pwait 319 -#define __NR_utimensat 320 -#define __NR_signalfd 321 -#define __NR_timerfd_create 322 -#define __NR_eventfd 323 -#define __NR_fallocate 324 -#define __NR_timerfd_settime 325 -#define __NR_timerfd_gettime 326 -#define __NR_signalfd4 327 -#define __NR_eventfd2 328 -#define __NR_epoll_create1 329 -#define __NR_dup3 330 -#define __NR_pipe2 331 -#define __NR_inotify_init1 332 - -#ifdef __KERNEL__ - -#define NR_syscalls 333 - -#define __ARCH_WANT_IPC_PARSE_VERSION -/* #define __ARCH_WANT_OLD_READDIR */ -#define __ARCH_WANT_OLD_STAT -#define __ARCH_WANT_STAT64 -#define __ARCH_WANT_SYS_ALARM -/* #define __ARCH_WANT_SYS_GETHOSTNAME */ -#define __ARCH_WANT_SYS_PAUSE -/* #define __ARCH_WANT_SYS_SGETMASK */ -/* #define __ARCH_WANT_SYS_SIGNAL */ -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_SYS_UTIME -#define __ARCH_WANT_SYS_WAITPID -#define __ARCH_WANT_SYS_SOCKETCALL -#define __ARCH_WANT_SYS_FADVISE64 -#define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_NICE -/* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */ -#define __ARCH_WANT_SYS_OLDUMOUNT -/* #define __ARCH_WANT_SYS_SIGPENDING */ -#define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -#endif - -#endif /* __KERNEL__ */ -#endif /* _ASM_UNISTD_H_ */ diff --git a/include/asm-frv/user.h b/include/asm-frv/user.h deleted file mode 100644 index 82fa8fa..0000000 --- a/include/asm-frv/user.h +++ /dev/null @@ -1,80 +0,0 @@ -/* user.h: FR-V core file format stuff - * - * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_USER_H -#define _ASM_USER_H - -#include -#include - -/* Core file format: The core file is written in such a way that gdb - * can understand it and provide useful information to the user (under - * linux we use the 'trad-core' bfd). There are quite a number of - * obstacles to being able to view the contents of the floating point - * registers, and until these are solved you will not be able to view - * the contents of them. Actually, you can read in the core file and - * look at the contents of the user struct to find out what the - * floating point registers contain. - * - * The actual file contents are as follows: - * UPAGE: - * 1 page consisting of a user struct that tells gdb what is present - * in the file. Directly after this is a copy of the task_struct, - * which is currently not used by gdb, but it may come in useful at - * some point. All of the registers are stored as part of the - * upage. The upage should always be only one page. - * - * DATA: - * The data area is stored. We use current->end_text to - * current->brk to pick up all of the user variables, plus any - * memory that may have been malloced. No attempt is made to - * determine if a page is demand-zero or if a page is totally - * unused, we just cover the entire range. All of the addresses are - * rounded in such a way that an integral number of pages is - * written. - * - * STACK: - * We need the stack information in order to get a meaningful - * backtrace. We need to write the data from (esp) to - * current->start_stack, so we round each of these off in order to - * be able to write an integer number of pages. The minimum core - * file size is 3 pages, or 12288 bytes. - */ - -/* When the kernel dumps core, it starts by dumping the user struct - - * this will be used by gdb to figure out where the data and stack segments - * are within the file, and what virtual addresses to use. - */ -struct user { - /* We start with the registers, to mimic the way that "memory" is returned - * from the ptrace(3,...) function. */ - struct user_context regs; - - /* The rest of this junk is to help gdb figure out what goes where */ - unsigned long u_tsize; /* Text segment size (pages). */ - unsigned long u_dsize; /* Data segment size (pages). */ - unsigned long u_ssize; /* Stack segment size (pages). */ - unsigned long start_code; /* Starting virtual address of text. */ - unsigned long start_stack; /* Starting virtual address of stack area. - * This is actually the bottom of the stack, - * the top of the stack is always found in the - * esp register. */ - long int signal; /* Signal that caused the core dump. */ - - unsigned long magic; /* To uniquely identify a core file */ - char u_comm[32]; /* User command that was responsible */ -}; - -#define NBPG PAGE_SIZE -#define UPAGES 1 -#define HOST_TEXT_START_ADDR (u.start_code) -#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) - -#endif diff --git a/include/asm-frv/vga.h b/include/asm-frv/vga.h deleted file mode 100644 index a702c80..0000000 --- a/include/asm-frv/vga.h +++ /dev/null @@ -1,17 +0,0 @@ -/* vga.h: VGA register stuff - * - * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ - -#ifndef _ASM_VGA_H -#define _ASM_VGA_H - - - -#endif /* _ASM_VGA_H */ diff --git a/include/asm-frv/virtconvert.h b/include/asm-frv/virtconvert.h deleted file mode 100644 index 59788fa..0000000 --- a/include/asm-frv/virtconvert.h +++ /dev/null @@ -1,41 +0,0 @@ -/* virtconvert.h: virtual/physical/page address convertion - * - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * 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. - */ -#ifndef _ASM_VIRTCONVERT_H -#define _ASM_VIRTCONVERT_H - -/* - * Macros used for converting between virtual and physical mappings. - */ - -#ifdef __KERNEL__ - -#include - -#ifdef CONFIG_MMU - -#define phys_to_virt(vaddr) ((void *) ((unsigned long)(vaddr) + PAGE_OFFSET)) -#define virt_to_phys(vaddr) ((unsigned long) (vaddr) - PAGE_OFFSET) - -#else - -#define phys_to_virt(vaddr) ((void *) (vaddr)) -#define virt_to_phys(vaddr) ((unsigned long) (vaddr)) - -#endif - -#define virt_to_bus virt_to_phys -#define bus_to_virt phys_to_virt - -#define __page_address(page) (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT)) -#define page_to_phys(page) virt_to_phys((void *)__page_address(page)) - -#endif -#endif diff --git a/include/asm-frv/xor.h b/include/asm-frv/xor.h deleted file mode 100644 index c82eb12..0000000 --- a/include/asm-frv/xor.h +++ /dev/null @@ -1 +0,0 @@ -#include -- cgit v0.10.2 From d1e7e02f30be672c6f6ee40908be83877a0d49d1 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Thu, 2 Apr 2009 15:16:56 +0800 Subject: tracing: disable seeking for trace_pipe_raw Impact: disable pread() We set tracing_buffers_fops.llseek to no_llseek, but we can still perform pread() to read this file. That is not expected. This fix uses nonseekable_open() to disable it. tracing_buffers_fops.llseek is still set to no_llseek, it mark this file is a "non-seekable device" and is used by sys_splice(). See also do_splice() or manual of splice(2): ERRORS EINVAL Target file system doesn't support splicing; neither of the descriptors refers to a pipe; or offset given for non-seekable device. Signed-off-by: Lai Jiangshan Cc: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49D46668.8030806@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 9d28476..24b0168 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3285,7 +3285,7 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp) filp->private_data = info; - return 0; + return nonseekable_open(inode, filp); out: kfree(info); -- cgit v0.10.2 From ddd538f3e6a1a4bec2f6942f83a753263e6577b4 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Thu, 2 Apr 2009 15:16:59 +0800 Subject: tracing: allocate page when needed Impact: Cleanup Sometimes, we open trace_pipe_raw, but we don't read(2) it, we just splice(2) it, thus, the page is not used. Signed-off-by: Lai Jiangshan Cc: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49D4666B.4010608@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 24b0168..8e189ff 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3277,19 +3277,13 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp) info->tr = &global_trace; info->cpu = cpu; - info->spare = ring_buffer_alloc_read_page(info->tr->buffer); + info->spare = NULL; /* Force reading ring buffer for first read */ info->read = (unsigned int)-1; - if (!info->spare) - goto out; filp->private_data = info; return nonseekable_open(inode, filp); - - out: - kfree(info); - return -ENOMEM; } static ssize_t @@ -3304,6 +3298,11 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, if (!count) return 0; + if (!info->spare) + info->spare = ring_buffer_alloc_read_page(info->tr->buffer); + if (!info->spare) + return -ENOMEM; + /* Do we have previous read data to read? */ if (info->read < PAGE_SIZE) goto read; @@ -3342,7 +3341,8 @@ static int tracing_buffers_release(struct inode *inode, struct file *file) { struct ftrace_buffer_info *info = file->private_data; - ring_buffer_free_read_page(info->tr->buffer, info->spare); + if (info->spare) + ring_buffer_free_read_page(info->tr->buffer, info->spare); kfree(info); return 0; -- cgit v0.10.2 From c7625a555f55d7ae49236cde551786c88f5a5ce1 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Thu, 2 Apr 2009 15:17:04 +0800 Subject: tracing: update file->f_pos when splice(2) it Impact: Cleanup These two lines: if (unlikely(*ppos)) return -ESPIPE; in tracing_buffers_splice_read() are not needed, VFS layer has disabled seek(2). We remove these two lines, and then we can update file->f_pos. And tracing_buffers_read() updates file->f_pos, this fix make tracing_buffers_splice_read() updates file->f_pos too. Signed-off-by: Lai Jiangshan Cc: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49D46670.4010503@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8e189ff..9462976 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3428,13 +3428,6 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, int size, i; size_t ret; - /* - * We can't seek on a buffer input - */ - if (unlikely(*ppos)) - return -ESPIPE; - - for (i = 0; i < PIPE_BUFFERS && len; i++, len -= size) { struct page *page; int r; @@ -3474,6 +3467,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, spd.partial[i].offset = 0; spd.partial[i].private = (unsigned long)ref; spd.nr_pages++; + *ppos += size; } spd.nr_pages = i; -- cgit v0.10.2 From 93cfb3c9fd83d877a8f1ffad9ff862b617b32828 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Thu, 2 Apr 2009 15:17:08 +0800 Subject: tracing: fix splice return too large I got these from strace: splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 12288 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 12288 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 12288 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 16384 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 8192 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 8192 splice(0x3, 0, 0x5, 0, 0x1000, 0x1) = 8192 I wanted to splice_read 4096 bytes, but it returns 8192 or larger. It is because the return value of tracing_buffers_splice_read() does not include "zero out any left over data" bytes. But tracing_buffers_read() includes these bytes, we make them consistent. Signed-off-by: Lai Jiangshan Cc: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49D46674.9030804@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 9462976..1ce5dc6 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3428,7 +3428,19 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, int size, i; size_t ret; - for (i = 0; i < PIPE_BUFFERS && len; i++, len -= size) { + if (*ppos & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: previous read must page-align\n"); + return -EINVAL; + } + + if (len & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: splice_read should page-align\n"); + if (len < PAGE_SIZE) + return -EINVAL; + len &= PAGE_MASK; + } + + for (i = 0; i < PIPE_BUFFERS && len; i++, len -= PAGE_SIZE) { struct page *page; int r; @@ -3467,7 +3479,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, spd.partial[i].offset = 0; spd.partial[i].private = (unsigned long)ref; spd.nr_pages++; - *ppos += size; + *ppos += PAGE_SIZE; } spd.nr_pages = i; -- cgit v0.10.2 From 4d1f4372dbea068ba4ee3d98231133a4a4ee15bd Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Fri, 10 Apr 2009 08:48:36 +0800 Subject: tracing: fix document references When moving documents to Documentation/trace/, I forgot to grep Kconfig to find out those references. Signed-off-by: Li Zefan Cc: Steven Rostedt Cc: Frederic Weisbecker Cc: Pekka Enberg Cc: Pekka Paalanen Cc: eduard.munteanu@linux360.ro LKML-Reference: <49DE97EF.7080208@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 2246141..417d198 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig @@ -312,7 +312,7 @@ config KMEMTRACE and profile kernel code. This requires an userspace application to use. See - Documentation/vm/kmemtrace.txt for more information. + Documentation/trace/kmemtrace.txt for more information. Saying Y will make the kernel somewhat larger and slower. However, if you disable kmemtrace at run-time or boot-time, the performance @@ -403,7 +403,7 @@ config MMIOTRACE implementation and works via page faults. Tracing is disabled by default and can be enabled at run-time. - See Documentation/tracers/mmiotrace.txt. + See Documentation/trace/mmiotrace.txt. If you are not helping to develop drivers, say N. config MMIOTRACE_TEST -- cgit v0.10.2 From 746cddd37d48a166f170165a0df4bd50fde1ea60 Mon Sep 17 00:00:00 2001 From: Weidong Han Date: Fri, 10 Apr 2009 17:17:17 +0800 Subject: x86, intr-remap: fix eoi for interrupt remapping without x2apic To simplify level irq migration in the presence of interrupt-remapping, Suresh used a virtual vector (io-apic pin number) to eliminate io-apic RTE modification. Level triggered interrupt will appear as an edge to the local apic cpu but still as level to the IO-APIC. So in addition to do the local apic EOI, it still needs to do IO-APIC directed EOI to clear the remote IRR bit in the IO-APIC RTE. Pls refer to Suresh's patch for more details (commit 0280f7c416c652a2fd95d166f52b199ae61122c0). Now interrupt remapping is decoupled from x2apic, it also needs to do the directed EOI for apic. Otherwise, apic interrupts won't work correctly. Signed-off-by: Weidong Han Cc: iommu@lists.linux-foundation.org Cc: Weidong Han Cc: suresh.b.siddha@intel.com Cc: dwmw2@infradead.org Cc: allen.m.kay@intel.com LKML-Reference: <1239355037-22856-1-git-send-email-weidong.han@intel.com> Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 767fe7e..a2789e4 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2524,7 +2524,6 @@ static void irq_complete_move(struct irq_desc **descp) static inline void irq_complete_move(struct irq_desc **descp) {} #endif -#ifdef CONFIG_X86_X2APIC static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) { int apic, pin; @@ -2558,6 +2557,7 @@ eoi_ioapic_irq(struct irq_desc *desc) spin_unlock_irqrestore(&ioapic_lock, flags); } +#ifdef CONFIG_X86_X2APIC static void ack_x2apic_level(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); @@ -2634,6 +2634,9 @@ static void ack_apic_level(unsigned int irq) */ ack_APIC_irq(); + if (irq_remapped(irq)) + eoi_ioapic_irq(desc); + /* Now we can move and renable the irq */ if (unlikely(do_unmask_irq)) { /* Only migrate the irq if the ack has been received. -- cgit v0.10.2 From a0d22f485af1553060b4094ee0154537a8f6a8a6 Mon Sep 17 00:00:00 2001 From: Andy Grover Date: Thu, 9 Apr 2009 16:45:29 -0700 Subject: x86: Document get_user_pages_fast() While better than get_user_pages(), the usage of gupf(), especially the return values and the fact that it can potentially only partially pin the range, warranted some documentation. Signed-off-by: Andy Grover Cc: npiggin@suse.de Cc: akpm@linux-foundation.org LKML-Reference: <1239320729-3262-1-git-send-email-andy.grover@oracle.com> Signed-off-by: Ingo Molnar diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index be54176..6340cef 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c @@ -219,6 +219,22 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end, return 1; } +/** + * get_user_pages_fast() - pin user pages in memory + * @start: starting user address + * @nr_pages: number of pages from start to pin + * @write: whether pages will be written to + * @pages: array that receives pointers to the pages pinned. + * Should be at least nr_pages long. + * + * Attempt to pin user pages in memory without taking mm->mmap_sem. + * If not successful, it will fall back to taking the lock and + * calling get_user_pages(). + * + * Returns number of pages pinned. This may be fewer than the number + * requested. If nr_pages is 0 or negative, returns 0. If no pages + * were pinned, returns -errno. + */ int get_user_pages_fast(unsigned long start, int nr_pages, int write, struct page **pages) { -- cgit v0.10.2 From da7616610c8d2ec16a8ada44216e836e5fcbd08b Mon Sep 17 00:00:00 2001 From: David Howells Date: Fri, 10 Apr 2009 14:19:03 +0100 Subject: Move arch headers from include/asm-mn10300/ to arch/mn10300/include/asm/. Signed-off-by: David Howells diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile index 6673a28..a5985ee 100644 --- a/arch/mn10300/Makefile +++ b/arch/mn10300/Makefile @@ -105,31 +105,31 @@ endif ################################################################################################### # processor specific definitions -include/asm-mn10300/.proc: $(wildcard include/config/proc/*.h) include/config/auto.conf - @echo ' SYMLINK include/asm-mn10300/proc -> include/asm-mn10300/proc-$(PROCESSOR)' +arch/mn10300/include/asm/.proc: $(wildcard include/config/proc/*.h) include/config/auto.conf + @echo ' SYMLINK arch/mn10300/include/asm/proc -> arch/mn10300/include/asm/proc-$(PROCESSOR)' ifneq ($(KBUILD_SRC),) - $(Q)mkdir -p include/asm-mn10300 - $(Q)ln -fsn $(srctree)/include/asm-mn10300/proc-$(PROCESSOR) include/asm-mn10300/proc + $(Q)mkdir -p arch/mn10300/include/asm + $(Q)ln -fsn $(srctree)/arch/mn10300/include/asm/proc-$(PROCESSOR) arch/mn10300/include/asm/proc else - $(Q)ln -fsn proc-$(PROCESSOR) include/asm-mn10300/proc + $(Q)ln -fsn proc-$(PROCESSOR) arch/mn10300/include/asm/proc endif @touch $@ -CLEAN_FILES += include/asm-mn10300/proc include/asm-mn10300/.proc +CLEAN_FILES += arch/mn10300/include/asm/proc arch/mn10300/include/asm/.proc -prepare: include/asm-mn10300/.proc +prepare: arch/mn10300/include/asm/.proc # unit specific definitions -include/asm-mn10300/.unit: $(wildcard include/config/unit/*.h) include/config/auto.conf - @echo ' SYMLINK include/asm-mn10300/unit -> include/asm-mn10300/unit-$(UNIT)' +arch/mn10300/include/asm/.unit: $(wildcard include/config/unit/*.h) include/config/auto.conf + @echo ' SYMLINK arch/mn10300/include/asm/unit -> arch/mn10300/include/asm/unit-$(UNIT)' ifneq ($(KBUILD_SRC),) - $(Q)mkdir -p include/asm-mn10300 - $(Q)ln -fsn $(srctree)/include/asm-mn10300/unit-$(UNIT) include/asm-mn10300/unit + $(Q)mkdir -p arch/mn10300/include/asm + $(Q)ln -fsn $(srctree)/arch/mn10300/include/asm/unit-$(UNIT) arch/mn10300/include/asm/unit else - $(Q)ln -fsn unit-$(UNIT) include/asm-mn10300/unit + $(Q)ln -fsn unit-$(UNIT) arch/mn10300/include/asm/unit endif @touch $@ -CLEAN_FILES += include/asm-mn10300/unit include/asm-mn10300/.unit +CLEAN_FILES += arch/mn10300/include/asm/unit arch/mn10300/include/asm/.unit -prepare: include/asm-mn10300/.unit +prepare: arch/mn10300/include/asm/.unit diff --git a/arch/mn10300/include/asm/Kbuild b/arch/mn10300/include/asm/Kbuild new file mode 100644 index 0000000..c68e168 --- /dev/null +++ b/arch/mn10300/include/asm/Kbuild @@ -0,0 +1 @@ +include include/asm-generic/Kbuild.asm diff --git a/arch/mn10300/include/asm/atomic.h b/arch/mn10300/include/asm/atomic.h new file mode 100644 index 0000000..bc06482 --- /dev/null +++ b/arch/mn10300/include/asm/atomic.h @@ -0,0 +1,157 @@ +/* MN10300 Atomic counter operations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_ATOMIC_H +#define _ASM_ATOMIC_H + +#ifdef CONFIG_SMP +#error not SMP safe +#endif + +/* + * Atomic operations that C can't guarantee us. Useful for + * resource counting etc.. + */ + +#define ATOMIC_INIT(i) { (i) } + +#ifdef __KERNEL__ + +/** + * atomic_read - read atomic variable + * @v: pointer of type atomic_t + * + * Atomically reads the value of @v. Note that the guaranteed + * useful range of an atomic_t is only 24 bits. + */ +#define atomic_read(v) ((v)->counter) + +/** + * atomic_set - set atomic variable + * @v: pointer of type atomic_t + * @i: required value + * + * Atomically sets the value of @v to @i. Note that the guaranteed + * useful range of an atomic_t is only 24 bits. + */ +#define atomic_set(v, i) (((v)->counter) = (i)) + +#include + +/** + * atomic_add_return - add integer to atomic variable + * @i: integer value to add + * @v: pointer of type atomic_t + * + * Atomically adds @i to @v and returns the result + * Note that the guaranteed useful range of an atomic_t is only 24 bits. + */ +static inline int atomic_add_return(int i, atomic_t *v) +{ + unsigned long flags; + int temp; + + local_irq_save(flags); + temp = v->counter; + temp += i; + v->counter = temp; + local_irq_restore(flags); + + return temp; +} + +/** + * atomic_sub_return - subtract integer from atomic variable + * @i: integer value to subtract + * @v: pointer of type atomic_t + * + * Atomically subtracts @i from @v and returns the result + * Note that the guaranteed useful range of an atomic_t is only 24 bits. + */ +static inline int atomic_sub_return(int i, atomic_t *v) +{ + unsigned long flags; + int temp; + + local_irq_save(flags); + temp = v->counter; + temp -= i; + v->counter = temp; + local_irq_restore(flags); + + return temp; +} + +static inline int atomic_add_negative(int i, atomic_t *v) +{ + return atomic_add_return(i, v) < 0; +} + +static inline void atomic_add(int i, atomic_t *v) +{ + atomic_add_return(i, v); +} + +static inline void atomic_sub(int i, atomic_t *v) +{ + atomic_sub_return(i, v); +} + +static inline void atomic_inc(atomic_t *v) +{ + atomic_add_return(1, v); +} + +static inline void atomic_dec(atomic_t *v) +{ + atomic_sub_return(1, v); +} + +#define atomic_dec_return(v) atomic_sub_return(1, (v)) +#define atomic_inc_return(v) atomic_add_return(1, (v)) + +#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0) +#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) +#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) + +#define atomic_add_unless(v, a, u) \ +({ \ + int c, old; \ + c = atomic_read(v); \ + while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ + c = old; \ + c != (u); \ +}) + +#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) + +static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) +{ + unsigned long flags; + + mask = ~mask; + local_irq_save(flags); + *addr &= mask; + local_irq_restore(flags); +} + +#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) +#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) + +/* Atomic operations are already serializing on MN10300??? */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + +#include + +#endif /* __KERNEL__ */ +#endif /* _ASM_ATOMIC_H */ diff --git a/arch/mn10300/include/asm/auxvec.h b/arch/mn10300/include/asm/auxvec.h new file mode 100644 index 0000000..4fdb60b --- /dev/null +++ b/arch/mn10300/include/asm/auxvec.h @@ -0,0 +1,4 @@ +#ifndef _ASM_AUXVEC_H +#define _ASM_AUXVEC_H + +#endif diff --git a/arch/mn10300/include/asm/bitops.h b/arch/mn10300/include/asm/bitops.h new file mode 100644 index 0000000..0b610f4 --- /dev/null +++ b/arch/mn10300/include/asm/bitops.h @@ -0,0 +1,240 @@ +/* MN10300 bit operations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + * + * These have to be done with inline assembly: that way the bit-setting + * is guaranteed to be atomic. All bit operations return 0 if the bit + * was cleared before the operation and != 0 if it was not. + * + * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). + */ +#ifndef __ASM_BITOPS_H +#define __ASM_BITOPS_H + +#include + +#define smp_mb__before_clear_bit() barrier() +#define smp_mb__after_clear_bit() barrier() + +/* + * set bit + */ +#define __set_bit(nr, addr) \ +({ \ + volatile unsigned char *_a = (unsigned char *)(addr); \ + const unsigned shift = (nr) & 7; \ + _a += (nr) >> 3; \ + \ + asm volatile("bset %2,(%1) # set_bit reg" \ + : "=m"(*_a) \ + : "a"(_a), "d"(1 << shift), "m"(*_a) \ + : "memory", "cc"); \ +}) + +#define set_bit(nr, addr) __set_bit((nr), (addr)) + +/* + * clear bit + */ +#define ___clear_bit(nr, addr) \ +({ \ + volatile unsigned char *_a = (unsigned char *)(addr); \ + const unsigned shift = (nr) & 7; \ + _a += (nr) >> 3; \ + \ + asm volatile("bclr %2,(%1) # clear_bit reg" \ + : "=m"(*_a) \ + : "a"(_a), "d"(1 << shift), "m"(*_a) \ + : "memory", "cc"); \ +}) + +#define clear_bit(nr, addr) ___clear_bit((nr), (addr)) + + +static inline void __clear_bit(int nr, volatile void *addr) +{ + unsigned int *a = (unsigned int *) addr; + int mask; + + a += nr >> 5; + mask = 1 << (nr & 0x1f); + *a &= ~mask; +} + +/* + * test bit + */ +static inline int test_bit(int nr, const volatile void *addr) +{ + return 1UL & (((const unsigned int *) addr)[nr >> 5] >> (nr & 31)); +} + +/* + * change bit + */ +static inline void __change_bit(int nr, volatile void *addr) +{ + int mask; + unsigned int *a = (unsigned int *) addr; + + a += nr >> 5; + mask = 1 << (nr & 0x1f); + *a ^= mask; +} + +extern void change_bit(int nr, volatile void *addr); + +/* + * test and set bit + */ +#define __test_and_set_bit(nr,addr) \ +({ \ + volatile unsigned char *_a = (unsigned char *)(addr); \ + const unsigned shift = (nr) & 7; \ + unsigned epsw; \ + _a += (nr) >> 3; \ + \ + asm volatile("bset %3,(%2) # test_set_bit reg\n" \ + "mov epsw,%1" \ + : "=m"(*_a), "=d"(epsw) \ + : "a"(_a), "d"(1 << shift), "m"(*_a) \ + : "memory", "cc"); \ + \ + !(epsw & EPSW_FLAG_Z); \ +}) + +#define test_and_set_bit(nr, addr) __test_and_set_bit((nr), (addr)) + +/* + * test and clear bit + */ +#define __test_and_clear_bit(nr, addr) \ +({ \ + volatile unsigned char *_a = (unsigned char *)(addr); \ + const unsigned shift = (nr) & 7; \ + unsigned epsw; \ + _a += (nr) >> 3; \ + \ + asm volatile("bclr %3,(%2) # test_clear_bit reg\n" \ + "mov epsw,%1" \ + : "=m"(*_a), "=d"(epsw) \ + : "a"(_a), "d"(1 << shift), "m"(*_a) \ + : "memory", "cc"); \ + \ + !(epsw & EPSW_FLAG_Z); \ +}) + +#define test_and_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr)) + +/* + * test and change bit + */ +static inline int __test_and_change_bit(int nr, volatile void *addr) +{ + int mask, retval; + unsigned int *a = (unsigned int *)addr; + + a += nr >> 5; + mask = 1 << (nr & 0x1f); + retval = (mask & *a) != 0; + *a ^= mask; + + return retval; +} + +extern int test_and_change_bit(int nr, volatile void *addr); + +#include + +#ifdef __KERNEL__ + +/** + * __ffs - find first bit set + * @x: the word to search + * + * - return 31..0 to indicate bit 31..0 most least significant bit set + * - if no bits are set in x, the result is undefined + */ +static inline __attribute__((const)) +unsigned long __ffs(unsigned long x) +{ + int bit; + asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(x & -x)); + return bit; +} + +/* + * special slimline version of fls() for calculating ilog2_u32() + * - note: no protection against n == 0 + */ +static inline __attribute__((const)) +int __ilog2_u32(u32 n) +{ + int bit; + asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(n)); + return bit; +} + +/** + * fls - find last bit set + * @x: the word to search + * + * This is defined the same way as ffs: + * - return 32..1 to indicate bit 31..0 most significant bit set + * - return 0 to indicate no bits set + */ +static inline __attribute__((const)) +int fls(int x) +{ + return (x != 0) ? __ilog2_u32(x) + 1 : 0; +} + +/** + * __fls - find last (most-significant) set bit in a long word + * @word: the word to search + * + * Undefined if no set bit exists, so code should check against 0 first. + */ +static inline unsigned long __fls(unsigned long word) +{ + return __ilog2_u32(word); +} + +/** + * ffs - find first bit set + * @x: the word to search + * + * - return 32..1 to indicate bit 31..0 most least significant bit set + * - return 0 to indicate no bits set + */ +static inline __attribute__((const)) +int ffs(int x) +{ + /* Note: (x & -x) gives us a mask that is the least significant + * (rightmost) 1-bit of the value in x. + */ + return fls(x & -x); +} + +#include +#include +#include +#include +#include + +#define ext2_set_bit_atomic(lock, nr, addr) \ + test_and_set_bit((nr) ^ 0x18, (addr)) +#define ext2_clear_bit_atomic(lock, nr, addr) \ + test_and_clear_bit((nr) ^ 0x18, (addr)) + +#include +#include + +#endif /* __KERNEL__ */ +#endif /* __ASM_BITOPS_H */ diff --git a/arch/mn10300/include/asm/bug.h b/arch/mn10300/include/asm/bug.h new file mode 100644 index 0000000..4fcf338 --- /dev/null +++ b/arch/mn10300/include/asm/bug.h @@ -0,0 +1,35 @@ +/* MN10300 Kernel bug reporting + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_BUG_H +#define _ASM_BUG_H + +/* + * Tell the user there is some problem. + */ +#define _debug_bug_trap() \ +do { \ + asm volatile( \ + " syscall 15 \n" \ + "0: \n" \ + " .section __bug_table,\"a\" \n" \ + " .long 0b,%0,%1 \n" \ + " .previous \n" \ + : \ + : "i"(__FILE__), "i"(__LINE__) \ + ); \ +} while (0) + +#define BUG() _debug_bug_trap() + +#define HAVE_ARCH_BUG +#include + +#endif /* _ASM_BUG_H */ diff --git a/arch/mn10300/include/asm/bugs.h b/arch/mn10300/include/asm/bugs.h new file mode 100644 index 0000000..31c8bc5 --- /dev/null +++ b/arch/mn10300/include/asm/bugs.h @@ -0,0 +1,20 @@ +/* MN10300 Checks for architecture-dependent bugs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_BUGS_H +#define _ASM_BUGS_H + +#include + +static inline void __init check_bugs(void) +{ +} + +#endif /* _ASM_BUGS_H */ diff --git a/arch/mn10300/include/asm/busctl-regs.h b/arch/mn10300/include/asm/busctl-regs.h new file mode 100644 index 0000000..1632aef --- /dev/null +++ b/arch/mn10300/include/asm/busctl-regs.h @@ -0,0 +1,151 @@ +/* AM33v2 on-board bus controller registers + * + * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_BUSCTL_REGS_H +#define _ASM_BUSCTL_REGS_H + +#include + +#ifdef __KERNEL__ + +/* bus controller registers */ +#define BCCR __SYSREG(0xc0002000, u32) /* bus controller control reg */ +#define BCCR_B0AD 0x00000003 /* block 0 (80000000-83ffffff) bus allocation */ +#define BCCR_B1AD 0x0000000c /* block 1 (84000000-87ffffff) bus allocation */ +#define BCCR_B2AD 0x00000030 /* block 2 (88000000-8bffffff) bus allocation */ +#define BCCR_B3AD 0x000000c0 /* block 3 (8c000000-8fffffff) bus allocation */ +#define BCCR_B4AD 0x00000300 /* block 4 (90000000-93ffffff) bus allocation */ +#define BCCR_B5AD 0x00000c00 /* block 5 (94000000-97ffffff) bus allocation */ +#define BCCR_B6AD 0x00003000 /* block 6 (98000000-9bffffff) bus allocation */ +#define BCCR_B7AD 0x0000c000 /* block 7 (9c000000-9fffffff) bus allocation */ +#define BCCR_BxAD_EXBUS 0x0 /* - direct to system bus controller */ +#define BCCR_BxAD_OPEXBUS 0x1 /* - direct to memory bus controller */ +#define BCCR_BxAD_OCMBUS 0x2 /* - direct to on chip memory */ +#define BCCR_API 0x00070000 /* bus arbitration priority */ +#define BCCR_API_DMACICD 0x00000000 /* - DMA > CI > CD */ +#define BCCR_API_DMACDCI 0x00010000 /* - DMA > CD > CI */ +#define BCCR_API_CICDDMA 0x00020000 /* - CI > CD > DMA */ +#define BCCR_API_CDCIDMA 0x00030000 /* - CD > CI > DMA */ +#define BCCR_API_ROUNDROBIN 0x00040000 /* - round robin */ +#define BCCR_BEPRI_DMACICD 0x00c00000 /* bus error address priority */ +#define BCCR_BEPRI_DMACDCI 0x00000000 /* - DMA > CI > CD */ +#define BCCR_BEPRI_CICDDMA 0x00400000 /* - DMA > CD > CI */ +#define BCCR_BEPRI_CDCIDMA 0x00800000 /* - CI > CD > DMA */ +#define BCCR_BEPRI 0x00c00000 /* - CD > CI > DMA */ +#define BCCR_TMON 0x03000000 /* timeout value settings */ +#define BCCR_TMON_16IOCLK 0x00000000 /* - 16 IOCLK cycles */ +#define BCCR_TMON_256IOCLK 0x01000000 /* - 256 IOCLK cycles */ +#define BCCR_TMON_4096IOCLK 0x02000000 /* - 4096 IOCLK cycles */ +#define BCCR_TMON_65536IOCLK 0x03000000 /* - 65536 IOCLK cycles */ +#define BCCR_TMOE 0x10000000 /* timeout detection enable */ + +#define BCBERR __SYSREG(0xc0002010, u32) /* bus error source reg */ +#define BCBERR_BESB 0x0000001f /* erroneous access destination space */ +#define BCBERR_BESB_MON 0x00000001 /* - monitor space */ +#define BCBERR_BESB_IO 0x00000002 /* - IO bus */ +#define BCBERR_BESB_EX 0x00000004 /* - EX bus */ +#define BCBERR_BESB_OPEX 0x00000008 /* - OpEX bus */ +#define BCBERR_BESB_OCM 0x00000010 /* - on chip memory */ +#define BCBERR_BERW 0x00000100 /* type of access */ +#define BCBERR_BERW_WRITE 0x00000000 /* - write */ +#define BCBERR_BERW_READ 0x00000100 /* - read */ +#define BCBERR_BESD 0x00000200 /* error detector */ +#define BCBERR_BESD_BCU 0x00000000 /* - BCU detected error */ +#define BCBERR_BESD_SLAVE_BUS 0x00000200 /* - slave bus detected error */ +#define BCBERR_BEBST 0x00000400 /* type of access */ +#define BCBERR_BEBST_SINGLE 0x00000000 /* - single */ +#define BCBERR_BEBST_BURST 0x00000400 /* - burst */ +#define BCBERR_BEME 0x00000800 /* multiple bus error flag */ +#define BCBERR_BEMR 0x00007000 /* master bus that caused the error */ +#define BCBERR_BEMR_NOERROR 0x00000000 /* - no error */ +#define BCBERR_BEMR_CI 0x00001000 /* - CPU instruction fetch bus caused error */ +#define BCBERR_BEMR_CD 0x00002000 /* - CPU data bus caused error */ +#define BCBERR_BEMR_DMA 0x00004000 /* - DMA bus caused error */ + +#define BCBEAR __SYSREGC(0xc0002020, u32) /* bus error address reg */ + +/* system bus controller registers */ +#define SBBASE(X) __SYSREG(0xd8c00100 + (X) * 0x10, u32) /* SBC base addr regs */ +#define SBBASE_BE 0x00000001 /* bank enable */ +#define SBBASE_BAM 0x0000fffe /* bank address mask [31:17] */ +#define SBBASE_BBA 0xfffe0000 /* bank base address [31:17] */ + +#define SBCNTRL0(X) __SYSREG(0xd8c00200 + (X) * 0x10, u32) /* SBC bank ctrl0 regs */ +#define SBCNTRL0_WEH 0x00000f00 /* write enable hold */ +#define SBCNTRL0_REH 0x0000f000 /* read enable hold */ +#define SBCNTRL0_RWH 0x000f0000 /* SRW signal hold */ +#define SBCNTRL0_CSH 0x00f00000 /* chip select hold */ +#define SBCNTRL0_DAH 0x0f000000 /* data hold */ +#define SBCNTRL0_ADH 0xf0000000 /* address hold */ + +#define SBCNTRL1(X) __SYSREG(0xd8c00204 + (X) * 0x10, u32) /* SBC bank ctrl1 regs */ +#define SBCNTRL1_WED 0x00000f00 /* write enable delay */ +#define SBCNTRL1_RED 0x0000f000 /* read enable delay */ +#define SBCNTRL1_RWD 0x000f0000 /* SRW signal delay */ +#define SBCNTRL1_ASW 0x00f00000 /* address strobe width */ +#define SBCNTRL1_CSD 0x0f000000 /* chip select delay */ +#define SBCNTRL1_ASD 0xf0000000 /* address strobe delay */ + +#define SBCNTRL2(X) __SYSREG(0xd8c00208 + (X) * 0x10, u32) /* SBC bank ctrl2 regs */ +#define SBCNTRL2_WC 0x000000ff /* wait count */ +#define SBCNTRL2_BWC 0x00000f00 /* burst wait count */ +#define SBCNTRL2_WM 0x01000000 /* wait mode setting */ +#define SBCNTRL2_WM_FIXEDWAIT 0x00000000 /* - fixed wait access */ +#define SBCNTRL2_WM_HANDSHAKE 0x01000000 /* - handshake access */ +#define SBCNTRL2_BM 0x02000000 /* bus synchronisation mode */ +#define SBCNTRL2_BM_SYNC 0x00000000 /* - synchronous mode */ +#define SBCNTRL2_BM_ASYNC 0x02000000 /* - asynchronous mode */ +#define SBCNTRL2_BW 0x04000000 /* bus width */ +#define SBCNTRL2_BW_32 0x00000000 /* - 32 bits */ +#define SBCNTRL2_BW_16 0x04000000 /* - 16 bits */ +#define SBCNTRL2_RWINV 0x08000000 /* R/W signal invert polarity */ +#define SBCNTRL2_RWINV_NORM 0x00000000 /* - normal (read high) */ +#define SBCNTRL2_RWINV_INV 0x08000000 /* - inverted (read low) */ +#define SBCNTRL2_BT 0x70000000 /* bus type setting */ +#define SBCNTRL2_BT_SRAM 0x00000000 /* - SRAM interface */ +#define SBCNTRL2_BT_ADMUX 0x00000000 /* - addr/data multiplexed interface */ +#define SBCNTRL2_BT_BROM 0x00000000 /* - burst ROM interface */ +#define SBCNTRL2_BTSE 0x80000000 /* burst enable */ + +/* memory bus controller */ +#define SDBASE(X) __SYSREG(0xda000008 + (X) * 0x4, u32) /* MBC base addr regs */ +#define SDBASE_CE 0x00000001 /* chip enable */ +#define SDBASE_CBAM 0x0000fff0 /* chip base address mask [31:20] */ +#define SDBASE_CBAM_SHIFT 16 +#define SDBASE_CBA 0xfff00000 /* chip base address [31:20] */ + +#define SDRAMBUS __SYSREG(0xda000000, u32) /* bus mode control reg */ +#define SDRAMBUS_REFEN 0x00000004 /* refresh enable */ +#define SDRAMBUS_TRC 0x00000018 /* refresh command delay time */ +#define SDRAMBUS_BSTPT 0x00000020 /* burst stop command enable */ +#define SDRAMBUS_PONSEQ 0x00000040 /* power on sequence */ +#define SDRAMBUS_SELFREQ 0x00000080 /* self-refresh mode request */ +#define SDRAMBUS_SELFON 0x00000100 /* self-refresh mode on */ +#define SDRAMBUS_SIZE 0x00030000 /* SDRAM size */ +#define SDRAMBUS_SIZE_64Mbit 0x00010000 /* 64Mbit SDRAM (x16) */ +#define SDRAMBUS_SIZE_128Mbit 0x00020000 /* 128Mbit SDRAM (x16) */ +#define SDRAMBUS_SIZE_256Mbit 0x00030000 /* 256Mbit SDRAM (x16) */ +#define SDRAMBUS_TRASWAIT 0x000c0000 /* row address precharge command cycle number */ +#define SDRAMBUS_REFNUM 0x00300000 /* refresh command number */ +#define SDRAMBUS_BSTWAIT 0x00c00000 /* burst stop command cycle */ +#define SDRAMBUS_SETWAIT 0x03000000 /* mode register setting command cycle */ +#define SDRAMBUS_PREWAIT 0x0c000000 /* precharge command cycle */ +#define SDRAMBUS_RASLATE 0x30000000 /* RAS latency */ +#define SDRAMBUS_CASLATE 0xc0000000 /* CAS latency */ + +#define SDREFCNT __SYSREG(0xda000004, u32) /* refresh period reg */ +#define SDREFCNT_PERI 0x00000fff /* refresh period */ + +#define SDSHDW __SYSREG(0xda000010, u32) /* test reg */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_BUSCTL_REGS_H */ diff --git a/arch/mn10300/include/asm/byteorder.h b/arch/mn10300/include/asm/byteorder.h new file mode 100644 index 0000000..5dd0bdd --- /dev/null +++ b/arch/mn10300/include/asm/byteorder.h @@ -0,0 +1,6 @@ +#ifndef _ASM_BYTEORDER_H +#define _ASM_BYTEORDER_H + +#include + +#endif /* _ASM_BYTEORDER_H */ diff --git a/arch/mn10300/include/asm/cache.h b/arch/mn10300/include/asm/cache.h new file mode 100644 index 0000000..9e01122 --- /dev/null +++ b/arch/mn10300/include/asm/cache.h @@ -0,0 +1,54 @@ +/* MN10300 cache management registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_CACHE_H +#define _ASM_CACHE_H + +#include +#include + +#ifndef __ASSEMBLY__ +#define L1_CACHE_DISPARITY (L1_CACHE_NENTRIES * L1_CACHE_BYTES) +#else +#define L1_CACHE_DISPARITY L1_CACHE_NENTRIES * L1_CACHE_BYTES +#endif + +/* data cache purge registers + * - read from the register to unconditionally purge that cache line + * - write address & 0xffffff00 to conditionally purge that cache line + * - clear LSB to request invalidation as well + */ +#define DCACHE_PURGE(WAY, ENTRY) \ + __SYSREG(0xc8400000 + (WAY) * L1_CACHE_WAYDISP + \ + (ENTRY) * L1_CACHE_BYTES, u32) + +#define DCACHE_PURGE_WAY0(ENTRY) \ + __SYSREG(0xc8400000 + 0 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) +#define DCACHE_PURGE_WAY1(ENTRY) \ + __SYSREG(0xc8400000 + 1 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) +#define DCACHE_PURGE_WAY2(ENTRY) \ + __SYSREG(0xc8400000 + 2 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) +#define DCACHE_PURGE_WAY3(ENTRY) \ + __SYSREG(0xc8400000 + 3 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) + +/* instruction cache access registers */ +#define ICACHE_DATA(WAY, ENTRY, OFF) \ + __SYSREG(0xc8000000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10 + (OFF) * 4, u32) +#define ICACHE_TAG(WAY, ENTRY) \ + __SYSREG(0xc8100000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10, u32) + +/* instruction cache access registers */ +#define DCACHE_DATA(WAY, ENTRY, OFF) \ + __SYSREG(0xc8200000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10 + (OFF) * 4, u32) +#define DCACHE_TAG(WAY, ENTRY) \ + __SYSREG(0xc8300000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10, u32) + +#endif /* _ASM_CACHE_H */ diff --git a/arch/mn10300/include/asm/cacheflush.h b/arch/mn10300/include/asm/cacheflush.h new file mode 100644 index 0000000..2db746a --- /dev/null +++ b/arch/mn10300/include/asm/cacheflush.h @@ -0,0 +1,116 @@ +/* MN10300 Cache flushing + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_CACHEFLUSH_H +#define _ASM_CACHEFLUSH_H + +#ifndef __ASSEMBLY__ + +/* Keep includes the same across arches. */ +#include + +/* + * virtually-indexed cache managment (our cache is physically indexed) + */ +#define flush_cache_all() do {} while (0) +#define flush_cache_mm(mm) do {} while (0) +#define flush_cache_dup_mm(mm) do {} while (0) +#define flush_cache_range(mm, start, end) do {} while (0) +#define flush_cache_page(vma, vmaddr, pfn) do {} while (0) +#define flush_cache_vmap(start, end) do {} while (0) +#define flush_cache_vunmap(start, end) do {} while (0) +#define flush_dcache_page(page) do {} while (0) +#define flush_dcache_mmap_lock(mapping) do {} while (0) +#define flush_dcache_mmap_unlock(mapping) do {} while (0) + +/* + * physically-indexed cache managment + */ +#ifndef CONFIG_MN10300_CACHE_DISABLED + +extern void flush_icache_range(unsigned long start, unsigned long end); +extern void flush_icache_page(struct vm_area_struct *vma, struct page *pg); + +#else + +#define flush_icache_range(start, end) do {} while (0) +#define flush_icache_page(vma, pg) do {} while (0) + +#endif + +#define flush_icache_user_range(vma, pg, adr, len) \ + flush_icache_range(adr, adr + len) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + do { \ + memcpy(dst, src, len); \ + flush_icache_page(vma, page); \ + } while (0) + +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + +/* + * primitive routines + */ +#ifndef CONFIG_MN10300_CACHE_DISABLED +extern void mn10300_icache_inv(void); +extern void mn10300_dcache_inv(void); +extern void mn10300_dcache_inv_page(unsigned start); +extern void mn10300_dcache_inv_range(unsigned start, unsigned end); +extern void mn10300_dcache_inv_range2(unsigned start, unsigned size); +#ifdef CONFIG_MN10300_CACHE_WBACK +extern void mn10300_dcache_flush(void); +extern void mn10300_dcache_flush_page(unsigned start); +extern void mn10300_dcache_flush_range(unsigned start, unsigned end); +extern void mn10300_dcache_flush_range2(unsigned start, unsigned size); +extern void mn10300_dcache_flush_inv(void); +extern void mn10300_dcache_flush_inv_page(unsigned start); +extern void mn10300_dcache_flush_inv_range(unsigned start, unsigned end); +extern void mn10300_dcache_flush_inv_range2(unsigned start, unsigned size); +#else +#define mn10300_dcache_flush() do {} while (0) +#define mn10300_dcache_flush_page(start) do {} while (0) +#define mn10300_dcache_flush_range(start, end) do {} while (0) +#define mn10300_dcache_flush_range2(start, size) do {} while (0) +#define mn10300_dcache_flush_inv() mn10300_dcache_inv() +#define mn10300_dcache_flush_inv_page(start) \ + mn10300_dcache_inv_page((start)) +#define mn10300_dcache_flush_inv_range(start, end) \ + mn10300_dcache_inv_range((start), (end)) +#define mn10300_dcache_flush_inv_range2(start, size) \ + mn10300_dcache_inv_range2((start), (size)) +#endif /* CONFIG_MN10300_CACHE_WBACK */ +#else +#define mn10300_icache_inv() do {} while (0) +#define mn10300_dcache_inv() do {} while (0) +#define mn10300_dcache_inv_page(start) do {} while (0) +#define mn10300_dcache_inv_range(start, end) do {} while (0) +#define mn10300_dcache_inv_range2(start, size) do {} while (0) +#define mn10300_dcache_flush() do {} while (0) +#define mn10300_dcache_flush_inv_page(start) do {} while (0) +#define mn10300_dcache_flush_inv() do {} while (0) +#define mn10300_dcache_flush_inv_range(start, end) do {} while (0) +#define mn10300_dcache_flush_inv_range2(start, size) do {} while (0) +#define mn10300_dcache_flush_page(start) do {} while (0) +#define mn10300_dcache_flush_range(start, end) do {} while (0) +#define mn10300_dcache_flush_range2(start, size) do {} while (0) +#endif /* CONFIG_MN10300_CACHE_DISABLED */ + +/* + * internal debugging function + */ +#ifdef CONFIG_DEBUG_PAGEALLOC +extern void kernel_map_pages(struct page *page, int numpages, int enable); +#endif + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_CACHEFLUSH_H */ diff --git a/arch/mn10300/include/asm/checksum.h b/arch/mn10300/include/asm/checksum.h new file mode 100644 index 0000000..9fb2a8d --- /dev/null +++ b/arch/mn10300/include/asm/checksum.h @@ -0,0 +1,86 @@ +/* MN10300 Optimised checksumming code + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_CHECKSUM_H +#define _ASM_CHECKSUM_H + +extern __wsum csum_partial(const void *buff, int len, __wsum sum); +extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, + int len, __wsum sum); +extern __wsum csum_partial_copy_from_user(const void *src, void *dst, + int len, __wsum sum, + int *err_ptr); +extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); +extern __wsum csum_partial(const void *buff, int len, __wsum sum); +extern __sum16 ip_compute_csum(const void *buff, int len); + +#define csum_partial_copy_fromuser csum_partial_copy +extern __wsum csum_partial_copy(const void *src, void *dst, int len, + __wsum sum); + +static inline __sum16 csum_fold(__wsum sum) +{ + asm( + " add %1,%0 \n" + " addc 0xffff,%0 \n" + : "=r" (sum) + : "r" (sum << 16), "0" (sum & 0xffff0000) + : "cc" + ); + return (~sum) >> 16; +} + +static inline __wsum csum_tcpudp_nofold(unsigned long saddr, + unsigned long daddr, + unsigned short len, + unsigned short proto, + __wsum sum) +{ + __wsum tmp; + + tmp = (__wsum) ntohs(len) << 16; + tmp += (__wsum) proto << 8; + + asm( + " add %1,%0 \n" + " addc %2,%0 \n" + " addc %3,%0 \n" + " addc 0,%0 \n" + : "=r" (sum) + : "r" (daddr), "r"(saddr), "r"(tmp), "0"(sum) + : "cc" + ); + return sum; +} + +/* + * computes the checksum of the TCP/UDP pseudo-header + * returns a 16-bit checksum, already complemented + */ +static inline __sum16 csum_tcpudp_magic(unsigned long saddr, + unsigned long daddr, + unsigned short len, + unsigned short proto, + __wsum sum) +{ + return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); +} + +#undef _HAVE_ARCH_IPV6_CSUM + +/* + * Copy and checksum to user + */ +#define HAVE_CSUM_COPY_USER +extern __wsum csum_and_copy_to_user(const void *src, void *dst, int len, + __wsum sum, int *err_ptr); + + +#endif /* _ASM_CHECKSUM_H */ diff --git a/arch/mn10300/include/asm/cpu-regs.h b/arch/mn10300/include/asm/cpu-regs.h new file mode 100644 index 0000000..757e9b5 --- /dev/null +++ b/arch/mn10300/include/asm/cpu-regs.h @@ -0,0 +1,290 @@ +/* MN10300 Core system registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_CPU_REGS_H +#define _ASM_CPU_REGS_H + +#ifndef __ASSEMBLY__ +#include +#endif + +#ifdef CONFIG_MN10300_CPU_AM33V2 +/* we tell the compiler to pretend to be AM33 so that it doesn't try and use + * the FP regs, but tell the assembler that we're actually allowed AM33v2 + * instructions */ +#ifndef __ASSEMBLY__ +asm(" .am33_2\n"); +#else +.am33_2 +#endif +#endif + +#ifdef __KERNEL__ + +#ifndef __ASSEMBLY__ +#define __SYSREG(ADDR, TYPE) (*(volatile TYPE *)(ADDR)) +#define __SYSREGC(ADDR, TYPE) (*(const volatile TYPE *)(ADDR)) +#else +#define __SYSREG(ADDR, TYPE) ADDR +#define __SYSREGC(ADDR, TYPE) ADDR +#endif + +/* CPU registers */ +#define EPSW_FLAG_Z 0x00000001 /* zero flag */ +#define EPSW_FLAG_N 0x00000002 /* negative flag */ +#define EPSW_FLAG_C 0x00000004 /* carry flag */ +#define EPSW_FLAG_V 0x00000008 /* overflow flag */ +#define EPSW_IM 0x00000700 /* interrupt mode */ +#define EPSW_IM_0 0x00000000 /* interrupt mode 0 */ +#define EPSW_IM_1 0x00000100 /* interrupt mode 1 */ +#define EPSW_IM_2 0x00000200 /* interrupt mode 2 */ +#define EPSW_IM_3 0x00000300 /* interrupt mode 3 */ +#define EPSW_IM_4 0x00000400 /* interrupt mode 4 */ +#define EPSW_IM_5 0x00000500 /* interrupt mode 5 */ +#define EPSW_IM_6 0x00000600 /* interrupt mode 6 */ +#define EPSW_IM_7 0x00000700 /* interrupt mode 7 */ +#define EPSW_IE 0x00000800 /* interrupt enable */ +#define EPSW_S 0x00003000 /* software auxilliary bits */ +#define EPSW_T 0x00008000 /* trace enable */ +#define EPSW_nSL 0x00010000 /* not supervisor level */ +#define EPSW_NMID 0x00020000 /* nonmaskable interrupt disable */ +#define EPSW_nAR 0x00040000 /* register bank control */ +#define EPSW_ML 0x00080000 /* monitor level */ +#define EPSW_FE 0x00100000 /* FPU enable */ + +/* FPU registers */ +#define FPCR_EF_I 0x00000001 /* inexact result FPU exception flag */ +#define FPCR_EF_U 0x00000002 /* underflow FPU exception flag */ +#define FPCR_EF_O 0x00000004 /* overflow FPU exception flag */ +#define FPCR_EF_Z 0x00000008 /* zero divide FPU exception flag */ +#define FPCR_EF_V 0x00000010 /* invalid operand FPU exception flag */ +#define FPCR_EE_I 0x00000020 /* inexact result FPU exception enable */ +#define FPCR_EE_U 0x00000040 /* underflow FPU exception enable */ +#define FPCR_EE_O 0x00000080 /* overflow FPU exception enable */ +#define FPCR_EE_Z 0x00000100 /* zero divide FPU exception enable */ +#define FPCR_EE_V 0x00000200 /* invalid operand FPU exception enable */ +#define FPCR_EC_I 0x00000400 /* inexact result FPU exception cause */ +#define FPCR_EC_U 0x00000800 /* underflow FPU exception cause */ +#define FPCR_EC_O 0x00001000 /* overflow FPU exception cause */ +#define FPCR_EC_Z 0x00002000 /* zero divide FPU exception cause */ +#define FPCR_EC_V 0x00004000 /* invalid operand FPU exception cause */ +#define FPCR_RM 0x00030000 /* rounding mode */ +#define FPCR_RM_NEAREST 0x00000000 /* - round to nearest value */ +#define FPCR_FCC_U 0x00040000 /* FPU unordered condition code */ +#define FPCR_FCC_E 0x00080000 /* FPU equal condition code */ +#define FPCR_FCC_G 0x00100000 /* FPU greater than condition code */ +#define FPCR_FCC_L 0x00200000 /* FPU less than condition code */ +#define FPCR_INIT 0x00000000 /* no exceptions, rounding to nearest */ + +/* CPU control registers */ +#define CPUP __SYSREG(0xc0000020, u16) /* CPU pipeline register */ +#define CPUP_DWBD 0x0020 /* write buffer disable flag */ +#define CPUP_IPFD 0x0040 /* instruction prefetch disable flag */ +#define CPUP_EXM 0x0080 /* exception operation mode */ +#define CPUP_EXM_AM33V1 0x0000 /* - AM33 v1 exception mode */ +#define CPUP_EXM_AM33V2 0x0080 /* - AM33 v2 exception mode */ + +#define CPUM __SYSREG(0xc0000040, u16) /* CPU mode register */ +#define CPUM_SLEEP 0x0004 /* set to enter sleep state */ +#define CPUM_HALT 0x0008 /* set to enter halt state */ +#define CPUM_STOP 0x0010 /* set to enter stop state */ + +#define CPUREV __SYSREGC(0xc0000050, u32) /* CPU revision register */ +#define CPUREV_TYPE 0x0000000f /* CPU type */ +#define CPUREV_TYPE_S 0 +#define CPUREV_TYPE_AM33V1 0x00000000 /* - AM33 V1 core, AM33/1.00 arch */ +#define CPUREV_TYPE_AM33V2 0x00000001 /* - AM33 V2 core, AM33/2.00 arch */ +#define CPUREV_TYPE_AM34V1 0x00000002 /* - AM34 V1 core, AM33/2.00 arch */ +#define CPUREV_REVISION 0x000000f0 /* CPU revision */ +#define CPUREV_REVISION_S 4 +#define CPUREV_ICWAY 0x00000f00 /* number of instruction cache ways */ +#define CPUREV_ICWAY_S 8 +#define CPUREV_ICSIZE 0x0000f000 /* instruction cache way size */ +#define CPUREV_ICSIZE_S 12 +#define CPUREV_DCWAY 0x000f0000 /* number of data cache ways */ +#define CPUREV_DCWAY_S 16 +#define CPUREV_DCSIZE 0x00f00000 /* data cache way size */ +#define CPUREV_DCSIZE_S 20 +#define CPUREV_FPUTYPE 0x0f000000 /* FPU core type */ +#define CPUREV_FPUTYPE_NONE 0x00000000 /* - no FPU core implemented */ +#define CPUREV_OCDCTG 0xf0000000 /* on-chip debug function category */ + +#define DCR __SYSREG(0xc0000030, u16) /* Debug control register */ + +/* interrupt/exception control registers */ +#define IVAR0 __SYSREG(0xc0000000, u16) /* interrupt vector 0 */ +#define IVAR1 __SYSREG(0xc0000004, u16) /* interrupt vector 1 */ +#define IVAR2 __SYSREG(0xc0000008, u16) /* interrupt vector 2 */ +#define IVAR3 __SYSREG(0xc000000c, u16) /* interrupt vector 3 */ +#define IVAR4 __SYSREG(0xc0000010, u16) /* interrupt vector 4 */ +#define IVAR5 __SYSREG(0xc0000014, u16) /* interrupt vector 5 */ +#define IVAR6 __SYSREG(0xc0000018, u16) /* interrupt vector 6 */ + +#define TBR __SYSREG(0xc0000024, u32) /* Trap table base */ +#define TBR_TB 0xff000000 /* table base address bits 31-24 */ +#define TBR_INT_CODE 0x00ffffff /* interrupt code */ + +#define DEAR __SYSREG(0xc0000038, u32) /* Data access exception address */ + +#define sISR __SYSREG(0xc0000044, u32) /* Supervisor interrupt status */ +#define sISR_IRQICE 0x00000001 /* ICE interrupt */ +#define sISR_ISTEP 0x00000002 /* single step interrupt */ +#define sISR_MISSA 0x00000004 /* memory access address misalignment fault */ +#define sISR_UNIMP 0x00000008 /* unimplemented instruction execution fault */ +#define sISR_PIEXE 0x00000010 /* program interrupt */ +#define sISR_MEMERR 0x00000020 /* illegal memory access fault */ +#define sISR_IBREAK 0x00000040 /* instraction break interrupt */ +#define sISR_DBSRL 0x00000080 /* debug serial interrupt */ +#define sISR_PERIDB 0x00000100 /* peripheral debug interrupt */ +#define sISR_EXUNIMP 0x00000200 /* unimplemented ex-instruction execution fault */ +#define sISR_OBREAK 0x00000400 /* operand break interrupt */ +#define sISR_PRIV 0x00000800 /* privileged instruction execution fault */ +#define sISR_BUSERR 0x00001000 /* bus error fault */ +#define sISR_DBLFT 0x00002000 /* double fault */ +#define sISR_DBG 0x00008000 /* debug reserved interrupt */ +#define sISR_ITMISS 0x00010000 /* instruction TLB miss */ +#define sISR_DTMISS 0x00020000 /* data TLB miss */ +#define sISR_ITEX 0x00040000 /* instruction TLB access exception */ +#define sISR_DTEX 0x00080000 /* data TLB access exception */ +#define sISR_ILGIA 0x00100000 /* illegal instruction access exception */ +#define sISR_ILGDA 0x00200000 /* illegal data access exception */ +#define sISR_IOIA 0x00400000 /* internal I/O space instruction access excep */ +#define sISR_PRIVA 0x00800000 /* privileged space instruction access excep */ +#define sISR_PRIDA 0x01000000 /* privileged space data access excep */ +#define sISR_DISA 0x02000000 /* data space instruction access excep */ +#define sISR_SYSC 0x04000000 /* system call instruction excep */ +#define sISR_FPUD 0x08000000 /* FPU disabled excep */ +#define sISR_FPUUI 0x10000000 /* FPU unimplemented instruction excep */ +#define sISR_FPUOP 0x20000000 /* FPU operation excep */ +#define sISR_NE 0x80000000 /* multiple synchronous exceptions excep */ + +/* cache control registers */ +#define CHCTR __SYSREG(0xc0000070, u16) /* cache control */ +#define CHCTR_ICEN 0x0001 /* instruction cache enable */ +#define CHCTR_DCEN 0x0002 /* data cache enable */ +#define CHCTR_ICBUSY 0x0004 /* instruction cache busy */ +#define CHCTR_DCBUSY 0x0008 /* data cache busy */ +#define CHCTR_ICINV 0x0010 /* instruction cache invalidate */ +#define CHCTR_DCINV 0x0020 /* data cache invalidate */ +#define CHCTR_DCWTMD 0x0040 /* data cache writing mode */ +#define CHCTR_DCWTMD_WRBACK 0x0000 /* - write back mode */ +#define CHCTR_DCWTMD_WRTHROUGH 0x0040 /* - write through mode */ +#define CHCTR_DCALMD 0x0080 /* data cache allocation mode */ +#define CHCTR_ICWMD 0x0f00 /* instruction cache way mode */ +#define CHCTR_DCWMD 0xf000 /* data cache way mode */ + +/* MMU control registers */ +#define MMUCTR __SYSREG(0xc0000090, u32) /* MMU control register */ +#define MMUCTR_IRP 0x0000003f /* instruction TLB replace pointer */ +#define MMUCTR_ITE 0x00000040 /* instruction TLB enable */ +#define MMUCTR_IIV 0x00000080 /* instruction TLB invalidate */ +#define MMUCTR_ITL 0x00000700 /* instruction TLB lock pointer */ +#define MMUCTR_ITL_NOLOCK 0x00000000 /* - no lock */ +#define MMUCTR_ITL_LOCK0 0x00000100 /* - entry 0 locked */ +#define MMUCTR_ITL_LOCK0_1 0x00000200 /* - entry 0-1 locked */ +#define MMUCTR_ITL_LOCK0_3 0x00000300 /* - entry 0-3 locked */ +#define MMUCTR_ITL_LOCK0_7 0x00000400 /* - entry 0-7 locked */ +#define MMUCTR_ITL_LOCK0_15 0x00000500 /* - entry 0-15 locked */ +#define MMUCTR_CE 0x00008000 /* cacheable bit enable */ +#define MMUCTR_DRP 0x003f0000 /* data TLB replace pointer */ +#define MMUCTR_DTE 0x00400000 /* data TLB enable */ +#define MMUCTR_DIV 0x00800000 /* data TLB invalidate */ +#define MMUCTR_DTL 0x07000000 /* data TLB lock pointer */ +#define MMUCTR_DTL_NOLOCK 0x00000000 /* - no lock */ +#define MMUCTR_DTL_LOCK0 0x01000000 /* - entry 0 locked */ +#define MMUCTR_DTL_LOCK0_1 0x02000000 /* - entry 0-1 locked */ +#define MMUCTR_DTL_LOCK0_3 0x03000000 /* - entry 0-3 locked */ +#define MMUCTR_DTL_LOCK0_7 0x04000000 /* - entry 0-7 locked */ +#define MMUCTR_DTL_LOCK0_15 0x05000000 /* - entry 0-15 locked */ + +#define PIDR __SYSREG(0xc0000094, u16) /* PID register */ +#define PIDR_PID 0x00ff /* process identifier */ + +#define PTBR __SYSREG(0xc0000098, unsigned long) /* Page table base register */ + +#define IPTEL __SYSREG(0xc00000a0, u32) /* instruction TLB entry */ +#define DPTEL __SYSREG(0xc00000b0, u32) /* data TLB entry */ +#define xPTEL_V 0x00000001 /* TLB entry valid */ +#define xPTEL_UNUSED1 0x00000002 /* unused bit */ +#define xPTEL_UNUSED2 0x00000004 /* unused bit */ +#define xPTEL_C 0x00000008 /* cached if set */ +#define xPTEL_PV 0x00000010 /* page valid */ +#define xPTEL_D 0x00000020 /* dirty */ +#define xPTEL_PR 0x000001c0 /* page protection */ +#define xPTEL_PR_ROK 0x00000000 /* - R/O kernel */ +#define xPTEL_PR_RWK 0x00000100 /* - R/W kernel */ +#define xPTEL_PR_ROK_ROU 0x00000080 /* - R/O kernel and R/O user */ +#define xPTEL_PR_RWK_ROU 0x00000180 /* - R/W kernel and R/O user */ +#define xPTEL_PR_RWK_RWU 0x000001c0 /* - R/W kernel and R/W user */ +#define xPTEL_G 0x00000200 /* global (use PID if 0) */ +#define xPTEL_PS 0x00000c00 /* page size */ +#define xPTEL_PS_4Kb 0x00000000 /* - 4Kb page */ +#define xPTEL_PS_128Kb 0x00000400 /* - 128Kb page */ +#define xPTEL_PS_1Kb 0x00000800 /* - 1Kb page */ +#define xPTEL_PS_4Mb 0x00000c00 /* - 4Mb page */ +#define xPTEL_PPN 0xfffff006 /* physical page number */ + +#define xPTEL_V_BIT 0 /* bit numbers corresponding to above masks */ +#define xPTEL_UNUSED1_BIT 1 +#define xPTEL_UNUSED2_BIT 2 +#define xPTEL_C_BIT 3 +#define xPTEL_PV_BIT 4 +#define xPTEL_D_BIT 5 +#define xPTEL_G_BIT 9 + +#define IPTEU __SYSREG(0xc00000a4, u32) /* instruction TLB virtual addr */ +#define DPTEU __SYSREG(0xc00000b4, u32) /* data TLB virtual addr */ +#define xPTEU_VPN 0xfffffc00 /* virtual page number */ +#define xPTEU_PID 0x000000ff /* process identifier to which applicable */ + +#define IPTEL2 __SYSREG(0xc00000a8, u32) /* instruction TLB entry */ +#define DPTEL2 __SYSREG(0xc00000b8, u32) /* data TLB entry */ +#define xPTEL2_V 0x00000001 /* TLB entry valid */ +#define xPTEL2_C 0x00000002 /* cacheable */ +#define xPTEL2_PV 0x00000004 /* page valid */ +#define xPTEL2_D 0x00000008 /* dirty */ +#define xPTEL2_PR 0x00000070 /* page protection */ +#define xPTEL2_PR_ROK 0x00000000 /* - R/O kernel */ +#define xPTEL2_PR_RWK 0x00000040 /* - R/W kernel */ +#define xPTEL2_PR_ROK_ROU 0x00000020 /* - R/O kernel and R/O user */ +#define xPTEL2_PR_RWK_ROU 0x00000060 /* - R/W kernel and R/O user */ +#define xPTEL2_PR_RWK_RWU 0x00000070 /* - R/W kernel and R/W user */ +#define xPTEL2_G 0x00000080 /* global (use PID if 0) */ +#define xPTEL2_PS 0x00000300 /* page size */ +#define xPTEL2_PS_4Kb 0x00000000 /* - 4Kb page */ +#define xPTEL2_PS_128Kb 0x00000100 /* - 128Kb page */ +#define xPTEL2_PS_1Kb 0x00000200 /* - 1Kb page */ +#define xPTEL2_PS_4Mb 0x00000300 /* - 4Mb page */ +#define xPTEL2_PPN 0xfffffc00 /* physical page number */ + +#define MMUFCR __SYSREGC(0xc000009c, u32) /* MMU exception cause */ +#define MMUFCR_IFC __SYSREGC(0xc000009c, u16) /* MMU instruction excep cause */ +#define MMUFCR_DFC __SYSREGC(0xc000009e, u16) /* MMU data exception cause */ +#define MMUFCR_xFC_TLBMISS 0x0001 /* TLB miss flag */ +#define MMUFCR_xFC_INITWR 0x0002 /* initial write excep flag */ +#define MMUFCR_xFC_PGINVAL 0x0004 /* page invalid excep flag */ +#define MMUFCR_xFC_PROTVIOL 0x0008 /* protection violation excep flag */ +#define MMUFCR_xFC_ACCESS 0x0010 /* access level flag */ +#define MMUFCR_xFC_ACCESS_USR 0x0000 /* - user mode */ +#define MMUFCR_xFC_ACCESS_SR 0x0010 /* - supervisor mode */ +#define MMUFCR_xFC_TYPE 0x0020 /* access type flag */ +#define MMUFCR_xFC_TYPE_READ 0x0000 /* - read */ +#define MMUFCR_xFC_TYPE_WRITE 0x0020 /* - write */ +#define MMUFCR_xFC_PR 0x01c0 /* page protection flag */ +#define MMUFCR_xFC_PR_ROK 0x0000 /* - R/O kernel */ +#define MMUFCR_xFC_PR_RWK 0x0100 /* - R/W kernel */ +#define MMUFCR_xFC_PR_ROK_ROU 0x0080 /* - R/O kernel and R/O user */ +#define MMUFCR_xFC_PR_RWK_ROU 0x0180 /* - R/W kernel and R/O user */ +#define MMUFCR_xFC_PR_RWK_RWU 0x01c0 /* - R/W kernel and R/W user */ +#define MMUFCR_xFC_ILLADDR 0x0200 /* illegal address excep flag */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_CPU_REGS_H */ diff --git a/arch/mn10300/include/asm/cputime.h b/arch/mn10300/include/asm/cputime.h new file mode 100644 index 0000000..6d68ad7 --- /dev/null +++ b/arch/mn10300/include/asm/cputime.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/current.h b/arch/mn10300/include/asm/current.h new file mode 100644 index 0000000..ca6027d --- /dev/null +++ b/arch/mn10300/include/asm/current.h @@ -0,0 +1,37 @@ +/* MN10300 Current task structure accessor + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_CURRENT_H +#define _ASM_CURRENT_H + +#include + +/* + * dedicate E2 to keeping the current task pointer + */ +#ifdef CONFIG_MN10300_CURRENT_IN_E2 + +register struct task_struct *const current asm("e2") __attribute__((used)); + +#define get_current() current + +extern struct task_struct *__current; + +#else +static inline __attribute__((const)) +struct task_struct *get_current(void) +{ + return current_thread_info()->task; +} + +#define current get_current() +#endif + +#endif /* _ASM_CURRENT_H */ diff --git a/arch/mn10300/include/asm/delay.h b/arch/mn10300/include/asm/delay.h new file mode 100644 index 0000000..34517b3 --- /dev/null +++ b/arch/mn10300/include/asm/delay.h @@ -0,0 +1,19 @@ +/* MN10300 Uninterruptible delay routines + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_DELAY_H +#define _ASM_DELAY_H + +extern void __udelay(unsigned long usecs); +extern void __delay(unsigned long loops); + +#define udelay(n) __udelay(n) + +#endif /* _ASM_DELAY_H */ diff --git a/arch/mn10300/include/asm/device.h b/arch/mn10300/include/asm/device.h new file mode 100644 index 0000000..f0a4c25 --- /dev/null +++ b/arch/mn10300/include/asm/device.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/div64.h b/arch/mn10300/include/asm/div64.h new file mode 100644 index 0000000..3a8329b --- /dev/null +++ b/arch/mn10300/include/asm/div64.h @@ -0,0 +1,100 @@ +/* MN10300 64-bit division + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_DIV64 +#define _ASM_DIV64 + +#include + +extern void ____unhandled_size_in_do_div___(void); + +/* + * divide n by base, leaving the result in n and returning the remainder + * - we can do this quite efficiently on the MN10300 by cascading the divides + * through the MDR register + */ +#define do_div(n, base) \ +({ \ + unsigned __rem = 0; \ + if (sizeof(n) <= 4) { \ + asm("mov %1,mdr \n" \ + "divu %2,%0 \n" \ + "mov mdr,%1 \n" \ + : "+r"(n), "=d"(__rem) \ + : "r"(base), "1"(__rem) \ + : "cc" \ + ); \ + } else if (sizeof(n) <= 8) { \ + union { \ + unsigned long long l; \ + u32 w[2]; \ + } __quot; \ + __quot.l = n; \ + asm("mov %0,mdr \n" /* MDR = 0 */ \ + "divu %3,%1 \n" \ + /* __quot.MSL = __div.MSL / base, */ \ + /* MDR = MDR:__div.MSL % base */ \ + "divu %3,%2 \n" \ + /* __quot.LSL = MDR:__div.LSL / base, */ \ + /* MDR = MDR:__div.LSL % base */ \ + "mov mdr,%0 \n" \ + : "=d"(__rem), "=r"(__quot.w[1]), "=r"(__quot.w[0]) \ + : "r"(base), "0"(__rem), "1"(__quot.w[1]), \ + "2"(__quot.w[0]) \ + : "cc" \ + ); \ + n = __quot.l; \ + } else { \ + ____unhandled_size_in_do_div___(); \ + } \ + __rem; \ +}) + +/* + * do an unsigned 32-bit multiply and divide with intermediate 64-bit product + * so as not to lose accuracy + * - we use the MDR register to hold the MSW of the product + */ +static inline __attribute__((const)) +unsigned __muldiv64u(unsigned val, unsigned mult, unsigned div) +{ + unsigned result; + + asm("mulu %2,%0 \n" /* MDR:val = val*mult */ + "divu %3,%0 \n" /* val = MDR:val/div; + * MDR = MDR:val%div */ + : "=r"(result) + : "0"(val), "ir"(mult), "r"(div) + ); + + return result; +} + +/* + * do a signed 32-bit multiply and divide with intermediate 64-bit product so + * as not to lose accuracy + * - we use the MDR register to hold the MSW of the product + */ +static inline __attribute__((const)) +signed __muldiv64s(signed val, signed mult, signed div) +{ + signed result; + + asm("mul %2,%0 \n" /* MDR:val = val*mult */ + "div %3,%0 \n" /* val = MDR:val/div; + * MDR = MDR:val%div */ + : "=r"(result) + : "0"(val), "ir"(mult), "r"(div) + ); + + return result; +} + +#endif /* _ASM_DIV64 */ diff --git a/arch/mn10300/include/asm/dma-mapping.h b/arch/mn10300/include/asm/dma-mapping.h new file mode 100644 index 0000000..ccae8f6 --- /dev/null +++ b/arch/mn10300/include/asm/dma-mapping.h @@ -0,0 +1,234 @@ +/* DMA mapping routines for the MN10300 arch + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_DMA_MAPPING_H +#define _ASM_DMA_MAPPING_H + +#include +#include + +#include +#include + +extern void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *dma_handle, int flag); + +extern void dma_free_coherent(struct device *dev, size_t size, + void *vaddr, dma_addr_t dma_handle); + +#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f)) +#define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h)) + +/* + * Map a single buffer of the indicated size for DMA in streaming mode. The + * 32-bit bus address to use is returned. + * + * Once the device is given the dma address, the device owns this memory until + * either pci_unmap_single or pci_dma_sync_single is performed. + */ +static inline +dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); + mn10300_dcache_flush_inv(); + return virt_to_bus(ptr); +} + +/* + * Unmap a single streaming mode DMA translation. The dma_addr and size must + * match what was provided for in a previous pci_map_single call. All other + * usages are undefined. + * + * After this call, reads by the cpu to the buffer are guarenteed to see + * whatever the device wrote there. + */ +static inline +void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); +} + +/* + * Map a set of buffers described by scatterlist in streaming mode for DMA. + * This is the scather-gather version of the above pci_map_single interface. + * Here the scatter gather list elements are each tagged with the appropriate + * dma address and length. They are obtained via sg_dma_{address,length}(SG). + * + * NOTE: An implementation may be able to use a smaller number of DMA + * address/length pairs than there are SG table elements. (for example + * via virtual mapping capabilities) The routine returns the number of + * addr/length pairs actually used, at most nents. + * + * Device ownership issues as mentioned above for pci_map_single are the same + * here. + */ +static inline +int dma_map_sg(struct device *dev, struct scatterlist *sglist, int nents, + enum dma_data_direction direction) +{ + struct scatterlist *sg; + int i; + + BUG_ON(!valid_dma_direction(direction)); + WARN_ON(nents == 0 || sglist[0].length == 0); + + for_each_sg(sglist, sg, nents, i) { + BUG_ON(!sg_page(sg)); + + sg->dma_address = sg_phys(sg); + } + + mn10300_dcache_flush_inv(); + return nents; +} + +/* + * Unmap a set of streaming mode DMA translations. + * Again, cpu read rules concerning calls here are the same as for + * pci_unmap_single() above. + */ +static inline +void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, + enum dma_data_direction direction) +{ + BUG_ON(!valid_dma_direction(direction)); +} + +/* + * pci_{map,unmap}_single_page maps a kernel page to a dma_addr_t. identical + * to pci_map_single, but takes a struct page instead of a virtual address + */ +static inline +dma_addr_t dma_map_page(struct device *dev, struct page *page, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); + return page_to_bus(page) + offset; +} + +static inline +void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, + enum dma_data_direction direction) +{ + BUG_ON(direction == DMA_NONE); +} + +/* + * Make physical memory consistent for a single streaming mode DMA translation + * after a transfer. + * + * If you perform a pci_map_single() but wish to interrogate the buffer using + * the cpu, yet do not wish to teardown the PCI dma mapping, you must call this + * function before doing so. At the next point you give the PCI dma address + * back to the card, the device again owns the buffer. + */ +static inline +void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction direction) +{ +} + +static inline +void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction direction) +{ + mn10300_dcache_flush_inv(); +} + +static inline +void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ +} + +static inline void +dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, + enum dma_data_direction direction) +{ + mn10300_dcache_flush_inv(); +} + + +/* + * Make physical memory consistent for a set of streaming mode DMA translations + * after a transfer. + * + * The same as pci_dma_sync_single but for a scatter-gather list, same rules + * and usage. + */ +static inline +void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, + int nelems, enum dma_data_direction direction) +{ +} + +static inline +void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, + int nelems, enum dma_data_direction direction) +{ + mn10300_dcache_flush_inv(); +} + +static inline +int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) +{ + return 0; +} + +/* + * Return whether the given PCI device DMA address mask can be supported + * properly. For example, if your device can only drive the low 24-bits during + * PCI bus mastering, then you would pass 0x00ffffff as the mask to this + * function. + */ +static inline +int dma_supported(struct device *dev, u64 mask) +{ + /* + * we fall back to GFP_DMA when the mask isn't all 1s, so we can't + * guarantee allocations that must be within a tighter range than + * GFP_DMA + */ + if (mask < 0x00ffffff) + return 0; + return 1; +} + +static inline +int dma_set_mask(struct device *dev, u64 mask) +{ + if (!dev->dma_mask || !dma_supported(dev, mask)) + return -EIO; + + *dev->dma_mask = mask; + return 0; +} + +static inline +int dma_get_cache_alignment(void) +{ + return 1 << L1_CACHE_SHIFT; +} + +#define dma_is_consistent(d) (1) + +static inline +void dma_cache_sync(void *vaddr, size_t size, + enum dma_data_direction direction) +{ + mn10300_dcache_flush_inv(); +} + +#endif diff --git a/arch/mn10300/include/asm/dma.h b/arch/mn10300/include/asm/dma.h new file mode 100644 index 0000000..098df2e --- /dev/null +++ b/arch/mn10300/include/asm/dma.h @@ -0,0 +1,118 @@ +/* MN10300 ISA DMA handlers and definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_DMA_H +#define _ASM_DMA_H + +#include +#include +#include +#include + +#undef MAX_DMA_CHANNELS /* switch off linux/kernel/dma.c */ +#define MAX_DMA_ADDRESS 0xbfffffff + +extern spinlock_t dma_spin_lock; + +static inline unsigned long claim_dma_lock(void) +{ + unsigned long flags; + spin_lock_irqsave(&dma_spin_lock, flags); + return flags; +} + +static inline void release_dma_lock(unsigned long flags) +{ + spin_unlock_irqrestore(&dma_spin_lock, flags); +} + +/* enable/disable a specific DMA channel */ +static inline void enable_dma(unsigned int dmanr) +{ +} + +static inline void disable_dma(unsigned int dmanr) +{ +} + +/* Clear the 'DMA Pointer Flip Flop'. + * Write 0 for LSB/MSB, 1 for MSB/LSB access. + * Use this once to initialize the FF to a known state. + * After that, keep track of it. :-) + * --- In order to do that, the DMA routines below should --- + * --- only be used while holding the DMA lock ! --- + */ +static inline void clear_dma_ff(unsigned int dmanr) +{ +} + +/* set mode (above) for a specific DMA channel */ +static inline void set_dma_mode(unsigned int dmanr, char mode) +{ +} + +/* Set only the page register bits of the transfer address. + * This is used for successive transfers when we know the contents of + * the lower 16 bits of the DMA current address register, but a 64k boundary + * may have been crossed. + */ +static inline void set_dma_page(unsigned int dmanr, char pagenr) +{ +} + + +/* Set transfer address & page bits for specific DMA channel. + * Assumes dma flipflop is clear. + */ +static inline void set_dma_addr(unsigned int dmanr, unsigned int a) +{ +} + + +/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for + * a specific DMA channel. + * You must ensure the parameters are valid. + * NOTE: from a manual: "the number of transfers is one more + * than the initial word count"! This is taken into account. + * Assumes dma flip-flop is clear. + * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7. + */ +static inline void set_dma_count(unsigned int dmanr, unsigned int count) +{ +} + + +/* Get DMA residue count. After a DMA transfer, this + * should return zero. Reading this while a DMA transfer is + * still in progress will return unpredictable results. + * If called before the channel has been used, it may return 1. + * Otherwise, it returns the number of _bytes_ left to transfer. + * + * Assumes DMA flip-flop is clear. + */ +static inline int get_dma_residue(unsigned int dmanr) +{ + return 0; +} + + +/* These are in kernel/dma.c: */ +extern int request_dma(unsigned int dmanr, const char *device_id); +extern void free_dma(unsigned int dmanr); + +/* From PCI */ + +#ifdef CONFIG_PCI +extern int isa_dma_bridge_buggy; +#else +#define isa_dma_bridge_buggy (0) +#endif + +#endif /* _ASM_DMA_H */ diff --git a/arch/mn10300/include/asm/dmactl-regs.h b/arch/mn10300/include/asm/dmactl-regs.h new file mode 100644 index 0000000..58a199d --- /dev/null +++ b/arch/mn10300/include/asm/dmactl-regs.h @@ -0,0 +1,101 @@ +/* MN10300 on-board DMA controller registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_DMACTL_REGS_H +#define _ASM_DMACTL_REGS_H + +#include + +#ifdef __KERNEL__ + +/* DMA registers */ +#define DMxCTR(N) __SYSREG(0xd2000000 + ((N) * 0x100), u32) /* control reg */ +#define DMxCTR_BG 0x0000001f /* transfer request source */ +#define DMxCTR_BG_SOFT 0x00000000 /* - software source */ +#define DMxCTR_BG_SC0TX 0x00000002 /* - serial port 0 transmission */ +#define DMxCTR_BG_SC0RX 0x00000003 /* - serial port 0 reception */ +#define DMxCTR_BG_SC1TX 0x00000004 /* - serial port 1 transmission */ +#define DMxCTR_BG_SC1RX 0x00000005 /* - serial port 1 reception */ +#define DMxCTR_BG_SC2TX 0x00000006 /* - serial port 2 transmission */ +#define DMxCTR_BG_SC2RX 0x00000007 /* - serial port 2 reception */ +#define DMxCTR_BG_TM0UFLOW 0x00000008 /* - timer 0 underflow */ +#define DMxCTR_BG_TM1UFLOW 0x00000009 /* - timer 1 underflow */ +#define DMxCTR_BG_TM2UFLOW 0x0000000a /* - timer 2 underflow */ +#define DMxCTR_BG_TM3UFLOW 0x0000000b /* - timer 3 underflow */ +#define DMxCTR_BG_TM6ACMPCAP 0x0000000c /* - timer 6A compare/capture */ +#define DMxCTR_BG_AFE 0x0000000d /* - analogue front-end interrupt source */ +#define DMxCTR_BG_ADC 0x0000000e /* - A/D conversion end interrupt source */ +#define DMxCTR_BG_IRDA 0x0000000f /* - IrDA interrupt source */ +#define DMxCTR_BG_RTC 0x00000010 /* - RTC interrupt source */ +#define DMxCTR_BG_XIRQ0 0x00000011 /* - XIRQ0 pin interrupt source */ +#define DMxCTR_BG_XIRQ1 0x00000012 /* - XIRQ1 pin interrupt source */ +#define DMxCTR_BG_XDMR0 0x00000013 /* - external request 0 source (XDMR0 pin) */ +#define DMxCTR_BG_XDMR1 0x00000014 /* - external request 1 source (XDMR1 pin) */ +#define DMxCTR_SAM 0x000000e0 /* DMA transfer src addr mode */ +#define DMxCTR_SAM_INCR 0x00000000 /* - increment */ +#define DMxCTR_SAM_DECR 0x00000020 /* - decrement */ +#define DMxCTR_SAM_FIXED 0x00000040 /* - fixed */ +#define DMxCTR_DAM 0x00000000 /* DMA transfer dest addr mode */ +#define DMxCTR_DAM_INCR 0x00000000 /* - increment */ +#define DMxCTR_DAM_DECR 0x00000100 /* - decrement */ +#define DMxCTR_DAM_FIXED 0x00000200 /* - fixed */ +#define DMxCTR_TM 0x00001800 /* DMA transfer mode */ +#define DMxCTR_TM_BATCH 0x00000000 /* - batch transfer */ +#define DMxCTR_TM_INTERM 0x00001000 /* - intermittent transfer */ +#define DMxCTR_UT 0x00006000 /* DMA transfer unit */ +#define DMxCTR_UT_1 0x00000000 /* - 1 byte */ +#define DMxCTR_UT_2 0x00002000 /* - 2 byte */ +#define DMxCTR_UT_4 0x00004000 /* - 4 byte */ +#define DMxCTR_UT_16 0x00006000 /* - 16 byte */ +#define DMxCTR_TEN 0x00010000 /* DMA channel transfer enable */ +#define DMxCTR_RQM 0x00060000 /* external request input source mode */ +#define DMxCTR_RQM_FALLEDGE 0x00000000 /* - falling edge */ +#define DMxCTR_RQM_RISEEDGE 0x00020000 /* - rising edge */ +#define DMxCTR_RQM_LOLEVEL 0x00040000 /* - low level */ +#define DMxCTR_RQM_HILEVEL 0x00060000 /* - high level */ +#define DMxCTR_RQF 0x01000000 /* DMA transfer request flag */ +#define DMxCTR_XEND 0x80000000 /* DMA transfer end flag */ + +#define DMxSRC(N) __SYSREG(0xd2000004 + ((N) * 0x100), u32) /* control reg */ + +#define DMxDST(N) __SYSREG(0xd2000008 + ((N) * 0x100), u32) /* src addr reg */ + +#define DMxSIZ(N) __SYSREG(0xd200000c + ((N) * 0x100), u32) /* dest addr reg */ +#define DMxSIZ_CT 0x000fffff /* number of bytes to transfer */ + +#define DMxCYC(N) __SYSREG(0xd2000010 + ((N) * 0x100), u32) /* intermittent + * size reg */ +#define DMxCYC_CYC 0x000000ff /* number of interrmittent transfers -1 */ + +#define DM0IRQ 16 /* DMA channel 0 complete IRQ */ +#define DM1IRQ 17 /* DMA channel 1 complete IRQ */ +#define DM2IRQ 18 /* DMA channel 2 complete IRQ */ +#define DM3IRQ 19 /* DMA channel 3 complete IRQ */ + +#define DM0ICR GxICR(DM0IRQ) /* DMA channel 0 complete intr ctrl reg */ +#define DM1ICR GxICR(DM0IR1) /* DMA channel 1 complete intr ctrl reg */ +#define DM2ICR GxICR(DM0IR2) /* DMA channel 2 complete intr ctrl reg */ +#define DM3ICR GxICR(DM0IR3) /* DMA channel 3 complete intr ctrl reg */ + +#ifndef __ASSEMBLY__ + +struct mn10300_dmactl_regs { + u32 ctr; + const void *src; + void *dst; + u32 siz; + u32 cyc; +} __attribute__((aligned(0x100))); + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_DMACTL_REGS_H */ diff --git a/arch/mn10300/include/asm/elf.h b/arch/mn10300/include/asm/elf.h new file mode 100644 index 0000000..bf09f8b --- /dev/null +++ b/arch/mn10300/include/asm/elf.h @@ -0,0 +1,147 @@ +/* MN10300 ELF constant and register definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_ELF_H +#define _ASM_ELF_H + +#include +#include +#include + +/* + * AM33 relocations + */ +#define R_MN10300_NONE 0 /* No reloc. */ +#define R_MN10300_32 1 /* Direct 32 bit. */ +#define R_MN10300_16 2 /* Direct 16 bit. */ +#define R_MN10300_8 3 /* Direct 8 bit. */ +#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */ +#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */ +#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */ +#define R_MN10300_24 9 /* Direct 24 bit. */ +#define R_MN10300_RELATIVE 23 /* Adjust by program base. */ + +/* + * ELF register definitions.. + */ +typedef unsigned long elf_greg_t; + +#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +#define ELF_NFPREG 32 +typedef float elf_fpreg_t; + +typedef struct { + elf_fpreg_t fpregs[ELF_NFPREG]; + u_int32_t fpcr; +} elf_fpregset_t; + +extern int dump_fpu(struct pt_regs *, elf_fpregset_t *); + +/* + * This is used to ensure we don't load something for the wrong architecture + */ +#define elf_check_arch(x) \ + (((x)->e_machine == EM_CYGNUS_MN10300) || \ + ((x)->e_machine == EM_MN10300)) + +/* + * These are used to set parameters in the core dumps. + */ +#define ELF_CLASS ELFCLASS32 +#define ELF_DATA ELFDATA2LSB +#define ELF_ARCH EM_MN10300 + +/* + * ELF process initialiser + */ +#define ELF_PLAT_INIT(_r, load_addr) \ +do { \ + struct pt_regs *_ur = current->thread.uregs; \ + _ur->a3 = 0; _ur->a2 = 0; _ur->d3 = 0; _ur->d2 = 0; \ + _ur->mcvf = 0; _ur->mcrl = 0; _ur->mcrh = 0; _ur->mdrq = 0; \ + _ur->e1 = 0; _ur->e0 = 0; _ur->e7 = 0; _ur->e6 = 0; \ + _ur->e5 = 0; _ur->e4 = 0; _ur->e3 = 0; _ur->e2 = 0; \ + _ur->lar = 0; _ur->lir = 0; _ur->mdr = 0; \ + _ur->a1 = 0; _ur->a0 = 0; _ur->d1 = 0; _ur->d0 = 0; \ +} while (0) + +#define USE_ELF_CORE_DUMP +#define ELF_EXEC_PAGESIZE 4096 + +/* + * This is the location that an ET_DYN program is loaded if exec'ed. Typical + * use of this is to invoke "./ld.so someprog" to test out a new version of + * the loader. We need to make sure that it is out of the way of the program + * that it will "exec", and that there is sufficient room for the brk. + * - must clear the VMALLOC area + */ +#define ELF_ET_DYN_BASE 0x04000000 + +/* + * regs is struct pt_regs, pr_reg is elf_gregset_t (which is + * now struct user_regs, they are different) + * - ELF_CORE_COPY_REGS has been guessed, and may be wrong + */ +#define ELF_CORE_COPY_REGS(pr_reg, regs) \ +do { \ + pr_reg[0] = regs->a3; \ + pr_reg[1] = regs->a2; \ + pr_reg[2] = regs->d3; \ + pr_reg[3] = regs->d2; \ + pr_reg[4] = regs->mcvf; \ + pr_reg[5] = regs->mcrl; \ + pr_reg[6] = regs->mcrh; \ + pr_reg[7] = regs->mdrq; \ + pr_reg[8] = regs->e1; \ + pr_reg[9] = regs->e0; \ + pr_reg[10] = regs->e7; \ + pr_reg[11] = regs->e6; \ + pr_reg[12] = regs->e5; \ + pr_reg[13] = regs->e4; \ + pr_reg[14] = regs->e3; \ + pr_reg[15] = regs->e2; \ + pr_reg[16] = regs->sp; \ + pr_reg[17] = regs->lar; \ + pr_reg[18] = regs->lir; \ + pr_reg[19] = regs->mdr; \ + pr_reg[20] = regs->a1; \ + pr_reg[21] = regs->a0; \ + pr_reg[22] = regs->d1; \ + pr_reg[23] = regs->d0; \ + pr_reg[24] = regs->orig_d0; \ + pr_reg[25] = regs->epsw; \ + pr_reg[26] = regs->pc; \ +} while (0); + +/* + * This yields a mask that user programs can use to figure out what + * instruction set this CPU supports. This could be done in user space, + * but it's not easy, and we've already done it here. + */ +#define ELF_HWCAP (0) + +/* + * This yields a string that ld.so will use to load implementation + * specific libraries for optimization. This is more specific in + * intent than poking at uname or /proc/cpuinfo. + * + * For the moment, we have only optimizations for the Intel generations, + * but that could change... + */ +#define ELF_PLATFORM (NULL) + +#ifdef __KERNEL__ +#define SET_PERSONALITY(ex) set_personality(PER_LINUX) +#endif + +#endif /* _ASM_ELF_H */ diff --git a/arch/mn10300/include/asm/emergency-restart.h b/arch/mn10300/include/asm/emergency-restart.h new file mode 100644 index 0000000..3711bd9 --- /dev/null +++ b/arch/mn10300/include/asm/emergency-restart.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/errno.h b/arch/mn10300/include/asm/errno.h new file mode 100644 index 0000000..4c82b50 --- /dev/null +++ b/arch/mn10300/include/asm/errno.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/exceptions.h b/arch/mn10300/include/asm/exceptions.h new file mode 100644 index 0000000..fa16466 --- /dev/null +++ b/arch/mn10300/include/asm/exceptions.h @@ -0,0 +1,121 @@ +/* MN10300 Microcontroller core exceptions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_EXCEPTIONS_H +#define _ASM_EXCEPTIONS_H + +#include + +/* + * define the breakpoint instruction opcode to use + * - note that the JTAG unit steals 0xFF, so we want to avoid that if we can + * (can use 0xF7) + */ +#define GDBSTUB_BKPT 0xFF + +#ifndef __ASSEMBLY__ + +/* + * enumeration of exception codes (as extracted from TBR MSW) + */ +enum exception_code { + EXCEP_RESET = 0x000000, /* reset */ + + /* MMU exceptions */ + EXCEP_ITLBMISS = 0x000100, /* instruction TLB miss */ + EXCEP_DTLBMISS = 0x000108, /* data TLB miss */ + EXCEP_IAERROR = 0x000110, /* instruction address */ + EXCEP_DAERROR = 0x000118, /* data address */ + + /* system exceptions */ + EXCEP_TRAP = 0x000128, /* program interrupt (PI instruction) */ + EXCEP_ISTEP = 0x000130, /* single step */ + EXCEP_IBREAK = 0x000150, /* instruction breakpoint */ + EXCEP_OBREAK = 0x000158, /* operand breakpoint */ + EXCEP_PRIVINS = 0x000160, /* privileged instruction execution */ + EXCEP_UNIMPINS = 0x000168, /* unimplemented instruction execution */ + EXCEP_UNIMPEXINS = 0x000170, /* unimplemented extended instruction execution */ + EXCEP_MEMERR = 0x000178, /* illegal memory access */ + EXCEP_MISALIGN = 0x000180, /* misalignment */ + EXCEP_BUSERROR = 0x000188, /* bus error */ + EXCEP_ILLINSACC = 0x000190, /* illegal instruction access */ + EXCEP_ILLDATACC = 0x000198, /* illegal data access */ + EXCEP_IOINSACC = 0x0001a0, /* I/O space instruction access */ + EXCEP_PRIVINSACC = 0x0001a8, /* privileged space instruction access */ + EXCEP_PRIVDATACC = 0x0001b0, /* privileged space data access */ + EXCEP_DATINSACC = 0x0001b8, /* data space instruction access */ + EXCEP_DOUBLE_FAULT = 0x000200, /* double fault */ + + /* FPU exceptions */ + EXCEP_FPU_DISABLED = 0x0001c0, /* FPU disabled */ + EXCEP_FPU_UNIMPINS = 0x0001c8, /* FPU unimplemented operation */ + EXCEP_FPU_OPERATION = 0x0001d0, /* FPU operation */ + + /* interrupts */ + EXCEP_WDT = 0x000240, /* watchdog timer overflow */ + EXCEP_NMI = 0x000248, /* non-maskable interrupt */ + EXCEP_IRQ_LEVEL0 = 0x000280, /* level 0 maskable interrupt */ + EXCEP_IRQ_LEVEL1 = 0x000288, /* level 1 maskable interrupt */ + EXCEP_IRQ_LEVEL2 = 0x000290, /* level 2 maskable interrupt */ + EXCEP_IRQ_LEVEL3 = 0x000298, /* level 3 maskable interrupt */ + EXCEP_IRQ_LEVEL4 = 0x0002a0, /* level 4 maskable interrupt */ + EXCEP_IRQ_LEVEL5 = 0x0002a8, /* level 5 maskable interrupt */ + EXCEP_IRQ_LEVEL6 = 0x0002b0, /* level 6 maskable interrupt */ + + /* system calls */ + EXCEP_SYSCALL0 = 0x000300, /* system call 0 */ + EXCEP_SYSCALL1 = 0x000308, /* system call 1 */ + EXCEP_SYSCALL2 = 0x000310, /* system call 2 */ + EXCEP_SYSCALL3 = 0x000318, /* system call 3 */ + EXCEP_SYSCALL4 = 0x000320, /* system call 4 */ + EXCEP_SYSCALL5 = 0x000328, /* system call 5 */ + EXCEP_SYSCALL6 = 0x000330, /* system call 6 */ + EXCEP_SYSCALL7 = 0x000338, /* system call 7 */ + EXCEP_SYSCALL8 = 0x000340, /* system call 8 */ + EXCEP_SYSCALL9 = 0x000348, /* system call 9 */ + EXCEP_SYSCALL10 = 0x000350, /* system call 10 */ + EXCEP_SYSCALL11 = 0x000358, /* system call 11 */ + EXCEP_SYSCALL12 = 0x000360, /* system call 12 */ + EXCEP_SYSCALL13 = 0x000368, /* system call 13 */ + EXCEP_SYSCALL14 = 0x000370, /* system call 14 */ + EXCEP_SYSCALL15 = 0x000378, /* system call 15 */ +}; + +extern void __set_intr_stub(enum exception_code code, void *handler); +extern void set_intr_stub(enum exception_code code, void *handler); +extern void set_jtag_stub(enum exception_code code, void *handler); + +struct pt_regs; + +extern asmlinkage void __common_exception(void); +extern asmlinkage void itlb_miss(void); +extern asmlinkage void dtlb_miss(void); +extern asmlinkage void itlb_aerror(void); +extern asmlinkage void dtlb_aerror(void); +extern asmlinkage void raw_bus_error(void); +extern asmlinkage void double_fault(void); +extern asmlinkage int system_call(struct pt_regs *); +extern asmlinkage void fpu_exception(struct pt_regs *, enum exception_code); +extern asmlinkage void nmi(struct pt_regs *, enum exception_code); +extern asmlinkage void uninitialised_exception(struct pt_regs *, + enum exception_code); +extern asmlinkage void irq_handler(void); +extern asmlinkage void profile_handler(void); +extern asmlinkage void nmi_handler(void); +extern asmlinkage void misalignment(struct pt_regs *, enum exception_code); + +extern void die(const char *, struct pt_regs *, enum exception_code) + ATTRIB_NORET; + +extern int die_if_no_fixup(const char *, struct pt_regs *, enum exception_code); + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_EXCEPTIONS_H */ diff --git a/arch/mn10300/include/asm/fb.h b/arch/mn10300/include/asm/fb.h new file mode 100644 index 0000000..697b24a --- /dev/null +++ b/arch/mn10300/include/asm/fb.h @@ -0,0 +1,23 @@ +/* MN10300 Frame buffer stuff + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_FB_H +#define _ASM_FB_H + +#include + +#define fb_pgprotect(...) do {} while (0) + +static inline int fb_is_primary_device(struct fb_info *info) +{ + return 0; +} + +#endif /* _ASM_FB_H */ diff --git a/arch/mn10300/include/asm/fcntl.h b/arch/mn10300/include/asm/fcntl.h new file mode 100644 index 0000000..46ab12d --- /dev/null +++ b/arch/mn10300/include/asm/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/fpu.h b/arch/mn10300/include/asm/fpu.h new file mode 100644 index 0000000..64a2b83 --- /dev/null +++ b/arch/mn10300/include/asm/fpu.h @@ -0,0 +1,85 @@ +/* MN10300 FPU definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * Derived from include/asm-i386/i387.h: Copyright (C) 1994 Linus Torvalds + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_FPU_H +#define _ASM_FPU_H + +#include +#include +#include + +#ifdef __KERNEL__ + +/* the task that owns the FPU state */ +extern struct task_struct *fpu_state_owner; + +#define set_using_fpu(tsk) \ +do { \ + (tsk)->thread.fpu_flags |= THREAD_USING_FPU; \ +} while (0) + +#define clear_using_fpu(tsk) \ +do { \ + (tsk)->thread.fpu_flags &= ~THREAD_USING_FPU; \ +} while (0) + +#define is_using_fpu(tsk) ((tsk)->thread.fpu_flags & THREAD_USING_FPU) + +#define unlazy_fpu(tsk) \ +do { \ + preempt_disable(); \ + if (fpu_state_owner == (tsk)) \ + fpu_save(&tsk->thread.fpu_state); \ + preempt_enable(); \ +} while (0) + +#define exit_fpu() \ +do { \ + struct task_struct *__tsk = current; \ + preempt_disable(); \ + if (fpu_state_owner == __tsk) \ + fpu_state_owner = NULL; \ + preempt_enable(); \ +} while (0) + +#define flush_fpu() \ +do { \ + struct task_struct *__tsk = current; \ + preempt_disable(); \ + if (fpu_state_owner == __tsk) { \ + fpu_state_owner = NULL; \ + __tsk->thread.uregs->epsw &= ~EPSW_FE; \ + } \ + preempt_enable(); \ + clear_using_fpu(__tsk); \ +} while (0) + +extern asmlinkage void fpu_init_state(void); +extern asmlinkage void fpu_kill_state(struct task_struct *); +extern asmlinkage void fpu_disabled(struct pt_regs *, enum exception_code); +extern asmlinkage void fpu_exception(struct pt_regs *, enum exception_code); + +#ifdef CONFIG_FPU +extern asmlinkage void fpu_save(struct fpu_state_struct *); +extern asmlinkage void fpu_restore(struct fpu_state_struct *); +#else +#define fpu_save(a) +#define fpu_restore(a) +#endif /* CONFIG_FPU */ + +/* + * signal frame handlers + */ +extern int fpu_setup_sigcontext(struct fpucontext *buf); +extern int fpu_restore_sigcontext(struct fpucontext *buf); + +#endif /* __KERNEL__ */ +#endif /* _ASM_FPU_H */ diff --git a/arch/mn10300/include/asm/frame.inc b/arch/mn10300/include/asm/frame.inc new file mode 100644 index 0000000..5b1949b --- /dev/null +++ b/arch/mn10300/include/asm/frame.inc @@ -0,0 +1,91 @@ +/* MN10300 Microcontroller core system register definitions -*- asm -*- + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_FRAME_INC +#define _ASM_FRAME_INC + +#ifndef __ASSEMBLY__ +#error not for use in C files +#endif + +#ifndef __ASM_OFFSETS_H__ +#include +#endif + +#define pi break + +#define fp a3 + +############################################################################### +# +# build a stack frame from the registers +# - the caller has subtracted 4 from SP before coming here +# +############################################################################### +.macro SAVE_ALL + add -4,sp # next exception frame ptr save area + movm [other],(sp) + mov usp,a1 + mov a1,(sp) # USP in MOVM[other] dummy slot + movm [d2,d3,a2,a3,exreg0,exreg1,exother],(sp) + mov sp,fp # FRAME pointer in A3 + add -12,sp # allow for calls to be made + mov (__frame),a1 + mov a1,(REG_NEXT,fp) + mov fp,(__frame) + + and ~EPSW_FE,epsw # disable the FPU inside the kernel + + # we may be holding current in E2 +#ifdef CONFIG_MN10300_CURRENT_IN_E2 + mov (__current),e2 +#endif +.endm + +############################################################################### +# +# restore the registers from a stack frame +# +############################################################################### +.macro RESTORE_ALL + # peel back the stack to the calling frame + # - this permits execve() to discard extra frames due to kernel syscalls + mov (__frame),fp + mov fp,sp + mov (REG_NEXT,fp),d0 # userspace has regs->next == 0 + mov d0,(__frame) + +#ifndef CONFIG_MN10300_USING_JTAG + mov (REG_EPSW,fp),d0 + btst EPSW_T,d0 + beq 99f + + or EPSW_NMID,epsw + movhu (DCR),d1 + or 0x0001, d1 + movhu d1,(DCR) + +99: +#endif + movm (sp),[d2,d3,a2,a3,exreg0,exreg1,exother] + + # must restore usp even if returning to kernel space, + # when CONFIG_PREEMPT is enabled. + mov (sp),a1 # USP in MOVM[other] dummy slot + mov a1,usp + + movm (sp),[other] + add 8,sp + rti + +.endm + + +#endif /* _ASM_FRAME_INC */ diff --git a/arch/mn10300/include/asm/ftrace.h b/arch/mn10300/include/asm/ftrace.h new file mode 100644 index 0000000..40a8c17 --- /dev/null +++ b/arch/mn10300/include/asm/ftrace.h @@ -0,0 +1 @@ +/* empty */ diff --git a/arch/mn10300/include/asm/futex.h b/arch/mn10300/include/asm/futex.h new file mode 100644 index 0000000..0b74582 --- /dev/null +++ b/arch/mn10300/include/asm/futex.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/gdb-stub.h b/arch/mn10300/include/asm/gdb-stub.h new file mode 100644 index 0000000..e5a6368 --- /dev/null +++ b/arch/mn10300/include/asm/gdb-stub.h @@ -0,0 +1,183 @@ +/* MN10300 Kernel GDB stub definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from asm-mips/gdb-stub.h (c) 1995 Andreas Busse + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_GDB_STUB_H +#define _ASM_GDB_STUB_H + +#include + +/* + * register ID numbers in GDB remote protocol + */ + +#define GDB_REGID_PC 9 +#define GDB_REGID_FP 7 +#define GDB_REGID_SP 8 + +/* + * virtual stack layout for the GDB exception handler + */ +#define NUMREGS 64 + +#define GDB_FR_D0 (0 * 4) +#define GDB_FR_D1 (1 * 4) +#define GDB_FR_D2 (2 * 4) +#define GDB_FR_D3 (3 * 4) +#define GDB_FR_A0 (4 * 4) +#define GDB_FR_A1 (5 * 4) +#define GDB_FR_A2 (6 * 4) +#define GDB_FR_A3 (7 * 4) + +#define GDB_FR_SP (8 * 4) +#define GDB_FR_PC (9 * 4) +#define GDB_FR_MDR (10 * 4) +#define GDB_FR_EPSW (11 * 4) +#define GDB_FR_LIR (12 * 4) +#define GDB_FR_LAR (13 * 4) +#define GDB_FR_MDRQ (14 * 4) + +#define GDB_FR_E0 (15 * 4) +#define GDB_FR_E1 (16 * 4) +#define GDB_FR_E2 (17 * 4) +#define GDB_FR_E3 (18 * 4) +#define GDB_FR_E4 (19 * 4) +#define GDB_FR_E5 (20 * 4) +#define GDB_FR_E6 (21 * 4) +#define GDB_FR_E7 (22 * 4) + +#define GDB_FR_SSP (23 * 4) +#define GDB_FR_MSP (24 * 4) +#define GDB_FR_USP (25 * 4) +#define GDB_FR_MCRH (26 * 4) +#define GDB_FR_MCRL (27 * 4) +#define GDB_FR_MCVF (28 * 4) + +#define GDB_FR_FPCR (29 * 4) +#define GDB_FR_DUMMY0 (30 * 4) +#define GDB_FR_DUMMY1 (31 * 4) + +#define GDB_FR_FS0 (32 * 4) + +#define GDB_FR_SIZE (NUMREGS * 4) + +#ifndef __ASSEMBLY__ + +/* + * This is the same as above, but for the high-level + * part of the GDB stub. + */ + +struct gdb_regs { + /* saved main processor registers */ + u32 d0, d1, d2, d3, a0, a1, a2, a3; + u32 sp, pc, mdr, epsw, lir, lar, mdrq; + u32 e0, e1, e2, e3, e4, e5, e6, e7; + u32 ssp, msp, usp, mcrh, mcrl, mcvf; + + /* saved floating point registers */ + u32 fpcr, _dummy0, _dummy1; + u32 fs0, fs1, fs2, fs3, fs4, fs5, fs6, fs7; + u32 fs8, fs9, fs10, fs11, fs12, fs13, fs14, fs15; + u32 fs16, fs17, fs18, fs19, fs20, fs21, fs22, fs23; + u32 fs24, fs25, fs26, fs27, fs28, fs29, fs30, fs31; +}; + +/* + * Prototypes + */ +extern void show_registers_only(struct pt_regs *regs); + +extern asmlinkage void gdbstub_init(void); +extern asmlinkage void gdbstub_exit(int status); +extern asmlinkage void gdbstub_io_init(void); +extern asmlinkage void gdbstub_io_set_baud(unsigned baud); +extern asmlinkage int gdbstub_io_rx_char(unsigned char *_ch, int nonblock); +extern asmlinkage void gdbstub_io_tx_char(unsigned char ch); +extern asmlinkage void gdbstub_io_tx_flush(void); + +extern asmlinkage void gdbstub_io_rx_handler(void); +extern asmlinkage void gdbstub_rx_irq(struct pt_regs *, enum exception_code); +extern asmlinkage int gdbstub_intercept(struct pt_regs *, enum exception_code); +extern asmlinkage void gdbstub_exception(struct pt_regs *, enum exception_code); +extern asmlinkage void __gdbstub_bug_trap(void); +extern asmlinkage void __gdbstub_pause(void); +extern asmlinkage void start_kernel(void); + +#ifndef CONFIG_MN10300_CACHE_DISABLED +extern asmlinkage void gdbstub_purge_cache(void); +#else +#define gdbstub_purge_cache() do {} while (0) +#endif + +/* Used to prevent crashes in memory access */ +extern asmlinkage int gdbstub_read_byte(const u8 *, u8 *); +extern asmlinkage int gdbstub_read_word(const u8 *, u8 *); +extern asmlinkage int gdbstub_read_dword(const u8 *, u8 *); +extern asmlinkage int gdbstub_write_byte(u32, u8 *); +extern asmlinkage int gdbstub_write_word(u32, u8 *); +extern asmlinkage int gdbstub_write_dword(u32, u8 *); + +extern asmlinkage void gdbstub_read_byte_guard(void); +extern asmlinkage void gdbstub_read_byte_cont(void); +extern asmlinkage void gdbstub_read_word_guard(void); +extern asmlinkage void gdbstub_read_word_cont(void); +extern asmlinkage void gdbstub_read_dword_guard(void); +extern asmlinkage void gdbstub_read_dword_cont(void); +extern asmlinkage void gdbstub_write_byte_guard(void); +extern asmlinkage void gdbstub_write_byte_cont(void); +extern asmlinkage void gdbstub_write_word_guard(void); +extern asmlinkage void gdbstub_write_word_cont(void); +extern asmlinkage void gdbstub_write_dword_guard(void); +extern asmlinkage void gdbstub_write_dword_cont(void); + +extern u8 gdbstub_rx_buffer[PAGE_SIZE]; +extern u32 gdbstub_rx_inp; +extern u32 gdbstub_rx_outp; +extern u8 gdbstub_rx_overflow; +extern u8 gdbstub_busy; +extern u8 gdbstub_rx_unget; + +#ifdef CONFIG_GDBSTUB_DEBUGGING +extern void gdbstub_printk(const char *fmt, ...) + __attribute__((format(printf, 1, 2))); +#else +static inline __attribute__((format(printf, 1, 2))) +void gdbstub_printk(const char *fmt, ...) +{ +} +#endif + +#ifdef CONFIG_GDBSTUB_DEBUG_ENTRY +#define gdbstub_entry(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) +#else +#define gdbstub_entry(FMT, ...) ({ 0; }) +#endif + +#ifdef CONFIG_GDBSTUB_DEBUG_PROTOCOL +#define gdbstub_proto(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) +#else +#define gdbstub_proto(FMT, ...) ({ 0; }) +#endif + +#ifdef CONFIG_GDBSTUB_DEBUG_IO +#define gdbstub_io(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) +#else +#define gdbstub_io(FMT, ...) ({ 0; }) +#endif + +#ifdef CONFIG_GDBSTUB_DEBUG_BREAKPOINT +#define gdbstub_bkpt(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) +#else +#define gdbstub_bkpt(FMT, ...) ({ 0; }) +#endif + +#endif /* !__ASSEMBLY__ */ +#endif /* _ASM_GDB_STUB_H */ diff --git a/arch/mn10300/include/asm/hardirq.h b/arch/mn10300/include/asm/hardirq.h new file mode 100644 index 0000000..54d9501 --- /dev/null +++ b/arch/mn10300/include/asm/hardirq.h @@ -0,0 +1,48 @@ +/* MN10300 Hardware IRQ statistics and management + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Modified by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_HARDIRQ_H +#define _ASM_HARDIRQ_H + +#include +#include +#include + +/* assembly code in softirq.h is sensitive to the offsets of these fields */ +typedef struct { + unsigned int __softirq_pending; + unsigned long idle_timestamp; + unsigned int __nmi_count; /* arch dependent */ + unsigned int __irq_count; /* arch dependent */ +} ____cacheline_aligned irq_cpustat_t; + +#include /* Standard mappings for irq_cpustat_t above */ + +extern void ack_bad_irq(int irq); + +/* + * manipulate stubs in the MN10300 CPU Trap/Interrupt Vector table + * - these should jump to __common_exception in entry.S unless there's a good + * reason to do otherwise (see trap_preinit() in traps.c) + */ +typedef void (*intr_stub_fnx)(struct pt_regs *regs, + enum exception_code intcode); + +/* + * manipulate pointers in the Exception table (see entry.S) + * - these are indexed by decoding the lower 24 bits of the TBR register + * - note that the MN103E010 doesn't always trap through the correct vector, + * but does always set the TBR correctly + */ +extern asmlinkage void set_excp_vector(enum exception_code code, + intr_stub_fnx handler); + +#endif /* _ASM_HARDIRQ_H */ diff --git a/arch/mn10300/include/asm/highmem.h b/arch/mn10300/include/asm/highmem.h new file mode 100644 index 0000000..90f2abb --- /dev/null +++ b/arch/mn10300/include/asm/highmem.h @@ -0,0 +1,116 @@ +/* MN10300 Virtual kernel memory mappings for high memory + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from include/asm-i386/highmem.h + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_HIGHMEM_H +#define _ASM_HIGHMEM_H + +#ifdef __KERNEL__ + +#include +#include +#include +#include +#include + +/* undef for production */ +#undef HIGHMEM_DEBUG + +/* declarations for highmem.c */ +extern unsigned long highstart_pfn, highend_pfn; + +extern pte_t *kmap_pte; +extern pgprot_t kmap_prot; +extern pte_t *pkmap_page_table; + +extern void __init kmap_init(void); + +/* + * Right now we initialize only a single pte table. It can be extended + * easily, subsequent pte tables have to be allocated in one physical + * chunk of RAM. + */ +#define PKMAP_BASE 0xfe000000UL +#define LAST_PKMAP 1024 +#define LAST_PKMAP_MASK (LAST_PKMAP - 1) +#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) +#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +extern unsigned long kmap_high(struct page *page); +extern void kunmap_high(struct page *page); + +static inline unsigned long kmap(struct page *page) +{ + if (in_interrupt()) + BUG(); + if (page < highmem_start_page) + return page_address(page); + return kmap_high(page); +} + +static inline void kunmap(struct page *page) +{ + if (in_interrupt()) + BUG(); + if (page < highmem_start_page) + return; + kunmap_high(page); +} + +/* + * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap + * gives a more generic (and caching) interface. But kmap_atomic can + * be used in IRQ contexts, so in some (very limited) cases we need + * it. + */ +static inline unsigned long kmap_atomic(struct page *page, enum km_type type) +{ + enum fixed_addresses idx; + unsigned long vaddr; + + if (page < highmem_start_page) + return page_address(page); + + debug_kmap_atomic(type); + idx = type + KM_TYPE_NR * smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +#if HIGHMEM_DEBUG + if (!pte_none(*(kmap_pte - idx))) + BUG(); +#endif + set_pte(kmap_pte - idx, mk_pte(page, kmap_prot)); + __flush_tlb_one(vaddr); + + return vaddr; +} + +static inline void kunmap_atomic(unsigned long vaddr, enum km_type type) +{ +#if HIGHMEM_DEBUG + enum fixed_addresses idx = type + KM_TYPE_NR * smp_processor_id(); + + if (vaddr < FIXADDR_START) /* FIXME */ + return; + + if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)) + BUG(); + + /* + * force other mappings to Oops if they'll try to access + * this pte without first remap it + */ + pte_clear(kmap_pte - idx); + __flush_tlb_one(vaddr); +#endif +} + +#endif /* __KERNEL__ */ + +#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/mn10300/include/asm/hw_irq.h b/arch/mn10300/include/asm/hw_irq.h new file mode 100644 index 0000000..7061990 --- /dev/null +++ b/arch/mn10300/include/asm/hw_irq.h @@ -0,0 +1,14 @@ +/* MN10300 Hardware interrupt definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_HW_IRQ_H +#define _ASM_HW_IRQ_H + +#endif /* _ASM_HW_IRQ_H */ diff --git a/arch/mn10300/include/asm/intctl-regs.h b/arch/mn10300/include/asm/intctl-regs.h new file mode 100644 index 0000000..ba544c7 --- /dev/null +++ b/arch/mn10300/include/asm/intctl-regs.h @@ -0,0 +1,73 @@ +/* MN10300 On-board interrupt controller registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_INTCTL_REGS_H +#define _ASM_INTCTL_REGS_H + +#include + +#ifdef __KERNEL__ + +/* interrupt controller registers */ +#define GxICR(X) __SYSREG(0xd4000000 + (X) * 4, u16) /* group irq ctrl regs */ + +#define IAGR __SYSREG(0xd4000100, u16) /* intr acceptance group reg */ +#define IAGR_GN 0x00fc /* group number register + * (documentation _has_ to be wrong) + */ + +#define EXTMD __SYSREG(0xd4000200, u16) /* external pin intr spec reg */ +#define GET_XIRQ_TRIGGER(X) ((EXTMD >> ((X) * 2)) & 3) + +#define SET_XIRQ_TRIGGER(X,Y) \ +do { \ + u16 x = EXTMD; \ + x &= ~(3 << ((X) * 2)); \ + x |= ((Y) & 3) << ((X) * 2); \ + EXTMD = x; \ +} while (0) + +#define XIRQ_TRIGGER_LOWLEVEL 0 +#define XIRQ_TRIGGER_HILEVEL 1 +#define XIRQ_TRIGGER_NEGEDGE 2 +#define XIRQ_TRIGGER_POSEDGE 3 + +/* non-maskable interrupt control */ +#define NMIIRQ 0 +#define NMICR GxICR(NMIIRQ) /* NMI control register */ +#define NMICR_NMIF 0x0001 /* NMI pin interrupt flag */ +#define NMICR_WDIF 0x0002 /* watchdog timer overflow flag */ +#define NMICR_ABUSERR 0x0008 /* async bus error flag */ + +/* maskable interrupt control */ +#define GxICR_DETECT 0x0001 /* interrupt detect flag */ +#define GxICR_REQUEST 0x0010 /* interrupt request flag */ +#define GxICR_ENABLE 0x0100 /* interrupt enable flag */ +#define GxICR_LEVEL 0x7000 /* interrupt priority level */ +#define GxICR_LEVEL_0 0x0000 /* - level 0 */ +#define GxICR_LEVEL_1 0x1000 /* - level 1 */ +#define GxICR_LEVEL_2 0x2000 /* - level 2 */ +#define GxICR_LEVEL_3 0x3000 /* - level 3 */ +#define GxICR_LEVEL_4 0x4000 /* - level 4 */ +#define GxICR_LEVEL_5 0x5000 /* - level 5 */ +#define GxICR_LEVEL_6 0x6000 /* - level 6 */ +#define GxICR_LEVEL_SHIFT 12 + +#ifndef __ASSEMBLY__ +extern void set_intr_level(int irq, u16 level); +extern void set_intr_postackable(int irq); +#endif + +/* external interrupts */ +#define XIRQxICR(X) GxICR((X)) /* external interrupt control regs */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_INTCTL_REGS_H */ diff --git a/arch/mn10300/include/asm/io.h b/arch/mn10300/include/asm/io.h new file mode 100644 index 0000000..c1a4119 --- /dev/null +++ b/arch/mn10300/include/asm/io.h @@ -0,0 +1,301 @@ +/* MN10300 I/O port emulation and memory-mapped I/O + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_IO_H +#define _ASM_IO_H + +#include /* I/O is all done through memory accesses */ +#include +#include + +#define mmiowb() do {} while (0) + +/*****************************************************************************/ +/* + * readX/writeX() are used to access memory mapped devices. On some + * architectures the memory mapped IO stuff needs to be accessed + * differently. On the x86 architecture, we just read/write the + * memory location directly. + */ +static inline u8 readb(const volatile void __iomem *addr) +{ + return *(const volatile u8 *) addr; +} + +static inline u16 readw(const volatile void __iomem *addr) +{ + return *(const volatile u16 *) addr; +} + +static inline u32 readl(const volatile void __iomem *addr) +{ + return *(const volatile u32 *) addr; +} + +#define __raw_readb readb +#define __raw_readw readw +#define __raw_readl readl + +#define readb_relaxed readb +#define readw_relaxed readw +#define readl_relaxed readl + +static inline void writeb(u8 b, volatile void __iomem *addr) +{ + *(volatile u8 *) addr = b; +} + +static inline void writew(u16 b, volatile void __iomem *addr) +{ + *(volatile u16 *) addr = b; +} + +static inline void writel(u32 b, volatile void __iomem *addr) +{ + *(volatile u32 *) addr = b; +} + +#define __raw_writeb writeb +#define __raw_writew writew +#define __raw_writel writel + +/*****************************************************************************/ +/* + * traditional input/output functions + */ +static inline u8 inb_local(unsigned long addr) +{ + return readb((volatile void __iomem *) addr); +} + +static inline void outb_local(u8 b, unsigned long addr) +{ + return writeb(b, (volatile void __iomem *) addr); +} + +static inline u8 inb(unsigned long addr) +{ + return readb((volatile void __iomem *) addr); +} + +static inline u16 inw(unsigned long addr) +{ + return readw((volatile void __iomem *) addr); +} + +static inline u32 inl(unsigned long addr) +{ + return readl((volatile void __iomem *) addr); +} + +static inline void outb(u8 b, unsigned long addr) +{ + return writeb(b, (volatile void __iomem *) addr); +} + +static inline void outw(u16 b, unsigned long addr) +{ + return writew(b, (volatile void __iomem *) addr); +} + +static inline void outl(u32 b, unsigned long addr) +{ + return writel(b, (volatile void __iomem *) addr); +} + +#define inb_p(addr) inb(addr) +#define inw_p(addr) inw(addr) +#define inl_p(addr) inl(addr) +#define outb_p(x, addr) outb((x), (addr)) +#define outw_p(x, addr) outw((x), (addr)) +#define outl_p(x, addr) outl((x), (addr)) + +static inline void insb(unsigned long addr, void *buffer, int count) +{ + if (count) { + u8 *buf = buffer; + do { + u8 x = inb(addr); + *buf++ = x; + } while (--count); + } +} + +static inline void insw(unsigned long addr, void *buffer, int count) +{ + if (count) { + u16 *buf = buffer; + do { + u16 x = inw(addr); + *buf++ = x; + } while (--count); + } +} + +static inline void insl(unsigned long addr, void *buffer, int count) +{ + if (count) { + u32 *buf = buffer; + do { + u32 x = inl(addr); + *buf++ = x; + } while (--count); + } +} + +static inline void outsb(unsigned long addr, const void *buffer, int count) +{ + if (count) { + const u8 *buf = buffer; + do { + outb(*buf++, addr); + } while (--count); + } +} + +static inline void outsw(unsigned long addr, const void *buffer, int count) +{ + if (count) { + const u16 *buf = buffer; + do { + outw(*buf++, addr); + } while (--count); + } +} + +extern void __outsl(unsigned long addr, const void *buffer, int count); +static inline void outsl(unsigned long addr, const void *buffer, int count) +{ + if ((unsigned long) buffer & 0x3) + return __outsl(addr, buffer, count); + + if (count) { + const u32 *buf = buffer; + do { + outl(*buf++, addr); + } while (--count); + } +} + +#define ioread8(addr) readb(addr) +#define ioread16(addr) readw(addr) +#define ioread32(addr) readl(addr) + +#define iowrite8(v, addr) writeb((v), (addr)) +#define iowrite16(v, addr) writew((v), (addr)) +#define iowrite32(v, addr) writel((v), (addr)) + +#define ioread8_rep(p, dst, count) \ + insb((unsigned long) (p), (dst), (count)) +#define ioread16_rep(p, dst, count) \ + insw((unsigned long) (p), (dst), (count)) +#define ioread32_rep(p, dst, count) \ + insl((unsigned long) (p), (dst), (count)) + +#define iowrite8_rep(p, src, count) \ + outsb((unsigned long) (p), (src), (count)) +#define iowrite16_rep(p, src, count) \ + outsw((unsigned long) (p), (src), (count)) +#define iowrite32_rep(p, src, count) \ + outsl((unsigned long) (p), (src), (count)) + + +#define IO_SPACE_LIMIT 0xffffffff + +#ifdef __KERNEL__ + +#include +#define __io_virt(x) ((void *) (x)) + +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +struct pci_dev; +extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); +static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) +{ +} + +/* + * Change virtual addresses to physical addresses and vv. + * These are pretty trivial + */ +static inline unsigned long virt_to_phys(volatile void *address) +{ + return __pa(address); +} + +static inline void *phys_to_virt(unsigned long address) +{ + return __va(address); +} + +/* + * Change "struct page" to physical address. + */ +static inline void *__ioremap(unsigned long offset, unsigned long size, + unsigned long flags) +{ + return (void *) offset; +} + +static inline void *ioremap(unsigned long offset, unsigned long size) +{ + return (void *) offset; +} + +/* + * This one maps high address device memory and turns off caching for that + * area. it's useful if some control registers are in such an area and write + * combining or read caching is not desirable: + */ +static inline void *ioremap_nocache(unsigned long offset, unsigned long size) +{ + return (void *) (offset | 0x20000000); +} + +#define ioremap_wc ioremap_nocache + +static inline void iounmap(void *addr) +{ +} + +static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) +{ + return (void __iomem *) port; +} + +static inline void ioport_unmap(void __iomem *p) +{ +} + +#define xlate_dev_kmem_ptr(p) ((void *) (p)) +#define xlate_dev_mem_ptr(p) ((void *) (p)) + +/* + * PCI bus iomem addresses must be in the region 0x80000000-0x9fffffff + */ +static inline unsigned long virt_to_bus(volatile void *address) +{ + return ((unsigned long) address) & ~0x20000000; +} + +static inline void *bus_to_virt(unsigned long address) +{ + return (void *) address; +} + +#define page_to_bus page_to_phys + +#define memset_io(a, b, c) memset(__io_virt(a), (b), (c)) +#define memcpy_fromio(a, b, c) memcpy((a), __io_virt(b), (c)) +#define memcpy_toio(a, b, c) memcpy(__io_virt(a), (b), (c)) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_IO_H */ diff --git a/arch/mn10300/include/asm/ioctl.h b/arch/mn10300/include/asm/ioctl.h new file mode 100644 index 0000000..b279fe0 --- /dev/null +++ b/arch/mn10300/include/asm/ioctl.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/ioctls.h b/arch/mn10300/include/asm/ioctls.h new file mode 100644 index 0000000..dcbfb45 --- /dev/null +++ b/arch/mn10300/include/asm/ioctls.h @@ -0,0 +1,88 @@ +#ifndef _ASM_IOCTLS_H +#define _ASM_IOCTLS_H + +#include + +/* 0x54 is just a magic number to make these relatively unique ('T') */ + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define FIONREAD 0x541B +#define TIOCINQ FIONREAD +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#define FIONBIO 0x5421 +#define TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ +/* #define TIOCTTYGSTRUCT 0x5426 - Former debugging-only ioctl */ +#define TIOCSBRK 0x5427 /* BSD compatibility */ +#define TIOCCBRK 0x5428 /* BSD compatibility */ +#define TIOCGSID 0x5429 /* Return the session ID of FD */ +#define TCGETS2 _IOR('T', 0x2A, struct termios2) +#define TCSETS2 _IOW('T', 0x2B, struct termios2) +#define TCSETSW2 _IOW('T', 0x2C, struct termios2) +#define TCSETSF2 _IOW('T', 0x2D, struct termios2) +#define TIOCGPTN _IOR('T', 0x30, unsigned int) /* Get Pty Number + * (of pty-mux device) */ +#define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ + +#define FIONCLEX 0x5450 +#define FIOCLEX 0x5451 +#define FIOASYNC 0x5452 +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ +#define TIOCSERGETLSR 0x5459 /* Get line status register */ +#define TIOCSERGETMULTI 0x545A /* Get multiport config */ +#define TIOCSERSETMULTI 0x545B /* Set multiport config */ + +#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ +#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ +#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ +#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ +#define FIOQSIZE 0x5460 + +/* Used for packet mode */ +#define TIOCPKT_DATA 0 +#define TIOCPKT_FLUSHREAD 1 +#define TIOCPKT_FLUSHWRITE 2 +#define TIOCPKT_STOP 4 +#define TIOCPKT_START 8 +#define TIOCPKT_NOSTOP 16 +#define TIOCPKT_DOSTOP 32 + +#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ + +#endif /* _ASM_IOCTLS_H */ diff --git a/arch/mn10300/include/asm/ipc.h b/arch/mn10300/include/asm/ipc.h new file mode 100644 index 0000000..a46e3d9 --- /dev/null +++ b/arch/mn10300/include/asm/ipc.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/ipcbuf.h b/arch/mn10300/include/asm/ipcbuf.h new file mode 100644 index 0000000..f6f63d4 --- /dev/null +++ b/arch/mn10300/include/asm/ipcbuf.h @@ -0,0 +1,29 @@ +#ifndef _ASM_IPCBUF_H +#define _ASM_IPCBUF_H + +/* + * The ipc64_perm structure for MN10300 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 32-bit mode_t and seq + * - 2 miscellaneous 32-bit values + */ + +struct ipc64_perm +{ + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned short __pad1; + unsigned short seq; + unsigned short __pad2; + unsigned long __unused1; + unsigned long __unused2; +}; + +#endif /* _ASM_IPCBUF_H */ diff --git a/arch/mn10300/include/asm/irq.h b/arch/mn10300/include/asm/irq.h new file mode 100644 index 0000000..53b3801 --- /dev/null +++ b/arch/mn10300/include/asm/irq.h @@ -0,0 +1,32 @@ +/* MN10300 Hardware interrupt definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Modified by David Howells (dhowells@redhat.com) + * - Derived from include/asm-i386/irq.h: + * - (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_IRQ_H +#define _ASM_IRQ_H + +#include +#include +#include + +/* this number is used when no interrupt has been assigned */ +#define NO_IRQ INT_MAX + +/* hardware irq numbers */ +#define NR_IRQS GxICR_NUM_IRQS + +/* external hardware irq numbers */ +#define NR_XIRQS GxICR_NUM_XIRQS + +#define irq_canonicalize(IRQ) (IRQ) + +#endif /* _ASM_IRQ_H */ diff --git a/arch/mn10300/include/asm/irq_regs.h b/arch/mn10300/include/asm/irq_regs.h new file mode 100644 index 0000000..a848cd2 --- /dev/null +++ b/arch/mn10300/include/asm/irq_regs.h @@ -0,0 +1,24 @@ +/* MN10300 IRQ registers pointer definition + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_IRQ_REGS_H +#define _ASM_IRQ_REGS_H + +/* + * Per-cpu current frame pointer - the location of the last exception frame on + * the stack + */ +#define ARCH_HAS_OWN_IRQ_REGS + +#ifndef __ASSEMBLY__ +#define get_irq_regs() (__frame) +#endif + +#endif /* _ASM_IRQ_REGS_H */ diff --git a/arch/mn10300/include/asm/kdebug.h b/arch/mn10300/include/asm/kdebug.h new file mode 100644 index 0000000..0f47e11 --- /dev/null +++ b/arch/mn10300/include/asm/kdebug.h @@ -0,0 +1,22 @@ +/* MN10300 In-kernel death knells + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_KDEBUG_H +#define _ASM_KDEBUG_H + +/* Grossly misnamed. */ +enum die_val { + DIE_OOPS = 1, + DIE_BREAKPOINT, + DIE_GPF, +}; + +#endif /* _ASM_KDEBUG_H */ diff --git a/arch/mn10300/include/asm/kmap_types.h b/arch/mn10300/include/asm/kmap_types.h new file mode 100644 index 0000000..3398f9f --- /dev/null +++ b/arch/mn10300/include/asm/kmap_types.h @@ -0,0 +1,31 @@ +/* MN10300 kmap_atomic() slot IDs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_KMAP_TYPES_H +#define _ASM_KMAP_TYPES_H + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_PTE0, + KM_PTE1, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; + +#endif /* _ASM_KMAP_TYPES_H */ diff --git a/arch/mn10300/include/asm/kprobes.h b/arch/mn10300/include/asm/kprobes.h new file mode 100644 index 0000000..c800b59 --- /dev/null +++ b/arch/mn10300/include/asm/kprobes.h @@ -0,0 +1,50 @@ +/* MN10300 Kernel Probes support + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by Mark Salter (msalter@redhat.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public Licence as published by + * the Free Software Foundation; either version 2 of the Licence, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public Licence for more details. + * + * You should have received a copy of the GNU General Public Licence + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ +#ifndef _ASM_KPROBES_H +#define _ASM_KPROBES_H + +#include +#include + +struct kprobe; + +typedef unsigned char kprobe_opcode_t; +#define BREAKPOINT_INSTRUCTION 0xff +#define MAX_INSN_SIZE 8 +#define MAX_STACK_SIZE 128 + +/* Architecture specific copy of original instruction */ +struct arch_specific_insn { + /* copy of original instruction + */ + kprobe_opcode_t insn[MAX_INSN_SIZE]; +}; + +extern const int kretprobe_blacklist_size; + +extern int kprobe_exceptions_notify(struct notifier_block *self, + unsigned long val, void *data); + +#define flush_insn_slot(p) do {} while (0) + +extern void arch_remove_kprobe(struct kprobe *p); + +#endif /* _ASM_KPROBES_H */ diff --git a/arch/mn10300/include/asm/linkage.h b/arch/mn10300/include/asm/linkage.h new file mode 100644 index 0000000..dda3002 --- /dev/null +++ b/arch/mn10300/include/asm/linkage.h @@ -0,0 +1,20 @@ +/* MN10300 Linkage and calling-convention overrides + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_LINKAGE_H +#define _ASM_LINKAGE_H + +/* don't override anything */ +#define asmlinkage + +#define __ALIGN .align 4,0xcb +#define __ALIGN_STR ".align 4,0xcb" + +#endif diff --git a/arch/mn10300/include/asm/local.h b/arch/mn10300/include/asm/local.h new file mode 100644 index 0000000..c11c530 --- /dev/null +++ b/arch/mn10300/include/asm/local.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/mc146818rtc.h b/arch/mn10300/include/asm/mc146818rtc.h new file mode 100644 index 0000000..df6bc6e --- /dev/null +++ b/arch/mn10300/include/asm/mc146818rtc.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/mman.h b/arch/mn10300/include/asm/mman.h new file mode 100644 index 0000000..b7986b6 --- /dev/null +++ b/arch/mn10300/include/asm/mman.h @@ -0,0 +1,28 @@ +/* MN10300 Constants for mmap and co. + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * - Derived from asm-x86/mman.h + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_MMAN_H +#define _ASM_MMAN_H + +#include + +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ +#define MAP_NONBLOCK 0x10000 /* do not block on IO */ + +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ + +#endif /* _ASM_MMAN_H */ diff --git a/arch/mn10300/include/asm/mmu.h b/arch/mn10300/include/asm/mmu.h new file mode 100644 index 0000000..2d2d097 --- /dev/null +++ b/arch/mn10300/include/asm/mmu.h @@ -0,0 +1,19 @@ +/* MN10300 Memory management context + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * - Derived from include/asm-frv/mmu.h + */ + +#ifndef _ASM_MMU_H +#define _ASM_MMU_H + +/* + * MMU context + */ +typedef struct { + unsigned long tlbpid[NR_CPUS]; /* TLB PID for this process on + * each CPU */ +} mm_context_t; + +#endif /* _ASM_MMU_H */ diff --git a/arch/mn10300/include/asm/mmu_context.h b/arch/mn10300/include/asm/mmu_context.h new file mode 100644 index 0000000..a9e2e34 --- /dev/null +++ b/arch/mn10300/include/asm/mmu_context.h @@ -0,0 +1,138 @@ +/* MN10300 MMU context management + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Modified by David Howells (dhowells@redhat.com) + * - Derived from include/asm-m32r/mmu_context.h + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + * + * + * This implements an algorithm to provide TLB PID mappings to provide + * selective access to the TLB for processes, thus reducing the number of TLB + * flushes required. + * + * Note, however, that the M32R algorithm is technically broken as it does not + * handle version wrap-around, and could, theoretically, have a problem with a + * very long lived program that sleeps long enough for the version number to + * wrap all the way around so that its TLB mappings appear valid once again. + */ +#ifndef _ASM_MMU_CONTEXT_H +#define _ASM_MMU_CONTEXT_H + +#include +#include +#include +#include + +#define MMU_CONTEXT_TLBPID_MASK 0x000000ffUL +#define MMU_CONTEXT_VERSION_MASK 0xffffff00UL +#define MMU_CONTEXT_FIRST_VERSION 0x00000100UL +#define MMU_NO_CONTEXT 0x00000000UL + +extern unsigned long mmu_context_cache[NR_CPUS]; +#define mm_context(mm) (mm->context.tlbpid[smp_processor_id()]) + +#define enter_lazy_tlb(mm, tsk) do {} while (0) + +#ifdef CONFIG_SMP +#define cpu_ran_vm(cpu, task) \ + cpu_set((cpu), (task)->cpu_vm_mask) +#define cpu_maybe_ran_vm(cpu, task) \ + cpu_test_and_set((cpu), (task)->cpu_vm_mask) +#else +#define cpu_ran_vm(cpu, task) do {} while (0) +#define cpu_maybe_ran_vm(cpu, task) true +#endif /* CONFIG_SMP */ + +/* + * allocate an MMU context + */ +static inline unsigned long allocate_mmu_context(struct mm_struct *mm) +{ + unsigned long *pmc = &mmu_context_cache[smp_processor_id()]; + unsigned long mc = ++(*pmc); + + if (!(mc & MMU_CONTEXT_TLBPID_MASK)) { + /* we exhausted the TLB PIDs of this version on this CPU, so we + * flush this CPU's TLB in its entirety and start new cycle */ + flush_tlb_all(); + + /* fix the TLB version if needed (we avoid version #0 so as to + * distingush MMU_NO_CONTEXT) */ + if (!mc) + *pmc = mc = MMU_CONTEXT_FIRST_VERSION; + } + mm_context(mm) = mc; + return mc; +} + +/* + * get an MMU context if one is needed + */ +static inline unsigned long get_mmu_context(struct mm_struct *mm) +{ + unsigned long mc = MMU_NO_CONTEXT, cache; + + if (mm) { + cache = mmu_context_cache[smp_processor_id()]; + mc = mm_context(mm); + + /* if we have an old version of the context, replace it */ + if ((mc ^ cache) & MMU_CONTEXT_VERSION_MASK) + mc = allocate_mmu_context(mm); + } + return mc; +} + +/* + * initialise the context related info for a new mm_struct instance + */ +static inline int init_new_context(struct task_struct *tsk, + struct mm_struct *mm) +{ + int num_cpus = NR_CPUS, i; + + for (i = 0; i < num_cpus; i++) + mm->context.tlbpid[i] = MMU_NO_CONTEXT; + return 0; +} + +/* + * destroy context related info for an mm_struct that is about to be put to + * rest + */ +#define destroy_context(mm) do { } while (0) + +/* + * after we have set current->mm to a new value, this activates the context for + * the new mm so we see the new mappings. + */ +static inline void activate_context(struct mm_struct *mm, int cpu) +{ + PIDR = get_mmu_context(mm) & MMU_CONTEXT_TLBPID_MASK; +} + +/* + * change between virtual memory sets + */ +static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, + struct task_struct *tsk) +{ + int cpu = smp_processor_id(); + + if (prev != next) { + cpu_ran_vm(cpu, next); + activate_context(next, cpu); + PTBR = (unsigned long) next->pgd; + } else if (!cpu_maybe_ran_vm(cpu, next)) { + activate_context(next, cpu); + } +} + +#define deactivate_mm(tsk, mm) do {} while (0) +#define activate_mm(prev, next) switch_mm((prev), (next), NULL) + +#endif /* _ASM_MMU_CONTEXT_H */ diff --git a/arch/mn10300/include/asm/module.h b/arch/mn10300/include/asm/module.h new file mode 100644 index 0000000..5d7057d --- /dev/null +++ b/arch/mn10300/include/asm/module.h @@ -0,0 +1,27 @@ +/* MN10300 Arch-specific module definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by Mark Salter (msalter@redhat.com) + * Derived from include/asm-i386/module.h + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_MODULE_H +#define _ASM_MODULE_H + +struct mod_arch_specific { +}; + +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Ehdr Elf32_Ehdr + +/* + * Include the MN10300 architecture version. + */ +#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " " + +#endif /* _ASM_MODULE_H */ diff --git a/arch/mn10300/include/asm/msgbuf.h b/arch/mn10300/include/asm/msgbuf.h new file mode 100644 index 0000000..8b60245 --- /dev/null +++ b/arch/mn10300/include/asm/msgbuf.h @@ -0,0 +1,31 @@ +#ifndef _ASM_MSGBUF_H +#define _ASM_MSGBUF_H + +/* + * The msqid64_ds structure for MN10300 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct msqid64_ds { + struct ipc64_perm msg_perm; + __kernel_time_t msg_stime; /* last msgsnd time */ + unsigned long __unused1; + __kernel_time_t msg_rtime; /* last msgrcv time */ + unsigned long __unused2; + __kernel_time_t msg_ctime; /* last change time */ + unsigned long __unused3; + unsigned long msg_cbytes; /* current number of bytes on queue */ + unsigned long msg_qnum; /* number of messages in queue */ + unsigned long msg_qbytes; /* max number of bytes on queue */ + __kernel_pid_t msg_lspid; /* pid of last msgsnd */ + __kernel_pid_t msg_lrpid; /* last receive pid */ + unsigned long __unused4; + unsigned long __unused5; +}; + +#endif /* _ASM_MSGBUF_H */ diff --git a/arch/mn10300/include/asm/mutex.h b/arch/mn10300/include/asm/mutex.h new file mode 100644 index 0000000..84f5490 --- /dev/null +++ b/arch/mn10300/include/asm/mutex.h @@ -0,0 +1,16 @@ +/* MN10300 Mutex fastpath + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + * + * + * TODO: implement optimized primitives instead, or leave the generic + * implementation in place, or pick the atomic_xchg() based generic + * implementation. (see asm-generic/mutex-xchg.h for details) + */ +#include diff --git a/arch/mn10300/include/asm/nmi.h b/arch/mn10300/include/asm/nmi.h new file mode 100644 index 0000000..f3671cb --- /dev/null +++ b/arch/mn10300/include/asm/nmi.h @@ -0,0 +1,14 @@ +/* MN10300 NMI handling + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_NMI_H +#define _ASM_NMI_H + +#endif /* _ASM_NMI_H */ diff --git a/arch/mn10300/include/asm/page.h b/arch/mn10300/include/asm/page.h new file mode 100644 index 0000000..8288e12 --- /dev/null +++ b/arch/mn10300/include/asm/page.h @@ -0,0 +1,128 @@ +/* MN10300 Page table definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PAGE_H +#define _ASM_PAGE_H + +/* PAGE_SHIFT determines the page size */ +#define PAGE_SHIFT 12 + +#ifndef __ASSEMBLY__ +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#else +#define PAGE_SIZE +(1 << PAGE_SHIFT) /* unary plus marks an + * immediate val not an addr */ +#define PAGE_MASK +(~(PAGE_SIZE - 1)) +#endif + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) +#define copy_page(to, from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) + +#define clear_user_page(addr, vaddr, page) clear_page(addr) +#define copy_user_page(vto, vfrom, vaddr, to) copy_page(vto, vfrom) + +/* + * These are used to make use of C type-checking.. + */ +typedef struct { unsigned long pte; } pte_t; +typedef struct { unsigned long pgd; } pgd_t; +typedef struct { unsigned long pgprot; } pgprot_t; +typedef struct page *pgtable_t; + +#define PTE_MASK PAGE_MASK +#define HPAGE_SHIFT 22 + +#ifdef CONFIG_HUGETLB_PAGE +#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) +#define HPAGE_MASK (~(HPAGE_SIZE - 1)) +#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) +#endif + +#define pte_val(x) ((x).pte) +#define pgd_val(x) ((x).pgd) +#define pgprot_val(x) ((x).pgprot) + +#define __pte(x) ((pte_t) { (x) }) +#define __pgd(x) ((pgd_t) { (x) }) +#define __pgprot(x) ((pgprot_t) { (x) }) + +#include + +#endif /* !__ASSEMBLY__ */ + +/* + * This handles the memory map.. We could make this a config + * option, but too many people screw it up, and too few need + * it. + * + * A __PAGE_OFFSET of 0xC0000000 means that the kernel has + * a virtual address space of one gigabyte, which limits the + * amount of physical memory you can use to about 950MB. + */ + +#ifndef __ASSEMBLY__ + +/* Pure 2^n version of get_order */ +static inline int get_order(unsigned long size) __attribute__((const)); +static inline int get_order(unsigned long size) +{ + int order; + + size = (size - 1) >> (PAGE_SHIFT - 1); + order = -1; + do { + size >>= 1; + order++; + } while (size); + return order; +} + +#endif /* __ASSEMBLY__ */ + +#include + +#define __PAGE_OFFSET (PAGE_OFFSET_RAW) +#define PAGE_OFFSET ((unsigned long) __PAGE_OFFSET) + +/* + * main RAM and kernel working space are coincident at 0x90000000, but to make + * life more interesting, there's also an uncached virtual shadow at 0xb0000000 + * - these mappings are fixed in the MMU + */ +#define __pfn_disp (CONFIG_KERNEL_RAM_BASE_ADDRESS >> PAGE_SHIFT) + +#define __pa(x) ((unsigned long)(x)) +#define __va(x) ((void *)(unsigned long)(x)) +#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) +#define pfn_to_page(pfn) (mem_map + ((pfn) - __pfn_disp)) +#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + __pfn_disp) + +#define pfn_valid(pfn) \ +({ \ + unsigned long __pfn = (pfn) - __pfn_disp; \ + __pfn < max_mapnr; \ +}) + +#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) +#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) +#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) + +#define VM_DATA_DEFAULT_FLAGS \ + (VM_READ | VM_WRITE | \ + ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_PAGE_H */ diff --git a/arch/mn10300/include/asm/page_offset.h b/arch/mn10300/include/asm/page_offset.h new file mode 100644 index 0000000..8eb5b16 --- /dev/null +++ b/arch/mn10300/include/asm/page_offset.h @@ -0,0 +1,11 @@ +/* MN10300 Kernel base address + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ +#ifndef _ASM_PAGE_OFFSET_H +#define _ASM_PAGE_OFFSET_H + +#define PAGE_OFFSET_RAW CONFIG_KERNEL_RAM_BASE_ADDRESS + +#endif diff --git a/arch/mn10300/include/asm/param.h b/arch/mn10300/include/asm/param.h new file mode 100644 index 0000000..789b1df --- /dev/null +++ b/arch/mn10300/include/asm/param.h @@ -0,0 +1,34 @@ +/* MN10300 Kernel parameters + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PARAM_H +#define _ASM_PARAM_H + +#ifdef __KERNEL__ +#define HZ CONFIG_HZ /* Internal kernel timer frequency */ +#define USER_HZ 100 /* .. some user interfaces are in + * "ticks" */ +#define CLOCKS_PER_SEC (USER_HZ) /* like times() */ +#endif + +#ifndef HZ +#define HZ 100 +#endif + +#define EXEC_PAGESIZE 4096 + +#ifndef NOGROUP +#define NOGROUP (-1) +#endif + +#define MAXHOSTNAMELEN 64 /* max length of hostname */ +#define COMMAND_LINE_SIZE 256 + +#endif /* _ASM_PARAM_H */ diff --git a/arch/mn10300/include/asm/pci.h b/arch/mn10300/include/asm/pci.h new file mode 100644 index 0000000..0517b45 --- /dev/null +++ b/arch/mn10300/include/asm/pci.h @@ -0,0 +1,129 @@ +/* MN10300 PCI definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PCI_H +#define _ASM_PCI_H + +#ifdef __KERNEL__ +#include /* for struct page */ + +#if 0 +#define __pcbdebug(FMT, ADDR, ...) \ + printk(KERN_DEBUG "PCIBRIDGE[%08x]: "FMT"\n", \ + (u32)(ADDR), ##__VA_ARGS__) + +#define __pcidebug(FMT, BUS, DEVFN, WHERE,...) \ +do { \ + printk(KERN_DEBUG "PCI[%02x:%02x.%x + %02x]: "FMT"\n", \ + (BUS)->number, \ + PCI_SLOT(DEVFN), \ + PCI_FUNC(DEVFN), \ + (u32)(WHERE), ##__VA_ARGS__); \ +} while (0) + +#else +#define __pcbdebug(FMT, ADDR, ...) do {} while (0) +#define __pcidebug(FMT, BUS, DEVFN, WHERE, ...) do {} while (0) +#endif + +/* Can be used to override the logic in pci_scan_bus for skipping + * already-configured bus numbers - to be used for buggy BIOSes or + * architectures with incomplete PCI setup by the loader */ + +#ifdef CONFIG_PCI +#define pcibios_assign_all_busses() 1 +extern void unit_pci_init(void); +#else +#define pcibios_assign_all_busses() 0 +#endif + +extern unsigned long pci_mem_start; +#define PCIBIOS_MIN_IO 0xBE000004 +#define PCIBIOS_MIN_MEM 0xB8000000 + +void pcibios_set_master(struct pci_dev *dev); +void pcibios_penalize_isa_irq(int irq); + +/* Dynamic DMA mapping stuff. + * i386 has everything mapped statically. + */ + +#include +#include +#include +#include +#include +#include + +struct pci_dev; + +/* The PCI address space does equal the physical memory + * address space. The networking and block device layers use + * this boolean for bounce buffer decisions. + */ +#define PCI_DMA_BUS_IS_PHYS (1) + + +/* This is always fine. */ +#define pci_dac_dma_supported(pci_dev, mask) (0) + +/* Return the index of the PCI controller for device. */ +static inline int pci_controller_num(struct pci_dev *dev) +{ + return 0; +} + +#define HAVE_PCI_MMAP +extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, + enum pci_mmap_state mmap_state, + int write_combine); + +#endif /* __KERNEL__ */ + +/* implement the pci_ DMA API in terms of the generic device dma_ one */ +#include + +/** + * pcibios_resource_to_bus - convert resource to PCI bus address + * @dev: device which owns this resource + * @region: converted bus-centric region (start,end) + * @res: resource to convert + * + * Convert a resource to a PCI device bus address or bus window. + */ +extern void pcibios_resource_to_bus(struct pci_dev *dev, + struct pci_bus_region *region, + struct resource *res); + +extern void pcibios_bus_to_resource(struct pci_dev *dev, + struct resource *res, + struct pci_bus_region *region); + +static inline struct resource * +pcibios_select_root(struct pci_dev *pdev, struct resource *res) +{ + struct resource *root = NULL; + + if (res->flags & IORESOURCE_IO) + root = &ioport_resource; + if (res->flags & IORESOURCE_MEM) + root = &iomem_resource; + + return root; +} + +#define pcibios_scan_all_fns(a, b) 0 + +static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) +{ + return channel ? 15 : 14; +} + +#endif /* _ASM_PCI_H */ diff --git a/arch/mn10300/include/asm/percpu.h b/arch/mn10300/include/asm/percpu.h new file mode 100644 index 0000000..06a959d --- /dev/null +++ b/arch/mn10300/include/asm/percpu.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/pgalloc.h b/arch/mn10300/include/asm/pgalloc.h new file mode 100644 index 0000000..ec057e1 --- /dev/null +++ b/arch/mn10300/include/asm/pgalloc.h @@ -0,0 +1,56 @@ +/* MN10300 Page and page table/directory allocation + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PGALLOC_H +#define _ASM_PGALLOC_H + +#include +#include +#include +#include /* for struct page */ + +struct mm_struct; +struct page; + +/* attach a page table to a PMD entry */ +#define pmd_populate_kernel(mm, pmd, pte) \ + set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE)) + +static inline +void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) +{ + set_pmd(pmd, __pmd((page_to_pfn(pte) << PAGE_SHIFT) | _PAGE_TABLE)); +} +#define pmd_pgtable(pmd) pmd_page(pmd) + +/* + * Allocate and free page tables. + */ + +extern pgd_t *pgd_alloc(struct mm_struct *); +extern void pgd_free(struct mm_struct *, pgd_t *); + +extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); +extern struct page *pte_alloc_one(struct mm_struct *, unsigned long); + +static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) +{ + free_page((unsigned long) pte); +} + +static inline void pte_free(struct mm_struct *mm, struct page *pte) +{ + __free_page(pte); +} + + +#define __pte_free_tlb(tlb, pte) tlb_remove_page((tlb), (pte)) + +#endif /* _ASM_PGALLOC_H */ diff --git a/arch/mn10300/include/asm/pgtable.h b/arch/mn10300/include/asm/pgtable.h new file mode 100644 index 0000000..6dc30fc --- /dev/null +++ b/arch/mn10300/include/asm/pgtable.h @@ -0,0 +1,492 @@ +/* MN10300 Page table manipulators and constants + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + * + * + * The Linux memory management assumes a three-level page table setup. On + * the i386, we use that, but "fold" the mid level into the top-level page + * table, so that we physically have the same two-level page table as the + * i386 mmu expects. + * + * This file contains the functions and defines necessary to modify and use + * the i386 page table tree for the purposes of the MN10300 TLB handler + * functions. + */ +#ifndef _ASM_PGTABLE_H +#define _ASM_PGTABLE_H + +#include + +#ifndef __ASSEMBLY__ +#include +#include +#include + +#include + +#include +#include +#include + +/* + * ZERO_PAGE is a global shared page that is always zero: used + * for zero-mapped memory areas etc.. + */ +#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) +extern unsigned long empty_zero_page[1024]; +extern spinlock_t pgd_lock; +extern struct page *pgd_list; + +extern void pmd_ctor(void *, struct kmem_cache *, unsigned long); +extern void pgtable_cache_init(void); +extern void paging_init(void); + +#endif /* !__ASSEMBLY__ */ + +/* + * The Linux mn10300 paging architecture only implements both the traditional + * 2-level page tables + */ +#define PGDIR_SHIFT 22 +#define PTRS_PER_PGD 1024 +#define PTRS_PER_PUD 1 /* we don't really have any PUD physically */ +#define PTRS_PER_PMD 1 /* we don't really have any PMD physically */ +#define PTRS_PER_PTE 1024 + +#define PGD_SIZE PAGE_SIZE +#define PMD_SIZE (1UL << PMD_SHIFT) +#define PGDIR_SIZE (1UL << PGDIR_SHIFT) +#define PGDIR_MASK (~(PGDIR_SIZE - 1)) + +#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) +#define FIRST_USER_ADDRESS 0 + +#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT) +#define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS) + +#define TWOLEVEL_PGDIR_SHIFT 22 +#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT) +#define BOOT_KERNEL_PGD_PTRS (1024 - BOOT_USER_PGD_PTRS) + +#ifndef __ASSEMBLY__ +extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; +#endif + +/* + * Unfortunately, due to the way the MMU works on the MN10300, the vmalloc VM + * area has to be in the lower half of the virtual address range (the upper + * half is not translated through the TLB). + * + * So in this case, the vmalloc area goes at the bottom of the address map + * (leaving a hole at the very bottom to catch addressing errors), and + * userspace starts immediately above. + * + * The vmalloc() routines also leaves a hole of 4kB between each vmalloced + * area to catch addressing errors. + */ +#define VMALLOC_OFFSET (8 * 1024 * 1024) +#define VMALLOC_START (0x70000000) +#define VMALLOC_END (0x7C000000) + +#ifndef __ASSEMBLY__ +extern pte_t kernel_vmalloc_ptes[(VMALLOC_END - VMALLOC_START) / PAGE_SIZE]; +#endif + +/* IPTEL/DPTEL bit assignments */ +#define _PAGE_BIT_VALID xPTEL_V_BIT +#define _PAGE_BIT_ACCESSED xPTEL_UNUSED1_BIT /* mustn't be loaded into IPTEL/DPTEL */ +#define _PAGE_BIT_NX xPTEL_UNUSED2_BIT /* mustn't be loaded into IPTEL/DPTEL */ +#define _PAGE_BIT_CACHE xPTEL_C_BIT +#define _PAGE_BIT_PRESENT xPTEL_PV_BIT +#define _PAGE_BIT_DIRTY xPTEL_D_BIT +#define _PAGE_BIT_GLOBAL xPTEL_G_BIT + +#define _PAGE_VALID xPTEL_V +#define _PAGE_ACCESSED xPTEL_UNUSED1 +#define _PAGE_NX xPTEL_UNUSED2 /* no-execute bit */ +#define _PAGE_CACHE xPTEL_C +#define _PAGE_PRESENT xPTEL_PV +#define _PAGE_DIRTY xPTEL_D +#define _PAGE_PROT xPTEL_PR +#define _PAGE_PROT_RKNU xPTEL_PR_ROK +#define _PAGE_PROT_WKNU xPTEL_PR_RWK +#define _PAGE_PROT_RKRU xPTEL_PR_ROK_ROU +#define _PAGE_PROT_WKRU xPTEL_PR_RWK_ROU +#define _PAGE_PROT_WKWU xPTEL_PR_RWK_RWU +#define _PAGE_GLOBAL xPTEL_G +#define _PAGE_PSE xPTEL_PS_4Mb /* 4MB page */ + +#define _PAGE_FILE xPTEL_UNUSED1_BIT /* set:pagecache unset:swap */ + +#define __PAGE_PROT_UWAUX 0x040 +#define __PAGE_PROT_USER 0x080 +#define __PAGE_PROT_WRITE 0x100 + +#define _PAGE_PRESENTV (_PAGE_PRESENT|_PAGE_VALID) +#define _PAGE_PROTNONE 0x000 /* If not present */ + +#ifndef __ASSEMBLY__ + +#define VMALLOC_VMADDR(x) ((unsigned long)(x)) + +#define _PAGE_TABLE (_PAGE_PRESENTV | _PAGE_PROT_WKNU | _PAGE_ACCESSED | _PAGE_DIRTY) +#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) + +#define __PAGE_NONE (_PAGE_PRESENTV | _PAGE_PROT_RKNU | _PAGE_ACCESSED | _PAGE_CACHE) +#define __PAGE_SHARED (_PAGE_PRESENTV | _PAGE_PROT_WKWU | _PAGE_ACCESSED | _PAGE_CACHE) +#define __PAGE_COPY (_PAGE_PRESENTV | _PAGE_PROT_RKRU | _PAGE_ACCESSED | _PAGE_CACHE) +#define __PAGE_READONLY (_PAGE_PRESENTV | _PAGE_PROT_RKRU | _PAGE_ACCESSED | _PAGE_CACHE) + +#define PAGE_NONE __pgprot(__PAGE_NONE | _PAGE_NX) +#define PAGE_SHARED_NOEXEC __pgprot(__PAGE_SHARED | _PAGE_NX) +#define PAGE_COPY_NOEXEC __pgprot(__PAGE_COPY | _PAGE_NX) +#define PAGE_READONLY_NOEXEC __pgprot(__PAGE_READONLY | _PAGE_NX) +#define PAGE_SHARED_EXEC __pgprot(__PAGE_SHARED) +#define PAGE_COPY_EXEC __pgprot(__PAGE_COPY) +#define PAGE_READONLY_EXEC __pgprot(__PAGE_READONLY) +#define PAGE_COPY PAGE_COPY_NOEXEC +#define PAGE_READONLY PAGE_READONLY_NOEXEC +#define PAGE_SHARED PAGE_SHARED_EXEC + +#define __PAGE_KERNEL_BASE (_PAGE_PRESENTV | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL) + +#define __PAGE_KERNEL (__PAGE_KERNEL_BASE | _PAGE_PROT_WKNU | _PAGE_CACHE | _PAGE_NX) +#define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL_BASE | _PAGE_PROT_WKNU | _PAGE_NX) +#define __PAGE_KERNEL_EXEC (__PAGE_KERNEL & ~_PAGE_NX) +#define __PAGE_KERNEL_RO (__PAGE_KERNEL_BASE | _PAGE_PROT_RKNU | _PAGE_CACHE | _PAGE_NX) +#define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) +#define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) + +#define PAGE_KERNEL __pgprot(__PAGE_KERNEL) +#define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO) +#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) +#define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE) +#define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) +#define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) + +/* + * Whilst the MN10300 can do page protection for execute (given separate data + * and insn TLBs), we are not supporting it at the moment. Write permission, + * however, always implies read permission (but not execute permission). + */ +#define __P000 PAGE_NONE +#define __P001 PAGE_READONLY_NOEXEC +#define __P010 PAGE_COPY_NOEXEC +#define __P011 PAGE_COPY_NOEXEC +#define __P100 PAGE_READONLY_EXEC +#define __P101 PAGE_READONLY_EXEC +#define __P110 PAGE_COPY_EXEC +#define __P111 PAGE_COPY_EXEC + +#define __S000 PAGE_NONE +#define __S001 PAGE_READONLY_NOEXEC +#define __S010 PAGE_SHARED_NOEXEC +#define __S011 PAGE_SHARED_NOEXEC +#define __S100 PAGE_READONLY_EXEC +#define __S101 PAGE_READONLY_EXEC +#define __S110 PAGE_SHARED_EXEC +#define __S111 PAGE_SHARED_EXEC + +/* + * Define this to warn about kernel memory accesses that are + * done without a 'verify_area(VERIFY_WRITE,..)' + */ +#undef TEST_VERIFY_AREA + +#define pte_present(x) (pte_val(x) & _PAGE_VALID) +#define pte_clear(mm, addr, xp) \ +do { \ + set_pte_at((mm), (addr), (xp), __pte(0)); \ +} while (0) + +#define pmd_none(x) (!pmd_val(x)) +#define pmd_present(x) (!pmd_none(x)) +#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) +#define pmd_bad(x) 0 + + +#define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) + +#ifndef __ASSEMBLY__ + +/* + * The following only work if pte_present() is true. + * Undefined behaviour if not.. + */ +static inline int pte_user(pte_t pte) { return pte_val(pte) & __PAGE_PROT_USER; } +static inline int pte_read(pte_t pte) { return pte_val(pte) & __PAGE_PROT_USER; } +static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } +static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } +static inline int pte_write(pte_t pte) { return pte_val(pte) & __PAGE_PROT_WRITE; } +static inline int pte_special(pte_t pte){ return 0; } + +/* + * The following only works if pte_present() is not true. + */ +static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } + +static inline pte_t pte_rdprotect(pte_t pte) +{ + pte_val(pte) &= ~(__PAGE_PROT_USER|__PAGE_PROT_UWAUX); return pte; +} +static inline pte_t pte_exprotect(pte_t pte) +{ + pte_val(pte) |= _PAGE_NX; return pte; +} + +static inline pte_t pte_wrprotect(pte_t pte) +{ + pte_val(pte) &= ~(__PAGE_PROT_WRITE|__PAGE_PROT_UWAUX); return pte; +} + +static inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~_PAGE_DIRTY; return pte; } +static inline pte_t pte_mkold(pte_t pte) { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; } +static inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= _PAGE_DIRTY; return pte; } +static inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= _PAGE_ACCESSED; return pte; } +static inline pte_t pte_mkexec(pte_t pte) { pte_val(pte) &= ~_PAGE_NX; return pte; } + +static inline pte_t pte_mkread(pte_t pte) +{ + pte_val(pte) |= __PAGE_PROT_USER; + if (pte_write(pte)) + pte_val(pte) |= __PAGE_PROT_UWAUX; + return pte; +} +static inline pte_t pte_mkwrite(pte_t pte) +{ + pte_val(pte) |= __PAGE_PROT_WRITE; + if (pte_val(pte) & __PAGE_PROT_USER) + pte_val(pte) |= __PAGE_PROT_UWAUX; + return pte; +} + +static inline pte_t pte_mkspecial(pte_t pte) { return pte; } + +#define pte_ERROR(e) \ + printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \ + __FILE__, __LINE__, pte_val(e)) +#define pgd_ERROR(e) \ + printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \ + __FILE__, __LINE__, pgd_val(e)) + +/* + * The "pgd_xxx()" functions here are trivial for a folded two-level + * setup: the pgd is never bad, and a pmd always exists (as it's folded + * into the pgd entry) + */ +#define pgd_clear(xp) do { } while (0) + +/* + * Certain architectures need to do special things when PTEs + * within a page table are directly modified. Thus, the following + * hook is made available. + */ +#define set_pte(pteptr, pteval) (*(pteptr) = pteval) +#define set_pte_at(mm, addr, ptep, pteval) set_pte((ptep), (pteval)) +#define set_pte_atomic(pteptr, pteval) set_pte((pteptr), (pteval)) + +/* + * (pmds are folded into pgds so this doesn't get actually called, + * but the define is needed for a generic inline function.) + */ +#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval) + +#define ptep_get_and_clear(mm, addr, ptep) \ + __pte(xchg(&(ptep)->pte, 0)) +#define pte_same(a, b) (pte_val(a) == pte_val(b)) +#define pte_page(x) pfn_to_page(pte_pfn(x)) +#define pte_none(x) (!pte_val(x)) +#define pte_pfn(x) ((unsigned long) (pte_val(x) >> PAGE_SHIFT)) +#define __pfn_addr(pfn) ((pfn) << PAGE_SHIFT) +#define pfn_pte(pfn, prot) __pte(__pfn_addr(pfn) | pgprot_val(prot)) +#define pfn_pmd(pfn, prot) __pmd(__pfn_addr(pfn) | pgprot_val(prot)) + +/* + * All present user pages are user-executable: + */ +static inline int pte_exec(pte_t pte) +{ + return pte_user(pte); +} + +/* + * All present pages are kernel-executable: + */ +static inline int pte_exec_kernel(pte_t pte) +{ + return 1; +} + +/* + * Bits 0 and 1 are taken, split up the 29 bits of offset + * into this range: + */ +#define PTE_FILE_MAX_BITS 29 + +#define pte_to_pgoff(pte) (pte_val(pte) >> 2) +#define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE) + +/* Encode and de-code a swap entry */ +#define __swp_type(x) (((x).val >> 2) & 0x3f) +#define __swp_offset(x) ((x).val >> 8) +#define __swp_entry(type, offset) \ + ((swp_entry_t) { ((type) << 2) | ((offset) << 8) }) +#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) +#define __swp_entry_to_pte(x) __pte((x).val) + +static inline +int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, + pte_t *ptep) +{ + if (!pte_dirty(*ptep)) + return 0; + return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte); +} + +static inline +int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, + pte_t *ptep) +{ + if (!pte_young(*ptep)) + return 0; + return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte); +} + +static inline +void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) +{ + pte_val(*ptep) &= ~(__PAGE_PROT_WRITE|__PAGE_PROT_UWAUX); +} + +static inline void ptep_mkdirty(pte_t *ptep) +{ + set_bit(_PAGE_BIT_DIRTY, &ptep->pte); +} + +/* + * Macro to mark a page protection value as "uncacheable". On processors which + * do not support it, this is a no-op. + */ +#define pgprot_noncached(prot) __pgprot(pgprot_val(prot) | _PAGE_CACHE) + + +/* + * Conversion functions: convert a page and protection to a page entry, + * and a page entry and page directory to the page they refer to. + */ + +#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) +#define mk_pte_huge(entry) \ + ((entry).pte |= _PAGE_PRESENT | _PAGE_PSE | _PAGE_VALID) + +static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) +{ + pte_val(pte) &= _PAGE_CHG_MASK; + pte_val(pte) |= pgprot_val(newprot); + return pte; +} + +#define page_pte(page) page_pte_prot((page), __pgprot(0)) + +#define pmd_page_kernel(pmd) \ + ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) + +#define pmd_page(pmd) pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT) + +#define pmd_large(pmd) \ + ((pmd_val(pmd) & (_PAGE_PSE | _PAGE_PRESENT)) == \ + (_PAGE_PSE | _PAGE_PRESENT)) + +/* + * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] + * + * this macro returns the index of the entry in the pgd page which would + * control the given virtual address + */ +#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) + +/* + * pgd_offset() returns a (pgd_t *) + * pgd_index() is used get the offset into the pgd page's array of pgd_t's; + */ +#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) + +/* + * a shortcut which implies the use of the kernel's pgd, instead + * of a process's + */ +#define pgd_offset_k(address) pgd_offset(&init_mm, address) + +/* + * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD] + * + * this macro returns the index of the entry in the pmd page which would + * control the given virtual address + */ +#define pmd_index(address) \ + (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) + +/* + * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] + * + * this macro returns the index of the entry in the pte page which would + * control the given virtual address + */ +#define pte_index(address) \ + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) + +#define pte_offset_kernel(dir, address) \ + ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) + +/* + * Make a given kernel text page executable/non-executable. + * Returns the previous executability setting of that page (which + * is used to restore the previous state). Used by the SMP bootup code. + * NOTE: this is an __init function for security reasons. + */ +static inline int set_kernel_exec(unsigned long vaddr, int enable) +{ + return 0; +} + +#define pte_offset_map(dir, address) \ + ((pte_t *) page_address(pmd_page(*(dir))) + pte_index(address)) +#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address) +#define pte_unmap(pte) do {} while (0) +#define pte_unmap_nested(pte) do {} while (0) + +/* + * The MN10300 has external MMU info in the form of a TLB: this is adapted from + * the kernel page tables containing the necessary information by tlb-mn10300.S + */ +extern void update_mmu_cache(struct vm_area_struct *vma, + unsigned long address, pte_t pte); + +#endif /* !__ASSEMBLY__ */ + +#define kern_addr_valid(addr) (1) + +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ + remap_pfn_range((vma), (vaddr), (pfn), (size), (prot)) + +#define MK_IOSPACE_PFN(space, pfn) (pfn) +#define GET_IOSPACE(pfn) 0 +#define GET_PFN(pfn) (pfn) + +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR +#define __HAVE_ARCH_PTEP_SET_WRPROTECT +#define __HAVE_ARCH_PTEP_MKDIRTY +#define __HAVE_ARCH_PTE_SAME +#include + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_PGTABLE_H */ diff --git a/arch/mn10300/include/asm/pio-regs.h b/arch/mn10300/include/asm/pio-regs.h new file mode 100644 index 0000000..96bc818 --- /dev/null +++ b/arch/mn10300/include/asm/pio-regs.h @@ -0,0 +1,233 @@ +/* MN10300 On-board I/O port module registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PIO_REGS_H +#define _ASM_PIO_REGS_H + +#include +#include + +#ifdef __KERNEL__ + +/* I/O port 0 */ +#define P0MD __SYSREG(0xdb000000, u16) /* mode reg */ +#define P0MD_0 0x0003 /* mask */ +#define P0MD_0_IN 0x0000 /* input mode */ +#define P0MD_0_OUT 0x0001 /* output mode */ +#define P0MD_0_TM0IO 0x0002 /* timer 0 I/O mode */ +#define P0MD_0_EYECLK 0x0003 /* test signal output (clock) */ +#define P0MD_1 0x000c +#define P0MD_1_IN 0x0000 +#define P0MD_1_OUT 0x0004 +#define P0MD_1_TM1IO 0x0008 /* timer 1 I/O mode */ +#define P0MD_1_EYED 0x000c /* test signal output (data) */ +#define P0MD_2 0x0030 +#define P0MD_2_IN 0x0000 +#define P0MD_2_OUT 0x0010 +#define P0MD_2_TM2IO 0x0020 /* timer 2 I/O mode */ +#define P0MD_3 0x00c0 +#define P0MD_3_IN 0x0000 +#define P0MD_3_OUT 0x0040 +#define P0MD_3_TM3IO 0x0080 /* timer 3 I/O mode */ +#define P0MD_4 0x0300 +#define P0MD_4_IN 0x0000 +#define P0MD_4_OUT 0x0100 +#define P0MD_4_TM4IO 0x0200 /* timer 4 I/O mode */ +#define P0MD_4_XCTS 0x0300 /* XCTS input for serial port 2 */ +#define P0MD_5 0x0c00 +#define P0MD_5_IN 0x0000 +#define P0MD_5_OUT 0x0400 +#define P0MD_5_TM5IO 0x0800 /* timer 5 I/O mode */ +#define P0MD_6 0x3000 +#define P0MD_6_IN 0x0000 +#define P0MD_6_OUT 0x1000 +#define P0MD_6_TM6IOA 0x2000 /* timer 6 I/O mode A */ +#define P0MD_7 0xc000 +#define P0MD_7_IN 0x0000 +#define P0MD_7_OUT 0x4000 +#define P0MD_7_TM6IOB 0x8000 /* timer 6 I/O mode B */ + +#define P0IN __SYSREG(0xdb000004, u8) /* in reg */ +#define P0OUT __SYSREG(0xdb000008, u8) /* out reg */ + +#define P0TMIO __SYSREG(0xdb00000c, u8) /* TM pin I/O control reg */ +#define P0TMIO_TM0_IN 0x00 +#define P0TMIO_TM0_OUT 0x01 +#define P0TMIO_TM1_IN 0x00 +#define P0TMIO_TM1_OUT 0x02 +#define P0TMIO_TM2_IN 0x00 +#define P0TMIO_TM2_OUT 0x04 +#define P0TMIO_TM3_IN 0x00 +#define P0TMIO_TM3_OUT 0x08 +#define P0TMIO_TM4_IN 0x00 +#define P0TMIO_TM4_OUT 0x10 +#define P0TMIO_TM5_IN 0x00 +#define P0TMIO_TM5_OUT 0x20 +#define P0TMIO_TM6A_IN 0x00 +#define P0TMIO_TM6A_OUT 0x40 +#define P0TMIO_TM6B_IN 0x00 +#define P0TMIO_TM6B_OUT 0x80 + +/* I/O port 1 */ +#define P1MD __SYSREG(0xdb000100, u16) /* mode reg */ +#define P1MD_0 0x0003 /* mask */ +#define P1MD_0_IN 0x0000 /* input mode */ +#define P1MD_0_OUT 0x0001 /* output mode */ +#define P1MD_0_TM7IO 0x0002 /* timer 7 I/O mode */ +#define P1MD_0_ADTRG 0x0003 /* A/D converter trigger mode */ +#define P1MD_1 0x000c +#define P1MD_1_IN 0x0000 +#define P1MD_1_OUT 0x0004 +#define P1MD_1_TM8IO 0x0008 /* timer 8 I/O mode */ +#define P1MD_1_XDMR0 0x000c /* DMA request input 0 mode */ +#define P1MD_2 0x0030 +#define P1MD_2_IN 0x0000 +#define P1MD_2_OUT 0x0010 +#define P1MD_2_TM9IO 0x0020 /* timer 9 I/O mode */ +#define P1MD_2_XDMR1 0x0030 /* DMA request input 1 mode */ +#define P1MD_3 0x00c0 +#define P1MD_3_IN 0x0000 +#define P1MD_3_OUT 0x0040 +#define P1MD_3_TM10IO 0x0080 /* timer 10 I/O mode */ +#define P1MD_3_FRQS0 0x00c0 /* CPU clock multiplier setting input 0 mode */ +#define P1MD_4 0x0300 +#define P1MD_4_IN 0x0000 +#define P1MD_4_OUT 0x0100 +#define P1MD_4_TM11IO 0x0200 /* timer 11 I/O mode */ +#define P1MD_4_FRQS1 0x0300 /* CPU clock multiplier setting input 1 mode */ + +#define P1IN __SYSREG(0xdb000104, u8) /* in reg */ +#define P1OUT __SYSREG(0xdb000108, u8) /* out reg */ +#define P1TMIO __SYSREG(0xdb00010c, u8) /* TM pin I/O control reg */ +#define P1TMIO_TM11_IN 0x00 +#define P1TMIO_TM11_OUT 0x01 +#define P1TMIO_TM10_IN 0x00 +#define P1TMIO_TM10_OUT 0x02 +#define P1TMIO_TM9_IN 0x00 +#define P1TMIO_TM9_OUT 0x04 +#define P1TMIO_TM8_IN 0x00 +#define P1TMIO_TM8_OUT 0x08 +#define P1TMIO_TM7_IN 0x00 +#define P1TMIO_TM7_OUT 0x10 + +/* I/O port 2 */ +#define P2MD __SYSREG(0xdb000200, u16) /* mode reg */ +#define P2MD_0 0x0003 /* mask */ +#define P2MD_0_IN 0x0000 /* input mode */ +#define P2MD_0_OUT 0x0001 /* output mode */ +#define P2MD_0_BOOTBW 0x0003 /* boot bus width selector mode */ +#define P2MD_1 0x000c +#define P2MD_1_IN 0x0000 +#define P2MD_1_OUT 0x0004 +#define P2MD_1_BOOTSEL 0x000c /* boot device selector mode */ +#define P2MD_2 0x0030 +#define P2MD_2_IN 0x0000 +#define P2MD_2_OUT 0x0010 +#define P2MD_3 0x00c0 +#define P2MD_3_IN 0x0000 +#define P2MD_3_OUT 0x0040 +#define P2MD_3_CKIO 0x00c0 /* mode */ +#define P2MD_4 0x0300 +#define P2MD_4_IN 0x0000 +#define P2MD_4_OUT 0x0100 +#define P2MD_4_CMOD 0x0300 /* mode */ + +#define P2IN __SYSREG(0xdb000204, u8) /* in reg */ +#define P2OUT __SYSREG(0xdb000208, u8) /* out reg */ +#define P2TMIO __SYSREG(0xdb00020c, u8) /* TM pin I/O control reg */ + +/* I/O port 3 */ +#define P3MD __SYSREG(0xdb000300, u16) /* mode reg */ +#define P3MD_0 0x0003 /* mask */ +#define P3MD_0_IN 0x0000 /* input mode */ +#define P3MD_0_OUT 0x0001 /* output mode */ +#define P3MD_0_AFRXD 0x0002 /* AFR interface mode */ +#define P3MD_1 0x000c +#define P3MD_1_IN 0x0000 +#define P3MD_1_OUT 0x0004 +#define P3MD_1_AFTXD 0x0008 /* AFR interface mode */ +#define P3MD_2 0x0030 +#define P3MD_2_IN 0x0000 +#define P3MD_2_OUT 0x0010 +#define P3MD_2_AFSCLK 0x0020 /* AFR interface mode */ +#define P3MD_3 0x00c0 +#define P3MD_3_IN 0x0000 +#define P3MD_3_OUT 0x0040 +#define P3MD_3_AFFS 0x0080 /* AFR interface mode */ +#define P3MD_4 0x0300 +#define P3MD_4_IN 0x0000 +#define P3MD_4_OUT 0x0100 +#define P3MD_4_AFEHC 0x0200 /* AFR interface mode */ + +#define P3IN __SYSREG(0xdb000304, u8) /* in reg */ +#define P3OUT __SYSREG(0xdb000308, u8) /* out reg */ + +/* I/O port 4 */ +#define P4MD __SYSREG(0xdb000400, u16) /* mode reg */ +#define P4MD_0 0x0003 /* mask */ +#define P4MD_0_IN 0x0000 /* input mode */ +#define P4MD_0_OUT 0x0001 /* output mode */ +#define P4MD_0_SCL0 0x0002 /* I2C/serial mode */ +#define P4MD_1 0x000c +#define P4MD_1_IN 0x0000 +#define P4MD_1_OUT 0x0004 +#define P4MD_1_SDA0 0x0008 +#define P4MD_2 0x0030 +#define P4MD_2_IN 0x0000 +#define P4MD_2_OUT 0x0010 +#define P4MD_2_SCL1 0x0020 +#define P4MD_3 0x00c0 +#define P4MD_3_IN 0x0000 +#define P4MD_3_OUT 0x0040 +#define P4MD_3_SDA1 0x0080 +#define P4MD_4 0x0300 +#define P4MD_4_IN 0x0000 +#define P4MD_4_OUT 0x0100 +#define P4MD_4_SBO0 0x0200 +#define P4MD_5 0x0c00 +#define P4MD_5_IN 0x0000 +#define P4MD_5_OUT 0x0400 +#define P4MD_5_SBO1 0x0800 +#define P4MD_6 0x3000 +#define P4MD_6_IN 0x0000 +#define P4MD_6_OUT 0x1000 +#define P4MD_6_SBT0 0x2000 +#define P4MD_7 0xc000 +#define P4MD_7_IN 0x0000 +#define P4MD_7_OUT 0x4000 +#define P4MD_7_SBT1 0x8000 + +#define P4IN __SYSREG(0xdb000404, u8) /* in reg */ +#define P4OUT __SYSREG(0xdb000408, u8) /* out reg */ + +/* I/O port 5 */ +#define P5MD __SYSREG(0xdb000500, u16) /* mode reg */ +#define P5MD_0 0x0003 /* mask */ +#define P5MD_0_IN 0x0000 /* input mode */ +#define P5MD_0_OUT 0x0001 /* output mode */ +#define P5MD_0_IRTXD 0x0002 /* IrDA mode */ +#define P5MD_0_SOUT 0x0004 /* serial mode */ +#define P5MD_1 0x000c +#define P5MD_1_IN 0x0000 +#define P5MD_1_OUT 0x0004 +#define P5MD_1_IRRXDS 0x0008 /* IrDA mode */ +#define P5MD_1_SIN 0x000c /* serial mode */ +#define P5MD_2 0x0030 +#define P5MD_2_IN 0x0000 +#define P5MD_2_OUT 0x0010 +#define P5MD_2_IRRXDF 0x0020 /* IrDA mode */ + +#define P5IN __SYSREG(0xdb000504, u8) /* in reg */ +#define P5OUT __SYSREG(0xdb000508, u8) /* out reg */ + + +#endif /* __KERNEL__ */ + +#endif /* _ASM_PIO_REGS_H */ diff --git a/arch/mn10300/include/asm/poll.h b/arch/mn10300/include/asm/poll.h new file mode 100644 index 0000000..c98509d --- /dev/null +++ b/arch/mn10300/include/asm/poll.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/posix_types.h b/arch/mn10300/include/asm/posix_types.h new file mode 100644 index 0000000..077567c --- /dev/null +++ b/arch/mn10300/include/asm/posix_types.h @@ -0,0 +1,132 @@ +/* MN10300 POSIX types + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_POSIX_TYPES_H +#define _ASM_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc. Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +typedef unsigned long __kernel_size_t; +typedef long __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_timer_t; +typedef int __kernel_clockid_t; +typedef int __kernel_daddr_t; +typedef char * __kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; +typedef unsigned int __kernel_uid32_t; +typedef unsigned int __kernel_gid32_t; + +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; +typedef unsigned short __kernel_old_dev_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +typedef struct { +#if defined(__KERNEL__) || defined(__USE_ALL) + int val[2]; +#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ + int __val[2]; +#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ +} __kernel_fsid_t; + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + +#undef __FD_SET +static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) +{ + unsigned long __tmp = __fd / __NFDBITS; + unsigned long __rem = __fd % __NFDBITS; + __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); +} + +#undef __FD_CLR +static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) +{ + unsigned long __tmp = __fd / __NFDBITS; + unsigned long __rem = __fd % __NFDBITS; + __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); +} + + +#undef __FD_ISSET +static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) +{ + unsigned long __tmp = __fd / __NFDBITS; + unsigned long __rem = __fd % __NFDBITS; + return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; +} + +/* + * This will unroll the loop for the normal constant case (8 ints, + * for a 256-bit fd_set) + */ +#undef __FD_ZERO +static inline void __FD_ZERO(__kernel_fd_set *__p) +{ + unsigned long *__tmp = __p->fds_bits; + int __i; + + if (__builtin_constant_p(__FDSET_LONGS)) { + switch (__FDSET_LONGS) { + case 16: + __tmp[ 0] = 0; __tmp[ 1] = 0; + __tmp[ 2] = 0; __tmp[ 3] = 0; + __tmp[ 4] = 0; __tmp[ 5] = 0; + __tmp[ 6] = 0; __tmp[ 7] = 0; + __tmp[ 8] = 0; __tmp[ 9] = 0; + __tmp[10] = 0; __tmp[11] = 0; + __tmp[12] = 0; __tmp[13] = 0; + __tmp[14] = 0; __tmp[15] = 0; + return; + + case 8: + __tmp[ 0] = 0; __tmp[ 1] = 0; + __tmp[ 2] = 0; __tmp[ 3] = 0; + __tmp[ 4] = 0; __tmp[ 5] = 0; + __tmp[ 6] = 0; __tmp[ 7] = 0; + return; + + case 4: + __tmp[ 0] = 0; __tmp[ 1] = 0; + __tmp[ 2] = 0; __tmp[ 3] = 0; + return; + } + } + __i = __FDSET_LONGS; + while (__i) { + __i--; + *__tmp = 0; + __tmp++; + } +} + +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + +#endif /* _ASM_POSIX_TYPES_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/cache.h b/arch/mn10300/include/asm/proc-mn103e010/cache.h new file mode 100644 index 0000000..bdc1f9a --- /dev/null +++ b/arch/mn10300/include/asm/proc-mn103e010/cache.h @@ -0,0 +1,33 @@ +/* MN103E010 Cache specification + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PROC_CACHE_H +#define _ASM_PROC_CACHE_H + +/* L1 cache */ + +#define L1_CACHE_NWAYS 4 /* number of ways in caches */ +#define L1_CACHE_NENTRIES 256 /* number of entries in each way */ +#define L1_CACHE_BYTES 16 /* bytes per entry */ +#define L1_CACHE_SHIFT 4 /* shift for bytes per entry */ +#define L1_CACHE_WAYDISP 0x1000 /* displacement of one way from the next */ + +#define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ +#define L1_CACHE_TAG_DIRTY 0x00000008 /* data cache tag dirty bit */ +#define L1_CACHE_TAG_ENTRY 0x00000ff0 /* cache tag entry address mask */ +#define L1_CACHE_TAG_ADDRESS 0xfffff000 /* cache tag line address mask */ + +/* + * specification of the interval between interrupt checking intervals whilst + * managing the cache with the interrupts disabled + */ +#define MN10300_DCACHE_INV_RANGE_INTR_LOG2_INTERVAL 4 + +#endif /* _ASM_PROC_CACHE_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/clock.h b/arch/mn10300/include/asm/proc-mn103e010/clock.h new file mode 100644 index 0000000..caf9983 --- /dev/null +++ b/arch/mn10300/include/asm/proc-mn103e010/clock.h @@ -0,0 +1,18 @@ +/* MN103E010-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PROC_CLOCK_H +#define _ASM_PROC_CLOCK_H + +#include + +#define MN10300_WDCLK MN10300_IOCLK + +#endif /* _ASM_PROC_CLOCK_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/irq.h b/arch/mn10300/include/asm/proc-mn103e010/irq.h new file mode 100644 index 0000000..aa6ee8f --- /dev/null +++ b/arch/mn10300/include/asm/proc-mn103e010/irq.h @@ -0,0 +1,34 @@ +/* MN103E010 On-board interrupt controller numbers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_PROC_IRQ_H +#define _ASM_PROC_IRQ_H + +#ifdef __KERNEL__ + +#define GxICR_NUM_IRQS 42 + +#define GxICR_NUM_XIRQS 8 + +#define XIRQ0 34 +#define XIRQ1 35 +#define XIRQ2 36 +#define XIRQ3 37 +#define XIRQ4 38 +#define XIRQ5 39 +#define XIRQ6 40 +#define XIRQ7 41 + +#define XIRQ2IRQ(num) (XIRQ0 + num) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_PROC_IRQ_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/proc.h b/arch/mn10300/include/asm/proc-mn103e010/proc.h new file mode 100644 index 0000000..22a2b93 --- /dev/null +++ b/arch/mn10300/include/asm/proc-mn103e010/proc.h @@ -0,0 +1,18 @@ +/* MN103E010 Processor description + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_PROC_PROC_H +#define _ASM_PROC_PROC_H + +#define PROCESSOR_VENDOR_NAME "Matsushita" +#define PROCESSOR_MODEL_NAME "mn103e010" + +#endif /* _ASM_PROC_PROC_H */ diff --git a/arch/mn10300/include/asm/processor.h b/arch/mn10300/include/asm/processor.h new file mode 100644 index 0000000..7323927 --- /dev/null +++ b/arch/mn10300/include/asm/processor.h @@ -0,0 +1,186 @@ +/* MN10300 Processor specifics + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_PROCESSOR_H +#define _ASM_PROCESSOR_H + +#include +#include +#include +#include + +/* Forward declaration, a strange C thing */ +struct task_struct; +struct mm_struct; + +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +#define current_text_addr() \ +({ \ + void *__pc; \ + asm("mov pc,%0" : "=a"(__pc)); \ + __pc; \ +}) + +extern void show_registers(struct pt_regs *regs); + +/* + * CPU type and hardware bug flags. Kept separately for each CPU. + * Members of this structure are referenced in head.S, so think twice + * before touching them. [mj] + */ + +struct mn10300_cpuinfo { + int type; + unsigned long loops_per_sec; + char hard_math; + unsigned long *pgd_quick; + unsigned long *pte_quick; + unsigned long pgtable_cache_sz; +}; + +extern struct mn10300_cpuinfo boot_cpu_data; + +#define cpu_data &boot_cpu_data +#define current_cpu_data boot_cpu_data + +extern void identify_cpu(struct mn10300_cpuinfo *); +extern void print_cpu_info(struct mn10300_cpuinfo *); +extern void dodgy_tsc(void); +#define cpu_relax() barrier() + +/* + * User space process size: 1.75GB (default). + */ +#define TASK_SIZE 0x70000000 + +/* + * Where to put the userspace stack by default + */ +#define STACK_TOP 0x70000000 +#define STACK_TOP_MAX STACK_TOP + +/* This decides where the kernel will search for a free chunk of vm + * space during mmap's. + */ +#define TASK_UNMAPPED_BASE 0x30000000 + +typedef struct { + unsigned long seg; +} mm_segment_t; + +struct fpu_state_struct { + unsigned long fs[32]; /* fpu registers */ + unsigned long fpcr; /* fpu control register */ +}; + +struct thread_struct { + struct pt_regs *uregs; /* userspace register frame */ + unsigned long pc; /* kernel PC */ + unsigned long sp; /* kernel SP */ + unsigned long a3; /* kernel FP */ + unsigned long wchan; + unsigned long usp; + struct pt_regs *__frame; + unsigned long fpu_flags; +#define THREAD_USING_FPU 0x00000001 /* T if this task is using the FPU */ + struct fpu_state_struct fpu_state; +}; + +#define INIT_THREAD \ +{ \ + .uregs = init_uregs, \ + .pc = 0, \ + .sp = 0, \ + .a3 = 0, \ + .wchan = 0, \ + .__frame = NULL, \ +} + +#define INIT_MMAP \ +{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \ + NULL, NULL } + +/* + * do necessary setup to start up a newly executed thread + * - need to discard the frame stacked by the kernel thread invoking the execve + * syscall (see RESTORE_ALL macro) + */ +#define start_thread(regs, new_pc, new_sp) do { \ + set_fs(USER_DS); \ + __frame = current->thread.uregs; \ + __frame->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; \ + __frame->pc = new_pc; \ + __frame->sp = new_sp; \ +} while (0) + +/* Free all resources held by a thread. */ +extern void release_thread(struct task_struct *); + +/* Prepare to copy thread state - unlazy all lazy status */ +extern void prepare_to_copy(struct task_struct *tsk); + +/* + * create a kernel thread without removing it from tasklists + */ +extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); + +/* + * Return saved PC of a blocked thread. + */ +extern unsigned long thread_saved_pc(struct task_struct *tsk); + +unsigned long get_wchan(struct task_struct *p); + +#define task_pt_regs(task) \ +({ \ + struct pt_regs *__regs__; \ + __regs__ = (struct pt_regs *) (KSTK_TOP(task_stack_page(task)) - 8); \ + __regs__ - 1; \ +}) + +#define KSTK_EIP(task) (task_pt_regs(task)->pc) +#define KSTK_ESP(task) (task_pt_regs(task)->sp) + +#define KSTK_TOP(info) \ +({ \ + (unsigned long)(info) + THREAD_SIZE; \ +}) + +#define ARCH_HAS_PREFETCH +#define ARCH_HAS_PREFETCHW + +static inline void prefetch(const void *x) +{ +#ifndef CONFIG_MN10300_CACHE_DISABLED +#ifdef CONFIG_MN10300_PROC_MN103E010 + asm volatile ("nop; nop; dcpf (%0)" : : "r"(x)); +#else + asm volatile ("dcpf (%0)" : : "r"(x)); +#endif +#endif +} + +static inline void prefetchw(const void *x) +{ +#ifndef CONFIG_MN10300_CACHE_DISABLED +#ifdef CONFIG_MN10300_PROC_MN103E010 + asm volatile ("nop; nop; dcpf (%0)" : : "r"(x)); +#else + asm volatile ("dcpf (%0)" : : "r"(x)); +#endif +#endif +} + +#endif /* _ASM_PROCESSOR_H */ diff --git a/arch/mn10300/include/asm/ptrace.h b/arch/mn10300/include/asm/ptrace.h new file mode 100644 index 0000000..7b06cc6 --- /dev/null +++ b/arch/mn10300/include/asm/ptrace.h @@ -0,0 +1,103 @@ +/* MN10300 Exception frame layout and ptrace constants + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PTRACE_H +#define _ASM_PTRACE_H + +#define PT_A3 0 +#define PT_A2 1 +#define PT_D3 2 +#define PT_D2 3 +#define PT_MCVF 4 +#define PT_MCRL 5 +#define PT_MCRH 6 +#define PT_MDRQ 7 +#define PT_E1 8 +#define PT_E0 9 +#define PT_E7 10 +#define PT_E6 11 +#define PT_E5 12 +#define PT_E4 13 +#define PT_E3 14 +#define PT_E2 15 +#define PT_SP 16 +#define PT_LAR 17 +#define PT_LIR 18 +#define PT_MDR 19 +#define PT_A1 20 +#define PT_A0 21 +#define PT_D1 22 +#define PT_D0 23 +#define PT_ORIG_D0 24 +#define PT_EPSW 25 +#define PT_PC 26 +#define NR_PTREGS 27 + +#ifndef __ASSEMBLY__ +/* + * This defines the way registers are stored in the event of an exception + * - the strange order is due to the MOVM instruction + */ +struct pt_regs { + unsigned long a3; /* syscall arg 3 */ + unsigned long a2; /* syscall arg 4 */ + unsigned long d3; /* syscall arg 5 */ + unsigned long d2; /* syscall arg 6 */ + unsigned long mcvf; + unsigned long mcrl; + unsigned long mcrh; + unsigned long mdrq; + unsigned long e1; + unsigned long e0; + unsigned long e7; + unsigned long e6; + unsigned long e5; + unsigned long e4; + unsigned long e3; + unsigned long e2; + unsigned long sp; + unsigned long lar; + unsigned long lir; + unsigned long mdr; + unsigned long a1; + unsigned long a0; /* syscall arg 1 */ + unsigned long d1; /* syscall arg 2 */ + unsigned long d0; /* syscall ret */ + struct pt_regs *next; /* next frame pointer */ + unsigned long orig_d0; /* syscall number */ + unsigned long epsw; + unsigned long pc; +}; +#endif + +extern struct pt_regs *__frame; /* current frame pointer */ + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 + +/* options set using PTRACE_SETOPTIONS */ +#define PTRACE_O_TRACESYSGOOD 0x00000001 + +#if defined(__KERNEL__) + +#if !defined(__ASSEMBLY__) +#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) +#define instruction_pointer(regs) ((regs)->pc) +extern void show_regs(struct pt_regs *); +#endif /* !__ASSEMBLY */ + +#define profile_pc(regs) ((regs)->pc) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_PTRACE_H */ diff --git a/arch/mn10300/include/asm/reset-regs.h b/arch/mn10300/include/asm/reset-regs.h new file mode 100644 index 0000000..174523d --- /dev/null +++ b/arch/mn10300/include/asm/reset-regs.h @@ -0,0 +1,64 @@ +/* MN10300 Reset controller and watchdog timer definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_RESET_REGS_H +#define _ASM_RESET_REGS_H + +#include +#include + +#ifdef __KERNEL__ + +#ifdef CONFIG_MN10300_WD_TIMER +#define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ +#endif + +/* + * watchdog timer registers + */ +#define WDBC __SYSREGC(0xc0001000, u8) /* watchdog binary counter reg */ + +#define WDCTR __SYSREG(0xc0001002, u8) /* watchdog timer control reg */ +#define WDCTR_WDCK 0x07 /* clock source selection */ +#define WDCTR_WDCK_256th 0x00 /* - OSCI/256 */ +#define WDCTR_WDCK_1024th 0x01 /* - OSCI/1024 */ +#define WDCTR_WDCK_2048th 0x02 /* - OSCI/2048 */ +#define WDCTR_WDCK_16384th 0x03 /* - OSCI/16384 */ +#define WDCTR_WDCK_65536th 0x04 /* - OSCI/65536 */ +#define WDCTR_WDRST 0x40 /* binary counter reset */ +#define WDCTR_WDCNE 0x80 /* watchdog timer enable */ + +#define RSTCTR __SYSREG(0xc0001004, u8) /* reset control reg */ +#define RSTCTR_CHIPRST 0x01 /* chip reset */ +#define RSTCTR_DBFRST 0x02 /* double fault reset flag */ +#define RSTCTR_WDTRST 0x04 /* watchdog timer reset flag */ +#define RSTCTR_WDREN 0x08 /* watchdog timer reset enable */ + +#ifndef __ASSEMBLY__ + +static inline void mn10300_proc_hard_reset(void) +{ + RSTCTR &= ~RSTCTR_CHIPRST; + RSTCTR |= RSTCTR_CHIPRST; +} + +extern unsigned int watchdog_alert_counter; + +extern void watchdog_go(void); +extern asmlinkage void watchdog_handler(void); +extern asmlinkage +void watchdog_interrupt(struct pt_regs *, enum exception_code); + +#endif + +#endif /* __KERNEL__ */ + +#endif /* _ASM_RESET_REGS_H */ diff --git a/arch/mn10300/include/asm/resource.h b/arch/mn10300/include/asm/resource.h new file mode 100644 index 0000000..04bc4db --- /dev/null +++ b/arch/mn10300/include/asm/resource.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/rtc-regs.h b/arch/mn10300/include/asm/rtc-regs.h new file mode 100644 index 0000000..c42deef --- /dev/null +++ b/arch/mn10300/include/asm/rtc-regs.h @@ -0,0 +1,86 @@ +/* MN10300 on-chip Real-Time Clock registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_RTC_REGS_H +#define _ASM_RTC_REGS_H + +#include + +#ifdef __KERNEL__ + +#define RTSCR __SYSREG(0xd8600000, u8) /* RTC seconds count reg */ +#define RTSAR __SYSREG(0xd8600001, u8) /* RTC seconds alarm reg */ +#define RTMCR __SYSREG(0xd8600002, u8) /* RTC minutes count reg */ +#define RTMAR __SYSREG(0xd8600003, u8) /* RTC minutes alarm reg */ +#define RTHCR __SYSREG(0xd8600004, u8) /* RTC hours count reg */ +#define RTHAR __SYSREG(0xd8600005, u8) /* RTC hours alarm reg */ +#define RTDWCR __SYSREG(0xd8600006, u8) /* RTC day of the week count reg */ +#define RTDMCR __SYSREG(0xd8600007, u8) /* RTC days count reg */ +#define RTMTCR __SYSREG(0xd8600008, u8) /* RTC months count reg */ +#define RTYCR __SYSREG(0xd8600009, u8) /* RTC years count reg */ + +#define RTCRA __SYSREG(0xd860000a, u8)/* RTC control reg A */ +#define RTCRA_RS 0x0f /* periodic timer interrupt cycle setting */ +#define RTCRA_RS_NONE 0x00 /* - off */ +#define RTCRA_RS_3_90625ms 0x01 /* - 3.90625ms (1/256s) */ +#define RTCRA_RS_7_8125ms 0x02 /* - 7.8125ms (1/128s) */ +#define RTCRA_RS_122_070us 0x03 /* - 122.070us (1/8192s) */ +#define RTCRA_RS_244_141us 0x04 /* - 244.141us (1/4096s) */ +#define RTCRA_RS_488_281us 0x05 /* - 488.281us (1/2048s) */ +#define RTCRA_RS_976_5625us 0x06 /* - 976.5625us (1/1024s) */ +#define RTCRA_RS_1_953125ms 0x07 /* - 1.953125ms (1/512s) */ +#define RTCRA_RS_3_90624ms 0x08 /* - 3.90624ms (1/256s) */ +#define RTCRA_RS_7_8125ms_b 0x09 /* - 7.8125ms (1/128s) */ +#define RTCRA_RS_15_625ms 0x0a /* - 15.625ms (1/64s) */ +#define RTCRA_RS_31_25ms 0x0b /* - 31.25ms (1/32s) */ +#define RTCRA_RS_62_5ms 0x0c /* - 62.5ms (1/16s) */ +#define RTCRA_RS_125ms 0x0d /* - 125ms (1/8s) */ +#define RTCRA_RS_250ms 0x0e /* - 250ms (1/4s) */ +#define RTCRA_RS_500ms 0x0f /* - 500ms (1/2s) */ +#define RTCRA_DVR 0x40 /* divider reset */ +#define RTCRA_UIP 0x80 /* clock update flag */ + +#define RTCRB __SYSREG(0xd860000b, u8) /* RTC control reg B */ +#define RTCRB_DSE 0x01 /* daylight savings time enable */ +#define RTCRB_TM 0x02 /* time format */ +#define RTCRB_TM_12HR 0x00 /* - 12 hour format */ +#define RTCRB_TM_24HR 0x02 /* - 24 hour format */ +#define RTCRB_DM 0x04 /* numeric value format */ +#define RTCRB_DM_BCD 0x00 /* - BCD */ +#define RTCRB_DM_BINARY 0x04 /* - binary */ +#define RTCRB_UIE 0x10 /* update interrupt disable */ +#define RTCRB_AIE 0x20 /* alarm interrupt disable */ +#define RTCRB_PIE 0x40 /* periodic interrupt disable */ +#define RTCRB_SET 0x80 /* clock update enable */ + +#define RTSRC __SYSREG(0xd860000c, u8) /* RTC status reg C */ +#define RTSRC_UF 0x10 /* update end interrupt flag */ +#define RTSRC_AF 0x20 /* alarm interrupt flag */ +#define RTSRC_PF 0x40 /* periodic interrupt flag */ +#define RTSRC_IRQF 0x80 /* interrupt flag */ + +#define RTIRQ 32 +#define RTICR GxICR(RTIRQ) + +/* + * MC146818 RTC compatibility defs for the MN10300 on-chip RTC + */ +#define RTC_PORT(x) 0xd8600000 +#define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ + +#define CMOS_READ(addr) __SYSREG(0xd8600000 + (addr), u8) +#define CMOS_WRITE(val, addr) \ + do { __SYSREG(0xd8600000 + (addr), u8) = val; } while (0) + +#define RTC_IRQ RTIRQ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_RTC_REGS_H */ diff --git a/arch/mn10300/include/asm/rtc.h b/arch/mn10300/include/asm/rtc.h new file mode 100644 index 0000000..c295194 --- /dev/null +++ b/arch/mn10300/include/asm/rtc.h @@ -0,0 +1,41 @@ +/* MN10300 Real time clock definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_RTC_H +#define _ASM_RTC_H + +#ifdef CONFIG_MN10300_RTC + +#include + +extern void check_rtc_time(void); +extern void __init calibrate_clock(void); +extern unsigned long __init get_initial_rtc_time(void); + +#else /* !CONFIG_MN10300_RTC */ + +static inline void check_rtc_time(void) +{ +} + +static inline void calibrate_clock(void) +{ +} + +static inline unsigned long get_initial_rtc_time(void) +{ + return 0; +} + +#endif /* !CONFIG_MN10300_RTC */ + +#include + +#endif /* _ASM_RTC_H */ diff --git a/arch/mn10300/include/asm/scatterlist.h b/arch/mn10300/include/asm/scatterlist.h new file mode 100644 index 0000000..6753590 --- /dev/null +++ b/arch/mn10300/include/asm/scatterlist.h @@ -0,0 +1,55 @@ +/* MN10300 Scatterlist definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SCATTERLIST_H +#define _ASM_SCATTERLIST_H + +#include + +/* + * Drivers must set either ->address or (preferred) page and ->offset + * to indicate where data must be transferred to/from. + * + * Using page is recommended since it handles highmem data as well as + * low mem. ->address is restricted to data which has a virtual mapping, and + * it will go away in the future. Updating to page can be automated very + * easily -- something like + * + * sg->address = some_ptr; + * + * can be rewritten as + * + * sg_set_page(virt_to_page(some_ptr)); + * sg->offset = (unsigned long) some_ptr & ~PAGE_MASK; + * + * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens + */ +struct scatterlist { +#ifdef CONFIG_DEBUG_SG + unsigned long sg_magic; +#endif + unsigned long page_link; + unsigned int offset; /* for highmem, page offset */ + dma_addr_t dma_address; + unsigned int length; +}; + +#define ISA_DMA_THRESHOLD (0x00ffffff) + +/* + * These macros should be used after a pci_map_sg call has been done + * to get bus addresses of each of the SG entries and their lengths. + * You should only work with the number of sg entries pci_map_sg + * returns. + */ +#define sg_dma_address(sg) ((sg)->dma_address) +#define sg_dma_len(sg) ((sg)->length) + +#endif /* _ASM_SCATTERLIST_H */ diff --git a/arch/mn10300/include/asm/sections.h b/arch/mn10300/include/asm/sections.h new file mode 100644 index 0000000..2b8c516 --- /dev/null +++ b/arch/mn10300/include/asm/sections.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/sembuf.h b/arch/mn10300/include/asm/sembuf.h new file mode 100644 index 0000000..301f3f9 --- /dev/null +++ b/arch/mn10300/include/asm/sembuf.h @@ -0,0 +1,25 @@ +#ifndef _ASM_SEMBUF_H +#define _ASM_SEMBUF_H + +/* + * The semid64_ds structure for MN10300 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct semid64_ds { + struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ + __kernel_time_t sem_otime; /* last semop time */ + unsigned long __unused1; + __kernel_time_t sem_ctime; /* last change time */ + unsigned long __unused2; + unsigned long sem_nsems; /* no. of semaphores in array */ + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _ASM_SEMBUF_H */ diff --git a/arch/mn10300/include/asm/serial-regs.h b/arch/mn10300/include/asm/serial-regs.h new file mode 100644 index 0000000..6498469 --- /dev/null +++ b/arch/mn10300/include/asm/serial-regs.h @@ -0,0 +1,160 @@ +/* MN10300 on-board serial port module registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_SERIAL_REGS_H +#define _ASM_SERIAL_REGS_H + +#include +#include + +#ifdef __KERNEL__ + +/* serial port 0 */ +#define SC0CTR __SYSREG(0xd4002000, u16) /* control reg */ +#define SC01CTR_CK 0x0007 /* clock source select */ +#define SC0CTR_CK_TM8UFLOW_8 0x0000 /* - 1/8 timer 8 underflow (serial port 0 only) */ +#define SC1CTR_CK_TM9UFLOW_8 0x0000 /* - 1/8 timer 9 underflow (serial port 1 only) */ +#define SC01CTR_CK_IOCLK_8 0x0001 /* - 1/8 IOCLK */ +#define SC01CTR_CK_IOCLK_32 0x0002 /* - 1/32 IOCLK */ +#define SC0CTR_CK_TM2UFLOW_2 0x0003 /* - 1/2 timer 2 underflow (serial port 0 only) */ +#define SC1CTR_CK_TM3UFLOW_2 0x0003 /* - 1/2 timer 3 underflow (serial port 1 only) */ +#define SC0CTR_CK_TM0UFLOW_8 0x0004 /* - 1/8 timer 1 underflow (serial port 0 only) */ +#define SC1CTR_CK_TM1UFLOW_8 0x0004 /* - 1/8 timer 2 underflow (serial port 1 only) */ +#define SC0CTR_CK_TM2UFLOW_8 0x0005 /* - 1/8 timer 2 underflow (serial port 0 only) */ +#define SC1CTR_CK_TM3UFLOW_8 0x0005 /* - 1/8 timer 3 underflow (serial port 1 only) */ +#define SC01CTR_CK_EXTERN_8 0x0006 /* - 1/8 external closk */ +#define SC01CTR_CK_EXTERN 0x0007 /* - external closk */ +#define SC01CTR_STB 0x0008 /* stop bit select */ +#define SC01CTR_STB_1BIT 0x0000 /* - 1 stop bit */ +#define SC01CTR_STB_2BIT 0x0008 /* - 2 stop bits */ +#define SC01CTR_PB 0x0070 /* parity bit select */ +#define SC01CTR_PB_NONE 0x0000 /* - no parity */ +#define SC01CTR_PB_FIXED0 0x0040 /* - fixed at 0 */ +#define SC01CTR_PB_FIXED1 0x0050 /* - fixed at 1 */ +#define SC01CTR_PB_EVEN 0x0060 /* - even parity */ +#define SC01CTR_PB_ODD 0x0070 /* - odd parity */ +#define SC01CTR_CLN 0x0080 /* character length */ +#define SC01CTR_CLN_7BIT 0x0000 /* - 7 bit chars */ +#define SC01CTR_CLN_8BIT 0x0080 /* - 8 bit chars */ +#define SC01CTR_TOE 0x0100 /* T input output enable */ +#define SC01CTR_OD 0x0200 /* bit order select */ +#define SC01CTR_OD_LSBFIRST 0x0000 /* - LSB first */ +#define SC01CTR_OD_MSBFIRST 0x0200 /* - MSB first */ +#define SC01CTR_MD 0x0c00 /* mode select */ +#define SC01CTR_MD_STST_SYNC 0x0000 /* - start-stop synchronous */ +#define SC01CTR_MD_CLOCK_SYNC1 0x0400 /* - clock synchronous 1 */ +#define SC01CTR_MD_I2C 0x0800 /* - I2C mode */ +#define SC01CTR_MD_CLOCK_SYNC2 0x0c00 /* - clock synchronous 2 */ +#define SC01CTR_IIC 0x1000 /* I2C mode select */ +#define SC01CTR_BKE 0x2000 /* break transmit enable */ +#define SC01CTR_RXE 0x4000 /* receive enable */ +#define SC01CTR_TXE 0x8000 /* transmit enable */ + +#define SC0ICR __SYSREG(0xd4002004, u8) /* interrupt control reg */ +#define SC01ICR_DMD 0x80 /* output data mode */ +#define SC01ICR_TD 0x20 /* transmit DMA trigger cause */ +#define SC01ICR_TI 0x10 /* transmit interrupt cause */ +#define SC01ICR_RES 0x04 /* receive error select */ +#define SC01ICR_RI 0x01 /* receive interrupt cause */ + +#define SC0TXB __SYSREG(0xd4002008, u8) /* transmit buffer reg */ +#define SC0RXB __SYSREG(0xd4002009, u8) /* receive buffer reg */ + +#define SC0STR __SYSREG(0xd400200c, u16) /* status reg */ +#define SC01STR_OEF 0x0001 /* overrun error found */ +#define SC01STR_PEF 0x0002 /* parity error found */ +#define SC01STR_FEF 0x0004 /* framing error found */ +#define SC01STR_RBF 0x0010 /* receive buffer status */ +#define SC01STR_TBF 0x0020 /* transmit buffer status */ +#define SC01STR_RXF 0x0040 /* receive status */ +#define SC01STR_TXF 0x0080 /* transmit status */ +#define SC01STR_STF 0x0100 /* I2C start sequence found */ +#define SC01STR_SPF 0x0200 /* I2C stop sequence found */ + +#define SC0RXIRQ 20 /* timer 0 Receive IRQ */ +#define SC0TXIRQ 21 /* timer 0 Transmit IRQ */ + +#define SC0RXICR GxICR(SC0RXIRQ) /* serial 0 receive intr ctrl reg */ +#define SC0TXICR GxICR(SC0TXIRQ) /* serial 0 transmit intr ctrl reg */ + +/* serial port 1 */ +#define SC1CTR __SYSREG(0xd4002010, u16) /* serial port 1 control */ +#define SC1ICR __SYSREG(0xd4002014, u8) /* interrupt control reg */ +#define SC1TXB __SYSREG(0xd4002018, u8) /* transmit buffer reg */ +#define SC1RXB __SYSREG(0xd4002019, u8) /* receive buffer reg */ +#define SC1STR __SYSREG(0xd400201c, u16) /* status reg */ + +#define SC1RXIRQ 22 /* timer 1 Receive IRQ */ +#define SC1TXIRQ 23 /* timer 1 Transmit IRQ */ + +#define SC1RXICR GxICR(SC1RXIRQ) /* serial 1 receive intr ctrl reg */ +#define SC1TXICR GxICR(SC1TXIRQ) /* serial 1 transmit intr ctrl reg */ + +/* serial port 2 */ +#define SC2CTR __SYSREG(0xd4002020, u16) /* control reg */ +#define SC2CTR_CK 0x0003 /* clock source select */ +#define SC2CTR_CK_TM10UFLOW 0x0000 /* - timer 10 underflow */ +#define SC2CTR_CK_TM2UFLOW 0x0001 /* - timer 2 underflow */ +#define SC2CTR_CK_EXTERN 0x0002 /* - external closk */ +#define SC2CTR_CK_TM3UFLOW 0x0003 /* - timer 3 underflow */ +#define SC2CTR_STB 0x0008 /* stop bit select */ +#define SC2CTR_STB_1BIT 0x0000 /* - 1 stop bit */ +#define SC2CTR_STB_2BIT 0x0008 /* - 2 stop bits */ +#define SC2CTR_PB 0x0070 /* parity bit select */ +#define SC2CTR_PB_NONE 0x0000 /* - no parity */ +#define SC2CTR_PB_FIXED0 0x0040 /* - fixed at 0 */ +#define SC2CTR_PB_FIXED1 0x0050 /* - fixed at 1 */ +#define SC2CTR_PB_EVEN 0x0060 /* - even parity */ +#define SC2CTR_PB_ODD 0x0070 /* - odd parity */ +#define SC2CTR_CLN 0x0080 /* character length */ +#define SC2CTR_CLN_7BIT 0x0000 /* - 7 bit chars */ +#define SC2CTR_CLN_8BIT 0x0080 /* - 8 bit chars */ +#define SC2CTR_TWE 0x0100 /* transmit wait enable (enable XCTS control) */ +#define SC2CTR_OD 0x0200 /* bit order select */ +#define SC2CTR_OD_LSBFIRST 0x0000 /* - LSB first */ +#define SC2CTR_OD_MSBFIRST 0x0200 /* - MSB first */ +#define SC2CTR_TWS 0x1000 /* transmit wait select */ +#define SC2CTR_TWS_XCTS_HIGH 0x0000 /* - interrupt TX when XCTS high */ +#define SC2CTR_TWS_XCTS_LOW 0x1000 /* - interrupt TX when XCTS low */ +#define SC2CTR_BKE 0x2000 /* break transmit enable */ +#define SC2CTR_RXE 0x4000 /* receive enable */ +#define SC2CTR_TXE 0x8000 /* transmit enable */ + +#define SC2ICR __SYSREG(0xd4002024, u8) /* interrupt control reg */ +#define SC2ICR_TD 0x20 /* transmit DMA trigger cause */ +#define SC2ICR_TI 0x10 /* transmit interrupt cause */ +#define SC2ICR_RES 0x04 /* receive error select */ +#define SC2ICR_RI 0x01 /* receive interrupt cause */ + +#define SC2TXB __SYSREG(0xd4002018, u8) /* transmit buffer reg */ +#define SC2RXB __SYSREG(0xd4002019, u8) /* receive buffer reg */ +#define SC2STR __SYSREG(0xd400201c, u8) /* status reg */ +#define SC2STR_OEF 0x0001 /* overrun error found */ +#define SC2STR_PEF 0x0002 /* parity error found */ +#define SC2STR_FEF 0x0004 /* framing error found */ +#define SC2STR_CTS 0x0008 /* XCTS input pin status (0 means high) */ +#define SC2STR_RBF 0x0010 /* receive buffer status */ +#define SC2STR_TBF 0x0020 /* transmit buffer status */ +#define SC2STR_RXF 0x0040 /* receive status */ +#define SC2STR_TXF 0x0080 /* transmit status */ + +#define SC2TIM __SYSREG(0xd400202d, u8) /* status reg */ + +#define SC2RXIRQ 24 /* serial 2 Receive IRQ */ +#define SC2TXIRQ 25 /* serial 2 Transmit IRQ */ + +#define SC2RXICR GxICR(SC2RXIRQ) /* serial 2 receive intr ctrl reg */ +#define SC2TXICR GxICR(SC2TXIRQ) /* serial 2 transmit intr ctrl reg */ + + +#endif /* __KERNEL__ */ + +#endif /* _ASM_SERIAL_REGS_H */ diff --git a/arch/mn10300/include/asm/serial.h b/arch/mn10300/include/asm/serial.h new file mode 100644 index 0000000..99785a9 --- /dev/null +++ b/arch/mn10300/include/asm/serial.h @@ -0,0 +1,36 @@ +/* Standard UART definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +/* + * The ASB2305 has an 18.432 MHz clock the UART + */ +#define BASE_BAUD (18432000 / 16) + +/* Standard COM flags (except for COM4, because of the 8514 problem) */ +#ifdef CONFIG_SERIAL_DETECT_IRQ +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) +#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) +#else +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) +#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF +#endif + +#ifdef CONFIG_SERIAL_MANY_PORTS +#define FOURPORT_FLAGS ASYNC_FOURPORT +#define ACCENT_FLAGS 0 +#define BOCA_FLAGS 0 +#define HUB6_FLAGS 0 +#define RS_TABLE_SIZE 64 +#else +#define RS_TABLE_SIZE +#endif + +#include diff --git a/arch/mn10300/include/asm/setup.h b/arch/mn10300/include/asm/setup.h new file mode 100644 index 0000000..08356c8 --- /dev/null +++ b/arch/mn10300/include/asm/setup.h @@ -0,0 +1,17 @@ +/* MN10300 Setup declarations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SETUP_H +#define _ASM_SETUP_H + +extern void __init unit_setup(void); +extern void __init unit_init_IRQ(void); + +#endif /* _ASM_SETUP_H */ diff --git a/arch/mn10300/include/asm/shmbuf.h b/arch/mn10300/include/asm/shmbuf.h new file mode 100644 index 0000000..8f300cc --- /dev/null +++ b/arch/mn10300/include/asm/shmbuf.h @@ -0,0 +1,42 @@ +#ifndef _ASM_SHMBUF_H +#define _ASM_SHMBUF_H + +/* + * The shmid64_ds structure for MN10300 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct shmid64_ds { + struct ipc64_perm shm_perm; /* operation perms */ + size_t shm_segsz; /* size of segment (bytes) */ + __kernel_time_t shm_atime; /* last attach time */ + unsigned long __unused1; + __kernel_time_t shm_dtime; /* last detach time */ + unsigned long __unused2; + __kernel_time_t shm_ctime; /* last change time */ + unsigned long __unused3; + __kernel_pid_t shm_cpid; /* pid of creator */ + __kernel_pid_t shm_lpid; /* pid of last operator */ + unsigned long shm_nattch; /* no. of current attaches */ + unsigned long __unused4; + unsigned long __unused5; +}; + +struct shminfo64 { + unsigned long shmmax; + unsigned long shmmin; + unsigned long shmmni; + unsigned long shmseg; + unsigned long shmall; + unsigned long __unused1; + unsigned long __unused2; + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _ASM_SHMBUF_H */ diff --git a/arch/mn10300/include/asm/shmparam.h b/arch/mn10300/include/asm/shmparam.h new file mode 100644 index 0000000..ab666ed --- /dev/null +++ b/arch/mn10300/include/asm/shmparam.h @@ -0,0 +1,6 @@ +#ifndef _ASM_SHMPARAM_H +#define _ASM_SHMPARAM_H + +#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ + +#endif /* _ASM_SHMPARAM_H */ diff --git a/arch/mn10300/include/asm/sigcontext.h b/arch/mn10300/include/asm/sigcontext.h new file mode 100644 index 0000000..4de3aff --- /dev/null +++ b/arch/mn10300/include/asm/sigcontext.h @@ -0,0 +1,52 @@ +/* MN10300 Userspace signal context + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SIGCONTEXT_H +#define _ASM_SIGCONTEXT_H + +struct fpucontext { + /* Regular FPU environment */ + unsigned long fs[32]; /* fpu registers */ + unsigned long fpcr; /* fpu control register */ +}; + +struct sigcontext { + unsigned long d0; + unsigned long d1; + unsigned long d2; + unsigned long d3; + unsigned long a0; + unsigned long a1; + unsigned long a2; + unsigned long a3; + unsigned long e0; + unsigned long e1; + unsigned long e2; + unsigned long e3; + unsigned long e4; + unsigned long e5; + unsigned long e6; + unsigned long e7; + unsigned long lar; + unsigned long lir; + unsigned long mdr; + unsigned long mcvf; + unsigned long mcrl; + unsigned long mcrh; + unsigned long mdrq; + unsigned long sp; + unsigned long epsw; + unsigned long pc; + struct fpucontext *fpucontext; + unsigned long oldmask; +}; + + +#endif /* _ASM_SIGCONTEXT_H */ diff --git a/arch/mn10300/include/asm/siginfo.h b/arch/mn10300/include/asm/siginfo.h new file mode 100644 index 0000000..0815d29 --- /dev/null +++ b/arch/mn10300/include/asm/siginfo.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/signal.h b/arch/mn10300/include/asm/signal.h new file mode 100644 index 0000000..e98817c --- /dev/null +++ b/arch/mn10300/include/asm/signal.h @@ -0,0 +1,171 @@ +/* MN10300 Signal definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SIGNAL_H +#define _ASM_SIGNAL_H + +#include + +/* Avoid too many header ordering problems. */ +struct siginfo; + +#ifdef __KERNEL__ +/* Most things should be clean enough to redefine this at will, if care + is taken to make libc match. */ + +#define _NSIG 64 +#define _NSIG_BPW 32 +#define _NSIG_WORDS (_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t; /* at least 32 bits */ + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +#else +/* Here we must cater to libcs that poke about in kernel headers. */ + +#define NSIG 32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +/* +#define SIGLOST 29 +*/ +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +/* These should not be considered constants from userland. */ +#define SIGRTMIN 32 +#define SIGRTMAX (_NSIG-1) + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP 0x00000001U +#define SA_NOCLDWAIT 0x00000002U +#define SA_SIGINFO 0x00000004U +#define SA_ONSTACK 0x08000000U +#define SA_RESTART 0x10000000U +#define SA_NODEFER 0x40000000U +#define SA_RESETHAND 0x80000000U + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +#define SA_RESTORER 0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +#include + +#ifdef __KERNEL__ +struct old_sigaction { + __sighandler_t sa_handler; + old_sigset_t sa_mask; + unsigned long sa_flags; + __sigrestore_t sa_restorer; +}; + +struct sigaction { + __sighandler_t sa_handler; + unsigned long sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; /* mask last for extensibility */ +}; + +struct k_sigaction { + struct sigaction sa; +}; +#else +/* Here we must cater to libcs that poke about in kernel headers. */ + +struct sigaction { + union { + __sighandler_t _sa_handler; + void (*_sa_sigaction)(int, struct siginfo *, void *); + } _u; + sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +}; + +#define sa_handler _u._sa_handler +#define sa_sigaction _u._sa_sigaction + +#endif /* __KERNEL__ */ + +typedef struct sigaltstack { + void __user *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +#ifdef __KERNEL__ +#include + + +struct pt_regs; +#define ptrace_signal_deliver(regs, cookie) do { } while (0) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_SIGNAL_H */ diff --git a/arch/mn10300/include/asm/smp.h b/arch/mn10300/include/asm/smp.h new file mode 100644 index 0000000..4eb8c61 --- /dev/null +++ b/arch/mn10300/include/asm/smp.h @@ -0,0 +1,18 @@ +/* MN10300 SMP support + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SMP_H +#define _ASM_SMP_H + +#ifdef CONFIG_SMP +#error SMP not yet supported for MN10300 +#endif + +#endif diff --git a/arch/mn10300/include/asm/socket.h b/arch/mn10300/include/asm/socket.h new file mode 100644 index 0000000..fb5daf4 --- /dev/null +++ b/arch/mn10300/include/asm/socket.h @@ -0,0 +1,60 @@ +#ifndef _ASM_SOCKET_H +#define _ASM_SOCKET_H + +#include + +/* For setsockopt(2) */ +#define SOL_SOCKET 1 + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 + +#define SO_PEERNAME 28 +#define SO_TIMESTAMP 29 +#define SCM_TIMESTAMP SO_TIMESTAMP + +#define SO_ACCEPTCONN 30 + +#define SO_PEERSEC 31 +#define SO_PASSSEC 34 +#define SO_TIMESTAMPNS 35 +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS + +#define SO_MARK 36 + +#define SO_TIMESTAMPING 37 +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif /* _ASM_SOCKET_H */ diff --git a/arch/mn10300/include/asm/sockios.h b/arch/mn10300/include/asm/sockios.h new file mode 100644 index 0000000..b03043a --- /dev/null +++ b/arch/mn10300/include/asm/sockios.h @@ -0,0 +1,13 @@ +#ifndef _ASM_SOCKIOS_H +#define _ASM_SOCKIOS_H + +/* Socket-level I/O control calls. */ +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ + +#endif /* _ASM_SOCKIOS_H */ diff --git a/arch/mn10300/include/asm/spinlock.h b/arch/mn10300/include/asm/spinlock.h new file mode 100644 index 0000000..4bf9c8b --- /dev/null +++ b/arch/mn10300/include/asm/spinlock.h @@ -0,0 +1,16 @@ +/* MN10300 spinlock support + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SPINLOCK_H +#define _ASM_SPINLOCK_H + +#error SMP spinlocks not implemented for MN10300 + +#endif /* _ASM_SPINLOCK_H */ diff --git a/arch/mn10300/include/asm/stat.h b/arch/mn10300/include/asm/stat.h new file mode 100644 index 0000000..63ff837 --- /dev/null +++ b/arch/mn10300/include/asm/stat.h @@ -0,0 +1,78 @@ +#ifndef _ASM_STAT_H +#define _ASM_STAT_H + +struct __old_kernel_stat { + unsigned short st_dev; + unsigned short st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned long st_size; + unsigned long st_atime; + unsigned long st_mtime; + unsigned long st_ctime; +}; + +struct stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned long st_rdev; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long st_atime_nsec; + unsigned long st_mtime; + unsigned long st_mtime_nsec; + unsigned long st_ctime; + unsigned long st_ctime_nsec; + unsigned long __unused4; + unsigned long __unused5; +}; + +/* This matches struct stat64 in glibc2.1, hence the absolutely + * insane amounts of padding around dev_t's. + */ +struct stat64 { + unsigned long long st_dev; + unsigned char __pad0[4]; + +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned long st_uid; + unsigned long st_gid; + + unsigned long long st_rdev; + unsigned char __pad3[4]; + + long long st_size; + unsigned long st_blksize; + + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits */ + + unsigned long st_atime; + unsigned long st_atime_nsec; + + unsigned long st_mtime; + unsigned int st_mtime_nsec; + + unsigned long st_ctime; + unsigned long st_ctime_nsec; + + unsigned long long st_ino; +}; + +#define STAT_HAVE_NSEC 1 + +#endif /* _ASM_STAT_H */ diff --git a/arch/mn10300/include/asm/statfs.h b/arch/mn10300/include/asm/statfs.h new file mode 100644 index 0000000..0b91fe1 --- /dev/null +++ b/arch/mn10300/include/asm/statfs.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/string.h b/arch/mn10300/include/asm/string.h new file mode 100644 index 0000000..47dbd43 --- /dev/null +++ b/arch/mn10300/include/asm/string.h @@ -0,0 +1,32 @@ +/* MN10300 Optimised string functions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Modified by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_STRING_H +#define _ASM_STRING_H + +#define __HAVE_ARCH_MEMSET +#define __HAVE_ARCH_MEMCPY +#define __HAVE_ARCH_MEMMOVE + +extern void *memset(void *dest, int ch, size_t count); +extern void *memcpy(void *dest, const void *src, size_t count); +extern void *memmove(void *dest, const void *src, size_t count); + + +extern void __struct_cpy_bug(void); +#define struct_cpy(x, y) \ +({ \ + if (sizeof(*(x)) != sizeof(*(y))) \ + __struct_cpy_bug; \ + memcpy(x, y, sizeof(*(x))); \ +}) + +#endif /* _ASM_STRING_H */ diff --git a/arch/mn10300/include/asm/swab.h b/arch/mn10300/include/asm/swab.h new file mode 100644 index 0000000..bd818a8 --- /dev/null +++ b/arch/mn10300/include/asm/swab.h @@ -0,0 +1,42 @@ +/* MN10300 Byte-order primitive construction + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SWAB_H +#define _ASM_SWAB_H + +#include + +#ifdef __GNUC__ + +static inline __attribute__((const)) +__u32 __arch_swab32(__u32 x) +{ + __u32 ret; + asm("swap %1,%0" : "=r" (ret) : "r" (x)); + return ret; +} +#define __arch_swab32 __arch_swab32 + +static inline __attribute__((const)) +__u16 __arch_swab16(__u16 x) +{ + __u16 ret; + asm("swaph %1,%0" : "=r" (ret) : "r" (x)); + return ret; +} +#define __arch_swab32 __arch_swab32 + +#if !defined(__STRICT_ANSI__) || defined(__KERNEL__) +# define __SWAB_64_THRU_32__ +#endif + +#endif /* __GNUC__ */ + +#endif /* _ASM_SWAB_H */ diff --git a/arch/mn10300/include/asm/system.h b/arch/mn10300/include/asm/system.h new file mode 100644 index 0000000..8214fb7 --- /dev/null +++ b/arch/mn10300/include/asm/system.h @@ -0,0 +1,237 @@ +/* MN10300 System definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_SYSTEM_H +#define _ASM_SYSTEM_H + +#include + +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ + +#include + +struct task_struct; +struct thread_struct; + +extern asmlinkage +struct task_struct *__switch_to(struct thread_struct *prev, + struct thread_struct *next, + struct task_struct *prev_task); + +/* context switching is now performed out-of-line in switch_to.S */ +#define switch_to(prev, next, last) \ +do { \ + current->thread.wchan = (u_long) __builtin_return_address(0); \ + (last) = __switch_to(&(prev)->thread, &(next)->thread, (prev)); \ + mb(); \ + current->thread.wchan = 0; \ +} while (0) + +#define arch_align_stack(x) (x) + +#define nop() asm volatile ("nop") + +#endif /* !__ASSEMBLY__ */ + +/* + * Force strict CPU ordering. + * And yes, this is required on UP too when we're talking + * to devices. + * + * For now, "wmb()" doesn't actually do anything, as all + * Intel CPU's follow what Intel calls a *Processor Order*, + * in which all writes are seen in the program order even + * outside the CPU. + * + * I expect future Intel CPU's to have a weaker ordering, + * but I'd also expect them to finally get their act together + * and add some real memory barriers if so. + * + * Some non intel clones support out of order store. wmb() ceases to be a + * nop for these. + */ + +#define mb() asm volatile ("": : :"memory") +#define rmb() mb() +#define wmb() asm volatile ("": : :"memory") + +#ifdef CONFIG_SMP +#define smp_mb() mb() +#define smp_rmb() rmb() +#define smp_wmb() wmb() +#else +#define smp_mb() barrier() +#define smp_rmb() barrier() +#define smp_wmb() barrier() +#endif + +#define set_mb(var, value) do { var = value; mb(); } while (0) +#define set_wmb(var, value) do { var = value; wmb(); } while (0) + +#define read_barrier_depends() do {} while (0) +#define smp_read_barrier_depends() do {} while (0) + +/*****************************************************************************/ +/* + * interrupt control + * - "disabled": run in IM1/2 + * - level 0 - GDB stub + * - level 1 - virtual serial DMA (if present) + * - level 5 - normal interrupt priority + * - level 6 - timer interrupt + * - "enabled": run in IM7 + */ +#ifdef CONFIG_MN10300_TTYSM +#define MN10300_CLI_LEVEL EPSW_IM_2 +#else +#define MN10300_CLI_LEVEL EPSW_IM_1 +#endif + +#define local_save_flags(x) \ +do { \ + typecheck(unsigned long, x); \ + asm volatile( \ + " mov epsw,%0 \n" \ + : "=d"(x) \ + ); \ +} while (0) + +#define local_irq_disable() \ +do { \ + asm volatile( \ + " and %0,epsw \n" \ + " or %1,epsw \n" \ + " nop \n" \ + " nop \n" \ + " nop \n" \ + : \ + : "i"(~EPSW_IM), "i"(EPSW_IE | MN10300_CLI_LEVEL) \ + ); \ +} while (0) + +#define local_irq_save(x) \ +do { \ + local_save_flags(x); \ + local_irq_disable(); \ +} while (0) + +/* + * we make sure local_irq_enable() doesn't cause priority inversion + */ +#ifndef __ASSEMBLY__ + +extern unsigned long __mn10300_irq_enabled_epsw; + +#endif + +#define local_irq_enable() \ +do { \ + unsigned long tmp; \ + \ + asm volatile( \ + " mov epsw,%0 \n" \ + " and %1,%0 \n" \ + " or %2,%0 \n" \ + " mov %0,epsw \n" \ + : "=&d"(tmp) \ + : "i"(~EPSW_IM), "r"(__mn10300_irq_enabled_epsw) \ + ); \ +} while (0) + +#define local_irq_restore(x) \ +do { \ + typecheck(unsigned long, x); \ + asm volatile( \ + " mov %0,epsw \n" \ + " nop \n" \ + " nop \n" \ + " nop \n" \ + : \ + : "d"(x) \ + : "memory", "cc" \ + ); \ +} while (0) + +#define irqs_disabled() \ +({ \ + unsigned long flags; \ + local_save_flags(flags); \ + (flags & EPSW_IM) <= MN10300_CLI_LEVEL; \ +}) + +/* hook to save power by halting the CPU + * - called from the idle loop + * - must reenable interrupts (which takes three instruction cycles to complete) + */ +#define safe_halt() \ +do { \ + asm volatile(" or %0,epsw \n" \ + " nop \n" \ + " nop \n" \ + " bset %2,(%1) \n" \ + : \ + : "i"(EPSW_IE|EPSW_IM), "n"(&CPUM), "i"(CPUM_SLEEP)\ + : "cc" \ + ); \ +} while (0) + +#define STI or EPSW_IE|EPSW_IM,epsw +#define CLI and ~EPSW_IM,epsw; or EPSW_IE|MN10300_CLI_LEVEL,epsw; nop; nop; nop + +/*****************************************************************************/ +/* + * MN10300 doesn't actually have an exchange instruction + */ +#ifndef __ASSEMBLY__ + +struct __xchg_dummy { unsigned long a[100]; }; +#define __xg(x) ((struct __xchg_dummy *)(x)) + +static inline +unsigned long __xchg(volatile unsigned long *m, unsigned long val) +{ + unsigned long retval; + unsigned long flags; + + local_irq_save(flags); + retval = *m; + *m = val; + local_irq_restore(flags); + return retval; +} + +#define xchg(ptr, v) \ + ((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr), \ + (unsigned long)(v))) + +static inline unsigned long __cmpxchg(volatile unsigned long *m, + unsigned long old, unsigned long new) +{ + unsigned long retval; + unsigned long flags; + + local_irq_save(flags); + retval = *m; + if (retval == old) + *m = new; + local_irq_restore(flags); + return retval; +} + +#define cmpxchg(ptr, o, n) \ + ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ + (unsigned long)(o), \ + (unsigned long)(n))) + +#endif /* !__ASSEMBLY__ */ + +#endif /* __KERNEL__ */ +#endif /* _ASM_SYSTEM_H */ diff --git a/arch/mn10300/include/asm/termbits.h b/arch/mn10300/include/asm/termbits.h new file mode 100644 index 0000000..eb2b0dc --- /dev/null +++ b/arch/mn10300/include/asm/termbits.h @@ -0,0 +1,200 @@ +#ifndef _ASM_TERMBITS_H +#define _ASM_TERMBITS_H + +#include + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define NCCS 19 +struct termios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ +}; + +struct termios2 { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +struct ktermios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +/* c_cc characters */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + + +/* c_iflag bits */ +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +/* c_oflag bits */ +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +/* c_cflag bit meaning */ +#define CBAUD 0010017 +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#define EXTA B19200 +#define EXTB B38400 +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#define CBAUDEX 0010000 +#define BOTHER 0010000 +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 +#define CIBAUD 002003600000 /* input baud rate (not used) */ +#define CTVB 004000000000 /* VisioBraille Terminal flow control */ +#define CMSPAR 010000000000 /* mark or space (stick) parity */ +#define CRTSCTS 020000000000 /* flow control */ + +#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ + +/* c_lflag bits */ +#define ISIG 0000001 +#define ICANON 0000002 +#define XCASE 0000004 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define IEXTEN 0100000 + +/* tcflow() and TCXONC use these */ +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +#endif /* _ASM_TERMBITS_H */ diff --git a/arch/mn10300/include/asm/termios.h b/arch/mn10300/include/asm/termios.h new file mode 100644 index 0000000..dd7cf61 --- /dev/null +++ b/arch/mn10300/include/asm/termios.h @@ -0,0 +1,92 @@ +#ifndef _ASM_TERMIOS_H +#define _ASM_TERMIOS_H + +#include +#include + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +#ifdef __KERNEL__ +/* intr=^C quit=^| erase=del kill=^U + eof=^D vtime=\0 vmin=\1 sxtc=\0 + start=^Q stop=^S susp=^Z eol=\0 + reprint=^R discard=^U werase=^W lnext=^V + eol2=\0 +*/ +#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" +#endif + +/* modem lines */ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 + +#define TIOCM_MODEM_BITS TIOCM_OUT2 /* IRDA support */ + +/* + * Translate a "termio" structure into a "termios". Ugh. + */ +#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ + unsigned short __tmp; \ + get_user(__tmp, &(termio)->x); \ + *(unsigned short *) &(termios)->x = __tmp; \ +} + +#define user_termio_to_kernel_termios(termios, termio) \ +({ \ + SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ + copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ +}) + +/* + * Translate a "termios" structure into a "termio". Ugh. + */ +#define kernel_termios_to_user_termio(termio, termios) \ +({ \ + put_user((termios)->c_iflag, &(termio)->c_iflag); \ + put_user((termios)->c_oflag, &(termio)->c_oflag); \ + put_user((termios)->c_cflag, &(termio)->c_cflag); \ + put_user((termios)->c_lflag, &(termio)->c_lflag); \ + put_user((termios)->c_line, &(termio)->c_line); \ + copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ +}) + +#define user_termios_to_kernel_termios(k, u) \ + copy_from_user(k, u, sizeof(struct termios2)) +#define kernel_termios_to_user_termios(u, k) \ + copy_to_user(u, k, sizeof(struct termios2)) +#define user_termios_to_kernel_termios_1(k, u) \ + copy_from_user(k, u, sizeof(struct termios)) +#define kernel_termios_to_user_termios_1(u, k) \ + copy_to_user(u, k, sizeof(struct termios)) + +#endif /* _ASM_TERMIOS_H */ diff --git a/arch/mn10300/include/asm/thread_info.h b/arch/mn10300/include/asm/thread_info.h new file mode 100644 index 0000000..78a3881 --- /dev/null +++ b/arch/mn10300/include/asm/thread_info.h @@ -0,0 +1,170 @@ +/* MN10300 Low-level thread information + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_THREAD_INFO_H +#define _ASM_THREAD_INFO_H + +#ifdef __KERNEL__ + +#include + +#ifndef __ASSEMBLY__ +#include +#endif + +#define PREEMPT_ACTIVE 0x10000000 + +#ifdef CONFIG_4KSTACKS +#define THREAD_SIZE (4096) +#else +#define THREAD_SIZE (8192) +#endif + +#define STACK_WARN (THREAD_SIZE / 8) + +/* + * low level task data that entry.S needs immediate access to + * - this struct should fit entirely inside of one cache line + * - this struct shares the supervisor stack pages + * - if the contents of this structure are changed, the assembly constants + * must also be changed + */ +#ifndef __ASSEMBLY__ + +struct thread_info { + struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + unsigned long flags; /* low level flags */ + __u32 cpu; /* current CPU */ + __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ + + mm_segment_t addr_limit; /* thread address space: + 0-0xBFFFFFFF for user-thead + 0-0xFFFFFFFF for kernel-thread + */ + struct restart_block restart_block; + + __u8 supervisor_stack[0]; +}; + +#else /* !__ASSEMBLY__ */ + +#ifndef __ASM_OFFSETS_H__ +#include +#endif + +#endif + +/* + * macros/functions for gaining access to the thread information structure + * + * preempt_count needs to be 1 initially, until the scheduler is functional. + */ +#ifndef __ASSEMBLY__ + +#define INIT_THREAD_INFO(tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) +#define init_uregs \ + ((struct pt_regs *) \ + ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs))) + +extern struct thread_info *__current_ti; + +/* how to get the thread information struct from C */ +static inline __attribute__((const)) +struct thread_info *current_thread_info(void) +{ + struct thread_info *ti; + asm("mov sp,%0\n" + "and %1,%0\n" + : "=d" (ti) + : "i" (~(THREAD_SIZE - 1)) + : "cc"); + return ti; +} + +/* how to get the current stack pointer from C */ +static inline unsigned long current_stack_pointer(void) +{ + unsigned long sp; + asm("mov sp,%0; ":"=r" (sp)); + return sp; +} + +#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR + +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL) +#else +#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) +#endif + +#define free_thread_info(ti) kfree((ti)) +#define get_thread_info(ti) get_task_struct((ti)->task) +#define put_thread_info(ti) put_task_struct((ti)->task) + +#else /* !__ASSEMBLY__ */ + +#ifndef __VMLINUX_LDS__ +/* how to get the thread information struct from ASM */ +.macro GET_THREAD_INFO reg + mov sp,\reg + and -THREAD_SIZE,\reg +.endm +#endif +#endif + +/* + * thread information flags + * - these are process state flags that various assembly files may need to + * access + * - pending work-to-be-done flags are in LSW + * - other flags in MSW + */ +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ +#define TIF_SIGPENDING 2 /* signal pending */ +#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ +#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ +#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ +#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_MEMDIE 17 /* OOM killer killed process */ +#define TIF_FREEZE 18 /* freezing for suspend */ + +#define _TIF_SYSCALL_TRACE +(1 << TIF_SYSCALL_TRACE) +#define _TIF_NOTIFY_RESUME +(1 << TIF_NOTIFY_RESUME) +#define _TIF_SIGPENDING +(1 << TIF_SIGPENDING) +#define _TIF_NEED_RESCHED +(1 << TIF_NEED_RESCHED) +#define _TIF_SINGLESTEP +(1 << TIF_SINGLESTEP) +#define _TIF_RESTORE_SIGMASK +(1 << TIF_RESTORE_SIGMASK) +#define _TIF_POLLING_NRFLAG +(1 << TIF_POLLING_NRFLAG) +#define _TIF_FREEZE +(1 << TIF_FREEZE) + +#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ +#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_THREAD_INFO_H */ diff --git a/arch/mn10300/include/asm/timer-regs.h b/arch/mn10300/include/asm/timer-regs.h new file mode 100644 index 0000000..1d883b7 --- /dev/null +++ b/arch/mn10300/include/asm/timer-regs.h @@ -0,0 +1,293 @@ +/* AM33v2 on-board timer module registers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_TIMER_REGS_H +#define _ASM_TIMER_REGS_H + +#include +#include + +#ifdef __KERNEL__ + +/* timer prescalar control */ +#define TMPSCNT __SYSREG(0xd4003071, u8) /* timer prescaler control */ +#define TMPSCNT_ENABLE 0x80 /* timer prescaler enable */ +#define TMPSCNT_DISABLE 0x00 /* timer prescaler disable */ + +/* 8 bit timers */ +#define TM0MD __SYSREG(0xd4003000, u8) /* timer 0 mode register */ +#define TM0MD_SRC 0x07 /* timer source */ +#define TM0MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM0MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM0MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM0MD_SRC_TM2IO 0x03 /* - TM2IO pin input */ +#define TM0MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM0MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM0MD_SRC_TM0IO 0x07 /* - TM0IO pin input */ +#define TM0MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM0MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM1MD __SYSREG(0xd4003001, u8) /* timer 1 mode register */ +#define TM1MD_SRC 0x07 /* timer source */ +#define TM1MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM1MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM1MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM1MD_SRC_TM0CASCADE 0x03 /* - cascade with timer 0 */ +#define TM1MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM1MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM1MD_SRC_TM1IO 0x07 /* - TM1IO pin input */ +#define TM1MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM1MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM2MD __SYSREG(0xd4003002, u8) /* timer 2 mode register */ +#define TM2MD_SRC 0x07 /* timer source */ +#define TM2MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM2MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM2MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM2MD_SRC_TM1CASCADE 0x03 /* - cascade with timer 1 */ +#define TM2MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM2MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM2MD_SRC_TM2IO 0x07 /* - TM2IO pin input */ +#define TM2MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM2MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM3MD __SYSREG(0xd4003003, u8) /* timer 3 mode register */ +#define TM3MD_SRC 0x07 /* timer source */ +#define TM3MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM3MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM3MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM3MD_SRC_TM1CASCADE 0x03 /* - cascade with timer 2 */ +#define TM3MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM3MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM3MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM3MD_SRC_TM3IO 0x07 /* - TM3IO pin input */ +#define TM3MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM3MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM01MD __SYSREG(0xd4003000, u16) /* timer 0:1 mode register */ + +#define TM0BR __SYSREG(0xd4003010, u8) /* timer 0 base register */ +#define TM1BR __SYSREG(0xd4003011, u8) /* timer 1 base register */ +#define TM2BR __SYSREG(0xd4003012, u8) /* timer 2 base register */ +#define TM3BR __SYSREG(0xd4003013, u8) /* timer 3 base register */ +#define TM01BR __SYSREG(0xd4003010, u16) /* timer 0:1 base register */ + +#define TM0BC __SYSREGC(0xd4003020, u8) /* timer 0 binary counter */ +#define TM1BC __SYSREGC(0xd4003021, u8) /* timer 1 binary counter */ +#define TM2BC __SYSREGC(0xd4003022, u8) /* timer 2 binary counter */ +#define TM3BC __SYSREGC(0xd4003023, u8) /* timer 3 binary counter */ +#define TM01BC __SYSREGC(0xd4003020, u16) /* timer 0:1 binary counter */ + +#define TM0IRQ 2 /* timer 0 IRQ */ +#define TM1IRQ 3 /* timer 1 IRQ */ +#define TM2IRQ 4 /* timer 2 IRQ */ +#define TM3IRQ 5 /* timer 3 IRQ */ + +#define TM0ICR GxICR(TM0IRQ) /* timer 0 uflow intr ctrl reg */ +#define TM1ICR GxICR(TM1IRQ) /* timer 1 uflow intr ctrl reg */ +#define TM2ICR GxICR(TM2IRQ) /* timer 2 uflow intr ctrl reg */ +#define TM3ICR GxICR(TM3IRQ) /* timer 3 uflow intr ctrl reg */ + +/* 16-bit timers 4,5 & 7-11 */ +#define TM4MD __SYSREG(0xd4003080, u8) /* timer 4 mode register */ +#define TM4MD_SRC 0x07 /* timer source */ +#define TM4MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM4MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM4MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM4MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM4MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM4MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM4MD_SRC_TM4IO 0x07 /* - TM4IO pin input */ +#define TM4MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM4MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM5MD __SYSREG(0xd4003082, u8) /* timer 5 mode register */ +#define TM5MD_SRC 0x07 /* timer source */ +#define TM5MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM5MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM5MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM5MD_SRC_TM4CASCADE 0x03 /* - cascade with timer 4 */ +#define TM5MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM5MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM5MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM5MD_SRC_TM5IO 0x07 /* - TM5IO pin input */ +#define TM5MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM5MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM7MD __SYSREG(0xd4003086, u8) /* timer 7 mode register */ +#define TM7MD_SRC 0x07 /* timer source */ +#define TM7MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM7MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM7MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM7MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM7MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM7MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM7MD_SRC_TM7IO 0x07 /* - TM7IO pin input */ +#define TM7MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM7MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM8MD __SYSREG(0xd4003088, u8) /* timer 8 mode register */ +#define TM8MD_SRC 0x07 /* timer source */ +#define TM8MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM8MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM8MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM8MD_SRC_TM7CASCADE 0x03 /* - cascade with timer 7 */ +#define TM8MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM8MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM8MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM8MD_SRC_TM8IO 0x07 /* - TM8IO pin input */ +#define TM8MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM8MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM9MD __SYSREG(0xd400308a, u8) /* timer 9 mode register */ +#define TM9MD_SRC 0x07 /* timer source */ +#define TM9MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM9MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM9MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM9MD_SRC_TM8CASCADE 0x03 /* - cascade with timer 8 */ +#define TM9MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM9MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM9MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM9MD_SRC_TM9IO 0x07 /* - TM9IO pin input */ +#define TM9MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM9MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM10MD __SYSREG(0xd400308c, u8) /* timer 10 mode register */ +#define TM10MD_SRC 0x07 /* timer source */ +#define TM10MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM10MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM10MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM10MD_SRC_TM9CASCADE 0x03 /* - cascade with timer 9 */ +#define TM10MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM10MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM10MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM10MD_SRC_TM10IO 0x07 /* - TM10IO pin input */ +#define TM10MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM10MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM11MD __SYSREG(0xd400308e, u8) /* timer 11 mode register */ +#define TM11MD_SRC 0x07 /* timer source */ +#define TM11MD_SRC_IOCLK 0x00 /* - IOCLK */ +#define TM11MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ +#define TM11MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ +#define TM11MD_SRC_TM7CASCADE 0x03 /* - cascade with timer 7 */ +#define TM11MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ +#define TM11MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ +#define TM11MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ +#define TM11MD_SRC_TM11IO 0x07 /* - TM11IO pin input */ +#define TM11MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ +#define TM11MD_COUNT_ENABLE 0x80 /* timer count enable */ + +#define TM4BR __SYSREG(0xd4003090, u16) /* timer 4 base register */ +#define TM5BR __SYSREG(0xd4003092, u16) /* timer 5 base register */ +#define TM7BR __SYSREG(0xd4003096, u16) /* timer 7 base register */ +#define TM8BR __SYSREG(0xd4003098, u16) /* timer 8 base register */ +#define TM9BR __SYSREG(0xd400309a, u16) /* timer 9 base register */ +#define TM10BR __SYSREG(0xd400309c, u16) /* timer 10 base register */ +#define TM11BR __SYSREG(0xd400309e, u16) /* timer 11 base register */ +#define TM45BR __SYSREG(0xd4003090, u32) /* timer 4:5 base register */ + +#define TM4BC __SYSREG(0xd40030a0, u16) /* timer 4 binary counter */ +#define TM5BC __SYSREG(0xd40030a2, u16) /* timer 5 binary counter */ +#define TM45BC __SYSREG(0xd40030a0, u32) /* timer 4:5 binary counter */ + +#define TM7BC __SYSREG(0xd40030a6, u16) /* timer 7 binary counter */ +#define TM8BC __SYSREG(0xd40030a8, u16) /* timer 8 binary counter */ +#define TM9BC __SYSREG(0xd40030aa, u16) /* timer 9 binary counter */ +#define TM10BC __SYSREG(0xd40030ac, u16) /* timer 10 binary counter */ +#define TM11BC __SYSREG(0xd40030ae, u16) /* timer 11 binary counter */ + +#define TM4IRQ 6 /* timer 4 IRQ */ +#define TM5IRQ 7 /* timer 5 IRQ */ +#define TM7IRQ 11 /* timer 7 IRQ */ +#define TM8IRQ 12 /* timer 8 IRQ */ +#define TM9IRQ 13 /* timer 9 IRQ */ +#define TM10IRQ 14 /* timer 10 IRQ */ +#define TM11IRQ 15 /* timer 11 IRQ */ + +#define TM4ICR GxICR(TM4IRQ) /* timer 4 uflow intr ctrl reg */ +#define TM5ICR GxICR(TM5IRQ) /* timer 5 uflow intr ctrl reg */ +#define TM7ICR GxICR(TM7IRQ) /* timer 7 uflow intr ctrl reg */ +#define TM8ICR GxICR(TM8IRQ) /* timer 8 uflow intr ctrl reg */ +#define TM9ICR GxICR(TM9IRQ) /* timer 9 uflow intr ctrl reg */ +#define TM10ICR GxICR(TM10IRQ) /* timer 10 uflow intr ctrl reg */ +#define TM11ICR GxICR(TM11IRQ) /* timer 11 uflow intr ctrl reg */ + +/* 16-bit timer 6 */ +#define TM6MD __SYSREG(0xd4003084, u16) /* timer6 mode register */ +#define TM6MD_SRC 0x0007 /* timer source */ +#define TM6MD_SRC_IOCLK 0x0000 /* - IOCLK */ +#define TM6MD_SRC_IOCLK_8 0x0001 /* - 1/8 IOCLK */ +#define TM6MD_SRC_IOCLK_32 0x0002 /* - 1/32 IOCLK */ +#define TM6MD_SRC_TM0UFLOW 0x0004 /* - timer 0 underflow */ +#define TM6MD_SRC_TM1UFLOW 0x0005 /* - timer 1 underflow */ +#define TM6MD_SRC_TM6IOB_BOTH 0x0006 /* - TM6IOB pin input (both edges) */ +#define TM6MD_SRC_TM6IOB_SINGLE 0x0007 /* - TM6IOB pin input (single edge) */ +#define TM6MD_CLR_ENABLE 0x0010 /* clear count enable */ +#define TM6MD_ONESHOT_ENABLE 0x0040 /* oneshot count */ +#define TM6MD_TRIG_ENABLE 0x0080 /* TM6IOB pin trigger enable */ +#define TM6MD_PWM 0x3800 /* PWM output mode */ +#define TM6MD_PWM_DIS 0x0000 /* - disabled */ +#define TM6MD_PWM_10BIT 0x1000 /* - 10 bits mode */ +#define TM6MD_PWM_11BIT 0x1800 /* - 11 bits mode */ +#define TM6MD_PWM_12BIT 0x3000 /* - 12 bits mode */ +#define TM6MD_PWM_14BIT 0x3800 /* - 14 bits mode */ +#define TM6MD_INIT_COUNTER 0x4000 /* initialize TMnBC to zero */ +#define TM6MD_COUNT_ENABLE 0x8000 /* timer count enable */ + +#define TM6MDA __SYSREG(0xd40030b4, u8) /* timer6 cmp/cap A mode reg */ +#define TM6MDA_OUT 0x07 /* output select */ +#define TM6MDA_OUT_SETA_RESETB 0x00 /* - set at match A, reset at match B */ +#define TM6MDA_OUT_SETA_RESETOV 0x01 /* - set at match A, reset at overflow */ +#define TM6MDA_OUT_SETA 0x02 /* - set at match A */ +#define TM6MDA_OUT_RESETA 0x03 /* - reset at match A */ +#define TM6MDA_OUT_TOGGLE 0x04 /* - toggle on match A */ +#define TM6MDA_MODE 0xc0 /* compare A register mode */ +#define TM6MDA_MODE_CMP_SINGLE 0x00 /* - compare, single buffer mode */ +#define TM6MDA_MODE_CMP_DOUBLE 0x40 /* - compare, double buffer mode */ +#define TM6MDA_MODE_CAP_S_EDGE 0x80 /* - capture, single edge mode */ +#define TM6MDA_MODE_CAP_D_EDGE 0xc0 /* - capture, double edge mode */ +#define TM6MDA_EDGE 0x20 /* compare A edge select */ +#define TM6MDA_EDGE_FALLING 0x00 /* capture on falling edge */ +#define TM6MDA_EDGE_RISING 0x20 /* capture on rising edge */ +#define TM6MDA_CAPTURE_ENABLE 0x10 /* capture enable */ + +#define TM6MDB __SYSREG(0xd40030b5, u8) /* timer6 cmp/cap B mode reg */ +#define TM6MDB_OUT 0x07 /* output select */ +#define TM6MDB_OUT_SETB_RESETA 0x00 /* - set at match B, reset at match A */ +#define TM6MDB_OUT_SETB_RESETOV 0x01 /* - set at match B */ +#define TM6MDB_OUT_RESETB 0x03 /* - reset at match B */ +#define TM6MDB_OUT_TOGGLE 0x04 /* - toggle on match B */ +#define TM6MDB_MODE 0xc0 /* compare B register mode */ +#define TM6MDB_MODE_CMP_SINGLE 0x00 /* - compare, single buffer mode */ +#define TM6MDB_MODE_CMP_DOUBLE 0x40 /* - compare, double buffer mode */ +#define TM6MDB_MODE_CAP_S_EDGE 0x80 /* - capture, single edge mode */ +#define TM6MDB_MODE_CAP_D_EDGE 0xc0 /* - capture, double edge mode */ +#define TM6MDB_EDGE 0x20 /* compare B edge select */ +#define TM6MDB_EDGE_FALLING 0x00 /* capture on falling edge */ +#define TM6MDB_EDGE_RISING 0x20 /* capture on rising edge */ +#define TM6MDB_CAPTURE_ENABLE 0x10 /* capture enable */ + +#define TM6CA __SYSREG(0xd40030c4, u16) /* timer6 cmp/capture reg A */ +#define TM6CB __SYSREG(0xd40030d4, u16) /* timer6 cmp/capture reg B */ +#define TM6BC __SYSREG(0xd40030a4, u16) /* timer6 binary counter */ + +#define TM6IRQ 6 /* timer 6 IRQ */ +#define TM6AIRQ 9 /* timer 6A IRQ */ +#define TM6BIRQ 10 /* timer 6B IRQ */ + +#define TM6ICR GxICR(TM6IRQ) /* timer 6 uflow intr ctrl reg */ +#define TM6AICR GxICR(TM6AIRQ) /* timer 6A intr control reg */ +#define TM6BICR GxICR(TM6BIRQ) /* timer 6B intr control reg */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_TIMER_REGS_H */ diff --git a/arch/mn10300/include/asm/timex.h b/arch/mn10300/include/asm/timex.h new file mode 100644 index 0000000..3944277 --- /dev/null +++ b/arch/mn10300/include/asm/timex.h @@ -0,0 +1,33 @@ +/* MN10300 Architecture time management specifications + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_TIMEX_H +#define _ASM_TIMEX_H + +#include +#include + +#define TICK_SIZE (tick_nsec / 1000) + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ - this should probably be set + * to something appropriate, but what? */ + +extern cycles_t cacheflush_time; + +#ifdef __KERNEL__ + +static inline cycles_t get_cycles(void) +{ + return read_timestamp_counter(); +} + +#endif /* __KERNEL__ */ + +#endif /* _ASM_TIMEX_H */ diff --git a/arch/mn10300/include/asm/tlb.h b/arch/mn10300/include/asm/tlb.h new file mode 100644 index 0000000..65d232b --- /dev/null +++ b/arch/mn10300/include/asm/tlb.h @@ -0,0 +1,34 @@ +/* MN10300 TLB definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_TLB_H +#define _ASM_TLB_H + +#include + +extern void check_pgt_cache(void); + +/* + * we don't need any special per-pte or per-vma handling... + */ +#define tlb_start_vma(tlb, vma) do { } while (0) +#define tlb_end_vma(tlb, vma) do { } while (0) +#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) + +/* + * .. because we flush the whole mm when it fills up + */ +#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) + +/* for now, just use the generic stuff */ +#include + +#endif /* _ASM_TLB_H */ diff --git a/arch/mn10300/include/asm/tlbflush.h b/arch/mn10300/include/asm/tlbflush.h new file mode 100644 index 0000000..e023986 --- /dev/null +++ b/arch/mn10300/include/asm/tlbflush.h @@ -0,0 +1,80 @@ +/* MN10300 TLB flushing functions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_TLBFLUSH_H +#define _ASM_TLBFLUSH_H + +#include + +#define __flush_tlb() \ +do { \ + int w; \ + __asm__ __volatile__ \ + (" mov %1,%0 \n" \ + " or %2,%0 \n" \ + " mov %0,%1 \n" \ + : "=d"(w) \ + : "m"(MMUCTR), "i"(MMUCTR_IIV|MMUCTR_DIV) \ + : "memory" \ + ); \ +} while (0) + +#define __flush_tlb_all() __flush_tlb() +#define __flush_tlb_one(addr) __flush_tlb() + + +/* + * TLB flushing: + * + * - flush_tlb() flushes the current mm struct TLBs + * - flush_tlb_all() flushes all processes TLBs + * - flush_tlb_mm(mm) flushes the specified mm context TLB's + * - flush_tlb_page(vma, vmaddr) flushes one page + * - flush_tlb_range(mm, start, end) flushes a range of pages + * - flush_tlb_pgtables(mm, start, end) flushes a range of page tables + */ +#define flush_tlb_all() \ +do { \ + preempt_disable(); \ + __flush_tlb_all(); \ + preempt_enable(); \ +} while (0) + +#define flush_tlb_mm(mm) \ +do { \ + preempt_disable(); \ + __flush_tlb_all(); \ + preempt_enable(); \ +} while (0) + +#define flush_tlb_range(vma, start, end) \ +do { \ + unsigned long __s __attribute__((unused)) = (start); \ + unsigned long __e __attribute__((unused)) = (end); \ + preempt_disable(); \ + __flush_tlb_all(); \ + preempt_enable(); \ +} while (0) + + +#define __flush_tlb_global() flush_tlb_all() +#define flush_tlb() flush_tlb_all() +#define flush_tlb_kernel_range(start, end) \ +do { \ + unsigned long __s __attribute__((unused)) = (start); \ + unsigned long __e __attribute__((unused)) = (end); \ + flush_tlb_all(); \ +} while (0) + +extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr); + +#define flush_tlb_pgtables(mm, start, end) do {} while (0) + +#endif /* _ASM_TLBFLUSH_H */ diff --git a/arch/mn10300/include/asm/topology.h b/arch/mn10300/include/asm/topology.h new file mode 100644 index 0000000..5428f33 --- /dev/null +++ b/arch/mn10300/include/asm/topology.h @@ -0,0 +1 @@ +#include diff --git a/arch/mn10300/include/asm/types.h b/arch/mn10300/include/asm/types.h new file mode 100644 index 0000000..7b9f010 --- /dev/null +++ b/arch/mn10300/include/asm/types.h @@ -0,0 +1,38 @@ +/* MN10300 Basic type definitions + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_TYPES_H +#define _ASM_TYPES_H + +#include + +#ifndef __ASSEMBLY__ + +typedef unsigned short umode_t; + +#endif /* __ASSEMBLY__ */ + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +#define BITS_PER_LONG 32 + +#ifndef __ASSEMBLY__ + +/* Dma addresses are 32-bits wide. */ +typedef u32 dma_addr_t; + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_TYPES_H */ diff --git a/arch/mn10300/include/asm/uaccess.h b/arch/mn10300/include/asm/uaccess.h new file mode 100644 index 0000000..8a3a4dd --- /dev/null +++ b/arch/mn10300/include/asm/uaccess.h @@ -0,0 +1,490 @@ +/* MN10300 userspace access functions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UACCESS_H +#define _ASM_UACCESS_H + +/* + * User space memory access functions + */ +#include +#include +#include +#include + +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 + +/* + * The fs value determines whether argument validity checking should be + * performed or not. If get_fs() == USER_DS, checking is performed, with + * get_fs() == KERNEL_DS, checking is bypassed. + * + * For historical reasons, these macros are grossly misnamed. + */ + +#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) + +#define KERNEL_XDS MAKE_MM_SEG(0xBFFFFFFF) +#define KERNEL_DS MAKE_MM_SEG(0x9FFFFFFF) +#define USER_DS MAKE_MM_SEG(TASK_SIZE) + +#define get_ds() (KERNEL_DS) +#define get_fs() (current_thread_info()->addr_limit) +#define set_fs(x) (current_thread_info()->addr_limit = (x)) +#define __kernel_ds_p() (current_thread_info()->addr_limit.seg == 0x9FFFFFFF) + +#define segment_eq(a, b) ((a).seg == (b).seg) + +#define __addr_ok(addr) \ + ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg)) + +/* + * check that a range of addresses falls within the current address limit + */ +static inline int ___range_ok(unsigned long addr, unsigned int size) +{ + int flag = 1, tmp; + + asm(" add %3,%1 \n" /* set C-flag if addr + size > 4Gb */ + " bcs 0f \n" + " cmp %4,%1 \n" /* jump if addr+size>limit (error) */ + " bhi 0f \n" + " clr %0 \n" /* mark okay */ + "0: \n" + : "=r"(flag), "=&r"(tmp) + : "1"(addr), "ir"(size), + "r"(current_thread_info()->addr_limit.seg), "0"(flag) + : "cc" + ); + + return flag; +} + +#define __range_ok(addr, size) ___range_ok((unsigned long)(addr), (u32)(size)) + +#define access_ok(type, addr, size) (__range_ok((addr), (size)) == 0) +#define __access_ok(addr, size) (__range_ok((addr), (size)) == 0) + +static inline int verify_area(int type, const void *addr, unsigned long size) +{ + return access_ok(type, addr, size) ? 0 : -EFAULT; +} + + +/* + * The exception table consists of pairs of addresses: the first is the + * address of an instruction that is allowed to fault, and the second is + * the address at which the program should continue. No registers are + * modified, so it is entirely up to the continuation code to figure out + * what to do. + * + * All the routines below use bits of fixup code that are out of line + * with the main instruction path. This means when everything is well, + * we don't even have to jump over them. Further, they do not intrude + * on our cache or tlb entries. + */ + +struct exception_table_entry +{ + unsigned long insn, fixup; +}; + +/* Returns 0 if exception not found and fixup otherwise. */ +extern int fixup_exception(struct pt_regs *regs); + +#define put_user(x, ptr) __put_user_check((x), (ptr), sizeof(*(ptr))) +#define get_user(x, ptr) __get_user_check((x), (ptr), sizeof(*(ptr))) + +/* + * The "__xxx" versions do not do address space checking, useful when + * doing multiple accesses to the same area (the user has to do the + * checks by hand with "access_ok()") + */ +#define __put_user(x, ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) +#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) + +/* + * The "xxx_ret" versions return constant specified in third argument, if + * something bad happens. These macros can be optimized for the + * case of just returning from the function xxx_ret is used. + */ + +#define put_user_ret(x, ptr, ret) \ + ({ if (put_user((x), (ptr))) return (ret); }) +#define get_user_ret(x, ptr, ret) \ + ({ if (get_user((x), (ptr))) return (ret); }) +#define __put_user_ret(x, ptr, ret) \ + ({ if (__put_user((x), (ptr))) return (ret); }) +#define __get_user_ret(x, ptr, ret) \ + ({ if (__get_user((x), (ptr))) return (ret); }) + +struct __large_struct { unsigned long buf[100]; }; +#define __m(x) (*(struct __large_struct *)(x)) + +#define __get_user_nocheck(x, ptr, size) \ +({ \ + __typeof(*(ptr)) __gu_val; \ + unsigned long __gu_addr; \ + int __gu_err; \ + __gu_addr = (unsigned long) (ptr); \ + switch (size) { \ + case 1: __get_user_asm("bu"); break; \ + case 2: __get_user_asm("hu"); break; \ + case 4: __get_user_asm("" ); break; \ + default: __get_user_unknown(); break; \ + } \ + x = (__typeof__(*(ptr))) __gu_val; \ + __gu_err; \ +}) + +#define __get_user_check(x, ptr, size) \ +({ \ + __typeof__(*(ptr)) __gu_val; \ + unsigned long __gu_addr; \ + int __gu_err; \ + __gu_addr = (unsigned long) (ptr); \ + if (likely(__access_ok(__gu_addr,size))) { \ + switch (size) { \ + case 1: __get_user_asm("bu"); break; \ + case 2: __get_user_asm("hu"); break; \ + case 4: __get_user_asm("" ); break; \ + default: __get_user_unknown(); break; \ + } \ + } \ + else { \ + __gu_err = -EFAULT; \ + __gu_val = 0; \ + } \ + x = (__typeof__(*(ptr))) __gu_val; \ + __gu_err; \ +}) + +#define __get_user_asm(INSN) \ +({ \ + asm volatile( \ + "1:\n" \ + " mov"INSN" %2,%1\n" \ + " mov 0,%0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + "3:\n\t" \ + " mov %3,%0\n" \ + " jmp 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "=&r" (__gu_err), "=&r" (__gu_val) \ + : "m" (__m(__gu_addr)), "i" (-EFAULT)); \ +}) + +extern int __get_user_unknown(void); + +#define __put_user_nocheck(x, ptr, size) \ +({ \ + union { \ + __typeof__(*(ptr)) val; \ + u32 bits[2]; \ + } __pu_val; \ + unsigned long __pu_addr; \ + int __pu_err; \ + __pu_val.val = (x); \ + __pu_addr = (unsigned long) (ptr); \ + switch (size) { \ + case 1: __put_user_asm("bu"); break; \ + case 2: __put_user_asm("hu"); break; \ + case 4: __put_user_asm("" ); break; \ + case 8: __put_user_asm8(); break; \ + default: __pu_err = __put_user_unknown(); break; \ + } \ + __pu_err; \ +}) + +#define __put_user_check(x, ptr, size) \ +({ \ + union { \ + __typeof__(*(ptr)) val; \ + u32 bits[2]; \ + } __pu_val; \ + unsigned long __pu_addr; \ + int __pu_err; \ + __pu_val.val = (x); \ + __pu_addr = (unsigned long) (ptr); \ + if (likely(__access_ok(__pu_addr, size))) { \ + switch (size) { \ + case 1: __put_user_asm("bu"); break; \ + case 2: __put_user_asm("hu"); break; \ + case 4: __put_user_asm("" ); break; \ + case 8: __put_user_asm8(); break; \ + default: __pu_err = __put_user_unknown(); break; \ + } \ + } \ + else { \ + __pu_err = -EFAULT; \ + } \ + __pu_err; \ +}) + +#define __put_user_asm(INSN) \ +({ \ + asm volatile( \ + "1:\n" \ + " mov"INSN" %1,%2\n" \ + " mov 0,%0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + "3:\n" \ + " mov %3,%0\n" \ + " jmp 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "=&r" (__pu_err) \ + : "r" (__pu_val.val), "m" (__m(__pu_addr)), \ + "i" (-EFAULT) \ + ); \ +}) + +#define __put_user_asm8() \ +({ \ + asm volatile( \ + "1: mov %1,%3 \n" \ + "2: mov %2,%4 \n" \ + " mov 0,%0 \n" \ + "3: \n" \ + " .section .fixup,\"ax\" \n" \ + "4: \n" \ + " mov %5,%0 \n" \ + " jmp 3b \n" \ + " .previous \n" \ + " .section __ex_table,\"a\"\n" \ + " .balign 4 \n" \ + " .long 1b, 4b \n" \ + " .long 2b, 4b \n" \ + " .previous \n" \ + : "=&r" (__pu_err) \ + : "r" (__pu_val.bits[0]), "r" (__pu_val.bits[1]), \ + "m" (__m(__pu_addr)), "m" (__m(__pu_addr+4)), \ + "i" (-EFAULT) \ + ); \ +}) + +extern int __put_user_unknown(void); + + +/* + * Copy To/From Userspace + */ +/* Generic arbitrary sized copy. */ +#define __copy_user(to, from, size) \ +do { \ + if (size) { \ + void *__to = to; \ + const void *__from = from; \ + int w; \ + asm volatile( \ + "0: movbu (%0),%3;\n" \ + "1: movbu %3,(%1);\n" \ + " inc %0;\n" \ + " inc %1;\n" \ + " add -1,%2;\n" \ + " bne 0b;\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + "3: jmp 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 0b,3b\n" \ + " .long 1b,3b\n" \ + " .previous\n" \ + : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ + : "0"(__from), "1"(__to), "2"(size) \ + : "memory"); \ + } \ +} while (0) + +#define __copy_user_zeroing(to, from, size) \ +do { \ + if (size) { \ + void *__to = to; \ + const void *__from = from; \ + int w; \ + asm volatile( \ + "0: movbu (%0),%3;\n" \ + "1: movbu %3,(%1);\n" \ + " inc %0;\n" \ + " inc %1;\n" \ + " add -1,%2;\n" \ + " bne 0b;\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + "3:\n" \ + " mov %2,%0\n" \ + " clr %3\n" \ + "4: movbu %3,(%1);\n" \ + " inc %1;\n" \ + " add -1,%2;\n" \ + " bne 4b;\n" \ + " mov %0,%2\n" \ + " jmp 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 0b,3b\n" \ + " .long 1b,3b\n" \ + " .previous\n" \ + : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ + : "0"(__from), "1"(__to), "2"(size) \ + : "memory"); \ + } \ +} while (0) + +/* We let the __ versions of copy_from/to_user inline, because they're often + * used in fast paths and have only a small space overhead. + */ +static inline +unsigned long __generic_copy_from_user_nocheck(void *to, const void *from, + unsigned long n) +{ + __copy_user_zeroing(to, from, n); + return n; +} + +static inline +unsigned long __generic_copy_to_user_nocheck(void *to, const void *from, + unsigned long n) +{ + __copy_user(to, from, n); + return n; +} + + +#if 0 +#error don't use - these macros don't increment to & from pointers +/* Optimize just a little bit when we know the size of the move. */ +#define __constant_copy_user(to, from, size) \ +do { \ + asm volatile( \ + " mov %0,a0;\n" \ + "0: movbu (%1),d3;\n" \ + "1: movbu d3,(%2);\n" \ + " add -1,a0;\n" \ + " bne 0b;\n" \ + "2:;" \ + ".section .fixup,\"ax\"\n" \ + "3: jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 0b,3b\n" \ + " .long 1b,3b\n" \ + ".previous" \ + : \ + : "d"(size), "d"(to), "d"(from) \ + : "d3", "a0"); \ +} while (0) + +/* Optimize just a little bit when we know the size of the move. */ +#define __constant_copy_user_zeroing(to, from, size) \ +do { \ + asm volatile( \ + " mov %0,a0;\n" \ + "0: movbu (%1),d3;\n" \ + "1: movbu d3,(%2);\n" \ + " add -1,a0;\n" \ + " bne 0b;\n" \ + "2:;" \ + ".section .fixup,\"ax\"\n" \ + "3: jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .balign 4\n" \ + " .long 0b,3b\n" \ + " .long 1b,3b\n" \ + ".previous" \ + : \ + : "d"(size), "d"(to), "d"(from) \ + : "d3", "a0"); \ +} while (0) + +static inline +unsigned long __constant_copy_to_user(void *to, const void *from, + unsigned long n) +{ + if (access_ok(VERIFY_WRITE, to, n)) + __constant_copy_user(to, from, n); + return n; +} + +static inline +unsigned long __constant_copy_from_user(void *to, const void *from, + unsigned long n) +{ + if (access_ok(VERIFY_READ, from, n)) + __constant_copy_user_zeroing(to, from, n); + return n; +} + +static inline +unsigned long __constant_copy_to_user_nocheck(void *to, const void *from, + unsigned long n) +{ + __constant_copy_user(to, from, n); + return n; +} + +static inline +unsigned long __constant_copy_from_user_nocheck(void *to, const void *from, + unsigned long n) +{ + __constant_copy_user_zeroing(to, from, n); + return n; +} +#endif + +extern unsigned long __generic_copy_to_user(void __user *, const void *, + unsigned long); +extern unsigned long __generic_copy_from_user(void *, const void __user *, + unsigned long); + +#define __copy_to_user_inatomic(to, from, n) \ + __generic_copy_to_user_nocheck((to), (from), (n)) +#define __copy_from_user_inatomic(to, from, n) \ + __generic_copy_from_user_nocheck((to), (from), (n)) + +#define __copy_to_user(to, from, n) \ +({ \ + might_sleep(); \ + __copy_to_user_inatomic((to), (from), (n)); \ +}) + +#define __copy_from_user(to, from, n) \ +({ \ + might_sleep(); \ + __copy_from_user_inatomic((to), (from), (n)); \ +}) + + +#define copy_to_user(to, from, n) __generic_copy_to_user((to), (from), (n)) +#define copy_from_user(to, from, n) __generic_copy_from_user((to), (from), (n)) + +extern long strncpy_from_user(char *dst, const char __user *src, long count); +extern long __strncpy_from_user(char *dst, const char __user *src, long count); +extern long strnlen_user(const char __user *str, long n); +#define strlen_user(str) strnlen_user(str, ~0UL >> 1) +extern unsigned long clear_user(void __user *mem, unsigned long len); +extern unsigned long __clear_user(void __user *mem, unsigned long len); + +#endif /* _ASM_UACCESS_H */ diff --git a/arch/mn10300/include/asm/ucontext.h b/arch/mn10300/include/asm/ucontext.h new file mode 100644 index 0000000..fcab5c1 --- /dev/null +++ b/arch/mn10300/include/asm/ucontext.h @@ -0,0 +1,22 @@ +/* MN10300 User context + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UCONTEXT_H +#define _ASM_UCONTEXT_H + +struct ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; /* mask last for extensibility */ +}; + +#endif /* _ASM_UCONTEXT_H */ diff --git a/arch/mn10300/include/asm/unaligned.h b/arch/mn10300/include/asm/unaligned.h new file mode 100644 index 0000000..0df6713 --- /dev/null +++ b/arch/mn10300/include/asm/unaligned.h @@ -0,0 +1,20 @@ +/* MN10300 Unaligned memory access handling + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_MN10300_UNALIGNED_H +#define _ASM_MN10300_UNALIGNED_H + +#include +#include + +#define get_unaligned __get_unaligned_le +#define put_unaligned __put_unaligned_le + +#endif /* _ASM_MN10300_UNALIGNED_H */ diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h new file mode 100644 index 0000000..543a4f9 --- /dev/null +++ b/arch/mn10300/include/asm/unistd.h @@ -0,0 +1,390 @@ +/* MN10300 System call number list + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNISTD_H +#define _ASM_UNISTD_H + +#define __NR_restart_syscall 0 +#define __NR_exit 1 +#define __NR_fork 2 +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_waitpid 7 +#define __NR_creat 8 +#define __NR_link 9 +#define __NR_unlink 10 +#define __NR_execve 11 +#define __NR_chdir 12 +#define __NR_time 13 +#define __NR_mknod 14 +#define __NR_chmod 15 +#define __NR_lchown 16 +#define __NR_break 17 +#define __NR_oldstat 18 +#define __NR_lseek 19 +#define __NR_getpid 20 +#define __NR_mount 21 +#define __NR_umount 22 +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_stime 25 +#define __NR_ptrace 26 +#define __NR_alarm 27 +#define __NR_oldfstat 28 +#define __NR_pause 29 +#define __NR_utime 30 +#define __NR_stty 31 +#define __NR_gtty 32 +#define __NR_access 33 +#define __NR_nice 34 +#define __NR_ftime 35 +#define __NR_sync 36 +#define __NR_kill 37 +#define __NR_rename 38 +#define __NR_mkdir 39 +#define __NR_rmdir 40 +#define __NR_dup 41 +#define __NR_pipe 42 +#define __NR_times 43 +#define __NR_prof 44 +#define __NR_brk 45 +#define __NR_setgid 46 +#define __NR_getgid 47 +#define __NR_signal 48 +#define __NR_geteuid 49 +#define __NR_getegid 50 +#define __NR_acct 51 +#define __NR_umount2 52 +#define __NR_lock 53 +#define __NR_ioctl 54 +#define __NR_fcntl 55 +#define __NR_mpx 56 +#define __NR_setpgid 57 +#define __NR_ulimit 58 +#define __NR_oldolduname 59 +#define __NR_umask 60 +#define __NR_chroot 61 +#define __NR_ustat 62 +#define __NR_dup2 63 +#define __NR_getppid 64 +#define __NR_getpgrp 65 +#define __NR_setsid 66 +#define __NR_sigaction 67 +#define __NR_sgetmask 68 +#define __NR_ssetmask 69 +#define __NR_setreuid 70 +#define __NR_setregid 71 +#define __NR_sigsuspend 72 +#define __NR_sigpending 73 +#define __NR_sethostname 74 +#define __NR_setrlimit 75 +#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ +#define __NR_getrusage 77 +#define __NR_gettimeofday 78 +#define __NR_settimeofday 79 +#define __NR_getgroups 80 +#define __NR_setgroups 81 +#define __NR_select 82 +#define __NR_symlink 83 +#define __NR_oldlstat 84 +#define __NR_readlink 85 +#define __NR_uselib 86 +#define __NR_swapon 87 +#define __NR_reboot 88 +#define __NR_readdir 89 +#define __NR_mmap 90 +#define __NR_munmap 91 +#define __NR_truncate 92 +#define __NR_ftruncate 93 +#define __NR_fchmod 94 +#define __NR_fchown 95 +#define __NR_getpriority 96 +#define __NR_setpriority 97 +#define __NR_profil 98 +#define __NR_statfs 99 +#define __NR_fstatfs 100 +#define __NR_ioperm 101 +#define __NR_socketcall 102 +#define __NR_syslog 103 +#define __NR_setitimer 104 +#define __NR_getitimer 105 +#define __NR_stat 106 +#define __NR_lstat 107 +#define __NR_fstat 108 +#define __NR_olduname 109 +#define __NR_iopl 110 +#define __NR_vhangup 111 +#define __NR_idle 112 +#define __NR_vm86old 113 +#define __NR_wait4 114 +#define __NR_swapoff 115 +#define __NR_sysinfo 116 +#define __NR_ipc 117 +#define __NR_fsync 118 +#define __NR_sigreturn 119 +#define __NR_clone 120 +#define __NR_setdomainname 121 +#define __NR_uname 122 +#define __NR_modify_ldt 123 +#define __NR_adjtimex 124 +#define __NR_mprotect 125 +#define __NR_sigprocmask 126 +#define __NR_create_module 127 +#define __NR_init_module 128 +#define __NR_delete_module 129 +#define __NR_get_kernel_syms 130 +#define __NR_quotactl 131 +#define __NR_getpgid 132 +#define __NR_fchdir 133 +#define __NR_bdflush 134 +#define __NR_sysfs 135 +#define __NR_personality 136 +#define __NR_afs_syscall 137 /* Syscall for Andrew File System */ +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#define __NR__llseek 140 +#define __NR_getdents 141 +#define __NR__newselect 142 +#define __NR_flock 143 +#define __NR_msync 144 +#define __NR_readv 145 +#define __NR_writev 146 +#define __NR_getsid 147 +#define __NR_fdatasync 148 +#define __NR__sysctl 149 +#define __NR_mlock 150 +#define __NR_munlock 151 +#define __NR_mlockall 152 +#define __NR_munlockall 153 +#define __NR_sched_setparam 154 +#define __NR_sched_getparam 155 +#define __NR_sched_setscheduler 156 +#define __NR_sched_getscheduler 157 +#define __NR_sched_yield 158 +#define __NR_sched_get_priority_max 159 +#define __NR_sched_get_priority_min 160 +#define __NR_sched_rr_get_interval 161 +#define __NR_nanosleep 162 +#define __NR_mremap 163 +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_vm86 166 +#define __NR_query_module 167 +#define __NR_poll 168 +#define __NR_nfsservctl 169 +#define __NR_setresgid 170 +#define __NR_getresgid 171 +#define __NR_prctl 172 +#define __NR_rt_sigreturn 173 +#define __NR_rt_sigaction 174 +#define __NR_rt_sigprocmask 175 +#define __NR_rt_sigpending 176 +#define __NR_rt_sigtimedwait 177 +#define __NR_rt_sigqueueinfo 178 +#define __NR_rt_sigsuspend 179 +#define __NR_pread64 180 +#define __NR_pwrite64 181 +#define __NR_chown 182 +#define __NR_getcwd 183 +#define __NR_capget 184 +#define __NR_capset 185 +#define __NR_sigaltstack 186 +#define __NR_sendfile 187 +#define __NR_getpmsg 188 /* some people actually want streams */ +#define __NR_putpmsg 189 /* some people actually want streams */ +#define __NR_vfork 190 +#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ +#define __NR_mmap2 192 +#define __NR_truncate64 193 +#define __NR_ftruncate64 194 +#define __NR_stat64 195 +#define __NR_lstat64 196 +#define __NR_fstat64 197 +#define __NR_lchown32 198 +#define __NR_getuid32 199 +#define __NR_getgid32 200 +#define __NR_geteuid32 201 +#define __NR_getegid32 202 +#define __NR_setreuid32 203 +#define __NR_setregid32 204 +#define __NR_getgroups32 205 +#define __NR_setgroups32 206 +#define __NR_fchown32 207 +#define __NR_setresuid32 208 +#define __NR_getresuid32 209 +#define __NR_setresgid32 210 +#define __NR_getresgid32 211 +#define __NR_chown32 212 +#define __NR_setuid32 213 +#define __NR_setgid32 214 +#define __NR_setfsuid32 215 +#define __NR_setfsgid32 216 +#define __NR_pivot_root 217 +#define __NR_mincore 218 +#define __NR_madvise 219 +#define __NR_madvise1 219 /* delete when C lib stub is removed */ +#define __NR_getdents64 220 +#define __NR_fcntl64 221 +/* 223 is unused */ +#define __NR_gettid 224 +#define __NR_readahead 225 +#define __NR_setxattr 226 +#define __NR_lsetxattr 227 +#define __NR_fsetxattr 228 +#define __NR_getxattr 229 +#define __NR_lgetxattr 230 +#define __NR_fgetxattr 231 +#define __NR_listxattr 232 +#define __NR_llistxattr 233 +#define __NR_flistxattr 234 +#define __NR_removexattr 235 +#define __NR_lremovexattr 236 +#define __NR_fremovexattr 237 +#define __NR_tkill 238 +#define __NR_sendfile64 239 +#define __NR_futex 240 +#define __NR_sched_setaffinity 241 +#define __NR_sched_getaffinity 242 +#define __NR_set_thread_area 243 +#define __NR_get_thread_area 244 +#define __NR_io_setup 245 +#define __NR_io_destroy 246 +#define __NR_io_getevents 247 +#define __NR_io_submit 248 +#define __NR_io_cancel 249 +#define __NR_fadvise64 250 + +#define __NR_exit_group 252 +#define __NR_lookup_dcookie 253 +#define __NR_epoll_create 254 +#define __NR_epoll_ctl 255 +#define __NR_epoll_wait 256 +#define __NR_remap_file_pages 257 +#define __NR_set_tid_address 258 +#define __NR_timer_create 259 +#define __NR_timer_settime (__NR_timer_create+1) +#define __NR_timer_gettime (__NR_timer_create+2) +#define __NR_timer_getoverrun (__NR_timer_create+3) +#define __NR_timer_delete (__NR_timer_create+4) +#define __NR_clock_settime (__NR_timer_create+5) +#define __NR_clock_gettime (__NR_timer_create+6) +#define __NR_clock_getres (__NR_timer_create+7) +#define __NR_clock_nanosleep (__NR_timer_create+8) +#define __NR_statfs64 268 +#define __NR_fstatfs64 269 +#define __NR_tgkill 270 +#define __NR_utimes 271 +#define __NR_fadvise64_64 272 +#define __NR_vserver 273 +#define __NR_mbind 274 +#define __NR_get_mempolicy 275 +#define __NR_set_mempolicy 276 +#define __NR_mq_open 277 +#define __NR_mq_unlink (__NR_mq_open+1) +#define __NR_mq_timedsend (__NR_mq_open+2) +#define __NR_mq_timedreceive (__NR_mq_open+3) +#define __NR_mq_notify (__NR_mq_open+4) +#define __NR_mq_getsetattr (__NR_mq_open+5) +#define __NR_kexec_load 283 +#define __NR_waitid 284 +#define __NR_add_key 286 +#define __NR_request_key 287 +#define __NR_keyctl 288 +#define __NR_cacheflush 289 +#define __NR_ioprio_set 290 +#define __NR_ioprio_get 291 +#define __NR_inotify_init 292 +#define __NR_inotify_add_watch 293 +#define __NR_inotify_rm_watch 294 +#define __NR_migrate_pages 295 +#define __NR_openat 296 +#define __NR_mkdirat 297 +#define __NR_mknodat 298 +#define __NR_fchownat 299 +#define __NR_futimesat 300 +#define __NR_fstatat64 301 +#define __NR_unlinkat 302 +#define __NR_renameat 303 +#define __NR_linkat 304 +#define __NR_symlinkat 305 +#define __NR_readlinkat 306 +#define __NR_fchmodat 307 +#define __NR_faccessat 308 +#define __NR_pselect6 309 +#define __NR_ppoll 310 +#define __NR_unshare 311 +#define __NR_set_robust_list 312 +#define __NR_get_robust_list 313 +#define __NR_splice 314 +#define __NR_sync_file_range 315 +#define __NR_tee 316 +#define __NR_vmsplice 317 +#define __NR_move_pages 318 +#define __NR_getcpu 319 +#define __NR_epoll_pwait 320 +#define __NR_utimensat 321 +#define __NR_signalfd 322 +#define __NR_timerfd_create 323 +#define __NR_eventfd 324 +#define __NR_fallocate 325 +#define __NR_timerfd_settime 326 +#define __NR_timerfd_gettime 327 +#define __NR_signalfd4 328 +#define __NR_eventfd2 329 +#define __NR_epoll_create1 330 +#define __NR_dup3 331 +#define __NR_pipe2 332 +#define __NR_inotify_init1 333 + +#ifdef __KERNEL__ + +#define NR_syscalls 326 + +/* + * specify the deprecated syscalls we want to support on this arch + */ +#define __ARCH_WANT_IPC_PARSE_VERSION +#define __ARCH_WANT_OLD_READDIR +#define __ARCH_WANT_OLD_STAT +#define __ARCH_WANT_STAT64 +#define __ARCH_WANT_SYS_ALARM +#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_PAUSE +#define __ARCH_WANT_SYS_SGETMASK +#define __ARCH_WANT_SYS_SIGNAL +#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_SYS_UTIME +#define __ARCH_WANT_SYS_WAITPID +#define __ARCH_WANT_SYS_SOCKETCALL +#define __ARCH_WANT_SYS_FADVISE64 +#define __ARCH_WANT_SYS_GETPGRP +#define __ARCH_WANT_SYS_LLSEEK +#define __ARCH_WANT_SYS_NICE +#define __ARCH_WANT_SYS_OLD_GETRLIMIT +#define __ARCH_WANT_SYS_OLDUMOUNT +#define __ARCH_WANT_SYS_SIGPENDING +#define __ARCH_WANT_SYS_SIGPROCMASK +#define __ARCH_WANT_SYS_RT_SIGACTION +#define __ARCH_WANT_SYS_RT_SIGSUSPEND + +/* + * "Conditional" syscalls + * + * What we want is __attribute__((weak,alias("sys_ni_syscall"))), + * but it doesn't work on all toolchains, so we just do it by hand + */ +#ifndef cond_syscall +#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); +#endif + +#endif /* __KERNEL__ */ +#endif /* _ASM_UNISTD_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/clock.h b/arch/mn10300/include/asm/unit-asb2303/clock.h new file mode 100644 index 0000000..8b450e9 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2303/clock.h @@ -0,0 +1,45 @@ +/* ASB2303-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_CLOCK_H +#define _ASM_UNIT_CLOCK_H + +#ifndef __ASSEMBLY__ + +#ifdef CONFIG_MN10300_RTC + +extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ +extern unsigned long mn10300_iobclk; +extern unsigned long mn10300_tsc_per_HZ; + +#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) +/* If this processors has a another clock, uncomment the below. */ +/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ + +#else /* !CONFIG_MN10300_RTC */ + +#define MN10300_IOCLK 33333333UL +/* #define MN10300_IOBCLK 66666666UL */ + +#endif /* !CONFIG_MN10300_RTC */ + +#define MN10300_JCCLK MN10300_IOCLK +#define MN10300_TSCCLK MN10300_IOCLK + +#ifdef CONFIG_MN10300_RTC +#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) +#else /* !CONFIG_MN10300_RTC */ +#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) +#endif /* !CONFIG_MN10300_RTC */ + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/leds.h b/arch/mn10300/include/asm/unit-asb2303/leds.h new file mode 100644 index 0000000..3a7543e --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2303/leds.h @@ -0,0 +1,43 @@ +/* ASB2303-specific LEDs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_LEDS_H +#define _ASM_UNIT_LEDS_H + +#include +#include +#include + +#define ASB2303_GPIO0DEF __SYSREG(0xDB000000, u32) +#define ASB2303_7SEGLEDS __SYSREG(0xDB000008, u32) + +/* + * use the 7-segment LEDs to indicate states + */ + +/* flip the 7-segment LEDs between "G" and "-" */ +#define mn10300_set_gdbleds(ONOFF) \ +do { \ + ASB2303_7SEGLEDS = (ONOFF) ? 0x85 : 0x7f; \ +} while (0) + +/* indicate double-fault by displaying "d" on the LEDs */ +#define mn10300_set_dbfleds \ + mov 0x43,d0 ; \ + movbu d0,(ASB2303_7SEGLEDS) + +#ifndef __ASSEMBLY__ +extern void peripheral_leds_display_exception(enum exception_code code); +extern void peripheral_leds_led_chase(void); +extern void debug_to_serial(const char *p, int n); +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/serial.h b/arch/mn10300/include/asm/unit-asb2303/serial.h new file mode 100644 index 0000000..0d55cf5 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2303/serial.h @@ -0,0 +1,136 @@ +/* ASB2303-specific 8250 serial ports + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_SERIAL_H +#define _ASM_UNIT_SERIAL_H + +#include +#include +#include + +#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 +#define SERIAL_PORT1_BASE_ADDRESS 0xA6FC0000 + +#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ + +/* + * dispose of the /dev/ttyS0 and /dev/ttyS1 serial ports + */ +#ifndef CONFIG_GDBSTUB_ON_TTYSx + +#define SERIAL_PORT_DFNS \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT1_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, + +#ifndef __ASSEMBLY__ + +static inline void __debug_to_serial(const char *p, int n) +{ +} + +#endif /* !__ASSEMBLY__ */ + +#else /* CONFIG_GDBSTUB_ON_TTYSx */ + +#define SERIAL_PORT_DFNS /* both stolen by gdb-stub because they share an IRQ */ + +#if defined(CONFIG_GDBSTUB_ON_TTYS0) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ + +#elif defined(CONFIG_GDBSTUB_ON_TTYS1) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ +#endif + +#ifndef __ASSEMBLY__ + +#define LSR_WAIT_FOR(STATE) \ +do { \ + while (!(GDBPORT_SERIAL_LSR & UART_LSR_##STATE)) {} \ +} while (0) +#define FLOWCTL_WAIT_FOR(LINE) \ +do { \ + while (!(GDBPORT_SERIAL_MSR & UART_MSR_##LINE)) {} \ +} while (0) +#define FLOWCTL_CLEAR(LINE) \ +do { \ + GDBPORT_SERIAL_MCR &= ~UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_SET(LINE) \ +do { \ + GDBPORT_SERIAL_MCR |= UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_QUERY(LINE) ({ GDBPORT_SERIAL_MSR & UART_MSR_##LINE; }) + +static inline void __debug_to_serial(const char *p, int n) +{ + char ch; + + FLOWCTL_SET(DTR); + + for (; n > 0; n--) { + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + + ch = *p++; + if (ch == 0x0a) { + GDBPORT_SERIAL_TX = 0x0d; + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + } + GDBPORT_SERIAL_TX = ch; + } + + FLOWCTL_CLEAR(DTR); +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* CONFIG_GDBSTUB_ON_TTYSx */ + +#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/smc91111.h b/arch/mn10300/include/asm/unit-asb2303/smc91111.h new file mode 100644 index 0000000..dd456e9 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2303/smc91111.h @@ -0,0 +1,50 @@ +/* Support for the SMC91C111 NIC on an ASB2303 + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_SMC91111_H +#define _ASM_UNIT_SMC91111_H + +#include + +#define SMC91111_BASE 0xAA000300UL +#define SMC91111_BASE_END 0xAA000400UL +#define SMC91111_IRQ XIRQ3 + +#define SMC_CAN_USE_8BIT 0 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 0 +#define SMC_NOWAIT 1 +#define SMC_IRQ_FLAGS (0) + +#if SMC_CAN_USE_8BIT +#define SMC_inb(a, r) inb((unsigned long) ((a) + (r))) +#define SMC_outb(v, a, r) outb(v, (unsigned long) ((a) + (r))) +#endif + +#if SMC_CAN_USE_16BIT +#define SMC_inw(a, r) inw((unsigned long) ((a) + (r))) +#define SMC_outw(v, a, r) outw(v, (unsigned long) ((a) + (r))) +#define SMC_insw(a, r, p, l) insw((unsigned long) ((a) + (r)), (p), (l)) +#define SMC_outsw(a, r, p, l) outsw((unsigned long) ((a) + (r)), (p), (l)) +#endif + +#if SMC_CAN_USE_32BIT +#define SMC_inl(a, r) inl((unsigned long) ((a) + (r))) +#define SMC_outl(v, a, r) outl(v, (unsigned long) ((a) + (r))) +#define SMC_insl(a, r, p, l) insl((unsigned long) ((a) + (r)), (p), (l)) +#define SMC_outsl(a, r, p, l) outsl((unsigned long) ((a) + (r)), (p), (l)) +#endif + +#define RPC_LSA_DEFAULT RPC_LED_100_10 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX + +#define set_irq_type(irq, type) + +#endif /* _ASM_UNIT_SMC91111_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/timex.h b/arch/mn10300/include/asm/unit-asb2303/timex.h new file mode 100644 index 0000000..7e54b0cf --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2303/timex.h @@ -0,0 +1,135 @@ +/* ASB2303-specific timer specifcations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_TIMEX_H +#define _ASM_UNIT_TIMEX_H + +#ifndef __ASSEMBLY__ +#include +#endif /* __ASSEMBLY__ */ + +#include +#include + +/* + * jiffies counter specifications + */ + +#define TMJCBR_MAX 0xffff +#define TMJCBC TM01BC + +#define TMJCMD TM01MD +#define TMJCBR TM01BR +#define TMJCIRQ TM1IRQ +#define TMJCICR TM1ICR +#define TMJCICR_LEVEL GxICR_LEVEL_5 + +#ifndef __ASSEMBLY__ + +static inline void startup_jiffies_counter(void) +{ + unsigned rate; + u16 md, t16; + + /* use as little prescaling as possible to avoid losing accuracy */ + md = TM0MD_SRC_IOCLK; + rate = MN10300_JCCLK / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_8; + rate = MN10300_JCCLK / 8 / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_32; + rate = MN10300_JCCLK / 32 / HZ; + + if (rate > TMJCBR_MAX) + BUG(); + } + } + + TMJCBR = rate - 1; + t16 = TMJCBR; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_INIT_COUNTER | + TM1MD_INIT_COUNTER << 8; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_COUNT_ENABLE | + TM1MD_COUNT_ENABLE << 8; + + t16 = TMJCMD; + + TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; + t16 = TMJCICR; +} + +static inline void shutdown_jiffies_counter(void) +{ +} + +#endif /* !__ASSEMBLY__ */ + + +/* + * timestamp counter specifications + */ + +#define TMTSCBR_MAX 0xffffffff +#define TMTSCBC TM45BC + +#ifndef __ASSEMBLY__ + +static inline void startup_timestamp_counter(void) +{ + /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time + * - count down from 4Gig-1 to 0 and wrap at IOCLK rate + */ + TM45BR = TMTSCBR_MAX; + + TM4MD = TM4MD_SRC_IOCLK; + TM4MD |= TM4MD_INIT_COUNTER; + TM4MD &= ~TM4MD_INIT_COUNTER; + TM4ICR = 0; + + TM5MD = TM5MD_SRC_TM4CASCADE; + TM5MD |= TM5MD_INIT_COUNTER; + TM5MD &= ~TM5MD_INIT_COUNTER; + TM5ICR = 0; + + TM5MD |= TM5MD_COUNT_ENABLE; + TM4MD |= TM4MD_COUNT_ENABLE; +} + +static inline void shutdown_timestamp_counter(void) +{ + TM4MD = 0; + TM5MD = 0; +} + +/* + * we use a cascaded pair of 16-bit down-counting timers to count I/O + * clock cycles for the purposes of time keeping + */ +typedef unsigned long cycles_t; + +static inline cycles_t read_timestamp_counter(void) +{ + return (cycles_t)TMTSCBC; +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/clock.h b/arch/mn10300/include/asm/unit-asb2305/clock.h new file mode 100644 index 0000000..7d51484 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2305/clock.h @@ -0,0 +1,45 @@ +/* ASB2305-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_CLOCK_H +#define _ASM_UNIT_CLOCK_H + +#ifndef __ASSEMBLY__ + +#ifdef CONFIG_MN10300_RTC + +extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ +extern unsigned long mn10300_iobclk; +extern unsigned long mn10300_tsc_per_HZ; + +#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) +/* If this processors has a another clock, uncomment the below. */ +/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ + +#else /* !CONFIG_MN10300_RTC */ + +#define MN10300_IOCLK 33333333UL +/* #define MN10300_IOBCLK 66666666UL */ + +#endif /* !CONFIG_MN10300_RTC */ + +#define MN10300_JCCLK MN10300_IOCLK +#define MN10300_TSCCLK MN10300_IOCLK + +#ifdef CONFIG_MN10300_RTC +#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) +#else /* !CONFIG_MN10300_RTC */ +#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) +#endif /* !CONFIG_MN10300_RTC */ + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/leds.h b/arch/mn10300/include/asm/unit-asb2305/leds.h new file mode 100644 index 0000000..bc471f6 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2305/leds.h @@ -0,0 +1,51 @@ +/* ASB2305-specific LEDs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_LEDS_H +#define _ASM_UNIT_LEDS_H + +#include +#include +#include + +#define ASB2305_7SEGLEDS __SYSREG(0xA6F90000, u32) + +/* perform a hard reset by driving PIO06 low */ +#define mn10300_unit_hard_reset() \ +do { \ + P0OUT &= 0xbf; \ + P0MD = (P0MD & P0MD_6) | P0MD_6_OUT; \ +} while (0) + +/* + * use the 7-segment LEDs to indicate states + */ +/* indicate double-fault by displaying "db-f" on the LEDs */ +#define mn10300_set_dbfleds \ + mov 0x43077f1d,d0 ; \ + mov d0,(ASB2305_7SEGLEDS) + +/* flip the 7-segment LEDs between "Gdb-" and "----" */ +#define mn10300_set_gdbleds(ONOFF) \ +do { \ + ASB2305_7SEGLEDS = (ONOFF) ? 0x8543077f : 0x7f7f7f7f; \ +} while (0) + +#ifndef __ASSEMBLY__ +extern void peripheral_leds_display_exception(enum exception_code); +extern void peripheral_leds_led_chase(void); +extern void peripheral_leds7x4_display_dec(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_hex(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_minssecs(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_rtc(void); +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/serial.h b/arch/mn10300/include/asm/unit-asb2305/serial.h new file mode 100644 index 0000000..73d31d6 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2305/serial.h @@ -0,0 +1,120 @@ +/* ASB2305-specific 8250 serial ports + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_SERIAL_H +#define _ASM_UNIT_SERIAL_H + +#include +#include +#include + +#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 +#define ASB2305_DEBUG_MCR __SYSREG(0xA6FB0000 + UART_MCR * 2, u8) + +#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ + +/* + * dispose of the /dev/ttyS0 serial port + */ +#ifndef CONFIG_GDBSTUB_ON_TTYSx + +#define SERIAL_PORT_DFNS \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, + +#ifndef __ASSEMBLY__ + +static inline void __debug_to_serial(const char *p, int n) +{ +} + +#endif /* !__ASSEMBLY__ */ + +#else /* CONFIG_GDBSTUB_ON_TTYSx */ + +#define SERIAL_PORT_DFNS /* stolen by gdb-stub */ + +#if defined(CONFIG_GDBSTUB_ON_TTYS0) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ + +#elif defined(CONFIG_GDBSTUB_ON_TTYS1) +#error The ASB2305 doesnt have a /dev/ttyS1 +#endif + +#ifndef __ASSEMBLY__ + +#define TTYS0_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define TTYS0_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define TTYS0_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define TTYS0_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) + +#define LSR_WAIT_FOR(STATE) \ +do { \ + while (!(TTYS0_LSR & UART_LSR_##STATE)) {} \ +} while (0) +#define FLOWCTL_WAIT_FOR(LINE) \ +do { \ + while (!(TTYS0_MSR & UART_MSR_##LINE)) {} \ +} while (0) +#define FLOWCTL_CLEAR(LINE) \ +do { \ + TTYS0_MCR &= ~UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_SET(LINE) \ +do { \ + TTYS0_MCR |= UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_QUERY(LINE) ({ TTYS0_MSR & UART_MSR_##LINE; }) + +static inline void __debug_to_serial(const char *p, int n) +{ + char ch; + + FLOWCTL_SET(DTR); + + for (; n > 0; n--) { + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + + ch = *p++; + if (ch == 0x0a) { + TTYS0_TX = 0x0d; + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + } + TTYS0_TX = ch; + } + + FLOWCTL_CLEAR(DTR); +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* CONFIG_GDBSTUB_ON_TTYSx */ + +#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/timex.h b/arch/mn10300/include/asm/unit-asb2305/timex.h new file mode 100644 index 0000000..10e1bfe3 --- /dev/null +++ b/arch/mn10300/include/asm/unit-asb2305/timex.h @@ -0,0 +1,135 @@ +/* ASB2305 timer specifcations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_TIMEX_H +#define _ASM_UNIT_TIMEX_H + +#ifndef __ASSEMBLY__ +#include +#endif /* __ASSEMBLY__ */ + +#include +#include + +/* + * jiffies counter specifications + */ + +#define TMJCBR_MAX 0xffff +#define TMJCBC TM01BC + +#define TMJCMD TM01MD +#define TMJCBR TM01BR +#define TMJCIRQ TM1IRQ +#define TMJCICR TM1ICR +#define TMJCICR_LEVEL GxICR_LEVEL_5 + +#ifndef __ASSEMBLY__ + +static inline void startup_jiffies_counter(void) +{ + unsigned rate; + u16 md, t16; + + /* use as little prescaling as possible to avoid losing accuracy */ + md = TM0MD_SRC_IOCLK; + rate = MN10300_JCCLK / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_8; + rate = MN10300_JCCLK / 8 / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_32; + rate = MN10300_JCCLK / 32 / HZ; + + if (rate > TMJCBR_MAX) + BUG(); + } + } + + TMJCBR = rate - 1; + t16 = TMJCBR; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_INIT_COUNTER | + TM1MD_INIT_COUNTER << 8; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_COUNT_ENABLE | + TM1MD_COUNT_ENABLE << 8; + + t16 = TMJCMD; + + TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; + t16 = TMJCICR; +} + +static inline void shutdown_jiffies_counter(void) +{ +} + +#endif /* !__ASSEMBLY__ */ + + +/* + * timestamp counter specifications + */ + +#define TMTSCBR_MAX 0xffffffff +#define TMTSCBC TM45BC + +#ifndef __ASSEMBLY__ + +static inline void startup_timestamp_counter(void) +{ + /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time + * - count down from 4Gig-1 to 0 and wrap at IOCLK rate + */ + TM45BR = TMTSCBR_MAX; + + TM4MD = TM4MD_SRC_IOCLK; + TM4MD |= TM4MD_INIT_COUNTER; + TM4MD &= ~TM4MD_INIT_COUNTER; + TM4ICR = 0; + + TM5MD = TM5MD_SRC_TM4CASCADE; + TM5MD |= TM5MD_INIT_COUNTER; + TM5MD &= ~TM5MD_INIT_COUNTER; + TM5ICR = 0; + + TM5MD |= TM5MD_COUNT_ENABLE; + TM4MD |= TM4MD_COUNT_ENABLE; +} + +static inline void shutdown_timestamp_counter(void) +{ + TM4MD = 0; + TM5MD = 0; +} + +/* + * we use a cascaded pair of 16-bit down-counting timers to count I/O + * clock cycles for the purposes of time keeping + */ +typedef unsigned long cycles_t; + +static inline cycles_t read_timestamp_counter(void) +{ + return (cycles_t) TMTSCBC; +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/include/asm/user.h b/arch/mn10300/include/asm/user.h new file mode 100644 index 0000000..e119390 --- /dev/null +++ b/arch/mn10300/include/asm/user.h @@ -0,0 +1,53 @@ +/* MN10300 User process data + * + * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_USER_H +#define _ASM_USER_H + +#include +#include + +#ifndef __ASSEMBLY__ +/* + * When the kernel dumps core, it starts by dumping the user struct - this will + * be used by gdb to figure out where the data and stack segments are within + * the file, and what virtual addresses to use. + */ +struct user { + /* We start with the registers, to mimic the way that "memory" is + * returned from the ptrace(3,...) function. + */ + struct pt_regs regs; /* Where the registers are actually stored */ + + /* The rest of this junk is to help gdb figure out what goes where */ + unsigned long int u_tsize; /* Text segment size (pages). */ + unsigned long int u_dsize; /* Data segment size (pages). */ + unsigned long int u_ssize; /* Stack segment size (pages). */ + unsigned long start_code; /* Starting virtual address of text. */ + unsigned long start_stack; /* Starting virtual address of stack area. + This is actually the bottom of the stack, + the top of the stack is always found in the + esp register. */ + long int signal; /* Signal that caused the core dump. */ + int reserved; /* No longer used */ + struct user_pt_regs *u_ar0; /* Used by gdb to help find the values for */ + + /* the registers */ + unsigned long magic; /* To uniquely identify a core file */ + char u_comm[32]; /* User command that was responsible */ +}; +#endif + +#define NBPG PAGE_SIZE +#define UPAGES 1 +#define HOST_TEXT_START_ADDR +(u.start_code) +#define HOST_STACK_END_ADDR +(u.start_stack + u.u_ssize * NBPG) + +#endif /* _ASM_USER_H */ diff --git a/arch/mn10300/include/asm/vga.h b/arch/mn10300/include/asm/vga.h new file mode 100644 index 0000000..0163e50 --- /dev/null +++ b/arch/mn10300/include/asm/vga.h @@ -0,0 +1,17 @@ +/* MN10300 VGA register definitions + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_VGA_H +#define _ASM_VGA_H + + + +#endif /* _ASM_VGA_H */ diff --git a/arch/mn10300/include/asm/xor.h b/arch/mn10300/include/asm/xor.h new file mode 100644 index 0000000..c82eb12 --- /dev/null +++ b/arch/mn10300/include/asm/xor.h @@ -0,0 +1 @@ +#include diff --git a/include/asm-mn10300/Kbuild b/include/asm-mn10300/Kbuild deleted file mode 100644 index c68e168..0000000 --- a/include/asm-mn10300/Kbuild +++ /dev/null @@ -1 +0,0 @@ -include include/asm-generic/Kbuild.asm diff --git a/include/asm-mn10300/atomic.h b/include/asm-mn10300/atomic.h deleted file mode 100644 index bc06482..0000000 --- a/include/asm-mn10300/atomic.h +++ /dev/null @@ -1,157 +0,0 @@ -/* MN10300 Atomic counter operations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_ATOMIC_H -#define _ASM_ATOMIC_H - -#ifdef CONFIG_SMP -#error not SMP safe -#endif - -/* - * Atomic operations that C can't guarantee us. Useful for - * resource counting etc.. - */ - -#define ATOMIC_INIT(i) { (i) } - -#ifdef __KERNEL__ - -/** - * atomic_read - read atomic variable - * @v: pointer of type atomic_t - * - * Atomically reads the value of @v. Note that the guaranteed - * useful range of an atomic_t is only 24 bits. - */ -#define atomic_read(v) ((v)->counter) - -/** - * atomic_set - set atomic variable - * @v: pointer of type atomic_t - * @i: required value - * - * Atomically sets the value of @v to @i. Note that the guaranteed - * useful range of an atomic_t is only 24 bits. - */ -#define atomic_set(v, i) (((v)->counter) = (i)) - -#include - -/** - * atomic_add_return - add integer to atomic variable - * @i: integer value to add - * @v: pointer of type atomic_t - * - * Atomically adds @i to @v and returns the result - * Note that the guaranteed useful range of an atomic_t is only 24 bits. - */ -static inline int atomic_add_return(int i, atomic_t *v) -{ - unsigned long flags; - int temp; - - local_irq_save(flags); - temp = v->counter; - temp += i; - v->counter = temp; - local_irq_restore(flags); - - return temp; -} - -/** - * atomic_sub_return - subtract integer from atomic variable - * @i: integer value to subtract - * @v: pointer of type atomic_t - * - * Atomically subtracts @i from @v and returns the result - * Note that the guaranteed useful range of an atomic_t is only 24 bits. - */ -static inline int atomic_sub_return(int i, atomic_t *v) -{ - unsigned long flags; - int temp; - - local_irq_save(flags); - temp = v->counter; - temp -= i; - v->counter = temp; - local_irq_restore(flags); - - return temp; -} - -static inline int atomic_add_negative(int i, atomic_t *v) -{ - return atomic_add_return(i, v) < 0; -} - -static inline void atomic_add(int i, atomic_t *v) -{ - atomic_add_return(i, v); -} - -static inline void atomic_sub(int i, atomic_t *v) -{ - atomic_sub_return(i, v); -} - -static inline void atomic_inc(atomic_t *v) -{ - atomic_add_return(1, v); -} - -static inline void atomic_dec(atomic_t *v) -{ - atomic_sub_return(1, v); -} - -#define atomic_dec_return(v) atomic_sub_return(1, (v)) -#define atomic_inc_return(v) atomic_add_return(1, (v)) - -#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0) -#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) -#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) - -#define atomic_add_unless(v, a, u) \ -({ \ - int c, old; \ - c = atomic_read(v); \ - while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ - c = old; \ - c != (u); \ -}) - -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) - -static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) -{ - unsigned long flags; - - mask = ~mask; - local_irq_save(flags); - *addr &= mask; - local_irq_restore(flags); -} - -#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) -#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) - -/* Atomic operations are already serializing on MN10300??? */ -#define smp_mb__before_atomic_dec() barrier() -#define smp_mb__after_atomic_dec() barrier() -#define smp_mb__before_atomic_inc() barrier() -#define smp_mb__after_atomic_inc() barrier() - -#include - -#endif /* __KERNEL__ */ -#endif /* _ASM_ATOMIC_H */ diff --git a/include/asm-mn10300/auxvec.h b/include/asm-mn10300/auxvec.h deleted file mode 100644 index 4fdb60b..0000000 --- a/include/asm-mn10300/auxvec.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ASM_AUXVEC_H -#define _ASM_AUXVEC_H - -#endif diff --git a/include/asm-mn10300/bitops.h b/include/asm-mn10300/bitops.h deleted file mode 100644 index 0b610f4..0000000 --- a/include/asm-mn10300/bitops.h +++ /dev/null @@ -1,240 +0,0 @@ -/* MN10300 bit operations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - * - * These have to be done with inline assembly: that way the bit-setting - * is guaranteed to be atomic. All bit operations return 0 if the bit - * was cleared before the operation and != 0 if it was not. - * - * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). - */ -#ifndef __ASM_BITOPS_H -#define __ASM_BITOPS_H - -#include - -#define smp_mb__before_clear_bit() barrier() -#define smp_mb__after_clear_bit() barrier() - -/* - * set bit - */ -#define __set_bit(nr, addr) \ -({ \ - volatile unsigned char *_a = (unsigned char *)(addr); \ - const unsigned shift = (nr) & 7; \ - _a += (nr) >> 3; \ - \ - asm volatile("bset %2,(%1) # set_bit reg" \ - : "=m"(*_a) \ - : "a"(_a), "d"(1 << shift), "m"(*_a) \ - : "memory", "cc"); \ -}) - -#define set_bit(nr, addr) __set_bit((nr), (addr)) - -/* - * clear bit - */ -#define ___clear_bit(nr, addr) \ -({ \ - volatile unsigned char *_a = (unsigned char *)(addr); \ - const unsigned shift = (nr) & 7; \ - _a += (nr) >> 3; \ - \ - asm volatile("bclr %2,(%1) # clear_bit reg" \ - : "=m"(*_a) \ - : "a"(_a), "d"(1 << shift), "m"(*_a) \ - : "memory", "cc"); \ -}) - -#define clear_bit(nr, addr) ___clear_bit((nr), (addr)) - - -static inline void __clear_bit(int nr, volatile void *addr) -{ - unsigned int *a = (unsigned int *) addr; - int mask; - - a += nr >> 5; - mask = 1 << (nr & 0x1f); - *a &= ~mask; -} - -/* - * test bit - */ -static inline int test_bit(int nr, const volatile void *addr) -{ - return 1UL & (((const unsigned int *) addr)[nr >> 5] >> (nr & 31)); -} - -/* - * change bit - */ -static inline void __change_bit(int nr, volatile void *addr) -{ - int mask; - unsigned int *a = (unsigned int *) addr; - - a += nr >> 5; - mask = 1 << (nr & 0x1f); - *a ^= mask; -} - -extern void change_bit(int nr, volatile void *addr); - -/* - * test and set bit - */ -#define __test_and_set_bit(nr,addr) \ -({ \ - volatile unsigned char *_a = (unsigned char *)(addr); \ - const unsigned shift = (nr) & 7; \ - unsigned epsw; \ - _a += (nr) >> 3; \ - \ - asm volatile("bset %3,(%2) # test_set_bit reg\n" \ - "mov epsw,%1" \ - : "=m"(*_a), "=d"(epsw) \ - : "a"(_a), "d"(1 << shift), "m"(*_a) \ - : "memory", "cc"); \ - \ - !(epsw & EPSW_FLAG_Z); \ -}) - -#define test_and_set_bit(nr, addr) __test_and_set_bit((nr), (addr)) - -/* - * test and clear bit - */ -#define __test_and_clear_bit(nr, addr) \ -({ \ - volatile unsigned char *_a = (unsigned char *)(addr); \ - const unsigned shift = (nr) & 7; \ - unsigned epsw; \ - _a += (nr) >> 3; \ - \ - asm volatile("bclr %3,(%2) # test_clear_bit reg\n" \ - "mov epsw,%1" \ - : "=m"(*_a), "=d"(epsw) \ - : "a"(_a), "d"(1 << shift), "m"(*_a) \ - : "memory", "cc"); \ - \ - !(epsw & EPSW_FLAG_Z); \ -}) - -#define test_and_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr)) - -/* - * test and change bit - */ -static inline int __test_and_change_bit(int nr, volatile void *addr) -{ - int mask, retval; - unsigned int *a = (unsigned int *)addr; - - a += nr >> 5; - mask = 1 << (nr & 0x1f); - retval = (mask & *a) != 0; - *a ^= mask; - - return retval; -} - -extern int test_and_change_bit(int nr, volatile void *addr); - -#include - -#ifdef __KERNEL__ - -/** - * __ffs - find first bit set - * @x: the word to search - * - * - return 31..0 to indicate bit 31..0 most least significant bit set - * - if no bits are set in x, the result is undefined - */ -static inline __attribute__((const)) -unsigned long __ffs(unsigned long x) -{ - int bit; - asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(x & -x)); - return bit; -} - -/* - * special slimline version of fls() for calculating ilog2_u32() - * - note: no protection against n == 0 - */ -static inline __attribute__((const)) -int __ilog2_u32(u32 n) -{ - int bit; - asm("bsch %2,%0" : "=r"(bit) : "0"(0), "r"(n)); - return bit; -} - -/** - * fls - find last bit set - * @x: the word to search - * - * This is defined the same way as ffs: - * - return 32..1 to indicate bit 31..0 most significant bit set - * - return 0 to indicate no bits set - */ -static inline __attribute__((const)) -int fls(int x) -{ - return (x != 0) ? __ilog2_u32(x) + 1 : 0; -} - -/** - * __fls - find last (most-significant) set bit in a long word - * @word: the word to search - * - * Undefined if no set bit exists, so code should check against 0 first. - */ -static inline unsigned long __fls(unsigned long word) -{ - return __ilog2_u32(word); -} - -/** - * ffs - find first bit set - * @x: the word to search - * - * - return 32..1 to indicate bit 31..0 most least significant bit set - * - return 0 to indicate no bits set - */ -static inline __attribute__((const)) -int ffs(int x) -{ - /* Note: (x & -x) gives us a mask that is the least significant - * (rightmost) 1-bit of the value in x. - */ - return fls(x & -x); -} - -#include -#include -#include -#include -#include - -#define ext2_set_bit_atomic(lock, nr, addr) \ - test_and_set_bit((nr) ^ 0x18, (addr)) -#define ext2_clear_bit_atomic(lock, nr, addr) \ - test_and_clear_bit((nr) ^ 0x18, (addr)) - -#include -#include - -#endif /* __KERNEL__ */ -#endif /* __ASM_BITOPS_H */ diff --git a/include/asm-mn10300/bug.h b/include/asm-mn10300/bug.h deleted file mode 100644 index 4fcf338..0000000 --- a/include/asm-mn10300/bug.h +++ /dev/null @@ -1,35 +0,0 @@ -/* MN10300 Kernel bug reporting - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_BUG_H -#define _ASM_BUG_H - -/* - * Tell the user there is some problem. - */ -#define _debug_bug_trap() \ -do { \ - asm volatile( \ - " syscall 15 \n" \ - "0: \n" \ - " .section __bug_table,\"a\" \n" \ - " .long 0b,%0,%1 \n" \ - " .previous \n" \ - : \ - : "i"(__FILE__), "i"(__LINE__) \ - ); \ -} while (0) - -#define BUG() _debug_bug_trap() - -#define HAVE_ARCH_BUG -#include - -#endif /* _ASM_BUG_H */ diff --git a/include/asm-mn10300/bugs.h b/include/asm-mn10300/bugs.h deleted file mode 100644 index 31c8bc5..0000000 --- a/include/asm-mn10300/bugs.h +++ /dev/null @@ -1,20 +0,0 @@ -/* MN10300 Checks for architecture-dependent bugs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_BUGS_H -#define _ASM_BUGS_H - -#include - -static inline void __init check_bugs(void) -{ -} - -#endif /* _ASM_BUGS_H */ diff --git a/include/asm-mn10300/busctl-regs.h b/include/asm-mn10300/busctl-regs.h deleted file mode 100644 index 1632aef..0000000 --- a/include/asm-mn10300/busctl-regs.h +++ /dev/null @@ -1,151 +0,0 @@ -/* AM33v2 on-board bus controller registers - * - * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_BUSCTL_REGS_H -#define _ASM_BUSCTL_REGS_H - -#include - -#ifdef __KERNEL__ - -/* bus controller registers */ -#define BCCR __SYSREG(0xc0002000, u32) /* bus controller control reg */ -#define BCCR_B0AD 0x00000003 /* block 0 (80000000-83ffffff) bus allocation */ -#define BCCR_B1AD 0x0000000c /* block 1 (84000000-87ffffff) bus allocation */ -#define BCCR_B2AD 0x00000030 /* block 2 (88000000-8bffffff) bus allocation */ -#define BCCR_B3AD 0x000000c0 /* block 3 (8c000000-8fffffff) bus allocation */ -#define BCCR_B4AD 0x00000300 /* block 4 (90000000-93ffffff) bus allocation */ -#define BCCR_B5AD 0x00000c00 /* block 5 (94000000-97ffffff) bus allocation */ -#define BCCR_B6AD 0x00003000 /* block 6 (98000000-9bffffff) bus allocation */ -#define BCCR_B7AD 0x0000c000 /* block 7 (9c000000-9fffffff) bus allocation */ -#define BCCR_BxAD_EXBUS 0x0 /* - direct to system bus controller */ -#define BCCR_BxAD_OPEXBUS 0x1 /* - direct to memory bus controller */ -#define BCCR_BxAD_OCMBUS 0x2 /* - direct to on chip memory */ -#define BCCR_API 0x00070000 /* bus arbitration priority */ -#define BCCR_API_DMACICD 0x00000000 /* - DMA > CI > CD */ -#define BCCR_API_DMACDCI 0x00010000 /* - DMA > CD > CI */ -#define BCCR_API_CICDDMA 0x00020000 /* - CI > CD > DMA */ -#define BCCR_API_CDCIDMA 0x00030000 /* - CD > CI > DMA */ -#define BCCR_API_ROUNDROBIN 0x00040000 /* - round robin */ -#define BCCR_BEPRI_DMACICD 0x00c00000 /* bus error address priority */ -#define BCCR_BEPRI_DMACDCI 0x00000000 /* - DMA > CI > CD */ -#define BCCR_BEPRI_CICDDMA 0x00400000 /* - DMA > CD > CI */ -#define BCCR_BEPRI_CDCIDMA 0x00800000 /* - CI > CD > DMA */ -#define BCCR_BEPRI 0x00c00000 /* - CD > CI > DMA */ -#define BCCR_TMON 0x03000000 /* timeout value settings */ -#define BCCR_TMON_16IOCLK 0x00000000 /* - 16 IOCLK cycles */ -#define BCCR_TMON_256IOCLK 0x01000000 /* - 256 IOCLK cycles */ -#define BCCR_TMON_4096IOCLK 0x02000000 /* - 4096 IOCLK cycles */ -#define BCCR_TMON_65536IOCLK 0x03000000 /* - 65536 IOCLK cycles */ -#define BCCR_TMOE 0x10000000 /* timeout detection enable */ - -#define BCBERR __SYSREG(0xc0002010, u32) /* bus error source reg */ -#define BCBERR_BESB 0x0000001f /* erroneous access destination space */ -#define BCBERR_BESB_MON 0x00000001 /* - monitor space */ -#define BCBERR_BESB_IO 0x00000002 /* - IO bus */ -#define BCBERR_BESB_EX 0x00000004 /* - EX bus */ -#define BCBERR_BESB_OPEX 0x00000008 /* - OpEX bus */ -#define BCBERR_BESB_OCM 0x00000010 /* - on chip memory */ -#define BCBERR_BERW 0x00000100 /* type of access */ -#define BCBERR_BERW_WRITE 0x00000000 /* - write */ -#define BCBERR_BERW_READ 0x00000100 /* - read */ -#define BCBERR_BESD 0x00000200 /* error detector */ -#define BCBERR_BESD_BCU 0x00000000 /* - BCU detected error */ -#define BCBERR_BESD_SLAVE_BUS 0x00000200 /* - slave bus detected error */ -#define BCBERR_BEBST 0x00000400 /* type of access */ -#define BCBERR_BEBST_SINGLE 0x00000000 /* - single */ -#define BCBERR_BEBST_BURST 0x00000400 /* - burst */ -#define BCBERR_BEME 0x00000800 /* multiple bus error flag */ -#define BCBERR_BEMR 0x00007000 /* master bus that caused the error */ -#define BCBERR_BEMR_NOERROR 0x00000000 /* - no error */ -#define BCBERR_BEMR_CI 0x00001000 /* - CPU instruction fetch bus caused error */ -#define BCBERR_BEMR_CD 0x00002000 /* - CPU data bus caused error */ -#define BCBERR_BEMR_DMA 0x00004000 /* - DMA bus caused error */ - -#define BCBEAR __SYSREGC(0xc0002020, u32) /* bus error address reg */ - -/* system bus controller registers */ -#define SBBASE(X) __SYSREG(0xd8c00100 + (X) * 0x10, u32) /* SBC base addr regs */ -#define SBBASE_BE 0x00000001 /* bank enable */ -#define SBBASE_BAM 0x0000fffe /* bank address mask [31:17] */ -#define SBBASE_BBA 0xfffe0000 /* bank base address [31:17] */ - -#define SBCNTRL0(X) __SYSREG(0xd8c00200 + (X) * 0x10, u32) /* SBC bank ctrl0 regs */ -#define SBCNTRL0_WEH 0x00000f00 /* write enable hold */ -#define SBCNTRL0_REH 0x0000f000 /* read enable hold */ -#define SBCNTRL0_RWH 0x000f0000 /* SRW signal hold */ -#define SBCNTRL0_CSH 0x00f00000 /* chip select hold */ -#define SBCNTRL0_DAH 0x0f000000 /* data hold */ -#define SBCNTRL0_ADH 0xf0000000 /* address hold */ - -#define SBCNTRL1(X) __SYSREG(0xd8c00204 + (X) * 0x10, u32) /* SBC bank ctrl1 regs */ -#define SBCNTRL1_WED 0x00000f00 /* write enable delay */ -#define SBCNTRL1_RED 0x0000f000 /* read enable delay */ -#define SBCNTRL1_RWD 0x000f0000 /* SRW signal delay */ -#define SBCNTRL1_ASW 0x00f00000 /* address strobe width */ -#define SBCNTRL1_CSD 0x0f000000 /* chip select delay */ -#define SBCNTRL1_ASD 0xf0000000 /* address strobe delay */ - -#define SBCNTRL2(X) __SYSREG(0xd8c00208 + (X) * 0x10, u32) /* SBC bank ctrl2 regs */ -#define SBCNTRL2_WC 0x000000ff /* wait count */ -#define SBCNTRL2_BWC 0x00000f00 /* burst wait count */ -#define SBCNTRL2_WM 0x01000000 /* wait mode setting */ -#define SBCNTRL2_WM_FIXEDWAIT 0x00000000 /* - fixed wait access */ -#define SBCNTRL2_WM_HANDSHAKE 0x01000000 /* - handshake access */ -#define SBCNTRL2_BM 0x02000000 /* bus synchronisation mode */ -#define SBCNTRL2_BM_SYNC 0x00000000 /* - synchronous mode */ -#define SBCNTRL2_BM_ASYNC 0x02000000 /* - asynchronous mode */ -#define SBCNTRL2_BW 0x04000000 /* bus width */ -#define SBCNTRL2_BW_32 0x00000000 /* - 32 bits */ -#define SBCNTRL2_BW_16 0x04000000 /* - 16 bits */ -#define SBCNTRL2_RWINV 0x08000000 /* R/W signal invert polarity */ -#define SBCNTRL2_RWINV_NORM 0x00000000 /* - normal (read high) */ -#define SBCNTRL2_RWINV_INV 0x08000000 /* - inverted (read low) */ -#define SBCNTRL2_BT 0x70000000 /* bus type setting */ -#define SBCNTRL2_BT_SRAM 0x00000000 /* - SRAM interface */ -#define SBCNTRL2_BT_ADMUX 0x00000000 /* - addr/data multiplexed interface */ -#define SBCNTRL2_BT_BROM 0x00000000 /* - burst ROM interface */ -#define SBCNTRL2_BTSE 0x80000000 /* burst enable */ - -/* memory bus controller */ -#define SDBASE(X) __SYSREG(0xda000008 + (X) * 0x4, u32) /* MBC base addr regs */ -#define SDBASE_CE 0x00000001 /* chip enable */ -#define SDBASE_CBAM 0x0000fff0 /* chip base address mask [31:20] */ -#define SDBASE_CBAM_SHIFT 16 -#define SDBASE_CBA 0xfff00000 /* chip base address [31:20] */ - -#define SDRAMBUS __SYSREG(0xda000000, u32) /* bus mode control reg */ -#define SDRAMBUS_REFEN 0x00000004 /* refresh enable */ -#define SDRAMBUS_TRC 0x00000018 /* refresh command delay time */ -#define SDRAMBUS_BSTPT 0x00000020 /* burst stop command enable */ -#define SDRAMBUS_PONSEQ 0x00000040 /* power on sequence */ -#define SDRAMBUS_SELFREQ 0x00000080 /* self-refresh mode request */ -#define SDRAMBUS_SELFON 0x00000100 /* self-refresh mode on */ -#define SDRAMBUS_SIZE 0x00030000 /* SDRAM size */ -#define SDRAMBUS_SIZE_64Mbit 0x00010000 /* 64Mbit SDRAM (x16) */ -#define SDRAMBUS_SIZE_128Mbit 0x00020000 /* 128Mbit SDRAM (x16) */ -#define SDRAMBUS_SIZE_256Mbit 0x00030000 /* 256Mbit SDRAM (x16) */ -#define SDRAMBUS_TRASWAIT 0x000c0000 /* row address precharge command cycle number */ -#define SDRAMBUS_REFNUM 0x00300000 /* refresh command number */ -#define SDRAMBUS_BSTWAIT 0x00c00000 /* burst stop command cycle */ -#define SDRAMBUS_SETWAIT 0x03000000 /* mode register setting command cycle */ -#define SDRAMBUS_PREWAIT 0x0c000000 /* precharge command cycle */ -#define SDRAMBUS_RASLATE 0x30000000 /* RAS latency */ -#define SDRAMBUS_CASLATE 0xc0000000 /* CAS latency */ - -#define SDREFCNT __SYSREG(0xda000004, u32) /* refresh period reg */ -#define SDREFCNT_PERI 0x00000fff /* refresh period */ - -#define SDSHDW __SYSREG(0xda000010, u32) /* test reg */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_BUSCTL_REGS_H */ diff --git a/include/asm-mn10300/byteorder.h b/include/asm-mn10300/byteorder.h deleted file mode 100644 index 5dd0bdd..0000000 --- a/include/asm-mn10300/byteorder.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_BYTEORDER_H -#define _ASM_BYTEORDER_H - -#include - -#endif /* _ASM_BYTEORDER_H */ diff --git a/include/asm-mn10300/cache.h b/include/asm-mn10300/cache.h deleted file mode 100644 index 9e01122..0000000 --- a/include/asm-mn10300/cache.h +++ /dev/null @@ -1,54 +0,0 @@ -/* MN10300 cache management registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_CACHE_H -#define _ASM_CACHE_H - -#include -#include - -#ifndef __ASSEMBLY__ -#define L1_CACHE_DISPARITY (L1_CACHE_NENTRIES * L1_CACHE_BYTES) -#else -#define L1_CACHE_DISPARITY L1_CACHE_NENTRIES * L1_CACHE_BYTES -#endif - -/* data cache purge registers - * - read from the register to unconditionally purge that cache line - * - write address & 0xffffff00 to conditionally purge that cache line - * - clear LSB to request invalidation as well - */ -#define DCACHE_PURGE(WAY, ENTRY) \ - __SYSREG(0xc8400000 + (WAY) * L1_CACHE_WAYDISP + \ - (ENTRY) * L1_CACHE_BYTES, u32) - -#define DCACHE_PURGE_WAY0(ENTRY) \ - __SYSREG(0xc8400000 + 0 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) -#define DCACHE_PURGE_WAY1(ENTRY) \ - __SYSREG(0xc8400000 + 1 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) -#define DCACHE_PURGE_WAY2(ENTRY) \ - __SYSREG(0xc8400000 + 2 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) -#define DCACHE_PURGE_WAY3(ENTRY) \ - __SYSREG(0xc8400000 + 3 * L1_CACHE_WAYDISP + (ENTRY) * L1_CACHE_BYTES, u32) - -/* instruction cache access registers */ -#define ICACHE_DATA(WAY, ENTRY, OFF) \ - __SYSREG(0xc8000000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10 + (OFF) * 4, u32) -#define ICACHE_TAG(WAY, ENTRY) \ - __SYSREG(0xc8100000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10, u32) - -/* instruction cache access registers */ -#define DCACHE_DATA(WAY, ENTRY, OFF) \ - __SYSREG(0xc8200000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10 + (OFF) * 4, u32) -#define DCACHE_TAG(WAY, ENTRY) \ - __SYSREG(0xc8300000 + (WAY) * L1_CACHE_WAYDISP + (ENTRY) * 0x10, u32) - -#endif /* _ASM_CACHE_H */ diff --git a/include/asm-mn10300/cacheflush.h b/include/asm-mn10300/cacheflush.h deleted file mode 100644 index 2db746a..0000000 --- a/include/asm-mn10300/cacheflush.h +++ /dev/null @@ -1,116 +0,0 @@ -/* MN10300 Cache flushing - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_CACHEFLUSH_H -#define _ASM_CACHEFLUSH_H - -#ifndef __ASSEMBLY__ - -/* Keep includes the same across arches. */ -#include - -/* - * virtually-indexed cache managment (our cache is physically indexed) - */ -#define flush_cache_all() do {} while (0) -#define flush_cache_mm(mm) do {} while (0) -#define flush_cache_dup_mm(mm) do {} while (0) -#define flush_cache_range(mm, start, end) do {} while (0) -#define flush_cache_page(vma, vmaddr, pfn) do {} while (0) -#define flush_cache_vmap(start, end) do {} while (0) -#define flush_cache_vunmap(start, end) do {} while (0) -#define flush_dcache_page(page) do {} while (0) -#define flush_dcache_mmap_lock(mapping) do {} while (0) -#define flush_dcache_mmap_unlock(mapping) do {} while (0) - -/* - * physically-indexed cache managment - */ -#ifndef CONFIG_MN10300_CACHE_DISABLED - -extern void flush_icache_range(unsigned long start, unsigned long end); -extern void flush_icache_page(struct vm_area_struct *vma, struct page *pg); - -#else - -#define flush_icache_range(start, end) do {} while (0) -#define flush_icache_page(vma, pg) do {} while (0) - -#endif - -#define flush_icache_user_range(vma, pg, adr, len) \ - flush_icache_range(adr, adr + len) - -#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ - do { \ - memcpy(dst, src, len); \ - flush_icache_page(vma, page); \ - } while (0) - -#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ - memcpy(dst, src, len) - -/* - * primitive routines - */ -#ifndef CONFIG_MN10300_CACHE_DISABLED -extern void mn10300_icache_inv(void); -extern void mn10300_dcache_inv(void); -extern void mn10300_dcache_inv_page(unsigned start); -extern void mn10300_dcache_inv_range(unsigned start, unsigned end); -extern void mn10300_dcache_inv_range2(unsigned start, unsigned size); -#ifdef CONFIG_MN10300_CACHE_WBACK -extern void mn10300_dcache_flush(void); -extern void mn10300_dcache_flush_page(unsigned start); -extern void mn10300_dcache_flush_range(unsigned start, unsigned end); -extern void mn10300_dcache_flush_range2(unsigned start, unsigned size); -extern void mn10300_dcache_flush_inv(void); -extern void mn10300_dcache_flush_inv_page(unsigned start); -extern void mn10300_dcache_flush_inv_range(unsigned start, unsigned end); -extern void mn10300_dcache_flush_inv_range2(unsigned start, unsigned size); -#else -#define mn10300_dcache_flush() do {} while (0) -#define mn10300_dcache_flush_page(start) do {} while (0) -#define mn10300_dcache_flush_range(start, end) do {} while (0) -#define mn10300_dcache_flush_range2(start, size) do {} while (0) -#define mn10300_dcache_flush_inv() mn10300_dcache_inv() -#define mn10300_dcache_flush_inv_page(start) \ - mn10300_dcache_inv_page((start)) -#define mn10300_dcache_flush_inv_range(start, end) \ - mn10300_dcache_inv_range((start), (end)) -#define mn10300_dcache_flush_inv_range2(start, size) \ - mn10300_dcache_inv_range2((start), (size)) -#endif /* CONFIG_MN10300_CACHE_WBACK */ -#else -#define mn10300_icache_inv() do {} while (0) -#define mn10300_dcache_inv() do {} while (0) -#define mn10300_dcache_inv_page(start) do {} while (0) -#define mn10300_dcache_inv_range(start, end) do {} while (0) -#define mn10300_dcache_inv_range2(start, size) do {} while (0) -#define mn10300_dcache_flush() do {} while (0) -#define mn10300_dcache_flush_inv_page(start) do {} while (0) -#define mn10300_dcache_flush_inv() do {} while (0) -#define mn10300_dcache_flush_inv_range(start, end) do {} while (0) -#define mn10300_dcache_flush_inv_range2(start, size) do {} while (0) -#define mn10300_dcache_flush_page(start) do {} while (0) -#define mn10300_dcache_flush_range(start, end) do {} while (0) -#define mn10300_dcache_flush_range2(start, size) do {} while (0) -#endif /* CONFIG_MN10300_CACHE_DISABLED */ - -/* - * internal debugging function - */ -#ifdef CONFIG_DEBUG_PAGEALLOC -extern void kernel_map_pages(struct page *page, int numpages, int enable); -#endif - -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_CACHEFLUSH_H */ diff --git a/include/asm-mn10300/checksum.h b/include/asm-mn10300/checksum.h deleted file mode 100644 index 9fb2a8d..0000000 --- a/include/asm-mn10300/checksum.h +++ /dev/null @@ -1,86 +0,0 @@ -/* MN10300 Optimised checksumming code - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_CHECKSUM_H -#define _ASM_CHECKSUM_H - -extern __wsum csum_partial(const void *buff, int len, __wsum sum); -extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, - int len, __wsum sum); -extern __wsum csum_partial_copy_from_user(const void *src, void *dst, - int len, __wsum sum, - int *err_ptr); -extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); -extern __wsum csum_partial(const void *buff, int len, __wsum sum); -extern __sum16 ip_compute_csum(const void *buff, int len); - -#define csum_partial_copy_fromuser csum_partial_copy -extern __wsum csum_partial_copy(const void *src, void *dst, int len, - __wsum sum); - -static inline __sum16 csum_fold(__wsum sum) -{ - asm( - " add %1,%0 \n" - " addc 0xffff,%0 \n" - : "=r" (sum) - : "r" (sum << 16), "0" (sum & 0xffff0000) - : "cc" - ); - return (~sum) >> 16; -} - -static inline __wsum csum_tcpudp_nofold(unsigned long saddr, - unsigned long daddr, - unsigned short len, - unsigned short proto, - __wsum sum) -{ - __wsum tmp; - - tmp = (__wsum) ntohs(len) << 16; - tmp += (__wsum) proto << 8; - - asm( - " add %1,%0 \n" - " addc %2,%0 \n" - " addc %3,%0 \n" - " addc 0,%0 \n" - : "=r" (sum) - : "r" (daddr), "r"(saddr), "r"(tmp), "0"(sum) - : "cc" - ); - return sum; -} - -/* - * computes the checksum of the TCP/UDP pseudo-header - * returns a 16-bit checksum, already complemented - */ -static inline __sum16 csum_tcpudp_magic(unsigned long saddr, - unsigned long daddr, - unsigned short len, - unsigned short proto, - __wsum sum) -{ - return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); -} - -#undef _HAVE_ARCH_IPV6_CSUM - -/* - * Copy and checksum to user - */ -#define HAVE_CSUM_COPY_USER -extern __wsum csum_and_copy_to_user(const void *src, void *dst, int len, - __wsum sum, int *err_ptr); - - -#endif /* _ASM_CHECKSUM_H */ diff --git a/include/asm-mn10300/cpu-regs.h b/include/asm-mn10300/cpu-regs.h deleted file mode 100644 index 757e9b5..0000000 --- a/include/asm-mn10300/cpu-regs.h +++ /dev/null @@ -1,290 +0,0 @@ -/* MN10300 Core system registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_CPU_REGS_H -#define _ASM_CPU_REGS_H - -#ifndef __ASSEMBLY__ -#include -#endif - -#ifdef CONFIG_MN10300_CPU_AM33V2 -/* we tell the compiler to pretend to be AM33 so that it doesn't try and use - * the FP regs, but tell the assembler that we're actually allowed AM33v2 - * instructions */ -#ifndef __ASSEMBLY__ -asm(" .am33_2\n"); -#else -.am33_2 -#endif -#endif - -#ifdef __KERNEL__ - -#ifndef __ASSEMBLY__ -#define __SYSREG(ADDR, TYPE) (*(volatile TYPE *)(ADDR)) -#define __SYSREGC(ADDR, TYPE) (*(const volatile TYPE *)(ADDR)) -#else -#define __SYSREG(ADDR, TYPE) ADDR -#define __SYSREGC(ADDR, TYPE) ADDR -#endif - -/* CPU registers */ -#define EPSW_FLAG_Z 0x00000001 /* zero flag */ -#define EPSW_FLAG_N 0x00000002 /* negative flag */ -#define EPSW_FLAG_C 0x00000004 /* carry flag */ -#define EPSW_FLAG_V 0x00000008 /* overflow flag */ -#define EPSW_IM 0x00000700 /* interrupt mode */ -#define EPSW_IM_0 0x00000000 /* interrupt mode 0 */ -#define EPSW_IM_1 0x00000100 /* interrupt mode 1 */ -#define EPSW_IM_2 0x00000200 /* interrupt mode 2 */ -#define EPSW_IM_3 0x00000300 /* interrupt mode 3 */ -#define EPSW_IM_4 0x00000400 /* interrupt mode 4 */ -#define EPSW_IM_5 0x00000500 /* interrupt mode 5 */ -#define EPSW_IM_6 0x00000600 /* interrupt mode 6 */ -#define EPSW_IM_7 0x00000700 /* interrupt mode 7 */ -#define EPSW_IE 0x00000800 /* interrupt enable */ -#define EPSW_S 0x00003000 /* software auxilliary bits */ -#define EPSW_T 0x00008000 /* trace enable */ -#define EPSW_nSL 0x00010000 /* not supervisor level */ -#define EPSW_NMID 0x00020000 /* nonmaskable interrupt disable */ -#define EPSW_nAR 0x00040000 /* register bank control */ -#define EPSW_ML 0x00080000 /* monitor level */ -#define EPSW_FE 0x00100000 /* FPU enable */ - -/* FPU registers */ -#define FPCR_EF_I 0x00000001 /* inexact result FPU exception flag */ -#define FPCR_EF_U 0x00000002 /* underflow FPU exception flag */ -#define FPCR_EF_O 0x00000004 /* overflow FPU exception flag */ -#define FPCR_EF_Z 0x00000008 /* zero divide FPU exception flag */ -#define FPCR_EF_V 0x00000010 /* invalid operand FPU exception flag */ -#define FPCR_EE_I 0x00000020 /* inexact result FPU exception enable */ -#define FPCR_EE_U 0x00000040 /* underflow FPU exception enable */ -#define FPCR_EE_O 0x00000080 /* overflow FPU exception enable */ -#define FPCR_EE_Z 0x00000100 /* zero divide FPU exception enable */ -#define FPCR_EE_V 0x00000200 /* invalid operand FPU exception enable */ -#define FPCR_EC_I 0x00000400 /* inexact result FPU exception cause */ -#define FPCR_EC_U 0x00000800 /* underflow FPU exception cause */ -#define FPCR_EC_O 0x00001000 /* overflow FPU exception cause */ -#define FPCR_EC_Z 0x00002000 /* zero divide FPU exception cause */ -#define FPCR_EC_V 0x00004000 /* invalid operand FPU exception cause */ -#define FPCR_RM 0x00030000 /* rounding mode */ -#define FPCR_RM_NEAREST 0x00000000 /* - round to nearest value */ -#define FPCR_FCC_U 0x00040000 /* FPU unordered condition code */ -#define FPCR_FCC_E 0x00080000 /* FPU equal condition code */ -#define FPCR_FCC_G 0x00100000 /* FPU greater than condition code */ -#define FPCR_FCC_L 0x00200000 /* FPU less than condition code */ -#define FPCR_INIT 0x00000000 /* no exceptions, rounding to nearest */ - -/* CPU control registers */ -#define CPUP __SYSREG(0xc0000020, u16) /* CPU pipeline register */ -#define CPUP_DWBD 0x0020 /* write buffer disable flag */ -#define CPUP_IPFD 0x0040 /* instruction prefetch disable flag */ -#define CPUP_EXM 0x0080 /* exception operation mode */ -#define CPUP_EXM_AM33V1 0x0000 /* - AM33 v1 exception mode */ -#define CPUP_EXM_AM33V2 0x0080 /* - AM33 v2 exception mode */ - -#define CPUM __SYSREG(0xc0000040, u16) /* CPU mode register */ -#define CPUM_SLEEP 0x0004 /* set to enter sleep state */ -#define CPUM_HALT 0x0008 /* set to enter halt state */ -#define CPUM_STOP 0x0010 /* set to enter stop state */ - -#define CPUREV __SYSREGC(0xc0000050, u32) /* CPU revision register */ -#define CPUREV_TYPE 0x0000000f /* CPU type */ -#define CPUREV_TYPE_S 0 -#define CPUREV_TYPE_AM33V1 0x00000000 /* - AM33 V1 core, AM33/1.00 arch */ -#define CPUREV_TYPE_AM33V2 0x00000001 /* - AM33 V2 core, AM33/2.00 arch */ -#define CPUREV_TYPE_AM34V1 0x00000002 /* - AM34 V1 core, AM33/2.00 arch */ -#define CPUREV_REVISION 0x000000f0 /* CPU revision */ -#define CPUREV_REVISION_S 4 -#define CPUREV_ICWAY 0x00000f00 /* number of instruction cache ways */ -#define CPUREV_ICWAY_S 8 -#define CPUREV_ICSIZE 0x0000f000 /* instruction cache way size */ -#define CPUREV_ICSIZE_S 12 -#define CPUREV_DCWAY 0x000f0000 /* number of data cache ways */ -#define CPUREV_DCWAY_S 16 -#define CPUREV_DCSIZE 0x00f00000 /* data cache way size */ -#define CPUREV_DCSIZE_S 20 -#define CPUREV_FPUTYPE 0x0f000000 /* FPU core type */ -#define CPUREV_FPUTYPE_NONE 0x00000000 /* - no FPU core implemented */ -#define CPUREV_OCDCTG 0xf0000000 /* on-chip debug function category */ - -#define DCR __SYSREG(0xc0000030, u16) /* Debug control register */ - -/* interrupt/exception control registers */ -#define IVAR0 __SYSREG(0xc0000000, u16) /* interrupt vector 0 */ -#define IVAR1 __SYSREG(0xc0000004, u16) /* interrupt vector 1 */ -#define IVAR2 __SYSREG(0xc0000008, u16) /* interrupt vector 2 */ -#define IVAR3 __SYSREG(0xc000000c, u16) /* interrupt vector 3 */ -#define IVAR4 __SYSREG(0xc0000010, u16) /* interrupt vector 4 */ -#define IVAR5 __SYSREG(0xc0000014, u16) /* interrupt vector 5 */ -#define IVAR6 __SYSREG(0xc0000018, u16) /* interrupt vector 6 */ - -#define TBR __SYSREG(0xc0000024, u32) /* Trap table base */ -#define TBR_TB 0xff000000 /* table base address bits 31-24 */ -#define TBR_INT_CODE 0x00ffffff /* interrupt code */ - -#define DEAR __SYSREG(0xc0000038, u32) /* Data access exception address */ - -#define sISR __SYSREG(0xc0000044, u32) /* Supervisor interrupt status */ -#define sISR_IRQICE 0x00000001 /* ICE interrupt */ -#define sISR_ISTEP 0x00000002 /* single step interrupt */ -#define sISR_MISSA 0x00000004 /* memory access address misalignment fault */ -#define sISR_UNIMP 0x00000008 /* unimplemented instruction execution fault */ -#define sISR_PIEXE 0x00000010 /* program interrupt */ -#define sISR_MEMERR 0x00000020 /* illegal memory access fault */ -#define sISR_IBREAK 0x00000040 /* instraction break interrupt */ -#define sISR_DBSRL 0x00000080 /* debug serial interrupt */ -#define sISR_PERIDB 0x00000100 /* peripheral debug interrupt */ -#define sISR_EXUNIMP 0x00000200 /* unimplemented ex-instruction execution fault */ -#define sISR_OBREAK 0x00000400 /* operand break interrupt */ -#define sISR_PRIV 0x00000800 /* privileged instruction execution fault */ -#define sISR_BUSERR 0x00001000 /* bus error fault */ -#define sISR_DBLFT 0x00002000 /* double fault */ -#define sISR_DBG 0x00008000 /* debug reserved interrupt */ -#define sISR_ITMISS 0x00010000 /* instruction TLB miss */ -#define sISR_DTMISS 0x00020000 /* data TLB miss */ -#define sISR_ITEX 0x00040000 /* instruction TLB access exception */ -#define sISR_DTEX 0x00080000 /* data TLB access exception */ -#define sISR_ILGIA 0x00100000 /* illegal instruction access exception */ -#define sISR_ILGDA 0x00200000 /* illegal data access exception */ -#define sISR_IOIA 0x00400000 /* internal I/O space instruction access excep */ -#define sISR_PRIVA 0x00800000 /* privileged space instruction access excep */ -#define sISR_PRIDA 0x01000000 /* privileged space data access excep */ -#define sISR_DISA 0x02000000 /* data space instruction access excep */ -#define sISR_SYSC 0x04000000 /* system call instruction excep */ -#define sISR_FPUD 0x08000000 /* FPU disabled excep */ -#define sISR_FPUUI 0x10000000 /* FPU unimplemented instruction excep */ -#define sISR_FPUOP 0x20000000 /* FPU operation excep */ -#define sISR_NE 0x80000000 /* multiple synchronous exceptions excep */ - -/* cache control registers */ -#define CHCTR __SYSREG(0xc0000070, u16) /* cache control */ -#define CHCTR_ICEN 0x0001 /* instruction cache enable */ -#define CHCTR_DCEN 0x0002 /* data cache enable */ -#define CHCTR_ICBUSY 0x0004 /* instruction cache busy */ -#define CHCTR_DCBUSY 0x0008 /* data cache busy */ -#define CHCTR_ICINV 0x0010 /* instruction cache invalidate */ -#define CHCTR_DCINV 0x0020 /* data cache invalidate */ -#define CHCTR_DCWTMD 0x0040 /* data cache writing mode */ -#define CHCTR_DCWTMD_WRBACK 0x0000 /* - write back mode */ -#define CHCTR_DCWTMD_WRTHROUGH 0x0040 /* - write through mode */ -#define CHCTR_DCALMD 0x0080 /* data cache allocation mode */ -#define CHCTR_ICWMD 0x0f00 /* instruction cache way mode */ -#define CHCTR_DCWMD 0xf000 /* data cache way mode */ - -/* MMU control registers */ -#define MMUCTR __SYSREG(0xc0000090, u32) /* MMU control register */ -#define MMUCTR_IRP 0x0000003f /* instruction TLB replace pointer */ -#define MMUCTR_ITE 0x00000040 /* instruction TLB enable */ -#define MMUCTR_IIV 0x00000080 /* instruction TLB invalidate */ -#define MMUCTR_ITL 0x00000700 /* instruction TLB lock pointer */ -#define MMUCTR_ITL_NOLOCK 0x00000000 /* - no lock */ -#define MMUCTR_ITL_LOCK0 0x00000100 /* - entry 0 locked */ -#define MMUCTR_ITL_LOCK0_1 0x00000200 /* - entry 0-1 locked */ -#define MMUCTR_ITL_LOCK0_3 0x00000300 /* - entry 0-3 locked */ -#define MMUCTR_ITL_LOCK0_7 0x00000400 /* - entry 0-7 locked */ -#define MMUCTR_ITL_LOCK0_15 0x00000500 /* - entry 0-15 locked */ -#define MMUCTR_CE 0x00008000 /* cacheable bit enable */ -#define MMUCTR_DRP 0x003f0000 /* data TLB replace pointer */ -#define MMUCTR_DTE 0x00400000 /* data TLB enable */ -#define MMUCTR_DIV 0x00800000 /* data TLB invalidate */ -#define MMUCTR_DTL 0x07000000 /* data TLB lock pointer */ -#define MMUCTR_DTL_NOLOCK 0x00000000 /* - no lock */ -#define MMUCTR_DTL_LOCK0 0x01000000 /* - entry 0 locked */ -#define MMUCTR_DTL_LOCK0_1 0x02000000 /* - entry 0-1 locked */ -#define MMUCTR_DTL_LOCK0_3 0x03000000 /* - entry 0-3 locked */ -#define MMUCTR_DTL_LOCK0_7 0x04000000 /* - entry 0-7 locked */ -#define MMUCTR_DTL_LOCK0_15 0x05000000 /* - entry 0-15 locked */ - -#define PIDR __SYSREG(0xc0000094, u16) /* PID register */ -#define PIDR_PID 0x00ff /* process identifier */ - -#define PTBR __SYSREG(0xc0000098, unsigned long) /* Page table base register */ - -#define IPTEL __SYSREG(0xc00000a0, u32) /* instruction TLB entry */ -#define DPTEL __SYSREG(0xc00000b0, u32) /* data TLB entry */ -#define xPTEL_V 0x00000001 /* TLB entry valid */ -#define xPTEL_UNUSED1 0x00000002 /* unused bit */ -#define xPTEL_UNUSED2 0x00000004 /* unused bit */ -#define xPTEL_C 0x00000008 /* cached if set */ -#define xPTEL_PV 0x00000010 /* page valid */ -#define xPTEL_D 0x00000020 /* dirty */ -#define xPTEL_PR 0x000001c0 /* page protection */ -#define xPTEL_PR_ROK 0x00000000 /* - R/O kernel */ -#define xPTEL_PR_RWK 0x00000100 /* - R/W kernel */ -#define xPTEL_PR_ROK_ROU 0x00000080 /* - R/O kernel and R/O user */ -#define xPTEL_PR_RWK_ROU 0x00000180 /* - R/W kernel and R/O user */ -#define xPTEL_PR_RWK_RWU 0x000001c0 /* - R/W kernel and R/W user */ -#define xPTEL_G 0x00000200 /* global (use PID if 0) */ -#define xPTEL_PS 0x00000c00 /* page size */ -#define xPTEL_PS_4Kb 0x00000000 /* - 4Kb page */ -#define xPTEL_PS_128Kb 0x00000400 /* - 128Kb page */ -#define xPTEL_PS_1Kb 0x00000800 /* - 1Kb page */ -#define xPTEL_PS_4Mb 0x00000c00 /* - 4Mb page */ -#define xPTEL_PPN 0xfffff006 /* physical page number */ - -#define xPTEL_V_BIT 0 /* bit numbers corresponding to above masks */ -#define xPTEL_UNUSED1_BIT 1 -#define xPTEL_UNUSED2_BIT 2 -#define xPTEL_C_BIT 3 -#define xPTEL_PV_BIT 4 -#define xPTEL_D_BIT 5 -#define xPTEL_G_BIT 9 - -#define IPTEU __SYSREG(0xc00000a4, u32) /* instruction TLB virtual addr */ -#define DPTEU __SYSREG(0xc00000b4, u32) /* data TLB virtual addr */ -#define xPTEU_VPN 0xfffffc00 /* virtual page number */ -#define xPTEU_PID 0x000000ff /* process identifier to which applicable */ - -#define IPTEL2 __SYSREG(0xc00000a8, u32) /* instruction TLB entry */ -#define DPTEL2 __SYSREG(0xc00000b8, u32) /* data TLB entry */ -#define xPTEL2_V 0x00000001 /* TLB entry valid */ -#define xPTEL2_C 0x00000002 /* cacheable */ -#define xPTEL2_PV 0x00000004 /* page valid */ -#define xPTEL2_D 0x00000008 /* dirty */ -#define xPTEL2_PR 0x00000070 /* page protection */ -#define xPTEL2_PR_ROK 0x00000000 /* - R/O kernel */ -#define xPTEL2_PR_RWK 0x00000040 /* - R/W kernel */ -#define xPTEL2_PR_ROK_ROU 0x00000020 /* - R/O kernel and R/O user */ -#define xPTEL2_PR_RWK_ROU 0x00000060 /* - R/W kernel and R/O user */ -#define xPTEL2_PR_RWK_RWU 0x00000070 /* - R/W kernel and R/W user */ -#define xPTEL2_G 0x00000080 /* global (use PID if 0) */ -#define xPTEL2_PS 0x00000300 /* page size */ -#define xPTEL2_PS_4Kb 0x00000000 /* - 4Kb page */ -#define xPTEL2_PS_128Kb 0x00000100 /* - 128Kb page */ -#define xPTEL2_PS_1Kb 0x00000200 /* - 1Kb page */ -#define xPTEL2_PS_4Mb 0x00000300 /* - 4Mb page */ -#define xPTEL2_PPN 0xfffffc00 /* physical page number */ - -#define MMUFCR __SYSREGC(0xc000009c, u32) /* MMU exception cause */ -#define MMUFCR_IFC __SYSREGC(0xc000009c, u16) /* MMU instruction excep cause */ -#define MMUFCR_DFC __SYSREGC(0xc000009e, u16) /* MMU data exception cause */ -#define MMUFCR_xFC_TLBMISS 0x0001 /* TLB miss flag */ -#define MMUFCR_xFC_INITWR 0x0002 /* initial write excep flag */ -#define MMUFCR_xFC_PGINVAL 0x0004 /* page invalid excep flag */ -#define MMUFCR_xFC_PROTVIOL 0x0008 /* protection violation excep flag */ -#define MMUFCR_xFC_ACCESS 0x0010 /* access level flag */ -#define MMUFCR_xFC_ACCESS_USR 0x0000 /* - user mode */ -#define MMUFCR_xFC_ACCESS_SR 0x0010 /* - supervisor mode */ -#define MMUFCR_xFC_TYPE 0x0020 /* access type flag */ -#define MMUFCR_xFC_TYPE_READ 0x0000 /* - read */ -#define MMUFCR_xFC_TYPE_WRITE 0x0020 /* - write */ -#define MMUFCR_xFC_PR 0x01c0 /* page protection flag */ -#define MMUFCR_xFC_PR_ROK 0x0000 /* - R/O kernel */ -#define MMUFCR_xFC_PR_RWK 0x0100 /* - R/W kernel */ -#define MMUFCR_xFC_PR_ROK_ROU 0x0080 /* - R/O kernel and R/O user */ -#define MMUFCR_xFC_PR_RWK_ROU 0x0180 /* - R/W kernel and R/O user */ -#define MMUFCR_xFC_PR_RWK_RWU 0x01c0 /* - R/W kernel and R/W user */ -#define MMUFCR_xFC_ILLADDR 0x0200 /* illegal address excep flag */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_CPU_REGS_H */ diff --git a/include/asm-mn10300/cputime.h b/include/asm-mn10300/cputime.h deleted file mode 100644 index 6d68ad7..0000000 --- a/include/asm-mn10300/cputime.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/current.h b/include/asm-mn10300/current.h deleted file mode 100644 index ca6027d..0000000 --- a/include/asm-mn10300/current.h +++ /dev/null @@ -1,37 +0,0 @@ -/* MN10300 Current task structure accessor - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_CURRENT_H -#define _ASM_CURRENT_H - -#include - -/* - * dedicate E2 to keeping the current task pointer - */ -#ifdef CONFIG_MN10300_CURRENT_IN_E2 - -register struct task_struct *const current asm("e2") __attribute__((used)); - -#define get_current() current - -extern struct task_struct *__current; - -#else -static inline __attribute__((const)) -struct task_struct *get_current(void) -{ - return current_thread_info()->task; -} - -#define current get_current() -#endif - -#endif /* _ASM_CURRENT_H */ diff --git a/include/asm-mn10300/delay.h b/include/asm-mn10300/delay.h deleted file mode 100644 index 34517b3..0000000 --- a/include/asm-mn10300/delay.h +++ /dev/null @@ -1,19 +0,0 @@ -/* MN10300 Uninterruptible delay routines - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_DELAY_H -#define _ASM_DELAY_H - -extern void __udelay(unsigned long usecs); -extern void __delay(unsigned long loops); - -#define udelay(n) __udelay(n) - -#endif /* _ASM_DELAY_H */ diff --git a/include/asm-mn10300/device.h b/include/asm-mn10300/device.h deleted file mode 100644 index f0a4c25..0000000 --- a/include/asm-mn10300/device.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/div64.h b/include/asm-mn10300/div64.h deleted file mode 100644 index 3a8329b..0000000 --- a/include/asm-mn10300/div64.h +++ /dev/null @@ -1,100 +0,0 @@ -/* MN10300 64-bit division - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_DIV64 -#define _ASM_DIV64 - -#include - -extern void ____unhandled_size_in_do_div___(void); - -/* - * divide n by base, leaving the result in n and returning the remainder - * - we can do this quite efficiently on the MN10300 by cascading the divides - * through the MDR register - */ -#define do_div(n, base) \ -({ \ - unsigned __rem = 0; \ - if (sizeof(n) <= 4) { \ - asm("mov %1,mdr \n" \ - "divu %2,%0 \n" \ - "mov mdr,%1 \n" \ - : "+r"(n), "=d"(__rem) \ - : "r"(base), "1"(__rem) \ - : "cc" \ - ); \ - } else if (sizeof(n) <= 8) { \ - union { \ - unsigned long long l; \ - u32 w[2]; \ - } __quot; \ - __quot.l = n; \ - asm("mov %0,mdr \n" /* MDR = 0 */ \ - "divu %3,%1 \n" \ - /* __quot.MSL = __div.MSL / base, */ \ - /* MDR = MDR:__div.MSL % base */ \ - "divu %3,%2 \n" \ - /* __quot.LSL = MDR:__div.LSL / base, */ \ - /* MDR = MDR:__div.LSL % base */ \ - "mov mdr,%0 \n" \ - : "=d"(__rem), "=r"(__quot.w[1]), "=r"(__quot.w[0]) \ - : "r"(base), "0"(__rem), "1"(__quot.w[1]), \ - "2"(__quot.w[0]) \ - : "cc" \ - ); \ - n = __quot.l; \ - } else { \ - ____unhandled_size_in_do_div___(); \ - } \ - __rem; \ -}) - -/* - * do an unsigned 32-bit multiply and divide with intermediate 64-bit product - * so as not to lose accuracy - * - we use the MDR register to hold the MSW of the product - */ -static inline __attribute__((const)) -unsigned __muldiv64u(unsigned val, unsigned mult, unsigned div) -{ - unsigned result; - - asm("mulu %2,%0 \n" /* MDR:val = val*mult */ - "divu %3,%0 \n" /* val = MDR:val/div; - * MDR = MDR:val%div */ - : "=r"(result) - : "0"(val), "ir"(mult), "r"(div) - ); - - return result; -} - -/* - * do a signed 32-bit multiply and divide with intermediate 64-bit product so - * as not to lose accuracy - * - we use the MDR register to hold the MSW of the product - */ -static inline __attribute__((const)) -signed __muldiv64s(signed val, signed mult, signed div) -{ - signed result; - - asm("mul %2,%0 \n" /* MDR:val = val*mult */ - "div %3,%0 \n" /* val = MDR:val/div; - * MDR = MDR:val%div */ - : "=r"(result) - : "0"(val), "ir"(mult), "r"(div) - ); - - return result; -} - -#endif /* _ASM_DIV64 */ diff --git a/include/asm-mn10300/dma-mapping.h b/include/asm-mn10300/dma-mapping.h deleted file mode 100644 index ccae8f6..0000000 --- a/include/asm-mn10300/dma-mapping.h +++ /dev/null @@ -1,234 +0,0 @@ -/* DMA mapping routines for the MN10300 arch - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_DMA_MAPPING_H -#define _ASM_DMA_MAPPING_H - -#include -#include - -#include -#include - -extern void *dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, int flag); - -extern void dma_free_coherent(struct device *dev, size_t size, - void *vaddr, dma_addr_t dma_handle); - -#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f)) -#define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h)) - -/* - * Map a single buffer of the indicated size for DMA in streaming mode. The - * 32-bit bus address to use is returned. - * - * Once the device is given the dma address, the device owns this memory until - * either pci_unmap_single or pci_dma_sync_single is performed. - */ -static inline -dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); - mn10300_dcache_flush_inv(); - return virt_to_bus(ptr); -} - -/* - * Unmap a single streaming mode DMA translation. The dma_addr and size must - * match what was provided for in a previous pci_map_single call. All other - * usages are undefined. - * - * After this call, reads by the cpu to the buffer are guarenteed to see - * whatever the device wrote there. - */ -static inline -void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); -} - -/* - * Map a set of buffers described by scatterlist in streaming mode for DMA. - * This is the scather-gather version of the above pci_map_single interface. - * Here the scatter gather list elements are each tagged with the appropriate - * dma address and length. They are obtained via sg_dma_{address,length}(SG). - * - * NOTE: An implementation may be able to use a smaller number of DMA - * address/length pairs than there are SG table elements. (for example - * via virtual mapping capabilities) The routine returns the number of - * addr/length pairs actually used, at most nents. - * - * Device ownership issues as mentioned above for pci_map_single are the same - * here. - */ -static inline -int dma_map_sg(struct device *dev, struct scatterlist *sglist, int nents, - enum dma_data_direction direction) -{ - struct scatterlist *sg; - int i; - - BUG_ON(!valid_dma_direction(direction)); - WARN_ON(nents == 0 || sglist[0].length == 0); - - for_each_sg(sglist, sg, nents, i) { - BUG_ON(!sg_page(sg)); - - sg->dma_address = sg_phys(sg); - } - - mn10300_dcache_flush_inv(); - return nents; -} - -/* - * Unmap a set of streaming mode DMA translations. - * Again, cpu read rules concerning calls here are the same as for - * pci_unmap_single() above. - */ -static inline -void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, - enum dma_data_direction direction) -{ - BUG_ON(!valid_dma_direction(direction)); -} - -/* - * pci_{map,unmap}_single_page maps a kernel page to a dma_addr_t. identical - * to pci_map_single, but takes a struct page instead of a virtual address - */ -static inline -dma_addr_t dma_map_page(struct device *dev, struct page *page, - unsigned long offset, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); - return page_to_bus(page) + offset; -} - -static inline -void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); -} - -/* - * Make physical memory consistent for a single streaming mode DMA translation - * after a transfer. - * - * If you perform a pci_map_single() but wish to interrogate the buffer using - * the cpu, yet do not wish to teardown the PCI dma mapping, you must call this - * function before doing so. At the next point you give the PCI dma address - * back to the card, the device again owns the buffer. - */ -static inline -void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, - size_t size, enum dma_data_direction direction) -{ -} - -static inline -void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, - size_t size, enum dma_data_direction direction) -{ - mn10300_dcache_flush_inv(); -} - -static inline -void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, - unsigned long offset, size_t size, - enum dma_data_direction direction) -{ -} - -static inline void -dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, - unsigned long offset, size_t size, - enum dma_data_direction direction) -{ - mn10300_dcache_flush_inv(); -} - - -/* - * Make physical memory consistent for a set of streaming mode DMA translations - * after a transfer. - * - * The same as pci_dma_sync_single but for a scatter-gather list, same rules - * and usage. - */ -static inline -void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, - int nelems, enum dma_data_direction direction) -{ -} - -static inline -void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, - int nelems, enum dma_data_direction direction) -{ - mn10300_dcache_flush_inv(); -} - -static inline -int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) -{ - return 0; -} - -/* - * Return whether the given PCI device DMA address mask can be supported - * properly. For example, if your device can only drive the low 24-bits during - * PCI bus mastering, then you would pass 0x00ffffff as the mask to this - * function. - */ -static inline -int dma_supported(struct device *dev, u64 mask) -{ - /* - * we fall back to GFP_DMA when the mask isn't all 1s, so we can't - * guarantee allocations that must be within a tighter range than - * GFP_DMA - */ - if (mask < 0x00ffffff) - return 0; - return 1; -} - -static inline -int dma_set_mask(struct device *dev, u64 mask) -{ - if (!dev->dma_mask || !dma_supported(dev, mask)) - return -EIO; - - *dev->dma_mask = mask; - return 0; -} - -static inline -int dma_get_cache_alignment(void) -{ - return 1 << L1_CACHE_SHIFT; -} - -#define dma_is_consistent(d) (1) - -static inline -void dma_cache_sync(void *vaddr, size_t size, - enum dma_data_direction direction) -{ - mn10300_dcache_flush_inv(); -} - -#endif diff --git a/include/asm-mn10300/dma.h b/include/asm-mn10300/dma.h deleted file mode 100644 index 098df2e..0000000 --- a/include/asm-mn10300/dma.h +++ /dev/null @@ -1,118 +0,0 @@ -/* MN10300 ISA DMA handlers and definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_DMA_H -#define _ASM_DMA_H - -#include -#include -#include -#include - -#undef MAX_DMA_CHANNELS /* switch off linux/kernel/dma.c */ -#define MAX_DMA_ADDRESS 0xbfffffff - -extern spinlock_t dma_spin_lock; - -static inline unsigned long claim_dma_lock(void) -{ - unsigned long flags; - spin_lock_irqsave(&dma_spin_lock, flags); - return flags; -} - -static inline void release_dma_lock(unsigned long flags) -{ - spin_unlock_irqrestore(&dma_spin_lock, flags); -} - -/* enable/disable a specific DMA channel */ -static inline void enable_dma(unsigned int dmanr) -{ -} - -static inline void disable_dma(unsigned int dmanr) -{ -} - -/* Clear the 'DMA Pointer Flip Flop'. - * Write 0 for LSB/MSB, 1 for MSB/LSB access. - * Use this once to initialize the FF to a known state. - * After that, keep track of it. :-) - * --- In order to do that, the DMA routines below should --- - * --- only be used while holding the DMA lock ! --- - */ -static inline void clear_dma_ff(unsigned int dmanr) -{ -} - -/* set mode (above) for a specific DMA channel */ -static inline void set_dma_mode(unsigned int dmanr, char mode) -{ -} - -/* Set only the page register bits of the transfer address. - * This is used for successive transfers when we know the contents of - * the lower 16 bits of the DMA current address register, but a 64k boundary - * may have been crossed. - */ -static inline void set_dma_page(unsigned int dmanr, char pagenr) -{ -} - - -/* Set transfer address & page bits for specific DMA channel. - * Assumes dma flipflop is clear. - */ -static inline void set_dma_addr(unsigned int dmanr, unsigned int a) -{ -} - - -/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for - * a specific DMA channel. - * You must ensure the parameters are valid. - * NOTE: from a manual: "the number of transfers is one more - * than the initial word count"! This is taken into account. - * Assumes dma flip-flop is clear. - * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7. - */ -static inline void set_dma_count(unsigned int dmanr, unsigned int count) -{ -} - - -/* Get DMA residue count. After a DMA transfer, this - * should return zero. Reading this while a DMA transfer is - * still in progress will return unpredictable results. - * If called before the channel has been used, it may return 1. - * Otherwise, it returns the number of _bytes_ left to transfer. - * - * Assumes DMA flip-flop is clear. - */ -static inline int get_dma_residue(unsigned int dmanr) -{ - return 0; -} - - -/* These are in kernel/dma.c: */ -extern int request_dma(unsigned int dmanr, const char *device_id); -extern void free_dma(unsigned int dmanr); - -/* From PCI */ - -#ifdef CONFIG_PCI -extern int isa_dma_bridge_buggy; -#else -#define isa_dma_bridge_buggy (0) -#endif - -#endif /* _ASM_DMA_H */ diff --git a/include/asm-mn10300/dmactl-regs.h b/include/asm-mn10300/dmactl-regs.h deleted file mode 100644 index 58a199d..0000000 --- a/include/asm-mn10300/dmactl-regs.h +++ /dev/null @@ -1,101 +0,0 @@ -/* MN10300 on-board DMA controller registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_DMACTL_REGS_H -#define _ASM_DMACTL_REGS_H - -#include - -#ifdef __KERNEL__ - -/* DMA registers */ -#define DMxCTR(N) __SYSREG(0xd2000000 + ((N) * 0x100), u32) /* control reg */ -#define DMxCTR_BG 0x0000001f /* transfer request source */ -#define DMxCTR_BG_SOFT 0x00000000 /* - software source */ -#define DMxCTR_BG_SC0TX 0x00000002 /* - serial port 0 transmission */ -#define DMxCTR_BG_SC0RX 0x00000003 /* - serial port 0 reception */ -#define DMxCTR_BG_SC1TX 0x00000004 /* - serial port 1 transmission */ -#define DMxCTR_BG_SC1RX 0x00000005 /* - serial port 1 reception */ -#define DMxCTR_BG_SC2TX 0x00000006 /* - serial port 2 transmission */ -#define DMxCTR_BG_SC2RX 0x00000007 /* - serial port 2 reception */ -#define DMxCTR_BG_TM0UFLOW 0x00000008 /* - timer 0 underflow */ -#define DMxCTR_BG_TM1UFLOW 0x00000009 /* - timer 1 underflow */ -#define DMxCTR_BG_TM2UFLOW 0x0000000a /* - timer 2 underflow */ -#define DMxCTR_BG_TM3UFLOW 0x0000000b /* - timer 3 underflow */ -#define DMxCTR_BG_TM6ACMPCAP 0x0000000c /* - timer 6A compare/capture */ -#define DMxCTR_BG_AFE 0x0000000d /* - analogue front-end interrupt source */ -#define DMxCTR_BG_ADC 0x0000000e /* - A/D conversion end interrupt source */ -#define DMxCTR_BG_IRDA 0x0000000f /* - IrDA interrupt source */ -#define DMxCTR_BG_RTC 0x00000010 /* - RTC interrupt source */ -#define DMxCTR_BG_XIRQ0 0x00000011 /* - XIRQ0 pin interrupt source */ -#define DMxCTR_BG_XIRQ1 0x00000012 /* - XIRQ1 pin interrupt source */ -#define DMxCTR_BG_XDMR0 0x00000013 /* - external request 0 source (XDMR0 pin) */ -#define DMxCTR_BG_XDMR1 0x00000014 /* - external request 1 source (XDMR1 pin) */ -#define DMxCTR_SAM 0x000000e0 /* DMA transfer src addr mode */ -#define DMxCTR_SAM_INCR 0x00000000 /* - increment */ -#define DMxCTR_SAM_DECR 0x00000020 /* - decrement */ -#define DMxCTR_SAM_FIXED 0x00000040 /* - fixed */ -#define DMxCTR_DAM 0x00000000 /* DMA transfer dest addr mode */ -#define DMxCTR_DAM_INCR 0x00000000 /* - increment */ -#define DMxCTR_DAM_DECR 0x00000100 /* - decrement */ -#define DMxCTR_DAM_FIXED 0x00000200 /* - fixed */ -#define DMxCTR_TM 0x00001800 /* DMA transfer mode */ -#define DMxCTR_TM_BATCH 0x00000000 /* - batch transfer */ -#define DMxCTR_TM_INTERM 0x00001000 /* - intermittent transfer */ -#define DMxCTR_UT 0x00006000 /* DMA transfer unit */ -#define DMxCTR_UT_1 0x00000000 /* - 1 byte */ -#define DMxCTR_UT_2 0x00002000 /* - 2 byte */ -#define DMxCTR_UT_4 0x00004000 /* - 4 byte */ -#define DMxCTR_UT_16 0x00006000 /* - 16 byte */ -#define DMxCTR_TEN 0x00010000 /* DMA channel transfer enable */ -#define DMxCTR_RQM 0x00060000 /* external request input source mode */ -#define DMxCTR_RQM_FALLEDGE 0x00000000 /* - falling edge */ -#define DMxCTR_RQM_RISEEDGE 0x00020000 /* - rising edge */ -#define DMxCTR_RQM_LOLEVEL 0x00040000 /* - low level */ -#define DMxCTR_RQM_HILEVEL 0x00060000 /* - high level */ -#define DMxCTR_RQF 0x01000000 /* DMA transfer request flag */ -#define DMxCTR_XEND 0x80000000 /* DMA transfer end flag */ - -#define DMxSRC(N) __SYSREG(0xd2000004 + ((N) * 0x100), u32) /* control reg */ - -#define DMxDST(N) __SYSREG(0xd2000008 + ((N) * 0x100), u32) /* src addr reg */ - -#define DMxSIZ(N) __SYSREG(0xd200000c + ((N) * 0x100), u32) /* dest addr reg */ -#define DMxSIZ_CT 0x000fffff /* number of bytes to transfer */ - -#define DMxCYC(N) __SYSREG(0xd2000010 + ((N) * 0x100), u32) /* intermittent - * size reg */ -#define DMxCYC_CYC 0x000000ff /* number of interrmittent transfers -1 */ - -#define DM0IRQ 16 /* DMA channel 0 complete IRQ */ -#define DM1IRQ 17 /* DMA channel 1 complete IRQ */ -#define DM2IRQ 18 /* DMA channel 2 complete IRQ */ -#define DM3IRQ 19 /* DMA channel 3 complete IRQ */ - -#define DM0ICR GxICR(DM0IRQ) /* DMA channel 0 complete intr ctrl reg */ -#define DM1ICR GxICR(DM0IR1) /* DMA channel 1 complete intr ctrl reg */ -#define DM2ICR GxICR(DM0IR2) /* DMA channel 2 complete intr ctrl reg */ -#define DM3ICR GxICR(DM0IR3) /* DMA channel 3 complete intr ctrl reg */ - -#ifndef __ASSEMBLY__ - -struct mn10300_dmactl_regs { - u32 ctr; - const void *src; - void *dst; - u32 siz; - u32 cyc; -} __attribute__((aligned(0x100))); - -#endif /* __ASSEMBLY__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_DMACTL_REGS_H */ diff --git a/include/asm-mn10300/elf.h b/include/asm-mn10300/elf.h deleted file mode 100644 index bf09f8b..0000000 --- a/include/asm-mn10300/elf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* MN10300 ELF constant and register definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_ELF_H -#define _ASM_ELF_H - -#include -#include -#include - -/* - * AM33 relocations - */ -#define R_MN10300_NONE 0 /* No reloc. */ -#define R_MN10300_32 1 /* Direct 32 bit. */ -#define R_MN10300_16 2 /* Direct 16 bit. */ -#define R_MN10300_8 3 /* Direct 8 bit. */ -#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */ -#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */ -#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */ -#define R_MN10300_24 9 /* Direct 24 bit. */ -#define R_MN10300_RELATIVE 23 /* Adjust by program base. */ - -/* - * ELF register definitions.. - */ -typedef unsigned long elf_greg_t; - -#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) -typedef elf_greg_t elf_gregset_t[ELF_NGREG]; - -#define ELF_NFPREG 32 -typedef float elf_fpreg_t; - -typedef struct { - elf_fpreg_t fpregs[ELF_NFPREG]; - u_int32_t fpcr; -} elf_fpregset_t; - -extern int dump_fpu(struct pt_regs *, elf_fpregset_t *); - -/* - * This is used to ensure we don't load something for the wrong architecture - */ -#define elf_check_arch(x) \ - (((x)->e_machine == EM_CYGNUS_MN10300) || \ - ((x)->e_machine == EM_MN10300)) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS ELFCLASS32 -#define ELF_DATA ELFDATA2LSB -#define ELF_ARCH EM_MN10300 - -/* - * ELF process initialiser - */ -#define ELF_PLAT_INIT(_r, load_addr) \ -do { \ - struct pt_regs *_ur = current->thread.uregs; \ - _ur->a3 = 0; _ur->a2 = 0; _ur->d3 = 0; _ur->d2 = 0; \ - _ur->mcvf = 0; _ur->mcrl = 0; _ur->mcrh = 0; _ur->mdrq = 0; \ - _ur->e1 = 0; _ur->e0 = 0; _ur->e7 = 0; _ur->e6 = 0; \ - _ur->e5 = 0; _ur->e4 = 0; _ur->e3 = 0; _ur->e2 = 0; \ - _ur->lar = 0; _ur->lir = 0; _ur->mdr = 0; \ - _ur->a1 = 0; _ur->a0 = 0; _ur->d1 = 0; _ur->d0 = 0; \ -} while (0) - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -/* - * This is the location that an ET_DYN program is loaded if exec'ed. Typical - * use of this is to invoke "./ld.so someprog" to test out a new version of - * the loader. We need to make sure that it is out of the way of the program - * that it will "exec", and that there is sufficient room for the brk. - * - must clear the VMALLOC area - */ -#define ELF_ET_DYN_BASE 0x04000000 - -/* - * regs is struct pt_regs, pr_reg is elf_gregset_t (which is - * now struct user_regs, they are different) - * - ELF_CORE_COPY_REGS has been guessed, and may be wrong - */ -#define ELF_CORE_COPY_REGS(pr_reg, regs) \ -do { \ - pr_reg[0] = regs->a3; \ - pr_reg[1] = regs->a2; \ - pr_reg[2] = regs->d3; \ - pr_reg[3] = regs->d2; \ - pr_reg[4] = regs->mcvf; \ - pr_reg[5] = regs->mcrl; \ - pr_reg[6] = regs->mcrh; \ - pr_reg[7] = regs->mdrq; \ - pr_reg[8] = regs->e1; \ - pr_reg[9] = regs->e0; \ - pr_reg[10] = regs->e7; \ - pr_reg[11] = regs->e6; \ - pr_reg[12] = regs->e5; \ - pr_reg[13] = regs->e4; \ - pr_reg[14] = regs->e3; \ - pr_reg[15] = regs->e2; \ - pr_reg[16] = regs->sp; \ - pr_reg[17] = regs->lar; \ - pr_reg[18] = regs->lir; \ - pr_reg[19] = regs->mdr; \ - pr_reg[20] = regs->a1; \ - pr_reg[21] = regs->a0; \ - pr_reg[22] = regs->d1; \ - pr_reg[23] = regs->d0; \ - pr_reg[24] = regs->orig_d0; \ - pr_reg[25] = regs->epsw; \ - pr_reg[26] = regs->pc; \ -} while (0); - -/* - * This yields a mask that user programs can use to figure out what - * instruction set this CPU supports. This could be done in user space, - * but it's not easy, and we've already done it here. - */ -#define ELF_HWCAP (0) - -/* - * This yields a string that ld.so will use to load implementation - * specific libraries for optimization. This is more specific in - * intent than poking at uname or /proc/cpuinfo. - * - * For the moment, we have only optimizations for the Intel generations, - * but that could change... - */ -#define ELF_PLATFORM (NULL) - -#ifdef __KERNEL__ -#define SET_PERSONALITY(ex) set_personality(PER_LINUX) -#endif - -#endif /* _ASM_ELF_H */ diff --git a/include/asm-mn10300/emergency-restart.h b/include/asm-mn10300/emergency-restart.h deleted file mode 100644 index 3711bd9..0000000 --- a/include/asm-mn10300/emergency-restart.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/errno.h b/include/asm-mn10300/errno.h deleted file mode 100644 index 4c82b50..0000000 --- a/include/asm-mn10300/errno.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/exceptions.h b/include/asm-mn10300/exceptions.h deleted file mode 100644 index fa16466..0000000 --- a/include/asm-mn10300/exceptions.h +++ /dev/null @@ -1,121 +0,0 @@ -/* MN10300 Microcontroller core exceptions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_EXCEPTIONS_H -#define _ASM_EXCEPTIONS_H - -#include - -/* - * define the breakpoint instruction opcode to use - * - note that the JTAG unit steals 0xFF, so we want to avoid that if we can - * (can use 0xF7) - */ -#define GDBSTUB_BKPT 0xFF - -#ifndef __ASSEMBLY__ - -/* - * enumeration of exception codes (as extracted from TBR MSW) - */ -enum exception_code { - EXCEP_RESET = 0x000000, /* reset */ - - /* MMU exceptions */ - EXCEP_ITLBMISS = 0x000100, /* instruction TLB miss */ - EXCEP_DTLBMISS = 0x000108, /* data TLB miss */ - EXCEP_IAERROR = 0x000110, /* instruction address */ - EXCEP_DAERROR = 0x000118, /* data address */ - - /* system exceptions */ - EXCEP_TRAP = 0x000128, /* program interrupt (PI instruction) */ - EXCEP_ISTEP = 0x000130, /* single step */ - EXCEP_IBREAK = 0x000150, /* instruction breakpoint */ - EXCEP_OBREAK = 0x000158, /* operand breakpoint */ - EXCEP_PRIVINS = 0x000160, /* privileged instruction execution */ - EXCEP_UNIMPINS = 0x000168, /* unimplemented instruction execution */ - EXCEP_UNIMPEXINS = 0x000170, /* unimplemented extended instruction execution */ - EXCEP_MEMERR = 0x000178, /* illegal memory access */ - EXCEP_MISALIGN = 0x000180, /* misalignment */ - EXCEP_BUSERROR = 0x000188, /* bus error */ - EXCEP_ILLINSACC = 0x000190, /* illegal instruction access */ - EXCEP_ILLDATACC = 0x000198, /* illegal data access */ - EXCEP_IOINSACC = 0x0001a0, /* I/O space instruction access */ - EXCEP_PRIVINSACC = 0x0001a8, /* privileged space instruction access */ - EXCEP_PRIVDATACC = 0x0001b0, /* privileged space data access */ - EXCEP_DATINSACC = 0x0001b8, /* data space instruction access */ - EXCEP_DOUBLE_FAULT = 0x000200, /* double fault */ - - /* FPU exceptions */ - EXCEP_FPU_DISABLED = 0x0001c0, /* FPU disabled */ - EXCEP_FPU_UNIMPINS = 0x0001c8, /* FPU unimplemented operation */ - EXCEP_FPU_OPERATION = 0x0001d0, /* FPU operation */ - - /* interrupts */ - EXCEP_WDT = 0x000240, /* watchdog timer overflow */ - EXCEP_NMI = 0x000248, /* non-maskable interrupt */ - EXCEP_IRQ_LEVEL0 = 0x000280, /* level 0 maskable interrupt */ - EXCEP_IRQ_LEVEL1 = 0x000288, /* level 1 maskable interrupt */ - EXCEP_IRQ_LEVEL2 = 0x000290, /* level 2 maskable interrupt */ - EXCEP_IRQ_LEVEL3 = 0x000298, /* level 3 maskable interrupt */ - EXCEP_IRQ_LEVEL4 = 0x0002a0, /* level 4 maskable interrupt */ - EXCEP_IRQ_LEVEL5 = 0x0002a8, /* level 5 maskable interrupt */ - EXCEP_IRQ_LEVEL6 = 0x0002b0, /* level 6 maskable interrupt */ - - /* system calls */ - EXCEP_SYSCALL0 = 0x000300, /* system call 0 */ - EXCEP_SYSCALL1 = 0x000308, /* system call 1 */ - EXCEP_SYSCALL2 = 0x000310, /* system call 2 */ - EXCEP_SYSCALL3 = 0x000318, /* system call 3 */ - EXCEP_SYSCALL4 = 0x000320, /* system call 4 */ - EXCEP_SYSCALL5 = 0x000328, /* system call 5 */ - EXCEP_SYSCALL6 = 0x000330, /* system call 6 */ - EXCEP_SYSCALL7 = 0x000338, /* system call 7 */ - EXCEP_SYSCALL8 = 0x000340, /* system call 8 */ - EXCEP_SYSCALL9 = 0x000348, /* system call 9 */ - EXCEP_SYSCALL10 = 0x000350, /* system call 10 */ - EXCEP_SYSCALL11 = 0x000358, /* system call 11 */ - EXCEP_SYSCALL12 = 0x000360, /* system call 12 */ - EXCEP_SYSCALL13 = 0x000368, /* system call 13 */ - EXCEP_SYSCALL14 = 0x000370, /* system call 14 */ - EXCEP_SYSCALL15 = 0x000378, /* system call 15 */ -}; - -extern void __set_intr_stub(enum exception_code code, void *handler); -extern void set_intr_stub(enum exception_code code, void *handler); -extern void set_jtag_stub(enum exception_code code, void *handler); - -struct pt_regs; - -extern asmlinkage void __common_exception(void); -extern asmlinkage void itlb_miss(void); -extern asmlinkage void dtlb_miss(void); -extern asmlinkage void itlb_aerror(void); -extern asmlinkage void dtlb_aerror(void); -extern asmlinkage void raw_bus_error(void); -extern asmlinkage void double_fault(void); -extern asmlinkage int system_call(struct pt_regs *); -extern asmlinkage void fpu_exception(struct pt_regs *, enum exception_code); -extern asmlinkage void nmi(struct pt_regs *, enum exception_code); -extern asmlinkage void uninitialised_exception(struct pt_regs *, - enum exception_code); -extern asmlinkage void irq_handler(void); -extern asmlinkage void profile_handler(void); -extern asmlinkage void nmi_handler(void); -extern asmlinkage void misalignment(struct pt_regs *, enum exception_code); - -extern void die(const char *, struct pt_regs *, enum exception_code) - ATTRIB_NORET; - -extern int die_if_no_fixup(const char *, struct pt_regs *, enum exception_code); - -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_EXCEPTIONS_H */ diff --git a/include/asm-mn10300/fb.h b/include/asm-mn10300/fb.h deleted file mode 100644 index 697b24a..0000000 --- a/include/asm-mn10300/fb.h +++ /dev/null @@ -1,23 +0,0 @@ -/* MN10300 Frame buffer stuff - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_FB_H -#define _ASM_FB_H - -#include - -#define fb_pgprotect(...) do {} while (0) - -static inline int fb_is_primary_device(struct fb_info *info) -{ - return 0; -} - -#endif /* _ASM_FB_H */ diff --git a/include/asm-mn10300/fcntl.h b/include/asm-mn10300/fcntl.h deleted file mode 100644 index 46ab12d..0000000 --- a/include/asm-mn10300/fcntl.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/fpu.h b/include/asm-mn10300/fpu.h deleted file mode 100644 index 64a2b83..0000000 --- a/include/asm-mn10300/fpu.h +++ /dev/null @@ -1,85 +0,0 @@ -/* MN10300 FPU definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * Derived from include/asm-i386/i387.h: Copyright (C) 1994 Linus Torvalds - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_FPU_H -#define _ASM_FPU_H - -#include -#include -#include - -#ifdef __KERNEL__ - -/* the task that owns the FPU state */ -extern struct task_struct *fpu_state_owner; - -#define set_using_fpu(tsk) \ -do { \ - (tsk)->thread.fpu_flags |= THREAD_USING_FPU; \ -} while (0) - -#define clear_using_fpu(tsk) \ -do { \ - (tsk)->thread.fpu_flags &= ~THREAD_USING_FPU; \ -} while (0) - -#define is_using_fpu(tsk) ((tsk)->thread.fpu_flags & THREAD_USING_FPU) - -#define unlazy_fpu(tsk) \ -do { \ - preempt_disable(); \ - if (fpu_state_owner == (tsk)) \ - fpu_save(&tsk->thread.fpu_state); \ - preempt_enable(); \ -} while (0) - -#define exit_fpu() \ -do { \ - struct task_struct *__tsk = current; \ - preempt_disable(); \ - if (fpu_state_owner == __tsk) \ - fpu_state_owner = NULL; \ - preempt_enable(); \ -} while (0) - -#define flush_fpu() \ -do { \ - struct task_struct *__tsk = current; \ - preempt_disable(); \ - if (fpu_state_owner == __tsk) { \ - fpu_state_owner = NULL; \ - __tsk->thread.uregs->epsw &= ~EPSW_FE; \ - } \ - preempt_enable(); \ - clear_using_fpu(__tsk); \ -} while (0) - -extern asmlinkage void fpu_init_state(void); -extern asmlinkage void fpu_kill_state(struct task_struct *); -extern asmlinkage void fpu_disabled(struct pt_regs *, enum exception_code); -extern asmlinkage void fpu_exception(struct pt_regs *, enum exception_code); - -#ifdef CONFIG_FPU -extern asmlinkage void fpu_save(struct fpu_state_struct *); -extern asmlinkage void fpu_restore(struct fpu_state_struct *); -#else -#define fpu_save(a) -#define fpu_restore(a) -#endif /* CONFIG_FPU */ - -/* - * signal frame handlers - */ -extern int fpu_setup_sigcontext(struct fpucontext *buf); -extern int fpu_restore_sigcontext(struct fpucontext *buf); - -#endif /* __KERNEL__ */ -#endif /* _ASM_FPU_H */ diff --git a/include/asm-mn10300/frame.inc b/include/asm-mn10300/frame.inc deleted file mode 100644 index 5b1949b..0000000 --- a/include/asm-mn10300/frame.inc +++ /dev/null @@ -1,91 +0,0 @@ -/* MN10300 Microcontroller core system register definitions -*- asm -*- - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_FRAME_INC -#define _ASM_FRAME_INC - -#ifndef __ASSEMBLY__ -#error not for use in C files -#endif - -#ifndef __ASM_OFFSETS_H__ -#include -#endif - -#define pi break - -#define fp a3 - -############################################################################### -# -# build a stack frame from the registers -# - the caller has subtracted 4 from SP before coming here -# -############################################################################### -.macro SAVE_ALL - add -4,sp # next exception frame ptr save area - movm [other],(sp) - mov usp,a1 - mov a1,(sp) # USP in MOVM[other] dummy slot - movm [d2,d3,a2,a3,exreg0,exreg1,exother],(sp) - mov sp,fp # FRAME pointer in A3 - add -12,sp # allow for calls to be made - mov (__frame),a1 - mov a1,(REG_NEXT,fp) - mov fp,(__frame) - - and ~EPSW_FE,epsw # disable the FPU inside the kernel - - # we may be holding current in E2 -#ifdef CONFIG_MN10300_CURRENT_IN_E2 - mov (__current),e2 -#endif -.endm - -############################################################################### -# -# restore the registers from a stack frame -# -############################################################################### -.macro RESTORE_ALL - # peel back the stack to the calling frame - # - this permits execve() to discard extra frames due to kernel syscalls - mov (__frame),fp - mov fp,sp - mov (REG_NEXT,fp),d0 # userspace has regs->next == 0 - mov d0,(__frame) - -#ifndef CONFIG_MN10300_USING_JTAG - mov (REG_EPSW,fp),d0 - btst EPSW_T,d0 - beq 99f - - or EPSW_NMID,epsw - movhu (DCR),d1 - or 0x0001, d1 - movhu d1,(DCR) - -99: -#endif - movm (sp),[d2,d3,a2,a3,exreg0,exreg1,exother] - - # must restore usp even if returning to kernel space, - # when CONFIG_PREEMPT is enabled. - mov (sp),a1 # USP in MOVM[other] dummy slot - mov a1,usp - - movm (sp),[other] - add 8,sp - rti - -.endm - - -#endif /* _ASM_FRAME_INC */ diff --git a/include/asm-mn10300/ftrace.h b/include/asm-mn10300/ftrace.h deleted file mode 100644 index 40a8c17..0000000 --- a/include/asm-mn10300/ftrace.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/include/asm-mn10300/futex.h b/include/asm-mn10300/futex.h deleted file mode 100644 index 0b74582..0000000 --- a/include/asm-mn10300/futex.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/gdb-stub.h b/include/asm-mn10300/gdb-stub.h deleted file mode 100644 index e5a6368..0000000 --- a/include/asm-mn10300/gdb-stub.h +++ /dev/null @@ -1,183 +0,0 @@ -/* MN10300 Kernel GDB stub definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from asm-mips/gdb-stub.h (c) 1995 Andreas Busse - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_GDB_STUB_H -#define _ASM_GDB_STUB_H - -#include - -/* - * register ID numbers in GDB remote protocol - */ - -#define GDB_REGID_PC 9 -#define GDB_REGID_FP 7 -#define GDB_REGID_SP 8 - -/* - * virtual stack layout for the GDB exception handler - */ -#define NUMREGS 64 - -#define GDB_FR_D0 (0 * 4) -#define GDB_FR_D1 (1 * 4) -#define GDB_FR_D2 (2 * 4) -#define GDB_FR_D3 (3 * 4) -#define GDB_FR_A0 (4 * 4) -#define GDB_FR_A1 (5 * 4) -#define GDB_FR_A2 (6 * 4) -#define GDB_FR_A3 (7 * 4) - -#define GDB_FR_SP (8 * 4) -#define GDB_FR_PC (9 * 4) -#define GDB_FR_MDR (10 * 4) -#define GDB_FR_EPSW (11 * 4) -#define GDB_FR_LIR (12 * 4) -#define GDB_FR_LAR (13 * 4) -#define GDB_FR_MDRQ (14 * 4) - -#define GDB_FR_E0 (15 * 4) -#define GDB_FR_E1 (16 * 4) -#define GDB_FR_E2 (17 * 4) -#define GDB_FR_E3 (18 * 4) -#define GDB_FR_E4 (19 * 4) -#define GDB_FR_E5 (20 * 4) -#define GDB_FR_E6 (21 * 4) -#define GDB_FR_E7 (22 * 4) - -#define GDB_FR_SSP (23 * 4) -#define GDB_FR_MSP (24 * 4) -#define GDB_FR_USP (25 * 4) -#define GDB_FR_MCRH (26 * 4) -#define GDB_FR_MCRL (27 * 4) -#define GDB_FR_MCVF (28 * 4) - -#define GDB_FR_FPCR (29 * 4) -#define GDB_FR_DUMMY0 (30 * 4) -#define GDB_FR_DUMMY1 (31 * 4) - -#define GDB_FR_FS0 (32 * 4) - -#define GDB_FR_SIZE (NUMREGS * 4) - -#ifndef __ASSEMBLY__ - -/* - * This is the same as above, but for the high-level - * part of the GDB stub. - */ - -struct gdb_regs { - /* saved main processor registers */ - u32 d0, d1, d2, d3, a0, a1, a2, a3; - u32 sp, pc, mdr, epsw, lir, lar, mdrq; - u32 e0, e1, e2, e3, e4, e5, e6, e7; - u32 ssp, msp, usp, mcrh, mcrl, mcvf; - - /* saved floating point registers */ - u32 fpcr, _dummy0, _dummy1; - u32 fs0, fs1, fs2, fs3, fs4, fs5, fs6, fs7; - u32 fs8, fs9, fs10, fs11, fs12, fs13, fs14, fs15; - u32 fs16, fs17, fs18, fs19, fs20, fs21, fs22, fs23; - u32 fs24, fs25, fs26, fs27, fs28, fs29, fs30, fs31; -}; - -/* - * Prototypes - */ -extern void show_registers_only(struct pt_regs *regs); - -extern asmlinkage void gdbstub_init(void); -extern asmlinkage void gdbstub_exit(int status); -extern asmlinkage void gdbstub_io_init(void); -extern asmlinkage void gdbstub_io_set_baud(unsigned baud); -extern asmlinkage int gdbstub_io_rx_char(unsigned char *_ch, int nonblock); -extern asmlinkage void gdbstub_io_tx_char(unsigned char ch); -extern asmlinkage void gdbstub_io_tx_flush(void); - -extern asmlinkage void gdbstub_io_rx_handler(void); -extern asmlinkage void gdbstub_rx_irq(struct pt_regs *, enum exception_code); -extern asmlinkage int gdbstub_intercept(struct pt_regs *, enum exception_code); -extern asmlinkage void gdbstub_exception(struct pt_regs *, enum exception_code); -extern asmlinkage void __gdbstub_bug_trap(void); -extern asmlinkage void __gdbstub_pause(void); -extern asmlinkage void start_kernel(void); - -#ifndef CONFIG_MN10300_CACHE_DISABLED -extern asmlinkage void gdbstub_purge_cache(void); -#else -#define gdbstub_purge_cache() do {} while (0) -#endif - -/* Used to prevent crashes in memory access */ -extern asmlinkage int gdbstub_read_byte(const u8 *, u8 *); -extern asmlinkage int gdbstub_read_word(const u8 *, u8 *); -extern asmlinkage int gdbstub_read_dword(const u8 *, u8 *); -extern asmlinkage int gdbstub_write_byte(u32, u8 *); -extern asmlinkage int gdbstub_write_word(u32, u8 *); -extern asmlinkage int gdbstub_write_dword(u32, u8 *); - -extern asmlinkage void gdbstub_read_byte_guard(void); -extern asmlinkage void gdbstub_read_byte_cont(void); -extern asmlinkage void gdbstub_read_word_guard(void); -extern asmlinkage void gdbstub_read_word_cont(void); -extern asmlinkage void gdbstub_read_dword_guard(void); -extern asmlinkage void gdbstub_read_dword_cont(void); -extern asmlinkage void gdbstub_write_byte_guard(void); -extern asmlinkage void gdbstub_write_byte_cont(void); -extern asmlinkage void gdbstub_write_word_guard(void); -extern asmlinkage void gdbstub_write_word_cont(void); -extern asmlinkage void gdbstub_write_dword_guard(void); -extern asmlinkage void gdbstub_write_dword_cont(void); - -extern u8 gdbstub_rx_buffer[PAGE_SIZE]; -extern u32 gdbstub_rx_inp; -extern u32 gdbstub_rx_outp; -extern u8 gdbstub_rx_overflow; -extern u8 gdbstub_busy; -extern u8 gdbstub_rx_unget; - -#ifdef CONFIG_GDBSTUB_DEBUGGING -extern void gdbstub_printk(const char *fmt, ...) - __attribute__((format(printf, 1, 2))); -#else -static inline __attribute__((format(printf, 1, 2))) -void gdbstub_printk(const char *fmt, ...) -{ -} -#endif - -#ifdef CONFIG_GDBSTUB_DEBUG_ENTRY -#define gdbstub_entry(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) -#else -#define gdbstub_entry(FMT, ...) ({ 0; }) -#endif - -#ifdef CONFIG_GDBSTUB_DEBUG_PROTOCOL -#define gdbstub_proto(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) -#else -#define gdbstub_proto(FMT, ...) ({ 0; }) -#endif - -#ifdef CONFIG_GDBSTUB_DEBUG_IO -#define gdbstub_io(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) -#else -#define gdbstub_io(FMT, ...) ({ 0; }) -#endif - -#ifdef CONFIG_GDBSTUB_DEBUG_BREAKPOINT -#define gdbstub_bkpt(FMT, ...) gdbstub_printk(FMT, ##__VA_ARGS__) -#else -#define gdbstub_bkpt(FMT, ...) ({ 0; }) -#endif - -#endif /* !__ASSEMBLY__ */ -#endif /* _ASM_GDB_STUB_H */ diff --git a/include/asm-mn10300/hardirq.h b/include/asm-mn10300/hardirq.h deleted file mode 100644 index 54d9501..0000000 --- a/include/asm-mn10300/hardirq.h +++ /dev/null @@ -1,48 +0,0 @@ -/* MN10300 Hardware IRQ statistics and management - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Modified by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_HARDIRQ_H -#define _ASM_HARDIRQ_H - -#include -#include -#include - -/* assembly code in softirq.h is sensitive to the offsets of these fields */ -typedef struct { - unsigned int __softirq_pending; - unsigned long idle_timestamp; - unsigned int __nmi_count; /* arch dependent */ - unsigned int __irq_count; /* arch dependent */ -} ____cacheline_aligned irq_cpustat_t; - -#include /* Standard mappings for irq_cpustat_t above */ - -extern void ack_bad_irq(int irq); - -/* - * manipulate stubs in the MN10300 CPU Trap/Interrupt Vector table - * - these should jump to __common_exception in entry.S unless there's a good - * reason to do otherwise (see trap_preinit() in traps.c) - */ -typedef void (*intr_stub_fnx)(struct pt_regs *regs, - enum exception_code intcode); - -/* - * manipulate pointers in the Exception table (see entry.S) - * - these are indexed by decoding the lower 24 bits of the TBR register - * - note that the MN103E010 doesn't always trap through the correct vector, - * but does always set the TBR correctly - */ -extern asmlinkage void set_excp_vector(enum exception_code code, - intr_stub_fnx handler); - -#endif /* _ASM_HARDIRQ_H */ diff --git a/include/asm-mn10300/highmem.h b/include/asm-mn10300/highmem.h deleted file mode 100644 index 90f2abb..0000000 --- a/include/asm-mn10300/highmem.h +++ /dev/null @@ -1,116 +0,0 @@ -/* MN10300 Virtual kernel memory mappings for high memory - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from include/asm-i386/highmem.h - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_HIGHMEM_H -#define _ASM_HIGHMEM_H - -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include - -/* undef for production */ -#undef HIGHMEM_DEBUG - -/* declarations for highmem.c */ -extern unsigned long highstart_pfn, highend_pfn; - -extern pte_t *kmap_pte; -extern pgprot_t kmap_prot; -extern pte_t *pkmap_page_table; - -extern void __init kmap_init(void); - -/* - * Right now we initialize only a single pte table. It can be extended - * easily, subsequent pte tables have to be allocated in one physical - * chunk of RAM. - */ -#define PKMAP_BASE 0xfe000000UL -#define LAST_PKMAP 1024 -#define LAST_PKMAP_MASK (LAST_PKMAP - 1) -#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) -#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) - -extern unsigned long kmap_high(struct page *page); -extern void kunmap_high(struct page *page); - -static inline unsigned long kmap(struct page *page) -{ - if (in_interrupt()) - BUG(); - if (page < highmem_start_page) - return page_address(page); - return kmap_high(page); -} - -static inline void kunmap(struct page *page) -{ - if (in_interrupt()) - BUG(); - if (page < highmem_start_page) - return; - kunmap_high(page); -} - -/* - * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap - * gives a more generic (and caching) interface. But kmap_atomic can - * be used in IRQ contexts, so in some (very limited) cases we need - * it. - */ -static inline unsigned long kmap_atomic(struct page *page, enum km_type type) -{ - enum fixed_addresses idx; - unsigned long vaddr; - - if (page < highmem_start_page) - return page_address(page); - - debug_kmap_atomic(type); - idx = type + KM_TYPE_NR * smp_processor_id(); - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); -#if HIGHMEM_DEBUG - if (!pte_none(*(kmap_pte - idx))) - BUG(); -#endif - set_pte(kmap_pte - idx, mk_pte(page, kmap_prot)); - __flush_tlb_one(vaddr); - - return vaddr; -} - -static inline void kunmap_atomic(unsigned long vaddr, enum km_type type) -{ -#if HIGHMEM_DEBUG - enum fixed_addresses idx = type + KM_TYPE_NR * smp_processor_id(); - - if (vaddr < FIXADDR_START) /* FIXME */ - return; - - if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)) - BUG(); - - /* - * force other mappings to Oops if they'll try to access - * this pte without first remap it - */ - pte_clear(kmap_pte - idx); - __flush_tlb_one(vaddr); -#endif -} - -#endif /* __KERNEL__ */ - -#endif /* _ASM_HIGHMEM_H */ diff --git a/include/asm-mn10300/hw_irq.h b/include/asm-mn10300/hw_irq.h deleted file mode 100644 index 7061990..0000000 --- a/include/asm-mn10300/hw_irq.h +++ /dev/null @@ -1,14 +0,0 @@ -/* MN10300 Hardware interrupt definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_HW_IRQ_H -#define _ASM_HW_IRQ_H - -#endif /* _ASM_HW_IRQ_H */ diff --git a/include/asm-mn10300/intctl-regs.h b/include/asm-mn10300/intctl-regs.h deleted file mode 100644 index ba544c7..0000000 --- a/include/asm-mn10300/intctl-regs.h +++ /dev/null @@ -1,73 +0,0 @@ -/* MN10300 On-board interrupt controller registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_INTCTL_REGS_H -#define _ASM_INTCTL_REGS_H - -#include - -#ifdef __KERNEL__ - -/* interrupt controller registers */ -#define GxICR(X) __SYSREG(0xd4000000 + (X) * 4, u16) /* group irq ctrl regs */ - -#define IAGR __SYSREG(0xd4000100, u16) /* intr acceptance group reg */ -#define IAGR_GN 0x00fc /* group number register - * (documentation _has_ to be wrong) - */ - -#define EXTMD __SYSREG(0xd4000200, u16) /* external pin intr spec reg */ -#define GET_XIRQ_TRIGGER(X) ((EXTMD >> ((X) * 2)) & 3) - -#define SET_XIRQ_TRIGGER(X,Y) \ -do { \ - u16 x = EXTMD; \ - x &= ~(3 << ((X) * 2)); \ - x |= ((Y) & 3) << ((X) * 2); \ - EXTMD = x; \ -} while (0) - -#define XIRQ_TRIGGER_LOWLEVEL 0 -#define XIRQ_TRIGGER_HILEVEL 1 -#define XIRQ_TRIGGER_NEGEDGE 2 -#define XIRQ_TRIGGER_POSEDGE 3 - -/* non-maskable interrupt control */ -#define NMIIRQ 0 -#define NMICR GxICR(NMIIRQ) /* NMI control register */ -#define NMICR_NMIF 0x0001 /* NMI pin interrupt flag */ -#define NMICR_WDIF 0x0002 /* watchdog timer overflow flag */ -#define NMICR_ABUSERR 0x0008 /* async bus error flag */ - -/* maskable interrupt control */ -#define GxICR_DETECT 0x0001 /* interrupt detect flag */ -#define GxICR_REQUEST 0x0010 /* interrupt request flag */ -#define GxICR_ENABLE 0x0100 /* interrupt enable flag */ -#define GxICR_LEVEL 0x7000 /* interrupt priority level */ -#define GxICR_LEVEL_0 0x0000 /* - level 0 */ -#define GxICR_LEVEL_1 0x1000 /* - level 1 */ -#define GxICR_LEVEL_2 0x2000 /* - level 2 */ -#define GxICR_LEVEL_3 0x3000 /* - level 3 */ -#define GxICR_LEVEL_4 0x4000 /* - level 4 */ -#define GxICR_LEVEL_5 0x5000 /* - level 5 */ -#define GxICR_LEVEL_6 0x6000 /* - level 6 */ -#define GxICR_LEVEL_SHIFT 12 - -#ifndef __ASSEMBLY__ -extern void set_intr_level(int irq, u16 level); -extern void set_intr_postackable(int irq); -#endif - -/* external interrupts */ -#define XIRQxICR(X) GxICR((X)) /* external interrupt control regs */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_INTCTL_REGS_H */ diff --git a/include/asm-mn10300/io.h b/include/asm-mn10300/io.h deleted file mode 100644 index c1a4119..0000000 --- a/include/asm-mn10300/io.h +++ /dev/null @@ -1,301 +0,0 @@ -/* MN10300 I/O port emulation and memory-mapped I/O - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_IO_H -#define _ASM_IO_H - -#include /* I/O is all done through memory accesses */ -#include -#include - -#define mmiowb() do {} while (0) - -/*****************************************************************************/ -/* - * readX/writeX() are used to access memory mapped devices. On some - * architectures the memory mapped IO stuff needs to be accessed - * differently. On the x86 architecture, we just read/write the - * memory location directly. - */ -static inline u8 readb(const volatile void __iomem *addr) -{ - return *(const volatile u8 *) addr; -} - -static inline u16 readw(const volatile void __iomem *addr) -{ - return *(const volatile u16 *) addr; -} - -static inline u32 readl(const volatile void __iomem *addr) -{ - return *(const volatile u32 *) addr; -} - -#define __raw_readb readb -#define __raw_readw readw -#define __raw_readl readl - -#define readb_relaxed readb -#define readw_relaxed readw -#define readl_relaxed readl - -static inline void writeb(u8 b, volatile void __iomem *addr) -{ - *(volatile u8 *) addr = b; -} - -static inline void writew(u16 b, volatile void __iomem *addr) -{ - *(volatile u16 *) addr = b; -} - -static inline void writel(u32 b, volatile void __iomem *addr) -{ - *(volatile u32 *) addr = b; -} - -#define __raw_writeb writeb -#define __raw_writew writew -#define __raw_writel writel - -/*****************************************************************************/ -/* - * traditional input/output functions - */ -static inline u8 inb_local(unsigned long addr) -{ - return readb((volatile void __iomem *) addr); -} - -static inline void outb_local(u8 b, unsigned long addr) -{ - return writeb(b, (volatile void __iomem *) addr); -} - -static inline u8 inb(unsigned long addr) -{ - return readb((volatile void __iomem *) addr); -} - -static inline u16 inw(unsigned long addr) -{ - return readw((volatile void __iomem *) addr); -} - -static inline u32 inl(unsigned long addr) -{ - return readl((volatile void __iomem *) addr); -} - -static inline void outb(u8 b, unsigned long addr) -{ - return writeb(b, (volatile void __iomem *) addr); -} - -static inline void outw(u16 b, unsigned long addr) -{ - return writew(b, (volatile void __iomem *) addr); -} - -static inline void outl(u32 b, unsigned long addr) -{ - return writel(b, (volatile void __iomem *) addr); -} - -#define inb_p(addr) inb(addr) -#define inw_p(addr) inw(addr) -#define inl_p(addr) inl(addr) -#define outb_p(x, addr) outb((x), (addr)) -#define outw_p(x, addr) outw((x), (addr)) -#define outl_p(x, addr) outl((x), (addr)) - -static inline void insb(unsigned long addr, void *buffer, int count) -{ - if (count) { - u8 *buf = buffer; - do { - u8 x = inb(addr); - *buf++ = x; - } while (--count); - } -} - -static inline void insw(unsigned long addr, void *buffer, int count) -{ - if (count) { - u16 *buf = buffer; - do { - u16 x = inw(addr); - *buf++ = x; - } while (--count); - } -} - -static inline void insl(unsigned long addr, void *buffer, int count) -{ - if (count) { - u32 *buf = buffer; - do { - u32 x = inl(addr); - *buf++ = x; - } while (--count); - } -} - -static inline void outsb(unsigned long addr, const void *buffer, int count) -{ - if (count) { - const u8 *buf = buffer; - do { - outb(*buf++, addr); - } while (--count); - } -} - -static inline void outsw(unsigned long addr, const void *buffer, int count) -{ - if (count) { - const u16 *buf = buffer; - do { - outw(*buf++, addr); - } while (--count); - } -} - -extern void __outsl(unsigned long addr, const void *buffer, int count); -static inline void outsl(unsigned long addr, const void *buffer, int count) -{ - if ((unsigned long) buffer & 0x3) - return __outsl(addr, buffer, count); - - if (count) { - const u32 *buf = buffer; - do { - outl(*buf++, addr); - } while (--count); - } -} - -#define ioread8(addr) readb(addr) -#define ioread16(addr) readw(addr) -#define ioread32(addr) readl(addr) - -#define iowrite8(v, addr) writeb((v), (addr)) -#define iowrite16(v, addr) writew((v), (addr)) -#define iowrite32(v, addr) writel((v), (addr)) - -#define ioread8_rep(p, dst, count) \ - insb((unsigned long) (p), (dst), (count)) -#define ioread16_rep(p, dst, count) \ - insw((unsigned long) (p), (dst), (count)) -#define ioread32_rep(p, dst, count) \ - insl((unsigned long) (p), (dst), (count)) - -#define iowrite8_rep(p, src, count) \ - outsb((unsigned long) (p), (src), (count)) -#define iowrite16_rep(p, src, count) \ - outsw((unsigned long) (p), (src), (count)) -#define iowrite32_rep(p, src, count) \ - outsl((unsigned long) (p), (src), (count)) - - -#define IO_SPACE_LIMIT 0xffffffff - -#ifdef __KERNEL__ - -#include -#define __io_virt(x) ((void *) (x)) - -/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ -struct pci_dev; -extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); -static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) -{ -} - -/* - * Change virtual addresses to physical addresses and vv. - * These are pretty trivial - */ -static inline unsigned long virt_to_phys(volatile void *address) -{ - return __pa(address); -} - -static inline void *phys_to_virt(unsigned long address) -{ - return __va(address); -} - -/* - * Change "struct page" to physical address. - */ -static inline void *__ioremap(unsigned long offset, unsigned long size, - unsigned long flags) -{ - return (void *) offset; -} - -static inline void *ioremap(unsigned long offset, unsigned long size) -{ - return (void *) offset; -} - -/* - * This one maps high address device memory and turns off caching for that - * area. it's useful if some control registers are in such an area and write - * combining or read caching is not desirable: - */ -static inline void *ioremap_nocache(unsigned long offset, unsigned long size) -{ - return (void *) (offset | 0x20000000); -} - -#define ioremap_wc ioremap_nocache - -static inline void iounmap(void *addr) -{ -} - -static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) -{ - return (void __iomem *) port; -} - -static inline void ioport_unmap(void __iomem *p) -{ -} - -#define xlate_dev_kmem_ptr(p) ((void *) (p)) -#define xlate_dev_mem_ptr(p) ((void *) (p)) - -/* - * PCI bus iomem addresses must be in the region 0x80000000-0x9fffffff - */ -static inline unsigned long virt_to_bus(volatile void *address) -{ - return ((unsigned long) address) & ~0x20000000; -} - -static inline void *bus_to_virt(unsigned long address) -{ - return (void *) address; -} - -#define page_to_bus page_to_phys - -#define memset_io(a, b, c) memset(__io_virt(a), (b), (c)) -#define memcpy_fromio(a, b, c) memcpy((a), __io_virt(b), (c)) -#define memcpy_toio(a, b, c) memcpy(__io_virt(a), (b), (c)) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_IO_H */ diff --git a/include/asm-mn10300/ioctl.h b/include/asm-mn10300/ioctl.h deleted file mode 100644 index b279fe0..0000000 --- a/include/asm-mn10300/ioctl.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/ioctls.h b/include/asm-mn10300/ioctls.h deleted file mode 100644 index dcbfb45..0000000 --- a/include/asm-mn10300/ioctls.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef _ASM_IOCTLS_H -#define _ASM_IOCTLS_H - -#include - -/* 0x54 is just a magic number to make these relatively unique ('T') */ - -#define TCGETS 0x5401 -#define TCSETS 0x5402 -#define TCSETSW 0x5403 -#define TCSETSF 0x5404 -#define TCGETA 0x5405 -#define TCSETA 0x5406 -#define TCSETAW 0x5407 -#define TCSETAF 0x5408 -#define TCSBRK 0x5409 -#define TCXONC 0x540A -#define TCFLSH 0x540B -#define TIOCEXCL 0x540C -#define TIOCNXCL 0x540D -#define TIOCSCTTY 0x540E -#define TIOCGPGRP 0x540F -#define TIOCSPGRP 0x5410 -#define TIOCOUTQ 0x5411 -#define TIOCSTI 0x5412 -#define TIOCGWINSZ 0x5413 -#define TIOCSWINSZ 0x5414 -#define TIOCMGET 0x5415 -#define TIOCMBIS 0x5416 -#define TIOCMBIC 0x5417 -#define TIOCMSET 0x5418 -#define TIOCGSOFTCAR 0x5419 -#define TIOCSSOFTCAR 0x541A -#define FIONREAD 0x541B -#define TIOCINQ FIONREAD -#define TIOCLINUX 0x541C -#define TIOCCONS 0x541D -#define TIOCGSERIAL 0x541E -#define TIOCSSERIAL 0x541F -#define TIOCPKT 0x5420 -#define FIONBIO 0x5421 -#define TIOCNOTTY 0x5422 -#define TIOCSETD 0x5423 -#define TIOCGETD 0x5424 -#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -/* #define TIOCTTYGSTRUCT 0x5426 - Former debugging-only ioctl */ -#define TIOCSBRK 0x5427 /* BSD compatibility */ -#define TIOCCBRK 0x5428 /* BSD compatibility */ -#define TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TCGETS2 _IOR('T', 0x2A, struct termios2) -#define TCSETS2 _IOW('T', 0x2B, struct termios2) -#define TCSETSW2 _IOW('T', 0x2C, struct termios2) -#define TCSETSF2 _IOW('T', 0x2D, struct termios2) -#define TIOCGPTN _IOR('T', 0x30, unsigned int) /* Get Pty Number - * (of pty-mux device) */ -#define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ - -#define FIONCLEX 0x5450 -#define FIOCLEX 0x5451 -#define FIOASYNC 0x5452 -#define TIOCSERCONFIG 0x5453 -#define TIOCSERGWILD 0x5454 -#define TIOCSERSWILD 0x5455 -#define TIOCGLCKTRMIOS 0x5456 -#define TIOCSLCKTRMIOS 0x5457 -#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ -#define FIOQSIZE 0x5460 - -/* Used for packet mode */ -#define TIOCPKT_DATA 0 -#define TIOCPKT_FLUSHREAD 1 -#define TIOCPKT_FLUSHWRITE 2 -#define TIOCPKT_STOP 4 -#define TIOCPKT_START 8 -#define TIOCPKT_NOSTOP 16 -#define TIOCPKT_DOSTOP 32 - -#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ - -#endif /* _ASM_IOCTLS_H */ diff --git a/include/asm-mn10300/ipc.h b/include/asm-mn10300/ipc.h deleted file mode 100644 index a46e3d9..0000000 --- a/include/asm-mn10300/ipc.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/ipcbuf.h b/include/asm-mn10300/ipcbuf.h deleted file mode 100644 index f6f63d4..0000000 --- a/include/asm-mn10300/ipcbuf.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _ASM_IPCBUF_H -#define _ASM_IPCBUF_H - -/* - * The ipc64_perm structure for MN10300 architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 32-bit mode_t and seq - * - 2 miscellaneous 32-bit values - */ - -struct ipc64_perm -{ - __kernel_key_t key; - __kernel_uid32_t uid; - __kernel_gid32_t gid; - __kernel_uid32_t cuid; - __kernel_gid32_t cgid; - __kernel_mode_t mode; - unsigned short __pad1; - unsigned short seq; - unsigned short __pad2; - unsigned long __unused1; - unsigned long __unused2; -}; - -#endif /* _ASM_IPCBUF_H */ diff --git a/include/asm-mn10300/irq.h b/include/asm-mn10300/irq.h deleted file mode 100644 index 53b3801..0000000 --- a/include/asm-mn10300/irq.h +++ /dev/null @@ -1,32 +0,0 @@ -/* MN10300 Hardware interrupt definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Modified by David Howells (dhowells@redhat.com) - * - Derived from include/asm-i386/irq.h: - * - (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_IRQ_H -#define _ASM_IRQ_H - -#include -#include -#include - -/* this number is used when no interrupt has been assigned */ -#define NO_IRQ INT_MAX - -/* hardware irq numbers */ -#define NR_IRQS GxICR_NUM_IRQS - -/* external hardware irq numbers */ -#define NR_XIRQS GxICR_NUM_XIRQS - -#define irq_canonicalize(IRQ) (IRQ) - -#endif /* _ASM_IRQ_H */ diff --git a/include/asm-mn10300/irq_regs.h b/include/asm-mn10300/irq_regs.h deleted file mode 100644 index a848cd2..0000000 --- a/include/asm-mn10300/irq_regs.h +++ /dev/null @@ -1,24 +0,0 @@ -/* MN10300 IRQ registers pointer definition - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_IRQ_REGS_H -#define _ASM_IRQ_REGS_H - -/* - * Per-cpu current frame pointer - the location of the last exception frame on - * the stack - */ -#define ARCH_HAS_OWN_IRQ_REGS - -#ifndef __ASSEMBLY__ -#define get_irq_regs() (__frame) -#endif - -#endif /* _ASM_IRQ_REGS_H */ diff --git a/include/asm-mn10300/kdebug.h b/include/asm-mn10300/kdebug.h deleted file mode 100644 index 0f47e11..0000000 --- a/include/asm-mn10300/kdebug.h +++ /dev/null @@ -1,22 +0,0 @@ -/* MN10300 In-kernel death knells - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_KDEBUG_H -#define _ASM_KDEBUG_H - -/* Grossly misnamed. */ -enum die_val { - DIE_OOPS = 1, - DIE_BREAKPOINT, - DIE_GPF, -}; - -#endif /* _ASM_KDEBUG_H */ diff --git a/include/asm-mn10300/kmap_types.h b/include/asm-mn10300/kmap_types.h deleted file mode 100644 index 3398f9f..0000000 --- a/include/asm-mn10300/kmap_types.h +++ /dev/null @@ -1,31 +0,0 @@ -/* MN10300 kmap_atomic() slot IDs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_KMAP_TYPES_H -#define _ASM_KMAP_TYPES_H - -enum km_type { - KM_BOUNCE_READ, - KM_SKB_SUNRPC_DATA, - KM_SKB_DATA_SOFTIRQ, - KM_USER0, - KM_USER1, - KM_BIO_SRC_IRQ, - KM_BIO_DST_IRQ, - KM_PTE0, - KM_PTE1, - KM_IRQ0, - KM_IRQ1, - KM_SOFTIRQ0, - KM_SOFTIRQ1, - KM_TYPE_NR -}; - -#endif /* _ASM_KMAP_TYPES_H */ diff --git a/include/asm-mn10300/kprobes.h b/include/asm-mn10300/kprobes.h deleted file mode 100644 index c800b59..0000000 --- a/include/asm-mn10300/kprobes.h +++ /dev/null @@ -1,50 +0,0 @@ -/* MN10300 Kernel Probes support - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by Mark Salter (msalter@redhat.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public Licence as published by - * the Free Software Foundation; either version 2 of the Licence, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public Licence for more details. - * - * You should have received a copy of the GNU General Public Licence - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ -#ifndef _ASM_KPROBES_H -#define _ASM_KPROBES_H - -#include -#include - -struct kprobe; - -typedef unsigned char kprobe_opcode_t; -#define BREAKPOINT_INSTRUCTION 0xff -#define MAX_INSN_SIZE 8 -#define MAX_STACK_SIZE 128 - -/* Architecture specific copy of original instruction */ -struct arch_specific_insn { - /* copy of original instruction - */ - kprobe_opcode_t insn[MAX_INSN_SIZE]; -}; - -extern const int kretprobe_blacklist_size; - -extern int kprobe_exceptions_notify(struct notifier_block *self, - unsigned long val, void *data); - -#define flush_insn_slot(p) do {} while (0) - -extern void arch_remove_kprobe(struct kprobe *p); - -#endif /* _ASM_KPROBES_H */ diff --git a/include/asm-mn10300/linkage.h b/include/asm-mn10300/linkage.h deleted file mode 100644 index dda3002..0000000 --- a/include/asm-mn10300/linkage.h +++ /dev/null @@ -1,20 +0,0 @@ -/* MN10300 Linkage and calling-convention overrides - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_LINKAGE_H -#define _ASM_LINKAGE_H - -/* don't override anything */ -#define asmlinkage - -#define __ALIGN .align 4,0xcb -#define __ALIGN_STR ".align 4,0xcb" - -#endif diff --git a/include/asm-mn10300/local.h b/include/asm-mn10300/local.h deleted file mode 100644 index c11c530..0000000 --- a/include/asm-mn10300/local.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/mc146818rtc.h b/include/asm-mn10300/mc146818rtc.h deleted file mode 100644 index df6bc6e..0000000 --- a/include/asm-mn10300/mc146818rtc.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/mman.h b/include/asm-mn10300/mman.h deleted file mode 100644 index b7986b6..0000000 --- a/include/asm-mn10300/mman.h +++ /dev/null @@ -1,28 +0,0 @@ -/* MN10300 Constants for mmap and co. - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - Derived from asm-x86/mman.h - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_MMAN_H -#define _ASM_MMAN_H - -#include - -#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ -#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ -#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ -#define MAP_LOCKED 0x2000 /* pages are locked */ -#define MAP_NORESERVE 0x4000 /* don't check for reservations */ -#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ -#define MAP_NONBLOCK 0x10000 /* do not block on IO */ - -#define MCL_CURRENT 1 /* lock all current mappings */ -#define MCL_FUTURE 2 /* lock all future mappings */ - -#endif /* _ASM_MMAN_H */ diff --git a/include/asm-mn10300/mmu.h b/include/asm-mn10300/mmu.h deleted file mode 100644 index 2d2d097..0000000 --- a/include/asm-mn10300/mmu.h +++ /dev/null @@ -1,19 +0,0 @@ -/* MN10300 Memory management context - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - Derived from include/asm-frv/mmu.h - */ - -#ifndef _ASM_MMU_H -#define _ASM_MMU_H - -/* - * MMU context - */ -typedef struct { - unsigned long tlbpid[NR_CPUS]; /* TLB PID for this process on - * each CPU */ -} mm_context_t; - -#endif /* _ASM_MMU_H */ diff --git a/include/asm-mn10300/mmu_context.h b/include/asm-mn10300/mmu_context.h deleted file mode 100644 index a9e2e34..0000000 --- a/include/asm-mn10300/mmu_context.h +++ /dev/null @@ -1,138 +0,0 @@ -/* MN10300 MMU context management - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Modified by David Howells (dhowells@redhat.com) - * - Derived from include/asm-m32r/mmu_context.h - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - * - * - * This implements an algorithm to provide TLB PID mappings to provide - * selective access to the TLB for processes, thus reducing the number of TLB - * flushes required. - * - * Note, however, that the M32R algorithm is technically broken as it does not - * handle version wrap-around, and could, theoretically, have a problem with a - * very long lived program that sleeps long enough for the version number to - * wrap all the way around so that its TLB mappings appear valid once again. - */ -#ifndef _ASM_MMU_CONTEXT_H -#define _ASM_MMU_CONTEXT_H - -#include -#include -#include -#include - -#define MMU_CONTEXT_TLBPID_MASK 0x000000ffUL -#define MMU_CONTEXT_VERSION_MASK 0xffffff00UL -#define MMU_CONTEXT_FIRST_VERSION 0x00000100UL -#define MMU_NO_CONTEXT 0x00000000UL - -extern unsigned long mmu_context_cache[NR_CPUS]; -#define mm_context(mm) (mm->context.tlbpid[smp_processor_id()]) - -#define enter_lazy_tlb(mm, tsk) do {} while (0) - -#ifdef CONFIG_SMP -#define cpu_ran_vm(cpu, task) \ - cpu_set((cpu), (task)->cpu_vm_mask) -#define cpu_maybe_ran_vm(cpu, task) \ - cpu_test_and_set((cpu), (task)->cpu_vm_mask) -#else -#define cpu_ran_vm(cpu, task) do {} while (0) -#define cpu_maybe_ran_vm(cpu, task) true -#endif /* CONFIG_SMP */ - -/* - * allocate an MMU context - */ -static inline unsigned long allocate_mmu_context(struct mm_struct *mm) -{ - unsigned long *pmc = &mmu_context_cache[smp_processor_id()]; - unsigned long mc = ++(*pmc); - - if (!(mc & MMU_CONTEXT_TLBPID_MASK)) { - /* we exhausted the TLB PIDs of this version on this CPU, so we - * flush this CPU's TLB in its entirety and start new cycle */ - flush_tlb_all(); - - /* fix the TLB version if needed (we avoid version #0 so as to - * distingush MMU_NO_CONTEXT) */ - if (!mc) - *pmc = mc = MMU_CONTEXT_FIRST_VERSION; - } - mm_context(mm) = mc; - return mc; -} - -/* - * get an MMU context if one is needed - */ -static inline unsigned long get_mmu_context(struct mm_struct *mm) -{ - unsigned long mc = MMU_NO_CONTEXT, cache; - - if (mm) { - cache = mmu_context_cache[smp_processor_id()]; - mc = mm_context(mm); - - /* if we have an old version of the context, replace it */ - if ((mc ^ cache) & MMU_CONTEXT_VERSION_MASK) - mc = allocate_mmu_context(mm); - } - return mc; -} - -/* - * initialise the context related info for a new mm_struct instance - */ -static inline int init_new_context(struct task_struct *tsk, - struct mm_struct *mm) -{ - int num_cpus = NR_CPUS, i; - - for (i = 0; i < num_cpus; i++) - mm->context.tlbpid[i] = MMU_NO_CONTEXT; - return 0; -} - -/* - * destroy context related info for an mm_struct that is about to be put to - * rest - */ -#define destroy_context(mm) do { } while (0) - -/* - * after we have set current->mm to a new value, this activates the context for - * the new mm so we see the new mappings. - */ -static inline void activate_context(struct mm_struct *mm, int cpu) -{ - PIDR = get_mmu_context(mm) & MMU_CONTEXT_TLBPID_MASK; -} - -/* - * change between virtual memory sets - */ -static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, - struct task_struct *tsk) -{ - int cpu = smp_processor_id(); - - if (prev != next) { - cpu_ran_vm(cpu, next); - activate_context(next, cpu); - PTBR = (unsigned long) next->pgd; - } else if (!cpu_maybe_ran_vm(cpu, next)) { - activate_context(next, cpu); - } -} - -#define deactivate_mm(tsk, mm) do {} while (0) -#define activate_mm(prev, next) switch_mm((prev), (next), NULL) - -#endif /* _ASM_MMU_CONTEXT_H */ diff --git a/include/asm-mn10300/module.h b/include/asm-mn10300/module.h deleted file mode 100644 index 5d7057d..0000000 --- a/include/asm-mn10300/module.h +++ /dev/null @@ -1,27 +0,0 @@ -/* MN10300 Arch-specific module definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by Mark Salter (msalter@redhat.com) - * Derived from include/asm-i386/module.h - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_MODULE_H -#define _ASM_MODULE_H - -struct mod_arch_specific { -}; - -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Ehdr Elf32_Ehdr - -/* - * Include the MN10300 architecture version. - */ -#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " " - -#endif /* _ASM_MODULE_H */ diff --git a/include/asm-mn10300/msgbuf.h b/include/asm-mn10300/msgbuf.h deleted file mode 100644 index 8b60245..0000000 --- a/include/asm-mn10300/msgbuf.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _ASM_MSGBUF_H -#define _ASM_MSGBUF_H - -/* - * The msqid64_ds structure for MN10300 architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct msqid64_ds { - struct ipc64_perm msg_perm; - __kernel_time_t msg_stime; /* last msgsnd time */ - unsigned long __unused1; - __kernel_time_t msg_rtime; /* last msgrcv time */ - unsigned long __unused2; - __kernel_time_t msg_ctime; /* last change time */ - unsigned long __unused3; - unsigned long msg_cbytes; /* current number of bytes on queue */ - unsigned long msg_qnum; /* number of messages in queue */ - unsigned long msg_qbytes; /* max number of bytes on queue */ - __kernel_pid_t msg_lspid; /* pid of last msgsnd */ - __kernel_pid_t msg_lrpid; /* last receive pid */ - unsigned long __unused4; - unsigned long __unused5; -}; - -#endif /* _ASM_MSGBUF_H */ diff --git a/include/asm-mn10300/mutex.h b/include/asm-mn10300/mutex.h deleted file mode 100644 index 84f5490..0000000 --- a/include/asm-mn10300/mutex.h +++ /dev/null @@ -1,16 +0,0 @@ -/* MN10300 Mutex fastpath - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - * - * - * TODO: implement optimized primitives instead, or leave the generic - * implementation in place, or pick the atomic_xchg() based generic - * implementation. (see asm-generic/mutex-xchg.h for details) - */ -#include diff --git a/include/asm-mn10300/nmi.h b/include/asm-mn10300/nmi.h deleted file mode 100644 index f3671cb..0000000 --- a/include/asm-mn10300/nmi.h +++ /dev/null @@ -1,14 +0,0 @@ -/* MN10300 NMI handling - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_NMI_H -#define _ASM_NMI_H - -#endif /* _ASM_NMI_H */ diff --git a/include/asm-mn10300/page.h b/include/asm-mn10300/page.h deleted file mode 100644 index 8288e12..0000000 --- a/include/asm-mn10300/page.h +++ /dev/null @@ -1,128 +0,0 @@ -/* MN10300 Page table definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PAGE_H -#define _ASM_PAGE_H - -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT 12 - -#ifndef __ASSEMBLY__ -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE - 1)) -#else -#define PAGE_SIZE +(1 << PAGE_SHIFT) /* unary plus marks an - * immediate val not an addr */ -#define PAGE_MASK +(~(PAGE_SIZE - 1)) -#endif - -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) -#define copy_page(to, from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) - -#define clear_user_page(addr, vaddr, page) clear_page(addr) -#define copy_user_page(vto, vfrom, vaddr, to) copy_page(vto, vfrom) - -/* - * These are used to make use of C type-checking.. - */ -typedef struct { unsigned long pte; } pte_t; -typedef struct { unsigned long pgd; } pgd_t; -typedef struct { unsigned long pgprot; } pgprot_t; -typedef struct page *pgtable_t; - -#define PTE_MASK PAGE_MASK -#define HPAGE_SHIFT 22 - -#ifdef CONFIG_HUGETLB_PAGE -#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) -#define HPAGE_MASK (~(HPAGE_SIZE - 1)) -#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) -#endif - -#define pte_val(x) ((x).pte) -#define pgd_val(x) ((x).pgd) -#define pgprot_val(x) ((x).pgprot) - -#define __pte(x) ((pte_t) { (x) }) -#define __pgd(x) ((pgd_t) { (x) }) -#define __pgprot(x) ((pgprot_t) { (x) }) - -#include - -#endif /* !__ASSEMBLY__ */ - -/* - * This handles the memory map.. We could make this a config - * option, but too many people screw it up, and too few need - * it. - * - * A __PAGE_OFFSET of 0xC0000000 means that the kernel has - * a virtual address space of one gigabyte, which limits the - * amount of physical memory you can use to about 950MB. - */ - -#ifndef __ASSEMBLY__ - -/* Pure 2^n version of get_order */ -static inline int get_order(unsigned long size) __attribute__((const)); -static inline int get_order(unsigned long size) -{ - int order; - - size = (size - 1) >> (PAGE_SHIFT - 1); - order = -1; - do { - size >>= 1; - order++; - } while (size); - return order; -} - -#endif /* __ASSEMBLY__ */ - -#include - -#define __PAGE_OFFSET (PAGE_OFFSET_RAW) -#define PAGE_OFFSET ((unsigned long) __PAGE_OFFSET) - -/* - * main RAM and kernel working space are coincident at 0x90000000, but to make - * life more interesting, there's also an uncached virtual shadow at 0xb0000000 - * - these mappings are fixed in the MMU - */ -#define __pfn_disp (CONFIG_KERNEL_RAM_BASE_ADDRESS >> PAGE_SHIFT) - -#define __pa(x) ((unsigned long)(x)) -#define __va(x) ((void *)(unsigned long)(x)) -#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) -#define pfn_to_page(pfn) (mem_map + ((pfn) - __pfn_disp)) -#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + __pfn_disp) - -#define pfn_valid(pfn) \ -({ \ - unsigned long __pfn = (pfn) - __pfn_disp; \ - __pfn < max_mapnr; \ -}) - -#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) -#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) - -#define VM_DATA_DEFAULT_FLAGS \ - (VM_READ | VM_WRITE | \ - ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ - VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_PAGE_H */ diff --git a/include/asm-mn10300/page_offset.h b/include/asm-mn10300/page_offset.h deleted file mode 100644 index 8eb5b16..0000000 --- a/include/asm-mn10300/page_offset.h +++ /dev/null @@ -1,11 +0,0 @@ -/* MN10300 Kernel base address - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - */ -#ifndef _ASM_PAGE_OFFSET_H -#define _ASM_PAGE_OFFSET_H - -#define PAGE_OFFSET_RAW CONFIG_KERNEL_RAM_BASE_ADDRESS - -#endif diff --git a/include/asm-mn10300/param.h b/include/asm-mn10300/param.h deleted file mode 100644 index 789b1df..0000000 --- a/include/asm-mn10300/param.h +++ /dev/null @@ -1,34 +0,0 @@ -/* MN10300 Kernel parameters - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PARAM_H -#define _ASM_PARAM_H - -#ifdef __KERNEL__ -#define HZ CONFIG_HZ /* Internal kernel timer frequency */ -#define USER_HZ 100 /* .. some user interfaces are in - * "ticks" */ -#define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -#endif - -#ifndef HZ -#define HZ 100 -#endif - -#define EXEC_PAGESIZE 4096 - -#ifndef NOGROUP -#define NOGROUP (-1) -#endif - -#define MAXHOSTNAMELEN 64 /* max length of hostname */ -#define COMMAND_LINE_SIZE 256 - -#endif /* _ASM_PARAM_H */ diff --git a/include/asm-mn10300/pci.h b/include/asm-mn10300/pci.h deleted file mode 100644 index 0517b45..0000000 --- a/include/asm-mn10300/pci.h +++ /dev/null @@ -1,129 +0,0 @@ -/* MN10300 PCI definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PCI_H -#define _ASM_PCI_H - -#ifdef __KERNEL__ -#include /* for struct page */ - -#if 0 -#define __pcbdebug(FMT, ADDR, ...) \ - printk(KERN_DEBUG "PCIBRIDGE[%08x]: "FMT"\n", \ - (u32)(ADDR), ##__VA_ARGS__) - -#define __pcidebug(FMT, BUS, DEVFN, WHERE,...) \ -do { \ - printk(KERN_DEBUG "PCI[%02x:%02x.%x + %02x]: "FMT"\n", \ - (BUS)->number, \ - PCI_SLOT(DEVFN), \ - PCI_FUNC(DEVFN), \ - (u32)(WHERE), ##__VA_ARGS__); \ -} while (0) - -#else -#define __pcbdebug(FMT, ADDR, ...) do {} while (0) -#define __pcidebug(FMT, BUS, DEVFN, WHERE, ...) do {} while (0) -#endif - -/* Can be used to override the logic in pci_scan_bus for skipping - * already-configured bus numbers - to be used for buggy BIOSes or - * architectures with incomplete PCI setup by the loader */ - -#ifdef CONFIG_PCI -#define pcibios_assign_all_busses() 1 -extern void unit_pci_init(void); -#else -#define pcibios_assign_all_busses() 0 -#endif - -extern unsigned long pci_mem_start; -#define PCIBIOS_MIN_IO 0xBE000004 -#define PCIBIOS_MIN_MEM 0xB8000000 - -void pcibios_set_master(struct pci_dev *dev); -void pcibios_penalize_isa_irq(int irq); - -/* Dynamic DMA mapping stuff. - * i386 has everything mapped statically. - */ - -#include -#include -#include -#include -#include -#include - -struct pci_dev; - -/* The PCI address space does equal the physical memory - * address space. The networking and block device layers use - * this boolean for bounce buffer decisions. - */ -#define PCI_DMA_BUS_IS_PHYS (1) - - -/* This is always fine. */ -#define pci_dac_dma_supported(pci_dev, mask) (0) - -/* Return the index of the PCI controller for device. */ -static inline int pci_controller_num(struct pci_dev *dev) -{ - return 0; -} - -#define HAVE_PCI_MMAP -extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, - enum pci_mmap_state mmap_state, - int write_combine); - -#endif /* __KERNEL__ */ - -/* implement the pci_ DMA API in terms of the generic device dma_ one */ -#include - -/** - * pcibios_resource_to_bus - convert resource to PCI bus address - * @dev: device which owns this resource - * @region: converted bus-centric region (start,end) - * @res: resource to convert - * - * Convert a resource to a PCI device bus address or bus window. - */ -extern void pcibios_resource_to_bus(struct pci_dev *dev, - struct pci_bus_region *region, - struct resource *res); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, - struct resource *res, - struct pci_bus_region *region); - -static inline struct resource * -pcibios_select_root(struct pci_dev *pdev, struct resource *res) -{ - struct resource *root = NULL; - - if (res->flags & IORESOURCE_IO) - root = &ioport_resource; - if (res->flags & IORESOURCE_MEM) - root = &iomem_resource; - - return root; -} - -#define pcibios_scan_all_fns(a, b) 0 - -static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) -{ - return channel ? 15 : 14; -} - -#endif /* _ASM_PCI_H */ diff --git a/include/asm-mn10300/percpu.h b/include/asm-mn10300/percpu.h deleted file mode 100644 index 06a959d..0000000 --- a/include/asm-mn10300/percpu.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/pgalloc.h b/include/asm-mn10300/pgalloc.h deleted file mode 100644 index ec057e1..0000000 --- a/include/asm-mn10300/pgalloc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* MN10300 Page and page table/directory allocation - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PGALLOC_H -#define _ASM_PGALLOC_H - -#include -#include -#include -#include /* for struct page */ - -struct mm_struct; -struct page; - -/* attach a page table to a PMD entry */ -#define pmd_populate_kernel(mm, pmd, pte) \ - set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE)) - -static inline -void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) -{ - set_pmd(pmd, __pmd((page_to_pfn(pte) << PAGE_SHIFT) | _PAGE_TABLE)); -} -#define pmd_pgtable(pmd) pmd_page(pmd) - -/* - * Allocate and free page tables. - */ - -extern pgd_t *pgd_alloc(struct mm_struct *); -extern void pgd_free(struct mm_struct *, pgd_t *); - -extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); -extern struct page *pte_alloc_one(struct mm_struct *, unsigned long); - -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) -{ - free_page((unsigned long) pte); -} - -static inline void pte_free(struct mm_struct *mm, struct page *pte) -{ - __free_page(pte); -} - - -#define __pte_free_tlb(tlb, pte) tlb_remove_page((tlb), (pte)) - -#endif /* _ASM_PGALLOC_H */ diff --git a/include/asm-mn10300/pgtable.h b/include/asm-mn10300/pgtable.h deleted file mode 100644 index 6dc30fc..0000000 --- a/include/asm-mn10300/pgtable.h +++ /dev/null @@ -1,492 +0,0 @@ -/* MN10300 Page table manipulators and constants - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - * - * - * The Linux memory management assumes a three-level page table setup. On - * the i386, we use that, but "fold" the mid level into the top-level page - * table, so that we physically have the same two-level page table as the - * i386 mmu expects. - * - * This file contains the functions and defines necessary to modify and use - * the i386 page table tree for the purposes of the MN10300 TLB handler - * functions. - */ -#ifndef _ASM_PGTABLE_H -#define _ASM_PGTABLE_H - -#include - -#ifndef __ASSEMBLY__ -#include -#include -#include - -#include - -#include -#include -#include - -/* - * ZERO_PAGE is a global shared page that is always zero: used - * for zero-mapped memory areas etc.. - */ -#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) -extern unsigned long empty_zero_page[1024]; -extern spinlock_t pgd_lock; -extern struct page *pgd_list; - -extern void pmd_ctor(void *, struct kmem_cache *, unsigned long); -extern void pgtable_cache_init(void); -extern void paging_init(void); - -#endif /* !__ASSEMBLY__ */ - -/* - * The Linux mn10300 paging architecture only implements both the traditional - * 2-level page tables - */ -#define PGDIR_SHIFT 22 -#define PTRS_PER_PGD 1024 -#define PTRS_PER_PUD 1 /* we don't really have any PUD physically */ -#define PTRS_PER_PMD 1 /* we don't really have any PMD physically */ -#define PTRS_PER_PTE 1024 - -#define PGD_SIZE PAGE_SIZE -#define PMD_SIZE (1UL << PMD_SHIFT) -#define PGDIR_SIZE (1UL << PGDIR_SHIFT) -#define PGDIR_MASK (~(PGDIR_SIZE - 1)) - -#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) -#define FIRST_USER_ADDRESS 0 - -#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT) -#define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS) - -#define TWOLEVEL_PGDIR_SHIFT 22 -#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT) -#define BOOT_KERNEL_PGD_PTRS (1024 - BOOT_USER_PGD_PTRS) - -#ifndef __ASSEMBLY__ -extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; -#endif - -/* - * Unfortunately, due to the way the MMU works on the MN10300, the vmalloc VM - * area has to be in the lower half of the virtual address range (the upper - * half is not translated through the TLB). - * - * So in this case, the vmalloc area goes at the bottom of the address map - * (leaving a hole at the very bottom to catch addressing errors), and - * userspace starts immediately above. - * - * The vmalloc() routines also leaves a hole of 4kB between each vmalloced - * area to catch addressing errors. - */ -#define VMALLOC_OFFSET (8 * 1024 * 1024) -#define VMALLOC_START (0x70000000) -#define VMALLOC_END (0x7C000000) - -#ifndef __ASSEMBLY__ -extern pte_t kernel_vmalloc_ptes[(VMALLOC_END - VMALLOC_START) / PAGE_SIZE]; -#endif - -/* IPTEL/DPTEL bit assignments */ -#define _PAGE_BIT_VALID xPTEL_V_BIT -#define _PAGE_BIT_ACCESSED xPTEL_UNUSED1_BIT /* mustn't be loaded into IPTEL/DPTEL */ -#define _PAGE_BIT_NX xPTEL_UNUSED2_BIT /* mustn't be loaded into IPTEL/DPTEL */ -#define _PAGE_BIT_CACHE xPTEL_C_BIT -#define _PAGE_BIT_PRESENT xPTEL_PV_BIT -#define _PAGE_BIT_DIRTY xPTEL_D_BIT -#define _PAGE_BIT_GLOBAL xPTEL_G_BIT - -#define _PAGE_VALID xPTEL_V -#define _PAGE_ACCESSED xPTEL_UNUSED1 -#define _PAGE_NX xPTEL_UNUSED2 /* no-execute bit */ -#define _PAGE_CACHE xPTEL_C -#define _PAGE_PRESENT xPTEL_PV -#define _PAGE_DIRTY xPTEL_D -#define _PAGE_PROT xPTEL_PR -#define _PAGE_PROT_RKNU xPTEL_PR_ROK -#define _PAGE_PROT_WKNU xPTEL_PR_RWK -#define _PAGE_PROT_RKRU xPTEL_PR_ROK_ROU -#define _PAGE_PROT_WKRU xPTEL_PR_RWK_ROU -#define _PAGE_PROT_WKWU xPTEL_PR_RWK_RWU -#define _PAGE_GLOBAL xPTEL_G -#define _PAGE_PSE xPTEL_PS_4Mb /* 4MB page */ - -#define _PAGE_FILE xPTEL_UNUSED1_BIT /* set:pagecache unset:swap */ - -#define __PAGE_PROT_UWAUX 0x040 -#define __PAGE_PROT_USER 0x080 -#define __PAGE_PROT_WRITE 0x100 - -#define _PAGE_PRESENTV (_PAGE_PRESENT|_PAGE_VALID) -#define _PAGE_PROTNONE 0x000 /* If not present */ - -#ifndef __ASSEMBLY__ - -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) - -#define _PAGE_TABLE (_PAGE_PRESENTV | _PAGE_PROT_WKNU | _PAGE_ACCESSED | _PAGE_DIRTY) -#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) - -#define __PAGE_NONE (_PAGE_PRESENTV | _PAGE_PROT_RKNU | _PAGE_ACCESSED | _PAGE_CACHE) -#define __PAGE_SHARED (_PAGE_PRESENTV | _PAGE_PROT_WKWU | _PAGE_ACCESSED | _PAGE_CACHE) -#define __PAGE_COPY (_PAGE_PRESENTV | _PAGE_PROT_RKRU | _PAGE_ACCESSED | _PAGE_CACHE) -#define __PAGE_READONLY (_PAGE_PRESENTV | _PAGE_PROT_RKRU | _PAGE_ACCESSED | _PAGE_CACHE) - -#define PAGE_NONE __pgprot(__PAGE_NONE | _PAGE_NX) -#define PAGE_SHARED_NOEXEC __pgprot(__PAGE_SHARED | _PAGE_NX) -#define PAGE_COPY_NOEXEC __pgprot(__PAGE_COPY | _PAGE_NX) -#define PAGE_READONLY_NOEXEC __pgprot(__PAGE_READONLY | _PAGE_NX) -#define PAGE_SHARED_EXEC __pgprot(__PAGE_SHARED) -#define PAGE_COPY_EXEC __pgprot(__PAGE_COPY) -#define PAGE_READONLY_EXEC __pgprot(__PAGE_READONLY) -#define PAGE_COPY PAGE_COPY_NOEXEC -#define PAGE_READONLY PAGE_READONLY_NOEXEC -#define PAGE_SHARED PAGE_SHARED_EXEC - -#define __PAGE_KERNEL_BASE (_PAGE_PRESENTV | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL) - -#define __PAGE_KERNEL (__PAGE_KERNEL_BASE | _PAGE_PROT_WKNU | _PAGE_CACHE | _PAGE_NX) -#define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL_BASE | _PAGE_PROT_WKNU | _PAGE_NX) -#define __PAGE_KERNEL_EXEC (__PAGE_KERNEL & ~_PAGE_NX) -#define __PAGE_KERNEL_RO (__PAGE_KERNEL_BASE | _PAGE_PROT_RKNU | _PAGE_CACHE | _PAGE_NX) -#define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) -#define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) - -#define PAGE_KERNEL __pgprot(__PAGE_KERNEL) -#define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO) -#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) -#define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE) -#define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) -#define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) - -/* - * Whilst the MN10300 can do page protection for execute (given separate data - * and insn TLBs), we are not supporting it at the moment. Write permission, - * however, always implies read permission (but not execute permission). - */ -#define __P000 PAGE_NONE -#define __P001 PAGE_READONLY_NOEXEC -#define __P010 PAGE_COPY_NOEXEC -#define __P011 PAGE_COPY_NOEXEC -#define __P100 PAGE_READONLY_EXEC -#define __P101 PAGE_READONLY_EXEC -#define __P110 PAGE_COPY_EXEC -#define __P111 PAGE_COPY_EXEC - -#define __S000 PAGE_NONE -#define __S001 PAGE_READONLY_NOEXEC -#define __S010 PAGE_SHARED_NOEXEC -#define __S011 PAGE_SHARED_NOEXEC -#define __S100 PAGE_READONLY_EXEC -#define __S101 PAGE_READONLY_EXEC -#define __S110 PAGE_SHARED_EXEC -#define __S111 PAGE_SHARED_EXEC - -/* - * Define this to warn about kernel memory accesses that are - * done without a 'verify_area(VERIFY_WRITE,..)' - */ -#undef TEST_VERIFY_AREA - -#define pte_present(x) (pte_val(x) & _PAGE_VALID) -#define pte_clear(mm, addr, xp) \ -do { \ - set_pte_at((mm), (addr), (xp), __pte(0)); \ -} while (0) - -#define pmd_none(x) (!pmd_val(x)) -#define pmd_present(x) (!pmd_none(x)) -#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) -#define pmd_bad(x) 0 - - -#define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) - -#ifndef __ASSEMBLY__ - -/* - * The following only work if pte_present() is true. - * Undefined behaviour if not.. - */ -static inline int pte_user(pte_t pte) { return pte_val(pte) & __PAGE_PROT_USER; } -static inline int pte_read(pte_t pte) { return pte_val(pte) & __PAGE_PROT_USER; } -static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } -static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } -static inline int pte_write(pte_t pte) { return pte_val(pte) & __PAGE_PROT_WRITE; } -static inline int pte_special(pte_t pte){ return 0; } - -/* - * The following only works if pte_present() is not true. - */ -static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } - -static inline pte_t pte_rdprotect(pte_t pte) -{ - pte_val(pte) &= ~(__PAGE_PROT_USER|__PAGE_PROT_UWAUX); return pte; -} -static inline pte_t pte_exprotect(pte_t pte) -{ - pte_val(pte) |= _PAGE_NX; return pte; -} - -static inline pte_t pte_wrprotect(pte_t pte) -{ - pte_val(pte) &= ~(__PAGE_PROT_WRITE|__PAGE_PROT_UWAUX); return pte; -} - -static inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~_PAGE_DIRTY; return pte; } -static inline pte_t pte_mkold(pte_t pte) { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; } -static inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= _PAGE_DIRTY; return pte; } -static inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= _PAGE_ACCESSED; return pte; } -static inline pte_t pte_mkexec(pte_t pte) { pte_val(pte) &= ~_PAGE_NX; return pte; } - -static inline pte_t pte_mkread(pte_t pte) -{ - pte_val(pte) |= __PAGE_PROT_USER; - if (pte_write(pte)) - pte_val(pte) |= __PAGE_PROT_UWAUX; - return pte; -} -static inline pte_t pte_mkwrite(pte_t pte) -{ - pte_val(pte) |= __PAGE_PROT_WRITE; - if (pte_val(pte) & __PAGE_PROT_USER) - pte_val(pte) |= __PAGE_PROT_UWAUX; - return pte; -} - -static inline pte_t pte_mkspecial(pte_t pte) { return pte; } - -#define pte_ERROR(e) \ - printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \ - __FILE__, __LINE__, pte_val(e)) -#define pgd_ERROR(e) \ - printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \ - __FILE__, __LINE__, pgd_val(e)) - -/* - * The "pgd_xxx()" functions here are trivial for a folded two-level - * setup: the pgd is never bad, and a pmd always exists (as it's folded - * into the pgd entry) - */ -#define pgd_clear(xp) do { } while (0) - -/* - * Certain architectures need to do special things when PTEs - * within a page table are directly modified. Thus, the following - * hook is made available. - */ -#define set_pte(pteptr, pteval) (*(pteptr) = pteval) -#define set_pte_at(mm, addr, ptep, pteval) set_pte((ptep), (pteval)) -#define set_pte_atomic(pteptr, pteval) set_pte((pteptr), (pteval)) - -/* - * (pmds are folded into pgds so this doesn't get actually called, - * but the define is needed for a generic inline function.) - */ -#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval) - -#define ptep_get_and_clear(mm, addr, ptep) \ - __pte(xchg(&(ptep)->pte, 0)) -#define pte_same(a, b) (pte_val(a) == pte_val(b)) -#define pte_page(x) pfn_to_page(pte_pfn(x)) -#define pte_none(x) (!pte_val(x)) -#define pte_pfn(x) ((unsigned long) (pte_val(x) >> PAGE_SHIFT)) -#define __pfn_addr(pfn) ((pfn) << PAGE_SHIFT) -#define pfn_pte(pfn, prot) __pte(__pfn_addr(pfn) | pgprot_val(prot)) -#define pfn_pmd(pfn, prot) __pmd(__pfn_addr(pfn) | pgprot_val(prot)) - -/* - * All present user pages are user-executable: - */ -static inline int pte_exec(pte_t pte) -{ - return pte_user(pte); -} - -/* - * All present pages are kernel-executable: - */ -static inline int pte_exec_kernel(pte_t pte) -{ - return 1; -} - -/* - * Bits 0 and 1 are taken, split up the 29 bits of offset - * into this range: - */ -#define PTE_FILE_MAX_BITS 29 - -#define pte_to_pgoff(pte) (pte_val(pte) >> 2) -#define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE) - -/* Encode and de-code a swap entry */ -#define __swp_type(x) (((x).val >> 2) & 0x3f) -#define __swp_offset(x) ((x).val >> 8) -#define __swp_entry(type, offset) \ - ((swp_entry_t) { ((type) << 2) | ((offset) << 8) }) -#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) -#define __swp_entry_to_pte(x) __pte((x).val) - -static inline -int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, - pte_t *ptep) -{ - if (!pte_dirty(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte); -} - -static inline -int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, - pte_t *ptep) -{ - if (!pte_young(*ptep)) - return 0; - return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte); -} - -static inline -void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) -{ - pte_val(*ptep) &= ~(__PAGE_PROT_WRITE|__PAGE_PROT_UWAUX); -} - -static inline void ptep_mkdirty(pte_t *ptep) -{ - set_bit(_PAGE_BIT_DIRTY, &ptep->pte); -} - -/* - * Macro to mark a page protection value as "uncacheable". On processors which - * do not support it, this is a no-op. - */ -#define pgprot_noncached(prot) __pgprot(pgprot_val(prot) | _PAGE_CACHE) - - -/* - * Conversion functions: convert a page and protection to a page entry, - * and a page entry and page directory to the page they refer to. - */ - -#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) -#define mk_pte_huge(entry) \ - ((entry).pte |= _PAGE_PRESENT | _PAGE_PSE | _PAGE_VALID) - -static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) -{ - pte_val(pte) &= _PAGE_CHG_MASK; - pte_val(pte) |= pgprot_val(newprot); - return pte; -} - -#define page_pte(page) page_pte_prot((page), __pgprot(0)) - -#define pmd_page_kernel(pmd) \ - ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) - -#define pmd_page(pmd) pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT) - -#define pmd_large(pmd) \ - ((pmd_val(pmd) & (_PAGE_PSE | _PAGE_PRESENT)) == \ - (_PAGE_PSE | _PAGE_PRESENT)) - -/* - * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] - * - * this macro returns the index of the entry in the pgd page which would - * control the given virtual address - */ -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) - -/* - * pgd_offset() returns a (pgd_t *) - * pgd_index() is used get the offset into the pgd page's array of pgd_t's; - */ -#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) - -/* - * a shortcut which implies the use of the kernel's pgd, instead - * of a process's - */ -#define pgd_offset_k(address) pgd_offset(&init_mm, address) - -/* - * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD] - * - * this macro returns the index of the entry in the pmd page which would - * control the given virtual address - */ -#define pmd_index(address) \ - (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) - -/* - * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] - * - * this macro returns the index of the entry in the pte page which would - * control the given virtual address - */ -#define pte_index(address) \ - (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) - -#define pte_offset_kernel(dir, address) \ - ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) - -/* - * Make a given kernel text page executable/non-executable. - * Returns the previous executability setting of that page (which - * is used to restore the previous state). Used by the SMP bootup code. - * NOTE: this is an __init function for security reasons. - */ -static inline int set_kernel_exec(unsigned long vaddr, int enable) -{ - return 0; -} - -#define pte_offset_map(dir, address) \ - ((pte_t *) page_address(pmd_page(*(dir))) + pte_index(address)) -#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address) -#define pte_unmap(pte) do {} while (0) -#define pte_unmap_nested(pte) do {} while (0) - -/* - * The MN10300 has external MMU info in the form of a TLB: this is adapted from - * the kernel page tables containing the necessary information by tlb-mn10300.S - */ -extern void update_mmu_cache(struct vm_area_struct *vma, - unsigned long address, pte_t pte); - -#endif /* !__ASSEMBLY__ */ - -#define kern_addr_valid(addr) (1) - -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ - remap_pfn_range((vma), (vaddr), (pfn), (size), (prot)) - -#define MK_IOSPACE_PFN(space, pfn) (pfn) -#define GET_IOSPACE(pfn) 0 -#define GET_PFN(pfn) (pfn) - -#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG -#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY -#define __HAVE_ARCH_PTEP_GET_AND_CLEAR -#define __HAVE_ARCH_PTEP_SET_WRPROTECT -#define __HAVE_ARCH_PTEP_MKDIRTY -#define __HAVE_ARCH_PTE_SAME -#include - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_PGTABLE_H */ diff --git a/include/asm-mn10300/pio-regs.h b/include/asm-mn10300/pio-regs.h deleted file mode 100644 index 96bc818..0000000 --- a/include/asm-mn10300/pio-regs.h +++ /dev/null @@ -1,233 +0,0 @@ -/* MN10300 On-board I/O port module registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PIO_REGS_H -#define _ASM_PIO_REGS_H - -#include -#include - -#ifdef __KERNEL__ - -/* I/O port 0 */ -#define P0MD __SYSREG(0xdb000000, u16) /* mode reg */ -#define P0MD_0 0x0003 /* mask */ -#define P0MD_0_IN 0x0000 /* input mode */ -#define P0MD_0_OUT 0x0001 /* output mode */ -#define P0MD_0_TM0IO 0x0002 /* timer 0 I/O mode */ -#define P0MD_0_EYECLK 0x0003 /* test signal output (clock) */ -#define P0MD_1 0x000c -#define P0MD_1_IN 0x0000 -#define P0MD_1_OUT 0x0004 -#define P0MD_1_TM1IO 0x0008 /* timer 1 I/O mode */ -#define P0MD_1_EYED 0x000c /* test signal output (data) */ -#define P0MD_2 0x0030 -#define P0MD_2_IN 0x0000 -#define P0MD_2_OUT 0x0010 -#define P0MD_2_TM2IO 0x0020 /* timer 2 I/O mode */ -#define P0MD_3 0x00c0 -#define P0MD_3_IN 0x0000 -#define P0MD_3_OUT 0x0040 -#define P0MD_3_TM3IO 0x0080 /* timer 3 I/O mode */ -#define P0MD_4 0x0300 -#define P0MD_4_IN 0x0000 -#define P0MD_4_OUT 0x0100 -#define P0MD_4_TM4IO 0x0200 /* timer 4 I/O mode */ -#define P0MD_4_XCTS 0x0300 /* XCTS input for serial port 2 */ -#define P0MD_5 0x0c00 -#define P0MD_5_IN 0x0000 -#define P0MD_5_OUT 0x0400 -#define P0MD_5_TM5IO 0x0800 /* timer 5 I/O mode */ -#define P0MD_6 0x3000 -#define P0MD_6_IN 0x0000 -#define P0MD_6_OUT 0x1000 -#define P0MD_6_TM6IOA 0x2000 /* timer 6 I/O mode A */ -#define P0MD_7 0xc000 -#define P0MD_7_IN 0x0000 -#define P0MD_7_OUT 0x4000 -#define P0MD_7_TM6IOB 0x8000 /* timer 6 I/O mode B */ - -#define P0IN __SYSREG(0xdb000004, u8) /* in reg */ -#define P0OUT __SYSREG(0xdb000008, u8) /* out reg */ - -#define P0TMIO __SYSREG(0xdb00000c, u8) /* TM pin I/O control reg */ -#define P0TMIO_TM0_IN 0x00 -#define P0TMIO_TM0_OUT 0x01 -#define P0TMIO_TM1_IN 0x00 -#define P0TMIO_TM1_OUT 0x02 -#define P0TMIO_TM2_IN 0x00 -#define P0TMIO_TM2_OUT 0x04 -#define P0TMIO_TM3_IN 0x00 -#define P0TMIO_TM3_OUT 0x08 -#define P0TMIO_TM4_IN 0x00 -#define P0TMIO_TM4_OUT 0x10 -#define P0TMIO_TM5_IN 0x00 -#define P0TMIO_TM5_OUT 0x20 -#define P0TMIO_TM6A_IN 0x00 -#define P0TMIO_TM6A_OUT 0x40 -#define P0TMIO_TM6B_IN 0x00 -#define P0TMIO_TM6B_OUT 0x80 - -/* I/O port 1 */ -#define P1MD __SYSREG(0xdb000100, u16) /* mode reg */ -#define P1MD_0 0x0003 /* mask */ -#define P1MD_0_IN 0x0000 /* input mode */ -#define P1MD_0_OUT 0x0001 /* output mode */ -#define P1MD_0_TM7IO 0x0002 /* timer 7 I/O mode */ -#define P1MD_0_ADTRG 0x0003 /* A/D converter trigger mode */ -#define P1MD_1 0x000c -#define P1MD_1_IN 0x0000 -#define P1MD_1_OUT 0x0004 -#define P1MD_1_TM8IO 0x0008 /* timer 8 I/O mode */ -#define P1MD_1_XDMR0 0x000c /* DMA request input 0 mode */ -#define P1MD_2 0x0030 -#define P1MD_2_IN 0x0000 -#define P1MD_2_OUT 0x0010 -#define P1MD_2_TM9IO 0x0020 /* timer 9 I/O mode */ -#define P1MD_2_XDMR1 0x0030 /* DMA request input 1 mode */ -#define P1MD_3 0x00c0 -#define P1MD_3_IN 0x0000 -#define P1MD_3_OUT 0x0040 -#define P1MD_3_TM10IO 0x0080 /* timer 10 I/O mode */ -#define P1MD_3_FRQS0 0x00c0 /* CPU clock multiplier setting input 0 mode */ -#define P1MD_4 0x0300 -#define P1MD_4_IN 0x0000 -#define P1MD_4_OUT 0x0100 -#define P1MD_4_TM11IO 0x0200 /* timer 11 I/O mode */ -#define P1MD_4_FRQS1 0x0300 /* CPU clock multiplier setting input 1 mode */ - -#define P1IN __SYSREG(0xdb000104, u8) /* in reg */ -#define P1OUT __SYSREG(0xdb000108, u8) /* out reg */ -#define P1TMIO __SYSREG(0xdb00010c, u8) /* TM pin I/O control reg */ -#define P1TMIO_TM11_IN 0x00 -#define P1TMIO_TM11_OUT 0x01 -#define P1TMIO_TM10_IN 0x00 -#define P1TMIO_TM10_OUT 0x02 -#define P1TMIO_TM9_IN 0x00 -#define P1TMIO_TM9_OUT 0x04 -#define P1TMIO_TM8_IN 0x00 -#define P1TMIO_TM8_OUT 0x08 -#define P1TMIO_TM7_IN 0x00 -#define P1TMIO_TM7_OUT 0x10 - -/* I/O port 2 */ -#define P2MD __SYSREG(0xdb000200, u16) /* mode reg */ -#define P2MD_0 0x0003 /* mask */ -#define P2MD_0_IN 0x0000 /* input mode */ -#define P2MD_0_OUT 0x0001 /* output mode */ -#define P2MD_0_BOOTBW 0x0003 /* boot bus width selector mode */ -#define P2MD_1 0x000c -#define P2MD_1_IN 0x0000 -#define P2MD_1_OUT 0x0004 -#define P2MD_1_BOOTSEL 0x000c /* boot device selector mode */ -#define P2MD_2 0x0030 -#define P2MD_2_IN 0x0000 -#define P2MD_2_OUT 0x0010 -#define P2MD_3 0x00c0 -#define P2MD_3_IN 0x0000 -#define P2MD_3_OUT 0x0040 -#define P2MD_3_CKIO 0x00c0 /* mode */ -#define P2MD_4 0x0300 -#define P2MD_4_IN 0x0000 -#define P2MD_4_OUT 0x0100 -#define P2MD_4_CMOD 0x0300 /* mode */ - -#define P2IN __SYSREG(0xdb000204, u8) /* in reg */ -#define P2OUT __SYSREG(0xdb000208, u8) /* out reg */ -#define P2TMIO __SYSREG(0xdb00020c, u8) /* TM pin I/O control reg */ - -/* I/O port 3 */ -#define P3MD __SYSREG(0xdb000300, u16) /* mode reg */ -#define P3MD_0 0x0003 /* mask */ -#define P3MD_0_IN 0x0000 /* input mode */ -#define P3MD_0_OUT 0x0001 /* output mode */ -#define P3MD_0_AFRXD 0x0002 /* AFR interface mode */ -#define P3MD_1 0x000c -#define P3MD_1_IN 0x0000 -#define P3MD_1_OUT 0x0004 -#define P3MD_1_AFTXD 0x0008 /* AFR interface mode */ -#define P3MD_2 0x0030 -#define P3MD_2_IN 0x0000 -#define P3MD_2_OUT 0x0010 -#define P3MD_2_AFSCLK 0x0020 /* AFR interface mode */ -#define P3MD_3 0x00c0 -#define P3MD_3_IN 0x0000 -#define P3MD_3_OUT 0x0040 -#define P3MD_3_AFFS 0x0080 /* AFR interface mode */ -#define P3MD_4 0x0300 -#define P3MD_4_IN 0x0000 -#define P3MD_4_OUT 0x0100 -#define P3MD_4_AFEHC 0x0200 /* AFR interface mode */ - -#define P3IN __SYSREG(0xdb000304, u8) /* in reg */ -#define P3OUT __SYSREG(0xdb000308, u8) /* out reg */ - -/* I/O port 4 */ -#define P4MD __SYSREG(0xdb000400, u16) /* mode reg */ -#define P4MD_0 0x0003 /* mask */ -#define P4MD_0_IN 0x0000 /* input mode */ -#define P4MD_0_OUT 0x0001 /* output mode */ -#define P4MD_0_SCL0 0x0002 /* I2C/serial mode */ -#define P4MD_1 0x000c -#define P4MD_1_IN 0x0000 -#define P4MD_1_OUT 0x0004 -#define P4MD_1_SDA0 0x0008 -#define P4MD_2 0x0030 -#define P4MD_2_IN 0x0000 -#define P4MD_2_OUT 0x0010 -#define P4MD_2_SCL1 0x0020 -#define P4MD_3 0x00c0 -#define P4MD_3_IN 0x0000 -#define P4MD_3_OUT 0x0040 -#define P4MD_3_SDA1 0x0080 -#define P4MD_4 0x0300 -#define P4MD_4_IN 0x0000 -#define P4MD_4_OUT 0x0100 -#define P4MD_4_SBO0 0x0200 -#define P4MD_5 0x0c00 -#define P4MD_5_IN 0x0000 -#define P4MD_5_OUT 0x0400 -#define P4MD_5_SBO1 0x0800 -#define P4MD_6 0x3000 -#define P4MD_6_IN 0x0000 -#define P4MD_6_OUT 0x1000 -#define P4MD_6_SBT0 0x2000 -#define P4MD_7 0xc000 -#define P4MD_7_IN 0x0000 -#define P4MD_7_OUT 0x4000 -#define P4MD_7_SBT1 0x8000 - -#define P4IN __SYSREG(0xdb000404, u8) /* in reg */ -#define P4OUT __SYSREG(0xdb000408, u8) /* out reg */ - -/* I/O port 5 */ -#define P5MD __SYSREG(0xdb000500, u16) /* mode reg */ -#define P5MD_0 0x0003 /* mask */ -#define P5MD_0_IN 0x0000 /* input mode */ -#define P5MD_0_OUT 0x0001 /* output mode */ -#define P5MD_0_IRTXD 0x0002 /* IrDA mode */ -#define P5MD_0_SOUT 0x0004 /* serial mode */ -#define P5MD_1 0x000c -#define P5MD_1_IN 0x0000 -#define P5MD_1_OUT 0x0004 -#define P5MD_1_IRRXDS 0x0008 /* IrDA mode */ -#define P5MD_1_SIN 0x000c /* serial mode */ -#define P5MD_2 0x0030 -#define P5MD_2_IN 0x0000 -#define P5MD_2_OUT 0x0010 -#define P5MD_2_IRRXDF 0x0020 /* IrDA mode */ - -#define P5IN __SYSREG(0xdb000504, u8) /* in reg */ -#define P5OUT __SYSREG(0xdb000508, u8) /* out reg */ - - -#endif /* __KERNEL__ */ - -#endif /* _ASM_PIO_REGS_H */ diff --git a/include/asm-mn10300/poll.h b/include/asm-mn10300/poll.h deleted file mode 100644 index c98509d..0000000 --- a/include/asm-mn10300/poll.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/posix_types.h b/include/asm-mn10300/posix_types.h deleted file mode 100644 index 077567c..0000000 --- a/include/asm-mn10300/posix_types.h +++ /dev/null @@ -1,132 +0,0 @@ -/* MN10300 POSIX types - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_POSIX_TYPES_H -#define _ASM_POSIX_TYPES_H - -/* - * This file is generally used by user-level software, so you need to - * be a little careful about namespace pollution etc. Also, we cannot - * assume GCC is being used. - */ - -typedef unsigned long __kernel_ino_t; -typedef unsigned short __kernel_mode_t; -typedef unsigned short __kernel_nlink_t; -typedef long __kernel_off_t; -typedef int __kernel_pid_t; -typedef unsigned short __kernel_ipc_pid_t; -typedef unsigned short __kernel_uid_t; -typedef unsigned short __kernel_gid_t; -typedef unsigned long __kernel_size_t; -typedef long __kernel_ssize_t; -typedef int __kernel_ptrdiff_t; -typedef long __kernel_time_t; -typedef long __kernel_suseconds_t; -typedef long __kernel_clock_t; -typedef int __kernel_timer_t; -typedef int __kernel_clockid_t; -typedef int __kernel_daddr_t; -typedef char * __kernel_caddr_t; -typedef unsigned short __kernel_uid16_t; -typedef unsigned short __kernel_gid16_t; -typedef unsigned int __kernel_uid32_t; -typedef unsigned int __kernel_gid32_t; - -typedef unsigned short __kernel_old_uid_t; -typedef unsigned short __kernel_old_gid_t; -typedef unsigned short __kernel_old_dev_t; - -#ifdef __GNUC__ -typedef long long __kernel_loff_t; -#endif - -typedef struct { -#if defined(__KERNEL__) || defined(__USE_ALL) - int val[2]; -#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ - int __val[2]; -#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ -} __kernel_fsid_t; - -#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) - -#undef __FD_SET -static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); -} - -#undef __FD_CLR -static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); -} - - -#undef __FD_ISSET -static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; -} - -/* - * This will unroll the loop for the normal constant case (8 ints, - * for a 256-bit fd_set) - */ -#undef __FD_ZERO -static inline void __FD_ZERO(__kernel_fd_set *__p) -{ - unsigned long *__tmp = __p->fds_bits; - int __i; - - if (__builtin_constant_p(__FDSET_LONGS)) { - switch (__FDSET_LONGS) { - case 16: - __tmp[ 0] = 0; __tmp[ 1] = 0; - __tmp[ 2] = 0; __tmp[ 3] = 0; - __tmp[ 4] = 0; __tmp[ 5] = 0; - __tmp[ 6] = 0; __tmp[ 7] = 0; - __tmp[ 8] = 0; __tmp[ 9] = 0; - __tmp[10] = 0; __tmp[11] = 0; - __tmp[12] = 0; __tmp[13] = 0; - __tmp[14] = 0; __tmp[15] = 0; - return; - - case 8: - __tmp[ 0] = 0; __tmp[ 1] = 0; - __tmp[ 2] = 0; __tmp[ 3] = 0; - __tmp[ 4] = 0; __tmp[ 5] = 0; - __tmp[ 6] = 0; __tmp[ 7] = 0; - return; - - case 4: - __tmp[ 0] = 0; __tmp[ 1] = 0; - __tmp[ 2] = 0; __tmp[ 3] = 0; - return; - } - } - __i = __FDSET_LONGS; - while (__i) { - __i--; - *__tmp = 0; - __tmp++; - } -} - -#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ - -#endif /* _ASM_POSIX_TYPES_H */ diff --git a/include/asm-mn10300/proc-mn103e010/cache.h b/include/asm-mn10300/proc-mn103e010/cache.h deleted file mode 100644 index bdc1f9a..0000000 --- a/include/asm-mn10300/proc-mn103e010/cache.h +++ /dev/null @@ -1,33 +0,0 @@ -/* MN103E010 Cache specification - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PROC_CACHE_H -#define _ASM_PROC_CACHE_H - -/* L1 cache */ - -#define L1_CACHE_NWAYS 4 /* number of ways in caches */ -#define L1_CACHE_NENTRIES 256 /* number of entries in each way */ -#define L1_CACHE_BYTES 16 /* bytes per entry */ -#define L1_CACHE_SHIFT 4 /* shift for bytes per entry */ -#define L1_CACHE_WAYDISP 0x1000 /* displacement of one way from the next */ - -#define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ -#define L1_CACHE_TAG_DIRTY 0x00000008 /* data cache tag dirty bit */ -#define L1_CACHE_TAG_ENTRY 0x00000ff0 /* cache tag entry address mask */ -#define L1_CACHE_TAG_ADDRESS 0xfffff000 /* cache tag line address mask */ - -/* - * specification of the interval between interrupt checking intervals whilst - * managing the cache with the interrupts disabled - */ -#define MN10300_DCACHE_INV_RANGE_INTR_LOG2_INTERVAL 4 - -#endif /* _ASM_PROC_CACHE_H */ diff --git a/include/asm-mn10300/proc-mn103e010/clock.h b/include/asm-mn10300/proc-mn103e010/clock.h deleted file mode 100644 index caf9983..0000000 --- a/include/asm-mn10300/proc-mn103e010/clock.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MN103E010-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PROC_CLOCK_H -#define _ASM_PROC_CLOCK_H - -#include - -#define MN10300_WDCLK MN10300_IOCLK - -#endif /* _ASM_PROC_CLOCK_H */ diff --git a/include/asm-mn10300/proc-mn103e010/irq.h b/include/asm-mn10300/proc-mn103e010/irq.h deleted file mode 100644 index aa6ee8f..0000000 --- a/include/asm-mn10300/proc-mn103e010/irq.h +++ /dev/null @@ -1,34 +0,0 @@ -/* MN103E010 On-board interrupt controller numbers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_PROC_IRQ_H -#define _ASM_PROC_IRQ_H - -#ifdef __KERNEL__ - -#define GxICR_NUM_IRQS 42 - -#define GxICR_NUM_XIRQS 8 - -#define XIRQ0 34 -#define XIRQ1 35 -#define XIRQ2 36 -#define XIRQ3 37 -#define XIRQ4 38 -#define XIRQ5 39 -#define XIRQ6 40 -#define XIRQ7 41 - -#define XIRQ2IRQ(num) (XIRQ0 + num) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_PROC_IRQ_H */ diff --git a/include/asm-mn10300/proc-mn103e010/proc.h b/include/asm-mn10300/proc-mn103e010/proc.h deleted file mode 100644 index 22a2b93..0000000 --- a/include/asm-mn10300/proc-mn103e010/proc.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MN103E010 Processor description - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_PROC_PROC_H -#define _ASM_PROC_PROC_H - -#define PROCESSOR_VENDOR_NAME "Matsushita" -#define PROCESSOR_MODEL_NAME "mn103e010" - -#endif /* _ASM_PROC_PROC_H */ diff --git a/include/asm-mn10300/processor.h b/include/asm-mn10300/processor.h deleted file mode 100644 index 7323927..0000000 --- a/include/asm-mn10300/processor.h +++ /dev/null @@ -1,186 +0,0 @@ -/* MN10300 Processor specifics - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_PROCESSOR_H -#define _ASM_PROCESSOR_H - -#include -#include -#include -#include - -/* Forward declaration, a strange C thing */ -struct task_struct; -struct mm_struct; - -/* - * Default implementation of macro that returns current - * instruction pointer ("program counter"). - */ -#define current_text_addr() \ -({ \ - void *__pc; \ - asm("mov pc,%0" : "=a"(__pc)); \ - __pc; \ -}) - -extern void show_registers(struct pt_regs *regs); - -/* - * CPU type and hardware bug flags. Kept separately for each CPU. - * Members of this structure are referenced in head.S, so think twice - * before touching them. [mj] - */ - -struct mn10300_cpuinfo { - int type; - unsigned long loops_per_sec; - char hard_math; - unsigned long *pgd_quick; - unsigned long *pte_quick; - unsigned long pgtable_cache_sz; -}; - -extern struct mn10300_cpuinfo boot_cpu_data; - -#define cpu_data &boot_cpu_data -#define current_cpu_data boot_cpu_data - -extern void identify_cpu(struct mn10300_cpuinfo *); -extern void print_cpu_info(struct mn10300_cpuinfo *); -extern void dodgy_tsc(void); -#define cpu_relax() barrier() - -/* - * User space process size: 1.75GB (default). - */ -#define TASK_SIZE 0x70000000 - -/* - * Where to put the userspace stack by default - */ -#define STACK_TOP 0x70000000 -#define STACK_TOP_MAX STACK_TOP - -/* This decides where the kernel will search for a free chunk of vm - * space during mmap's. - */ -#define TASK_UNMAPPED_BASE 0x30000000 - -typedef struct { - unsigned long seg; -} mm_segment_t; - -struct fpu_state_struct { - unsigned long fs[32]; /* fpu registers */ - unsigned long fpcr; /* fpu control register */ -}; - -struct thread_struct { - struct pt_regs *uregs; /* userspace register frame */ - unsigned long pc; /* kernel PC */ - unsigned long sp; /* kernel SP */ - unsigned long a3; /* kernel FP */ - unsigned long wchan; - unsigned long usp; - struct pt_regs *__frame; - unsigned long fpu_flags; -#define THREAD_USING_FPU 0x00000001 /* T if this task is using the FPU */ - struct fpu_state_struct fpu_state; -}; - -#define INIT_THREAD \ -{ \ - .uregs = init_uregs, \ - .pc = 0, \ - .sp = 0, \ - .a3 = 0, \ - .wchan = 0, \ - .__frame = NULL, \ -} - -#define INIT_MMAP \ -{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, \ - NULL, NULL } - -/* - * do necessary setup to start up a newly executed thread - * - need to discard the frame stacked by the kernel thread invoking the execve - * syscall (see RESTORE_ALL macro) - */ -#define start_thread(regs, new_pc, new_sp) do { \ - set_fs(USER_DS); \ - __frame = current->thread.uregs; \ - __frame->epsw = EPSW_nSL | EPSW_IE | EPSW_IM; \ - __frame->pc = new_pc; \ - __frame->sp = new_sp; \ -} while (0) - -/* Free all resources held by a thread. */ -extern void release_thread(struct task_struct *); - -/* Prepare to copy thread state - unlazy all lazy status */ -extern void prepare_to_copy(struct task_struct *tsk); - -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); - -/* - * Return saved PC of a blocked thread. - */ -extern unsigned long thread_saved_pc(struct task_struct *tsk); - -unsigned long get_wchan(struct task_struct *p); - -#define task_pt_regs(task) \ -({ \ - struct pt_regs *__regs__; \ - __regs__ = (struct pt_regs *) (KSTK_TOP(task_stack_page(task)) - 8); \ - __regs__ - 1; \ -}) - -#define KSTK_EIP(task) (task_pt_regs(task)->pc) -#define KSTK_ESP(task) (task_pt_regs(task)->sp) - -#define KSTK_TOP(info) \ -({ \ - (unsigned long)(info) + THREAD_SIZE; \ -}) - -#define ARCH_HAS_PREFETCH -#define ARCH_HAS_PREFETCHW - -static inline void prefetch(const void *x) -{ -#ifndef CONFIG_MN10300_CACHE_DISABLED -#ifdef CONFIG_MN10300_PROC_MN103E010 - asm volatile ("nop; nop; dcpf (%0)" : : "r"(x)); -#else - asm volatile ("dcpf (%0)" : : "r"(x)); -#endif -#endif -} - -static inline void prefetchw(const void *x) -{ -#ifndef CONFIG_MN10300_CACHE_DISABLED -#ifdef CONFIG_MN10300_PROC_MN103E010 - asm volatile ("nop; nop; dcpf (%0)" : : "r"(x)); -#else - asm volatile ("dcpf (%0)" : : "r"(x)); -#endif -#endif -} - -#endif /* _ASM_PROCESSOR_H */ diff --git a/include/asm-mn10300/ptrace.h b/include/asm-mn10300/ptrace.h deleted file mode 100644 index 7b06cc6..0000000 --- a/include/asm-mn10300/ptrace.h +++ /dev/null @@ -1,103 +0,0 @@ -/* MN10300 Exception frame layout and ptrace constants - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PTRACE_H -#define _ASM_PTRACE_H - -#define PT_A3 0 -#define PT_A2 1 -#define PT_D3 2 -#define PT_D2 3 -#define PT_MCVF 4 -#define PT_MCRL 5 -#define PT_MCRH 6 -#define PT_MDRQ 7 -#define PT_E1 8 -#define PT_E0 9 -#define PT_E7 10 -#define PT_E6 11 -#define PT_E5 12 -#define PT_E4 13 -#define PT_E3 14 -#define PT_E2 15 -#define PT_SP 16 -#define PT_LAR 17 -#define PT_LIR 18 -#define PT_MDR 19 -#define PT_A1 20 -#define PT_A0 21 -#define PT_D1 22 -#define PT_D0 23 -#define PT_ORIG_D0 24 -#define PT_EPSW 25 -#define PT_PC 26 -#define NR_PTREGS 27 - -#ifndef __ASSEMBLY__ -/* - * This defines the way registers are stored in the event of an exception - * - the strange order is due to the MOVM instruction - */ -struct pt_regs { - unsigned long a3; /* syscall arg 3 */ - unsigned long a2; /* syscall arg 4 */ - unsigned long d3; /* syscall arg 5 */ - unsigned long d2; /* syscall arg 6 */ - unsigned long mcvf; - unsigned long mcrl; - unsigned long mcrh; - unsigned long mdrq; - unsigned long e1; - unsigned long e0; - unsigned long e7; - unsigned long e6; - unsigned long e5; - unsigned long e4; - unsigned long e3; - unsigned long e2; - unsigned long sp; - unsigned long lar; - unsigned long lir; - unsigned long mdr; - unsigned long a1; - unsigned long a0; /* syscall arg 1 */ - unsigned long d1; /* syscall arg 2 */ - unsigned long d0; /* syscall ret */ - struct pt_regs *next; /* next frame pointer */ - unsigned long orig_d0; /* syscall number */ - unsigned long epsw; - unsigned long pc; -}; -#endif - -extern struct pt_regs *__frame; /* current frame pointer */ - -/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ -#define PTRACE_GETREGS 12 -#define PTRACE_SETREGS 13 -#define PTRACE_GETFPREGS 14 -#define PTRACE_SETFPREGS 15 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 - -#if defined(__KERNEL__) - -#if !defined(__ASSEMBLY__) -#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) -#define instruction_pointer(regs) ((regs)->pc) -extern void show_regs(struct pt_regs *); -#endif /* !__ASSEMBLY */ - -#define profile_pc(regs) ((regs)->pc) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_PTRACE_H */ diff --git a/include/asm-mn10300/reset-regs.h b/include/asm-mn10300/reset-regs.h deleted file mode 100644 index 174523d..0000000 --- a/include/asm-mn10300/reset-regs.h +++ /dev/null @@ -1,64 +0,0 @@ -/* MN10300 Reset controller and watchdog timer definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_RESET_REGS_H -#define _ASM_RESET_REGS_H - -#include -#include - -#ifdef __KERNEL__ - -#ifdef CONFIG_MN10300_WD_TIMER -#define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ -#endif - -/* - * watchdog timer registers - */ -#define WDBC __SYSREGC(0xc0001000, u8) /* watchdog binary counter reg */ - -#define WDCTR __SYSREG(0xc0001002, u8) /* watchdog timer control reg */ -#define WDCTR_WDCK 0x07 /* clock source selection */ -#define WDCTR_WDCK_256th 0x00 /* - OSCI/256 */ -#define WDCTR_WDCK_1024th 0x01 /* - OSCI/1024 */ -#define WDCTR_WDCK_2048th 0x02 /* - OSCI/2048 */ -#define WDCTR_WDCK_16384th 0x03 /* - OSCI/16384 */ -#define WDCTR_WDCK_65536th 0x04 /* - OSCI/65536 */ -#define WDCTR_WDRST 0x40 /* binary counter reset */ -#define WDCTR_WDCNE 0x80 /* watchdog timer enable */ - -#define RSTCTR __SYSREG(0xc0001004, u8) /* reset control reg */ -#define RSTCTR_CHIPRST 0x01 /* chip reset */ -#define RSTCTR_DBFRST 0x02 /* double fault reset flag */ -#define RSTCTR_WDTRST 0x04 /* watchdog timer reset flag */ -#define RSTCTR_WDREN 0x08 /* watchdog timer reset enable */ - -#ifndef __ASSEMBLY__ - -static inline void mn10300_proc_hard_reset(void) -{ - RSTCTR &= ~RSTCTR_CHIPRST; - RSTCTR |= RSTCTR_CHIPRST; -} - -extern unsigned int watchdog_alert_counter; - -extern void watchdog_go(void); -extern asmlinkage void watchdog_handler(void); -extern asmlinkage -void watchdog_interrupt(struct pt_regs *, enum exception_code); - -#endif - -#endif /* __KERNEL__ */ - -#endif /* _ASM_RESET_REGS_H */ diff --git a/include/asm-mn10300/resource.h b/include/asm-mn10300/resource.h deleted file mode 100644 index 04bc4db..0000000 --- a/include/asm-mn10300/resource.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/rtc-regs.h b/include/asm-mn10300/rtc-regs.h deleted file mode 100644 index c42deef..0000000 --- a/include/asm-mn10300/rtc-regs.h +++ /dev/null @@ -1,86 +0,0 @@ -/* MN10300 on-chip Real-Time Clock registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_RTC_REGS_H -#define _ASM_RTC_REGS_H - -#include - -#ifdef __KERNEL__ - -#define RTSCR __SYSREG(0xd8600000, u8) /* RTC seconds count reg */ -#define RTSAR __SYSREG(0xd8600001, u8) /* RTC seconds alarm reg */ -#define RTMCR __SYSREG(0xd8600002, u8) /* RTC minutes count reg */ -#define RTMAR __SYSREG(0xd8600003, u8) /* RTC minutes alarm reg */ -#define RTHCR __SYSREG(0xd8600004, u8) /* RTC hours count reg */ -#define RTHAR __SYSREG(0xd8600005, u8) /* RTC hours alarm reg */ -#define RTDWCR __SYSREG(0xd8600006, u8) /* RTC day of the week count reg */ -#define RTDMCR __SYSREG(0xd8600007, u8) /* RTC days count reg */ -#define RTMTCR __SYSREG(0xd8600008, u8) /* RTC months count reg */ -#define RTYCR __SYSREG(0xd8600009, u8) /* RTC years count reg */ - -#define RTCRA __SYSREG(0xd860000a, u8)/* RTC control reg A */ -#define RTCRA_RS 0x0f /* periodic timer interrupt cycle setting */ -#define RTCRA_RS_NONE 0x00 /* - off */ -#define RTCRA_RS_3_90625ms 0x01 /* - 3.90625ms (1/256s) */ -#define RTCRA_RS_7_8125ms 0x02 /* - 7.8125ms (1/128s) */ -#define RTCRA_RS_122_070us 0x03 /* - 122.070us (1/8192s) */ -#define RTCRA_RS_244_141us 0x04 /* - 244.141us (1/4096s) */ -#define RTCRA_RS_488_281us 0x05 /* - 488.281us (1/2048s) */ -#define RTCRA_RS_976_5625us 0x06 /* - 976.5625us (1/1024s) */ -#define RTCRA_RS_1_953125ms 0x07 /* - 1.953125ms (1/512s) */ -#define RTCRA_RS_3_90624ms 0x08 /* - 3.90624ms (1/256s) */ -#define RTCRA_RS_7_8125ms_b 0x09 /* - 7.8125ms (1/128s) */ -#define RTCRA_RS_15_625ms 0x0a /* - 15.625ms (1/64s) */ -#define RTCRA_RS_31_25ms 0x0b /* - 31.25ms (1/32s) */ -#define RTCRA_RS_62_5ms 0x0c /* - 62.5ms (1/16s) */ -#define RTCRA_RS_125ms 0x0d /* - 125ms (1/8s) */ -#define RTCRA_RS_250ms 0x0e /* - 250ms (1/4s) */ -#define RTCRA_RS_500ms 0x0f /* - 500ms (1/2s) */ -#define RTCRA_DVR 0x40 /* divider reset */ -#define RTCRA_UIP 0x80 /* clock update flag */ - -#define RTCRB __SYSREG(0xd860000b, u8) /* RTC control reg B */ -#define RTCRB_DSE 0x01 /* daylight savings time enable */ -#define RTCRB_TM 0x02 /* time format */ -#define RTCRB_TM_12HR 0x00 /* - 12 hour format */ -#define RTCRB_TM_24HR 0x02 /* - 24 hour format */ -#define RTCRB_DM 0x04 /* numeric value format */ -#define RTCRB_DM_BCD 0x00 /* - BCD */ -#define RTCRB_DM_BINARY 0x04 /* - binary */ -#define RTCRB_UIE 0x10 /* update interrupt disable */ -#define RTCRB_AIE 0x20 /* alarm interrupt disable */ -#define RTCRB_PIE 0x40 /* periodic interrupt disable */ -#define RTCRB_SET 0x80 /* clock update enable */ - -#define RTSRC __SYSREG(0xd860000c, u8) /* RTC status reg C */ -#define RTSRC_UF 0x10 /* update end interrupt flag */ -#define RTSRC_AF 0x20 /* alarm interrupt flag */ -#define RTSRC_PF 0x40 /* periodic interrupt flag */ -#define RTSRC_IRQF 0x80 /* interrupt flag */ - -#define RTIRQ 32 -#define RTICR GxICR(RTIRQ) - -/* - * MC146818 RTC compatibility defs for the MN10300 on-chip RTC - */ -#define RTC_PORT(x) 0xd8600000 -#define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ - -#define CMOS_READ(addr) __SYSREG(0xd8600000 + (addr), u8) -#define CMOS_WRITE(val, addr) \ - do { __SYSREG(0xd8600000 + (addr), u8) = val; } while (0) - -#define RTC_IRQ RTIRQ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_RTC_REGS_H */ diff --git a/include/asm-mn10300/rtc.h b/include/asm-mn10300/rtc.h deleted file mode 100644 index c295194..0000000 --- a/include/asm-mn10300/rtc.h +++ /dev/null @@ -1,41 +0,0 @@ -/* MN10300 Real time clock definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_RTC_H -#define _ASM_RTC_H - -#ifdef CONFIG_MN10300_RTC - -#include - -extern void check_rtc_time(void); -extern void __init calibrate_clock(void); -extern unsigned long __init get_initial_rtc_time(void); - -#else /* !CONFIG_MN10300_RTC */ - -static inline void check_rtc_time(void) -{ -} - -static inline void calibrate_clock(void) -{ -} - -static inline unsigned long get_initial_rtc_time(void) -{ - return 0; -} - -#endif /* !CONFIG_MN10300_RTC */ - -#include - -#endif /* _ASM_RTC_H */ diff --git a/include/asm-mn10300/scatterlist.h b/include/asm-mn10300/scatterlist.h deleted file mode 100644 index 6753590..0000000 --- a/include/asm-mn10300/scatterlist.h +++ /dev/null @@ -1,55 +0,0 @@ -/* MN10300 Scatterlist definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SCATTERLIST_H -#define _ASM_SCATTERLIST_H - -#include - -/* - * Drivers must set either ->address or (preferred) page and ->offset - * to indicate where data must be transferred to/from. - * - * Using page is recommended since it handles highmem data as well as - * low mem. ->address is restricted to data which has a virtual mapping, and - * it will go away in the future. Updating to page can be automated very - * easily -- something like - * - * sg->address = some_ptr; - * - * can be rewritten as - * - * sg_set_page(virt_to_page(some_ptr)); - * sg->offset = (unsigned long) some_ptr & ~PAGE_MASK; - * - * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens - */ -struct scatterlist { -#ifdef CONFIG_DEBUG_SG - unsigned long sg_magic; -#endif - unsigned long page_link; - unsigned int offset; /* for highmem, page offset */ - dma_addr_t dma_address; - unsigned int length; -}; - -#define ISA_DMA_THRESHOLD (0x00ffffff) - -/* - * These macros should be used after a pci_map_sg call has been done - * to get bus addresses of each of the SG entries and their lengths. - * You should only work with the number of sg entries pci_map_sg - * returns. - */ -#define sg_dma_address(sg) ((sg)->dma_address) -#define sg_dma_len(sg) ((sg)->length) - -#endif /* _ASM_SCATTERLIST_H */ diff --git a/include/asm-mn10300/sections.h b/include/asm-mn10300/sections.h deleted file mode 100644 index 2b8c516..0000000 --- a/include/asm-mn10300/sections.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/sembuf.h b/include/asm-mn10300/sembuf.h deleted file mode 100644 index 301f3f9..0000000 --- a/include/asm-mn10300/sembuf.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _ASM_SEMBUF_H -#define _ASM_SEMBUF_H - -/* - * The semid64_ds structure for MN10300 architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct semid64_ds { - struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ - __kernel_time_t sem_otime; /* last semop time */ - unsigned long __unused1; - __kernel_time_t sem_ctime; /* last change time */ - unsigned long __unused2; - unsigned long sem_nsems; /* no. of semaphores in array */ - unsigned long __unused3; - unsigned long __unused4; -}; - -#endif /* _ASM_SEMBUF_H */ diff --git a/include/asm-mn10300/serial-regs.h b/include/asm-mn10300/serial-regs.h deleted file mode 100644 index 6498469..0000000 --- a/include/asm-mn10300/serial-regs.h +++ /dev/null @@ -1,160 +0,0 @@ -/* MN10300 on-board serial port module registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_SERIAL_REGS_H -#define _ASM_SERIAL_REGS_H - -#include -#include - -#ifdef __KERNEL__ - -/* serial port 0 */ -#define SC0CTR __SYSREG(0xd4002000, u16) /* control reg */ -#define SC01CTR_CK 0x0007 /* clock source select */ -#define SC0CTR_CK_TM8UFLOW_8 0x0000 /* - 1/8 timer 8 underflow (serial port 0 only) */ -#define SC1CTR_CK_TM9UFLOW_8 0x0000 /* - 1/8 timer 9 underflow (serial port 1 only) */ -#define SC01CTR_CK_IOCLK_8 0x0001 /* - 1/8 IOCLK */ -#define SC01CTR_CK_IOCLK_32 0x0002 /* - 1/32 IOCLK */ -#define SC0CTR_CK_TM2UFLOW_2 0x0003 /* - 1/2 timer 2 underflow (serial port 0 only) */ -#define SC1CTR_CK_TM3UFLOW_2 0x0003 /* - 1/2 timer 3 underflow (serial port 1 only) */ -#define SC0CTR_CK_TM0UFLOW_8 0x0004 /* - 1/8 timer 1 underflow (serial port 0 only) */ -#define SC1CTR_CK_TM1UFLOW_8 0x0004 /* - 1/8 timer 2 underflow (serial port 1 only) */ -#define SC0CTR_CK_TM2UFLOW_8 0x0005 /* - 1/8 timer 2 underflow (serial port 0 only) */ -#define SC1CTR_CK_TM3UFLOW_8 0x0005 /* - 1/8 timer 3 underflow (serial port 1 only) */ -#define SC01CTR_CK_EXTERN_8 0x0006 /* - 1/8 external closk */ -#define SC01CTR_CK_EXTERN 0x0007 /* - external closk */ -#define SC01CTR_STB 0x0008 /* stop bit select */ -#define SC01CTR_STB_1BIT 0x0000 /* - 1 stop bit */ -#define SC01CTR_STB_2BIT 0x0008 /* - 2 stop bits */ -#define SC01CTR_PB 0x0070 /* parity bit select */ -#define SC01CTR_PB_NONE 0x0000 /* - no parity */ -#define SC01CTR_PB_FIXED0 0x0040 /* - fixed at 0 */ -#define SC01CTR_PB_FIXED1 0x0050 /* - fixed at 1 */ -#define SC01CTR_PB_EVEN 0x0060 /* - even parity */ -#define SC01CTR_PB_ODD 0x0070 /* - odd parity */ -#define SC01CTR_CLN 0x0080 /* character length */ -#define SC01CTR_CLN_7BIT 0x0000 /* - 7 bit chars */ -#define SC01CTR_CLN_8BIT 0x0080 /* - 8 bit chars */ -#define SC01CTR_TOE 0x0100 /* T input output enable */ -#define SC01CTR_OD 0x0200 /* bit order select */ -#define SC01CTR_OD_LSBFIRST 0x0000 /* - LSB first */ -#define SC01CTR_OD_MSBFIRST 0x0200 /* - MSB first */ -#define SC01CTR_MD 0x0c00 /* mode select */ -#define SC01CTR_MD_STST_SYNC 0x0000 /* - start-stop synchronous */ -#define SC01CTR_MD_CLOCK_SYNC1 0x0400 /* - clock synchronous 1 */ -#define SC01CTR_MD_I2C 0x0800 /* - I2C mode */ -#define SC01CTR_MD_CLOCK_SYNC2 0x0c00 /* - clock synchronous 2 */ -#define SC01CTR_IIC 0x1000 /* I2C mode select */ -#define SC01CTR_BKE 0x2000 /* break transmit enable */ -#define SC01CTR_RXE 0x4000 /* receive enable */ -#define SC01CTR_TXE 0x8000 /* transmit enable */ - -#define SC0ICR __SYSREG(0xd4002004, u8) /* interrupt control reg */ -#define SC01ICR_DMD 0x80 /* output data mode */ -#define SC01ICR_TD 0x20 /* transmit DMA trigger cause */ -#define SC01ICR_TI 0x10 /* transmit interrupt cause */ -#define SC01ICR_RES 0x04 /* receive error select */ -#define SC01ICR_RI 0x01 /* receive interrupt cause */ - -#define SC0TXB __SYSREG(0xd4002008, u8) /* transmit buffer reg */ -#define SC0RXB __SYSREG(0xd4002009, u8) /* receive buffer reg */ - -#define SC0STR __SYSREG(0xd400200c, u16) /* status reg */ -#define SC01STR_OEF 0x0001 /* overrun error found */ -#define SC01STR_PEF 0x0002 /* parity error found */ -#define SC01STR_FEF 0x0004 /* framing error found */ -#define SC01STR_RBF 0x0010 /* receive buffer status */ -#define SC01STR_TBF 0x0020 /* transmit buffer status */ -#define SC01STR_RXF 0x0040 /* receive status */ -#define SC01STR_TXF 0x0080 /* transmit status */ -#define SC01STR_STF 0x0100 /* I2C start sequence found */ -#define SC01STR_SPF 0x0200 /* I2C stop sequence found */ - -#define SC0RXIRQ 20 /* timer 0 Receive IRQ */ -#define SC0TXIRQ 21 /* timer 0 Transmit IRQ */ - -#define SC0RXICR GxICR(SC0RXIRQ) /* serial 0 receive intr ctrl reg */ -#define SC0TXICR GxICR(SC0TXIRQ) /* serial 0 transmit intr ctrl reg */ - -/* serial port 1 */ -#define SC1CTR __SYSREG(0xd4002010, u16) /* serial port 1 control */ -#define SC1ICR __SYSREG(0xd4002014, u8) /* interrupt control reg */ -#define SC1TXB __SYSREG(0xd4002018, u8) /* transmit buffer reg */ -#define SC1RXB __SYSREG(0xd4002019, u8) /* receive buffer reg */ -#define SC1STR __SYSREG(0xd400201c, u16) /* status reg */ - -#define SC1RXIRQ 22 /* timer 1 Receive IRQ */ -#define SC1TXIRQ 23 /* timer 1 Transmit IRQ */ - -#define SC1RXICR GxICR(SC1RXIRQ) /* serial 1 receive intr ctrl reg */ -#define SC1TXICR GxICR(SC1TXIRQ) /* serial 1 transmit intr ctrl reg */ - -/* serial port 2 */ -#define SC2CTR __SYSREG(0xd4002020, u16) /* control reg */ -#define SC2CTR_CK 0x0003 /* clock source select */ -#define SC2CTR_CK_TM10UFLOW 0x0000 /* - timer 10 underflow */ -#define SC2CTR_CK_TM2UFLOW 0x0001 /* - timer 2 underflow */ -#define SC2CTR_CK_EXTERN 0x0002 /* - external closk */ -#define SC2CTR_CK_TM3UFLOW 0x0003 /* - timer 3 underflow */ -#define SC2CTR_STB 0x0008 /* stop bit select */ -#define SC2CTR_STB_1BIT 0x0000 /* - 1 stop bit */ -#define SC2CTR_STB_2BIT 0x0008 /* - 2 stop bits */ -#define SC2CTR_PB 0x0070 /* parity bit select */ -#define SC2CTR_PB_NONE 0x0000 /* - no parity */ -#define SC2CTR_PB_FIXED0 0x0040 /* - fixed at 0 */ -#define SC2CTR_PB_FIXED1 0x0050 /* - fixed at 1 */ -#define SC2CTR_PB_EVEN 0x0060 /* - even parity */ -#define SC2CTR_PB_ODD 0x0070 /* - odd parity */ -#define SC2CTR_CLN 0x0080 /* character length */ -#define SC2CTR_CLN_7BIT 0x0000 /* - 7 bit chars */ -#define SC2CTR_CLN_8BIT 0x0080 /* - 8 bit chars */ -#define SC2CTR_TWE 0x0100 /* transmit wait enable (enable XCTS control) */ -#define SC2CTR_OD 0x0200 /* bit order select */ -#define SC2CTR_OD_LSBFIRST 0x0000 /* - LSB first */ -#define SC2CTR_OD_MSBFIRST 0x0200 /* - MSB first */ -#define SC2CTR_TWS 0x1000 /* transmit wait select */ -#define SC2CTR_TWS_XCTS_HIGH 0x0000 /* - interrupt TX when XCTS high */ -#define SC2CTR_TWS_XCTS_LOW 0x1000 /* - interrupt TX when XCTS low */ -#define SC2CTR_BKE 0x2000 /* break transmit enable */ -#define SC2CTR_RXE 0x4000 /* receive enable */ -#define SC2CTR_TXE 0x8000 /* transmit enable */ - -#define SC2ICR __SYSREG(0xd4002024, u8) /* interrupt control reg */ -#define SC2ICR_TD 0x20 /* transmit DMA trigger cause */ -#define SC2ICR_TI 0x10 /* transmit interrupt cause */ -#define SC2ICR_RES 0x04 /* receive error select */ -#define SC2ICR_RI 0x01 /* receive interrupt cause */ - -#define SC2TXB __SYSREG(0xd4002018, u8) /* transmit buffer reg */ -#define SC2RXB __SYSREG(0xd4002019, u8) /* receive buffer reg */ -#define SC2STR __SYSREG(0xd400201c, u8) /* status reg */ -#define SC2STR_OEF 0x0001 /* overrun error found */ -#define SC2STR_PEF 0x0002 /* parity error found */ -#define SC2STR_FEF 0x0004 /* framing error found */ -#define SC2STR_CTS 0x0008 /* XCTS input pin status (0 means high) */ -#define SC2STR_RBF 0x0010 /* receive buffer status */ -#define SC2STR_TBF 0x0020 /* transmit buffer status */ -#define SC2STR_RXF 0x0040 /* receive status */ -#define SC2STR_TXF 0x0080 /* transmit status */ - -#define SC2TIM __SYSREG(0xd400202d, u8) /* status reg */ - -#define SC2RXIRQ 24 /* serial 2 Receive IRQ */ -#define SC2TXIRQ 25 /* serial 2 Transmit IRQ */ - -#define SC2RXICR GxICR(SC2RXIRQ) /* serial 2 receive intr ctrl reg */ -#define SC2TXICR GxICR(SC2TXIRQ) /* serial 2 transmit intr ctrl reg */ - - -#endif /* __KERNEL__ */ - -#endif /* _ASM_SERIAL_REGS_H */ diff --git a/include/asm-mn10300/serial.h b/include/asm-mn10300/serial.h deleted file mode 100644 index 99785a9..0000000 --- a/include/asm-mn10300/serial.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Standard UART definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -/* - * The ASB2305 has an 18.432 MHz clock the UART - */ -#define BASE_BAUD (18432000 / 16) - -/* Standard COM flags (except for COM4, because of the 8514 problem) */ -#ifdef CONFIG_SERIAL_DETECT_IRQ -#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) -#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) -#else -#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF -#endif - -#ifdef CONFIG_SERIAL_MANY_PORTS -#define FOURPORT_FLAGS ASYNC_FOURPORT -#define ACCENT_FLAGS 0 -#define BOCA_FLAGS 0 -#define HUB6_FLAGS 0 -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE -#endif - -#include diff --git a/include/asm-mn10300/setup.h b/include/asm-mn10300/setup.h deleted file mode 100644 index 08356c8..0000000 --- a/include/asm-mn10300/setup.h +++ /dev/null @@ -1,17 +0,0 @@ -/* MN10300 Setup declarations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SETUP_H -#define _ASM_SETUP_H - -extern void __init unit_setup(void); -extern void __init unit_init_IRQ(void); - -#endif /* _ASM_SETUP_H */ diff --git a/include/asm-mn10300/shmbuf.h b/include/asm-mn10300/shmbuf.h deleted file mode 100644 index 8f300cc..0000000 --- a/include/asm-mn10300/shmbuf.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _ASM_SHMBUF_H -#define _ASM_SHMBUF_H - -/* - * The shmid64_ds structure for MN10300 architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - */ - -struct shmid64_ds { - struct ipc64_perm shm_perm; /* operation perms */ - size_t shm_segsz; /* size of segment (bytes) */ - __kernel_time_t shm_atime; /* last attach time */ - unsigned long __unused1; - __kernel_time_t shm_dtime; /* last detach time */ - unsigned long __unused2; - __kernel_time_t shm_ctime; /* last change time */ - unsigned long __unused3; - __kernel_pid_t shm_cpid; /* pid of creator */ - __kernel_pid_t shm_lpid; /* pid of last operator */ - unsigned long shm_nattch; /* no. of current attaches */ - unsigned long __unused4; - unsigned long __unused5; -}; - -struct shminfo64 { - unsigned long shmmax; - unsigned long shmmin; - unsigned long shmmni; - unsigned long shmseg; - unsigned long shmall; - unsigned long __unused1; - unsigned long __unused2; - unsigned long __unused3; - unsigned long __unused4; -}; - -#endif /* _ASM_SHMBUF_H */ diff --git a/include/asm-mn10300/shmparam.h b/include/asm-mn10300/shmparam.h deleted file mode 100644 index ab666ed..0000000 --- a/include/asm-mn10300/shmparam.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_SHMPARAM_H -#define _ASM_SHMPARAM_H - -#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ - -#endif /* _ASM_SHMPARAM_H */ diff --git a/include/asm-mn10300/sigcontext.h b/include/asm-mn10300/sigcontext.h deleted file mode 100644 index 4de3aff..0000000 --- a/include/asm-mn10300/sigcontext.h +++ /dev/null @@ -1,52 +0,0 @@ -/* MN10300 Userspace signal context - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SIGCONTEXT_H -#define _ASM_SIGCONTEXT_H - -struct fpucontext { - /* Regular FPU environment */ - unsigned long fs[32]; /* fpu registers */ - unsigned long fpcr; /* fpu control register */ -}; - -struct sigcontext { - unsigned long d0; - unsigned long d1; - unsigned long d2; - unsigned long d3; - unsigned long a0; - unsigned long a1; - unsigned long a2; - unsigned long a3; - unsigned long e0; - unsigned long e1; - unsigned long e2; - unsigned long e3; - unsigned long e4; - unsigned long e5; - unsigned long e6; - unsigned long e7; - unsigned long lar; - unsigned long lir; - unsigned long mdr; - unsigned long mcvf; - unsigned long mcrl; - unsigned long mcrh; - unsigned long mdrq; - unsigned long sp; - unsigned long epsw; - unsigned long pc; - struct fpucontext *fpucontext; - unsigned long oldmask; -}; - - -#endif /* _ASM_SIGCONTEXT_H */ diff --git a/include/asm-mn10300/siginfo.h b/include/asm-mn10300/siginfo.h deleted file mode 100644 index 0815d29..0000000 --- a/include/asm-mn10300/siginfo.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/signal.h b/include/asm-mn10300/signal.h deleted file mode 100644 index e98817c..0000000 --- a/include/asm-mn10300/signal.h +++ /dev/null @@ -1,171 +0,0 @@ -/* MN10300 Signal definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SIGNAL_H -#define _ASM_SIGNAL_H - -#include - -/* Avoid too many header ordering problems. */ -struct siginfo; - -#ifdef __KERNEL__ -/* Most things should be clean enough to redefine this at will, if care - is taken to make libc match. */ - -#define _NSIG 64 -#define _NSIG_BPW 32 -#define _NSIG_WORDS (_NSIG / _NSIG_BPW) - -typedef unsigned long old_sigset_t; /* at least 32 bits */ - -typedef struct { - unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -#else -/* Here we must cater to libcs that poke about in kernel headers. */ - -#define NSIG 32 -typedef unsigned long sigset_t; - -#endif /* __KERNEL__ */ - -#define SIGHUP 1 -#define SIGINT 2 -#define SIGQUIT 3 -#define SIGILL 4 -#define SIGTRAP 5 -#define SIGABRT 6 -#define SIGIOT 6 -#define SIGBUS 7 -#define SIGFPE 8 -#define SIGKILL 9 -#define SIGUSR1 10 -#define SIGSEGV 11 -#define SIGUSR2 12 -#define SIGPIPE 13 -#define SIGALRM 14 -#define SIGTERM 15 -#define SIGSTKFLT 16 -#define SIGCHLD 17 -#define SIGCONT 18 -#define SIGSTOP 19 -#define SIGTSTP 20 -#define SIGTTIN 21 -#define SIGTTOU 22 -#define SIGURG 23 -#define SIGXCPU 24 -#define SIGXFSZ 25 -#define SIGVTALRM 26 -#define SIGPROF 27 -#define SIGWINCH 28 -#define SIGIO 29 -#define SIGPOLL SIGIO -/* -#define SIGLOST 29 -*/ -#define SIGPWR 30 -#define SIGSYS 31 -#define SIGUNUSED 31 - -/* These should not be considered constants from userland. */ -#define SIGRTMIN 32 -#define SIGRTMAX (_NSIG-1) - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001U -#define SA_NOCLDWAIT 0x00000002U -#define SA_SIGINFO 0x00000004U -#define SA_ONSTACK 0x08000000U -#define SA_RESTART 0x10000000U -#define SA_NODEFER 0x40000000U -#define SA_RESETHAND 0x80000000U - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - -#define SA_RESTORER 0x04000000 - -/* - * sigaltstack controls - */ -#define SS_ONSTACK 1 -#define SS_DISABLE 2 - -#define MINSIGSTKSZ 2048 -#define SIGSTKSZ 8192 - -#include - -#ifdef __KERNEL__ -struct old_sigaction { - __sighandler_t sa_handler; - old_sigset_t sa_mask; - unsigned long sa_flags; - __sigrestore_t sa_restorer; -}; - -struct sigaction { - __sighandler_t sa_handler; - unsigned long sa_flags; - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ -}; - -struct k_sigaction { - struct sigaction sa; -}; -#else -/* Here we must cater to libcs that poke about in kernel headers. */ - -struct sigaction { - union { - __sighandler_t _sa_handler; - void (*_sa_sigaction)(int, struct siginfo *, void *); - } _u; - sigset_t sa_mask; - unsigned long sa_flags; - void (*sa_restorer)(void); -}; - -#define sa_handler _u._sa_handler -#define sa_sigaction _u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { - void __user *ss_sp; - int ss_flags; - size_t ss_size; -} stack_t; - -#ifdef __KERNEL__ -#include - - -struct pt_regs; -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_SIGNAL_H */ diff --git a/include/asm-mn10300/smp.h b/include/asm-mn10300/smp.h deleted file mode 100644 index 4eb8c61..0000000 --- a/include/asm-mn10300/smp.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MN10300 SMP support - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SMP_H -#define _ASM_SMP_H - -#ifdef CONFIG_SMP -#error SMP not yet supported for MN10300 -#endif - -#endif diff --git a/include/asm-mn10300/socket.h b/include/asm-mn10300/socket.h deleted file mode 100644 index fb5daf4..0000000 --- a/include/asm-mn10300/socket.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _ASM_SOCKET_H -#define _ASM_SOCKET_H - -#include - -/* For setsockopt(2) */ -#define SOL_SOCKET 1 - -#define SO_DEBUG 1 -#define SO_REUSEADDR 2 -#define SO_TYPE 3 -#define SO_ERROR 4 -#define SO_DONTROUTE 5 -#define SO_BROADCAST 6 -#define SO_SNDBUF 7 -#define SO_RCVBUF 8 -#define SO_SNDBUFFORCE 32 -#define SO_RCVBUFFORCE 33 -#define SO_KEEPALIVE 9 -#define SO_OOBINLINE 10 -#define SO_NO_CHECK 11 -#define SO_PRIORITY 12 -#define SO_LINGER 13 -#define SO_BSDCOMPAT 14 -/* To add :#define SO_REUSEPORT 15 */ -#define SO_PASSCRED 16 -#define SO_PEERCRED 17 -#define SO_RCVLOWAT 18 -#define SO_SNDLOWAT 19 -#define SO_RCVTIMEO 20 -#define SO_SNDTIMEO 21 - -/* Security levels - as per NRL IPv6 - don't actually do anything */ -#define SO_SECURITY_AUTHENTICATION 22 -#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 -#define SO_SECURITY_ENCRYPTION_NETWORK 24 - -#define SO_BINDTODEVICE 25 - -/* Socket filtering */ -#define SO_ATTACH_FILTER 26 -#define SO_DETACH_FILTER 27 - -#define SO_PEERNAME 28 -#define SO_TIMESTAMP 29 -#define SCM_TIMESTAMP SO_TIMESTAMP - -#define SO_ACCEPTCONN 30 - -#define SO_PEERSEC 31 -#define SO_PASSSEC 34 -#define SO_TIMESTAMPNS 35 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS - -#define SO_MARK 36 - -#define SO_TIMESTAMPING 37 -#define SCM_TIMESTAMPING SO_TIMESTAMPING - -#endif /* _ASM_SOCKET_H */ diff --git a/include/asm-mn10300/sockios.h b/include/asm-mn10300/sockios.h deleted file mode 100644 index b03043a..0000000 --- a/include/asm-mn10300/sockios.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _ASM_SOCKIOS_H -#define _ASM_SOCKIOS_H - -/* Socket-level I/O control calls. */ -#define FIOSETOWN 0x8901 -#define SIOCSPGRP 0x8902 -#define FIOGETOWN 0x8903 -#define SIOCGPGRP 0x8904 -#define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ -#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ - -#endif /* _ASM_SOCKIOS_H */ diff --git a/include/asm-mn10300/spinlock.h b/include/asm-mn10300/spinlock.h deleted file mode 100644 index 4bf9c8b..0000000 --- a/include/asm-mn10300/spinlock.h +++ /dev/null @@ -1,16 +0,0 @@ -/* MN10300 spinlock support - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SPINLOCK_H -#define _ASM_SPINLOCK_H - -#error SMP spinlocks not implemented for MN10300 - -#endif /* _ASM_SPINLOCK_H */ diff --git a/include/asm-mn10300/stat.h b/include/asm-mn10300/stat.h deleted file mode 100644 index 63ff837..0000000 --- a/include/asm-mn10300/stat.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef _ASM_STAT_H -#define _ASM_STAT_H - -struct __old_kernel_stat { - unsigned short st_dev; - unsigned short st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned long st_size; - unsigned long st_atime; - unsigned long st_mtime; - unsigned long st_ctime; -}; - -struct stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned long st_rdev; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime; - unsigned long st_atime_nsec; - unsigned long st_mtime; - unsigned long st_mtime_nsec; - unsigned long st_ctime; - unsigned long st_ctime_nsec; - unsigned long __unused4; - unsigned long __unused5; -}; - -/* This matches struct stat64 in glibc2.1, hence the absolutely - * insane amounts of padding around dev_t's. - */ -struct stat64 { - unsigned long long st_dev; - unsigned char __pad0[4]; - -#define STAT64_HAS_BROKEN_ST_INO 1 - unsigned long __st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - unsigned long st_uid; - unsigned long st_gid; - - unsigned long long st_rdev; - unsigned char __pad3[4]; - - long long st_size; - unsigned long st_blksize; - - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - unsigned long __pad4; /* future possible st_blocks high bits */ - - unsigned long st_atime; - unsigned long st_atime_nsec; - - unsigned long st_mtime; - unsigned int st_mtime_nsec; - - unsigned long st_ctime; - unsigned long st_ctime_nsec; - - unsigned long long st_ino; -}; - -#define STAT_HAVE_NSEC 1 - -#endif /* _ASM_STAT_H */ diff --git a/include/asm-mn10300/statfs.h b/include/asm-mn10300/statfs.h deleted file mode 100644 index 0b91fe1..0000000 --- a/include/asm-mn10300/statfs.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/string.h b/include/asm-mn10300/string.h deleted file mode 100644 index 47dbd43..0000000 --- a/include/asm-mn10300/string.h +++ /dev/null @@ -1,32 +0,0 @@ -/* MN10300 Optimised string functions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Modified by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_STRING_H -#define _ASM_STRING_H - -#define __HAVE_ARCH_MEMSET -#define __HAVE_ARCH_MEMCPY -#define __HAVE_ARCH_MEMMOVE - -extern void *memset(void *dest, int ch, size_t count); -extern void *memcpy(void *dest, const void *src, size_t count); -extern void *memmove(void *dest, const void *src, size_t count); - - -extern void __struct_cpy_bug(void); -#define struct_cpy(x, y) \ -({ \ - if (sizeof(*(x)) != sizeof(*(y))) \ - __struct_cpy_bug; \ - memcpy(x, y, sizeof(*(x))); \ -}) - -#endif /* _ASM_STRING_H */ diff --git a/include/asm-mn10300/swab.h b/include/asm-mn10300/swab.h deleted file mode 100644 index bd818a8..0000000 --- a/include/asm-mn10300/swab.h +++ /dev/null @@ -1,42 +0,0 @@ -/* MN10300 Byte-order primitive construction - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SWAB_H -#define _ASM_SWAB_H - -#include - -#ifdef __GNUC__ - -static inline __attribute__((const)) -__u32 __arch_swab32(__u32 x) -{ - __u32 ret; - asm("swap %1,%0" : "=r" (ret) : "r" (x)); - return ret; -} -#define __arch_swab32 __arch_swab32 - -static inline __attribute__((const)) -__u16 __arch_swab16(__u16 x) -{ - __u16 ret; - asm("swaph %1,%0" : "=r" (ret) : "r" (x)); - return ret; -} -#define __arch_swab32 __arch_swab32 - -#if !defined(__STRICT_ANSI__) || defined(__KERNEL__) -# define __SWAB_64_THRU_32__ -#endif - -#endif /* __GNUC__ */ - -#endif /* _ASM_SWAB_H */ diff --git a/include/asm-mn10300/system.h b/include/asm-mn10300/system.h deleted file mode 100644 index 8214fb7..0000000 --- a/include/asm-mn10300/system.h +++ /dev/null @@ -1,237 +0,0 @@ -/* MN10300 System definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_SYSTEM_H -#define _ASM_SYSTEM_H - -#include - -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#include - -struct task_struct; -struct thread_struct; - -extern asmlinkage -struct task_struct *__switch_to(struct thread_struct *prev, - struct thread_struct *next, - struct task_struct *prev_task); - -/* context switching is now performed out-of-line in switch_to.S */ -#define switch_to(prev, next, last) \ -do { \ - current->thread.wchan = (u_long) __builtin_return_address(0); \ - (last) = __switch_to(&(prev)->thread, &(next)->thread, (prev)); \ - mb(); \ - current->thread.wchan = 0; \ -} while (0) - -#define arch_align_stack(x) (x) - -#define nop() asm volatile ("nop") - -#endif /* !__ASSEMBLY__ */ - -/* - * Force strict CPU ordering. - * And yes, this is required on UP too when we're talking - * to devices. - * - * For now, "wmb()" doesn't actually do anything, as all - * Intel CPU's follow what Intel calls a *Processor Order*, - * in which all writes are seen in the program order even - * outside the CPU. - * - * I expect future Intel CPU's to have a weaker ordering, - * but I'd also expect them to finally get their act together - * and add some real memory barriers if so. - * - * Some non intel clones support out of order store. wmb() ceases to be a - * nop for these. - */ - -#define mb() asm volatile ("": : :"memory") -#define rmb() mb() -#define wmb() asm volatile ("": : :"memory") - -#ifdef CONFIG_SMP -#define smp_mb() mb() -#define smp_rmb() rmb() -#define smp_wmb() wmb() -#else -#define smp_mb() barrier() -#define smp_rmb() barrier() -#define smp_wmb() barrier() -#endif - -#define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) - -#define read_barrier_depends() do {} while (0) -#define smp_read_barrier_depends() do {} while (0) - -/*****************************************************************************/ -/* - * interrupt control - * - "disabled": run in IM1/2 - * - level 0 - GDB stub - * - level 1 - virtual serial DMA (if present) - * - level 5 - normal interrupt priority - * - level 6 - timer interrupt - * - "enabled": run in IM7 - */ -#ifdef CONFIG_MN10300_TTYSM -#define MN10300_CLI_LEVEL EPSW_IM_2 -#else -#define MN10300_CLI_LEVEL EPSW_IM_1 -#endif - -#define local_save_flags(x) \ -do { \ - typecheck(unsigned long, x); \ - asm volatile( \ - " mov epsw,%0 \n" \ - : "=d"(x) \ - ); \ -} while (0) - -#define local_irq_disable() \ -do { \ - asm volatile( \ - " and %0,epsw \n" \ - " or %1,epsw \n" \ - " nop \n" \ - " nop \n" \ - " nop \n" \ - : \ - : "i"(~EPSW_IM), "i"(EPSW_IE | MN10300_CLI_LEVEL) \ - ); \ -} while (0) - -#define local_irq_save(x) \ -do { \ - local_save_flags(x); \ - local_irq_disable(); \ -} while (0) - -/* - * we make sure local_irq_enable() doesn't cause priority inversion - */ -#ifndef __ASSEMBLY__ - -extern unsigned long __mn10300_irq_enabled_epsw; - -#endif - -#define local_irq_enable() \ -do { \ - unsigned long tmp; \ - \ - asm volatile( \ - " mov epsw,%0 \n" \ - " and %1,%0 \n" \ - " or %2,%0 \n" \ - " mov %0,epsw \n" \ - : "=&d"(tmp) \ - : "i"(~EPSW_IM), "r"(__mn10300_irq_enabled_epsw) \ - ); \ -} while (0) - -#define local_irq_restore(x) \ -do { \ - typecheck(unsigned long, x); \ - asm volatile( \ - " mov %0,epsw \n" \ - " nop \n" \ - " nop \n" \ - " nop \n" \ - : \ - : "d"(x) \ - : "memory", "cc" \ - ); \ -} while (0) - -#define irqs_disabled() \ -({ \ - unsigned long flags; \ - local_save_flags(flags); \ - (flags & EPSW_IM) <= MN10300_CLI_LEVEL; \ -}) - -/* hook to save power by halting the CPU - * - called from the idle loop - * - must reenable interrupts (which takes three instruction cycles to complete) - */ -#define safe_halt() \ -do { \ - asm volatile(" or %0,epsw \n" \ - " nop \n" \ - " nop \n" \ - " bset %2,(%1) \n" \ - : \ - : "i"(EPSW_IE|EPSW_IM), "n"(&CPUM), "i"(CPUM_SLEEP)\ - : "cc" \ - ); \ -} while (0) - -#define STI or EPSW_IE|EPSW_IM,epsw -#define CLI and ~EPSW_IM,epsw; or EPSW_IE|MN10300_CLI_LEVEL,epsw; nop; nop; nop - -/*****************************************************************************/ -/* - * MN10300 doesn't actually have an exchange instruction - */ -#ifndef __ASSEMBLY__ - -struct __xchg_dummy { unsigned long a[100]; }; -#define __xg(x) ((struct __xchg_dummy *)(x)) - -static inline -unsigned long __xchg(volatile unsigned long *m, unsigned long val) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - *m = val; - local_irq_restore(flags); - return retval; -} - -#define xchg(ptr, v) \ - ((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr), \ - (unsigned long)(v))) - -static inline unsigned long __cmpxchg(volatile unsigned long *m, - unsigned long old, unsigned long new) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - if (retval == old) - *m = new; - local_irq_restore(flags); - return retval; -} - -#define cmpxchg(ptr, o, n) \ - ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ - (unsigned long)(o), \ - (unsigned long)(n))) - -#endif /* !__ASSEMBLY__ */ - -#endif /* __KERNEL__ */ -#endif /* _ASM_SYSTEM_H */ diff --git a/include/asm-mn10300/termbits.h b/include/asm-mn10300/termbits.h deleted file mode 100644 index eb2b0dc..0000000 --- a/include/asm-mn10300/termbits.h +++ /dev/null @@ -1,200 +0,0 @@ -#ifndef _ASM_TERMBITS_H -#define _ASM_TERMBITS_H - -#include - -typedef unsigned char cc_t; -typedef unsigned int speed_t; -typedef unsigned int tcflag_t; - -#define NCCS 19 -struct termios { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ -}; - -struct termios2 { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -struct ktermios { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define VINTR 0 -#define VQUIT 1 -#define VERASE 2 -#define VKILL 3 -#define VEOF 4 -#define VTIME 5 -#define VMIN 6 -#define VSWTC 7 -#define VSTART 8 -#define VSTOP 9 -#define VSUSP 10 -#define VEOL 11 -#define VREPRINT 12 -#define VDISCARD 13 -#define VWERASE 14 -#define VLNEXT 15 -#define VEOL2 16 - - -/* c_iflag bits */ -#define IGNBRK 0000001 -#define BRKINT 0000002 -#define IGNPAR 0000004 -#define PARMRK 0000010 -#define INPCK 0000020 -#define ISTRIP 0000040 -#define INLCR 0000100 -#define IGNCR 0000200 -#define ICRNL 0000400 -#define IUCLC 0001000 -#define IXON 0002000 -#define IXANY 0004000 -#define IXOFF 0010000 -#define IMAXBEL 0020000 -#define IUTF8 0040000 - -/* c_oflag bits */ -#define OPOST 0000001 -#define OLCUC 0000002 -#define ONLCR 0000004 -#define OCRNL 0000010 -#define ONOCR 0000020 -#define ONLRET 0000040 -#define OFILL 0000100 -#define OFDEL 0000200 -#define NLDLY 0000400 -#define NL0 0000000 -#define NL1 0000400 -#define CRDLY 0003000 -#define CR0 0000000 -#define CR1 0001000 -#define CR2 0002000 -#define CR3 0003000 -#define TABDLY 0014000 -#define TAB0 0000000 -#define TAB1 0004000 -#define TAB2 0010000 -#define TAB3 0014000 -#define XTABS 0014000 -#define BSDLY 0020000 -#define BS0 0000000 -#define BS1 0020000 -#define VTDLY 0040000 -#define VT0 0000000 -#define VT1 0040000 -#define FFDLY 0100000 -#define FF0 0000000 -#define FF1 0100000 - -/* c_cflag bit meaning */ -#define CBAUD 0010017 -#define B0 0000000 /* hang up */ -#define B50 0000001 -#define B75 0000002 -#define B110 0000003 -#define B134 0000004 -#define B150 0000005 -#define B200 0000006 -#define B300 0000007 -#define B600 0000010 -#define B1200 0000011 -#define B1800 0000012 -#define B2400 0000013 -#define B4800 0000014 -#define B9600 0000015 -#define B19200 0000016 -#define B38400 0000017 -#define EXTA B19200 -#define EXTB B38400 -#define CSIZE 0000060 -#define CS5 0000000 -#define CS6 0000020 -#define CS7 0000040 -#define CS8 0000060 -#define CSTOPB 0000100 -#define CREAD 0000200 -#define PARENB 0000400 -#define PARODD 0001000 -#define HUPCL 0002000 -#define CLOCAL 0004000 -#define CBAUDEX 0010000 -#define BOTHER 0010000 -#define B57600 0010001 -#define B115200 0010002 -#define B230400 0010003 -#define B460800 0010004 -#define B500000 0010005 -#define B576000 0010006 -#define B921600 0010007 -#define B1000000 0010010 -#define B1152000 0010011 -#define B1500000 0010012 -#define B2000000 0010013 -#define B2500000 0010014 -#define B3000000 0010015 -#define B3500000 0010016 -#define B4000000 0010017 -#define CIBAUD 002003600000 /* input baud rate (not used) */ -#define CTVB 004000000000 /* VisioBraille Terminal flow control */ -#define CMSPAR 010000000000 /* mark or space (stick) parity */ -#define CRTSCTS 020000000000 /* flow control */ - -#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define ISIG 0000001 -#define ICANON 0000002 -#define XCASE 0000004 -#define ECHO 0000010 -#define ECHOE 0000020 -#define ECHOK 0000040 -#define ECHONL 0000100 -#define NOFLSH 0000200 -#define TOSTOP 0000400 -#define ECHOCTL 0001000 -#define ECHOPRT 0002000 -#define ECHOKE 0004000 -#define FLUSHO 0010000 -#define PENDIN 0040000 -#define IEXTEN 0100000 - -/* tcflow() and TCXONC use these */ -#define TCOOFF 0 -#define TCOON 1 -#define TCIOFF 2 -#define TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TCIFLUSH 0 -#define TCOFLUSH 1 -#define TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TCSANOW 0 -#define TCSADRAIN 1 -#define TCSAFLUSH 2 - -#endif /* _ASM_TERMBITS_H */ diff --git a/include/asm-mn10300/termios.h b/include/asm-mn10300/termios.h deleted file mode 100644 index dd7cf61..0000000 --- a/include/asm-mn10300/termios.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef _ASM_TERMIOS_H -#define _ASM_TERMIOS_H - -#include -#include - -struct winsize { - unsigned short ws_row; - unsigned short ws_col; - unsigned short ws_xpixel; - unsigned short ws_ypixel; -}; - -#define NCC 8 -struct termio { - unsigned short c_iflag; /* input mode flags */ - unsigned short c_oflag; /* output mode flags */ - unsigned short c_cflag; /* control mode flags */ - unsigned short c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[NCC]; /* control characters */ -}; - -#ifdef __KERNEL__ -/* intr=^C quit=^| erase=del kill=^U - eof=^D vtime=\0 vmin=\1 sxtc=\0 - start=^Q stop=^S susp=^Z eol=\0 - reprint=^R discard=^U werase=^W lnext=^V - eol2=\0 -*/ -#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" -#endif - -/* modem lines */ -#define TIOCM_LE 0x001 -#define TIOCM_DTR 0x002 -#define TIOCM_RTS 0x004 -#define TIOCM_ST 0x008 -#define TIOCM_SR 0x010 -#define TIOCM_CTS 0x020 -#define TIOCM_CAR 0x040 -#define TIOCM_RNG 0x080 -#define TIOCM_DSR 0x100 -#define TIOCM_CD TIOCM_CAR -#define TIOCM_RI TIOCM_RNG -#define TIOCM_OUT1 0x2000 -#define TIOCM_OUT2 0x4000 -#define TIOCM_LOOP 0x8000 - -#define TIOCM_MODEM_BITS TIOCM_OUT2 /* IRDA support */ - -/* - * Translate a "termio" structure into a "termios". Ugh. - */ -#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ - unsigned short __tmp; \ - get_user(__tmp, &(termio)->x); \ - *(unsigned short *) &(termios)->x = __tmp; \ -} - -#define user_termio_to_kernel_termios(termios, termio) \ -({ \ - SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ - copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ -}) - -/* - * Translate a "termios" structure into a "termio". Ugh. - */ -#define kernel_termios_to_user_termio(termio, termios) \ -({ \ - put_user((termios)->c_iflag, &(termio)->c_iflag); \ - put_user((termios)->c_oflag, &(termio)->c_oflag); \ - put_user((termios)->c_cflag, &(termio)->c_cflag); \ - put_user((termios)->c_lflag, &(termio)->c_lflag); \ - put_user((termios)->c_line, &(termio)->c_line); \ - copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ -}) - -#define user_termios_to_kernel_termios(k, u) \ - copy_from_user(k, u, sizeof(struct termios2)) -#define kernel_termios_to_user_termios(u, k) \ - copy_to_user(u, k, sizeof(struct termios2)) -#define user_termios_to_kernel_termios_1(k, u) \ - copy_from_user(k, u, sizeof(struct termios)) -#define kernel_termios_to_user_termios_1(u, k) \ - copy_to_user(u, k, sizeof(struct termios)) - -#endif /* _ASM_TERMIOS_H */ diff --git a/include/asm-mn10300/thread_info.h b/include/asm-mn10300/thread_info.h deleted file mode 100644 index 78a3881..0000000 --- a/include/asm-mn10300/thread_info.h +++ /dev/null @@ -1,170 +0,0 @@ -/* MN10300 Low-level thread information - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_THREAD_INFO_H -#define _ASM_THREAD_INFO_H - -#ifdef __KERNEL__ - -#include - -#ifndef __ASSEMBLY__ -#include -#endif - -#define PREEMPT_ACTIVE 0x10000000 - -#ifdef CONFIG_4KSTACKS -#define THREAD_SIZE (4096) -#else -#define THREAD_SIZE (8192) -#endif - -#define STACK_WARN (THREAD_SIZE / 8) - -/* - * low level task data that entry.S needs immediate access to - * - this struct should fit entirely inside of one cache line - * - this struct shares the supervisor stack pages - * - if the contents of this structure are changed, the assembly constants - * must also be changed - */ -#ifndef __ASSEMBLY__ - -struct thread_info { - struct task_struct *task; /* main task structure */ - struct exec_domain *exec_domain; /* execution domain */ - unsigned long flags; /* low level flags */ - __u32 cpu; /* current CPU */ - __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ - - mm_segment_t addr_limit; /* thread address space: - 0-0xBFFFFFFF for user-thead - 0-0xFFFFFFFF for kernel-thread - */ - struct restart_block restart_block; - - __u8 supervisor_stack[0]; -}; - -#else /* !__ASSEMBLY__ */ - -#ifndef __ASM_OFFSETS_H__ -#include -#endif - -#endif - -/* - * macros/functions for gaining access to the thread information structure - * - * preempt_count needs to be 1 initially, until the scheduler is functional. - */ -#ifndef __ASSEMBLY__ - -#define INIT_THREAD_INFO(tsk) \ -{ \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ - .flags = 0, \ - .cpu = 0, \ - .preempt_count = 1, \ - .addr_limit = KERNEL_DS, \ - .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ -} - -#define init_thread_info (init_thread_union.thread_info) -#define init_stack (init_thread_union.stack) -#define init_uregs \ - ((struct pt_regs *) \ - ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs))) - -extern struct thread_info *__current_ti; - -/* how to get the thread information struct from C */ -static inline __attribute__((const)) -struct thread_info *current_thread_info(void) -{ - struct thread_info *ti; - asm("mov sp,%0\n" - "and %1,%0\n" - : "=d" (ti) - : "i" (~(THREAD_SIZE - 1)) - : "cc"); - return ti; -} - -/* how to get the current stack pointer from C */ -static inline unsigned long current_stack_pointer(void) -{ - unsigned long sp; - asm("mov sp,%0; ":"=r" (sp)); - return sp; -} - -#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR - -/* thread information allocation */ -#ifdef CONFIG_DEBUG_STACK_USAGE -#define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL) -#else -#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) -#endif - -#define free_thread_info(ti) kfree((ti)) -#define get_thread_info(ti) get_task_struct((ti)->task) -#define put_thread_info(ti) put_task_struct((ti)->task) - -#else /* !__ASSEMBLY__ */ - -#ifndef __VMLINUX_LDS__ -/* how to get the thread information struct from ASM */ -.macro GET_THREAD_INFO reg - mov sp,\reg - and -THREAD_SIZE,\reg -.endm -#endif -#endif - -/* - * thread information flags - * - these are process state flags that various assembly files may need to - * access - * - pending work-to-be-done flags are in LSW - * - other flags in MSW - */ -#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ -#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ -#define TIF_SIGPENDING 2 /* signal pending */ -#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ -#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ -#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ -#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17 /* OOM killer killed process */ -#define TIF_FREEZE 18 /* freezing for suspend */ - -#define _TIF_SYSCALL_TRACE +(1 << TIF_SYSCALL_TRACE) -#define _TIF_NOTIFY_RESUME +(1 << TIF_NOTIFY_RESUME) -#define _TIF_SIGPENDING +(1 << TIF_SIGPENDING) -#define _TIF_NEED_RESCHED +(1 << TIF_NEED_RESCHED) -#define _TIF_SINGLESTEP +(1 << TIF_SINGLESTEP) -#define _TIF_RESTORE_SIGMASK +(1 << TIF_RESTORE_SIGMASK) -#define _TIF_POLLING_NRFLAG +(1 << TIF_POLLING_NRFLAG) -#define _TIF_FREEZE +(1 << TIF_FREEZE) - -#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ -#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_THREAD_INFO_H */ diff --git a/include/asm-mn10300/timer-regs.h b/include/asm-mn10300/timer-regs.h deleted file mode 100644 index 1d883b7..0000000 --- a/include/asm-mn10300/timer-regs.h +++ /dev/null @@ -1,293 +0,0 @@ -/* AM33v2 on-board timer module registers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_TIMER_REGS_H -#define _ASM_TIMER_REGS_H - -#include -#include - -#ifdef __KERNEL__ - -/* timer prescalar control */ -#define TMPSCNT __SYSREG(0xd4003071, u8) /* timer prescaler control */ -#define TMPSCNT_ENABLE 0x80 /* timer prescaler enable */ -#define TMPSCNT_DISABLE 0x00 /* timer prescaler disable */ - -/* 8 bit timers */ -#define TM0MD __SYSREG(0xd4003000, u8) /* timer 0 mode register */ -#define TM0MD_SRC 0x07 /* timer source */ -#define TM0MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM0MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM0MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM0MD_SRC_TM2IO 0x03 /* - TM2IO pin input */ -#define TM0MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM0MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM0MD_SRC_TM0IO 0x07 /* - TM0IO pin input */ -#define TM0MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM0MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM1MD __SYSREG(0xd4003001, u8) /* timer 1 mode register */ -#define TM1MD_SRC 0x07 /* timer source */ -#define TM1MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM1MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM1MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM1MD_SRC_TM0CASCADE 0x03 /* - cascade with timer 0 */ -#define TM1MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM1MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM1MD_SRC_TM1IO 0x07 /* - TM1IO pin input */ -#define TM1MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM1MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM2MD __SYSREG(0xd4003002, u8) /* timer 2 mode register */ -#define TM2MD_SRC 0x07 /* timer source */ -#define TM2MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM2MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM2MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM2MD_SRC_TM1CASCADE 0x03 /* - cascade with timer 1 */ -#define TM2MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM2MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM2MD_SRC_TM2IO 0x07 /* - TM2IO pin input */ -#define TM2MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM2MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM3MD __SYSREG(0xd4003003, u8) /* timer 3 mode register */ -#define TM3MD_SRC 0x07 /* timer source */ -#define TM3MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM3MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM3MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM3MD_SRC_TM1CASCADE 0x03 /* - cascade with timer 2 */ -#define TM3MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM3MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM3MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM3MD_SRC_TM3IO 0x07 /* - TM3IO pin input */ -#define TM3MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM3MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM01MD __SYSREG(0xd4003000, u16) /* timer 0:1 mode register */ - -#define TM0BR __SYSREG(0xd4003010, u8) /* timer 0 base register */ -#define TM1BR __SYSREG(0xd4003011, u8) /* timer 1 base register */ -#define TM2BR __SYSREG(0xd4003012, u8) /* timer 2 base register */ -#define TM3BR __SYSREG(0xd4003013, u8) /* timer 3 base register */ -#define TM01BR __SYSREG(0xd4003010, u16) /* timer 0:1 base register */ - -#define TM0BC __SYSREGC(0xd4003020, u8) /* timer 0 binary counter */ -#define TM1BC __SYSREGC(0xd4003021, u8) /* timer 1 binary counter */ -#define TM2BC __SYSREGC(0xd4003022, u8) /* timer 2 binary counter */ -#define TM3BC __SYSREGC(0xd4003023, u8) /* timer 3 binary counter */ -#define TM01BC __SYSREGC(0xd4003020, u16) /* timer 0:1 binary counter */ - -#define TM0IRQ 2 /* timer 0 IRQ */ -#define TM1IRQ 3 /* timer 1 IRQ */ -#define TM2IRQ 4 /* timer 2 IRQ */ -#define TM3IRQ 5 /* timer 3 IRQ */ - -#define TM0ICR GxICR(TM0IRQ) /* timer 0 uflow intr ctrl reg */ -#define TM1ICR GxICR(TM1IRQ) /* timer 1 uflow intr ctrl reg */ -#define TM2ICR GxICR(TM2IRQ) /* timer 2 uflow intr ctrl reg */ -#define TM3ICR GxICR(TM3IRQ) /* timer 3 uflow intr ctrl reg */ - -/* 16-bit timers 4,5 & 7-11 */ -#define TM4MD __SYSREG(0xd4003080, u8) /* timer 4 mode register */ -#define TM4MD_SRC 0x07 /* timer source */ -#define TM4MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM4MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM4MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM4MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM4MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM4MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM4MD_SRC_TM4IO 0x07 /* - TM4IO pin input */ -#define TM4MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM4MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM5MD __SYSREG(0xd4003082, u8) /* timer 5 mode register */ -#define TM5MD_SRC 0x07 /* timer source */ -#define TM5MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM5MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM5MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM5MD_SRC_TM4CASCADE 0x03 /* - cascade with timer 4 */ -#define TM5MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM5MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM5MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM5MD_SRC_TM5IO 0x07 /* - TM5IO pin input */ -#define TM5MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM5MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM7MD __SYSREG(0xd4003086, u8) /* timer 7 mode register */ -#define TM7MD_SRC 0x07 /* timer source */ -#define TM7MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM7MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM7MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM7MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM7MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM7MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM7MD_SRC_TM7IO 0x07 /* - TM7IO pin input */ -#define TM7MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM7MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM8MD __SYSREG(0xd4003088, u8) /* timer 8 mode register */ -#define TM8MD_SRC 0x07 /* timer source */ -#define TM8MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM8MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM8MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM8MD_SRC_TM7CASCADE 0x03 /* - cascade with timer 7 */ -#define TM8MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM8MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM8MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM8MD_SRC_TM8IO 0x07 /* - TM8IO pin input */ -#define TM8MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM8MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM9MD __SYSREG(0xd400308a, u8) /* timer 9 mode register */ -#define TM9MD_SRC 0x07 /* timer source */ -#define TM9MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM9MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM9MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM9MD_SRC_TM8CASCADE 0x03 /* - cascade with timer 8 */ -#define TM9MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM9MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM9MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM9MD_SRC_TM9IO 0x07 /* - TM9IO pin input */ -#define TM9MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM9MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM10MD __SYSREG(0xd400308c, u8) /* timer 10 mode register */ -#define TM10MD_SRC 0x07 /* timer source */ -#define TM10MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM10MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM10MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM10MD_SRC_TM9CASCADE 0x03 /* - cascade with timer 9 */ -#define TM10MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM10MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM10MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM10MD_SRC_TM10IO 0x07 /* - TM10IO pin input */ -#define TM10MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM10MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM11MD __SYSREG(0xd400308e, u8) /* timer 11 mode register */ -#define TM11MD_SRC 0x07 /* timer source */ -#define TM11MD_SRC_IOCLK 0x00 /* - IOCLK */ -#define TM11MD_SRC_IOCLK_8 0x01 /* - 1/8 IOCLK */ -#define TM11MD_SRC_IOCLK_32 0x02 /* - 1/32 IOCLK */ -#define TM11MD_SRC_TM7CASCADE 0x03 /* - cascade with timer 7 */ -#define TM11MD_SRC_TM0UFLOW 0x04 /* - timer 0 underflow */ -#define TM11MD_SRC_TM1UFLOW 0x05 /* - timer 1 underflow */ -#define TM11MD_SRC_TM2UFLOW 0x06 /* - timer 2 underflow */ -#define TM11MD_SRC_TM11IO 0x07 /* - TM11IO pin input */ -#define TM11MD_INIT_COUNTER 0x40 /* initialize TMnBC = TMnBR */ -#define TM11MD_COUNT_ENABLE 0x80 /* timer count enable */ - -#define TM4BR __SYSREG(0xd4003090, u16) /* timer 4 base register */ -#define TM5BR __SYSREG(0xd4003092, u16) /* timer 5 base register */ -#define TM7BR __SYSREG(0xd4003096, u16) /* timer 7 base register */ -#define TM8BR __SYSREG(0xd4003098, u16) /* timer 8 base register */ -#define TM9BR __SYSREG(0xd400309a, u16) /* timer 9 base register */ -#define TM10BR __SYSREG(0xd400309c, u16) /* timer 10 base register */ -#define TM11BR __SYSREG(0xd400309e, u16) /* timer 11 base register */ -#define TM45BR __SYSREG(0xd4003090, u32) /* timer 4:5 base register */ - -#define TM4BC __SYSREG(0xd40030a0, u16) /* timer 4 binary counter */ -#define TM5BC __SYSREG(0xd40030a2, u16) /* timer 5 binary counter */ -#define TM45BC __SYSREG(0xd40030a0, u32) /* timer 4:5 binary counter */ - -#define TM7BC __SYSREG(0xd40030a6, u16) /* timer 7 binary counter */ -#define TM8BC __SYSREG(0xd40030a8, u16) /* timer 8 binary counter */ -#define TM9BC __SYSREG(0xd40030aa, u16) /* timer 9 binary counter */ -#define TM10BC __SYSREG(0xd40030ac, u16) /* timer 10 binary counter */ -#define TM11BC __SYSREG(0xd40030ae, u16) /* timer 11 binary counter */ - -#define TM4IRQ 6 /* timer 4 IRQ */ -#define TM5IRQ 7 /* timer 5 IRQ */ -#define TM7IRQ 11 /* timer 7 IRQ */ -#define TM8IRQ 12 /* timer 8 IRQ */ -#define TM9IRQ 13 /* timer 9 IRQ */ -#define TM10IRQ 14 /* timer 10 IRQ */ -#define TM11IRQ 15 /* timer 11 IRQ */ - -#define TM4ICR GxICR(TM4IRQ) /* timer 4 uflow intr ctrl reg */ -#define TM5ICR GxICR(TM5IRQ) /* timer 5 uflow intr ctrl reg */ -#define TM7ICR GxICR(TM7IRQ) /* timer 7 uflow intr ctrl reg */ -#define TM8ICR GxICR(TM8IRQ) /* timer 8 uflow intr ctrl reg */ -#define TM9ICR GxICR(TM9IRQ) /* timer 9 uflow intr ctrl reg */ -#define TM10ICR GxICR(TM10IRQ) /* timer 10 uflow intr ctrl reg */ -#define TM11ICR GxICR(TM11IRQ) /* timer 11 uflow intr ctrl reg */ - -/* 16-bit timer 6 */ -#define TM6MD __SYSREG(0xd4003084, u16) /* timer6 mode register */ -#define TM6MD_SRC 0x0007 /* timer source */ -#define TM6MD_SRC_IOCLK 0x0000 /* - IOCLK */ -#define TM6MD_SRC_IOCLK_8 0x0001 /* - 1/8 IOCLK */ -#define TM6MD_SRC_IOCLK_32 0x0002 /* - 1/32 IOCLK */ -#define TM6MD_SRC_TM0UFLOW 0x0004 /* - timer 0 underflow */ -#define TM6MD_SRC_TM1UFLOW 0x0005 /* - timer 1 underflow */ -#define TM6MD_SRC_TM6IOB_BOTH 0x0006 /* - TM6IOB pin input (both edges) */ -#define TM6MD_SRC_TM6IOB_SINGLE 0x0007 /* - TM6IOB pin input (single edge) */ -#define TM6MD_CLR_ENABLE 0x0010 /* clear count enable */ -#define TM6MD_ONESHOT_ENABLE 0x0040 /* oneshot count */ -#define TM6MD_TRIG_ENABLE 0x0080 /* TM6IOB pin trigger enable */ -#define TM6MD_PWM 0x3800 /* PWM output mode */ -#define TM6MD_PWM_DIS 0x0000 /* - disabled */ -#define TM6MD_PWM_10BIT 0x1000 /* - 10 bits mode */ -#define TM6MD_PWM_11BIT 0x1800 /* - 11 bits mode */ -#define TM6MD_PWM_12BIT 0x3000 /* - 12 bits mode */ -#define TM6MD_PWM_14BIT 0x3800 /* - 14 bits mode */ -#define TM6MD_INIT_COUNTER 0x4000 /* initialize TMnBC to zero */ -#define TM6MD_COUNT_ENABLE 0x8000 /* timer count enable */ - -#define TM6MDA __SYSREG(0xd40030b4, u8) /* timer6 cmp/cap A mode reg */ -#define TM6MDA_OUT 0x07 /* output select */ -#define TM6MDA_OUT_SETA_RESETB 0x00 /* - set at match A, reset at match B */ -#define TM6MDA_OUT_SETA_RESETOV 0x01 /* - set at match A, reset at overflow */ -#define TM6MDA_OUT_SETA 0x02 /* - set at match A */ -#define TM6MDA_OUT_RESETA 0x03 /* - reset at match A */ -#define TM6MDA_OUT_TOGGLE 0x04 /* - toggle on match A */ -#define TM6MDA_MODE 0xc0 /* compare A register mode */ -#define TM6MDA_MODE_CMP_SINGLE 0x00 /* - compare, single buffer mode */ -#define TM6MDA_MODE_CMP_DOUBLE 0x40 /* - compare, double buffer mode */ -#define TM6MDA_MODE_CAP_S_EDGE 0x80 /* - capture, single edge mode */ -#define TM6MDA_MODE_CAP_D_EDGE 0xc0 /* - capture, double edge mode */ -#define TM6MDA_EDGE 0x20 /* compare A edge select */ -#define TM6MDA_EDGE_FALLING 0x00 /* capture on falling edge */ -#define TM6MDA_EDGE_RISING 0x20 /* capture on rising edge */ -#define TM6MDA_CAPTURE_ENABLE 0x10 /* capture enable */ - -#define TM6MDB __SYSREG(0xd40030b5, u8) /* timer6 cmp/cap B mode reg */ -#define TM6MDB_OUT 0x07 /* output select */ -#define TM6MDB_OUT_SETB_RESETA 0x00 /* - set at match B, reset at match A */ -#define TM6MDB_OUT_SETB_RESETOV 0x01 /* - set at match B */ -#define TM6MDB_OUT_RESETB 0x03 /* - reset at match B */ -#define TM6MDB_OUT_TOGGLE 0x04 /* - toggle on match B */ -#define TM6MDB_MODE 0xc0 /* compare B register mode */ -#define TM6MDB_MODE_CMP_SINGLE 0x00 /* - compare, single buffer mode */ -#define TM6MDB_MODE_CMP_DOUBLE 0x40 /* - compare, double buffer mode */ -#define TM6MDB_MODE_CAP_S_EDGE 0x80 /* - capture, single edge mode */ -#define TM6MDB_MODE_CAP_D_EDGE 0xc0 /* - capture, double edge mode */ -#define TM6MDB_EDGE 0x20 /* compare B edge select */ -#define TM6MDB_EDGE_FALLING 0x00 /* capture on falling edge */ -#define TM6MDB_EDGE_RISING 0x20 /* capture on rising edge */ -#define TM6MDB_CAPTURE_ENABLE 0x10 /* capture enable */ - -#define TM6CA __SYSREG(0xd40030c4, u16) /* timer6 cmp/capture reg A */ -#define TM6CB __SYSREG(0xd40030d4, u16) /* timer6 cmp/capture reg B */ -#define TM6BC __SYSREG(0xd40030a4, u16) /* timer6 binary counter */ - -#define TM6IRQ 6 /* timer 6 IRQ */ -#define TM6AIRQ 9 /* timer 6A IRQ */ -#define TM6BIRQ 10 /* timer 6B IRQ */ - -#define TM6ICR GxICR(TM6IRQ) /* timer 6 uflow intr ctrl reg */ -#define TM6AICR GxICR(TM6AIRQ) /* timer 6A intr control reg */ -#define TM6BICR GxICR(TM6BIRQ) /* timer 6B intr control reg */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_TIMER_REGS_H */ diff --git a/include/asm-mn10300/timex.h b/include/asm-mn10300/timex.h deleted file mode 100644 index 3944277..0000000 --- a/include/asm-mn10300/timex.h +++ /dev/null @@ -1,33 +0,0 @@ -/* MN10300 Architecture time management specifications - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_TIMEX_H -#define _ASM_TIMEX_H - -#include -#include - -#define TICK_SIZE (tick_nsec / 1000) - -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ - this should probably be set - * to something appropriate, but what? */ - -extern cycles_t cacheflush_time; - -#ifdef __KERNEL__ - -static inline cycles_t get_cycles(void) -{ - return read_timestamp_counter(); -} - -#endif /* __KERNEL__ */ - -#endif /* _ASM_TIMEX_H */ diff --git a/include/asm-mn10300/tlb.h b/include/asm-mn10300/tlb.h deleted file mode 100644 index 65d232b..0000000 --- a/include/asm-mn10300/tlb.h +++ /dev/null @@ -1,34 +0,0 @@ -/* MN10300 TLB definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_TLB_H -#define _ASM_TLB_H - -#include - -extern void check_pgt_cache(void); - -/* - * we don't need any special per-pte or per-vma handling... - */ -#define tlb_start_vma(tlb, vma) do { } while (0) -#define tlb_end_vma(tlb, vma) do { } while (0) -#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) - -/* - * .. because we flush the whole mm when it fills up - */ -#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) - -/* for now, just use the generic stuff */ -#include - -#endif /* _ASM_TLB_H */ diff --git a/include/asm-mn10300/tlbflush.h b/include/asm-mn10300/tlbflush.h deleted file mode 100644 index e023986..0000000 --- a/include/asm-mn10300/tlbflush.h +++ /dev/null @@ -1,80 +0,0 @@ -/* MN10300 TLB flushing functions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_TLBFLUSH_H -#define _ASM_TLBFLUSH_H - -#include - -#define __flush_tlb() \ -do { \ - int w; \ - __asm__ __volatile__ \ - (" mov %1,%0 \n" \ - " or %2,%0 \n" \ - " mov %0,%1 \n" \ - : "=d"(w) \ - : "m"(MMUCTR), "i"(MMUCTR_IIV|MMUCTR_DIV) \ - : "memory" \ - ); \ -} while (0) - -#define __flush_tlb_all() __flush_tlb() -#define __flush_tlb_one(addr) __flush_tlb() - - -/* - * TLB flushing: - * - * - flush_tlb() flushes the current mm struct TLBs - * - flush_tlb_all() flushes all processes TLBs - * - flush_tlb_mm(mm) flushes the specified mm context TLB's - * - flush_tlb_page(vma, vmaddr) flushes one page - * - flush_tlb_range(mm, start, end) flushes a range of pages - * - flush_tlb_pgtables(mm, start, end) flushes a range of page tables - */ -#define flush_tlb_all() \ -do { \ - preempt_disable(); \ - __flush_tlb_all(); \ - preempt_enable(); \ -} while (0) - -#define flush_tlb_mm(mm) \ -do { \ - preempt_disable(); \ - __flush_tlb_all(); \ - preempt_enable(); \ -} while (0) - -#define flush_tlb_range(vma, start, end) \ -do { \ - unsigned long __s __attribute__((unused)) = (start); \ - unsigned long __e __attribute__((unused)) = (end); \ - preempt_disable(); \ - __flush_tlb_all(); \ - preempt_enable(); \ -} while (0) - - -#define __flush_tlb_global() flush_tlb_all() -#define flush_tlb() flush_tlb_all() -#define flush_tlb_kernel_range(start, end) \ -do { \ - unsigned long __s __attribute__((unused)) = (start); \ - unsigned long __e __attribute__((unused)) = (end); \ - flush_tlb_all(); \ -} while (0) - -extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr); - -#define flush_tlb_pgtables(mm, start, end) do {} while (0) - -#endif /* _ASM_TLBFLUSH_H */ diff --git a/include/asm-mn10300/topology.h b/include/asm-mn10300/topology.h deleted file mode 100644 index 5428f33..0000000 --- a/include/asm-mn10300/topology.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/asm-mn10300/types.h b/include/asm-mn10300/types.h deleted file mode 100644 index 7b9f010..0000000 --- a/include/asm-mn10300/types.h +++ /dev/null @@ -1,38 +0,0 @@ -/* MN10300 Basic type definitions - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_TYPES_H -#define _ASM_TYPES_H - -#include - -#ifndef __ASSEMBLY__ - -typedef unsigned short umode_t; - -#endif /* __ASSEMBLY__ */ - -/* - * These aren't exported outside the kernel to avoid name space clashes - */ -#ifdef __KERNEL__ - -#define BITS_PER_LONG 32 - -#ifndef __ASSEMBLY__ - -/* Dma addresses are 32-bits wide. */ -typedef u32 dma_addr_t; - -#endif /* __ASSEMBLY__ */ - -#endif /* __KERNEL__ */ - -#endif /* _ASM_TYPES_H */ diff --git a/include/asm-mn10300/uaccess.h b/include/asm-mn10300/uaccess.h deleted file mode 100644 index 8a3a4dd..0000000 --- a/include/asm-mn10300/uaccess.h +++ /dev/null @@ -1,490 +0,0 @@ -/* MN10300 userspace access functions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UACCESS_H -#define _ASM_UACCESS_H - -/* - * User space memory access functions - */ -#include -#include -#include -#include - -#define VERIFY_READ 0 -#define VERIFY_WRITE 1 - -/* - * The fs value determines whether argument validity checking should be - * performed or not. If get_fs() == USER_DS, checking is performed, with - * get_fs() == KERNEL_DS, checking is bypassed. - * - * For historical reasons, these macros are grossly misnamed. - */ - -#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) - -#define KERNEL_XDS MAKE_MM_SEG(0xBFFFFFFF) -#define KERNEL_DS MAKE_MM_SEG(0x9FFFFFFF) -#define USER_DS MAKE_MM_SEG(TASK_SIZE) - -#define get_ds() (KERNEL_DS) -#define get_fs() (current_thread_info()->addr_limit) -#define set_fs(x) (current_thread_info()->addr_limit = (x)) -#define __kernel_ds_p() (current_thread_info()->addr_limit.seg == 0x9FFFFFFF) - -#define segment_eq(a, b) ((a).seg == (b).seg) - -#define __addr_ok(addr) \ - ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg)) - -/* - * check that a range of addresses falls within the current address limit - */ -static inline int ___range_ok(unsigned long addr, unsigned int size) -{ - int flag = 1, tmp; - - asm(" add %3,%1 \n" /* set C-flag if addr + size > 4Gb */ - " bcs 0f \n" - " cmp %4,%1 \n" /* jump if addr+size>limit (error) */ - " bhi 0f \n" - " clr %0 \n" /* mark okay */ - "0: \n" - : "=r"(flag), "=&r"(tmp) - : "1"(addr), "ir"(size), - "r"(current_thread_info()->addr_limit.seg), "0"(flag) - : "cc" - ); - - return flag; -} - -#define __range_ok(addr, size) ___range_ok((unsigned long)(addr), (u32)(size)) - -#define access_ok(type, addr, size) (__range_ok((addr), (size)) == 0) -#define __access_ok(addr, size) (__range_ok((addr), (size)) == 0) - -static inline int verify_area(int type, const void *addr, unsigned long size) -{ - return access_ok(type, addr, size) ? 0 : -EFAULT; -} - - -/* - * The exception table consists of pairs of addresses: the first is the - * address of an instruction that is allowed to fault, and the second is - * the address at which the program should continue. No registers are - * modified, so it is entirely up to the continuation code to figure out - * what to do. - * - * All the routines below use bits of fixup code that are out of line - * with the main instruction path. This means when everything is well, - * we don't even have to jump over them. Further, they do not intrude - * on our cache or tlb entries. - */ - -struct exception_table_entry -{ - unsigned long insn, fixup; -}; - -/* Returns 0 if exception not found and fixup otherwise. */ -extern int fixup_exception(struct pt_regs *regs); - -#define put_user(x, ptr) __put_user_check((x), (ptr), sizeof(*(ptr))) -#define get_user(x, ptr) __get_user_check((x), (ptr), sizeof(*(ptr))) - -/* - * The "__xxx" versions do not do address space checking, useful when - * doing multiple accesses to the same area (the user has to do the - * checks by hand with "access_ok()") - */ -#define __put_user(x, ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) -#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) - -/* - * The "xxx_ret" versions return constant specified in third argument, if - * something bad happens. These macros can be optimized for the - * case of just returning from the function xxx_ret is used. - */ - -#define put_user_ret(x, ptr, ret) \ - ({ if (put_user((x), (ptr))) return (ret); }) -#define get_user_ret(x, ptr, ret) \ - ({ if (get_user((x), (ptr))) return (ret); }) -#define __put_user_ret(x, ptr, ret) \ - ({ if (__put_user((x), (ptr))) return (ret); }) -#define __get_user_ret(x, ptr, ret) \ - ({ if (__get_user((x), (ptr))) return (ret); }) - -struct __large_struct { unsigned long buf[100]; }; -#define __m(x) (*(struct __large_struct *)(x)) - -#define __get_user_nocheck(x, ptr, size) \ -({ \ - __typeof(*(ptr)) __gu_val; \ - unsigned long __gu_addr; \ - int __gu_err; \ - __gu_addr = (unsigned long) (ptr); \ - switch (size) { \ - case 1: __get_user_asm("bu"); break; \ - case 2: __get_user_asm("hu"); break; \ - case 4: __get_user_asm("" ); break; \ - default: __get_user_unknown(); break; \ - } \ - x = (__typeof__(*(ptr))) __gu_val; \ - __gu_err; \ -}) - -#define __get_user_check(x, ptr, size) \ -({ \ - __typeof__(*(ptr)) __gu_val; \ - unsigned long __gu_addr; \ - int __gu_err; \ - __gu_addr = (unsigned long) (ptr); \ - if (likely(__access_ok(__gu_addr,size))) { \ - switch (size) { \ - case 1: __get_user_asm("bu"); break; \ - case 2: __get_user_asm("hu"); break; \ - case 4: __get_user_asm("" ); break; \ - default: __get_user_unknown(); break; \ - } \ - } \ - else { \ - __gu_err = -EFAULT; \ - __gu_val = 0; \ - } \ - x = (__typeof__(*(ptr))) __gu_val; \ - __gu_err; \ -}) - -#define __get_user_asm(INSN) \ -({ \ - asm volatile( \ - "1:\n" \ - " mov"INSN" %2,%1\n" \ - " mov 0,%0\n" \ - "2:\n" \ - " .section .fixup,\"ax\"\n" \ - "3:\n\t" \ - " mov %3,%0\n" \ - " jmp 2b\n" \ - " .previous\n" \ - " .section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 1b, 3b\n" \ - " .previous" \ - : "=&r" (__gu_err), "=&r" (__gu_val) \ - : "m" (__m(__gu_addr)), "i" (-EFAULT)); \ -}) - -extern int __get_user_unknown(void); - -#define __put_user_nocheck(x, ptr, size) \ -({ \ - union { \ - __typeof__(*(ptr)) val; \ - u32 bits[2]; \ - } __pu_val; \ - unsigned long __pu_addr; \ - int __pu_err; \ - __pu_val.val = (x); \ - __pu_addr = (unsigned long) (ptr); \ - switch (size) { \ - case 1: __put_user_asm("bu"); break; \ - case 2: __put_user_asm("hu"); break; \ - case 4: __put_user_asm("" ); break; \ - case 8: __put_user_asm8(); break; \ - default: __pu_err = __put_user_unknown(); break; \ - } \ - __pu_err; \ -}) - -#define __put_user_check(x, ptr, size) \ -({ \ - union { \ - __typeof__(*(ptr)) val; \ - u32 bits[2]; \ - } __pu_val; \ - unsigned long __pu_addr; \ - int __pu_err; \ - __pu_val.val = (x); \ - __pu_addr = (unsigned long) (ptr); \ - if (likely(__access_ok(__pu_addr, size))) { \ - switch (size) { \ - case 1: __put_user_asm("bu"); break; \ - case 2: __put_user_asm("hu"); break; \ - case 4: __put_user_asm("" ); break; \ - case 8: __put_user_asm8(); break; \ - default: __pu_err = __put_user_unknown(); break; \ - } \ - } \ - else { \ - __pu_err = -EFAULT; \ - } \ - __pu_err; \ -}) - -#define __put_user_asm(INSN) \ -({ \ - asm volatile( \ - "1:\n" \ - " mov"INSN" %1,%2\n" \ - " mov 0,%0\n" \ - "2:\n" \ - " .section .fixup,\"ax\"\n" \ - "3:\n" \ - " mov %3,%0\n" \ - " jmp 2b\n" \ - " .previous\n" \ - " .section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 1b, 3b\n" \ - " .previous" \ - : "=&r" (__pu_err) \ - : "r" (__pu_val.val), "m" (__m(__pu_addr)), \ - "i" (-EFAULT) \ - ); \ -}) - -#define __put_user_asm8() \ -({ \ - asm volatile( \ - "1: mov %1,%3 \n" \ - "2: mov %2,%4 \n" \ - " mov 0,%0 \n" \ - "3: \n" \ - " .section .fixup,\"ax\" \n" \ - "4: \n" \ - " mov %5,%0 \n" \ - " jmp 3b \n" \ - " .previous \n" \ - " .section __ex_table,\"a\"\n" \ - " .balign 4 \n" \ - " .long 1b, 4b \n" \ - " .long 2b, 4b \n" \ - " .previous \n" \ - : "=&r" (__pu_err) \ - : "r" (__pu_val.bits[0]), "r" (__pu_val.bits[1]), \ - "m" (__m(__pu_addr)), "m" (__m(__pu_addr+4)), \ - "i" (-EFAULT) \ - ); \ -}) - -extern int __put_user_unknown(void); - - -/* - * Copy To/From Userspace - */ -/* Generic arbitrary sized copy. */ -#define __copy_user(to, from, size) \ -do { \ - if (size) { \ - void *__to = to; \ - const void *__from = from; \ - int w; \ - asm volatile( \ - "0: movbu (%0),%3;\n" \ - "1: movbu %3,(%1);\n" \ - " inc %0;\n" \ - " inc %1;\n" \ - " add -1,%2;\n" \ - " bne 0b;\n" \ - "2:\n" \ - " .section .fixup,\"ax\"\n" \ - "3: jmp 2b\n" \ - " .previous\n" \ - " .section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - " .long 1b,3b\n" \ - " .previous\n" \ - : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ - : "0"(__from), "1"(__to), "2"(size) \ - : "memory"); \ - } \ -} while (0) - -#define __copy_user_zeroing(to, from, size) \ -do { \ - if (size) { \ - void *__to = to; \ - const void *__from = from; \ - int w; \ - asm volatile( \ - "0: movbu (%0),%3;\n" \ - "1: movbu %3,(%1);\n" \ - " inc %0;\n" \ - " inc %1;\n" \ - " add -1,%2;\n" \ - " bne 0b;\n" \ - "2:\n" \ - " .section .fixup,\"ax\"\n" \ - "3:\n" \ - " mov %2,%0\n" \ - " clr %3\n" \ - "4: movbu %3,(%1);\n" \ - " inc %1;\n" \ - " add -1,%2;\n" \ - " bne 4b;\n" \ - " mov %0,%2\n" \ - " jmp 2b\n" \ - " .previous\n" \ - " .section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - " .long 1b,3b\n" \ - " .previous\n" \ - : "=a"(__from), "=a"(__to), "=r"(size), "=&r"(w)\ - : "0"(__from), "1"(__to), "2"(size) \ - : "memory"); \ - } \ -} while (0) - -/* We let the __ versions of copy_from/to_user inline, because they're often - * used in fast paths and have only a small space overhead. - */ -static inline -unsigned long __generic_copy_from_user_nocheck(void *to, const void *from, - unsigned long n) -{ - __copy_user_zeroing(to, from, n); - return n; -} - -static inline -unsigned long __generic_copy_to_user_nocheck(void *to, const void *from, - unsigned long n) -{ - __copy_user(to, from, n); - return n; -} - - -#if 0 -#error don't use - these macros don't increment to & from pointers -/* Optimize just a little bit when we know the size of the move. */ -#define __constant_copy_user(to, from, size) \ -do { \ - asm volatile( \ - " mov %0,a0;\n" \ - "0: movbu (%1),d3;\n" \ - "1: movbu d3,(%2);\n" \ - " add -1,a0;\n" \ - " bne 0b;\n" \ - "2:;" \ - ".section .fixup,\"ax\"\n" \ - "3: jmp 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - " .long 1b,3b\n" \ - ".previous" \ - : \ - : "d"(size), "d"(to), "d"(from) \ - : "d3", "a0"); \ -} while (0) - -/* Optimize just a little bit when we know the size of the move. */ -#define __constant_copy_user_zeroing(to, from, size) \ -do { \ - asm volatile( \ - " mov %0,a0;\n" \ - "0: movbu (%1),d3;\n" \ - "1: movbu d3,(%2);\n" \ - " add -1,a0;\n" \ - " bne 0b;\n" \ - "2:;" \ - ".section .fixup,\"ax\"\n" \ - "3: jmp 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .balign 4\n" \ - " .long 0b,3b\n" \ - " .long 1b,3b\n" \ - ".previous" \ - : \ - : "d"(size), "d"(to), "d"(from) \ - : "d3", "a0"); \ -} while (0) - -static inline -unsigned long __constant_copy_to_user(void *to, const void *from, - unsigned long n) -{ - if (access_ok(VERIFY_WRITE, to, n)) - __constant_copy_user(to, from, n); - return n; -} - -static inline -unsigned long __constant_copy_from_user(void *to, const void *from, - unsigned long n) -{ - if (access_ok(VERIFY_READ, from, n)) - __constant_copy_user_zeroing(to, from, n); - return n; -} - -static inline -unsigned long __constant_copy_to_user_nocheck(void *to, const void *from, - unsigned long n) -{ - __constant_copy_user(to, from, n); - return n; -} - -static inline -unsigned long __constant_copy_from_user_nocheck(void *to, const void *from, - unsigned long n) -{ - __constant_copy_user_zeroing(to, from, n); - return n; -} -#endif - -extern unsigned long __generic_copy_to_user(void __user *, const void *, - unsigned long); -extern unsigned long __generic_copy_from_user(void *, const void __user *, - unsigned long); - -#define __copy_to_user_inatomic(to, from, n) \ - __generic_copy_to_user_nocheck((to), (from), (n)) -#define __copy_from_user_inatomic(to, from, n) \ - __generic_copy_from_user_nocheck((to), (from), (n)) - -#define __copy_to_user(to, from, n) \ -({ \ - might_sleep(); \ - __copy_to_user_inatomic((to), (from), (n)); \ -}) - -#define __copy_from_user(to, from, n) \ -({ \ - might_sleep(); \ - __copy_from_user_inatomic((to), (from), (n)); \ -}) - - -#define copy_to_user(to, from, n) __generic_copy_to_user((to), (from), (n)) -#define copy_from_user(to, from, n) __generic_copy_from_user((to), (from), (n)) - -extern long strncpy_from_user(char *dst, const char __user *src, long count); -extern long __strncpy_from_user(char *dst, const char __user *src, long count); -extern long strnlen_user(const char __user *str, long n); -#define strlen_user(str) strnlen_user(str, ~0UL >> 1) -extern unsigned long clear_user(void __user *mem, unsigned long len); -extern unsigned long __clear_user(void __user *mem, unsigned long len); - -#endif /* _ASM_UACCESS_H */ diff --git a/include/asm-mn10300/ucontext.h b/include/asm-mn10300/ucontext.h deleted file mode 100644 index fcab5c1..0000000 --- a/include/asm-mn10300/ucontext.h +++ /dev/null @@ -1,22 +0,0 @@ -/* MN10300 User context - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UCONTEXT_H -#define _ASM_UCONTEXT_H - -struct ucontext { - unsigned long uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext uc_mcontext; - sigset_t uc_sigmask; /* mask last for extensibility */ -}; - -#endif /* _ASM_UCONTEXT_H */ diff --git a/include/asm-mn10300/unaligned.h b/include/asm-mn10300/unaligned.h deleted file mode 100644 index 0df6713..0000000 --- a/include/asm-mn10300/unaligned.h +++ /dev/null @@ -1,20 +0,0 @@ -/* MN10300 Unaligned memory access handling - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_MN10300_UNALIGNED_H -#define _ASM_MN10300_UNALIGNED_H - -#include -#include - -#define get_unaligned __get_unaligned_le -#define put_unaligned __put_unaligned_le - -#endif /* _ASM_MN10300_UNALIGNED_H */ diff --git a/include/asm-mn10300/unistd.h b/include/asm-mn10300/unistd.h deleted file mode 100644 index 543a4f9..0000000 --- a/include/asm-mn10300/unistd.h +++ /dev/null @@ -1,390 +0,0 @@ -/* MN10300 System call number list - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNISTD_H -#define _ASM_UNISTD_H - -#define __NR_restart_syscall 0 -#define __NR_exit 1 -#define __NR_fork 2 -#define __NR_read 3 -#define __NR_write 4 -#define __NR_open 5 -#define __NR_close 6 -#define __NR_waitpid 7 -#define __NR_creat 8 -#define __NR_link 9 -#define __NR_unlink 10 -#define __NR_execve 11 -#define __NR_chdir 12 -#define __NR_time 13 -#define __NR_mknod 14 -#define __NR_chmod 15 -#define __NR_lchown 16 -#define __NR_break 17 -#define __NR_oldstat 18 -#define __NR_lseek 19 -#define __NR_getpid 20 -#define __NR_mount 21 -#define __NR_umount 22 -#define __NR_setuid 23 -#define __NR_getuid 24 -#define __NR_stime 25 -#define __NR_ptrace 26 -#define __NR_alarm 27 -#define __NR_oldfstat 28 -#define __NR_pause 29 -#define __NR_utime 30 -#define __NR_stty 31 -#define __NR_gtty 32 -#define __NR_access 33 -#define __NR_nice 34 -#define __NR_ftime 35 -#define __NR_sync 36 -#define __NR_kill 37 -#define __NR_rename 38 -#define __NR_mkdir 39 -#define __NR_rmdir 40 -#define __NR_dup 41 -#define __NR_pipe 42 -#define __NR_times 43 -#define __NR_prof 44 -#define __NR_brk 45 -#define __NR_setgid 46 -#define __NR_getgid 47 -#define __NR_signal 48 -#define __NR_geteuid 49 -#define __NR_getegid 50 -#define __NR_acct 51 -#define __NR_umount2 52 -#define __NR_lock 53 -#define __NR_ioctl 54 -#define __NR_fcntl 55 -#define __NR_mpx 56 -#define __NR_setpgid 57 -#define __NR_ulimit 58 -#define __NR_oldolduname 59 -#define __NR_umask 60 -#define __NR_chroot 61 -#define __NR_ustat 62 -#define __NR_dup2 63 -#define __NR_getppid 64 -#define __NR_getpgrp 65 -#define __NR_setsid 66 -#define __NR_sigaction 67 -#define __NR_sgetmask 68 -#define __NR_ssetmask 69 -#define __NR_setreuid 70 -#define __NR_setregid 71 -#define __NR_sigsuspend 72 -#define __NR_sigpending 73 -#define __NR_sethostname 74 -#define __NR_setrlimit 75 -#define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ -#define __NR_getrusage 77 -#define __NR_gettimeofday 78 -#define __NR_settimeofday 79 -#define __NR_getgroups 80 -#define __NR_setgroups 81 -#define __NR_select 82 -#define __NR_symlink 83 -#define __NR_oldlstat 84 -#define __NR_readlink 85 -#define __NR_uselib 86 -#define __NR_swapon 87 -#define __NR_reboot 88 -#define __NR_readdir 89 -#define __NR_mmap 90 -#define __NR_munmap 91 -#define __NR_truncate 92 -#define __NR_ftruncate 93 -#define __NR_fchmod 94 -#define __NR_fchown 95 -#define __NR_getpriority 96 -#define __NR_setpriority 97 -#define __NR_profil 98 -#define __NR_statfs 99 -#define __NR_fstatfs 100 -#define __NR_ioperm 101 -#define __NR_socketcall 102 -#define __NR_syslog 103 -#define __NR_setitimer 104 -#define __NR_getitimer 105 -#define __NR_stat 106 -#define __NR_lstat 107 -#define __NR_fstat 108 -#define __NR_olduname 109 -#define __NR_iopl 110 -#define __NR_vhangup 111 -#define __NR_idle 112 -#define __NR_vm86old 113 -#define __NR_wait4 114 -#define __NR_swapoff 115 -#define __NR_sysinfo 116 -#define __NR_ipc 117 -#define __NR_fsync 118 -#define __NR_sigreturn 119 -#define __NR_clone 120 -#define __NR_setdomainname 121 -#define __NR_uname 122 -#define __NR_modify_ldt 123 -#define __NR_adjtimex 124 -#define __NR_mprotect 125 -#define __NR_sigprocmask 126 -#define __NR_create_module 127 -#define __NR_init_module 128 -#define __NR_delete_module 129 -#define __NR_get_kernel_syms 130 -#define __NR_quotactl 131 -#define __NR_getpgid 132 -#define __NR_fchdir 133 -#define __NR_bdflush 134 -#define __NR_sysfs 135 -#define __NR_personality 136 -#define __NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define __NR_setfsuid 138 -#define __NR_setfsgid 139 -#define __NR__llseek 140 -#define __NR_getdents 141 -#define __NR__newselect 142 -#define __NR_flock 143 -#define __NR_msync 144 -#define __NR_readv 145 -#define __NR_writev 146 -#define __NR_getsid 147 -#define __NR_fdatasync 148 -#define __NR__sysctl 149 -#define __NR_mlock 150 -#define __NR_munlock 151 -#define __NR_mlockall 152 -#define __NR_munlockall 153 -#define __NR_sched_setparam 154 -#define __NR_sched_getparam 155 -#define __NR_sched_setscheduler 156 -#define __NR_sched_getscheduler 157 -#define __NR_sched_yield 158 -#define __NR_sched_get_priority_max 159 -#define __NR_sched_get_priority_min 160 -#define __NR_sched_rr_get_interval 161 -#define __NR_nanosleep 162 -#define __NR_mremap 163 -#define __NR_setresuid 164 -#define __NR_getresuid 165 -#define __NR_vm86 166 -#define __NR_query_module 167 -#define __NR_poll 168 -#define __NR_nfsservctl 169 -#define __NR_setresgid 170 -#define __NR_getresgid 171 -#define __NR_prctl 172 -#define __NR_rt_sigreturn 173 -#define __NR_rt_sigaction 174 -#define __NR_rt_sigprocmask 175 -#define __NR_rt_sigpending 176 -#define __NR_rt_sigtimedwait 177 -#define __NR_rt_sigqueueinfo 178 -#define __NR_rt_sigsuspend 179 -#define __NR_pread64 180 -#define __NR_pwrite64 181 -#define __NR_chown 182 -#define __NR_getcwd 183 -#define __NR_capget 184 -#define __NR_capset 185 -#define __NR_sigaltstack 186 -#define __NR_sendfile 187 -#define __NR_getpmsg 188 /* some people actually want streams */ -#define __NR_putpmsg 189 /* some people actually want streams */ -#define __NR_vfork 190 -#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define __NR_mmap2 192 -#define __NR_truncate64 193 -#define __NR_ftruncate64 194 -#define __NR_stat64 195 -#define __NR_lstat64 196 -#define __NR_fstat64 197 -#define __NR_lchown32 198 -#define __NR_getuid32 199 -#define __NR_getgid32 200 -#define __NR_geteuid32 201 -#define __NR_getegid32 202 -#define __NR_setreuid32 203 -#define __NR_setregid32 204 -#define __NR_getgroups32 205 -#define __NR_setgroups32 206 -#define __NR_fchown32 207 -#define __NR_setresuid32 208 -#define __NR_getresuid32 209 -#define __NR_setresgid32 210 -#define __NR_getresgid32 211 -#define __NR_chown32 212 -#define __NR_setuid32 213 -#define __NR_setgid32 214 -#define __NR_setfsuid32 215 -#define __NR_setfsgid32 216 -#define __NR_pivot_root 217 -#define __NR_mincore 218 -#define __NR_madvise 219 -#define __NR_madvise1 219 /* delete when C lib stub is removed */ -#define __NR_getdents64 220 -#define __NR_fcntl64 221 -/* 223 is unused */ -#define __NR_gettid 224 -#define __NR_readahead 225 -#define __NR_setxattr 226 -#define __NR_lsetxattr 227 -#define __NR_fsetxattr 228 -#define __NR_getxattr 229 -#define __NR_lgetxattr 230 -#define __NR_fgetxattr 231 -#define __NR_listxattr 232 -#define __NR_llistxattr 233 -#define __NR_flistxattr 234 -#define __NR_removexattr 235 -#define __NR_lremovexattr 236 -#define __NR_fremovexattr 237 -#define __NR_tkill 238 -#define __NR_sendfile64 239 -#define __NR_futex 240 -#define __NR_sched_setaffinity 241 -#define __NR_sched_getaffinity 242 -#define __NR_set_thread_area 243 -#define __NR_get_thread_area 244 -#define __NR_io_setup 245 -#define __NR_io_destroy 246 -#define __NR_io_getevents 247 -#define __NR_io_submit 248 -#define __NR_io_cancel 249 -#define __NR_fadvise64 250 - -#define __NR_exit_group 252 -#define __NR_lookup_dcookie 253 -#define __NR_epoll_create 254 -#define __NR_epoll_ctl 255 -#define __NR_epoll_wait 256 -#define __NR_remap_file_pages 257 -#define __NR_set_tid_address 258 -#define __NR_timer_create 259 -#define __NR_timer_settime (__NR_timer_create+1) -#define __NR_timer_gettime (__NR_timer_create+2) -#define __NR_timer_getoverrun (__NR_timer_create+3) -#define __NR_timer_delete (__NR_timer_create+4) -#define __NR_clock_settime (__NR_timer_create+5) -#define __NR_clock_gettime (__NR_timer_create+6) -#define __NR_clock_getres (__NR_timer_create+7) -#define __NR_clock_nanosleep (__NR_timer_create+8) -#define __NR_statfs64 268 -#define __NR_fstatfs64 269 -#define __NR_tgkill 270 -#define __NR_utimes 271 -#define __NR_fadvise64_64 272 -#define __NR_vserver 273 -#define __NR_mbind 274 -#define __NR_get_mempolicy 275 -#define __NR_set_mempolicy 276 -#define __NR_mq_open 277 -#define __NR_mq_unlink (__NR_mq_open+1) -#define __NR_mq_timedsend (__NR_mq_open+2) -#define __NR_mq_timedreceive (__NR_mq_open+3) -#define __NR_mq_notify (__NR_mq_open+4) -#define __NR_mq_getsetattr (__NR_mq_open+5) -#define __NR_kexec_load 283 -#define __NR_waitid 284 -#define __NR_add_key 286 -#define __NR_request_key 287 -#define __NR_keyctl 288 -#define __NR_cacheflush 289 -#define __NR_ioprio_set 290 -#define __NR_ioprio_get 291 -#define __NR_inotify_init 292 -#define __NR_inotify_add_watch 293 -#define __NR_inotify_rm_watch 294 -#define __NR_migrate_pages 295 -#define __NR_openat 296 -#define __NR_mkdirat 297 -#define __NR_mknodat 298 -#define __NR_fchownat 299 -#define __NR_futimesat 300 -#define __NR_fstatat64 301 -#define __NR_unlinkat 302 -#define __NR_renameat 303 -#define __NR_linkat 304 -#define __NR_symlinkat 305 -#define __NR_readlinkat 306 -#define __NR_fchmodat 307 -#define __NR_faccessat 308 -#define __NR_pselect6 309 -#define __NR_ppoll 310 -#define __NR_unshare 311 -#define __NR_set_robust_list 312 -#define __NR_get_robust_list 313 -#define __NR_splice 314 -#define __NR_sync_file_range 315 -#define __NR_tee 316 -#define __NR_vmsplice 317 -#define __NR_move_pages 318 -#define __NR_getcpu 319 -#define __NR_epoll_pwait 320 -#define __NR_utimensat 321 -#define __NR_signalfd 322 -#define __NR_timerfd_create 323 -#define __NR_eventfd 324 -#define __NR_fallocate 325 -#define __NR_timerfd_settime 326 -#define __NR_timerfd_gettime 327 -#define __NR_signalfd4 328 -#define __NR_eventfd2 329 -#define __NR_epoll_create1 330 -#define __NR_dup3 331 -#define __NR_pipe2 332 -#define __NR_inotify_init1 333 - -#ifdef __KERNEL__ - -#define NR_syscalls 326 - -/* - * specify the deprecated syscalls we want to support on this arch - */ -#define __ARCH_WANT_IPC_PARSE_VERSION -#define __ARCH_WANT_OLD_READDIR -#define __ARCH_WANT_OLD_STAT -#define __ARCH_WANT_STAT64 -#define __ARCH_WANT_SYS_ALARM -#define __ARCH_WANT_SYS_GETHOSTNAME -#define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK -#define __ARCH_WANT_SYS_SIGNAL -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_SYS_UTIME -#define __ARCH_WANT_SYS_WAITPID -#define __ARCH_WANT_SYS_SOCKETCALL -#define __ARCH_WANT_SYS_FADVISE64 -#define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_NICE -#define __ARCH_WANT_SYS_OLD_GETRLIMIT -#define __ARCH_WANT_SYS_OLDUMOUNT -#define __ARCH_WANT_SYS_SIGPENDING -#define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -#endif - -#endif /* __KERNEL__ */ -#endif /* _ASM_UNISTD_H */ diff --git a/include/asm-mn10300/unit-asb2303/clock.h b/include/asm-mn10300/unit-asb2303/clock.h deleted file mode 100644 index 8b450e9..0000000 --- a/include/asm-mn10300/unit-asb2303/clock.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ASB2303-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_CLOCK_H -#define _ASM_UNIT_CLOCK_H - -#ifndef __ASSEMBLY__ - -#ifdef CONFIG_MN10300_RTC - -extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ -extern unsigned long mn10300_iobclk; -extern unsigned long mn10300_tsc_per_HZ; - -#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) -/* If this processors has a another clock, uncomment the below. */ -/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ - -#else /* !CONFIG_MN10300_RTC */ - -#define MN10300_IOCLK 33333333UL -/* #define MN10300_IOBCLK 66666666UL */ - -#endif /* !CONFIG_MN10300_RTC */ - -#define MN10300_JCCLK MN10300_IOCLK -#define MN10300_TSCCLK MN10300_IOCLK - -#ifdef CONFIG_MN10300_RTC -#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) -#else /* !CONFIG_MN10300_RTC */ -#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) -#endif /* !CONFIG_MN10300_RTC */ - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/include/asm-mn10300/unit-asb2303/leds.h b/include/asm-mn10300/unit-asb2303/leds.h deleted file mode 100644 index 3a7543e..0000000 --- a/include/asm-mn10300/unit-asb2303/leds.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ASB2303-specific LEDs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_LEDS_H -#define _ASM_UNIT_LEDS_H - -#include -#include -#include - -#define ASB2303_GPIO0DEF __SYSREG(0xDB000000, u32) -#define ASB2303_7SEGLEDS __SYSREG(0xDB000008, u32) - -/* - * use the 7-segment LEDs to indicate states - */ - -/* flip the 7-segment LEDs between "G" and "-" */ -#define mn10300_set_gdbleds(ONOFF) \ -do { \ - ASB2303_7SEGLEDS = (ONOFF) ? 0x85 : 0x7f; \ -} while (0) - -/* indicate double-fault by displaying "d" on the LEDs */ -#define mn10300_set_dbfleds \ - mov 0x43,d0 ; \ - movbu d0,(ASB2303_7SEGLEDS) - -#ifndef __ASSEMBLY__ -extern void peripheral_leds_display_exception(enum exception_code code); -extern void peripheral_leds_led_chase(void); -extern void debug_to_serial(const char *p, int n); -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_UNIT_LEDS_H */ diff --git a/include/asm-mn10300/unit-asb2303/serial.h b/include/asm-mn10300/unit-asb2303/serial.h deleted file mode 100644 index 0d55cf5..0000000 --- a/include/asm-mn10300/unit-asb2303/serial.h +++ /dev/null @@ -1,136 +0,0 @@ -/* ASB2303-specific 8250 serial ports - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_SERIAL_H -#define _ASM_UNIT_SERIAL_H - -#include -#include -#include - -#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 -#define SERIAL_PORT1_BASE_ADDRESS 0xA6FC0000 - -#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ - -/* - * dispose of the /dev/ttyS0 and /dev/ttyS1 serial ports - */ -#ifndef CONFIG_GDBSTUB_ON_TTYSx - -#define SERIAL_PORT_DFNS \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT1_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, - -#ifndef __ASSEMBLY__ - -static inline void __debug_to_serial(const char *p, int n) -{ -} - -#endif /* !__ASSEMBLY__ */ - -#else /* CONFIG_GDBSTUB_ON_TTYSx */ - -#define SERIAL_PORT_DFNS /* both stolen by gdb-stub because they share an IRQ */ - -#if defined(CONFIG_GDBSTUB_ON_TTYS0) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ - -#elif defined(CONFIG_GDBSTUB_ON_TTYS1) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ -#endif - -#ifndef __ASSEMBLY__ - -#define LSR_WAIT_FOR(STATE) \ -do { \ - while (!(GDBPORT_SERIAL_LSR & UART_LSR_##STATE)) {} \ -} while (0) -#define FLOWCTL_WAIT_FOR(LINE) \ -do { \ - while (!(GDBPORT_SERIAL_MSR & UART_MSR_##LINE)) {} \ -} while (0) -#define FLOWCTL_CLEAR(LINE) \ -do { \ - GDBPORT_SERIAL_MCR &= ~UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_SET(LINE) \ -do { \ - GDBPORT_SERIAL_MCR |= UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_QUERY(LINE) ({ GDBPORT_SERIAL_MSR & UART_MSR_##LINE; }) - -static inline void __debug_to_serial(const char *p, int n) -{ - char ch; - - FLOWCTL_SET(DTR); - - for (; n > 0; n--) { - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - - ch = *p++; - if (ch == 0x0a) { - GDBPORT_SERIAL_TX = 0x0d; - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - } - GDBPORT_SERIAL_TX = ch; - } - - FLOWCTL_CLEAR(DTR); -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* CONFIG_GDBSTUB_ON_TTYSx */ - -#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/include/asm-mn10300/unit-asb2303/smc91111.h b/include/asm-mn10300/unit-asb2303/smc91111.h deleted file mode 100644 index dd456e9..0000000 --- a/include/asm-mn10300/unit-asb2303/smc91111.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Support for the SMC91C111 NIC on an ASB2303 - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_SMC91111_H -#define _ASM_UNIT_SMC91111_H - -#include - -#define SMC91111_BASE 0xAA000300UL -#define SMC91111_BASE_END 0xAA000400UL -#define SMC91111_IRQ XIRQ3 - -#define SMC_CAN_USE_8BIT 0 -#define SMC_CAN_USE_16BIT 1 -#define SMC_CAN_USE_32BIT 0 -#define SMC_NOWAIT 1 -#define SMC_IRQ_FLAGS (0) - -#if SMC_CAN_USE_8BIT -#define SMC_inb(a, r) inb((unsigned long) ((a) + (r))) -#define SMC_outb(v, a, r) outb(v, (unsigned long) ((a) + (r))) -#endif - -#if SMC_CAN_USE_16BIT -#define SMC_inw(a, r) inw((unsigned long) ((a) + (r))) -#define SMC_outw(v, a, r) outw(v, (unsigned long) ((a) + (r))) -#define SMC_insw(a, r, p, l) insw((unsigned long) ((a) + (r)), (p), (l)) -#define SMC_outsw(a, r, p, l) outsw((unsigned long) ((a) + (r)), (p), (l)) -#endif - -#if SMC_CAN_USE_32BIT -#define SMC_inl(a, r) inl((unsigned long) ((a) + (r))) -#define SMC_outl(v, a, r) outl(v, (unsigned long) ((a) + (r))) -#define SMC_insl(a, r, p, l) insl((unsigned long) ((a) + (r)), (p), (l)) -#define SMC_outsl(a, r, p, l) outsl((unsigned long) ((a) + (r)), (p), (l)) -#endif - -#define RPC_LSA_DEFAULT RPC_LED_100_10 -#define RPC_LSB_DEFAULT RPC_LED_TX_RX - -#define set_irq_type(irq, type) - -#endif /* _ASM_UNIT_SMC91111_H */ diff --git a/include/asm-mn10300/unit-asb2303/timex.h b/include/asm-mn10300/unit-asb2303/timex.h deleted file mode 100644 index 7e54b0cf..0000000 --- a/include/asm-mn10300/unit-asb2303/timex.h +++ /dev/null @@ -1,135 +0,0 @@ -/* ASB2303-specific timer specifcations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_TIMEX_H -#define _ASM_UNIT_TIMEX_H - -#ifndef __ASSEMBLY__ -#include -#endif /* __ASSEMBLY__ */ - -#include -#include - -/* - * jiffies counter specifications - */ - -#define TMJCBR_MAX 0xffff -#define TMJCBC TM01BC - -#define TMJCMD TM01MD -#define TMJCBR TM01BR -#define TMJCIRQ TM1IRQ -#define TMJCICR TM1ICR -#define TMJCICR_LEVEL GxICR_LEVEL_5 - -#ifndef __ASSEMBLY__ - -static inline void startup_jiffies_counter(void) -{ - unsigned rate; - u16 md, t16; - - /* use as little prescaling as possible to avoid losing accuracy */ - md = TM0MD_SRC_IOCLK; - rate = MN10300_JCCLK / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_8; - rate = MN10300_JCCLK / 8 / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_32; - rate = MN10300_JCCLK / 32 / HZ; - - if (rate > TMJCBR_MAX) - BUG(); - } - } - - TMJCBR = rate - 1; - t16 = TMJCBR; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_INIT_COUNTER | - TM1MD_INIT_COUNTER << 8; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_COUNT_ENABLE | - TM1MD_COUNT_ENABLE << 8; - - t16 = TMJCMD; - - TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; - t16 = TMJCICR; -} - -static inline void shutdown_jiffies_counter(void) -{ -} - -#endif /* !__ASSEMBLY__ */ - - -/* - * timestamp counter specifications - */ - -#define TMTSCBR_MAX 0xffffffff -#define TMTSCBC TM45BC - -#ifndef __ASSEMBLY__ - -static inline void startup_timestamp_counter(void) -{ - /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time - * - count down from 4Gig-1 to 0 and wrap at IOCLK rate - */ - TM45BR = TMTSCBR_MAX; - - TM4MD = TM4MD_SRC_IOCLK; - TM4MD |= TM4MD_INIT_COUNTER; - TM4MD &= ~TM4MD_INIT_COUNTER; - TM4ICR = 0; - - TM5MD = TM5MD_SRC_TM4CASCADE; - TM5MD |= TM5MD_INIT_COUNTER; - TM5MD &= ~TM5MD_INIT_COUNTER; - TM5ICR = 0; - - TM5MD |= TM5MD_COUNT_ENABLE; - TM4MD |= TM4MD_COUNT_ENABLE; -} - -static inline void shutdown_timestamp_counter(void) -{ - TM4MD = 0; - TM5MD = 0; -} - -/* - * we use a cascaded pair of 16-bit down-counting timers to count I/O - * clock cycles for the purposes of time keeping - */ -typedef unsigned long cycles_t; - -static inline cycles_t read_timestamp_counter(void) -{ - return (cycles_t)TMTSCBC; -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/include/asm-mn10300/unit-asb2305/clock.h b/include/asm-mn10300/unit-asb2305/clock.h deleted file mode 100644 index 7d51484..0000000 --- a/include/asm-mn10300/unit-asb2305/clock.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ASB2305-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_CLOCK_H -#define _ASM_UNIT_CLOCK_H - -#ifndef __ASSEMBLY__ - -#ifdef CONFIG_MN10300_RTC - -extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ -extern unsigned long mn10300_iobclk; -extern unsigned long mn10300_tsc_per_HZ; - -#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) -/* If this processors has a another clock, uncomment the below. */ -/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ - -#else /* !CONFIG_MN10300_RTC */ - -#define MN10300_IOCLK 33333333UL -/* #define MN10300_IOBCLK 66666666UL */ - -#endif /* !CONFIG_MN10300_RTC */ - -#define MN10300_JCCLK MN10300_IOCLK -#define MN10300_TSCCLK MN10300_IOCLK - -#ifdef CONFIG_MN10300_RTC -#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) -#else /* !CONFIG_MN10300_RTC */ -#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) -#endif /* !CONFIG_MN10300_RTC */ - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/include/asm-mn10300/unit-asb2305/leds.h b/include/asm-mn10300/unit-asb2305/leds.h deleted file mode 100644 index bc471f6..0000000 --- a/include/asm-mn10300/unit-asb2305/leds.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ASB2305-specific LEDs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_LEDS_H -#define _ASM_UNIT_LEDS_H - -#include -#include -#include - -#define ASB2305_7SEGLEDS __SYSREG(0xA6F90000, u32) - -/* perform a hard reset by driving PIO06 low */ -#define mn10300_unit_hard_reset() \ -do { \ - P0OUT &= 0xbf; \ - P0MD = (P0MD & P0MD_6) | P0MD_6_OUT; \ -} while (0) - -/* - * use the 7-segment LEDs to indicate states - */ -/* indicate double-fault by displaying "db-f" on the LEDs */ -#define mn10300_set_dbfleds \ - mov 0x43077f1d,d0 ; \ - mov d0,(ASB2305_7SEGLEDS) - -/* flip the 7-segment LEDs between "Gdb-" and "----" */ -#define mn10300_set_gdbleds(ONOFF) \ -do { \ - ASB2305_7SEGLEDS = (ONOFF) ? 0x8543077f : 0x7f7f7f7f; \ -} while (0) - -#ifndef __ASSEMBLY__ -extern void peripheral_leds_display_exception(enum exception_code); -extern void peripheral_leds_led_chase(void); -extern void peripheral_leds7x4_display_dec(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_hex(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_minssecs(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_rtc(void); -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_UNIT_LEDS_H */ diff --git a/include/asm-mn10300/unit-asb2305/serial.h b/include/asm-mn10300/unit-asb2305/serial.h deleted file mode 100644 index 73d31d6..0000000 --- a/include/asm-mn10300/unit-asb2305/serial.h +++ /dev/null @@ -1,120 +0,0 @@ -/* ASB2305-specific 8250 serial ports - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_SERIAL_H -#define _ASM_UNIT_SERIAL_H - -#include -#include -#include - -#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 -#define ASB2305_DEBUG_MCR __SYSREG(0xA6FB0000 + UART_MCR * 2, u8) - -#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ - -/* - * dispose of the /dev/ttyS0 serial port - */ -#ifndef CONFIG_GDBSTUB_ON_TTYSx - -#define SERIAL_PORT_DFNS \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, - -#ifndef __ASSEMBLY__ - -static inline void __debug_to_serial(const char *p, int n) -{ -} - -#endif /* !__ASSEMBLY__ */ - -#else /* CONFIG_GDBSTUB_ON_TTYSx */ - -#define SERIAL_PORT_DFNS /* stolen by gdb-stub */ - -#if defined(CONFIG_GDBSTUB_ON_TTYS0) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ - -#elif defined(CONFIG_GDBSTUB_ON_TTYS1) -#error The ASB2305 doesnt have a /dev/ttyS1 -#endif - -#ifndef __ASSEMBLY__ - -#define TTYS0_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define TTYS0_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define TTYS0_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define TTYS0_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) - -#define LSR_WAIT_FOR(STATE) \ -do { \ - while (!(TTYS0_LSR & UART_LSR_##STATE)) {} \ -} while (0) -#define FLOWCTL_WAIT_FOR(LINE) \ -do { \ - while (!(TTYS0_MSR & UART_MSR_##LINE)) {} \ -} while (0) -#define FLOWCTL_CLEAR(LINE) \ -do { \ - TTYS0_MCR &= ~UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_SET(LINE) \ -do { \ - TTYS0_MCR |= UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_QUERY(LINE) ({ TTYS0_MSR & UART_MSR_##LINE; }) - -static inline void __debug_to_serial(const char *p, int n) -{ - char ch; - - FLOWCTL_SET(DTR); - - for (; n > 0; n--) { - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - - ch = *p++; - if (ch == 0x0a) { - TTYS0_TX = 0x0d; - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - } - TTYS0_TX = ch; - } - - FLOWCTL_CLEAR(DTR); -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* CONFIG_GDBSTUB_ON_TTYSx */ - -#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/include/asm-mn10300/unit-asb2305/timex.h b/include/asm-mn10300/unit-asb2305/timex.h deleted file mode 100644 index 10e1bfe3..0000000 --- a/include/asm-mn10300/unit-asb2305/timex.h +++ /dev/null @@ -1,135 +0,0 @@ -/* ASB2305 timer specifcations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_TIMEX_H -#define _ASM_UNIT_TIMEX_H - -#ifndef __ASSEMBLY__ -#include -#endif /* __ASSEMBLY__ */ - -#include -#include - -/* - * jiffies counter specifications - */ - -#define TMJCBR_MAX 0xffff -#define TMJCBC TM01BC - -#define TMJCMD TM01MD -#define TMJCBR TM01BR -#define TMJCIRQ TM1IRQ -#define TMJCICR TM1ICR -#define TMJCICR_LEVEL GxICR_LEVEL_5 - -#ifndef __ASSEMBLY__ - -static inline void startup_jiffies_counter(void) -{ - unsigned rate; - u16 md, t16; - - /* use as little prescaling as possible to avoid losing accuracy */ - md = TM0MD_SRC_IOCLK; - rate = MN10300_JCCLK / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_8; - rate = MN10300_JCCLK / 8 / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_32; - rate = MN10300_JCCLK / 32 / HZ; - - if (rate > TMJCBR_MAX) - BUG(); - } - } - - TMJCBR = rate - 1; - t16 = TMJCBR; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_INIT_COUNTER | - TM1MD_INIT_COUNTER << 8; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_COUNT_ENABLE | - TM1MD_COUNT_ENABLE << 8; - - t16 = TMJCMD; - - TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; - t16 = TMJCICR; -} - -static inline void shutdown_jiffies_counter(void) -{ -} - -#endif /* !__ASSEMBLY__ */ - - -/* - * timestamp counter specifications - */ - -#define TMTSCBR_MAX 0xffffffff -#define TMTSCBC TM45BC - -#ifndef __ASSEMBLY__ - -static inline void startup_timestamp_counter(void) -{ - /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time - * - count down from 4Gig-1 to 0 and wrap at IOCLK rate - */ - TM45BR = TMTSCBR_MAX; - - TM4MD = TM4MD_SRC_IOCLK; - TM4MD |= TM4MD_INIT_COUNTER; - TM4MD &= ~TM4MD_INIT_COUNTER; - TM4ICR = 0; - - TM5MD = TM5MD_SRC_TM4CASCADE; - TM5MD |= TM5MD_INIT_COUNTER; - TM5MD &= ~TM5MD_INIT_COUNTER; - TM5ICR = 0; - - TM5MD |= TM5MD_COUNT_ENABLE; - TM4MD |= TM4MD_COUNT_ENABLE; -} - -static inline void shutdown_timestamp_counter(void) -{ - TM4MD = 0; - TM5MD = 0; -} - -/* - * we use a cascaded pair of 16-bit down-counting timers to count I/O - * clock cycles for the purposes of time keeping - */ -typedef unsigned long cycles_t; - -static inline cycles_t read_timestamp_counter(void) -{ - return (cycles_t) TMTSCBC; -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/include/asm-mn10300/user.h b/include/asm-mn10300/user.h deleted file mode 100644 index e119390..0000000 --- a/include/asm-mn10300/user.h +++ /dev/null @@ -1,53 +0,0 @@ -/* MN10300 User process data - * - * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_USER_H -#define _ASM_USER_H - -#include -#include - -#ifndef __ASSEMBLY__ -/* - * When the kernel dumps core, it starts by dumping the user struct - this will - * be used by gdb to figure out where the data and stack segments are within - * the file, and what virtual addresses to use. - */ -struct user { - /* We start with the registers, to mimic the way that "memory" is - * returned from the ptrace(3,...) function. - */ - struct pt_regs regs; /* Where the registers are actually stored */ - - /* The rest of this junk is to help gdb figure out what goes where */ - unsigned long int u_tsize; /* Text segment size (pages). */ - unsigned long int u_dsize; /* Data segment size (pages). */ - unsigned long int u_ssize; /* Stack segment size (pages). */ - unsigned long start_code; /* Starting virtual address of text. */ - unsigned long start_stack; /* Starting virtual address of stack area. - This is actually the bottom of the stack, - the top of the stack is always found in the - esp register. */ - long int signal; /* Signal that caused the core dump. */ - int reserved; /* No longer used */ - struct user_pt_regs *u_ar0; /* Used by gdb to help find the values for */ - - /* the registers */ - unsigned long magic; /* To uniquely identify a core file */ - char u_comm[32]; /* User command that was responsible */ -}; -#endif - -#define NBPG PAGE_SIZE -#define UPAGES 1 -#define HOST_TEXT_START_ADDR +(u.start_code) -#define HOST_STACK_END_ADDR +(u.start_stack + u.u_ssize * NBPG) - -#endif /* _ASM_USER_H */ diff --git a/include/asm-mn10300/vga.h b/include/asm-mn10300/vga.h deleted file mode 100644 index 0163e50..0000000 --- a/include/asm-mn10300/vga.h +++ /dev/null @@ -1,17 +0,0 @@ -/* MN10300 VGA register definitions - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_VGA_H -#define _ASM_VGA_H - - - -#endif /* _ASM_VGA_H */ diff --git a/include/asm-mn10300/xor.h b/include/asm-mn10300/xor.h deleted file mode 100644 index c82eb12..0000000 --- a/include/asm-mn10300/xor.h +++ /dev/null @@ -1 +0,0 @@ -#include -- cgit v0.10.2 From 2f2a2132ff056bb45697dc855eb4fd95b70b38cb Mon Sep 17 00:00:00 2001 From: David Howells Date: Fri, 10 Apr 2009 14:33:48 +0100 Subject: Separate out the proc- and unit-specific header directories from the general MN10300 arch headers and place them instead in the same directories as contain the .c files for the processor and unit implementations. This permits the symlinks include/asm/proc and include/asm/unit to be dispensed with. This does, however, require that #include be converted to #include and similarly for asm/unit -> unit. Signed-off-by: David Howells diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile index a5985ee..dd0c8ff 100644 --- a/arch/mn10300/Makefile +++ b/arch/mn10300/Makefile @@ -94,42 +94,8 @@ ifdef CONFIG_DEBUG_INFO KBUILD_AFLAGS += -Wa,--gdwarf2 endif -################################################################################################### # -# juggle some symlinks in the MN10300 asm include dir +# include the appropriate processor- and unit-specific headers # -# Update machine proc and unit symlinks if something which affects -# them changed. We use .proc / .unit to indicate when they were -# updated last, otherwise make uses the target directory mtime. -# -################################################################################################### - -# processor specific definitions -arch/mn10300/include/asm/.proc: $(wildcard include/config/proc/*.h) include/config/auto.conf - @echo ' SYMLINK arch/mn10300/include/asm/proc -> arch/mn10300/include/asm/proc-$(PROCESSOR)' -ifneq ($(KBUILD_SRC),) - $(Q)mkdir -p arch/mn10300/include/asm - $(Q)ln -fsn $(srctree)/arch/mn10300/include/asm/proc-$(PROCESSOR) arch/mn10300/include/asm/proc -else - $(Q)ln -fsn proc-$(PROCESSOR) arch/mn10300/include/asm/proc -endif - @touch $@ - -CLEAN_FILES += arch/mn10300/include/asm/proc arch/mn10300/include/asm/.proc - -prepare: arch/mn10300/include/asm/.proc - -# unit specific definitions -arch/mn10300/include/asm/.unit: $(wildcard include/config/unit/*.h) include/config/auto.conf - @echo ' SYMLINK arch/mn10300/include/asm/unit -> arch/mn10300/include/asm/unit-$(UNIT)' -ifneq ($(KBUILD_SRC),) - $(Q)mkdir -p arch/mn10300/include/asm - $(Q)ln -fsn $(srctree)/arch/mn10300/include/asm/unit-$(UNIT) arch/mn10300/include/asm/unit -else - $(Q)ln -fsn unit-$(UNIT) arch/mn10300/include/asm/unit -endif - @touch $@ - -CLEAN_FILES += arch/mn10300/include/asm/unit arch/mn10300/include/asm/.unit - -prepare: arch/mn10300/include/asm/.unit +KBUILD_CPPFLAGS += -I$(srctree)/arch/mn10300/proc-$(PROCESSOR)/include +KBUILD_CPPFLAGS += -I$(srctree)/arch/mn10300/unit-$(UNIT)/include diff --git a/arch/mn10300/include/asm/cache.h b/arch/mn10300/include/asm/cache.h index 9e01122..e03cfa2 100644 --- a/arch/mn10300/include/asm/cache.h +++ b/arch/mn10300/include/asm/cache.h @@ -13,7 +13,7 @@ #define _ASM_CACHE_H #include -#include +#include #ifndef __ASSEMBLY__ #define L1_CACHE_DISPARITY (L1_CACHE_NENTRIES * L1_CACHE_BYTES) diff --git a/arch/mn10300/include/asm/irq.h b/arch/mn10300/include/asm/irq.h index 53b3801..25c045d 100644 --- a/arch/mn10300/include/asm/irq.h +++ b/arch/mn10300/include/asm/irq.h @@ -16,7 +16,7 @@ #include #include -#include +#include /* this number is used when no interrupt has been assigned */ #define NO_IRQ INT_MAX diff --git a/arch/mn10300/include/asm/proc-mn103e010/cache.h b/arch/mn10300/include/asm/proc-mn103e010/cache.h deleted file mode 100644 index bdc1f9a..0000000 --- a/arch/mn10300/include/asm/proc-mn103e010/cache.h +++ /dev/null @@ -1,33 +0,0 @@ -/* MN103E010 Cache specification - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PROC_CACHE_H -#define _ASM_PROC_CACHE_H - -/* L1 cache */ - -#define L1_CACHE_NWAYS 4 /* number of ways in caches */ -#define L1_CACHE_NENTRIES 256 /* number of entries in each way */ -#define L1_CACHE_BYTES 16 /* bytes per entry */ -#define L1_CACHE_SHIFT 4 /* shift for bytes per entry */ -#define L1_CACHE_WAYDISP 0x1000 /* displacement of one way from the next */ - -#define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ -#define L1_CACHE_TAG_DIRTY 0x00000008 /* data cache tag dirty bit */ -#define L1_CACHE_TAG_ENTRY 0x00000ff0 /* cache tag entry address mask */ -#define L1_CACHE_TAG_ADDRESS 0xfffff000 /* cache tag line address mask */ - -/* - * specification of the interval between interrupt checking intervals whilst - * managing the cache with the interrupts disabled - */ -#define MN10300_DCACHE_INV_RANGE_INTR_LOG2_INTERVAL 4 - -#endif /* _ASM_PROC_CACHE_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/clock.h b/arch/mn10300/include/asm/proc-mn103e010/clock.h deleted file mode 100644 index caf9983..0000000 --- a/arch/mn10300/include/asm/proc-mn103e010/clock.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MN103E010-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_PROC_CLOCK_H -#define _ASM_PROC_CLOCK_H - -#include - -#define MN10300_WDCLK MN10300_IOCLK - -#endif /* _ASM_PROC_CLOCK_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/irq.h b/arch/mn10300/include/asm/proc-mn103e010/irq.h deleted file mode 100644 index aa6ee8f..0000000 --- a/arch/mn10300/include/asm/proc-mn103e010/irq.h +++ /dev/null @@ -1,34 +0,0 @@ -/* MN103E010 On-board interrupt controller numbers - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_PROC_IRQ_H -#define _ASM_PROC_IRQ_H - -#ifdef __KERNEL__ - -#define GxICR_NUM_IRQS 42 - -#define GxICR_NUM_XIRQS 8 - -#define XIRQ0 34 -#define XIRQ1 35 -#define XIRQ2 36 -#define XIRQ3 37 -#define XIRQ4 38 -#define XIRQ5 39 -#define XIRQ6 40 -#define XIRQ7 41 - -#define XIRQ2IRQ(num) (XIRQ0 + num) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_PROC_IRQ_H */ diff --git a/arch/mn10300/include/asm/proc-mn103e010/proc.h b/arch/mn10300/include/asm/proc-mn103e010/proc.h deleted file mode 100644 index 22a2b93..0000000 --- a/arch/mn10300/include/asm/proc-mn103e010/proc.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MN103E010 Processor description - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_PROC_PROC_H -#define _ASM_PROC_PROC_H - -#define PROCESSOR_VENDOR_NAME "Matsushita" -#define PROCESSOR_MODEL_NAME "mn103e010" - -#endif /* _ASM_PROC_PROC_H */ diff --git a/arch/mn10300/include/asm/serial.h b/arch/mn10300/include/asm/serial.h index 99785a9..a29445c 100644 --- a/arch/mn10300/include/asm/serial.h +++ b/arch/mn10300/include/asm/serial.h @@ -33,4 +33,4 @@ #define RS_TABLE_SIZE #endif -#include +#include diff --git a/arch/mn10300/include/asm/timex.h b/arch/mn10300/include/asm/timex.h index 3944277..8d031f9 100644 --- a/arch/mn10300/include/asm/timex.h +++ b/arch/mn10300/include/asm/timex.h @@ -12,7 +12,7 @@ #define _ASM_TIMEX_H #include -#include +#include #define TICK_SIZE (tick_nsec / 1000) diff --git a/arch/mn10300/include/asm/unit-asb2303/clock.h b/arch/mn10300/include/asm/unit-asb2303/clock.h deleted file mode 100644 index 8b450e9..0000000 --- a/arch/mn10300/include/asm/unit-asb2303/clock.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ASB2303-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_CLOCK_H -#define _ASM_UNIT_CLOCK_H - -#ifndef __ASSEMBLY__ - -#ifdef CONFIG_MN10300_RTC - -extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ -extern unsigned long mn10300_iobclk; -extern unsigned long mn10300_tsc_per_HZ; - -#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) -/* If this processors has a another clock, uncomment the below. */ -/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ - -#else /* !CONFIG_MN10300_RTC */ - -#define MN10300_IOCLK 33333333UL -/* #define MN10300_IOBCLK 66666666UL */ - -#endif /* !CONFIG_MN10300_RTC */ - -#define MN10300_JCCLK MN10300_IOCLK -#define MN10300_TSCCLK MN10300_IOCLK - -#ifdef CONFIG_MN10300_RTC -#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) -#else /* !CONFIG_MN10300_RTC */ -#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) -#endif /* !CONFIG_MN10300_RTC */ - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/leds.h b/arch/mn10300/include/asm/unit-asb2303/leds.h deleted file mode 100644 index 3a7543e..0000000 --- a/arch/mn10300/include/asm/unit-asb2303/leds.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ASB2303-specific LEDs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_LEDS_H -#define _ASM_UNIT_LEDS_H - -#include -#include -#include - -#define ASB2303_GPIO0DEF __SYSREG(0xDB000000, u32) -#define ASB2303_7SEGLEDS __SYSREG(0xDB000008, u32) - -/* - * use the 7-segment LEDs to indicate states - */ - -/* flip the 7-segment LEDs between "G" and "-" */ -#define mn10300_set_gdbleds(ONOFF) \ -do { \ - ASB2303_7SEGLEDS = (ONOFF) ? 0x85 : 0x7f; \ -} while (0) - -/* indicate double-fault by displaying "d" on the LEDs */ -#define mn10300_set_dbfleds \ - mov 0x43,d0 ; \ - movbu d0,(ASB2303_7SEGLEDS) - -#ifndef __ASSEMBLY__ -extern void peripheral_leds_display_exception(enum exception_code code); -extern void peripheral_leds_led_chase(void); -extern void debug_to_serial(const char *p, int n); -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/serial.h b/arch/mn10300/include/asm/unit-asb2303/serial.h deleted file mode 100644 index 0d55cf5..0000000 --- a/arch/mn10300/include/asm/unit-asb2303/serial.h +++ /dev/null @@ -1,136 +0,0 @@ -/* ASB2303-specific 8250 serial ports - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_SERIAL_H -#define _ASM_UNIT_SERIAL_H - -#include -#include -#include - -#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 -#define SERIAL_PORT1_BASE_ADDRESS 0xA6FC0000 - -#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ - -/* - * dispose of the /dev/ttyS0 and /dev/ttyS1 serial ports - */ -#ifndef CONFIG_GDBSTUB_ON_TTYSx - -#define SERIAL_PORT_DFNS \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT1_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, - -#ifndef __ASSEMBLY__ - -static inline void __debug_to_serial(const char *p, int n) -{ -} - -#endif /* !__ASSEMBLY__ */ - -#else /* CONFIG_GDBSTUB_ON_TTYSx */ - -#define SERIAL_PORT_DFNS /* both stolen by gdb-stub because they share an IRQ */ - -#if defined(CONFIG_GDBSTUB_ON_TTYS0) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ - -#elif defined(CONFIG_GDBSTUB_ON_TTYS1) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ -#endif - -#ifndef __ASSEMBLY__ - -#define LSR_WAIT_FOR(STATE) \ -do { \ - while (!(GDBPORT_SERIAL_LSR & UART_LSR_##STATE)) {} \ -} while (0) -#define FLOWCTL_WAIT_FOR(LINE) \ -do { \ - while (!(GDBPORT_SERIAL_MSR & UART_MSR_##LINE)) {} \ -} while (0) -#define FLOWCTL_CLEAR(LINE) \ -do { \ - GDBPORT_SERIAL_MCR &= ~UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_SET(LINE) \ -do { \ - GDBPORT_SERIAL_MCR |= UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_QUERY(LINE) ({ GDBPORT_SERIAL_MSR & UART_MSR_##LINE; }) - -static inline void __debug_to_serial(const char *p, int n) -{ - char ch; - - FLOWCTL_SET(DTR); - - for (; n > 0; n--) { - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - - ch = *p++; - if (ch == 0x0a) { - GDBPORT_SERIAL_TX = 0x0d; - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - } - GDBPORT_SERIAL_TX = ch; - } - - FLOWCTL_CLEAR(DTR); -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* CONFIG_GDBSTUB_ON_TTYSx */ - -#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/smc91111.h b/arch/mn10300/include/asm/unit-asb2303/smc91111.h deleted file mode 100644 index dd456e9..0000000 --- a/arch/mn10300/include/asm/unit-asb2303/smc91111.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Support for the SMC91C111 NIC on an ASB2303 - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_SMC91111_H -#define _ASM_UNIT_SMC91111_H - -#include - -#define SMC91111_BASE 0xAA000300UL -#define SMC91111_BASE_END 0xAA000400UL -#define SMC91111_IRQ XIRQ3 - -#define SMC_CAN_USE_8BIT 0 -#define SMC_CAN_USE_16BIT 1 -#define SMC_CAN_USE_32BIT 0 -#define SMC_NOWAIT 1 -#define SMC_IRQ_FLAGS (0) - -#if SMC_CAN_USE_8BIT -#define SMC_inb(a, r) inb((unsigned long) ((a) + (r))) -#define SMC_outb(v, a, r) outb(v, (unsigned long) ((a) + (r))) -#endif - -#if SMC_CAN_USE_16BIT -#define SMC_inw(a, r) inw((unsigned long) ((a) + (r))) -#define SMC_outw(v, a, r) outw(v, (unsigned long) ((a) + (r))) -#define SMC_insw(a, r, p, l) insw((unsigned long) ((a) + (r)), (p), (l)) -#define SMC_outsw(a, r, p, l) outsw((unsigned long) ((a) + (r)), (p), (l)) -#endif - -#if SMC_CAN_USE_32BIT -#define SMC_inl(a, r) inl((unsigned long) ((a) + (r))) -#define SMC_outl(v, a, r) outl(v, (unsigned long) ((a) + (r))) -#define SMC_insl(a, r, p, l) insl((unsigned long) ((a) + (r)), (p), (l)) -#define SMC_outsl(a, r, p, l) outsl((unsigned long) ((a) + (r)), (p), (l)) -#endif - -#define RPC_LSA_DEFAULT RPC_LED_100_10 -#define RPC_LSB_DEFAULT RPC_LED_TX_RX - -#define set_irq_type(irq, type) - -#endif /* _ASM_UNIT_SMC91111_H */ diff --git a/arch/mn10300/include/asm/unit-asb2303/timex.h b/arch/mn10300/include/asm/unit-asb2303/timex.h deleted file mode 100644 index 7e54b0cf..0000000 --- a/arch/mn10300/include/asm/unit-asb2303/timex.h +++ /dev/null @@ -1,135 +0,0 @@ -/* ASB2303-specific timer specifcations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_TIMEX_H -#define _ASM_UNIT_TIMEX_H - -#ifndef __ASSEMBLY__ -#include -#endif /* __ASSEMBLY__ */ - -#include -#include - -/* - * jiffies counter specifications - */ - -#define TMJCBR_MAX 0xffff -#define TMJCBC TM01BC - -#define TMJCMD TM01MD -#define TMJCBR TM01BR -#define TMJCIRQ TM1IRQ -#define TMJCICR TM1ICR -#define TMJCICR_LEVEL GxICR_LEVEL_5 - -#ifndef __ASSEMBLY__ - -static inline void startup_jiffies_counter(void) -{ - unsigned rate; - u16 md, t16; - - /* use as little prescaling as possible to avoid losing accuracy */ - md = TM0MD_SRC_IOCLK; - rate = MN10300_JCCLK / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_8; - rate = MN10300_JCCLK / 8 / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_32; - rate = MN10300_JCCLK / 32 / HZ; - - if (rate > TMJCBR_MAX) - BUG(); - } - } - - TMJCBR = rate - 1; - t16 = TMJCBR; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_INIT_COUNTER | - TM1MD_INIT_COUNTER << 8; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_COUNT_ENABLE | - TM1MD_COUNT_ENABLE << 8; - - t16 = TMJCMD; - - TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; - t16 = TMJCICR; -} - -static inline void shutdown_jiffies_counter(void) -{ -} - -#endif /* !__ASSEMBLY__ */ - - -/* - * timestamp counter specifications - */ - -#define TMTSCBR_MAX 0xffffffff -#define TMTSCBC TM45BC - -#ifndef __ASSEMBLY__ - -static inline void startup_timestamp_counter(void) -{ - /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time - * - count down from 4Gig-1 to 0 and wrap at IOCLK rate - */ - TM45BR = TMTSCBR_MAX; - - TM4MD = TM4MD_SRC_IOCLK; - TM4MD |= TM4MD_INIT_COUNTER; - TM4MD &= ~TM4MD_INIT_COUNTER; - TM4ICR = 0; - - TM5MD = TM5MD_SRC_TM4CASCADE; - TM5MD |= TM5MD_INIT_COUNTER; - TM5MD &= ~TM5MD_INIT_COUNTER; - TM5ICR = 0; - - TM5MD |= TM5MD_COUNT_ENABLE; - TM4MD |= TM4MD_COUNT_ENABLE; -} - -static inline void shutdown_timestamp_counter(void) -{ - TM4MD = 0; - TM5MD = 0; -} - -/* - * we use a cascaded pair of 16-bit down-counting timers to count I/O - * clock cycles for the purposes of time keeping - */ -typedef unsigned long cycles_t; - -static inline cycles_t read_timestamp_counter(void) -{ - return (cycles_t)TMTSCBC; -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/clock.h b/arch/mn10300/include/asm/unit-asb2305/clock.h deleted file mode 100644 index 7d51484..0000000 --- a/arch/mn10300/include/asm/unit-asb2305/clock.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ASB2305-specific clocks - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_CLOCK_H -#define _ASM_UNIT_CLOCK_H - -#ifndef __ASSEMBLY__ - -#ifdef CONFIG_MN10300_RTC - -extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ -extern unsigned long mn10300_iobclk; -extern unsigned long mn10300_tsc_per_HZ; - -#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) -/* If this processors has a another clock, uncomment the below. */ -/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ - -#else /* !CONFIG_MN10300_RTC */ - -#define MN10300_IOCLK 33333333UL -/* #define MN10300_IOBCLK 66666666UL */ - -#endif /* !CONFIG_MN10300_RTC */ - -#define MN10300_JCCLK MN10300_IOCLK -#define MN10300_TSCCLK MN10300_IOCLK - -#ifdef CONFIG_MN10300_RTC -#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) -#else /* !CONFIG_MN10300_RTC */ -#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) -#endif /* !CONFIG_MN10300_RTC */ - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/leds.h b/arch/mn10300/include/asm/unit-asb2305/leds.h deleted file mode 100644 index bc471f6..0000000 --- a/arch/mn10300/include/asm/unit-asb2305/leds.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ASB2305-specific LEDs - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ - -#ifndef _ASM_UNIT_LEDS_H -#define _ASM_UNIT_LEDS_H - -#include -#include -#include - -#define ASB2305_7SEGLEDS __SYSREG(0xA6F90000, u32) - -/* perform a hard reset by driving PIO06 low */ -#define mn10300_unit_hard_reset() \ -do { \ - P0OUT &= 0xbf; \ - P0MD = (P0MD & P0MD_6) | P0MD_6_OUT; \ -} while (0) - -/* - * use the 7-segment LEDs to indicate states - */ -/* indicate double-fault by displaying "db-f" on the LEDs */ -#define mn10300_set_dbfleds \ - mov 0x43077f1d,d0 ; \ - mov d0,(ASB2305_7SEGLEDS) - -/* flip the 7-segment LEDs between "Gdb-" and "----" */ -#define mn10300_set_gdbleds(ONOFF) \ -do { \ - ASB2305_7SEGLEDS = (ONOFF) ? 0x8543077f : 0x7f7f7f7f; \ -} while (0) - -#ifndef __ASSEMBLY__ -extern void peripheral_leds_display_exception(enum exception_code); -extern void peripheral_leds_led_chase(void); -extern void peripheral_leds7x4_display_dec(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_hex(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_minssecs(unsigned int, unsigned int); -extern void peripheral_leds7x4_display_rtc(void); -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/serial.h b/arch/mn10300/include/asm/unit-asb2305/serial.h deleted file mode 100644 index 73d31d6..0000000 --- a/arch/mn10300/include/asm/unit-asb2305/serial.h +++ /dev/null @@ -1,120 +0,0 @@ -/* ASB2305-specific 8250 serial ports - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_SERIAL_H -#define _ASM_UNIT_SERIAL_H - -#include -#include -#include - -#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 -#define ASB2305_DEBUG_MCR __SYSREG(0xA6FB0000 + UART_MCR * 2, u8) - -#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ - -/* - * dispose of the /dev/ttyS0 serial port - */ -#ifndef CONFIG_GDBSTUB_ON_TTYSx - -#define SERIAL_PORT_DFNS \ - { \ - .baud_base = BASE_BAUD, \ - .irq = SERIAL_IRQ, \ - .flags = STD_COM_FLAGS, \ - .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ - .iomem_reg_shift = 2, \ - .io_type = SERIAL_IO_MEM, \ - }, - -#ifndef __ASSEMBLY__ - -static inline void __debug_to_serial(const char *p, int n) -{ -} - -#endif /* !__ASSEMBLY__ */ - -#else /* CONFIG_GDBSTUB_ON_TTYSx */ - -#define SERIAL_PORT_DFNS /* stolen by gdb-stub */ - -#if defined(CONFIG_GDBSTUB_ON_TTYS0) -#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) -#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) -#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) -#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) -#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) -#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) -#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) -#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) -#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) -#define GDBPORT_SERIAL_IRQ SERIAL_IRQ - -#elif defined(CONFIG_GDBSTUB_ON_TTYS1) -#error The ASB2305 doesnt have a /dev/ttyS1 -#endif - -#ifndef __ASSEMBLY__ - -#define TTYS0_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) -#define TTYS0_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) -#define TTYS0_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) -#define TTYS0_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) - -#define LSR_WAIT_FOR(STATE) \ -do { \ - while (!(TTYS0_LSR & UART_LSR_##STATE)) {} \ -} while (0) -#define FLOWCTL_WAIT_FOR(LINE) \ -do { \ - while (!(TTYS0_MSR & UART_MSR_##LINE)) {} \ -} while (0) -#define FLOWCTL_CLEAR(LINE) \ -do { \ - TTYS0_MCR &= ~UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_SET(LINE) \ -do { \ - TTYS0_MCR |= UART_MCR_##LINE; \ -} while (0) -#define FLOWCTL_QUERY(LINE) ({ TTYS0_MSR & UART_MSR_##LINE; }) - -static inline void __debug_to_serial(const char *p, int n) -{ - char ch; - - FLOWCTL_SET(DTR); - - for (; n > 0; n--) { - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - - ch = *p++; - if (ch == 0x0a) { - TTYS0_TX = 0x0d; - LSR_WAIT_FOR(THRE); - FLOWCTL_WAIT_FOR(CTS); - } - TTYS0_TX = ch; - } - - FLOWCTL_CLEAR(DTR); -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* CONFIG_GDBSTUB_ON_TTYSx */ - -#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/include/asm/unit-asb2305/timex.h b/arch/mn10300/include/asm/unit-asb2305/timex.h deleted file mode 100644 index 10e1bfe3..0000000 --- a/arch/mn10300/include/asm/unit-asb2305/timex.h +++ /dev/null @@ -1,135 +0,0 @@ -/* ASB2305 timer specifcations - * - * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licence - * as published by the Free Software Foundation; either version - * 2 of the Licence, or (at your option) any later version. - */ -#ifndef _ASM_UNIT_TIMEX_H -#define _ASM_UNIT_TIMEX_H - -#ifndef __ASSEMBLY__ -#include -#endif /* __ASSEMBLY__ */ - -#include -#include - -/* - * jiffies counter specifications - */ - -#define TMJCBR_MAX 0xffff -#define TMJCBC TM01BC - -#define TMJCMD TM01MD -#define TMJCBR TM01BR -#define TMJCIRQ TM1IRQ -#define TMJCICR TM1ICR -#define TMJCICR_LEVEL GxICR_LEVEL_5 - -#ifndef __ASSEMBLY__ - -static inline void startup_jiffies_counter(void) -{ - unsigned rate; - u16 md, t16; - - /* use as little prescaling as possible to avoid losing accuracy */ - md = TM0MD_SRC_IOCLK; - rate = MN10300_JCCLK / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_8; - rate = MN10300_JCCLK / 8 / HZ; - - if (rate > TMJCBR_MAX) { - md = TM0MD_SRC_IOCLK_32; - rate = MN10300_JCCLK / 32 / HZ; - - if (rate > TMJCBR_MAX) - BUG(); - } - } - - TMJCBR = rate - 1; - t16 = TMJCBR; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_INIT_COUNTER | - TM1MD_INIT_COUNTER << 8; - - TMJCMD = - md | - TM1MD_SRC_TM0CASCADE << 8 | - TM0MD_COUNT_ENABLE | - TM1MD_COUNT_ENABLE << 8; - - t16 = TMJCMD; - - TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; - t16 = TMJCICR; -} - -static inline void shutdown_jiffies_counter(void) -{ -} - -#endif /* !__ASSEMBLY__ */ - - -/* - * timestamp counter specifications - */ - -#define TMTSCBR_MAX 0xffffffff -#define TMTSCBC TM45BC - -#ifndef __ASSEMBLY__ - -static inline void startup_timestamp_counter(void) -{ - /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time - * - count down from 4Gig-1 to 0 and wrap at IOCLK rate - */ - TM45BR = TMTSCBR_MAX; - - TM4MD = TM4MD_SRC_IOCLK; - TM4MD |= TM4MD_INIT_COUNTER; - TM4MD &= ~TM4MD_INIT_COUNTER; - TM4ICR = 0; - - TM5MD = TM5MD_SRC_TM4CASCADE; - TM5MD |= TM5MD_INIT_COUNTER; - TM5MD &= ~TM5MD_INIT_COUNTER; - TM5ICR = 0; - - TM5MD |= TM5MD_COUNT_ENABLE; - TM4MD |= TM4MD_COUNT_ENABLE; -} - -static inline void shutdown_timestamp_counter(void) -{ - TM4MD = 0; - TM5MD = 0; -} - -/* - * we use a cascaded pair of 16-bit down-counting timers to count I/O - * clock cycles for the purposes of time keeping - */ -typedef unsigned long cycles_t; - -static inline cycles_t read_timestamp_counter(void) -{ - return (cycles_t) TMTSCBC; -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index ceeaaaa..34ab5a2 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/arch/mn10300/kernel/gdb-io-serial-low.S b/arch/mn10300/kernel/gdb-io-serial-low.S index c68dcd0..4998b24f 100644 --- a/arch/mn10300/kernel/gdb-io-serial-low.S +++ b/arch/mn10300/kernel/gdb-io-serial-low.S @@ -18,7 +18,7 @@ #include #include #include -#include +#include .text diff --git a/arch/mn10300/kernel/gdb-io-serial.c b/arch/mn10300/kernel/gdb-io-serial.c index 11584c5..ae663dc 100644 --- a/arch/mn10300/kernel/gdb-io-serial.c +++ b/arch/mn10300/kernel/gdb-io-serial.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include /* * initialise the GDB stub diff --git a/arch/mn10300/kernel/gdb-io-ttysm-low.S b/arch/mn10300/kernel/gdb-io-ttysm-low.S index 677c787..060b7cc 100644 --- a/arch/mn10300/kernel/gdb-io-ttysm-low.S +++ b/arch/mn10300/kernel/gdb-io-ttysm-low.S @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include "mn10300-serial.h" .text diff --git a/arch/mn10300/kernel/gdb-io-ttysm.c b/arch/mn10300/kernel/gdb-io-ttysm.c index e94c25e..a560bbc 100644 --- a/arch/mn10300/kernel/gdb-io-ttysm.c +++ b/arch/mn10300/kernel/gdb-io-ttysm.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include "mn10300-serial.h" #if defined(CONFIG_GDBSTUB_ON_TTYSM0) diff --git a/arch/mn10300/kernel/gdb-stub.c b/arch/mn10300/kernel/gdb-stub.c index 0ea7482..41b1170 100644 --- a/arch/mn10300/kernel/gdb-stub.c +++ b/arch/mn10300/kernel/gdb-stub.c @@ -136,8 +136,8 @@ #include #include #include -#include -#include +#include +#include /* define to use F7F7 rather than FF which is subverted by JTAG debugger */ #undef GDBSTUB_USE_F7F7_AS_BREAKPOINT diff --git a/arch/mn10300/kernel/head.S b/arch/mn10300/kernel/head.S index 606bd8c6..8a8309f 100644 --- a/arch/mn10300/kernel/head.S +++ b/arch/mn10300/kernel/head.S @@ -17,7 +17,7 @@ #include #include #include -#include +#include .section .text.head,"ax" diff --git a/arch/mn10300/kernel/mn10300-serial-low.S b/arch/mn10300/kernel/mn10300-serial-low.S index ef3f4c1..2244853 100644 --- a/arch/mn10300/kernel/mn10300-serial-low.S +++ b/arch/mn10300/kernel/mn10300-serial-low.S @@ -18,8 +18,8 @@ #include #include #include -#include -#include +#include +#include #include "mn10300-serial.h" #define SCxCTR 0x00 diff --git a/arch/mn10300/kernel/mn10300-serial.c b/arch/mn10300/kernel/mn10300-serial.c index 59b9c4b..2fd5966 100644 --- a/arch/mn10300/kernel/mn10300-serial.c +++ b/arch/mn10300/kernel/mn10300-serial.c @@ -41,7 +41,7 @@ static const char serial_revdate[] = "2007-11-06"; #include #include #include -#include +#include #include "mn10300-serial.h" static inline __attribute__((format(printf, 1, 2))) diff --git a/arch/mn10300/kernel/mn10300-watchdog.c b/arch/mn10300/kernel/mn10300-watchdog.c index 2e370d8..f362d9d 100644 --- a/arch/mn10300/kernel/mn10300-watchdog.c +++ b/arch/mn10300/kernel/mn10300-watchdog.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include static DEFINE_SPINLOCK(watchdog_print_lock); static unsigned int watchdog; diff --git a/arch/mn10300/kernel/setup.c b/arch/mn10300/kernel/setup.c index e1d88ab..71414e1 100644 --- a/arch/mn10300/kernel/setup.c +++ b/arch/mn10300/kernel/setup.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/arch/mn10300/kernel/traps.c b/arch/mn10300/kernel/traps.c index fcb9a03..681ad8c 100644 --- a/arch/mn10300/kernel/traps.c +++ b/arch/mn10300/kernel/traps.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/arch/mn10300/proc-mn103e010/include/proc/cache.h b/arch/mn10300/proc-mn103e010/include/proc/cache.h new file mode 100644 index 0000000..bdc1f9a --- /dev/null +++ b/arch/mn10300/proc-mn103e010/include/proc/cache.h @@ -0,0 +1,33 @@ +/* MN103E010 Cache specification + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PROC_CACHE_H +#define _ASM_PROC_CACHE_H + +/* L1 cache */ + +#define L1_CACHE_NWAYS 4 /* number of ways in caches */ +#define L1_CACHE_NENTRIES 256 /* number of entries in each way */ +#define L1_CACHE_BYTES 16 /* bytes per entry */ +#define L1_CACHE_SHIFT 4 /* shift for bytes per entry */ +#define L1_CACHE_WAYDISP 0x1000 /* displacement of one way from the next */ + +#define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ +#define L1_CACHE_TAG_DIRTY 0x00000008 /* data cache tag dirty bit */ +#define L1_CACHE_TAG_ENTRY 0x00000ff0 /* cache tag entry address mask */ +#define L1_CACHE_TAG_ADDRESS 0xfffff000 /* cache tag line address mask */ + +/* + * specification of the interval between interrupt checking intervals whilst + * managing the cache with the interrupts disabled + */ +#define MN10300_DCACHE_INV_RANGE_INTR_LOG2_INTERVAL 4 + +#endif /* _ASM_PROC_CACHE_H */ diff --git a/arch/mn10300/proc-mn103e010/include/proc/clock.h b/arch/mn10300/proc-mn103e010/include/proc/clock.h new file mode 100644 index 0000000..aa23e14 --- /dev/null +++ b/arch/mn10300/proc-mn103e010/include/proc/clock.h @@ -0,0 +1,18 @@ +/* MN103E010-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_PROC_CLOCK_H +#define _ASM_PROC_CLOCK_H + +#include + +#define MN10300_WDCLK MN10300_IOCLK + +#endif /* _ASM_PROC_CLOCK_H */ diff --git a/arch/mn10300/proc-mn103e010/include/proc/irq.h b/arch/mn10300/proc-mn103e010/include/proc/irq.h new file mode 100644 index 0000000..aa6ee8f --- /dev/null +++ b/arch/mn10300/proc-mn103e010/include/proc/irq.h @@ -0,0 +1,34 @@ +/* MN103E010 On-board interrupt controller numbers + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_PROC_IRQ_H +#define _ASM_PROC_IRQ_H + +#ifdef __KERNEL__ + +#define GxICR_NUM_IRQS 42 + +#define GxICR_NUM_XIRQS 8 + +#define XIRQ0 34 +#define XIRQ1 35 +#define XIRQ2 36 +#define XIRQ3 37 +#define XIRQ4 38 +#define XIRQ5 39 +#define XIRQ6 40 +#define XIRQ7 41 + +#define XIRQ2IRQ(num) (XIRQ0 + num) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_PROC_IRQ_H */ diff --git a/arch/mn10300/proc-mn103e010/include/proc/proc.h b/arch/mn10300/proc-mn103e010/include/proc/proc.h new file mode 100644 index 0000000..22a2b93 --- /dev/null +++ b/arch/mn10300/proc-mn103e010/include/proc/proc.h @@ -0,0 +1,18 @@ +/* MN103E010 Processor description + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_PROC_PROC_H +#define _ASM_PROC_PROC_H + +#define PROCESSOR_VENDOR_NAME "Matsushita" +#define PROCESSOR_MODEL_NAME "mn103e010" + +#endif /* _ASM_PROC_PROC_H */ diff --git a/arch/mn10300/unit-asb2303/include/unit/clock.h b/arch/mn10300/unit-asb2303/include/unit/clock.h new file mode 100644 index 0000000..8b450e9 --- /dev/null +++ b/arch/mn10300/unit-asb2303/include/unit/clock.h @@ -0,0 +1,45 @@ +/* ASB2303-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_CLOCK_H +#define _ASM_UNIT_CLOCK_H + +#ifndef __ASSEMBLY__ + +#ifdef CONFIG_MN10300_RTC + +extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ +extern unsigned long mn10300_iobclk; +extern unsigned long mn10300_tsc_per_HZ; + +#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) +/* If this processors has a another clock, uncomment the below. */ +/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ + +#else /* !CONFIG_MN10300_RTC */ + +#define MN10300_IOCLK 33333333UL +/* #define MN10300_IOBCLK 66666666UL */ + +#endif /* !CONFIG_MN10300_RTC */ + +#define MN10300_JCCLK MN10300_IOCLK +#define MN10300_TSCCLK MN10300_IOCLK + +#ifdef CONFIG_MN10300_RTC +#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) +#else /* !CONFIG_MN10300_RTC */ +#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) +#endif /* !CONFIG_MN10300_RTC */ + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/unit-asb2303/include/unit/leds.h b/arch/mn10300/unit-asb2303/include/unit/leds.h new file mode 100644 index 0000000..3a7543e --- /dev/null +++ b/arch/mn10300/unit-asb2303/include/unit/leds.h @@ -0,0 +1,43 @@ +/* ASB2303-specific LEDs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_LEDS_H +#define _ASM_UNIT_LEDS_H + +#include +#include +#include + +#define ASB2303_GPIO0DEF __SYSREG(0xDB000000, u32) +#define ASB2303_7SEGLEDS __SYSREG(0xDB000008, u32) + +/* + * use the 7-segment LEDs to indicate states + */ + +/* flip the 7-segment LEDs between "G" and "-" */ +#define mn10300_set_gdbleds(ONOFF) \ +do { \ + ASB2303_7SEGLEDS = (ONOFF) ? 0x85 : 0x7f; \ +} while (0) + +/* indicate double-fault by displaying "d" on the LEDs */ +#define mn10300_set_dbfleds \ + mov 0x43,d0 ; \ + movbu d0,(ASB2303_7SEGLEDS) + +#ifndef __ASSEMBLY__ +extern void peripheral_leds_display_exception(enum exception_code code); +extern void peripheral_leds_led_chase(void); +extern void debug_to_serial(const char *p, int n); +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/unit-asb2303/include/unit/serial.h b/arch/mn10300/unit-asb2303/include/unit/serial.h new file mode 100644 index 0000000..047566c --- /dev/null +++ b/arch/mn10300/unit-asb2303/include/unit/serial.h @@ -0,0 +1,136 @@ +/* ASB2303-specific 8250 serial ports + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_SERIAL_H +#define _ASM_UNIT_SERIAL_H + +#include +#include +#include + +#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 +#define SERIAL_PORT1_BASE_ADDRESS 0xA6FC0000 + +#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ + +/* + * dispose of the /dev/ttyS0 and /dev/ttyS1 serial ports + */ +#ifndef CONFIG_GDBSTUB_ON_TTYSx + +#define SERIAL_PORT_DFNS \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT1_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, + +#ifndef __ASSEMBLY__ + +static inline void __debug_to_serial(const char *p, int n) +{ +} + +#endif /* !__ASSEMBLY__ */ + +#else /* CONFIG_GDBSTUB_ON_TTYSx */ + +#define SERIAL_PORT_DFNS /* both stolen by gdb-stub because they share an IRQ */ + +#if defined(CONFIG_GDBSTUB_ON_TTYS0) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ + +#elif defined(CONFIG_GDBSTUB_ON_TTYS1) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT1_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ +#endif + +#ifndef __ASSEMBLY__ + +#define LSR_WAIT_FOR(STATE) \ +do { \ + while (!(GDBPORT_SERIAL_LSR & UART_LSR_##STATE)) {} \ +} while (0) +#define FLOWCTL_WAIT_FOR(LINE) \ +do { \ + while (!(GDBPORT_SERIAL_MSR & UART_MSR_##LINE)) {} \ +} while (0) +#define FLOWCTL_CLEAR(LINE) \ +do { \ + GDBPORT_SERIAL_MCR &= ~UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_SET(LINE) \ +do { \ + GDBPORT_SERIAL_MCR |= UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_QUERY(LINE) ({ GDBPORT_SERIAL_MSR & UART_MSR_##LINE; }) + +static inline void __debug_to_serial(const char *p, int n) +{ + char ch; + + FLOWCTL_SET(DTR); + + for (; n > 0; n--) { + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + + ch = *p++; + if (ch == 0x0a) { + GDBPORT_SERIAL_TX = 0x0d; + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + } + GDBPORT_SERIAL_TX = ch; + } + + FLOWCTL_CLEAR(DTR); +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* CONFIG_GDBSTUB_ON_TTYSx */ + +#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/unit-asb2303/include/unit/smc91111.h b/arch/mn10300/unit-asb2303/include/unit/smc91111.h new file mode 100644 index 0000000..dd456e9 --- /dev/null +++ b/arch/mn10300/unit-asb2303/include/unit/smc91111.h @@ -0,0 +1,50 @@ +/* Support for the SMC91C111 NIC on an ASB2303 + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_SMC91111_H +#define _ASM_UNIT_SMC91111_H + +#include + +#define SMC91111_BASE 0xAA000300UL +#define SMC91111_BASE_END 0xAA000400UL +#define SMC91111_IRQ XIRQ3 + +#define SMC_CAN_USE_8BIT 0 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 0 +#define SMC_NOWAIT 1 +#define SMC_IRQ_FLAGS (0) + +#if SMC_CAN_USE_8BIT +#define SMC_inb(a, r) inb((unsigned long) ((a) + (r))) +#define SMC_outb(v, a, r) outb(v, (unsigned long) ((a) + (r))) +#endif + +#if SMC_CAN_USE_16BIT +#define SMC_inw(a, r) inw((unsigned long) ((a) + (r))) +#define SMC_outw(v, a, r) outw(v, (unsigned long) ((a) + (r))) +#define SMC_insw(a, r, p, l) insw((unsigned long) ((a) + (r)), (p), (l)) +#define SMC_outsw(a, r, p, l) outsw((unsigned long) ((a) + (r)), (p), (l)) +#endif + +#if SMC_CAN_USE_32BIT +#define SMC_inl(a, r) inl((unsigned long) ((a) + (r))) +#define SMC_outl(v, a, r) outl(v, (unsigned long) ((a) + (r))) +#define SMC_insl(a, r, p, l) insl((unsigned long) ((a) + (r)), (p), (l)) +#define SMC_outsl(a, r, p, l) outsl((unsigned long) ((a) + (r)), (p), (l)) +#endif + +#define RPC_LSA_DEFAULT RPC_LED_100_10 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX + +#define set_irq_type(irq, type) + +#endif /* _ASM_UNIT_SMC91111_H */ diff --git a/arch/mn10300/unit-asb2303/include/unit/timex.h b/arch/mn10300/unit-asb2303/include/unit/timex.h new file mode 100644 index 0000000..f206b63 --- /dev/null +++ b/arch/mn10300/unit-asb2303/include/unit/timex.h @@ -0,0 +1,135 @@ +/* ASB2303-specific timer specifcations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_TIMEX_H +#define _ASM_UNIT_TIMEX_H + +#ifndef __ASSEMBLY__ +#include +#endif /* __ASSEMBLY__ */ + +#include +#include + +/* + * jiffies counter specifications + */ + +#define TMJCBR_MAX 0xffff +#define TMJCBC TM01BC + +#define TMJCMD TM01MD +#define TMJCBR TM01BR +#define TMJCIRQ TM1IRQ +#define TMJCICR TM1ICR +#define TMJCICR_LEVEL GxICR_LEVEL_5 + +#ifndef __ASSEMBLY__ + +static inline void startup_jiffies_counter(void) +{ + unsigned rate; + u16 md, t16; + + /* use as little prescaling as possible to avoid losing accuracy */ + md = TM0MD_SRC_IOCLK; + rate = MN10300_JCCLK / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_8; + rate = MN10300_JCCLK / 8 / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_32; + rate = MN10300_JCCLK / 32 / HZ; + + if (rate > TMJCBR_MAX) + BUG(); + } + } + + TMJCBR = rate - 1; + t16 = TMJCBR; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_INIT_COUNTER | + TM1MD_INIT_COUNTER << 8; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_COUNT_ENABLE | + TM1MD_COUNT_ENABLE << 8; + + t16 = TMJCMD; + + TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; + t16 = TMJCICR; +} + +static inline void shutdown_jiffies_counter(void) +{ +} + +#endif /* !__ASSEMBLY__ */ + + +/* + * timestamp counter specifications + */ + +#define TMTSCBR_MAX 0xffffffff +#define TMTSCBC TM45BC + +#ifndef __ASSEMBLY__ + +static inline void startup_timestamp_counter(void) +{ + /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time + * - count down from 4Gig-1 to 0 and wrap at IOCLK rate + */ + TM45BR = TMTSCBR_MAX; + + TM4MD = TM4MD_SRC_IOCLK; + TM4MD |= TM4MD_INIT_COUNTER; + TM4MD &= ~TM4MD_INIT_COUNTER; + TM4ICR = 0; + + TM5MD = TM5MD_SRC_TM4CASCADE; + TM5MD |= TM5MD_INIT_COUNTER; + TM5MD &= ~TM5MD_INIT_COUNTER; + TM5ICR = 0; + + TM5MD |= TM5MD_COUNT_ENABLE; + TM4MD |= TM4MD_COUNT_ENABLE; +} + +static inline void shutdown_timestamp_counter(void) +{ + TM4MD = 0; + TM5MD = 0; +} + +/* + * we use a cascaded pair of 16-bit down-counting timers to count I/O + * clock cycles for the purposes of time keeping + */ +typedef unsigned long cycles_t; + +static inline cycles_t read_timestamp_counter(void) +{ + return (cycles_t)TMTSCBC; +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/unit-asb2303/leds.c b/arch/mn10300/unit-asb2303/leds.c index cd4bc78..c038393 100644 --- a/arch/mn10300/unit-asb2303/leds.c +++ b/arch/mn10300/unit-asb2303/leds.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #if 0 static const u8 asb2303_led_hex_tbl[16] = { diff --git a/arch/mn10300/unit-asb2303/smc91111.c b/arch/mn10300/unit-asb2303/smc91111.c index 30875dd..43c2464 100644 --- a/arch/mn10300/unit-asb2303/smc91111.c +++ b/arch/mn10300/unit-asb2303/smc91111.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include static struct resource smc91c111_resources[] = { [0] = { diff --git a/arch/mn10300/unit-asb2305/include/unit/clock.h b/arch/mn10300/unit-asb2305/include/unit/clock.h new file mode 100644 index 0000000..7d51484 --- /dev/null +++ b/arch/mn10300/unit-asb2305/include/unit/clock.h @@ -0,0 +1,45 @@ +/* ASB2305-specific clocks + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_CLOCK_H +#define _ASM_UNIT_CLOCK_H + +#ifndef __ASSEMBLY__ + +#ifdef CONFIG_MN10300_RTC + +extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ +extern unsigned long mn10300_iobclk; +extern unsigned long mn10300_tsc_per_HZ; + +#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) +/* If this processors has a another clock, uncomment the below. */ +/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ + +#else /* !CONFIG_MN10300_RTC */ + +#define MN10300_IOCLK 33333333UL +/* #define MN10300_IOBCLK 66666666UL */ + +#endif /* !CONFIG_MN10300_RTC */ + +#define MN10300_JCCLK MN10300_IOCLK +#define MN10300_TSCCLK MN10300_IOCLK + +#ifdef CONFIG_MN10300_RTC +#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) +#else /* !CONFIG_MN10300_RTC */ +#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) +#endif /* !CONFIG_MN10300_RTC */ + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_CLOCK_H */ diff --git a/arch/mn10300/unit-asb2305/include/unit/leds.h b/arch/mn10300/unit-asb2305/include/unit/leds.h new file mode 100644 index 0000000..bc471f6 --- /dev/null +++ b/arch/mn10300/unit-asb2305/include/unit/leds.h @@ -0,0 +1,51 @@ +/* ASB2305-specific LEDs + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ + +#ifndef _ASM_UNIT_LEDS_H +#define _ASM_UNIT_LEDS_H + +#include +#include +#include + +#define ASB2305_7SEGLEDS __SYSREG(0xA6F90000, u32) + +/* perform a hard reset by driving PIO06 low */ +#define mn10300_unit_hard_reset() \ +do { \ + P0OUT &= 0xbf; \ + P0MD = (P0MD & P0MD_6) | P0MD_6_OUT; \ +} while (0) + +/* + * use the 7-segment LEDs to indicate states + */ +/* indicate double-fault by displaying "db-f" on the LEDs */ +#define mn10300_set_dbfleds \ + mov 0x43077f1d,d0 ; \ + mov d0,(ASB2305_7SEGLEDS) + +/* flip the 7-segment LEDs between "Gdb-" and "----" */ +#define mn10300_set_gdbleds(ONOFF) \ +do { \ + ASB2305_7SEGLEDS = (ONOFF) ? 0x8543077f : 0x7f7f7f7f; \ +} while (0) + +#ifndef __ASSEMBLY__ +extern void peripheral_leds_display_exception(enum exception_code); +extern void peripheral_leds_led_chase(void); +extern void peripheral_leds7x4_display_dec(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_hex(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_minssecs(unsigned int, unsigned int); +extern void peripheral_leds7x4_display_rtc(void); +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_UNIT_LEDS_H */ diff --git a/arch/mn10300/unit-asb2305/include/unit/serial.h b/arch/mn10300/unit-asb2305/include/unit/serial.h new file mode 100644 index 0000000..3bfc9093 --- /dev/null +++ b/arch/mn10300/unit-asb2305/include/unit/serial.h @@ -0,0 +1,120 @@ +/* ASB2305-specific 8250 serial ports + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_SERIAL_H +#define _ASM_UNIT_SERIAL_H + +#include +#include +#include + +#define SERIAL_PORT0_BASE_ADDRESS 0xA6FB0000 +#define ASB2305_DEBUG_MCR __SYSREG(0xA6FB0000 + UART_MCR * 2, u8) + +#define SERIAL_IRQ XIRQ0 /* Dual serial (PC16552) (Hi) */ + +/* + * dispose of the /dev/ttyS0 serial port + */ +#ifndef CONFIG_GDBSTUB_ON_TTYSx + +#define SERIAL_PORT_DFNS \ + { \ + .baud_base = BASE_BAUD, \ + .irq = SERIAL_IRQ, \ + .flags = STD_COM_FLAGS, \ + .iomem_base = (u8 *) SERIAL_PORT0_BASE_ADDRESS, \ + .iomem_reg_shift = 2, \ + .io_type = SERIAL_IO_MEM, \ + }, + +#ifndef __ASSEMBLY__ + +static inline void __debug_to_serial(const char *p, int n) +{ +} + +#endif /* !__ASSEMBLY__ */ + +#else /* CONFIG_GDBSTUB_ON_TTYSx */ + +#define SERIAL_PORT_DFNS /* stolen by gdb-stub */ + +#if defined(CONFIG_GDBSTUB_ON_TTYS0) +#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) +#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) +#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) +#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) +#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) +#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) +#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) +#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) +#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) +#define GDBPORT_SERIAL_IRQ SERIAL_IRQ + +#elif defined(CONFIG_GDBSTUB_ON_TTYS1) +#error The ASB2305 doesnt have a /dev/ttyS1 +#endif + +#ifndef __ASSEMBLY__ + +#define TTYS0_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) +#define TTYS0_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) +#define TTYS0_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) +#define TTYS0_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) + +#define LSR_WAIT_FOR(STATE) \ +do { \ + while (!(TTYS0_LSR & UART_LSR_##STATE)) {} \ +} while (0) +#define FLOWCTL_WAIT_FOR(LINE) \ +do { \ + while (!(TTYS0_MSR & UART_MSR_##LINE)) {} \ +} while (0) +#define FLOWCTL_CLEAR(LINE) \ +do { \ + TTYS0_MCR &= ~UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_SET(LINE) \ +do { \ + TTYS0_MCR |= UART_MCR_##LINE; \ +} while (0) +#define FLOWCTL_QUERY(LINE) ({ TTYS0_MSR & UART_MSR_##LINE; }) + +static inline void __debug_to_serial(const char *p, int n) +{ + char ch; + + FLOWCTL_SET(DTR); + + for (; n > 0; n--) { + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + + ch = *p++; + if (ch == 0x0a) { + TTYS0_TX = 0x0d; + LSR_WAIT_FOR(THRE); + FLOWCTL_WAIT_FOR(CTS); + } + TTYS0_TX = ch; + } + + FLOWCTL_CLEAR(DTR); +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* CONFIG_GDBSTUB_ON_TTYSx */ + +#endif /* _ASM_UNIT_SERIAL_H */ diff --git a/arch/mn10300/unit-asb2305/include/unit/timex.h b/arch/mn10300/unit-asb2305/include/unit/timex.h new file mode 100644 index 0000000..a71c49a --- /dev/null +++ b/arch/mn10300/unit-asb2305/include/unit/timex.h @@ -0,0 +1,135 @@ +/* ASB2305 timer specifcations + * + * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#ifndef _ASM_UNIT_TIMEX_H +#define _ASM_UNIT_TIMEX_H + +#ifndef __ASSEMBLY__ +#include +#endif /* __ASSEMBLY__ */ + +#include +#include + +/* + * jiffies counter specifications + */ + +#define TMJCBR_MAX 0xffff +#define TMJCBC TM01BC + +#define TMJCMD TM01MD +#define TMJCBR TM01BR +#define TMJCIRQ TM1IRQ +#define TMJCICR TM1ICR +#define TMJCICR_LEVEL GxICR_LEVEL_5 + +#ifndef __ASSEMBLY__ + +static inline void startup_jiffies_counter(void) +{ + unsigned rate; + u16 md, t16; + + /* use as little prescaling as possible to avoid losing accuracy */ + md = TM0MD_SRC_IOCLK; + rate = MN10300_JCCLK / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_8; + rate = MN10300_JCCLK / 8 / HZ; + + if (rate > TMJCBR_MAX) { + md = TM0MD_SRC_IOCLK_32; + rate = MN10300_JCCLK / 32 / HZ; + + if (rate > TMJCBR_MAX) + BUG(); + } + } + + TMJCBR = rate - 1; + t16 = TMJCBR; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_INIT_COUNTER | + TM1MD_INIT_COUNTER << 8; + + TMJCMD = + md | + TM1MD_SRC_TM0CASCADE << 8 | + TM0MD_COUNT_ENABLE | + TM1MD_COUNT_ENABLE << 8; + + t16 = TMJCMD; + + TMJCICR |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; + t16 = TMJCICR; +} + +static inline void shutdown_jiffies_counter(void) +{ +} + +#endif /* !__ASSEMBLY__ */ + + +/* + * timestamp counter specifications + */ + +#define TMTSCBR_MAX 0xffffffff +#define TMTSCBC TM45BC + +#ifndef __ASSEMBLY__ + +static inline void startup_timestamp_counter(void) +{ + /* set up timer 4 & 5 cascaded as a 32-bit counter to count real time + * - count down from 4Gig-1 to 0 and wrap at IOCLK rate + */ + TM45BR = TMTSCBR_MAX; + + TM4MD = TM4MD_SRC_IOCLK; + TM4MD |= TM4MD_INIT_COUNTER; + TM4MD &= ~TM4MD_INIT_COUNTER; + TM4ICR = 0; + + TM5MD = TM5MD_SRC_TM4CASCADE; + TM5MD |= TM5MD_INIT_COUNTER; + TM5MD &= ~TM5MD_INIT_COUNTER; + TM5ICR = 0; + + TM5MD |= TM5MD_COUNT_ENABLE; + TM4MD |= TM4MD_COUNT_ENABLE; +} + +static inline void shutdown_timestamp_counter(void) +{ + TM4MD = 0; + TM5MD = 0; +} + +/* + * we use a cascaded pair of 16-bit down-counting timers to count I/O + * clock cycles for the purposes of time keeping + */ +typedef unsigned long cycles_t; + +static inline cycles_t read_timestamp_counter(void) +{ + return (cycles_t) TMTSCBC; +} + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_UNIT_TIMEX_H */ diff --git a/arch/mn10300/unit-asb2305/leds.c b/arch/mn10300/unit-asb2305/leds.c index e99dcc9..d345ff9 100644 --- a/arch/mn10300/unit-asb2305/leds.c +++ b/arch/mn10300/unit-asb2305/leds.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include static const u8 asb2305_led_hex_tbl[16] = { 0x80, 0xf2, 0x48, 0x60, 0x32, 0x24, 0x04, 0xf0, diff --git a/arch/mn10300/unit-asb2305/unit-init.c b/arch/mn10300/unit-asb2305/unit-init.c index 72812a9..1c452cc 100644 --- a/arch/mn10300/unit-asb2305/unit-init.c +++ b/arch/mn10300/unit-asb2305/unit-init.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include /* * initialise some of the unit hardware before gdbstub is set up diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 912308e..329f890 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h @@ -369,7 +369,7 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, * MN10300/AM33 configuration */ -#include +#include #else -- cgit v0.10.2 From 8f7c2c37319a81ef4c2bfdec67b1ccd5744d97e4 Mon Sep 17 00:00:00 2001 From: Zhaolei Date: Wed, 8 Apr 2009 16:58:57 +0800 Subject: Make __stringify support variable argument macros too For example: __stringify(__entry->irq, __entry->ret) will now convert it to: "REC->irq, REC->ret" It also still supports single arguments as the old macro did. Signed-off-by: Zhao Lei Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49DC6751.30308@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/include/linux/stringify.h b/include/linux/stringify.h index 0b43883..841cec8 100644 --- a/include/linux/stringify.h +++ b/include/linux/stringify.h @@ -6,7 +6,7 @@ * converts to "bar". */ -#define __stringify_1(x) #x -#define __stringify(x) __stringify_1(x) +#define __stringify_1(x...) #x +#define __stringify(x...) __stringify_1(x) #endif /* !__LINUX_STRINGIFY_H */ -- cgit v0.10.2 From 0462b5664b2bda5a18fef7efb5bb32ce36590c1a Mon Sep 17 00:00:00 2001 From: Zhaolei Date: Wed, 8 Apr 2009 17:00:13 +0800 Subject: ftrace: Output REC->var instead of __entry->var for trace format print fmt: "irq=%d return=%s", __entry->irq, __entry->ret ? \"handled\" : \"unhandled\" "__entry" should be convert to "REC" by __stringify() macro. Signed-off-by: Zhao Lei Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49DC679D.2090901@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace_events_stage_2.h b/kernel/trace/trace_events_stage_2.h index 30743f7..d363c66 100644 --- a/kernel/trace/trace_events_stage_2.h +++ b/kernel/trace/trace_events_stage_2.h @@ -105,10 +105,10 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ return 0; #undef __entry -#define __entry "REC" +#define __entry REC #undef TP_printk -#define TP_printk(fmt, args...) "%s, %s\n", #fmt, #args +#define TP_printk(fmt, args...) "%s, %s\n", #fmt, __stringify(args) #undef TP_fast_assign #define TP_fast_assign(args...) args -- cgit v0.10.2 From 9b987aeb4a7bc42a3eb8361030b820b0263c31f1 Mon Sep 17 00:00:00 2001 From: Masami Hiramatsu Date: Thu, 9 Apr 2009 10:55:33 -0700 Subject: x86: fix set_fixmap to use phys_addr_t Impact: fix kprobes crash on 32-bit with RAM above 4G Use phys_addr_t for receiving a physical address argument instead of unsigned long. This allows fixmap to handle pages higher than 4GB on x86-32. Signed-off-by: Masami Hiramatsu Acked-by: Mathieu Desnoyers Cc: Andrew Morton Cc: Ananth N Mavinakayanahalli Cc: systemtap-ml Cc: Gary Hade Cc: Linus Torvalds LKML-Reference: <49DE3695.6040800@redhat.com> Signed-off-by: Ingo Molnar diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 81937a5..2d81af3 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -151,11 +151,11 @@ extern pte_t *pkmap_page_table; void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); void native_set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t flags); + phys_addr_t phys, pgprot_t flags); #ifndef CONFIG_PARAVIRT static inline void __set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t flags) + phys_addr_t phys, pgprot_t flags) { native_set_fixmap(idx, phys, flags); } diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index e5383e3..7373932 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h @@ -193,8 +193,10 @@ extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); */ extern void early_ioremap_init(void); extern void early_ioremap_reset(void); -extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); -extern void __iomem *early_memremap(unsigned long offset, unsigned long size); +extern void __iomem *early_ioremap(resource_size_t phys_addr, + unsigned long size); +extern void __iomem *early_memremap(resource_size_t phys_addr, + unsigned long size); extern void early_iounmap(void __iomem *addr, unsigned long size); #define IO_SPACE_LIMIT 0xffff diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 7727aa8..378e369 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -347,7 +347,7 @@ struct pv_mmu_ops { /* Sometimes the physical address is a pfn, and sometimes its an mfn. We can tell which is which from the index. */ void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, - unsigned long phys, pgprot_t flags); + phys_addr_t phys, pgprot_t flags); }; struct raw_spinlock; @@ -1432,7 +1432,7 @@ static inline void arch_leave_lazy_mmu_mode(void) void arch_flush_lazy_mmu_mode(void); static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, - unsigned long phys, pgprot_t flags) + phys_addr_t phys, pgprot_t flags) { pv_mmu_ops.set_fixmap(idx, phys, flags); } diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 0dfa09d..09daebf 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -547,7 +547,7 @@ void __init early_ioremap_reset(void) } static void __init __early_set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t flags) + phys_addr_t phys, pgprot_t flags) { unsigned long addr = __fix_to_virt(idx); pte_t *pte; @@ -566,7 +566,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx, } static inline void __init early_set_fixmap(enum fixed_addresses idx, - unsigned long phys, pgprot_t prot) + phys_addr_t phys, pgprot_t prot) { if (after_paging_init) __set_fixmap(idx, phys, prot); @@ -607,9 +607,10 @@ static int __init check_early_ioremap_leak(void) late_initcall(check_early_ioremap_leak); static void __init __iomem * -__early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) +__early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot) { - unsigned long offset, last_addr; + unsigned long offset; + resource_size_t last_addr; unsigned int nrpages; enum fixed_addresses idx0, idx; int i, slot; @@ -625,15 +626,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) } if (slot < 0) { - printk(KERN_INFO "early_iomap(%08lx, %08lx) not found slot\n", - phys_addr, size); + printk(KERN_INFO "early_iomap(%08llx, %08lx) not found slot\n", + (u64)phys_addr, size); WARN_ON(1); return NULL; } if (early_ioremap_debug) { - printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ", - phys_addr, size, slot); + printk(KERN_INFO "early_ioremap(%08llx, %08lx) [%d] => ", + (u64)phys_addr, size, slot); dump_stack(); } @@ -680,13 +681,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) } /* Remap an IO device */ -void __init __iomem *early_ioremap(unsigned long phys_addr, unsigned long size) +void __init __iomem * +early_ioremap(resource_size_t phys_addr, unsigned long size) { return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO); } /* Remap memory */ -void __init __iomem *early_memremap(unsigned long phys_addr, unsigned long size) +void __init __iomem * +early_memremap(resource_size_t phys_addr, unsigned long size) { return __early_ioremap(phys_addr, size, PAGE_KERNEL); } diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 5b7c7c84..7aa03a5 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -345,7 +345,8 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) fixmaps_set++; } -void native_set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags) +void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys, + pgprot_t flags) { __native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags)); } diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index db3802f..2a81838 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -1750,7 +1750,7 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, } #endif /* CONFIG_X86_64 */ -static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) +static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) { pte_t pte; -- cgit v0.10.2 From 066123a535927b3f17cac2305258cc71abdb0d92 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 10 Apr 2009 12:02:40 -0700 Subject: percpu: unbreak alpha percpu For the time being, move the generic percpu_*() accessors to linux/percpu.h. asm-generic/percpu.h is meant to carry generic stuff for low level stuff - declarations, definitions and pointer offset calculation and so on but not for generic interface. Signed-off-by: Ingo Molnar diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 00f45ff..b0e63c6 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h @@ -80,56 +80,4 @@ extern void setup_per_cpu_areas(void); #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ __typeof__(type) per_cpu_var(name) -/* - * Optional methods for optimized non-lvalue per-cpu variable access. - * - * @var can be a percpu variable or a field of it and its size should - * equal char, int or long. percpu_read() evaluates to a lvalue and - * all others to void. - * - * These operations are guaranteed to be atomic w.r.t. preemption. - * The generic versions use plain get/put_cpu_var(). Archs are - * encouraged to implement single-instruction alternatives which don't - * require preemption protection. - */ -#ifndef percpu_read -# define percpu_read(var) \ - ({ \ - typeof(per_cpu_var(var)) __tmp_var__; \ - __tmp_var__ = get_cpu_var(var); \ - put_cpu_var(var); \ - __tmp_var__; \ - }) -#endif - -#define __percpu_generic_to_op(var, val, op) \ -do { \ - get_cpu_var(var) op val; \ - put_cpu_var(var); \ -} while (0) - -#ifndef percpu_write -# define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) -#endif - -#ifndef percpu_add -# define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) -#endif - -#ifndef percpu_sub -# define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) -#endif - -#ifndef percpu_and -# define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) -#endif - -#ifndef percpu_or -# define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) -#endif - -#ifndef percpu_xor -# define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) -#endif - #endif /* _ASM_GENERIC_PERCPU_H_ */ diff --git a/include/linux/percpu.h b/include/linux/percpu.h index ee5615d..cfda2d5 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h @@ -168,4 +168,56 @@ static inline void free_percpu(void *p) #define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \ __alignof__(type)) +/* + * Optional methods for optimized non-lvalue per-cpu variable access. + * + * @var can be a percpu variable or a field of it and its size should + * equal char, int or long. percpu_read() evaluates to a lvalue and + * all others to void. + * + * These operations are guaranteed to be atomic w.r.t. preemption. + * The generic versions use plain get/put_cpu_var(). Archs are + * encouraged to implement single-instruction alternatives which don't + * require preemption protection. + */ +#ifndef percpu_read +# define percpu_read(var) \ + ({ \ + typeof(per_cpu_var(var)) __tmp_var__; \ + __tmp_var__ = get_cpu_var(var); \ + put_cpu_var(var); \ + __tmp_var__; \ + }) +#endif + +#define __percpu_generic_to_op(var, val, op) \ +do { \ + get_cpu_var(var) op val; \ + put_cpu_var(var); \ +} while (0) + +#ifndef percpu_write +# define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) +#endif + +#ifndef percpu_add +# define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) +#endif + +#ifndef percpu_sub +# define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) +#endif + +#ifndef percpu_and +# define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) +#endif + +#ifndef percpu_or +# define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) +#endif + +#ifndef percpu_xor +# define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) +#endif + #endif /* __LINUX_PERCPU_H */ -- cgit v0.10.2 From cb7301c7a3b2216c93b148fec0718d24f4ee2a99 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 20:40:12 -0700 Subject: Add scripts/get_maintainer.pl A script to parse file pattern information in MAINTAINERS and return selected information about a file or patch usage: scripts/get_maintainer.pl [options] patchfile scripts/get_maintainer.pl [options] -f file version: 0.14 MAINTAINERS field selection options: --email => print email address(es) if any --git => include git "*-by:" signers in commit count order --git-chief-penguins => include (Linus Torvalds) --git-min-signatures => number of signatures required (default: 1) --git-max-maintainers => maximum maintainers to add (default: 5) --git-since => git history to use (default: 1-year-ago) --m => include maintainer(s) if any --n => include name 'Full Name ' --l => include list(s) if any --s => include subscriber only list(s) if any --scm => print SCM tree(s) if any --status => print status if any --subsystem => print subsystem name if any --web => print website(s) if any Output type options: --separator [, ] => separator for multiple entries on 1 line --multiline => print 1 entry per line Default options: [--email --git --m --n --l --multiline] Other options: --version => show version --help => show this help information Signed-off-by: Joe Perches Acked-by: Pavel Machek diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl new file mode 100755 index 0000000..0f3c0a5 --- /dev/null +++ b/scripts/get_maintainer.pl @@ -0,0 +1,518 @@ +#!/usr/bin/perl -w +# (c) 2007, Joe Perches +# created from checkpatch.pl +# +# Print selected MAINTAINERS information for +# the files modified in a patch or for a file +# +# usage: perl scripts/get_maintainers.pl [OPTIONS] +# perl scripts/get_maintainers.pl [OPTIONS] -f +# +# Licensed under the terms of the GNU GPL License version 2 + +use strict; + +my $P = $0; +my $V = '0.14'; + +use Getopt::Long qw(:config no_auto_abbrev); + +my $lk_path = "./"; +my $email = 1; +my $email_usename = 1; +my $email_maintainer = 1; +my $email_list = 1; +my $email_subscriber_list = 0; +my $email_git = 1; +my $email_git_penguin_chiefs = 0; +my $email_git_min_signatures = 1; +my $email_git_max_maintainers = 5; +my $email_git_since = "1-year-ago"; +my $output_multiline = 1; +my $output_separator = ", "; +my $scm = 0; +my $web = 0; +my $subsystem = 0; +my $status = 0; +my $onefile = 0; +my $version = 0; +my $help = 0; + +my $exit = 0; + +my @penguin_chief = (); +push(@penguin_chief,"Linus Torvalds:torvalds\@linux-foundation.org"); +#Andrew wants in on most everything - 2009/01/14 +#push(@penguin_chief,"Andrew Morton:akpm\@linux-foundation.org"); + +my @penguin_chief_names = (); +foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $chief_name = $1; + my $chief_addr = $2; + push(@penguin_chief_names, $chief_name); + } +} +my $penguin_chiefs = "\(" . join("|",@penguin_chief_names) . "\)"; + +if (!GetOptions( + 'email!' => \$email, + 'git!' => \$email_git, + 'git-chief-penguins!' => \$email_git_penguin_chiefs, + 'git-min-signatures=i' => \$email_git_min_signatures, + 'git-max-maintainers=i' => \$email_git_max_maintainers, + 'git-since=s' => \$email_git_since, + 'm!' => \$email_maintainer, + 'n!' => \$email_usename, + 'l!' => \$email_list, + 's!' => \$email_subscriber_list, + 'multiline!' => \$output_multiline, + 'separator=s' => \$output_separator, + 'subsystem!' => \$subsystem, + 'status!' => \$status, + 'scm!' => \$scm, + 'web!' => \$web, + 'f|file' => \$onefile, + 'v|version' => \$version, + 'h|help' => \$help, + )) { + usage(); + die "$P: invalid argument\n"; +} + +if ($help != 0) { + usage(); + exit 0; +} + +if ($version != 0) { + print("${P} ${V}\n"); + exit 0; +} + +my $infile = $ARGV[0]; + +if ($#ARGV < 0) { + usage(); + die "$P: argument missing: patchfile or -f file please\n"; +} + +my $selections = $email + $scm + $status + $subsystem + $web; +if ($selections == 0) { + usage(); + die "$P: Missing required option: email, scm, status, subsystem or web\n"; +} + +if ($email && ($email_maintainer + $email_list + $email_subscriber_list + + $email_git + $email_git_penguin_chiefs) == 0) { + usage(); + die "$P: Please select at least 1 email option\n"; +} + +if (!top_of_kernel_tree($lk_path)) { + die "$P: The current directory does not appear to be " + . "a linux kernel source tree.\n"; +} + +## Read MAINTAINERS for type/value pairs + +my @typevalue = (); +open(MAINT, "<${lk_path}MAINTAINERS") || die "$P: Can't open MAINTAINERS\n"; +while () { + my $line = $_; + + if ($line =~ m/^(\C):\s*(.*)/) { + my $type = $1; + my $value = $2; + + ##Filename pattern matching + if ($type eq "F" || $type eq "X") { + $value =~ s@\.@\\\.@g; ##Convert . to \. + $value =~ s/\*/\.\*/g; ##Convert * to .* + $value =~ s/\?/\./g; ##Convert ? to . + } + push(@typevalue, "$type:$value"); + } elsif (!/^(\s)*$/) { + $line =~ s/\n$//g; + push(@typevalue, $line); + } +} +close(MAINT); + +## use the filename on the command line or find the filenames in the patchfile + +my @files = (); + +if ($onefile) { + if (!(-f $infile)) { + die "$P: file '${infile}' not found\n"; + } + push(@files, $infile); +} else { + open(PATCH, "<$infile") or die "$P: Can't open ${infile}\n"; + while () { + if (m/^\+\+\+\s+(\S+)/) { + my $file = $1; + $file =~ s@^[^/]*/@@; + $file =~ s@\n@@; + push(@files, $file); + } + } + close(PATCH); + my $file_cnt = @files; + if ($file_cnt == 0) { + print STDERR "$P: file '${infile}' doesn't appear to be a patch. " + . "Add -f to options?\n"; + } + @files = sort_and_uniq(@files); +} + +my @email_to = (); +my @scm = (); +my @web = (); +my @subsystem = (); +my @status = (); + +# Find responsible parties + +foreach my $file (@files) { + +#Do not match excluded file patterns + + my $exclude = 0; + foreach my $line (@typevalue) { + if ($line =~ m/^(\C):(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'X') { + if (file_match_pattern($file, $value)) { + $exclude = 1; + } + } + } + } + + if (!$exclude) { + my $tvi = 0; + foreach my $line (@typevalue) { + if ($line =~ m/^(\C):(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'F') { + if (file_match_pattern($file, $value)) { + add_categories($tvi); + } + } + } + $tvi++; + } + } + + if ($email_git) { + recent_git_signoffs($file); + } + +} + +if ($email_git_penguin_chiefs) { + foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $chief_name = $1; + my $chief_addr = $2; + if ($email_usename) { + push(@email_to, format_email($chief_name, $chief_addr)); + } else { + push(@email_to, $chief_addr); + } + } + } +} + +if ($email) { + my $address_cnt = @email_to; + if ($address_cnt == 0 && $email_list) { + push(@email_to, "linux-kernel\@vger.kernel.org"); + } + +#Don't sort email address list, but do remove duplicates + @email_to = uniq(@email_to); + output(@email_to); +} + +if ($scm) { + if (!$onefile) { + @scm = sort_and_uniq(@scm); + } + output(@scm); +} + +if ($status) { + if (!$onefile) { + @status = sort_and_uniq(@status); + } + output(@status); +} + +if ($subsystem) { + if (!$onefile) { + @subsystem = sort_and_uniq(@subsystem); + } + output(@subsystem); +} + +if ($web) { + if (!$onefile) { + @web = sort_and_uniq(@web); + } + output(@web); +} + +exit($exit); + +sub file_match_pattern { + my ($file, $pattern) = @_; + if (substr($pattern, -1) eq "/") { + if ($file =~ m@^$pattern@) { + return 1; + } + } else { + if ($file =~ m@^$pattern@) { + my $s1 = ($file =~ tr@/@@); + my $s2 = ($pattern =~ tr@/@@); + if ($s1 == $s2) { + return 1; + } + } + } + return 0; +} + +sub usage { + print < print email address(es) if any + --git => include recent git \*-by: signers + --git-chief-penguins => include ${penguin_chiefs} + --git-min-signatures => number of signatures required (default: 1) + --git-max-maintainers => maximum maintainers to add (default: 5) + --git-since => git history to use (default: 1-year-ago) + --m => include maintainer(s) if any + --n => include name 'Full Name ' + --l => include list(s) if any + --s => include subscriber only list(s) if any + --scm => print SCM tree(s) if any + --status => print status if any + --subsystem => print subsystem name if any + --web => print website(s) if any + +Output type options: + --separator [, ] => separator for multiple entries on 1 line + --multiline => print 1 entry per line + +Default options: + [--email --git --m --l --multiline] + +Other options: + --version -> show version + --help => show this help information + +EOT +} + +sub top_of_kernel_tree { + my ($lk_path) = @_; + + if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") { + $lk_path .= "/"; + } + if ( (-f "${lk_path}COPYING") + && (-f "${lk_path}CREDITS") + && (-f "${lk_path}Kbuild") + && (-f "${lk_path}MAINTAINERS") + && (-f "${lk_path}Makefile") + && (-f "${lk_path}README") + && (-d "${lk_path}Documentation") + && (-d "${lk_path}arch") + && (-d "${lk_path}include") + && (-d "${lk_path}drivers") + && (-d "${lk_path}fs") + && (-d "${lk_path}init") + && (-d "${lk_path}ipc") + && (-d "${lk_path}kernel") + && (-d "${lk_path}lib") + && (-d "${lk_path}scripts")) { + return 1; + } + return 0; +} + +sub format_email { + my ($name, $email) = @_; + + $name =~ s/^\s+|\s+$//g; + $email =~ s/^\s+|\s+$//g; + + my $formatted_email = ""; + + if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars + $name =~ s/(?"; + } else { + $formatted_email = "${name} \<${email}\>"; + } + return $formatted_email; +} + +sub add_categories { + my ($index) = @_; + + $index = $index - 1; + while ($index >= 0) { + my $tv = $typevalue[$index]; + if ($tv =~ m/^(\C):(.*)/) { + my $ptype = $1; + my $pvalue = $2; + if ($ptype eq "L") { + my $subscr = $pvalue; + if ($subscr =~ m/\s*\(subscribers-only\)/) { + if ($email_subscriber_list) { + $subscr =~ s/\s*\(subscribers-only\)//g; + push(@email_to, $subscr); + } + } else { + if ($email_list) { + push(@email_to, $pvalue); + } + } + } elsif ($ptype eq "M") { + if ($email_maintainer) { + if ($index >= 0) { + my $tv = $typevalue[$index - 1]; + if ($tv =~ m/^(\C):(.*)/) { + if ($1 eq "P" && $email_usename) { + push(@email_to, format_email($2, $pvalue)); + } else { + push(@email_to, $pvalue); + } + } + } else { + push(@email_to, $pvalue); + } + } + } elsif ($ptype eq "T") { + push(@scm, $pvalue); + } elsif ($ptype eq "W") { + push(@web, $pvalue); + } elsif ($ptype eq "S") { + push(@status, $pvalue); + } + + $index--; + } else { + push(@subsystem,$tv); + $index = -1; + } + } +} + +sub which { + my ($bin) = @_; + + foreach my $path (split /:/, $ENV{PATH}) { + if (-e "$path/$bin") { + return "$path/$bin"; + } + } + + return ""; +} + +sub recent_git_signoffs { + my ($file) = @_; + + my $sign_offs = ""; + my $cmd = ""; + my $output = ""; + my $count = 0; + my @lines = (); + + if (which("git") eq "") { + die("$P: git not found. Add --nogit to options?\n"); + } + + $cmd = "git log --since=${email_git_since} -- ${file}"; + $cmd .= " | grep -P '^ [-A-Za-z]+by:.*\\\@'"; + if (!$email_git_penguin_chiefs) { + $cmd .= " | grep -E -v \"${penguin_chiefs}\""; + } + $cmd .= " | sort | uniq -c | sort -rn"; + + $output = `${cmd}`; + $output =~ s/^\s*//gm; + + @lines = split("\n", $output); + foreach my $line (@lines) { + if ($line =~ m/([0-9]+)\s+([-A-Za-z]+by:)\s+(.*)/) { + my $sign_offs = $1; + $line = $3; + $count++; + if ($sign_offs < $email_git_min_signatures || + $count > $email_git_max_maintainers) { + last; + } + } else { + die("$P: Unexpected git output: ${line}\n"); + } + if ($line =~ m/(.*) <(.*)>/) { + my $git_name = $1; + my $git_addr = $2; + $git_name =~ tr/^\"//; + $git_name =~ tr/\"$//; + if ($email_usename) { + push(@email_to, format_email($git_name, $git_addr)); + } else { + push(@email_to, $git_addr); + } + } elsif ($line =~ m/<(.*)>/) { + my $git_addr = $1; + push(@email_to, $git_addr); + } else { + push(@email_to, $line); + } + } + return $output; +} + +sub uniq { + my @parms = @_; + + my %saw; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub sort_and_uniq { + my @parms = @_; + + my %saw; + @parms = sort @parms; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub output { + my @parms = @_; + + if ($output_multiline) { + foreach my $line (@parms) { + print("${line}\n"); + } + } else { + print(join($output_separator, @parms)); + print("\n"); + } +} -- cgit v0.10.2 From 679655daffdd2725b66ba2c5a759bbcb316fca5a Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 20:44:32 -0700 Subject: MAINTAINERS - Add file patterns Better description of file pattern tag "F:" Add file exclusion tag "X:" Add patterns to sections Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 5d84358..136aac6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -72,7 +72,6 @@ M: Mail patches to L: Mailing list that is relevant to this area W: Web-page with status/info T: SCM tree type and location. Type is one of: git, hg, quilt. -F: Applicable files and/or directories S: Status, one of the following: Supported: Someone is actually paid to look after this. @@ -85,23 +84,40 @@ S: Status, one of the following: it has been replaced by a better system and you should be using that. +F: Files and directories with wildcard patterns. + A trailing slash includes all files and subdirectory files. + F: drivers/net/ all files in and below drivers/net + F: drivers/net/* all files in drivers/net, but not below + F: */net/* all files in "any top level directory"/net + One pattern per line. Multiple F: lines acceptable. +X: Files and directories that are NOT maintained, same rules as F: + Files exclusions are tested before file matches. + Can be useful for excluding a specific subdirectory, for instance: + F: net/ + X: net/ipv6/ + matches all files in and below net excluding net/ipv6/ + 3C505 NETWORK DRIVER P: Philip Blundell M: philb@gnu.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/3c505* 3C59X NETWORK DRIVER P: Steffen Klassert M: klassert@mathematik.tu-chemnitz.de L: netdev@vger.kernel.org S: Maintained +F: Documentation/networking/vortex.txt +F: drivers/net/3c59x.c 3CR990 NETWORK DRIVER P: David Dillow M: dave@thedillows.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/typhoon* 3W-9XXX SATA-RAID CONTROLLER DRIVER P: Adam Radford @@ -109,6 +125,7 @@ M: linuxraid@amcc.com L: linux-scsi@vger.kernel.org W: http://www.amcc.com S: Supported +F: drivers/scsi/3w-9xxx* 3W-XXXX ATA-RAID CONTROLLER DRIVER P: Adam Radford @@ -116,35 +133,43 @@ M: linuxraid@amcc.com L: linux-scsi@vger.kernel.org W: http://www.amcc.com S: Supported +F: drivers/scsi/3w-xxxx* 53C700 AND 53C700-66 SCSI DRIVER P: James E.J. Bottomley M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/53c700* 6PACK NETWORK DRIVER FOR AX.25 P: Andreas Koensgen M: ajk@iehk.rwth-aachen.de L: linux-hams@vger.kernel.org S: Maintained +F: drivers/net/hamradio/6pack.c 8169 10/100/1000 GIGABIT ETHERNET DRIVER P: Francois Romieu M: romieu@fr.zoreil.com L: netdev@vger.kernel.org S: Maintained +F: drivers/net/r8169.c 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER L: linux-serial@vger.kernel.org W: http://serial.sourceforge.net S: Orphan +F: drivers/serial/8250* +F: include/linux/serial_8250.h 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.] P: Paul Gortmaker M: p_gortmaker@yahoo.com L: netdev@vger.kernel.org S: Maintained +F: drivers/net/*8390* +F: drivers/net/ax88796.c 9P FILE SYSTEM P: Eric Van Hensbergen @@ -157,12 +182,15 @@ L: v9fs-developer@lists.sourceforge.net W: http://swik.net/v9fs T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git S: Maintained +F: Documentation/filesystems/9p.txt +F: fs/9p/ A2232 SERIAL BOARD DRIVER P: Enver Haase M: A2232@gmx.net L: linux-m68k@lists.linux-m68k.org S: Maintained +F: drivers/char/ser_a2232* AACRAID SCSI RAID DRIVER P: Adaptec OEM Raid Solutions @@ -170,24 +198,29 @@ M: aacraid@adaptec.com L: linux-scsi@vger.kernel.org W: http://www.adaptec.com/ S: Supported +F: Documentation/scsi/aacraid.txt +F: drivers/scsi/aacraid/ ABIT UGURU 1,2 HARDWARE MONITOR DRIVER P: Hans de Goede M: j.w.r.degoede@hhs.nl L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/abituguru.c ABIT UGURU 3 HARDWARE MONITOR DRIVER P: Alistair John Strachan M: alistair@devzero.co.uk L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/abituguru3.c ACENIC DRIVER P: Jes Sorensen M: jes@trained-monkey.org L: linux-acenic@sunsite.dk S: Maintained +F: drivers/net/acenic* ACER WMI LAPTOP EXTRAS P: Carlos Corbacho @@ -195,6 +228,7 @@ M: carlos@strangeworlds.co.uk L: aceracpi@googlegroups.com (subscribers-only) W: http://code.google.com/p/aceracpi S: Maintained +F: drivers/platform/x86/acer-wmi.c ACPI P: Len Brown @@ -203,6 +237,9 @@ L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git S: Supported +F: drivers/acpi/ +F: drivers/pnp/pnpacpi/ +F: include/linux/acpi.h ACPI BATTERY DRIVERS P: Alexey Starikovskiy @@ -210,6 +247,8 @@ M: astarikovskiy@suse.de L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/acpi/battery.c +F: drivers/acpi/*sbs* ACPI EC DRIVER P: Alexey Starikovskiy @@ -217,6 +256,7 @@ M: astarikovskiy@suse.de L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/acpi/ec.c ACPI FAN DRIVER P: Zhang Rui @@ -224,12 +264,14 @@ M: rui.zhang@intel.com L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/acpi/fan.c ACPI PCI HOTPLUG DRIVER P: Kristen Carlson Accardi M: kristen.c.accardi@intel.com L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/hotplug/acpi* ACPI THERMAL DRIVER P: Zhang Rui @@ -237,6 +279,7 @@ M: rui.zhang@intel.com L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/acpi/*thermal* ACPI VIDEO DRIVER P: Zhang Rui @@ -244,6 +287,7 @@ M: rui.zhang@intel.com L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/acpi/video.c ACPI WMI DRIVER P: Carlos Corbacho @@ -251,6 +295,7 @@ M: carlos@strangeworlds.co.uk L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Maintained +F: drivers/platform/x86/wmi.c AD1889 ALSA SOUND DRIVER P: Kyle McMartin @@ -260,18 +305,22 @@ M: T-Bone@parisc-linux.org W: http://wiki.parisc-linux.org/AD1889 L: linux-parisc@vger.kernel.org S: Maintained +F: sound/pci/ad1889.* ADM1025 HARDWARE MONITOR DRIVER P: Jean Delvare M: khali@linux-fr.org L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/adm1025 +F: drivers/hwmon/adm1025.c ADM1029 HARDWARE MONITOR DRIVER P: Corentin Labbe M: corentin.labbe@geomatys.fr L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/adm1029.c ADM8211 WIRELESS DRIVER P: Michael Wu @@ -280,57 +329,75 @@ L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ T: git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git S: Maintained +F: drivers/net/wireless/adm8211.* ADT746X FAN DRIVER P: Colin Leroy M: colin@colino.net S: Maintained +F: drivers/macintosh/therm_adt746x.c ADVANSYS SCSI DRIVER P: Matthew Wilcox M: matthew@wil.cx L: linux-scsi@vger.kernel.org S: Maintained +F: Documentation/scsi/advansys.txt +F: drivers/scsi/advansys.c AEDSP16 DRIVER P: Riccardo Facchetti M: fizban@tin.it S: Maintained +F: sound/oss/aedsp16.c AFFS FILE SYSTEM P: Roman Zippel M: zippel@linux-m68k.org S: Maintained +F: Documentation/filesystems/affs.txt +F: fs/affs/ AFS FILESYSTEM & AF_RXRPC SOCKET DOMAIN P: David Howells M: dhowells@redhat.com L: linux-afs@lists.infradead.org S: Supported +F: fs/afs/ +F: include/net/af_rxrpc.h +F: net/rxrpc/af_rxrpc.c AGPGART DRIVER P: David Airlie M: airlied@linux.ie T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git S: Maintained +F: drivers/char/agp/ +F: include/linux/agp* AHA152X SCSI DRIVER P: Juergen E. Fischer M: Juergen Fischer L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/aha152x* +F: drivers/scsi/pcmcia/aha152x* AIC7XXX / AIC79XX SCSI DRIVER P: Hannes Reinecke M: hare@suse.de L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/aic7xxx/ +F: drivers/scsi/aic7xxx_old/ AIO P: Benjamin LaHaise M: bcrl@kvack.org L: linux-aio@kvack.org S: Supported +F: fs/aio.c +F: include/linux/*aio*.h ALCATEL SPEEDTOUCH USB DRIVER P: Duncan Sands @@ -338,17 +405,22 @@ M: duncan.sands@free.fr L: linux-usb@vger.kernel.org W: http://www.linux-usb.org/SpeedTouch/ S: Maintained +F: drivers/usb/atm/speedtch.c +F: drivers/usb/atm/usbatm.c ALCHEMY AU1XX0 MMC DRIVER P: Manuel Lauss M: manuel.lauss@gmail.com S: Maintained +F: drivers/mmc/host/au1xmmc.c ALI1563 I2C DRIVER P: Rudolf Marek M: r.marek@assembler.cz L: linux-i2c@vger.kernel.org S: Maintained +F: Documentation/i2c/busses/i2c-ali1563 +F: drivers/i2c/busses/i2c-ali1563.c ALPHA PORT P: Richard Henderson @@ -358,18 +430,25 @@ P: Ivan Kokshaysky M: ink@jurassic.park.msu.ru S: Maintained for 2.4; PCI support for 2.6. L: linux-alpha@vger.kernel.org +F: arch/alpha/ AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER P: Thomas Dahlmann M: thomas.dahlmann@amd.com L: linux-geode@lists.infradead.org (moderated for non-subscribers) S: Supported +F: drivers/usb/gadget/amd5536udc.* AMD GEODE PROCESSOR/CHIPSET SUPPORT P: Jordan Crouse L: linux-geode@lists.infradead.org (moderated for non-subscribers) W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html S: Supported +F: arch/x86/kernel/geode_32.c +F: drivers/char/hw_random/geode-rng.c +F: drivers/crypto/geode* +F: drivers/video/geode/ +F: arch/x86/include/asm/geode.h AMD IOMMU (AMD-VI) P: Joerg Roedel @@ -377,12 +456,15 @@ M: joerg.roedel@amd.com L: iommu@lists.linux-foundation.org T: git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git S: Supported +F: arch/x86/kernel/amd_iommu*.c +F: arch/x86/include/asm/amd_iommu*.h AMD MICROCODE UPDATE SUPPORT P: Andreas Herrmann M: andeas.herrmann3@amd.com L: amd64-microcode@amd64.org S: Supported +F: arch/x86/kernel/microcode_amd.c AMS (Apple Motion Sensor) DRIVER P: Stelian Pop @@ -390,6 +472,7 @@ M: stelian@popies.net P: Michael Hanselmann M: linux-kernel@hansmi.ch S: Supported +F: drivers/hwmon/ams/ AMSO1100 RNIC DRIVER P: Tom Tucker @@ -398,6 +481,7 @@ P: Steve Wise M: swise@opengridcomputing.com L: general@lists.openfabrics.org S: Maintained +F: drivers/infiniband/hw/amso1100/ AOA (Apple Onboard Audio) ALSA DRIVER P: Johannes Berg @@ -405,6 +489,7 @@ M: johannes@sipsolutions.net L: linuxppc-dev@ozlabs.org L: alsa-devel@alsa-project.org (subscribers-only) S: Maintained +F: sound/aoa/ APM DRIVER P: Stephen Rothwell @@ -412,48 +497,63 @@ M: sfr@canb.auug.org.au L: linux-laptop@vger.kernel.org W: http://www.canb.auug.org.au/~sfr/ S: Supported +F: arch/x86/kernel/apm_32.c +F: include/linux/apm_bios.h APPLE BCM5974 MULTITOUCH DRIVER P: Henrik Rydberg M: rydberg@euromail.se L: linux-input@vger.kernel.org S: Maintained +F: drivers/input/mouse/bcm5974.c APPLE SMC DRIVER P: Nicolas Boichat M: nicolas@boichat.ch L: mactel-linux-devel@lists.sourceforge.net S: Maintained +F: drivers/hwmon/applesmc.c APPLETALK NETWORK LAYER P: Arnaldo Carvalho de Melo M: acme@ghostprotocols.net S: Maintained +F: drivers/net/appletalk/ +F: net/appletalk/ APPLETOUCH TOUCHPAD DRIVER P: Johannes Berg M: johannes@sipsolutions.net L: linux-input@vger.kernel.org S: Maintained +F: Documentation/input/appletouch.txt +F: drivers/input/mouse/appletouch.c ARC FRAMEBUFFER DRIVER P: Jaya Kumar M: jayalk@intworks.biz S: Maintained +F: drivers/video/arcfb.c +F: drivers/video/fb_defio.c ARM MFM AND FLOPPY DRIVERS P: Ian Molton M: spyro@f2s.com S: Maintained +F: arch/arm/lib/floppydma.S +F: arch/arm/include/asm/floppy.h ARM PRIMECELL MMCI PL180/1 DRIVER S: Orphan +F: drivers/mmc/host/mmci.* ARM/ADI ROADRUNNER MACHINE SUPPORT P: Lennert Buytenhek M: kernel@wantstofly.org L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained +F: arch/arm/mach-ixp23xx/ +F: arch/arm/mach-ixp23xx/include/mach/ ARM/ADS SPHERE MACHINE SUPPORT P: Lennert Buytenhek @@ -717,6 +817,7 @@ ARPD SUPPORT P: Jonathan Layes L: netdev@vger.kernel.org S: Maintained +F: net/ipv4/arp.c ASUS ACPI EXTRAS DRIVER P: Corentin Chary @@ -727,12 +828,15 @@ L: acpi4asus-user@lists.sourceforge.net W: http://sourceforge.net/projects/acpi4asus W: http://xf.iksaif.net/acpi4asus S: Maintained +F: arch/x86/kernel/acpi/boot.c +F: drivers/platform/x86/asus_acpi.c ASUS ASB100 HARDWARE MONITOR DRIVER P: Mark M. Hoffman M: mhoffman@lightlink.com L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/asb100.c ASUS LAPTOP EXTRAS DRIVER P: Corentin Chary @@ -741,6 +845,7 @@ L: acpi4asus-user@lists.sourceforge.net W: http://sourceforge.net/projects/acpi4asus W: http://xf.iksaif.net/acpi4asus S: Maintained +F: drivers/platform/x86/asus-laptop.c ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API P: Dan Williams @@ -750,12 +855,19 @@ M: maciej.sosnowski@intel.com L: linux-kernel@vger.kernel.org W: http://sourceforge.net/projects/xscaleiop S: Supported +F: Documentation/crypto/async-tx-api.txt +F: crypto/async_tx/ +F: drivers/dma/ +F: include/linux/dmaengine.h +F: include/linux/async_tx.h ATA OVER ETHERNET (AOE) DRIVER P: Ed L. Cashin M: ecashin@coraid.com W: http://www.coraid.com/support/linux S: Supported +F: Documentation/aoe/ +F: drivers/block/aoe/ ATHEROS ATH5K WIRELESS DRIVER P: Jiri Slaby @@ -769,6 +881,7 @@ M: me@bobcopeland.com L: linux-wireless@vger.kernel.org L: ath5k-devel@lists.ath5k.org S: Maintained +F: drivers/net/wireless/ath5k/ ATHEROS ATH9K WIRELESS DRIVER P: Luis R. Rodriguez @@ -778,6 +891,7 @@ M: jmalinen@atheros.com L: linux-wireless@vger.kernel.org L: ath9k-devel@lists.ath9k.org S: Supported +F: drivers/net/wireless/ath9k/ ATHEROS AR9170 WIRELESS DRIVER P: Christian Lamparter @@ -791,6 +905,7 @@ ATI_REMOTE2 DRIVER P: Ville Syrjala M: syrjala@sci.fi S: Maintained +F: drivers/input/misc/ati_remote2.c ATLX ETHERNET DRIVERS P: Jay Cliburn @@ -803,6 +918,7 @@ L: atl1-devel@lists.sourceforge.net W: http://sourceforge.net/projects/atl1 W: http://atl1.sourceforge.net S: Maintained +F: drivers/net/atlx/ ATM P: Chas Williams @@ -811,6 +927,8 @@ L: linux-atm-general@lists.sourceforge.net (subscribers-only) L: netdev@vger.kernel.org W: http://linux-atm.sourceforge.net S: Maintained +F: drivers/atm/ +F: include/linux/atm* ATMEL AT91 MCI DRIVER P: Nicolas Ferre @@ -819,28 +937,34 @@ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) W: http://www.atmel.com/products/AT91/ W: http://www.at91.com/ S: Maintained +F: drivers/mmc/host/at91_mci.c ATMEL AT91 / AT32 SERIAL DRIVER P: Haavard Skinnemoen M: hskinnemoen@atmel.com L: linux-kernel@vger.kernel.org S: Supported +F: drivers/serial/atmel_serial.c ATMEL LCDFB DRIVER P: Nicolas Ferre M: nicolas.ferre@atmel.com L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/atmel_lcdfb.c +F: include/video/atmel_lcdc.h ATMEL MACB ETHERNET DRIVER P: Haavard Skinnemoen M: hskinnemoen@atmel.com S: Supported +F: drivers/net/macb.* ATMEL SPI DRIVER P: Haavard Skinnemoen M: hskinnemoen@atmel.com S: Supported +F: drivers/spi/atmel_spi.* ATMEL USBA UDC DRIVER P: Haavard Skinnemoen @@ -848,6 +972,7 @@ M: hskinnemoen@atmel.com L: kernel@avr32linux.org W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver S: Supported +F: drivers/usb/gadget/atmel_usba_udc.* ATMEL WIRELESS DRIVER P: Simon Kelley @@ -856,6 +981,7 @@ L: linux-wireless@vger.kernel.org W: http://www.thekelleys.org.uk/atmel W: http://atmelwlandriver.sourceforge.net/ S: Maintained +F: drivers/net/wireless/atmel* AUDIT SUBSYSTEM P: Al Viro @@ -866,6 +992,8 @@ L: linux-audit@redhat.com (subscribers-only) W: http://people.redhat.com/sgrubb/audit/ T: git git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git S: Maintained +F: include/linux/audit.h +F: kernel/audit* AUXILIARY DISPLAY DRIVERS P: Miguel Ojeda Sandonis @@ -874,6 +1002,8 @@ L: linux-kernel@vger.kernel.org W: http://miguelojeda.es/auxdisplay.htm W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm S: Maintained +F: drivers/auxdisplay/ +F: include/linux/cfag12864b.h AVR32 ARCHITECTURE P: Haavard Skinnemoen @@ -882,11 +1012,13 @@ W: http://www.atmel.com/products/AVR32/ W: http://avr32linux.org/ W: http://avrfreaks.net/ S: Supported +F: arch/avr32/ AVR32/AT32AP MACHINE SUPPORT P: Haavard Skinnemoen M: hskinnemoen@atmel.com S: Supported +F: arch/avr32/mach-at32ap/ AX.25 NETWORK LAYER P: Ralf Baechle @@ -894,6 +1026,9 @@ M: ralf@linux-mips.org L: linux-hams@vger.kernel.org W: http://www.linux-ax25.org/ S: Maintained +F: include/linux/ax25.h +F: include/net/ax25.h +F: net/ax25/ B43 WIRELESS DRIVER P: Michael Buesch @@ -903,6 +1038,7 @@ M: stefano.brivio@polimi.it L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/en/users/Drivers/b43 S: Maintained +F: drivers/net/wireless/b43/ B43LEGACY WIRELESS DRIVER P: Larry Finger @@ -912,11 +1048,14 @@ M: stefano.brivio@polimi.it L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/en/users/Drivers/b43 S: Maintained +F: drivers/net/wireless/b43legacy/ BACKLIGHT CLASS/SUBSYSTEM P: Richard Purdie M: rpurdie@rpsys.net S: Maintained +F: drivers/video/backlight/ +F: include/linux/backlight.h BAYCOM/HDLCDRV DRIVERS FOR AX.25 P: Thomas Sailer @@ -924,18 +1063,24 @@ M: t.sailer@alumni.ethz.ch L: linux-hams@vger.kernel.org W: http://www.baycom.org/~tom/ham/ham.html S: Maintained +F: drivers/net/hamradio/baycom* BEFS FILE SYSTEM P: Sergey S. Kostyliov M: rathamahata@php4.ru L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/befs.txt +F: fs/befs/ BFS FILE SYSTEM P: Tigran A. Aivazian M: tigran@aivazian.fsnet.co.uk L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/bfs.txt +F: fs/bfs/ +F: include/linux/bfs_fs.h BLACKFIN ARCHITECTURE P: Bryan Wu @@ -943,6 +1088,7 @@ M: cooloney@kernel.org L: uclinux-dist-devel@blackfin.uclinux.org W: http://blackfin.uclinux.org S: Supported +F: arch/blackfin/ BLACKFIN EMAC DRIVER P: Bryan Wu @@ -950,6 +1096,7 @@ M: cooloney@kernel.org L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) W: http://blackfin.uclinux.org S: Supported +F: drivers/net/bfin_mac.* BLACKFIN RTC DRIVER P: Mike Frysinger @@ -957,6 +1104,7 @@ M: vapier.adi@gmail.com L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) W: http://blackfin.uclinux.org S: Supported +F: drivers/rtc/rtc-bfin.c BLACKFIN SERIAL DRIVER P: Sonic Zhang @@ -964,6 +1112,7 @@ M: sonic.zhang@analog.com L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) W: http://blackfin.uclinux.org S: Supported +F: drivers/serial/bfin_5xx.c BLACKFIN WATCHDOG DRIVER P: Mike Frysinger @@ -971,6 +1120,7 @@ M: vapier.adi@gmail.com L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) W: http://blackfin.uclinux.org S: Supported +F: drivers/watchdog/bfin_wdt.c BLACKFIN I2C TWI DRIVER P: Sonic Zhang @@ -978,6 +1128,7 @@ M: sonic.zhang@analog.com L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) W: http://blackfin.uclinux.org/ S: Supported +F: drivers/i2c/busses/i2c-bfin-twi.c BLOCK LAYER P: Jens Axboe @@ -985,12 +1136,14 @@ M: axboe@kernel.dk L: linux-kernel@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git S: Maintained +F: block/ BLOCK2MTD DRIVER P: Joern Engel M: joern@lazybastard.org L: linux-mtd@lists.infradead.org S: Maintained +F: drivers/mtd/devices/block2mtd.c BLUETOOTH DRIVERS P: Marcel Holtmann @@ -998,6 +1151,7 @@ M: marcel@holtmann.org L: linux-bluetooth@vger.kernel.org W: http://www.bluez.org/ S: Maintained +F: drivers/bluetooth/ BLUETOOTH SUBSYSTEM P: Marcel Holtmann @@ -1006,6 +1160,8 @@ L: linux-bluetooth@vger.kernel.org W: http://www.bluez.org/ T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git S: Maintained +F: net/bluetooth/ +F: include/net/bluetooth/ BONDING DRIVER P: Jay Vosburgh @@ -1013,24 +1169,30 @@ M: fubar@us.ibm.com L: bonding-devel@lists.sourceforge.net W: http://sourceforge.net/projects/bonding/ S: Supported +F: drivers/net/bonding/ +F: include/linux/if_bonding.h BROADCOM B44 10/100 ETHERNET DRIVER P: Gary Zambrano M: zambrano@broadcom.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/b44.* BROADCOM BNX2 GIGABIT ETHERNET DRIVER P: Michael Chan M: mchan@broadcom.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/bnx2.* +F: drivers/net/bnx2_* BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER P: Eilon Greenstein M: eilong@broadcom.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/bnx2x* BROADCOM TG3 GIGABIT ETHERNET DRIVER P: Matt Carlson @@ -1039,18 +1201,22 @@ P: Michael Chan M: mchan@broadcom.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/tg3.* BSG (block layer generic sg v4 driver) P: FUJITA Tomonori M: fujita.tomonori@lab.ntt.co.jp L: linux-scsi@vger.kernel.org S: Supported +F: block/bsg.c +F: include/linux/bsg.h BT8XXGPIO DRIVER P: Michael Buesch M: mb@bu3sch.de W: http://bu3sch.de/btgpio.php S: Maintained +F: drivers/gpio/bt8xxgpio.c BTRFS FILE SYSTEM P: Chris Mason @@ -1059,6 +1225,8 @@ L: linux-btrfs@vger.kernel.org W: http://btrfs.wiki.kernel.org/ T: git kernel.org:/pub/scm/linux/kernel/git/mason/btrfs-unstable.git S: Maintained +F: Documentation/filesystems/btrfs.txt +F: fs/btrfs/ BTTV VIDEO4LINUX DRIVER P: Mauro Carvalho Chehab @@ -1067,6 +1235,8 @@ L: linux-media@vger.kernel.org W: http://linuxtv.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: Documentation/video4linux/bttv/ +F: drivers/media/video/bt8xx/bttv* CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER P: Jonathan Corbet @@ -1074,6 +1244,8 @@ M: corbet@lwn.net L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: Documentation/video4linux/cafe_ccic +F: drivers/media/video/cafe_ccic* CALGARY x86-64 IOMMU P: Muli Ben-Yehuda @@ -1083,6 +1255,10 @@ M: jdmason@kudzu.us L: linux-kernel@vger.kernel.org L: discuss@x86-64.org S: Maintained +F: arch/x86/kernel/pci-calgary_64.c +F: arch/x86/kernel/tce_64.c +F: arch/x86/include/asm/calgary.h +F: arch/x86/include/asm/tce.h CAN NETWORK LAYER P: Urs Thuermann @@ -1092,6 +1268,9 @@ M: oliver.hartkopp@volkswagen.de L: socketcan-core@lists.berlios.de (subscribers-only) W: http://developer.berlios.de/projects/socketcan/ S: Maintained +F: drivers/net/can/ +F: include/linux/can/ +F: include/linux/can.h CELL BROADBAND ENGINE ARCHITECTURE P: Arnd Bergmann @@ -1100,12 +1279,23 @@ L: linuxppc-dev@ozlabs.org L: cbe-oss-dev@ozlabs.org W: http://www.ibm.com/developerworks/power/cell/ S: Supported +F: arch/powerpc/include/asm/cell*.h +F: arch/powerpc/include/asm/lv1call.h +F: arch/powerpc/include/asm/ps3*.h +F: arch/powerpc/include/asm/spu*.h +F: arch/powerpc/oprofile/*cell* +F: arch/powerpc/platforms/cell/ +F: arch/powerpc/platforms/ps3/ CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM: P: David Vrabel M: david.vrabel@csr.com L: linux-usb@vger.kernel.org S: Supported +F: Documentation/usb/WUSB-Design-overview.txt +F: Documentation/usb/wusb-cbaf +F: drivers/usb/wusbcore/ +F: include/linux/usb/wusb* CFAG12864B LCD DRIVER P: Miguel Ojeda Sandonis @@ -1114,6 +1304,8 @@ L: linux-kernel@vger.kernel.org W: http://miguelojeda.es/auxdisplay.htm W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm S: Maintained +F: drivers/auxdisplay/cfag12864b.c +F: include/linux/cfag12864b.h CFAG12864BFB LCD FRAMEBUFFER DRIVER P: Miguel Ojeda Sandonis @@ -1122,18 +1314,25 @@ L: linux-kernel@vger.kernel.org W: http://miguelojeda.es/auxdisplay.htm W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm S: Maintained +F: drivers/auxdisplay/cfag12864bfb.c +F: include/linux/cfag12864b.h CFG80211 and NL80211 P: Johannes Berg M: johannes@sipsolutions.net L: linux-wireless@vger.kernel.org S: Maintained +F: include/linux/nl80211.h +F: include/net/cfg80211.h +F: net/wireless/* +X: net/wireless/wext* CHECKPATCH P: Andy Whitcroft M: apw@canonical.com L: linux-kernel@vger.kernel.org S: Supported +F: scripts/checkpatch.pl CISCO 10G ETHERNET DRIVER P: Scott Feldman @@ -1141,24 +1340,29 @@ M: scofeldm@cisco.com P: Joe Eykholt M: jeykholt@cisco.com S: Supported +F: drivers/net/enic/ CIRRUS LOGIC EP93XX ETHERNET DRIVER P: Lennert Buytenhek M: kernel@wantstofly.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/arm/ep93xx_eth.c CIRRUS LOGIC EP93XX OHCI USB HOST DRIVER P: Lennert Buytenhek M: kernel@wantstofly.org L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/host/ohci-ep93xx.c CIRRUS LOGIC CS4270 SOUND DRIVER P: Timur Tabi M: timur@freescale.com L: alsa-devel@alsa-project.org S: Supported +F: sound/soc/codecs/cs4270* +F: sound/soc/fsl/mpc8610_hpcd.c CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER P: Cirrus Logic Corporation (kernel 2.2 driver) @@ -1166,6 +1370,8 @@ M: Cirrus Logic Corporation, Thomas Woller P: Nils Faerber (port to kernel 2.4) M: Nils Faerber S: Maintained +F: Documentation/input/cs461x.txt +F: sound/pci/cs46xx/ CODA FILE SYSTEM P: Jan Harkes @@ -1174,6 +1380,9 @@ M: coda@cs.cmu.edu L: codalist@coda.cs.cmu.edu W: http://www.coda.cs.cmu.edu/ S: Maintained +F: Documentation/filesystems/coda.txt +F: fs/coda/ +F: include/linux/coda*.h COMMON INTERNET FILE SYSTEM (CIFS) P: Steve French @@ -1183,6 +1392,8 @@ L: samba-technical@lists.samba.org W: http://linux-cifs.samba.org/ T: git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git S: Supported +F: Documentation/filesystems/cifs.txt +F: fs/cifs/ COMPACTPCI HOTPLUG CORE P: Scott Murray @@ -1190,6 +1401,7 @@ M: scottm@somanetworks.com M: scott@spiteful.org L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/hotplug/cpci_hotplug* COMPACTPCI HOTPLUG ZIATECH ZT5550 DRIVER P: Scott Murray @@ -1197,6 +1409,7 @@ M: scottm@somanetworks.com M: scott@spiteful.org L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/hotplug/cpcihp_zt5550.* COMPACTPCI HOTPLUG GENERIC DRIVER P: Scott Murray @@ -1204,17 +1417,21 @@ M: scottm@somanetworks.com M: scott@spiteful.org L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/hotplug/cpcihp_generic.c COMPAL LAPTOP SUPPORT P: Cezary Jackiewicz M: cezary.jackiewicz@gmail.com S: Maintained +F: drivers/platform/x86/compal-laptop.c COMPUTONE INTELLIPORT MULTIPORT CARD P: Michael H. Warfield M: mhw@wittsend.com W: http://www.wittsend.com/computone.html S: Maintained +F: Documentation/serial/computone.txt +F: drivers/char/ip2/ CONEXANT ACCESSRUNNER USB DRIVER P: Simon Arlott @@ -1222,12 +1439,15 @@ M: cxacru@fire.lp0.eu L: accessrunner-general@lists.sourceforge.net W: http://accessrunner.sourceforge.net/ S: Maintained +F: drivers/usb/atm/cxacru.c CONFIGFS P: Joel Becker M: joel.becker@oracle.com L: linux-kernel@vger.kernel.org S: Supported +F: fs/configfs/ +F: include/linux/configfs.h CONTROL GROUPS (CGROUPS) P: Paul Menage @@ -1236,18 +1456,23 @@ P: Li Zefan M: lizf@cn.fujitsu.com L: containers@lists.linux-foundation.org S: Maintained +F: include/linux/cgroup* +F: kernel/cgroup* CORETEMP HARDWARE MONITORING DRIVER P: Rudolf Marek M: r.marek@assembler.cz L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/coretemp +F: drivers/hwmon/coretemp.c COSA/SRP SYNC SERIAL DRIVER P: Jan "Yenya" Kasprzak M: kas@fi.muni.cz W: http://www.fi.muni.cz/~kas/cosa/ S: Maintained +F: drivers/net/wan/cosa* CPU FREQUENCY DRIVERS P: Dave Jones @@ -1256,11 +1481,16 @@ L: cpufreq@vger.kernel.org W: http://www.codemonkey.org.uk/projects/cpufreq/ T: git kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git S: Maintained +F: arch/x86/kernel/cpu/cpufreq/ +F: drivers/cpufreq/ +F: include/linux/cpufreq.h CPUID/MSR DRIVER P: H. Peter Anvin M: hpa@zytor.com S: Maintained +F: arch/x86/kernel/cpuid.c +F: arch/x86/kernel/msr.c CPUSETS P: Paul Menage @@ -1269,10 +1499,15 @@ L: linux-kernel@vger.kernel.org W: http://www.bullopensource.org/cpuset/ W: http://oss.sgi.com/projects/cpusets/ S: Supported +F: Documentation/cgroups/cpusets.txt +F: include/linux/cpuset.h +F: kernel/cpuset.c CRAMFS FILESYSTEM W: http://sourceforge.net/projects/cramfs/ S: Orphan +F: Documentation/filesystems/cramfs.txt +F: fs/cramfs/ CRIS PORT P: Mikael Starvik @@ -1282,6 +1517,7 @@ M: jesper.nilsson@axis.com L: dev-etrax@axis.com W: http://developer.axis.com S: Maintained +F: arch/cris/ CRYPTO API P: Herbert Xu @@ -1291,6 +1527,11 @@ M: davem@davemloft.net L: linux-crypto@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git S: Maintained +F: Documentation/crypto/ +F: arch/*/crypto/ +F: crypto/ +F: drivers/crypto/ +F: include/crypto/ CRYPTOGRAPHIC RANDOM NUMBER GENERATOR P: Neil Horman @@ -1302,6 +1543,7 @@ CS5535 Audio ALSA driver P: Jaya Kumar M: jayakumar.alsa@gmail.com S: Maintained +F: sound/pci/cs5535audio/ CX18 VIDEO4LINUX DRIVER P: Hans Verkuil, Andy Walls @@ -1312,6 +1554,8 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://linuxtv.org S: Maintained +F: Documentation/video4linux/cx18.txt +F: drivers/media/video/cx18/ CXGB3 ETHERNET DRIVER (CXGB3) P: Divy Le Ray @@ -1319,6 +1563,7 @@ M: divy@chelsio.com L: netdev@vger.kernel.org W: http://www.chelsio.com S: Supported +F: drivers/net/cxgb3/ CXGB3 IWARP RNIC DRIVER (IW_CXGB3) P: Steve Wise @@ -1326,12 +1571,14 @@ M: swise@chelsio.com L: general@lists.openfabrics.org W: http://www.openfabrics.org S: Supported +F: drivers/infiniband/hw/cxgb3/ CYBERPRO FB DRIVER P: Russell King M: rmk@arm.linux.org.uk W: http://www.arm.linux.org.uk/ S: Maintained +F: drivers/video/cyber2000fb.* CYBLAFB FRAMEBUFFER DRIVER P: Knut Petersen @@ -1344,14 +1591,18 @@ P: Arnaldo Carvalho de Melo M: acme@ghostprotocols.net W: http://oops.ghostprotocols.net:81/blog S: Maintained +F: drivers/net/wan/cycx* CYCLADES ASYNC MUX DRIVER W: http://www.cyclades.com/ S: Orphan +F: drivers/char/cyclades.c +F: include/linux/cyclades.h CYCLADES PC300 DRIVER W: http://www.cyclades.com/ S: Orphan +F: drivers/net/wan/pc300* DAMA SLAVE for AX.25 P: Joerg Reuter @@ -1360,12 +1611,21 @@ W: http://yaina.de/jreuter/ W: http://www.qsl.net/dl1bke/ L: linux-hams@vger.kernel.org S: Maintained +F: net/ax25/af_ax25.c +F: net/ax25/ax25_dev.c +F: net/ax25/ax25_ds_* +F: net/ax25/ax25_in.c +F: net/ax25/ax25_out.c +F: net/ax25/ax25_timer.c +F: net/ax25/sysctl_net_ax25.c DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER P: Tobias Ringstrom M: tori@unhappy.mine.nu L: netdev@vger.kernel.org S: Maintained +F: Documentation/networking/dmfe.txt +F: drivers/net/tulip/dmfe.c DC390/AM53C974 SCSI driver P: Kurt Garloff @@ -1374,6 +1634,7 @@ W: http://www.garloff.de/kurt/linux/dc390/ P: Guennadi Liakhovetski M: g.liakhovetski@gmx.de S: Maintained +F: drivers/scsi/tmscsim.* DC395x SCSI driver P: Oliver Neukum @@ -1386,6 +1647,8 @@ W: http://twibble.org/dist/dc395x/ L: dc395x@twibble.org L: http://lists.twibble.org/mailman/listinfo/dc395x/ S: Maintained +F: Documentation/scsi/dc395x.txt +F: drivers/scsi/dc395x.* DCCP PROTOCOL P: Arnaldo Carvalho de Melo @@ -1393,6 +1656,9 @@ M: acme@ghostprotocols.net L: dccp@vger.kernel.org W: http://linux-net.osdl.org/index.php/DCCP S: Maintained +F: include/linux/dccp.h +F: include/linux/tfrc.h +F: net/dccp/ DECnet NETWORK LAYER P: Christine Caulfield @@ -1400,27 +1666,35 @@ M: christine.caulfield@googlemail.com W: http://linux-decnet.sourceforge.net L: linux-decnet-user@lists.sourceforge.net S: Maintained +F: Documentation/networking/decnet.txt +F: net/decnet/ DEFXX FDDI NETWORK DRIVER P: Maciej W. Rozycki M: macro@linux-mips.org S: Maintained +F: drivers/net/defxx.* DELL LAPTOP DRIVER P: Matthew Garrett M: mjg59@srcf.ucam.org S: Maintained +F: drivers/platform/x86/dell-laptop.c DELL LAPTOP SMM DRIVER P: Massimo Dal Zotto M: dz@debian.org W: http://www.debian.org/~dz/i8k/ S: Maintained +F: drivers/char/i8k.c +F: include/linux/i8k.h DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) P: Doug Warzecha M: Douglas_Warzecha@dell.com S: Maintained +F: Documentation/dcdbas.txt +F: drivers/firmware/dcdbas.* DELL WMI EXTRAS DRIVER P: Matthew Garrett @@ -1439,6 +1713,10 @@ P: Alasdair Kergon L: dm-devel@redhat.com W: http://sources.redhat.com/dm S: Maintained +F: Documentation/device-mapper/ +F: drivers/md/dm* +F: include/linux/device-mapper.h +F: include/linux/dm-*.h DIGI INTL. EPCA DRIVER P: Digi International, Inc @@ -1446,12 +1724,18 @@ M: Eng.Linux@digi.com L: Eng.Linux@digi.com W: http://www.digi.com S: Orphan +F: Documentation/serial/digiepca.txt +F: drivers/char/epca* +F: drivers/char/digi* DIRECTORY NOTIFICATION (DNOTIFY) P: Stephen Rothwell M: sfr@canb.auug.org.au L: linux-kernel@vger.kernel.org S: Supported +F: Documentation/filesystems/dnotify.txt +F: fs/notify/dnotify/ +F: include/linux/dnotify.h DISK GEOMETRY AND PARTITION HANDLING P: Andries Brouwer @@ -1466,6 +1750,9 @@ P: Jan Kara M: jack@suse.cz L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/quota.txt +F: fs/quota/ +F: include/linux/quota*.h DISTRIBUTED LOCK MANAGER (DLM) P: Christine Caulfield @@ -1476,6 +1763,7 @@ L: cluster-devel@redhat.com W: http://sources.redhat.com/cluster/ T: git kernel.org:/pub/scm/linux/kernel/git/teigland/dlm.git S: Supported +F: fs/dlm/ DMA GENERIC OFFLOAD ENGINE SUBSYSTEM P: Maciej Sosnowski @@ -1484,12 +1772,16 @@ P: Dan Williams M: dan.j.williams@intel.com L: linux-kernel@vger.kernel.org S: Supported +F: drivers/dma/ +F: include/linux/dma* DME1737 HARDWARE MONITOR DRIVER P: Juerg Haefliger M: juergh@gmail.com L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/dme1737 +F: drivers/hwmon/dme1737.c DOCBOOK FOR DOCUMENTATION P: Randy Dunlap @@ -1501,18 +1793,22 @@ P: Shaohua Li M: shaohua.li@intel.com L: linux-acpi@vger.kernel.org S: Supported +F: drivers/acpi/dock.c DOCUMENTATION (/Documentation directory) P: Randy Dunlap M: rdunlap@xenotime.net L: linux-doc@vger.kernel.org S: Maintained +F: Documentation/ DOUBLETALK DRIVER P: James R. Van Zandt M: jrv@vanzandt.mv.com L: blinux-list@redhat.com S: Maintained +F: drivers/char/dtlk.c +F: include/linux/dtlk.h DPT_I2O SCSI RAID DRIVER P: Adaptec OEM Raid Solutions @@ -1520,6 +1816,8 @@ M: aacraid@adaptec.com L: linux-scsi@vger.kernel.org W: http://www.adaptec.com/ S: Maintained +F: drivers/scsi/dpt* +F: drivers/scsi/dpt/ DRIVER CORE, KOBJECTS, AND SYSFS P: Greg Kroah-Hartman @@ -1527,6 +1825,11 @@ M: gregkh@suse.de L: linux-kernel@vger.kernel.org T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Supported +F: Documentation/kobject.txt +F: drivers/base/core.c +F: fs/sysfs/ +F: include/linux/kobj* +F: lib/kobj* DRM DRIVERS P: David Airlie @@ -1534,12 +1837,14 @@ M: airlied@linux.ie L: dri-devel@lists.sourceforge.net T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git S: Maintained +F: drivers/gpu/drm/ DSCC4 DRIVER P: Francois Romieu M: romieu@fr.zoreil.com L: netdev@vger.kernel.org S: Maintained +F: drivers/net/wan/dscc4.c DVB SUBSYSTEM AND DRIVERS P: LinuxTV.org Project @@ -1547,28 +1852,36 @@ M: linux-media@vger.kernel.org W: http://linuxtv.org/ T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: Documentation/dvb/ +F: drivers/media/dvb/ +F: drivers/media/common/saa7146*.c +F: include/linux/dvb/ DZ DECSTATION DZ11 SERIAL DRIVER P: Maciej W. Rozycki M: macro@linux-mips.org S: Maintained +F: drivers/serial/dz.* EATA-DMA SCSI DRIVER P: Michael Neuffer L: linux-eata@i-connect.net, linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/eata* EATA ISA/EISA/PCI SCSI DRIVER P: Dario Ballabio M: ballabio_dario@emc.com L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/eata.c EATA-PIO SCSI DRIVER P: Michael Neuffer M: mike@i-Connect.Net L: linux-eata@i-connect.net, linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/eata_pio.* EBTABLES P: Bart De Schuymer @@ -1577,6 +1890,8 @@ L: ebtables-user@lists.sourceforge.net L: ebtables-devel@lists.sourceforge.net W: http://ebtables.sourceforge.net/ S: Maintained +F: include/linux/netfilter_bridge/ebt_*.h +F: net/bridge/netfilter/ebt*.c ECRYPT FILE SYSTEM P: Tyler Hicks, Dustin Kirkland @@ -1584,6 +1899,8 @@ M: tyhicks@linux.vnet.ibm.com, kirkland@canonical.com L: ecryptfs-devel@lists.launchpad.net W: https://launchpad.net/ecryptfs S: Supported +F: Documentation/filesystems/ecryptfs.txt +F: fs/ecryptfs/ EDAC-CORE P: Doug Thompson @@ -1591,6 +1908,9 @@ M: dougthompson@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Supported +F: Documentation/edac.txt +F: drivers/edac/edac_* +F: include/linux/edac.h EDAC-E752X P: Mark Gross @@ -1600,6 +1920,7 @@ M: dougthompson@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/e752x_edac.c EDAC-E7XXX P: Doug Thompson @@ -1607,6 +1928,7 @@ M: dougthompson@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/e7xxx_edac.c EDAC-I82443BXGX P: Tim Small @@ -1614,6 +1936,7 @@ M: tim@buttersideup.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/i82443bxgx_edac.c EDAC-I3000 P: Jason Uhlenkott @@ -1621,6 +1944,7 @@ M: juhlenko@akamai.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/i3000_edac.c EDAC-I5000 P: Doug Thompson @@ -1628,6 +1952,7 @@ M: dougthompson@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/i5000_edac.c EDAC-I5400 P: Mauro Carvalho Chehab @@ -1635,6 +1960,7 @@ M: mchehab@redhat.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/i5400_edac.c EDAC-I82975X P: Ranganathan Desikan @@ -1644,6 +1970,7 @@ M: arvind@acarlab.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/i82975x_edac.c EDAC-PASEMI P: Egor Martovetsky @@ -1651,6 +1978,7 @@ M: egor@pasemi.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/pasemi_edac.c EDAC-R82600 P: Tim Small @@ -1658,6 +1986,7 @@ M: tim@buttersideup.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained +F: drivers/edac/r82600_edac.c EEEPC LAPTOP EXTRAS DRIVER P: Corentin Chary @@ -1665,10 +1994,12 @@ M: corentincj@iksaif.net L: acpi4asus-user@lists.sourceforge.net W: http://sourceforge.net/projects/acpi4asus S: Maintained +F: drivers/platform/x86/eeepc-laptop.c EFS FILESYSTEM W: http://aeschi.ch.eu.org/efs/ S: Orphan +F: fs/efs/ EHCA (IBM GX bus InfiniBand adapter) DRIVER P: Hoang-Nam Nguyen @@ -1677,6 +2008,7 @@ P: Christoph Raisch M: raisch@de.ibm.com L: general@lists.openfabrics.org S: Supported +F: drivers/infiniband/hw/ehca/ EMBEDDED LINUX P: Paul Gortmaker @@ -1692,22 +2024,27 @@ M: james.smart@emulex.com L: linux-scsi@vger.kernel.org W: http://sourceforge.net/projects/lpfcxxxx S: Supported +F: drivers/scsi/lpfc/ EPSON 1355 FRAMEBUFFER DRIVER P: Christopher Hoover M: ch@murgatroid.com, ch@hpl.hp.com S: Maintained +F: drivers/video/epson1355fb.c EPSON S1D13XXX FRAMEBUFFER DRIVER P: Kristoffer Ericson M: kristoffer.ericson@gmail.com S: Maintained +F: drivers/video/s1d13xxxfb.c +F: include/video/s1d13xxxfb.h ETHEREXPRESS-16 NETWORK DRIVER P: Philip Blundell M: philb@gnu.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/eexpress.* ETHERNET BRIDGE P: Stephen Hemminger @@ -1715,21 +2052,30 @@ M: shemminger@linux-foundation.org L: bridge@lists.linux-foundation.org W: http://www.linux-foundation.org/en/Net:Bridge S: Maintained +F: include/linux/netfilter_bridge/ +F: net/bridge/ ETHERTEAM 16I DRIVER P: Mika Kuoppala M: miku@iki.fi S: Maintained +F: drivers/net/eth16i.c EXT2 FILE SYSTEM L: linux-ext4@vger.kernel.org S: Maintained +F: Documentation/filesystems/ext2.txt +F: fs/ext2/ +F: include/linux/ext2* EXT3 FILE SYSTEM P: Stephen Tweedie, Andrew Morton M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com L: linux-ext4@vger.kernel.org S: Maintained +F: Documentation/filesystems/ext3.txt +F: fs/ext3/ +F: include/linux/ext3* EXT4 FILE SYSTEM P: Theodore Ts'o @@ -1737,35 +2083,47 @@ M: tytso@mit.edu, adilger@sun.com L: linux-ext4@vger.kernel.org W: http://ext4.wiki.kernel.org S: Maintained +F: Documentation/filesystems/ext4.txt +F: fs/ext4/ F71805F HARDWARE MONITORING DRIVER P: Jean Delvare M: khali@linux-fr.org L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/f71805f +F: drivers/hwmon/f71805f.c FARSYNC SYNCHRONOUS DRIVER P: Kevin Curtis M: kevin.curtis@farsite.co.uk W: http://www.farsite.co.uk/ S: Supported +F: drivers/net/wan/farsync.* FAULT INJECTION SUPPORT P: Akinobu Mita M: akinobu.mita@gmail.com S: Supported +F: Documentation/fault-injection/ +F: lib/fault-inject.c FILE LOCKING (flock() and fcntl()/lockf()) P: Matthew Wilcox M: matthew@wil.cx L: linux-fsdevel@vger.kernel.org S: Maintained +F: include/linux/fcntl.h +F: include/linux/fs.h +F: fs/fcntl.c +F: fs/locks.c FILESYSTEMS (VFS and infrastructure) P: Alexander Viro M: viro@zeniv.linux.org.uk L: linux-fsdevel@vger.kernel.org S: Maintained +F: fs/* FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER P: Riku Voipio @@ -1780,22 +2138,30 @@ L: linux1394-devel@lists.sourceforge.net W: http://www.linux1394.org/ T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git S: Maintained +F: drivers/firewire/ +F: include/linux/firewire*.h FIRMWARE LOADER (request_firmware) L: linux-kernel@vger.kernel.org S: Orphan +F: Documentation/firmware_class/ +F: drivers/base/firmware*.c +F: include/linux/firmware.h FPU EMULATOR P: Bill Metzenthen M: billm@suburbia.net W: http://suburbia.net/~billm/floating-point/emulator/ S: Maintained +F: arch/x86/math-emu/ FRAME RELAY DLCI/FRAD (Sangoma drivers too) P: Mike McLagan M: mike.mclagan@linux.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/wan/dlci.c +F: drivers/net/wan/sdla.c FRAMEBUFFER LAYER P: Antonino Daplas @@ -1803,6 +2169,9 @@ M: adaplas@gmail.com L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) W: http://linux-fbdev.sourceforge.net/ S: Maintained +F: Documentation/fb/ +F: drivers/video/fb* +F: include/linux/fb.h FREESCALE DMA DRIVER P: Li Yang @@ -1812,6 +2181,7 @@ M: zw@zh-kernel.org L: linuxppc-embedded@ozlabs.org L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/dma/fsldma.* FREESCALE I2C CPM DRIVER P: Jochen Friedrich @@ -1819,6 +2189,7 @@ M: jochen@scram.de L: linuxppc-dev@ozlabs.org L: linux-i2c@vger.kernel.org S: Maintained +F: drivers/i2c/busses/i2c-cpm.c FREESCALE IMX / MXC FRAMEBUFFER DRIVER P: Sascha Hauer @@ -1826,6 +2197,8 @@ M: kernel@pengutronix.de L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained +F: arch/arm/plat-mxc/include/mach/imxfb.h +F: drivers/video/imxfb.c FREESCALE SOC FS_ENET DRIVER P: Pantelis Antoniou @@ -1835,12 +2208,16 @@ M: vbordug@ru.mvista.com L: linuxppc-dev@ozlabs.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/fs_enet/ +F: include/linux/fs_enet_pd.h FREESCALE QUICC ENGINE LIBRARY P: Timur Tabi M: timur@freescale.com L: linuxppc-dev@ozlabs.org S: Supported +F: arch/powerpc/sysdev/qe_lib/ +F: arch/powerpc/include/asm/*qe.h FREESCALE HIGHSPEED USB DEVICE DRIVER P: Li Yang @@ -1848,6 +2225,7 @@ M: leoli@freescale.com L: linux-usb@vger.kernel.org L: linuxppc-dev@ozlabs.org S: Maintained +F: drivers/usb/gadget/fsl_usb2_udc.c FREESCALE QUICC ENGINE UCC ETHERNET DRIVER P: Li Yang @@ -1855,12 +2233,14 @@ M: leoli@freescale.com L: netdev@vger.kernel.org L: linuxppc-dev@ozlabs.org S: Maintained +F: drivers/net/ucc_geth* FREESCALE QUICC ENGINE UCC UART DRIVER P: Timur Tabi M: timur@freescale.com L: linuxppc-dev@ozlabs.org S: Supported +F: drivers/serial/ucc_uart.c FREESCALE SOC SOUND DRIVERS P: Timur Tabi @@ -1868,12 +2248,14 @@ M: timur@freescale.com L: alsa-devel@alsa-project.org L: linuxppc-dev@ozlabs.org S: Supported +F: sound/soc/fsl/ FREEVXFS FILESYSTEM P: Christoph Hellwig M: hch@infradead.org W: ftp://ftp.openlinux.org/pub/people/hch/vxfs S: Maintained +F: fs/freevxfs/ FREEZER P: Pavel Machek @@ -1882,22 +2264,33 @@ P: Rafael J. Wysocki M: rjw@sisk.pl L: linux-pm@lists.linux-foundation.org S: Supported +F: Documentation/power/freezing-of-tasks.txt +F: include/linux/freezer.h +F: kernel/freezer.c FTRACE P: Steven Rostedt M: rostedt@goodmis.org S: Maintained +F: Documentation/ftrace.txt +F: arch/*/*/*/ftrace.h +F: arch/*/kernel/ftrace.c +F: include/*/ftrace.h +F: kernel/trace/ FUJITSU FR-V (FRV) PORT P: David Howells M: dhowells@redhat.com S: Maintained +F: arch/frv/ +F: include/asm-frv/ FUJITSU LAPTOP EXTRAS P: Jonathan Woithe M: jwoithe@physics.adelaide.edu.au L: linux-acpi@vger.kernel.org S: Maintained +F: drivers/platform/x86/fujitsu-laptop.c FUSE: FILESYSTEM IN USERSPACE P: Miklos Szeredi @@ -1905,12 +2298,15 @@ M: miklos@szeredi.hu L: fuse-devel@lists.sourceforge.net W: http://fuse.sourceforge.net/ S: Maintained +F: fs/fuse/ +F: include/linux/fuse.h FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit) P: Rik Faith M: faith@cs.unc.edu L: linux-scsi@vger.kernel.org S: Odd Fixes (e.g., new signatures) +F: drivers/scsi/fdomain.* GDT SCSI DISK ARRAY CONTROLLER DRIVER P: Achim Leubner @@ -1918,17 +2314,27 @@ M: achim_leubner@adaptec.com L: linux-scsi@vger.kernel.org W: http://www.icp-vortex.com/ S: Supported +F: drivers/scsi/gdt* GENERIC GPIO I2C DRIVER P: Haavard Skinnemoen M: hskinnemoen@atmel.com S: Supported +F: drivers/i2c/busses/i2c-gpio.c +F: include/linux/i2c-gpio.h GENERIC HDLC (WAN) DRIVERS P: Krzysztof Halasa M: khc@pm.waw.pl W: http://www.kernel.org/pub/linux/utils/net/hdlc/ S: Maintained +F: drivers/net/wan/c101.c +F: drivers/net/wan/hd6457* +F: drivers/net/wan/hdlc* +F: drivers/net/wan/n2.c +F: drivers/net/wan/pc300too.c +F: drivers/net/wan/pci200syn.c +F: drivers/net/wan/wanxl* GFS2 FILE SYSTEM P: Steven Whitehouse @@ -1938,6 +2344,9 @@ W: http://sources.redhat.com/cluster/ T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git S: Supported +F: Documentation/filesystems/gfs2*.txt +F: fs/gfs2/ +F: include/linux/gfs2_ondisk.h GIGASET ISDN DRIVERS P: Hansjoerg Lipp @@ -1947,6 +2356,9 @@ M: tilman@imap.cc L: gigaset307x-common@lists.sourceforge.net W: http://gigaset307x.sourceforge.net/ S: Maintained +F: Documentation/isdn/README.gigaset +F: drivers/isdn/gigaset/ +F: include/linux/gigaset_dev.h HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER P: Frank Seidel @@ -1954,6 +2366,7 @@ M: frank@f-seidel.de L: lm-sensors@lm-sensors.org W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/ S: Maintained +F: drivers/hwmon/hdaps.c HYPERVISOR VIRTUAL CONSOLE DRIVER L: linuxppc-dev@ozlabs.org @@ -1967,6 +2380,7 @@ M: frank@zago.net L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/gspca/finepix.c GSPCA M5602 SUBDRIVER P: Erik Andren @@ -1974,6 +2388,7 @@ M: erik.andren@gmail.com L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/gspca/m5602/ GSPCA PAC207 SONIXB SUBDRIVER P: Hans de Goede @@ -1981,6 +2396,7 @@ M: hdegoede@redhat.com L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/gspca/pac207.c GSPCA T613 SUBDRIVER P: Leandro Costantino @@ -1988,6 +2404,7 @@ M: lcostantino@gmail.com L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/gspca/t613.c GSPCA USB WEBCAM DRIVER P: Jean-Francois Moine @@ -1996,20 +2413,26 @@ W: http://moinejf.free.fr L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/gspca/ HARDWARE MONITORING L: lm-sensors@lm-sensors.org W: http://www.lm-sensors.org/ S: Orphan +F: drivers/hwmon/ HARDWARE RANDOM NUMBER GENERATOR CORE S: Orphan +F: Documentation/hw_random.txt +F: drivers/char/hw_random/ +F: include/linux/hw_random.h HARMONY SOUND DRIVER P: Kyle McMartin M: kyle@mcmartin.ca L: linux-parisc@vger.kernel.org S: Maintained +F: sound/parisc/harmony.* HAYES ESP SERIAL DRIVER P: Andrew J. Robinson @@ -2017,6 +2440,8 @@ M: arobinso@nyx.net L: linux-kernel@vger.kernel.org W: http://www.nyx.net/~arobinso S: Maintained +F: Documentation/serial/hayes-esp.txt +F: drivers/char/esp.c HEWLETT-PACKARD FIBRE CHANNEL 64-bit/66MHz PCI non-intelligent HBA P: Chirag Kantharia @@ -2029,18 +2454,25 @@ P: Chirag Kantharia M: chirag.kantharia@hp.com L: iss_storagedev@hp.com S: Maintained +F: Documentation/blockdev/cpqarray.txt +F: drivers/block/cpqarray.* HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) P: Mike Miller M: mike.miller@hp.com L: iss_storagedev@hp.com S: Supported +F: Documentation/blockdev/cciss.txt +F: drivers/block/cciss* +F: include/linux/cciss_ioctl.h HFS FILESYSTEM P: Roman Zippel M: zippel@linux-m68k.org L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/hfs.txt +F: fs/hfs/ HGA FRAMEBUFFER DRIVER P: Ferenc Bakonyi @@ -2048,6 +2480,7 @@ M: fero@drama.obuda.kando.hu L: linux-nvidia@lists.surfsouth.com W: http://drama.obuda.kando.hu/~fero/cgi-bin/hgafb.shtml S: Maintained +F: drivers/video/hgafb.c HIBERNATION (aka Software Suspend, aka swsusp) P: Pavel Machek @@ -2056,6 +2489,14 @@ P: Rafael J. Wysocki M: rjw@sisk.pl L: linux-pm@lists.linux-foundation.org S: Supported +F: arch/x86/power/ +F: drivers/base/power/ +F: kernel/power/ +F: include/linux/suspend.h +F: include/linux/freezer.h +F: include/linux/pm.h +F: include/asm-*/suspend*.h +F: arch/*/include/asm/suspend*.h HID CORE LAYER P: Jiri Kosina @@ -2063,12 +2504,17 @@ M: jkosina@suse.cz L: linux-input@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained +F: drivers/hid/ +F: include/linux/hid* HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS P: Thomas Gleixner M: tglx@linutronix.de L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/timers/ +F: kernel/hrtimer.c +F: include/linux/hrtimer.h HIGH-SPEED SCC DRIVER FOR AX.25 P: Klaus Kudielka @@ -2076,18 +2522,25 @@ M: klaus.kudielka@ieee.org L: linux-hams@vger.kernel.org W: http://www.nt.tuwien.ac.at/~kkudielk/Linux/ S: Maintained +F: drivers/net/hamradio/dmascc.c +F: drivers/net/hamradio/scc.c HIGHPOINT ROCKETRAID 3xxx RAID DRIVER P: HighPoint Linux Team M: linux@highpoint-tech.com W: http://www.highpoint-tech.com S: Supported +F: Documentation/scsi/hptiop.txt +F: drivers/scsi/hptiop.c HIPPI P: Jes Sorensen M: jes@trained-monkey.org L: linux-hippi@sunsite.dk S: Maintained +F: include/linux/hippidevice.h +F: include/linux/if_hippi.h +F: net/802/hippi.c HOST AP DRIVER P: Jouni Malinen @@ -2096,26 +2549,34 @@ L: hostap@shmoo.com (subscribers-only) L: linux-wireless@vger.kernel.org W: http://hostap.epitest.fi/ S: Maintained +F: drivers/net/wireless/hostap/ HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER P: Carlos Corbacho M: carlos@strangeworlds.co.uk S: Odd Fixes +F: drivers/platform/x86/tc1100-wmi.c HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series P: Jaroslav Kysela M: perex@perex.cz S: Maintained +F: drivers/net/hp100.* HPET: High Precision Event Timers driver (drivers/char/hpet.c) P: Clemens Ladisch M: clemens@ladisch.de S: Maintained +F: Documentation/timers/hpet.txt +F: drivers/char/hpet.c +F: include/linux/hpet.h HPET: i386 P: Venkatesh Pallipadi (Venki) M: venkatesh.pallipadi@intel.com S: Maintained +F: arch/x86/kernel/hpet.c +F: arch/x86/include/asm/hpet.h HPET: x86_64 P: Vojtech Pavlik @@ -2126,35 +2587,41 @@ HPET: ACPI hpet.c P: Bob Picco M: bob.picco@hp.com S: Maintained +F: drivers/char/hpet.c HPFS FILESYSTEM P: Mikulas Patocka M: mikulas@artax.karlin.mff.cuni.cz W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi S: Maintained +F: fs/hpfs/ HSO 3G Modem Driver (hso.c) P: Denis Joseph Barrow M: d.barow@option.com W: http://www.pharscape.org S: Maintained +F: drivers/net/usb/hso.c HTCPEN TOUCHSCREEN DRIVER P: Pau Oliva Fora M: pof@eslack.org L: linux-input@vger.kernel.org S: Maintained +F: drivers/input/touchscreen/htcpen.c HUGETLB FILESYSTEM P: William Irwin M: wli@holomorphy.com S: Maintained +F: fs/hugetlbfs/ I2C/SMBUS STUB DRIVER P: Mark M. Hoffman M: mhoffman@lightlink.com L: linux-i2c@vger.kernel.org S: Maintained +F: drivers/i2c/busses/i2c-stub.c I2C SUBSYSTEM P: Jean Delvare (PC drivers, core) @@ -2165,6 +2632,11 @@ L: linux-i2c@vger.kernel.org W: http://i2c.wiki.kernel.org/ T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ S: Maintained +F: Documentation/i2c/ +F: drivers/i2c/ +F: include/linux/i2c.h +F: include/linux/i2c-dev.h +F: include/linux/i2c-id.h I2C-TINY-USB DRIVER P: Till Harbaum @@ -2172,12 +2644,14 @@ M: till@harbaum.org L: linux-i2c@vger.kernel.org T: http://www.harbaum.org/till/i2c_tiny_usb S: Maintained +F: drivers/i2c/busses/i2c-tiny-usb.c i386 BOOT CODE P: H. Peter Anvin M: hpa@zytor.com L: Linux-Kernel@vger.kernel.org S: Maintained +F: arch/x86/boot/ i386 SETUP CODE / CPU ERRATA WORKAROUNDS P: H. Peter Anvin @@ -2192,17 +2666,20 @@ L: linux-ia64@vger.kernel.org W: http://www.ia64-linux.org/ T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git S: Maintained +F: arch/ia64/ IBM MCA SCSI SUBSYSTEM DRIVER P: Michael Lang M: langa2@kph.uni-mainz.de W: http://www.uni-mainz.de/~langm000/linux.html S: Maintained +F: drivers/scsi/ibmmca.c IBM Power Linux RAID adapter P: Brian King M: brking@us.ibm.com S: Supported +F: drivers/scsi/ipr.* IBM ServeRAID RAID DRIVER P: Jack Hammer @@ -2210,6 +2687,7 @@ P: Dave Jeffery M: ipslinux@adaptec.com W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html S: Supported +F: drivers/scsi/ips.* IDE SUBSYSTEM P: Bartlomiej Zolnierkiewicz @@ -2217,18 +2695,24 @@ M: bzolnier@gmail.com L: linux-ide@vger.kernel.org T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/ S: Maintained +F: Documentation/ide/ +F: drivers/ide/ +F: include/linux/ide.h IDE/ATAPI DRIVERS P: Borislav Petkov M: petkovbb@gmail.com L: linux-ide@vger.kernel.org S: Maintained +F: Documentation/cdrom/ide-cd +F: drivers/ide/ide-cd* IDLE-I7300 P: Andy Henroid M: andrew.d.henroid@intel.com L: linux-pm@lists.linux-foundation.org S: Supported +F: drivers/idle/i7300_idle.c IEEE 1394 SUBSYSTEM (drivers/ieee1394) P: Ben Collins @@ -2239,6 +2723,7 @@ L: linux1394-devel@lists.sourceforge.net W: http://www.linux1394.org/ T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git S: Maintained +F: drivers/ieee1394/ IEEE 1394 RAW I/O DRIVER (raw1394) P: Dan Dennedy @@ -2247,15 +2732,18 @@ P: Stefan Richter M: stefanr@s5r6.in-berlin.de L: linux1394-devel@lists.sourceforge.net S: Maintained +F: drivers/ieee1394/raw1394* INTEGRITY MEASUREMENT ARCHITECTURE (IMA) P: Mimi Zohar M: zohar@us.ibm.com S: Supported +F: security/integrity/ima/ IMS TWINTURBO FRAMEBUFFER DRIVER L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Orphan +F: drivers/video/imsttfb.c INFINIBAND SUBSYSTEM P: Roland Dreier @@ -2268,6 +2756,9 @@ L: general@lists.openfabrics.org (moderated for non-subscribers) W: http://www.openib.org/ T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git S: Supported +F: Documentation/infiniband/ +F: drivers/infiniband/ +F: include/linux/if_infiniband.h INOTIFY P: John McCutchan @@ -2276,6 +2767,9 @@ P: Robert Love M: rlove@rlove.org L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/inotify.txt +F: fs/notify/inotify/ +F: include/linux/inotify.h INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS P: Dmitry Torokhov @@ -2284,18 +2778,22 @@ M: dtor@mail.ru L: linux-input@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git S: Maintained +F: drivers/input/ INTEL FRAMEBUFFER DRIVER (excluding 810 and 815) P: Sylvain Meyer M: sylvain.meyer@worldonline.fr L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: Documentation/fb/intelfb.txt +F: drivers/video/intelfb/ INTEL 810/815 FRAMEBUFFER DRIVER P: Antonino Daplas M: adaplas@gmail.com L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/i810/ INTEL MENLOW THERMAL DRIVER P: Sujith Thomas @@ -2303,17 +2801,21 @@ M: sujith.thomas@intel.com L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ S: Supported +F: drivers/platform/x86/intel_menlow.c INTEL IA32 MICROCODE UPDATE SUPPORT P: Tigran Aivazian M: tigran@aivazian.fsnet.co.uk S: Maintained +F: arch/x86/kernel/microcode_core.c +F: arch/x86/kernel/microcode_intel.c INTEL I/OAT DMA DRIVER P: Maciej Sosnowski M: maciej.sosnowski@intel.com L: linux-kernel@vger.kernel.org S: Supported +F: drivers/dma/ioat* INTEL IOMMU (VT-d) P: David Woodhouse @@ -2321,28 +2823,39 @@ M: dwmw2@infradead.org L: iommu@lists.linux-foundation.org T: git://git.infradead.org/iommu-2.6.git S: Supported +F: drivers/pci/intel-iommu.c +F: include/linux/intel-iommu.h INTEL IOP-ADMA DMA DRIVER P: Dan Williams M: dan.j.williams@intel.com L: linux-kernel@vger.kernel.org S: Supported +F: drivers/dma/iop-adma.c INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT P: Krzysztof Halasa M: khc@pm.waw.pl S: Maintained +F: arch/arm/mach-ixp4xx/include/mach/qmgr.h +F: arch/arm/mach-ixp4xx/include/mach/npe.h +F: arch/arm/mach-ixp4xx/ixp4xx_qmgr.c +F: arch/arm/mach-ixp4xx/ixp4xx_npe.c +F: drivers/net/arm/ixp4xx_eth.c +F: drivers/net/wan/ixp4xx_hss.c INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT P: Deepak Saxena M: dsaxena@plexity.net S: Maintained +F: drivers/char/hw_random/ixp4xx-rng.c INTEL IXP2000 ETHERNET DRIVER P: Lennert Buytenhek M: kernel@wantstofly.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/ixp2000/ INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/ixgb/ixgbe) P: Jeff Kirsher @@ -2358,6 +2871,12 @@ M: john.ronciak@intel.com L: e1000-devel@lists.sourceforge.net W: http://e1000.sourceforge.net/ S: Supported +F: drivers/net/e100.c +F: drivers/net/e1000/ +F: drivers/net/e1000e/ +F: drivers/net/igb/ +F: drivers/net/ixgb/ +F: drivers/net/ixgbe/ INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT P: Zhu Yi @@ -2371,6 +2890,8 @@ L: ipw2100-devel@lists.sourceforge.net W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2100.sourceforge.net S: Supported +F: Documentation/networking/README.ipw2100 +F: drivers/net/wireless/ipw2x00/ipw2100.* INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT P: Zhu Yi @@ -2384,6 +2905,8 @@ L: ipw2100-devel@lists.sourceforge.net W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2200.sourceforge.net S: Supported +F: Documentation/networking/README.ipw2200 +F: drivers/net/wireless/ipw2x00/ipw2200.* INTEL WIRELESS WIMAX CONNECTION 2400 P: Inaky Perez-Gonzalez @@ -2392,6 +2915,9 @@ M: linux-wimax@intel.com L: wimax@linuxwimax.org S: Supported W: http://linuxwimax.org +F: Documentation/wimax/README.i2400m +F: drivers/net/wimax/i2400m/ +F: include/linux/wimax/i2400m.h INTEL WIRELESS WIFI LINK (iwlwifi) P: Zhu Yi @@ -2403,23 +2929,27 @@ L: ipw3945-devel@lists.sourceforge.net W: http://intellinuxwireless.org T: git kernel.org:/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git S: Supported +F: drivers/net/wireless/iwlwifi/ IOC3 ETHERNET DRIVER P: Ralf Baechle M: ralf@linux-mips.org L: linux-mips@linux-mips.org S: Maintained +F: drivers/net/ioc3-eth.c IOC3 SERIAL DRIVER P: Pat Gefre M: pfg@sgi.com L: linux-mips@linux-mips.org S: Maintained +F: drivers/serial/ioc3_serial.c IP MASQUERADING P: Juanjo Ciarlante M: jjciarla@raiz.uncu.edu.ar S: Maintained +F: net/ipv4/netfilter/ipt_MASQUERADE.c IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER P: Francois Romieu @@ -2430,6 +2960,7 @@ P: Jesse Huang M: jesse@icplus.com.tw L: netdev@vger.kernel.org S: Maintained +F: drivers/net/ipg.c IPATH DRIVER P: Ralph Campbell @@ -2437,6 +2968,7 @@ M: infinipath@qlogic.com L: general@lists.openfabrics.org T: git git://git.qlogic.com/ipath-linux-2.6 S: Supported +F: drivers/infiniband/hw/ipath/ IPMI SUBSYSTEM P: Corey Minyard @@ -2444,6 +2976,9 @@ M: minyard@acm.org L: openipmi-developer@lists.sourceforge.net W: http://openipmi.sourceforge.net/ S: Supported +F: Documentation/IPMI.txt +F: drivers/char/ipmi/ +F: include/linux/ipmi* IPS SCSI RAID DRIVER P: Adaptec OEM Raid Solutions @@ -2451,6 +2986,7 @@ M: aacraid@adaptec.com L: linux-scsi@vger.kernel.org W: http://www.adaptec.com/ S: Maintained +F: drivers/scsi/ips* IPVS P: Wensong Zhang @@ -2462,6 +2998,8 @@ M: ja@ssi.bg L: netdev@vger.kernel.org L: lvs-devel@vger.kernel.org S: Maintained +F: Documentation/networking/ipvs-sysctl.txt +F: net/netfilter/ipvs/ IPWIRELESS DRIVER P: Jiri Kosina @@ -2470,12 +3008,16 @@ P: David Sterba M: dsterba@suse.cz S: Maintained T: git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git +F: drivers/char/pcmcia/ipwireless/ IPX NETWORK LAYER P: Arnaldo Carvalho de Melo M: acme@ghostprotocols.net L: netdev@vger.kernel.org S: Maintained +F: include/linux/ipx.h +F: include/net/ipx.h +F: net/ipx/ IRDA SUBSYSTEM P: Samuel Ortiz @@ -2483,11 +3025,18 @@ M: samuel@sortiz.org L: irda-users@lists.sourceforge.net (subscribers-only) W: http://irda.sourceforge.net/ S: Maintained +F: Documentation/networking/irda.txt +F: drivers/net/irda/ +F: include/net/irda/ +F: net/irda/ ISAPNP P: Jaroslav Kysela M: perex@perex.cz S: Maintained +F: Documentation/isapnp.txt +F: drivers/pnp/isapnp/ +F: include/linux/isapnp.h ISCSI P: Mike Christie @@ -2496,6 +3045,8 @@ L: open-iscsi@googlegroups.com W: www.open-iscsi.org T: git kernel.org:/pub/scm/linux/kernel/mnc/linux-2.6-iscsi.git S: Maintained +F: drivers/scsi/*iscsi* +F: include/scsi/*iscsi* ISDN SUBSYSTEM P: Karsten Keil @@ -2504,6 +3055,10 @@ L: isdn4linux@listserv.isdn4linux.de (subscribers-only) W: http://www.isdn4linux.de T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git S: Maintained +F: Documentation/isdn/ +F: drivers/isdn/ +F: include/linux/isdn.h +F: include/linux/isdn/ ISDN SUBSYSTEM (Eicon active card driver) P: Armin Schindler @@ -2511,6 +3066,7 @@ M: mac@melware.de L: isdn4linux@listserv.isdn4linux.de (subscribers-only) W: http://www.melware.de S: Maintained +F: drivers/isdn/hardware/eicon/ IVTV VIDEO4LINUX DRIVER P: Hans Verkuil @@ -2521,6 +3077,9 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.ivtvdriver.org S: Maintained +F: Documentation/video4linux/*.ivtv +F: drivers/media/video/ivtv/ +F: include/linux/ivtv* JFS FILESYSTEM P: Dave Kleikamp @@ -2529,12 +3088,15 @@ L: jfs-discussion@lists.sourceforge.net W: http://jfs.sourceforge.net/ T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git S: Supported +F: Documentation/filesystems/jfs.txt +F: fs/jfs/ JME NETWORK DRIVER P: Guo-Fu Tseng M: cooldavid@cooldavid.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/jme.* JOURNALLING FLASH FILE SYSTEM V2 (JFFS2) P: David Woodhouse @@ -2542,24 +3104,34 @@ M: dwmw2@infradead.org L: linux-mtd@lists.infradead.org W: http://www.linux-mtd.infradead.org/doc/jffs2.html S: Maintained +F: fs/jffs2/ +F: include/linux/jffs2.h +F: include/mtd/jffs2-user.h JOURNALLING LAYER FOR BLOCK DEVICES (JBD) P: Stephen Tweedie, Andrew Morton M: sct@redhat.com, akpm@linux-foundation.org L: linux-ext4@vger.kernel.org S: Maintained +F: fs/jbd*/ +F: include/linux/ext*jbd*.h +F: include/linux/jbd*.h K8TEMP HARDWARE MONITORING DRIVER P: Rudolf Marek M: r.marek@assembler.cz L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/k8temp +F: drivers/hwmon/k8temp.c KCONFIG P: Roman Zippel M: zippel@linux-m68k.org L: linux-kbuild@vger.kernel.org S: Maintained +F: Documentation/kbuild/kconfig-language.txt +F: scripts/kconfig/ KDUMP P: Vivek Goyal @@ -2570,18 +3142,21 @@ L: kexec@lists.infradead.org L: linux-kernel@vger.kernel.org W: http://lse.sourceforge.net/kdump/ S: Maintained +F: Documentation/kdump KERNEL AUTOMOUNTER (AUTOFS) P: H. Peter Anvin M: hpa@zytor.com L: autofs@linux.kernel.org S: Odd Fixes +F: fs/autofs/ KERNEL AUTOMOUNTER v4 (AUTOFS4) P: Ian Kent M: raven@themaw.net L: autofs@linux.kernel.org S: Maintained +F: fs/autofs4/ KERNEL BUILD (kbuild: Makefile, scripts/Makefile.*) P: Sam Ravnborg @@ -2590,6 +3165,9 @@ T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-fixes.git L: linux-kbuild@vger.kernel.org S: Maintained +F: Documentation/kbuild/ +F: Makefile +F: scripts/Makefile.* KERNEL JANITORS P: Several @@ -2605,6 +3183,13 @@ M: neilb@suse.de L: linux-nfs@vger.kernel.org W: http://nfs.sourceforge.net/ S: Supported +F: fs/nfsd/ +F: include/linux/nfsd/ +F: fs/lockd/ +F: fs/nfs_common/ +F: net/sunrpc/ +F: include/linux/lockd/ +F: include/linux/sunrpc/ KERNEL VIRTUAL MACHINE (KVM) P: Avi Kivity @@ -2612,6 +3197,11 @@ M: avi@redhat.com L: kvm@vger.kernel.org W: http://kvm.qumranet.com S: Supported +F: Documentation/*/kvm.txt +F: arch/*/kvm/ +F: arch/*/include/asm/kvm* +F: include/linux/kvm* +F: virt/kvm/ KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V P: Joerg Roedel @@ -2619,6 +3209,9 @@ M: joerg.roedel@amd.com L: kvm@vger.kernel.org W: http://kvm.qumranet.com S: Supported +F: arch/x86/include/asm/svm.h +F: arch/x86/kvm/kvm_svm.h +F: arch/x86/kvm/svm.c KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC P: Hollis Blanchard @@ -2626,6 +3219,8 @@ M: hollisb@us.ibm.com L: kvm-ppc@vger.kernel.org W: http://kvm.qumranet.com S: Supported +F: arch/powerpc/include/asm/kvm* +F: arch/powerpc/kvm/ KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64) P: Xiantao Zhang @@ -2633,6 +3228,9 @@ M: xiantao.zhang@intel.com L: kvm-ia64@vger.kernel.org W: http://kvm.qumranet.com S: Supported +F: Documentation/ia64/kvm.txt +F: arch/ia64/include/asm/kvm* +F: arch/ia64/kvm/ KERNEL VIRTUAL MACHINE for s390 (KVM/s390) P: Carsten Otte @@ -2643,6 +3241,9 @@ M: linux390@de.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +F: Documentation/s390/kvm.txt +F: arch/s390/include/asm/kvm* +F: arch/s390/kvm KEXEC P: Eric Biederman @@ -2651,18 +3252,28 @@ W: http://ftp.kernel.org/pub/linux/kernel/people/horms/kexec-tools/ L: linux-kernel@vger.kernel.org L: kexec@lists.infradead.org S: Maintained +F: include/linux/kexec.h +F: kernel/kexec.c KGDB P: Jason Wessel M: jason.wessel@windriver.com L: kgdb-bugreport@lists.sourceforge.net S: Maintained +F: Documentation/DocBook/kgdb.tmpl +F: drivers/misc/kgdbts.c +F: drivers/serial/kgdboc.c +F: include/linux/kgdb.h +F: kernel/kgdb.c KMEMTRACE P: Eduard - Gabriel Munteanu M: eduard.munteanu@linux360.ro L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/vm/kmemtrace.txt +F: include/trace/kmemtrace.h +F: kernel/trace/kmemtrace.c KPROBES P: Ananth N Mavinakayanahalli @@ -2675,6 +3286,9 @@ P: Masami Hiramatsu M: mhiramat@redhat.com L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/kprobes.txt +F: include/linux/kprobes.h +F: kernel/kprobes.c KS0108 LCD CONTROLLER DRIVER P: Miguel Ojeda Sandonis @@ -2683,21 +3297,31 @@ L: linux-kernel@vger.kernel.org W: http://miguelojeda.es/auxdisplay.htm W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm S: Maintained +F: Documentation/auxdisplay/ks0108 +F: drivers/auxdisplay/ks0108.c +F: include/linux/ks0108.h LAPB module L: linux-x25@vger.kernel.org S: Orphan +F: Documentation/networking/lapb-module.txt +F: include/*/lapb.h +F: net/lapb/ LASI 53c700 driver for PARISC P: James E.J. Bottomley M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org S: Maintained +F: Documentation/scsi/53c700.txt +F: drivers/scsi/53c700* LED SUBSYSTEM P: Richard Purdie M: rpurdie@rpsys.net S: Maintained +F: drivers/leds/ +F: include/linux/leds.h LEGO USB Tower driver P: Juergen Stuber @@ -2705,6 +3329,7 @@ M: starblue@users.sourceforge.net L: legousb-devel@lists.sourceforge.net W: http://legousb.sourceforge.net/ S: Maintained +F: drivers/usb/misc/legousbtower.c LGUEST P: Rusty Russell @@ -2712,6 +3337,11 @@ M: rusty@rustcorp.com.au L: lguest@ozlabs.org W: http://lguest.ozlabs.org/ S: Maintained +F: Documentation/lguest/ +F: arch/x86/lguest/ +F: drivers/lguest/ +F: include/linux/lguest*.h +F: arch/x86/include/asm/lguest*.h LINUX FOR IBM pSERIES (RS/6000) P: Paul Mackerras @@ -2801,23 +3431,32 @@ LLC (802.2) P: Arnaldo Carvalho de Melo M: acme@ghostprotocols.net S: Maintained +F: include/linux/llc.h +F: include/net/llc* +F: net/llc/ LIS3LV02D ACCELEROMETER DRIVER P: Eric Piel M: eric.piel@tremplin-utc.net S: Maintained +F: Documentation/hwmon/lis3lv02d +F: drivers/hwmon/lis3lv02d.* LM83 HARDWARE MONITOR DRIVER P: Jean Delvare M: khali@linux-fr.org L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/lm83 +F: drivers/hwmon/lm83.c LM90 HARDWARE MONITOR DRIVER P: Jean Delvare M: khali@linux-fr.org L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/lm90 +F: drivers/hwmon/lm90.c LOCKDEP AND LOCKSTAT P: Peter Zijlstra @@ -2827,6 +3466,10 @@ M: mingo@redhat.com L: linux-kernel@vger.kernel.org T: git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git S: Maintained +F: Documentation/lockdep*.txt +F: Documentation/lockstat.txt +F: include/linux/lockdep.h +F: kernel/lockdep* LOGICAL DISK MANAGER SUPPORT (LDM, Windows 2000/XP/Vista Dynamic Disks) P: Richard Russon (FlatCap) @@ -2834,6 +3477,8 @@ M: ldm@flatcap.org L: linux-ntfs-dev@lists.sourceforge.net W: http://www.linux-ntfs.org/content/view/19/37/ S: Maintained +F: Documentation/ldm.txt +F: fs/partitions/ldm.* LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI) P: Eric Moore @@ -2843,12 +3488,14 @@ L: DL-MPTFusionLinux@lsi.com L: linux-scsi@vger.kernel.org W: http://www.lsilogic.com/support S: Supported +F: drivers/message/fusion/ LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers P: Matthew Wilcox M: matthew@wil.cx L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/sym53c8xx_2/ LTP (Linux Test Project) P: Subrata Modak @@ -2867,6 +3514,8 @@ L: linux-m32r@ml.linux-m32r.org L: linux-m32r-ja@ml.linux-m32r.org (in Japanese) W: http://www.linux-m32r.org/ S: Maintained +F: arch/m32r/ +F: include/asm-m32r/ M68K ARCHITECTURE P: Geert Uytterhoeven @@ -2877,6 +3526,7 @@ L: linux-m68k@lists.linux-m68k.org W: http://www.linux-m68k.org/ T: git git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git S: Maintained +F: arch/m68k/ M68K ON APPLE MACINTOSH P: Joshua Thompson @@ -2890,6 +3540,7 @@ P: Philip Blundell M: philb@gnu.org W: http://www.tazenda.demon.co.uk/phil/linux-hp S: Maintained +F: arch/m68k/hp300/ MAC80211 P: Johannes Berg @@ -2898,6 +3549,9 @@ L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained +F: Documentation/networking/mac80211-injection.txt +F: include/net/mac80211.h +F: net/mac80211/ MAC80211 PID RATE CONTROL P: Stefano Brivio @@ -2908,12 +3562,15 @@ L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained +F: net/mac80211/rc80211_pid* MACVLAN DRIVER P: Patrick McHardy M: kaber@trash.net L: netdev@vger.kernel.org S: Maintained +F: drivers/net/macvlan.c +F: include/linux/if_macvlan.h MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 P: Michael Kerrisk @@ -2927,12 +3584,15 @@ P: Dan Williams M: dcbw@redhat.com L: libertas-dev@lists.infradead.org S: Maintained +F: drivers/net/wireless/libertas/ MARVELL MV643XX ETHERNET DRIVER P: Lennert Buytenhek M: buytenh@marvell.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/mv643xx_eth.* +F: include/linux/mv643xx.h MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER P: Nicolas Pitre @@ -2953,12 +3613,16 @@ P: Petr Vandrovec M: vandrove@vc.cvut.cz L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/matrox/matroxfb_* +F: include/linux/matroxfb.h MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER P: Hans J. Koch M: hjk@linutronix.de L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/max6650 +F: drivers/hwmon/max6650.c MEGARAID SCSI DRIVERS P: Neela Syam Kolli @@ -2966,12 +3630,17 @@ M: megaraidlinux@lsi.com L: linux-scsi@vger.kernel.org W: http://megaraid.lsilogic.com S: Maintained +F: Documentation/scsi/megaraid.txt +F: drivers/scsi/megaraid.* +F: drivers/scsi/megaraid/ MEMORY MANAGEMENT L: linux-mm@kvack.org L: linux-kernel@vger.kernel.org W: http://www.linux-mm.org S: Maintained +F: include/linux/mm.h +F: mm/ MEMORY RESOURCE CONTROLLER P: Balbir Singh @@ -2983,6 +3652,7 @@ M: kamezawa.hiroyu@jp.fujitsu.com L: linux-mm@kvack.org L: linux-kernel@vger.kernel.org S: Maintained +F: mm/memcontrol.c MEMORY TECHNOLOGY DEVICES (MTD) P: David Woodhouse @@ -2991,11 +3661,15 @@ W: http://www.linux-mtd.infradead.org/ L: linux-mtd@lists.infradead.org T: git git://git.infradead.org/mtd-2.6.git S: Maintained +F: drivers/mtd/ +F: include/linux/mtd/ +F: include/mtd/ MICROTEK X6 SCANNER P: Oliver Neukum M: oliver@neukum.name S: Maintained +F: drivers/usb/image/microtek.* MIPS P: Ralf Baechle @@ -3004,42 +3678,58 @@ W: http://www.linux-mips.org/ L: linux-mips@linux-mips.org T: git www.linux-mips.org:/pub/scm/linux.git S: Supported +F: Documentation/mips/ +F: arch/mips/ MISCELLANEOUS MCA-SUPPORT P: James Bottomley M: James.Bottomley@HansenPartnership.com L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/ia64/mca.txt +F: Documentation/mca.txt +F: drivers/mca/ +F: include/linux/mca* MODULE SUPPORT P: Rusty Russell M: rusty@rustcorp.com.au L: linux-kernel@vger.kernel.org S: Maintained +F: include/linux/module.h +F: kernel/module.c MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER P: Stelian Pop M: stelian@popies.net W: http://popies.net/meye/ S: Maintained +F: Documentation/video4linux/meye.txt +F: drivers/media/video/meye.* +F: include/linux/meye.h MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER P: Pavel Pisa M: ppisa@pikron.com L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained +F: drivers/mmc/host/imxmmc.* MOUSE AND MISC DEVICES [GENERAL] P: Alessandro Rubini M: rubini@ipvvis.unipv.it L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/input/mouse/ +F: include/linux/gpio_mouse.h MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD P: Jiri Slaby M: jirislaby@gmail.com L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/serial/moxa-smartio +F: drivers/char/mxser.* MSI LAPTOP SUPPORT P: Lennart Poettering @@ -3047,6 +3737,7 @@ M: mzxreary@0pointer.de W: https://tango.0pointer.de/mailman/listinfo/s270-linux W: http://0pointer.de/lennart/tchibo.html S: Maintained +F: drivers/platform/x86/msi-laptop.c MULTIFUNCTION DEVICES (MFD) P: Samuel Ortiz @@ -3054,29 +3745,38 @@ M: sameo@linux.intel.com L: linux-kernel@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/sameo/mfd-2.6.git S: Supported +F: drivers/mfd/ MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM P: Pierre Ossman M: pierre@ossman.eu L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/mmc/ +F: include/linux/mmc/ MULTIMEDIA CARD (MMC) ETC. OVER SPI P: David Brownell M: dbrownell@users.sourceforge.net L: linux-kernel@vger.kernel.org S: Odd Fixes +F: drivers/mmc/host/mmc_spi.c +F: include/linux/spi/mmc_spi.h MULTISOUND SOUND DRIVER P: Andrew Veliath M: andrewtv@usa.net S: Maintained +F: Documentation/sound/oss/MultiSound +F: sound/oss/msnd* MULTITECH MULTIPORT CARD (ISICOM) P: Jiri Slaby M: jirislaby@gmail.com L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/char/isicom.c +F: include/linux/isicom.h MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER P: Felipe Balbi @@ -3084,6 +3784,7 @@ M: felipe.balbi@nokia.com L: linux-usb@vger.kernel.org T: git gitorious.org:/musb/mainline.git S: Maintained +F: drivers/usb/musb/ MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE) P: Andrew Gallatin @@ -3093,23 +3794,27 @@ M: brice@myri.com L: netdev@vger.kernel.org W: http://www.myri.com/scs/download-Myri10GE.html S: Supported +F: drivers/net/myri10ge/ NATSEMI ETHERNET DRIVER (DP8381x) P: Tim Hockin M: thockin@hockin.org S: Maintained +F: drivers/net/natsemi.c NCP FILESYSTEM P: Petr Vandrovec M: vandrove@vc.cvut.cz L: linware@sh.cvut.cz S: Maintained +F: fs/ncpfs/ NCR DUAL 700 SCSI DRIVER (MICROCHANNEL) P: James E.J. Bottomley M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/NCR_D700.* NETEFFECT IWARP RNIC DRIVER (IW_NES) P: Faisal Latif @@ -3126,6 +3831,7 @@ P: Stephen Hemminger M: shemminger@linux-foundation.org L: netem@lists.linux-foundation.org S: Maintained +F: net/sched/sch_netem.c NETERION (S2IO) 10GbE DRIVER (xframe/vxge) P: Ramkrishna Vepa @@ -3142,6 +3848,8 @@ L: netdev@vger.kernel.org W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous S: Supported +F: Documentation/networking/s2io.txt +F: drivers/net/s2io* NETFILTER/IPTABLES/IPCHAINS P: Rusty Russell @@ -3157,6 +3865,12 @@ L: coreteam@netfilter.org W: http://www.netfilter.org/ W: http://www.iptables.org/ S: Supported +F: include/linux/netfilter* +F: include/linux/netfilter/ +F: include/net/netfilter/ +F: net/*/netfilter.c +F: net/*/netfilter/ +F: net/netfilter/ NETLABEL P: Paul Moore @@ -3164,6 +3878,9 @@ M: paul.moore@hp.com W: http://netlabel.sf.net L: netdev@vger.kernel.org S: Supported +F: Documentation/netlabel +F: include/net/netlabel.h +F: net/netlabel/ NETROM NETWORK LAYER P: Ralf Baechle @@ -3171,11 +3888,17 @@ M: ralf@linux-mips.org L: linux-hams@vger.kernel.org W: http://www.linux-ax25.org/ S: Maintained +F: include/linux/netrom.h +F: include/net/netrom.h +F: net/netrom/ NETWORK BLOCK DEVICE (NBD) P: Paul Clements M: Paul.Clements@steeleye.com S: Maintained +F: Documentation/blockdev/nbd.txt +F: drivers/block/nbd.c +F: include/linux/nbd.h NETWORK DEVICE DRIVERS P: Jeff Garzik @@ -3183,6 +3906,7 @@ M: jgarzik@pobox.com L: netdev@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git S: Maintained +F: drivers/net/ NETWORKING [GENERAL] P: Networking Team @@ -3190,6 +3914,8 @@ M: netdev@vger.kernel.org L: netdev@vger.kernel.org W: http://linux-net.osdl.org/ S: Maintained +F: net/ +F: include/net/ NETWORKING [IPv4/IPv6] P: David S. Miller @@ -3207,6 +3933,9 @@ M: kaber@trash.net L: netdev@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6.git S: Maintained +F: net/ipv4/ +F: net/ipv6/ +F: include/net/ip* NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK) P: Paul Moore @@ -3220,6 +3949,9 @@ M: linville@tuxdriver.com L: linux-wireless@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained +F: net/wireless/ +F: include/net/ieee80211* +F: include/net/wireless.h NETXEN (1/10) GbE SUPPORT P: Dhananjay Phadke @@ -3227,6 +3959,7 @@ M: dhananjay@netxen.com L: netdev@vger.kernel.org W: http://www.netxen.com S: Supported +F: drivers/net/netxen/ NFS, SUNRPC, AND LOCKD CLIENTS P: Trond Myklebust @@ -3235,6 +3968,13 @@ L: linux-nfs@vger.kernel.org W: http://client.linux-nfs.org T: git git://git.linux-nfs.org/pub/linux/nfs-2.6.git S: Maintained +F: fs/lockd/ +F: fs/nfs/ +F: fs/nfs_common/ +F: net/sunrpc/ +F: include/linux/lockd/ +F: include/linux/nfs* +F: include/linux/sunrpc/ NI5010 NETWORK DRIVER P: Jan-Pascal van Best @@ -3243,6 +3983,7 @@ P: Andreas Mohr M: andi@lisas.de L: netdev@vger.kernel.org S: Maintained +F: drivers/net/ni5010.* NILFS2 FILESYSTEM P: KONISHI Ryusuke @@ -3250,12 +3991,17 @@ M: konishi.ryusuke@lab.ntt.co.jp L: users@nilfs.org W: http://www.nilfs.org/en/ S: Supported +F: Documentation/filesystems/nilfs2.txt +F: fs/nilfs2/ +F: include/linux/nilfs2_fs.h NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER P: YOKOTA Hiroshi M: yokota@netlab.is.tsukuba.ac.jp W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ S: Maintained +F: Documentation/scsi/NinjaSCSI.txt +F: drivers/scsi/pcmcia/nsp_* NINJA SCSI-32Bi/UDE PCI/CARDBUS SCSI HOST ADAPTER DRIVER P: GOTO Masanori @@ -3264,6 +4010,8 @@ P: YOKOTA Hiroshi M: yokota@netlab.is.tsukuba.ac.jp W: http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/ninja/ S: Maintained +F: Documentation/scsi/NinjaSCSI.txt +F: drivers/scsi/nsp32* NTFS FILESYSTEM P: Anton Altaparmakov @@ -3273,28 +4021,37 @@ L: linux-kernel@vger.kernel.org W: http://www.linux-ntfs.org/ T: git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git S: Maintained +F: Documentation/filesystems/ntfs.txt +F: fs/ntfs/ NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER P: Antonino Daplas M: adaplas@gmail.com L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/riva/ +F: drivers/video/nvidia/ OMFS FILESYSTEM P: Bob Copeland M: me@bobcopeland.com L: linux-karma-devel@lists.sourceforge.net S: Maintained +F: Documentation/filesystems/omfs.txt +F: fs/omfs/ OMNIKEY CARDMAN 4000 DRIVER P: Harald Welte M: laforge@gnumonks.org S: Maintained +F: drivers/char/pcmcia/cm4000_cs.c +F: include/linux/cm4000_cs.h OMNIKEY CARDMAN 4040 DRIVER P: Harald Welte M: laforge@gnumonks.org S: Maintained +F: drivers/char/pcmcia/cm4040_cs.* OMNIVISION OV7670 SENSOR DRIVER P: Jonathan Corbet @@ -3302,12 +4059,15 @@ M: corbet@lwn.net L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: drivers/media/video/ov7670.c ONENAND FLASH DRIVER P: Kyungmin Park M: kyungmin.park@samsung.com L: linux-mtd@lists.infradead.org S: Maintained +F: drivers/mtd/onenand/ +F: include/linux/mtd/onenand*.h ONSTREAM SCSI TAPE DRIVER P: Willem Riede @@ -3315,18 +4075,25 @@ M: osst@riede.org L: osst-users@lists.sourceforge.net L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/osst* +F: drivers/scsi/st* OPENCORES I2C BUS DRIVER P: Peter Korsgaard M: jacmet@sunsite.dk L: linux-i2c@vger.kernel.org S: Maintained +F: Documentation/i2c/busses/i2c-ocores +F: drivers/i2c/busses/i2c-ocores.c OPROFILE P: Robert Richter M: robert.richter@amd.com L: oprofile-list@lists.sf.net S: Maintained +F: arch/*/oprofile/ +F: drivers/oprofile/ +F: include/linux/oprofile.h ORACLE CLUSTER FILESYSTEM 2 (OCFS2) P: Mark Fasheh @@ -3337,6 +4104,9 @@ L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) W: http://oss.oracle.com/projects/ocfs2/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2.git S: Supported +F: Documentation/filesystems/ocfs2.txt +F: Documentation/filesystems/dlmfs.txt +F: fs/ocfs2/ ORINOCO DRIVER P: Pavel Roskin @@ -3348,6 +4118,7 @@ L: orinoco-users@lists.sourceforge.net L: orinoco-devel@lists.sourceforge.net W: http://www.nongnu.org/orinoco/ S: Maintained +F: drivers/net/wireless/orinoco/ OSD LIBRARY P: Boaz Harrosh @@ -3366,23 +4137,27 @@ L: linux-wireless@vger.kernel.org W: http://prism54.org T: git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git S: Maintained +F: drivers/net/wireless/p54/ PA SEMI ETHERNET DRIVER P: Olof Johansson M: olof@lixom.net L: netdev@vger.kernel.org S: Maintained +F: drivers/net/pasemi_mac.* PA SEMI SMBUS DRIVER P: Olof Johansson M: olof@lixom.net L: linux-i2c@vger.kernel.org S: Maintained +F: drivers/i2c/busses/i2c-pasemi.c PANASONIC LAPTOP ACPI EXTRAS DRIVER P: Harald Welte M: laforge@gnumonks.org S: Maintained +F: drivers/platform/x86/panasonic-laptop.c PANASONIC MN10300/AM33 PORT P: David Howells @@ -3392,10 +4167,17 @@ M: yasutake.koichi@jp.panasonic.com L: linux-am33-list@redhat.com (moderated for non-subscribers) W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/ S: Maintained +F: Documentation/mn10300/ +F: arch/mn10300/ +F: include/asm-mn10300/ PARALLEL PORT SUPPORT L: linux-parport@lists.infradead.org (subscribers-only) S: Orphan +F: drivers/parport/ +F: include/linux/parport*.h +F: drivers/char/ppdev.c +F: include/linux/ppdev.h PARAVIRT_OPS INTERFACE P: Jeremy Fitzhardinge @@ -3409,6 +4191,9 @@ M: rusty@rustcorp.com.au L: virtualization@lists.osdl.org L: linux-kernel@vger.kernel.org S: Supported +F: Documentation/ia64/paravirt_ops.txt +F: arch/*/kernel/paravirt* +F: arch/*/include/asm/paravirt.h PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES P: Tim Waugh @@ -3416,6 +4201,8 @@ M: tim@cyberelk.net L: linux-parport@lists.infradead.org (subscribers-only) W: http://www.torque.net/linux-pp.html S: Maintained +F: Documentation/blockdev/paride.txt +F: drivers/block/paride/ PARISC ARCHITECTURE P: Kyle McMartin @@ -3426,17 +4213,22 @@ L: linux-parisc@vger.kernel.org W: http://www.parisc-linux.org/ T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git S: Maintained +F: arch/parisc/ +F: drivers/parisc/ PC87360 HARDWARE MONITORING DRIVER P: Jim Cromie M: jim.cromie@gmail.com L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/pc87360 +F: drivers/hwmon/pc87360.c PC8736x GPIO DRIVER P: Jim Cromie M: jim.cromie@gmail.com S: Maintained +F: drivers/char/pc8736x_gpio.c PCA9532 LED DRIVER P: Riku Voipio @@ -3449,6 +4241,8 @@ M: linas@austin.ibm.com L: linux-kernel@vger.kernel.org L: linux-pci@vger.kernel.org S: Supported +F: Documentation/PCI/pci-error-recovery.txt +F: Documentation/powerpc/eeh-pci-error-recovery.txt PCI SUBSYSTEM P: Jesse Barnes @@ -3457,12 +4251,16 @@ L: linux-kernel@vger.kernel.org L: linux-pci@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git S: Supported +F: Documentation/PCI/ +F: drivers/pci/ +F: include/linux/pci* PCIE HOTPLUG DRIVER P: Kristen Carlson Accardi M: kristen.c.accardi@intel.com L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/pcie/ PCMCIA SUBSYSTEM P: Linux PCMCIA Team @@ -3470,42 +4268,55 @@ L: linux-pcmcia@lists.infradead.org W: http://lists.infradead.org/mailman/listinfo/linux-pcmcia T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git S: Maintained +F: Documentation/pcmcia/ +F: drivers/pcmcia/ +F: include/pcmcia/ PCNET32 NETWORK DRIVER P: Don Fry M: pcnet32@verizon.net L: netdev@vger.kernel.org S: Maintained +F: drivers/net/pcnet32.c PER-TASK DELAY ACCOUNTING P: Balbir Singh M: balbir@linux.vnet.ibm.com L: linux-kernel@vger.kernel.org S: Maintained +F: include/linux/delayacct.h +F: kernel/delayacct.c PERSONALITY HANDLING P: Christoph Hellwig M: hch@infradead.org L: linux-abi-devel@lists.sourceforge.net S: Maintained +F: include/linux/personality.h PHRAM MTD DRIVER P: Joern Engel M: joern@lazybastard.org L: linux-mtd@lists.infradead.org S: Maintained +F: drivers/mtd/devices/phram.c PKTCDVD DRIVER P: Peter Osterlund M: petero2@telia.com L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/block/pktcdvd.c +F: include/linux/pktcdvd.h POSIX CLOCKS and TIMERS P: Thomas Gleixner M: tglx@linutronix.de L: linux-kernel@vger.kernel.org S: Supported +F: fs/timerfd.c +F: include/linux/timer* +F: kernel/*timer* POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS P: Anton Vorontsov @@ -3515,6 +4326,8 @@ M: dwmw2@infradead.org L: linux-kernel@vger.kernel.org T: git git.infradead.org/battery-2.6.git S: Maintained +F: include/linux/power_supply.h +F: drivers/power/power_supply* PNP SUPPORT P: Adam Belay @@ -3522,33 +4335,42 @@ M: abelay@mit.edu P: Bjorn Helgaas M: bjorn.helgaas@hp.com S: Maintained +F: drivers/pnp/ PNXxxxx I2C DRIVER P: Vitaly Wool M: vitalywool@gmail.com L: linux-i2c@vger.kernel.org S: Maintained +F: drivers/i2c/busses/i2c-pnx.c PPP PROTOCOL DRIVERS AND COMPRESSORS P: Paul Mackerras M: paulus@samba.org L: linux-ppp@vger.kernel.org S: Maintained +F: drivers/net/ppp_* PPP OVER ATM (RFC 2364) P: Mitchell Blank Jr M: mitch@sfgoth.com S: Maintained +F: net/atm/pppoatm.c +F: include/linux/atmppp.h PPP OVER ETHERNET P: Michal Ostrowski M: mostrows@earthlink.net S: Maintained +F: drivers/net/pppoe.c +F: drivers/net/pppox.c PPP OVER L2TP P: James Chapman M: jchapman@katalix.com S: Maintained +F: drivers/net/pppol2tp.c +F: include/linux/if_pppol2tp.h PREEMPTIBLE KERNEL P: Robert Love @@ -3557,6 +4379,8 @@ L: linux-kernel@vger.kernel.org L: kpreempt-tech@lists.sourceforge.net W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel S: Supported +F: Documentation/preempt-locking.txt +F: include/linux/preempt.h PRISM54 WIRELESS DRIVER P: Luis R. Rodriguez @@ -3564,6 +4388,7 @@ M: mcgrof@gmail.com L: linux-wireless@vger.kernel.org W: http://prism54.org S: Maintained +F: drivers/net/wireless/prism54/ PROMISE DC4030 CACHING DISK CONTROLLER DRIVER P: Peter Denison @@ -3576,6 +4401,7 @@ P: Mikael Pettersson M: mikpe@it.uu.se L: linux-ide@vger.kernel.org S: Maintained +F: drivers/ata/sata_promise.* PS3 NETWORK SUPPORT P: Masakazu Mokuno @@ -3583,6 +4409,7 @@ M: mokuno@sm.sony.co.jp L: netdev@vger.kernel.org L: cbe-oss-dev@ozlabs.org S: Supported +F: drivers/net/ps3_gelic_net.* PS3 PLATFORM SUPPORT P: Geoff Levand @@ -3590,6 +4417,13 @@ M: geoffrey.levand@am.sony.com L: linuxppc-dev@ozlabs.org L: cbe-oss-dev@ozlabs.org S: Supported +F: arch/powerpc/boot/ps3* +F: arch/powerpc/include/asm/lv1call.h +F: arch/powerpc/include/asm/ps3*.h +F: arch/powerpc/platforms/ps3/ +F: drivers/*/ps3* +F: drivers/ps3/ +F: drivers/usb/host/*ps3.c PS3VRAM DRIVER P: Jim Paris @@ -3605,6 +4439,8 @@ L: linux-media@vger.kernel.org W: http://www.isely.net/pvrusb2/ T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: Documentation/video4linux/README.pvrusb2 +F: drivers/media/video/pvrusb2/ PXA2xx/PXA3xx SUPPORT P: Eric Miao @@ -3613,6 +4449,12 @@ P: Russell King M: linux@arm.linux.org.uk L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained +F: arch/arm/mach-pxa/ +F: drivers/pcmcia/pxa2xx* +F: drivers/spi/pxa2xx* +F: drivers/usb/gadget/pxa2* +F: include/sound/pxa2xx-lib.h +F: sound/soc/pxa/pxa2xx* PXA168 SUPPORT P: Eric Miao @@ -3644,12 +4486,16 @@ P: Andrew Vasquez M: linux-driver@qlogic.com L: linux-scsi@vger.kernel.org S: Supported +F: Documentation/scsi/LICENSE.qla2xxx +F: drivers/scsi/qla2xxx/ QLOGIC QLA3XXX NETWORK DRIVER P: Ron Mercer M: linux-driver@qlogic.com L: netdev@vger.kernel.org S: Supported +F: Documentation/networking/LICENSE.qla3xxx +F: drivers/net/qla3xxx.* QLOGIC QLGE 10Gb ETHERNET DRIVER P: Ron Mercer @@ -3657,6 +4503,7 @@ M: linux-driver@qlogic.com M: ron.mercer@qlogic.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/qlge/ QNX4 FILESYSTEM P: Anders Larsen @@ -3664,18 +4511,24 @@ M: al@alarsen.net L: linux-kernel@vger.kernel.org W: http://www.alarsen.net/linux/qnx4fs/ S: Maintained +F: fs/qnx4 +F: include/linux/qnx4_fs.h +F: include/linux/qnxtypes.h RADEON FRAMEBUFFER DISPLAY DRIVER P: Benjamin Herrenschmidt M: benh@kernel.crashing.org L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/aty/radeon* +F: include/linux/radeonfb.h RAGE128 FRAMEBUFFER DISPLAY DRIVER P: Paul Mackerras M: paulus@samba.org L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/aty/aty128fb.c RALINK RT2X00 WIRELESS LAN DRIVER P: rt2x00 project @@ -3690,29 +4543,36 @@ RAMDISK RAM BLOCK DEVICE DRIVER P: Nick Piggin M: npiggin@suse.de S: Maintained +F: Documentation/blockdev/ramdisk.txt +F: drivers/block/brd.c RANDOM NUMBER DRIVER P: Matt Mackall M: mpm@selenic.com S: Maintained +F: drivers/char/random.c RAPIDIO SUBSYSTEM P: Matt Porter M: mporter@kernel.crashing.org L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/rapidio/ RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER P: Corey Thomas M: coreythomas@charter.net L: linux-wireless@vger.kernel.org S: Maintained +F: drivers/net/wireless/ray* RCUTORTURE MODULE P: Josh Triplett M: josh@freedesktop.org L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/RCU/torture.txt +F: kernel/rcutorture.c RDC R-321X SoC P: Florian Fainelli @@ -3725,12 +4585,14 @@ P: Florian Fainelli M: florian.fainelli@telecomint.eu L: netdev@vger.kernel.org S: Maintained +F: drivers/net/r6040.c RDS - RELIABLE DATAGRAM SOCKETS P: Andy Grover M: andy.grover@oracle.com L: rds-devel@oss.oracle.com S: Supported +F: net/rds/ READ-COPY UPDATE (RCU) P: Dipankar Sarma @@ -3738,22 +4600,34 @@ M: dipankar@in.ibm.com W: http://www.rdrop.com/users/paulmck/rclock/ L: linux-kernel@vger.kernel.org S: Supported +F: Documentation/RCU/rcu.txt +F: Documentation/RCU/rcuref.txt +F: include/linux/rcupdate.h +F: include/linux/srcu.h +F: kernel/rcupdate.c REAL TIME CLOCK DRIVER P: Paul Gortmaker M: p_gortmaker@yahoo.com L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/rtc.txt +F: drivers/rtc/ +F: include/linux/rtc.h REAL TIME CLOCK (RTC) SUBSYSTEM P: Alessandro Zummo M: a.zummo@towertech.it L: rtc-linux@googlegroups.com S: Maintained +F: Documentation/rtc.txt +F: drivers/rtc/ +F: include/linux/rtc.h REISERFS FILE SYSTEM L: reiserfs-devel@vger.kernel.org S: Supported +F: fs/reiserfs/ RFKILL P: Ivo van Doorn @@ -3764,11 +4638,15 @@ F: net/rfkill RISCOM8 DRIVER S: Orphan +F: Documentation/serial/riscom8.txt +F: drivers/char/riscom8* ROCKETPORT DRIVER P: Comtrol Corp. W: http://www.comtrol.com S: Maintained +F: Documentation/serial/rocket.txt +F: drivers/char/rocket* ROSE NETWORK LAYER P: Ralf Baechle @@ -3776,6 +4654,9 @@ M: ralf@linux-mips.org L: linux-hams@vger.kernel.org W: http://www.linux-ax25.org/ S: Maintained +F: include/linux/rose.h +F: include/net/rose.h +F: net/rose/ RTL8180 WIRELESS DRIVER P: John W. Linville @@ -3784,6 +4665,7 @@ L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained +F: drivers/net/wireless/rtl818* RTL8187 WIRELESS DRIVER P: Herton Ronaldo Krzesinski @@ -3796,12 +4678,14 @@ L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained +F: drivers/net/wireless/rtl818x/rtl8187* S3 SAVAGE FRAMEBUFFER DRIVER P: Antonino Daplas M: adaplas@gmail.com L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/savage/ S390 P: Martin Schwidefsky @@ -3812,6 +4696,7 @@ M: linux390@de.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +F: arch/s390/ S390 NETWORK DRIVERS P: Ursula Braun @@ -3822,6 +4707,7 @@ M: linux390@de.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +F: drivers/s390/net/ S390 ZCRYPT DRIVER P: Felix Beck @@ -3841,6 +4727,8 @@ M: linux390@de.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +F: Documentation/s390/zfcpdump.txt +F: drivers/s390/scsi/zfcp_* S390 IUCV NETWORK LAYER P: Ursula Braun @@ -3849,6 +4737,9 @@ M: linux390@de.ibm.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +F: drivers/s390/net/*iucv* +F: include/net/iucv/ +F: net/iucv/ S3C24XX SD/MMC Driver P: Ben Dooks @@ -3856,6 +4747,7 @@ M: ben-linux@fluff.org L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) L: linux-kernel@vger.kernel.org S: Supported +F: drivers/mmc/host/s3cmci.* SAA7146 VIDEO4LINUX-2 DRIVER P: Michael Hunold @@ -3864,11 +4756,15 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.mihu.de/linux/saa7146 S: Maintained +F: drivers/media/common/saa7146* +F: drivers/media/video/*7146* +F: include/media/*7146* SC1200 WDT DRIVER P: Zwane Mwaikambo M: zwane@arm.linux.org.uk S: Maintained +F: drivers/watchdog/sc1200wdt.c SCHEDULER P: Ingo Molnar @@ -3877,6 +4773,8 @@ P: Peter Zijlstra M: peterz@infradead.org L: linux-kernel@vger.kernel.org S: Maintained +F: kernel/sched* +F: include/linux/sched.h SCSI CDROM DRIVER P: Jens Axboe @@ -3884,6 +4782,7 @@ M: axboe@kernel.dk L: linux-scsi@vger.kernel.org W: http://www.kernel.dk S: Maintained +F: drivers/scsi/sr* SCSI SG DRIVER P: Doug Gilbert @@ -3891,6 +4790,8 @@ M: dgilbert@interlog.com L: linux-scsi@vger.kernel.org W: http://www.torque.net/sg S: Maintained +F: drivers/scsi/sg.c +F: include/scsi/sg.h SCSI SUBSYSTEM P: James E.J. Bottomley @@ -3900,12 +4801,16 @@ T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git S: Maintained +F: drivers/scsi/ +F: include/scsi/ SCSI TAPE DRIVER P: Kai Mäkisara M: Kai.Makisara@kolumbus.fi L: linux-scsi@vger.kernel.org S: Maintained +F: Documentation/scsi/st.txt +F: drivers/scsi/st* SCTP PROTOCOL P: Vlad Yasevich @@ -3915,27 +4820,41 @@ M: sri@us.ibm.com L: linux-sctp@vger.kernel.org W: http://lksctp.sourceforge.net S: Supported +F: Documentation/networking/sctp.txt +F: include/linux/sctp.h +F: include/net/sctp/ +F: net/sctp/ SCx200 CPU SUPPORT P: Jim Cromie M: jim.cromie@gmail.com S: Odd Fixes +F: Documentation/i2c/busses/scx200_acb +F: arch/x86/kernel/scx200_32.c +F: drivers/watchdog/scx200_wdt.c +F: drivers/i2c/busses/scx200* +F: drivers/mtd/maps/scx200_docflash.c +F: include/linux/scx200.h SCx200 GPIO DRIVER P: Jim Cromie M: jim.cromie@gmail.com S: Maintained +F: drivers/char/scx200_gpio.c +F: include/linux/scx200_gpio.h SCx200 HRT CLOCKSOURCE DRIVER P: Jim Cromie M: jim.cromie@gmail.com S: Maintained +F: drivers/clocksource/scx200_hrt.c SDRICOH_CS MMC/SD HOST CONTROLLER INTERFACE DRIVER P: Sascha Sommer M: saschasommer@freenet.de L: sdricohcs-devel@lists.sourceforge.net (subscribers-only) S: Maintained +F: drivers/mmc/host/sdricoh_cs.c SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER P: Pierre Ossman @@ -3949,6 +4868,7 @@ M: avorontsov@ru.mvista.com L: linuxppc-dev@ozlabs.org L: sdhci-devel@lists.ossman.eu S: Maintained +F: drivers/mmc/host/sdhci.* SECURITY SUBSYSTEM F: security/ @@ -3977,11 +4897,15 @@ L: selinux@tycho.nsa.gov (subscribers-only, general discussion) W: http://selinuxproject.org T: git kernel.org:pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git S: Supported +F: include/linux/selinux* +F: security/selinux/ SENSABLE PHANTOM P: Jiri Slaby M: jirislaby@gmail.com S: Maintained +F: drivers/misc/phantom.c +F: include/linux/phantom.h SERIAL ATA (SATA) SUBSYSTEM P: Jeff Garzik @@ -3998,6 +4922,7 @@ M: subbus@serverengines.com L: netdev@vger.kernel.org W: http://www.serverengines.com S: Supported +F: drivers/net/benet/ SFC NETWORK DRIVER P: Steve Hodgson @@ -4005,17 +4930,22 @@ P: Ben Hutchings P: Robert Stonehouse M: linux-net-drivers@solarflare.com S: Supported +F: drivers/net/sfc/ SGI GRU DRIVER P: Jack Steiner M: steiner@sgi.com S: Maintained +F: drivers/misc/sgi-gru/ SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER P: Pat Gefre M: pfg@sgi.com L: linux-ia64@vger.kernel.org S: Supported +F: Documentation/ia64/serial.txt +F: drivers/serial/ioc?_serial.c +F: include/linux/ioc?.h SGI VISUAL WORKSTATION 320 AND 540 P: Andrey Panin @@ -4023,11 +4953,13 @@ M: pazke@donpac.ru L: linux-visws-devel@lists.sf.net W: http://linux-visws.sf.net S: Maintained for 2.6. +F: Documentation/sgi-visws.txt SGI XP/XPC/XPNET DRIVER P: Dean Nelson M: dcn@sgi.com S: Maintained +F: drivers/misc/sgi-xp/ SHARP LH SUPPORT (LH7952X & LH7A40X) P: Marc Singer @@ -4035,12 +4967,18 @@ M: elf@buici.com W: http://projects.buici.com/arm L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained +F: Documentation/arm/Sharp-LH/ADC-LH7-Touchscreen +F: arch/arm/mach-lh7a40x/ +F: drivers/serial/serial_lh7a40x.c +F: drivers/usb/gadget/lh7a40* +F: drivers/usb/host/ohci-lh7a40* SHPC HOTPLUG DRIVER P: Kristen Carlson Accardi M: kristen.c.accardi@intel.com L: linux-pci@vger.kernel.org S: Supported +F: drivers/pci/hotplug/shpchp* SIMTEC EB110ATX (Chalice CATS) P: Ben Dooks @@ -4048,6 +4986,7 @@ P: Vincent Sanders M: support@simtec.co.uk W: http://www.simtec.co.uk/products/EB110ATX/ S: Supported +F: arch/arm/mach-ebsa110/ SIMTEC EB2410ITX (BAST) P: Ben Dooks @@ -4055,12 +4994,16 @@ P: Vincent Sanders M: support@simtec.co.uk W: http://www.simtec.co.uk/products/EB2410ITX/ S: Supported +F: arch/arm/mach-s3c2410/ +F: drivers/*/*s3c2410* +F: drivers/*/*/*s3c2410* SIS 190 ETHERNET DRIVER P: Francois Romieu M: romieu@fr.zoreil.com L: netdev@vger.kernel.org S: Maintained +F: drivers/net/sis190.c SIS 900/7016 FAST ETHERNET DRIVER P: Daniele Venzano @@ -4068,30 +5011,39 @@ M: venza@brownhat.org W: http://www.brownhat.org/sis900.html L: netdev@vger.kernel.org S: Maintained +F: drivers/net/sis900.* SIS 96X I2C/SMBUS DRIVER P: Mark M. Hoffman M: mhoffman@lightlink.com L: linux-i2c@vger.kernel.org S: Maintained +F: Documentation/i2c/busses/i2c-sis96x +F: drivers/i2c/busses/i2c-sis96x.c SIS FRAMEBUFFER DRIVER P: Thomas Winischhofer M: thomas@winischhofer.net W: http://www.winischhofer.net/linuxsisvga.shtml S: Maintained +F: Documentation/fb/sisfb.txt +F: drivers/video/sis/ +F: include/video/sisfb.h SIS USB2VGA DRIVER P: Thomas Winischhofer M: thomas@winischhofer.net W: http://www.winischhofer.at/linuxsisusbvga.shtml S: Maintained +F: drivers/usb/misc/sisusbvga/ SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS P: Stephen Hemminger M: shemminger@linux-foundation.org L: netdev@vger.kernel.org S: Maintained +F: drivers/net/skge.* +F: drivers/net/sky2.* SLAB ALLOCATOR P: Christoph Lameter @@ -4102,34 +5054,43 @@ P: Matt Mackall M: mpm@selenic.com L: linux-mm@kvack.org S: Maintained +F: include/linux/sl?b*.h +F: mm/sl?b.c SMC91x ETHERNET DRIVER P: Nicolas Pitre M: nico@cam.org S: Maintained +F: drivers/net/smc91x.* SMSC47B397 HARDWARE MONITOR DRIVER P: Mark M. Hoffman M: mhoffman@lightlink.com L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/smsc47b397 +F: drivers/hwmon/smsc47b397.c SMSC911x ETHERNET DRIVER P: Steve Glendinning M: steve.glendinning@smsc.com L: netdev@vger.kernel.org S: Supported +F: include/linux/smsc911x.h +F: drivers/net/smsc911x.* SMSC9420 PCI ETHERNET DRIVER P: Steve Glendinning M: steve.glendinning@smsc.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/smsc9420.* SMX UIO Interface P: Ben Nizette M: bn@niasdigital.com S: Maintained +F: drivers/uio/uio_smx.c SN-IA64 (Itanium) SUB-PLATFORM P: Jes Sorensen @@ -4138,6 +5099,7 @@ L: linux-altix@sgi.com L: linux-ia64@vger.kernel.org W: http://www.sgi.com/altix S: Maintained +F: arch/ia64/sn/ SOC-CAMERA V4L2 SUBSYSTEM P: Guennadi Liakhovetski @@ -4145,29 +5107,37 @@ M: g.liakhovetski@gmx.de L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: include/media/v4l2* +F: drivers/media/video/v4l2* SOEKRIS NET48XX LED SUPPORT P: Chris Boot M: bootc@bootc.net S: Maintained +F: drivers/leds/leds-net48xx.c SOFTWARE RAID (Multiple Disks) SUPPORT P: Neil Brown M: neilb@suse.de L: linux-raid@vger.kernel.org S: Supported +F: drivers/md/ +F: include/linux/raid/ SONIC NETWORK DRIVER P: Thomas Bogendoerfer M: tsbogend@alpha.franken.de L: netdev@vger.kernel.org S: Maintained +F: drivers/net/sonic.* SONICS SILICON BACKPLANE DRIVER (SSB) P: Michael Buesch M: mb@bu3sch.de L: netdev@vger.kernel.org S: Maintained +F: drivers/ssb/ +F: include/linux/ssb/ SONY VAIO CONTROL DEVICE DRIVER P: Mattia Dongili @@ -4175,6 +5145,10 @@ M: malattia@linux.it L: linux-acpi@vger.kernel.org W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers S: Maintained +F: Documentation/laptops/sony-laptop.txt +F: drivers/char/sonypi.c +F: drivers/platform/x86/sony-laptop.c +F: include/linux/sony-laptop.h SONY MEMORYSTICK CARD SUPPORT P: Alex Dubov @@ -4182,6 +5156,7 @@ M: oakad@yahoo.com L: linux-kernel@vger.kernel.org W: http://tifmxx.berlios.de/ S: Maintained +F: drivers/memstick/host/tifm_ms.c SOUND P: Jaroslav Kysela @@ -4190,6 +5165,7 @@ P: Takashi Iwai M: tiwai@suse.de L: alsa-devel@alsa-project.org (subscribers-only) S: Maintained +F: sound/ SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) P: Liam Girdwood @@ -4200,6 +5176,7 @@ T: git opensource.wolfsonmicro.com/linux-2.6-asoc L: alsa-devel@alsa-project.org (subscribers-only) W: http://alsa-project.org/main/index.php/ASoC S: Supported +F: sound/soc/ SPARC + UltraSPARC (sparc/sparc64) P: David S. Miller @@ -4208,18 +5185,24 @@ L: sparclinux@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git S: Maintained +F: arch/sparc/ SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER P: Roger Wolff M: R.E.Wolff@BitWizard.nl L: linux-kernel@vger.kernel.org ? S: Supported +F: Documentation/serial/specialix.txt +F: drivers/char/specialix* SPI SUBSYSTEM P: David Brownell M: dbrownell@users.sourceforge.net L: spi-devel-general@lists.sourceforge.net S: Maintained +F: Documentation/spi/ +F: drivers/spi/ +F: include/linux/spi/ SPIDERNET NETWORK DRIVER for CELL P: Ishizaki Kou @@ -4228,6 +5211,8 @@ P: Jens Osterkamp M: jens@de.ibm.com L: netdev@vger.kernel.org S: Supported +F: Documentation/networking/spider_net.txt +F: drivers/net/spider_net* SPU FILE SYSTEM P: Jeremy Kerr @@ -4236,6 +5221,8 @@ L: linuxppc-dev@ozlabs.org L: cbe-oss-dev@ozlabs.org W: http://www.ibm.com/developerworks/power/cell/ S: Supported +F: Documentation/filesystems/spufs.txt +F: arch/powerpc/platforms/cell/spufs/ SQUASHFS FILE SYSTEM P: Phillip Lougher @@ -4243,12 +5230,15 @@ M: phillip@lougher.demon.co.uk L: squashfs-devel@lists.sourceforge.net (subscribers-only) W: http://squashfs.org.uk S: Maintained +F: Documentation/filesystems/squashfs.txt +F: fs/squashfs/ SRM (Alpha) environment access P: Jan-Benedict Glaw M: jbglaw@lug-owl.de L: linux-kernel@vger.kernel.org S: Maintained +F: arch/alpha/kernel/srm_env.c STABLE BRANCH P: Greg Kroah-Hartman @@ -4264,27 +5254,35 @@ M: gregkh@suse.de L: linux-kernel@vger.kernel.org T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Maintained +F: drivers/staging/ STARFIRE/DURALAN NETWORK DRIVER P: Ion Badulescu M: ionut@cs.columbia.edu S: Maintained +F: drivers/net/starfire* STARMODE RADIO IP (STRIP) PROTOCOL DRIVER W: http://mosquitonet.Stanford.EDU/strip.html S: Orphan +F: drivers/net/wireless/strip.c +F: include/linux/if_strip.h STRADIS MPEG-2 DECODER DRIVER P: Nathan Laredo M: laredo@gnu.org W: http://www.stradis.com/ S: Maintained +F: drivers/media/video/stradis.c SUN3/3X P: Sam Creasey M: sammy@sammy.net W: http://sammy.net/sun3/ S: Maintained +F: arch/m68k/kernel/*sun3* +F: arch/m68k/sun3*/ +F: arch/m68k/include/asm/sun3* SUPERH P: Paul Mundt @@ -4293,6 +5291,7 @@ L: linux-sh@vger.kernel.org W: http://www.linux-sh.org T: git kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6.git S: Supported +F: arch/sh/ SUSPEND TO RAM P: Len Brown @@ -4303,29 +5302,48 @@ P: Rafael J. Wysocki M: rjw@sisk.pl L: linux-pm@lists.linux-foundation.org S: Supported +F: Documentation/power/ +F: arch/x86/kernel/acpi/ +F: drivers/base/power/ +F: kernel/power/ +F: include/linux/suspend.h +F: include/linux/freezer.h +F: include/linux/pm.h +F: include/asm-*/suspend.h SVGA HANDLING P: Martin Mares M: mj@ucw.cz L: linux-video@atrey.karlin.mff.cuni.cz S: Maintained +F: Documentation/svga.txt +F: arch/x86/boot/video* SYSV FILESYSTEM P: Christoph Hellwig M: hch@infradead.org S: Maintained +F: Documentation/filesystems/sysv-fs.txt +F: fs/sysv/ +F: include/linux/sysv_fs.h TASKSTATS STATISTICS INTERFACE P: Balbir Singh M: balbir@linux.vnet.ibm.com L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/accounting/taskstats* +F: include/linux/taskstats* +F: kernel/taskstats.c TC CLASSIFIER P: Jamal Hadi Salim M: hadi@cyberus.ca L: netdev@vger.kernel.org S: Maintained +F: include/linux/pkt_cls.h +F: include/net/pkt_cls.h +F: net/sched/ TCP LOW PRIORITY MODULE P: Wong Hoi Sing, Edison @@ -4334,6 +5352,7 @@ P: Hung Hing Lun, Mike M: hlhung3i@gmail.com W: http://tcp-lp-mod.sourceforge.net/ S: Maintained +F: net/ipv4/tcp_lp.c TEHUTI ETHERNET DRIVER P: Alexander Indenbaum @@ -4342,16 +5361,19 @@ P: Andy Gospodarek M: andy@greyhouse.net L: netdev@vger.kernel.org S: Supported +F: drivers/net/tehuti* Telecom Clock Driver for MCPL0010 P: Mark Gross M: mark.gross@intel.com S: Supported +F: drivers/char/tlclk.c TENSILICA XTENSA PORT (xtensa) P: Chris Zankel M: chris@zankel.net S: Maintained +F: arch/xtensa/ THINKPAD ACPI EXTRAS DRIVER P: Henrique de Moraes Holschuh @@ -4361,11 +5383,15 @@ W: http://ibm-acpi.sourceforge.net W: http://thinkwiki.org/wiki/Ibm-acpi T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git S: Maintained +F: drivers/platform/x86/thinkpad_acpi.c TI FLASH MEDIA INTERFACE DRIVER P: Alex Dubov M: oakad@yahoo.com S: Maintained +F: drivers/misc/tifm* +F: drivers/mmc/host/tifm_sd.c +F: include/linux/tifm.h TI OMAP MMC INTERFACE DRIVER P: Carlos Aguiar, Anderson Briglia and Syed Khasim @@ -4373,11 +5399,13 @@ M: linux-omap@vger.kernel.org W: http://linux.omap.com W: http://www.muru.com/linux/omap/ S: Maintained +F: drivers/mmc/host/omap.c TI OMAP RANDOM NUMBER GENERATOR SUPPORT P: Deepak Saxena M: dsaxena@plexity.net S: Maintained +F: drivers/char/hw_random/omap-rng.c TIPC NETWORK LAYER P: Per Liden @@ -4391,6 +5419,9 @@ W: http://tipc.sourceforge.net/ W: http://tipc.cslab.ericsson.net/ T: git tipc.cslab.ericsson.net:/pub/git/tipc.git S: Maintained +F: include/linux/tipc*.h +F: include/net/tipc/ +F: net/tipc/ TLAN NETWORK DRIVER P: Samuel Chessman @@ -4398,6 +5429,8 @@ M: chessman@tux.org L: tlan-devel@lists.sourceforge.net (subscribers-only) W: http://sourceforge.net/projects/tlan/ S: Maintained +F: Documentation/networking/tlan.txt +F: drivers/net/tlan.* TOMOYO SECURITY MODULE P: Kentaro Takeda @@ -4411,9 +5444,11 @@ L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese) W: http://tomoyo.sourceforge.jp/ T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.2.x/tomoyo-lsm/patches/ S: Maintained +F: security/tomoyo/ TOSHIBA ACPI EXTRAS DRIVER S: Orphan +F: drivers/platform/x86/toshiba_acpi.c TOSHIBA SMM DRIVER P: Jonathan Buzzard @@ -4421,6 +5456,8 @@ M: jonathan@buzzard.org.uk L: tlinux-users@tce.toshiba-dme.co.jp W: http://www.buzzard.org.uk/toshiba/ S: Maintained +F: drivers/char/toshiba.c +F: include/linux/toshiba.h TMIO MMC DRIVER P: Ian Molton @@ -4438,6 +5475,7 @@ M: m.selhorst@sirrix.com W: http://www.sirrix.com L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/char/tpm/ TRIVIAL PATCHES P: Jiri Kosina @@ -4459,6 +5497,7 @@ P: Kyle McMartin M: kyle@mcmartin.ca L: netdev@vger.kernel.org S: Maintained +F: drivers/net/tulip/ TUN/TAP driver P: Maxim Krasnyansky @@ -4466,17 +5505,22 @@ M: maxk@qualcomm.com L: vtun@office.satix.net W: http://vtun.sourceforge.net/tun S: Maintained +F: Documentation/networking/tuntap.txt +F: arch/um/os-Linux/drivers/ TURBOCHANNEL SUBSYSTEM P: Maciej W. Rozycki M: macro@linux-mips.org S: Maintained +F: drivers/tc/ +F: include/linux/tc.h U14-34F SCSI DRIVER P: Dario Ballabio M: ballabio_dario@emc.com L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/u14-34f.c UBI FILE SYSTEM (UBIFS) P: Artem Bityutskiy @@ -4487,6 +5531,8 @@ L: linux-mtd@lists.infradead.org T: git git://git.infradead.org/ubifs-2.6.git W: http://www.linux-mtd.infradead.org/doc/ubifs.html S: Maintained +F: Documentation/filesystems/ubifs.txt +F: fs/ubifs/ UCLINUX (AND M68KNOMMU) P: Greg Ungerer @@ -4494,6 +5540,7 @@ M: gerg@uclinux.org W: http://www.uclinux.org/ L: uclinux-dev@uclinux.org (subscribers-only) S: Maintained +F: arch/m68knommu/ UCLINUX FOR RENESAS H8/300 P: Yoshinori Sato @@ -4506,18 +5553,25 @@ P: Jan Kara M: jack@suse.cz W: http://linux-udf.sourceforge.net S: Maintained +F: Documentation/filesystems/udf.txt +F: fs/udf/ UFS FILESYSTEM P: Evgeniy Dushistov M: dushistov@mail.ru L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/ufs.txt +F: fs/ufs/ ULTRA-WIDEBAND (UWB) SUBSYSTEM: P: David Vrabel M: david.vrabel@csr.com L: linux-usb@vger.kernel.org S: Supported +F: drivers/uwb/* +F: include/linux/uwb.h +F: include/linux/uwb/ UNIFORM CDROM DRIVER P: Jens Axboe @@ -4525,6 +5579,9 @@ M: axboe@kernel.dk L: linux-kernel@vger.kernel.org W: http://www.kernel.dk S: Maintained +F: Documentation/cdrom/ +F: drivers/cdrom/cdrom.c +F: include/linux/cdrom.h UNSORTED BLOCK IMAGES (UBI) P: Artem Bityutskiy @@ -4533,12 +5590,17 @@ W: http://www.linux-mtd.infradead.org/ L: linux-mtd@lists.infradead.org T: git git://git.infradead.org/ubi-2.6.git S: Maintained +F: drivers/mtd/ubi +F: include/linux/mtd/ubi.h +F: include/mtd/ubi-user.h USB ACM DRIVER P: Oliver Neukum M: oliver@neukum.name L: linux-usb@vger.kernel.org S: Maintained +F: Documentation/usb/acm.txt +F: drivers/usb/class/cdc-acm.* USB BLOCK DRIVER (UB ub) P: Pete Zaitcev @@ -4546,6 +5608,7 @@ M: zaitcev@redhat.com L: linux-kernel@vger.kernel.org L: linux-usb@vger.kernel.org S: Supported +F: drivers/block/ub.c USB CDC ETHERNET DRIVER P: Greg Kroah-Hartman @@ -4553,12 +5616,15 @@ M: greg@kroah.com L: linux-usb@vger.kernel.org S: Maintained W: http://www.kroah.com/linux-usb/ +F: drivers/net/usb/cdc_*.c +F: include/linux/usb/cdc.h USB CYPRESS C67X00 DRIVER P: Peter Korsgaard M: jacmet@sunsite.dk L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/c67x00/ USB DAVICOM DM9601 DRIVER P: Peter Korsgaard @@ -4566,6 +5632,7 @@ M: jacmet@sunsite.dk L: netdev@vger.kernel.org W: http://www.linux-usb.org/usbnet S: Maintained +F: drivers/net/usb/dm9601.c USB DIAMOND RIO500 DRIVER P: Cesar Miquel @@ -4573,12 +5640,15 @@ M: miquel@df.uba.ar L: rio500-users@lists.sourceforge.net W: http://rio500.sourceforge.net S: Maintained +F: drivers/usb/misc/rio500* USB EHCI DRIVER P: David Brownell M: dbrownell@users.sourceforge.net L: linux-usb@vger.kernel.org S: Odd Fixes +F: Documentation/usb/ehci.txt +F: drivers/usb/host/ehci* USB ET61X[12]51 DRIVER P: Luca Risolia @@ -4588,6 +5658,7 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained +F: drivers/media/video/et61x251/ USB GADGET/PERIPHERAL SUBSYSTEM P: David Brownell @@ -4595,6 +5666,8 @@ M: dbrownell@users.sourceforge.net L: linux-usb@vger.kernel.org W: http://www.linux-usb.org/gadget S: Maintained +F: drivers/usb/gadget/ +F: include/linux/usb/gadget* USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) P: Jiri Kosina @@ -4602,18 +5675,23 @@ M: jkosina@suse.cz L: linux-usb@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained +F: Documentation/usb/hiddev.txt +F: drivers/hid/usbhid/ USB ISP116X DRIVER P: Olav Kongas M: ok@artecdesign.ee L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/host/isp116x* +F: include/linux/usb/isp116x.h USB KAWASAKI LSI DRIVER P: Oliver Neukum M: oliver@neukum.name L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/serial/kl5kusb105.* USB MASS STORAGE DRIVER P: Matthew Dharm @@ -4622,18 +5700,22 @@ L: linux-usb@vger.kernel.org L: usb-storage@lists.one-eyed-alien.net S: Maintained W: http://www.one-eyed-alien.net/~mdharm/linux-usb/ +F: drivers/usb/storage/ USB OHCI DRIVER P: David Brownell M: dbrownell@users.sourceforge.net L: linux-usb@vger.kernel.org S: Odd Fixes +F: Documentation/usb/ohci.txt +F: drivers/usb/host/ohci* USB OPTION-CARD DRIVER P: Matthias Urlichs M: smurf@smurf.noris.de L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/serial/option.c USB OV511 DRIVER P: Mark McClelland @@ -4641,6 +5723,7 @@ M: mmcclell@bigfoot.com L: linux-usb@vger.kernel.org W: http://alpha.dyndns.org/ov511/ S: Maintained +F: drivers/media/video/ov511.* USB PEGASUS DRIVER P: Petko Manolov @@ -4649,12 +5732,14 @@ L: linux-usb@vger.kernel.org L: netdev@vger.kernel.org W: http://pegasus2.sourceforge.net/ S: Maintained +F: drivers/net/usb/pegasus.* USB PRINTER DRIVER (usblp) P: Pete Zaitcev M: zaitcev@redhat.com L: linux-usb@vger.kernel.org S: Supported +F: drivers/usb/class/usblp.c USB RTL8150 DRIVER P: Petko Manolov @@ -4663,6 +5748,7 @@ L: linux-usb@vger.kernel.org L: netdev@vger.kernel.org W: http://pegasus2.sourceforge.net/ S: Maintained +F: drivers/net/usb/rtl8150.c USB SE401 DRIVER P: Jeroen Vreeken @@ -4670,12 +5756,15 @@ M: pe1rxq@amsat.org L: linux-usb@vger.kernel.org W: http://www.chello.nl/~j.vreeken/se401/ S: Maintained +F: Documentation/video4linux/se401.txt +F: drivers/media/video/se401.* USB SERIAL BELKIN F5U103 DRIVER P: William Greathouse M: wgreathouse@smva.com L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/serial/belkin_sa.* USB SERIAL CYPRESS M8 DRIVER P: Lonnie Mendez @@ -4684,12 +5773,14 @@ L: linux-usb@vger.kernel.org S: Maintained W: http://geocities.com/i0xox0i W: http://firstlight.net/cvs +F: drivers/usb/serial/cypress_m8.* USB SERIAL CYBERJACK DRIVER P: Matthias Bruestle and Harald Welte M: support@reiner-sct.com W: http://www.reiner-sct.de/support/treiber_cyberjack.php S: Maintained +F: drivers/usb/serial/cyberjack.c USB SERIAL DIGI ACCELEPORT DRIVER P: Peter Berger and Al Borchers @@ -4697,18 +5788,24 @@ M: pberger@brimson.com M: alborchers@steinerpoint.com L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/serial/digi_acceleport.c USB SERIAL DRIVER P: Greg Kroah-Hartman M: gregkh@suse.de L: linux-usb@vger.kernel.org S: Supported +F: Documentation/usb/usb-serial.txt +F: drivers/usb/serial/generic.c +F: drivers/usb/serial/usb-serial.c +F: include/linux/usb/serial.h USB SERIAL EMPEG EMPEG-CAR MARK I/II DRIVER P: Gary Brubaker M: xavyer@ix.netcom.com L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/serial/empeg.c USB SERIAL KEYSPAN DRIVER P: Greg Kroah-Hartman @@ -4716,6 +5813,7 @@ M: greg@kroah.com L: linux-usb@vger.kernel.org W: http://www.kroah.com/linux/ S: Maintained +F: drivers/usb/serial/*keyspan* USB SERIAL WHITEHEAT DRIVER P: Support Department @@ -4723,12 +5821,14 @@ M: support@connecttech.com L: linux-usb@vger.kernel.org W: http://www.connecttech.com S: Supported +F: drivers/usb/serial/whiteheat* USB SMSC95XX ETHERNET DRIVER P: Steve Glendinning M: steve.glendinning@smsc.com L: netdev@vger.kernel.org S: Supported +F: drivers/net/usb/smsc95xx.* USB SN9C1xx DRIVER P: Luca Risolia @@ -4738,6 +5838,8 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained +F: Documentation/video4linux/sn9c102.txt +F: drivers/media/video/sn9c102/ USB SUBSYSTEM P: Greg Kroah-Hartman @@ -4746,12 +5848,18 @@ L: linux-usb@vger.kernel.org W: http://www.linux-usb.org T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Supported +F: Documentation/usb/ +F: drivers/net/usb/ +F: drivers/usb/ +F: include/linux/usb.h +F: include/linux/usb/ USB UHCI DRIVER P: Alan Stern M: stern@rowland.harvard.edu L: linux-usb@vger.kernel.org S: Maintained +F: drivers/usb/host/uhci* USB "USBNET" DRIVER FRAMEWORK P: David Brownell @@ -4759,6 +5867,8 @@ M: dbrownell@users.sourceforge.net L: netdev@vger.kernel.org W: http://www.linux-usb.org/usbnet S: Maintained +F: drivers/net/usb/usbnet.c +F: include/linux/usb/usbnet.h USB VIDEO CLASS P: Laurent Pinchart @@ -4768,6 +5878,7 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://linux-uvc.berlios.de S: Maintained +F: drivers/media/video/uvc/ USB W996[87]CF DRIVER P: Luca Risolia @@ -4777,12 +5888,15 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained +F: Documentation/video4linux/w9968cf.txt +F: drivers/media/video/w996* USB WIRELESS RNDIS DRIVER (rndis_wlan) P: Jussi Kivilinna M: jussi.kivilinna@mbnet.fi L: linux-wireless@vger.kernel.org S: Maintained +F: drivers/net/wireless/rndis_wlan.c USB ZC0301 DRIVER P: Luca Risolia @@ -4792,6 +5906,8 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained +F: Documentation/video4linux/zc0301.txt +F: drivers/media/video/zc0301/ USB ZD1201 DRIVER P: Jeroen Vreeken @@ -4799,6 +5915,7 @@ M: pe1rxq@amsat.org L: linux-usb@vger.kernel.org W: http://linux-lc100020.sourceforge.net S: Maintained +F: drivers/net/wireless/zd1201.* USB ZR364XX DRIVER P: Antoine Jacquet @@ -4808,6 +5925,8 @@ L: linux-media@vger.kernel.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://royale.zerezo.com/zr364xx/ S: Maintained +F: Documentation/video4linux/zr364xx.txt +F: drivers/media/video/zr364xx.c USER-MODE LINUX (UML) P: Jeff Dike @@ -4816,6 +5935,10 @@ L: user-mode-linux-devel@lists.sourceforge.net L: user-mode-linux-user@lists.sourceforge.net W: http://user-mode-linux.sourceforge.net S: Maintained +F: Documentation/uml/ +F: arch/um/ +F: fs/hostfs/ +F: fs/hppfs/ USERSPACE I/O (UIO) P: Hans J. Koch @@ -4824,6 +5947,9 @@ P: Greg Kroah-Hartman M: gregkh@suse.de L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/DocBook/uio-howto.tmpl +F: drivers/uio/ +F: include/linux/uio*.h UTIL-LINUX-NG PACKAGE P: Karel Zak @@ -4839,23 +5965,30 @@ M: spock@gentoo.org L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) W: http://dev.gentoo.org/~spock/projects/uvesafb/ S: Maintained +F: Documentation/fb/uvesafb.txt +F: drivers/video/uvesafb.* VFAT/FAT/MSDOS FILESYSTEM P: OGAWA Hirofumi M: hirofumi@mail.parknet.co.jp L: linux-kernel@vger.kernel.org S: Maintained +F: Documentation/filesystems/vfat.txt +F: fs/fat/ VIA RHINE NETWORK DRIVER P: Roger Luethi M: rl@hellgate.ch S: Maintained +F: drivers/net/via-rhine.c VIAPRO SMBUS DRIVER P: Jean Delvare M: khali@linux-fr.org L: linux-i2c@vger.kernel.org S: Maintained +F: Documentation/i2c/busses/i2c-viapro +F: drivers/i2c/busses/i2c-viapro.c VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER P: Joseph Chan @@ -4864,12 +5997,14 @@ P: Scott Fang M: ScottFang@viatech.com.cn L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) S: Maintained +F: drivers/video/via/ VIA VELOCITY NETWORK DRIVER P: Francois Romieu M: romieu@fr.zoreil.com L: netdev@vger.kernel.org S: Maintained +F: drivers/net/via-velocity.* VIDEO FOR LINUX (V4L) P: Mauro Carvalho Chehab @@ -4878,12 +6013,21 @@ L: linux-media@vger.kernel.org W: http://linuxtv.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained +F: Documentation/video4linux/ +F: drivers/media/video/ +F: drivers/media/radio/ +F: include/linux/videodev.h +F: include/linux/videodev2.h +F: include/media/ VLAN (802.1Q) P: Patrick McHardy M: kaber@trash.net L: netdev@vger.kernel.org S: Maintained +F: drivers/net/macvlan.c +F: include/linux/if_*vlan.h +F: net/8021q/ VOLTAGE AND CURRENT REGULATOR FRAMEWORK P: Liam Girdwood @@ -4894,47 +6038,62 @@ W: http://opensource.wolfsonmicro.com/node/15 W: http://www.slimlogic.co.uk/?p=48 T: git kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6.git S: Supported +F: drivers/regulator/ +F: include/linux/regulator/ VT1211 HARDWARE MONITOR DRIVER P: Juerg Haefliger M: juergh@gmail.com L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/vt1211 +F: drivers/hwmon/vt1211.c VT8231 HARDWARE MONITOR DRIVER P: Roger Lucas M: vt8231@hiddenengine.co.uk L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/vt8231.c W1 DALLAS'S 1-WIRE BUS P: Evgeniy Polyakov M: johnpol@2ka.mipt.ru S: Maintained +F: Documentation/w1/ +F: drivers/w1/ W83791D HARDWARE MONITORING DRIVER P: Marc Hulsman M: m.hulsman@tudelft.nl L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/w83791d +F: drivers/hwmon/w83791d.c W83793 HARDWARE MONITORING DRIVER P: Rudolf Marek M: r.marek@assembler.cz L: lm-sensors@lm-sensors.org S: Maintained +F: Documentation/hwmon/w83793 +F: drivers/hwmon/w83793.c W83L51xD SD/MMC CARD INTERFACE DRIVER P: Pierre Ossman M: pierre@ossman.eu L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/mmc/host/wbsd.* WATCHDOG DEVICE DRIVERS P: Wim Van Sebroeck M: wim@iguana.be T: git kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git S: Maintained +F: Documentation/watchdog/ +F: drivers/watchdog/ +F: include/linux/watchdog.h WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS P: Jean Tourrilhes @@ -4942,12 +6101,15 @@ M: jt@hpl.hp.com L: linux-wireless@vger.kernel.org W: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/ S: Maintained +F: Documentation/networking/wavelan.txt +F: drivers/net/wireless/wavelan* WD7000 SCSI DRIVER P: Miroslav Zagorac M: zaga@fly.cc.fer.hr L: linux-scsi@vger.kernel.org S: Maintained +F: drivers/scsi/wd7000.c WIMAX STACK P: Inaky Perez-Gonzalez @@ -4961,11 +6123,14 @@ WIMEDIA LLC PROTOCOL (WLP) SUBSYSTEM P: David Vrabel M: david.vrabel@csr.com S: Maintained +F: include/linux/wlp.h +F: drivers/uwb/wlp/ WISTRON LAPTOP BUTTON DRIVER P: Miloslav Trmac M: mitr@volny.cz S: Maintained +F: drivers/input/misc/wistron_btns.c WL3501 WIRELESS PCMCIA CARD DRIVER P: Arnaldo Carvalho de Melo @@ -4973,6 +6138,7 @@ M: acme@ghostprotocols.net L: linux-wireless@vger.kernel.org W: http://oops.ghostprotocols.net:81/blog S: Maintained +F: drivers/net/wireless/wl3501* WM97XX TOUCHSCREEN DRIVERS P: Mark Brown @@ -4983,12 +6149,17 @@ L: linux-input@vger.kernel.org T: git git://opensource.wolfsonmicro.com/linux-2.6-touch W: http://opensource.wolfsonmicro.com/node/7 S: Supported +F: drivers/input/touchscreen/*wm97* +F: include/linux/wm97xx.h X.25 NETWORK LAYER P: Henner Eisen M: eis@baty.hanse.de L: linux-x25@vger.kernel.org S: Maintained +F: Documentation/networking/x25* +F: include/net/x25* +F: net/x25/ X86 ARCHITECTURE (32-BIT AND 64-BIT) P: Thomas Gleixner @@ -5001,6 +6172,8 @@ M: x86@kernel.org L: linux-kernel@vger.kernel.org T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git S: Maintained +F: Documentation/x86/ +F: arch/x86/ XEN HYPERVISOR INTERFACE P: Jeremy Fitzhardinge @@ -5010,6 +6183,11 @@ M: chrisw@sous-sol.org L: virtualization@lists.osdl.org L: xen-devel@lists.xensource.com S: Supported +F: arch/x86/xen/ +F: drivers/*/xen-*front.c +F: drivers/xen/ +F: arch/x86/include/asm/xen/ +F: include/xen/ XFS FILESYSTEM P: Silicon Graphics Inc @@ -5020,6 +6198,8 @@ L: xfs@oss.sgi.com W: http://oss.sgi.com/projects/xfs T: git://oss.sgi.com/xfs/xfs.git S: Supported +F: Documentation/filesystems/xfs.txt +F: fs/xfs/ XILINX SYSTEMACE DRIVER P: Grant Likely @@ -5027,24 +6207,30 @@ M: grant.likely@secretlab.ca W: http://www.secretlab.ca/ L: linux-kernel@vger.kernel.org S: Maintained +F: drivers/block/xsysace.c XILINX UARTLITE SERIAL DRIVER P: Peter Korsgaard M: jacmet@sunsite.dk L: linux-serial@vger.kernel.org S: Maintained +F: drivers/serial/uartlite.c YAM DRIVER FOR AX.25 P: Jean-Paul Roubelat M: jpr@f6fbb.org L: linux-hams@vger.kernel.org S: Maintained +F: drivers/net/hamradio/yam* +F: include/linux/yam.h YEALINK PHONE DRIVER P: Henk Vergonet M: Henk.Vergonet@gmail.com L: usbb2k-api-dev@nongnu.org S: Maintained +F: Documentation/input/yealink.txt +F: drivers/input/misc/yealink.* Z8530 DRIVER FOR AX.25 P: Joerg Reuter @@ -5053,6 +6239,9 @@ W: http://yaina.de/jreuter/ W: http://www.qsl.net/dl1bke/ L: linux-hams@vger.kernel.org S: Maintained +F: Documentation/networking/z8530drv.txt +F: drivers/net/hamradio/*scc.c +F: drivers/net/hamradio/z8530.h ZD1211RW WIRELESS DRIVER P: Daniel Drake @@ -5063,6 +6252,7 @@ W: http://zd1211.ath.cx/wiki/DriverRewrite L: linux-wireless@vger.kernel.org L: zd1211-devs@lists.sourceforge.net (subscribers-only) S: Maintained +F: drivers/net/wireless/zd1211rw/ ZR36067 VIDEO FOR LINUX DRIVER L: mjpeg-users@lists.sourceforge.net @@ -5070,11 +6260,13 @@ L: linux-media@vger.kernel.org W: http://mjpeg.sourceforge.net/driver-zoran/ T: Mercurial http://linuxtv.org/hg/v4l-dvb S: Odd Fixes +F: drivers/media/video/zoran/ ZS DECSTATION Z85C30 SERIAL DRIVER P: Maciej W. Rozycki M: macro@linux-mips.org S: Maintained +F: drivers/serial/zs.* THE REST P: Linus Torvalds -- cgit v0.10.2 From 7d2c86b5a048e74ed375ae7ccc1106deabf8ca57 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 20:59:01 -0700 Subject: MAINTAINERS - Standardize style Use one email address per line Remove file patterns from section names Use tab after : Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 136aac6..641ffc1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -377,7 +377,7 @@ F: include/linux/agp* AHA152X SCSI DRIVER P: Juergen E. Fischer -M: Juergen Fischer +M: fischer@norbit.de L: linux-scsi@vger.kernel.org S: Maintained F: drivers/scsi/aha152x* @@ -460,10 +460,10 @@ F: arch/x86/kernel/amd_iommu*.c F: arch/x86/include/asm/amd_iommu*.h AMD MICROCODE UPDATE SUPPORT -P: Andreas Herrmann -M: andeas.herrmann3@amd.com -L: amd64-microcode@amd64.org -S: Supported +P: Andreas Herrmann +M: andeas.herrmann3@amd.com +L: amd64-microcode@amd64.org +S: Supported F: arch/x86/kernel/microcode_amd.c AMS (Apple Motion Sensor) DRIVER @@ -743,10 +743,10 @@ W: http://hackndev.com S: Maintained ARM/PALMZ72 SUPPORT -P: Sergey Lapin -M: slapin@ossfans.org -W: http://hackndev.com -S: Maintained +P: Sergey Lapin +M: slapin@ossfans.org +W: http://hackndev.com +S: Maintained ARM/PLEB SUPPORT P: Peter Chubb @@ -807,11 +807,11 @@ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) S: Maintained ARM/NUVOTON W90X900 ARM ARCHITECTURE -P: Wan ZongShun -M: mcuos.com@gmail.com -L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) -W: http://www.mcuos.com -S: Maintained +P: Wan ZongShun +M: mcuos.com@gmail.com +L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) +W: http://www.mcuos.com +S: Maintained ARPD SUPPORT P: Jonathan Layes @@ -1546,8 +1546,10 @@ S: Maintained F: sound/pci/cs5535audio/ CX18 VIDEO4LINUX DRIVER -P: Hans Verkuil, Andy Walls -M: hverkuil@xs4all.nl, awalls@radix.net +P: Hans Verkuil +M: hverkuil@xs4all.nl +P: Andy Walls +M: awalls@radix.net L: ivtv-devel@ivtvdriver.org L: ivtv-users@ivtvdriver.org L: linux-media@vger.kernel.org @@ -1795,7 +1797,7 @@ L: linux-acpi@vger.kernel.org S: Supported F: drivers/acpi/dock.c -DOCUMENTATION (/Documentation directory) +DOCUMENTATION P: Randy Dunlap M: rdunlap@xenotime.net L: linux-doc@vger.kernel.org @@ -1865,7 +1867,9 @@ F: drivers/serial/dz.* EATA-DMA SCSI DRIVER P: Michael Neuffer -L: linux-eata@i-connect.net, linux-scsi@vger.kernel.org +M: mike@i-Connect.Net +L: linux-eata@i-connect.net +L: linux-scsi@vger.kernel.org S: Maintained F: drivers/scsi/eata* @@ -1879,7 +1883,8 @@ F: drivers/scsi/eata.c EATA-PIO SCSI DRIVER P: Michael Neuffer M: mike@i-Connect.Net -L: linux-eata@i-connect.net, linux-scsi@vger.kernel.org +L: linux-eata@i-connect.net +L: linux-scsi@vger.kernel.org S: Maintained F: drivers/scsi/eata_pio.* @@ -1894,8 +1899,10 @@ F: include/linux/netfilter_bridge/ebt_*.h F: net/bridge/netfilter/ebt*.c ECRYPT FILE SYSTEM -P: Tyler Hicks, Dustin Kirkland -M: tyhicks@linux.vnet.ibm.com, kirkland@canonical.com +P: Tyler Hicks +M: tyhicks@linux.vnet.ibm.com +M: Dustin Kirkland +P: kirkland@canonical.com L: ecryptfs-devel@lists.launchpad.net W: https://launchpad.net/ecryptfs S: Supported @@ -2028,7 +2035,9 @@ F: drivers/scsi/lpfc/ EPSON 1355 FRAMEBUFFER DRIVER P: Christopher Hoover -M: ch@murgatroid.com, ch@hpl.hp.com +M: ch@murgatroid.com +P: Christopher Hoover +M: ch@hpl.hp.com S: Maintained F: drivers/video/epson1355fb.c @@ -2069,8 +2078,12 @@ F: fs/ext2/ F: include/linux/ext2* EXT3 FILE SYSTEM -P: Stephen Tweedie, Andrew Morton -M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com +P: Stephen Tweedie +M: sct@redhat.com +P: Andrew Morton +M: akpm@linux-foundation.org +P: Andreas Dilger +M: adilger@sun.com L: linux-ext4@vger.kernel.org S: Maintained F: Documentation/filesystems/ext3.txt @@ -2079,7 +2092,9 @@ F: include/linux/ext3* EXT4 FILE SYSTEM P: Theodore Ts'o -M: tytso@mit.edu, adilger@sun.com +M: tytso@mit.edu +P: Andreas Dilger +M: adilger@sun.com L: linux-ext4@vger.kernel.org W: http://ext4.wiki.kernel.org S: Maintained @@ -2131,9 +2146,11 @@ M: riku.vipio@iki.fi L: lm-sensors@lm-sensors.org S: Maintained -FIREWIRE SUBSYSTEM (drivers/firewire, ) -P: Kristian Hoegsberg, Stefan Richter -M: krh@redhat.com, stefanr@s5r6.in-berlin.de +FIREWIRE SUBSYSTEM +P: Kristian Hoegsberg +M: krh@redhat.com +P: Stefan Richter +M: stefanr@s5r6.in-berlin.de L: linux1394-devel@lists.sourceforge.net W: http://www.linux1394.org/ T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git @@ -2563,7 +2580,7 @@ M: perex@perex.cz S: Maintained F: drivers/net/hp100.* -HPET: High Precision Event Timers driver (drivers/char/hpet.c) +HPET: High Precision Event Timers driver P: Clemens Ladisch M: clemens@ladisch.de S: Maintained @@ -2583,7 +2600,7 @@ P: Vojtech Pavlik M: vojtech@suse.cz S: Maintained -HPET: ACPI hpet.c +HPET: ACPI P: Bob Picco M: bob.picco@hp.com S: Maintained @@ -2596,7 +2613,7 @@ W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi S: Maintained F: fs/hpfs/ -HSO 3G Modem Driver (hso.c) +HSO 3G MODEM DRIVER P: Denis Joseph Barrow M: d.barow@option.com W: http://www.pharscape.org @@ -2714,7 +2731,7 @@ L: linux-pm@lists.linux-foundation.org S: Supported F: drivers/idle/i7300_idle.c -IEEE 1394 SUBSYSTEM (drivers/ieee1394) +IEEE 1394 SUBSYSTEM P: Ben Collins M: ben.collins@ubuntu.com P: Stefan Richter @@ -2725,7 +2742,7 @@ T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git S: Maintained F: drivers/ieee1394/ -IEEE 1394 RAW I/O DRIVER (raw1394) +IEEE 1394 RAW I/O DRIVER P: Dan Dennedy M: dan@dennedy.org P: Stefan Richter @@ -3109,8 +3126,10 @@ F: include/linux/jffs2.h F: include/mtd/jffs2-user.h JOURNALLING LAYER FOR BLOCK DEVICES (JBD) -P: Stephen Tweedie, Andrew Morton -M: sct@redhat.com, akpm@linux-foundation.org +P: Stephen Tweedie +M: sct@redhat.com +P: Andrew Morton +M: akpm@linux-foundation.org L: linux-ext4@vger.kernel.org S: Maintained F: fs/jbd*/ @@ -3158,7 +3177,7 @@ L: autofs@linux.kernel.org S: Maintained F: fs/autofs4/ -KERNEL BUILD (kbuild: Makefile, scripts/Makefile.*) +KERNEL BUILD P: Sam Ravnborg M: sam@ravnborg.org T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git @@ -4668,16 +4687,16 @@ S: Maintained F: drivers/net/wireless/rtl818* RTL8187 WIRELESS DRIVER -P: Herton Ronaldo Krzesinski -M: herton@mandriva.com.br -P: Hin-Tak Leung -M htl10@users.sourceforge.net -P: Larry Finger -M: Larry.Finger@lwfinger.net -L: linux-wireless@vger.kernel.org -W: http://linuxwireless.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git -S: Maintained +P: Herton Ronaldo Krzesinski +M: herton@mandriva.com.br +P: Hin-Tak Leung +M: htl10@users.sourceforge.net +P: Larry Finger +M: Larry.Finger@lwfinger.net +L: linux-wireless@vger.kernel.org +W: http://linuxwireless.org/ +T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git +S: Maintained F: drivers/net/wireless/rtl818x/rtl8187* S3 SAVAGE FRAMEBUFFER DRIVER @@ -4871,7 +4890,6 @@ S: Maintained F: drivers/mmc/host/sdhci.* SECURITY SUBSYSTEM -F: security/ P: James Morris M: jmorris@namei.org L: linux-kernel@vger.kernel.org @@ -4879,6 +4897,7 @@ L: linux-security-module@vger.kernel.org (suggested Cc:) T: git kernel.org:pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git W: http://security.wiki.kernel.org/ S: Supported +F: security/ SECURITY CONTACT P: Security Officers @@ -4893,7 +4912,7 @@ M: jmorris@namei.org P: Eric Paris M: eparis@parisplace.org L: linux-kernel@vger.kernel.org (kernel issues) -L: selinux@tycho.nsa.gov (subscribers-only, general discussion) +L: selinux@tycho.nsa.gov (subscribers-only, general discussion) W: http://selinuxproject.org T: git kernel.org:pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git S: Supported @@ -4917,11 +4936,11 @@ S: Supported SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER P: Sathya Perla M: sathyap@serverengines.com -P: Subbu Seetharaman -M: subbus@serverengines.com -L: netdev@vger.kernel.org -W: http://www.serverengines.com -S: Supported +P: Subbu Seetharaman +M: subbus@serverengines.com +L: netdev@vger.kernel.org +W: http://www.serverengines.com +S: Supported F: drivers/net/benet/ SFC NETWORK DRIVER @@ -5190,7 +5209,7 @@ F: arch/sparc/ SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER P: Roger Wolff M: R.E.Wolff@BitWizard.nl -L: linux-kernel@vger.kernel.org ? +L: linux-kernel@vger.kernel.org S: Supported F: Documentation/serial/specialix.txt F: drivers/char/specialix* -- cgit v0.10.2 From 121ea2304436ddd0144b34d3616e552f2620e0dd Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:00:22 -0700 Subject: MAINTAINERS - Remove HP Fibre Channel HBA no longer in tree Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 641ffc1..ae099b3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2460,12 +2460,6 @@ S: Maintained F: Documentation/serial/hayes-esp.txt F: drivers/char/esp.c -HEWLETT-PACKARD FIBRE CHANNEL 64-bit/66MHz PCI non-intelligent HBA -P: Chirag Kantharia -M: chirag.kantharia@hp.com -L: iss_storagedev@hp.com -S: Maintained - HEWLETT-PACKARD SMART2 RAID DRIVER P: Chirag Kantharia M: chirag.kantharia@hp.com -- cgit v0.10.2 From 54e5881d0cd75821a48b1bf0977d06fba7cf1670 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:08:10 -0700 Subject: MAINTAINERS - standardize "T: git urls" Various forms of "T: git" entries exist: git kernel.org:/ git kernel.org/ git://git.kernel.org/ Standardize on "T: git git://git.kernel.org/" where appropriate Fix a few bad git path entries Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index ae099b3..32956d5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -180,7 +180,7 @@ P: Latchesar Ionkov M: lucho@ionkov.net L: v9fs-developer@lists.sourceforge.net W: http://swik.net/v9fs -T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git +T: git git://git.kernel.org/pub/scm/linux/kernel/ericvh/v9fs.git S: Maintained F: Documentation/filesystems/9p.txt F: fs/9p/ @@ -235,7 +235,7 @@ P: Len Brown M: lenb@kernel.org L: linux-acpi@vger.kernel.org W: http://www.lesswatts.org/projects/acpi/ -T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git S: Supported F: drivers/acpi/ F: drivers/pnp/pnpacpi/ @@ -327,7 +327,7 @@ P: Michael Wu M: flamingice@sourmilk.net L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git S: Maintained F: drivers/net/wireless/adm8211.* @@ -370,7 +370,7 @@ F: net/rxrpc/af_rxrpc.c AGPGART DRIVER P: David Airlie M: airlied@linux.ie -T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git S: Maintained F: drivers/char/agp/ F: include/linux/agp* @@ -454,7 +454,7 @@ AMD IOMMU (AMD-VI) P: Joerg Roedel M: joerg.roedel@amd.com L: iommu@lists.linux-foundation.org -T: git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git S: Supported F: arch/x86/kernel/amd_iommu*.c F: arch/x86/include/asm/amd_iommu*.h @@ -607,7 +607,7 @@ ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE P: Paulius Zaleckas M: paulius.zaleckas@teltonika.lt L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) -T: git gitorious.org/linux-gemini/mainline.git +T: git git://gitorious.org/linux-gemini/mainline.git S: Maintained ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6) @@ -990,7 +990,7 @@ P: Eric Paris M: eparis@redhat.com L: linux-audit@redhat.com (subscribers-only) W: http://people.redhat.com/sgrubb/audit/ -T: git git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git S: Maintained F: include/linux/audit.h F: kernel/audit* @@ -1134,7 +1134,7 @@ BLOCK LAYER P: Jens Axboe M: axboe@kernel.dk L: linux-kernel@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git S: Maintained F: block/ @@ -1158,7 +1158,7 @@ P: Marcel Holtmann M: marcel@holtmann.org L: linux-bluetooth@vger.kernel.org W: http://www.bluez.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git S: Maintained F: net/bluetooth/ F: include/net/bluetooth/ @@ -1223,7 +1223,7 @@ P: Chris Mason M: chris.mason@oracle.com L: linux-btrfs@vger.kernel.org W: http://btrfs.wiki.kernel.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/mason/btrfs-unstable.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git S: Maintained F: Documentation/filesystems/btrfs.txt F: fs/btrfs/ @@ -1233,7 +1233,7 @@ P: Mauro Carvalho Chehab M: mchehab@infradead.org L: linux-media@vger.kernel.org W: http://linuxtv.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: Documentation/video4linux/bttv/ F: drivers/media/video/bt8xx/bttv* @@ -1242,7 +1242,7 @@ CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER P: Jonathan Corbet M: corbet@lwn.net L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: Documentation/video4linux/cafe_ccic F: drivers/media/video/cafe_ccic* @@ -1390,7 +1390,7 @@ M: sfrench@samba.org L: linux-cifs-client@lists.samba.org L: samba-technical@lists.samba.org W: http://linux-cifs.samba.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git S: Supported F: Documentation/filesystems/cifs.txt F: fs/cifs/ @@ -1479,7 +1479,7 @@ P: Dave Jones M: davej@redhat.com L: cpufreq@vger.kernel.org W: http://www.codemonkey.org.uk/projects/cpufreq/ -T: git kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git S: Maintained F: arch/x86/kernel/cpu/cpufreq/ F: drivers/cpufreq/ @@ -1525,7 +1525,7 @@ M: herbert@gondor.apana.org.au P: David S. Miller M: davem@davemloft.net L: linux-crypto@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git S: Maintained F: Documentation/crypto/ F: arch/*/crypto/ @@ -1553,7 +1553,7 @@ M: awalls@radix.net L: ivtv-devel@ivtvdriver.org L: ivtv-users@ivtvdriver.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://linuxtv.org S: Maintained F: Documentation/video4linux/cx18.txt @@ -1763,7 +1763,7 @@ P: David Teigland M: teigland@redhat.com L: cluster-devel@redhat.com W: http://sources.redhat.com/cluster/ -T: git kernel.org:/pub/scm/linux/kernel/git/teigland/dlm.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm.git S: Supported F: fs/dlm/ @@ -1837,7 +1837,7 @@ DRM DRIVERS P: David Airlie M: airlied@linux.ie L: dri-devel@lists.sourceforge.net -T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git S: Maintained F: drivers/gpu/drm/ @@ -1852,7 +1852,7 @@ DVB SUBSYSTEM AND DRIVERS P: LinuxTV.org Project M: linux-media@vger.kernel.org W: http://linuxtv.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: Documentation/dvb/ F: drivers/media/dvb/ @@ -2153,7 +2153,7 @@ P: Stefan Richter M: stefanr@s5r6.in-berlin.de L: linux1394-devel@lists.sourceforge.net W: http://www.linux1394.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git S: Maintained F: drivers/firewire/ F: include/linux/firewire*.h @@ -2358,8 +2358,8 @@ P: Steven Whitehouse M: swhiteho@redhat.com L: cluster-devel@redhat.com W: http://sources.redhat.com/cluster/ -T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git -T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git S: Supported F: Documentation/filesystems/gfs2*.txt F: fs/gfs2/ @@ -2395,7 +2395,7 @@ GSPCA FINEPIX SUBDRIVER P: Frank Zago M: frank@zago.net L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/gspca/finepix.c @@ -2403,7 +2403,7 @@ GSPCA M5602 SUBDRIVER P: Erik Andren M: erik.andren@gmail.com L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/gspca/m5602/ @@ -2411,7 +2411,7 @@ GSPCA PAC207 SONIXB SUBDRIVER P: Hans de Goede M: hdegoede@redhat.com L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/gspca/pac207.c @@ -2419,7 +2419,7 @@ GSPCA T613 SUBDRIVER P: Leandro Costantino M: lcostantino@gmail.com L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/gspca/t613.c @@ -2428,7 +2428,7 @@ P: Jean-Francois Moine M: moinejf@free.fr W: http://moinejf.free.fr L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/gspca/ @@ -2513,7 +2513,7 @@ HID CORE LAYER P: Jiri Kosina M: jkosina@suse.cz L: linux-input@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained F: drivers/hid/ F: include/linux/hid* @@ -2667,7 +2667,7 @@ F: arch/x86/boot/ i386 SETUP CODE / CPU ERRATA WORKAROUNDS P: H. Peter Anvin M: hpa@zytor.com -T: git.kernel.org:/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git S: Maintained IA64 (Itanium) PLATFORM @@ -2675,7 +2675,7 @@ P: Tony Luck M: tony.luck@intel.com L: linux-ia64@vger.kernel.org W: http://www.ia64-linux.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6.git S: Maintained F: arch/ia64/ @@ -2732,7 +2732,7 @@ P: Stefan Richter M: stefanr@s5r6.in-berlin.de L: linux1394-devel@lists.sourceforge.net W: http://www.linux1394.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git S: Maintained F: drivers/ieee1394/ @@ -2765,7 +2765,7 @@ P: Hal Rosenstock M: hal.rosenstock@gmail.com L: general@lists.openfabrics.org (moderated for non-subscribers) W: http://www.openib.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git S: Supported F: Documentation/infiniband/ F: drivers/infiniband/ @@ -2787,7 +2787,7 @@ P: Dmitry Torokhov M: dmitry.torokhov@gmail.com M: dtor@mail.ru L: linux-input@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git S: Maintained F: drivers/input/ @@ -2832,7 +2832,7 @@ INTEL IOMMU (VT-d) P: David Woodhouse M: dwmw2@infradead.org L: iommu@lists.linux-foundation.org -T: git://git.infradead.org/iommu-2.6.git +T: git git://git.infradead.org/iommu-2.6.git S: Supported F: drivers/pci/intel-iommu.c F: include/linux/intel-iommu.h @@ -2938,7 +2938,7 @@ M: reinette.chatre@intel.com L: linux-wireless@vger.kernel.org L: ipw3945-devel@lists.sourceforge.net W: http://intellinuxwireless.org -T: git kernel.org:/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git S: Supported F: drivers/net/wireless/iwlwifi/ @@ -3018,7 +3018,7 @@ M: jkosina@suse.cz P: David Sterba M: dsterba@suse.cz S: Maintained -T: git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git F: drivers/char/pcmcia/ipwireless/ IPX NETWORK LAYER @@ -3054,7 +3054,7 @@ P: Mike Christie M: michaelc@cs.wisc.edu L: open-iscsi@googlegroups.com W: www.open-iscsi.org -T: git kernel.org:/pub/scm/linux/kernel/mnc/linux-2.6-iscsi.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mnc/linux-2.6-iscsi.git S: Maintained F: drivers/scsi/*iscsi* F: include/scsi/*iscsi* @@ -3064,7 +3064,7 @@ P: Karsten Keil M: isdn@linux-pingi.de L: isdn4linux@listserv.isdn4linux.de (subscribers-only) W: http://www.isdn4linux.de -T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git S: Maintained F: Documentation/isdn/ F: drivers/isdn/ @@ -3085,7 +3085,7 @@ M: hverkuil@xs4all.nl L: ivtv-devel@ivtvdriver.org L: ivtv-users@ivtvdriver.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.ivtvdriver.org S: Maintained F: Documentation/video4linux/*.ivtv @@ -3097,7 +3097,7 @@ P: Dave Kleikamp M: shaggy@austin.ibm.com L: jfs-discussion@lists.sourceforge.net W: http://jfs.sourceforge.net/ -T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git S: Supported F: Documentation/filesystems/jfs.txt F: fs/jfs/ @@ -3174,8 +3174,8 @@ F: fs/autofs4/ KERNEL BUILD P: Sam Ravnborg M: sam@ravnborg.org -T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git -T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-fixes.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-fixes.git L: linux-kbuild@vger.kernel.org S: Maintained F: Documentation/kbuild/ @@ -3375,7 +3375,7 @@ P: Paul Mackerras M: paulus@samba.org W: http://www.penguinppc.org/ L: linuxppc-dev@ozlabs.org -T: git kernel.org:/pub/scm/linux/kernel/git/benh/powerpc.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git S: Supported LINUX FOR POWER MACINTOSH @@ -3400,7 +3400,7 @@ P: Matt Porter M: mporter@kernel.crashing.org W: http://www.penguinppc.org/ L: linuxppc-dev@ozlabs.org -T: git kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc.git S: Maintained LINUX FOR POWERPC EMBEDDED XILINX VIRTEX @@ -3437,7 +3437,7 @@ LINUX SECURITY MODULE (LSM) FRAMEWORK P: Chris Wright M: chrisw@sous-sol.org L: linux-security-module@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git S: Supported LLC (802.2) @@ -3477,7 +3477,7 @@ M: peterz@infradead.org P: Ingo Molnar M: mingo@redhat.com L: linux-kernel@vger.kernel.org -T: git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git S: Maintained F: Documentation/lockdep*.txt F: Documentation/lockstat.txt @@ -3517,7 +3517,7 @@ P: Mike Frysinger M: vapier@gentoo.org L: ltp-list@lists.sourceforge.net (subscribers-only) W: http://ltp.sourceforge.net/ -T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git S: Maintained M32R ARCHITECTURE @@ -3537,7 +3537,7 @@ P: Roman Zippel M: zippel@linux-m68k.org L: linux-m68k@lists.linux-m68k.org W: http://www.linux-m68k.org/ -T: git git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git S: Maintained F: arch/m68k/ @@ -3560,7 +3560,7 @@ P: Johannes Berg M: johannes@sipsolutions.net L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained F: Documentation/networking/mac80211-injection.txt F: include/net/mac80211.h @@ -3573,7 +3573,7 @@ P: Mattias Nissler M: mattias.nissler@gmx.de L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained F: net/mac80211/rc80211_pid* @@ -3689,7 +3689,7 @@ P: Ralf Baechle M: ralf@linux-mips.org W: http://www.linux-mips.org/ L: linux-mips@linux-mips.org -T: git www.linux-mips.org:/pub/scm/linux.git +T: git git://git.linux-mips.org/pub/scm/linux.git S: Supported F: Documentation/mips/ F: arch/mips/ @@ -3756,7 +3756,7 @@ MULTIFUNCTION DEVICES (MFD) P: Samuel Ortiz M: sameo@linux.intel.com L: linux-kernel@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/sameo/mfd-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git S: Supported F: drivers/mfd/ @@ -3795,7 +3795,7 @@ MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER P: Felipe Balbi M: felipe.balbi@nokia.com L: linux-usb@vger.kernel.org -T: git gitorious.org:/musb/mainline.git +T: git git://gitorious.org/musb/mainline.git S: Maintained F: drivers/usb/musb/ @@ -3917,7 +3917,7 @@ NETWORK DEVICE DRIVERS P: Jeff Garzik M: jgarzik@pobox.com L: netdev@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git S: Maintained F: drivers/net/ @@ -3944,7 +3944,7 @@ M: yoshfuji@linux-ipv6.org P: Patrick McHardy M: kaber@trash.net L: netdev@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git S: Maintained F: net/ipv4/ F: net/ipv6/ @@ -3960,7 +3960,7 @@ NETWORKING [WIRELESS] P: John W. Linville M: linville@tuxdriver.com L: linux-wireless@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git S: Maintained F: net/wireless/ F: include/net/ieee80211* @@ -4032,7 +4032,7 @@ M: aia21@cantab.net L: linux-ntfs-dev@lists.sourceforge.net L: linux-kernel@vger.kernel.org W: http://www.linux-ntfs.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git S: Maintained F: Documentation/filesystems/ntfs.txt F: fs/ntfs/ @@ -4070,7 +4070,7 @@ OMNIVISION OV7670 SENSOR DRIVER P: Jonathan Corbet M: corbet@lwn.net L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: drivers/media/video/ov7670.c @@ -4140,7 +4140,7 @@ P: Benny Halevy M: bhalevy@panasas.com L: osd-dev@open-osd.org W: http://open-osd.org -T: git://git.open-osd.org/open-osd.git +T: git git://git.open-osd.org/open-osd.git S: Maintained P54 WIRELESS DRIVER @@ -4148,7 +4148,7 @@ P: Michael Wu M: flamingice@sourmilk.net L: linux-wireless@vger.kernel.org W: http://prism54.org -T: git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git S: Maintained F: drivers/net/wireless/p54/ @@ -4224,7 +4224,7 @@ P: Helge Deller M: deller@gmx.de L: linux-parisc@vger.kernel.org W: http://www.parisc-linux.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git S: Maintained F: arch/parisc/ F: drivers/parisc/ @@ -4262,7 +4262,7 @@ P: Jesse Barnes M: jbarnes@virtuousgeek.org L: linux-kernel@vger.kernel.org L: linux-pci@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git S: Supported F: Documentation/PCI/ F: drivers/pci/ @@ -4279,7 +4279,7 @@ PCMCIA SUBSYSTEM P: Linux PCMCIA Team L: linux-pcmcia@lists.infradead.org W: http://lists.infradead.org/mailman/listinfo/linux-pcmcia -T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git S: Maintained F: Documentation/pcmcia/ F: drivers/pcmcia/ @@ -4337,7 +4337,7 @@ M: cbou@mail.ru P: David Woodhouse M: dwmw2@infradead.org L: linux-kernel@vger.kernel.org -T: git git.infradead.org/battery-2.6.git +T: git git://git.infradead.org/battery-2.6.git S: Maintained F: include/linux/power_supply.h F: drivers/power/power_supply* @@ -4450,7 +4450,7 @@ M: isely@pobox.com L: pvrusb2@isely.net (subscribers-only) L: linux-media@vger.kernel.org W: http://www.isely.net/pvrusb2/ -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: Documentation/video4linux/README.pvrusb2 F: drivers/media/video/pvrusb2/ @@ -4475,14 +4475,14 @@ M: eric.miao@marvell.com P: Jason Chagas M: jason.chagas@marvell.com L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) -T: git kernel.org:/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git S: Supported PXA910 SUPPORT P: Eric Miao M: eric.miao@marvell.com L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) -T: git kernel.org:/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git S: Supported PXA MMCI DRIVER @@ -4549,7 +4549,7 @@ L: linux-wireless@vger.kernel.org L: users@rt2x00.serialmonkey.com W: http://rt2x00.serialmonkey.com/ S: Maintained -T: git kernel.org:/pub/scm/linux/kernel/git/ivd/rt2x00.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git F: drivers/net/wireless/rt2x00/ RAMDISK RAM BLOCK DEVICE DRIVER @@ -4676,7 +4676,7 @@ P: John W. Linville M: linville@tuxdriver.com L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained F: drivers/net/wireless/rtl818* @@ -4689,7 +4689,7 @@ P: Larry Finger M: Larry.Finger@lwfinger.net L: linux-wireless@vger.kernel.org W: http://linuxwireless.org/ -T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git S: Maintained F: drivers/net/wireless/rtl818x/rtl8187* @@ -4766,7 +4766,7 @@ SAA7146 VIDEO4LINUX-2 DRIVER P: Michael Hunold M: michael@mihu.de L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.mihu.de/linux/saa7146 S: Maintained F: drivers/media/common/saa7146* @@ -4810,9 +4810,9 @@ SCSI SUBSYSTEM P: James E.J. Bottomley M: James.Bottomley@HansenPartnership.com L: linux-scsi@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git -T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git -T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git S: Maintained F: drivers/scsi/ F: include/scsi/ @@ -4888,7 +4888,7 @@ P: James Morris M: jmorris@namei.org L: linux-kernel@vger.kernel.org L: linux-security-module@vger.kernel.org (suggested Cc:) -T: git kernel.org:pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git +T: git git://www.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git W: http://security.wiki.kernel.org/ S: Supported F: security/ @@ -4908,7 +4908,7 @@ M: eparis@parisplace.org L: linux-kernel@vger.kernel.org (kernel issues) L: selinux@tycho.nsa.gov (subscribers-only, general discussion) W: http://selinuxproject.org -T: git kernel.org:pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git S: Supported F: include/linux/selinux* F: security/selinux/ @@ -4924,7 +4924,7 @@ SERIAL ATA (SATA) SUBSYSTEM P: Jeff Garzik M: jgarzik@pobox.com L: linux-ide@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git S: Supported SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER @@ -5118,7 +5118,7 @@ SOC-CAMERA V4L2 SUBSYSTEM P: Guennadi Liakhovetski M: g.liakhovetski@gmx.de L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: include/media/v4l2* F: drivers/media/video/v4l2* @@ -5185,7 +5185,7 @@ P: Liam Girdwood M: lrg@slimlogic.co.uk P: Mark Brown M: broonie@opensource.wolfsonmicro.com -T: git opensource.wolfsonmicro.com/linux-2.6-asoc +T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc L: alsa-devel@alsa-project.org (subscribers-only) W: http://alsa-project.org/main/index.php/ASoC S: Supported @@ -5195,8 +5195,8 @@ SPARC + UltraSPARC (sparc/sparc64) P: David S. Miller M: davem@davemloft.net L: sparclinux@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git -T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git S: Maintained F: arch/sparc/ @@ -5302,7 +5302,7 @@ P: Paul Mundt M: lethal@linux-sh.org L: linux-sh@vger.kernel.org W: http://www.linux-sh.org -T: git kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git S: Supported F: arch/sh/ @@ -5394,7 +5394,7 @@ M: ibm-acpi@hmh.eng.br L: ibm-acpi-devel@lists.sourceforge.net W: http://ibm-acpi.sourceforge.net W: http://thinkwiki.org/wiki/Ibm-acpi -T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git +T: git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git S: Maintained F: drivers/platform/x86/thinkpad_acpi.c @@ -5430,7 +5430,7 @@ M: allan.stephens@windriver.com L: tipc-discussion@lists.sourceforge.net W: http://tipc.sourceforge.net/ W: http://tipc.cslab.ericsson.net/ -T: git tipc.cslab.ericsson.net:/pub/git/tipc.git +T: git git://tipc.cslab.ericsson.net/pub/git/tipc.git S: Maintained F: include/linux/tipc*.h F: include/net/tipc/ @@ -5494,7 +5494,7 @@ TRIVIAL PATCHES P: Jiri Kosina M: trivial@kernel.org L: linux-kernel@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jikos/trivial.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git S: Maintained TTY LAYER @@ -5668,7 +5668,7 @@ P: Luca Risolia M: luca.risolia@studio.unibo.it L: linux-usb@vger.kernel.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained F: drivers/media/video/et61x251/ @@ -5686,7 +5686,7 @@ USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) P: Jiri Kosina M: jkosina@suse.cz L: linux-usb@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git S: Maintained F: Documentation/usb/hiddev.txt F: drivers/hid/usbhid/ @@ -5848,7 +5848,7 @@ P: Luca Risolia M: luca.risolia@studio.unibo.it L: linux-usb@vger.kernel.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained F: Documentation/video4linux/sn9c102.txt @@ -5888,7 +5888,7 @@ P: Laurent Pinchart M: laurent.pinchart@skynet.be L: linux-uvc-devel@lists.berlios.de (subscribers-only) L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://linux-uvc.berlios.de S: Maintained F: drivers/media/video/uvc/ @@ -5898,7 +5898,7 @@ P: Luca Risolia M: luca.risolia@studio.unibo.it L: linux-usb@vger.kernel.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained F: Documentation/video4linux/w9968cf.txt @@ -5916,7 +5916,7 @@ P: Luca Risolia M: luca.risolia@studio.unibo.it L: linux-usb@vger.kernel.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://www.linux-projects.org S: Maintained F: Documentation/video4linux/zc0301.txt @@ -5935,7 +5935,7 @@ P: Antoine Jacquet M: royale@zerezo.com L: linux-usb@vger.kernel.org L: linux-media@vger.kernel.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git W: http://royale.zerezo.com/zr364xx/ S: Maintained F: Documentation/video4linux/zr364xx.txt @@ -5969,7 +5969,7 @@ P: Karel Zak M: kzak@redhat.com L: util-linux-ng@vger.kernel.org W: http://kernel.org/~kzak/util-linux-ng/ -T: git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git +T: git git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git S: Maintained UVESAFB DRIVER @@ -6024,7 +6024,7 @@ P: Mauro Carvalho Chehab M: mchehab@infradead.org L: linux-media@vger.kernel.org W: http://linuxtv.org -T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git S: Maintained F: Documentation/video4linux/ F: drivers/media/video/ @@ -6049,7 +6049,7 @@ P: Mark Brown M: broonie@opensource.wolfsonmicro.com W: http://opensource.wolfsonmicro.com/node/15 W: http://www.slimlogic.co.uk/?p=48 -T: git kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6.git S: Supported F: drivers/regulator/ F: include/linux/regulator/ @@ -6102,7 +6102,7 @@ F: drivers/mmc/host/wbsd.* WATCHDOG DEVICE DRIVERS P: Wim Van Sebroeck M: wim@iguana.be -T: git kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git S: Maintained F: Documentation/watchdog/ F: drivers/watchdog/ @@ -6183,7 +6183,7 @@ P: H. Peter Anvin M: hpa@zytor.com M: x86@kernel.org L: linux-kernel@vger.kernel.org -T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git S: Maintained F: Documentation/x86/ F: arch/x86/ @@ -6209,7 +6209,7 @@ M: felixb@sgi.com M: xfs-masters@oss.sgi.com L: xfs@oss.sgi.com W: http://oss.sgi.com/projects/xfs -T: git://oss.sgi.com/xfs/xfs.git +T: git git://oss.sgi.com/xfs/xfs.git S: Supported F: Documentation/filesystems/xfs.txt F: fs/xfs/ -- cgit v0.10.2 From cfe81f76c8372175b3c9aeb4fd983f3ef246473a Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:09:58 -0700 Subject: MAINTAINERS - Add Linus Torvalds' git Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 32956d5..b38e614 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6283,4 +6283,5 @@ F: drivers/serial/zs.* THE REST P: Linus Torvalds +T: git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git S: Buried alive in reporters -- cgit v0.10.2 From 932d18729dd0677472a7f1aea9820010df558c93 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:10:58 -0700 Subject: MAINTAINERS - i2c_tiny_usb T: should be W: Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index b38e614..9120f42 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2653,7 +2653,7 @@ I2C-TINY-USB DRIVER P: Till Harbaum M: till@harbaum.org L: linux-i2c@vger.kernel.org -T: http://www.harbaum.org/till/i2c_tiny_usb +W: http://www.harbaum.org/till/i2c_tiny_usb S: Maintained F: drivers/i2c/busses/i2c-tiny-usb.c -- cgit v0.10.2 From e769980feee8d4f5630aec9e06b03047aea0b9e7 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:12:18 -0700 Subject: MAINTAINERS - Update FPU Emulator contact address and web page Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 9120f42..de65e98 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2167,8 +2167,8 @@ F: include/linux/firmware.h FPU EMULATOR P: Bill Metzenthen -M: billm@suburbia.net -W: http://suburbia.net/~billm/floating-point/emulator/ +M: billm@melbpc.org.au +W: http://floatingpoint.sourceforge.net/emulator/index.html S: Maintained F: arch/x86/math-emu/ -- cgit v0.10.2 From 8ed01bbb89c943f714bdf4876f749b1b01792f65 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:13:49 -0700 Subject: MAINTAINERS - Remove x86/Voyager no longer in tree Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index de65e98..2c2a3bf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3362,12 +3362,6 @@ M: paulus@au.ibm.com W: http://www.ibm.com/linux/ltc/projects/ppc S: Supported -LINUX FOR NCR VOYAGER -P: James Bottomley -M: James.Bottomley@HansenPartnership.com -W: http://www.hansenpartnership.com/voyager -S: Maintained - LINUX FOR POWERPC (32-BIT AND 64-BIT) P: Benjamin Herrenschmidt M: benh@kernel.crashing.org -- cgit v0.10.2 From 0632973db2dc161868b2877f77bd72982d2f7017 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 21:15:03 -0700 Subject: MAINTAINERS - Remove cyblafb frame buffer no longer in tree Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 2c2a3bf..85819e6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1582,12 +1582,6 @@ W: http://www.arm.linux.org.uk/ S: Maintained F: drivers/video/cyber2000fb.* -CYBLAFB FRAMEBUFFER DRIVER -P: Knut Petersen -M: Knut_Petersen@t-online.de -L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) -S: Maintained - CYCLADES 2X SYNC CARD DRIVER P: Arnaldo Carvalho de Melo M: acme@ghostprotocols.net -- cgit v0.10.2 From 127c49ae097952b9686038392f862d69ac6a9c6a Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Wed, 8 Apr 2009 08:34:04 -0700 Subject: MAINTAINERS - Coalesce sections "DVB" and "Video for Linux" Creating new section MEDIA INPUT INFRASTRUCTURE Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 85819e6..f37a1e0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1842,17 +1842,6 @@ L: netdev@vger.kernel.org S: Maintained F: drivers/net/wan/dscc4.c -DVB SUBSYSTEM AND DRIVERS -P: LinuxTV.org Project -M: linux-media@vger.kernel.org -W: http://linuxtv.org/ -T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git -S: Maintained -F: Documentation/dvb/ -F: drivers/media/dvb/ -F: drivers/media/common/saa7146*.c -F: include/linux/dvb/ - DZ DECSTATION DZ11 SERIAL DRIVER P: Maciej W. Rozycki M: macro@linux-mips.org @@ -3625,6 +3614,21 @@ S: Maintained F: Documentation/hwmon/max6650 F: drivers/hwmon/max6650.c +MEDIA INPUT INFRASTRUCTURE (V4L/DVB) +P: Mauro Carvalho Chehab +M: mchehab@infradead.org +P: LinuxTV.org Project +L: linux-media@vger.kernel.org +W: http://linuxtv.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git +S: Maintained +F: Documentation/dvb/ +F: Documentation/video4linux/ +F: drivers/media/ +F: include/media/ +F: include/linux/dvb/ +F: include/linux/videodev*.h + MEGARAID SCSI DRIVERS P: Neela Syam Kolli M: megaraidlinux@lsi.com @@ -6007,20 +6011,6 @@ L: netdev@vger.kernel.org S: Maintained F: drivers/net/via-velocity.* -VIDEO FOR LINUX (V4L) -P: Mauro Carvalho Chehab -M: mchehab@infradead.org -L: linux-media@vger.kernel.org -W: http://linuxtv.org -T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git -S: Maintained -F: Documentation/video4linux/ -F: drivers/media/video/ -F: drivers/media/radio/ -F: include/linux/videodev.h -F: include/linux/videodev2.h -F: include/media/ - VLAN (802.1Q) P: Patrick McHardy M: kaber@trash.net -- cgit v0.10.2 From 9db35182b9528339a4655f4b894ac3305e0c3ac6 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Wed, 8 Apr 2009 08:39:56 -0700 Subject: MAINTAINERS - Update M68K patterns Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index f37a1e0..0499a21 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3517,6 +3517,7 @@ W: http://www.linux-m68k.org/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git S: Maintained F: arch/m68k/ +F: drivers/zorro/ M68K ON APPLE MACINTOSH P: Joshua Thompson @@ -3524,6 +3525,7 @@ M: funaho@jurai.org W: http://www.mac.linux-m68k.org/ L: linux-m68k@lists.linux-m68k.org S: Maintained +F: arch/m68k/mac/ M68K ON HP9000/300 P: Philip Blundell -- cgit v0.10.2 From 7cfc51b9d379c9b653b64791d8c6561ff61269c0 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Wed, 8 Apr 2009 10:04:18 -0700 Subject: MAINTAINERS - Update DRIVER CORE patterns Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 0499a21..45d3897 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1822,7 +1822,7 @@ L: linux-kernel@vger.kernel.org T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Supported F: Documentation/kobject.txt -F: drivers/base/core.c +F: drivers/base/ F: fs/sysfs/ F: include/linux/kobj* F: lib/kobj* -- cgit v0.10.2 From 80811493329eb0034e06edd0de0d448660077687 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Wed, 8 Apr 2009 20:20:27 -0700 Subject: MAINTAINERS - Add missing "/" to some pattern directories Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 45d3897..9b28eb9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3138,7 +3138,7 @@ L: kexec@lists.infradead.org L: linux-kernel@vger.kernel.org W: http://lse.sourceforge.net/kdump/ S: Maintained -F: Documentation/kdump +F: Documentation/kdump/ KERNEL AUTOMOUNTER (AUTOFS) P: H. Peter Anvin @@ -3239,7 +3239,7 @@ W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported F: Documentation/s390/kvm.txt F: arch/s390/include/asm/kvm* -F: arch/s390/kvm +F: arch/s390/kvm/ KEXEC P: Eric Biederman @@ -3885,7 +3885,7 @@ M: paul.moore@hp.com W: http://netlabel.sf.net L: netdev@vger.kernel.org S: Supported -F: Documentation/netlabel +F: Documentation/netlabel/ F: include/net/netlabel.h F: net/netlabel/ @@ -4518,7 +4518,7 @@ M: al@alarsen.net L: linux-kernel@vger.kernel.org W: http://www.alarsen.net/linux/qnx4fs/ S: Maintained -F: fs/qnx4 +F: fs/qnx4/ F: include/linux/qnx4_fs.h F: include/linux/qnxtypes.h @@ -4641,7 +4641,8 @@ P: Ivo van Doorn M: IvDoorn@gmail.com L: netdev@vger.kernel.org S: Maintained -F: net/rfkill +F Documentation/rfkill.txt +F: net/rfkill/ RISCOM8 DRIVER S: Orphan @@ -5597,7 +5598,7 @@ W: http://www.linux-mtd.infradead.org/ L: linux-mtd@lists.infradead.org T: git git://git.infradead.org/ubi-2.6.git S: Maintained -F: drivers/mtd/ubi +F: drivers/mtd/ubi/ F: include/linux/mtd/ubi.h F: include/mtd/ubi-user.h -- cgit v0.10.2 From d5ca6918bc9f336fcbdca430697f5cac150f9376 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Thu, 9 Apr 2009 02:42:01 -0700 Subject: MAINTAINERS - Add additional patterns for sections: FINTEK F75375S HARDWARE MONITOR PCA9532 LED DRIVER S390 ZCRYPT DRIVER SERIAL ATA (SATA) SUBSYSTEM TMIO MMC DRIVER Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 9b28eb9..156558c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2128,6 +2128,8 @@ P: Riku Voipio M: riku.vipio@iki.fi L: lm-sensors@lm-sensors.org S: Maintained +F: drivers/hwmon/f75375s.c +F: include/linux/f75375s.h FIREWIRE SUBSYSTEM P: Kristian Hoegsberg @@ -4241,6 +4243,8 @@ PCA9532 LED DRIVER P: Riku Voipio M: riku.voipio@iki.fi S: Maintained +F: drivers/leds/leds-pca9532.c +F: include/linux/leds-pca9532.h PCI ERROR RECOVERY P: Linas Vepstas @@ -4725,6 +4729,7 @@ M: ralph.wuerthner@de.ibm.com M: linux390@de.ibm.com L: linux-s390@vger.kernel.org S: Supported +F: drivers/s390/crypto/ S390 ZFCP DRIVER P: Christof Schmitt @@ -4921,6 +4926,9 @@ M: jgarzik@pobox.com L: linux-ide@vger.kernel.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git S: Supported +F: drivers/ata/ +F: include/linux/ata.h +F: include/linux/libata.h SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER P: Sathya Perla @@ -5471,6 +5479,7 @@ TMIO MMC DRIVER P: Ian Molton M: ian@mnementh.co.uk S: Maintained +F: drivers/mmc/host/tmio_mmc.* TPM DEVICE DRIVER P: Debora Velarde -- cgit v0.10.2 From 69aefcead5da3bb9e4aa7e80a3b6da531560c7dc Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Thu, 9 Apr 2009 10:39:22 -0700 Subject: MAINTAINERS - Update Freescale sound patterns Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 156558c..42fd096 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1362,7 +1362,6 @@ M: timur@freescale.com L: alsa-devel@alsa-project.org S: Supported F: sound/soc/codecs/cs4270* -F: sound/soc/fsl/mpc8610_hpcd.c CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER P: Cirrus Logic Corporation (kernel 2.2 driver) @@ -2250,7 +2249,8 @@ M: timur@freescale.com L: alsa-devel@alsa-project.org L: linuxppc-dev@ozlabs.org S: Supported -F: sound/soc/fsl/ +F: sound/soc/fsl/fsl* +F: sound/soc/fsl/mpc8610_hpcd.c FREEVXFS FILESYSTEM P: Christoph Hellwig -- cgit v0.10.2 From 4a7fdb5f51a4d9228b0ff93494b95f72be5e904a Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Fri, 10 Apr 2009 12:28:57 -0700 Subject: scripts/get_maintainer.pl - Allow multiple files on command line Improve handling of "by:" signoffs Sorting and frequency checks are done by name/email, not by "by:" tag. Signed-off-by: Joe Perches diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 0f3c0a5..60dc0c4 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -13,7 +13,7 @@ use strict; my $P = $0; -my $V = '0.14'; +my $V = '0.15'; use Getopt::Long qw(:config no_auto_abbrev); @@ -34,7 +34,7 @@ my $scm = 0; my $web = 0; my $subsystem = 0; my $status = 0; -my $onefile = 0; +my $from_filename = 0; my $version = 0; my $help = 0; @@ -72,7 +72,7 @@ if (!GetOptions( 'status!' => \$status, 'scm!' => \$scm, 'web!' => \$web, - 'f|file' => \$onefile, + 'f|file' => \$from_filename, 'v|version' => \$version, 'h|help' => \$help, )) { @@ -90,8 +90,6 @@ if ($version != 0) { exit 0; } -my $infile = $ARGV[0]; - if ($#ARGV < 0) { usage(); die "$P: argument missing: patchfile or -f file please\n"; @@ -139,32 +137,35 @@ while () { } close(MAINT); -## use the filename on the command line or find the filenames in the patchfile +## use the filenames on the command line or find the filenames in the patchfiles my @files = (); -if ($onefile) { - if (!(-f $infile)) { - die "$P: file '${infile}' not found\n"; +foreach my $file (@ARGV) { + next if ((-d $file)); + if (!(-f $file)) { + die "$P: file '${file}' not found\n"; } - push(@files, $infile); -} else { - open(PATCH, "<$infile") or die "$P: Can't open ${infile}\n"; - while () { - if (m/^\+\+\+\s+(\S+)/) { - my $file = $1; - $file =~ s@^[^/]*/@@; - $file =~ s@\n@@; - push(@files, $file); + if ($from_filename) { + push(@files, $file); + } else { + my $file_cnt = @files; + open(PATCH, "<$file") or die "$P: Can't open ${file}\n"; + while () { + if (m/^\+\+\+\s+(\S+)/) { + my $filename = $1; + $filename =~ s@^[^/]*/@@; + $filename =~ s@\n@@; + push(@files, $filename); + } } + close(PATCH); + if ($file_cnt == @files) { + die "$P: file '${file}' doesn't appear to be a patch. " + . "Add -f to options?\n"; + } + @files = sort_and_uniq(@files); } - close(PATCH); - my $file_cnt = @files; - if ($file_cnt == 0) { - print STDERR "$P: file '${infile}' doesn't appear to be a patch. " - . "Add -f to options?\n"; - } - @files = sort_and_uniq(@files); } my @email_to = (); @@ -208,7 +209,7 @@ foreach my $file (@files) { } } - if ($email_git) { + if ($email && $email_git) { recent_git_signoffs($file); } @@ -240,30 +241,22 @@ if ($email) { } if ($scm) { - if (!$onefile) { - @scm = sort_and_uniq(@scm); - } + @scm = sort_and_uniq(@scm); output(@scm); } if ($status) { - if (!$onefile) { - @status = sort_and_uniq(@status); - } + @status = sort_and_uniq(@status); output(@status); } if ($subsystem) { - if (!$onefile) { - @subsystem = sort_and_uniq(@subsystem); - } + @subsystem = sort_and_uniq(@subsystem); output(@subsystem); } if ($web) { - if (!$onefile) { - @web = sort_and_uniq(@web); - } + @web = sort_and_uniq(@web); output(@web); } @@ -445,10 +438,12 @@ sub recent_git_signoffs { } $cmd = "git log --since=${email_git_since} -- ${file}"; - $cmd .= " | grep -P '^ [-A-Za-z]+by:.*\\\@'"; + $cmd .= " | grep -Pi \"^[-_ a-z]+by:.*\\\@\""; if (!$email_git_penguin_chiefs) { - $cmd .= " | grep -E -v \"${penguin_chiefs}\""; + $cmd .= " | grep -Pv \"${penguin_chiefs}\""; } + $cmd .= " | cut -f2- -d\":\""; + $cmd .= " | sed -e \"s/^\\s+//g\""; $cmd .= " | sort | uniq -c | sort -rn"; $output = `${cmd}`; @@ -456,9 +451,9 @@ sub recent_git_signoffs { @lines = split("\n", $output); foreach my $line (@lines) { - if ($line =~ m/([0-9]+)\s+([-A-Za-z]+by:)\s+(.*)/) { + if ($line =~ m/([0-9]+)\s+(.*)/) { my $sign_offs = $1; - $line = $3; + $line = $2; $count++; if ($sign_offs < $email_git_min_signatures || $count > $email_git_max_maintainers) { @@ -467,17 +462,19 @@ sub recent_git_signoffs { } else { die("$P: Unexpected git output: ${line}\n"); } - if ($line =~ m/(.*) <(.*)>/) { + if ($line =~ m/(.+)<(.+)>/) { my $git_name = $1; my $git_addr = $2; $git_name =~ tr/^\"//; + $git_name =~ tr/^\\s*//; $git_name =~ tr/\"$//; + $git_name =~ tr/\\s*$//; if ($email_usename) { push(@email_to, format_email($git_name, $git_addr)); } else { push(@email_to, $git_addr); } - } elsif ($line =~ m/<(.*)>/) { + } elsif ($line =~ m/<(.+)>/) { my $git_addr = $1; push(@email_to, $git_addr); } else { -- cgit v0.10.2 From 43fbc1eb7160dcb5202242c0c4a4d68cc5b93a5e Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Fri, 10 Apr 2009 12:32:11 -0700 Subject: MAINTAINERS - Update frv arch patterns Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 42fd096..576702f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2285,7 +2285,6 @@ P: David Howells M: dhowells@redhat.com S: Maintained F: arch/frv/ -F: include/asm-frv/ FUJITSU LAPTOP EXTRAS P: Jonathan Woithe -- cgit v0.10.2 From be79b0928900ffb9567893546a8285054e772a71 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Fri, 10 Apr 2009 12:35:13 -0700 Subject: MAINTAINERS - Update MN10300 patterns Signed-off-by: Joe Perches diff --git a/MAINTAINERS b/MAINTAINERS index 576702f..ad3febb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4177,7 +4177,6 @@ W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/ S: Maintained F: Documentation/mn10300/ F: arch/mn10300/ -F: include/asm-mn10300/ PARALLEL PORT SUPPORT L: linux-parport@lists.infradead.org (subscribers-only) -- cgit v0.10.2 From 7933a3cfba017330ebb25f9820cb25ec9cdd67cc Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 10 Apr 2009 14:07:51 -0700 Subject: Remove stale include/asm-mn10300/.gitignore file Requested-by: Sam Ravnborg Signed-off-by: Linus Torvalds diff --git a/include/asm-mn10300/.gitignore b/include/asm-mn10300/.gitignore deleted file mode 100644 index 0f87ba7..0000000 --- a/include/asm-mn10300/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -proc -unit -- cgit v0.10.2 From e523b38e2f568af58baa13120a994cbf24e6dee0 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Fri, 10 Apr 2009 22:27:48 -0700 Subject: intel-iommu: Avoid panic() for DRHD at address zero. If the BIOS does something obviously stupid, like claiming that the registers for the IOMMU are at physical address zero, then print a nasty message and abort, rather than trying to set up the IOMMU and then later panicking. It's becoming more and more obvious that trusting this stuff to the BIOS was a mistake. Signed-off-by: David Woodhouse diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index 25a00ce..fa3a113 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c @@ -173,12 +173,21 @@ dmar_parse_one_drhd(struct acpi_dmar_header *header) struct dmar_drhd_unit *dmaru; int ret = 0; + drhd = (struct acpi_dmar_hardware_unit *)header; + if (!drhd->address) { + /* Promote an attitude of violence to a BIOS engineer today */ + WARN(1, "Your BIOS is broken; DMAR reported at address zero!\n" + "BIOS vendor: %s; Ver: %s; Product Version: %s\n", + dmi_get_system_info(DMI_BIOS_VENDOR), + dmi_get_system_info(DMI_BIOS_VERSION), + dmi_get_system_info(DMI_PRODUCT_VERSION)); + return -ENODEV; + } dmaru = kzalloc(sizeof(*dmaru), GFP_KERNEL); if (!dmaru) return -ENOMEM; dmaru->hdr = header; - drhd = (struct acpi_dmar_hardware_unit *)header; dmaru->reg_base_addr = drhd->address; dmaru->segment = drhd->segment; dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */ -- cgit v0.10.2 From 79ff807cf23ffb527f3f35bdececf56cabcdee07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sun, 29 Mar 2009 15:01:47 +0200 Subject: kbuild: fix option processing for -I in headerdep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -I takes an argument. Without this change only a 1 is added to @opt_include which is not helpful. Signed-off-by: Uwe Kleine-König Acked-by: Vegard Nossum Signed-off-by: Sam Ravnborg diff --git a/scripts/headerdep.pl b/scripts/headerdep.pl index 97399da..b7f6c56 100755 --- a/scripts/headerdep.pl +++ b/scripts/headerdep.pl @@ -19,7 +19,7 @@ my $opt_graph; version => \&version, all => \$opt_all, - I => \@opt_include, + "I=s" => \@opt_include, graph => \$opt_graph, ); -- cgit v0.10.2 From 612c280ef2400c70ea2fd8f2e17549c95002368c Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Wed, 8 Apr 2009 08:42:48 +0200 Subject: kconfig: fix update-po-config to accect backslash in input Massimo Maiurana reported (slightly edited): ===== In latest 2.6.29 "make update-po-config" fails at msguniq invocation with an "invalid control sequence" error. The offending string is the following, and it's located in drivers/staging/panel/Kconfig:72: "'\e[L' which are specific to the LCD, and a few ANSI codes. The" looks to me like gettext expects strings in printf format, so in this case it thinks "\e" is a control sequence but doesn't recognise it as a valid one. A valid solution would be to tell kxgettext to automatically escape this kind of strings in the */config.pot he produces, so that msguniq would not complain. ===== This patch implements the suggested escaping. Reported-by: Massimo Maiurana Tested-by: Massimo Maiurana Signed-off-by: Sam Ravnborg diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c index 6eb72a7..8d9ce22 100644 --- a/scripts/kconfig/kxgettext.c +++ b/scripts/kconfig/kxgettext.c @@ -43,6 +43,10 @@ static char *escape(const char* text, char *bf, int len) ++text; goto next; } + else if (*text == '\\') { + *bfp++ = '\\'; + len--; + } *bfp++ = *text++; next: --len; -- cgit v0.10.2 From 4774bb1ced60a94d83b28e5a42d4cf01b83d9b60 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Thu, 26 Mar 2009 21:58:04 +0100 Subject: kbuild: use git svn instead of git-svn in setlocalversion Use the correct git syntax instead of the deprecated git-. Signed-off-by: Peter Korsgaard Signed-off-by: Sam Ravnborg diff --git a/scripts/setlocalversion b/scripts/setlocalversion index f1c4b35..47e75b6 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion @@ -21,7 +21,7 @@ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then # Is this git on svn? if git config --get svn-remote.svn.url >/dev/null; then - printf -- '-svn%s' "`git-svn find-rev $head`" + printf -- '-svn%s' "`git svn find-rev $head`" fi # Are there uncommitted changes? -- cgit v0.10.2 From c7bb349e7c25df1ae1bbb72675b9bb02e1d9c464 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Fri, 10 Apr 2009 08:52:43 +0200 Subject: kbuild: introduce destination-y for exported headers xtensa and arm have asked for a possibility to export headers and locate them in a specific directory when exported. Introduce destiantion-y to support this. This patch in additiona adds some limited documentation for the variables used for exported headers. Signed-off-by: Sam Ravnborg Cc: Oskar Schirmer Cc: Mikael Starvik diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 51104f9..d4b0567 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt @@ -40,10 +40,16 @@ This document describes the Linux kernel Makefiles. --- 6.7 Custom kbuild commands --- 6.8 Preprocessing linker scripts - === 7 Kbuild Variables - === 8 Makefile language - === 9 Credits - === 10 TODO + === 7 Kbuild syntax for exported headers + --- 7.1 header-y + --- 7.2 objhdr-y + --- 7.3 destination-y + --- 7.4 unifdef-y (deprecated) + + === 8 Kbuild Variables + === 9 Makefile language + === 10 Credits + === 11 TODO === 1 Overview @@ -1143,8 +1149,69 @@ When kbuild executes, the following steps are followed (roughly): The kbuild infrastructure for *lds file are used in several architecture-specific files. +=== 7 Kbuild syntax for exported headers + +The kernel include a set of headers that is exported to userspace. +Many headers can be exported as-is but other headers requires a +minimal pre-processing before they are ready for user-space. +The pre-processing does: +- drop kernel specific annotations +- drop include of compiler.h +- drop all sections that is kernel internat (guarded by ifdef __KERNEL__) + +Each relevant directory contain a file name "Kbuild" which specify the +headers to be exported. +See subsequent chapter for the syntax of the Kbuild file. + + --- 7.1 header-y + + header-y specify header files to be exported. + + Example: + #include/linux/Kbuild + header-y += usb/ + header-y += aio_abi.h + + The convention is to list one file per line and + preferably in alphabetic order. + + header-y also specify which subdirectories to visit. + A subdirectory is identified by a trailing '/' which + can be seen in the example above for the usb subdirectory. + + Subdirectories are visited before their parent directories. + + --- 7.2 objhdr-y + + objhdr-y specifies generated files to be exported. + Generated files are special as they need to be looked + up in another directory when doing 'make O=...' builds. + + Example: + #include/linux/Kbuild + objhdr-y += version.h + + --- 7.3 destination-y + + When an architecture have a set of exported headers that needs to be + exported to a different directory destination-y is used. + destination-y specify the destination directory for all exported + headers in the file where it is present. + + Example: + #arch/xtensa/platforms/s6105/include/platform/Kbuild + destination-y := include/linux + + In the example above all exported headers in the Kbuild file + will be located in the directory "include/linux" when exported. + + + --- 7.4 unifdef-y (deprecated) + + unifdef-y is deprecated. A direct replacement is header-y. + -=== 7 Kbuild Variables +=== 8 Kbuild Variables The top Makefile exports the following variables: @@ -1206,7 +1273,7 @@ The top Makefile exports the following variables: INSTALL_MOD_STRIP will used as the option(s) to the strip command. -=== 8 Makefile language +=== 9 Makefile language The kernel Makefiles are designed to be run with GNU Make. The Makefiles use only the documented features of GNU Make, but they do use many @@ -1225,14 +1292,14 @@ time the left-hand side is used. There are some cases where "=" is appropriate. Usually, though, ":=" is the right choice. -=== 9 Credits +=== 10 Credits Original version made by Michael Elizabeth Chastain, Updates by Kai Germaschewski Updates by Sam Ravnborg Language QA by Jan Engelhardt -=== 10 TODO +=== 11 TODO - Describe how kbuild supports shipped files with _shipped. - Generating offset header files. diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 612dc13..095cfc8 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst @@ -14,6 +14,8 @@ _dst := $(if $(dst),$(dst),$(obj)) kbuild-file := $(srctree)/$(obj)/Kbuild include $(kbuild-file) +_dst := $(if $(destination-y),$(destination-y),$(_dst)) + include scripts/Kbuild.include install := $(INSTALL_HDR_PATH)/$(_dst) -- cgit v0.10.2 From fe8d0a41081d6d0912386f3672ccc0bf1d675630 Mon Sep 17 00:00:00 2001 From: Kirill Smelkov Date: Thu, 9 Apr 2009 15:34:34 +0400 Subject: kbuild: fix a few typos in top-level Makefile Signed-off-by: Kirill Smelkov Acked-by: Dmitry Gryazin Signed-off-by: Sam Ravnborg diff --git a/Makefile b/Makefile index e5ad5fd..3e95d45 100644 --- a/Makefile +++ b/Makefile @@ -567,7 +567,7 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) # disable pointer signed / unsigned warnings in gcc 4.0 KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,) -# disable invalid "can't wrap" optimzations for signed / pointers +# disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += $(call cc-option,-fwrapv) # revert to pre-gcc-4.4 behaviour of .eh_frame @@ -1587,5 +1587,5 @@ PHONY += FORCE FORCE: # Declare the contents of the .PHONY variable as phony. We keep that -# information in a variable se we can use it in if_changed and friends. +# information in a variable so we can use it in if_changed and friends. .PHONY: $(PHONY) -- cgit v0.10.2 From 0fa3a88cfdfc910d7f335aef588edf9819c05d54 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 12 Mar 2009 12:28:30 +0000 Subject: kbuild: remove pointless strdup() on arguments passed to new_module() in modpost new_module() itself already calls strdup() on its modname parameter. Signed-off-by: Jan Beulich Signed-off-by: Sam Ravnborg diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 8cc7061..df6e628 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1913,7 +1913,7 @@ static void read_dump(const char *fname, unsigned int kernel) if (!mod) { if (is_vmlinux(modname)) have_vmlinux = 1; - mod = new_module(NOFAIL(strdup(modname))); + mod = new_module(modname); mod->skip = 1; } s = sym_add_exported(symname, mod, export_no(export)); @@ -1997,7 +1997,7 @@ static void read_markers(const char *fname) mod = find_module(modname); if (!mod) { - mod = new_module(NOFAIL(strdup(modname))); + mod = new_module(modname); mod->skip = 1; } if (is_vmlinux(modname)) { -- cgit v0.10.2 From 5d7d18f5bc507b60d3d8967e2739d5e6ffdd630f Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 4 Mar 2009 11:59:07 -0800 Subject: kbuild: make it possible for the linker to discard local symbols from vmlinux Make it possible for the linker to discard local symbols from vmlinux as they cause vmlinux to balloon when CONFIG_KALLSYMS=y and they cause dump_stack() and get_wchan() to produce useless information under some circumstances. With this we add a config option (CONFIG_STRIP_ASM_SYMS) that will cause the build to supply -X to the linker to tell it to strip temporary local symbols. This doesn't seem to cause gdb any problems. Signed-off-by: David Howells Signed-off-by: Andrew Morton Signed-off-by: Sam Ravnborg diff --git a/Makefile b/Makefile index 3e95d45..ad830bd 100644 --- a/Makefile +++ b/Makefile @@ -597,6 +597,10 @@ LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID) LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID) +ifeq ($(CONFIG_STRIP_ASM_SYMS),y) +LDFLAGS_vmlinux += -X +endif + # Default kernel image to build when no specific target is given. # KBUILD_IMAGE may be overruled on the command line or # set in the environment diff --git a/init/Kconfig b/init/Kconfig index f2f9b53..7be4d38 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -808,6 +808,14 @@ config KALLSYMS_EXTRA_PASS you wait for kallsyms to be fixed. +config STRIP_ASM_SYMS + bool "Strip assembler-generated symbols during link" + default n + help + Strip internal assembler-generated symbols during a link (symbols + that look like '.Lxxx') so they don't pollute the output of + get_wchan() and suchlike. + config HOTPLUG bool "Support for hot-pluggable devices" if EMBEDDED default y -- cgit v0.10.2 From 20375bf82567b5fecd331048c6cc1fc292b67710 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Fri, 10 Apr 2009 13:18:08 +0200 Subject: Documentation: explain the difference between __bitwise and __bitwise__ Simply added explanation from Al Viro in the following mail: http://lkml.indiana.edu/hypermail/linux/kernel/0802.2/3164.html Cc: Al Viro Cc: Randy Dunlap Signed-off-by: Sam Ravnborg diff --git a/Documentation/sparse.txt b/Documentation/sparse.txt index 42f43fa..34c76a5 100644 --- a/Documentation/sparse.txt +++ b/Documentation/sparse.txt @@ -42,6 +42,14 @@ sure that bitwise types don't get mixed up (little-endian vs big-endian vs cpu-endian vs whatever), and there the constant "0" really _is_ special. +__bitwise__ - to be used for relatively compact stuff (gfp_t, etc.) that +is mostly warning-free and is supposed to stay that way. Warnings will +be generated without __CHECK_ENDIAN__. + +__bitwise - noisy stuff; in particular, __le*/__be* are that. We really +don't want to drown in noise unless we'd explicitly asked for it. + + Getting sparse ~~~~~~~~~~~~~~ -- cgit v0.10.2 From 9e5ec8615209f6a5bf2a612120d972b6021790da Mon Sep 17 00:00:00 2001 From: Maxime Bizon Date: Mon, 9 Feb 2009 18:49:52 +0100 Subject: kbuild: fix spurious initramfs rebuild When gen_initramfs_list is used to generate make dependencies, it includes symbolic links, for which make tracks the link target. Any change to that target will cause an initramfs rebuild, even if the symlink points to something outside of the initramfs directory. If the target happens to be /tmp, the rebuild occurs for each kernel build, since gen_initramfs_list uses mktemp... Proposed way to fix it is to omit symbolic links from generated dependencies, but this has a small drawback: changing perm/owner on a symlink will go unnoticed. Signed-off-by: Maxime Bizon Signed-off-by: Sam Ravnborg diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index 3eea8f1..76af5f9 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh @@ -97,7 +97,7 @@ print_mtime() { } list_parse() { - echo "$1 \\" + [ ! -L "$1" ] && echo "$1 \\" || : } # for each file print a line in following format -- cgit v0.10.2 From 2810ae8c73cbfb37891aa99dfbca46ffd40dbc91 Mon Sep 17 00:00:00 2001 From: Randy Dunlap Date: Fri, 10 Apr 2009 14:20:54 -0700 Subject: docbook: make cleandocs Add a 'make cleandocs' target to clean up all generated DocBook files. Signed-off-by: Randy Dunlap Signed-off-by: Sam Ravnborg diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index a3a83d3..8918a32 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile @@ -31,7 +31,7 @@ PS_METHOD = $(prefer-db2x) ### # The targets that may be used. -PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs +PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs cleandocs BOOKS := $(addprefix $(obj)/,$(DOCBOOKS)) xmldocs: $(BOOKS) @@ -213,11 +213,12 @@ silent_gen_xml = : dochelp: @echo ' Linux kernel internal documentation in different formats:' @echo ' htmldocs - HTML' - @echo ' installmandocs - install man pages generated by mandocs' - @echo ' mandocs - man pages' @echo ' pdfdocs - PDF' @echo ' psdocs - Postscript' @echo ' xmldocs - XML DocBook' + @echo ' mandocs - man pages' + @echo ' installmandocs - install man pages generated by mandocs' + @echo ' cleandocs - clean all generated DocBook files' ### # Temporary files left by various tools @@ -235,6 +236,10 @@ clean-files := $(DOCBOOKS) \ clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) man +cleandocs: + $(Q)rm -f $(call objectify, $(clean-files)) + $(Q)rm -rf $(call objectify, $(clean-dirs)) + # Declare the contents of the .PHONY variable as phony. We keep that # information in a variable se we can use it in if_changed and friends. -- cgit v0.10.2 From d6de2c80e9d758d2e36c21699117db6178c0f517 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 10 Apr 2009 12:17:41 -0700 Subject: async: Fix module loading async-work regression Several drivers use asynchronous work to do device discovery, and we synchronize with them in the compiled-in case before we actually try to mount root filesystems etc. However, when compiled as modules, that synchronization is missing - the module loading completes, but the driver hasn't actually finished probing for devices, and that means that any user mode that expects to use the devices after the 'insmod' is now potentially broken. We already saw one case of a similar issue in the ACPI battery code, where the kernel itself expected the module to be all done, and unmapped the init memory - but the async device discovery was still running. That got hacked around by just removing the "__init" (see commit 5d38258ec026921a7b266f4047ebeaa75db358e5 "ACPI battery: fix async boot oops"), but the real fix is to just make the module loading wait for all async work to be completed. It will slow down module loading, but since common devices should be built in anyway, and since the bug is really annoying and hard to handle from user space (and caused several S3 resume regressions), the simple fix to wait is the right one. This fixes at least http://bugzilla.kernel.org/show_bug.cgi?id=13063 but probably a few other bugzilla entries too (12936, for example), and is confirmed to fix Rafael's storage driver breakage after resume bug report (no bugzilla entry). We should also be able to now revert that ACPI battery fix. Reported-and-tested-by: Rafael J. Wysocki Tested-by: Heinz Diehl Acked-by: Arjan van de Ven Signed-off-by: Linus Torvalds diff --git a/kernel/module.c b/kernel/module.c index 05f014e..e797812 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2388,6 +2388,9 @@ SYSCALL_DEFINE3(init_module, void __user *, umod, blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_LIVE, mod); + /* We need to finish all async code before the module init sequence is done */ + async_synchronize_full(); + mutex_lock(&module_mutex); /* Drop initial reference. */ module_put(mod); -- cgit v0.10.2 From b0cbc861a3c05e634520b049b5cc27ad6febb51f Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 11 Apr 2009 12:45:20 -0700 Subject: Revert "ACPI battery: fix async boot oops" This reverts commit 5d38258ec026921a7b266f4047ebeaa75db358e5, since the underlying problem got fixed properly in the previous commit ("async: Fix module loading async-work regression"). Cc: Arkadiusz Miskiewicz Cc: Vegard Nossum Cc: Len Brown Signed-off-by: Linus Torvalds diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 3c7d894..b0de631 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -903,7 +903,7 @@ static struct acpi_driver acpi_battery_driver = { }, }; -static void acpi_battery_init_async(void *unused, async_cookie_t cookie) +static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie) { if (acpi_disabled) return; -- cgit v0.10.2 From 8433a40eb7f2c4883ad57f9900f63e4d59240eb7 Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Sat, 11 Apr 2009 15:52:18 +0800 Subject: tracing/filters: NIL-terminate user input filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make sure messages from user space are NIL-terminated strings, otherwise we could dump random memory while reading filter file. Try this: # echo 'parent_comm ==' > events/sched/sched_process_fork/filter # cat events/sched/sched_process_fork/filter parent_comm == � Signed-off-by: Li Zefan Acked-by: Tom Zanussi Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49E04C32.6060508@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 64ec4d2..054bc18 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -503,6 +503,7 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, if (copy_from_user(&buf, ubuf, cnt)) return -EFAULT; + buf[cnt] = '\0'; pred = kzalloc(sizeof(*pred), GFP_KERNEL); if (!pred) @@ -569,6 +570,7 @@ subsystem_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, if (copy_from_user(&buf, ubuf, cnt)) return -EFAULT; + buf[cnt] = '\0'; pred = kzalloc(sizeof(*pred), GFP_KERNEL); if (!pred) -- cgit v0.10.2 From bcabd91c271e50eebc0cb9220ac92700332b452e Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Sat, 11 Apr 2009 15:52:35 +0800 Subject: tracing/filters: fix NULL pointer dereference Try this, and you'll see NULL pointer dereference bug: # echo -n 'parent_comm ==' > sched/sched_process_fork/filter Because we passed NULL ptr to simple_strtoull(). Signed-off-by: Li Zefan Acked-by: Tom Zanussi Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49E04C43.1050504@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 026be41..9d2162f 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -410,6 +410,11 @@ int filter_parse(char **pbuf, struct filter_pred *pred) } } + if (!val_str) { + pred->field_name = NULL; + return -EINVAL; + } + pred->field_name = kstrdup(pred->field_name, GFP_KERNEL); if (!pred->field_name) return -ENOMEM; -- cgit v0.10.2 From a3e0ab050774117d4a6173087c8bf3888662a83f Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Sat, 11 Apr 2009 15:52:51 +0800 Subject: tracing/filters: allow user input integer to be oct or hex Before patch: # echo 'parent_pid == 0x10' > events/sched/sched_process_fork/filter # cat sched/sched_process_fork/filter parent_pid == 0 After patch: # cat sched/sched_process_fork/filter parent_pid == 16 Also check the input more strictly. Signed-off-by: Li Zefan Acked-by: Tom Zanussi Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49E04C53.4010600@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 9d2162f..49b3ef5 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -419,12 +419,13 @@ int filter_parse(char **pbuf, struct filter_pred *pred) if (!pred->field_name) return -ENOMEM; - pred->val = simple_strtoull(val_str, &tmp, 10); + pred->val = simple_strtoull(val_str, &tmp, 0); if (tmp == val_str) { pred->str_val = kstrdup(val_str, GFP_KERNEL); if (!pred->str_val) return -ENOMEM; - } + } else if (*tmp != '\0') + return -EINVAL; return 0; } -- cgit v0.10.2 From 44e9c8b7adc52079f0535f9de0c2c2477831389b Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Sat, 11 Apr 2009 15:55:28 +0800 Subject: tracing/filters: return proper error code when writing filter file - propagate return value of filter_add_pred() to the user - return -ENOSPC but not -ENOMEM or -EINVAL when the filter array is full Signed-off-by: Li Zefan Acked-by: Tom Zanussi Acked-by: Frederic Weisbecker Cc: Steven Rostedt LKML-Reference: <49E04CF0.3010105@cn.fujitsu.com> Signed-off-by: Ingo Molnar diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 054bc18..576f4fa 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -521,9 +521,10 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, return cnt; } - if (filter_add_pred(call, pred)) { + err = filter_add_pred(call, pred); + if (err < 0) { filter_free_pred(pred); - return -EINVAL; + return err; } *ppos += cnt; @@ -588,10 +589,11 @@ subsystem_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, return cnt; } - if (filter_add_subsystem_pred(system, pred)) { + err = filter_add_subsystem_pred(system, pred); + if (err < 0) { filter_free_subsystem_preds(system); filter_free_pred(pred); - return -EINVAL; + return err; } *ppos += cnt; diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 49b3ef5..e03cbf1 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -215,7 +215,7 @@ static int __filter_add_pred(struct ftrace_event_call *call, } } - return -ENOMEM; + return -ENOSPC; } static int is_string_field(const char *type) @@ -319,7 +319,7 @@ int filter_add_subsystem_pred(struct event_subsystem *system, } if (i == MAX_FILTER_PRED) - return -EINVAL; + return -ENOSPC; events_for_each(call) { int err; -- cgit v0.10.2 From 575922248c0df490843ddfbcf3bc65b54c4adb08 Mon Sep 17 00:00:00 2001 From: Rakib Mullick Date: Sat, 11 Apr 2009 09:04:59 +0600 Subject: x86: Fix section mismatches in mpparse Impact: fix section mismatch In arch/x86/kernel/mpparse.c, smp_reserve_bootmem() has been called and also refers to a function which is in .init section. Thus causes the first warning. And check_irq_src() also requires an __init, because it refers to an .init section. Signed-off-by: Rakib Mullick Cc: Andrew Morton LKML-Reference: Signed-off-by: Ingo Molnar diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index dce99dc..70fd7e4 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c @@ -679,7 +679,7 @@ void __init get_smp_config(void) __get_smp_config(0); } -static void smp_reserve_bootmem(struct mpf_intel *mpf) +static void __init smp_reserve_bootmem(struct mpf_intel *mpf) { unsigned long size = get_mpc_size(mpf->physptr); #ifdef CONFIG_X86_32 @@ -838,7 +838,7 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; -static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) +static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) { int i; @@ -866,7 +866,8 @@ static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) } } #else /* CONFIG_X86_IO_APIC */ -static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} +static +inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} #endif /* CONFIG_X86_IO_APIC */ static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, -- cgit v0.10.2 From 1ee4bd92a7aa49eb66c8d5672e837090d3e7b7ff Mon Sep 17 00:00:00 2001 From: Marcin Slusarz Date: Fri, 10 Apr 2009 22:47:17 +0200 Subject: x86: fix wrong section of pat_disable & make it static pat_disable cannot be __cpuinit anymore because it's called from pat_init and the callchain looks like this: pat_disable [cpuinit] <- pat_init <- generic_set_all <- ipi_handler <- set_mtrr <- (other non init/cpuinit functions) WARNING: arch/x86/mm/built-in.o(.text+0x449e): Section mismatch in reference from the function pat_init() to the function .cpuinit.text:pat_disable() The function pat_init() references the function __cpuinit pat_disable(). This is often because pat_init lacks a __cpuinit annotation or the annotation of pat_disable is wrong. Non CONFIG_X86_PAT version of pat_disable is static inline, so this version can be static too (and there are no callers outside of this file). Signed-off-by: Marcin Slusarz Acked-by: Sam Ravnborg LKML-Reference: <49DFB055.6070405@gmail.com> Signed-off-by: Ingo Molnar diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 640339e..c009a24 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c @@ -31,7 +31,7 @@ #ifdef CONFIG_X86_PAT int __read_mostly pat_enabled = 1; -void __cpuinit pat_disable(const char *reason) +static inline void pat_disable(const char *reason) { pat_enabled = 0; printk(KERN_INFO "%s\n", reason); -- cgit v0.10.2 From a30469e7921a6dd2067e9e836d7787cfa0105627 Mon Sep 17 00:00:00 2001 From: Suresh Siddha Date: Fri, 10 Apr 2009 15:21:24 -0700 Subject: x86: add linux kernel support for YMM state Impact: save/restore Intel-AVX state properly between tasks Intel Advanced Vector Extensions (AVX) introduce 256-bit vector processing capability. More about AVX at http://software.intel.com/sites/avx Add OS support for YMM state management using xsave/xrstor infrastructure to support AVX. Signed-off-by: Suresh Siddha LKML-Reference: <1239402084.27006.8057.camel@localhost.localdomain> Signed-off-by: Ingo Molnar diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 34c5237..fcf4d92 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -352,6 +352,11 @@ struct i387_soft_struct { u32 entry_eip; }; +struct ymmh_struct { + /* 16 * 16 bytes for each YMMH-reg = 256 bytes */ + u32 ymmh_space[64]; +}; + struct xsave_hdr_struct { u64 xstate_bv; u64 reserved1[2]; @@ -361,6 +366,7 @@ struct xsave_hdr_struct { struct xsave_struct { struct i387_fxsave_struct i387; struct xsave_hdr_struct xsave_hdr; + struct ymmh_struct ymmh; /* new processor state extensions will go here */ } __attribute__ ((packed, aligned (64))); diff --git a/arch/x86/include/asm/sigcontext.h b/arch/x86/include/asm/sigcontext.h index ec66649..72e5a44 100644 --- a/arch/x86/include/asm/sigcontext.h +++ b/arch/x86/include/asm/sigcontext.h @@ -269,6 +269,11 @@ struct _xsave_hdr { __u64 reserved2[5]; }; +struct _ymmh_state { + /* 16 * 16 bytes for each YMMH-reg */ + __u32 ymmh_space[64]; +}; + /* * Extended state pointed by the fpstate pointer in the sigcontext. * In addition to the fpstate, information encoded in the xstate_hdr @@ -278,6 +283,7 @@ struct _xsave_hdr { struct _xstate { struct _fpstate fpstate; struct _xsave_hdr xstate_hdr; + struct _ymmh_state ymmh; /* new processor state extensions go here */ }; diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 08e9a1a..727acc1 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h @@ -7,6 +7,7 @@ #define XSTATE_FP 0x1 #define XSTATE_SSE 0x2 +#define XSTATE_YMM 0x4 #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) @@ -15,7 +16,7 @@ /* * These are the features that the OS can handle currently. */ -#define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE) +#define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) #ifdef CONFIG_X86_64 #define REX_PREFIX "0x48, " diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index 2b54fe0..0a5b04a 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c @@ -324,7 +324,7 @@ void __ref xsave_cntxt_init(void) } /* - * for now OS knows only about FP/SSE + * Support only the state known to OS. */ pcntxt_mask = pcntxt_mask & XCNTXT_MASK; xsave_init(); -- cgit v0.10.2 From 9eeba6138cefc0435695463ddadb0d95e0a6bcd2 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Sat, 11 Apr 2009 03:17:17 +0200 Subject: lockdep: warn about lockdep disabling after kernel taint Impact: provide useful missing info for developers Kernel taint can occur in several situations such as warnings, load of prorietary or staging modules, bad page, etc... But when such taint happens, a developer might still be working on the kernel, expecting that lockdep is still enabled. But a taint disables lockdep without ever warning about it. Such a kernel behaviour doesn't really help for kernel development. This patch adds this missing warning. Since the taint is done most of the time after the main message that explain the real source issue, it seems safe to warn about it inside add_taint() so that it appears at last, without hurting the main information. v2: Use a generic helper to disable lockdep instead of an open coded xchg(). Signed-off-by: Frederic Weisbecker Cc: Peter Zijlstra LKML-Reference: <1239412638-6739-1-git-send-email-fweisbec@gmail.com> Signed-off-by: Ingo Molnar diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index 096476f..493dedb 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h @@ -2,12 +2,19 @@ #define __LINUX_DEBUG_LOCKING_H #include +#include struct task_struct; extern int debug_locks; extern int debug_locks_silent; + +static inline int __debug_locks_off(void) +{ + return xchg(&debug_locks, 0); +} + /* * Generic 'turn off all lock debugging' function: */ diff --git a/kernel/panic.c b/kernel/panic.c index 3fd8c5b..940ca14 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -213,8 +213,14 @@ unsigned long get_taint(void) void add_taint(unsigned flag) { - /* can't trust the integrity of the kernel anymore: */ - debug_locks = 0; + /* + * Can't trust the integrity of the kernel anymore. + * We don't call directly debug_locks_off() because the issue + * is not necessarily serious enough to set oops_in_progress to 1 + */ + if (__debug_locks_off()) + printk(KERN_WARNING "Disabling lockdep due to kernel taint\n"); + set_bit(flag, &tainted_mask); } EXPORT_SYMBOL(add_taint); diff --git a/lib/debug_locks.c b/lib/debug_locks.c index 0218b46..bc3b117 100644 --- a/lib/debug_locks.c +++ b/lib/debug_locks.c @@ -36,7 +36,7 @@ int debug_locks_silent; */ int debug_locks_off(void) { - if (xchg(&debug_locks, 0)) { + if (__debug_locks_off()) { if (!debug_locks_silent) { oops_in_progress = 1; console_verbose(); -- cgit v0.10.2 From 574bbe782057fdf0490dc7dec906a2dc26363e20 Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Sat, 11 Apr 2009 03:17:18 +0200 Subject: lockdep: continue lock debugging despite some taints Impact: broaden lockdep checks Lockdep is disabled after any kernel taints. This might be convenient to ignore bad locking issues which sources come from outside the kernel tree. Nevertheless, it might be a frustrating experience for the staging developers or those who experience a warning but are focused on another things that require lockdep. The v2 of this patch simply don't disable anymore lockdep in case of TAINT_CRAP and TAINT_WARN events. Signed-off-by: Frederic Weisbecker Cc: LTP Cc: Peter Zijlstra Cc: Greg KH LKML-Reference: <1239412638-6739-2-git-send-email-fweisbec@gmail.com> Signed-off-by: Ingo Molnar diff --git a/kernel/panic.c b/kernel/panic.c index 940ca14..934fb37 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -217,8 +217,10 @@ void add_taint(unsigned flag) * Can't trust the integrity of the kernel anymore. * We don't call directly debug_locks_off() because the issue * is not necessarily serious enough to set oops_in_progress to 1 + * Also we want to keep up lockdep for staging development and + * post-warning case. */ - if (__debug_locks_off()) + if (flag != TAINT_CRAP && flag != TAINT_WARN && __debug_locks_off()) printk(KERN_WARNING "Disabling lockdep due to kernel taint\n"); set_bit(flag, &tainted_mask); -- cgit v0.10.2 From f1c22943e92473903288ccab23debc9993c3a560 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Mon, 13 Apr 2009 04:09:34 -0400 Subject: [libata] sata_via: kill uninit'd var warning Reported and initial patch by Marin Mitov. Signed-off-by: Jeff Garzik diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 98e8c50..bdd43c7 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c @@ -566,7 +566,7 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) static int printed_version; unsigned int i; int rc; - struct ata_host *host; + struct ata_host *host = NULL; int board_id = (int) ent->driver_data; const unsigned *bar_sizes; -- cgit v0.10.2 From aa431dd39d560586db22209b7f78c33455e1a786 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Wed, 8 Apr 2009 14:25:31 -0700 Subject: ahci: force CAP_NCQ for earlier NV MCPs Along with MCP65, MCP67 and 73 also don't set CAP_NCQ. Force it. Reported by zaceni@yandex.ru on bko#13014 and confirmed by Peer Chen. Signed-off-by: Tejun Heo Reported-by: NightFox Cc: Peer Chen Signed-off-by: Jeff Garzik diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 57be6be..08186ec 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -114,6 +114,7 @@ enum { board_ahci_sb700 = 5, /* for SB700 and SB800 */ board_ahci_mcp65 = 6, board_ahci_nopmp = 7, + board_ahci_yesncq = 8, /* global controller registers */ HOST_CAP = 0x00, /* host capabilities */ @@ -469,6 +470,14 @@ static const struct ata_port_info ahci_port_info[] = { .udma_mask = ATA_UDMA6, .port_ops = &ahci_ops, }, + /* board_ahci_yesncq */ + { + AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ), + .flags = AHCI_FLAG_COMMON, + .pio_mask = ATA_PIO4, + .udma_mask = ATA_UDMA6, + .port_ops = &ahci_ops, + }, }; static const struct pci_device_id ahci_pci_tbl[] = { @@ -535,30 +544,30 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 }, /* MCP65 */ { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 }, /* MCP65 */ { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 }, /* MCP65 */ - { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci }, /* MCP67 */ - { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci }, /* MCP73 */ - { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_yesncq }, /* MCP67 */ + { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci_yesncq }, /* MCP73 */ + { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci_yesncq }, /* MCP73 */ { PCI_VDEVICE(NVIDIA, 0x0ad0), board_ahci }, /* MCP77 */ { PCI_VDEVICE(NVIDIA, 0x0ad1), board_ahci }, /* MCP77 */ { PCI_VDEVICE(NVIDIA, 0x0ad2), board_ahci }, /* MCP77 */ -- cgit v0.10.2 From f6005354d6d45afeafeca90661911d777c81f1e2 Mon Sep 17 00:00:00 2001 From: Vegard Nossum Date: Wed, 8 Apr 2009 18:19:39 +0200 Subject: ata: fix obviously wrong comment Also remove the now-useless debug printouts which are supposed to tell us when the scan starts and ends. Signed-off-by: Vegard Nossum Signed-off-by: Jeff Garzik diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index e7ea77c..065507c 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -6110,13 +6110,11 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ata_port_printk(ap, KERN_INFO, "DUMMY\n"); } - /* perform each probe synchronously */ - DPRINTK("probe begin\n"); + /* perform each probe asynchronously */ for (i = 0; i < host->n_ports; i++) { struct ata_port *ap = host->ports[i]; async_schedule(async_port_probe, ap); } - DPRINTK("probe end\n"); return 0; } -- cgit v0.10.2 From c454dee21d589476608957ca4f57feaabde62fab Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Mon, 13 Apr 2009 17:02:13 +0200 Subject: i2c-algo-pca: Fix use of uninitialized variable in debug message A recent change broke debugging of pca_xfer(), fix it. Reported-by: Geert Uytterhoeven Signed-off-by: Jean Delvare Acked-by: Wolfram Sang diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index f68e5f8..6318f7d 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c @@ -190,7 +190,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, int completed = 1; unsigned long timeout = jiffies + i2c_adap->timeout; - while (pca_status(adap) != 0xf8) { + while ((state = pca_status(adap)) != 0xf8) { if (time_before(jiffies, timeout)) { msleep(10); } else { -- cgit v0.10.2 From 3f307fb37a6dd65b7eabda9c6208a9bd161dc16e Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Mon, 13 Apr 2009 17:02:13 +0200 Subject: i2c-voodoo3: Deprecate in favor of tdfxfb Support for I2C/DDC was recently added to the tdfxfb driver, which means that the i2c-voodoo3 driver can be deprecated. Signed-off-by: Jean Delvare Cc: Krzysztof Helt diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 7e2af10..de491a3 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt @@ -428,3 +428,12 @@ Why: In 2.6.27, the semantics of /sys/bus/pci/slots was redefined to After a reasonable transition period, we will remove the legacy fakephp interface. Who: Alex Chiang + +--------------------------- + +What: i2c-voodoo3 driver +When: October 2009 +Why: Superseded by tdfxfb. I2C/DDC support used to live in a separate + driver but this caused driver conflicts. +Who: Jean Delvare + Krzysztof Helt diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 94eae5c..a48c8ae 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -604,12 +604,14 @@ comment "Graphics adapter I2C/DDC channel drivers" depends on PCI config I2C_VOODOO3 - tristate "Voodoo 3" + tristate "Voodoo 3 (DEPRECATED)" depends on PCI select I2C_ALGOBIT help If you say yes to this option, support will be included for the - Voodoo 3 I2C interface. + Voodoo 3 I2C interface. This driver is deprecated and you should + use the tdfxfb driver instead, which additionally provides + framebuffer support. This driver can also be built as a module. If so, the module will be called i2c-voodoo3. -- cgit v0.10.2 From c758e8cffe3b1bc7970d579371db01b19ff440bf Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Mon, 13 Apr 2009 17:02:14 +0200 Subject: i2c: Fix sparse warnings for I2C_BOARD_INFO() Since the first argument to I2C_BOARD_INFO() must be a string constant, there is no need to parenthesise it, and adding parentheses results in an invalid initialiser for char[]. gcc obviously accepts this syntax as an extension, but sparse complains, e.g.: drivers/net/sfc/boards.c:173:2: warning: array initialized from parenthesized string constant Therefore, remove the parentheses. Signed-off-by: Ben Hutchings Signed-off-by: Jean Delvare diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 00ee11e..ad25805 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -274,7 +274,7 @@ struct i2c_board_info { * are provided using conventional syntax. */ #define I2C_BOARD_INFO(dev_type, dev_addr) \ - .type = (dev_type), .addr = (dev_addr) + .type = dev_type, .addr = (dev_addr) /* Add-on boards should register/unregister their devices; e.g. a board -- cgit v0.10.2 From 935298696f469c0e07c73be687bd055878074ce0 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Mon, 13 Apr 2009 17:02:14 +0200 Subject: i2c: Let new-style drivers implement attach_adapter While it isn't the way the standard device binding model works, it is OK for new-style drivers to implement attach_adapter. It may help convert the renaming legacy drivers to new style drivers faster. Signed-off-by: Jean Delvare Cc: David Brownell diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index b6f3a0d..85e2e919 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -716,8 +716,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) /* new style driver methods can't mix with legacy ones */ if (is_newstyle_driver(driver)) { - if (driver->attach_adapter || driver->detach_adapter - || driver->detach_client) { + if (driver->detach_adapter || driver->detach_client) { printk(KERN_WARNING "i2c-core: driver [%s] is confused\n", driver->driver.name); -- cgit v0.10.2 From 0ad30b8fd5fe798aae80df6344b415d8309342cc Mon Sep 17 00:00:00 2001 From: "Serge E. Hallyn" Date: Mon, 13 Apr 2009 09:56:14 -0500 Subject: add some long-missing capabilities to fs_mask When POSIX capabilities were introduced during the 2.1 Linux cycle, the fs mask, which represents the capabilities which having fsuid==0 is supposed to grant, did not include CAP_MKNOD and CAP_LINUX_IMMUTABLE. However, before capabilities the privilege to call these did in fact depend upon fsuid==0. This patch introduces those capabilities into the fsmask, restoring the old behavior. See the thread starting at http://lkml.org/lkml/2009/3/11/157 for reference. Note that if this fix is deemed valid, then earlier kernel versions (2.4 and 2.2) ought to be fixed too. Changelog: [Mar 23] Actually delete old CAP_FS_SET definition... [Mar 20] Updated against J. Bruce Fields's patch Reported-by: Igor Zhbanov Signed-off-by: Serge E. Hallyn Cc: stable@kernel.org Cc: J. Bruce Fields Signed-off-by: Linus Torvalds diff --git a/include/linux/capability.h b/include/linux/capability.h index 4864a43..c302110 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -377,7 +377,21 @@ struct cpu_vfs_cap_data { #define CAP_FOR_EACH_U32(__capi) \ for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) +/* + * CAP_FS_MASK and CAP_NFSD_MASKS: + * + * The fs mask is all the privileges that fsuid==0 historically meant. + * At one time in the past, that included CAP_MKNOD and CAP_LINUX_IMMUTABLE. + * + * It has never meant setting security.* and trusted.* xattrs. + * + * We could also define fsmask as follows: + * 1. CAP_FS_MASK is the privilege to bypass all fs-related DAC permissions + * 2. The security.* and trusted.* xattrs are fs-related MAC permissions + */ + # define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \ + | CAP_TO_MASK(CAP_MKNOD) \ | CAP_TO_MASK(CAP_DAC_OVERRIDE) \ | CAP_TO_MASK(CAP_DAC_READ_SEARCH) \ | CAP_TO_MASK(CAP_FOWNER) \ @@ -392,11 +406,12 @@ struct cpu_vfs_cap_data { # define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }}) # define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }}) # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }}) -# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } }) +# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ + | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ + CAP_FS_MASK_B1 } }) # define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ - | CAP_TO_MASK(CAP_SYS_RESOURCE) \ - | CAP_TO_MASK(CAP_MKNOD), \ - CAP_FS_MASK_B1 } }) + | CAP_TO_MASK(CAP_SYS_RESOURCE), \ + CAP_FS_MASK_B1 } }) #endif /* _KERNEL_CAPABILITY_U32S != 2 */ -- cgit v0.10.2 From 01599fca6758d2cd133e78f87426fc851c9ea725 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 13 Apr 2009 10:27:49 -0700 Subject: cpufreq: use smp_call_function_[single|many]() in acpi-cpufreq.c Atttempting to rid us of the problematic work_on_cpu(). Just use smp_call_fuction_single() here. This repairs a 10% sysbench(oltp)+mysql regression which Mike reported, due to commit 6b44003e5ca66a3fffeb5bc90f40ada2c4340896 Author: Andrew Morton Date: Thu Apr 9 09:50:37 2009 -0600 work_on_cpu(): rewrite it to create a kernel thread on demand It seems that the kernel calls these acpi-cpufreq functions at a quite high frequency. Valdis Kletnieks also reports that this causes 70-90 forks per second on his hardware. Cc: Valdis.Kletnieks@vt.edu Cc: Rusty Russell Cc: Venkatesh Pallipadi Cc: Len Brown Cc: Zhao Yakui Acked-by: Dave Jones Cc: Thomas Gleixner Tested-by: Mike Galbraith Cc: "Zhang, Yanmin" Signed-off-by: Andrew Morton Acked-by: Ingo Molnar [ Made it use smp_call_function_many() instead of looping over cpu's with smp_call_function_single() - Linus ] Signed-off-by: Linus Torvalds diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 9d3af38..3e3cd3d 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -153,7 +153,8 @@ struct drv_cmd { u32 val; }; -static long do_drv_read(void *_cmd) +/* Called via smp_call_function_single(), on the target CPU */ +static void do_drv_read(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 h; @@ -170,10 +171,10 @@ static long do_drv_read(void *_cmd) default: break; } - return 0; } -static long do_drv_write(void *_cmd) +/* Called via smp_call_function_many(), on the target CPUs */ +static void do_drv_write(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 lo, hi; @@ -192,23 +193,18 @@ static long do_drv_write(void *_cmd) default: break; } - return 0; } static void drv_read(struct drv_cmd *cmd) { cmd->val = 0; - work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); + smp_call_function_single(cpumask_any(cmd->mask), do_drv_read, cmd, 1); } static void drv_write(struct drv_cmd *cmd) { - unsigned int i; - - for_each_cpu(i, cmd->mask) { - work_on_cpu(i, do_drv_write, cmd); - } + smp_call_function_many(cmd->mask, do_drv_write, cmd, 1); } static u32 get_cur_val(const struct cpumask *mask) @@ -252,15 +248,13 @@ struct perf_pair { } aperf, mperf; }; - -static long read_measured_perf_ctrs(void *_cur) +/* Called via smp_call_function_single(), on the target CPU */ +static void read_measured_perf_ctrs(void *_cur) { struct perf_pair *cur = _cur; rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi); rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi); - - return 0; } /* @@ -283,7 +277,7 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy, unsigned int perf_percent; unsigned int retval; - if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin)) + if (smp_call_function_single(cpu, read_measured_perf_ctrs, &cur, 1)) return 0; cur.aperf.whole = readin.aperf.whole - -- cgit v0.10.2 From c751085943362143f84346d274e0011419c84202 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Sun, 12 Apr 2009 20:06:56 +0200 Subject: PM/Hibernate: Wait for SCSI devices scan to complete during resume There is a race between resume from hibernation and the asynchronous scanning of SCSI devices and to prevent it from happening we need to call scsi_complete_async_scans() during resume from hibernation. In addition, if the resume from hibernation is userland-driven, it's better to wait for all device probes in the kernel to complete before attempting to open the resume device. Signed-off-by: Rafael J. Wysocki Acked-by: Arjan van de Ven Signed-off-by: Linus Torvalds diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index e185090..fbc83be 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -38,9 +38,6 @@ static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition) { }; #endif -/* scsi_scan.c */ -int scsi_complete_async_scans(void); - /* scsi_devinfo.c */ extern int scsi_get_device_flags(struct scsi_device *sdev, const unsigned char *vendor, diff --git a/drivers/scsi/scsi_wait_scan.c b/drivers/scsi/scsi_wait_scan.c index 8a63610..2f21af2 100644 --- a/drivers/scsi/scsi_wait_scan.c +++ b/drivers/scsi/scsi_wait_scan.c @@ -11,7 +11,7 @@ */ #include -#include "scsi_priv.h" +#include static int __init wait_scan_init(void) { diff --git a/include/scsi/scsi_scan.h b/include/scsi/scsi_scan.h new file mode 100644 index 0000000..7889888 --- /dev/null +++ b/include/scsi/scsi_scan.h @@ -0,0 +1,11 @@ +#ifndef _SCSI_SCSI_SCAN_H +#define _SCSI_SCSI_SCAN_H + +#ifdef CONFIG_SCSI +/* drivers/scsi/scsi_scan.c */ +extern int scsi_complete_async_scans(void); +#else +static inline int scsi_complete_async_scans(void) { return 0; } +#endif + +#endif /* _SCSI_SCSI_SCAN_H */ diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 5f21ab2..0854770 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "power.h" @@ -645,6 +646,13 @@ static int software_resume(void) return 0; /* + * We can't depend on SCSI devices being available after loading one of + * their modules if scsi_complete_async_scans() is not called and the + * resume device usually is a SCSI one. + */ + scsi_complete_async_scans(); + + /* * name_to_dev_t() below takes a sysfs buffer mutex when sysfs * is configured into the kernel. Since the regular hibernate * trigger path is via sysfs which takes a buffer mutex before diff --git a/kernel/power/user.c b/kernel/power/user.c index 6c85359..ed97375 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -92,6 +93,7 @@ static int snapshot_open(struct inode *inode, struct file *filp) filp->private_data = data; memset(&data->handle, 0, sizeof(struct snapshot_handle)); if ((filp->f_flags & O_ACCMODE) == O_RDONLY) { + /* Hibernating. The image device should be accessible. */ data->swap = swsusp_resume_device ? swap_type_of(swsusp_resume_device, 0, NULL) : -1; data->mode = O_RDONLY; @@ -99,6 +101,13 @@ static int snapshot_open(struct inode *inode, struct file *filp) if (error) pm_notifier_call_chain(PM_POST_HIBERNATION); } else { + /* + * Resuming. We may need to wait for the image device to + * appear. + */ + wait_for_device_probe(); + scsi_complete_async_scans(); + data->swap = -1; data->mode = O_WRONLY; error = pm_notifier_call_chain(PM_RESTORE_PREPARE); -- cgit v0.10.2