From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark yao Subject: Re: [PATCH 1/2] drm/rockchip: vop use is_enabled instead of dpms mode Date: Thu, 22 Jan 2015 16:56:09 +0800 Message-ID: <54C0BB29.3050104@rock-chips.com> References: <1421910333-5576-1-git-send-email-mark.yao@rock-chips.com> <1421910333-5576-2-git-send-email-mark.yao@rock-chips.com> <20150122073334.GU10113@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from sg-smtp01.263.net (sg-smtp01.263.net [54.255.195.220]) by gabe.freedesktop.org (Postfix) with ESMTP id BB6716E7DD for ; Thu, 22 Jan 2015 01:06:43 -0800 (PST) In-Reply-To: <20150122073334.GU10113@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: David Airlie , Rob Clark , Philipp Zabel , Daniel Kurtz , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org T24gMjAxNeW5tDAx5pyIMjLml6UgMTU6MzMsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gT24gVGh1 LCBKYW4gMjIsIDIwMTUgYXQgMDM6MDU6MzJQTSArMDgwMCwgTWFyayBZYW8gd3JvdGU6Cj4+IGRy bSBkcG1zIGhhdmUgbWFueSBwb3dlciBtb2RlczogT04sT0ZGLFNVU1BFTkQsU1RBTkRCWSwgZXRj Lgo+PiBidXQgdm9wIG9ubHkgaGF2ZSBlbmFibGUvZGlzYWJsZSBtb2RlLCBtYXliZSBjYXNlIHN1 Y2ggYnVnOgo+PiAgIC0tPiBEUk1fRFBNU19PTjogcG93ZXIgb24gdm9wCj4+ICAgLS0+IERSTV9E UE1TX1NVU1BFTkQ6IHBvd2VyIG9mZiB2b3AKPj4gICAtLT4gRFJNX0RQTVNfT0ZGOiBhbHJlYWR5 IHBvd2VyIG9mZiBhdCBTVVNQRU5ELCBjcmFzaAo+PiBzbyB1c2UgYSBib29sIHZhbCBpcyBtb3Jl IHN1aXRhYmxlLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBNYXJrIFlhbyA8bWFyay55YW9Acm9jay1j aGlwcy5jb20+Cj4gTG9uZyB0ZXJtIEkgaGlnaGx5IHN1Z2dlc3QgeW91IHN3aXRjaCB0byBhdG9t aWMsIHNpbmNlIHdpdGggYXRvbWljIGFsbCB0aGUKPiBsZWdhY3kgZHBtcyBtb2RlcyBhcmUgcmVt YXBwZWQgdG8gYSBzaW1wbGUgb24vb2ZmLiBBbHNvIHRoZSBuZXcgYXRvbWljCj4gaGVscGVycyBt YWtlIHN1cmUgdGhhdCB5b3VyIGJhY2tlbmQgaXNuJ3QgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBz byB5b3UKPiBjYW4gZGl0Y2ggYWxsIHlvdXIgaXNfZW5hYmxlZCB0cmFja2luZyB3aXRoIHRoYXQu Cj4gLURhbmllbApIaSBEYW5pZWwKaXMgdGhlcmUgc29tZSBkb2N1bWVudHMgdGVhY2ggbWUgaG93 IHRvIHN3aXRjaCB0byBhdG9taWMgZWFzaWx5PwpJIGZvdW5kIG1hbnkgb3RoZXIgZHJpdmVycyB3 aGljaCB1c2UgYXRvbWljIGFsc28gcmVtYXAgZHBtcyBtb2RlcyB0byAKc2ltcGxlIG9uL29mZiBh dCBpdHMgZHJpdmVyLAphbmQgSSBkb24ndCBrbm93IHdoZXJlIGF0b21pYyBoZWxwZXIgZG8gdGhl IHJlbWFwcGVkLCBjYW4geW91IGdpdmUgbWUgCnNvbWUgc3VnZ2VzdGlvbnM/CgotIE1hcmsuCj4+ IC0tLQo+PiAgIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMgfCAg IDM0ICsrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLQo+PiAgIDEgZmlsZSBjaGFuZ2VkLCAxOCBp bnNlcnRpb25zKCspLCAxNiBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4+IGluZGV4IDlhNWM1NzEuLmYyNzhjMDkgMTAwNjQ0 Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMKPj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3AuYwo+PiBAQCAt ODEsNyArODEsNyBAQCBzdHJ1Y3Qgdm9wIHsKPj4gICAJc3RydWN0IGRybV9jcnRjIGNydGM7Cj4+ ICAgCXN0cnVjdCBkZXZpY2UgKmRldjsKPj4gICAJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXY7 Cj4+IC0JdW5zaWduZWQgaW50IGRwbXM7Cj4+ICsJYm9vbCBpc19lbmFibGVkOwo+PiAgIAo+PiAg IAlpbnQgY29ubmVjdG9yX3R5cGU7Cj4+ICAgCWludCBjb25uZWN0b3Jfb3V0X21vZGU7Cj4+IEBA IC0zODcsNiArMzg3LDkgQEAgc3RhdGljIHZvaWQgdm9wX2VuYWJsZShzdHJ1Y3QgZHJtX2NydGMg KmNydGMpCj4+ICAgCXN0cnVjdCB2b3AgKnZvcCA9IHRvX3ZvcChjcnRjKTsKPj4gICAJaW50IHJl dDsKPj4gICAKPj4gKwlpZiAodm9wLT5pc19lbmFibGVkKQo+PiArCQlyZXR1cm47Cj4+ICsKPj4g ICAJcmV0ID0gY2xrX2VuYWJsZSh2b3AtPmhjbGspOwo+PiAgIAlpZiAocmV0IDwgMCkgewo+PiAg IAkJZGV2X2Vycih2b3AtPmRldiwgImZhaWxlZCB0byBlbmFibGUgaGNsayAtICVkXG4iLCByZXQp Owo+PiBAQCAtNDI3LDYgKzQzMCw4IEBAIHN0YXRpYyB2b2lkIHZvcF9lbmFibGUoc3RydWN0IGRy bV9jcnRjICpjcnRjKQo+PiAgIAo+PiAgIAlkcm1fdmJsYW5rX29uKHZvcC0+ZHJtX2Rldiwgdm9w LT5waXBlKTsKPj4gICAKPj4gKwl2b3AtPmlzX2VuYWJsZWQgPSBmYWxzZTsKPj4gKwo+PiAgIAly ZXR1cm47Cj4+ICAgCj4+ICAgZXJyX2Rpc2FibGVfYWNsazoKPj4gQEAgLTQ0MSw2ICs0NDYsOSBA QCBzdGF0aWMgdm9pZCB2b3BfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4+ICAgewo+ PiAgIAlzdHJ1Y3Qgdm9wICp2b3AgPSB0b192b3AoY3J0Yyk7Cj4+ICAgCj4+ICsJaWYgKHZvcC0+ aXNfZW5hYmxlZCkKPj4gKwkJcmV0dXJuOwo+PiArCj4+ICAgCWRybV92Ymxhbmtfb2ZmKGNydGMt PmRldiwgdm9wLT5waXBlKTsKPj4gICAKPj4gICAJZGlzYWJsZV9pcnEodm9wLT5pcnEpOwo+PiBA QCAtNDYzLDYgKzQ3MSw4IEBAIHN0YXRpYyB2b2lkIHZvcF9kaXNhYmxlKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKPj4gICAKPj4gICAJY2xrX2Rpc2FibGUodm9wLT5hY2xrKTsKPj4gICAJY2xrX2Rp c2FibGUodm9wLT5oY2xrKTsKPj4gKwo+PiArCXZvcC0+aXNfZW5hYmxlZCA9IGZhbHNlOwo+PiAg IH0KPj4gICAKPj4gICAvKgo+PiBAQCAtNzQyLDcgKzc1Miw3IEBAIHN0YXRpYyBpbnQgdm9wX2Ny dGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4+ICAgCXN0cnVjdCB2b3Ag KnZvcCA9IHRvX3ZvcChjcnRjKTsKPj4gICAJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gICAKPj4g LQlpZiAodm9wLT5kcG1zICE9IERSTV9NT0RFX0RQTVNfT04pCj4+ICsJaWYgKCF2b3AtPmlzX2Vu YWJsZWQpCj4+ICAgCQlyZXR1cm4gLUVQRVJNOwo+PiAgIAo+PiAgIAlzcGluX2xvY2tfaXJxc2F2 ZSgmdm9wLT5pcnFfbG9jaywgZmxhZ3MpOwo+PiBAQCAtNzU5LDggKzc2OSw5IEBAIHN0YXRpYyB2 b2lkIHZvcF9jcnRjX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPj4gICAJ c3RydWN0IHZvcCAqdm9wID0gdG9fdm9wKGNydGMpOwo+PiAgIAl1bnNpZ25lZCBsb25nIGZsYWdz Owo+PiAgIAo+PiAtCWlmICh2b3AtPmRwbXMgIT0gRFJNX01PREVfRFBNU19PTikKPj4gKwlpZiAo IXZvcC0+aXNfZW5hYmxlZCkKPj4gICAJCXJldHVybjsKPj4gKwo+PiAgIAlzcGluX2xvY2tfaXJx c2F2ZSgmdm9wLT5pcnFfbG9jaywgZmxhZ3MpOwo+PiAgIAl2b3BfbWFza193cml0ZSh2b3AsIElO VFJfQ1RSTDAsIEZTX0lOVFJfTUFTSywgRlNfSU5UUl9FTigwKSk7Cj4+ICAgCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnZvcC0+aXJxX2xvY2ssIGZsYWdzKTsKPj4gQEAgLTc3MywxNSArNzg0LDgg QEAgc3RhdGljIGNvbnN0IHN0cnVjdCByb2NrY2hpcF9jcnRjX2Z1bmNzIHByaXZhdGVfY3J0Y19m dW5jcyA9IHsKPj4gICAKPj4gICBzdGF0aWMgdm9pZCB2b3BfY3J0Y19kcG1zKHN0cnVjdCBkcm1f Y3J0YyAqY3J0YywgaW50IG1vZGUpCj4+ICAgewo+PiAtCXN0cnVjdCB2b3AgKnZvcCA9IHRvX3Zv cChjcnRjKTsKPj4gLQo+PiAgIAlEUk1fREVCVUdfS01TKCJjcnRjWyVkXSBtb2RlWyVkXVxuIiwg Y3J0Yy0+YmFzZS5pZCwgbW9kZSk7Cj4+ICAgCj4+IC0JaWYgKHZvcC0+ZHBtcyA9PSBtb2RlKSB7 Cj4+IC0JCURSTV9ERUJVR19LTVMoImRlc2lyZWQgZHBtcyBtb2RlIGlzIHNhbWUgYXMgcHJldmlv dXMgb25lLlxuIik7Cj4+IC0JCXJldHVybjsKPj4gLQl9Cj4+IC0KPj4gICAJc3dpdGNoIChtb2Rl KSB7Cj4+ICAgCWNhc2UgRFJNX01PREVfRFBNU19PTjoKPj4gICAJCXZvcF9lbmFibGUoY3J0Yyk7 Cj4+IEBAIC03OTUsOCArNzk5LDYgQEAgc3RhdGljIHZvaWQgdm9wX2NydGNfZHBtcyhzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQo+PiAgIAkJRFJNX0RFQlVHX0tNUygidW5zcGVjaWZp ZWQgbW9kZSAlZFxuIiwgbW9kZSk7Cj4+ICAgCQlicmVhazsKPj4gICAJfQo+PiAtCj4+IC0Jdm9w LT5kcG1zID0gbW9kZTsKPj4gICB9Cj4+ICAgCj4+ICAgc3RhdGljIHZvaWQgdm9wX2NydGNfcHJl cGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4+IEBAIC05MzQsOSArOTM2LDkgQEAgc3RhdGlj IGludCB2b3BfY3J0Y19wYWdlX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAo+PiAgIAlzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIgPSBjcnRjLT5wcmltYXJ5LT5mYjsKPj4gICAJaW50 IHJldDsKPj4gICAKPj4gLQkvKiB3aGVuIHRoZSBwYWdlIGZsaXAgaXMgcmVxdWVzdGVkLCBjcnRj J3MgZHBtcyBzaG91bGQgYmUgb24gKi8KPj4gLQlpZiAodm9wLT5kcG1zID4gRFJNX01PREVfRFBN U19PTikgewo+PiAtCQlEUk1fREVCVUcoImZhaWxlZCBwYWdlIGZsaXAgcmVxdWVzdCBhdCBkcG1z WyVkXS5cbiIsIHZvcC0+ZHBtcyk7Cj4+ICsJLyogd2hlbiB0aGUgcGFnZSBmbGlwIGlzIHJlcXVl c3RlZCwgY3J0YyBzaG91bGQgYmUgb24gKi8KPj4gKwlpZiAoIXZvcC0+aXNfZW5hYmxlZCkgewo+ PiArCQlEUk1fREVCVUcoInBhZ2UgZmxpcCByZXF1ZXN0IHJlamVjdGVkIGJlY2F1c2UgY3J0YyBp cyBvZmYuXG4iKTsKPj4gICAJCXJldHVybiAwOwo+PiAgIAl9Cj4+ICAgCj4+IEBAIC0xMzAyLDcg KzEzMDQsNyBAQCBzdGF0aWMgaW50IHZvcF9pbml0aWFsKHN0cnVjdCB2b3AgKnZvcCkKPj4gICAK Pj4gICAJY2xrX2Rpc2FibGUodm9wLT5oY2xrKTsKPj4gICAKPj4gLQl2b3AtPmRwbXMgPSBEUk1f TU9ERV9EUE1TX09GRjsKPj4gKwl2b3AtPmlzX2VuYWJsZWQgPSBmYWxzZTsKPj4gICAKPj4gICAJ cmV0dXJuIDA7Cj4+ICAgCj4+IC0tIAo+PiAxLjcuOS41Cj4+Cj4+CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752734AbbAVJGw (ORCPT ); Thu, 22 Jan 2015 04:06:52 -0500 Received: from sg-smtp01.263.net ([54.255.195.220]:37647 "EHLO sg-smtp01.263.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751609AbbAVJGm (ORCPT ); Thu, 22 Jan 2015 04:06:42 -0500 X-Greylist: delayed 610 seconds by postgrey-1.27 at vger.kernel.org; Thu, 22 Jan 2015 04:06:42 EST X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: airlied@linux.ie X-SENDER-IP: 107.152.154.32 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: <9dd4bcf2ae0059b098958952e60029d5> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <54C0BB29.3050104@rock-chips.com> Date: Thu, 22 Jan 2015 16:56:09 +0800 From: Mark yao User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: David Airlie , Rob Clark , Philipp Zabel , Daniel Kurtz , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org Subject: Re: [PATCH 1/2] drm/rockchip: vop use is_enabled instead of dpms mode References: <1421910333-5576-1-git-send-email-mark.yao@rock-chips.com> <1421910333-5576-2-git-send-email-mark.yao@rock-chips.com> <20150122073334.GU10113@phenom.ffwll.local> In-Reply-To: <20150122073334.GU10113@phenom.ffwll.local> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2015年01月22日 15:33, Daniel Vetter wrote: > On Thu, Jan 22, 2015 at 03:05:32PM +0800, Mark Yao wrote: >> drm dpms have many power modes: ON,OFF,SUSPEND,STANDBY, etc. >> but vop only have enable/disable mode, maybe case such bug: >> --> DRM_DPMS_ON: power on vop >> --> DRM_DPMS_SUSPEND: power off vop >> --> DRM_DPMS_OFF: already power off at SUSPEND, crash >> so use a bool val is more suitable. >> >> Signed-off-by: Mark Yao > Long term I highly suggest you switch to atomic, since with atomic all the > legacy dpms modes are remapped to a simple on/off. Also the new atomic > helpers make sure that your backend isn't called multiple times, so you > can ditch all your is_enabled tracking with that. > -Daniel Hi Daniel is there some documents teach me how to switch to atomic easily? I found many other drivers which use atomic also remap dpms modes to simple on/off at its driver, and I don't know where atomic helper do the remapped, can you give me some suggestions? - Mark. >> --- >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 34 ++++++++++++++------------- >> 1 file changed, 18 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> index 9a5c571..f278c09 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> @@ -81,7 +81,7 @@ struct vop { >> struct drm_crtc crtc; >> struct device *dev; >> struct drm_device *drm_dev; >> - unsigned int dpms; >> + bool is_enabled; >> >> int connector_type; >> int connector_out_mode; >> @@ -387,6 +387,9 @@ static void vop_enable(struct drm_crtc *crtc) >> struct vop *vop = to_vop(crtc); >> int ret; >> >> + if (vop->is_enabled) >> + return; >> + >> ret = clk_enable(vop->hclk); >> if (ret < 0) { >> dev_err(vop->dev, "failed to enable hclk - %d\n", ret); >> @@ -427,6 +430,8 @@ static void vop_enable(struct drm_crtc *crtc) >> >> drm_vblank_on(vop->drm_dev, vop->pipe); >> >> + vop->is_enabled = false; >> + >> return; >> >> err_disable_aclk: >> @@ -441,6 +446,9 @@ static void vop_disable(struct drm_crtc *crtc) >> { >> struct vop *vop = to_vop(crtc); >> >> + if (vop->is_enabled) >> + return; >> + >> drm_vblank_off(crtc->dev, vop->pipe); >> >> disable_irq(vop->irq); >> @@ -463,6 +471,8 @@ static void vop_disable(struct drm_crtc *crtc) >> >> clk_disable(vop->aclk); >> clk_disable(vop->hclk); >> + >> + vop->is_enabled = false; >> } >> >> /* >> @@ -742,7 +752,7 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) >> struct vop *vop = to_vop(crtc); >> unsigned long flags; >> >> - if (vop->dpms != DRM_MODE_DPMS_ON) >> + if (!vop->is_enabled) >> return -EPERM; >> >> spin_lock_irqsave(&vop->irq_lock, flags); >> @@ -759,8 +769,9 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc) >> struct vop *vop = to_vop(crtc); >> unsigned long flags; >> >> - if (vop->dpms != DRM_MODE_DPMS_ON) >> + if (!vop->is_enabled) >> return; >> + >> spin_lock_irqsave(&vop->irq_lock, flags); >> vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(0)); >> spin_unlock_irqrestore(&vop->irq_lock, flags); >> @@ -773,15 +784,8 @@ static const struct rockchip_crtc_funcs private_crtc_funcs = { >> >> static void vop_crtc_dpms(struct drm_crtc *crtc, int mode) >> { >> - struct vop *vop = to_vop(crtc); >> - >> DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); >> >> - if (vop->dpms == mode) { >> - DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n"); >> - return; >> - } >> - >> switch (mode) { >> case DRM_MODE_DPMS_ON: >> vop_enable(crtc); >> @@ -795,8 +799,6 @@ static void vop_crtc_dpms(struct drm_crtc *crtc, int mode) >> DRM_DEBUG_KMS("unspecified mode %d\n", mode); >> break; >> } >> - >> - vop->dpms = mode; >> } >> >> static void vop_crtc_prepare(struct drm_crtc *crtc) >> @@ -934,9 +936,9 @@ static int vop_crtc_page_flip(struct drm_crtc *crtc, >> struct drm_framebuffer *old_fb = crtc->primary->fb; >> int ret; >> >> - /* when the page flip is requested, crtc's dpms should be on */ >> - if (vop->dpms > DRM_MODE_DPMS_ON) { >> - DRM_DEBUG("failed page flip request at dpms[%d].\n", vop->dpms); >> + /* when the page flip is requested, crtc should be on */ >> + if (!vop->is_enabled) { >> + DRM_DEBUG("page flip request rejected because crtc is off.\n"); >> return 0; >> } >> >> @@ -1302,7 +1304,7 @@ static int vop_initial(struct vop *vop) >> >> clk_disable(vop->hclk); >> >> - vop->dpms = DRM_MODE_DPMS_OFF; >> + vop->is_enabled = false; >> >> return 0; >> >> -- >> 1.7.9.5 >> >>