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