OSDN Git Service

HDCP: Add GetDisplayIDFromConnectorID
authorLin Johnson <johnson.lin@intel.com>
Wed, 17 Oct 2018 14:55:28 +0000 (22:55 +0800)
committerKelly Ledford <kelly.ledford@intel.com>
Fri, 19 Oct 2018 17:06:24 +0000 (10:06 -0700)
This API should be used for selective HDCP port enabling
From HDCP Daemon

Jira: https://jira01.devtools.intel.com/browse/OAM-69940
Tests: None
Signed-off-by: Lin Johnson <johnson.lin@intel.com>
19 files changed:
common/core/gpudevice.cpp
common/core/logicaldisplay.cpp
common/core/logicaldisplay.h
common/core/logicaldisplaymanager.cpp
common/core/logicaldisplaymanager.h
common/core/mosaicdisplay.cpp
common/core/mosaicdisplay.h
os/android/hwcservice.cpp
os/android/hwcservice.h
os/android/iahwc2.cpp
os/android/iahwc2.h
os/android/libhwcservice/hwcserviceapi.cpp
os/android/libhwcservice/hwcserviceapi.h
os/android/libhwcservice/icontrols.cpp
os/android/libhwcservice/icontrols.h
public/gpudevice.h
public/nativedisplay.h
wsi/drm/drmdisplay.cpp
wsi/drm/drmdisplay.h

index 170559d..109cd1e 100644 (file)
@@ -649,6 +649,15 @@ void GpuDevice::SetHDCPSRMForDisplay(uint32_t display, const int8_t *SRM,
   native_display->SetHDCPSRM(SRM, SRMLength);
 }
 
+uint32_t GpuDevice::GetDisplayIDFromConnectorID(const uint32_t connector_id) {
+  size_t size = total_displays_.size();
+  for (size_t i = 0; i < size; i++) {
+    if (total_displays_.at(i)->ContainConnector(connector_id))
+      return i;
+  }
+  return -1;
+}
+
 void GpuDevice::HandleRoutine() {
   bool update_ignored = false;
 
index 765528c..dce7f80 100644 (file)
@@ -77,6 +77,10 @@ void LogicalDisplay::SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) {
   logical_display_manager_->SetHDCPSRM(SRM, SRMLength);
 }
 
+bool LogicalDisplay::ContainConnector(const uint32_t connector_id) {
+  return logical_display_manager_->ContainConnector(connector_id);
+}
+
 bool LogicalDisplay::Present(std::vector<HwcLayer *> &source_layers,
                              int32_t *retire_fence,
                              PixelUploaderCallback *call_back,
index 0aaf020..f09478b 100644 (file)
@@ -126,6 +126,8 @@ class LogicalDisplay : public NativeDisplay {
                     HWCContentType content_type) override;
   void SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) override;
 
+  bool ContainConnector(const uint32_t connector_id) override;
+
  private:
   LogicalDisplayManager *logical_display_manager_;
   NativeDisplay *physical_display_;
index a409a7f..67741c3 100644 (file)
@@ -232,10 +232,11 @@ void LogicalDisplayManager::SetHDCPState(HWCContentProtection state,
 }
 
 void LogicalDisplayManager::SetHDCPSRM(const int8_t* SRM, uint32_t SRMLength) {
-  uint32_t size = displays_.size();
-  for (uint32_t i = 0; i < size; i++) {
-    displays_.at(i)->SetHDCPSRM(SRM, SRMLength);
-  }
+  physical_display_->SetHDCPSRM(SRM, SRMLength);
+}
+
+bool LogicalDisplayManager::ContainConnector(const uint32_t connector_id) {
+  return physical_display_->ContainConnector(connector_id);
 }
 
 }  // namespace hwcomposer
index 0925521..7289c25 100644 (file)
@@ -99,6 +99,8 @@ class LogicalDisplayManager {
 
   void SetHDCPSRM(const int8_t* SRM, uint32_t SRMLength);
 
+  bool ContainConnector(const uint32_t connector_id);
+
  private:
   NativeDisplay* physical_display_;
   std::vector<std::unique_ptr<LogicalDisplay>> displays_;
index 5d631b6..a6eaa44 100644 (file)
@@ -519,4 +519,13 @@ void MosaicDisplay::SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) {
   }
 }
 
+bool MosaicDisplay::ContainConnector(const uint32_t connector_id) {
+  uint32_t size = physical_displays_.size();
+  for (uint32_t i = 0; i < size; i++) {
+    if (physical_displays_.at(i)->ContainConnector(connector_id))
+      return true;
+  }
+  return false;
+}
+
 }  // namespace hwcomposer
index 4d6c55e..03fd32f 100644 (file)
@@ -113,6 +113,8 @@ class MosaicDisplay : public NativeDisplay {
                     HWCContentType content_type) override;
   void SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) override;
 
