17ec681f3Smrg/*
27ec681f3Smrg * Copyright © 2019-2020 Collabora, Ltd.
37ec681f3Smrg * Author: Antonio Caggiano <antonio.caggiano@collabora.com>
47ec681f3Smrg * Author: Rohan Garg <rohan.garg@collabora.com>
57ec681f3Smrg * Author: Robert Beckett <bob.beckett@collabora.com>
67ec681f3Smrg * Author: Corentin Noël <corentin.noel@collabora.com>
77ec681f3Smrg *
87ec681f3Smrg * SPDX-License-Identifier: MIT
97ec681f3Smrg */
107ec681f3Smrg
117ec681f3Smrg#include "pps_driver.h"
127ec681f3Smrg
137ec681f3Smrg#include <iterator>
147ec681f3Smrg#include <sstream>
157ec681f3Smrg
167ec681f3Smrg#ifdef PPS_FREEDRENO
177ec681f3Smrg#include "freedreno/ds/fd_pps_driver.h"
187ec681f3Smrg#endif // PPS_FREEDRENO
197ec681f3Smrg
207ec681f3Smrg#ifdef PPS_INTEL
217ec681f3Smrg#include "intel/ds/intel_pps_driver.h"
227ec681f3Smrg#endif // PPS_INTEL
237ec681f3Smrg
247ec681f3Smrg#ifdef PPS_PANFROST
257ec681f3Smrg#include "panfrost/ds/pan_pps_driver.h"
267ec681f3Smrg#endif // PPS_PANFROST
277ec681f3Smrg
287ec681f3Smrg#include "pps.h"
297ec681f3Smrg#include "pps_algorithm.h"
307ec681f3Smrg
317ec681f3Smrgnamespace pps
327ec681f3Smrg{
337ec681f3Smrgstd::unordered_map<std::string, std::unique_ptr<Driver>> create_supported_drivers()
347ec681f3Smrg{
357ec681f3Smrg   std::unordered_map<std::string, std::unique_ptr<Driver>> map;
367ec681f3Smrg
377ec681f3Smrg#ifdef PPS_FREEDRENO
387ec681f3Smrg   map.emplace("msm", std::make_unique<FreedrenoDriver>());
397ec681f3Smrg#endif // PPS_FREEDRENO
407ec681f3Smrg
417ec681f3Smrg#ifdef PPS_INTEL
427ec681f3Smrg   map.emplace("i915", std::make_unique<IntelDriver>());
437ec681f3Smrg#endif // PPS_INTEL
447ec681f3Smrg
457ec681f3Smrg#ifdef PPS_PANFROST
467ec681f3Smrg   map.emplace("panfrost", std::make_unique<PanfrostDriver>());
477ec681f3Smrg#endif // PPS_PANFROST
487ec681f3Smrg
497ec681f3Smrg   return map;
507ec681f3Smrg}
517ec681f3Smrg
527ec681f3Smrgconst std::unordered_map<std::string, std::unique_ptr<Driver>> &Driver::get_supported_drivers()
537ec681f3Smrg{
547ec681f3Smrg   static auto map = create_supported_drivers();
557ec681f3Smrg   return map;
567ec681f3Smrg}
577ec681f3Smrg
587ec681f3Smrgconst std::vector<std::string> Driver::supported_device_names()
597ec681f3Smrg{
607ec681f3Smrg   std::vector<std::string> supported_device_names;
617ec681f3Smrg
627ec681f3Smrg   for (auto &entry : get_supported_drivers()) {
637ec681f3Smrg      supported_device_names.emplace_back(entry.first);
647ec681f3Smrg   }
657ec681f3Smrg
667ec681f3Smrg   return supported_device_names;
677ec681f3Smrg}
687ec681f3Smrg
697ec681f3SmrgDriver *Driver::get_driver(DrmDevice &&drm_device)
707ec681f3Smrg{
717ec681f3Smrg   auto &supported_drivers = get_supported_drivers();
727ec681f3Smrg   auto it = supported_drivers.find(drm_device.name);
737ec681f3Smrg   if (it == std::end(supported_drivers)) {
747ec681f3Smrg      PERFETTO_FATAL("Failed to find a driver for DRM device %s", drm_device.name.c_str());
757ec681f3Smrg   }
767ec681f3Smrg
777ec681f3Smrg   Driver *driver = it->second.get();
787ec681f3Smrg   driver->drm_device = std::move(drm_device);
797ec681f3Smrg   return driver;
807ec681f3Smrg}
817ec681f3Smrg
827ec681f3Smrgstd::string Driver::default_driver_name()
837ec681f3Smrg{
847ec681f3Smrg   auto supported_devices = Driver::supported_device_names();
857ec681f3Smrg   auto devices = DrmDevice::create_all();
867ec681f3Smrg   for (auto &device : devices) {
877ec681f3Smrg      if (CONTAINS(supported_devices, device.name)) {
887ec681f3Smrg         PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str());
897ec681f3Smrg         return device.name;
907ec681f3Smrg      }
917ec681f3Smrg   }
927ec681f3Smrg   PPS_LOG_FATAL("Failed to find any driver");
937ec681f3Smrg}
947ec681f3Smrg
957ec681f3Smrgstd::string Driver::find_driver_name(const char *requested)
967ec681f3Smrg{
977ec681f3Smrg   auto supported_devices = Driver::supported_device_names();
987ec681f3Smrg   auto devices = DrmDevice::create_all();
997ec681f3Smrg   for (auto &device : devices) {
1007ec681f3Smrg      if (device.name == requested) {
1017ec681f3Smrg         PPS_LOG_IMPORTANT("Driver selected: %s", device.name.c_str());
1027ec681f3Smrg         return device.name;
1037ec681f3Smrg      }
1047ec681f3Smrg   }
1057ec681f3Smrg
1067ec681f3Smrg   std::ostringstream drivers_os;
1077ec681f3Smrg   std::copy(supported_devices.begin(),
1087ec681f3Smrg      supported_devices.end() - 1,
1097ec681f3Smrg      std::ostream_iterator<std::string>(drivers_os, ", "));
1107ec681f3Smrg   drivers_os << supported_devices.back();
1117ec681f3Smrg
1127ec681f3Smrg   PPS_LOG_ERROR(
1137ec681f3Smrg      "Device '%s' not found (supported drivers: %s)", requested, drivers_os.str().c_str());
1147ec681f3Smrg
1157ec681f3Smrg   return default_driver_name();
1167ec681f3Smrg}
1177ec681f3Smrg
1187ec681f3Smrg} // namespace pps
119