mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 09:42:19 +03:00
misc: mods: update MODS kernel driver
Bug 3461002 Change-Id: I9f577323cd8034a4464953031398c39a409ad69c Signed-off-by: Chris Dragan <kdragan@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2658852 Reviewed-by: Sachin Nikam <snikam@nvidia.com> GVS: Gerrit_Virtual_Submit
This commit is contained in:
committed by
Laxman Dewangan
parent
aa915e1412
commit
13ac7c137c
@@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* mods_acpi.c - This file is part of NVIDIA MODS kernel driver.
|
* mods_acpi.c - This file is part of NVIDIA MODS kernel driver.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2020, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License,
|
* modify it under the terms of the GNU General Public License,
|
||||||
@@ -34,6 +34,105 @@ static acpi_status mods_acpi_find_acpi_handler(acpi_handle,
|
|||||||
* PRIVATE FUNCTIONS *
|
* PRIVATE FUNCTIONS *
|
||||||
*********************/
|
*********************/
|
||||||
|
|
||||||
|
struct acpi_dev_children_in_data {
|
||||||
|
u32 expected_acpi_ids_buf[4];
|
||||||
|
u32 num_expected_acpi_ids;
|
||||||
|
u32 acpi_dev_mask;
|
||||||
|
acpi_handle dev_handle;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int (*dev_children_fptr)(struct mods_client *,
|
||||||
|
u32,
|
||||||
|
acpi_handle,
|
||||||
|
void *);
|
||||||
|
|
||||||
|
static int acpi_store_dev_children(struct mods_client *client,
|
||||||
|
u32 curr_acpi_id,
|
||||||
|
acpi_handle dev_handle,
|
||||||
|
void *out_data)
|
||||||
|
{
|
||||||
|
struct MODS_GET_ACPI_DEV_CHILDREN *acpi_out_data
|
||||||
|
= (struct MODS_GET_ACPI_DEV_CHILDREN *)out_data;
|
||||||
|
|
||||||
|
if (acpi_out_data->num_children >= ACPI_MAX_DEV_CHILDREN) {
|
||||||
|
cl_error("ACPI: output buffer too small to store all children\n");
|
||||||
|
return -ENOBUFS;
|
||||||
|
}
|
||||||
|
|
||||||
|
acpi_out_data->children[acpi_out_data->num_children] = curr_acpi_id;
|
||||||
|
++acpi_out_data->num_children;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int acpi_compare_dev_id(struct mods_client *client,
|
||||||
|
u32 curr_acpi_id,
|
||||||
|
acpi_handle dev_handle,
|
||||||
|
void *out_data)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
struct acpi_dev_children_in_data *dev_child_data
|
||||||
|
= (struct acpi_dev_children_in_data *)out_data;
|
||||||
|
|
||||||
|
for (i = 0; i < dev_child_data->num_expected_acpi_ids; ++i) {
|
||||||
|
if ((dev_child_data->expected_acpi_ids_buf[i] & dev_child_data->acpi_dev_mask)
|
||||||
|
== (curr_acpi_id & dev_child_data->acpi_dev_mask)) {
|
||||||
|
dev_child_data->dev_handle = dev_handle;
|
||||||
|
/*
|
||||||
|
* returning unique error code to signal caller that value is found
|
||||||
|
*/
|
||||||
|
return -EALREADY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int acpi_get_dev_children(struct mods_client *client,
|
||||||
|
dev_children_fptr fptr,
|
||||||
|
acpi_handle dev_handle,
|
||||||
|
void *out_data)
|
||||||
|
{
|
||||||
|
int err = OK;
|
||||||
|
acpi_status status;
|
||||||
|
struct acpi_device *device = NULL;
|
||||||
|
struct list_head *node = NULL;
|
||||||
|
struct list_head *next = NULL;
|
||||||
|
|
||||||
|
LOG_ENT();
|
||||||
|
|
||||||
|
status = acpi_bus_get_device(dev_handle, &device);
|
||||||
|
if (ACPI_FAILURE(status) || !device) {
|
||||||
|
cl_error("ACPI: device for fetching device children not found\n");
|
||||||
|
LOG_EXT();
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_safe(node, next, &device->children) {
|
||||||
|
unsigned long long device_id = 0;
|
||||||
|
|
||||||
|
struct acpi_device *dev =
|
||||||
|
list_entry(node, struct acpi_device, node);
|
||||||
|
|
||||||
|
status = acpi_evaluate_integer(dev->handle,
|
||||||
|
"_ADR",
|
||||||
|
NULL,
|
||||||
|
&device_id);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
/* Couldnt query device_id for this device */
|
||||||
|
continue;
|
||||||
|
|
||||||
|
err = fptr(client, device_id, dev->handle, out_data);
|
||||||
|
if (err == -EALREADY) {
|
||||||
|
err = OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_EXT();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* store handle if found. */
|
/* store handle if found. */
|
||||||
static void mods_acpi_handle_init(struct mods_client *client,
|
static void mods_acpi_handle_init(struct mods_client *client,
|
||||||
char *method_name,
|
char *method_name,
|
||||||
@@ -187,9 +286,6 @@ static int mods_eval_acpi_method(struct mods_client *client,
|
|||||||
union acpi_object acpi_params[ACPI_MAX_ARGUMENT_NUMBER];
|
union acpi_object acpi_params[ACPI_MAX_ARGUMENT_NUMBER];
|
||||||
acpi_handle acpi_method_handler = NULL;
|
acpi_handle acpi_method_handler = NULL;
|
||||||
struct pci_dev *dev = NULL;
|
struct pci_dev *dev = NULL;
|
||||||
struct acpi_device *acpi_dev = NULL;
|
|
||||||
struct list_head *node = NULL;
|
|
||||||
struct list_head *next = NULL;
|
|
||||||
|
|
||||||
LOG_ENT();
|
LOG_ENT();
|
||||||
|
|
||||||
@@ -229,46 +325,20 @@ static int mods_eval_acpi_method(struct mods_client *client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (acpi_id != ACPI_MODS_IGNORE_ACPI_ID) {
|
if (acpi_id != ACPI_MODS_IGNORE_ACPI_ID) {
|
||||||
status = acpi_bus_get_device(acpi_method_handler, &acpi_dev);
|
struct acpi_dev_children_in_data in_data = { {}, 0, 0, NULL};
|
||||||
if (ACPI_FAILURE(status) || !acpi_dev) {
|
|
||||||
cl_error("ACPI: device for %s not found\n",
|
in_data.expected_acpi_ids_buf[0] = acpi_id;
|
||||||
p->method_name);
|
in_data.num_expected_acpi_ids = 1;
|
||||||
|
in_data.acpi_dev_mask = 0xffffffff;
|
||||||
|
|
||||||
|
err = acpi_get_dev_children(client, acpi_compare_dev_id,
|
||||||
|
acpi_method_handler, (void *)&in_data);
|
||||||
|
if (err) {
|
||||||
pci_dev_put(dev);
|
pci_dev_put(dev);
|
||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
acpi_method_handler = NULL;
|
acpi_method_handler = in_data.dev_handle;
|
||||||
|
|
||||||
list_for_each_safe(node, next, &acpi_dev->children) {
|
|
||||||
unsigned long long device_id = 0;
|
|
||||||
|
|
||||||
struct acpi_device *acpi_dev =
|
|
||||||
list_entry(node, struct acpi_device, node);
|
|
||||||
|
|
||||||
if (!acpi_dev)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
status = acpi_evaluate_integer(acpi_dev->handle,
|
|
||||||
"_ADR",
|
|
||||||
NULL,
|
|
||||||
&device_id);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
/* Couldn't query device_id for this device */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (device_id == acpi_id) {
|
|
||||||
acpi_method_handler = acpi_dev->handle;
|
|
||||||
cl_debug(DEBUG_ACPI,
|
|
||||||
"ACPI: found %s (id = 0x%x) on dev %04x:%02x:%02x.%x\n",
|
|
||||||
p->method_name,
|
|
||||||
(unsigned int)device_id,
|
|
||||||
pdevice->domain,
|
|
||||||
pdevice->bus,
|
|
||||||
pdevice->device,
|
|
||||||
pdevice->function);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!acpi_method_handler) {
|
if (!acpi_method_handler) {
|
||||||
@@ -279,6 +349,14 @@ static int mods_eval_acpi_method(struct mods_client *client,
|
|||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
cl_debug(DEBUG_ACPI,
|
||||||
|
"ACPI: found %s (id = 0x%x) on dev %04x:%02x:%02x.%x\n",
|
||||||
|
p->method_name,
|
||||||
|
(unsigned int)acpi_id,
|
||||||
|
pdevice ? pdevice->domain : 0U,
|
||||||
|
pdevice ? pdevice->bus : 0U,
|
||||||
|
pdevice ? pdevice->device : 0U,
|
||||||
|
pdevice ? pdevice->function : 0U);
|
||||||
|
|
||||||
input.count = p->argument_count;
|
input.count = p->argument_count;
|
||||||
input.pointer = acpi_params;
|
input.pointer = acpi_params;
|
||||||
@@ -368,19 +446,17 @@ static int mods_acpi_get_ddc(struct mods_client *client,
|
|||||||
struct MODS_ACPI_GET_DDC_2 *p,
|
struct MODS_ACPI_GET_DDC_2 *p,
|
||||||
struct mods_pci_dev_2 *pci_device)
|
struct mods_pci_dev_2 *pci_device)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
struct acpi_device *device = NULL;
|
union acpi_object *ddc;
|
||||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
union acpi_object ddc_arg0 = { ACPI_TYPE_INTEGER };
|
||||||
union acpi_object *ddc;
|
struct acpi_object_list input = { 1, &ddc_arg0 };
|
||||||
union acpi_object ddc_arg0 = { ACPI_TYPE_INTEGER };
|
u32 i;
|
||||||
struct acpi_object_list input = { 1, &ddc_arg0 };
|
acpi_handle dev_handle = NULL;
|
||||||
struct list_head *node;
|
acpi_handle lcd_dev_handle = NULL;
|
||||||
struct list_head *next;
|
struct pci_dev *dev = NULL;
|
||||||
u32 i;
|
bool data_found = false;
|
||||||
acpi_handle dev_handle = NULL;
|
struct acpi_dev_children_in_data in_data = { {}, 0, 0, NULL };
|
||||||
acpi_handle lcd_dev_handle = NULL;
|
|
||||||
struct pci_dev *dev = NULL;
|
|
||||||
|
|
||||||
LOG_ENT();
|
LOG_ENT();
|
||||||
|
|
||||||
@@ -411,49 +487,26 @@ static int mods_acpi_get_ddc(struct mods_client *client,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = acpi_bus_get_device(dev_handle, &device);
|
/*
|
||||||
if (ACPI_FAILURE(status) || !device) {
|
* List of supported display's (panels)
|
||||||
cl_error("ACPI: device for _DDC not found\n");
|
* Reference: https://uefi.org/sites/default/files/resources/ACPI_6_1.pdf
|
||||||
|
* Section: Table B-390 Video Output Device Attributes
|
||||||
|
*/
|
||||||
|
in_data.expected_acpi_ids_buf[0] = 0x0110;
|
||||||
|
in_data.expected_acpi_ids_buf[1] = 0x0118;
|
||||||
|
in_data.expected_acpi_ids_buf[2] = 0x0400;
|
||||||
|
in_data.expected_acpi_ids_buf[3] = 0xa450;
|
||||||
|
in_data.num_expected_acpi_ids = 4;
|
||||||
|
in_data.acpi_dev_mask = 0xffff;
|
||||||
|
|
||||||
|
err = acpi_get_dev_children(client, acpi_compare_dev_id,
|
||||||
|
dev_handle, (void *)&in_data);
|
||||||
|
if (err) {
|
||||||
pci_dev_put(dev);
|
pci_dev_put(dev);
|
||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
lcd_dev_handle = in_data.dev_handle;
|
||||||
list_for_each_safe(node, next, &device->children) {
|
|
||||||
unsigned long long device_id = 0;
|
|
||||||
|
|
||||||
struct acpi_device *dev =
|
|
||||||
list_entry(node, struct acpi_device, node);
|
|
||||||
|
|
||||||
if (!dev)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
status = acpi_evaluate_integer(dev->handle,
|
|
||||||
"_ADR",
|
|
||||||
NULL,
|
|
||||||
&device_id);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
/* Couldnt query device_id for this device */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
device_id = (device_id & 0xffff);
|
|
||||||
|
|
||||||
if ((device_id == 0x0110) || /* Only for an LCD*/
|
|
||||||
(device_id == 0x0118) ||
|
|
||||||
(device_id == 0x0400)) {
|
|
||||||
|
|
||||||
lcd_dev_handle = dev->handle;
|
|
||||||
cl_debug(DEBUG_ACPI,
|
|
||||||
"ACPI: Found LCD 0x%llx on dev %04x:%02x:%02x.%x\n",
|
|
||||||
device_id,
|
|
||||||
p->device.domain,
|
|
||||||
p->device.bus,
|
|
||||||
p->device.device,
|
|
||||||
p->device.function);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lcd_dev_handle == NULL) {
|
if (lcd_dev_handle == NULL) {
|
||||||
cl_error("ACPI: LCD not found for dev %04x:%02x:%02x.%x\n",
|
cl_error("ACPI: LCD not found for dev %04x:%02x:%02x.%x\n",
|
||||||
@@ -466,49 +519,54 @@ static int mods_acpi_get_ddc(struct mods_client *client,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cl_debug(DEBUG_ACPI,
|
||||||
|
"ACPI: Found LCD on dev %04x:%02x:%02x.%x\n",
|
||||||
|
p->device.domain,
|
||||||
|
p->device.bus,
|
||||||
|
p->device.device,
|
||||||
|
p->device.function);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As per ACPI Spec 3.0:
|
* As per ACPI Spec 3.0:
|
||||||
* ARG0 = 0x1 for 128 bytes EDID buffer
|
* ARG0 is size of EDID buffer in 128-byte blocks.
|
||||||
* ARG0 = 0x2 for 256 bytes EDID buffer
|
|
||||||
*/
|
*/
|
||||||
for (i = 1; i <= 2; i++) {
|
err = -EINVAL;
|
||||||
|
for (i = 4; i >= 1; --i) {
|
||||||
|
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
|
|
||||||
ddc_arg0.integer.value = i;
|
ddc_arg0.integer.value = i;
|
||||||
status = acpi_evaluate_object(lcd_dev_handle,
|
status = acpi_evaluate_object(lcd_dev_handle,
|
||||||
"_DDC",
|
"_DDC",
|
||||||
&input,
|
&input,
|
||||||
&output);
|
&output);
|
||||||
if (ACPI_SUCCESS(status))
|
if (ACPI_SUCCESS(status)) {
|
||||||
|
ddc = output.pointer;
|
||||||
|
if (ddc && (ddc->type != ACPI_TYPE_BUFFER))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!ddc || ddc->buffer.length == 0) {
|
||||||
|
cl_error("unsupported ACPI output type\n");
|
||||||
|
} else if (ddc->buffer.length > sizeof(p->out_buffer)) {
|
||||||
|
cl_error(
|
||||||
|
"output buffer too small for ACPI method _DDC (EDID)\n");
|
||||||
|
} else {
|
||||||
|
p->out_data_size = ddc->buffer.length;
|
||||||
|
memcpy(p->out_buffer,
|
||||||
|
ddc->buffer.pointer,
|
||||||
|
p->out_data_size);
|
||||||
|
err = OK;
|
||||||
|
data_found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(ddc);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (ACPI_FAILURE(status)) {
|
|
||||||
cl_error("ACPI method _DDC (EDID) failed\n");
|
|
||||||
pci_dev_put(dev);
|
|
||||||
LOG_EXT();
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ddc = output.pointer;
|
|
||||||
if (ddc && (ddc->type == ACPI_TYPE_BUFFER)
|
|
||||||
&& (ddc->buffer.length > 0)) {
|
|
||||||
|
|
||||||
if (ddc->buffer.length <= sizeof(p->out_buffer)) {
|
|
||||||
p->out_data_size = ddc->buffer.length;
|
|
||||||
memcpy(p->out_buffer,
|
|
||||||
ddc->buffer.pointer,
|
|
||||||
p->out_data_size);
|
|
||||||
err = OK;
|
|
||||||
} else {
|
|
||||||
cl_error(
|
|
||||||
"output buffer too small for ACPI method _DDC (EDID)\n");
|
|
||||||
err = -EINVAL;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
cl_error("unsupported ACPI output type\n");
|
|
||||||
err = -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(output.pointer);
|
if (!data_found)
|
||||||
|
cl_error("ACPI method _DDC (EDID) failed\n");
|
||||||
|
|
||||||
pci_dev_put(dev);
|
pci_dev_put(dev);
|
||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return err;
|
return err;
|
||||||
@@ -574,3 +632,56 @@ int esc_mods_acpi_get_ddc(struct mods_client *client,
|
|||||||
|
|
||||||
return mods_acpi_get_ddc(client, pp, &device);
|
return mods_acpi_get_ddc(client, pp, &device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int esc_mods_get_acpi_dev_children(struct mods_client *client,
|
||||||
|
struct MODS_GET_ACPI_DEV_CHILDREN *p)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
struct pci_dev *dev = NULL;
|
||||||
|
acpi_handle dev_handle = NULL;
|
||||||
|
|
||||||
|
LOG_ENT();
|
||||||
|
|
||||||
|
cl_debug(DEBUG_ACPI,
|
||||||
|
"ACPI: failed to get children for dev %04x:%02x:%02x.%x\n",
|
||||||
|
p->device.domain,
|
||||||
|
p->device.bus,
|
||||||
|
p->device.device,
|
||||||
|
p->device.function);
|
||||||
|
|
||||||
|
err = mods_find_pci_dev(client, &p->device, &dev);
|
||||||
|
if (unlikely(err)) {
|
||||||
|
if (err == -ENODEV)
|
||||||
|
cl_error("ACPI: dev %04x:%02x:%02x.%x not found\n",
|
||||||
|
p->device.domain,
|
||||||
|
p->device.bus,
|
||||||
|
p->device.device,
|
||||||
|
p->device.function);
|
||||||
|
LOG_EXT();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_handle = MODS_ACPI_HANDLE(&dev->dev);
|
||||||
|
if (!dev_handle) {
|
||||||
|
cl_error("ACPI: handle for fetching device children not found\n");
|
||||||
|
pci_dev_put(dev);
|
||||||
|
LOG_EXT();
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->num_children = 0;
|
||||||
|
err = acpi_get_dev_children(client, acpi_store_dev_children,
|
||||||
|
dev_handle, (void *)p);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
cl_error("ACPI: failed to get children for dev %04x:%02x:%02x.%x\n",
|
||||||
|
p->device.domain,
|
||||||
|
p->device.bus,
|
||||||
|
p->device.device,
|
||||||
|
p->device.function);
|
||||||
|
}
|
||||||
|
|
||||||
|
pci_dev_put(dev);
|
||||||
|
LOG_EXT();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* mods_config.h - This file is part of NVIDIA MODS kernel driver.
|
* mods_config.h - This file is part of NVIDIA MODS kernel driver.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2021, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License,
|
* modify it under the terms of the GNU General Public License,
|
||||||
@@ -100,4 +100,8 @@
|
|||||||
# define MODS_HAS_TEGRA 1
|
# define MODS_HAS_TEGRA 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MODS_HAS_TEGRA) && KERNEL_VERSION(5, 1, 0) <= MODS_KERNEL_VERSION
|
||||||
|
# define MODS_ENABLE_BPMP_MRQ_API 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _MODS_CONFIG_H_ */
|
#endif /* _MODS_CONFIG_H_ */
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* mods_internal.h - This file is part of NVIDIA MODS kernel driver.
|
* mods_internal.h - This file is part of NVIDIA MODS kernel driver.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License,
|
* modify it under the terms of the GNU General Public License,
|
||||||
@@ -38,8 +38,7 @@
|
|||||||
#include <linux/set_memory.h>
|
#include <linux/set_memory.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE
|
#ifdef MODS_ENABLE_BPMP_MRQ_API
|
||||||
#define MODS_ENABLE_BPMP_MRQ_API
|
|
||||||
#include <soc/tegra/bpmp.h>
|
#include <soc/tegra/bpmp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -515,6 +514,8 @@ int esc_mods_acpi_get_ddc(struct mods_client *client,
|
|||||||
struct MODS_ACPI_GET_DDC *p);
|
struct MODS_ACPI_GET_DDC *p);
|
||||||
int esc_mods_acpi_get_ddc_2(struct mods_client *client,
|
int esc_mods_acpi_get_ddc_2(struct mods_client *client,
|
||||||
struct MODS_ACPI_GET_DDC_2 *p);
|
struct MODS_ACPI_GET_DDC_2 *p);
|
||||||
|
int esc_mods_get_acpi_dev_children(struct mods_client *client,
|
||||||
|
struct MODS_GET_ACPI_DEV_CHILDREN *p);
|
||||||
#endif
|
#endif
|
||||||
/* pci */
|
/* pci */
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* mods_irq.c - This file is part of NVIDIA MODS kernel driver.
|
* mods_irq.c - This file is part of NVIDIA MODS kernel driver.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2021, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License,
|
* modify it under the terms of the GNU General Public License,
|
||||||
@@ -534,10 +534,10 @@ static int add_irq_map(struct mods_client *client,
|
|||||||
(irq_type == MODS_IRQ_TYPE_MSIX)) {
|
(irq_type == MODS_IRQ_TYPE_MSIX)) {
|
||||||
cl_debug(DEBUG_ISR,
|
cl_debug(DEBUG_ISR,
|
||||||
"dev %04x:%02x:%02x.%x registered %s IRQ 0x%x\n",
|
"dev %04x:%02x:%02x.%x registered %s IRQ 0x%x\n",
|
||||||
pci_domain_nr(dev->bus),
|
dev ? pci_domain_nr(dev->bus) : 0U,
|
||||||
dev->bus->number,
|
dev ? dev->bus->number : 0U,
|
||||||
PCI_SLOT(dev->devfn),
|
dev ? PCI_SLOT(dev->devfn) : 0U,
|
||||||
PCI_FUNC(dev->devfn),
|
dev ? PCI_FUNC(dev->devfn) : 0U,
|
||||||
mods_irq_type_name(irq_type),
|
mods_irq_type_name(irq_type),
|
||||||
irq);
|
irq);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,6 +100,14 @@ static const struct pci_device_id mods_pci_table[] = {
|
|||||||
.class = (PCI_CLASS_DISPLAY_3D << 8),
|
.class = (PCI_CLASS_DISPLAY_3D << 8),
|
||||||
.class_mask = ~0
|
.class_mask = ~0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.vendor = PCI_VENDOR_ID_NVIDIA,
|
||||||
|
.device = PCI_ANY_ID,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
.class = (PCI_CLASS_BRIDGE_OTHER << 8),
|
||||||
|
.class_mask = ~0
|
||||||
|
},
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1697,6 +1705,7 @@ static int esc_mods_write_sysfs_node(struct mods_client *client,
|
|||||||
memcpy(pdata->path, "/sys/", 5);
|
memcpy(pdata->path, "/sys/", 5);
|
||||||
pdata->path[sizeof(pdata->path) - 1] = 0;
|
pdata->path[sizeof(pdata->path) - 1] = 0;
|
||||||
|
|
||||||
|
memset(&task, 0, sizeof(task));
|
||||||
task.path = pdata->path;
|
task.path = pdata->path;
|
||||||
task.data = pdata->contents;
|
task.data = pdata->contents;
|
||||||
task.data_size = pdata->size;
|
task.data_size = pdata->size;
|
||||||
@@ -2244,6 +2253,10 @@ static long mods_krnl_ioctl(struct file *fp,
|
|||||||
esc_mods_acpi_get_ddc_2, MODS_ACPI_GET_DDC_2);
|
esc_mods_acpi_get_ddc_2, MODS_ACPI_GET_DDC_2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MODS_ESC_GET_ACPI_DEV_CHILDREN:
|
||||||
|
MODS_IOCTL(MODS_ESC_GET_ACPI_DEV_CHILDREN,
|
||||||
|
esc_mods_get_acpi_dev_children, MODS_GET_ACPI_DEV_CHILDREN);
|
||||||
|
break;
|
||||||
#else
|
#else
|
||||||
case MODS_ESC_EVAL_ACPI_METHOD:
|
case MODS_ESC_EVAL_ACPI_METHOD:
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
@@ -2256,6 +2269,8 @@ static long mods_krnl_ioctl(struct file *fp,
|
|||||||
case MODS_ESC_ACPI_GET_DDC:
|
case MODS_ESC_ACPI_GET_DDC:
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case MODS_ESC_ACPI_GET_DDC_2:
|
case MODS_ESC_ACPI_GET_DDC_2:
|
||||||
|
/* fallthrough */
|
||||||
|
case MODS_ESC_GET_ACPI_DEV_CHILDREN:
|
||||||
/* Silent failure to avoid clogging kernel log */
|
/* Silent failure to avoid clogging kernel log */
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* mods_mem.c - This file is part of NVIDIA MODS kernel driver.
|
* mods_mem.c - This file is part of NVIDIA MODS kernel driver.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2021, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License,
|
* modify it under the terms of the GNU General Public License,
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH64
|
#ifdef CONFIG_ARM64
|
||||||
#include <linux/cache.h>
|
#include <linux/cache.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -343,7 +343,7 @@ static int mods_create_default_dma_map(struct mods_client *client,
|
|||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CONFIG_PCI */
|
||||||
|
|
||||||
/* Find the dma mapping chunk for the specified memory. */
|
/* Find the dma mapping chunk for the specified memory. */
|
||||||
static struct MODS_DMA_MAP *find_dma_map(struct MODS_MEM_INFO *p_mem_info,
|
static struct MODS_DMA_MAP *find_dma_map(struct MODS_MEM_INFO *p_mem_info,
|
||||||
@@ -2051,7 +2051,7 @@ int esc_mods_dma_unmap_memory(struct mods_client *client,
|
|||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CONFIG_PCI */
|
||||||
|
|
||||||
#ifdef MODS_HAS_TEGRA
|
#ifdef MODS_HAS_TEGRA
|
||||||
/* map dma buffer by iommu */
|
/* map dma buffer by iommu */
|
||||||
@@ -2141,15 +2141,15 @@ int esc_mods_iommu_dma_map_memory(struct mods_client *client,
|
|||||||
/* Check if IOVAs are contiguous */
|
/* Check if IOVAs are contiguous */
|
||||||
iova_offset = 0;
|
iova_offset = 0;
|
||||||
for_each_sg(sgt->sgl, sg, sgt->nents, i) {
|
for_each_sg(sgt->sgl, sg, sgt->nents, i) {
|
||||||
if (sg_dma_address(sg) != (~(dma_addr_t)0) &&
|
iova_offset = iova_offset + sg->offset;
|
||||||
sg_dma_address(sg) != (iova + iova_offset)) {
|
if (sg_dma_address(sg) != (iova + iova_offset)
|
||||||
|
|| sg_dma_len(sg) != sg->length) {
|
||||||
cl_error("sg not contiguous:dma 0x%llx, iova 0x%llx\n",
|
cl_error("sg not contiguous:dma 0x%llx, iova 0x%llx\n",
|
||||||
sg_dma_address(sg),
|
sg_dma_address(sg),
|
||||||
(u64)(iova + iova_offset));
|
(u64)(iova + iova_offset));
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
iova_offset += sg->length;
|
|
||||||
}
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
dma_unmap_sg_attrs(smmu_pdev->dev, sgt->sgl, sgt->nents,
|
dma_unmap_sg_attrs(smmu_pdev->dev, sgt->sgl, sgt->nents,
|
||||||
@@ -2236,7 +2236,7 @@ failed:
|
|||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* MODS_HAS_TEGRA */
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64
|
#ifdef CONFIG_ARM64
|
||||||
static void clear_contiguous_cache(struct mods_client *client,
|
static void clear_contiguous_cache(struct mods_client *client,
|
||||||
@@ -2422,7 +2422,7 @@ int esc_mods_flush_cpu_cache_range(struct mods_client *client,
|
|||||||
LOG_EXT();
|
LOG_EXT();
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CONFIG_ARM64 */
|
||||||
|
|
||||||
static int mods_post_alloc(struct mods_client *client,
|
static int mods_post_alloc(struct mods_client *client,
|
||||||
struct MODS_PHYS_CHUNK *chunk,
|
struct MODS_PHYS_CHUNK *chunk,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
/* Driver version */
|
/* Driver version */
|
||||||
#define MODS_DRIVER_VERSION_MAJOR 4
|
#define MODS_DRIVER_VERSION_MAJOR 4
|
||||||
#define MODS_DRIVER_VERSION_MINOR 2
|
#define MODS_DRIVER_VERSION_MINOR 8
|
||||||
#define MODS_DRIVER_VERSION ((MODS_DRIVER_VERSION_MAJOR << 8) | \
|
#define MODS_DRIVER_VERSION ((MODS_DRIVER_VERSION_MAJOR << 8) | \
|
||||||
((MODS_DRIVER_VERSION_MINOR / 10) << 4) | \
|
((MODS_DRIVER_VERSION_MINOR / 10) << 4) | \
|
||||||
(MODS_DRIVER_VERSION_MINOR % 10))
|
(MODS_DRIVER_VERSION_MINOR % 10))
|
||||||
@@ -1056,6 +1056,7 @@ union ACPI_ARGUMENT {
|
|||||||
#define ACPI_MODS_TYPE_METHOD 3
|
#define ACPI_MODS_TYPE_METHOD 3
|
||||||
|
|
||||||
#define ACPI_MAX_BUFFER_LENGTH 4096
|
#define ACPI_MAX_BUFFER_LENGTH 4096
|
||||||
|
#define ACPI_MAX_DEV_CHILDREN 16
|
||||||
#define ACPI_MAX_METHOD_LENGTH 12
|
#define ACPI_MAX_METHOD_LENGTH 12
|
||||||
#define ACPI_MAX_ARGUMENT_NUMBER 12
|
#define ACPI_MAX_ARGUMENT_NUMBER 12
|
||||||
|
|
||||||
@@ -1151,6 +1152,16 @@ struct MODS_ACPI_GET_DDC {
|
|||||||
struct mods_pci_dev device;
|
struct mods_pci_dev device;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Used by MODS_ESC_GET_ACPI_DEV_CHILDREN ioctl */
|
||||||
|
struct MODS_GET_ACPI_DEV_CHILDREN {
|
||||||
|
/* OUT */
|
||||||
|
__u32 num_children;
|
||||||
|
__u32 children[ACPI_MAX_DEV_CHILDREN];
|
||||||
|
|
||||||
|
/* IN */
|
||||||
|
struct mods_pci_dev_2 device;
|
||||||
|
};
|
||||||
|
|
||||||
/* Used by ioctls:
|
/* Used by ioctls:
|
||||||
* - MODS_ESC_GET_API_VERSION
|
* - MODS_ESC_GET_API_VERSION
|
||||||
* - MODS_ESC_GET_KERNEL_VERSION (deprecated)
|
* - MODS_ESC_GET_KERNEL_VERSION (deprecated)
|
||||||
@@ -2009,6 +2020,7 @@ struct MODS_TEGRA_OIST_STATUS {
|
|||||||
#define MODS_ESC_MODS_GET_DRIVER_STATS MODSIO(R, 135, MODS_GET_DRIVER_STATS)
|
#define MODS_ESC_MODS_GET_DRIVER_STATS MODSIO(R, 135, MODS_GET_DRIVER_STATS)
|
||||||
#define MODS_ESC_BPMP_SET_PCIE_STATE MODSIO(W, 136, MODS_SET_PCIE_STATE)
|
#define MODS_ESC_BPMP_SET_PCIE_STATE MODSIO(W, 136, MODS_SET_PCIE_STATE)
|
||||||
#define MODS_ESC_BPMP_INIT_PCIE_EP_PLL MODSIO(W, 137, MODS_INIT_PCIE_EP_PLL)
|
#define MODS_ESC_BPMP_INIT_PCIE_EP_PLL MODSIO(W, 137, MODS_INIT_PCIE_EP_PLL)
|
||||||
|
#define MODS_ESC_GET_ACPI_DEV_CHILDREN MODSIO(WR, 138, MODS_GET_ACPI_DEV_CHILDREN)
|
||||||
#define MODS_ESC_SEND_TZ_MSG MODSIO(WR, 139, MODS_TZ_PARAMS)
|
#define MODS_ESC_SEND_TZ_MSG MODSIO(WR, 139, MODS_TZ_PARAMS)
|
||||||
#define MODS_ESC_OIST_STATUS MODSIO(WR, 140, MODS_TEGRA_OIST_STATUS)
|
#define MODS_ESC_OIST_STATUS MODSIO(WR, 140, MODS_TEGRA_OIST_STATUS)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user