+  bool ContainConnector(const uint32_t connector_id) override;
+
  private:
   std::vector<NativeDisplay *> physical_displays_;
   std::vector<NativeDisplay *> connected_displays_;
index 6671ce8..f284b43 100644 (file)
@@ -399,6 +399,11 @@ status_t HwcService::Controls::SetHDCPSRMForDisplay(uint32_t display,
   return OK;
 }
 
+uint32_t HwcService::Controls::GetDisplayIDFromConnectorID(
+    uint32_t connector_id) {
+  return mHwc.GetDisplayIDFromConnectorID(connector_id);
+}
+
 status_t HwcService::Controls::VideoEnableEncryptedSession(
     uint32_t sessionID, uint32_t instanceID) {
   mHwc.SetPAVPSessionStatus(true, sessionID, instanceID);
index 54101a7..c9d0208 100644 (file)
@@ -101,7 +101,7 @@ class HwcService : public BnService {
 
     status_t SetHDCPSRMForDisplay(uint32_t display, const int8_t* SRM,
                                   uint32_t SRMLength);
-
+    uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id);
     status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                          uint32_t instanceID);
     status_t VideoDisableAllEncryptedSessions(uint32_t sessionID);
index 307e974..8450907 100644 (file)
@@ -1261,6 +1261,10 @@ void IAHWC2::SetHDCPSRMForAllDisplays(const int8_t *SRM, uint32_t SRMLength) {
   device_.SetHDCPSRMForAllDisplays(SRM, SRMLength);
 }
 
