From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752103AbcF2JPR (ORCPT ); Wed, 29 Jun 2016 05:15:17 -0400 Received: from lucky1.263xmail.com ([211.157.147.135]:53966 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751806AbcF2JPN (ORCPT ); Wed, 29 Jun 2016 05:15:13 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: yzq@rock-chips.com X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: <263ee747c4b70fef6f1eca340999512c> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 From: Yakir Yang To: Mark Yao , Inki Dae , Jingoo Han , Heiko Stuebner Cc: Javier Martinez Canillas , =?UTF-8?q?St=C3=A9phane=20Marchesin?= , Sean Paul , Tomasz Figa , David Airlie , daniel.vetter@ffwll.ch, Thierry Reding , dianders@chromium.org, Krzysztof Kozlowski , emil.l.velikov@gmail.com, Dan Carpenter , Yakir Yang , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org Subject: [PATCH v4 01/11] drm/rockchip: analogix_dp: split the lcdc select setting into device data Date: Wed, 29 Jun 2016 17:15:01 +0800 Message-Id: <1467191701-17134-1-git-send-email-ykk@rock-chips.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467191657-16941-1-git-send-email-ykk@rock-chips.com> References: <1467191657-16941-1-git-send-email-ykk@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org eDP controller need to declare which vop provide the video source, and it's defined in GRF registers. But different chips have different GRF register address, so we need to create a device data to declare the GRF messages for each chips. Signed-off-by: Yakir Yang Acked-by: Mark Yao Reviewed-by: Tomasz Figa --- Changes in v4: - Assigned the GRF setting magic numbers to a #define that corresponds to a TRM name. (Sean & Heiko) - Pass the chip type to device type directly. (Sean) - Add reviewed flag from Tomasz. Changes in v3: - Write a kerneldoc-style comment explaining the chips data fields (Tomasz, reviewed at Google Gerrit) [https://chromium-review.googlesource.com/#/c/346313/10/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c@39] - Drop the '.lcdcsel_mask' number in chips data field (Tomasz, reviewed at Google Gerrit) [https://chromium-review.googlesource.com/#/c/346313/10/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c@382] - Add acked flag from Mark. drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 49 ++++++++++++++++++++----- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index c120172..0a30931 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -33,13 +34,26 @@ #include "rockchip_drm_drv.h" #include "rockchip_drm_vop.h" +#define RK3288_GRF_SOC_CON6 0x25c +#define RK3288_EDP_LCDC_SEL BIT(5) + +#define HIWORD_UPDATE(val, mask) (val | (mask) << 16) + #define to_dp(nm) container_of(nm, struct rockchip_dp_device, nm) -/* dp grf register offset */ -#define GRF_SOC_CON6 0x025c -#define GRF_EDP_LCD_SEL_MASK BIT(5) -#define GRF_EDP_SEL_VOP_LIT BIT(5) -#define GRF_EDP_SEL_VOP_BIG 0 +/** + * struct rockchip_dp_chip_data - splite the grf setting of kind of chips + * @lcdsel_grf_reg: grf register offset of lcdc select + * @lcdsel_big: reg value of selecting vop big for eDP + * @lcdsel_lit: reg value of selecting vop little for eDP + * @chip_type: specific chip type + */ +struct rockchip_dp_chip_data { + u32 lcdsel_grf_reg; + u32 lcdsel_big; + u32 lcdsel_lit; + u32 chip_type; +}; struct rockchip_dp_device { struct drm_device *drm_dev; @@ -51,6 +65,8 @@ struct rockchip_dp_device { struct regmap *grf; struct reset_control *rst; + const struct rockchip_dp_chip_data *data; + struct analogix_dp_plat_data plat_data; }; @@ -119,13 +135,13 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder) return; if (ret) - val = GRF_EDP_SEL_VOP_LIT | (GRF_EDP_LCD_SEL_MASK << 16); + val = dp->data->lcdsel_lit; else - val = GRF_EDP_SEL_VOP_BIG | (GRF_EDP_LCD_SEL_MASK << 16); + val = dp->data->lcdsel_big; dev_dbg(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); - ret = regmap_write(dp->grf, GRF_SOC_CON6, val); + ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); if (ret != 0) { dev_err(dp->dev, "Could not write to GRF: %d\n", ret); return; @@ -246,6 +262,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, void *data) { struct rockchip_dp_device *dp = dev_get_drvdata(dev); + const struct rockchip_dp_chip_data *dp_data; struct drm_device *drm_dev = data; int ret; @@ -256,10 +273,15 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, */ dev_set_drvdata(dev, NULL); + dp_data = of_device_get_match_data(dev); + if (!dp_data) + return -ENODEV; + ret = rockchip_dp_init(dp); if (ret < 0) return ret; + dp->data = dp_data; dp->drm_dev = drm_dev; ret = rockchip_dp_drm_create_encoder(dp); @@ -270,7 +292,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, dp->plat_data.encoder = &dp->encoder; - dp->plat_data.dev_type = RK3288_DP; + dp->plat_data.dev_type = dp->data->chip_type; dp->plat_data.power_on = rockchip_dp_poweron; dp->plat_data.power_off = rockchip_dp_powerdown; @@ -356,8 +378,15 @@ static const struct dev_pm_ops rockchip_dp_pm_ops = { #endif }; +static const struct rockchip_dp_chip_data rk3288_dp = { + .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, + .lcdsel_big = HIWORD_UPDATE(0, RK3288_EDP_LCDC_SEL), + .lcdsel_lit = HIWORD_UPDATE(RK3288_EDP_LCDC_SEL, RK3288_EDP_LCDC_SEL), + .chip_type = RK3288_DP, +}; + static const struct of_device_id rockchip_dp_dt_ids[] = { - {.compatible = "rockchip,rk3288-dp",}, + {.compatible = "rockchip,rk3288-dp", .data = &rk3288_dp }, {} }; MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids); -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: [PATCH v4 01/11] drm/rockchip: analogix_dp: split the lcdc select setting into device data Date: Wed, 29 Jun 2016 17:15:01 +0800 Message-ID: <1467191701-17134-1-git-send-email-ykk@rock-chips.com> References: <1467191657-16941-1-git-send-email-ykk@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1467191657-16941-1-git-send-email-ykk@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao , Inki Dae , Jingoo Han , Heiko Stuebner Cc: Krzysztof Kozlowski , linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, daniel.vetter@ffwll.ch, emil.l.velikov@gmail.com, dianders@chromium.org, dri-devel@lists.freedesktop.org, Tomasz Figa , Javier Martinez Canillas , =?UTF-8?q?St=C3=A9phane=20Marchesin?= , Thierry Reding , Dan Carpenter List-Id: linux-samsung-soc@vger.kernel.org ZURQIGNvbnRyb2xsZXIgbmVlZCB0byBkZWNsYXJlIHdoaWNoIHZvcCBwcm92aWRlIHRoZSB2aWRl byBzb3VyY2UsCmFuZCBpdCdzIGRlZmluZWQgaW4gR1JGIHJlZ2lzdGVycy4KCkJ1dCBkaWZmZXJl bnQgY2hpcHMgaGF2ZSBkaWZmZXJlbnQgR1JGIHJlZ2lzdGVyIGFkZHJlc3MsIHNvIHdlIG5lZWQg dG8KY3JlYXRlIGEgZGV2aWNlIGRhdGEgdG8gZGVjbGFyZSB0aGUgR1JGIG1lc3NhZ2VzIGZvciBl YWNoIGNoaXBzLgoKU2lnbmVkLW9mZi1ieTogWWFraXIgWWFuZyA8eWtrQHJvY2stY2hpcHMuY29t PgpBY2tlZC1ieTogTWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMuY29tPgpSZXZpZXdlZC1i eTogVG9tYXN6IEZpZ2EgPHRmaWdhQGNocm9taXVtLm9yZz4KLS0tCkNoYW5nZXMgaW4gdjQ6Ci0g QXNzaWduZWQgdGhlIEdSRiBzZXR0aW5nIG1hZ2ljIG51bWJlcnMgdG8gYSAjZGVmaW5lIHRoYXQg Y29ycmVzcG9uZHMgdG8KICBhIFRSTSBuYW1lLiAoU2VhbiAmIEhlaWtvKQotIFBhc3MgdGhlIGNo aXAgdHlwZSB0byBkZXZpY2UgdHlwZSBkaXJlY3RseS4gKFNlYW4pCi0gQWRkIHJldmlld2VkIGZs YWcgZnJvbSBUb21hc3ouCgpDaGFuZ2VzIGluIHYzOgotIFdyaXRlIGEga2VybmVsZG9jLXN0eWxl IGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgY2hpcHMgZGF0YSBmaWVsZHMgKFRvbWFzeiwgcmV2aWV3 ZWQgYXQgR29vZ2xlIEdlcnJpdCkKICAgIFtodHRwczovL2Nocm9taXVtLXJldmlldy5nb29nbGVz b3VyY2UuY29tLyMvYy8zNDYzMTMvMTAvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2FuYWxvZ2l4 X2RwLXJvY2tjaGlwLmNAMzldCi0gRHJvcCB0aGUgJy5sY2Rjc2VsX21hc2snIG51bWJlciBpbiBj aGlwcyBkYXRhIGZpZWxkIChUb21hc3osIHJldmlld2VkIGF0IEdvb2dsZSBHZXJyaXQpCiAgICBb aHR0cHM6Ly9jaHJvbWl1bS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS8jL2MvMzQ2MzEzLzEwL2Ry aXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9hbmFsb2dpeF9kcC1yb2NrY2hpcC5jQDM4Ml0KLSBBZGQg YWNrZWQgZmxhZyBmcm9tIE1hcmsuCgogZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2FuYWxvZ2l4 X2RwLXJvY2tjaGlwLmMgfCA0OSArKysrKysrKysrKysrKysrKysrKy0tLS0tCiAxIGZpbGUgY2hh bmdlZCwgMzkgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2FuYWxvZ2l4X2RwLXJvY2tjaGlwLmMgYi9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvYW5hbG9naXhfZHAtcm9ja2NoaXAuYwppbmRleCBjMTIwMTcyLi4wYTMw OTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvYW5hbG9naXhfZHAtcm9j a2NoaXAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvYW5hbG9naXhfZHAtcm9ja2No aXAuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAj aW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5o PgogI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+ CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KQEAgLTMzLDEzICszNCwyNiBAQAogI2luY2x1ZGUg InJvY2tjaGlwX2RybV9kcnYuaCIKICNpbmNsdWRlICJyb2NrY2hpcF9kcm1fdm9wLmgiCiAKKyNk ZWZpbmUgUkszMjg4X0dSRl9TT0NfQ09ONgkJMHgyNWMKKyNkZWZpbmUgUkszMjg4X0VEUF9MQ0RD X1NFTAkJQklUKDUpCisKKyNkZWZpbmUgSElXT1JEX1VQREFURSh2YWwsIG1hc2spCSh2YWwgfCAo bWFzaykgPDwgMTYpCisKICNkZWZpbmUgdG9fZHAobm0pCWNvbnRhaW5lcl9vZihubSwgc3RydWN0 IHJvY2tjaGlwX2RwX2RldmljZSwgbm0pCiAKLS8qIGRwIGdyZiByZWdpc3RlciBvZmZzZXQgKi8K LSNkZWZpbmUgR1JGX1NPQ19DT042ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1Ywot I2RlZmluZSBHUkZfRURQX0xDRF9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgQklUKDUpCi0j ZGVmaW5lIEdSRl9FRFBfU0VMX1ZPUF9MSVQgICAgICAgICAgICAgICAgICAgICBCSVQoNSkKLSNk ZWZpbmUgR1JGX0VEUF9TRUxfVk9QX0JJRyAgICAgICAgICAgICAgICAgICAgIDAKKy8qKgorICog c3RydWN0IHJvY2tjaGlwX2RwX2NoaXBfZGF0YSAtIHNwbGl0ZSB0aGUgZ3JmIHNldHRpbmcgb2Yg a2luZCBvZiBjaGlwcworICogQGxjZHNlbF9ncmZfcmVnOiBncmYgcmVnaXN0ZXIgb2Zmc2V0IG9m IGxjZGMgc2VsZWN0CisgKiBAbGNkc2VsX2JpZzogcmVnIHZhbHVlIG9mIHNlbGVjdGluZyB2b3Ag YmlnIGZvciBlRFAKKyAqIEBsY2RzZWxfbGl0OiByZWcgdmFsdWUgb2Ygc2VsZWN0aW5nIHZvcCBs aXR0bGUgZm9yIGVEUAorICogQGNoaXBfdHlwZTogc3BlY2lmaWMgY2hpcCB0eXBlCisgKi8KK3N0 cnVjdCByb2NrY2hpcF9kcF9jaGlwX2RhdGEgeworCXUzMglsY2RzZWxfZ3JmX3JlZzsKKwl1MzIJ bGNkc2VsX2JpZzsKKwl1MzIJbGNkc2VsX2xpdDsKKwl1MzIJY2hpcF90eXBlOworfTsKIAogc3Ry dWN0IHJvY2tjaGlwX2RwX2RldmljZSB7CiAJc3RydWN0IGRybV9kZXZpY2UgICAgICAgICpkcm1f ZGV2OwpAQCAtNTEsNiArNjUsOCBAQCBzdHJ1Y3Qgcm9ja2NoaXBfZHBfZGV2aWNlIHsKIAlzdHJ1 Y3QgcmVnbWFwICAgICAgICAgICAgKmdyZjsKIAlzdHJ1Y3QgcmVzZXRfY29udHJvbCAgICAgKnJz dDsKIAorCWNvbnN0IHN0cnVjdCByb2NrY2hpcF9kcF9jaGlwX2RhdGEgKmRhdGE7CisKIAlzdHJ1 Y3QgYW5hbG9naXhfZHBfcGxhdF9kYXRhIHBsYXRfZGF0YTsKIH07CiAKQEAgLTExOSwxMyArMTM1 LDEzIEBAIHN0YXRpYyB2b2lkIHJvY2tjaGlwX2RwX2RybV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3Qg ZHJtX2VuY29kZXIgKmVuY29kZXIpCiAJCXJldHVybjsKIAogCWlmIChyZXQpCi0JCXZhbCA9IEdS Rl9FRFBfU0VMX1ZPUF9MSVQgfCAoR1JGX0VEUF9MQ0RfU0VMX01BU0sgPDwgMTYpOworCQl2YWwg PSBkcC0+ZGF0YS0+bGNkc2VsX2xpdDsKIAllbHNlCi0JCXZhbCA9IEdSRl9FRFBfU0VMX1ZPUF9C SUcgfCAoR1JGX0VEUF9MQ0RfU0VMX01BU0sgPDwgMTYpOworCQl2YWwgPSBkcC0+ZGF0YS0+bGNk c2VsX2JpZzsKIAogCWRldl9kYmcoZHAtPmRldiwgInZvcCAlcyBvdXRwdXQgdG8gZHBcbiIsIChy ZXQpID8gIkxJVCIgOiAiQklHIik7CiAKLQlyZXQgPSByZWdtYXBfd3JpdGUoZHAtPmdyZiwgR1JG X1NPQ19DT042LCB2YWwpOworCXJldCA9IHJlZ21hcF93cml0ZShkcC0+Z3JmLCBkcC0+ZGF0YS0+ bGNkc2VsX2dyZl9yZWcsIHZhbCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoZHAtPmRl diwgIkNvdWxkIG5vdCB3cml0ZSB0byBHUkY6ICVkXG4iLCByZXQpOwogCQlyZXR1cm47CkBAIC0y NDYsNiArMjYyLDcgQEAgc3RhdGljIGludCByb2NrY2hpcF9kcF9iaW5kKHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAogCQkJICAgIHZvaWQgKmRhdGEpCiB7CiAJc3Ry dWN0IHJvY2tjaGlwX2RwX2RldmljZSAqZHAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25z dCBzdHJ1Y3Qgcm9ja2NoaXBfZHBfY2hpcF9kYXRhICpkcF9kYXRhOwogCXN0cnVjdCBkcm1fZGV2 aWNlICpkcm1fZGV2ID0gZGF0YTsKIAlpbnQgcmV0OwogCkBAIC0yNTYsMTAgKzI3MywxNSBAQCBz dGF0aWMgaW50IHJvY2tjaGlwX2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2 aWNlICptYXN0ZXIsCiAJICovCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKKwlkcF9k YXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CisJaWYgKCFkcF9kYXRhKQorCQly ZXR1cm4gLUVOT0RFVjsKKwogCXJldCA9IHJvY2tjaGlwX2RwX2luaXQoZHApOwogCWlmIChyZXQg PCAwKQogCQlyZXR1cm4gcmV0OwogCisJZHAtPmRhdGEgPSBkcF9kYXRhOwogCWRwLT5kcm1fZGV2 ID0gZHJtX2RldjsKIAogCXJldCA9IHJvY2tjaGlwX2RwX2RybV9jcmVhdGVfZW5jb2RlcihkcCk7 CkBAIC0yNzAsNyArMjkyLDcgQEAgc3RhdGljIGludCByb2NrY2hpcF9kcF9iaW5kKHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAogCiAJZHAtPnBsYXRfZGF0YS5lbmNv ZGVyID0gJmRwLT5lbmNvZGVyOwogCi0JZHAtPnBsYXRfZGF0YS5kZXZfdHlwZSA9IFJLMzI4OF9E UDsKKwlkcC0+cGxhdF9kYXRhLmRldl90eXBlID0gZHAtPmRhdGEtPmNoaXBfdHlwZTsKIAlkcC0+ cGxhdF9kYXRhLnBvd2VyX29uID0gcm9ja2NoaXBfZHBfcG93ZXJvbjsKIAlkcC0+cGxhdF9kYXRh LnBvd2VyX29mZiA9IHJvY2tjaGlwX2RwX3Bvd2VyZG93bjsKIApAQCAtMzU2LDggKzM3OCwxNSBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcm9ja2NoaXBfZHBfcG1fb3BzID0gewog I2VuZGlmCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX2RwX2NoaXBfZGF0YSBy azMyODhfZHAgPSB7CisJLmxjZHNlbF9ncmZfcmVnID0gUkszMjg4X0dSRl9TT0NfQ09ONiwKKwku bGNkc2VsX2JpZyA9IEhJV09SRF9VUERBVEUoMCwgUkszMjg4X0VEUF9MQ0RDX1NFTCksCisJLmxj ZHNlbF9saXQgPSBISVdPUkRfVVBEQVRFKFJLMzI4OF9FRFBfTENEQ19TRUwsIFJLMzI4OF9FRFBf TENEQ19TRUwpLAorCS5jaGlwX3R5cGUgPSBSSzMyODhfRFAsCit9OworCiBzdGF0aWMgY29uc3Qg c3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9kcF9kdF9pZHNbXSA9IHsKLQl7LmNvbXBhdGli bGUgPSAicm9ja2NoaXAscmszMjg4LWRwIix9LAorCXsuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxy azMyODgtZHAiLCAuZGF0YSA9ICZyazMyODhfZHAgfSwKIAl7fQogfTsKIE1PRFVMRV9ERVZJQ0Vf VEFCTEUob2YsIHJvY2tjaGlwX2RwX2R0X2lkcyk7Ci0tIAoxLjkuMQoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QK ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=