2014-08-10 04:10:21 +10:00
/*
* Copyright 2013 Red Hat Inc .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*
* Authors : Ben Skeggs < bskeggs @ redhat . com >
*/
2015-01-13 22:13:14 +10:00
# include <nvif/client.h>
# include <nvif/driver.h>
# include <nvif/ioctl.h>
2014-08-10 04:10:21 +10:00
2016-05-22 20:35:16 +10:00
# include <nvif/class.h>
# include <nvif/if0000.h>
2014-08-10 04:10:21 +10:00
int
nvif_client_ioctl ( struct nvif_client * client , void * data , u32 size )
{
2015-08-20 14:54:15 +10:00
return client - > driver - > ioctl ( client - > object . priv , client - > super , data , size , NULL ) ;
2014-08-10 04:10:21 +10:00
}
int
nvif_client_suspend ( struct nvif_client * client )
{
2015-08-20 14:54:15 +10:00
return client - > driver - > suspend ( client - > object . priv ) ;
2014-08-10 04:10:21 +10:00
}
int
nvif_client_resume ( struct nvif_client * client )
{
2015-08-20 14:54:15 +10:00
return client - > driver - > resume ( client - > object . priv ) ;
2014-08-10 04:10:21 +10:00
}
void
nvif_client_fini ( struct nvif_client * client )
{
2016-05-25 17:02:11 +10:00
nvif_object_fini ( & client - > object ) ;
2014-08-10 04:10:21 +10:00
if ( client - > driver ) {
2016-05-25 17:02:11 +10:00
if ( client - > driver - > fini )
client - > driver - > fini ( client - > object . priv ) ;
2014-08-10 04:10:21 +10:00
client - > driver = NULL ;
}
}
int
2016-05-22 20:35:16 +10:00
nvif_client_init ( struct nvif_client * parent , const char * name , u64 device ,
struct nvif_client * client )
2014-08-10 04:10:21 +10:00
{
2016-05-22 20:35:16 +10:00
struct nvif_client_v0 args = { . device = device } ;
2015-08-20 14:54:16 +10:00
struct {
struct nvif_ioctl_v0 ioctl ;
struct nvif_ioctl_nop_v0 nop ;
2016-05-22 20:35:16 +10:00
} nop = { } ;
int ret ;
2014-08-10 04:10:21 +10:00
2016-05-22 20:35:16 +10:00
strncpy ( args . name , name , sizeof ( args . name ) ) ;
ret = nvif_object_init ( parent ! = client ? & parent - > object : NULL ,
0 , NVIF_CLASS_CLIENT , & args , sizeof ( args ) ,
& client - > object ) ;
2014-08-10 04:10:21 +10:00
if ( ret )
return ret ;
2015-08-20 14:54:15 +10:00
client - > object . client = client ;
client - > object . handle = ~ 0 ;
client - > route = NVIF_IOCTL_V0_ROUTE_NVIF ;
2014-08-10 04:10:21 +10:00
client - > super = true ;
2016-05-22 20:35:16 +10:00
client - > driver = parent - > driver ;
2014-08-10 04:10:21 +10:00
2015-08-20 14:54:16 +10:00
if ( ret = = 0 ) {
2016-05-22 20:35:16 +10:00
ret = nvif_client_ioctl ( client , & nop , sizeof ( nop ) ) ;
client - > version = nop . nop . version ;
2015-08-20 14:54:16 +10:00
}
2014-08-10 04:10:21 +10:00
if ( ret )
nvif_client_fini ( client ) ;
return ret ;
}