+uint32_t IAHWC2::GetDisplayIDFromConnectorID(const uint32_t connector_id) {
+  return device_.GetDisplayIDFromConnectorID(connector_id);
+}
+
 void IAHWC2::SetHDCPSRMForDisplay(uint32_t display, const int8_t *SRM,
                                   uint32_t SRMLength) {
   if (SRM == NULL) {
index 3ecb0d5..7cb6869 100644 (file)
@@ -66,6 +66,7 @@ class IAHWC2 : public hwc2_device_t {
 
   void SetHDCPSRMForDisplay(uint32_t display, const int8_t *SRM,
                             uint32_t SRMLength);
+  uint32_t GetDisplayIDFromConnectorID(const uint32_t connector_id);
 
  public:
   class Hwc2Layer {
index 9543933..88cddbc 100644 (file)
@@ -275,6 +275,16 @@ status_t HwcService_Video_DisableHDCPSession_ForDisplay(HWCSHANDLE hwcs,
   return pContext->mControls->DisableHDCPSessionForDisplay(display);
 }
 
+uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
+                                                uint32_t connector_id) {
+  HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
+  if (!pContext) {
+    return android::BAD_VALUE;
+  }
+
+  return pContext->mControls->GetDisplayIDFromConnectorID(connector_id);
+}
+
 status_t HwcService_Video_DisableHDCPSession_AllDisplays(HWCSHANDLE hwcs) {
   HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
   if (!pContext) {
index 0212beb..f59ec10 100644 (file)
@@ -209,6 +209,9 @@ status_t HwcService_Video_SetHDCPSRM_AllDisplays(HWCSHANDLE hwcs,
                                                  const int8_t *SRM,
                                                  uint32_t SRMLengh);
 
+uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
+                                                uint32_t connector_id);
+
 // The control enables a the protected video subsystem to control when to
 // replace any
 // encrypted content with a default bitmap (usually black).
index 6af8ac0..44cea9d 100644 (file)
@@ -56,6 +56,7 @@ class BpControls : public BpInterface<IControls> {
     TRANSACT_VIDEO_DISABLE_HDCP_SESSION_FOR_ALL_DISPLAYS,
     TRANSACT_VIDEO_SET_HDCP_SRM_FOR_ALL_DISPLAYS,
     TRANSACT_VIDEO_SET_HDCP_SRM_FOR_DISPLAY,
+    TRANSACT_GET_DISPLAYID_FROM_CONNECTORID,
     TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION,
     TRANSACT_VIDEO_DISABLE_ENCRYPTED_SESSION,
     TRANSACT_VIDEO_DISABLE_ALL_ENCRYPTED_SESSIONS,
@@ -313,7 +314,7 @@ class BpControls : public BpInterface<IControls> {
   }
 
   status_t EnableHDCPSessionForDisplay(uint32_t display,
-                                       EHwcsContentType content_type) {
+                                       EHwcsContentType content_type) override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -328,7 +329,8 @@ class BpControls : public BpInterface<IControls> {
     return reply.readInt32();
   }
 
-  status_t EnableHDCPSessionForAllDisplays(EHwcsContentType content_type) {
+  status_t EnableHDCPSessionForAllDisplays(
+      EHwcsContentType content_type) override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -342,7 +344,7 @@ class BpControls : public BpInterface<IControls> {
     return reply.readInt32();
   }
 
-  status_t DisableHDCPSessionForDisplay(uint32_t display) {
+  status_t DisableHDCPSessionForDisplay(uint32_t display) override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -356,7 +358,7 @@ class BpControls : public BpInterface<IControls> {
     return reply.readInt32();
   }
 
-  status_t DisableHDCPSessionForAllDisplays() {
+  status_t DisableHDCPSessionForAllDisplays() override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -368,7 +370,8 @@ class BpControls : public BpInterface<IControls> {
     return reply.readInt32();
   }
 
-  status_t SetHDCPSRMForAllDisplays(const int8_t *SRM, uint32_t SRMLength) {
+  status_t SetHDCPSRMForAllDisplays(const int8_t *SRM,
+                                    uint32_t SRMLength) override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -382,7 +385,7 @@ class BpControls : public BpInterface<IControls> {
   }
 
   status_t SetHDCPSRMForDisplay(uint32_t display, const int8_t *SRM,
-                                uint32_t SRMLength) {
+                                uint32_t SRMLength) override {
     Parcel data;
     Parcel reply;
     data.writeInterfaceToken(IControls::getInterfaceDescriptor());
@@ -396,6 +399,20 @@ class BpControls : public BpInterface<IControls> {
     return reply.readInt32();
   }
 
+  uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id) override {
+    Parcel data;
+    Parcel reply;
+    data.writeInterfaceToken(IControls::getInterfaceDescriptor());
+    data.writeInt32(connector_id);
+
+    status_t ret = remote()->transact(TRANSACT_GET_DISPLAYID_FROM_CONNECTORID,
+                                      data, &reply);
+    if (ret != NO_ERROR) {
+      ALOGW("%s() transact failed: %d", __FUNCTION__, ret);
+    }
+    return (uint32_t)(reply.readInt32());
+  }
+
   status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                        uint32_t instanceID) override {
     Parcel data;
@@ -724,7 +741,13 @@ status_t BnControls::onTransact(uint32_t code, const Parcel &data,
       reply->writeInt32(ret);
       return NO_ERROR;
     }
-
+    case BpControls::TRANSACT_GET_DISPLAYID_FROM_CONNECTORID: {
+      CHECK_INTERFACE(IControls, data, reply);
+      uint32_t connector_id = data.readInt32();
+      uint32_t display_id = this->GetDisplayIDFromConnectorID(connector_id);
+      reply->writeInt32(display_id);
+      return NO_ERROR;
+    }
     case BpControls::TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION: {
       CHECK_INTERFACE(IControls, data, reply);
       uint32_t sessionID = data.readInt32();
index 8e21e4a..da058a5 100644 (file)
@@ -71,6 +71,7 @@ class IControls : public android::IInterface {
   virtual status_t SetHDCPSRMForDisplay(uint32_t display, const int8_t *SRM,
                                         uint32_t SRMLength) = 0;
 
+  virtual uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id) = 0;
   virtual status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                                uint32_t instanceID) = 0;
   virtual status_t VideoDisableAllEncryptedSessions(uint32_t sessionID) = 0;
index 421f9d8..6295718 100644 (file)
@@ -87,6 +87,7 @@ class GpuDevice : public HWCThread {
   void SetHDCPSRMForAllDisplays(const int8_t* SRM, uint32_t SRMLength);
   void SetHDCPSRMForDisplay(uint32_t display, const int8_t* SRM,
                             uint32_t SRMLength);
+  uint32_t GetDisplayIDFromConnectorID(const uint32_t connector_id);
 
  private:
   enum InitializationType {
index 0bd5eaa..fdc0235 100644 (file)
@@ -419,6 +419,12 @@ class NativeDisplay {
     return NULL;
   }
 
+  // return true if connector_id is one of the connector_ids of the physical
+  // connections
+  virtual bool ContainConnector(const uint32_t connector_id) {
+    return false;
+  }
+
  protected:
   friend class PhysicalDisplay;
   friend class GpuDevice;
index ef01670..961d91d 100644 (file)
@@ -466,6 +466,10 @@ void DrmDisplay::SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) {
   drmModeDestroyPropertyBlob(gpu_fd_, srm_id);
 }
 
+bool DrmDisplay::ContainConnector(const uint32_t connector_id) {
+  return (connector_ == connector_id);
+}
+
 bool DrmDisplay::Commit(
     const DisplayPlaneStateList &composition_planes,
     const DisplayPlaneStateList &previous_composition_planes,
index 632173b..4be5fd9 100644 (file)
@@ -57,6 +57,8 @@ class DrmDisplay : public PhysicalDisplay {
                     HWCContentType content_type) override;
   void SetHDCPSRM(const int8_t *SRM, uint32_t SRMLength) override;
 
+  bool ContainConnector(const uint32_t connector_id) override;
+
   bool InitializeDisplay() override;
   void PowerOn() override;
   void UpdateDisplayConfig() override;