16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
170594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h>
186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h>
190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/VsyncControl.h>
206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android {
226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel {
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
24e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie LiVsyncControl::VsyncControl()
25eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    : IVsyncControl(),
26eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mInitialized(false)
276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
28eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
30eb726af21649d79ed720bdf329e0849270995c45Andy QiuVsyncControl::~VsyncControl()
31eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
32eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    WARN_IF_NOT_DEINIT();
336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
35eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool VsyncControl::initialize()
366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
37eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mInitialized = true;
38eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return true;
39eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
41eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid VsyncControl::deinitialize()
42eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
43eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mInitialized = false;
44eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
45e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
46eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool VsyncControl::control(int disp, bool enabled)
47eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("disp = %d, enabled = %d", disp, enabled);
496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
50eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    struct drm_psb_vsync_set_arg arg;
516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg));
526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // pipe equals to disp
546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    arg.vsync.pipe = disp;
556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (enabled) {
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        arg.vsync_operation_mask = VSYNC_ENABLE;
58eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    } else {
596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        arg.vsync_operation_mask = VSYNC_DISABLE;
60eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
61eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
62e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li    return drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg));
636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
65e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool VsyncControl::wait(int disp, int64_t& timestamp)
666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
674157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev    ALOGTRACE("disp = %d", disp);
68e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li
69eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    struct drm_psb_vsync_set_arg arg;
706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg));
716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    arg.vsync_operation_mask = VSYNC_WAIT;
736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    // pipe equals to disp
756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    arg.vsync.pipe = disp;
766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
78eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bool ret = drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg));
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    timestamp = (int64_t)arg.vsync.timestamp;
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return ret;
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android
85