18f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs/* 28f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * Copyright 2011 Red Hat Inc. 38f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * 48f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 58f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * copy of this software and associated documentation files (the "Software"), 68f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * to deal in the Software without restriction, including without limitation 78f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the 98f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * Software is furnished to do so, subject to the following conditions: 108f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * 118f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * The above copyright notice and this permission notice shall be included in 128f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * all copies or substantial portions of the Software. 138f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * 148f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE. 218f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * 228f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs * Authors: Ben Skeggs 238f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs */ 248f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 258f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs#include "drmP.h" 268f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs#include "nouveau_drv.h" 278f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs#include "nouveau_util.h" 288f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs#include "nouveau_vm.h" 298f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs#include "nouveau_ramht.h" 308f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 318f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsstruct nv98_crypt_engine { 328f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs struct nouveau_exec_engine base; 338f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs}; 348f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 358f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsstatic int 368f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsnv98_crypt_fini(struct drm_device *dev, int engine, bool suspend) 378f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs{ 388f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs if (!(nv_rd32(dev, 0x000200) & 0x00004000)) 398f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs return 0; 408f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 418f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs nv_mask(dev, 0x000200, 0x00004000, 0x00000000); 428f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs return 0; 438f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs} 448f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 458f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsstatic int 468f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsnv98_crypt_init(struct drm_device *dev, int engine) 478f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs{ 488f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs nv_mask(dev, 0x000200, 0x00004000, 0x00000000); 498f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs nv_mask(dev, 0x000200, 0x00004000, 0x00004000); 508f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs return 0; 518f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs} 528f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 538f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsstatic void 548f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsnv98_crypt_destroy(struct drm_device *dev, int engine) 558f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs{ 568f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs struct nv98_crypt_engine *pcrypt = nv_engine(dev, engine); 578f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 588f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs NVOBJ_ENGINE_DEL(dev, CRYPT); 598f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 608f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs kfree(pcrypt); 618f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs} 628f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 638f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsint 648f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggsnv98_crypt_create(struct drm_device *dev) 658f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs{ 668f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs struct nv98_crypt_engine *pcrypt; 678f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 688f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs pcrypt = kzalloc(sizeof(*pcrypt), GFP_KERNEL); 698f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs if (!pcrypt) 708f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs return -ENOMEM; 718f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 728f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs pcrypt->base.destroy = nv98_crypt_destroy; 738f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs pcrypt->base.init = nv98_crypt_init; 748f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs pcrypt->base.fini = nv98_crypt_fini; 758f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs 768f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs NVOBJ_ENGINE_ADD(dev, CRYPT, &pcrypt->base); 778f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs return 0; 788f27c54342dffbfbafbddd6e43f011e6cb16d285Ben Skeggs} 79