148 lines · c
1// SPDX-License-Identifier: GPL-2.0 AND MIT2/*3 * Copyright © 2023 Intel Corporation4 */5 6#include "tests/xe_pci_test.h"7 8#include "tests/xe_test.h"9 10#include <kunit/test-bug.h>11#include <kunit/test.h>12#include <kunit/test-bug.h>13#include <kunit/visibility.h>14 15/**16 * xe_call_for_each_graphics_ip - Iterate over all recognized graphics IPs17 * @xe_fn: Function to call for each device.18 *19 * This function iterates over the descriptors for all graphics IPs recognized20 * by the driver and calls @xe_fn: for each one of them.21 */22void xe_call_for_each_graphics_ip(xe_graphics_fn xe_fn)23{24 const struct xe_graphics_desc *ip, *last = NULL;25 26 for (int i = 0; i < ARRAY_SIZE(graphics_ip_map); i++) {27 ip = graphics_ip_map[i].ip;28 if (ip == last)29 continue;30 31 xe_fn(ip);32 last = ip;33 }34}35EXPORT_SYMBOL_IF_KUNIT(xe_call_for_each_graphics_ip);36 37/**38 * xe_call_for_each_media_ip - Iterate over all recognized media IPs39 * @xe_fn: Function to call for each device.40 *41 * This function iterates over the descriptors for all media IPs recognized42 * by the driver and calls @xe_fn: for each one of them.43 */44void xe_call_for_each_media_ip(xe_media_fn xe_fn)45{46 const struct xe_media_desc *ip, *last = NULL;47 48 for (int i = 0; i < ARRAY_SIZE(media_ip_map); i++) {49 ip = media_ip_map[i].ip;50 if (ip == last)51 continue;52 53 xe_fn(ip);54 last = ip;55 }56}57EXPORT_SYMBOL_IF_KUNIT(xe_call_for_each_media_ip);58 59static void fake_read_gmdid(struct xe_device *xe, enum xe_gmdid_type type,60 u32 *ver, u32 *revid)61{62 struct kunit *test = kunit_get_current_test();63 struct xe_pci_fake_data *data = test->priv;64 65 if (type == GMDID_MEDIA) {66 *ver = data->media_verx100;67 *revid = xe_step_to_gmdid(data->media_step);68 } else {69 *ver = data->graphics_verx100;70 *revid = xe_step_to_gmdid(data->graphics_step);71 }72}73 74int xe_pci_fake_device_init(struct xe_device *xe)75{76 struct kunit *test = kunit_get_current_test();77 struct xe_pci_fake_data *data = test->priv;78 const struct pci_device_id *ent = pciidlist;79 const struct xe_device_desc *desc;80 const struct xe_subplatform_desc *subplatform_desc;81 82 if (!data) {83 desc = (const void *)ent->driver_data;84 subplatform_desc = NULL;85 goto done;86 }87 88 for (ent = pciidlist; ent->device; ent++) {89 desc = (const void *)ent->driver_data;90 if (desc->platform == data->platform)91 break;92 }93 94 if (!ent->device)95 return -ENODEV;96 97 for (subplatform_desc = desc->subplatforms;98 subplatform_desc && subplatform_desc->subplatform;99 subplatform_desc++)100 if (subplatform_desc->subplatform == data->subplatform)101 break;102 103 if (data->subplatform != XE_SUBPLATFORM_NONE && !subplatform_desc)104 return -ENODEV;105 106done:107 xe->sriov.__mode = data && data->sriov_mode ?108 data->sriov_mode : XE_SRIOV_MODE_NONE;109 110 kunit_activate_static_stub(test, read_gmdid, fake_read_gmdid);111 112 xe_info_init_early(xe, desc, subplatform_desc);113 xe_info_init(xe, desc->graphics, desc->media);114 115 return 0;116}117EXPORT_SYMBOL_IF_KUNIT(xe_pci_fake_device_init);118 119/**120 * xe_pci_live_device_gen_param - Helper to iterate Xe devices as KUnit parameters121 * @prev: the previously returned value, or NULL for the first iteration122 * @desc: the buffer for a parameter name123 *124 * Iterates over the available Xe devices on the system. Uses the device name125 * as the parameter name.126 *127 * To be used only as a parameter generator function in &KUNIT_CASE_PARAM.128 *129 * Return: pointer to the next &struct xe_device ready to be used as a parameter130 * or NULL if there are no more Xe devices on the system.131 */132const void *xe_pci_live_device_gen_param(const void *prev, char *desc)133{134 const struct xe_device *xe = prev;135 struct device *dev = xe ? xe->drm.dev : NULL;136 struct device *next;137 138 next = driver_find_next_device(&xe_pci_driver.driver, dev);139 if (dev)140 put_device(dev);141 if (!next)142 return NULL;143 144 snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", dev_name(next));145 return pdev_to_xe_device(to_pci_dev(next));146}147EXPORT_SYMBOL_IF_KUNIT(xe_pci_live_device_gen_param);148