Merge drm/drm-next into drm-misc-next
Now that 4.19-rc1 is cut, backmerge it into -misc-next. Signed-off-by: Sean Paul <seanpaul@chromium.org>
This commit is contained in:
@@ -1017,7 +1017,7 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
|
||||
nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.offset);
|
||||
nv_crtc->cursor.show(nv_crtc, true);
|
||||
out:
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -55,6 +55,9 @@ nv04_display_create(struct drm_device *dev)
|
||||
nouveau_display(dev)->init = nv04_display_init;
|
||||
nouveau_display(dev)->fini = nv04_display_fini;
|
||||
|
||||
/* Pre-nv50 doesn't support atomic, so don't expose the ioctls */
|
||||
dev->driver->driver_features &= ~DRIVER_ATOMIC;
|
||||
|
||||
nouveau_hw_save_vga_fonts(dev, 1);
|
||||
|
||||
nv04_crtc_create(dev, 0);
|
||||
|
@@ -136,12 +136,24 @@ nv50_dmac_create(struct nvif_device *device, struct nvif_object *disp,
|
||||
{
|
||||
struct nouveau_cli *cli = (void *)device->object.client;
|
||||
struct nv50_disp_core_channel_dma_v0 *args = data;
|
||||
u8 type = NVIF_MEM_COHERENT;
|
||||
int ret;
|
||||
|
||||
mutex_init(&dmac->lock);
|
||||
|
||||
ret = nvif_mem_init_map(&cli->mmu, NVIF_MEM_COHERENT, 0x1000,
|
||||
&dmac->push);
|
||||
/* Pascal added support for 47-bit physical addresses, but some
|
||||
* parts of EVO still only accept 40-bit PAs.
|
||||
*
|
||||
* To avoid issues on systems with large amounts of RAM, and on
|
||||
* systems where an IOMMU maps pages at a high address, we need
|
||||
* to allocate push buffers in VRAM instead.
|
||||
*
|
||||
* This appears to match NVIDIA's behaviour on Pascal.
|
||||
*/
|
||||
if (device->info.family == NV_DEVICE_INFO_V0_PASCAL)
|
||||
type |= NVIF_MEM_VRAM;
|
||||
|
||||
ret = nvif_mem_init_map(&cli->mmu, type, 0x1000, &dmac->push);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -216,6 +228,19 @@ void
|
||||
evo_kick(u32 *push, struct nv50_dmac *evoc)
|
||||
{
|
||||
struct nv50_dmac *dmac = evoc;
|
||||
|
||||
/* Push buffer fetches are not coherent with BAR1, we need to ensure
|
||||
* writes have been flushed right through to VRAM before writing PUT.
|
||||
*/
|
||||
if (dmac->push.type & NVIF_MEM_VRAM) {
|
||||
struct nvif_device *device = dmac->base.device;
|
||||
nvif_wr32(&device->object, 0x070000, 0x00000001);
|
||||
nvif_msec(device, 2000,
|
||||
if (!(nvif_rd32(&device->object, 0x070000) & 0x00000002))
|
||||
break;
|
||||
);
|
||||
}
|
||||
|
||||
nvif_wr32(&dmac->base.user, 0x0000, (push - dmac->ptr) << 2);
|
||||
mutex_unlock(&dmac->lock);
|
||||
}
|
||||
@@ -1007,7 +1032,7 @@ nv50_mstm_destroy_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
mstc->port = NULL;
|
||||
drm_modeset_unlock(&drm->dev->mode_config.connection_mutex);
|
||||
|
||||
drm_connector_unreference(&mstc->connector);
|
||||
drm_connector_put(&mstc->connector);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1585,8 +1610,9 @@ nv50_pior_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
||||
*****************************************************************************/
|
||||
|
||||
static void
|
||||
nv50_disp_atomic_commit_core(struct nouveau_drm *drm, u32 *interlock)
|
||||
nv50_disp_atomic_commit_core(struct drm_atomic_state *state, u32 *interlock)
|
||||
{
|
||||
struct nouveau_drm *drm = nouveau_drm(state->dev);
|
||||
struct nv50_disp *disp = nv50_disp(drm->dev);
|
||||
struct nv50_core *core = disp->core;
|
||||
struct nv50_mstm *mstm;
|
||||
@@ -1617,6 +1643,22 @@ nv50_disp_atomic_commit_core(struct nouveau_drm *drm, u32 *interlock)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_disp_atomic_commit_wndw(struct drm_atomic_state *state, u32 *interlock)
|
||||
{
|
||||
struct drm_plane_state *new_plane_state;
|
||||
struct drm_plane *plane;
|
||||
int i;
|
||||
|
||||
for_each_new_plane_in_state(state, plane, new_plane_state, i) {
|
||||
struct nv50_wndw *wndw = nv50_wndw(plane);
|
||||
if (interlock[wndw->interlock.type] & wndw->interlock.data) {
|
||||
if (wndw->func->update)
|
||||
wndw->func->update(wndw, interlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
{
|
||||
@@ -1684,7 +1726,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
help->disable(encoder);
|
||||
interlock[NV50_DISP_INTERLOCK_CORE] |= 1;
|
||||
if (outp->flush_disable) {
|
||||
nv50_disp_atomic_commit_core(drm, interlock);
|
||||
nv50_disp_atomic_commit_wndw(state, interlock);
|
||||
nv50_disp_atomic_commit_core(state, interlock);
|
||||
memset(interlock, 0x00, sizeof(interlock));
|
||||
}
|
||||
}
|
||||
@@ -1693,15 +1736,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
/* Flush disable. */
|
||||
if (interlock[NV50_DISP_INTERLOCK_CORE]) {
|
||||
if (atom->flush_disable) {
|
||||
for_each_new_plane_in_state(state, plane, new_plane_state, i) {
|
||||
struct nv50_wndw *wndw = nv50_wndw(plane);
|
||||
if (interlock[wndw->interlock.type] & wndw->interlock.data) {
|
||||
if (wndw->func->update)
|
||||
wndw->func->update(wndw, interlock);
|
||||
}
|
||||
}
|
||||
|
||||
nv50_disp_atomic_commit_core(drm, interlock);
|
||||
nv50_disp_atomic_commit_wndw(state, interlock);
|
||||
nv50_disp_atomic_commit_core(state, interlock);
|
||||
memset(interlock, 0x00, sizeof(interlock));
|
||||
}
|
||||
}
|
||||
@@ -1762,18 +1798,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
}
|
||||
|
||||
/* Flush update. */
|
||||
for_each_new_plane_in_state(state, plane, new_plane_state, i) {
|
||||
struct nv50_wndw *wndw = nv50_wndw(plane);
|
||||
if (interlock[wndw->interlock.type] & wndw->interlock.data) {
|
||||
if (wndw->func->update)
|
||||
wndw->func->update(wndw, interlock);
|
||||
}
|
||||
}
|
||||
nv50_disp_atomic_commit_wndw(state, interlock);
|
||||
|
||||
if (interlock[NV50_DISP_INTERLOCK_CORE]) {
|
||||
if (interlock[NV50_DISP_INTERLOCK_BASE] ||
|
||||
interlock[NV50_DISP_INTERLOCK_OVLY] ||
|
||||
interlock[NV50_DISP_INTERLOCK_WNDW] ||
|
||||
!atom->state.legacy_cursor_update)
|
||||
nv50_disp_atomic_commit_core(drm, interlock);
|
||||
nv50_disp_atomic_commit_core(state, interlock);
|
||||
else
|
||||
disp->core->func->update(disp->core, interlock, false);
|
||||
}
|
||||
@@ -1871,7 +1903,7 @@ nv50_disp_atomic_commit(struct drm_device *dev,
|
||||
nv50_disp_atomic_commit_tail(state);
|
||||
|
||||
drm_for_each_crtc(crtc, dev) {
|
||||
if (crtc->state->enable) {
|
||||
if (crtc->state->active) {
|
||||
if (!drm->have_disp_power_ref) {
|
||||
drm->have_disp_power_ref = true;
|
||||
return 0;
|
||||
@@ -2119,10 +2151,6 @@ nv50_display_destroy(struct drm_device *dev)
|
||||
kfree(disp);
|
||||
}
|
||||
|
||||
MODULE_PARM_DESC(atomic, "Expose atomic ioctl (default: disabled)");
|
||||
static int nouveau_atomic = 0;
|
||||
module_param_named(atomic, nouveau_atomic, int, 0400);
|
||||
|
||||
int
|
||||
nv50_display_create(struct drm_device *dev)
|
||||
{
|
||||
@@ -2147,8 +2175,6 @@ nv50_display_create(struct drm_device *dev)
|
||||
disp->disp = &nouveau_display(dev)->disp;
|
||||
dev->mode_config.funcs = &nv50_disp_func;
|
||||
dev->driver->driver_features |= DRIVER_PREFER_XBGR_30BPP;
|
||||
if (nouveau_atomic)
|
||||
dev->driver->driver_features |= DRIVER_ATOMIC;
|
||||
|
||||
/* small shared memory area we use for notifiers and semaphores */
|
||||
ret = nouveau_bo_new(&drm->client, 4096, 0x1000, TTM_PL_FLAG_VRAM,
|
||||
@@ -2231,6 +2257,9 @@ nv50_display_create(struct drm_device *dev)
|
||||
connector->funcs->destroy(connector);
|
||||
}
|
||||
|
||||
/* Disable vblank irqs aggressively for power-saving, safe on nv50+ */
|
||||
dev->vblank_disable_immediate = true;
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
nv50_display_destroy(dev);
|
||||
|
@@ -586,7 +586,6 @@ nv50_wndw_new_(const struct nv50_wndw_func *func, struct drm_device *dev,
|
||||
wndw->id = index;
|
||||
wndw->interlock.type = interlock_type;
|
||||
wndw->interlock.data = interlock_data;
|
||||
wndw->ctxdma.parent = &wndw->wndw.base.user;
|
||||
|
||||
wndw->ctxdma.parent = &wndw->wndw.base.user;
|
||||
INIT_LIST_HEAD(&wndw->ctxdma.list);
|
||||
|
@@ -78,7 +78,7 @@ struct nvif_mclass {
|
||||
#define nvif_mclass(o,m) ({ \
|
||||
struct nvif_object *object = (o); \
|
||||
struct nvif_sclass *sclass; \
|
||||
const typeof(m[0]) *mclass = (m); \
|
||||
typeof(m[0]) *mclass = (m); \
|
||||
int ret = -ENODEV; \
|
||||
int cnt, i, j; \
|
||||
\
|
||||
|
@@ -139,7 +139,7 @@ nouveau_abi16_chan_fini(struct nouveau_abi16 *abi16,
|
||||
if (chan->ntfy) {
|
||||
nouveau_vma_del(&chan->ntfy_vma);
|
||||
nouveau_bo_unpin(chan->ntfy);
|
||||
drm_gem_object_unreference_unlocked(&chan->ntfy->gem);
|
||||
drm_gem_object_put_unlocked(&chan->ntfy->gem);
|
||||
}
|
||||
|
||||
if (chan->heap.block_size)
|
||||
|
@@ -267,6 +267,7 @@ nouveau_backlight_init(struct drm_device *dev)
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct nvif_device *device = &drm->client.device;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
|
||||
INIT_LIST_HEAD(&drm->bl_connectors);
|
||||
|
||||
@@ -275,7 +276,8 @@ nouveau_backlight_init(struct drm_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS &&
|
||||
connector->connector_type != DRM_MODE_CONNECTOR_eDP)
|
||||
continue;
|
||||
@@ -292,7 +294,7 @@ nouveau_backlight_init(struct drm_device *dev)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1193,14 +1193,19 @@ nouveau_connector_create(struct drm_device *dev, int index)
|
||||
struct nouveau_display *disp = nouveau_display(dev);
|
||||
struct nouveau_connector *nv_connector = NULL;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
int type, ret = 0;
|
||||
bool dummy;
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
|
||||
nv_connector = nouveau_connector(connector);
|
||||
if (nv_connector->index == index)
|
||||
if (nv_connector->index == index) {
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
return connector;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL);
|
||||
if (!nv_connector)
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <drm/drm_encoder.h>
|
||||
#include <drm/drm_dp_helper.h>
|
||||
#include "nouveau_crtc.h"
|
||||
#include "nouveau_encoder.h"
|
||||
|
||||
struct nvkm_i2c_port;
|
||||
|
||||
@@ -60,19 +61,46 @@ static inline struct nouveau_connector *nouveau_connector(
|
||||
return container_of(con, struct nouveau_connector, base);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nouveau_connector_is_mst(struct drm_connector *connector)
|
||||
{
|
||||
const struct nouveau_encoder *nv_encoder;
|
||||
const struct drm_encoder *encoder;
|
||||
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
|
||||
return false;
|
||||
|
||||
nv_encoder = find_encoder(connector, DCB_OUTPUT_ANY);
|
||||
if (!nv_encoder)
|
||||
return false;
|
||||
|
||||
encoder = &nv_encoder->base.base;
|
||||
return encoder->encoder_type == DRM_MODE_ENCODER_DPMST;
|
||||
}
|
||||
|
||||
#define nouveau_for_each_non_mst_connector_iter(connector, iter) \
|
||||
drm_for_each_connector_iter(connector, iter) \
|
||||
for_each_if(!nouveau_connector_is_mst(connector))
|
||||
|
||||
static inline struct nouveau_connector *
|
||||
nouveau_crtc_connector_get(struct nouveau_crtc *nv_crtc)
|
||||
{
|
||||
struct drm_device *dev = nv_crtc->base.dev;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct nouveau_connector *nv_connector = NULL;
|
||||
struct drm_crtc *crtc = to_drm_crtc(nv_crtc);
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
if (connector->encoder && connector->encoder->crtc == crtc)
|
||||
return nouveau_connector(connector);
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
|
||||
if (connector->encoder && connector->encoder->crtc == crtc) {
|
||||
nv_connector = nouveau_connector(connector);
|
||||
break;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return NULL;
|
||||
return nv_connector;
|
||||
}
|
||||
|
||||
struct drm_connector *
|
||||
|
@@ -160,7 +160,11 @@ nouveau_debugfs_pstate_set(struct file *file, const char __user *ubuf,
|
||||
args.ustate = value;
|
||||
}
|
||||
|
||||
ret = pm_runtime_get_sync(drm->dev);
|
||||
if (IS_ERR_VALUE(ret) && ret != -EACCES)
|
||||
return ret;
|
||||
ret = nvif_mthd(ctrl, NVIF_CONTROL_PSTATE_USER, &args, sizeof(args));
|
||||
pm_runtime_put_autosuspend(drm->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@@ -205,7 +205,7 @@ nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
|
||||
struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
|
||||
|
||||
if (fb->nvbo)
|
||||
drm_gem_object_unreference_unlocked(&fb->nvbo->gem);
|
||||
drm_gem_object_put_unlocked(&fb->nvbo->gem);
|
||||
|
||||
drm_framebuffer_cleanup(drm_fb);
|
||||
kfree(fb);
|
||||
@@ -287,7 +287,7 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||
if (ret == 0)
|
||||
return &fb->base;
|
||||
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -404,6 +404,7 @@ nouveau_display_init(struct drm_device *dev)
|
||||
struct nouveau_display *disp = nouveau_display(dev);
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
int ret;
|
||||
|
||||
ret = disp->init(dev);
|
||||
@@ -411,10 +412,12 @@ nouveau_display_init(struct drm_device *dev)
|
||||
return ret;
|
||||
|
||||
/* enable hotplug interrupts */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
|
||||
struct nouveau_connector *conn = nouveau_connector(connector);
|
||||
nvif_notify_get(&conn->hpd);
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
/* enable flip completion events */
|
||||
nvif_notify_get(&drm->flip);
|
||||
@@ -427,6 +430,7 @@ nouveau_display_fini(struct drm_device *dev, bool suspend)
|
||||
struct nouveau_display *disp = nouveau_display(dev);
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
|
||||
if (!suspend) {
|
||||
if (drm_drv_uses_atomic_modeset(dev))
|
||||
@@ -439,10 +443,12 @@ nouveau_display_fini(struct drm_device *dev, bool suspend)
|
||||
nvif_notify_put(&drm->flip);
|
||||
|
||||
/* disable hotplug interrupts */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
|
||||
struct nouveau_connector *conn = nouveau_connector(connector);
|
||||
nvif_notify_put(&conn->hpd);
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
disp->fini(dev);
|
||||
@@ -939,7 +945,7 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
return ret;
|
||||
|
||||
ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle);
|
||||
drm_gem_object_unreference_unlocked(&bo->gem);
|
||||
drm_gem_object_put_unlocked(&bo->gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -954,7 +960,7 @@ nouveau_display_dumb_map_offset(struct drm_file *file_priv,
|
||||
if (gem) {
|
||||
struct nouveau_bo *bo = nouveau_gem_object(gem);
|
||||
*poffset = drm_vma_node_offset_addr(&bo->bo.vma_node);
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -81,6 +81,10 @@ MODULE_PARM_DESC(modeset, "enable driver (default: auto, "
|
||||
int nouveau_modeset = -1;
|
||||
module_param_named(modeset, nouveau_modeset, int, 0400);
|
||||
|
||||
MODULE_PARM_DESC(atomic, "Expose atomic ioctl (default: disabled)");
|
||||
static int nouveau_atomic = 0;
|
||||
module_param_named(atomic, nouveau_atomic, int, 0400);
|
||||
|
||||
MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
|
||||
static int nouveau_runtime_pm = -1;
|
||||
module_param_named(runpm, nouveau_runtime_pm, int, 0400);
|
||||
@@ -509,6 +513,9 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
if (nouveau_atomic)
|
||||
driver_pci.driver_features |= DRIVER_ATOMIC;
|
||||
|
||||
ret = drm_get_pci_dev(pdev, pent, &driver_pci);
|
||||
if (ret) {
|
||||
nvkm_device_del(&device);
|
||||
@@ -874,22 +881,11 @@ nouveau_pmops_runtime_resume(struct device *dev)
|
||||
static int
|
||||
nouveau_pmops_runtime_idle(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
||||
struct nouveau_drm *drm = nouveau_drm(drm_dev);
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
if (!nouveau_pmops_runtime()) {
|
||||
pm_runtime_forbid(dev);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
|
||||
if (crtc->enabled) {
|
||||
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_autosuspend(dev);
|
||||
/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
|
||||
@@ -912,8 +908,10 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
|
||||
get_task_comm(tmpname, current);
|
||||
snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
|
||||
|
||||
if (!(cli = kzalloc(sizeof(*cli), GFP_KERNEL)))
|
||||
return ret;
|
||||
if (!(cli = kzalloc(sizeof(*cli), GFP_KERNEL))) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = nouveau_cli_init(drm, name, cli);
|
||||
if (ret)
|
||||
|
@@ -429,7 +429,7 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *fbcon)
|
||||
nouveau_vma_del(&nouveau_fb->vma);
|
||||
nouveau_bo_unmap(nouveau_fb->nvbo);
|
||||
nouveau_bo_unpin(nouveau_fb->nvbo);
|
||||
drm_framebuffer_unreference(&nouveau_fb->base);
|
||||
drm_framebuffer_put(&nouveau_fb->base);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -274,7 +274,7 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
/* drop reference from allocate - handle holds it now */
|
||||
drm_gem_object_unreference_unlocked(&nvbo->gem);
|
||||
drm_gem_object_put_unlocked(&nvbo->gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@ validate_fini_no_ticket(struct validate_op *op, struct nouveau_fence *fence,
|
||||
list_del(&nvbo->entry);
|
||||
nvbo->reserved_by = NULL;
|
||||
ttm_bo_unreserve(&nvbo->bo);
|
||||
drm_gem_object_unreference_unlocked(&nvbo->gem);
|
||||
drm_gem_object_put_unlocked(&nvbo->gem);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,14 +400,14 @@ retry:
|
||||
nvbo = nouveau_gem_object(gem);
|
||||
if (nvbo == res_bo) {
|
||||
res_bo = NULL;
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (nvbo->reserved_by && nvbo->reserved_by == file_priv) {
|
||||
NV_PRINTK(err, cli, "multiple instances of buffer %d on "
|
||||
"validation list\n", b->handle);
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
@@ -616,7 +616,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
|
||||
struct nouveau_bo *nvbo;
|
||||
uint32_t data;
|
||||
|
||||
if (unlikely(r->bo_index > req->nr_buffers)) {
|
||||
if (unlikely(r->bo_index >= req->nr_buffers)) {
|
||||
NV_PRINTK(err, cli, "reloc bo index invalid\n");
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
@@ -626,7 +626,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
|
||||
if (b->presumed.valid)
|
||||
continue;
|
||||
|
||||
if (unlikely(r->reloc_bo_index > req->nr_buffers)) {
|
||||
if (unlikely(r->reloc_bo_index >= req->nr_buffers)) {
|
||||
NV_PRINTK(err, cli, "reloc container bo index invalid\n");
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
@@ -894,7 +894,7 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data,
|
||||
ret = lret;
|
||||
|
||||
nouveau_bo_sync_for_cpu(nvbo);
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -913,7 +913,7 @@ nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data,
|
||||
nvbo = nouveau_gem_object(gem);
|
||||
|
||||
nouveau_bo_sync_for_device(nvbo);
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -930,7 +930,7 @@ nouveau_gem_ioctl_info(struct drm_device *dev, void *data,
|
||||
return -ENOENT;
|
||||
|
||||
ret = nouveau_gem_info(file_priv, gem, req);
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -69,8 +69,8 @@ nouveau_hwmon_set_temp1_auto_point1_temp(struct device *d,
|
||||
struct nvkm_therm *therm = nvxx_therm(&drm->client.device);
|
||||
long value;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
if (kstrtol(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
|
||||
therm->attr_set(therm, NVKM_THERM_ATTR_THRS_FAN_BOOST,
|
||||
value / 1000);
|
||||
@@ -102,8 +102,8 @@ nouveau_hwmon_set_temp1_auto_point1_temp_hyst(struct device *d,
|
||||
struct nvkm_therm *therm = nvxx_therm(&drm->client.device);
|
||||
long value;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
return count;
|
||||
if (kstrtol(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
|
||||
therm->attr_set(therm, NVKM_THERM_ATTR_THRS_FAN_BOOST_HYST,
|
||||
value / 1000);
|
||||
@@ -156,7 +156,7 @@ nouveau_hwmon_set_pwm1_min(struct device *d, struct device_attribute *a,
|
||||
long value;
|
||||
int ret;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
if (kstrtol(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
|
||||
ret = therm->attr_set(therm, NVKM_THERM_ATTR_FAN_MIN_DUTY, value);
|
||||
@@ -179,7 +179,7 @@ nouveau_hwmon_set_pwm1_max(struct device *d, struct device_attribute *a,
|
||||
long value;
|
||||
int ret;
|
||||
|
||||
if (kstrtol(buf, 10, &value) == -EINVAL)
|
||||
if (kstrtol(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
|
||||
ret = therm->attr_set(therm, NVKM_THERM_ATTR_FAN_MAX_DUTY, value);
|
||||
|
@@ -36,7 +36,7 @@ static int nouveau_platform_probe(struct platform_device *pdev)
|
||||
|
||||
ret = drm_dev_register(drm, 0);
|
||||
if (ret < 0) {
|
||||
drm_dev_unref(drm);
|
||||
drm_dev_put(drm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -87,11 +87,12 @@ nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
|
||||
{
|
||||
struct nvkm_engine *engine = nvkm_engine(subdev);
|
||||
if (engine->func->info) {
|
||||
if ((engine = nvkm_engine_ref(engine))) {
|
||||
if (!IS_ERR((engine = nvkm_engine_ref(engine)))) {
|
||||
int ret = engine->func->info(engine, mthd, data);
|
||||
nvkm_engine_unref(&engine);
|
||||
return ret;
|
||||
}
|
||||
return PTR_ERR(engine);
|
||||
}
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@@ -23,6 +23,10 @@
|
||||
#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
|
||||
#include "priv.h"
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
|
||||
#include <asm/dma-iommu.h>
|
||||
#endif
|
||||
|
||||
static int
|
||||
nvkm_device_tegra_power_up(struct nvkm_device_tegra *tdev)
|
||||
{
|
||||
@@ -105,6 +109,15 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
|
||||
unsigned long pgsize_bitmap;
|
||||
int ret;
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
|
||||
if (dev->archdata.mapping) {
|
||||
struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
|
||||
|
||||
arm_iommu_detach_device(dev);
|
||||
arm_iommu_release_mapping(mapping);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!tdev->func->iommu_bit)
|
||||
return;
|
||||
|
||||
|
@@ -52,7 +52,7 @@ void
|
||||
gf119_disp_chan_intr(struct nv50_disp_chan *chan, bool en)
|
||||
{
|
||||
struct nvkm_device *device = chan->disp->base.engine.subdev.device;
|
||||
const u64 mask = 0x00000001 << chan->chid.user;
|
||||
const u32 mask = 0x00000001 << chan->chid.user;
|
||||
if (!en) {
|
||||
nvkm_mask(device, 0x610090, mask, 0x00000000);
|
||||
nvkm_mask(device, 0x6100a0, mask, 0x00000000);
|
||||
|
@@ -166,8 +166,8 @@ void
|
||||
nv50_disp_chan_intr(struct nv50_disp_chan *chan, bool en)
|
||||
{
|
||||
struct nvkm_device *device = chan->disp->base.engine.subdev.device;
|
||||
const u64 mask = 0x00010001 << chan->chid.user;
|
||||
const u64 data = en ? 0x00010000 : 0x00000000;
|
||||
const u32 mask = 0x00010001 << chan->chid.user;
|
||||
const u32 data = en ? 0x00010000 << chan->chid.user : 0x00000000;
|
||||
nvkm_mask(device, 0x610028, mask, data);
|
||||
}
|
||||
|
||||
|
@@ -25,24 +25,31 @@
|
||||
#include <nvif/class.h>
|
||||
|
||||
static void
|
||||
gv100_gr_trap_mp(struct gf100_gr *gr, int gpc, int tpc)
|
||||
gv100_gr_trap_sm(struct gf100_gr *gr, int gpc, int tpc, int sm)
|
||||
{
|
||||
struct nvkm_subdev *subdev = &gr->base.engine.subdev;
|
||||
struct nvkm_device *device = subdev->device;
|
||||
u32 werr = nvkm_rd32(device, TPC_UNIT(gpc, tpc, 0x730));
|
||||
u32 gerr = nvkm_rd32(device, TPC_UNIT(gpc, tpc, 0x734));
|
||||
u32 werr = nvkm_rd32(device, TPC_UNIT(gpc, tpc, 0x730 + (sm * 0x80)));
|
||||
u32 gerr = nvkm_rd32(device, TPC_UNIT(gpc, tpc, 0x734 + (sm * 0x80)));
|
||||
const struct nvkm_enum *warp;
|
||||
char glob[128];
|
||||
|
||||
nvkm_snprintbf(glob, sizeof(glob), gf100_mp_global_error, gerr);
|
||||
warp = nvkm_enum_find(gf100_mp_warp_error, werr & 0xffff);
|
||||
|
||||
nvkm_error(subdev, "GPC%i/TPC%i/MP trap: "
|
||||
nvkm_error(subdev, "GPC%i/TPC%i/SM%d trap: "
|
||||
"global %08x [%s] warp %04x [%s]\n",
|
||||
gpc, tpc, gerr, glob, werr, warp ? warp->name : "");
|
||||
gpc, tpc, sm, gerr, glob, werr, warp ? warp->name : "");
|
||||
|
||||
nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x730), 0x00000000);
|
||||
nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x734), gerr);
|
||||
nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x730 + sm * 0x80), 0x00000000);
|
||||
nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x734 + sm * 0x80), gerr);
|
||||
}
|
||||
|
||||
static void
|
||||
gv100_gr_trap_mp(struct gf100_gr *gr, int gpc, int tpc)
|
||||
{
|
||||
gv100_gr_trap_sm(gr, gpc, tpc, 0);
|
||||
gv100_gr_trap_sm(gr, gpc, tpc, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -58,8 +58,14 @@ nvbios_vpstate_parse(struct nvkm_bios *b, struct nvbios_vpstate_header *h)
|
||||
h->ecount = nvbios_rd08(b, h->offset + 0x5);
|
||||
|
||||
h->base_id = nvbios_rd08(b, h->offset + 0x0f);
|
||||
h->boost_id = nvbios_rd08(b, h->offset + 0x10);
|
||||
h->tdp_id = nvbios_rd08(b, h->offset + 0x11);
|
||||
if (h->hlen > 0x10)
|
||||
h->boost_id = nvbios_rd08(b, h->offset + 0x10);
|
||||
else
|
||||
h->boost_id = 0xff;
|
||||
if (h->hlen > 0x11)
|
||||
h->tdp_id = nvbios_rd08(b, h->offset + 0x11);
|
||||
else
|
||||
h->tdp_id = 0xff;
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@@ -133,8 +133,14 @@ nvkm_fault_oneinit(struct nvkm_subdev *subdev)
|
||||
}
|
||||
}
|
||||
|
||||
return nvkm_event_init(&nvkm_fault_ntfy, 1, fault->buffer_nr,
|
||||
&fault->event);
|
||||
ret = nvkm_event_init(&nvkm_fault_ntfy, 1, fault->buffer_nr,
|
||||
&fault->event);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (fault->func->oneinit)
|
||||
ret = fault->func->oneinit(fault);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void *
|
||||
|
@@ -176,8 +176,17 @@ gv100_fault_init(struct nvkm_fault *fault)
|
||||
nvkm_notify_get(&fault->nrpfb);
|
||||
}
|
||||
|
||||
static int
|
||||
gv100_fault_oneinit(struct nvkm_fault *fault)
|
||||
{
|
||||
return nvkm_notify_init(&fault->buffer[0]->object, &fault->event,
|
||||
gv100_fault_ntfy_nrpfb, false, NULL, 0, 0,
|
||||
&fault->nrpfb);
|
||||
}
|
||||
|
||||
static const struct nvkm_fault_func
|
||||
gv100_fault = {
|
||||
.oneinit = gv100_fault_oneinit,
|
||||
.init = gv100_fault_init,
|
||||
.fini = gv100_fault_fini,
|
||||
.intr = gv100_fault_intr,
|
||||
@@ -192,15 +201,5 @@ int
|
||||
gv100_fault_new(struct nvkm_device *device, int index,
|
||||
struct nvkm_fault **pfault)
|
||||
{
|
||||
struct nvkm_fault *fault;
|
||||
int ret;
|
||||
|
||||
ret = nvkm_fault_new_(&gv100_fault, device, index, &fault);
|
||||
*pfault = fault;
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return nvkm_notify_init(&fault->buffer[0]->object, &fault->event,
|
||||
gv100_fault_ntfy_nrpfb, false, NULL, 0, 0,
|
||||
&fault->nrpfb);
|
||||
return nvkm_fault_new_(&gv100_fault, device, index, pfault);
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ int nvkm_fault_new_(const struct nvkm_fault_func *, struct nvkm_device *,
|
||||
int index, struct nvkm_fault **);
|
||||
|
||||
struct nvkm_fault_func {
|
||||
int (*oneinit)(struct nvkm_fault *);
|
||||
void (*init)(struct nvkm_fault *);
|
||||
void (*fini)(struct nvkm_fault *);
|
||||
void (*intr)(struct nvkm_fault *);
|
||||
|
@@ -140,6 +140,9 @@ nvkm_fb_init(struct nvkm_subdev *subdev)
|
||||
if (fb->func->init)
|
||||
fb->func->init(fb);
|
||||
|
||||
if (fb->func->init_remapper)
|
||||
fb->func->init_remapper(fb);
|
||||
|
||||
if (fb->func->init_page) {
|
||||
ret = fb->func->init_page(fb);
|
||||
if (WARN_ON(ret))
|
||||
|
@@ -36,6 +36,14 @@ gp100_fb_init_unkn(struct nvkm_fb *base)
|
||||
nvkm_wr32(device, 0x1faccc, nvkm_rd32(device, 0x100ccc));
|
||||
}
|
||||
|
||||
void
|
||||
gp100_fb_init_remapper(struct nvkm_fb *fb)
|
||||
{
|
||||
struct nvkm_device *device = fb->subdev.device;
|
||||
/* Disable address remapper. */
|
||||
nvkm_mask(device, 0x100c14, 0x00040000, 0x00000000);
|
||||
}
|
||||
|
||||
void
|
||||
gp100_fb_init(struct nvkm_fb *base)
|
||||
{
|
||||
@@ -56,6 +64,7 @@ gp100_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
.oneinit = gf100_fb_oneinit,
|
||||
.init = gp100_fb_init,
|
||||
.init_remapper = gp100_fb_init_remapper,
|
||||
.init_page = gm200_fb_init_page,
|
||||
.init_unkn = gp100_fb_init_unkn,
|
||||
.ram_new = gp100_ram_new,
|
||||
|
@@ -31,6 +31,7 @@ gp102_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
.oneinit = gf100_fb_oneinit,
|
||||
.init = gp100_fb_init,
|
||||
.init_remapper = gp100_fb_init_remapper,
|
||||
.init_page = gm200_fb_init_page,
|
||||
.ram_new = gp100_ram_new,
|
||||
};
|
||||
|
@@ -11,6 +11,7 @@ struct nvkm_fb_func {
|
||||
u32 (*tags)(struct nvkm_fb *);
|
||||
int (*oneinit)(struct nvkm_fb *);
|
||||
void (*init)(struct nvkm_fb *);
|
||||
void (*init_remapper)(struct nvkm_fb *);
|
||||
int (*init_page)(struct nvkm_fb *);
|
||||
void (*init_unkn)(struct nvkm_fb *);
|
||||
void (*intr)(struct nvkm_fb *);
|
||||
@@ -69,5 +70,6 @@ int gf100_fb_init_page(struct nvkm_fb *);
|
||||
|
||||
int gm200_fb_init_page(struct nvkm_fb *);
|
||||
|
||||
void gp100_fb_init_remapper(struct nvkm_fb *);
|
||||
void gp100_fb_init_unkn(struct nvkm_fb *);
|
||||
#endif
|
||||
|
@@ -414,6 +414,20 @@ acr_r352_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
{
|
||||
struct ls_ucode_img *_img;
|
||||
u32 pos = 0;
|
||||
u32 max_desc_size = 0;
|
||||
u8 *gdesc;
|
||||
|
||||
/* Figure out how large we need gdesc to be. */
|
||||
list_for_each_entry(_img, imgs, node) {
|
||||
const struct acr_r352_ls_func *ls_func =
|
||||
acr->func->ls_func[_img->falcon_id];
|
||||
|
||||
max_desc_size = max(max_desc_size, ls_func->bl_desc_size);
|
||||
}
|
||||
|
||||
gdesc = kmalloc(max_desc_size, GFP_KERNEL);
|
||||
if (!gdesc)
|
||||
return -ENOMEM;
|
||||
|
||||
nvkm_kmap(wpr_blob);
|
||||
|
||||
@@ -421,7 +435,6 @@ acr_r352_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
struct ls_ucode_img_r352 *img = ls_ucode_img_r352(_img);
|
||||
const struct acr_r352_ls_func *ls_func =
|
||||
acr->func->ls_func[_img->falcon_id];
|
||||
u8 gdesc[ls_func->bl_desc_size];
|
||||
|
||||
nvkm_gpuobj_memcpy_to(wpr_blob, pos, &img->wpr_header,
|
||||
sizeof(img->wpr_header));
|
||||
@@ -447,6 +460,8 @@ acr_r352_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
|
||||
nvkm_done(wpr_blob);
|
||||
|
||||
kfree(gdesc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -771,7 +786,11 @@ acr_r352_load(struct nvkm_acr *_acr, struct nvkm_falcon *falcon,
|
||||
struct fw_bl_desc *hsbl_desc;
|
||||
void *bl, *blob_data, *hsbl_code, *hsbl_data;
|
||||
u32 code_size;
|
||||
u8 bl_desc[bl_desc_size];
|
||||
u8 *bl_desc;
|
||||
|
||||
bl_desc = kzalloc(bl_desc_size, GFP_KERNEL);
|
||||
if (!bl_desc)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Find the bootloader descriptor for our blob and copy it */
|
||||
if (blob == acr->load_blob) {
|
||||
@@ -802,7 +821,6 @@ acr_r352_load(struct nvkm_acr *_acr, struct nvkm_falcon *falcon,
|
||||
code_size, hsbl_desc->start_tag, 0, false);
|
||||
|
||||
/* Generate the BL header */
|
||||
memset(bl_desc, 0, bl_desc_size);
|
||||
acr->func->generate_hs_bl_desc(load_hdr, bl_desc, offset);
|
||||
|
||||
/*
|
||||
@@ -811,6 +829,7 @@ acr_r352_load(struct nvkm_acr *_acr, struct nvkm_falcon *falcon,
|
||||
nvkm_falcon_load_dmem(falcon, bl_desc, hsbl_desc->dmem_load_off,
|
||||
bl_desc_size, 0);
|
||||
|
||||
kfree(bl_desc);
|
||||
return hsbl_desc->start_tag << 8;
|
||||
}
|
||||
|
||||
|
@@ -265,6 +265,19 @@ acr_r367_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
{
|
||||
struct ls_ucode_img *_img;
|
||||
u32 pos = 0;
|
||||
u32 max_desc_size = 0;
|
||||
u8 *gdesc;
|
||||
|
||||
list_for_each_entry(_img, imgs, node) {
|
||||
const struct acr_r352_ls_func *ls_func =
|
||||
acr->func->ls_func[_img->falcon_id];
|
||||
|
||||
max_desc_size = max(max_desc_size, ls_func->bl_desc_size);
|
||||
}
|
||||
|
||||
gdesc = kmalloc(max_desc_size, GFP_KERNEL);
|
||||
if (!gdesc)
|
||||
return -ENOMEM;
|
||||
|
||||
nvkm_kmap(wpr_blob);
|
||||
|
||||
@@ -272,7 +285,6 @@ acr_r367_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
struct ls_ucode_img_r367 *img = ls_ucode_img_r367(_img);
|
||||
const struct acr_r352_ls_func *ls_func =
|
||||
acr->func->ls_func[_img->falcon_id];
|
||||
u8 gdesc[ls_func->bl_desc_size];
|
||||
|
||||
nvkm_gpuobj_memcpy_to(wpr_blob, pos, &img->wpr_header,
|
||||
sizeof(img->wpr_header));
|
||||
@@ -298,6 +310,8 @@ acr_r367_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
|
||||
|
||||
nvkm_done(wpr_blob);
|
||||
|
||||
kfree(gdesc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -129,6 +129,7 @@ gm20b_secboot_new(struct nvkm_device *device, int index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
|
||||
MODULE_FIRMWARE("nvidia/gm20b/acr/bl.bin");
|
||||
MODULE_FIRMWARE("nvidia/gm20b/acr/ucode_load.bin");
|
||||
MODULE_FIRMWARE("nvidia/gm20b/gr/fecs_bl.bin");
|
||||
@@ -144,3 +145,4 @@ MODULE_FIRMWARE("nvidia/gm20b/gr/sw_method_init.bin");
|
||||
MODULE_FIRMWARE("nvidia/gm20b/pmu/desc.bin");
|
||||
MODULE_FIRMWARE("nvidia/gm20b/pmu/image.bin");
|
||||
MODULE_FIRMWARE("nvidia/gm20b/pmu/sig.bin");
|
||||
#endif
|
||||
|
@@ -74,6 +74,7 @@ gp10b_secboot_new(struct nvkm_device *device, int index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARCH_TEGRA_186_SOC)
|
||||
MODULE_FIRMWARE("nvidia/gp10b/acr/bl.bin");
|
||||
MODULE_FIRMWARE("nvidia/gp10b/acr/ucode_load.bin");
|
||||
MODULE_FIRMWARE("nvidia/gp10b/gr/fecs_bl.bin");
|
||||
@@ -91,3 +92,4 @@ MODULE_FIRMWARE("nvidia/gp10b/gr/sw_method_init.bin");
|
||||
MODULE_FIRMWARE("nvidia/gp10b/pmu/desc.bin");
|
||||
MODULE_FIRMWARE("nvidia/gp10b/pmu/image.bin");
|
||||
MODULE_FIRMWARE("nvidia/gp10b/pmu/sig.bin");
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user