From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Mon, 30 May 2016 09:03:31 +0000 Subject: Re: [path v2 1/7] drm/hisilicon/hibmc: Add hisilicon hibmc drm master driver Message-Id: <20160530090331.GD27098@phenom.ffwll.local> List-Id: References: <1464514855-108050-1-git-send-email-zourongrong@gmail.com> <1464514855-108050-2-git-send-email-zourongrong@gmail.com> In-Reply-To: <1464514855-108050-2-git-send-email-zourongrong@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Rongrong Zou Cc: linux-fbdev@vger.kernel.org, emil.l.velikov@gmail.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linuxarm@huawei.com, linux-arm-kernel@lists.infradead.org, guohanjun@huawei.com, zourongrong@huawei.com, majun258@huawei.com On Sun, May 29, 2016 at 05:40:49PM +0800, Rongrong Zou wrote: > Add DRM master driver for Hisilicon Hibmc SoC which used for > Out-of-band management. Blow is the general hardware connection, > both the Hibmc and the host CPU are on the same mother board. > > +----------+ +----------+ > | | PCIe | Hibmc | > |host CPU( |<----->| display | > |arm64,x86)| |subsystem | > +----------+ +----------+ > > Signed-off-by: Rongrong Zou > Signed-off-by: Jianhua Li > --- > drivers/gpu/drm/hisilicon/Kconfig | 1 + > drivers/gpu/drm/hisilicon/Makefile | 3 +- > drivers/gpu/drm/hisilicon/hibmc/Kconfig | 13 + > drivers/gpu/drm/hisilicon/hibmc/Makefile | 4 + > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 307 ++++++++++++++++++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 39 +++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c | 91 +++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h | 28 ++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h | 214 +++++++++++++++ > 9 files changed, 699 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Kconfig > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Makefile > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > > diff --git a/drivers/gpu/drm/hisilicon/Kconfig b/drivers/gpu/drm/hisilicon/Kconfig > index 558c61b..2fd2724 100644 > --- a/drivers/gpu/drm/hisilicon/Kconfig > +++ b/drivers/gpu/drm/hisilicon/Kconfig > @@ -2,4 +2,5 @@ > # hisilicon drm device configuration. > # Please keep this list sorted alphabetically > > +source "drivers/gpu/drm/hisilicon/hibmc/Kconfig" > source "drivers/gpu/drm/hisilicon/kirin/Kconfig" > diff --git a/drivers/gpu/drm/hisilicon/Makefile b/drivers/gpu/drm/hisilicon/Makefile > index e3f6d49..4d7185c 100644 > --- a/drivers/gpu/drm/hisilicon/Makefile > +++ b/drivers/gpu/drm/hisilicon/Makefile > @@ -2,4 +2,5 @@ > # Makefile for hisilicon drm drivers. > # Please keep this list sorted alphabetically > > -obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > +obj-$(CONFIG_DRM_HISI_HIBMC) += hibmc/ > +obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > \ No newline at end of file > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > new file mode 100644 > index 0000000..1e7810d > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > @@ -0,0 +1,13 @@ > +config DRM_HISI_HIBMC > + tristate "DRM Support for Hisilicon Hibmc" > + depends on DRM && PCI > + select DRM_KMS_HELPER > + select DRM_KMS_FB_HELPER > + select DRM_GEM_CMA_HELPER > + select DRM_KMS_CMA_HELPER > + select FB_SYS_FILLRECT > + select FB_SYS_COPYAREA > + select FB_SYS_IMAGEBLIT > + help > + Choose this option if you have a Hisilicon Hibmc soc chipset. > + If M is selected the module will be called hibmc-drm. > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile b/drivers/gpu/drm/hisilicon/hibmc/Makefile > new file mode 100644 > index 0000000..533f9ed > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile > @@ -0,0 +1,4 @@ > +hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_power.o > + > +obj-$(CONFIG_DRM_HISI_HIBMC) +=hibmc-drm.o > +#obj-y += hibmc-drm.o > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > new file mode 100644 > index 0000000..7eaacd8 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > @@ -0,0 +1,307 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > +#include "hibmc_drm_power.h" > + > +static const struct file_operations hibmc_fops = { > + .owner = THIS_MODULE, > + .open = drm_open, > + .release = drm_release, > + .unlocked_ioctl = drm_ioctl, > +#ifdef CONFIG_COMPAT > + .compat_ioctl = drm_compat_ioctl, > +#endif > + .poll = drm_poll, > + .read = drm_read, > + .llseek = no_llseek, > +}; > + > +static int hibmc_enable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > + return 0; > +} > + > +static void hibmc_disable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > +} > + > +static struct drm_driver hibmc_driver = { > + .driver_features = DRIVER_GEM | DRIVER_MODESET, > + .fops = &hibmc_fops, > + .name = "hibmc", > + .desc = "hibmc drm driver", > + .major = 1, > + .minor = 0, > + .get_vblank_counter = drm_vblank_no_hw_counter, > + .enable_vblank = hibmc_enable_vblank, > + .disable_vblank = hibmc_disable_vblank, > + .gem_free_object = drm_gem_cma_free_object, gem_free_object_unlocked pls. > + .gem_vm_ops = &drm_gem_cma_vm_ops, > + .dumb_create = drm_gem_cma_dumb_create, > + .dumb_map_offset = drm_gem_cma_dumb_map_offset, > + .dumb_destroy = drm_gem_dumb_destroy, > +}; > + > +static int hibmc_pm_suspend(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_kms_helper_poll_disable(drm_dev); > + > + return 0; > +} > + > +static int hibmc_pm_resume(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_helper_resume_force_mode(drm_dev); > + drm_kms_helper_poll_enable(drm_dev); > + > + return 0; > +} > + > +static const struct dev_pm_ops hibmc_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(hibmc_pm_suspend, > + hibmc_pm_resume) > +}; > + > +static const struct drm_mode_config_funcs mode_config_funcs = { > + .atomic_check = drm_atomic_helper_check, > + .atomic_commit = drm_atomic_helper_commit, So how exactly does nonblocking commit work for you? Please run the igt validation suit on your new driver, a bunch of collabora engineers are working hard to make it run on non-intel drivers too. Ping Tomeu and Robert Foss for more info on this please. Lucky for you I'm working on generic nonblocking support in the atomic helpers, patches are on the mailing list. > +}; > + > + > +static int hibmc_hw_config(struct hibmc_drm_device *hidev) > +{ > + unsigned int reg; > + > + /* On hardware reset, power mode 0 is default. */ > + hibmc_set_power_mode(hidev, HIBMC_PW_MODE_CTL_MODE_MODE0); > + > + /* Enable display power gate & LOCALMEM power gate*/ > + reg = readl(hidev->mmio + HIBMC_CURRENT_GATE); > + reg &= ~HIBMC_CURR_GATE_DISPLAY_MASK; > + reg &= ~HIBMC_CURR_GATE_LOCALMEM_MASK; > + reg |= HIBMC_CURR_GATE_DISPLAY(ON); > + reg |= HIBMC_CURR_GATE_LOCALMEM(ON); > + > + hibmc_set_current_gate(hidev, reg); > + > + /* Reset the memory controller. If the memory controller > + * is not reset in chip,the system might hang when sw accesses > + * the memory.The memory should be resetted after > + * changing the MXCLK. > + */ > + reg = readl(hidev->mmio + HIBMC_MISC_CTRL); > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(RESET); > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(NORMAL); > + > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + /* We can add more initialization as needed. */ > + > + return 0; > +} > + > +static int hibmc_hw_map(struct hibmc_drm_device *hidev) > +{ > + struct drm_device *dev = hidev->dev; > + struct pci_dev *pdev = dev->pdev; > + resource_size_t addr, size, ioaddr, iosize; > + > + ioaddr = pci_resource_start(pdev, 1); > + iosize = MB(2); > + > + hidev->mmio = ioremap_nocache(ioaddr, iosize); > + > + if (!hidev->mmio) { > + DRM_ERROR("Cannot map mmio region\n"); > + return -ENOMEM; > + } > + > + addr = pci_resource_start(pdev, 0); > + size = MB(16); > + > + hidev->fb_map = ioremap(addr, size); > + if (!hidev->fb_map) { > + DRM_ERROR("Cannot map framebuffer\n"); > + return -ENOMEM; > + } > + hidev->fb_base = addr; > + hidev->fb_size = size; > + > + return 0; > +} > + > +static void hibmc_hw_fini(struct hibmc_drm_device *hidev) > +{ > + if (hidev->mmio) > + iounmap(hidev->mmio); > + if (hidev->fb_map) > + iounmap(hidev->fb_map); > +} > + > +static int hibmc_hw_init(struct hibmc_drm_device *hidev) > +{ > + int ret; > + > + ret = hibmc_hw_map(hidev); > + if (ret) > + return ret; > + > + hibmc_hw_config(hidev); > + > + return 0; > +} > + > +static int hibmc_unload(struct drm_device *dev) > +{ > + struct hibmc_drm_device *hidev = dev->dev_private; > + > + hibmc_hw_fini(hidev); > + dev->dev_private = NULL; > + return 0; > +} > + > +static int hibmc_load(struct drm_device *dev, unsigned long flags) > +{ > + struct hibmc_drm_device *hidev; > + int ret; > + > + hidev = devm_kzalloc(dev->dev, sizeof(*hidev), GFP_KERNEL); > + if (!hidev) > + return -ENOMEM; > + dev->dev_private = hidev; > + hidev->dev = dev; > + > + ret = hibmc_hw_init(hidev); > + if (ret) > + goto err; > + > + > + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); > + if (ret) { > + DRM_ERROR("failed to initialize vblank.\n"); > + return ret; > + } > + /* reset all the states of crtc/plane/encoder/connector */ > + drm_mode_config_reset(dev); > + > + return 0; > + > +err: > + hibmc_unload(dev); > + DRM_ERROR("failed to initialize drm driver.\n"); > + return ret; > +} > + > + > +static int hibmc_pci_probe(struct pci_dev *pdev, > + const struct pci_device_id *ent) > +{ > + struct drm_device *dev; > + int ret; > + > + dev = drm_dev_alloc(&hibmc_driver, &pdev->dev); > + if (!dev) > + return -ENOMEM; > + > + dev->pdev = pdev; > + pci_set_drvdata(pdev, dev); > + > + ret = pci_enable_device(pdev); > + if (ret) > + goto err_free; > + > + ret = hibmc_load(dev, 0); > + if (ret) > + goto err_disable; > + > + ret = drm_dev_register(dev, 0); > + if (ret) > + goto err_unload; > + > + return 0; > + > +err_unload: > + hibmc_unload(dev); > +err_disable: > + pci_disable_device(pdev); > +err_free: > + drm_dev_unref(dev); > + > + return ret; > +} > + > +static void hibmc_pci_remove(struct pci_dev *pdev) > +{ > + struct drm_device *dev = pci_get_drvdata(pdev); > + > + drm_dev_unregister(dev); > + hibmc_unload(dev); > + drm_dev_unref(dev); > +} > + > +static struct pci_device_id hibmc_pci_table[] = { > + {0x19e5, 0x1711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, > + {0,} > +}; > + > +static struct pci_driver hibmc_pci_driver = { > + .name = "hibmc-drm", > + .id_table = hibmc_pci_table, > + .probe = hibmc_pci_probe, > + .remove = hibmc_pci_remove, > + .driver.pm = &hibmc_pm_ops, > +}; > + > +static int __init hibmc_init(void) > +{ > + return pci_register_driver(&hibmc_pci_driver); > +} > + > +static void __exit hibmc_exit(void) > +{ > + return pci_unregister_driver(&hibmc_pci_driver); > +} > + > +module_init(hibmc_init); > +module_exit(hibmc_exit); > + > +MODULE_DEVICE_TABLE(pci, hibmc_pci_table); > +MODULE_AUTHOR("RongrongZou "); > +MODULE_DESCRIPTION("DRM Driver for Hisilicon Hibmc"); > +MODULE_LICENSE("GPL v2"); > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > new file mode 100644 > index 0000000..a072ea9 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -0,0 +1,39 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_DRV_H > +#define HIBMC_DRM_DRV_H > + > +#include > +#include > +#include > + > +struct hibmc_drm_device { > + /* hw */ > + void __iomem *mmio; > + void __iomem *fb_map; > + unsigned long fb_base; > + unsigned long fb_size; > + > + /* drm */ > + struct drm_device *dev; > + bool mode_config_initialized; > +}; > + > + > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > new file mode 100644 > index 0000000..673be10 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > @@ -0,0 +1,91 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > + > +/* > + * It can operate in one of three modes: 0, 1 or Sleep. > + */ > +void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode) > +{ > + unsigned int control_value = 0; > + void __iomem *mmio = hidev->mmio; > + > + if (power_mode > HIBMC_PW_MODE_CTL_MODE_SLEEP) > + return; > + > + control_value = readl(mmio + HIBMC_POWER_MODE_CTRL); > + control_value &= ~HIBMC_PW_MODE_CTL_MODE_MASK; > + > + control_value |= HIBMC_PW_MODE_CTL_MODE(power_mode) & > + HIBMC_PW_MODE_CTL_MODE_MASK; > + > + > + /* Set up other fields in Power Control Register */ > + if (power_mode = HIBMC_PW_MODE_CTL_MODE_SLEEP) { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(0) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + } else { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(1) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + > + } > + /* Program new power mode. */ > + writel(control_value, mmio + HIBMC_POWER_MODE_CTRL); > +} > + > +static unsigned int hibmc_get_power_mode(struct hibmc_drm_device *hidev) > +{ > + void __iomem *mmio = hidev->mmio; > + > + return (readl(mmio + HIBMC_POWER_MODE_CTRL)& > + HIBMC_PW_MODE_CTL_MODE_MASK) >> HIBMC_PW_MODE_CTL_MODE_SHIFT; > +} > + > +void hibmc_set_current_gate(struct hibmc_drm_device *hidev, unsigned int gate) > +{ > + unsigned int gate_reg; > + unsigned int mode; > + void __iomem *mmio = hidev->mmio; > + > + /* Get current power mode. */ > + mode = hibmc_get_power_mode(hidev); > + > + switch (mode) { > + case HIBMC_PW_MODE_CTL_MODE_MODE0: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + > + case HIBMC_PW_MODE_CTL_MODE_MODE1: > + gate_reg = HIBMC_MODE1_GATE; > + break; > + > + default: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + } > + writel(gate, mmio + gate_reg); > +} > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > new file mode 100644 > index 0000000..39f7a17 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > @@ -0,0 +1,28 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_POWER_H > +#define HIBMC_DRM_POWER_H > + > +#include "hibmc_drm_drv.h" > + > +extern void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode); > +extern void hibmc_set_current_gate(struct hibmc_drm_device *hidev, > + unsigned int gate); > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > new file mode 100644 > index 0000000..4966c42 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > @@ -0,0 +1,214 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_HW_H > +#define HIBMC_DRM_HW_H > + > +#define OFF 0 > +#define ON 1 > +#define DISABLE 0 > +#define ENABLE 1 > + > + > + > +/* register definition */ > +#define HIBMC_MISC_CTRL 0x4 > + > +#define HIBMC_MSCCTL_LOCALMEM_RESET(x) ((x) << 6) > +#define HIBMC_MSCCTL_LOCALMEM_RESET_MASK 0x40 > + > +#define RESET 0 > +#define NORMAL 1 > + > +#define HIBMC_CURRENT_GATE 0x000040 > +#define HIBMC_CURR_GATE_DISPLAY(x) ((x) << 2) > +#define HIBMC_CURR_GATE_DISPLAY_MASK 0x4 > + > +#define HIBMC_CURR_GATE_LOCALMEM(x) ((x) << 1) > +#define HIBMC_CURR_GATE_LOCALMEM_MASK 0x2 > + > +#define HIBMC_MODE0_GATE 0x000044 > +#define HIBMC_MODE1_GATE 0x000048 > +#define HIBMC_POWER_MODE_CTRL 0x00004C > + > +#define HIBMC_PW_MODE_CTL_OSC_INPUT(x) ((x) << 3) > +#define HIBMC_PW_MODE_CTL_OSC_INPUT_MASK 0x8 > + > +#define HIBMC_PW_MODE_CTL_MODE(x) ((x) << 0) > +#define HIBMC_PW_MODE_CTL_MODE_MASK 0x03 > +#define HIBMC_PW_MODE_CTL_MODE_SHIFT 0 > + > + > +#define HIBMC_PW_MODE_CTL_MODE_MODE0 0 > +#define HIBMC_PW_MODE_CTL_MODE_MODE1 1 > +#define HIBMC_PW_MODE_CTL_MODE_SLEEP 2 > + > +#define HIBMC_PANEL_PLL_CTRL 0x00005C > +#define HIBMC_CRT_PLL_CTRL 0x000060 > + > +#define HIBMC_PLL_CTRL_BYPASS(x) ((x) << 18) > +#define HIBMC_PLL_CTRL_BYPASS_MASK 0x40000 > + > +#define HIBMC_PLL_CTRL_POWER(x) ((x) << 17) > +#define HIBMC_PLL_CTRL_POWER_MASK 0x20000 > + > +#define HIBMC_PLL_CTRL_INPUT(x) ((x) << 16) > +#define HIBMC_PLL_CTRL_INPUT_MASK 0x10000 > + > +#define OSC 0 > +#define TESTCLK 1 > + > +#define HIBMC_PLL_CTRL_POD(x) ((x) << 14) > +#define HIBMC_PLL_CTRL_POD_MASK 0xC000 > + > +#define HIBMC_PLL_CTRL_OD(x) ((x) << 12) > +#define HIBMC_PLL_CTRL_OD_MASK 0x3000 > + > +#define HIBMC_PLL_CTRL_N(x) ((x) << 8) > +#define HIBMC_PLL_CTRL_N_MASK 0xF00 > + > +#define HIBMC_PLL_CTRL_M(x) ((x) << 0) > +#define HIBMC_PLL_CTRL_M_MASK 0xFF > + > + > +#define HIBMC_CRT_DISP_CTL 0x80200 > + > +#define HIBMC_CRT_DISP_CTL_CRTSELECT(x) ((x) << 25) > +#define HIBMC_CRT_DISP_CTL_CRTSELECT_MASK 0x2000000 > + > +#define CRTSELECT_VGA 0 > +#define CRTSELECT_CRT 1 > + > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE(x) ((x) << 14) > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE_MASK 0x4000 > + > +#define PHASE_ACTIVE_HIGH 0 > +#define PHASE_ACTIVE_LOW 1 > + > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE(x) ((x) << 13) > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE_MASK 0x2000 > + > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE(x) ((x) << 12) > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE_MASK 0x1000 > + > +#define HIBMC_CRT_DISP_CTL_TIMING(x) ((x) << 8) > +#define HIBMC_CRT_DISP_CTL_TIMING_MASK 0x100 > + > + > +#define HIBMC_CRT_DISP_CTL_PLANE(x) ((x) << 2) > +#define HIBMC_CRT_DISP_CTL_PLANE_MASK 4 > + > +#define HIBMC_CRT_DISP_CTL_FORMAT(x) ((x) << 0) > +#define HIBMC_CRT_DISP_CTL_FORMAT_MASK 0x03 > + > + > + > +#define HIBMC_CRT_FB_ADDRESS 0x080204 > + > +#define HIBMC_CRT_FB_WIDTH 0x080208 > +#define HIBMC_CRT_FB_WIDTH_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_FB_WIDTH_WIDTH_MASK 0x3FFF0000 > +#define HIBMC_CRT_FB_WIDTH_OFFS(x) ((x) << 0) > +#define HIBMC_CRT_FB_WIDTH_OFFS_MASK 0x3FFF > + > + > +#define HIBMC_CRT_HORZ_TOTAL 0x08020C > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL_MASK 0xFFF0000 > + > + > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END_MASK 0xFFF > + > +#define HIBMC_CRT_HORZ_SYNC 0x080210 > +#define HIBMC_CRT_HORZ_SYNC_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_SYNC_WIDTH_MASK 0xFF0000 > + > +#define HIBMC_CRT_HORZ_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_SYNC_START_MASK 0xFFF > + > +#define HIBMC_CRT_VERT_TOTAL 0x080214 > +#define HIBMC_CRT_VERT_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_VERT_TOTAL_TOTAL_MASK 0x7FFF0000 > + > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END_MASK 0x7FF > + > +#define HIBMC_CRT_VERT_SYNC 0x080218 > +#define HIBMC_CRT_VERT_SYNC_HEIGHT(x) ((x) << 16) > +#define HIBMC_CRT_VERT_SYNC_HEIGHT_MASK 0x3F0000 > + > + > +#define HIBMC_CRT_VERT_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_VERT_SYNC_START_MASK 0x7FF > + > +/* Auto Centering */ > +#define HIBMC_CRT_AUTO_CENTERING_TL 0x080280 > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP_MSK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT_MSK 0x7FF > + > +#define HIBMC_CRT_AUTO_CENTERING_BR 0x080284 > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM_MASK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT_MASK 0x7FF > + > +/* register to control panel output */ > +#define DISPLAY_CONTROL_HISILE 0x80288 > + > +/* register and values for PLL control */ > +#define CRT_PLL1_HS 0x802a8 > +#define CRT_PLL1_HS_25MHZ 0x23d40f02 > +#define CRT_PLL1_HS_40MHZ 0x23940801 > +#define CRT_PLL1_HS_65MHZ 0x23940d01 > +#define CRT_PLL1_HS_78MHZ 0x23540F82 > +#define CRT_PLL1_HS_74MHZ 0x23941dc2 > +#define CRT_PLL1_HS_80MHZ 0x23941001 > +#define CRT_PLL1_HS_80MHZ_1152 0x23540fc2 > +#define CRT_PLL1_HS_108MHZ 0x23b41b01 > +#define CRT_PLL1_HS_162MHZ 0x23480681 > +#define CRT_PLL1_HS_148MHZ 0x23541dc2 > +#define CRT_PLL1_HS_193MHZ 0x234807c1 > + > +#define CRT_PLL2_HS 0x802ac > +#define CRT_PLL2_HS_25MHZ 0x206B851E > +#define CRT_PLL2_HS_40MHZ 0x30000000 > +#define CRT_PLL2_HS_65MHZ 0x40000000 > +#define CRT_PLL2_HS_78MHZ 0x50E147AE > +#define CRT_PLL2_HS_74MHZ 0x602B6AE7 > +#define CRT_PLL2_HS_80MHZ 0x70000000 > +#define CRT_PLL2_HS_108MHZ 0x80000000 > +#define CRT_PLL2_HS_162MHZ 0xA0000000 > +#define CRT_PLL2_HS_148MHZ 0xB0CCCCCD > +#define CRT_PLL2_HS_193MHZ 0xC0872B02 > + > +/* Global macros */ > +#define RGB(r, g, b) \ > +( \ > + (unsigned long)(((r) << 16) | ((g) << 8) | (b)) \ > +) > + > +#define PADDING(align, data) (((data) + (align) - 1) & (~((align) - 1))) > + > +#define MB(x) ((x) << 20) > + > +#endif > -- > 1.9.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Mon, 30 May 2016 11:03:31 +0200 Subject: [path v2 1/7] drm/hisilicon/hibmc: Add hisilicon hibmc drm master driver In-Reply-To: <1464514855-108050-2-git-send-email-zourongrong@gmail.com> References: <1464514855-108050-1-git-send-email-zourongrong@gmail.com> <1464514855-108050-2-git-send-email-zourongrong@gmail.com> Message-ID: <20160530090331.GD27098@phenom.ffwll.local> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Sun, May 29, 2016 at 05:40:49PM +0800, Rongrong Zou wrote: > Add DRM master driver for Hisilicon Hibmc SoC which used for > Out-of-band management. Blow is the general hardware connection, > both the Hibmc and the host CPU are on the same mother board. > > +----------+ +----------+ > | | PCIe | Hibmc | > |host CPU( |<----->| display | > |arm64,x86)| |subsystem | > +----------+ +----------+ > > Signed-off-by: Rongrong Zou > Signed-off-by: Jianhua Li > --- > drivers/gpu/drm/hisilicon/Kconfig | 1 + > drivers/gpu/drm/hisilicon/Makefile | 3 +- > drivers/gpu/drm/hisilicon/hibmc/Kconfig | 13 + > drivers/gpu/drm/hisilicon/hibmc/Makefile | 4 + > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 307 ++++++++++++++++++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 39 +++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c | 91 +++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h | 28 ++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h | 214 +++++++++++++++ > 9 files changed, 699 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Kconfig > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Makefile > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > > diff --git a/drivers/gpu/drm/hisilicon/Kconfig b/drivers/gpu/drm/hisilicon/Kconfig > index 558c61b..2fd2724 100644 > --- a/drivers/gpu/drm/hisilicon/Kconfig > +++ b/drivers/gpu/drm/hisilicon/Kconfig > @@ -2,4 +2,5 @@ > # hisilicon drm device configuration. > # Please keep this list sorted alphabetically > > +source "drivers/gpu/drm/hisilicon/hibmc/Kconfig" > source "drivers/gpu/drm/hisilicon/kirin/Kconfig" > diff --git a/drivers/gpu/drm/hisilicon/Makefile b/drivers/gpu/drm/hisilicon/Makefile > index e3f6d49..4d7185c 100644 > --- a/drivers/gpu/drm/hisilicon/Makefile > +++ b/drivers/gpu/drm/hisilicon/Makefile > @@ -2,4 +2,5 @@ > # Makefile for hisilicon drm drivers. > # Please keep this list sorted alphabetically > > -obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > +obj-$(CONFIG_DRM_HISI_HIBMC) += hibmc/ > +obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > \ No newline at end of file > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > new file mode 100644 > index 0000000..1e7810d > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > @@ -0,0 +1,13 @@ > +config DRM_HISI_HIBMC > + tristate "DRM Support for Hisilicon Hibmc" > + depends on DRM && PCI > + select DRM_KMS_HELPER > + select DRM_KMS_FB_HELPER > + select DRM_GEM_CMA_HELPER > + select DRM_KMS_CMA_HELPER > + select FB_SYS_FILLRECT > + select FB_SYS_COPYAREA > + select FB_SYS_IMAGEBLIT > + help > + Choose this option if you have a Hisilicon Hibmc soc chipset. > + If M is selected the module will be called hibmc-drm. > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile b/drivers/gpu/drm/hisilicon/hibmc/Makefile > new file mode 100644 > index 0000000..533f9ed > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile > @@ -0,0 +1,4 @@ > +hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_power.o > + > +obj-$(CONFIG_DRM_HISI_HIBMC) +=hibmc-drm.o > +#obj-y += hibmc-drm.o > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > new file mode 100644 > index 0000000..7eaacd8 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > @@ -0,0 +1,307 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > +#include "hibmc_drm_power.h" > + > +static const struct file_operations hibmc_fops = { > + .owner = THIS_MODULE, > + .open = drm_open, > + .release = drm_release, > + .unlocked_ioctl = drm_ioctl, > +#ifdef CONFIG_COMPAT > + .compat_ioctl = drm_compat_ioctl, > +#endif > + .poll = drm_poll, > + .read = drm_read, > + .llseek = no_llseek, > +}; > + > +static int hibmc_enable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > + return 0; > +} > + > +static void hibmc_disable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > +} > + > +static struct drm_driver hibmc_driver = { > + .driver_features = DRIVER_GEM | DRIVER_MODESET, > + .fops = &hibmc_fops, > + .name = "hibmc", > + .desc = "hibmc drm driver", > + .major = 1, > + .minor = 0, > + .get_vblank_counter = drm_vblank_no_hw_counter, > + .enable_vblank = hibmc_enable_vblank, > + .disable_vblank = hibmc_disable_vblank, > + .gem_free_object = drm_gem_cma_free_object, gem_free_object_unlocked pls. > + .gem_vm_ops = &drm_gem_cma_vm_ops, > + .dumb_create = drm_gem_cma_dumb_create, > + .dumb_map_offset = drm_gem_cma_dumb_map_offset, > + .dumb_destroy = drm_gem_dumb_destroy, > +}; > + > +static int hibmc_pm_suspend(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_kms_helper_poll_disable(drm_dev); > + > + return 0; > +} > + > +static int hibmc_pm_resume(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_helper_resume_force_mode(drm_dev); > + drm_kms_helper_poll_enable(drm_dev); > + > + return 0; > +} > + > +static const struct dev_pm_ops hibmc_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(hibmc_pm_suspend, > + hibmc_pm_resume) > +}; > + > +static const struct drm_mode_config_funcs mode_config_funcs = { > + .atomic_check = drm_atomic_helper_check, > + .atomic_commit = drm_atomic_helper_commit, So how exactly does nonblocking commit work for you? Please run the igt validation suit on your new driver, a bunch of collabora engineers are working hard to make it run on non-intel drivers too. Ping Tomeu and Robert Foss for more info on this please. Lucky for you I'm working on generic nonblocking support in the atomic helpers, patches are on the mailing list. > +}; > + > + > +static int hibmc_hw_config(struct hibmc_drm_device *hidev) > +{ > + unsigned int reg; > + > + /* On hardware reset, power mode 0 is default. */ > + hibmc_set_power_mode(hidev, HIBMC_PW_MODE_CTL_MODE_MODE0); > + > + /* Enable display power gate & LOCALMEM power gate*/ > + reg = readl(hidev->mmio + HIBMC_CURRENT_GATE); > + reg &= ~HIBMC_CURR_GATE_DISPLAY_MASK; > + reg &= ~HIBMC_CURR_GATE_LOCALMEM_MASK; > + reg |= HIBMC_CURR_GATE_DISPLAY(ON); > + reg |= HIBMC_CURR_GATE_LOCALMEM(ON); > + > + hibmc_set_current_gate(hidev, reg); > + > + /* Reset the memory controller. If the memory controller > + * is not reset in chip,the system might hang when sw accesses > + * the memory.The memory should be resetted after > + * changing the MXCLK. > + */ > + reg = readl(hidev->mmio + HIBMC_MISC_CTRL); > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(RESET); > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(NORMAL); > + > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + /* We can add more initialization as needed. */ > + > + return 0; > +} > + > +static int hibmc_hw_map(struct hibmc_drm_device *hidev) > +{ > + struct drm_device *dev = hidev->dev; > + struct pci_dev *pdev = dev->pdev; > + resource_size_t addr, size, ioaddr, iosize; > + > + ioaddr = pci_resource_start(pdev, 1); > + iosize = MB(2); > + > + hidev->mmio = ioremap_nocache(ioaddr, iosize); > + > + if (!hidev->mmio) { > + DRM_ERROR("Cannot map mmio region\n"); > + return -ENOMEM; > + } > + > + addr = pci_resource_start(pdev, 0); > + size = MB(16); > + > + hidev->fb_map = ioremap(addr, size); > + if (!hidev->fb_map) { > + DRM_ERROR("Cannot map framebuffer\n"); > + return -ENOMEM; > + } > + hidev->fb_base = addr; > + hidev->fb_size = size; > + > + return 0; > +} > + > +static void hibmc_hw_fini(struct hibmc_drm_device *hidev) > +{ > + if (hidev->mmio) > + iounmap(hidev->mmio); > + if (hidev->fb_map) > + iounmap(hidev->fb_map); > +} > + > +static int hibmc_hw_init(struct hibmc_drm_device *hidev) > +{ > + int ret; > + > + ret = hibmc_hw_map(hidev); > + if (ret) > + return ret; > + > + hibmc_hw_config(hidev); > + > + return 0; > +} > + > +static int hibmc_unload(struct drm_device *dev) > +{ > + struct hibmc_drm_device *hidev = dev->dev_private; > + > + hibmc_hw_fini(hidev); > + dev->dev_private = NULL; > + return 0; > +} > + > +static int hibmc_load(struct drm_device *dev, unsigned long flags) > +{ > + struct hibmc_drm_device *hidev; > + int ret; > + > + hidev = devm_kzalloc(dev->dev, sizeof(*hidev), GFP_KERNEL); > + if (!hidev) > + return -ENOMEM; > + dev->dev_private = hidev; > + hidev->dev = dev; > + > + ret = hibmc_hw_init(hidev); > + if (ret) > + goto err; > + > + > + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); > + if (ret) { > + DRM_ERROR("failed to initialize vblank.\n"); > + return ret; > + } > + /* reset all the states of crtc/plane/encoder/connector */ > + drm_mode_config_reset(dev); > + > + return 0; > + > +err: > + hibmc_unload(dev); > + DRM_ERROR("failed to initialize drm driver.\n"); > + return ret; > +} > + > + > +static int hibmc_pci_probe(struct pci_dev *pdev, > + const struct pci_device_id *ent) > +{ > + struct drm_device *dev; > + int ret; > + > + dev = drm_dev_alloc(&hibmc_driver, &pdev->dev); > + if (!dev) > + return -ENOMEM; > + > + dev->pdev = pdev; > + pci_set_drvdata(pdev, dev); > + > + ret = pci_enable_device(pdev); > + if (ret) > + goto err_free; > + > + ret = hibmc_load(dev, 0); > + if (ret) > + goto err_disable; > + > + ret = drm_dev_register(dev, 0); > + if (ret) > + goto err_unload; > + > + return 0; > + > +err_unload: > + hibmc_unload(dev); > +err_disable: > + pci_disable_device(pdev); > +err_free: > + drm_dev_unref(dev); > + > + return ret; > +} > + > +static void hibmc_pci_remove(struct pci_dev *pdev) > +{ > + struct drm_device *dev = pci_get_drvdata(pdev); > + > + drm_dev_unregister(dev); > + hibmc_unload(dev); > + drm_dev_unref(dev); > +} > + > +static struct pci_device_id hibmc_pci_table[] = { > + {0x19e5, 0x1711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, > + {0,} > +}; > + > +static struct pci_driver hibmc_pci_driver = { > + .name = "hibmc-drm", > + .id_table = hibmc_pci_table, > + .probe = hibmc_pci_probe, > + .remove = hibmc_pci_remove, > + .driver.pm = &hibmc_pm_ops, > +}; > + > +static int __init hibmc_init(void) > +{ > + return pci_register_driver(&hibmc_pci_driver); > +} > + > +static void __exit hibmc_exit(void) > +{ > + return pci_unregister_driver(&hibmc_pci_driver); > +} > + > +module_init(hibmc_init); > +module_exit(hibmc_exit); > + > +MODULE_DEVICE_TABLE(pci, hibmc_pci_table); > +MODULE_AUTHOR("RongrongZou "); > +MODULE_DESCRIPTION("DRM Driver for Hisilicon Hibmc"); > +MODULE_LICENSE("GPL v2"); > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > new file mode 100644 > index 0000000..a072ea9 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -0,0 +1,39 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_DRV_H > +#define HIBMC_DRM_DRV_H > + > +#include > +#include > +#include > + > +struct hibmc_drm_device { > + /* hw */ > + void __iomem *mmio; > + void __iomem *fb_map; > + unsigned long fb_base; > + unsigned long fb_size; > + > + /* drm */ > + struct drm_device *dev; > + bool mode_config_initialized; > +}; > + > + > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > new file mode 100644 > index 0000000..673be10 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > @@ -0,0 +1,91 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > + > +/* > + * It can operate in one of three modes: 0, 1 or Sleep. > + */ > +void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode) > +{ > + unsigned int control_value = 0; > + void __iomem *mmio = hidev->mmio; > + > + if (power_mode > HIBMC_PW_MODE_CTL_MODE_SLEEP) > + return; > + > + control_value = readl(mmio + HIBMC_POWER_MODE_CTRL); > + control_value &= ~HIBMC_PW_MODE_CTL_MODE_MASK; > + > + control_value |= HIBMC_PW_MODE_CTL_MODE(power_mode) & > + HIBMC_PW_MODE_CTL_MODE_MASK; > + > + > + /* Set up other fields in Power Control Register */ > + if (power_mode == HIBMC_PW_MODE_CTL_MODE_SLEEP) { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(0) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + } else { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(1) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + > + } > + /* Program new power mode. */ > + writel(control_value, mmio + HIBMC_POWER_MODE_CTRL); > +} > + > +static unsigned int hibmc_get_power_mode(struct hibmc_drm_device *hidev) > +{ > + void __iomem *mmio = hidev->mmio; > + > + return (readl(mmio + HIBMC_POWER_MODE_CTRL)& > + HIBMC_PW_MODE_CTL_MODE_MASK) >> HIBMC_PW_MODE_CTL_MODE_SHIFT; > +} > + > +void hibmc_set_current_gate(struct hibmc_drm_device *hidev, unsigned int gate) > +{ > + unsigned int gate_reg; > + unsigned int mode; > + void __iomem *mmio = hidev->mmio; > + > + /* Get current power mode. */ > + mode = hibmc_get_power_mode(hidev); > + > + switch (mode) { > + case HIBMC_PW_MODE_CTL_MODE_MODE0: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + > + case HIBMC_PW_MODE_CTL_MODE_MODE1: > + gate_reg = HIBMC_MODE1_GATE; > + break; > + > + default: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + } > + writel(gate, mmio + gate_reg); > +} > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > new file mode 100644 > index 0000000..39f7a17 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > @@ -0,0 +1,28 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_POWER_H > +#define HIBMC_DRM_POWER_H > + > +#include "hibmc_drm_drv.h" > + > +extern void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode); > +extern void hibmc_set_current_gate(struct hibmc_drm_device *hidev, > + unsigned int gate); > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > new file mode 100644 > index 0000000..4966c42 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > @@ -0,0 +1,214 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_HW_H > +#define HIBMC_DRM_HW_H > + > +#define OFF 0 > +#define ON 1 > +#define DISABLE 0 > +#define ENABLE 1 > + > + > + > +/* register definition */ > +#define HIBMC_MISC_CTRL 0x4 > + > +#define HIBMC_MSCCTL_LOCALMEM_RESET(x) ((x) << 6) > +#define HIBMC_MSCCTL_LOCALMEM_RESET_MASK 0x40 > + > +#define RESET 0 > +#define NORMAL 1 > + > +#define HIBMC_CURRENT_GATE 0x000040 > +#define HIBMC_CURR_GATE_DISPLAY(x) ((x) << 2) > +#define HIBMC_CURR_GATE_DISPLAY_MASK 0x4 > + > +#define HIBMC_CURR_GATE_LOCALMEM(x) ((x) << 1) > +#define HIBMC_CURR_GATE_LOCALMEM_MASK 0x2 > + > +#define HIBMC_MODE0_GATE 0x000044 > +#define HIBMC_MODE1_GATE 0x000048 > +#define HIBMC_POWER_MODE_CTRL 0x00004C > + > +#define HIBMC_PW_MODE_CTL_OSC_INPUT(x) ((x) << 3) > +#define HIBMC_PW_MODE_CTL_OSC_INPUT_MASK 0x8 > + > +#define HIBMC_PW_MODE_CTL_MODE(x) ((x) << 0) > +#define HIBMC_PW_MODE_CTL_MODE_MASK 0x03 > +#define HIBMC_PW_MODE_CTL_MODE_SHIFT 0 > + > + > +#define HIBMC_PW_MODE_CTL_MODE_MODE0 0 > +#define HIBMC_PW_MODE_CTL_MODE_MODE1 1 > +#define HIBMC_PW_MODE_CTL_MODE_SLEEP 2 > + > +#define HIBMC_PANEL_PLL_CTRL 0x00005C > +#define HIBMC_CRT_PLL_CTRL 0x000060 > + > +#define HIBMC_PLL_CTRL_BYPASS(x) ((x) << 18) > +#define HIBMC_PLL_CTRL_BYPASS_MASK 0x40000 > + > +#define HIBMC_PLL_CTRL_POWER(x) ((x) << 17) > +#define HIBMC_PLL_CTRL_POWER_MASK 0x20000 > + > +#define HIBMC_PLL_CTRL_INPUT(x) ((x) << 16) > +#define HIBMC_PLL_CTRL_INPUT_MASK 0x10000 > + > +#define OSC 0 > +#define TESTCLK 1 > + > +#define HIBMC_PLL_CTRL_POD(x) ((x) << 14) > +#define HIBMC_PLL_CTRL_POD_MASK 0xC000 > + > +#define HIBMC_PLL_CTRL_OD(x) ((x) << 12) > +#define HIBMC_PLL_CTRL_OD_MASK 0x3000 > + > +#define HIBMC_PLL_CTRL_N(x) ((x) << 8) > +#define HIBMC_PLL_CTRL_N_MASK 0xF00 > + > +#define HIBMC_PLL_CTRL_M(x) ((x) << 0) > +#define HIBMC_PLL_CTRL_M_MASK 0xFF > + > + > +#define HIBMC_CRT_DISP_CTL 0x80200 > + > +#define HIBMC_CRT_DISP_CTL_CRTSELECT(x) ((x) << 25) > +#define HIBMC_CRT_DISP_CTL_CRTSELECT_MASK 0x2000000 > + > +#define CRTSELECT_VGA 0 > +#define CRTSELECT_CRT 1 > + > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE(x) ((x) << 14) > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE_MASK 0x4000 > + > +#define PHASE_ACTIVE_HIGH 0 > +#define PHASE_ACTIVE_LOW 1 > + > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE(x) ((x) << 13) > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE_MASK 0x2000 > + > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE(x) ((x) << 12) > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE_MASK 0x1000 > + > +#define HIBMC_CRT_DISP_CTL_TIMING(x) ((x) << 8) > +#define HIBMC_CRT_DISP_CTL_TIMING_MASK 0x100 > + > + > +#define HIBMC_CRT_DISP_CTL_PLANE(x) ((x) << 2) > +#define HIBMC_CRT_DISP_CTL_PLANE_MASK 4 > + > +#define HIBMC_CRT_DISP_CTL_FORMAT(x) ((x) << 0) > +#define HIBMC_CRT_DISP_CTL_FORMAT_MASK 0x03 > + > + > + > +#define HIBMC_CRT_FB_ADDRESS 0x080204 > + > +#define HIBMC_CRT_FB_WIDTH 0x080208 > +#define HIBMC_CRT_FB_WIDTH_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_FB_WIDTH_WIDTH_MASK 0x3FFF0000 > +#define HIBMC_CRT_FB_WIDTH_OFFS(x) ((x) << 0) > +#define HIBMC_CRT_FB_WIDTH_OFFS_MASK 0x3FFF > + > + > +#define HIBMC_CRT_HORZ_TOTAL 0x08020C > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL_MASK 0xFFF0000 > + > + > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END_MASK 0xFFF > + > +#define HIBMC_CRT_HORZ_SYNC 0x080210 > +#define HIBMC_CRT_HORZ_SYNC_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_SYNC_WIDTH_MASK 0xFF0000 > + > +#define HIBMC_CRT_HORZ_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_SYNC_START_MASK 0xFFF > + > +#define HIBMC_CRT_VERT_TOTAL 0x080214 > +#define HIBMC_CRT_VERT_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_VERT_TOTAL_TOTAL_MASK 0x7FFF0000 > + > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END_MASK 0x7FF > + > +#define HIBMC_CRT_VERT_SYNC 0x080218 > +#define HIBMC_CRT_VERT_SYNC_HEIGHT(x) ((x) << 16) > +#define HIBMC_CRT_VERT_SYNC_HEIGHT_MASK 0x3F0000 > + > + > +#define HIBMC_CRT_VERT_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_VERT_SYNC_START_MASK 0x7FF > + > +/* Auto Centering */ > +#define HIBMC_CRT_AUTO_CENTERING_TL 0x080280 > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP_MSK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT_MSK 0x7FF > + > +#define HIBMC_CRT_AUTO_CENTERING_BR 0x080284 > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM_MASK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT_MASK 0x7FF > + > +/* register to control panel output */ > +#define DISPLAY_CONTROL_HISILE 0x80288 > + > +/* register and values for PLL control */ > +#define CRT_PLL1_HS 0x802a8 > +#define CRT_PLL1_HS_25MHZ 0x23d40f02 > +#define CRT_PLL1_HS_40MHZ 0x23940801 > +#define CRT_PLL1_HS_65MHZ 0x23940d01 > +#define CRT_PLL1_HS_78MHZ 0x23540F82 > +#define CRT_PLL1_HS_74MHZ 0x23941dc2 > +#define CRT_PLL1_HS_80MHZ 0x23941001 > +#define CRT_PLL1_HS_80MHZ_1152 0x23540fc2 > +#define CRT_PLL1_HS_108MHZ 0x23b41b01 > +#define CRT_PLL1_HS_162MHZ 0x23480681 > +#define CRT_PLL1_HS_148MHZ 0x23541dc2 > +#define CRT_PLL1_HS_193MHZ 0x234807c1 > + > +#define CRT_PLL2_HS 0x802ac > +#define CRT_PLL2_HS_25MHZ 0x206B851E > +#define CRT_PLL2_HS_40MHZ 0x30000000 > +#define CRT_PLL2_HS_65MHZ 0x40000000 > +#define CRT_PLL2_HS_78MHZ 0x50E147AE > +#define CRT_PLL2_HS_74MHZ 0x602B6AE7 > +#define CRT_PLL2_HS_80MHZ 0x70000000 > +#define CRT_PLL2_HS_108MHZ 0x80000000 > +#define CRT_PLL2_HS_162MHZ 0xA0000000 > +#define CRT_PLL2_HS_148MHZ 0xB0CCCCCD > +#define CRT_PLL2_HS_193MHZ 0xC0872B02 > + > +/* Global macros */ > +#define RGB(r, g, b) \ > +( \ > + (unsigned long)(((r) << 16) | ((g) << 8) | (b)) \ > +) > + > +#define PADDING(align, data) (((data) + (align) - 1) & (~((align) - 1))) > + > +#define MB(x) ((x) << 20) > + > +#endif > -- > 1.9.1 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [path v2 1/7] drm/hisilicon/hibmc: Add hisilicon hibmc drm master driver Date: Mon, 30 May 2016 11:03:31 +0200 Message-ID: <20160530090331.GD27098@phenom.ffwll.local> References: <1464514855-108050-1-git-send-email-zourongrong@gmail.com> <1464514855-108050-2-git-send-email-zourongrong@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9A6656E700 for ; Mon, 30 May 2016 09:03:36 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id n129so20477786wmn.1 for ; Mon, 30 May 2016 02:03:36 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1464514855-108050-2-git-send-email-zourongrong@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rongrong Zou Cc: linux-fbdev@vger.kernel.org, emil.l.velikov@gmail.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linuxarm@huawei.com, linux-arm-kernel@lists.infradead.org, guohanjun@huawei.com, zourongrong@huawei.com, majun258@huawei.com List-Id: dri-devel@lists.freedesktop.org T24gU3VuLCBNYXkgMjksIDIwMTYgYXQgMDU6NDA6NDlQTSArMDgwMCwgUm9uZ3JvbmcgWm91IHdy b3RlOgo+IEFkZCBEUk0gbWFzdGVyIGRyaXZlciBmb3IgSGlzaWxpY29uIEhpYm1jIFNvQyB3aGlj aCB1c2VkIGZvcgo+IE91dC1vZi1iYW5kIG1hbmFnZW1lbnQuIEJsb3cgaXMgdGhlIGdlbmVyYWwg aGFyZHdhcmUgY29ubmVjdGlvbiwKPiBib3RoIHRoZSBIaWJtYyBhbmQgdGhlIGhvc3QgQ1BVIGFy ZSBvbiB0aGUgc2FtZSBtb3RoZXIgYm9hcmQuCj4gCj4gKy0tLS0tLS0tLS0rICAgICAgICstLS0t LS0tLS0tKwo+IHwgICAgICAgICAgfCBQQ0llICB8ICBIaWJtYyAgIHwKPiB8aG9zdCBDUFUoIHw8 LS0tLS0+fCBkaXNwbGF5ICB8Cj4gfGFybTY0LHg4Nil8ICAgICAgIHxzdWJzeXN0ZW0gfAo+ICst LS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLSsKPiAKPiBTaWduZWQtb2ZmLWJ5OiBSb25ncm9u ZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBKaWFuaHVhIExp IDxsaWppYW5odWFAaHVhd2VpLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNv bi9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9oaXNp bGljb24vTWFrZWZpbGUgICAgICAgICAgICAgICAgfCAgIDMgKy0KPiAgZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9LY29uZmlnICAgICAgICAgICB8ICAxMyArCj4gIGRyaXZlcnMvZ3B1 L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUgICAgICAgICAgfCAgIDQgKwo+ICBkcml2ZXJz L2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYyAgIHwgMzA3ICsrKysrKysr KysrKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19k cm1fZHJ2LmggICB8ICAzOSArKysKPiAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9o aWJtY19kcm1fcG93ZXIuYyB8ICA5MSArKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGlj b24vaGlibWMvaGlibWNfZHJtX3Bvd2VyLmggfCAgMjggKysKPiAgZHJpdmVycy9ncHUvZHJtL2hp c2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fcmVncy5oICB8IDIxNCArKysrKysrKysrKysrKysKPiAg OSBmaWxlcyBjaGFuZ2VkLCA2OTkgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9LY29uZmlnCj4g IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL01ha2Vm aWxlCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kcnYuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2hp c2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmgKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3Bvd2VyLmMKPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3Bvd2Vy LmgKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMv aGlibWNfZHJtX3JlZ3MuaAo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxp Y29uL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL0tjb25maWcKPiBpbmRleCA1 NThjNjFiLi4yZmQyNzI0IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24v S2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vS2NvbmZpZwo+IEBAIC0y LDQgKzIsNSBAQAo+ICAjIGhpc2lsaWNvbiBkcm0gZGV2aWNlIGNvbmZpZ3VyYXRpb24uCj4gICMg UGxlYXNlIGtlZXAgdGhpcyBsaXN0IHNvcnRlZCBhbHBoYWJldGljYWxseQo+ICAKPiArc291cmNl ICJkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWciCj4gIHNvdXJjZSAiZHJp dmVycy9ncHUvZHJtL2hpc2lsaWNvbi9raXJpbi9LY29uZmlnIgo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNv bi9NYWtlZmlsZQo+IGluZGV4IGUzZjZkNDkuLjRkNzE4NWMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNp bGljb24vTWFrZWZpbGUKPiBAQCAtMiw0ICsyLDUgQEAKPiAgIyBNYWtlZmlsZSBmb3IgaGlzaWxp Y29uIGRybSBkcml2ZXJzLgo+ICAjIFBsZWFzZSBrZWVwIHRoaXMgbGlzdCBzb3J0ZWQgYWxwaGFi ZXRpY2FsbHkKPiAgCj4gLW9iai0kKENPTkZJR19EUk1fSElTSV9LSVJJTikgKz0ga2lyaW4vCj4g K29iai0kKENPTkZJR19EUk1fSElTSV9ISUJNQykgKz0gaGlibWMvCj4gK29iai0kKENPTkZJR19E Uk1fSElTSV9LSVJJTikgKz0ga2lyaW4vCj4gXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvS2NvbmZpZyBiL2Ry aXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvS2NvbmZpZwo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMC4uMWU3ODEwZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcKPiBAQCAtMCwwICsxLDEzIEBACj4g K2NvbmZpZyBEUk1fSElTSV9ISUJNQwo+ICsJdHJpc3RhdGUgIkRSTSBTdXBwb3J0IGZvciBIaXNp bGljb24gSGlibWMiCj4gKwlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKPiArCXNlbGVjdCBEUk1fS01T X0hFTFBFUgo+ICsJc2VsZWN0IERSTV9LTVNfRkJfSEVMUEVSCj4gKwlzZWxlY3QgRFJNX0dFTV9D TUFfSEVMUEVSCj4gKwlzZWxlY3QgRFJNX0tNU19DTUFfSEVMUEVSCj4gKwlzZWxlY3QgRkJfU1lT X0ZJTExSRUNUCj4gKwlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCj4gKwlzZWxlY3QgRkJfU1lTX0lN QUdFQkxJVAo+ICsJaGVscAo+ICsJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBI aXNpbGljb24gSGlibWMgc29jIGNoaXBzZXQuCj4gKwkgIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1v ZHVsZSB3aWxsIGJlIGNhbGxlZCBoaWJtYy1kcm0uCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29u L2hpYm1jL01ha2VmaWxlCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi41 MzNmOWVkCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24v aGlibWMvTWFrZWZpbGUKPiBAQCAtMCwwICsxLDQgQEAKPiAraGlibWMtZHJtLXkgOj0gaGlibWNf ZHJtX2Rydi5vIGhpYm1jX2RybV9wb3dlci5vCj4gKwo+ICtvYmotJChDT05GSUdfRFJNX0hJU0lf SElCTUMpCSs9aGlibWMtZHJtLm8KPiArI29iai15CSs9IGhpYm1jLWRybS5vCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jIGIvZHJp dmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMKPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjdlYWFjZDgKPiAtLS0gL2Rldi9udWxsCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMKPiBAQCAt MCwwICsxLDMwNyBAQAo+ICsvKiBIaXNpbGljb24gSGlibWMgU29DIGRybSBkcml2ZXIKPiArICoK PiArICogQmFzZWQgb24gdGhlIGJvY2hzIGRybSBkcml2ZXIuCj4gKyAqCj4gKyAqIENvcHlyaWdo dCAoYykgMjAxNiBIdWF3ZWkgTGltaXRlZC4KPiArICoKPiArICogQXV0aG9yOgo+ICsgKglSb25n cm9uZyBab3UgPHpvdXJvbmdyb25nQGh1YXdlaT4KPiArICoJUm9uZ3JvbmcgWm91IDx6b3Vyb25n cm9uZ0BnbWFpbC5jb20+Cj4gKyAqCUppYW5odWEgTGkgPGxpamlhbmh1YUBodWF3ZWkuY29tPgo+ ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+ICsgKiB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKgo+ICsgKi8KPiAr Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUu aD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJt L2RybV9jcnRjX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KPiAr I2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1Q Lmg+Cj4gKwo+ICsjaW5jbHVkZSAiaGlibWNfZHJtX2Rydi5oIgo+ICsjaW5jbHVkZSAiaGlibWNf ZHJtX3JlZ3MuaCIKPiArI2luY2x1ZGUgImhpYm1jX2RybV9wb3dlci5oIgo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGlibWNfZm9wcyA9IHsKPiArCS5vd25lcgkJ PSBUSElTX01PRFVMRSwKPiArCS5vcGVuCQk9IGRybV9vcGVuLAo+ICsJLnJlbGVhc2UJPSBkcm1f cmVsZWFzZSwKPiArCS51bmxvY2tlZF9pb2N0bAk9IGRybV9pb2N0bCwKPiArI2lmZGVmIENPTkZJ R19DT01QQVQKPiArCS5jb21wYXRfaW9jdGwJPSBkcm1fY29tcGF0X2lvY3RsLAo+ICsjZW5kaWYK PiArCS5wb2xsCQk9IGRybV9wb2xsLAo+ICsJLnJlYWQJCT0gZHJtX3JlYWQsCj4gKwkubGxzZWVr CQk9IG5vX2xsc2VlaywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgaGlibWNfZW5hYmxlX3ZibGFu ayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKPiArewo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGhpYm1jX2Rpc2FibGVfdmJsYW5rKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQo+ICt7Cj4gK30KPiArCj4gK3N0 YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBoaWJtY19kcml2ZXIgPSB7Cj4gKwkuZHJpdmVyX2ZlYXR1 cmVzCT0gRFJJVkVSX0dFTSB8IERSSVZFUl9NT0RFU0VULAo+ICsJLmZvcHMJCQk9ICZoaWJtY19m b3BzLAo+ICsJLm5hbWUJCQk9ICJoaWJtYyIsCj4gKwkuZGVzYwkJCT0gImhpYm1jIGRybSBkcml2 ZXIiLAo+ICsJLm1ham9yCQkJPSAxLAo+ICsJLm1pbm9yCQkJPSAwLAo+ICsJLmdldF92Ymxhbmtf Y291bnRlciA9IGRybV92Ymxhbmtfbm9faHdfY291bnRlciwKPiArCS5lbmFibGVfdmJsYW5rCQk9 IGhpYm1jX2VuYWJsZV92YmxhbmssCj4gKwkuZGlzYWJsZV92YmxhbmsJPSBoaWJtY19kaXNhYmxl X3ZibGFuaywKPiArCS5nZW1fZnJlZV9vYmplY3QgICAgICAgID0gZHJtX2dlbV9jbWFfZnJlZV9v YmplY3QsCgpnZW1fZnJlZV9vYmplY3RfdW5sb2NrZWQgcGxzLgoKPiArCS5nZW1fdm1fb3BzCQk9 ICZkcm1fZ2VtX2NtYV92bV9vcHMsCj4gKwkuZHVtYl9jcmVhdGUgICAgICAgICAgICA9IGRybV9n ZW1fY21hX2R1bWJfY3JlYXRlLAo+ICsJLmR1bWJfbWFwX29mZnNldCAgICAgICAgPSBkcm1fZ2Vt X2NtYV9kdW1iX21hcF9vZmZzZXQsCj4gKwkuZHVtYl9kZXN0cm95ICAgICAgICAgICA9IGRybV9n ZW1fZHVtYl9kZXN0cm95LAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBoaWJtY19wbV9zdXNwZW5k KHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19w Y2lfZGV2KGRldik7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHBjaV9nZXRfZHJ2 ZGF0YShwZGV2KTsKPiArCj4gKwlkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZHJtX2Rldik7 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaGlibWNfcG1fcmVzdW1l KHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19w Y2lfZGV2KGRldik7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHBjaV9nZXRfZHJ2 ZGF0YShwZGV2KTsKPiArCj4gKwlkcm1faGVscGVyX3Jlc3VtZV9mb3JjZV9tb2RlKGRybV9kZXYp Owo+ICsJZHJtX2ttc19oZWxwZXJfcG9sbF9lbmFibGUoZHJtX2Rldik7Cj4gKwo+ICsJcmV0dXJu IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBoaWJtY19wbV9v cHMgPSB7Cj4gKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhoaWJtY19wbV9zdXNwZW5kLAo+ICsJ CQkJaGlibWNfcG1fcmVzdW1lKQo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1f bW9kZV9jb25maWdfZnVuY3MgbW9kZV9jb25maWdfZnVuY3MgPSB7Cj4gKwkuYXRvbWljX2NoZWNr ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2ssCj4gKwkuYXRvbWljX2NvbW1pdCA9IGRybV9hdG9t aWNfaGVscGVyX2NvbW1pdCwKClNvIGhvdyBleGFjdGx5IGRvZXMgbm9uYmxvY2tpbmcgY29tbWl0 IHdvcmsgZm9yIHlvdT8gUGxlYXNlIHJ1biB0aGUgaWd0CnZhbGlkYXRpb24gc3VpdCBvbiB5b3Vy IG5ldyBkcml2ZXIsIGEgYnVuY2ggb2YgY29sbGFib3JhIGVuZ2luZWVycyBhcmUKd29ya2luZyBo YXJkIHRvIG1ha2UgaXQgcnVuIG9uIG5vbi1pbnRlbCBkcml2ZXJzIHRvby4gUGluZyBUb21ldSBh bmQKUm9iZXJ0IEZvc3MgZm9yIG1vcmUgaW5mbyBvbiB0aGlzIHBsZWFzZS4KCkx1Y2t5IGZvciB5 b3UgSSdtIHdvcmtpbmcgb24gZ2VuZXJpYyBub25ibG9ja2luZyBzdXBwb3J0IGluIHRoZSBhdG9t aWMKaGVscGVycywgcGF0Y2hlcyBhcmUgb24gdGhlIG1haWxpbmcgbGlzdC4KCj4gK307Cj4gKwo+ ICsKPiArc3RhdGljIGludCBoaWJtY19od19jb25maWcoc3RydWN0IGhpYm1jX2RybV9kZXZpY2Ug KmhpZGV2KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgcmVnOwo+ICsKPiArCS8qIE9uIGhhcmR3YXJl IHJlc2V0LCBwb3dlciBtb2RlIDAgaXMgZGVmYXVsdC4gKi8KPiArCWhpYm1jX3NldF9wb3dlcl9t b2RlKGhpZGV2LCBISUJNQ19QV19NT0RFX0NUTF9NT0RFX01PREUwKTsKPiArCj4gKwkvKiBFbmFi bGUgZGlzcGxheSBwb3dlciBnYXRlICYgTE9DQUxNRU0gcG93ZXIgZ2F0ZSovCj4gKwlyZWcgPSBy ZWFkbChoaWRldi0+bW1pbyArIEhJQk1DX0NVUlJFTlRfR0FURSk7Cj4gKwlyZWcgJj0gfkhJQk1D X0NVUlJfR0FURV9ESVNQTEFZX01BU0s7Cj4gKwlyZWcgJj0gfkhJQk1DX0NVUlJfR0FURV9MT0NB TE1FTV9NQVNLOwo+ICsJcmVnIHw9IEhJQk1DX0NVUlJfR0FURV9ESVNQTEFZKE9OKTsKPiArCXJl ZyB8PSBISUJNQ19DVVJSX0dBVEVfTE9DQUxNRU0oT04pOwo+ICsKPiArCWhpYm1jX3NldF9jdXJy ZW50X2dhdGUoaGlkZXYsIHJlZyk7Cj4gKwo+ICsJLyogUmVzZXQgdGhlIG1lbW9yeSBjb250cm9s bGVyLiBJZiB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKPiArCSAqIGlzIG5vdCByZXNldCBpbiBjaGlw LHRoZSBzeXN0ZW0gbWlnaHQgaGFuZyB3aGVuIHN3IGFjY2Vzc2VzCj4gKwkgKiB0aGUgbWVtb3J5 LlRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyCj4gKwkgKiBjaGFuZ2luZyB0aGUg TVhDTEsuCj4gKwkgKi8KPiArCXJlZyA9IHJlYWRsKGhpZGV2LT5tbWlvICsgSElCTUNfTUlTQ19D VFJMKTsKPiArCXJlZyAmPSB+SElCTUNfTVNDQ1RMX0xPQ0FMTUVNX1JFU0VUX01BU0s7Cj4gKwly ZWcgfD0gSElCTUNfTVNDQ1RMX0xPQ0FMTUVNX1JFU0VUKFJFU0VUKTsKPiArCXdyaXRlbChyZWcs IGhpZGV2LT5tbWlvICsgSElCTUNfTUlTQ19DVFJMKTsKPiArCj4gKwlyZWcgJj0gfkhJQk1DX01T Q0NUTF9MT0NBTE1FTV9SRVNFVF9NQVNLOwo+ICsJcmVnIHw9IEhJQk1DX01TQ0NUTF9MT0NBTE1F TV9SRVNFVChOT1JNQUwpOwo+ICsKPiArCXdyaXRlbChyZWcsIGhpZGV2LT5tbWlvICsgSElCTUNf TUlTQ19DVFJMKTsKPiArCj4gKwkvKiBXZSBjYW4gYWRkIG1vcmUgaW5pdGlhbGl6YXRpb24gYXMg bmVlZGVkLiAqLwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhpYm1j X2h3X21hcChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4gK3sKPiArCXN0cnVjdCBk cm1fZGV2aWNlICpkZXYgPSBoaWRldi0+ZGV2Owo+ICsJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBk ZXYtPnBkZXY7Cj4gKwlyZXNvdXJjZV9zaXplX3QgYWRkciwgc2l6ZSwgaW9hZGRyLCBpb3NpemU7 Cj4gKwo+ICsJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwo+ICsJaW9zaXpl ID0gTUIoMik7Cj4gKwo+ICsJaGlkZXYtPm1taW8gPSBpb3JlbWFwX25vY2FjaGUoaW9hZGRyLCBp b3NpemUpOwo+ICsKPiArCWlmICghaGlkZXYtPm1taW8pIHsKPiArCQlEUk1fRVJST1IoIkNhbm5v dCBtYXAgbW1pbyByZWdpb25cbiIpOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ICsKPiAr CWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Cj4gKwlzaXplID0gTUIoMTYpOwo+ ICsKPiArCWhpZGV2LT5mYl9tYXAgPSBpb3JlbWFwKGFkZHIsIHNpemUpOwo+ICsJaWYgKCFoaWRl di0+ZmJfbWFwKSB7Cj4gKwkJRFJNX0VSUk9SKCJDYW5ub3QgbWFwIGZyYW1lYnVmZmVyXG4iKTsK PiArCQlyZXR1cm4gLUVOT01FTTsKPiArCX0KPiArCWhpZGV2LT5mYl9iYXNlID0gYWRkcjsKPiAr CWhpZGV2LT5mYl9zaXplID0gc2l6ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaGlibWNfaHdfZmluaShzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4g K3sKPiArCWlmIChoaWRldi0+bW1pbykKPiArCQlpb3VubWFwKGhpZGV2LT5tbWlvKTsKPiArCWlm IChoaWRldi0+ZmJfbWFwKQo+ICsJCWlvdW5tYXAoaGlkZXYtPmZiX21hcCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgaGlibWNfaHdfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYp Cj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gaGlibWNfaHdfbWFwKGhpZGV2KTsKPiAr CWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwloaWJtY19od19jb25maWcoaGlkZXYp Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhpYm1jX3VubG9hZChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAq aGlkZXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ICsKPiArCWhpYm1jX2h3X2ZpbmkoaGlkZXYpOwo+ ICsJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBoaWJtY19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcg ZmxhZ3MpCj4gK3sKPiArCXN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldjsKPiArCWludCBy ZXQ7Cj4gKwo+ICsJaGlkZXYgPSBkZXZtX2t6YWxsb2MoZGV2LT5kZXYsIHNpemVvZigqaGlkZXYp LCBHRlBfS0VSTkVMKTsKPiArCWlmICghaGlkZXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwlk ZXYtPmRldl9wcml2YXRlID0gaGlkZXY7Cj4gKwloaWRldi0+ZGV2ID0gZGV2Owo+ICsKPiArCXJl dCA9IGhpYm1jX2h3X2luaXQoaGlkZXYpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGVycjsKPiAr Cj4gKwo+ICsJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgZGV2LT5tb2RlX2NvbmZpZy5udW1f Y3J0Yyk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6 ZSB2YmxhbmsuXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsJLyogcmVzZXQgYWxsIHRo ZSBzdGF0ZXMgb2YgY3J0Yy9wbGFuZS9lbmNvZGVyL2Nvbm5lY3RvciAqLwo+ICsJZHJtX21vZGVf Y29uZmlnX3Jlc2V0KGRldik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtlcnI6Cj4gKwloaWJt Y191bmxvYWQoZGV2KTsKPiArCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgZHJtIGRy aXZlci5cbiIpOwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArCj4gK3N0YXRpYyBpbnQgaGli bWNfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAo+ICsJCQkgICBjb25zdCBzdHJ1Y3Qg cGNpX2RldmljZV9pZCAqZW50KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2Owo+ICsJ aW50IHJldDsKPiArCj4gKwlkZXYgPSBkcm1fZGV2X2FsbG9jKCZoaWJtY19kcml2ZXIsICZwZGV2 LT5kZXYpOwo+ICsJaWYgKCFkZXYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJZGV2LT5w ZGV2ID0gcGRldjsKPiArCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwo+ICsKPiArCXJldCA9 IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGVycl9mcmVl Owo+ICsKPiArCXJldCA9IGhpYm1jX2xvYWQoZGV2LCAwKTsKPiArCWlmIChyZXQpCj4gKwkJZ290 byBlcnJfZGlzYWJsZTsKPiArCj4gKwlyZXQgPSBkcm1fZGV2X3JlZ2lzdGVyKGRldiwgMCk7Cj4g KwlpZiAocmV0KQo+ICsJCWdvdG8gZXJyX3VubG9hZDsKPiArCj4gKwlyZXR1cm4gMDsKPiArCj4g K2Vycl91bmxvYWQ6Cj4gKwloaWJtY191bmxvYWQoZGV2KTsKPiArZXJyX2Rpc2FibGU6Cj4gKwlw Y2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cj4gK2Vycl9mcmVlOgo+ICsJZHJtX2Rldl91bnJlZihk ZXYpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGhpYm1jX3Bj aV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBkcm1fZGV2aWNl ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJZHJtX2Rldl91bnJlZ2lzdGVy KGRldik7Cj4gKwloaWJtY191bmxvYWQoZGV2KTsKPiArCWRybV9kZXZfdW5yZWYoZGV2KTsKPiAr fQo+ICsKPiArc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhpYm1jX3BjaV90YWJsZVtdID0g ewo+ICsJezB4MTllNSwgMHgxNzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwK PiArCXswLH0KPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBoaWJtY19wY2lf ZHJpdmVyID0gewo+ICsJLm5hbWUgPQkJImhpYm1jLWRybSIsCj4gKwkuaWRfdGFibGUgPQloaWJt Y19wY2lfdGFibGUsCj4gKwkucHJvYmUgPQloaWJtY19wY2lfcHJvYmUsCj4gKwkucmVtb3ZlID0J aGlibWNfcGNpX3JlbW92ZSwKPiArCS5kcml2ZXIucG0gPSAgICAmaGlibWNfcG1fb3BzLAo+ICt9 Owo+ICsKPiArc3RhdGljIGludCBfX2luaXQgaGlibWNfaW5pdCh2b2lkKQo+ICt7Cj4gKwlyZXR1 cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaGlibWNfcGNpX2RyaXZlcik7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIF9fZXhpdCBoaWJtY19leGl0KHZvaWQpCj4gK3sKPiArCXJldHVybiBwY2lfdW5y ZWdpc3Rlcl9kcml2ZXIoJmhpYm1jX3BjaV9kcml2ZXIpOwo+ICt9Cj4gKwo+ICttb2R1bGVfaW5p dChoaWJtY19pbml0KTsKPiArbW9kdWxlX2V4aXQoaGlibWNfZXhpdCk7Cj4gKwo+ICtNT0RVTEVf REVWSUNFX1RBQkxFKHBjaSwgaGlibWNfcGNpX3RhYmxlKTsKPiArTU9EVUxFX0FVVEhPUigiUm9u Z3Jvbmdab3UgPHpvdXJvbmdyb25nQGh1YXdlaS5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQVElP TigiRFJNIERyaXZlciBmb3IgSGlzaWxpY29uIEhpYm1jIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJH UEwgdjIiKTsKPiArCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGli bWMvaGlibWNfZHJtX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJt Y19kcm1fZHJ2LmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmEwNzJl YTkKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJt Yy9oaWJtY19kcm1fZHJ2LmgKPiBAQCAtMCwwICsxLDM5IEBACj4gKy8qIEhpc2lsaWNvbiBIaWJt YyBTb0MgZHJtIGRyaXZlcgo+ICsgKgo+ICsgKiBCYXNlZCBvbiB0aGUgYm9jaHMgZHJtIGRyaXZl ci4KPiArICoKPiArICogQ29weXJpZ2h0IChjKSAyMDE2IEh1YXdlaSBMaW1pdGVkLgo+ICsgKgo+ ICsgKiBBdXRob3I6Cj4gKyAqCVJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAaHVhd2VpPgo+ICsg KglSb25ncm9uZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPiArICoJSmlhbmh1YSBMaSA8 bGlqaWFuaHVhQGh1YXdlaS5jb20+Cj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5Cj4gKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDIgb2YgdGhlIExpY2Vuc2UsIG9yCj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCj4gKyAqCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBISUJNQ19EUk1fRFJWX0gKPiArI2Rl ZmluZSBISUJNQ19EUk1fRFJWX0gKPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9o ZWxwZXIuaD4KPiArCj4gK3N0cnVjdCBoaWJtY19kcm1fZGV2aWNlIHsKPiArCS8qIGh3ICovCj4g Kwl2b2lkIF9faW9tZW0gICAqbW1pbzsKPiArCXZvaWQgX19pb21lbSAgICpmYl9tYXA7Cj4gKwl1 bnNpZ25lZCBsb25nICBmYl9iYXNlOwo+ICsJdW5zaWduZWQgbG9uZyAgZmJfc2l6ZTsKPiArCj4g KwkvKiBkcm0gKi8KPiArCXN0cnVjdCBkcm1fZGV2aWNlICAqZGV2Owo+ICsJYm9vbCBtb2RlX2Nv bmZpZ19pbml0aWFsaXplZDsKPiArfTsKPiArCj4gKwo+ICsjZW5kaWYKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fcG93ZXIuYyBiL2RyaXZl cnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3Bvd2VyLmMKPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjY3M2JlMTAKPiAtLS0gL2Rldi9udWxsCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fcG93ZXIuYwo+IEBA IC0wLDAgKzEsOTEgQEAKPiArLyogSGlzaWxpY29uIEhpYm1jIFNvQyBkcm0gZHJpdmVyCj4gKyAq Cj4gKyAqIEJhc2VkIG9uIHRoZSBib2NocyBkcm0gZHJpdmVyLgo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTYgSHVhd2VpIExpbWl0ZWQuCj4gKyAqCj4gKyAqIEF1dGhvcjoKPiArICoJUm9u Z3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BodWF3ZWk+Cj4gKyAqCVJvbmdyb25nIFpvdSA8em91cm9u Z3JvbmdAZ21haWwuY29tPgo+ICsgKglKaWFuaHVhIExpIDxsaWppYW5odWFAaHVhd2VpLmNvbT4K PiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKPiArICogdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK PiArICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICovCj4g Kwo+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4KPiArI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4gKyNp bmNsdWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgo+ICsjaW5jbHVkZSAiaGlibWNfZHJtX2Rydi5o Igo+ICsjaW5jbHVkZSAiaGlibWNfZHJtX3JlZ3MuaCIKPiArCj4gKy8qCj4gKyAqIEl0IGNhbiBv cGVyYXRlIGluIG9uZSBvZiB0aHJlZSBtb2RlczogMCwgMSBvciBTbGVlcC4KPiArICovCj4gK3Zv aWQgaGlibWNfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2LAo+ ICsJCQkJIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgY29u dHJvbF92YWx1ZSA9IDA7Cj4gKwl2b2lkIF9faW9tZW0gICAqbW1pbyA9IGhpZGV2LT5tbWlvOwo+ ICsKPiArCWlmIChwb3dlcl9tb2RlID4gSElCTUNfUFdfTU9ERV9DVExfTU9ERV9TTEVFUCkKPiAr CQlyZXR1cm47Cj4gKwo+ICsJY29udHJvbF92YWx1ZSA9IHJlYWRsKG1taW8gKyBISUJNQ19QT1dF Ul9NT0RFX0NUUkwpOwo+ICsJY29udHJvbF92YWx1ZSAmPSB+SElCTUNfUFdfTU9ERV9DVExfTU9E RV9NQVNLOwo+ICsKPiArCWNvbnRyb2xfdmFsdWUgfD0gSElCTUNfUFdfTU9ERV9DVExfTU9ERShw b3dlcl9tb2RlKSAmCj4gKwkJCSBISUJNQ19QV19NT0RFX0NUTF9NT0RFX01BU0s7Cj4gKwo+ICsK PiArICAgIC8qIFNldCB1cCBvdGhlciBmaWVsZHMgaW4gUG93ZXIgQ29udHJvbCBSZWdpc3RlciAq Lwo+ICsJaWYgKHBvd2VyX21vZGUgPT0gSElCTUNfUFdfTU9ERV9DVExfTU9ERV9TTEVFUCkgewo+ ICsJCWNvbnRyb2xfdmFsdWUgJj0gfkhJQk1DX1BXX01PREVfQ1RMX09TQ19JTlBVVF9NQVNLOwo+ ICsJCWNvbnRyb2xfdmFsdWUgfD0gSElCTUNfUFdfTU9ERV9DVExfT1NDX0lOUFVUKDApICYKPiAr CQkJCSBISUJNQ19QV19NT0RFX0NUTF9PU0NfSU5QVVRfTUFTSzsKPiArCX0gZWxzZSB7Cj4gKwkJ Y29udHJvbF92YWx1ZSAmPSB+SElCTUNfUFdfTU9ERV9DVExfT1NDX0lOUFVUX01BU0s7Cj4gKwkJ Y29udHJvbF92YWx1ZSB8PSBISUJNQ19QV19NT0RFX0NUTF9PU0NfSU5QVVQoMSkgJgo+ICsJCQkJ IEhJQk1DX1BXX01PREVfQ1RMX09TQ19JTlBVVF9NQVNLOwo+ICsKPiArCX0KPiArICAgIC8qIFBy b2dyYW0gbmV3IHBvd2VyIG1vZGUuICovCj4gKwl3cml0ZWwoY29udHJvbF92YWx1ZSwgbW1pbyAr IEhJQk1DX1BPV0VSX01PREVfQ1RSTCk7Cj4gK30KPiArCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQg aGlibWNfZ2V0X3Bvd2VyX21vZGUoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2KQo+ICt7 Cj4gKwl2b2lkIF9faW9tZW0gICAqbW1pbyA9IGhpZGV2LT5tbWlvOwo+ICsKPiArCXJldHVybiAo cmVhZGwobW1pbyArIEhJQk1DX1BPV0VSX01PREVfQ1RSTCkmCj4gKwkJSElCTUNfUFdfTU9ERV9D VExfTU9ERV9NQVNLKSA+PiBISUJNQ19QV19NT0RFX0NUTF9NT0RFX1NISUZUOwo+ICt9Cj4gKwo+ ICt2b2lkIGhpYm1jX3NldF9jdXJyZW50X2dhdGUoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhp ZGV2LCB1bnNpZ25lZCBpbnQgZ2F0ZSkKPiArewo+ICsJdW5zaWduZWQgaW50IGdhdGVfcmVnOwo+ ICsJdW5zaWduZWQgaW50IG1vZGU7Cj4gKwl2b2lkIF9faW9tZW0gICAqbW1pbyA9IGhpZGV2LT5t bWlvOwo+ICsKPiArCS8qIEdldCBjdXJyZW50IHBvd2VyIG1vZGUuICovCj4gKwltb2RlID0gaGli bWNfZ2V0X3Bvd2VyX21vZGUoaGlkZXYpOwo+ICsKPiArCXN3aXRjaCAobW9kZSkgewo+ICsJY2Fz ZSBISUJNQ19QV19NT0RFX0NUTF9NT0RFX01PREUwOgo+ICsJCWdhdGVfcmVnID0gSElCTUNfTU9E RTBfR0FURTsKPiArCQlicmVhazsKPiArCj4gKwljYXNlIEhJQk1DX1BXX01PREVfQ1RMX01PREVf TU9ERTE6Cj4gKwkJZ2F0ZV9yZWcgPSBISUJNQ19NT0RFMV9HQVRFOwo+ICsJCWJyZWFrOwo+ICsK PiArCWRlZmF1bHQ6Cj4gKwkJZ2F0ZV9yZWcgPSBISUJNQ19NT0RFMF9HQVRFOwo+ICsJCWJyZWFr Owo+ICsJfQo+ICsJd3JpdGVsKGdhdGUsIG1taW8gKyBnYXRlX3JlZyk7Cj4gK30KPiArCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3Bvd2Vy LmggYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9wb3dlci5oCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi4zOWY3YTE3Cj4gLS0tIC9kZXYv bnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3Bv d2VyLmgKPiBAQCAtMCwwICsxLDI4IEBACj4gKy8qIEhpc2lsaWNvbiBIaWJtYyBTb0MgZHJtIGRy aXZlcgo+ICsgKgo+ICsgKiBCYXNlZCBvbiB0aGUgYm9jaHMgZHJtIGRyaXZlci4KPiArICoKPiAr ICogQ29weXJpZ2h0IChjKSAyMDE2IEh1YXdlaSBMaW1pdGVkLgo+ICsgKgo+ICsgKiBBdXRob3I6 Cj4gKyAqCVJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAaHVhd2VpPgo+ICsgKglSb25ncm9uZyBa b3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPiArICoJSmlhbmh1YSBMaSA8bGlqaWFuaHVhQGh1 YXdlaS5jb20+Cj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cj4gKyAq IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gKyAq Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBISUJNQ19EUk1fUE9XRVJfSAo+ICsjZGVmaW5lIEhJQk1D X0RSTV9QT1dFUl9ICj4gKwo+ICsjaW5jbHVkZSAiaGlibWNfZHJtX2Rydi5oIgo+ICsKPiArZXh0 ZXJuIHZvaWQgaGlibWNfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhp ZGV2LAo+ICsJCQkJIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlKTsKPiArZXh0ZXJuIHZvaWQgaGli bWNfc2V0X2N1cnJlbnRfZ2F0ZShzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYsCj4gKwkJ CQkgICB1bnNpZ25lZCBpbnQgZ2F0ZSk7Cj4gKyNlbmRpZgo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9yZWdzLmggYi9kcml2ZXJzL2dwdS9k cm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9yZWdzLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0 NAo+IGluZGV4IDAwMDAwMDAuLjQ5NjZjNDIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fcmVncy5oCj4gQEAgLTAsMCArMSwy MTQgQEAKPiArLyogSGlzaWxpY29uIEhpYm1jIFNvQyBkcm0gZHJpdmVyCj4gKyAqCj4gKyAqIEJh c2VkIG9uIHRoZSBib2NocyBkcm0gZHJpdmVyLgo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIw MTYgSHVhd2VpIExpbWl0ZWQuCj4gKyAqCj4gKyAqIEF1dGhvcjoKPiArICoJUm9uZ3JvbmcgWm91 IDx6b3Vyb25ncm9uZ0BodWF3ZWk+Cj4gKyAqCVJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdAZ21h aWwuY29tPgo+ICsgKglKaWFuaHVhIExpIDxsaWppYW5odWFAaHVhd2VpLmNvbT4KPiArICoKPiAr ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKPiArICogdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPiArICogKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICovCj4gKwo+ICsjaWZu ZGVmIEhJQk1DX0RSTV9IV19ICj4gKyNkZWZpbmUgSElCTUNfRFJNX0hXX0gKPiArCj4gKyNkZWZp bmUgT0ZGIDAKPiArI2RlZmluZSBPTiAgMQo+ICsjZGVmaW5lIERJU0FCTEUgICAgICAgICAgICAg ICAwCj4gKyNkZWZpbmUgRU5BQkxFICAgICAgICAgICAgICAgIDEKPiArCj4gKwo+ICsKPiArLyog cmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lIEhJQk1DX01JU0NfQ1RSTAkJCQkweDQK PiArCj4gKyNkZWZpbmUgSElCTUNfTVNDQ1RMX0xPQ0FMTUVNX1JFU0VUKHgpCQkoKHgpIDw8IDYp Cj4gKyNkZWZpbmUgSElCTUNfTVNDQ1RMX0xPQ0FMTUVNX1JFU0VUX01BU0sJMHg0MAo+ICsKPiAr I2RlZmluZSBSRVNFVCAgICAgICAgICAgICAgICAwCj4gKyNkZWZpbmUgTk9STUFMICAgICAgICAg ICAgICAgMQo+ICsKPiArI2RlZmluZSBISUJNQ19DVVJSRU5UX0dBVEUJCQkweDAwMDA0MAo+ICsj ZGVmaW5lIEhJQk1DX0NVUlJfR0FURV9ESVNQTEFZKHgpCQkoKHgpIDw8IDIpCj4gKyNkZWZpbmUg SElCTUNfQ1VSUl9HQVRFX0RJU1BMQVlfTUFTSwkJMHg0Cj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NV UlJfR0FURV9MT0NBTE1FTSh4KQkJKCh4KSA8PCAxKQo+ICsjZGVmaW5lIEhJQk1DX0NVUlJfR0FU RV9MT0NBTE1FTV9NQVNLCQkweDIKPiArCj4gKyNkZWZpbmUgSElCTUNfTU9ERTBfR0FURQkJCTB4 MDAwMDQ0Cj4gKyNkZWZpbmUgSElCTUNfTU9ERTFfR0FURQkJCTB4MDAwMDQ4Cj4gKyNkZWZpbmUg SElCTUNfUE9XRVJfTU9ERV9DVFJMCQkJMHgwMDAwNEMKPiArCj4gKyNkZWZpbmUgSElCTUNfUFdf TU9ERV9DVExfT1NDX0lOUFVUKHgpCQkoKHgpIDw8IDMpCj4gKyNkZWZpbmUgSElCTUNfUFdfTU9E RV9DVExfT1NDX0lOUFVUX01BU0sJMHg4Cj4gKwo+ICsjZGVmaW5lIEhJQk1DX1BXX01PREVfQ1RM X01PREUoeCkJCSgoeCkgPDwgMCkKPiArI2RlZmluZSBISUJNQ19QV19NT0RFX0NUTF9NT0RFX01B U0sJCTB4MDMKPiArI2RlZmluZSBISUJNQ19QV19NT0RFX0NUTF9NT0RFX1NISUZUCQkwCj4gKwo+ ICsKPiArI2RlZmluZSBISUJNQ19QV19NT0RFX0NUTF9NT0RFX01PREUwCQkwCj4gKyNkZWZpbmUg SElCTUNfUFdfTU9ERV9DVExfTU9ERV9NT0RFMQkJMQo+ICsjZGVmaW5lIEhJQk1DX1BXX01PREVf Q1RMX01PREVfU0xFRVAJCTIKPiArCj4gKyNkZWZpbmUgSElCTUNfUEFORUxfUExMX0NUUkwJCQkw eDAwMDA1Qwo+ICsjZGVmaW5lIEhJQk1DX0NSVF9QTExfQ1RSTAkJCTB4MDAwMDYwCj4gKwo+ICsj ZGVmaW5lIEhJQk1DX1BMTF9DVFJMX0JZUEFTUyh4KQkJKCh4KSA8PCAxOCkKPiArI2RlZmluZSBI SUJNQ19QTExfQ1RSTF9CWVBBU1NfTUFTSwkJMHg0MDAwMAo+ICsKPiArI2RlZmluZSBISUJNQ19Q TExfQ1RSTF9QT1dFUih4KQkJCSgoeCkgPDwgMTcpCj4gKyNkZWZpbmUgSElCTUNfUExMX0NUUkxf UE9XRVJfTUFTSwkJMHgyMDAwMAo+ICsKPiArI2RlZmluZSBISUJNQ19QTExfQ1RSTF9JTlBVVCh4 KQkJCSgoeCkgPDwgMTYpCj4gKyNkZWZpbmUgSElCTUNfUExMX0NUUkxfSU5QVVRfTUFTSwkJMHgx MDAwMAo+ICsKPiArI2RlZmluZSBPU0MJCQkJCTAKPiArI2RlZmluZSBURVNUQ0xLCQkJCQkxCj4g Kwo+ICsjZGVmaW5lIEhJQk1DX1BMTF9DVFJMX1BPRCh4KQkJCSgoeCkgPDwgMTQpCj4gKyNkZWZp bmUgSElCTUNfUExMX0NUUkxfUE9EX01BU0sJCQkweEMwMDAKPiArCj4gKyNkZWZpbmUgSElCTUNf UExMX0NUUkxfT0QoeCkJCQkoKHgpIDw8IDEyKQo+ICsjZGVmaW5lIEhJQk1DX1BMTF9DVFJMX09E X01BU0sJCQkweDMwMDAKPiArCj4gKyNkZWZpbmUgSElCTUNfUExMX0NUUkxfTih4KQkJCSgoeCkg PDwgOCkKPiArI2RlZmluZSBISUJNQ19QTExfQ1RSTF9OX01BU0sJCQkweEYwMAo+ICsKPiArI2Rl ZmluZSBISUJNQ19QTExfQ1RSTF9NKHgpCQkJKCh4KSA8PCAwKQo+ICsjZGVmaW5lIEhJQk1DX1BM TF9DVFJMX01fTUFTSwkJCTB4RkYKPiArCj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NU TAkJCTB4ODAyMDAKPiArCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0RJU1BfQ1RMX0NSVFNFTEVDVCh4 KQkJKCh4KSA8PCAyNSkKPiArI2RlZmluZSBISUJNQ19DUlRfRElTUF9DVExfQ1JUU0VMRUNUX01B U0sJMHgyMDAwMDAwCj4gKwo+ICsjZGVmaW5lIENSVFNFTEVDVF9WR0EgICAgICAgICAgICAgICAg MAo+ICsjZGVmaW5lIENSVFNFTEVDVF9DUlQgICAgICAgICAgICAgICAgMQo+ICsKPiArI2RlZmlu ZSBISUJNQ19DUlRfRElTUF9DVExfQ0xPQ0tfUEhBU0UoeCkJKCh4KSA8PCAxNCkKPiArI2RlZmlu ZSBISUJNQ19DUlRfRElTUF9DVExfQ0xPQ0tfUEhBU0VfTUFTSwkweDQwMDAKPiArCj4gKyNkZWZp bmUgUEhBU0VfQUNUSVZFX0hJR0ggICAgICAwCj4gKyNkZWZpbmUgUEhBU0VfQUNUSVZFX0xPVyAg ICAgICAxCj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9WU1lOQ19QSEFTRSh4KQko KHgpIDw8IDEzKQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9WU1lOQ19QSEFTRV9NQVNL CTB4MjAwMAo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfRElTUF9DVExfSFNZTkNfUEhBU0UoeCkJ KCh4KSA8PCAxMikKPiArI2RlZmluZSBISUJNQ19DUlRfRElTUF9DVExfSFNZTkNfUEhBU0VfTUFT SwkweDEwMDAKPiArCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0RJU1BfQ1RMX1RJTUlORyh4KQkJKCh4 KSA8PCA4KQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9USU1JTkdfTUFTSwkJMHgxMDAK PiArCj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9QTEFORSh4KQkJKCh4KSA8PCAy KQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9QTEFORV9NQVNLCQk0Cj4gKwo+ICsjZGVm aW5lIEhJQk1DX0NSVF9ESVNQX0NUTF9GT1JNQVQoeCkJCSgoeCkgPDwgMCkKPiArI2RlZmluZSBI SUJNQ19DUlRfRElTUF9DVExfRk9STUFUX01BU0sJCTB4MDMKPiArCj4gKwo+ICsKPiArI2RlZmlu ZSBISUJNQ19DUlRfRkJfQUREUkVTUwkJCTB4MDgwMjA0Cj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NS VF9GQl9XSURUSAkJCTB4MDgwMjA4Cj4gKyNkZWZpbmUgSElCTUNfQ1JUX0ZCX1dJRFRIX1dJRFRI KHgpCQkoKHgpIDw8IDE2KQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9GQl9XSURUSF9XSURUSF9NQVNL CQkweDNGRkYwMDAwCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0ZCX1dJRFRIX09GRlMoeCkJCSgoeCkg PDwgMCkKPiArI2RlZmluZSBISUJNQ19DUlRfRkJfV0lEVEhfT0ZGU19NQVNLCQkweDNGRkYKPiAr Cj4gKwo+ICsjZGVmaW5lIEhJQk1DX0NSVF9IT1JaX1RPVEFMCQkJMHgwODAyMEMKPiArI2RlZmlu ZSBISUJNQ19DUlRfSE9SWl9UT1RBTF9UT1RBTCh4KQkJKCh4KSA8PCAxNikKPiArI2RlZmluZSBI SUJNQ19DUlRfSE9SWl9UT1RBTF9UT1RBTF9NQVNLCQkweEZGRjAwMDAKPiArCj4gKwo+ICsjZGVm aW5lIEhJQk1DX0NSVF9IT1JaX1RPVEFMX0RJU1BMQVlfRU5EKHgpCSgoeCkgPDwgMCkKPiArI2Rl ZmluZSBISUJNQ19DUlRfSE9SWl9UT1RBTF9ESVNQTEFZX0VORF9NQVNLCTB4RkZGCj4gKwo+ICsj ZGVmaW5lIEhJQk1DX0NSVF9IT1JaX1NZTkMJCQkweDA4MDIxMAo+ICsjZGVmaW5lIEhJQk1DX0NS VF9IT1JaX1NZTkNfV0lEVEgoeCkJCSgoeCkgPDwgMTYpCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0hP UlpfU1lOQ19XSURUSF9NQVNLCQkweEZGMDAwMAo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfSE9S Wl9TWU5DX1NUQVJUKHgpCQkoKHgpIDw8IDApCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0hPUlpfU1lO Q19TVEFSVF9NQVNLCQkweEZGRgo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfVkVSVF9UT1RBTAkJ CTB4MDgwMjE0Cj4gKyNkZWZpbmUgSElCTUNfQ1JUX1ZFUlRfVE9UQUxfVE9UQUwoeCkJCSgoeCkg PDwgMTYpCj4gKyNkZWZpbmUgSElCTUNfQ1JUX1ZFUlRfVE9UQUxfVE9UQUxfTUFTSwkJMHg3RkZG MDAwMAo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfVkVSVF9UT1RBTF9ESVNQTEFZX0VORCh4KQko KHgpIDw8IDApCj4gKyNkZWZpbmUgSElCTUNfQ1JUX1ZFUlRfVE9UQUxfRElTUExBWV9FTkRfTUFT SwkweDdGRgo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfVkVSVF9TWU5DCQkJMHgwODAyMTgKPiAr I2RlZmluZSBISUJNQ19DUlRfVkVSVF9TWU5DX0hFSUdIVCh4KQkJKCh4KSA8PCAxNikKPiArI2Rl ZmluZSBISUJNQ19DUlRfVkVSVF9TWU5DX0hFSUdIVF9NQVNLCQkweDNGMDAwMAo+ICsKPiArCj4g KyNkZWZpbmUgSElCTUNfQ1JUX1ZFUlRfU1lOQ19TVEFSVCh4KQkJKCh4KSA8PCAwKQo+ICsjZGVm aW5lIEhJQk1DX0NSVF9WRVJUX1NZTkNfU1RBUlRfTUFTSwkJMHg3RkYKPiArCj4gKy8qIEF1dG8g Q2VudGVyaW5nICovCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMCQkweDA4 MDI4MAo+ICsjZGVmaW5lIEhJQk1DX0NSVF9BVVRPX0NFTlRFUklOR19UTF9UT1AoeCkJKCh4KSA8 PCAxNikKPiArI2RlZmluZSBISUJNQ19DUlRfQVVUT19DRU5URVJJTkdfVExfVE9QX01TSwkweDdG RjAwMDAKPiArCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMX0xFRlQoeCkJ KCh4KSA8PCAwKQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9BVVRPX0NFTlRFUklOR19UTF9MRUZUX01T SwkweDdGRgo+ICsKPiArI2RlZmluZSBISUJNQ19DUlRfQVVUT19DRU5URVJJTkdfQlIJCTB4MDgw Mjg0Cj4gKyNkZWZpbmUgSElCTUNfQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSX0JPVFRPTSh4KQkoKHgp IDw8IDE2KQo+ICsjZGVmaW5lIEhJQk1DX0NSVF9BVVRPX0NFTlRFUklOR19CUl9CT1RUT01fTUFT SwkweDdGRjAwMDAKPiArCj4gKyNkZWZpbmUgSElCTUNfQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSX1JJ R0hUKHgpCSgoeCkgPDwgMCkKPiArI2RlZmluZSBISUJNQ19DUlRfQVVUT19DRU5URVJJTkdfQlJf UklHSFRfTUFTSwkweDdGRgo+ICsKPiArLyogcmVnaXN0ZXIgdG8gY29udHJvbCBwYW5lbCBvdXRw dXQgKi8KPiArI2RlZmluZSBESVNQTEFZX0NPTlRST0xfSElTSUxFCQkJMHg4MDI4OAo+ICsKPiAr LyogcmVnaXN0ZXIgYW5kIHZhbHVlcyBmb3IgUExMIGNvbnRyb2wgKi8KPiArI2RlZmluZSBDUlRf UExMMV9IUwkJCQkweDgwMmE4Cj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfMjVNSFoJCQkweDIzZDQw ZjAyCj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfNDBNSFoJCQkweDIzOTQwODAxCj4gKyNkZWZpbmUg Q1JUX1BMTDFfSFNfNjVNSFoJCQkweDIzOTQwZDAxCj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfNzhN SFoJCQkweDIzNTQwRjgyCj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfNzRNSFoJCQkweDIzOTQxZGMy Cj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfODBNSFoJCQkweDIzOTQxMDAxCj4gKyNkZWZpbmUgQ1JU X1BMTDFfSFNfODBNSFpfMTE1MgkJCTB4MjM1NDBmYzIKPiArI2RlZmluZSBDUlRfUExMMV9IU18x MDhNSFoJCQkweDIzYjQxYjAxCj4gKyNkZWZpbmUgQ1JUX1BMTDFfSFNfMTYyTUhaCQkJMHgyMzQ4 MDY4MQo+ICsjZGVmaW5lIENSVF9QTEwxX0hTXzE0OE1IWgkJCTB4MjM1NDFkYzIKPiArI2RlZmlu ZSBDUlRfUExMMV9IU18xOTNNSFoJCQkweDIzNDgwN2MxCj4gKwo+ICsjZGVmaW5lIENSVF9QTEwy X0hTCQkJCTB4ODAyYWMKPiArI2RlZmluZSBDUlRfUExMMl9IU18yNU1IWgkJCTB4MjA2Qjg1MUUK PiArI2RlZmluZSBDUlRfUExMMl9IU180ME1IWgkJCTB4MzAwMDAwMDAKPiArI2RlZmluZSBDUlRf UExMMl9IU182NU1IWgkJCTB4NDAwMDAwMDAKPiArI2RlZmluZSBDUlRfUExMMl9IU183OE1IWgkJ CTB4NTBFMTQ3QUUKPiArI2RlZmluZSBDUlRfUExMMl9IU183NE1IWgkJCTB4NjAyQjZBRTcKPiAr I2RlZmluZSBDUlRfUExMMl9IU184ME1IWgkJCTB4NzAwMDAwMDAKPiArI2RlZmluZSBDUlRfUExM Ml9IU18xMDhNSFoJCQkweDgwMDAwMDAwCj4gKyNkZWZpbmUgQ1JUX1BMTDJfSFNfMTYyTUhaCQkJ MHhBMDAwMDAwMAo+ICsjZGVmaW5lIENSVF9QTEwyX0hTXzE0OE1IWgkJCTB4QjBDQ0NDQ0QKPiAr I2RlZmluZSBDUlRfUExMMl9IU18xOTNNSFoJCQkweEMwODcyQjAyCj4gKwo+ICsvKiBHbG9iYWwg bWFjcm9zICovCj4gKyNkZWZpbmUgUkdCKHIsIGcsIGIpIFwKPiArKCBcCj4gKwkodW5zaWduZWQg bG9uZykoKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKSBcCj4gKykKPiArCj4gKyNkZWZp bmUgUEFERElORyhhbGlnbiwgZGF0YSkgKCgoZGF0YSkgKyAoYWxpZ24pIC0gMSkgJiAofigoYWxp Z24pIC0gMSkpKQo+ICsKPiArI2RlZmluZSBNQih4KSAoKHgpIDw8IDIwKQo+ICsKPiArI2VuZGlm Cj4gLS0gCj4gMS45LjEKPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9kcmktZGV2ZWwKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161208AbcE3JDk (ORCPT ); Mon, 30 May 2016 05:03:40 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:33688 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754384AbcE3JDg (ORCPT ); Mon, 30 May 2016 05:03:36 -0400 Date: Mon, 30 May 2016 11:03:31 +0200 From: Daniel Vetter To: Rongrong Zou Cc: zourongrong@huawei.com, airlied@linux.ie, emil.l.velikov@gmail.com, lijianhua@huawei.com, xinliang.liu@linaro.org, linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linuxarm@huawei.com, guohanjun@huawei.com, linux-arm-kernel@lists.infradead.org, majun258@huawei.com Subject: Re: [path v2 1/7] drm/hisilicon/hibmc: Add hisilicon hibmc drm master driver Message-ID: <20160530090331.GD27098@phenom.ffwll.local> Mail-Followup-To: Rongrong Zou , zourongrong@huawei.com, airlied@linux.ie, emil.l.velikov@gmail.com, lijianhua@huawei.com, xinliang.liu@linaro.org, linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linuxarm@huawei.com, guohanjun@huawei.com, linux-arm-kernel@lists.infradead.org, majun258@huawei.com References: <1464514855-108050-1-git-send-email-zourongrong@gmail.com> <1464514855-108050-2-git-send-email-zourongrong@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464514855-108050-2-git-send-email-zourongrong@gmail.com> X-Operating-System: Linux phenom 4.6.0-rc5+ User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, May 29, 2016 at 05:40:49PM +0800, Rongrong Zou wrote: > Add DRM master driver for Hisilicon Hibmc SoC which used for > Out-of-band management. Blow is the general hardware connection, > both the Hibmc and the host CPU are on the same mother board. > > +----------+ +----------+ > | | PCIe | Hibmc | > |host CPU( |<----->| display | > |arm64,x86)| |subsystem | > +----------+ +----------+ > > Signed-off-by: Rongrong Zou > Signed-off-by: Jianhua Li > --- > drivers/gpu/drm/hisilicon/Kconfig | 1 + > drivers/gpu/drm/hisilicon/Makefile | 3 +- > drivers/gpu/drm/hisilicon/hibmc/Kconfig | 13 + > drivers/gpu/drm/hisilicon/hibmc/Makefile | 4 + > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 307 ++++++++++++++++++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 39 +++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c | 91 +++++++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h | 28 ++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h | 214 +++++++++++++++ > 9 files changed, 699 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Kconfig > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/Makefile > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > > diff --git a/drivers/gpu/drm/hisilicon/Kconfig b/drivers/gpu/drm/hisilicon/Kconfig > index 558c61b..2fd2724 100644 > --- a/drivers/gpu/drm/hisilicon/Kconfig > +++ b/drivers/gpu/drm/hisilicon/Kconfig > @@ -2,4 +2,5 @@ > # hisilicon drm device configuration. > # Please keep this list sorted alphabetically > > +source "drivers/gpu/drm/hisilicon/hibmc/Kconfig" > source "drivers/gpu/drm/hisilicon/kirin/Kconfig" > diff --git a/drivers/gpu/drm/hisilicon/Makefile b/drivers/gpu/drm/hisilicon/Makefile > index e3f6d49..4d7185c 100644 > --- a/drivers/gpu/drm/hisilicon/Makefile > +++ b/drivers/gpu/drm/hisilicon/Makefile > @@ -2,4 +2,5 @@ > # Makefile for hisilicon drm drivers. > # Please keep this list sorted alphabetically > > -obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > +obj-$(CONFIG_DRM_HISI_HIBMC) += hibmc/ > +obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/ > \ No newline at end of file > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > new file mode 100644 > index 0000000..1e7810d > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig > @@ -0,0 +1,13 @@ > +config DRM_HISI_HIBMC > + tristate "DRM Support for Hisilicon Hibmc" > + depends on DRM && PCI > + select DRM_KMS_HELPER > + select DRM_KMS_FB_HELPER > + select DRM_GEM_CMA_HELPER > + select DRM_KMS_CMA_HELPER > + select FB_SYS_FILLRECT > + select FB_SYS_COPYAREA > + select FB_SYS_IMAGEBLIT > + help > + Choose this option if you have a Hisilicon Hibmc soc chipset. > + If M is selected the module will be called hibmc-drm. > diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile b/drivers/gpu/drm/hisilicon/hibmc/Makefile > new file mode 100644 > index 0000000..533f9ed > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile > @@ -0,0 +1,4 @@ > +hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_power.o > + > +obj-$(CONFIG_DRM_HISI_HIBMC) +=hibmc-drm.o > +#obj-y += hibmc-drm.o > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > new file mode 100644 > index 0000000..7eaacd8 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > @@ -0,0 +1,307 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > +#include "hibmc_drm_power.h" > + > +static const struct file_operations hibmc_fops = { > + .owner = THIS_MODULE, > + .open = drm_open, > + .release = drm_release, > + .unlocked_ioctl = drm_ioctl, > +#ifdef CONFIG_COMPAT > + .compat_ioctl = drm_compat_ioctl, > +#endif > + .poll = drm_poll, > + .read = drm_read, > + .llseek = no_llseek, > +}; > + > +static int hibmc_enable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > + return 0; > +} > + > +static void hibmc_disable_vblank(struct drm_device *dev, unsigned int pipe) > +{ > +} > + > +static struct drm_driver hibmc_driver = { > + .driver_features = DRIVER_GEM | DRIVER_MODESET, > + .fops = &hibmc_fops, > + .name = "hibmc", > + .desc = "hibmc drm driver", > + .major = 1, > + .minor = 0, > + .get_vblank_counter = drm_vblank_no_hw_counter, > + .enable_vblank = hibmc_enable_vblank, > + .disable_vblank = hibmc_disable_vblank, > + .gem_free_object = drm_gem_cma_free_object, gem_free_object_unlocked pls. > + .gem_vm_ops = &drm_gem_cma_vm_ops, > + .dumb_create = drm_gem_cma_dumb_create, > + .dumb_map_offset = drm_gem_cma_dumb_map_offset, > + .dumb_destroy = drm_gem_dumb_destroy, > +}; > + > +static int hibmc_pm_suspend(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_kms_helper_poll_disable(drm_dev); > + > + return 0; > +} > + > +static int hibmc_pm_resume(struct device *dev) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct drm_device *drm_dev = pci_get_drvdata(pdev); > + > + drm_helper_resume_force_mode(drm_dev); > + drm_kms_helper_poll_enable(drm_dev); > + > + return 0; > +} > + > +static const struct dev_pm_ops hibmc_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(hibmc_pm_suspend, > + hibmc_pm_resume) > +}; > + > +static const struct drm_mode_config_funcs mode_config_funcs = { > + .atomic_check = drm_atomic_helper_check, > + .atomic_commit = drm_atomic_helper_commit, So how exactly does nonblocking commit work for you? Please run the igt validation suit on your new driver, a bunch of collabora engineers are working hard to make it run on non-intel drivers too. Ping Tomeu and Robert Foss for more info on this please. Lucky for you I'm working on generic nonblocking support in the atomic helpers, patches are on the mailing list. > +}; > + > + > +static int hibmc_hw_config(struct hibmc_drm_device *hidev) > +{ > + unsigned int reg; > + > + /* On hardware reset, power mode 0 is default. */ > + hibmc_set_power_mode(hidev, HIBMC_PW_MODE_CTL_MODE_MODE0); > + > + /* Enable display power gate & LOCALMEM power gate*/ > + reg = readl(hidev->mmio + HIBMC_CURRENT_GATE); > + reg &= ~HIBMC_CURR_GATE_DISPLAY_MASK; > + reg &= ~HIBMC_CURR_GATE_LOCALMEM_MASK; > + reg |= HIBMC_CURR_GATE_DISPLAY(ON); > + reg |= HIBMC_CURR_GATE_LOCALMEM(ON); > + > + hibmc_set_current_gate(hidev, reg); > + > + /* Reset the memory controller. If the memory controller > + * is not reset in chip,the system might hang when sw accesses > + * the memory.The memory should be resetted after > + * changing the MXCLK. > + */ > + reg = readl(hidev->mmio + HIBMC_MISC_CTRL); > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(RESET); > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + reg &= ~HIBMC_MSCCTL_LOCALMEM_RESET_MASK; > + reg |= HIBMC_MSCCTL_LOCALMEM_RESET(NORMAL); > + > + writel(reg, hidev->mmio + HIBMC_MISC_CTRL); > + > + /* We can add more initialization as needed. */ > + > + return 0; > +} > + > +static int hibmc_hw_map(struct hibmc_drm_device *hidev) > +{ > + struct drm_device *dev = hidev->dev; > + struct pci_dev *pdev = dev->pdev; > + resource_size_t addr, size, ioaddr, iosize; > + > + ioaddr = pci_resource_start(pdev, 1); > + iosize = MB(2); > + > + hidev->mmio = ioremap_nocache(ioaddr, iosize); > + > + if (!hidev->mmio) { > + DRM_ERROR("Cannot map mmio region\n"); > + return -ENOMEM; > + } > + > + addr = pci_resource_start(pdev, 0); > + size = MB(16); > + > + hidev->fb_map = ioremap(addr, size); > + if (!hidev->fb_map) { > + DRM_ERROR("Cannot map framebuffer\n"); > + return -ENOMEM; > + } > + hidev->fb_base = addr; > + hidev->fb_size = size; > + > + return 0; > +} > + > +static void hibmc_hw_fini(struct hibmc_drm_device *hidev) > +{ > + if (hidev->mmio) > + iounmap(hidev->mmio); > + if (hidev->fb_map) > + iounmap(hidev->fb_map); > +} > + > +static int hibmc_hw_init(struct hibmc_drm_device *hidev) > +{ > + int ret; > + > + ret = hibmc_hw_map(hidev); > + if (ret) > + return ret; > + > + hibmc_hw_config(hidev); > + > + return 0; > +} > + > +static int hibmc_unload(struct drm_device *dev) > +{ > + struct hibmc_drm_device *hidev = dev->dev_private; > + > + hibmc_hw_fini(hidev); > + dev->dev_private = NULL; > + return 0; > +} > + > +static int hibmc_load(struct drm_device *dev, unsigned long flags) > +{ > + struct hibmc_drm_device *hidev; > + int ret; > + > + hidev = devm_kzalloc(dev->dev, sizeof(*hidev), GFP_KERNEL); > + if (!hidev) > + return -ENOMEM; > + dev->dev_private = hidev; > + hidev->dev = dev; > + > + ret = hibmc_hw_init(hidev); > + if (ret) > + goto err; > + > + > + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); > + if (ret) { > + DRM_ERROR("failed to initialize vblank.\n"); > + return ret; > + } > + /* reset all the states of crtc/plane/encoder/connector */ > + drm_mode_config_reset(dev); > + > + return 0; > + > +err: > + hibmc_unload(dev); > + DRM_ERROR("failed to initialize drm driver.\n"); > + return ret; > +} > + > + > +static int hibmc_pci_probe(struct pci_dev *pdev, > + const struct pci_device_id *ent) > +{ > + struct drm_device *dev; > + int ret; > + > + dev = drm_dev_alloc(&hibmc_driver, &pdev->dev); > + if (!dev) > + return -ENOMEM; > + > + dev->pdev = pdev; > + pci_set_drvdata(pdev, dev); > + > + ret = pci_enable_device(pdev); > + if (ret) > + goto err_free; > + > + ret = hibmc_load(dev, 0); > + if (ret) > + goto err_disable; > + > + ret = drm_dev_register(dev, 0); > + if (ret) > + goto err_unload; > + > + return 0; > + > +err_unload: > + hibmc_unload(dev); > +err_disable: > + pci_disable_device(pdev); > +err_free: > + drm_dev_unref(dev); > + > + return ret; > +} > + > +static void hibmc_pci_remove(struct pci_dev *pdev) > +{ > + struct drm_device *dev = pci_get_drvdata(pdev); > + > + drm_dev_unregister(dev); > + hibmc_unload(dev); > + drm_dev_unref(dev); > +} > + > +static struct pci_device_id hibmc_pci_table[] = { > + {0x19e5, 0x1711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, > + {0,} > +}; > + > +static struct pci_driver hibmc_pci_driver = { > + .name = "hibmc-drm", > + .id_table = hibmc_pci_table, > + .probe = hibmc_pci_probe, > + .remove = hibmc_pci_remove, > + .driver.pm = &hibmc_pm_ops, > +}; > + > +static int __init hibmc_init(void) > +{ > + return pci_register_driver(&hibmc_pci_driver); > +} > + > +static void __exit hibmc_exit(void) > +{ > + return pci_unregister_driver(&hibmc_pci_driver); > +} > + > +module_init(hibmc_init); > +module_exit(hibmc_exit); > + > +MODULE_DEVICE_TABLE(pci, hibmc_pci_table); > +MODULE_AUTHOR("RongrongZou "); > +MODULE_DESCRIPTION("DRM Driver for Hisilicon Hibmc"); > +MODULE_LICENSE("GPL v2"); > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > new file mode 100644 > index 0000000..a072ea9 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -0,0 +1,39 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_DRV_H > +#define HIBMC_DRM_DRV_H > + > +#include > +#include > +#include > + > +struct hibmc_drm_device { > + /* hw */ > + void __iomem *mmio; > + void __iomem *fb_map; > + unsigned long fb_base; > + unsigned long fb_size; > + > + /* drm */ > + struct drm_device *dev; > + bool mode_config_initialized; > +}; > + > + > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > new file mode 100644 > index 0000000..673be10 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.c > @@ -0,0 +1,91 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 "hibmc_drm_drv.h" > +#include "hibmc_drm_regs.h" > + > +/* > + * It can operate in one of three modes: 0, 1 or Sleep. > + */ > +void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode) > +{ > + unsigned int control_value = 0; > + void __iomem *mmio = hidev->mmio; > + > + if (power_mode > HIBMC_PW_MODE_CTL_MODE_SLEEP) > + return; > + > + control_value = readl(mmio + HIBMC_POWER_MODE_CTRL); > + control_value &= ~HIBMC_PW_MODE_CTL_MODE_MASK; > + > + control_value |= HIBMC_PW_MODE_CTL_MODE(power_mode) & > + HIBMC_PW_MODE_CTL_MODE_MASK; > + > + > + /* Set up other fields in Power Control Register */ > + if (power_mode == HIBMC_PW_MODE_CTL_MODE_SLEEP) { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(0) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + } else { > + control_value &= ~HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + control_value |= HIBMC_PW_MODE_CTL_OSC_INPUT(1) & > + HIBMC_PW_MODE_CTL_OSC_INPUT_MASK; > + > + } > + /* Program new power mode. */ > + writel(control_value, mmio + HIBMC_POWER_MODE_CTRL); > +} > + > +static unsigned int hibmc_get_power_mode(struct hibmc_drm_device *hidev) > +{ > + void __iomem *mmio = hidev->mmio; > + > + return (readl(mmio + HIBMC_POWER_MODE_CTRL)& > + HIBMC_PW_MODE_CTL_MODE_MASK) >> HIBMC_PW_MODE_CTL_MODE_SHIFT; > +} > + > +void hibmc_set_current_gate(struct hibmc_drm_device *hidev, unsigned int gate) > +{ > + unsigned int gate_reg; > + unsigned int mode; > + void __iomem *mmio = hidev->mmio; > + > + /* Get current power mode. */ > + mode = hibmc_get_power_mode(hidev); > + > + switch (mode) { > + case HIBMC_PW_MODE_CTL_MODE_MODE0: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + > + case HIBMC_PW_MODE_CTL_MODE_MODE1: > + gate_reg = HIBMC_MODE1_GATE; > + break; > + > + default: > + gate_reg = HIBMC_MODE0_GATE; > + break; > + } > + writel(gate, mmio + gate_reg); > +} > + > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > new file mode 100644 > index 0000000..39f7a17 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_power.h > @@ -0,0 +1,28 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_POWER_H > +#define HIBMC_DRM_POWER_H > + > +#include "hibmc_drm_drv.h" > + > +extern void hibmc_set_power_mode(struct hibmc_drm_device *hidev, > + unsigned int power_mode); > +extern void hibmc_set_current_gate(struct hibmc_drm_device *hidev, > + unsigned int gate); > +#endif > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > new file mode 100644 > index 0000000..4966c42 > --- /dev/null > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h > @@ -0,0 +1,214 @@ > +/* Hisilicon Hibmc SoC drm driver > + * > + * Based on the bochs drm driver. > + * > + * Copyright (c) 2016 Huawei Limited. > + * > + * Author: > + * Rongrong Zou > + * Rongrong Zou > + * Jianhua Li > + * > + * 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 HIBMC_DRM_HW_H > +#define HIBMC_DRM_HW_H > + > +#define OFF 0 > +#define ON 1 > +#define DISABLE 0 > +#define ENABLE 1 > + > + > + > +/* register definition */ > +#define HIBMC_MISC_CTRL 0x4 > + > +#define HIBMC_MSCCTL_LOCALMEM_RESET(x) ((x) << 6) > +#define HIBMC_MSCCTL_LOCALMEM_RESET_MASK 0x40 > + > +#define RESET 0 > +#define NORMAL 1 > + > +#define HIBMC_CURRENT_GATE 0x000040 > +#define HIBMC_CURR_GATE_DISPLAY(x) ((x) << 2) > +#define HIBMC_CURR_GATE_DISPLAY_MASK 0x4 > + > +#define HIBMC_CURR_GATE_LOCALMEM(x) ((x) << 1) > +#define HIBMC_CURR_GATE_LOCALMEM_MASK 0x2 > + > +#define HIBMC_MODE0_GATE 0x000044 > +#define HIBMC_MODE1_GATE 0x000048 > +#define HIBMC_POWER_MODE_CTRL 0x00004C > + > +#define HIBMC_PW_MODE_CTL_OSC_INPUT(x) ((x) << 3) > +#define HIBMC_PW_MODE_CTL_OSC_INPUT_MASK 0x8 > + > +#define HIBMC_PW_MODE_CTL_MODE(x) ((x) << 0) > +#define HIBMC_PW_MODE_CTL_MODE_MASK 0x03 > +#define HIBMC_PW_MODE_CTL_MODE_SHIFT 0 > + > + > +#define HIBMC_PW_MODE_CTL_MODE_MODE0 0 > +#define HIBMC_PW_MODE_CTL_MODE_MODE1 1 > +#define HIBMC_PW_MODE_CTL_MODE_SLEEP 2 > + > +#define HIBMC_PANEL_PLL_CTRL 0x00005C > +#define HIBMC_CRT_PLL_CTRL 0x000060 > + > +#define HIBMC_PLL_CTRL_BYPASS(x) ((x) << 18) > +#define HIBMC_PLL_CTRL_BYPASS_MASK 0x40000 > + > +#define HIBMC_PLL_CTRL_POWER(x) ((x) << 17) > +#define HIBMC_PLL_CTRL_POWER_MASK 0x20000 > + > +#define HIBMC_PLL_CTRL_INPUT(x) ((x) << 16) > +#define HIBMC_PLL_CTRL_INPUT_MASK 0x10000 > + > +#define OSC 0 > +#define TESTCLK 1 > + > +#define HIBMC_PLL_CTRL_POD(x) ((x) << 14) > +#define HIBMC_PLL_CTRL_POD_MASK 0xC000 > + > +#define HIBMC_PLL_CTRL_OD(x) ((x) << 12) > +#define HIBMC_PLL_CTRL_OD_MASK 0x3000 > + > +#define HIBMC_PLL_CTRL_N(x) ((x) << 8) > +#define HIBMC_PLL_CTRL_N_MASK 0xF00 > + > +#define HIBMC_PLL_CTRL_M(x) ((x) << 0) > +#define HIBMC_PLL_CTRL_M_MASK 0xFF > + > + > +#define HIBMC_CRT_DISP_CTL 0x80200 > + > +#define HIBMC_CRT_DISP_CTL_CRTSELECT(x) ((x) << 25) > +#define HIBMC_CRT_DISP_CTL_CRTSELECT_MASK 0x2000000 > + > +#define CRTSELECT_VGA 0 > +#define CRTSELECT_CRT 1 > + > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE(x) ((x) << 14) > +#define HIBMC_CRT_DISP_CTL_CLOCK_PHASE_MASK 0x4000 > + > +#define PHASE_ACTIVE_HIGH 0 > +#define PHASE_ACTIVE_LOW 1 > + > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE(x) ((x) << 13) > +#define HIBMC_CRT_DISP_CTL_VSYNC_PHASE_MASK 0x2000 > + > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE(x) ((x) << 12) > +#define HIBMC_CRT_DISP_CTL_HSYNC_PHASE_MASK 0x1000 > + > +#define HIBMC_CRT_DISP_CTL_TIMING(x) ((x) << 8) > +#define HIBMC_CRT_DISP_CTL_TIMING_MASK 0x100 > + > + > +#define HIBMC_CRT_DISP_CTL_PLANE(x) ((x) << 2) > +#define HIBMC_CRT_DISP_CTL_PLANE_MASK 4 > + > +#define HIBMC_CRT_DISP_CTL_FORMAT(x) ((x) << 0) > +#define HIBMC_CRT_DISP_CTL_FORMAT_MASK 0x03 > + > + > + > +#define HIBMC_CRT_FB_ADDRESS 0x080204 > + > +#define HIBMC_CRT_FB_WIDTH 0x080208 > +#define HIBMC_CRT_FB_WIDTH_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_FB_WIDTH_WIDTH_MASK 0x3FFF0000 > +#define HIBMC_CRT_FB_WIDTH_OFFS(x) ((x) << 0) > +#define HIBMC_CRT_FB_WIDTH_OFFS_MASK 0x3FFF > + > + > +#define HIBMC_CRT_HORZ_TOTAL 0x08020C > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_TOTAL_TOTAL_MASK 0xFFF0000 > + > + > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_TOTAL_DISPLAY_END_MASK 0xFFF > + > +#define HIBMC_CRT_HORZ_SYNC 0x080210 > +#define HIBMC_CRT_HORZ_SYNC_WIDTH(x) ((x) << 16) > +#define HIBMC_CRT_HORZ_SYNC_WIDTH_MASK 0xFF0000 > + > +#define HIBMC_CRT_HORZ_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_HORZ_SYNC_START_MASK 0xFFF > + > +#define HIBMC_CRT_VERT_TOTAL 0x080214 > +#define HIBMC_CRT_VERT_TOTAL_TOTAL(x) ((x) << 16) > +#define HIBMC_CRT_VERT_TOTAL_TOTAL_MASK 0x7FFF0000 > + > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END(x) ((x) << 0) > +#define HIBMC_CRT_VERT_TOTAL_DISPLAY_END_MASK 0x7FF > + > +#define HIBMC_CRT_VERT_SYNC 0x080218 > +#define HIBMC_CRT_VERT_SYNC_HEIGHT(x) ((x) << 16) > +#define HIBMC_CRT_VERT_SYNC_HEIGHT_MASK 0x3F0000 > + > + > +#define HIBMC_CRT_VERT_SYNC_START(x) ((x) << 0) > +#define HIBMC_CRT_VERT_SYNC_START_MASK 0x7FF > + > +/* Auto Centering */ > +#define HIBMC_CRT_AUTO_CENTERING_TL 0x080280 > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_TL_TOP_MSK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_TL_LEFT_MSK 0x7FF > + > +#define HIBMC_CRT_AUTO_CENTERING_BR 0x080284 > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM(x) ((x) << 16) > +#define HIBMC_CRT_AUTO_CENTERING_BR_BOTTOM_MASK 0x7FF0000 > + > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT(x) ((x) << 0) > +#define HIBMC_CRT_AUTO_CENTERING_BR_RIGHT_MASK 0x7FF > + > +/* register to control panel output */ > +#define DISPLAY_CONTROL_HISILE 0x80288 > + > +/* register and values for PLL control */ > +#define CRT_PLL1_HS 0x802a8 > +#define CRT_PLL1_HS_25MHZ 0x23d40f02 > +#define CRT_PLL1_HS_40MHZ 0x23940801 > +#define CRT_PLL1_HS_65MHZ 0x23940d01 > +#define CRT_PLL1_HS_78MHZ 0x23540F82 > +#define CRT_PLL1_HS_74MHZ 0x23941dc2 > +#define CRT_PLL1_HS_80MHZ 0x23941001 > +#define CRT_PLL1_HS_80MHZ_1152 0x23540fc2 > +#define CRT_PLL1_HS_108MHZ 0x23b41b01 > +#define CRT_PLL1_HS_162MHZ 0x23480681 > +#define CRT_PLL1_HS_148MHZ 0x23541dc2 > +#define CRT_PLL1_HS_193MHZ 0x234807c1 > + > +#define CRT_PLL2_HS 0x802ac > +#define CRT_PLL2_HS_25MHZ 0x206B851E > +#define CRT_PLL2_HS_40MHZ 0x30000000 > +#define CRT_PLL2_HS_65MHZ 0x40000000 > +#define CRT_PLL2_HS_78MHZ 0x50E147AE > +#define CRT_PLL2_HS_74MHZ 0x602B6AE7 > +#define CRT_PLL2_HS_80MHZ 0x70000000 > +#define CRT_PLL2_HS_108MHZ 0x80000000 > +#define CRT_PLL2_HS_162MHZ 0xA0000000 > +#define CRT_PLL2_HS_148MHZ 0xB0CCCCCD > +#define CRT_PLL2_HS_193MHZ 0xC0872B02 > + > +/* Global macros */ > +#define RGB(r, g, b) \ > +( \ > + (unsigned long)(((r) << 16) | ((g) << 8) | (b)) \ > +) > + > +#define PADDING(align, data) (((data) + (align) - 1) & (~((align) - 1))) > + > +#define MB(x) ((x) << 20) > + > +#endif > -- > 1.9.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch